{"version":3,"file":"main.js?version=7.2.1","mappings":"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,wBAA2B,2BAC3B,oBAAuB,uBACvB,gBAAmB,2BACnB,WAAc,oBACd,kBAAqB,CACpB,QAAW,yBAEZ,eAAkB,CACjB,SAAY,oBACZ,YAAe,eACf,wBAA2B,CAC1B,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,wCAED,UAAa,aACb,QAAW,mBAEZ,eAAkB,CACjB,SAAY,oBACZ,QAAW,mBAEZ,gBAAmB,CAClB,SAAY,oBACZ,QAAW,mBAEZ,kBAAqB,CACpB,IAAO,6BACP,SAAY,qBAEb,iBAAoB,CACnB,QAAW,wBAEZ,MAAS,CACR,YAAe,iBAEhB,kBAAqB,iBACrB,YAAe,CACd,qBAAwB,+BACxB,iBAAoB,4BAErB,UAAa,CACZ,YAAe,eACf,UAAa,eAGf,aAAgB,CACf,qBAAwB,uCACxB,cAAiB,uCACjB,gCAAmC,CAClC,uCACA,wCAED,2BAA8B,CAC7B,uCACA,wCAED,qCAAwC,CACvC,wCAED,0BAA6B,CAC5B,wCAED,qBAAwB,CACvB,wCAED,mCAAsC,CACrC,uCACA,wCAED,4BAA+B,CAC9B,wCAED,qBAAwB,CACvB,wCAED,uBAA0B,CACzB,wCAED,yBAA4B,CAC3B,wCAED,yBAA4B,CAC3B,wCAED,yBAA4B,CAC3B,wCAED,eAAkB,CACjB,uCACA,wCAED,UAAa,CACZ,uCACA,wCAED,eAAkB,CACjB,uCACA,uCACA,uCACA,wCAED,MAAS,CACR,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,wCAED,cAAiB,CAChB,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,uCACA,wCAED,kBAAqB,CACpB,wCAED,iCAAoC,CACnC,wCAED,mCAAsC,CACrC,wCAED,6BAAgC,CAC/B,wCAED,qCAAwC,CACvC,uCACA,uCACA,uCACA,wCAED,WAAc,CACb,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AAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QCArvD2tc,GAA4B,IAAI3tc,IAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MA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","sources":["webpack://ui-platform/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://ui-platform/./node_modules/@aws-sdk/util-utf8-browser/dist-es/index.js","webpack://ui-platform/./node_modules/@aws-sdk/util-utf8-browser/dist-es/whatwgEncodingApi.js","webpack://ui-platform/./node_modules/@aws-sdk/util-utf8-browser/dist-es/pureJs.js","webpack://ui-platform/../../src/default-settings.ts","webpack://ui-platform/../../src/interfaces.ts","webpack://ui-platform/../../src/ld-datepicker-icon-styles.ts","webpack://ui-platform/../../src/ld-datepicker-icon.ts","webpack://ui-platform/../../src/ld-datepicker-styles.ts","webpack://ui-platform/../../src/ld-datepicker.ts","webpack://ui-platform/../../src/ld-time-input.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-button/index.ts","webpack://ui-platform/./node_modules/lit-html/src/directives/class-map.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-dropdown-search/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-dropdown/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-input/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-textarea/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-toggle/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/atoms/ld-checkbox/index.ts","webpack://ui-platform/./node_modules/@open-wc/lit-helpers/src/live.js","webpack://ui-platform/./node_modules/@lifedata/ld-elements/src/molecules/ld-form/index.ts","webpack://ui-platform/./node_modules/@lifedata/ld-markdown-element/node_modules/marked/lib/marked.esm.js","webpack://ui-platform/./node_modules/@lifedata/ld-markdown-element/src/LdMarkdownElement.ts","webpack://ui-platform/./node_modules/@lifedata/ld-markdown-element/src/ld-markdown-element.ts","webpack://ui-platform/./node_modules/@lifedata/ld-report/src/ld-report/index.ts","webpack://ui-platform/./node_modules/@polymer/paper-radio-button/paper-radio-button.js","webpack://ui-platform/./node_modules/@polymer/paper-radio-group/paper-radio-group.js","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/common/interfaces.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-firewall-configuration/index.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-header/styles.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-header/index.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-userinput/ld-userinput-styles.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-userinput/ld-userinput-line.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/ld-userinput/index.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/styles.ts","webpack://ui-platform/./node_modules/@lifedata/ui-netcfg/src/application/index.ts","webpack://ui-platform/./node_modules/@polymer/app-layout/app-layout-behavior/app-layout-behavior.js","webpack://ui-platform/./node_modules/@polymer/app-layout/helpers/helpers.js","webpack://ui-platform/./node_modules/@polymer/app-layout/app-scroll-effects/app-scroll-effects-behavior.js","webpack://ui-platform/./node_modules/@polymer/app-layout/app-header/app-header.js","webpack://ui-platform/./node_modules/@polymer/app-layout/app-toolbar/app-toolbar.js","webpack://ui-platform/./node_modules/@polymer/iron-a11y-announcer/iron-a11y-announcer.js","webpack://ui-platform/./node_modules/@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-behaviors/iron-button-state.js","webpack://ui-platform/./node_modules/@polymer/iron-behaviors/iron-control-state.js","webpack://ui-platform/./node_modules/@polymer/iron-flex-layout/iron-flex-layout-classes.js","webpack://ui-platform/./node_modules/@polymer/iron-flex-layout/iron-flex-layout.js","webpack://ui-platform/./node_modules/@polymer/iron-form-element-behavior/iron-form-element-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-icon/iron-icon.js","webpack://ui-platform/./node_modules/@polymer/iron-icons/iron-icons.js","webpack://ui-platform/./node_modules/@polymer/iron-iconset-svg/iron-iconset-svg.js","webpack://ui-platform/./node_modules/@polymer/iron-selector/iron-multi-selectable.js","webpack://ui-platform/./node_modules/@polymer/iron-menu-behavior/iron-menu-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-menu-behavior/iron-menubar-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-meta/iron-meta.js","webpack://ui-platform/./node_modules/@polymer/iron-fit-behavior/iron-fit-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-overlay-behavior/iron-focusables-helper.js","webpack://ui-platform/./node_modules/@polymer/iron-overlay-behavior/iron-overlay-backdrop.js","webpack://ui-platform/./node_modules/@polymer/iron-overlay-behavior/iron-overlay-manager.js","webpack://ui-platform/./node_modules/@polymer/iron-overlay-behavior/iron-scroll-manager.js","webpack://ui-platform/./node_modules/@polymer/iron-overlay-behavior/iron-overlay-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-range-behavior/iron-range-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-resizable-behavior/iron-resizable-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-scroll-target-behavior/iron-scroll-target-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-selector/iron-selection.js","webpack://ui-platform/./node_modules/@polymer/iron-selector/iron-selectable.js","webpack://ui-platform/./node_modules/@polymer/iron-validatable-behavior/iron-validatable-behavior.js","webpack://ui-platform/./node_modules/@polymer/neon-animation/neon-animatable-behavior.js","webpack://ui-platform/./node_modules/@polymer/neon-animation/neon-animation-runner-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-behaviors/paper-button-behavior.js","webpack://ui-platform/./node_modules/@polymer/iron-checked-element-behavior/iron-checked-element-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-behaviors/paper-checked-element-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-behaviors/paper-inky-focus-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-behaviors/paper-ripple-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-button/paper-button.js","webpack://ui-platform/./node_modules/@polymer/paper-checkbox/paper-checkbox.js","webpack://ui-platform/./node_modules/@polymer/paper-dialog-behavior/paper-dialog-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-dialog-scrollable/paper-dialog-scrollable.js","webpack://ui-platform/./node_modules/@polymer/paper-dialog-behavior/paper-dialog-shared-styles.js","webpack://ui-platform/./node_modules/@polymer/paper-dialog/paper-dialog.js","webpack://ui-platform/./node_modules/@polymer/paper-dropdown-menu/paper-dropdown-menu-icons.js","webpack://ui-platform/./node_modules/@polymer/paper-dropdown-menu/paper-dropdown-menu-shared-styles.js","webpack://ui-platform/./node_modules/@polymer/paper-dropdown-menu/paper-dropdown-menu.js","webpack://ui-platform/./node_modules/@polymer/paper-fab/paper-fab.js","webpack://ui-platform/./node_modules/@polymer/paper-icon-button/paper-icon-button.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input-addon-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input-char-counter.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input-container.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input-error.js","webpack://ui-platform/./node_modules/@polymer/iron-input/iron-input.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-input.js","webpack://ui-platform/./node_modules/@polymer/iron-autogrow-textarea/iron-autogrow-textarea.js","webpack://ui-platform/./node_modules/@polymer/paper-input/paper-textarea.js","webpack://ui-platform/./node_modules/@polymer/paper-item/paper-item-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-item/paper-item-body.js","webpack://ui-platform/./node_modules/@polymer/paper-item/paper-item-shared-styles.js","webpack://ui-platform/./node_modules/@polymer/paper-item/paper-item.js","webpack://ui-platform/./node_modules/@polymer/paper-listbox/paper-listbox.js","webpack://ui-platform/./node_modules/@polymer/iron-dropdown/iron-dropdown.js","webpack://ui-platform/./node_modules/@polymer/neon-animation/neon-animation-behavior.js","webpack://ui-platform/./node_modules/@polymer/neon-animation/animations/fade-in-animation.js","webpack://ui-platform/./node_modules/@polymer/neon-animation/animations/fade-out-animation.js","webpack://ui-platform/./node_modules/@polymer/paper-menu-button/paper-menu-button-animations.js","webpack://ui-platform/./node_modules/@polymer/paper-menu-button/paper-menu-button.js","webpack://ui-platform/./node_modules/@polymer/paper-progress/paper-progress.js","webpack://ui-platform/./node_modules/@polymer/paper-ripple/paper-ripple.js","webpack://ui-platform/./node_modules/@polymer/paper-spinner/paper-spinner-behavior.js","webpack://ui-platform/./node_modules/@polymer/paper-spinner/paper-spinner-lite.js","webpack://ui-platform/./node_modules/@polymer/paper-spinner/paper-spinner-styles.js","webpack://ui-platform/./node_modules/@polymer/paper-styles/color.js","webpack://ui-platform/./node_modules/@polymer/paper-styles/default-theme.js","webpack://ui-platform/./node_modules/@polymer/paper-styles/element-styles/paper-material-styles.js","webpack://ui-platform/./node_modules/@polymer/paper-styles/shadow.js","webpack://ui-platform/./node_modules/@polymer/font-roboto/roboto.js","webpack://ui-platform/./node_modules/@polymer/paper-styles/typography.js","webpack://ui-platform/./node_modules/@polymer/paper-tabs/paper-tab.js","webpack://ui-platform/./node_modules/@polymer/paper-tabs/paper-tabs-icons.js","webpack://ui-platform/./node_modules/@polymer/paper-tabs/paper-tabs.js","webpack://ui-platform/./node_modules/@polymer/paper-toast/paper-toast.js","webpack://ui-platform/./node_modules/@polymer/paper-toggle-button/paper-toggle-button.js","webpack://ui-platform/./node_modules/@polymer/paper-tooltip/paper-tooltip.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/dom-module.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/css-parse.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/unscoped-style-handler.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/style-util.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/apply-shim.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/template-map.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/apply-shim-utils.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/entrypoints/apply-shim.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/dir-mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/unresolved.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/scope-subtree.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/disable-upgrade-mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/legacy-element-mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/mutable-data-behavior.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/class.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/polymer-fn.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/polymer.dom.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/legacy/templatizer-behavior.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/properties-mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/element-mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/gesture-event-listeners.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/mutable-data.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/properties-changed.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/property-accessors.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/template-stamp.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/mixins/property-effects.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/array-splice.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/async.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/boot.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/case-map.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/debounce.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/flattened-nodes-observer.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/flush.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/gestures.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/mixin.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/path.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/render-status.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/resolve-url.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/settings.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/style-gather.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/telemetry.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/templatize.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/wrap.js","webpack://ui-platform/./node_modules/@polymer/polymer/polymer-element.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/utils/hide-template-controls.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/dom-bind.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/dom-repeat.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/dom-if.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/array-selector.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/entrypoints/custom-style-interface.js","webpack://ui-platform/./node_modules/@polymer/polymer/lib/elements/custom-style.js","webpack://ui-platform/./node_modules/@polymer/polymer/polymer-legacy.js","webpack://ui-platform/./node_modules/@smithy/util-utf8/dist-es/fromUtf8.browser.js","webpack://ui-platform/./node_modules/@smithy/util-utf8/dist-es/toUtf8.browser.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/common-regex.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/common-utils.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/document-wait.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/custom-style-interface.js","webpack://ui-platform/./node_modules/@webcomponents/shadycss/src/style-settings.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js/src/RawSha256.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js/src/constants.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js/src/index.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js/src/jsSha256.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util/src/convertToBuffer.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util/src/index.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util/src/isEmptyData.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util/src/numToUint8.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util/src/uint32ArrayFrom.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/buffer/index.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/isarray/index.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/node_modules/tslib/tslib.es6.js","webpack://ui-platform/./src/auto-generated/config.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://ui-platform/./node_modules/i18next/dist/esm/i18next.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/toArray.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://ui-platform/./src/components/ld-application/i18n/ld-i18next.js","webpack://ui-platform/./src/auto-generated/locales.bundle.js","webpack://ui-platform/./src/components/ld-application/ld-chart/styles.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-communication.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-document.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-feature.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-navigation.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-object.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-util.js","webpack://ui-platform/./src/components/ld-application/ld-icon/icons/ld-icons-vis.js","webpack://ui-platform/./src/components/ld-application/ld-icon/styles.js","webpack://ui-platform/./src/components/ld-application/ld-icon/index.js","webpack://ui-platform/./src/components/ld-loading-spinner/styles-inline.js","webpack://ui-platform/./src/components/ld-loading-spinner/ld-loading-spinner-inline.js","webpack://ui-platform/./src/components/ld-platform/ld-datepicker-config/styles.js","webpack://ui-platform/./src/components/ld-platform/ld-datepicker-config/index.js","webpack://ui-platform/./src/components/ld-platform/ld-form/styles.js","webpack://ui-platform/./src/components/ld-platform/ld-grid/TableCSVExporter.js","webpack://ui-platform/./src/components/ld-platform/ld-grid/TableCSVExporter/formatters/index.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-column-group.js","webpack://ui-platform/./node_modules/@vaadin/input-container/theme/lumo/vaadin-input-container-styles.js","webpack://ui-platform/./node_modules/@vaadin/input-container/src/vaadin-input-container.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/field-button.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/helper.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/required-field.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/input-field-shared.js","webpack://ui-platform/./node_modules/@vaadin/text-field/theme/lumo/vaadin-text-field-styles.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/error-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/field-aria-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/helper-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/validate-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/field-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/input-constraints-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/slot-styles-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/input-control-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/input-field-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/pattern-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/styles/clear-button-styles.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/styles/input-field-shared-styles.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/styles/field-shared-styles.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/styles/input-field-container-styles.js","webpack://ui-platform/./node_modules/@vaadin/text-field/src/vaadin-text-field.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-filter.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-filter-column.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-selection-column-base-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-selection-column.js","webpack://ui-platform/./node_modules/@vaadin/grid/theme/lumo/vaadin-grid-sorter-styles.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-sorter.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-sort-column.js","webpack://ui-platform/./node_modules/@vaadin/grid/theme/lumo/vaadin-grid-tree-toggle-styles.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-tree-toggle.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-tree-column.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-material-styles/version.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-material-styles/color.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-material-styles/typography.js","webpack://ui-platform/./node_modules/@vaadin/grid/theme/material/vaadin-grid-styles.js","webpack://ui-platform/./src/components/ld-platform/ld-grid/theme/ld-grid-styles.js","webpack://ui-platform/./node_modules/@vaadin/polymer-legacy-adapter/src/template-renderer-templatizer.js","webpack://ui-platform/./node_modules/@vaadin/polymer-legacy-adapter/src/template-renderer-grid-templatizer.js","webpack://ui-platform/./node_modules/@vaadin/polymer-legacy-adapter/src/template-renderer.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/overlay.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/mixins/menu-overlay.js","webpack://ui-platform/./node_modules/@vaadin/context-menu/theme/lumo/vaadin-context-menu-styles.js","webpack://ui-platform/./node_modules/@vaadin/item/theme/lumo/vaadin-item-styles.js","webpack://ui-platform/./node_modules/@vaadin/item/src/vaadin-item-mixin.js","webpack://ui-platform/./node_modules/@vaadin/item/src/vaadin-item.js","webpack://ui-platform/./node_modules/@vaadin/list-box/theme/lumo/vaadin-list-box-styles.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/keyboard-direction-mixin.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-list-mixin/vaadin-list-mixin.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-list-mixin/vaadin-multi-select-list-mixin.js","webpack://ui-platform/./node_modules/@vaadin/list-box/src/vaadin-list-box.js","webpack://ui-platform/./node_modules/@vaadin/overlay/theme/lumo/vaadin-overlay-styles.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/focus-trap-controller.js","webpack://ui-platform/./node_modules/@vaadin/overlay/src/vaadin-overlay.js","webpack://ui-platform/./node_modules/@vaadin/context-menu/src/vaadin-contextmenu-event.js","webpack://ui-platform/./node_modules/@vaadin/overlay/src/vaadin-overlay-position-mixin.js","webpack://ui-platform/./node_modules/@vaadin/context-menu/src/vaadin-context-menu-overlay.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/media-query-controller.js","webpack://ui-platform/./node_modules/@vaadin/context-menu/src/vaadin-contextmenu-items-mixin.js","webpack://ui-platform/./node_modules/@vaadin/context-menu/src/vaadin-context-menu.js","webpack://ui-platform/./src/components/ld-platform/ld-grid/styles.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-charts/availability/swimlane.js","webpack://ui-platform/./src/components/ld-platform/ld-grid/ld-grid.js","webpack://ui-platform/./src/components/ld-platform/ld-onlinestate/styles.js","webpack://ui-platform/./src/components/ld-platform/ld-onlinestate/index.js","webpack://ui-platform/./src/components/ld-platform/ld-search/debounce.js","webpack://ui-platform/./src/components/ld-platform/ld-search/styles.js","webpack://ui-platform/./node_modules/@polymer/paper-item/paper-icon-item.js","webpack://ui-platform/./src/components/ld-platform/ld-search/result-templates/ld-search-generic-result-template.js","webpack://ui-platform/./src/components/ld-platform/ld-search/result-templates/ld-search-result-machine.js","webpack://ui-platform/./src/components/ld-platform/ld-search/ld-search-result-template-selector.js","webpack://ui-platform/./src/components/ld-platform/ld-search/ld-search-results.js","webpack://ui-platform/./src/js/services/searchService.js","webpack://ui-platform/./src/components/ld-platform/ld-search/ld-search-input.js","webpack://ui-platform/./src/components/ld-platform/ld-tabs/styles.js","webpack://ui-platform/./src/components/ld-platform/ld-tabs/ld-tabs.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-charts/styles-charts.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-header/index.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-header/styles.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-map/index.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-map/styles.js","webpack://ui-platform/./src/components/ld-platform/modules/assets/styles.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-application-actions.js","webpack://ui-platform/./src/js/services/dashboardService.js","webpack://ui-platform/./src/js/services/userService.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-assets-actions.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-files-actions.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-timeseries-actions.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-user-management-actions.js","webpack://ui-platform/./src/components/ld-redux/actions/ld-users-actions.js","webpack://ui-platform/./src/components/ld-redux/ld-localstorage.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://ui-platform/./node_modules/redux/es/redux.js","webpack://ui-platform/./node_modules/redux-thunk/es/index.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-timeseries-reducer.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-dashboard-reducer.js","webpack://ui-platform/./src/components/ld-redux/reducers/breadcrumb-reducers.ts","webpack://ui-platform/./src/components/ld-redux/ld-redux-store.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-application-reducer.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-assets-reducer.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-user-management-reducer.js","webpack://ui-platform/./src/components/ld-redux/reducers/ld-users-reducer.js","webpack://ui-platform/./node_modules/pwa-helpers/src/lazy-reducer-enhancer.ts","webpack://ui-platform/./src/js/LdErrorHandler.js","webpack://ui-platform/./node_modules/@smithy/protocol-http/dist-es/httpRequest.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-host-header/dist-es/index.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-logger/dist-es/loggerMiddleware.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-recursion-detection/dist-es/configuration.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/normalizeProvider.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/customEndpointFunctions.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/isValidHostLabel.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/isIpAddress.js","webpack://ui-platform/./node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/isVirtualHostableS3Bucket.js","webpack://ui-platform/./node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/partition.js","webpack://ui-platform/./node_modules/@aws-sdk/util-endpoints/dist-es/aws.js","webpack://ui-platform/./node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/parseArn.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/client/setFeature.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-user-agent/dist-es/check-features.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-user-agent/dist-es/constants.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-user-agent/dist-es/user-agent-middleware.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/regionConfig/checkRegion.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/regionConfig/isFipsRegion.js","webpack://ui-platform/./node_modules/@smithy/types/dist-es/middleware.js","webpack://ui-platform/./node_modules/@smithy/util-middleware/dist-es/getSmithyContext.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/getHttpAuthSchemeEndpointRuleSetPlugin.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/util-identity-and-auth/DefaultIdentityProviderConfig.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/middleware-http-signing/httpSigningMiddleware.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/middleware-http-signing/getHttpSigningMiddleware.js","webpack://ui-platform/./node_modules/@smithy/protocol-http/dist-es/httpResponse.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/schemas/operation.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/middleware/schemaDeserializationMiddleware.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/middleware/getSchemaSerdePlugin.js","webpack://ui-platform/./node_modules/@smithy/middleware-content-length/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/util-middleware/dist-es/normalizeProvider.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/adaptors/getEndpointFromConfig.browser.js","webpack://ui-platform/./node_modules/@smithy/url-parser/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/querystring-parser/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/adaptors/toEndpointV1.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/config.js","webpack://ui-platform/./node_modules/@smithy/service-error-classification/dist-es/constants.js","webpack://ui-platform/./node_modules/@smithy/service-error-classification/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/DefaultRateLimiter.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/constants.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/defaultRetryToken.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/StandardRetryStrategy.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/defaultRetryBackoffStrategy.js","webpack://ui-platform/./node_modules/@smithy/util-retry/dist-es/AdaptiveRetryStrategy.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/NoOpLogger.js","webpack://ui-platform/./node_modules/@smithy/uuid/dist-es/randomUUID.browser.js","webpack://ui-platform/./node_modules/@smithy/uuid/dist-es/v4.js","webpack://ui-platform/./node_modules/@smithy/middleware-retry/dist-es/isStreamingPayload/isStreamingPayload.browser.js","webpack://ui-platform/./node_modules/@smithy/middleware-retry/dist-es/retryMiddleware.js","webpack://ui-platform/./node_modules/@smithy/middleware-stack/dist-es/MiddlewareStack.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/client.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/util-identity-and-auth/memoizeIdentityProvider.js","webpack://ui-platform/./node_modules/@smithy/util-hex-encoding/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/util-utf8/dist-es/toUint8Array.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/constants.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/credentialDerivation.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/getCanonicalHeaders.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/getPayloadHash.js","webpack://ui-platform/./node_modules/@smithy/is-array-buffer/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/HeaderFormatter.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/headerUtil.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/prepareRequest.js","webpack://ui-platform/./node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/SignatureV4Base.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/getCanonicalQuery.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/utilDate.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/SignatureV4.js","webpack://ui-platform/./node_modules/@smithy/signature-v4/dist-es/moveHeadersToQuery.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/auth/httpAuthSchemeProvider.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/endpoint/EndpointParameters.js","webpack://ui-platform/./node_modules/@aws-crypto/util/src/convertToBuffer.ts","webpack://ui-platform/./node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8/dist-es/fromUtf8.browser.js","webpack://ui-platform/./node_modules/@aws-crypto/util/src/isEmptyData.ts","webpack://ui-platform/./node_modules/@aws-crypto/sha256-browser/src/constants.ts","webpack://ui-platform/./node_modules/@aws-sdk/util-locate-window/dist-es/index.js","webpack://ui-platform/./node_modules/@aws-crypto/sha256-browser/src/webCryptoSha256.ts","webpack://ui-platform/./node_modules/@aws-crypto/sha256-js/src/constants.ts","webpack://ui-platform/./node_modules/@aws-crypto/sha256-js/src/RawSha256.ts","webpack://ui-platform/./node_modules/@aws-crypto/sha256-js/src/jsSha256.ts","webpack://ui-platform/./node_modules/@aws-crypto/supports-web-crypto/src/supportsWebCrypto.ts","webpack://ui-platform/./node_modules/@aws-crypto/sha256-browser/src/crossPlatformSha256.ts","webpack://ui-platform/./node_modules/@aws-sdk/util-user-agent-browser/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/util-config-provider/dist-es/types.js","webpack://ui-platform/./node_modules/@smithy/fetch-http-handler/dist-es/create-request.js","webpack://ui-platform/./node_modules/@smithy/fetch-http-handler/dist-es/request-timeout.js","webpack://ui-platform/./node_modules/@smithy/fetch-http-handler/dist-es/fetch-http-handler.js","webpack://ui-platform/./node_modules/@smithy/querystring-builder/dist-es/index.js","webpack://ui-platform/./node_modules/@smithy/util-base64/dist-es/constants.browser.js","webpack://ui-platform/./node_modules/@smithy/util-base64/dist-es/fromBase64.browser.js","webpack://ui-platform/./node_modules/@smithy/fetch-http-handler/dist-es/stream-collector.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/defaults-mode.js","webpack://ui-platform/./node_modules/@smithy/util-body-length-browser/dist-es/calculateBodyLength.js","webpack://ui-platform/./node_modules/@smithy/util-defaults-mode-browser/dist-es/constants.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getSkewCorrectedDate.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getDateHeader.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getUpdatedSystemClockOffset.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/isClockSkewed.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/deref.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/schemas/translateTraits.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/schemas/NormalizedSchema.js","webpack://ui-platform/./node_modules/@smithy/util-base64/dist-es/toBase64.browser.js","webpack://ui-platform/./node_modules/@smithy/util-stream/dist-es/blob/Uint8ArrayBlobAdapter.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/protocols/collect-stream-body.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/TypeRegistry.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/protocols/SerdeContext.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/protocols/HttpProtocol.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/protocols/RpcProtocol.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/exceptions.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/ProtocolLib.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/ConfigurableSerdeContext.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/protocols/serde/determineTimestampFormat.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/serde/lazy-json.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/serde/parse-utils.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/serde/date-utils.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/serde/value/NumericValue.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/UnionSerde.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/jsonReviver.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonShapeDeserializer.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/parseJsonBody.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/common.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/jsonReplacer.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonShapeSerializer.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonCodec.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJsonRpcProtocol.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJson1_1Protocol.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/util-identity-and-auth/httpAuthSchemes/noAuth.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/debug/debugId.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/debug/toDebugString.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/types/EndpointError.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/booleanEquals.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/getAttr.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/getAttrPathList.js","webpack://ui-platform/./node_modules/@smithy/types/dist-es/endpoint.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/parseURL.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/endpointFunctions.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/isSet.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/not.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/stringEquals.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/substring.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/lib/uriEncode.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateTemplate.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateExpression.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/getReferenceValue.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateCondition.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateConditions.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/getEndpointHeaders.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/getEndpointProperties.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/getEndpointUrl.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateEndpointRule.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateErrorRule.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/utils/evaluateRules.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/endpoint/ruleset.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/endpoint/endpointResolver.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/cache/EndpointCache.js","webpack://ui-platform/./node_modules/@smithy/util-endpoints/dist-es/resolveEndpoint.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/models/CognitoIdentityProviderServiceException.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/models/errors.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/schemas/schemas_0.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/runtimeConfig.shared.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/runtimeConfig.browser.js","webpack://ui-platform/./node_modules/@smithy/util-defaults-mode-browser/dist-es/resolveDefaultsModeConfig.js","webpack://ui-platform/./node_modules/@smithy/property-provider/dist-es/memoize.js","webpack://ui-platform/./node_modules/@smithy/invalid-dependency/dist-es/invalidProvider.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseFipsEndpointConfigOptions.js","webpack://ui-platform/./node_modules/@smithy/types/dist-es/extensions/checksum.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/extensions/checksum.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/CognitoIdentityProviderClient.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-user-agent/dist-es/configurations.js","webpack://ui-platform/./node_modules/@aws-sdk/core/dist-es/submodules/client/setCredentialFeature.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/resolveEndpointConfig.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/regionConfig/resolveRegionConfig.js","webpack://ui-platform/./node_modules/@smithy/config-resolver/dist-es/regionConfig/getRealRegion.js","webpack://ui-platform/./node_modules/@smithy/middleware-retry/dist-es/configurations.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/runtimeExtensions.js","webpack://ui-platform/./node_modules/@aws-sdk/region-config-resolver/dist-es/extensions/index.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/extensions/defaultExtensionConfiguration.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/extensions/retry.js","webpack://ui-platform/./node_modules/@smithy/protocol-http/dist-es/extensions/httpExtensionConfiguration.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/auth/httpAuthExtensionConfiguration.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/submodules/schema/middleware/schemaSerializationMiddleware.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-user-agent/dist-es/encode-features.js","webpack://ui-platform/./node_modules/@smithy/middleware-retry/dist-es/util.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-recursion-detection/dist-es/getRecursionDetectionPlugin.js","webpack://ui-platform/./node_modules/@aws-sdk/middleware-recursion-detection/dist-es/recursionDetectionMiddleware.browser.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/httpAuthSchemeMiddleware.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/resolveAuthOptions.js","webpack://ui-platform/./node_modules/@smithy/middleware-serde/dist-es/serdePlugin.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/service-customizations/s3.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/adaptors/createConfigValueProvider.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/adaptors/getEndpointFromInstructions.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/getEndpointPlugin.js","webpack://ui-platform/./node_modules/@smithy/middleware-endpoint/dist-es/endpointMiddleware.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/setFeature.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/schemaLogFilter.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/command.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AddCustomAttributesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminAddUserToGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminConfirmSignUpCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminCreateUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminDeleteUserAttributesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminDeleteUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminDisableProviderForUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminDisableUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminEnableUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminForgetDeviceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminGetDeviceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminGetUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminInitiateAuthCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminLinkProviderForUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminListDevicesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminListGroupsForUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminListUserAuthEventsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminRemoveUserFromGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminResetUserPasswordCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminRespondToAuthChallengeCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminSetUserMFAPreferenceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminSetUserPasswordCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminSetUserSettingsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminUpdateAuthEventFeedbackCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminUpdateDeviceStatusCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminUpdateUserAttributesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AdminUserGlobalSignOutCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/AssociateSoftwareTokenCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ChangePasswordCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CompleteWebAuthnRegistrationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ConfirmDeviceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ConfirmForgotPasswordCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ConfirmSignUpCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateIdentityProviderCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateManagedLoginBrandingCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateResourceServerCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateTermsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateUserImportJobCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateUserPoolClientCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateUserPoolCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/CreateUserPoolDomainCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteIdentityProviderCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteManagedLoginBrandingCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteResourceServerCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteTermsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteUserAttributesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteUserPoolClientCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteUserPoolCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteUserPoolDomainCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DeleteWebAuthnCredentialCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeIdentityProviderCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeManagedLoginBrandingByClientCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeManagedLoginBrandingCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeResourceServerCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeRiskConfigurationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeTermsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeUserImportJobCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeUserPoolClientCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeUserPoolCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/DescribeUserPoolDomainCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ForgetDeviceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ForgotPasswordCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetCSVHeaderCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetDeviceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetIdentityProviderByIdentifierCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetLogDeliveryConfigurationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetSigningCertificateCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetTokensFromRefreshTokenCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetUICustomizationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetUserAttributeVerificationCodeCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetUserAuthFactorsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetUserCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GetUserPoolMfaConfigCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/GlobalSignOutCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/InitiateAuthCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListDevicesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListGroupsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListIdentityProvidersCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListResourceServersCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListTagsForResourceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListTermsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListUserImportJobsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListUserPoolClientsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListUserPoolsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListUsersCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListUsersInGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ListWebAuthnCredentialsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/ResendConfirmationCodeCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/RespondToAuthChallengeCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/RevokeTokenCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetLogDeliveryConfigurationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetRiskConfigurationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetUICustomizationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetUserMFAPreferenceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetUserPoolMfaConfigCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SetUserSettingsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/SignUpCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/StartUserImportJobCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/StartWebAuthnRegistrationCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/StopUserImportJobCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/TagResourceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UntagResourceCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateAuthEventFeedbackCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateDeviceStatusCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateGroupCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateIdentityProviderCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateManagedLoginBrandingCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateResourceServerCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateTermsCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateUserAttributesCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateUserPoolClientCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateUserPoolCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/UpdateUserPoolDomainCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/VerifySoftwareTokenCommand.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/commands/VerifyUserAttributeCommand.js","webpack://ui-platform/./node_modules/@smithy/core/dist-es/pagination/createPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/AdminListGroupsForUserPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/AdminListUserAuthEventsPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListGroupsPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListIdentityProvidersPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListResourceServersPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListUserPoolClientsPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListUserPoolsPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListUsersInGroupPaginator.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/CognitoIdentityProvider.js","webpack://ui-platform/./node_modules/@aws-sdk/client-cognito-identity-provider/dist-es/pagination/ListUsersPaginator.js","webpack://ui-platform/./node_modules/@smithy/smithy-client/dist-es/create-aggregated-client.js","webpack://ui-platform/./src/js/LdFetch.js","webpack://ui-platform/./src/js/LdGlobal.js","webpack://ui-platform/./src/js/LdServiceUrlOverrides.js","webpack://ui-platform/./src/themes/lifedata/colors.js","webpack://ui-platform/./src/themes/lifedata/fonts.js","webpack://ui-platform/./src/themes/styles.js","webpack://ui-platform/./node_modules/base64-js/index.js","webpack://ui-platform/./node_modules/core-js/modules/_a-function.js","webpack://ui-platform/./node_modules/core-js/modules/_add-to-unscopables.js","webpack://ui-platform/./node_modules/core-js/modules/_an-object.js","webpack://ui-platform/./node_modules/core-js/modules/_array-includes.js","webpack://ui-platform/./node_modules/core-js/modules/_cof.js","webpack://ui-platform/./node_modules/core-js/modules/_core.js","webpack://ui-platform/./node_modules/core-js/modules/_ctx.js","webpack://ui-platform/./node_modules/core-js/modules/_defined.js","webpack://ui-platform/./node_modules/core-js/modules/_descriptors.js","webpack://ui-platform/./node_modules/core-js/modules/_dom-create.js","webpack://ui-platform/./node_modules/core-js/modules/_enum-bug-keys.js","webpack://ui-platform/./node_modules/core-js/modules/_export.js","webpack://ui-platform/./node_modules/core-js/modules/_fails.js","webpack://ui-platform/./node_modules/core-js/modules/_function-to-string.js","webpack://ui-platform/./node_modules/core-js/modules/_global.js","webpack://ui-platform/./node_modules/core-js/modules/_has.js","webpack://ui-platform/./node_modules/core-js/modules/_hide.js","webpack://ui-platform/./node_modules/core-js/modules/_html.js","webpack://ui-platform/./node_modules/core-js/modules/_ie8-dom-define.js","webpack://ui-platform/./node_modules/core-js/modules/_iobject.js","webpack://ui-platform/./node_modules/core-js/modules/_is-object.js","webpack://ui-platform/./node_modules/core-js/modules/_iter-create.js","webpack://ui-platform/./node_modules/core-js/modules/_iter-define.js","webpack://ui-platform/./node_modules/core-js/modules/_iter-step.js","webpack://ui-platform/./node_modules/core-js/modules/_iterators.js","webpack://ui-platform/./node_modules/core-js/modules/_library.js","webpack://ui-platform/./node_modules/core-js/modules/_object-create.js","webpack://ui-platform/./node_modules/core-js/modules/_object-dp.js","webpack://ui-platform/./node_modules/core-js/modules/_object-dps.js","webpack://ui-platform/./node_modules/core-js/modules/_object-gpo.js","webpack://ui-platform/./node_modules/core-js/modules/_object-keys-internal.js","webpack://ui-platform/./node_modules/core-js/modules/_object-keys.js","webpack://ui-platform/./node_modules/core-js/modules/_property-desc.js","webpack://ui-platform/./node_modules/core-js/modules/_redefine.js","webpack://ui-platform/./node_modules/core-js/modules/_set-to-string-tag.js","webpack://ui-platform/./node_modules/core-js/modules/_shared-key.js","webpack://ui-platform/./node_modules/core-js/modules/_shared.js","webpack://ui-platform/./node_modules/core-js/modules/_to-absolute-index.js","webpack://ui-platform/./node_modules/core-js/modules/_to-integer.js","webpack://ui-platform/./node_modules/core-js/modules/_to-iobject.js","webpack://ui-platform/./node_modules/core-js/modules/_to-length.js","webpack://ui-platform/./node_modules/core-js/modules/_to-object.js","webpack://ui-platform/./node_modules/core-js/modules/_to-primitive.js","webpack://ui-platform/./node_modules/core-js/modules/_uid.js","webpack://ui-platform/./node_modules/core-js/modules/_wks.js","webpack://ui-platform/./node_modules/core-js/modules/es6.array.iterator.js","webpack://ui-platform/./node_modules/core-js/modules/web.dom.iterable.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Animation/AnimationUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Animation/Fx.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/AxisDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/Axis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/Stacking/StackItem.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/Tick.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Chart/Chart.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Color/Color.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Defaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Color/Palettes.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Chart/ChartDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Foundation.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Globals.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Legend/LegendSymbol.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/HTML/AST.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/RendererRegistry.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/SVG/SVGElement.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/SVG/SVGLabel.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/SVG/TextBuilder.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/SVG/SVGRenderer.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/SVG/Symbols.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Series/Point.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Series/Series.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Series/SeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Series/SeriesRegistry.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Templating.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Time.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Utilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/BorderRadius.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/CenteredUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Column/ColumnSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Column/ColumnSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Pane/PaneComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Pane/PaneDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Pane/Pane.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/AreaRange/AreaRangePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/AreaRange/AreaRangeSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/AreaSplineRange/AreaSplineRangeSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/BoxPlot/BoxPlotSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/BoxPlot/BoxPlotSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bubble/BubbleLegendDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bubble/BubbleLegendItem.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bubble/BubbleLegendComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bubble/BubblePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bubble/BubbleSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ColumnRange/ColumnRangePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ColumnRange/ColumnRangeSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ColumnPyramid/ColumnPyramidSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ColumnPyramid/ColumnPyramidSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ErrorBar/ErrorBarSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/ErrorBar/ErrorBarSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Gauge/GaugePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Gauge/GaugeSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/DragNodesComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/GraphLayoutComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PackedBubble/PackedBubblePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PackedBubble/PackedBubbleSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Networkgraph/VerletIntegration.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PackedBubble/PackedBubbleIntegration.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Networkgraph/EulerIntegration.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Networkgraph/QuadTreeNode.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Networkgraph/QuadTree.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Networkgraph/ReingoldFruchtermanLayout.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PackedBubble/PackedBubbleLayout.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/SimulationSeriesUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/TextPath.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PackedBubble/PackedBubbleSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Polygon/PolygonSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Polygon/PolygonSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/RadialAxisDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/RadialAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/PolarComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/WaterfallAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Waterfall/WaterfallPoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Waterfall/WaterfallSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Waterfall/WaterfallSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/highcharts-more.src.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/RendererUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Renderer/HTML/HTMLElement.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/DateTimeAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/LogarithmicAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Tooltip.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Pointer.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Legend/Legend.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/ScrollablePlotArea.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/Stacking/StackingAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Line/LineSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Area/AreaSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Area/AreaSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Spline/SplineSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/AreaSpline/AreaSplineSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Series/DataLabel.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Column/ColumnDataLabel.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Bar/BarSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Scatter/ScatterSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Scatter/ScatterSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Pie/PiePoint.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Pie/PieSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Pie/PieSeriesDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/Pie/PieDataLabel.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Geometry/GeometryUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/OverlappingDataLabels.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Responsive.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/highcharts.src.js","webpack://ui-platform/./node_modules/ieee754/index.js","webpack://ui-platform/./node_modules/isomorphic-unfetch/browser.js","webpack://ui-platform/./node_modules/js-cookie/src/js.cookie.js","webpack://ui-platform/./node_modules/leaflet/src/core/Util.js","webpack://ui-platform/./node_modules/leaflet/src/core/Class.js","webpack://ui-platform/./node_modules/leaflet/src/core/Events.js","webpack://ui-platform/./node_modules/leaflet/src/geometry/Point.js","webpack://ui-platform/./node_modules/leaflet/src/geometry/Bounds.js","webpack://ui-platform/./node_modules/leaflet/src/geo/LatLngBounds.js","webpack://ui-platform/./node_modules/leaflet/src/geo/LatLng.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.js","webpack://ui-platform/./node_modules/leaflet/src/geo/projection/Projection.SphericalMercator.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.Earth.js","webpack://ui-platform/./node_modules/leaflet/src/geometry/Transformation.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.EPSG3857.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/SVG.Util.js","webpack://ui-platform/./node_modules/leaflet/src/core/Browser.js","webpack://ui-platform/./node_modules/leaflet/src/dom/DomEvent.Pointer.js","webpack://ui-platform/./node_modules/leaflet/src/dom/DomUtil.js","webpack://ui-platform/./node_modules/leaflet/src/dom/DomEvent.js","webpack://ui-platform/./node_modules/leaflet/src/dom/DomEvent.DoubleTap.js","webpack://ui-platform/./node_modules/leaflet/src/dom/PosAnimation.js","webpack://ui-platform/./node_modules/leaflet/src/map/Map.js","webpack://ui-platform/./node_modules/leaflet/src/control/Control.js","webpack://ui-platform/./node_modules/leaflet/src/control/Control.Layers.js","webpack://ui-platform/./node_modules/leaflet/src/control/Control.Zoom.js","webpack://ui-platform/./node_modules/leaflet/src/control/Control.Scale.js","webpack://ui-platform/./node_modules/leaflet/src/control/Control.Attribution.js","webpack://ui-platform/./node_modules/leaflet/src/control/index.js","webpack://ui-platform/./node_modules/leaflet/src/core/Handler.js","webpack://ui-platform/./node_modules/leaflet/src/core/index.js","webpack://ui-platform/./node_modules/leaflet/src/geometry/LineUtil.js","webpack://ui-platform/./node_modules/leaflet/src/dom/Draggable.js","webpack://ui-platform/./node_modules/leaflet/src/geometry/PolyUtil.js","webpack://ui-platform/./node_modules/leaflet/src/geo/projection/Projection.LonLat.js","webpack://ui-platform/./node_modules/leaflet/src/geo/projection/Projection.Mercator.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.EPSG3395.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.EPSG4326.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/CRS.Simple.js","webpack://ui-platform/./node_modules/leaflet/src/geo/crs/index.js","webpack://ui-platform/./node_modules/leaflet/src/layer/Layer.js","webpack://ui-platform/./node_modules/leaflet/src/layer/LayerGroup.js","webpack://ui-platform/./node_modules/leaflet/src/layer/FeatureGroup.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/Icon.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/Icon.Default.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/Marker.Drag.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/Marker.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Path.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/CircleMarker.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Circle.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Polyline.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Polygon.js","webpack://ui-platform/./node_modules/leaflet/src/layer/GeoJSON.js","webpack://ui-platform/./node_modules/leaflet/src/layer/ImageOverlay.js","webpack://ui-platform/./node_modules/leaflet/src/layer/VideoOverlay.js","webpack://ui-platform/./node_modules/leaflet/src/layer/SVGOverlay.js","webpack://ui-platform/./node_modules/leaflet/src/layer/DivOverlay.js","webpack://ui-platform/./node_modules/leaflet/src/layer/Popup.js","webpack://ui-platform/./node_modules/leaflet/src/layer/Tooltip.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/DivIcon.js","webpack://ui-platform/./node_modules/leaflet/src/layer/marker/index.js","webpack://ui-platform/./node_modules/leaflet/src/layer/tile/GridLayer.js","webpack://ui-platform/./node_modules/leaflet/src/layer/tile/TileLayer.js","webpack://ui-platform/./node_modules/leaflet/src/layer/tile/TileLayer.WMS.js","webpack://ui-platform/./node_modules/leaflet/src/layer/tile/index.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Renderer.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Canvas.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/SVG.VML.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/SVG.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Renderer.getRenderer.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/Rectangle.js","webpack://ui-platform/./node_modules/leaflet/src/layer/vector/index.js","webpack://ui-platform/./node_modules/leaflet/src/layer/index.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.BoxZoom.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.DoubleClickZoom.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.Drag.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.Keyboard.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.ScrollWheelZoom.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.TapHold.js","webpack://ui-platform/./node_modules/leaflet/src/map/handler/Map.TouchZoom.js","webpack://ui-platform/./node_modules/leaflet/src/map/index.js","webpack://ui-platform/./node_modules/lit-flexbox-literals/Literals/index.js","webpack://ui-platform/./node_modules/lit-flexbox-literals/Classes/index.js","webpack://ui-platform/./node_modules/moment/locale/af.js","webpack://ui-platform/./node_modules/moment/locale/ar-dz.js","webpack://ui-platform/./node_modules/moment/locale/ar-kw.js","webpack://ui-platform/./node_modules/moment/locale/ar-ly.js","webpack://ui-platform/./node_modules/moment/locale/ar-ma.js","webpack://ui-platform/./node_modules/moment/locale/ar-ps.js","webpack://ui-platform/./node_modules/moment/locale/ar-sa.js","webpack://ui-platform/./node_modules/moment/locale/ar-tn.js","webpack://ui-platform/./node_modules/moment/locale/ar.js","webpack://ui-platform/./node_modules/moment/locale/az.js","webpack://ui-platform/./node_modules/moment/locale/be.js","webpack://ui-platform/./node_modules/moment/locale/bg.js","webpack://ui-platform/./node_modules/moment/locale/bm.js","webpack://ui-platform/./node_modules/moment/locale/bn-bd.js","webpack://ui-platform/./node_modules/moment/locale/bn.js","webpack://ui-platform/./node_modules/moment/locale/bo.js","webpack://ui-platform/./node_modules/moment/locale/br.js","webpack://ui-platform/./node_modules/moment/locale/bs.js","webpack://ui-platform/./node_modules/moment/locale/ca.js","webpack://ui-platform/./node_modules/moment/locale/cs.js","webpack://ui-platform/./node_modules/moment/locale/cv.js","webpack://ui-platform/./node_modules/moment/locale/cy.js","webpack://ui-platform/./node_modules/moment/locale/da.js","webpack://ui-platform/./node_modules/moment/locale/de-at.js","webpack://ui-platform/./node_modules/moment/locale/de-ch.js","webpack://ui-platform/./node_modules/moment/locale/de.js","webpack://ui-platform/./node_modules/moment/locale/dv.js","webpack://ui-platform/./node_modules/moment/locale/el.js","webpack://ui-platform/./node_modules/moment/locale/en-au.js","webpack://ui-platform/./node_modules/moment/locale/en-ca.js","webpack://ui-platform/./node_modules/moment/locale/en-gb.js","webpack://ui-platform/./node_modules/moment/locale/en-ie.js","webpack://ui-platform/./node_modules/moment/locale/en-il.js","webpack://ui-platform/./node_modules/moment/locale/en-in.js","webpack://ui-platform/./node_modules/moment/locale/en-nz.js","webpack://ui-platform/./node_modules/moment/locale/en-sg.js","webpack://ui-platform/./node_modules/moment/locale/eo.js","webpack://ui-platform/./node_modules/moment/locale/es-do.js","webpack://ui-platform/./node_modules/moment/locale/es-mx.js","webpack://ui-platform/./node_modules/moment/locale/es-us.js","webpack://ui-platform/./node_modules/moment/locale/es.js","webpack://ui-platform/./node_modules/moment/locale/et.js","webpack://ui-platform/./node_modules/moment/locale/eu.js","webpack://ui-platform/./node_modules/moment/locale/fa.js","webpack://ui-platform/./node_modules/moment/locale/fi.js","webpack://ui-platform/./node_modules/moment/locale/fil.js","webpack://ui-platform/./node_modules/moment/locale/fo.js","webpack://ui-platform/./node_modules/moment/locale/fr-ca.js","webpack://ui-platform/./node_modules/moment/locale/fr-ch.js","webpack://ui-platform/./node_modules/moment/locale/fr.js","webpack://ui-platform/./node_modules/moment/locale/fy.js","webpack://ui-platform/./node_modules/moment/locale/ga.js","webpack://ui-platform/./node_modules/moment/locale/gd.js","webpack://ui-platform/./node_modules/moment/locale/gl.js","webpack://ui-platform/./node_modules/moment/locale/gom-deva.js","webpack://ui-platform/./node_modules/moment/locale/gom-latn.js","webpack://ui-platform/./node_modules/moment/locale/gu.js","webpack://ui-platform/./node_modules/moment/locale/he.js","webpack://ui-platform/./node_modules/moment/locale/hi.js","webpack://ui-platform/./node_modules/moment/locale/hr.js","webpack://ui-platform/./node_modules/moment/locale/hu.js","webpack://ui-platform/./node_modules/moment/locale/hy-am.js","webpack://ui-platform/./node_modules/moment/locale/id.js","webpack://ui-platform/./node_modules/moment/locale/is.js","webpack://ui-platform/./node_modules/moment/locale/it-ch.js","webpack://ui-platform/./node_modules/moment/locale/it.js","webpack://ui-platform/./node_modules/moment/locale/ja.js","webpack://ui-platform/./node_modules/moment/locale/jv.js","webpack://ui-platform/./node_modules/moment/locale/ka.js","webpack://ui-platform/./node_modules/moment/locale/kk.js","webpack://ui-platform/./node_modules/moment/locale/km.js","webpack://ui-platform/./node_modules/moment/locale/kn.js","webpack://ui-platform/./node_modules/moment/locale/ko.js","webpack://ui-platform/./node_modules/moment/locale/ku-kmr.js","webpack://ui-platform/./node_modules/moment/locale/ku.js","webpack://ui-platform/./node_modules/moment/locale/ky.js","webpack://ui-platform/./node_modules/moment/locale/lb.js","webpack://ui-platform/./node_modules/moment/locale/lo.js","webpack://ui-platform/./node_modules/moment/locale/lt.js","webpack://ui-platform/./node_modules/moment/locale/lv.js","webpack://ui-platform/./node_modules/moment/locale/me.js","webpack://ui-platform/./node_modules/moment/locale/mi.js","webpack://ui-platform/./node_modules/moment/locale/mk.js","webpack://ui-platform/./node_modules/moment/locale/ml.js","webpack://ui-platform/./node_modules/moment/locale/mn.js","webpack://ui-platform/./node_modules/moment/locale/mr.js","webpack://ui-platform/./node_modules/moment/locale/ms-my.js","webpack://ui-platform/./node_modules/moment/locale/ms.js","webpack://ui-platform/./node_modules/moment/locale/mt.js","webpack://ui-platform/./node_modules/moment/locale/my.js","webpack://ui-platform/./node_modules/moment/locale/nb.js","webpack://ui-platform/./node_modules/moment/locale/ne.js","webpack://ui-platform/./node_modules/moment/locale/nl-be.js","webpack://ui-platform/./node_modules/moment/locale/nl.js","webpack://ui-platform/./node_modules/moment/locale/nn.js","webpack://ui-platform/./node_modules/moment/locale/oc-lnc.js","webpack://ui-platform/./node_modules/moment/locale/pa-in.js","webpack://ui-platform/./node_modules/moment/locale/pl.js","webpack://ui-platform/./node_modules/moment/locale/pt-br.js","webpack://ui-platform/./node_modules/moment/locale/pt.js","webpack://ui-platform/./node_modules/moment/locale/ro.js","webpack://ui-platform/./node_modules/moment/locale/ru.js","webpack://ui-platform/./node_modules/moment/locale/sd.js","webpack://ui-platform/./node_modules/moment/locale/se.js","webpack://ui-platform/./node_modules/moment/locale/si.js","webpack://ui-platform/./node_modules/moment/locale/sk.js","webpack://ui-platform/./node_modules/moment/locale/sl.js","webpack://ui-platform/./node_modules/moment/locale/sq.js","webpack://ui-platform/./node_modules/moment/locale/sr-cyrl.js","webpack://ui-platform/./node_modules/moment/locale/sr.js","webpack://ui-platform/./node_modules/moment/locale/ss.js","webpack://ui-platform/./node_modules/moment/locale/sv.js","webpack://ui-platform/./node_modules/moment/locale/sw.js","webpack://ui-platform/./node_modules/moment/locale/ta.js","webpack://ui-platform/./node_modules/moment/locale/te.js","webpack://ui-platform/./node_modules/moment/locale/tet.js","webpack://ui-platform/./node_modules/moment/locale/tg.js","webpack://ui-platform/./node_modules/moment/locale/th.js","webpack://ui-platform/./node_modules/moment/locale/tk.js","webpack://ui-platform/./node_modules/moment/locale/tl-ph.js","webpack://ui-platform/./node_modules/moment/locale/tlh.js","webpack://ui-platform/./node_modules/moment/locale/tr.js","webpack://ui-platform/./node_modules/moment/locale/tzl.js","webpack://ui-platform/./node_modules/moment/locale/tzm-latn.js","webpack://ui-platform/./node_modules/moment/locale/tzm.js","webpack://ui-platform/./node_modules/moment/locale/ug-cn.js","webpack://ui-platform/./node_modules/moment/locale/uk.js","webpack://ui-platform/./node_modules/moment/locale/ur.js","webpack://ui-platform/./node_modules/moment/locale/uz-latn.js","webpack://ui-platform/./node_modules/moment/locale/uz.js","webpack://ui-platform/./node_modules/moment/locale/vi.js","webpack://ui-platform/./node_modules/moment/locale/x-pseudo.js","webpack://ui-platform/./node_modules/moment/locale/yo.js","webpack://ui-platform/./node_modules/moment/locale/zh-cn.js","webpack://ui-platform/./node_modules/moment/locale/zh-hk.js","webpack://ui-platform/./node_modules/moment/locale/zh-mo.js","webpack://ui-platform/./node_modules/moment/locale/zh-tw.js","webpack://ui-platform/./node_modules/moment/moment.js","webpack://ui-platform/./node_modules/pwa-helpers/src/connect-mixin.ts","webpack://ui-platform/./node_modules/unfetch/src/index.mjs","webpack://ui-platform/./node_modules/validator/es/lib/util/assertString.js","webpack://ui-platform/./node_modules/validator/es/lib/toDate.js","webpack://ui-platform/./node_modules/validator/es/lib/alpha.js","webpack://ui-platform/./node_modules/validator/es/lib/isFloat.js","webpack://ui-platform/./node_modules/validator/es/lib/toFloat.js","webpack://ui-platform/./node_modules/validator/es/lib/util/toString.js","webpack://ui-platform/./node_modules/validator/es/lib/util/merge.js","webpack://ui-platform/./node_modules/validator/es/lib/contains.js","webpack://ui-platform/./node_modules/validator/es/lib/isByteLength.js","webpack://ui-platform/./node_modules/validator/es/lib/isFQDN.js","webpack://ui-platform/./node_modules/validator/es/lib/isIP.js","webpack://ui-platform/./node_modules/validator/es/lib/isEmail.js","webpack://ui-platform/./node_modules/validator/es/lib/isURL.js","webpack://ui-platform/./node_modules/validator/es/lib/isMACAddress.js","webpack://ui-platform/./node_modules/validator/es/lib/isIPRange.js","webpack://ui-platform/./node_modules/validator/es/lib/isDate.js","webpack://ui-platform/./node_modules/validator/es/lib/isTime.js","webpack://ui-platform/./node_modules/validator/es/lib/isBoolean.js","webpack://ui-platform/./node_modules/validator/es/lib/isLocale.js","webpack://ui-platform/./node_modules/validator/es/lib/isAbaRouting.js","webpack://ui-platform/./node_modules/validator/es/lib/isAlpha.js","webpack://ui-platform/./node_modules/validator/es/lib/isAlphanumeric.js","webpack://ui-platform/./node_modules/validator/es/lib/isNumeric.js","webpack://ui-platform/./node_modules/validator/es/lib/isPassportNumber.js","webpack://ui-platform/./node_modules/validator/es/lib/isInt.js","webpack://ui-platform/./node_modules/validator/es/lib/isIMEI.js","webpack://ui-platform/./node_modules/validator/es/lib/util/multilineRegex.js","webpack://ui-platform/./node_modules/validator/es/lib/isAscii.js","webpack://ui-platform/./node_modules/validator/es/lib/isFullWidth.js","webpack://ui-platform/./node_modules/validator/es/lib/isHalfWidth.js","webpack://ui-platform/./node_modules/validator/es/lib/isMultibyte.js","webpack://ui-platform/./node_modules/validator/es/lib/isSemVer.js","webpack://ui-platform/./node_modules/validator/es/lib/isSurrogatePair.js","webpack://ui-platform/./node_modules/validator/es/lib/isDecimal.js","webpack://ui-platform/./node_modules/validator/es/lib/isHexadecimal.js","webpack://ui-platform/./node_modules/validator/es/lib/isOctal.js","webpack://ui-platform/./node_modules/validator/es/lib/isHexColor.js","webpack://ui-platform/./node_modules/validator/es/lib/isRgbColor.js","webpack://ui-platform/./node_modules/validator/es/lib/isHSL.js","webpack://ui-platform/./node_modules/validator/es/lib/isISRC.js","webpack://ui-platform/./node_modules/validator/es/lib/isIBAN.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO31661Alpha2.js","webpack://ui-platform/./node_modules/validator/es/lib/isBIC.js","webpack://ui-platform/./node_modules/validator/es/lib/isMD5.js","webpack://ui-platform/./node_modules/validator/es/lib/isHash.js","webpack://ui-platform/./node_modules/validator/es/lib/isBase64.js","webpack://ui-platform/./node_modules/validator/es/lib/isJSON.js","webpack://ui-platform/./node_modules/validator/es/lib/isEmpty.js","webpack://ui-platform/./node_modules/validator/es/lib/isLength.js","webpack://ui-platform/./node_modules/validator/es/lib/isUUID.js","webpack://ui-platform/./node_modules/validator/es/lib/isIn.js","webpack://ui-platform/./node_modules/validator/es/lib/isLuhnNumber.js","webpack://ui-platform/./node_modules/validator/es/lib/isCreditCard.js","webpack://ui-platform/./node_modules/validator/es/lib/isIdentityCard.js","webpack://ui-platform/./node_modules/validator/es/lib/isEAN.js","webpack://ui-platform/./node_modules/validator/es/lib/isISIN.js","webpack://ui-platform/./node_modules/validator/es/lib/isISBN.js","webpack://ui-platform/./node_modules/validator/es/lib/util/algorithms.js","webpack://ui-platform/./node_modules/validator/es/lib/isTaxID.js","webpack://ui-platform/./node_modules/validator/es/lib/isMobilePhone.js","webpack://ui-platform/./node_modules/validator/es/lib/isEthereumAddress.js","webpack://ui-platform/./node_modules/validator/es/lib/isCurrency.js","webpack://ui-platform/./node_modules/validator/es/lib/isBtcAddress.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO6346.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO6391.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO8601.js","webpack://ui-platform/./node_modules/validator/es/lib/isRFC3339.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO31661Alpha3.js","webpack://ui-platform/./node_modules/validator/es/lib/isISO4217.js","webpack://ui-platform/./node_modules/validator/es/lib/isBase32.js","webpack://ui-platform/./node_modules/validator/es/lib/isBase58.js","webpack://ui-platform/./node_modules/validator/es/lib/isDataURI.js","webpack://ui-platform/./node_modules/validator/es/lib/isMagnetURI.js","webpack://ui-platform/./node_modules/validator/es/lib/rtrim.js","webpack://ui-platform/./node_modules/validator/es/lib/ltrim.js","webpack://ui-platform/./node_modules/validator/es/lib/trim.js","webpack://ui-platform/./node_modules/validator/es/lib/isMailtoURI.js","webpack://ui-platform/./node_modules/validator/es/lib/isMimeType.js","webpack://ui-platform/./node_modules/validator/es/lib/isLatLong.js","webpack://ui-platform/./node_modules/validator/es/lib/isPostalCode.js","webpack://ui-platform/./node_modules/validator/es/lib/blacklist.js","webpack://ui-platform/./node_modules/validator/es/lib/normalizeEmail.js","webpack://ui-platform/./node_modules/validator/es/lib/isSlug.js","webpack://ui-platform/./node_modules/validator/es/lib/isLicensePlate.js","webpack://ui-platform/./node_modules/validator/es/lib/isStrongPassword.js","webpack://ui-platform/./node_modules/validator/es/lib/isVAT.js","webpack://ui-platform/./node_modules/validator/es/index.js","webpack://ui-platform/./node_modules/validator/es/lib/toInt.js","webpack://ui-platform/./node_modules/validator/es/lib/toBoolean.js","webpack://ui-platform/./node_modules/validator/es/lib/equals.js","webpack://ui-platform/./node_modules/validator/es/lib/matches.js","webpack://ui-platform/./node_modules/validator/es/lib/isPort.js","webpack://ui-platform/./node_modules/validator/es/lib/isLowercase.js","webpack://ui-platform/./node_modules/validator/es/lib/isUppercase.js","webpack://ui-platform/./node_modules/validator/es/lib/isVariableWidth.js","webpack://ui-platform/./node_modules/validator/es/lib/util/includes.js","webpack://ui-platform/./node_modules/validator/es/lib/isDivisibleBy.js","webpack://ui-platform/./node_modules/validator/es/lib/isJWT.js","webpack://ui-platform/./node_modules/validator/es/lib/isMongoId.js","webpack://ui-platform/./node_modules/validator/es/lib/isAfter.js","webpack://ui-platform/./node_modules/validator/es/lib/isBefore.js","webpack://ui-platform/./node_modules/validator/es/lib/isISSN.js","webpack://ui-platform/./node_modules/validator/es/lib/escape.js","webpack://ui-platform/./node_modules/validator/es/lib/unescape.js","webpack://ui-platform/./node_modules/validator/es/lib/stripLow.js","webpack://ui-platform/./node_modules/validator/es/lib/whitelist.js","webpack://ui-platform/./node_modules/validator/es/lib/isWhitelisted.js","webpack://ui-platform/./node_modules/validator/index.js","webpack://ui-platform/./node_modules/validator/lib/alpha.js","webpack://ui-platform/./node_modules/validator/lib/blacklist.js","webpack://ui-platform/./node_modules/validator/lib/contains.js","webpack://ui-platform/./node_modules/validator/lib/equals.js","webpack://ui-platform/./node_modules/validator/lib/escape.js","webpack://ui-platform/./node_modules/validator/lib/isAbaRouting.js","webpack://ui-platform/./node_modules/validator/lib/isAfter.js","webpack://ui-platform/./node_modules/validator/lib/isAlpha.js","webpack://ui-platform/./node_modules/validator/lib/isAlphanumeric.js","webpack://ui-platform/./node_modules/validator/lib/isAscii.js","webpack://ui-platform/./node_modules/validator/lib/isBIC.js","webpack://ui-platform/./node_modules/validator/lib/isBase32.js","webpack://ui-platform/./node_modules/validator/lib/isBase58.js","webpack://ui-platform/./node_modules/validator/lib/isBase64.js","webpack://ui-platform/./node_modules/validator/lib/isBefore.js","webpack://ui-platform/./node_modules/validator/lib/isBoolean.js","webpack://ui-platform/./node_modules/validator/lib/isBtcAddress.js","webpack://ui-platform/./node_modules/validator/lib/isByteLength.js","webpack://ui-platform/./node_modules/validator/lib/isCreditCard.js","webpack://ui-platform/./node_modules/validator/lib/isCurrency.js","webpack://ui-platform/./node_modules/validator/lib/isDataURI.js","webpack://ui-platform/./node_modules/validator/lib/isDate.js","webpack://ui-platform/./node_modules/validator/lib/isDecimal.js","webpack://ui-platform/./node_modules/validator/lib/isDivisibleBy.js","webpack://ui-platform/./node_modules/validator/lib/isEAN.js","webpack://ui-platform/./node_modules/validator/lib/isEmail.js","webpack://ui-platform/./node_modules/validator/lib/isEmpty.js","webpack://ui-platform/./node_modules/validator/lib/isEthereumAddress.js","webpack://ui-platform/./node_modules/validator/lib/isFQDN.js","webpack://ui-platform/./node_modules/validator/lib/isFloat.js","webpack://ui-platform/./node_modules/validator/lib/isFullWidth.js","webpack://ui-platform/./node_modules/validator/lib/isHSL.js","webpack://ui-platform/./node_modules/validator/lib/isHalfWidth.js","webpack://ui-platform/./node_modules/validator/lib/isHash.js","webpack://ui-platform/./node_modules/validator/lib/isHexColor.js","webpack://ui-platform/./node_modules/validator/lib/isHexadecimal.js","webpack://ui-platform/./node_modules/validator/lib/isIBAN.js","webpack://ui-platform/./node_modules/validator/lib/isIMEI.js","webpack://ui-platform/./node_modules/validator/lib/isIP.js","webpack://ui-platform/./node_modules/validator/lib/isIPRange.js","webpack://ui-platform/./node_modules/validator/lib/isISBN.js","webpack://ui-platform/./node_modules/validator/lib/isISIN.js","webpack://ui-platform/./node_modules/validator/lib/isISO31661Alpha2.js","webpack://ui-platform/./node_modules/validator/lib/isISO31661Alpha3.js","webpack://ui-platform/./node_modules/validator/lib/isISO4217.js","webpack://ui-platform/./node_modules/validator/lib/isISO6346.js","webpack://ui-platform/./node_modules/validator/lib/isISO6391.js","webpack://ui-platform/./node_modules/validator/lib/isISO8601.js","webpack://ui-platform/./node_modules/validator/lib/isISRC.js","webpack://ui-platform/./node_modules/validator/lib/isISSN.js","webpack://ui-platform/./node_modules/validator/lib/isIdentityCard.js","webpack://ui-platform/./node_modules/validator/lib/isIn.js","webpack://ui-platform/./node_modules/validator/lib/isInt.js","webpack://ui-platform/./node_modules/validator/lib/isJSON.js","webpack://ui-platform/./node_modules/validator/lib/isJWT.js","webpack://ui-platform/./node_modules/validator/lib/isLatLong.js","webpack://ui-platform/./node_modules/validator/lib/isLength.js","webpack://ui-platform/./node_modules/validator/lib/isLicensePlate.js","webpack://ui-platform/./node_modules/validator/lib/isLocale.js","webpack://ui-platform/./node_modules/validator/lib/isLowercase.js","webpack://ui-platform/./node_modules/validator/lib/isLuhnNumber.js","webpack://ui-platform/./node_modules/validator/lib/isMACAddress.js","webpack://ui-platform/./node_modules/validator/lib/isMD5.js","webpack://ui-platform/./node_modules/validator/lib/isMagnetURI.js","webpack://ui-platform/./node_modules/validator/lib/isMailtoURI.js","webpack://ui-platform/./node_modules/validator/lib/isMimeType.js","webpack://ui-platform/./node_modules/validator/lib/isMobilePhone.js","webpack://ui-platform/./node_modules/validator/lib/isMongoId.js","webpack://ui-platform/./node_modules/validator/lib/isMultibyte.js","webpack://ui-platform/./node_modules/validator/lib/isNumeric.js","webpack://ui-platform/./node_modules/validator/lib/isOctal.js","webpack://ui-platform/./node_modules/validator/lib/isPassportNumber.js","webpack://ui-platform/./node_modules/validator/lib/isPort.js","webpack://ui-platform/./node_modules/validator/lib/isPostalCode.js","webpack://ui-platform/./node_modules/validator/lib/isRFC3339.js","webpack://ui-platform/./node_modules/validator/lib/isRgbColor.js","webpack://ui-platform/./node_modules/validator/lib/isSemVer.js","webpack://ui-platform/./node_modules/validator/lib/isSlug.js","webpack://ui-platform/./node_modules/validator/lib/isStrongPassword.js","webpack://ui-platform/./node_modules/validator/lib/isSurrogatePair.js","webpack://ui-platform/./node_modules/validator/lib/isTaxID.js","webpack://ui-platform/./node_modules/validator/lib/isTime.js","webpack://ui-platform/./node_modules/validator/lib/isURL.js","webpack://ui-platform/./node_modules/validator/lib/isUUID.js","webpack://ui-platform/./node_modules/validator/lib/isUppercase.js","webpack://ui-platform/./node_modules/validator/lib/isVAT.js","webpack://ui-platform/./node_modules/validator/lib/isVariableWidth.js","webpack://ui-platform/./node_modules/validator/lib/isWhitelisted.js","webpack://ui-platform/./node_modules/validator/lib/ltrim.js","webpack://ui-platform/./node_modules/validator/lib/matches.js","webpack://ui-platform/./node_modules/validator/lib/normalizeEmail.js","webpack://ui-platform/./node_modules/validator/lib/rtrim.js","webpack://ui-platform/./node_modules/validator/lib/stripLow.js","webpack://ui-platform/./node_modules/validator/lib/toBoolean.js","webpack://ui-platform/./node_modules/validator/lib/toDate.js","webpack://ui-platform/./node_modules/validator/lib/toFloat.js","webpack://ui-platform/./node_modules/validator/lib/toInt.js","webpack://ui-platform/./node_modules/validator/lib/trim.js","webpack://ui-platform/./node_modules/validator/lib/unescape.js","webpack://ui-platform/./node_modules/validator/lib/util/algorithms.js","webpack://ui-platform/./node_modules/validator/lib/util/assertString.js","webpack://ui-platform/./node_modules/validator/lib/util/includes.js","webpack://ui-platform/./node_modules/validator/lib/util/merge.js","webpack://ui-platform/./node_modules/validator/lib/util/multilineRegex.js","webpack://ui-platform/./node_modules/validator/lib/util/toString.js","webpack://ui-platform/./node_modules/validator/lib/whitelist.js","webpack://ui-platform/./src/components/ld-application/ld-breadcrumb/styles.ts","webpack://ui-platform/./src/components/ld-application/ld-breadcrumb/index.ts","webpack://ui-platform/./src/components/ld-application/ld-chart/custom-ui/setZoomToDatepicker.ts","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/NoDataToDisplay/NoDataDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/NoDataToDisplay/NoDataToDisplay.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/modules/no-data-to-display.src.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Chart/ChartNavigationComposition.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Exporting/ExportingDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Exporting/ExportingSymbols.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Exporting/Fullscreen.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/HttpUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Exporting/Exporting.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/modules/exporting.src.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/DownloadURL.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/OfflineExporting/OfflineExporting.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/modules/offline-exporting.src.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/ExportData/ExportDataDefaults.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/ExportData/ExportData.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/modules/export-data.src.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/Color/ColorAxisLike.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Core/Axis/SolidGaugeAxis.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/SolidGauge/SolidGaugeSeries.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Series/SolidGauge/SolidGaugeSeriesDefaults.js","webpack://ui-platform/./src/components/ld-application/ld-chart/utils/TooltipMessageFormatterDecorator.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/Annotations/NavigationBindingsUtilities.js","webpack://ui-platform/./node_modules/highcharts/es-modules/Extensions/MouseWheelZoom/MouseWheelZoom.js","webpack://ui-platform/./node_modules/highcharts/es-modules/masters/modules/mouse-wheel-zoom.src.js","webpack://ui-platform/./src/components/ld-application/ld-chart/index.ts","webpack://ui-platform/./src/components/ld-application/ld-messages/ld-error-messages.ts","webpack://ui-platform/./src/components/ld-login-application/index.ts","webpack://ui-platform/./src/components/ld-login-application/styles.ts","webpack://ui-platform/./src/components/ld-platform/ld-dialog/ld-dialogs.ts","webpack://ui-platform/./src/components/ld-platform/ld-form/ld-form-wrapper.ts","webpack://ui-platform/./src/components/ld-platform/ld-state-indicator/styles.js","webpack://ui-platform/./src/components/ld-platform/ld-state-indicator/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-backbutton/styles.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-backbutton/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/assets-buttonlist/delete-button/ld-delete.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/company/form/custom-form-elements/UiTextProvider.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/company/form/custom-form-elements/texts_en.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/company/form/custom-form-elements/location-selection-element.styles.ts","webpack://ui-platform/./src/components/_base-styles/form-elements.styles.ts","webpack://ui-platform/./src/components/ld-platform/modules/assets/company/form/custom-form-elements/location-selection-element.ts","webpack://ui-platform/./src/components/ld-platform/ld-progress-bar/progressbar.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/styles.js","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-download-upload/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-variables/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-variables/configs/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/common-styles.js","webpack://ui-platform/./src/components/ld-platform/modules/settings/common-func.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-variables/form/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-collections/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-collections/form/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-data-warehouse-export/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/ld-backend-links/index.ts","webpack://ui-platform/./src/components/ld-platform/modules/settings/module.ts","webpack://ui-platform/./src/components/ld-redux/actions/breadcrumb-actions.ts","webpack://ui-platform/./src/js/LdNotificationHandler.ts","webpack://ui-platform/./src/js/interfaces.ts","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/AuthenticationDetails.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/utils/cryptoSecureRandomInt.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/utils/WordArray.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/BigInteger.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/AuthenticationHelper.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoJwtToken.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoAccessToken.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoIdToken.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/Platform/index.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoRefreshToken.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoUserSession.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/DateHelper.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoUserAttribute.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/StorageHelper.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoUser.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/UserAgent.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/Client.js","webpack://ui-platform/./node_modules/amazon-cognito-identity-js/es/CognitoUserPool.js","webpack://ui-platform/./src/js/services/Authentication.ts","webpack://ui-platform/./src/js/services/FileProvider.ts","webpack://ui-platform/./src/js/services/Notifications.ts","webpack://ui-platform/./src/js/services/Validator.ts","webpack://ui-platform/./src/js/services/routingConfig.ts","webpack://ui-platform/./src/js/tokenHandling.ts","webpack://ui-platform/./src/components/password-compliance-feedback-element/styles.ts","webpack://ui-platform/./src/components/password-compliance-feedback-element/password-compliance-feedback-element.ts","webpack://ui-platform/./src/js/services/PasswordValidator.ts","webpack://ui-platform/./src/views/change-password/change-password-view.ts","webpack://ui-platform/./src/views/forgot-password/create-new-password-view.ts","webpack://ui-platform/./src/views/forgot-password/forgot-password-view.ts","webpack://ui-platform/./src/views/login/login-view.ts","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://ui-platform/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/checked-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/slot-target-controller.js","webpack://ui-platform/./node_modules/@vaadin/checkbox/src/vaadin-checkbox.js","webpack://ui-platform/./node_modules/@vaadin/checkbox/theme/lumo/vaadin-checkbox-styles.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/active-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/async.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/browser-utils.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/controller-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/debounce.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/dir-helper.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/dir-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/disabled-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/dom-utils.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/element-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/focus-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/focus-utils.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/gestures.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/keyboard-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/unique-id-utils.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/slot-controller.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/tabindex-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/templates.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/tooltip-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/delegate-focus-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/delegate-state-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/input-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/input-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/label-controller.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/label-mixin.js","webpack://ui-platform/./node_modules/@vaadin/field-base/src/labelled-input-controller.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-active-item-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-column.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-helpers.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-styles.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/iron-list-core.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/virtualizer-iron-list-adapter.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/virtualizer.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-a11y-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/array-data-provider.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-array-data-provider-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-column-reordering-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-column-resizing-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-data-provider-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-drag-and-drop-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-dynamic-columns-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-event-context-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-filter-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-keyboard-navigation-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-row-details-mixin.js","webpack://ui-platform/./node_modules/@vaadin/component-base/src/resize-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-scroll-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-selection-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-sort-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid-styling-mixin.js","webpack://ui-platform/./node_modules/@vaadin/grid/src/vaadin-grid.js","webpack://ui-platform/./node_modules/@vaadin/grid/theme/lumo/vaadin-grid-styles.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/color.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/font-icons.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/sizing.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/spacing.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/style.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/typography.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-lumo-styles/version.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js","webpack://ui-platform/./node_modules/@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js","webpack://ui-platform/./node_modules/lit-html/src/lib/modify-template.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/shady-render.ts","webpack://ui-platform/./node_modules/lit-element/src/lib/updating-element.ts","webpack://ui-platform/./node_modules/lit-element/src/lib/decorators.ts","webpack://ui-platform/./node_modules/lit-element/src/lib/css-tag.ts","webpack://ui-platform/./node_modules/lit-element/src/lit-element.ts","webpack://ui-platform/./node_modules/lit-html/src/directives/if-defined.ts","webpack://ui-platform/./node_modules/lit-html/src/directives/repeat.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/directive.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/dom.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/part.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/parts.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/render.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/template-factory.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/template-instance.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/template-result.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/template.ts","webpack://ui-platform/./node_modules/lit-html/src/lib/default-template-processor.ts","webpack://ui-platform/./node_modules/lit-html/src/lit-html.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/custom-element.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/property.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/state.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/base.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/query.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/decorators/query-assigned-elements.ts","webpack://ui-platform/./node_modules/lit/node_modules/lit-html/src/directives/if-defined.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/css-tag.ts","webpack://ui-platform/./node_modules/lit/node_modules/@lit/reactive-element/src/reactive-element.ts","webpack://ui-platform/./node_modules/lit/node_modules/lit-element/src/lit-element.ts","webpack://ui-platform/./node_modules/lit/node_modules/lit-html/src/lit-html.ts","webpack://ui-platform/./node_modules/tslib/tslib.es6.mjs","webpack://ui-platform/webpack/bootstrap","webpack://ui-platform/webpack/runtime/load script","webpack://ui-platform/webpack/runtime/compat get default export","webpack://ui-platform/webpack/runtime/define property getters","webpack://ui-platform/webpack/runtime/ensure chunk","webpack://ui-platform/webpack/runtime/get javascript chunk filename","webpack://ui-platform/webpack/runtime/global","webpack://ui-platform/webpack/runtime/hasOwnProperty shorthand","webpack://ui-platform/webpack/runtime/make namespace object","webpack://ui-platform/webpack/runtime/node module decorator","webpack://ui-platform/webpack/runtime/publicPath","webpack://ui-platform/webpack/runtime/jsonp chunk loading","webpack://ui-platform/./src/js/LdLog.js","webpack://ui-platform/./src/views/information-security/styles.ts","webpack://ui-platform/./src/views/information-security/information-security-view.ts","webpack://ui-platform/./src/components/ld-loading-spinner/styles.js","webpack://ui-platform/./node_modules/@polymer/paper-spinner/paper-spinner.js","webpack://ui-platform/./src/components/ld-loading-spinner/ld-loading-spinner.js","webpack://ui-platform/./node_modules/@polymer/app-layout/app-drawer/app-drawer.js","webpack://ui-platform/./src/components/ld-platform/ld-platform-styles.ts","webpack://ui-platform/./src/components/ld-platform/ld-sidebar/ld-sidebar-styles.js","webpack://ui-platform/./src/components/ld-platform/ld-sidebar/ld-sidebar-item-styles.js","webpack://ui-platform/./src/components/ld-platform/ld-sidebar/ld-sidebar-item.js","webpack://ui-platform/./src/components/ld-platform/ld-sidebar/ld-sidebar.js","webpack://ui-platform/./src/components/ld-platform/ld-title/ld-title.ts","webpack://ui-platform/./src/components/ld-platform/ld-banner/index.ts","webpack://ui-platform/./src/components/ld-application/ld-release-notes/styles.js","webpack://ui-platform/./src/components/ld-application/ld-release-notes/index.ts","webpack://ui-platform/./src/components/ld-platform/ld-platform.ts","webpack://ui-platform/./src/components/ld-waiting/styles.js","webpack://ui-platform/./src/components/ld-waiting/index.js","webpack://ui-platform/./src/components/_base-styles/sw-color-palette.ts","webpack://ui-platform/./src/components/_base-styles/ids-color-palette.ts","webpack://ui-platform/./src/components/_base-styles/theme_default.ts","webpack://ui-platform/./src/components/ld-application/ld-application-styles.js","webpack://ui-platform/./src/components/ld-application/ld-privacy-policy/styles.ts","webpack://ui-platform/./src/components/ld-application/ld-privacy-policy/index.ts","webpack://ui-platform/./src/components/ld-application/ld-application.ts","webpack://ui-platform/./node_modules/pwa-helpers/src/router.ts","webpack://ui-platform/./node_modules/pwa-helpers/src/network.ts"],"sourcesContent":["var map = {\n\t\"./af\": 19183,\n\t\"./af.js\": 19183,\n\t\"./ar\": 31035,\n\t\"./ar-dz\": 47214,\n\t\"./ar-dz.js\": 47214,\n\t\"./ar-kw\": 40830,\n\t\"./ar-kw.js\": 40830,\n\t\"./ar-ly\": 68899,\n\t\"./ar-ly.js\": 68899,\n\t\"./ar-ma\": 77258,\n\t\"./ar-ma.js\": 77258,\n\t\"./ar-ps\": 19121,\n\t\"./ar-ps.js\": 19121,\n\t\"./ar-sa\": 64096,\n\t\"./ar-sa.js\": 64096,\n\t\"./ar-tn\": 97826,\n\t\"./ar-tn.js\": 97826,\n\t\"./ar.js\": 31035,\n\t\"./az\": 20051,\n\t\"./az.js\": 20051,\n\t\"./be\": 23813,\n\t\"./be.js\": 23813,\n\t\"./bg\": 64323,\n\t\"./bg.js\": 64323,\n\t\"./bm\": 57837,\n\t\"./bm.js\": 57837,\n\t\"./bn\": 75780,\n\t\"./bn-bd\": 25959,\n\t\"./bn-bd.js\": 25959,\n\t\"./bn.js\": 75780,\n\t\"./bo\": 81451,\n\t\"./bo.js\": 81451,\n\t\"./br\": 76480,\n\t\"./br.js\": 76480,\n\t\"./bs\": 91607,\n\t\"./bs.js\": 91607,\n\t\"./ca\": 23232,\n\t\"./ca.js\": 23232,\n\t\"./cs\": 91034,\n\t\"./cs.js\": 91034,\n\t\"./cv\": 54213,\n\t\"./cv.js\": 54213,\n\t\"./cy\": 95800,\n\t\"./cy.js\": 95800,\n\t\"./da\": 40739,\n\t\"./da.js\": 40739,\n\t\"./de\": 66951,\n\t\"./de-at\": 82181,\n\t\"./de-at.js\": 82181,\n\t\"./de-ch\": 61339,\n\t\"./de-ch.js\": 61339,\n\t\"./de.js\": 66951,\n\t\"./dv\": 16938,\n\t\"./dv.js\": 16938,\n\t\"./el\": 59573,\n\t\"./el.js\": 59573,\n\t\"./en-au\": 62458,\n\t\"./en-au.js\": 62458,\n\t\"./en-ca\": 51816,\n\t\"./en-ca.js\": 51816,\n\t\"./en-gb\": 8069,\n\t\"./en-gb.js\": 8069,\n\t\"./en-ie\": 15586,\n\t\"./en-ie.js\": 15586,\n\t\"./en-il\": 60009,\n\t\"./en-il.js\": 60009,\n\t\"./en-in\": 51207,\n\t\"./en-in.js\": 51207,\n\t\"./en-nz\": 83724,\n\t\"./en-nz.js\": 83724,\n\t\"./en-sg\": 24334,\n\t\"./en-sg.js\": 24334,\n\t\"./eo\": 1292,\n\t\"./eo.js\": 1292,\n\t\"./es\": 66328,\n\t\"./es-do\": 61452,\n\t\"./es-do.js\": 61452,\n\t\"./es-mx\": 94444,\n\t\"./es-mx.js\": 94444,\n\t\"./es-us\": 81285,\n\t\"./es-us.js\": 81285,\n\t\"./es.js\": 66328,\n\t\"./et\": 7181,\n\t\"./et.js\": 7181,\n\t\"./eu\": 62830,\n\t\"./eu.js\": 62830,\n\t\"./fa\": 19565,\n\t\"./fa.js\": 19565,\n\t\"./fi\": 85541,\n\t\"./fi.js\": 85541,\n\t\"./fil\": 65661,\n\t\"./fil.js\": 65661,\n\t\"./fo\": 26087,\n\t\"./fo.js\": 26087,\n\t\"./fr\": 25396,\n\t\"./fr-ca\": 96581,\n\t\"./fr-ca.js\": 96581,\n\t\"./fr-ch\": 81294,\n\t\"./fr-ch.js\": 81294,\n\t\"./fr.js\": 25396,\n\t\"./fy\": 12533,\n\t\"./fy.js\": 12533,\n\t\"./ga\": 55796,\n\t\"./ga.js\": 55796,\n\t\"./gd\": 50847,\n\t\"./gd.js\": 50847,\n\t\"./gl\": 60439,\n\t\"./gl.js\": 60439,\n\t\"./gom-deva\": 46514,\n\t\"./gom-deva.js\": 46514,\n\t\"./gom-latn\": 66525,\n\t\"./gom-latn.js\": 66525,\n\t\"./gu\": 34232,\n\t\"./gu.js\": 34232,\n\t\"./he\": 50915,\n\t\"./he.js\": 50915,\n\t\"./hi\": 22095,\n\t\"./hi.js\": 22095,\n\t\"./hr\": 10762,\n\t\"./hr.js\": 10762,\n\t\"./hu\": 88275,\n\t\"./hu.js\": 88275,\n\t\"./hy-am\": 73094,\n\t\"./hy-am.js\": 73094,\n\t\"./id\": 27769,\n\t\"./id.js\": 27769,\n\t\"./is\": 99676,\n\t\"./is.js\": 99676,\n\t\"./it\": 74313,\n\t\"./it-ch\": 25141,\n\t\"./it-ch.js\": 25141,\n\t\"./it.js\": 74313,\n\t\"./ja\": 11985,\n\t\"./ja.js\": 11985,\n\t\"./jv\": 53908,\n\t\"./jv.js\": 53908,\n\t\"./ka\": 32808,\n\t\"./ka.js\": 32808,\n\t\"./kk\": 33930,\n\t\"./kk.js\": 33930,\n\t\"./km\": 71532,\n\t\"./km.js\": 71532,\n\t\"./kn\": 69461,\n\t\"./kn.js\": 69461,\n\t\"./ko\": 60502,\n\t\"./ko.js\": 60502,\n\t\"./ku\": 18660,\n\t\"./ku-kmr\": 58035,\n\t\"./ku-kmr.js\": 58035,\n\t\"./ku.js\": 18660,\n\t\"./ky\": 83088,\n\t\"./ky.js\": 83088,\n\t\"./lb\": 65742,\n\t\"./lb.js\": 65742,\n\t\"./lo\": 25417,\n\t\"./lo.js\": 25417,\n\t\"./lt\": 64968,\n\t\"./lt.js\": 64968,\n\t\"./lv\": 41202,\n\t\"./lv.js\": 41202,\n\t\"./me\": 34438,\n\t\"./me.js\": 34438,\n\t\"./mi\": 18498,\n\t\"./mi.js\": 18498,\n\t\"./mk\": 6744,\n\t\"./mk.js\": 6744,\n\t\"./ml\": 63949,\n\t\"./ml.js\": 63949,\n\t\"./mn\": 4459,\n\t\"./mn.js\": 4459,\n\t\"./mr\": 46679,\n\t\"./mr.js\": 46679,\n\t\"./ms\": 56960,\n\t\"./ms-my\": 47483,\n\t\"./ms-my.js\": 47483,\n\t\"./ms.js\": 56960,\n\t\"./mt\": 99989,\n\t\"./mt.js\": 99989,\n\t\"./my\": 64978,\n\t\"./my.js\": 64978,\n\t\"./nb\": 88460,\n\t\"./nb.js\": 88460,\n\t\"./ne\": 23993,\n\t\"./ne.js\": 23993,\n\t\"./nl\": 95378,\n\t\"./nl-be\": 62678,\n\t\"./nl-be.js\": 62678,\n\t\"./nl.js\": 95378,\n\t\"./nn\": 67560,\n\t\"./nn.js\": 67560,\n\t\"./oc-lnc\": 87060,\n\t\"./oc-lnc.js\": 87060,\n\t\"./pa-in\": 62187,\n\t\"./pa-in.js\": 62187,\n\t\"./pl\": 93532,\n\t\"./pl.js\": 93532,\n\t\"./pt\": 49396,\n\t\"./pt-br\": 92485,\n\t\"./pt-br.js\": 92485,\n\t\"./pt.js\": 49396,\n\t\"./ro\": 33179,\n\t\"./ro.js\": 33179,\n\t\"./ru\": 93797,\n\t\"./ru.js\": 93797,\n\t\"./sd\": 40675,\n\t\"./sd.js\": 40675,\n\t\"./se\": 59036,\n\t\"./se.js\": 59036,\n\t\"./si\": 59160,\n\t\"./si.js\": 59160,\n\t\"./sk\": 31266,\n\t\"./sk.js\": 31266,\n\t\"./sl\": 74699,\n\t\"./sl.js\": 74699,\n\t\"./sq\": 69728,\n\t\"./sq.js\": 69728,\n\t\"./sr\": 87129,\n\t\"./sr-cyrl\": 55000,\n\t\"./sr-cyrl.js\": 55000,\n\t\"./sr.js\": 87129,\n\t\"./ss\": 74346,\n\t\"./ss.js\": 74346,\n\t\"./sv\": 9877,\n\t\"./sv.js\": 9877,\n\t\"./sw\": 918,\n\t\"./sw.js\": 918,\n\t\"./ta\": 24787,\n\t\"./ta.js\": 24787,\n\t\"./te\": 6199,\n\t\"./te.js\": 6199,\n\t\"./tet\": 91851,\n\t\"./tet.js\": 91851,\n\t\"./tg\": 33881,\n\t\"./tg.js\": 33881,\n\t\"./th\": 87828,\n\t\"./th.js\": 87828,\n\t\"./tk\": 99677,\n\t\"./tk.js\": 99677,\n\t\"./tl-ph\": 29253,\n\t\"./tl-ph.js\": 29253,\n\t\"./tlh\": 95586,\n\t\"./tlh.js\": 95586,\n\t\"./tr\": 17254,\n\t\"./tr.js\": 17254,\n\t\"./tzl\": 61192,\n\t\"./tzl.js\": 61192,\n\t\"./tzm\": 69631,\n\t\"./tzm-latn\": 72841,\n\t\"./tzm-latn.js\": 72841,\n\t\"./tzm.js\": 69631,\n\t\"./ug-cn\": 71720,\n\t\"./ug-cn.js\": 71720,\n\t\"./uk\": 28048,\n\t\"./uk.js\": 28048,\n\t\"./ur\": 86751,\n\t\"./ur.js\": 86751,\n\t\"./uz\": 96343,\n\t\"./uz-latn\": 60513,\n\t\"./uz-latn.js\": 60513,\n\t\"./uz.js\": 96343,\n\t\"./vi\": 44821,\n\t\"./vi.js\": 44821,\n\t\"./x-pseudo\": 23973,\n\t\"./x-pseudo.js\": 23973,\n\t\"./yo\": 15000,\n\t\"./yo.js\": 15000,\n\t\"./zh-cn\": 43762,\n\t\"./zh-cn.js\": 43762,\n\t\"./zh-hk\": 9246,\n\t\"./zh-hk.js\": 9246,\n\t\"./zh-mo\": 41107,\n\t\"./zh-mo.js\": 41107,\n\t\"./zh-tw\": 79014,\n\t\"./zh-tw.js\": 79014\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;","import { fromUtf8 as jsFromUtf8, toUtf8 as jsToUtf8 } from \"./pureJs\";\nimport { fromUtf8 as textEncoderFromUtf8, toUtf8 as textEncoderToUtf8 } from \"./whatwgEncodingApi\";\nexport const fromUtf8 = (input) => typeof TextEncoder === \"function\" ? textEncoderFromUtf8(input) : jsFromUtf8(input);\nexport const toUtf8 = (input) => typeof TextDecoder === \"function\" ? textEncoderToUtf8(input) : jsToUtf8(input);\n","export function fromUtf8(input) {\n    return new TextEncoder().encode(input);\n}\nexport function toUtf8(input) {\n    return new TextDecoder(\"utf-8\").decode(input);\n}\n","export const fromUtf8 = (input) => {\n    const bytes = [];\n    for (let i = 0, len = input.length; i < len; i++) {\n        const value = input.charCodeAt(i);\n        if (value < 0x80) {\n            bytes.push(value);\n        }\n        else if (value < 0x800) {\n            bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000);\n        }\n        else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n            const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111);\n            bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000);\n        }\n        else {\n            bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000);\n        }\n    }\n    return Uint8Array.from(bytes);\n};\nexport const toUtf8 = (input) => {\n    let decoded = \"\";\n    for (let i = 0, len = input.length; i < len; i++) {\n        const byte = input[i];\n        if (byte < 0x80) {\n            decoded += String.fromCharCode(byte);\n        }\n        else if (0b11000000 <= byte && byte < 0b11100000) {\n            const nextByte = input[++i];\n            decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111));\n        }\n        else if (0b11110000 <= byte && byte < 0b101101101) {\n            const surrogatePair = [byte, input[++i], input[++i], input[++i]];\n            const encoded = \"%\" + surrogatePair.map((byteValue) => byteValue.toString(16)).join(\"%\");\n            decoded += decodeURIComponent(encoded);\n        }\n        else {\n            decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111));\n        }\n    }\n    return decoded;\n};\n",null,null,null,null,null,null,null,"/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {html, customElement, property, LitElement, TemplateResult} from 'lit-element';\n\nimport '@polymer/paper-button/paper-button';\nimport {IFAtomElements} from '../../interfaces';\nimport {ifDefined} from 'lit-html/directives/if-defined';\n\n\n/**\n * The default button for SW lifedata applications\n *\n * @element ld-button\n *\n * @slot - Button label\n *\n * @prop {Boolean} active - If true, the button is a toggle and is currently in the active state.\n * @prop {Boolean} disabled - If true, the user cannot interact with this element.\n * @prop {Boolean} focused - If true, the element currently has focus.\n *\n * @fires active-changed - Fired when the `active` property changes.\n * @fires disabled-changed - Fired when the `disabled` property changes.\n * @fires focused-changes - Fired when the `focused` property changes.\n * @fires transitionend - Fired when the animation finishes. This is useful if you want to wait until the ripple animation finishes to perform some action.\n *\n * @since 0.0.1\n */\n@customElement('ld-button')\nexport class LdButton extends LitElement implements IFAtomElements {\n\n  @property({type: Boolean, reflect: true}) active: boolean | null | undefined = false;\n  @property({type: String}) ariaActiveAttribute: string = 'aria-pressed';\n  @property({type: Boolean, reflect: true, hasChanged: () => true}) disabled: boolean | null | undefined = false;\n  @property({type: Number}) elevation: number | null | undefined;\n  @property({type: Boolean, reflect: true}) focused: boolean | null | undefined = false;\n  @property({type: Boolean}) noink: boolean = false;\n  @property({type: Boolean}) pointerDown: boolean = false;\n  @property({type: Boolean}) raised: boolean | null | undefined = false;\n  @property({type: Boolean}) toggles: boolean | null | undefined = false;\n  @property({type: Number}) tabindex: number | null;\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <paper-button\n        part=\"ld-part-button\"\n        ?active=\"${this.active}\"\n        ariaActiveAsttribute=\"${this.ariaActiveAttribute}\"\n        ?disabled=\"${this.disabled}\"\n        elevation=\"${ifDefined(this.elevation != null ? this.elevation : undefined)}\"\n        ?focused=\"${this.focused}\"\n        ?noink=\"${this.noink}\"\n        ?pointerDown=\"${this.pointerDown}\"\n        ?raised=\"${this.raised}\"\n        ?toggles=\"${this.toggles}\"\n        tabindex=\"${ifDefined(this.tabindex != null ? this.tabindex : undefined)}\"\n        @active-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @disabled-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @focused-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @transitionend=\"${(evt: Event) => this._onEvent(evt)}\"\n      >\n      <slot></slot>\n      </paper-button>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: Event) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n}\n","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {AttributePart, directive, Part, PropertyPart} from '../lit-html.js';\n\n// IE11 doesn't support classList on SVG elements, so we emulate it with a Set\nclass ClassList {\n  element: Element;\n  classes: Set<string> = new Set();\n  changed = false;\n\n  constructor(element: Element) {\n    this.element = element;\n    const classList = (element.getAttribute('class') || '').split(/\\s+/);\n    for (const cls of classList) {\n      this.classes.add(cls);\n    }\n  }\n  add(cls: string) {\n    this.classes.add(cls);\n    this.changed = true;\n  }\n\n  remove(cls: string) {\n    this.classes.delete(cls);\n    this.changed = true;\n  }\n\n  commit() {\n    if (this.changed) {\n      let classString = '';\n      this.classes.forEach((cls) => classString += cls + ' ');\n      this.element.setAttribute('class', classString);\n    }\n  }\n}\n\nexport interface ClassInfo {\n  readonly [name: string]: string|boolean|number;\n}\n\n/**\n * Stores the ClassInfo object applied to a given AttributePart.\n * Used to unset existing values when a new ClassInfo object is applied.\n */\nconst previousClassesCache = new WeakMap<Part, Set<string>>();\n\n/**\n * A directive that applies CSS classes. This must be used in the `class`\n * attribute and must be the only part used in the attribute. It takes each\n * property in the `classInfo` argument and adds the property name to the\n * element's `class` if the property value is truthy; if the property value is\n * falsey, the property name is removed from the element's `class`. For example\n * `{foo: bar}` applies the class `foo` if the value of `bar` is truthy.\n * @param classInfo {ClassInfo}\n */\nexport const classMap = directive((classInfo: ClassInfo) => (part: Part) => {\n  if (!(part instanceof AttributePart) || (part instanceof PropertyPart) ||\n      part.committer.name !== 'class' || part.committer.parts.length > 1) {\n    throw new Error(\n        'The `classMap` directive must be used in the `class` attribute ' +\n        'and must be the only part in the attribute.');\n  }\n\n  const {committer} = part;\n  const {element} = committer;\n\n  let previousClasses = previousClassesCache.get(part);\n  if (previousClasses === undefined) {\n    // Write static classes once\n    // Use setAttribute() because className isn't a string on SVG elements\n    element.setAttribute('class', committer.strings.join(' '));\n    previousClassesCache.set(part, previousClasses = new Set());\n  }\n\n  const classList =\n      (element.classList || new ClassList(element)) as DOMTokenList | ClassList;\n\n  // Remove old classes that no longer apply\n  // We use forEach() instead of for-of so that re don't require down-level\n  // iteration.\n  previousClasses.forEach((name) => {\n    if (!(name in classInfo)) {\n      classList.remove(name);\n      previousClasses!.delete(name);\n    }\n  });\n\n  // Add or remove classes based on their classMap value\n  for (const name in classInfo) {\n    const value = classInfo[name];\n    if (value != previousClasses.has(name)) {\n      // We explicitly want a loose truthy check of `value` because it seems\n      // more convenient that '' and 0 are skipped.\n      if (value) {\n        classList.add(name);\n        previousClasses.add(name);\n      } else {\n        classList.remove(name);\n        previousClasses.delete(name);\n      }\n    }\n  }\n  if (typeof (classList as ClassList).commit === 'function') {\n    (classList as ClassList).commit();\n  }\n});\n","/**\n * Copyright 2026 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {css, CSSResult, customElement, html, LitElement, property, PropertyValues, TemplateResult} from 'lit-element';\nimport {ifDefined} from 'lit-html/directives/if-defined';\nimport {classMap} from 'lit-html/directives/class-map';\nimport {IFLdDropdownListboxItemSearch, IFLdSearchableDropdown} from \"../../interfaces\";\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-dropdown-menu/paper-dropdown-menu-icons';\n\n/**\n * Searchable Dropdown field with search functionality\n *\n * @element ld-searchable-dropdown\n *\n * @since 0.1.0\n */\n@customElement('ld-searchable-dropdown')\nexport class LdSearchableDropdown extends LitElement {\n\n  @property({type: Boolean, hasChanged: () => true, reflect: true})\n  invalid: boolean | null | undefined = false;\n\n  @property({type: Object, hasChanged: () => true, reflect: true})\n  dropdown: IFLdSearchableDropdown;\n\n  @property({type: String})\n  private selectedValue = '';\n\n  @property({type: Boolean})\n  private isOpen = false;\n\n  @property({type: String})\n  private searchTerm = '';\n\n  @property({type: Array})\n  private filteredOptions: IFLdDropdownListboxItemSearch[] = [];\n\n  @property({type: Number})\n  private highlightedIndex = -1;\n\n\n  // --------------------------------------------------------------------------------------\n  static get styles(): CSSResult {\n    return css`\n        :host {\n            display: block;\n            position: relative;\n        }\n\n        .searchable-dropdown {\n            position: relative;\n            width: 100%;\n        }\n\n        .dropdown-label {\n            position: absolute;\n            top: 10px;\n            color: #828282;\n            transition: all 0.2s ease;\n            pointer-events: none;\n            font-size: 20px;\n        }\n\n        .dropdown-label.float {\n            top: 0px;\n            font-size: 14px;\n            color: #373be7;\n        }\n        .invalid .dropdown-label {\n            border-color: #d32f2f;\n            border-width: 2px;\n            color: #d32f2f;\n\n        }\n\n        .required {\n            color: #d32f2f;\n        }\n\n        .dropdown-trigger {\n            display: flex;\n            align-items: center;\n            padding: 7px 2px 3px 2px;\n            border-bottom: 1px solid #828282;\n            background: white;\n            cursor: pointer;\n            min-height: 25px;\n            transition: border-color 0.2s;\n        }\n\n        .dropdown-trigger:hover:not(.disabled .dropdown-trigger) {\n            border-color: #373be7;\n            border-width: 2px;\n        }\n\n        .disabled .dropdown-trigger {\n            background: #f5f5f5;\n            cursor: not-allowed;\n        }\n\n        .invalid .dropdown-trigger {\n            border-color: #d32f2f;\n            border-width: 2px;\n            color: #d32f2f;\n\n        }\n\n        .selected-value {\n            flex: 1;\n            display: flex;\n            gap: 4px;\n            align-items: center;\n            margin-top: 10px;\n        }\n\n        .selected-key {\n            color: #333;\n            font-size: 20px;\n        }\n\n        .selected-separator {\n            color: #9b9b9b;\n        }\n\n        .selected-val {\n            color: #9b9b9b;\n        }\n\n        .placeholder {\n            color: #9b9b9b;\n        }\n\n        .clear-button {\n            background: none;\n            border: none;\n            padding: 4px;\n            cursor: pointer;\n            color: #9b9b9b;\n            display: flex;\n            align-items: center;\n            margin-right: 8px;\n        }\n\n        .clear-button iron-icon {\n            width: 20px;\n            height: 20px;\n        }\n\n        .clear-button:hover {\n            color: #d32f2f;\n        }\n\n        .clear-button:disabled {\n            cursor: not-allowed;\n            opacity: 0.5;\n        }\n\n        .dropdown-arrow {\n            transition: transform 0.2s;\n            color: #9b9b9b;\n            width: 24px;\n            height: 24px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .dropdown-arrow.open {\n            transform: rotate(180deg);\n        }\n\n\n        .dropdown-menu {\n            position: absolute;\n            top: 100%;\n            left: 0;\n            right: 0;\n            background: white;\n            border: 1px solid #ccc;\n            border-top: none;\n            border-radius: 0 0 4px 4px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n            z-index: 1000;\n            overflow: hidden;\n        }\n\n        .search-container {\n            padding: 8px;\n            border-bottom: 1px solid #eee;\n        }\n\n        .search-input {\n            width: 100%;\n            padding: 8px 12px;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            font-size: 14px;\n            box-sizing: border-box;\n        }\n\n        .search-input:focus {\n            outline: none;\n            border-color: #117dac;\n        }\n\n        .options-container {\n            max-height: inherit;\n            overflow-y: auto;\n        }\n\n        .dropdown-option {\n            padding: 12px;\n            cursor: pointer;\n            border-bottom: 1px solid #f0f0f0;\n            transition: background-color 0.15s;\n        }\n\n        .dropdown-option:hover,\n        .dropdown-option.highlighted {\n            background-color: #f5f5f5;\n        }\n\n        .dropdown-option.selected {\n            background-color: #e3f2fd;\n        }\n\n        .option-key {\n            font-weight: 600;\n            color: #333;\n            font-size: 14px;\n        }\n\n        .option-value {\n            color: #9b9b9b;\n            font-size: 13px;\n            margin-top: 2px;\n        }\n\n        .no-results {\n            padding: 16px;\n            text-align: center;\n            color: #999;\n        }\n\n        .error-message {\n            color: #d32f2f;\n            font-size: 12px;\n            margin-top: 4px;\n        }\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.dropdown = {\n      id: '',\n      value: []\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  connectedCallback(): void {\n    super.connectedCallback();\n    document.addEventListener('click', this._handleClickOutside);\n    document.addEventListener('keydown', this._handleKeyDown);\n  }\n\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    document.removeEventListener('click', this._handleClickOutside);\n    document.removeEventListener('keydown', this._handleKeyDown);\n  }\n\n  protected firstUpdated(_changedProperties: PropertyValues) {\n    super.firstUpdated(_changedProperties);\n    if (_changedProperties.has('dropdown')) {\n      if (this.dropdown.selected) {\n        this.selectedValue = this.dropdown.selected;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  updated(changedProperties: Map<string, any>): void {\n    super.updated(changedProperties);\n\n    if (changedProperties.has('dropdown')) {\n      this.filteredOptions = this.dropdown.value ? [...this.dropdown.value] : [];\n    }\n\n    if (changedProperties.has('isOpen') && this.isOpen) {\n      this.updateComplete.then(() => {\n        const searchInput = this.shadowRoot?.querySelector('.search-input') as HTMLInputElement;\n        if (searchInput) {\n          searchInput.focus();\n        }\n      });\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private get _selectedOption(): IFLdDropdownListboxItemSearch | null {\n    if (!this.dropdown.value) return null;\n\n    const option = this.dropdown.value.find(opt => opt.key === this.selectedValue) || null;\n\n    return option;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _handleClickOutside = (event: MouseEvent): void => {\n    const path = event.composedPath();\n    if (!path.includes(this)) {\n      this._closeDropdown();\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _handleKeyDown = (event: KeyboardEvent): void => {\n    if (!this.isOpen) return;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.highlightedIndex = Math.min(\n          this.highlightedIndex + 1,\n          this.filteredOptions.length - 1\n        );\n        this._scrollToHighlighted();\n        break;\n\n      case 'ArrowUp':\n        event.preventDefault();\n        this.highlightedIndex = Math.max(this.highlightedIndex - 1, 0);\n        this._scrollToHighlighted();\n        break;\n\n      case 'Enter':\n        event.preventDefault();\n        if (this.highlightedIndex >= 0 && this.filteredOptions[this.highlightedIndex]) {\n          this._selectOption(this.filteredOptions[this.highlightedIndex]);\n        }\n        break;\n\n      case 'Escape':\n        event.preventDefault();\n        this._closeDropdown();\n        break;\n\n      case 'Tab':\n        this._closeDropdown();\n        break;\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _scrollToHighlighted(): void {\n    this.updateComplete.then(() => {\n      const optionsContainer = this.shadowRoot?.querySelector('.options-container') as HTMLElement;\n      if (optionsContainer && this.highlightedIndex >= 0) {\n        const optionElement = optionsContainer.querySelector(\n          `[data-index=\"${this.highlightedIndex}\"]`\n        ) as HTMLElement;\n        if (optionElement) {\n          optionElement.scrollIntoView({block: 'nearest', behavior: 'smooth'});\n        }\n      }\n    });\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _toggleDropdown(): void {\n    if (this.dropdown.readonly) return;\n\n    this.isOpen = !this.isOpen;\n    if (this.isOpen) {\n      this.searchTerm = '';\n      this.filteredOptions = this.dropdown.value ? [...this.dropdown.value] : [];\n      this.highlightedIndex = this.selectedValue\n        ? this.filteredOptions.findIndex(opt => opt.key === this.selectedValue)\n        : 0;\n    } else {\n      this._closeDropdown();\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _closeDropdown(): void {\n    this.isOpen = false;\n    this.searchTerm = '';\n    this.highlightedIndex = -1;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _handleSearch(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    this.searchTerm = input.value.toLowerCase();\n\n    if (!this.dropdown.value) {\n      this.filteredOptions = [];\n      return;\n    }\n\n    this.filteredOptions = this.dropdown.value.filter(option => {\n      const name = this._getOptionName(option);\n      return (\n        option.key.toLowerCase().includes(this.searchTerm) ||\n        name.toLowerCase().includes(this.searchTerm)\n      );\n    });\n\n    this.highlightedIndex = this.filteredOptions.length > 0 ? 0 : -1;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _selectOption(option: IFLdDropdownListboxItemSearch): void {\n    const oldValue = this.selectedValue;\n    this.selectedValue = option.key;\n\n    this._dispatchChangeEvent('selected-item-changed', {\n      value: option,\n      oldValue: oldValue,\n      newValue: option.key\n    });\n\n    this._dispatchChangeEvent('value-changed', {\n      value: option.key\n    });\n\n    this._closeDropdown();\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _clearSelection(event: Event): void {\n    event.stopPropagation();\n    const oldValue = this.selectedValue;\n    this.selectedValue = '';\n    this._dispatchChangeEvent('selected-item-changed', {\n      value: null,\n      oldValue: oldValue,\n      newValue: ''\n    });\n\n    this._dispatchChangeEvent('value-changed', {\n      value: ''\n    });\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _dispatchChangeEvent(eventName: string, detail: any): void {\n    const event = new CustomEvent(eventName, {\n      detail: detail,\n      bubbles: true,\n      composed: true\n    });\n    this.dispatchEvent(event);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _getOptionName(item: IFLdDropdownListboxItemSearch): string {\n    let name = item.name != null ? item.name : item.title != null ? item.title : item.value;\n    if (name && name.length > 80) {\n      name = `${name.substring(0, 80)}\\u2026`;\n    }\n    return name;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private _renderOption(option: IFLdDropdownListboxItemSearch, index: number): TemplateResult {\n    const classes = {\n      'dropdown-option': true,\n      'highlighted': index === this.highlightedIndex,\n      'selected': this._selectedOption?.key === option.key\n    };\n\n    const name = this._getOptionName(option);\n\n    return html`\n      <div\n          class=${classMap(classes)}\n          data-index=${index}\n          @click=${() => this._selectOption(option)}\n          @mouseenter=${() => {\n            this.highlightedIndex = index;\n          }}\n          role=\"option\"\n          cid=\"${option.key}\"\n          aria-selected=${this._selectedOption?.key === option.key}\n      >\n        <div class=\"option-key\">${name}</div>\n      </div>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    const dropdownClasses = {\n      'searchable-dropdown': true,\n      'disabled': this.dropdown.readonly || false,\n      'invalid': this.dropdown.invalid || this.invalid || false\n    };\n\n    const searchPlaceholder = this.dropdown.searchPlaceholder || 'Search...';\n    return html`\n      <div\n          part=\"ld-part-searchable-dropdown\"\n          id=\"${this.dropdown.id}\"\n          class=${classMap(dropdownClasses)}\n          tabindex=\"${ifDefined(this.dropdown.tabindex != null ? this.dropdown.tabindex : undefined)}\"\n      >\n        ${this.dropdown.label && !this.dropdown.noLabelFloat ? html`\n          <label \n              class=\"dropdown-label ${this._selectedOption || this.isOpen ? 'float' : ''}\"\n              aria-invalid=${this.dropdown.invalid || this.invalid || false}\n\n          >\n            ${this.dropdown.label}\n\n          </label>\n        ` : ''}\n\n        <div\n            class=\"dropdown-trigger\"\n            @click=${this._toggleDropdown}\n            role=\"combobox\"\n            aria-expanded=${this.isOpen}\n            aria-haspopup=\"listbox\"\n            aria-controls=\"dropdown-menu\"\n            aria-invalid=${this.dropdown.invalid || this.invalid || false}\n            aria-required=${this.dropdown.required || false}\n        >\n          <div class=\"selected-value\" cid=\"${this._selectedOption?.key}\">\n            ${this._selectedOption\n                ? html`\n                  <span class=\"selected-key\">${this._getOptionName(this._selectedOption)}</span>\n                `\n                : html``\n            }\n          </div>\n\n          ${this.dropdown.clearable && this._selectedOption\n              ? html`\n                <button\n                    class=\"clear-button\"\n                    @click=${this._clearSelection}\n                    aria-label=\"Clear selection\"\n                    type=\"button\"\n                    ?disabled=${this.dropdown.readonly}\n                >\n                  <iron-icon icon=\"clear\"></iron-icon>\n                </button>\n              `\n              : ''}\n\n          <iron-icon\n              class=\"dropdown-arrow ${this.isOpen ? 'open' : ''}\"\n              icon=\"paper-dropdown-menu:arrow-drop-down\"\n          ></iron-icon>\n        </div>\n\n        ${this.dropdown.invalid || this.invalid ? html`\n          <div class=\"error-message\">${this.dropdown.errorMessage || 'Invalid selection'}</div>\n        ` : ''}\n\n        ${this.isOpen\n            ? html`\n              <div\n                  class=\"dropdown-menu\"\n                  id=\"dropdown-menu\"\n                  role=\"listbox\"\n                  style=\"max-height: ${this.dropdown.maxHeight || '250px'}\"\n              >\n                <div class=\"search-container\">\n                  <input\n                      type=\"text\"\n                      class=\"search-input\"\n                      placeholder=${searchPlaceholder}\n                      .value=${this.searchTerm}\n                      @input=${this._handleSearch}\n                      aria-label=\"Search options\"\n                  />\n                </div>\n                <div class=\"options-container\">\n                  ${this.filteredOptions.length > 0\n                      ? this.filteredOptions.map((option, index) => this._renderOption(option, index))\n                      : html`\n                        <div class=\"no-results\">No results found</div>`\n                  }\n                </div>\n              </div>\n            `\n            : ''}\n      </div>\n    `;\n  }\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {html, customElement, LitElement, TemplateResult, property, css} from 'lit-element';\nimport '@polymer/paper-dropdown-menu/paper-dropdown-menu';\nimport '@polymer/paper-listbox/paper-listbox';\nimport '@polymer/paper-item/paper-item';\nimport {IFAtomElements, IFLdDropdown, IFLdDropdownListboxItem} from '../../interfaces';\nimport {ifDefined} from 'lit-html/directives/if-defined';\n\n/**\n * Dropdown field\n *\n * @element ld-dropdown\n *\n * @since 0.1.2\n */\n@customElement('ld-dropdown')\nexport class LdDropdown extends LitElement implements IFAtomElements {\n\n  @property({type: Boolean, hasChanged: () => true, reflect: true}) invalid: boolean | null | undefined = false;\n  @property({type: Object, hasChanged: () => true, reflect: true}) dropdown: IFLdDropdown;\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return css`\n      :host {\n        display: block;\n      }\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  static __truncateFullname(item: IFLdDropdownListboxItem): string | undefined {\n    let name = (item.name != null) ? item.name : item.title;\n    if (name && name.length > 80) {\n      name = `${name.substr(0, 80)}\\u2026`;\n    }\n\n    return name;\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <paper-dropdown-menu \n        part=\"ld-part-dropdown\"\n        id='${this.dropdown.id}'\n        label='${this.dropdown.label}'\n        error-message='${this.dropdown.errorMessage != null ? this.dropdown.errorMessage : ''}'\n        name=\"${ifDefined(this.dropdown.name != null ? this.dropdown.name : undefined)}\"\n        ?no-label-float=\"${this.dropdown.noLabelFloat}\"\n        ?invalid=\"${this.dropdown.invalid || this.invalid}\"\n        ?readonly=\"${this.dropdown.readonly}\"\n        ?required=\"${this.dropdown.required}\"\n        tabindex=\"${ifDefined(this.dropdown.tabindex != null ? this.dropdown.tabindex : undefined)}\"\n        @active-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @focused-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @invalid-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @opened-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @selected-item-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @selected-item-label-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @value-changed=\"${(evt: Event) => this._onEvent(evt)}\">\n        <paper-listbox \n          label='${this.dropdown.listBoxLabel}' \n          slot='dropdown-content'\n          selected='${this.dropdown.selected != null ? this.dropdown.selected : ''}' \n          class='${this.dropdown.class}' \n          attr-for-selected='selectedValue'>\n          ${this.__loadListboxItemValue(this.dropdown.value)}\n        </paper-listbox>\n      </paper-dropdown-menu>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: Event) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __loadListboxItemValue(value: IFLdDropdownListboxItem[]) {\n    const items: Array<TemplateResult> = [];\n\n    if (value != null) {\n      value.forEach((listboxItem: IFLdDropdownListboxItem) => {\n        listboxItem.id = (listboxItem.id != null) ? listboxItem.id : `input-${Math.random().toString(36).substr(2, 5)}`;\n        items.push(html`<paper-item selectedValue=\"${listboxItem.id}\">${LdDropdown.__truncateFullname(listboxItem)}</paper-item>`);\n      });\n    }\n\n    return items;\n  }\n\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {html, customElement, LitElement, TemplateResult, property, css, CSSResult} from 'lit-element';\nimport {ifDefined} from 'lit-html/directives/if-defined';\n// @ts-ignore\nimport {live} from '@open-wc/lit-helpers';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-input/paper-input';\nimport {IFAtomElements} from '../../interfaces';\n\n/**\n * The default input field for SW lifedata applications\n *\n * @element ld-input\n *\n * @prop {Boolean} disabled\n * @prop {Boolean} focused\n * @prop {Boolean} invalid\n * @prop {Boolean} value\n *\n * @fires change - Fired when the input changes due to user interaction.\n * @fires disabled-changed - Fired when the `disabled` property changes.\n * @fires focused-changes - Fired when the `focused` property changes.\n * @fires invalid-changed - Fired when the `invalid` property changes.\n * @fires value-changes - Fired when the `value` property changes.\n *\n * @since 0.0.1\n */\n@customElement('ld-input')\nexport class LdInput extends LitElement implements IFAtomElements {\n\n  @property({type: String, reflect: true}) accept: string | null | undefined;\n  @property({type: String}) allowedPattern: string | null | undefined;\n  @property({type: Boolean}) alwaysFloatLabel: boolean | null | undefined = false;\n  @property({type: String}) autocapitalize: string = 'none';\n  @property({type: String}) autocomplete: string | null | undefined = 'off';\n  @property({type: Boolean}) autofocus: boolean = false;\n  @property({type: String}) autosave: string | null | undefined;\n  @property({type: Boolean}) autoValidate: boolean | null | undefined = false;\n  @property({type: Boolean}) charCounter: boolean | null | undefined = false;\n  @property({type: String}) colorErrorMessage: string | null | undefined;\n  @property({type: String}) colorPattern: string | null | undefined;\n  @property({type: Boolean}) disabled: boolean | null | undefined = false;\n  @property({type: String}) errorMessage: string | null | undefined;\n  @property({type: Boolean, reflect: true}) focused: boolean | null | undefined = false;\n  @property({type: String}) inputmode: string | null | undefined;\n  @property({type: Boolean, reflect: true}) invalid: boolean | null | undefined = false;\n  @property({type: String}) label: string | null | undefined;\n  @property({type: String}) list: string | null | undefined;\n  @property({type: String}) max: string | null | undefined;\n  @property({type: Number}) maxlength: number | null | undefined;\n  @property({type: String}) min: string | null | undefined;\n  @property({type: Number}) minlength: number | null | undefined;\n  @property({type: Boolean}) multiple: boolean | null | undefined;\n  @property({type: String}) name: string | null | undefined;\n  @property({type: Boolean}) noLabelFloat: boolean | null | undefined = false;\n  @property({type: String}) pattern: string | null | undefined;\n  @property({type: String}) placeholder: string | null | undefined = '';\n  @property({type: Boolean}) readonly: boolean | null | undefined = false;\n  @property({type: Boolean}) required: boolean | null | undefined = false;\n  @property({type: Number}) results: number | null | undefined;\n  @property({type: Number}) size: number | null | undefined;\n  @property({type: String}) step: string | null | undefined;\n  @property({type: Number}) tabindex: number | null;\n  @property({type: String}) type: string | null | undefined;\n  @property({type: String}) validator: string | null | undefined;\n  @property({type: String, reflect: true, hasChanged: () => true}) value: string | null | undefined;\n\n  @property({type: String}) _internalId: string = `input-internal-id-${Math.random().toString(36).substr(2, 5)}`;\n\n  static get styles(): CSSResult {\n    return css`\n    `;\n  }\n\n  /**\n   * according to https://dev.to/btopro/using-apply-syntax-in-litelement-for-now-31f9 we\n   * need to use a `custom-style` element in order to apply mixins to any custom elements\n   */\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <custom-style>\n        <style is=\"custom-style\">\n          paper-input[type='color'] {\n            display: inline-block; \n            width: 10%;\n            --paper-input-container-underline: {\n              display: none\n            };\n            --paper-input-container-underline-focus: {\n              display: none\n            };\n            --paper-input-container-underline-disabled: {\n              display: none\n            };\n          }\n          \n          paper-input[part='ld-part-input-color-result'] {\n            display: inline-block; \n            color: black;\n          }\n        </style>\n      </custom-style>\n      <paper-input\n        part=\"ld-part-input${this.type != null && this.type != 'text' ? '-' + this.type : ''}\"\n        id=\"${this._internalId}\"\n        accept=\"${ifDefined(this.accept != null ? this.accept : undefined)}\"\n        allowed-pattern=\"${ifDefined(this.allowedPattern != null ? this.allowedPattern : undefined)}\"\n        ?always-float-label=\"${this.alwaysFloatLabel}\"\n        autocapitalize=\"${this.autocapitalize}\"\n        autocomplete=\"${this.autocomplete}\"\n        ?autofocus=\"${this.autofocus}\"\n        autosave=\"${ifDefined(this.autosave != null ? this.autosave : undefined)}\"\n        ?auto-validate=\"${this.autoValidate}\"\n        ?char-counter=\"${this.charCounter}\"\n        ?disabled=\"${this.disabled}\"\n        error-message=\"${ifDefined(this.errorMessage != null ? this.errorMessage : undefined)}\"\n        ?focused=\"${this.focused}\"\n        inputmode=\"${ifDefined(this.inputmode != null ? this.inputmode : undefined)}\"\n        ?invalid=\"${this.invalid}\"\n        label=\"${ifDefined(this.label != null ? this.label : undefined)}\"\n        list=\"${ifDefined(this.list != null ? this.list : undefined)}\"\n        max=\"${ifDefined(this.max != null ? this.max : undefined)}\"\n        maxlength=\"${ifDefined(this.maxlength != null ? this.maxlength : undefined)}\"\n        min=\"${ifDefined(this.min != null ? this.min : undefined)}\"\n        minlength=\"${ifDefined(this.minlength != null ? this.minlength : undefined)}\"\n        ?multiple=\"${this.multiple}\"\n        name=\"${ifDefined(this.name != null ? this.name : undefined)}\"\n        ?no-label-float=\"${this.noLabelFloat}\"\n        pattern=\"${ifDefined(this.pattern != null ? this.pattern : undefined)}\"\n        placeholder=\"${ifDefined(this.placeholder != null ? this.placeholder : undefined)}\"\n        ?readonly=\"${this.readonly}\"\n        ?required=\"${this.required}\"\n        results=\"${ifDefined(this.results != null ? this.results : undefined)}\"\n        size=\"${ifDefined(this.size != null ? this.size : undefined)}\"\n        step=\"${ifDefined(this.step != null ? this.step : undefined)}\"\n        tabindex=\"${ifDefined(this.tabindex != null ? this.tabindex : undefined)}\"\n        type=\"${ifDefined(this.type != null ? this.type : undefined)}\"\n        validator=\"${ifDefined(this.validator != null ? this.validator : undefined)}\"\n        .value=\"${ifDefined(this.value != null ? this.value : undefined)}\"\n        @change=\"${(evt: Event) => this._onEvent(evt)}\"\n        @disabled-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @focused-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @invalid-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @value-changed=\"${(evt: Event) => this.__inputItemValueChanged(evt)}\"\n        >\n        <slot name=\"prefix\" slot=\"prefix\"></slot>\n        <slot name=\"suffix\" slot=\"suffix\"></slot>\n      </paper-input>\n      ${this.type != null && this.type === 'color' ? html`<paper-input part=\"ld-part-input-color-result\" id=\"${this._internalId}-output\" value=\"${ifDefined(this.value != null ? this.value : '#000000')}\" pattern=\"${ifDefined(this.colorPattern != null ? this.colorPattern : '#([A-Fa-f0-9]{6})')}\" error-message=\"${ifDefined(this.colorErrorMessage != null ? this.colorErrorMessage : 'Format: #RRGGBB')}\" auto-validate @value-changed=\"${(evt: CustomEvent) => this.__inputColorValueChanged(evt)}\"></paper-input>` : ''}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: Event) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputItemValueChanged(evt: Event) {\n    // @ts-ignore\n    this.value = evt.detail.value;\n    this._onEvent(evt);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputColorValueChanged(evt: CustomEvent) {\n    if (evt.detail.value.length === 7) {\n      this.value = evt.detail.value;\n      // @ts-ignore\n      const _parentItem = this.shadowRoot?.querySelector(`#${this._internalId}`);\n      // @ts-ignore\n      _parentItem.value = this.value;\n    }\n    return;\n  }\n\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {html, customElement, LitElement, TemplateResult, property, css} from 'lit-element';\nimport {ifDefined} from 'lit-html/directives/if-defined';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-input/paper-textarea';\nimport {IFAtomElements} from '../../interfaces';\n\n/**\n * The default input field for SW lifedata applications\n *\n * @since 0.0.1\n */\n@customElement('ld-textarea')\nexport class LdTextarea extends LitElement implements IFAtomElements {\n\n  @property({type: String}) accept: string | null | undefined;\n  @property({type: String}) allowedPattern: string | null | undefined;\n  @property({type: Boolean}) alwaysFloatLabel: boolean | null | undefined = false;\n  @property({type: String}) autocapitalize: string = 'none';\n  @property({type: String}) autocomplete: string | null | undefined = 'off';\n  @property({type: Boolean}) autofocus: boolean = false;\n  @property({type: String}) autosave: string | null | undefined;\n  @property({type: Boolean}) autoValidate: boolean | null | undefined = false;\n  @property({type: Boolean}) charCounter: boolean | null | undefined = false;\n  @property({type: Boolean}) disabled: boolean | null | undefined = false;\n  @property({type: String}) errorMessage: string | null | undefined;\n  @property({type: Boolean, reflect: true}) focused: boolean | null | undefined = false;\n  @property({type: String}) inputmode: string | null | undefined;\n  @property({type: Boolean, reflect: true}) invalid: boolean | null | undefined = false;\n  @property({type: String}) label: string | null | undefined;\n  @property({type: String}) list: string | null | undefined;\n  @property({type: String}) max: string | null | undefined;\n  @property({type: Number}) maxlength: number | null | undefined;\n  @property({type: String}) min: string | null | undefined;\n  @property({type: Number}) minlength: number | null | undefined;\n  @property({type: Boolean}) multiple: boolean | null | undefined;\n  @property({type: String}) name: string | null | undefined;\n  @property({type: Boolean}) noLabelFloat: boolean | null | undefined = false;\n  @property({type: String}) pattern: string | null | undefined;\n  @property({type: String}) placeholder: string | null | undefined = '';\n  @property({type: Boolean}) readonly: boolean | null | undefined = false;\n  @property({type: Boolean}) required: boolean | null | undefined = false;\n  @property({type: Number}) results: number | null | undefined;\n  @property({type: Number}) rows: number = 1;\n  @property({type: Number}) size: number | null | undefined;\n  @property({type: String}) step: string | null | undefined;\n  @property({type: Number}) tabindex: number | null | undefined;\n  @property({type: String}) type: string | null | undefined;\n  @property({type: String}) validator: string | null | undefined;\n  @property({type: String}) value: string | null | undefined;\n\n  static get styles() {\n    return css`\n      :host {\n        display: block;\n      }\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <paper-textarea\n        part=\"ld-part-textarea\"\n        accept=\"${ifDefined(this.accept != null ? this.accept : undefined)}\"\n        allowed-pattern=\"${ifDefined(this.allowedPattern != null ? this.allowedPattern : undefined)}\"\n        ?always-float-label=\"${this.alwaysFloatLabel}\"\n        autocapitalize=\"${this.autocapitalize}\"\n        autocomplete=\"${this.autocomplete}\"\n        ?autofocus=\"${this.autofocus}\"\n        autosave=\"${ifDefined(this.autosave != null ? this.autosave : undefined)}\"\n        ?auto-validate=\"${this.autoValidate}\"\n        ?char-counter=\"${this.charCounter}\"\n        ?disabled=\"${this.disabled}\"\n        error-message=\"${ifDefined(this.errorMessage != null ? this.errorMessage : undefined)}\"\n        ?focused=\"${this.focused}\"\n        inputmode=\"${ifDefined(this.inputmode != null ? this.inputmode : undefined)}\"\n        ?invalid=\"${this.invalid}\"\n        label=\"${ifDefined(this.label != null ? this.label : undefined)}\"\n        list=\"${ifDefined(this.list != null ? this.list : undefined)}\"\n        max=\"${ifDefined(this.max != null ? this.max : undefined)}\"\n        maxlength=\"${ifDefined(this.maxlength != null ? this.maxlength : undefined)}\"\n        min=\"${ifDefined(this.min != null ? this.min : undefined)}\"\n        minlength=\"${ifDefined(this.minlength != null ? this.minlength : undefined)}\"\n        ?multiple=\"${this.multiple}\"\n        name=\"${ifDefined(this.name != null ? this.name : undefined)}\"\n        ?no-label-float=\"${this.noLabelFloat}\"\n        pattern=\"${ifDefined(this.pattern != null ? this.pattern : undefined)}\"\n        placeholder=\"${ifDefined(this.placeholder != null ? this.placeholder : undefined)}\"\n        ?readonly=\"${this.readonly}\"\n        ?required=\"${this.required}\"\n        rows=\"${ifDefined(this.rows != null ? this.rows : undefined)}\"\n        results=\"${ifDefined(this.results != null ? this.results : undefined)}\"\n        size=\"${ifDefined(this.size != null ? this.size : undefined)}\"\n        step=\"${ifDefined(this.step != null ? this.step : undefined)}\"\n        tabindex=\"${ifDefined(this.tabindex != null ? this.tabindex : undefined)}\"\n        type=\"${ifDefined(this.type != null ? this.type : undefined)}\"\n        validator=\"${ifDefined(this.validator != null ? this.validator : undefined)}\"\n        value=\"${ifDefined(this.value != null ? this.value : undefined)}\"\n        @change=\"${(evt: Event) => this._onEvent(evt)}\"\n        @disabled-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @focused-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @invalid-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n        @value-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n      >\n        <slot name=\"suffix\" slot=\"suffix\"></slot>\n      </paper-textarea>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: Event) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n}\n","/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/paper-toggle-button/paper-toggle-button';\nimport { customElement, html, LitElement, property, TemplateResult } from 'lit-element';\nimport { ifDefined }                                                 from 'lit-html/directives/if-defined';\nimport { IFAtomElements }                                            from '../../interfaces';\n\n\n/**\n * The default button for SW lifedata applications\n *\n * @element ld-toggle-button\n *\n * @slot - Toggle Button label\n *\n * @prop {Boolean} active - If true, the toggle button is a toggle and is currently in the active state.\n * @prop {Boolean} disabled - If true, the user cannot interact with this element.\n * @prop {Boolean} focused - If true, the element currently has focus.\n *\n * @fires active-changed - Fired when the `active` property changes.\n * @fires disabled-changed - Fired when the `disabled` property changes.\n * @fires focused-changes - Fired when the `focused` property changes.\n * @fires transitionend - Fired when the animation finishes. This is useful if you want to wait until the ripple animation finishes to perform some action.\n *\n * @since 0.0.1\n */\n@customElement('ld-toggle-button')\nexport class LdToggle extends LitElement implements IFAtomElements {\n\n  @property({type: Boolean, reflect: true}) active: boolean | null | undefined                           = false;\n  @property({type: String}) ariaActiveAttribute: string                                                  = 'aria-pressed';\n  @property({type: Boolean, reflect: true, hasChanged: () => true}) disabled: boolean | null | undefined = false;\n  @property({type: Boolean}) checked: boolean | null | undefined                                         = false;\n  @property({type: Boolean, reflect: true}) focused: boolean | null | undefined                          = false;\n  @property({type: String}) name: string | null | undefined;\n  @property({type: Boolean}) noink: boolean                                                              = false;\n  @property({type: Boolean}) pointerDown: boolean                                                        = false;\n  @property({type: Boolean}) pressed: boolean | null | undefined                                         = false;\n  @property({type: Boolean}) required: boolean | null | undefined                                        = false;\n  @property({type: Boolean}) toggles: boolean | null | undefined                                         = false;\n  @property({type: Number}) tabindex: number | null;\n  @property({type: String}) validator: string | null | undefined;\n  @property({type: String, reflect: true, hasChanged: () => true}) value: string | null | undefined;\n  @property({type: String}) _internalId: string = `input-internal-id-${Math.random().toString(36).substr(2, 5)}`;\n\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <custom-style>\n        <style is=\"custom-style\">\n          paper-toggle-button[type='color'] {\n            display: inline-block;\n            width: 10%;\n            --paper-toggle-button-checked-bar-color: {\n              color: red;\n            };\n            --paper-input-container-underline-focus: {\n              display: none\n            };\n            --paper-input-container-underline-disabled: {\n              display: none\n            };\n          }\n\n          paper-toggle-button[part='ld-part-button-color-checked'] {\n            display: inline-block;\n            --paper-toggle-button-checked-bar-color: {\n              color: red;\n            };\n          }\n        </style>\n      </custom-style>\n      <paper-toggle-button\n              id=\"${this._internalId}\"\n              part=\"ld-part-toggle-button\"\n              ?active=\"${this.active}\"\n              ariaActiveAsttribute=\"${this.ariaActiveAttribute}\"\n              ?disabled=\"${this.disabled}\"\n              ?checked=\"${this.checked}\"\n              ?focused=\"${this.focused}\"\n              ?noink=\"${this.noink}\"\n              name=\"${ifDefined(this.name != null ? this.name : undefined)}\"\n              ?pointerDown=\"${this.pointerDown}\"\n              ?pressed=\"${this.pressed}\"\n              ?required=\"${this.required}\"\n              ?toggles=\"${this.toggles}\"\n              .value=\"${ifDefined(this.value != null ? this.value : undefined)}\"\n              validator=\"${ifDefined(this.validator != null ? this.validator : undefined)}\"\n              tabindex=\"${ifDefined(this.tabindex != null ? this.tabindex : undefined)}\"\n              @active-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n              @disabled-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n              @focused-changed=\"${(evt: Event) => this._onEvent(evt)}\"\n              @transitionend=\"${(evt: Event) => this._onEvent(evt)}\"\n              @value-changed=\"${(evt: Event) => this.__inputItemValueChanged(evt)}\"\n\n      >\n        <slot></slot>\n      </paper-toggle-button>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: Event) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputItemValueChanged(evt: Event) {\n    // @ts-ignore\n    this.value = evt.detail.value;\n    this._onEvent(evt);\n  }\n\n\n}\n","/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/paper-checkbox/paper-checkbox';\nimport { customElement, html, LitElement, property, TemplateResult } from 'lit-element';\nimport { ifDefined }                                                 from 'lit-html/directives/if-defined';\nimport { IFAtomElements }                                            from '../../interfaces';\n\n/**\n * The default input field for SW lifedata applications\n *\n * @element ld-checkbox\n *\n * @prop {Boolean} disabled\n * @prop {Boolean} focused\n * @prop {Boolean} invalid\n * @prop {Boolean} value\n *\n * @fires active-changed - Fired when the input changes due to user interaction.\n * @fires disabled-changed - Fired when the `disabled` property changes.\n * @fires focused-changes - Fired when the `focused` property changes.\n * @fires transitionend - Fired when the `invalid` property changes.\n * @fires value-changes - Fired when the `value` property changes.\n * @fires  changed - Fired when the checked state changes due to user interaction.\n * @fire checked-changed - Fired when the checked property changes.\n * @fire invalid-changed - Fired when the invalid property changes.\n * @fire iron-changed -  Fired when the checked state changes.\n * @since 0.0.1\n */\n@customElement('ld-checkbox')\nexport class LdCheckbox extends LitElement implements IFAtomElements {\n\n  @property({type: Boolean, reflect: true}) active: boolean | null | undefined                           = false;\n  @property({type: String}) ariaActiveAttribute: string                                                  = 'aria-pressed';\n  @property({type: Boolean, reflect: true, hasChanged: () => true}) disabled: boolean | null | undefined = false;\n  @property({type: Boolean}) checked: boolean | null | undefined                                         = false;\n  @property({type: Boolean, reflect: true}) focused: boolean | null | undefined                          = false;\n  @property({type: String}) name: string | null | undefined;\n  @property({type: Boolean}) noink: boolean                                                              = false;\n  @property({type: Boolean}) pointerDown: boolean                                                        = false;\n  @property({type: Boolean}) pressed: boolean | null | undefined                                         = false;\n  @property({type: Boolean}) required: boolean | null | undefined                                        = false;\n  @property({type: Boolean}) toggles: boolean | null | undefined                                         = false;\n  @property({type: Number}) tabindex: number | null;\n  @property({type: String}) validator: string | null | undefined;\n  @property({type: String, reflect: true, hasChanged: () => true}) value: string | null | undefined;\n  @property({type: String}) _internalId: string = `input-internal-id-${Math.random().toString(36).substr(2, 5)}`;\n\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    return html`\n      <custom-style>\n        <style is=\"custom-style\">\n          paper-checkbox[type='color'] {\n            display: inline-block; \n            width: 10%;\n          }\n        </style>\n      </custom-style>\n      <paper-checkbox \n        part=\"ld-part-checkbox\"\n        id=\"${this._internalId}\"\n        ?active=\"${this.active}\"\n        ariaActiveAsttribute=\"${this.ariaActiveAttribute}\"\n        ?disabled=\"${this.disabled}\"\n        ?checked=\"${this.checked}\"\n        ?focused=\"${this.focused}\"\n        ?noink=\"${this.noink}\"\n        name=\"${ifDefined(this.name != null ? this.name : undefined)}\"\n        ?pointerDown=\"${this.pointerDown}\"\n        ?pressed=\"${this.pressed}\"\n        ?required=\"${this.required}\"\n        ?toggles=\"${this.toggles}\"\n        .value=\"${ifDefined(this.value != null ? this.value : undefined)}\"\n        validator=\"${ifDefined(this.validator != null ? this.validator : undefined)}\"\n        tabindex=\"${ifDefined(this.tabindex != null ? this.tabindex : undefined)}\"\n        @active-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @checked-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @invalid-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @iron-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @disabled-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @focused-changed=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @transitionend=\"${(evt: CustomEvent) => this._onEvent(evt)}\"\n        @value-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt)}\"\n        >\n        <slot name=\"prefix\" slot=\"prefix\"></slot>\n        <slot name=\"suffix\" slot=\"suffix\"></slot>\n      </paper-checkbox >\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onEvent(evt: CustomEvent) {\n    // @ts-ignore\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputItemValueChanged(evt: CustomEvent) {\n    // @ts-ignore\n    this.value = evt.detail.value;\n    this._onEvent(evt);\n  }\n}\n","/* eslint-disable no-param-reassign, no-restricted-syntax, guard-for-in, no-console */\nimport { directive, PropertyPart, AttributePart } from 'lit-html';\n\nexport const live = directive((/** @type {unknown} */ value) => (\n  /** @type {PropertyPart | AttributePart} */ part,\n) => {\n  const { element, name, strings } = part.committer;\n\n  if (strings.length !== 2 || strings[0] !== '' || strings[1] !== '') {\n    throw new Error('live directive bindings must not contain any static values');\n  }\n\n  if (part.committer.parts.length > 1) {\n    throw new Error('live directive must be the only directive for an attribute or property');\n  }\n\n  if (part instanceof PropertyPart) {\n    if (element[name] !== value) {\n      part.setValue(value);\n    }\n    return;\n  }\n\n  if (part instanceof AttributePart) {\n    if (element.getAttribute(name) !== value) {\n      part.setValue(value);\n    }\n    return;\n  }\n\n  throw new Error('live directive can only be used on attributes or properties');\n});\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n// @ts-ignore\nimport { live }                     from '@open-wc/lit-helpers';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-button/paper-button';\nimport { PaperCheckboxElement }     from '@polymer/paper-checkbox';\nimport '@polymer/paper-checkbox/paper-checkbox';\nimport '@polymer/paper-dropdown-menu/paper-dropdown-menu';\nimport '@polymer/paper-input/paper-input';\nimport { PaperInputElement }        from '@polymer/paper-input/paper-input';\nimport '@polymer/paper-input/paper-textarea';\nimport { PaperTextareaElement }     from '@polymer/paper-input/paper-textarea';\nimport { PaperListboxElement }      from '@polymer/paper-listbox';\nimport '@polymer/paper-listbox/paper-listbox';\nimport { PaperToggleButtonElement } from '@polymer/paper-toggle-button';\nimport '@polymer/paper-toggle-button/paper-toggle-button';\n\nimport { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from 'lit-element';\nimport { ifDefined }                                                                 from 'lit-html/directives/if-defined';\n\nimport {\n  IFLdButton,\n  IFLdButtonList,\n  IFLdCheckbox,\n  IFLdCheckboxList,\n  IFLdDropdown,\n  IFLdDropdownListboxItem,\n  IFLdInput,\n  IFLdMultiSelect,\n  IFLdToggle,\n  IFMolecules\n} from '../../interfaces';\n\n/**\n * The default form molecule for SW lifedata applications\n *\n * @element ld-form\n *\n * @attr {Array<object>} fields - An array of objects to define the fields the form should contain\n *\n * @prop {Array<object>} results\n *\n * @see /demo/form.html\n * @since 0.0.1\n */\n@customElement('ld-form')\nexport class LdForm extends LitElement implements IFMolecules {\n\n  @property({type: Object, reflect: true, hasChanged: () => true}) fields: Array<object>  = [];\n  @property({type: Object, reflect: true, hasChanged: () => true}) results: Array<object> = [];\n  @property({type: Object}) __originalFields: string                                      = '';\n\n  // --------------------------------------------------------------------------------------\n  static get styles(): CSSResult {\n    return css`\n      :host {\n        display: block;\n      }\n\n      paper-button {\n        background-color: var(--ld-button-background-color);\n        color: var(--ld-button-color);\n      }\n\n      paper-input[type='color'] {\n        display: inline-block;\n        width: 10%;\n      }\n\n      paper-input[part='ld-part-input-color-result'] {\n        display: inline-block;\n        color: black;\n      }\n\n\n      div[part=\"ld-part-cbxlist\"] {\n        display: none;\n      }\n\n      iron-icon[part=\"ld-part-icon-more\"] {\n        display: none;\n      }\n\n      iron-icon[part=\"ld-part-icon-less\"] {\n        display: none;\n      }\n\n      div[part=\"ld-part-cbxlist\"][data-show] {\n        display: grid;\n        margin-left: 20px;\n        margin-top: 10px;\n      }\n\n      iron-icon[part=\"ld-part-icon-more\"][data-show] {\n        display: inline-grid;\n        fill: red;\n        left: 45%;\n      }\n\n      iron-icon[part=\"ld-part-icon-less\"][data-show] {\n        display: inline-grid;\n        fill: red;\n        left: 45%;\n      }\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  static __truncateFullName(item: IFLdDropdownListboxItem): string | undefined {\n    let name = (item.name != null) ? item.name : item.title;\n    if (name && name.length > 80) {\n      name = `${name.substr(0, 80)}\\u2026`;\n    }\n\n    return name;\n  }\n\n  // --------------------------------------------------------------------------------------\n  reset(resetItem?: any): void {\n\n    this.results.forEach((item: any) => {\n        let _element: PaperListboxElement | PaperInputElement | PaperTextareaElement | PaperToggleButtonElement | PaperCheckboxElement;\n        switch (resetItem ? resetItem.type : item.type) {\n          case 'dropdown':\n            _element          = <PaperListboxElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`)!.querySelector('paper-listbox');\n            _element.selected = this.__getFieldDefaultValue(resetItem ? resetItem.id : item.id);\n            break;\n          case 'input':\n          case 'file':\n            _element       = <PaperInputElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.value = this.__getFieldDefaultValue(resetItem ? resetItem.id : item.id);\n            break;\n          case 'textarea':\n            _element       = <PaperTextareaElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.value = this.__getFieldDefaultValue(item.id);\n            break;\n          case 'color':\n            _element       = <PaperInputElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.value = this.__getFieldDefaultValue(resetItem ? resetItem.id : item.id);\n            _element       = <PaperInputElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}-output`);\n            _element.value = this.__getFieldDefaultValue(resetItem ? resetItem.id : item.id);\n            break;\n          case 'toggle':\n            _element         = <PaperToggleButtonElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.checked = this.__getFieldDefaultCheck(resetItem ? resetItem.id : item.id);\n            _element.active  = this.__getFieldDefaultCheck(resetItem ? resetItem.id : item.id);\n            break;\n          case 'checkbox':\n            _element         = <PaperCheckboxElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.checked = this.__getFieldDefaultCheck(resetItem ? resetItem.id : item.id);\n            _element.active  = this.__getFieldDefaultCheck(resetItem ? resetItem.id : item.id);\n            break;\n          case 'multiselect':\n            _element          = <PaperListboxElement>this.shadowRoot!.querySelector(`#${resetItem ? resetItem.id : item.id}`);\n            _element.selected = this.__getFieldDefaultValue(resetItem ? resetItem.id : item.id);\n            break;\n          default:\n            break;\n        }\n        if (resetItem) {\n          this.__removeItem(resetItem);\n        } else {\n          this.results = [];\n        }\n      }\n    );\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated(): void {\n    this.__originalFields = JSON.stringify(this.fields);\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n\n    const formInputs: Array<TemplateResult> = [];\n    if (this.fields != null) {\n\n      this.fields.forEach((item: any) => {\n        if (!item.hidden) {\n\n          item.id = (item.id != null) ? item.id : `input-${Math.random().toString(36).substr(2, 5)}`;\n\n          switch (item.type) {\n            case 'input':\n              formInputs.push(this._createFieldTypeInput(item));\n              break;\n            case 'password':\n              formInputs.push(this._createFieldTypeInput(item, 'password'));\n              break;\n            case 'color':\n              formInputs.push(this._createFieldTypeInput(item, 'color'));\n              break;\n            case 'hidden':\n              formInputs.push(this._createFieldTypeHidden(item));\n              break;\n            case 'textarea':\n              formInputs.push(this._createFieldTypeTextarea(item));\n              break;\n            case 'dropdown':\n              formInputs.push(this._createFieldTypeDropdown(item));\n              break;\n            case 'file':\n              formInputs.push(this._createFieldTypeFile(item));\n              break;\n            case 'button':\n              formInputs.push(this._createFieldTypeButton(item));\n              break;\n            case 'buttonlist':\n              formInputs.push(this._createFieldTypeButtonList(item));\n              break;\n            case 'space':\n              formInputs.push(this._createSpacer());\n              break;\n            case 'subheadline':\n              formInputs.push(this._createSubHeadline(item));\n              break;\n            case 'toggle':\n              formInputs.push(this._createToggle(item));\n              break;\n            case 'checkbox':\n              formInputs.push(this._createCheckbox(item));\n              break;\n            case 'checkboxlist':\n              formInputs.push(this._createCheckboxList(item));\n              break;\n            case 'multiselect':\n              formInputs.push(this._createFieldTypeMultiSelect(item));\n              break;\n          }\n        }\n      });\n\n    }\n\n    return html`${formInputs}`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  getItems(this: any) {\n    const _items: Array<object> = [];\n    this.results.forEach((item: any) => {\n      _items[item.id] = this.shadowRoot.querySelector(`#${item.id}`);\n      if (item.type === 'dropdown') {\n        // @ts-ignore\n        _items[item.id].selectedData = item.selectedData;\n      }\n      if (item.type === 'multiselect') {\n        item.selectedData = [];\n        this.shadowRoot?.querySelector('paper-input-container[part=\"ld-part-multiselect\"]')?.querySelectorAll('paper-checkbox[checked]').forEach((checked: { id: string }) => {\n          item.selectedData.push({\n            value: true,\n            id: checked.id\n          });\n        });\n        // @ts-ignore\n        _items[item.id].selectedData = item.selectedData;\n      }\n    });\n\n    return _items;\n  }\n\n  /**\n   * according to https://dev.to/btopro/using-apply-syntax-in-litelement-for-now-31f9 we\n   * need to use a `custom-style` element in order to apply mixins to any custom elements\n   */\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeInput(item: IFLdInput, inputType: string = 'text'): TemplateResult {\n    return html`\n      <custom-style>\n        <style is=\"custom-style\">\n          paper-input[type='color'] {\n            --paper-input-container-underline: {\n              display: none\n            };\n            --paper-input-container-underline-focus: {\n              display: none\n            };\n            --paper-input-container-underline-disabled: {\n              display: none\n            };\n          }\n        </style>\n      </custom-style>\n      <paper-input\n              part=\"ld-part-input${inputType != 'text' ? '-' + inputType : ''} ${item.part}\"\n              id=\"${item.id}\"\n              label=\"${item.label}\"\n              ?disabled=\"${item.disabled}\"\n              ?autoValidate=\"${item.pattern != null}\"\n              pattern=\"${ifDefined(item.pattern != null ? item.pattern : undefined)}\"\n              value=\"${live(ifDefined(item.value != null ? item.value : ''))}\"\n              maxlength=\"${ifDefined(item.maxlength != null ? item.maxlength : undefined)}\"\n              type=\"${inputType}\"\n              ?readonly=\"${item.readonly}\"\n              ?invalid=\"${item.invalid}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              error-message=\"${ifDefined(item.errorMessage != null ? item.errorMessage : undefined)}\"\n              @value-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n        ${item.readonly ? html`\n          <iron-icon icon='block' slot=\"suffix\"></iron-icon>` : ''}\n\n\n      </paper-input>\n      ${item.clear ? html`\n        <iron-icon part=\"ld-part-clear\" icon='clear' id=\"${item.id}_clear\" slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleClearClick(evt, item)}\"></iron-icon>` : ''}\n      ${inputType === 'color' ? html`\n        <paper-input part=\"ld-part-input-color-result\" id=\"${item.id}-output\"\n                     value=\"${ifDefined(item.value != null ? item.value : '#000000')}\"\n                     pattern=\"${ifDefined(item.colorPattern != null ? item.colorPattern : '#([A-Fa-f0-9]{6})')}\"\n                     error-message=\"${ifDefined(item.colorErrorMessage != null ? item.colorErrorMessage : 'Format: #RRGGBB')}\"\n                     auto-validate\n                     @value-changed=\"${(evt: CustomEvent) => this.__inputColorValueChanged(evt, item)}\">\n        </paper-input>\n      ` : ''}\n\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeTextarea(item: IFLdInput): TemplateResult {\n    this.__subscribeItem(item);\n    return html`\n      <paper-textarea\n              part=\"ld-part-textarea\"\n              id=\"${item.id}\"\n              label=\"${item.label}\"\n              ?disabled=\"${item.disabled}\"\n              ?autoValidate=\"${item.pattern != null}\"\n              pattern=\"${ifDefined(item.pattern != null ? item.pattern : undefined)}\"\n              value=\"${ifDefined(item.value != null ? item.value : '')}\"\n              maxlength=\"${ifDefined(item.maxlength != null ? item.maxlength : undefined)}\"\n              ?readonly=\"${item.readonly}\"\n              ?spellcheck=\"${item.spellcheck}\"\n              rows=\"${ifDefined(item.rows != null ? item.rows : undefined)}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              error-message=\"${ifDefined(item.errorMessage != null ? item.errorMessage : undefined)}\"\n              @value-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n        ${item.readonly ? html`\n          <iron-icon icon='block' slot=\"suffix\"></iron-icon>` : ''}\n      </paper-textarea>\n      ${item.clear ? html`\n        <iron-icon part=\"ld-part-clear\" id=\"${item.id}_clear\" icon='clear' slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleClearClick(evt, item)}\"></iron-icon>` : ''}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeHidden(item: IFLdInput): TemplateResult {\n    this.__subscribeItem(item);\n    return html`\n      <paper-input\n              id=\"${item.id}\"\n              style=\"display: none;\"\n              type=\"hidden\"\n              value=\"${ifDefined(item.value != null ? item.value : '')}\"\n              @value-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n      </paper-input>\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeDropdown(item: IFLdDropdown): TemplateResult {\n    return html`\n      <paper-dropdown-menu\n              part=\"ld-part-dropdown ${item.part}\"\n              id='${item.id}'\n              label='${item.label}'\n              error-message='${item.errorMessage != null ? item.errorMessage : ''}'\n              name=\"${ifDefined(item.name != null ? item.name : undefined)}\"\n              ?no-label-float=\"${item.noLabelFloat}\"\n              ?invalid=\"${item.invalid}\"\n              ?readonly=\"${item.readonly}\"\n              ?required=\"${item.required}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              @selected-item-changed=\"${(evt: CustomEvent) => this.__dropdownItemValueChanged(evt, item)}\">\n        <paper-listbox\n                part='ld-part-listbox'\n                label='${item.listBoxLabel}'\n                slot='dropdown-content'\n                selected='${item.selected != null ? item.selected : ''}'\n                class='${item.class}'\n                attr-for-selected='selectedValue'>\n          ${this.__loadListBoxItemValue(item.value)}\n        </paper-listbox>\n      </paper-dropdown-menu>\n      ${item.clear ? html`\n        <iron-icon part=\"ld-part-clear\" id=\"${item.id}_clear\" icon='clear' slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleClearClick(evt, item)}\"></iron-icon>` : ''}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeMultiSelect(item: IFLdMultiSelect): TemplateResult {\n    return html`\n      <paper-input-container\n              part='ld-part-multiselect'\n              id='${item.id}'\n              ?invalid=\"${item.invalid}\">\n        <label\n                slot=\"label\"\n                part=\"ld-part-label\">\n          ${item.label}\n        </label>\n        <iron-input slot=\"input\">\n        </iron-input>\n\n        ${this.__loadMultiListItemValue(item)}\n        <paper-input-error\n                part=\"ld-part-input-error\"\n                slot=\"input\"\n                ?invalid=\"${item.invalid}\">\n          ${item.errorMessage}\n        </paper-input-error>\n        ${item.clear ? html`\n          <iron-icon part=\"ld-part-clear\" id=\"${item.id}_clear\" icon='clear' slot=\"suffix\"\n                     @click=\"${(evt: Event) => this.__handleClearClick(evt, item)}\"></iron-icon>` : ''}\n      </paper-input-container>\n    `;\n  }\n\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeFile(item: IFLdInput): TemplateResult {\n    return html`\n      <paper-input\n              part=\"ld-part-file\"\n              id=\"${item.id}\"\n              type=\"file\"\n              label=\"${item.label}\"\n              accept=\"${item.accept || '*'}\"\n              ?disabled=\"${item.disabled}\"\n              value=\"${live(ifDefined(item.value != null ? item.value : ''))}\"\n              ?readonly=\"${item.readonly}\"\n              ?invalid=\"${item.invalid}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              error-message=\"${ifDefined(item.errorMessage != null ? item.errorMessage : undefined)}\"\n              @value-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n        ${item.readonly ? html`\n          <iron-icon icon='block' slot=\"suffix\"></iron-icon>` : ''}\n      </paper-input>\n      ${item.clear ? html`\n        <iron-icon part=\"ld-part-clear\" id=\"${item.id}_clear\" icon='clear' slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleClearClick(evt, item)}\"></iron-icon>` : ''}\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeButton(item: IFLdButton): TemplateResult {\n    this.__subscribeItem(item);\n    item.id = (item.id != null) ? item.id : `input-${Math.random().toString(36).substr(2, 5)}`;\n    return html`\n      <paper-button\n              id=\"${item.id}\"\n              part=\"ld-part-button\"\n              ?disabled=\"${item.disabled}\"\n              ?raised=\"${item.raised}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              @click=\"${(evt: Event) => this.__handleBtnClick(evt, item)}\">\n        ${item.label}\n      </paper-button>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createFieldTypeButtonList(item: IFLdButtonList): TemplateResult {\n    const _buttons: any = [];\n    item.buttons.forEach(btn => {\n      _buttons.push(html`${this._createFieldTypeButton(btn)}`);\n    });\n\n    return html`\n      <div part='ld-part-btnlist' class='sk-btnlist' id=\"${item.id}\">${_buttons}</div>`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createToggle(item: IFLdToggle): TemplateResult {\n    return html`\n      <paper-toggle-button\n              id=\"${item.id}\"\n              part=\"ld-part-toggle-button\"\n              ?disabled=\"${item.disabled}\"\n              ?raised=\"${item.raised}\"\n              value=\"${live(ifDefined(item.value != null ? item.value : ''))}\"\n              ?checked=\"${item.checked}\"\n              ?active=\"${item.active}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              @checked-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n        ${item.label}\n      </paper-toggle-button>\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createCheckbox(item: IFLdCheckbox): TemplateResult {\n    return html`\n      <paper-checkbox\n              id=\"${item.id}\"\n              part=\"ld-part-checkbox\"\n              ?disabled=\"${item.disabled}\"\n              ?raised=\"${item.raised}\"\n              value=\"${live(ifDefined(item.value != null ? item.value : ''))}\"\n              ?checked=\"${item.checked}\"\n              ?active=\"${item.active}\"\n              tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n              @checked-changed=\"${(evt: CustomEvent) => this.__inputItemValueChanged(evt, item)}\">\n        ${item.label}\n      </paper-checkbox>\n      ${item.icon ? html`\n        <iron-icon part=\"ld-part-icon-more\" id=\"${item.id}_icon\" data-show icon='expand-more' slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleOpenListClick(evt, item)}\"></iron-icon>\n        <iron-icon part=\"ld-part-icon-less\" id=\"${item.id}_icon\" icon='expand-less' slot=\"suffix\"\n                   @click=\"${(evt: Event) => this.__handleOpenListClick(evt, item)}\"></iron-icon>\n      ` : ''}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createCheckboxList(item: IFLdCheckboxList): TemplateResult {\n    const _checkbox: any = [];\n    item.checkbox.forEach(cbx => {\n      _checkbox.push(html`${this._createCheckbox(cbx)}`);\n    });\n\n    return html`\n      <div part='ld-part-cbxlist' class='sk-cbxlist' id=\"${item.id}\">${_checkbox}</div>`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createSpacer(): TemplateResult {\n    return html`\n      <hr/>`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _createSubHeadline(item: IFLdInput): TemplateResult {\n    return html`<h3 part='ld-part-subheadline'>${item.label}</h3>`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __getFieldDefaultValue(fieldId: string): string {\n    const _originalFields: Array<object> = JSON.parse(this.__originalFields);\n    const _field                         = _originalFields.filter((field: any) => field.id === fieldId)[0];\n\n    let _defaultValue: string = '';\n    if (_field != null) {\n      // @ts-ignore\n      _defaultValue = _field.value != null ? _field.value : '';\n\n      // @ts-ignore\n      if (_field.type === 'color' && _defaultValue === '') {\n        _defaultValue = '#000000';\n      }\n    }\n\n    return _defaultValue;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __getFieldDefaultCheck(fieldId: string): boolean {\n    const _originalFields: Array<object> = JSON.parse(this.__originalFields);\n    const _field                         = _originalFields.filter((field: any) => field.id === fieldId)[0];\n\n    let _defaultValue: boolean = false;\n    if (_field != null) {\n      // @ts-ignore\n      _defaultValue = _field.value != null ? _field.value : false;\n\n    }\n\n    return _defaultValue;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __handleBtnClick(evt: Event, btn: IFLdButton) {\n    if (btn.event) {\n      this.dispatchEvent(new CustomEvent(btn.event));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __loadListBoxItemValue(value: IFLdDropdownListboxItem[]) {\n    const items: Array<TemplateResult> = [];\n    if (value != null) {\n      value.forEach((listBoxItem: IFLdDropdownListboxItem) => {\n        listBoxItem.id = (listBoxItem.id != null) ? listBoxItem.id : `input-${Math.random().toString(36).substr(2, 5)}`;\n        items.push(html`\n          <paper-item part='ld-part-listbox-item' selectedValue=\"${listBoxItem.id}\">\n            ${LdForm.__truncateFullName(listBoxItem)}\n          </paper-item>`);\n      });\n    }\n    return items;\n  }\n\n\n  // --------------------------------------------------------------------------------------\n  private __loadMultiListItemValue(item: IFLdMultiSelect) {\n    const items: Array<TemplateResult> = [];\n    if (item.checkbox != null) {\n      item.checkbox.forEach((listBoxItem: IFLdDropdownListboxItem) => {\n        listBoxItem.checked = false;\n        listBoxItem.active = false;\n\n        listBoxItem.id = (listBoxItem.id != null) ? listBoxItem.id : `input-${Math.random().toString(36).substr(2, 5)}`;\n        if (item.selectedData != null && item.selectedData.length !== 0) {\n          item.selectedData.forEach((checkboxValue: IFLdMultiSelect) => {\n            if (checkboxValue.id === listBoxItem.id) {\n              listBoxItem.checked = true;\n              listBoxItem.active = true;\n            }\n          });\n        }\n        items.push(html`\n          <paper-checkbox\n                  slot=\"input\"\n                  id=\"${listBoxItem.id}\"\n                  part=\"ld-part-checkbox\"\n                  ?disabled=\"${item.disabled}\"\n                  ?raised=\"${item.raised}\"\n                  value=\"${live(ifDefined(item.value != null ? item.value : ''))}\"\n                  ?checked=\"${listBoxItem.checked}\"\n                  ?active=\"${listBoxItem.active}\"\n                  tabindex=\"${ifDefined(item.tabindex != null ? item.tabindex : undefined)}\"\n                  @checked-changed=\"${(evt: CustomEvent) => this.__multiSelectItemValueChanged(evt, item, listBoxItem)}\">\n            ${LdForm.__truncateFullName(listBoxItem)}\n          </paper-checkbox>\n        `);\n      });\n    }\n    return items;\n  }\n\n\n  // --------------------------------------------------------------------------------------\n  private __subscribeItem(item: IFLdButton | IFLdInput | IFLdDropdown | IFLdToggle | IFLdCheckbox) {\n\n    // @ts-ignore\n    this.results = this.results.filter(existingItem => existingItem.id !== item.id);\n    this.results.push(item);\n  }\n\n  private __removeItem(item: IFLdButton | IFLdInput | IFLdDropdown | IFLdToggle | IFLdCheckbox) {\n    // @ts-ignore\n    this.results = this.results.filter(existingItem => existingItem.id !== item.id);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputItemValueChanged(evt: CustomEvent, item: IFLdInput | IFLdToggle | IFLdCheckbox | IFLdMultiSelect) {\n    item.value = evt.detail.value;\n    this.__subscribeItem(item);\n    if (item.event) {\n      this.dispatchEvent(new CustomEvent(item.event, {\n        detail: {\n          value: item\n        }\n      }));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __inputColorValueChanged(evt: CustomEvent, item: IFLdInput) {\n    if (evt.detail.value.length === 7) {\n      item.value        = evt.detail.value;\n      // @ts-ignore\n      const _parentItem = this.shadowRoot?.querySelector(`#${item.id}`);\n      // @ts-ignore\n      _parentItem.value = item.value;\n    }\n    return;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __dropdownItemValueChanged(evt: CustomEvent, item: IFLdDropdown) {\n    if (evt.detail && evt.detail.value && evt.detail.value.attributes) {\n      item.selectedData = {\n        value: evt.detail.value.attributes.selectedValue.value,\n        label: evt.detail.value.textContent\n      };\n      this.__subscribeItem(item);\n      if (item.event) {\n        this.dispatchEvent(new CustomEvent(item.event, {\n          detail: {\n            value: item\n          }\n        }));\n      }\n    }\n  }\n\n\n  // --------------------------------------------------------------------------------------\n  private __multiSelectItemValueChanged(evt: CustomEvent, item: IFLdMultiSelect, listBox: IFLdDropdownListboxItem) {\n\n    if (evt.detail) {\n      item.selectedData = [];\n      this.shadowRoot?.querySelector('paper-input-container[part=\"ld-part-multiselect\"]')?.querySelectorAll('paper-checkbox[checked]').forEach(checked => {\n        item.selectedData.push({\n          value: true,\n          id: checked.id\n        });\n      });\n\n      this.__subscribeItem(item);\n      if (item.event) {\n        this.dispatchEvent(new CustomEvent(item.event, {\n          detail: {\n            value: item\n          }\n        }));\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __handleClearClick(evt: Event, btn: IFLdDropdown | IFLdInput | IFLdCheckbox) {\n    this.reset(btn);\n\n    if (btn.event) {\n      this.dispatchEvent(new CustomEvent(`icon-${btn.event}`, {\n        detail: {\n          value: btn\n        }\n      }));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private __handleOpenListClick(evt: Event, btn: IFLdDropdown | IFLdInput | IFLdCheckbox) {\n    if (btn.event) {\n      this.dispatchEvent(new CustomEvent('openList', {\n        detail: {\n          id: btn.id\n        }\n      }));\n    }\n  }\n\n}\n","/**\n * marked v4.3.0 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction getDefaults() {\n  return {\n    async: false,\n    baseUrl: null,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    headerIds: true,\n    headerPrefix: '',\n    highlight: null,\n    hooks: null,\n    langPrefix: 'language-',\n    mangle: true,\n    pedantic: false,\n    renderer: null,\n    sanitize: false,\n    sanitizer: null,\n    silent: false,\n    smartypants: false,\n    tokenizer: null,\n    walkTokens: null,\n    xhtml: false\n  };\n}\n\nlet defaults = getDefaults();\n\nfunction changeDefaults(newDefaults) {\n  defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n  if (encode) {\n    if (escapeTest.test(html)) {\n      return html.replace(escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (escapeTestNoEncode.test(html)) {\n      return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n\n  return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n  // explicitly match decimal, hex, and named HTML entities\n  return html.replace(unescapeTest, (_, n) => {\n    n = n.toLowerCase();\n    if (n === 'colon') return ':';\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x'\n        ? String.fromCharCode(parseInt(n.substring(2), 16))\n        : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n  regex = typeof regex === 'string' ? regex : regex.source;\n  opt = opt || '';\n  const obj = {\n    replace: (name, val) => {\n      val = val.source || val;\n      val = val.replace(caret, '$1');\n      regex = regex.replace(name, val);\n      return obj;\n    },\n    getRegex: () => {\n      return new RegExp(regex, opt);\n    }\n  };\n  return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n  if (sanitize) {\n    let prot;\n    try {\n      prot = decodeURIComponent(unescape(href))\n        .replace(nonWordAndColonTest, '')\n        .toLowerCase();\n    } catch (e) {\n      return null;\n    }\n    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n      return null;\n    }\n  }\n  if (base && !originIndependentUrl.test(href)) {\n    href = resolveUrl(base, href);\n  }\n  try {\n    href = encodeURI(href).replace(/%25/g, '%');\n  } catch (e) {\n    return null;\n  }\n  return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n  if (!baseUrls[' ' + base]) {\n    // we can ignore everything in base after the last slash of its path component,\n    // but we might need to add _that_\n    // https://tools.ietf.org/html/rfc3986#section-3\n    if (justDomain.test(base)) {\n      baseUrls[' ' + base] = base + '/';\n    } else {\n      baseUrls[' ' + base] = rtrim(base, '/', true);\n    }\n  }\n  base = baseUrls[' ' + base];\n  const relativeBase = base.indexOf(':') === -1;\n\n  if (href.substring(0, 2) === '//') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(protocol, '$1') + href;\n  } else if (href.charAt(0) === '/') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(domain, '$1') + href;\n  } else {\n    return base + href;\n  }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction splitCells(tableRow, count) {\n  // ensure that every cell-delimiting pipe has a space\n  // before it to distinguish it from an escaped pipe\n  const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n      let escaped = false,\n        curr = offset;\n      while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n      if (escaped) {\n        // odd number of slashes means | is escaped\n        // so we leave it alone\n        return '|';\n      } else {\n        // add space before unescaped |\n        return ' |';\n      }\n    }),\n    cells = row.split(/ \\|/);\n  let i = 0;\n\n  // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n  if (!cells[0].trim()) { cells.shift(); }\n  if (cells.length > 0 && !cells[cells.length - 1].trim()) { cells.pop(); }\n\n  if (cells.length > count) {\n    cells.splice(count);\n  } else {\n    while (cells.length < count) cells.push('');\n  }\n\n  for (; i < cells.length; i++) {\n    // leading or trailing whitespace is ignored per the gfm spec\n    cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n  }\n  return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n  const l = str.length;\n  if (l === 0) {\n    return '';\n  }\n\n  // Length of suffix matching the invert condition.\n  let suffLen = 0;\n\n  // Step left until we fail to match the invert condition.\n  while (suffLen < l) {\n    const currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n\n  return str.slice(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n  const l = str.length;\n  let level = 0,\n    i = 0;\n  for (; i < l; i++) {\n    if (str[i] === '\\\\') {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\nfunction checkSanitizeDeprecation(opt) {\n  if (opt && opt.sanitize && !opt.silent) {\n    console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n  }\n}\n\n// copied from https://stackoverflow.com/a/5450113/806777\n/**\n * @param {string} pattern\n * @param {number} count\n */\nfunction repeatString(pattern, count) {\n  if (count < 1) {\n    return '';\n  }\n  let result = '';\n  while (count > 1) {\n    if (count & 1) {\n      result += pattern;\n    }\n    count >>= 1;\n    pattern += pattern;\n  }\n  return result + pattern;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n  const href = link.href;\n  const title = link.title ? escape(link.title) : null;\n  const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n  if (cap[0].charAt(0) !== '!') {\n    lexer.state.inLink = true;\n    const token = {\n      type: 'link',\n      raw,\n      href,\n      title,\n      text,\n      tokens: lexer.inlineTokens(text)\n    };\n    lexer.state.inLink = false;\n    return token;\n  }\n  return {\n    type: 'image',\n    raw,\n    href,\n    title,\n    text: escape(text)\n  };\n}\n\nfunction indentCodeCompensation(raw, text) {\n  const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n  if (matchIndentToCode === null) {\n    return text;\n  }\n\n  const indentToCode = matchIndentToCode[1];\n\n  return text\n    .split('\\n')\n    .map(node => {\n      const matchIndentInNode = node.match(/^\\s+/);\n      if (matchIndentInNode === null) {\n        return node;\n      }\n\n      const [indentInNode] = matchIndentInNode;\n\n      if (indentInNode.length >= indentToCode.length) {\n        return node.slice(indentToCode.length);\n      }\n\n      return node;\n    })\n    .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nclass Tokenizer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  space(src) {\n    const cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: 'space',\n        raw: cap[0]\n      };\n    }\n  }\n\n  code(src) {\n    const cap = this.rules.block.code.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ {1,4}/gm, '');\n      return {\n        type: 'code',\n        raw: cap[0],\n        codeBlockStyle: 'indented',\n        text: !this.options.pedantic\n          ? rtrim(text, '\\n')\n          : text\n      };\n    }\n  }\n\n  fences(src) {\n    const cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      const raw = cap[0];\n      const text = indentCodeCompensation(raw, cap[3] || '');\n\n      return {\n        type: 'code',\n        raw,\n        lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n        text\n      };\n    }\n  }\n\n  heading(src) {\n    const cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      let text = cap[2].trim();\n\n      // remove trailing #s\n      if (/#$/.test(text)) {\n        const trimmed = rtrim(text, '#');\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || / $/.test(trimmed)) {\n          // CommonMark requires space before trailing #s\n          text = trimmed.trim();\n        }\n      }\n\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[1].length,\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  hr(src) {\n    const cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: 'hr',\n        raw: cap[0]\n      };\n    }\n  }\n\n  blockquote(src) {\n    const cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      const text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n      const top = this.lexer.state.top;\n      this.lexer.state.top = true;\n      const tokens = this.lexer.blockTokens(text);\n      this.lexer.state.top = top;\n      return {\n        type: 'blockquote',\n        raw: cap[0],\n        tokens,\n        text\n      };\n    }\n  }\n\n  list(src) {\n    let cap = this.rules.block.list.exec(src);\n    if (cap) {\n      let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,\n        line, nextLine, rawLine, itemContents, endEarly;\n\n      let bull = cap[1].trim();\n      const isordered = bull.length > 1;\n\n      const list = {\n        type: 'list',\n        raw: '',\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : '',\n        loose: false,\n        items: []\n      };\n\n      bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n      if (this.options.pedantic) {\n        bull = isordered ? bull : '[*+-]';\n      }\n\n      // Get next list item\n      const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n\n      // Check if current bullet point can start a new List Item\n      while (src) {\n        endEarly = false;\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n\n        if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n          break;\n        }\n\n        raw = cap[0];\n        src = src.substring(raw.length);\n\n        line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n        nextLine = src.split('\\n', 1)[0];\n\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimLeft();\n        } else {\n          indent = cap[2].search(/[^ ]/); // Find first non-space char\n          indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n\n        blankLine = false;\n\n        if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n          raw += nextLine + '\\n';\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n\n        if (!endEarly) {\n          const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n          const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n          const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n          const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n\n          // Check if following lines should be included in List Item\n          while (src) {\n            rawLine = src.split('\\n', 1)[0];\n            nextLine = rawLine;\n\n            // Re-align to follow commonmark nesting rules\n            if (this.options.pedantic) {\n              nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n            }\n\n            // End list item if found code fences\n            if (fencesBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new heading\n            if (headingBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new bullet\n            if (nextBulletRegex.test(nextLine)) {\n              break;\n            }\n\n            // Horizontal rule found\n            if (hrRegex.test(src)) {\n              break;\n            }\n\n            if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n              itemContents += '\\n' + nextLine.slice(indent);\n            } else {\n              // not enough indentation\n              if (blankLine) {\n                break;\n              }\n\n              // paragraph continuation unless last line was a different block level element\n              if (line.search(/[^ ]/) >= 4) { // indented code block\n                break;\n              }\n              if (fencesBeginRegex.test(line)) {\n                break;\n              }\n              if (headingBeginRegex.test(line)) {\n                break;\n              }\n              if (hrRegex.test(line)) {\n                break;\n              }\n\n              itemContents += '\\n' + nextLine;\n            }\n\n            if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n              blankLine = true;\n            }\n\n            raw += rawLine + '\\n';\n            src = src.substring(rawLine.length + 1);\n            line = nextLine.slice(indent);\n          }\n        }\n\n        if (!list.loose) {\n          // If the previous item ended with a blank line, the list is loose\n          if (endsWithBlankLine) {\n            list.loose = true;\n          } else if (/\\n *\\n *$/.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n\n        // Check for task list items\n        if (this.options.gfm) {\n          istask = /^\\[[ xX]\\] /.exec(itemContents);\n          if (istask) {\n            ischecked = istask[0] !== '[ ] ';\n            itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n          }\n        }\n\n        list.items.push({\n          type: 'list_item',\n          raw,\n          task: !!istask,\n          checked: ischecked,\n          loose: false,\n          text: itemContents\n        });\n\n        list.raw += raw;\n      }\n\n      // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n      list.items[list.items.length - 1].raw = raw.trimRight();\n      list.items[list.items.length - 1].text = itemContents.trimRight();\n      list.raw = list.raw.trimRight();\n\n      const l = list.items.length;\n\n      // Item child tokens handled here at end because we needed to have the final item to trim it first\n      for (i = 0; i < l; i++) {\n        this.lexer.state.top = false;\n        list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n\n        if (!list.loose) {\n          // Check if list should be loose\n          const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n          const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n\n          list.loose = hasMultipleLineBreaks;\n        }\n      }\n\n      // Set all items to loose if list is loose\n      if (list.loose) {\n        for (i = 0; i < l; i++) {\n          list.items[i].loose = true;\n        }\n      }\n\n      return list;\n    }\n  }\n\n  html(src) {\n    const cap = this.rules.block.html.exec(src);\n    if (cap) {\n      const token = {\n        type: 'html',\n        raw: cap[0],\n        pre: !this.options.sanitizer\n          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n        text: cap[0]\n      };\n      if (this.options.sanitize) {\n        const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n        token.type = 'paragraph';\n        token.text = text;\n        token.tokens = this.lexer.inline(text);\n      }\n      return token;\n    }\n  }\n\n  def(src) {\n    const cap = this.rules.block.def.exec(src);\n    if (cap) {\n      const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n      const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n      const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n      return {\n        type: 'def',\n        tag,\n        raw: cap[0],\n        href,\n        title\n      };\n    }\n  }\n\n  table(src) {\n    const cap = this.rules.block.table.exec(src);\n    if (cap) {\n      const item = {\n        type: 'table',\n        header: splitCells(cap[1]).map(c => { return { text: c }; }),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n      };\n\n      if (item.header.length === item.align.length) {\n        item.raw = cap[0];\n\n        let l = item.align.length;\n        let i, j, k, row;\n        for (i = 0; i < l; i++) {\n          if (/^ *-+: *$/.test(item.align[i])) {\n            item.align[i] = 'right';\n          } else if (/^ *:-+: *$/.test(item.align[i])) {\n            item.align[i] = 'center';\n          } else if (/^ *:-+ *$/.test(item.align[i])) {\n            item.align[i] = 'left';\n          } else {\n            item.align[i] = null;\n          }\n        }\n\n        l = item.rows.length;\n        for (i = 0; i < l; i++) {\n          item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });\n        }\n\n        // parse child tokens inside headers and cells\n\n        // header child tokens\n        l = item.header.length;\n        for (j = 0; j < l; j++) {\n          item.header[j].tokens = this.lexer.inline(item.header[j].text);\n        }\n\n        // cell child tokens\n        l = item.rows.length;\n        for (j = 0; j < l; j++) {\n          row = item.rows[j];\n          for (k = 0; k < row.length; k++) {\n            row[k].tokens = this.lexer.inline(row[k].text);\n          }\n        }\n\n        return item;\n      }\n    }\n  }\n\n  lheading(src) {\n    const cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[2].charAt(0) === '=' ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1])\n      };\n    }\n  }\n\n  paragraph(src) {\n    const cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n        ? cap[1].slice(0, -1)\n        : cap[1];\n      return {\n        type: 'paragraph',\n        raw: cap[0],\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n\n  text(src) {\n    const cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0])\n      };\n    }\n  }\n\n  escape(src) {\n    const cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: 'escape',\n        raw: cap[0],\n        text: escape(cap[1])\n      };\n    }\n  }\n\n  tag(src) {\n    const cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n\n      return {\n        type: this.options.sanitize\n          ? 'text'\n          : 'html',\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        text: this.options.sanitize\n          ? (this.options.sanitizer\n            ? this.options.sanitizer(cap[0])\n            : escape(cap[0]))\n          : cap[0]\n      };\n    }\n  }\n\n  link(src) {\n    const cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      const trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n        // commonmark requires matching angle brackets\n        if (!(/>$/.test(trimmedUrl))) {\n          return;\n        }\n\n        // ending angle bracket cannot be escaped\n        const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        // find closing parenthesis\n        const lastParenIndex = findClosingBracket(cap[2], '()');\n        if (lastParenIndex > -1) {\n          const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n          const linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = '';\n        }\n      }\n      let href = cap[2];\n      let title = '';\n      if (this.options.pedantic) {\n        // split pedantic href and title\n        const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n        if (link) {\n          href = link[1];\n          title = link[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : '';\n      }\n\n      href = href.trim();\n      if (/^</.test(href)) {\n        if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n          // pedantic allows starting angle bracket without ending angle bracket\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n        title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n      }, cap[0], this.lexer);\n    }\n  }\n\n  reflink(src, links) {\n    let cap;\n    if ((cap = this.rules.inline.reflink.exec(src))\n        || (cap = this.rules.inline.nolink.exec(src))) {\n      let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = links[link.toLowerCase()];\n      if (!link) {\n        const text = cap[0].charAt(0);\n        return {\n          type: 'text',\n          raw: text,\n          text\n        };\n      }\n      return outputLink(cap, link, cap[0], this.lexer);\n    }\n  }\n\n  emStrong(src, maskedSrc, prevChar = '') {\n    let match = this.rules.inline.emStrong.lDelim.exec(src);\n    if (!match) return;\n\n    // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n    if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u)) return;\n\n    const nextChar = match[1] || match[2] || '';\n\n    if (!nextChar || (nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {\n      const lLength = match[0].length - 1;\n      let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n      const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src (move to lexer?)\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n        if (!rDelim) continue; // skip single * in __abc*abc__\n\n        rLength = rDelim.length;\n\n        if (match[3] || match[4]) { // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) { // either Left or Right Delim\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue; // CommonMark Emphasis Rules 9-10\n          }\n        }\n\n        delimTotal -= rLength;\n\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters. *a*** -> *a*\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n\n        const raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);\n\n        // Create `em` if smallest delimiter has odd char count. *a***\n        if (Math.min(lLength, rLength) % 2) {\n          const text = raw.slice(1, -1);\n          return {\n            type: 'em',\n            raw,\n            text,\n            tokens: this.lexer.inlineTokens(text)\n          };\n        }\n\n        // Create 'strong' if smallest delimiter has even char count. **a***\n        const text = raw.slice(2, -2);\n        return {\n          type: 'strong',\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text)\n        };\n      }\n    }\n  }\n\n  codespan(src) {\n    const cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      let text = cap[2].replace(/\\n/g, ' ');\n      const hasNonSpaceChars = /[^ ]/.test(text);\n      const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      text = escape(text, true);\n      return {\n        type: 'codespan',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n\n  br(src) {\n    const cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: 'br',\n        raw: cap[0]\n      };\n    }\n  }\n\n  del(src) {\n    const cap = this.rules.inline.del.exec(src);\n    if (cap) {\n      return {\n        type: 'del',\n        raw: cap[0],\n        text: cap[2],\n        tokens: this.lexer.inlineTokens(cap[2])\n      };\n    }\n  }\n\n  autolink(src, mangle) {\n    const cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n        href = 'mailto:' + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  url(src, mangle) {\n    let cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      let text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n        href = 'mailto:' + text;\n      } else {\n        // do extended autolink path validation\n        let prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n        } while (prevCapZero !== cap[0]);\n        text = escape(cap[0]);\n        if (cap[1] === 'www.') {\n          href = 'http://' + cap[0];\n        } else {\n          href = cap[0];\n        }\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: 'text',\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n\n  inlineText(src, smartypants) {\n    const cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      let text;\n      if (this.lexer.state.inRawBlock) {\n        text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];\n      } else {\n        text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n      }\n      return {\n        type: 'text',\n        raw: cap[0],\n        text\n      };\n    }\n  }\n}\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n  newline: /^(?: *(?:\\n|$))+/,\n  code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n  fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n  hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n  heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n  blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n  list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n  html: '^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n    + ')',\n  def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n  table: noopTest,\n  lheading: /^((?:.|\\n(?!\\n))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  // regex template, placeholders will be replaced according to different paragraph\n  // interruption rules of commonmark and the original markdown spec:\n  _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n  text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n  .replace('label', block._label)\n  .replace('title', block._title)\n  .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n  .replace('bull', block.bullet)\n  .getRegex();\n\nblock.list = edit(block.list)\n  .replace(/bull/g, block.bullet)\n  .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n  .replace('def', '\\\\n+(?=' + block.def.source + ')')\n  .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n  + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n  + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n  .replace('comment', block._comment)\n  .replace('tag', block._tag)\n  .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n  .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('|table', '')\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n  .replace('paragraph', block.paragraph)\n  .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = { ...block };\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = {\n  ...block.normal,\n  table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n    + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n};\n\nblock.gfm.table = edit(block.gfm.table)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('blockquote', ' {0,3}>')\n  .replace('code', ' {4}[^\\\\n]')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n  .getRegex();\n\nblock.gfm.paragraph = edit(block._paragraph)\n  .replace('hr', block.hr)\n  .replace('heading', ' {0,3}#{1,6} ')\n  .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n  .replace('table', block.gfm.table) // interrupt paragraphs with table\n  .replace('blockquote', ' {0,3}>')\n  .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n  .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n  .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n  .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = {\n  ...block.normal,\n  html: edit(\n    '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n    + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n    + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n    .replace('comment', block._comment)\n    .replace(/tag/g, '(?!(?:'\n      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n      + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n    .getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest, // fences not supported\n  lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  paragraph: edit(block.normal._paragraph)\n    .replace('hr', block.hr)\n    .replace('heading', ' *#{1,6} *[^\\n]')\n    .replace('lheading', block.lheading)\n    .replace('blockquote', ' {0,3}>')\n    .replace('|fences', '')\n    .replace('|list', '')\n    .replace('|html', '')\n    .getRegex()\n};\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n  escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n  autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n  url: noopTest,\n  tag: '^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>', // CDATA section\n  link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n  reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n  nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n  reflinkSearch: 'reflink|nolink(?!\\\\()',\n  emStrong: {\n    lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n    //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.\n    //          () Skip orphan inside strong                                      () Consume to delim     (1) #***                (2) a***#, a***                             (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a\n    rDelimAst: /^(?:[^_*\\\\]|\\\\.)*?\\_\\_(?:[^_*\\\\]|\\\\.)*?\\*(?:[^_*\\\\]|\\\\.)*?(?=\\_\\_)|(?:[^*\\\\]|\\\\.)+(?=[^*])|[punct_](\\*+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[^punct*_\\s])/,\n    rDelimUnd: /^(?:[^_*\\\\]|\\\\.)*?\\*\\*(?:[^_*\\\\]|\\\\.)*?\\_(?:[^_*\\\\]|\\\\.)*?(?=\\*\\*)|(?:[^_\\\\]|\\\\.)+(?=[^_])|[punct*](\\_+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n  },\n  code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n  br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n  del: noopTest,\n  text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n  punctuation: /^([\\spunctuation])/\n};\n\n// list of punctuation marks from CommonMark spec\n// without * and _ to handle the different emphasis markers * and _\ninline._punctuation = '!\"#$%&\\'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~';\ninline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\n// lookbehind is not available on Safari as of version 16\n// inline.escapedEmSt = /(?<=(?:^|[^\\\\)(?:\\\\[^])*)\\\\[*_]/g;\ninline.escapedEmSt = /(?:^|[^\\\\])(?:\\\\\\\\)*\\\\[*_]/g;\n\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\n\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim)\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g')\n  .replace(/punct/g, inline._punctuation)\n  .getRegex();\n\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n  .replace('scheme', inline._scheme)\n  .replace('email', inline._email)\n  .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n  .replace('comment', inline._comment)\n  .replace('attribute', inline._attribute)\n  .getRegex();\n\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n  .replace('label', inline._label)\n  .replace('href', inline._href)\n  .replace('title', inline._title)\n  .getRegex();\n\ninline.reflink = edit(inline.reflink)\n  .replace('label', inline._label)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.nolink = edit(inline.nolink)\n  .replace('ref', block._label)\n  .getRegex();\n\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n  .replace('reflink', inline.reflink)\n  .replace('nolink', inline.nolink)\n  .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = { ...inline };\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = {\n  ...inline.normal,\n  strong: {\n    start: /^__|\\*\\*/,\n    middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n    endAst: /\\*\\*(?!\\*)/g,\n    endUnd: /__(?!_)/g\n  },\n  em: {\n    start: /^_|\\*/,\n    middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n    endAst: /\\*(?!\\*)/g,\n    endUnd: /_(?!_)/g\n  },\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n    .replace('label', inline._label)\n    .getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n    .replace('label', inline._label)\n    .getRegex()\n};\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = {\n  ...inline.normal,\n  escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n  _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n  url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n  _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n  text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\n\ninline.gfm.url = edit(inline.gfm.url, 'i')\n  .replace('email', inline.gfm._extended_email)\n  .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = {\n  ...inline.gfm,\n  br: edit(inline.br).replace('{2,}', '*').getRegex(),\n  text: edit(inline.gfm.text)\n    .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n    .replace(/\\{2,\\}/g, '*')\n    .getRegex()\n};\n\n/**\n * smartypants text replacement\n * @param {string} text\n */\nfunction smartypants(text) {\n  return text\n    // em-dashes\n    .replace(/---/g, '\\u2014')\n    // en-dashes\n    .replace(/--/g, '\\u2013')\n    // opening singles\n    .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n    // closing singles & apostrophes\n    .replace(/'/g, '\\u2019')\n    // opening doubles\n    .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n    // closing doubles\n    .replace(/\"/g, '\\u201d')\n    // ellipses\n    .replace(/\\.{3}/g, '\\u2026');\n}\n\n/**\n * mangle email addresses\n * @param {string} text\n */\nfunction mangle(text) {\n  let out = '',\n    i,\n    ch;\n\n  const l = text.length;\n  for (i = 0; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n\n  return out;\n}\n\n/**\n * Block Lexer\n */\nclass Lexer {\n  constructor(options) {\n    this.tokens = [];\n    this.tokens.links = Object.create(null);\n    this.options = options || defaults;\n    this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true\n    };\n\n    const rules = {\n      block: block.normal,\n      inline: inline.normal\n    };\n\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n\n  /**\n   * Expose Rules\n   */\n  static get rules() {\n    return {\n      block,\n      inline\n    };\n  }\n\n  /**\n   * Static Lex Method\n   */\n  static lex(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.lex(src);\n  }\n\n  /**\n   * Static Lex Inline Method\n   */\n  static lexInline(src, options) {\n    const lexer = new Lexer(options);\n    return lexer.inlineTokens(src);\n  }\n\n  /**\n   * Preprocessing\n   */\n  lex(src) {\n    src = src\n      .replace(/\\r\\n|\\r/g, '\\n');\n\n    this.blockTokens(src, this.tokens);\n\n    let next;\n    while (next = this.inlineQueue.shift()) {\n      this.inlineTokens(next.src, next.tokens);\n    }\n\n    return this.tokens;\n  }\n\n  /**\n   * Lexing\n   */\n  blockTokens(src, tokens = []) {\n    if (this.options.pedantic) {\n      src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n    } else {\n      src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n        return leading + '    '.repeat(tabs.length);\n      });\n    }\n\n    let token, lastToken, cutSrc, lastParagraphClipped;\n\n    while (src) {\n      if (this.options.extensions\n        && this.options.extensions.block\n        && this.options.extensions.block.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // newline\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.length === 1 && tokens.length > 0) {\n          // if there's a single \\n as a spacer, it's terminating the last line,\n          // so move it there so that we don't get unecessary paragraph tags\n          tokens[tokens.length - 1].raw += '\\n';\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        // An indented code block cannot interrupt a paragraph.\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // fences\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // heading\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // hr\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // blockquote\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // list\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // html\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // def\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.raw;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title\n          };\n        }\n        continue;\n      }\n\n      // table (gfm)\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // lheading\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // top-level paragraph\n      // prevent paragraph consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startBlock) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startBlock.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        lastToken = tokens[tokens.length - 1];\n        if (lastParagraphClipped && lastToken.type === 'paragraph') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = (cutSrc.length !== src.length);\n        src = src.substring(token.raw.length);\n        continue;\n      }\n\n      // text\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    this.state.top = true;\n    return tokens;\n  }\n\n  inline(src, tokens = []) {\n    this.inlineQueue.push({ src, tokens });\n    return tokens;\n  }\n\n  /**\n   * Lexing/Compiling\n   */\n  inlineTokens(src, tokens = []) {\n    let token, lastToken, cutSrc;\n\n    // String with links masked to avoid interference with em and strong\n    let maskedSrc = src;\n    let match;\n    let keepPrevChar, prevChar;\n\n    // Mask out reflinks\n    if (this.tokens.links) {\n      const links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n    // Mask out other blocks\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n\n    // Mask out escaped em & strong delimiters\n    while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n      this.tokenizer.rules.inline.escapedEmSt.lastIndex--;\n    }\n\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = '';\n      }\n      keepPrevChar = false;\n\n      // extensions\n      if (this.options.extensions\n        && this.options.extensions.inline\n        && this.options.extensions.inline.some((extTokenizer) => {\n          if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n            src = src.substring(token.raw.length);\n            tokens.push(token);\n            return true;\n          }\n          return false;\n        })) {\n        continue;\n      }\n\n      // escape\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // tag\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // link\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // reflink, nolink\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // em & strong\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // br\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // del (gfm)\n      if (token = this.tokenizer.del(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // autolink\n      if (token = this.tokenizer.autolink(src, mangle)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // url (gfm)\n      if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // text\n      // prevent inlineText consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startInline) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startInline.forEach(function(getStartIndex) {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      if (src) {\n        const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n\n    return tokens;\n  }\n}\n\n/**\n * Renderer\n */\nclass Renderer {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  code(code, infostring, escaped) {\n    const lang = (infostring || '').match(/\\S*/)[0];\n    if (this.options.highlight) {\n      const out = this.options.highlight(code, lang);\n      if (out != null && out !== code) {\n        escaped = true;\n        code = out;\n      }\n    }\n\n    code = code.replace(/\\n$/, '') + '\\n';\n\n    if (!lang) {\n      return '<pre><code>'\n        + (escaped ? code : escape(code, true))\n        + '</code></pre>\\n';\n    }\n\n    return '<pre><code class=\"'\n      + this.options.langPrefix\n      + escape(lang)\n      + '\">'\n      + (escaped ? code : escape(code, true))\n      + '</code></pre>\\n';\n  }\n\n  /**\n   * @param {string} quote\n   */\n  blockquote(quote) {\n    return `<blockquote>\\n${quote}</blockquote>\\n`;\n  }\n\n  html(html) {\n    return html;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} level\n   * @param {string} raw\n   * @param {any} slugger\n   */\n  heading(text, level, raw, slugger) {\n    if (this.options.headerIds) {\n      const id = this.options.headerPrefix + slugger.slug(raw);\n      return `<h${level} id=\"${id}\">${text}</h${level}>\\n`;\n    }\n\n    // ignore IDs\n    return `<h${level}>${text}</h${level}>\\n`;\n  }\n\n  hr() {\n    return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n  }\n\n  list(body, ordered, start) {\n    const type = ordered ? 'ol' : 'ul',\n      startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n    return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n  }\n\n  /**\n   * @param {string} text\n   */\n  listitem(text) {\n    return `<li>${text}</li>\\n`;\n  }\n\n  checkbox(checked) {\n    return '<input '\n      + (checked ? 'checked=\"\" ' : '')\n      + 'disabled=\"\" type=\"checkbox\"'\n      + (this.options.xhtml ? ' /' : '')\n      + '> ';\n  }\n\n  /**\n   * @param {string} text\n   */\n  paragraph(text) {\n    return `<p>${text}</p>\\n`;\n  }\n\n  /**\n   * @param {string} header\n   * @param {string} body\n   */\n  table(header, body) {\n    if (body) body = `<tbody>${body}</tbody>`;\n\n    return '<table>\\n'\n      + '<thead>\\n'\n      + header\n      + '</thead>\\n'\n      + body\n      + '</table>\\n';\n  }\n\n  /**\n   * @param {string} content\n   */\n  tablerow(content) {\n    return `<tr>\\n${content}</tr>\\n`;\n  }\n\n  tablecell(content, flags) {\n    const type = flags.header ? 'th' : 'td';\n    const tag = flags.align\n      ? `<${type} align=\"${flags.align}\">`\n      : `<${type}>`;\n    return tag + content + `</${type}>\\n`;\n  }\n\n  /**\n   * span level renderer\n   * @param {string} text\n   */\n  strong(text) {\n    return `<strong>${text}</strong>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  em(text) {\n    return `<em>${text}</em>`;\n  }\n\n  /**\n   * @param {string} text\n   */\n  codespan(text) {\n    return `<code>${text}</code>`;\n  }\n\n  br() {\n    return this.options.xhtml ? '<br/>' : '<br>';\n  }\n\n  /**\n   * @param {string} text\n   */\n  del(text) {\n    return `<del>${text}</del>`;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  link(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n    let out = '<a href=\"' + href + '\"';\n    if (title) {\n      out += ' title=\"' + title + '\"';\n    }\n    out += '>' + text + '</a>';\n    return out;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */\n  image(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n\n    let out = `<img src=\"${href}\" alt=\"${text}\"`;\n    if (title) {\n      out += ` title=\"${title}\"`;\n    }\n    out += this.options.xhtml ? '/>' : '>';\n    return out;\n  }\n\n  text(text) {\n    return text;\n  }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass TextRenderer {\n  // no need for block level renderers\n  strong(text) {\n    return text;\n  }\n\n  em(text) {\n    return text;\n  }\n\n  codespan(text) {\n    return text;\n  }\n\n  del(text) {\n    return text;\n  }\n\n  html(text) {\n    return text;\n  }\n\n  text(text) {\n    return text;\n  }\n\n  link(href, title, text) {\n    return '' + text;\n  }\n\n  image(href, title, text) {\n    return '' + text;\n  }\n\n  br() {\n    return '';\n  }\n}\n\n/**\n * Slugger generates header id\n */\nclass Slugger {\n  constructor() {\n    this.seen = {};\n  }\n\n  /**\n   * @param {string} value\n   */\n  serialize(value) {\n    return value\n      .toLowerCase()\n      .trim()\n      // remove html tags\n      .replace(/<[!\\/a-z].*?>/ig, '')\n      // remove unwanted chars\n      .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n      .replace(/\\s/g, '-');\n  }\n\n  /**\n   * Finds the next safe (unique) slug to use\n   * @param {string} originalSlug\n   * @param {boolean} isDryRun\n   */\n  getNextSafeSlug(originalSlug, isDryRun) {\n    let slug = originalSlug;\n    let occurenceAccumulator = 0;\n    if (this.seen.hasOwnProperty(slug)) {\n      occurenceAccumulator = this.seen[originalSlug];\n      do {\n        occurenceAccumulator++;\n        slug = originalSlug + '-' + occurenceAccumulator;\n      } while (this.seen.hasOwnProperty(slug));\n    }\n    if (!isDryRun) {\n      this.seen[originalSlug] = occurenceAccumulator;\n      this.seen[slug] = 0;\n    }\n    return slug;\n  }\n\n  /**\n   * Convert string to unique id\n   * @param {object} [options]\n   * @param {boolean} [options.dryrun] Generates the next unique slug without\n   * updating the internal accumulator.\n   */\n  slug(value, options = {}) {\n    const slug = this.serialize(value);\n    return this.getNextSafeSlug(slug, options.dryrun);\n  }\n}\n\n/**\n * Parsing & Compiling\n */\nclass Parser {\n  constructor(options) {\n    this.options = options || defaults;\n    this.options.renderer = this.options.renderer || new Renderer();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.textRenderer = new TextRenderer();\n    this.slugger = new Slugger();\n  }\n\n  /**\n   * Static Parse Method\n   */\n  static parse(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parse(tokens);\n  }\n\n  /**\n   * Static Parse Inline Method\n   */\n  static parseInline(tokens, options) {\n    const parser = new Parser(options);\n    return parser.parseInline(tokens);\n  }\n\n  /**\n   * Parse Loop\n   */\n  parse(tokens, top = true) {\n    let out = '',\n      i,\n      j,\n      k,\n      l2,\n      l3,\n      row,\n      cell,\n      header,\n      body,\n      token,\n      ordered,\n      start,\n      loose,\n      itemBody,\n      item,\n      checked,\n      task,\n      checkbox,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'space': {\n          continue;\n        }\n        case 'hr': {\n          out += this.renderer.hr();\n          continue;\n        }\n        case 'heading': {\n          out += this.renderer.heading(\n            this.parseInline(token.tokens),\n            token.depth,\n            unescape(this.parseInline(token.tokens, this.textRenderer)),\n            this.slugger);\n          continue;\n        }\n        case 'code': {\n          out += this.renderer.code(token.text,\n            token.lang,\n            token.escaped);\n          continue;\n        }\n        case 'table': {\n          header = '';\n\n          // header\n          cell = '';\n          l2 = token.header.length;\n          for (j = 0; j < l2; j++) {\n            cell += this.renderer.tablecell(\n              this.parseInline(token.header[j].tokens),\n              { header: true, align: token.align[j] }\n            );\n          }\n          header += this.renderer.tablerow(cell);\n\n          body = '';\n          l2 = token.rows.length;\n          for (j = 0; j < l2; j++) {\n            row = token.rows[j];\n\n            cell = '';\n            l3 = row.length;\n            for (k = 0; k < l3; k++) {\n              cell += this.renderer.tablecell(\n                this.parseInline(row[k].tokens),\n                { header: false, align: token.align[k] }\n              );\n            }\n\n            body += this.renderer.tablerow(cell);\n          }\n          out += this.renderer.table(header, body);\n          continue;\n        }\n        case 'blockquote': {\n          body = this.parse(token.tokens);\n          out += this.renderer.blockquote(body);\n          continue;\n        }\n        case 'list': {\n          ordered = token.ordered;\n          start = token.start;\n          loose = token.loose;\n          l2 = token.items.length;\n\n          body = '';\n          for (j = 0; j < l2; j++) {\n            item = token.items[j];\n            checked = item.checked;\n            task = item.task;\n\n            itemBody = '';\n            if (item.task) {\n              checkbox = this.renderer.checkbox(checked);\n              if (loose) {\n                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                  item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                  if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                    item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                  }\n                } else {\n                  item.tokens.unshift({\n                    type: 'text',\n                    text: checkbox\n                  });\n                }\n              } else {\n                itemBody += checkbox;\n              }\n            }\n\n            itemBody += this.parse(item.tokens, loose);\n            body += this.renderer.listitem(itemBody, task, checked);\n          }\n\n          out += this.renderer.list(body, ordered, start);\n          continue;\n        }\n        case 'html': {\n          // TODO parse inline content if parameter markdown=1\n          out += this.renderer.html(token.text);\n          continue;\n        }\n        case 'paragraph': {\n          out += this.renderer.paragraph(this.parseInline(token.tokens));\n          continue;\n        }\n        case 'text': {\n          body = token.tokens ? this.parseInline(token.tokens) : token.text;\n          while (i + 1 < l && tokens[i + 1].type === 'text') {\n            token = tokens[++i];\n            body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n          }\n          out += top ? this.renderer.paragraph(body) : body;\n          continue;\n        }\n\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n\n    return out;\n  }\n\n  /**\n   * Parse Inline Tokens\n   */\n  parseInline(tokens, renderer) {\n    renderer = renderer || this.renderer;\n    let out = '',\n      i,\n      token,\n      ret;\n\n    const l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n        if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n\n      switch (token.type) {\n        case 'escape': {\n          out += renderer.text(token.text);\n          break;\n        }\n        case 'html': {\n          out += renderer.html(token.text);\n          break;\n        }\n        case 'link': {\n          out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'image': {\n          out += renderer.image(token.href, token.title, token.text);\n          break;\n        }\n        case 'strong': {\n          out += renderer.strong(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'em': {\n          out += renderer.em(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'codespan': {\n          out += renderer.codespan(token.text);\n          break;\n        }\n        case 'br': {\n          out += renderer.br();\n          break;\n        }\n        case 'del': {\n          out += renderer.del(this.parseInline(token.tokens, renderer));\n          break;\n        }\n        case 'text': {\n          out += renderer.text(token.text);\n          break;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return;\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out;\n  }\n}\n\nclass Hooks {\n  constructor(options) {\n    this.options = options || defaults;\n  }\n\n  static passThroughHooks = new Set([\n    'preprocess',\n    'postprocess'\n  ]);\n\n  /**\n   * Process markdown before marked\n   */\n  preprocess(markdown) {\n    return markdown;\n  }\n\n  /**\n   * Process HTML after marked is finished\n   */\n  postprocess(html) {\n    return html;\n  }\n}\n\nfunction onError(silent, async, callback) {\n  return (e) => {\n    e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n    if (silent) {\n      const msg = '<p>An error occurred:</p><pre>'\n        + escape(e.message + '', true)\n        + '</pre>';\n      if (async) {\n        return Promise.resolve(msg);\n      }\n      if (callback) {\n        callback(null, msg);\n        return;\n      }\n      return msg;\n    }\n\n    if (async) {\n      return Promise.reject(e);\n    }\n    if (callback) {\n      callback(e);\n      return;\n    }\n    throw e;\n  };\n}\n\nfunction parseMarkdown(lexer, parser) {\n  return (src, opt, callback) => {\n    if (typeof opt === 'function') {\n      callback = opt;\n      opt = null;\n    }\n\n    const origOpt = { ...opt };\n    opt = { ...marked.defaults, ...origOpt };\n    const throwError = onError(opt.silent, opt.async, callback);\n\n    // throw error in case of non string input\n    if (typeof src === 'undefined' || src === null) {\n      return throwError(new Error('marked(): input parameter is undefined or null'));\n    }\n    if (typeof src !== 'string') {\n      return throwError(new Error('marked(): input parameter is of type '\n        + Object.prototype.toString.call(src) + ', string expected'));\n    }\n\n    checkSanitizeDeprecation(opt);\n\n    if (opt.hooks) {\n      opt.hooks.options = opt;\n    }\n\n    if (callback) {\n      const highlight = opt.highlight;\n      let tokens;\n\n      try {\n        if (opt.hooks) {\n          src = opt.hooks.preprocess(src);\n        }\n        tokens = lexer(src, opt);\n      } catch (e) {\n        return throwError(e);\n      }\n\n      const done = function(err) {\n        let out;\n\n        if (!err) {\n          try {\n            if (opt.walkTokens) {\n              marked.walkTokens(tokens, opt.walkTokens);\n            }\n            out = parser(tokens, opt);\n            if (opt.hooks) {\n              out = opt.hooks.postprocess(out);\n            }\n          } catch (e) {\n            err = e;\n          }\n        }\n\n        opt.highlight = highlight;\n\n        return err\n          ? throwError(err)\n          : callback(null, out);\n      };\n\n      if (!highlight || highlight.length < 3) {\n        return done();\n      }\n\n      delete opt.highlight;\n\n      if (!tokens.length) return done();\n\n      let pending = 0;\n      marked.walkTokens(tokens, function(token) {\n        if (token.type === 'code') {\n          pending++;\n          setTimeout(() => {\n            highlight(token.text, token.lang, function(err, code) {\n              if (err) {\n                return done(err);\n              }\n              if (code != null && code !== token.text) {\n                token.text = code;\n                token.escaped = true;\n              }\n\n              pending--;\n              if (pending === 0) {\n                done();\n              }\n            });\n          }, 0);\n        }\n      });\n\n      if (pending === 0) {\n        done();\n      }\n\n      return;\n    }\n\n    if (opt.async) {\n      return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n        .then(src => lexer(src, opt))\n        .then(tokens => opt.walkTokens ? Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n        .then(tokens => parser(tokens, opt))\n        .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n        .catch(throwError);\n    }\n\n    try {\n      if (opt.hooks) {\n        src = opt.hooks.preprocess(src);\n      }\n      const tokens = lexer(src, opt);\n      if (opt.walkTokens) {\n        marked.walkTokens(tokens, opt.walkTokens);\n      }\n      let html = parser(tokens, opt);\n      if (opt.hooks) {\n        html = opt.hooks.postprocess(html);\n      }\n      return html;\n    } catch (e) {\n      return throwError(e);\n    }\n  };\n}\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n  return parseMarkdown(Lexer.lex, Parser.parse)(src, opt, callback);\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n  marked.defaults = { ...marked.defaults, ...opt };\n  changeDefaults(marked.defaults);\n  return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args) {\n  const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };\n\n  args.forEach((pack) => {\n    // copy options to new object\n    const opts = { ...pack };\n\n    // set async to true if it was set to true before\n    opts.async = marked.defaults.async || opts.async || false;\n\n    // ==-- Parse \"addon\" extensions --== //\n    if (pack.extensions) {\n      pack.extensions.forEach((ext) => {\n        if (!ext.name) {\n          throw new Error('extension name required');\n        }\n        if (ext.renderer) { // Renderer extensions\n          const prevRenderer = extensions.renderers[ext.name];\n          if (prevRenderer) {\n            // Replace extension with func to run new extension but fall back if false\n            extensions.renderers[ext.name] = function(...args) {\n              let ret = ext.renderer.apply(this, args);\n              if (ret === false) {\n                ret = prevRenderer.apply(this, args);\n              }\n              return ret;\n            };\n          } else {\n            extensions.renderers[ext.name] = ext.renderer;\n          }\n        }\n        if (ext.tokenizer) { // Tokenizer Extensions\n          if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n            throw new Error(\"extension level must be 'block' or 'inline'\");\n          }\n          if (extensions[ext.level]) {\n            extensions[ext.level].unshift(ext.tokenizer);\n          } else {\n            extensions[ext.level] = [ext.tokenizer];\n          }\n          if (ext.start) { // Function to check for start of token\n            if (ext.level === 'block') {\n              if (extensions.startBlock) {\n                extensions.startBlock.push(ext.start);\n              } else {\n                extensions.startBlock = [ext.start];\n              }\n            } else if (ext.level === 'inline') {\n              if (extensions.startInline) {\n                extensions.startInline.push(ext.start);\n              } else {\n                extensions.startInline = [ext.start];\n              }\n            }\n          }\n        }\n        if (ext.childTokens) { // Child tokens to be visited by walkTokens\n          extensions.childTokens[ext.name] = ext.childTokens;\n        }\n      });\n      opts.extensions = extensions;\n    }\n\n    // ==-- Parse \"overwrite\" extensions --== //\n    if (pack.renderer) {\n      const renderer = marked.defaults.renderer || new Renderer();\n      for (const prop in pack.renderer) {\n        const prevRenderer = renderer[prop];\n        // Replace renderer with func to run extension, but fall back if false\n        renderer[prop] = (...args) => {\n          let ret = pack.renderer[prop].apply(renderer, args);\n          if (ret === false) {\n            ret = prevRenderer.apply(renderer, args);\n          }\n          return ret;\n        };\n      }\n      opts.renderer = renderer;\n    }\n    if (pack.tokenizer) {\n      const tokenizer = marked.defaults.tokenizer || new Tokenizer();\n      for (const prop in pack.tokenizer) {\n        const prevTokenizer = tokenizer[prop];\n        // Replace tokenizer with func to run extension, but fall back if false\n        tokenizer[prop] = (...args) => {\n          let ret = pack.tokenizer[prop].apply(tokenizer, args);\n          if (ret === false) {\n            ret = prevTokenizer.apply(tokenizer, args);\n          }\n          return ret;\n        };\n      }\n      opts.tokenizer = tokenizer;\n    }\n\n    // ==-- Parse Hooks extensions --== //\n    if (pack.hooks) {\n      const hooks = marked.defaults.hooks || new Hooks();\n      for (const prop in pack.hooks) {\n        const prevHook = hooks[prop];\n        if (Hooks.passThroughHooks.has(prop)) {\n          hooks[prop] = (arg) => {\n            if (marked.defaults.async) {\n              return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then(ret => {\n                return prevHook.call(hooks, ret);\n              });\n            }\n\n            const ret = pack.hooks[prop].call(hooks, arg);\n            return prevHook.call(hooks, ret);\n          };\n        } else {\n          hooks[prop] = (...args) => {\n            let ret = pack.hooks[prop].apply(hooks, args);\n            if (ret === false) {\n              ret = prevHook.apply(hooks, args);\n            }\n            return ret;\n          };\n        }\n      }\n      opts.hooks = hooks;\n    }\n\n    // ==-- Parse WalkTokens extensions --== //\n    if (pack.walkTokens) {\n      const walkTokens = marked.defaults.walkTokens;\n      opts.walkTokens = function(token) {\n        let values = [];\n        values.push(pack.walkTokens.call(this, token));\n        if (walkTokens) {\n          values = values.concat(walkTokens.call(this, token));\n        }\n        return values;\n      };\n    }\n\n    marked.setOptions(opts);\n  });\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens, callback) {\n  let values = [];\n  for (const token of tokens) {\n    values = values.concat(callback.call(marked, token));\n    switch (token.type) {\n      case 'table': {\n        for (const cell of token.header) {\n          values = values.concat(marked.walkTokens(cell.tokens, callback));\n        }\n        for (const row of token.rows) {\n          for (const cell of row) {\n            values = values.concat(marked.walkTokens(cell.tokens, callback));\n          }\n        }\n        break;\n      }\n      case 'list': {\n        values = values.concat(marked.walkTokens(token.items, callback));\n        break;\n      }\n      default: {\n        if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { // Walk any extensions\n          marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {\n            values = values.concat(marked.walkTokens(token[childTokens], callback));\n          });\n        } else if (token.tokens) {\n          values = values.concat(marked.walkTokens(token.tokens, callback));\n        }\n      }\n    }\n  }\n  return values;\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = parseMarkdown(Lexer.lexInline, Parser.parseInline);\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.Hooks = Hooks;\nmarked.parse = marked;\n\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = Parser.parse;\nconst lexer = Lexer.lex;\n\nexport { Hooks, Lexer, Parser, Renderer, Slugger, TextRenderer, Tokenizer, defaults, getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n","import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { marked } from 'marked';\n\nexport class LdMarkdownElement extends LitElement {\n  @property({ type: Boolean, reflect: true }) error: boolean = false;\n\n  @state() url: string | null = null;\n\n  @state() protected rawMarkdown: string = '';\n\n  @state() srcObserver: MutationObserver | undefined = undefined;\n\n  static get styles() {\n    return css`\n      :host {\n        display: flex;\n        border-radius: 2px;\n      }\n\n      :host([error]) {\n        box-shadow: 0 0 8px var(--error-color, #de3300);\n      }\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback(): void {\n    this.srcObserver?.disconnect();\n  }\n\n  // --------------------------------------------------------------------------------------\n  getMarkdownFilePath() {\n    return this.url;\n  }\n\n  // --------------------------------------------------------------------------------------\n  getRawMarkdown() {\n    return this.rawMarkdown;\n  }\n\n  // --------------------------------------------------------------------------------------\n  convertAndInjectMarkdown(markdown: string) {\n    const markdownContainer = this.getMarkdownContainer();\n    if (!markdownContainer) return;\n\n    markdownContainer.innerHTML = marked.parse(markdown);\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <slot name=\"markdown-html\"></slot>\n      <slot\n        @slotchange=\"${() => this.handleSlotchange()}\"\n        name=\"markdown-src\"\n      ></slot>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private async retrieveRawMarkdown(scriptTag: HTMLScriptElement) {\n    const url = scriptTag.getAttribute('src') as string;\n    if (url) {\n      this.url = url;\n      return this.fetchRawMarkdownFromFile(this.url);\n    }\n    return scriptTag.textContent ? scriptTag.textContent : '';\n  }\n\n  // --------------------------------------------------------------------------------------\n  private async handleSlotchange() {\n    const scriptTag = this.getScriptTag();\n    if (!scriptTag) return;\n\n    this.srcObserver = this.createSrcAttributeObserver();\n    const config = { attributes: true, childList: false, subtree: false };\n    this.srcObserver.observe(scriptTag, config);\n\n    this.rawMarkdown = await this.retrieveRawMarkdown(scriptTag);\n    this.convertAndInjectMarkdown(this.rawMarkdown);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private createSrcAttributeObserver() {\n    const callback = async (mutationList: any) => {\n      for (const mutation of mutationList) {\n        if (mutation.type === 'attributes') {\n          if (mutation.attributeName === 'src') {\n            this.fetchAndInjectMarkdown(mutation);\n          }\n        }\n      }\n    };\n    return new MutationObserver(callback);\n  }\n\n  private async fetchAndInjectMarkdown(mutation: any) {\n    this.url = mutation.target.getAttribute('src');\n    this.rawMarkdown = await this.fetchRawMarkdownFromFile(this.url!);\n    this.convertAndInjectMarkdown(this.rawMarkdown);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getScriptTag() {\n    const src = <HTMLSlotElement>(\n      this.shadowRoot?.querySelector(\"slot[name='markdown-src']\")\n    );\n    if (!src) return null;\n\n    const children = src.assignedNodes();\n    if (children.length === 0) return null;\n\n    return children[0] as HTMLScriptElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getMarkdownContainer() {\n    if (this.rawMarkdown === '') return null;\n    const markdownTarget = <HTMLSlotElement>(\n      this.shadowRoot?.querySelector(\"slot[name='markdown-html']\")\n    );\n    if (!markdownTarget) return null;\n    const children = markdownTarget.assignedNodes();\n    if (children.length === 0) return null;\n\n    return children[0] as HTMLDivElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private async fetchRawMarkdownFromFile(url: string) {\n    let markdown;\n\n    const markdownResponse = await fetch(url).catch(reason => reason);\n    if (markdownResponse.status !== 200) this.error = true;\n\n    if (!markdownResponse.status) {\n      markdown = `There was an error: ${markdownResponse.toString()}`;\n      this.error = true;\n    } else if (markdownResponse.status === 404)\n      markdown = `There was an error: File not found`;\n    else {\n      this.error = false;\n      markdown = markdownResponse.text();\n    }\n\n    return markdown;\n  }\n}\n","import { LdMarkdownElement } from './LdMarkdownElement.js';\n\nwindow.customElements.define('ld-markdown-element', LdMarkdownElement);\n","/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@lifedata/ld-elements/dist';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport { css, CSSResult, customElement, html, LitElement, property, state, TemplateResult } from 'lit-element';\n//@ts-ignore\nimport validator                                                                            from 'validator/es';\nimport { IFButtons, IFDate, IFFormFields, IFFormInputs }                                    from '../interfaces';\n\n\n/**\n * @extends LitElement\n */\n@customElement('ld-report')\nexport class LdReport extends LitElement {\n\n  @property({ type: String }) headline: string | null           = null;\n  @property({ type: Object }) columnInputs: Array<IFFormInputs> = [];\n  @property({ type: Number }) numberOfSearchResult: number      = 0;\n  @property({ type: Object }) dateRange: Array<IFDate>          = [];\n  @property({ type: Object }) buttons: Array<IFButtons>         = [];\n  @property({ type: String }) cancelButtonName: string          = '';\n  @property({ type: String }) viewButtonName: string            = '';\n  @property({ type: Boolean }) disabled: boolean                = false;\n  @state() _opened: boolean                                     = true;\n  @state() _oldColumnInputs: Array<IFFormInputs>                = [];\n  @state() _disabledChild: boolean                              = false;\n  @state() _disabledParent: boolean                             = false;\n  @state() _disabledClone: boolean                              = false;\n\n  // --------------------------------------------------------------------------------------\n  static get styles(): CSSResult[] {\n    return [\n      css`\n        :host {\n          display: block;\n        }\n      `\n    ];\n  }\n\n  /**\n   * @returns TemplateResult\n   */\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    const columnInputs: Array<Object> = [];\n\n    if (this.columnInputs.length > 0) {\n      setTimeout(() => {\n        this.disabled         = true;\n        this._oldColumnInputs = this.columnInputs;\n      }, 500);\n\n      columnInputs.push(html`\n        <ld-form\n          part=\"ld-report-columns-form\"\n          id='column-form'\n          .fields='${this.columnInputs}'\n          @openList='${(e: CustomEvent) => this._clickOpenElements(e)}'\n          @click-all='${(e: CustomEvent) => this._selectChildElements(e)}'\n          @click-child='${(e: CustomEvent) => this._selectParentElements(e)}'\n        ></ld-form>\n      `);\n    }\n\n    const _headlineContent: TemplateResult[] = [];\n\n    if (this.headline != null) {\n      _headlineContent.push(html`\n        <div class='detail-header-column' part=\"ld-report-detail-header-column\">\n          <h2 part=\"ld-report-detail-header-column-h2\">\n            ${this.headline}\n          </h2>\n        </div>`);\n    }\n\n    return html`\n      <div class='details-column' part=\"ld-report-details-column\">\n        ${_headlineContent}\n        \n        <div class=\"columns\" part=\"ld-report-columns\">\n          ${columnInputs}\n        </div>\n      </div>\n    `;\n  }\n\n  /**\n   * click on Cancel button\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  onButtonCancelClick(): void {\n    this.shadowRoot?.querySelector('.details-column')?.classList.remove('show');\n  }\n\n  /**\n   * click on Reset button\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  onButtonResetClick(): void {\n    const _formColumn = this.shadowRoot?.querySelector('ld-form#column-form');\n    // @ts-ignore\n    _formColumn.reset();\n  }\n\n  /**\n   * click on show button\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  onButtonShowClick(): IFFormFields[] | undefined {\n    const form = this.shadowRoot?.querySelector('ld-form#column-form');\n    let values;\n    if (form != null) {\n      values = this.formButtonSaveHandler(this.columnInputs, form);\n    }\n\n    this._oldColumnInputs = [...this.columnInputs];\n    return values != null ? values[1] : undefined;\n\n  }\n\n  /**\n   * If the 'save'-button is pressed, check all mandatory fields,\n   * validate them and sends a request to the backend\n   */\n  // --------------------------------------------------------------------------------------\n  formButtonSaveHandler(_formInputs: Array<IFFormInputs>, form: any) {\n    /**\n     * form fields\n     */\n    let _getAmountOfInvalidFields;\n    const _formFields: Array<IFFormFields> = [];\n\n    if (form != null) {\n      const _items = form.getItems();\n\n      _formInputs.forEach((field: IFFormInputs) => {\n        if (field.type !== 'hidden') {\n          const _domNode = form.shadowRoot.querySelector(`#${field.id}`);\n          let _value;\n          if (field.type === 'dropdown') {\n            _value = _items[field.id] != null && _items[field.id].selectedData != null ? _items[field.id].selectedData.value : null;\n          } else if (field.type === 'toggle' && _items[field.id] != null) {\n            _value = _items[field.id].checked;\n          } else if (field.type === 'checkbox' && _items[field.id] != null) {\n            _value = _items[field.id].checked;\n          } else {\n            if (_items[field.id] != null) {\n              _value = _items[field.id].value;\n            }\n            if (_value != null) {\n              _value = _value.trim();\n            }\n          }\n          _formFields.push({\n            id: field.id,\n            fieldDefinition: field,\n            label: field.label,\n            domNode: _domNode,\n            value: _value,\n            isValidField: true\n          });\n        }\n      });\n\n      /**\n       * field validation\n       */\n      _formFields.forEach((type: IFFormFields) => {\n        if (type.fieldDefinition.validation != null) {\n\n          let _fieldValue   = (type.value == null) ? '' : type.value;\n          let _isValidField = true;\n\n          type.fieldDefinition.validation.forEach((rule: string) => {\n            if (rule === 'isNotEmpty') {\n              _isValidField = !validator.isEmpty(_fieldValue);\n              if (!_isValidField) {\n                return;\n              }\n            }\n            if (rule === 'isByteLength200') {\n              _isValidField = validator.isLength(_fieldValue, { min: 0, max: 200 });\n\n            }\n            if (rule === 'isByteLength50') {\n              _isValidField = validator.isLength(_fieldValue, { min: 0, max: 50 });\n\n            }\n            if (rule === 'isByteLength15') {\n              _isValidField = validator.isLength(_fieldValue, { min: 0, max: 15 });\n\n            }\n            if (rule === 'isNotEmptyIsByteLength15') {\n              _isValidField = validator.isLength(_fieldValue, { min: 1, max: 15 });\n            }\n            if (rule === 'isNotEmptyIsByteLength50') {\n              _isValidField = validator.isLength(_fieldValue, { min: 1, max: 50 });\n            }\n            if (rule === 'isNotEmptyIsByteLength200') {\n              _isValidField = validator.isLength(_fieldValue, { min: 1, max: 200 });\n            }\n            if (rule === 'isNotEmptyIsByteLength500') {\n              _isValidField = validator.isLength(_fieldValue, { min: 1, max: 500 });\n            }\n            if (_fieldValue !== '' && rule === 'isValidUUID') {\n              _isValidField = validator.isUUID(_fieldValue);\n            }\n            if (rule === 'isHexColor') {\n              _isValidField = validator.isHexColor(_fieldValue);\n            }\n            if (rule === 'isNotEmptyIsInteger') {\n              _isValidField = validator.isInt(_fieldValue, { min: 1 });\n            }\n          });\n          type.isValidField = _isValidField;\n        }\n      });\n\n      _formFields.forEach((field: IFFormFields) => {\n        if (field.domNode != null) {\n          field.domNode.invalid = field.isValidField != null && !field.isValidField;\n        }\n      });\n\n      _getAmountOfInvalidFields = _formFields.filter((field: { isValidField: boolean }) => !field.isValidField);\n    }\n    return [\n      _getAmountOfInvalidFields,\n      _formFields\n    ];\n\n  }\n\n  /**\n   * open child checkbox list\n   * @protected\n   * @param {CustomEvent | null} evt\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  protected _clickOpenElements(evt: CustomEvent | null): void {\n    if (this.disabled) {\n      const form = this.shadowRoot?.querySelector('ld-form#column-form');\n      const icon = form?.shadowRoot?.querySelectorAll(`iron-icon#${evt?.detail.id}_icon`);\n      icon![1].toggleAttribute('data-show');\n      icon![0].toggleAttribute('data-show');\n      const childCheckbox = form?.shadowRoot?.querySelector(`div#${evt?.detail.id}`);\n      childCheckbox?.toggleAttribute('data-show');\n    }\n  }\n\n  /**\n   * click on lying burger menu ...\n   * @protected\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  protected _openColumnsList(): void {\n\n    const _evt = new CustomEvent('openColumnsList');\n    this.dispatchEvent(_evt);\n    this.shadowRoot?.querySelector('.details-column')?.classList.toggle('show');\n  }\n\n  /**\n   * if Parent Checkbox is selected\n   * @protected\n   * @param {CustomEvent | null} evt\n   * @returns void\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  protected _selectChildElements(evt: CustomEvent | null): void {\n    if (this.disabled) {\n      if (!this._disabledParent) {\n        this._disabledChild  = true;\n        const form           = this.shadowRoot?.querySelector('ld-form#column-form');\n        const icon           = form?.shadowRoot?.querySelectorAll(`iron-icon#${evt?.detail.value.id}_icon`);\n        const parentCheckbox = form?.shadowRoot?.querySelector(`paper-checkbox#${evt?.detail.value.id}`);\n        const childCheckbox  = form?.shadowRoot?.querySelector(`div#${evt?.detail.value.id}`);\n        const checkboxClick  = form?.shadowRoot?.querySelectorAll(`div#${evt?.detail.value.id} paper-checkbox`);\n\n        checkboxClick?.forEach(item => {\n          if (parentCheckbox?.getAttribute('checked') != null) {\n            item.setAttribute('checked', 'checked');\n          } else {\n            item.removeAttribute('checked');\n          }\n        });\n\n        if (parentCheckbox?.getAttribute('checked') != null) {\n          childCheckbox?.setAttribute('data-show', '');\n          icon![1].setAttribute('data-show', '');\n          icon![0].removeAttribute('data-show');\n        } else {\n          childCheckbox?.removeAttribute('data-show');\n          icon![1].removeAttribute('data-show');\n          icon![0].setAttribute('data-show', '');\n        }\n        const _evt = new CustomEvent('changed');\n        this.dispatchEvent(_evt);\n\n        setTimeout(() => {\n          this._disabledChild = false;\n        }, 500);\n      }\n    }\n\n  }\n\n  /**\n   * if child Checkbox ist selected\n   * @protected\n   * @param {CustomEvent | null} evt\n   * @returns void\n\n   */\n  // --------------------------------------------------------------------------------------\n  protected _selectParentElements(evt: CustomEvent | null): void {\n\n    if (this.disabled) {\n      if (!this._disabledChild) {\n        this._disabledParent    = true;\n        const form              = this.shadowRoot?.querySelector('ld-form#column-form');\n        const length            = evt?.detail.value.label.length;\n        const parentId          = evt?.detail.value.id.substring(0, evt?.detail.value.id.length - length);\n        const parentCheckbox    = form?.shadowRoot?.querySelector(`paper-checkbox#${parentId}`);\n        const allChildCheckbox  = form?.shadowRoot?.querySelectorAll(`div#${parentId} paper-checkbox`);\n        let oneCheckboxSelected = false;\n\n        allChildCheckbox?.forEach(item => {\n          if (item.getAttribute('checked') != null) {\n            oneCheckboxSelected = true;\n          }\n        });\n\n        if (oneCheckboxSelected) {\n          parentCheckbox?.setAttribute('checked', 'checked');\n        } else {\n          parentCheckbox?.removeAttribute('checked');\n        }\n        const _evt = new CustomEvent('changed');\n        this.dispatchEvent(_evt);\n\n        setTimeout(() => {\n          this._disabledParent = false;\n        }, 500);\n      }\n    }\n\n  }\n}\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {PaperCheckedElementBehavior} from '@polymer/paper-behaviors/paper-checked-element-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {afterNextRender} from '@polymer/polymer/lib/utils/render-status.js';\n\nconst template = html`\n<style>\n  :host {\n    display: inline-block;\n    line-height: 0;\n    white-space: nowrap;\n    cursor: pointer;\n    @apply --paper-font-common-base;\n    --calculated-paper-radio-button-size: var(--paper-radio-button-size, 16px);\n    /* -1px is a sentinel for the default and is replace in \\`attached\\`. */\n    --calculated-paper-radio-button-ink-size: var(--paper-radio-button-ink-size, -1px);\n  }\n\n  :host(:focus) {\n    outline: none;\n  }\n\n  #radioContainer {\n    @apply --layout-inline;\n    @apply --layout-center-center;\n    position: relative;\n    width: var(--calculated-paper-radio-button-size);\n    height: var(--calculated-paper-radio-button-size);\n    vertical-align: middle;\n\n    @apply --paper-radio-button-radio-container;\n  }\n\n  #ink {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    right: auto;\n    width: var(--calculated-paper-radio-button-ink-size);\n    height: var(--calculated-paper-radio-button-ink-size);\n    color: var(--paper-radio-button-unchecked-ink-color, var(--primary-text-color));\n    opacity: 0.6;\n    pointer-events: none;\n    -webkit-transform: translate(-50%, -50%);\n    transform: translate(-50%, -50%);\n  }\n\n  #ink[checked] {\n    color: var(--paper-radio-button-checked-ink-color, var(--primary-color));\n  }\n\n  #offRadio, #onRadio {\n    position: absolute;\n    box-sizing: border-box;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    border-radius: 50%;\n  }\n\n  #offRadio {\n    border: 2px solid var(--paper-radio-button-unchecked-color, var(--primary-text-color));\n    background-color: var(--paper-radio-button-unchecked-background-color, transparent);\n    transition: border-color 0.28s;\n  }\n\n  #onRadio {\n    background-color: var(--paper-radio-button-checked-color, var(--primary-color));\n    -webkit-transform: scale(0);\n    transform: scale(0);\n    transition: -webkit-transform ease 0.28s;\n    transition: transform ease 0.28s;\n    will-change: transform;\n  }\n\n  :host([checked]) #offRadio {\n    border-color: var(--paper-radio-button-checked-color, var(--primary-color));\n  }\n\n  :host([checked]) #onRadio {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n  }\n\n  #radioLabel {\n    line-height: normal;\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n    margin-left: var(--paper-radio-button-label-spacing, 10px);\n    white-space: normal;\n    color: var(--paper-radio-button-label-color, var(--primary-text-color));\n\n    @apply --paper-radio-button-label;\n  }\n\n  :host([checked]) #radioLabel {\n    @apply --paper-radio-button-label-checked;\n  }\n\n  #radioLabel:dir(rtl) {\n    margin-left: 0;\n    margin-right: var(--paper-radio-button-label-spacing, 10px);\n  }\n\n  #radioLabel[hidden] {\n    display: none;\n  }\n\n  /* disabled state */\n\n  :host([disabled]) #offRadio {\n    border-color: var(--paper-radio-button-unchecked-color, var(--primary-text-color));\n    opacity: 0.5;\n  }\n\n  :host([disabled][checked]) #onRadio {\n    background-color: var(--paper-radio-button-unchecked-color, var(--primary-text-color));\n    opacity: 0.5;\n  }\n\n  :host([disabled]) #radioLabel {\n    /* slightly darker than the button, so that it's readable */\n    opacity: 0.65;\n  }\n</style>\n\n<div id=\"radioContainer\">\n  <div id=\"offRadio\"></div>\n  <div id=\"onRadio\"></div>\n</div>\n\n<div id=\"radioLabel\"><slot></slot></div>`;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)\n\n`paper-radio-button` is a button that can be either checked or unchecked. The\nuser can tap the radio button to check or uncheck it.\n\nUse a `<paper-radio-group>` to group a set of radio buttons. When radio buttons\nare inside a radio group, exactly one radio button in the group can be checked\nat any time.\n\nExample:\n\n    <paper-radio-button></paper-radio-button>\n    <paper-radio-button>Item label</paper-radio-button>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent`\n`--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color`\n`--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`\n`--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color`\n`--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`\n`--paper-radio-button-size` | Size of the radio button | `16px`\n`--paper-radio-button-ink-size` | Size of the ripple | `48px`\n`--paper-radio-button-label-color` | Label color | `--primary-text-color`\n`--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px`\n`--paper-radio-button-radio-container` | A mixin applied to the internal radio container | `{}`\n`--paper-radio-button-label` | A mixin applied to the internal label | `{}`\n`--paper-radio-button-label-checked` | A mixin applied to the internal label when the radio button is checked | `{}`\n\nThis element applies the mixin `--paper-font-common-base` but does not import\n`paper-styles/typography.html`. In order to apply the `Roboto` font to this\nelement, make sure you've imported `paper-styles/typography.html`.\n\n@group Paper Elements\n@element paper-radio-button\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-radio-button',\n\n  behaviors: [PaperCheckedElementBehavior],\n\n  hostAttributes: {role: 'radio', 'aria-checked': false, tabindex: 0},\n\n  properties: {\n    /**\n     * Fired when the checked state changes due to user interaction.\n     *\n     * @event change\n     */\n\n    /**\n     * Fired when the checked state changes.\n     *\n     * @event iron-change\n     */\n\n    ariaActiveAttribute: {type: String, value: 'aria-checked'}\n  },\n\n  ready: function() {\n    this._rippleContainer = this.$.radioContainer;\n  },\n\n  attached: function() {\n    // Wait until styles have resolved to check for the default sentinel.\n    // See polymer#4009 for more details.\n    afterNextRender(this, function() {\n      var inkSize =\n          this.getComputedStyleValue('--calculated-paper-radio-button-ink-size')\n              .trim();\n      // If unset, compute and set the default `--paper-radio-button-ink-size`.\n      if (inkSize === '-1px') {\n        var size = parseFloat(\n            this.getComputedStyleValue('--calculated-paper-radio-button-size')\n                .trim());\n        var defaultInkSize = Math.floor(3 * size);\n\n        // The button and ripple need to have the same parity so that their\n        // centers align.\n        if (defaultInkSize % 2 !== size % 2) {\n          defaultInkSize++;\n        }\n\n        this.updateStyles({\n          '--paper-radio-button-ink-size': defaultInkSize + 'px',\n        });\n      }\n    });\n  },\n})\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport '@polymer/paper-radio-button/paper-radio-button.js';\n\nimport {IronMenubarBehavior, IronMenubarBehaviorImpl} from '@polymer/iron-menu-behavior/iron-menubar-behavior.js';\nimport {IronSelectableBehavior} from '@polymer/iron-selector/iron-selectable.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design: [Radio\nbutton](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)\n\n`paper-radio-group` allows user to select at most one radio button from a set.\nChecking one radio button that belongs to a radio group unchecks any\npreviously checked radio button within the same group. Use\n`selected` to get or set the selected radio button.\n\nThe <paper-radio-buttons> inside the group must have the `name` attribute\nset.\n\nExample:\n\n    <paper-radio-group selected=\"small\">\n      <paper-radio-button name=\"small\">Small</paper-radio-button>\n      <paper-radio-button name=\"medium\">Medium</paper-radio-button>\n      <paper-radio-button name=\"large\">Large</paper-radio-button>\n    </paper-radio-group>\n\nRadio-button-groups can be made optional, and allow zero buttons to be selected:\n\n    <paper-radio-group selected=\"small\" allow-empty-selection>\n      <paper-radio-button name=\"small\">Small</paper-radio-button>\n      <paper-radio-button name=\"medium\">Medium</paper-radio-button>\n      <paper-radio-button name=\"large\">Large</paper-radio-button>\n    </paper-radio-group>\n\nSee <a href=\"paper-radio-button\">paper-radio-button</a> for more\ninformation about `paper-radio-button`.\n\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-radio-group-item-padding` | The padding of the item | `12px`\n\n@group Paper Elements\n@element paper-radio-group\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n      }\n\n      :host ::slotted(*) {\n        padding: var(--paper-radio-group-item-padding, 12px);\n      }\n    </style>\n\n    <slot></slot>\n`,\n\n  is: 'paper-radio-group',\n  behaviors: [IronMenubarBehavior],\n\n  /** @private */\n  hostAttributes: {\n    role: 'radiogroup',\n  },\n\n  properties: {\n    /**\n     * Fired when the radio group selection changes.\n     *\n     * @event paper-radio-group-changed\n     */\n\n    /**\n     * Overriden from Polymer.IronSelectableBehavior\n     */\n    attrForSelected: {type: String, value: 'name'},\n\n    /**\n     * Overriden from Polymer.IronSelectableBehavior\n     */\n    selectedAttribute: {type: String, value: 'checked'},\n\n    /**\n     * Overriden from Polymer.IronSelectableBehavior\n     */\n    selectable: {type: String, value: 'paper-radio-button'},\n\n    /**\n     * If true, radio-buttons can be deselected\n     */\n    allowEmptySelection: {type: Boolean, value: false}\n  },\n\n  /**\n   * Selects the given value.\n   */\n  select: function(value) {\n    var newItem = this._valueToItem(value);\n    if (newItem && newItem.hasAttribute('disabled')) {\n      return;\n    }\n\n    if (this.selected) {\n      var oldItem = this._valueToItem(this.selected);\n\n      if (this.selected == value) {\n        // If deselecting is allowed we'll have to apply an empty selection.\n        // Otherwise, we should force the selection to stay and make this\n        // action a no-op.\n        if (this.allowEmptySelection) {\n          value = '';\n        } else {\n          if (oldItem)\n            oldItem.checked = true;\n          return;\n        }\n      }\n\n      if (oldItem)\n        oldItem.checked = false;\n    }\n\n    IronSelectableBehavior.select.apply(this, [value]);\n    this.fire('paper-radio-group-changed');\n  },\n\n  _activateFocusedItem: function() {\n    this._itemActivate(this._valueForItem(this.focusedItem), this.focusedItem);\n  },\n\n  _onUpKey: function(event) {\n    this._focusPrevious();\n    event.preventDefault();\n    this._activateFocusedItem();\n  },\n\n  _onDownKey: function(event) {\n    this._focusNext();\n    event.preventDefault();\n    this._activateFocusedItem();\n  },\n\n  _onLeftKey: function(event) {\n    IronMenubarBehaviorImpl._onLeftKey.apply(this, arguments);\n    this._activateFocusedItem();\n  },\n\n  _onRightKey: function(event) {\n    IronMenubarBehaviorImpl._onRightKey.apply(this, arguments);\n    this._activateFocusedItem();\n  }\n});\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\n\r\ninterface IUser {\r\n  firstName: string,\r\n  lastName: string,\r\n  emailAddress: string,\r\n  department?: string,\r\n  phone?: string\r\n  id?: string,\r\n  company?: string,\r\n  locale?: string,\r\n  given_name?: string,\r\n  phone_number?: string,\r\n  family_name?: string,\r\n  role?: string,\r\n  email?: string,\r\n  user_id?: string,\r\n\r\n}\r\n\r\ninterface INetCfg {\r\n  static: INetCfgEnoConfiguration[],\r\n  check: INetCfgCheck[],\r\n  additionalInfo?: INetCfgAdditionalInfo,\r\n  disable: INetCfgEnoConfiguration[],\r\n  ntp?: Array<string>,\r\n  dhcp?: INetCfgEnoConfiguration[],\r\n  proxies?: INetCfgProxies\r\n}\r\n\r\ninterface INetCfgProxies {\r\n  proxyHttps?: string,\r\n  proxyHttp?: string\r\n}\r\n\r\ninterface INetCfgEnoConfiguration {\r\n  interface: string,\r\n  address?: string,\r\n  netmask?: string,\r\n  gateway?: string,\r\n  dns?: string\r\n}\r\n\r\ninterface INetCfgCheck {\r\n  type: string,\r\n  value: string\r\n}\r\n\r\ninterface INetCfgAdditionalInfo {\r\n  companyName: string,\r\n  machineIdentifier: string,\r\n  machineName: string,\r\n  users?: IUser[]\r\n}\r\n\r\nenum EErrorMessages {\r\n  noUserPresent               = 'Please add at least one user account to be created',\r\n  notAllFieldsFilled          = 'Please enter the necessary information in all the red marked fields',\r\n  noValidMachineSwIdentifier  = 'The SW machine identifier is not present in the URL or not valid.',\r\n  noValidIpAddress            = 'No valid IP Address (IPv4)',\r\n  noValidUserData             = 'User data is invalid',\r\n  iotGatewayIpSameAsGateway   = 'The IoT Gateway IP address must not be identical with the Gateway IP address',\r\n  iotGatewayIpSameAsSubnet    = 'The IoT Gateway IP address must not be identical with the Subnet-Mask'\r\n}\r\n\r\nexport {\r\n  INetCfg,\r\n  IUser,\r\n  EErrorMessages\r\n};\r\n","/**\r\n * Copyright (c) 2021 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 2.0.0\r\n **/\r\nimport { css, CSSResult, customElement, html, LitElement, TemplateResult } from 'lit-element';\r\n\r\n\r\n@customElement('ld-firewall-configuration')\r\nexport class LdFirewallConfiguration extends LitElement {\r\n\r\n  // --------------------------------------------------------------------------------------\r\n  static get styles(): CSSResult {\r\n    return css`\r\n      :host {\r\n        display: block;\r\n      }\r\n      \r\n      table {\r\n        width: 100%;\r\n      }\r\n      \r\n      thead tr th {\r\n        padding: 10px;\r\n        font-size: 1.2em;\r\n      }\r\n      \r\n      thead tr,\r\n      tbody tr:nth-child(even) {\r\n        background-color: #EFEFEF;\r\n      }\r\n      \r\n      tbody tr td {\r\n        padding: 5px 10px;\r\n      }\r\n      .single-row{\r\n        padding-top: 12px; padding-bottom: 13px;\r\n      }\r\n    `;\r\n  }\r\n\r\n  // --------------------------------------------------------------------------------------\r\n  render(): TemplateResult {\r\n\r\n    return html`\r\n      <table>\r\n        <thead>\r\n          <tr>\r\n            <th>Address</th>\r\n            <th>TCP</th>\r\n            <th>UDP</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>sns.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>ssm.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td class=\"single-row\"><strong>iot.eu-central-1.amazonaws.com</strong><br />&nbsp;<strong>*.iot.eu-central-1.amazonaws.com</strong></td>\r\n          <td>443<br>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td class=\"single-row\"><strong>s3.eu-central-1.amazonaws.com</strong><br />&nbsp;<strong>*.s3.eu-central-1.amazonaws.com</strong></td>\r\n          <td>443<br>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>ec2messages.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>sts.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>ssmmessages.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>monitoring.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>logs.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>greengrass.eu-central-1.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>iam.amazonaws.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>www.amazontrust.com</strong><br />&nbsp;</td>\r\n          <td>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>*.sw-machines.io</strong><br />&nbsp;</td>\r\n          <td>443<br>443</td>\r\n          <td>-</td>\r\n        </tr>\r\n        <tr>\r\n          <td><br />&nbsp;<strong>ubuntu.com</strong><br />&nbsp;</td>\r\n          <td>80</td>\r\n          <td>123</td>\r\n        </tr>\r\n        <tr>\r\n          <td class=\"single-row\"><strong>*.teamviewer.com</strong><br /></td>\r\n          <td>443<br>5938<br>80</td>\r\n          <td>-</td>\r\n        </tr>\r\n        </tbody>\r\n      </table>\r\n    `;\r\n\r\n  }\r\n\r\n}\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\nimport { css } from 'lit-element';\r\nimport { displayFlex, horizontal, wrap } from 'lit-flexbox-literals';\r\nexport const LdHeaderStyles = css `\r\n    :host {\r\n        display: block;\r\n    }\r\n\r\n    .detail-container {\r\n        width: 100%;\r\n        height: auto;\r\n        padding: 0;\r\n        margin: 0px 0 20px 0;\r\n        background-color: #FFFFFF;\r\n    }\r\n\r\n    .detail-header-container {\r\n        height: auto;\r\n        width: 100%;\r\n        ${displayFlex}\r\n        ${horizontal}\r\n        ${wrap}\r\n    }\r\n\r\n    .detail-header {\r\n        width: 90%;\r\n    }\r\n\r\n    .detail-header h2 {\r\n        margin-left: 25px;\r\n        width: 90%;\r\n        text-transform: uppercase;\r\n        overflow: hidden;\r\n        text-overflow: ellipsis;\r\n        white-space: nowrap;\r\n        color: #000000;\r\n    }\r\n\r\n    .detail-header h2::before {\r\n        content: \"/ \";\r\n        color: #E4002B;\r\n    }\r\n\r\n\r\n    .detail-header h3 {\r\n        text-transform: uppercase;\r\n        font-size: 18px;\r\n        margin-left: 15px;\r\n        margin-top: 10px;\r\n        margin-bottom: 10px;\r\n        color: #142231;\r\n    }\r\n\r\n    .detail-header h3::before {\r\n        content: \"/ \";\r\n        font-weight: 800;\r\n        color: #E4002B;\r\n    }\r\n`;\r\nexport default LdHeaderStyles;\r\n//# sourceMappingURL=styles.js.map\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\n\r\nimport { customElement, html, LitElement, property, TemplateResult } from 'lit-element';\r\nimport { LdHeaderStyles }                                            from './styles';\r\n\r\n\r\n@customElement('ld-header')\r\nexport class LdHeader extends LitElement {\r\n\r\n  // --------------------------------------------------------------------------------------\r\n  @property({ type: String, hasChanged: () => true }) headline: string = '';\r\n\r\n  // --------------------------------------------------------------------------------------\r\n  static get styles() {\r\n    return [LdHeaderStyles];\r\n  }\r\n\r\n  /**\r\n   * Renders the component's DOM\r\n   *\r\n   * @returns {TemplateResult}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  render(): TemplateResult {\r\n    return html`\r\n      <div class='detail-container layout vertical wrap'>\r\n        <div class='detail-header-container'>\r\n          <div class='detail-header'>\r\n            <h3>${this.headline}</h3>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    `;\r\n  }\r\n}\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\nimport { css } from 'lit-element';\r\n\r\n\r\nexport const LdUserInputStyles = css`\r\n  :host {\r\n    display: block;\r\n  }\r\n  .netcfg-user-line-item {\r\n    display: inline-block;\r\n    width: 19%;\r\n    margin: 0;\r\n  }\r\n  .netcfg-user-line-item-small {\r\n    width: auto;\r\n  }\r\n  .cursor-pointer {\r\n    cursor: pointer;\r\n  }\r\n`;\r\n\r\nexport default LdUserInputStyles;\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\n\r\nimport {\r\n  CSSResultArray,\r\n  customElement,\r\n  html,\r\n  internalProperty,\r\n  LitElement,\r\n  property,\r\n  query,\r\n  TemplateResult\r\n}                            from 'lit-element';\r\nimport { PaperInputElement } from '@polymer/paper-input/paper-input';\r\nimport validator             from 'validator/es';\r\nimport '@polymer/iron-icons/iron-icons';\r\nimport '@polymer/iron-icon/iron-icon';\r\nimport LdUserInputStyles     from './ld-userinput-styles';\r\n\r\n\r\n@customElement('ld-userinput-line')\r\nexport class LdUserInputLine extends LitElement {\r\n\r\n  @property() id: string                                                 = '';\r\n  @property({ type: Boolean, hasChanged: () => true }) disabled: boolean = false;\r\n\r\n  @internalProperty() _alreadyFired: boolean = false;\r\n\r\n  /* form field queries */\r\n  @query('#inputDepartment') formFieldDepartment!: PaperInputElement;\r\n  @query('#inputFirstName') formFieldFirstName!: PaperInputElement;\r\n  @query('#inputLastName') formFieldLastName!: PaperInputElement;\r\n  @query('#inputEmail') formFieldEmail!: PaperInputElement;\r\n  @query('#inputPhone') formFieldPhone!: PaperInputElement;\r\n\r\n  // --------------------------------------------------------------------------------------\r\n  static get styles(): CSSResultArray {\r\n    return [LdUserInputStyles];\r\n  }\r\n\r\n  /**\r\n   * Renders the component's DOM\r\n   *\r\n   * @returns {TemplateResult}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  render(): TemplateResult {\r\n    return html`\r\n      <div class='netcfg-user-line'>\r\n        <div class='netcfg-user-line-item'><paper-input ?disabled=\"${this.disabled}\" data-attr=\"department\" id=\"inputDepartment\" label=\"Department (opt.)\"></paper-input></div>\r\n        <div class='netcfg-user-line-item'><paper-input ?disabled=\"${this.disabled}\" data-attr=\"firstname\" pattern=\"^([\\\\\\D\\\\\\s]*)$\" auto-validate error-message=\"Enter valid Name\" id=\"inputFirstName\" @value-changed=\"${() => this._onInputAnything()}\" label=\"First Name\"></paper-input></div>\r\n        <div class='netcfg-user-line-item'><paper-input ?disabled=\"${this.disabled}\" data-attr=\"lastname\" pattern=\"^([\\\\\\D\\\\\\s]*)$\" auto-validate error-message=\"Enter valid Name\" id=\"inputLastName\" @value-changed=\"${() => this._onInputAnything()}\" label=\"Last Name\"></paper-input></div>\r\n        <div class='netcfg-user-line-item'><paper-input ?disabled=\"${this.disabled}\" type=\"email\" data-attr=\"email\" auto-validate error-message=\"Enter valid E-Mail\" id=\"inputEmail\" @value-changed=\"${() => this._onInputAnything()}\" label=\"E-Mail\"></paper-input></div>\r\n        <div class='netcfg-user-line-item'><paper-input ?disabled=\"${this.disabled}\" data-attr=\"phone\" id=\"inputPhone\" label=\"Phone (opt.)\"></paper-input></div>\r\n        <div class='netcfg-user-line-item netcfg-user-line-item-small cursor-pointer' @click=\"${() => this._onRemoveLineClick()}\" title=\"Remove this line\"><iron-icon icon=\"icons:clear\"></iron-icon></div>\r\n      </div>\r\n    `;\r\n  }\r\n\r\n  /**\r\n   * Handles inputs to any of the non-optional fields. If all mandatory fields have content,\r\n   * throw an event to add a new user-line (handled by parent component)\r\n   *\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _onInputAnything(): void {\r\n    if (this.formFieldFirstName.value != null && !validator.isEmpty(this.formFieldFirstName.value) &&\r\n      this.formFieldLastName.value != null && !validator.isEmpty(this.formFieldLastName.value) &&\r\n      this.formFieldEmail.value != null && !validator.isEmpty(this.formFieldEmail.value) &&\r\n      !this._alreadyFired) {\r\n      this.dispatchEvent(new Event('add-user-line'));\r\n      this._alreadyFired = !this._alreadyFired;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handles what shoud happen if the cross-mark (remove) is clicked. This throws a CustomEvent\r\n   * to remove this line (no further checks here).\r\n   *\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _onRemoveLineClick(): void {\r\n    this.dispatchEvent(new CustomEvent('remove-user-line', { detail: { id: this.id } }));\r\n  }\r\n\r\n}\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\n\r\nimport { customElement, html, LitElement, property, query, TemplateResult } from 'lit-element';\r\nimport './ld-userinput-line';\r\n\r\n\r\n@customElement('ld-userinput')\r\nexport class LdUserInput extends LitElement {\r\n\r\n  @property({ type: Boolean, hasChanged: () => true }) disabled: boolean = false;\r\n\r\n  @query('#netcfg-user-lines') _userLines!: HTMLDivElement;\r\n\r\n  /**\r\n   * Renders the component's DOM\r\n   *\r\n   * @returns {TemplateResult}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  render(): TemplateResult {\r\n    return html`\r\n      <div id='netcfg-user-lines'>\r\n        <ld-userinput-line ?disabled=\"${this.disabled}\" id=\"${LdUserInput._createUniqueId()}\" @add-user-line=\"${() => this._addUserLine()}\" @remove-user-line=\"${(evt: CustomEvent) => this._onRemoveUserLineEventCaught(evt)}\"></ld-userinput-line>\r\n      </div>\r\n    `;\r\n  }\r\n\r\n  /**\r\n   * Handles what should happen if the 'add-user-line' event is triggered.\r\n   * This creates a new custom Element `<ld-userinput-line></ld-user-input-line>` and\r\n   * attaches the corresponding event handler (itself).\r\n   *\r\n   * @protected\r\n   * @event LdUserInput#add-user-line\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _addUserLine(): void {\r\n    const _newUserInputLine = document.createElement('ld-userinput-line');\r\n    _newUserInputLine.setAttribute('id', LdUserInput._createUniqueId());\r\n    _newUserInputLine.addEventListener('add-user-line', () => this._addUserLine());\r\n    // @ts-ignore\r\n    _newUserInputLine.addEventListener('remove-user-line', (evt: CustomEvent) => this._onRemoveUserLineEventCaught(evt));\r\n    this._userLines.appendChild(_newUserInputLine);\r\n  }\r\n\r\n  /**\r\n   * Handles what should happen if the 'remove-user-line' event is triggered.\r\n   * This removes the custom Element `<ld-userinput-line></ld-user-input-line>`,\r\n   * but only if there are more than one line already.\r\n   *\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _onRemoveUserLineEventCaught(evt: CustomEvent): void {\r\n    if (this.shadowRoot!.querySelectorAll('ld-userinput-line').length > 1) {\r\n      this.shadowRoot!.querySelector(`#${evt.detail.id}`)!.remove();\r\n      // if removed user line is last, then automagically add a new one\r\n      if (this.shadowRoot!.querySelectorAll('ld-userinput-line').length == 1) {\r\n        this._addUserLine();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Creates an (almost) unique identifier for each new `<ld-userinput-line>` custom Element\r\n   * to access it by it's id.\r\n   * SonarQube treats the return (`Math.random()`) as security Hotspot, so we're adding\r\n   * the // NOSONAR comment to let SQ ignore it (it's not security relevant for this app).\r\n   *\r\n   * @private\r\n   * @returns {string}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private static _createUniqueId(): string {\r\n    return '_' + Math.random().toString(36).substr(2, 9) + '_'; // NOSONAR\r\n  }\r\n\r\n}\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\nimport { css } from 'lit-element';\r\nexport const LdApplicationStyles = css `\r\n  :host {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin: 0;\r\n    padding: 0;\r\n    min-height: 100%;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: stretch;\r\n    font-family: Calibri, Roboto, Helvetica, sans-serif;\r\n  }\r\n\r\n  .netcfg-grid-wrapper {\r\n    width: 100%;\r\n    display: grid;\r\n    grid-template-columns: repeat(3, 1fr);\r\n    grid-template-rows: 1fr auto auto;\r\n    grid-column-gap: 5px;\r\n    grid-row-gap: 5px;\r\n    grid-template-areas: \r\n      \"NetCfgGridItemTop NetCfgGridItemTop NetCfgGridItemTop\"\r\n      \"NetCfgGridItemLeft NetCfgGridItemRight NetCfgGridItemRight\"\r\n      \"NetCfgGridItemBottomLeft NetCfgGridItemBottom NetCfgGridItemBottom\"\r\n  }\r\n\r\n  .netcfg-grid-top {\r\n    grid-area: NetCfgGridItemTop;\r\n  }\r\n\r\n  .netcfg-grid-left {\r\n    background-color: #FFFFFF;\r\n    grid-area: NetCfgGridItemLeft;\r\n  }\r\n\r\n  .netcfg-grid-right {\r\n    background-color: #FFFFFF;\r\n    grid-area: NetCfgGridItemRight;\r\n  }\r\n\r\n  .netcfg-grid-bottom {\r\n    grid-area: NetCfgGridItemBottom;\r\n  }\r\n\r\n  .netcfg-grid-bottom-left {\r\n    grid-area: NetCfgGridItemBottomLeft;\r\n  }\r\n\r\n  @media only screen and (max-width: 1024px) {\r\n    .netcfg-grid-wrapper {\r\n      grid-template-columns: repeat(1, 1fr);\r\n      grid-template-rows: 1fr auto auto auto;\r\n      grid-auto-flow: column;\r\n      grid-template-areas: \r\n        \"NetCfgGridItemTop\"\r\n        \"NetCfgGridItemLeft\"\r\n        \"NetCfgGridItemRight\"\r\n        \"NetCfgGridItemBottomLeft\"\r\n        \"NetCfgGridItemBottom\"\r\n    }\r\n  }\r\n\r\n  .page-outro {\r\n    text-align: center;\r\n  }\r\n\r\n  .page-firewall-configuration-box {\r\n    text-align: left;\r\n    background-color: #FFFFFF;\r\n    color: #000000;\r\n  }\r\n\r\n  .page-firewall-configuration-box ld-header {\r\n    margin-bottom: -15px;\r\n  }\r\n\r\n  ld-firewall-configuration {\r\n    padding: 0 25px 25px 25px;\r\n  }\r\n\r\n  .grid-container {\r\n    font-size: 13px;\r\n    background-color: #FFFFFF;\r\n    padding: 25px;\r\n    color: #000000;\r\n  }\r\n\r\n  .no-top-padding {\r\n    padding-top: 0;\r\n  }\r\n\r\n  #networkTypeSelectionGroup {\r\n    margin-top: 25px;\r\n  }\r\n\r\n  .error-wrapper {\r\n    color: #b40000;\r\n    border: 1px #b40000 solid;\r\n    background-color: #ffbdbd;\r\n    padding: 25px;\r\n    border-radius: 4px;\r\n    margin-bottom: 25px;\r\n    text-align: left;\r\n  }\r\n\r\n  #ntpWarning {\r\n    display: none;\r\n    margin-top: 12px;\r\n  }\r\n\r\n  paper-input {\r\n    display: inline-block;\r\n    width: 94%;\r\n  }\r\n\r\n  iron-icon {\r\n    display: inline-block;\r\n    width: 5%;\r\n  }\r\n\r\n  iron-icon#contactPersonIcon {\r\n    display: block;\r\n    width: 100px;\r\n    height: 100px;\r\n    cursor: default;\r\n  }\r\n\r\n  .contact-grid-wrapper {\r\n    width: 75%;\r\n    display: grid;\r\n    grid-template-columns: 0.3fr 1fr 1fr;\r\n    grid-template-rows: auto;\r\n    grid-column-gap: 25px;\r\n    grid-row-gap: 25px;\r\n    grid-template-areas: \r\n      \"ContactGridItemTopLeft ContactGridItemTopMiddle ContactGridItemTopMiddle\"\r\n      \"ContactGridItemLeft ContactGridItemMiddle ContactGridItemRight\"\r\n  }\r\n\r\n\r\n\r\n  .contact-grid-top-left {\r\n    grid-area: ContactGridItemTopLeft;\r\n    text-align: left;\r\n  }\r\n\r\n  .contact-grid-top-middle {\r\n    grid-area: ContactGridItemTopMiddle;\r\n    text-align: left;\r\n  }\r\n\r\n  .contact-grid-left {\r\n    grid-area: ContactGridItemLeft;\r\n    text-align: center;\r\n    margin: 0 auto;\r\n  }\r\n\r\n  .contact-grid-middle {\r\n    grid-area: ContactGridItemMiddle;\r\n  }\r\n\r\n  .contact-grid-right {\r\n    grid-area: ContactGridItemRight;\r\n  }\r\n\r\n  .contact-circle-outer {\r\n    display: inline-block;\r\n    line-height: 0px;\r\n    border-radius: 50%;\r\n    border: 1px solid #000;\r\n    font-size: 18px;\r\n    font-weight: bold;\r\n  }\r\n\r\n  .contact-circle-outer span {\r\n    display: inline-block;\r\n    padding-top: 50%;\r\n    padding-bottom: 50%;\r\n    margin-left: 8px;\r\n    margin-right: 8px;\r\n  }\r\n\r\n  .contact-middle-wrapper {\r\n    clear: both;\r\n    height: 30px;\r\n  }\r\n\r\n  .contact-middle-number {\r\n    float: left;\r\n    width: 35px;\r\n  }\r\n\r\n  .contact-middle-content {\r\n    margin-left: 40px;\r\n    padding-top: 3px;\r\n  }\r\n\r\n\r\n  paper-button {\r\n      margin: 12px 0px;\r\n      background-color: rgb(250, 250, 250);\r\n      color: rgb(232, 28, 61);\r\n      font-weight: bold;\r\n      padding-inline: 20px;\r\n  }\r\n\r\n  paper-dialog {\r\n    padding: 15px;\r\n  }\r\n\r\n  .warning-wrapper {\r\n    background-color: #f9c791;\r\n    border: 1px #fd8300 solid;\r\n    padding: 5px;\r\n    border-radius: 4px;\r\n  }\r\n\r\n  app-header {\r\n    height: 64px;\r\n    background-color: rgba(255, 255, 255, 1);\r\n    color: rgba(51, 51, 51, 1);\r\n    box-shadow: inset 0px 5px 6px -3px rgba(0, 0, 0, 0.4);\r\n    box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.4);\r\n  }\r\n\r\n  nav {\r\n    padding-top: 64px;\r\n    background-color: rgba(36, 58, 79, 1) !important;\r\n    background: rgba(36, 58, 79, 1);\r\n    width: 64px;\r\n    height: calc(100% - 64px);\r\n    position: fixed;\r\n    z-index: 10;\r\n  }\r\n\r\n  div[main-title] {\r\n    text-align: center;\r\n    font-weight: bold;\r\n    font-size: 18px;\r\n    line-height: 22px;\r\n    letter-spacing: 2.2px;\r\n    text-transform: uppercase;\r\n    margin-left: 10%;\r\n  }\r\n\r\n  section.sw-logo {\r\n    height: 64px;\r\n    width: 64px;\r\n    background-color: rgba(255, 255, 255, 1);\r\n  }\r\n\r\n  #sw-logo {\r\n    height: 28px;\r\n    width: 80px;\r\n    position: absolute;\r\n    top: 18px;\r\n    left: 70px;\r\n  }\r\n\r\n  footer {\r\n    display: -webkit-flex;\r\n    display: flex;\r\n    -ms-flex-direction: column;\r\n    -webkit-flex-direction: column;\r\n    flex-direction: column;\r\n    -ms-flex-align: end;\r\n    -webkit-align-items: flex-end;\r\n    align-items: flex-end;\r\n    font-size: 12px;\r\n    -ms-flex: 1 1 0px;\r\n    -webkit-flex: 1;\r\n    flex: 1;\r\n    -webkit-flex-basis: 0px;\r\n    flex-basis: 0px;\r\n    margin-right: 20px;\r\n    max-height: 50px;\r\n  }\r\n\r\n  ul {\r\n    display: block;\r\n    list-style-type: disc;\r\n    margin-block-start: 1em;\r\n    margin-block-end: 1em;\r\n    margin-inline-start: 0px;\r\n    margin-inline-end: 0px;\r\n    padding-inline-start: 40px;\r\n  }\r\n\r\n  footer ul {\r\n    margin: 16px 25px;\r\n    height: 20px;\r\n    list-style: none;\r\n  }\r\n\r\n  footer ul > li {\r\n    display: inline;\r\n    margin-right: 15px;\r\n  }\r\n\r\n  footer ul > li > a {\r\n    color: #949494;\r\n    text-decoration: none;\r\n  }\r\n\r\n  html, body {\r\n    width: 100%;\r\n    height: 100%;\r\n  }\r\n\r\n  main {\r\n    margin-left: 64px;\r\n    margin-top: 64px;\r\n    min-height: calc(100% - 170px);\r\n  }\r\n\r\n  main {\r\n    flex-grow: 1;\r\n  }\r\n\r\n  app-header, main, footer {\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .main-content-inner-wrapper {\r\n    width: calc(100% - 100px);\r\n    margin: 50px 50px 50px 50px;\r\n    margin-bottom: 0px;\r\n    height: 100%;\r\n  }\r\n\r\n  /* The sticky class is added to the header with JS when it reaches its scroll position */\r\n\r\n  .sticky {\r\n    position: fixed;\r\n    top: 0;\r\n    width: 100%;\r\n    z-index: 101;\r\n  }\r\n\r\n  @media only screen and (min-width: 600px) and (max-width: 1024px) {\r\n    .main-content-inner-wrapper {\r\n      margin: 50px 10px 10px 10px;\r\n    }\r\n  }\r\n\r\n  @media only screen and (min-width: 600px ) {\r\n    .contact-grid-wrapper {\r\n      width: 100%;\r\n      grid-template-columns: 1fr 1fr;\r\n      grid-template-rows: auto auto;\r\n      grid-auto-flow: column;\r\n      grid-template-areas: \r\n        \"ContactGridItemTopMiddle ContactGridItemTopMiddle\"\r\n        \"ContactGridItemLeft ContactGridItemLeft\"\r\n        \"ContactGridItemMiddle ContactGridItemMiddle\"\r\n        \"ContactGridItemRight ContactGridItemRight\"\r\n    }\r\n  }\r\n  @media only screen and (min-width: 1024px) {\r\n    .contact-grid-wrapper {\r\n      grid-template-columns: 0.3fr 1fr;\r\n      grid-template-rows: auto auto;\r\n      grid-auto-flow: column;\r\n      grid-template-areas: \r\n        \"ContactGridItemTopMiddle ContactGridItemTopMiddle\"\r\n        \"ContactGridItemLeft ContactGridItemMiddle\"\r\n        \"ContactGridItemRight ContactGridItemRight\"\r\n    }\r\n  }\r\n\r\n  @media only screen and (min-width: 1440px ) {\r\n    .contact-grid-wrapper {\r\n      width: 75%;\r\n      display: grid;\r\n      grid-template-columns: 0.3fr 1fr 1fr;\r\n      grid-template-rows: auto;\r\n      grid-column-gap: 25px;\r\n      grid-row-gap: 25px;\r\n      grid-template-areas: \r\n      \"ContactGridItemTopLeft ContactGridItemTopMiddle ContactGridItemTopMiddle\"\r\n      \"ContactGridItemLeft ContactGridItemMiddle ContactGridItemRight\"\r\n    }\r\n  }\r\n`;\r\nexport default LdApplicationStyles;\r\n//# sourceMappingURL=styles.js.map\r\n","/**\r\n * Copyright (c) 2020 Schwäbische Werkzeugmaschinen GmbH\r\n *\r\n * @author Sebastian Roming <sebastian.roming@sw-machines.com>\r\n * @since 0.0.1\r\n **/\r\n\r\n\r\nimport '@polymer/app-layout/app-header/app-header';\r\nimport '@polymer/app-layout/app-toolbar/app-toolbar';\r\nimport '@polymer/iron-icon/iron-icon';\r\nimport '@polymer/iron-icons/iron-icons';\r\nimport '@polymer/paper-button/paper-button';\r\nimport { PaperCheckboxElement }                                                                    from '@polymer/paper-checkbox';\r\nimport '@polymer/paper-checkbox/paper-checkbox';\r\nimport { PaperDialogElement }                                                                      from '@polymer/paper-dialog';\r\nimport '@polymer/paper-dialog/paper-dialog';\r\nimport { PaperInputElement }                                                                       from '@polymer/paper-input/paper-input';\r\nimport '@polymer/paper-input/paper-input';\r\nimport { PaperRadioButtonElement }                                                                 from '@polymer/paper-radio-button';\r\nimport '@polymer/paper-radio-button';\r\nimport '@polymer/paper-radio-group';\r\nimport { css, CSSResultArray, customElement, html, LitElement, property, query, state, TemplateResult } from 'lit-element';\r\nimport { repeat }                                                                                  from 'lit-html/directives/repeat';\r\nimport validator                                                                                   from 'validator/es';\r\nimport {\r\n  EErrorMessages,\r\n  INetCfg,\r\n  IUser\r\n}                                                                                                  from '../common/interfaces';\r\nimport './ld-firewall-configuration';\r\nimport './ld-header';\r\nimport './ld-userinput';\r\nimport LdApplicationStyles                                                                         from './styles';\r\n\r\n\r\n/**\r\n * @extends {LitElement}\r\n */\r\n@customElement('ld-netcfg')\r\nexport class LdNetcfgApplication extends LitElement {\r\n\r\n  @query('#networkTypeDhcp') networkTypeDhcp!: PaperRadioButtonElement;\r\n  @query('#networkTypeStatic') networkTypeStatic!: PaperRadioButtonElement;\r\n  @query('#staticIpConfiguration') staticIpConfigurationBlock!: HTMLElement;\r\n  @query('#ntpWarning') ntpWarning!: HTMLDivElement;\r\n  @query('#useProxyServer') useProxyServer!: HTMLDivElement;\r\n  /* form field queries */\r\n  @query('#companyName') formFieldCompanyName!: PaperInputElement;\r\n  @query('#swMachineNo') formFieldSwMachineNo!: PaperInputElement;\r\n  @query('#machineName') formFieldMachineName!: PaperInputElement;\r\n  @query('#useProxyServerCheckbox') useProxyServerCheckbox!: PaperCheckboxElement;\r\n  @query('#proxyHttps') formFieldProxyHttps!: PaperInputElement;\r\n  @query('#proxyHttp') formFieldProxyHttp!: PaperInputElement;\r\n  @query('#ntpServer') formFieldNtpServer!: PaperInputElement;\r\n  @query('#iotGatewayIp') formFieldIotGatewayIp!: PaperInputElement;\r\n  @query('#subnetMask') formFieldSubnetMask!: PaperInputElement;\r\n  @query('#gateway') formFieldGateway!: PaperInputElement;\r\n  @query('#dnsServer') formFieldDnsServer!: PaperInputElement;\r\n  @property({type: Boolean, reflect: true}) standalone: boolean = false;\r\n  @property({type: String}) picture: string                      = '';\r\n  @property({type: String}) logo: string                      = '';\r\n  @property({ type: Object, hasChanged: () => true }) _userInformation: IUser | null = null;\r\n  @state() protected _machineIdentifierSw: string | null         = null;\r\n  @state() protected _machineId: string | null         = null;\r\n  @state() protected _isFormBlocked: boolean                     = false;\r\n  @state() protected _activeErrors: { [index: string]: boolean } = {\r\n    noUserPresent: false,\r\n    notAllFieldsFilled: false,\r\n    noValidMachineSwIdentifier: false,\r\n    noValidUserData: false\r\n  };\r\n  @state() protected _activeErrorMessages: EErrorMessages[]      = [];\r\n  @state() protected _users: IUser[]                             = [];\r\n\r\n  /**\r\n   * @constructor\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  constructor() {\r\n    super();\r\n    const url = new URL(window.location.href);\r\n    let lastOfIt;\r\n    let _machineId;\r\n    let _machineName;\r\n\r\n    lastOfIt   = url.pathname.lastIndexOf('/');\r\n    _machineName = url.pathname.slice(lastOfIt + 1);\r\n    _machineId = url.searchParams.get('machineId')\r\n\r\n    if (validator.isEmpty(_machineName) || _machineName.length < 7) {\r\n      this._isFormBlocked = !this._isFormBlocked;\r\n      this.__toggleError('noValidMachineSwIdentifier', true);\r\n    }\r\n    if(_machineId != null && (validator.isEmpty(_machineId) || validator.isUUID(_machineId))){\r\n      this._machineId = _machineId;\r\n    }\r\n\r\n    this._machineIdentifierSw = _machineName;\r\n  }\r\n\r\n  /**\r\n   * @returns {CSSResultArray}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  static get styles(): CSSResultArray {\r\n    return [\r\n      LdApplicationStyles,\r\n      css`\r\n        :host {\r\n          width: auto;\r\n          height: auto;\r\n          margin: 0;\r\n          padding: 0;\r\n          min-height: 100%;\r\n          display: flex;\r\n          flex-direction: column;\r\n          align-items: stretch;\r\n          font-family: Calibri, Roboto, Helvetica, sans-serif;\r\n        }\r\n      `\r\n    ];\r\n  }\r\n\r\n  /**\r\n   * Renders the component's DOM\r\n   *\r\n   * @returns {TemplateResult}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  render(): TemplateResult {\r\n    let toRender = this.createNetCfgMarkup();\r\n    if (this.standalone) toRender = this.createShell(toRender);\r\n\r\n    return html`\r\n      ${toRender}\r\n    `;\r\n  }\r\n\r\n\r\n  createShell(netCfg: any) {\r\n    return html`\r\n    <app-header fixed condenses class='sticky'>\r\n        <app-toolbar sticky>\r\n          <!-- sw icon -->\r\n          <a id='sw-home-link'>\r\n            <iron-icon id='sw-logo' src='${this.logo}' slot='item-icon'></iron-icon>\r\n          </a>\r\n\r\n          <!-- page title -->\r\n          <div main-title>\r\n            SWCP Network Configuration Utility\r\n          </div>\r\n\r\n        </app-toolbar>\r\n      </app-header>\r\n\r\n      <!-- menu content -->\r\n      <nav></nav>\r\n      \r\n      <!-- main content -->\r\n      <main role='main' class='main-content'>\r\n        <div class='main-content-inner-wrapper'>\r\n          ${netCfg}\r\n        </div>\r\n      </main>\r\n\r\n      <!-- footer content -->\r\n      <footer>\r\n        <ul class='flex'>\r\n          <li><a href='https://sw-machines.com/' target='_blank'>SW Homepage</a></li>\r\n          <li><a href='https://sw-machines.com/en/imprint/' target='_blank'>Imprint</a></li>\r\n          <li><a href='https://sw-machines.com/en/gtc/' target='_blank'>GTCT / Standards</a></li>\r\n          <li><a href='mailto:lifedata@sw-machines.com'>Contact us</a></li>\r\n        </ul>\r\n      </footer>\r\n    `\r\n  }\r\n\r\n  createNetCfgMarkup() {\r\n    let saveButton = html``;\r\n    if(this._userInformation != null && this._machineId != null){\r\n      saveButton = html`<paper-button data-testid=\"save-button\" ?disabled=\"${this._isFormBlocked}\" @click=\"${() => this._checkForErrors(false)}\" raised>\r\n                          Save Netcfg\r\n                        </paper-button>`;\r\n    }\r\n\r\n    return html`\r\n      <div class='netcfg-grid-wrapper'>\r\n\r\n        <div class='netcfg-grid-top'>\r\n          <div class='grid-container'>\r\n\r\n            <div class='contact-grid-wrapper'>\r\n\r\n              <div class='contact-grid-top-left'></div>\r\n              <div class='contact-grid-top-middle'><strong>The following information is needed as part of the\r\n                correct SW CloudPlatform configuration for each SW machine.</strong></div>\r\n\r\n              <div class='contact-grid-left'>\r\n                <iron-icon id='contactPersonIcon' src=\"${this.picture}\" item-icon></iron-icon>\r\n              </div>\r\n              <div class='contact-grid-middle'>\r\n\r\n                <div class='contact-middle-wrapper'>\r\n                  <div class='contact-middle-number'>\r\n                    <div class='contact-circle-outer'><span>1</span></div>\r\n                  </div>\r\n                  <div class='contact-middle-content'>Please enter your network information below</div>\r\n                </div>\r\n                <div class='contact-middle-wrapper'>\r\n                  <div class='contact-middle-number'>\r\n                    <div class='contact-circle-outer'><span>2</span></div>\r\n                  </div>\r\n                  <div class='contact-middle-content'>Save the netcfg</div>\r\n                </div>\r\n                <div class='contact-middle-wrapper'>\r\n                  <div class='contact-middle-number'>\r\n                    <div class='contact-circle-outer'><span>3</span></div>\r\n                  </div>\r\n                  <div class='contact-middle-content'>The netcfg will automatically be provided to SW</a>\r\n                  </div>\r\n                </div>\r\n\r\n              </div>\r\n              <div class='contact-grid-right'>\r\n                <strong>For any questions, please contact us:</strong><br/>\r\n                E-Mail: <a href=\"mailto:lifedata@sw-machines.com\">lifedata@sw-machines.com</a><br/>\r\n                Phone: <a href=\"tel:+497402747574\">+49 7402 74-7574</a>\r\n              </div>\r\n            </div>\r\n\r\n          </div>\r\n        </div>\r\n\r\n        <div class='netcfg-grid-left'>\r\n          <ld-header headline=\"Network configuration\"></ld-header>\r\n          <div class='grid-container no-top-padding'>\r\n\r\n            <paper-input label=\"Your company\" ?disabled=\"${this._isFormBlocked}\" data-testid=\"company-name\" id=\"companyName\"\r\n                        error-message=\"Please enter your company name\"></paper-input>\r\n\r\n            <paper-input label=\"SW Machine No.\" ?disabled=\"${this._isFormBlocked}\" id=\"swMachineNo\"\r\n                        value=\"${this._machineIdentifierSw!}\" readonly></paper-input>\r\n\r\n            <paper-input label=\"Machine Name (opt.)\" ?disabled=\"${this._isFormBlocked}\"\r\n                        id=\"machineName\"></paper-input>\r\n            <iron-icon id=\"iconHelpMachineName\" icon=\"icons:help-outline\"\r\n                      @click=\"${() => this._openHelpDialog('#iconHelpMachineName')}\"></iron-icon>\r\n            <paper-dialog id=\"iconHelpMachineNameDialog\" horizontal-align=\"left\" vertical-align=\"middle\" no-overlap\r\n                          no-cancel-on-esc-key=\"true\">\r\n              <div><strong>Machine Name</strong><br/><em>optional</em><br/><br/>Considering your shopfloor layout,\r\n                you may refer to this<br/>machine more specifically, for example \"OP20\" or \"Machine 1\" etc.\r\n              </div>\r\n            </paper-dialog>\r\n\r\n            <paper-input style=\"width: 65%;display: inline-block;\" label=\"NTP Server (URL or IPv4)\"\r\n                        ?disabled=\"${this._isFormBlocked}\" data-testid=\"ntp-server\" id=\"ntpServer\"\r\n                        error-message=\"Please enter a valid NTP Server (URL or IPv4)\"></paper-input>\r\n            \r\n            <paper-radio-group id=\"networkTypeSelectionGroup\" aria-labelledby=\"networkType\" selected=\"static\"\r\n                              @paper-radio-group-changed=\"${() => this._networkTypeChanged()}\">\r\n              <label id=\"networkType\">Network Type</label>\r\n              <paper-radio-button ?disabled=\"${this._isFormBlocked}\" id=\"networkTypeStatic\" name=\"static\">Static\r\n                IP\r\n              </paper-radio-button>\r\n              or\r\n              <paper-radio-button ?disabled=\"${this._isFormBlocked}\" id=\"networkTypeDhcp\" name=\"dhcp\">DHCP\r\n              </paper-radio-button>\r\n            </paper-radio-group>\r\n\r\n            <div class='staticIpConfiguration' id='staticIpConfiguration' style='display: block;'>\r\n                        \r\n\r\n              <paper-input ?disabled=\"${this._isFormBlocked}\" label=\"IoT Gateway IP (IPv4)\" id=\"iotGatewayIp\"\r\n                          error-message=\"No valid IP Address (IPv4)\"></paper-input>\r\n              <iron-icon id=\"iconHelpIotGatewayIp\" icon=\"icons:help-outline\"\r\n                        @click=\"${() => this._openHelpDialog('#iconHelpIotGatewayIp')}\"></iron-icon>\r\n              <paper-dialog id=\"iconHelpIotGatewayIpDialog\" horizontal-align=\"left\" vertical-align=\"middle\"\r\n                            no-overlap no-cancel-on-esc-key=\"true\">\r\n                <div><strong>IoT Gateway IP</strong><br/><em>mandatory, if network is static</em><br/><br/>This is\r\n                  the IPC inside the machine cabinet and the key<br/>device for SW life data Service.<br/>Only valid\r\n                  IPv4 addresses are accepted.\r\n                </div>\r\n              </paper-dialog>\r\n\r\n              <paper-input ?disabled=\"${this._isFormBlocked}\" label=\"Subnet Mask (IPv4)\" id=\"subnetMask\"\r\n                          error-message=\"No valid Subnet Mask (IPv4)\"></paper-input>\r\n              \r\n              <paper-input ?disabled=\"${this._isFormBlocked}\" label=\"Company Gateway (IPv4)\" id=\"gateway\"\r\n                          error-message=\"Please enter your Network Gateway (IPv4)\"></paper-input>\r\n              <iron-icon id=\"iconHelpMachineIp\" icon=\"icons:help-outline\"\r\n                         @click=\"${() => this._openHelpDialog('#iconHelpMachineIp')}\"></iron-icon>\r\n              <paper-dialog id=\"iconHelpMachineIpDialog\" horizontal-align=\"left\" vertical-align=\"middle\" no-overlap\r\n                            no-cancel-on-esc-key=\"true\">\r\n                <div><strong>Gateway</strong><br/><em>mandatory, if network is static</em><br/><br/>This is the main IP Gateway address for the Customers Company Network\r\n                  <br/>(e.g. for remote service support).<br/>Only valid IPv4 addresses are accepted.\r\n                </div>\r\n              </paper-dialog>\r\n              \r\n              <paper-input ?disabled=\"${this._isFormBlocked}\" label=\"DNS Server (IPv4)\" id=\"dnsServer\"\r\n                          error-message=\"Please enter your DNS Server (IPv4)\"></paper-input>\r\n              <iron-icon id=\"iconHelpDnsServer\" icon=\"icons:help-outline\"\r\n                        @click=\"${() => this._openHelpDialog('#iconHelpDnsServer')}\"></iron-icon>\r\n              <paper-dialog id=\"iconHelpDnsServerDialog\" horizontal-align=\"left\" vertical-align=\"middle\" no-overlap\r\n                            no-cancel-on-esc-key=\"true\">\r\n                <div><strong>DNS Server</strong><br/><em>mandatory, if network is static</em><br/><br/>You can enter\r\n                  up to three DNS servers, separated with a comma.<br/>Only valid IPv4 addresses are accepted.\r\n                </div>\r\n              </paper-dialog>\r\n\r\n            </div>\r\n\r\n            <div>\r\n              <paper-checkbox ?disabled=\"${this._isFormBlocked}\" id=\"useProxyServerCheckbox\"\r\n                              style=\"margin-top: 15px;\" @checked-changed=\"${() => this._useProxyServerChanged()}\">\r\n                Use Proxy Server\r\n              </paper-checkbox>\r\n            </div>\r\n\r\n            <div id=\"useProxyServer\" style=\"display: none;\">\r\n              <paper-input label=\"Proxy HTTPS (opt.)\" ?disabled=\"${this._isFormBlocked}\"\r\n                          id=\"proxyHttps\"></paper-input>\r\n              <iron-icon id=\"iconHelpProxyHttps\" icon=\"icons:help-outline\"\r\n                        @click=\"${() => this._openHelpDialog('#iconHelpProxyHttps')}\"></iron-icon>\r\n              <paper-dialog id=\"iconHelpProxyHttpsDialog\" horizontal-align=\"left\" vertical-align=\"middle\" no-overlap\r\n                            no-cancel-on-esc-key=\"true\">\r\n                <div><strong>Proxy HTTPS</strong><br/><em>optional</em><br/><br/>Only needed if your network traffic\r\n                  runs through a proxy server.\r\n                </div>\r\n              </paper-dialog>\r\n\r\n              <paper-input label=\"Proxy HTTP (opt.)\" ?disabled=\"${this._isFormBlocked}\"\r\n                          id=\"proxyHttp\"></paper-input>\r\n              <iron-icon id=\"iconHelpProxyHttp\" icon=\"icons:help-outline\"\r\n                        @click=\"${() => this._openHelpDialog('#iconHelpProxyHttp')}\"></iron-icon>\r\n              <paper-dialog id=\"iconHelpProxyHttpDialog\" horizontal-align=\"left\" vertical-align=\"middle\" no-overlap\r\n                            no-cancel-on-esc-key=\"true\">\r\n                <div><strong>Proxy HTTP</strong><br/><em>optional</em><br/><br/>Only needed if your network traffic\r\n                  runs through a proxy server.\r\n                </div>\r\n              </paper-dialog>\r\n            </div>\r\n\r\n          </div>\r\n        </div>\r\n\r\n        <div class='netcfg-grid-right'>\r\n          <ld-header headline=\"User accounts\"></ld-header>\r\n          <div class='grid-container no-top-padding'>\r\n            If you need user accounts to be generated, please enter them here.\r\n\r\n            <ld-userinput data-testid=\"user-input\" ?disabled=\"${this._isFormBlocked}\"></ld-userinput>\r\n\r\n          </div>\r\n        </div>\r\n\r\n        <div class='netcfg-grid-bottom-left'>\r\n          <div class='page-firewall-configuration-box'>\r\n            <ld-header headline=\"Required Ports & Firewall Configuration\"></ld-header>\r\n            <ld-firewall-configuration></ld-firewall-configuration>\r\n          </div>\r\n        </div>\r\n\r\n        <div class='netcfg-grid-bottom'>\r\n          <div class='grid-container page-outro'>\r\n            ${this._displayErrorMessagesIfAvailable()}\r\n            ${saveButton}\r\n            <paper-button data-testid=\"validate-button\" ?disabled=\"${this._isFormBlocked}\" @click=\"${() => this._checkForErrors(true)}\" raised>\r\n              ${this._userInformation != null && this._machineId != null ? 'Save & Download netcfg.json' : 'Download netcfg.json'}\r\n            </paper-button>\r\n          </div>\r\n        </div>\r\n\r\n      </div>`\r\n  }\r\n\r\n  /**\r\n   * Opens the `<paper-dialog>` item corresponding to the question mark clicked\r\n   * with a helpful tooltip for filling out the information\r\n   *\r\n   * @param {string} openerElement\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _openHelpDialog(openerElement: string): void {\r\n    const _openerElement                     = <Element>this.shadowRoot!.querySelector(openerElement);\r\n    const _dialogElement: PaperDialogElement = <PaperDialogElement>this.shadowRoot!.querySelector(`${openerElement}Dialog`);\r\n    _dialogElement.positionTarget            = _openerElement;\r\n    _dialogElement.open();\r\n  }\r\n\r\n  /**\r\n   * Checks if any error messages are active and pushes them into a TemplateResult\r\n   *\r\n   * @protected\r\n   * @returns {TemplateResult[]}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _displayErrorMessagesIfAvailable(): TemplateResult[] {\r\n\r\n    let _errorMessageRenderedTemplate: TemplateResult[] = [];\r\n    const _activeErrorMessages: EErrorMessages[]        = [];\r\n    for (const error in this._activeErrors) {\r\n      if (this._activeErrors[error]) {\r\n        // @ts-ignore\r\n        _activeErrorMessages.push(EErrorMessages[error]);\r\n      }\r\n    }\r\n    if (_activeErrorMessages.length > 0) {\r\n      _errorMessageRenderedTemplate.push(html`\r\n        <div class=\"error-wrapper\"><strong>The check encountered the following\r\n          error(s):</strong><br/><br/>${repeat(_activeErrorMessages, message => html`- ${message}<br/>`)}\r\n        </div>`);\r\n    }\r\n\r\n    return _errorMessageRenderedTemplate;\r\n  }\r\n\r\n  /**\r\n   * is called when the {paper-checkbox-checked-changed} event is fired.\r\n   * This is caused by checking the checkbox next to 'Use Proxy Server' and\r\n   * opens up two input fields for proxy settings\r\n   *\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _useProxyServerChanged(): void {\r\n    this.useProxyServer.style.display = this.useProxyServerCheckbox.checked && this.useProxyServer.style.display === 'none' ? 'block' : 'none';\r\n  }\r\n\r\n  /**\r\n   * is called when the {paper-radio-group-changed} event is fired\r\n   *\r\n   * @protected\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _networkTypeChanged(): void {\r\n    this.staticIpConfigurationBlock.style.display = this.networkTypeStatic.checked ? 'block' : 'none';\r\n  }\r\n\r\n  /**\r\n   * Checks for Errors in the form when the 'check' button is pressed.\r\n   * These checks are performed:\r\n   * - Mandatory fields as described in SWCP-2006 have a value\r\n   * - IP-address-Fields have a valid IP v4/v6 IP address as value\r\n   * - IoT-Gateway IP address and SW Machine IP address do not match\r\n   * - At least one user is entered into the user info screen\r\n   * - If checkbox next to 'NTP Server' is checked, NTP Server is not a mandatory field\r\n   *   anymore\r\n   * - Up to three DNS server can be added, separated by comma\r\n   *\r\n   * @private\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  protected _checkForErrors(download: boolean): void {\r\n\r\n    let _errors: boolean[] = [];\r\n    _errors.push(this.formFieldCompanyName.invalid = validator.isEmpty(<string>this.formFieldCompanyName.value));\r\n    _errors.push(this.formFieldSwMachineNo.invalid = validator.isEmpty(<string>this.formFieldSwMachineNo.value));\r\n\r\n    _errors.push(this.formFieldNtpServer.invalid = validator.isEmpty(<string>this.formFieldNtpServer.value) && (!validator.isIP(<string>this.formFieldNtpServer.value, 4) || !validator.isURL(<string>this.formFieldNtpServer.value)));\r\n\r\n    /* if Network Type: Static is selected */\r\n    if (this.networkTypeStatic.checked) {\r\n      _errors.push(this.formFieldIotGatewayIp.invalid = !validator.isIP(<string>this.formFieldIotGatewayIp.value, 4));\r\n      _errors.push(this.formFieldSubnetMask.invalid = validator.isEmpty(<string>this.formFieldSubnetMask.value) || !validator.isIP(<string>this.formFieldSubnetMask.value, 4));\r\n      _errors.push(this.formFieldGateway.invalid = validator.isEmpty(<string>this.formFieldGateway.value) || !validator.isIP(<string>this.formFieldGateway.value, 4));\r\n\r\n      const _dnsServer: string[] = this.formFieldDnsServer.value!.split(',');\r\n      if (_dnsServer.length === 0 || _dnsServer.length > 3) {\r\n        _errors.push(this.formFieldDnsServer.invalid = true);\r\n      } else {\r\n        let _dnsServerErrors: boolean[] = [];\r\n        _dnsServer.forEach(dnsEntry => {\r\n          _dnsServerErrors.push(!validator.isIP(dnsEntry.trim()));\r\n        });\r\n        _dnsServerErrors = _dnsServerErrors.filter(e => e);\r\n        _errors.push(this.formFieldDnsServer.invalid = _dnsServerErrors.length > 0);\r\n      }\r\n\r\n      /* Show error if Machine IP == IoT Gateway IP */\r\n\r\n        if (validator.isEmpty(this.formFieldIotGatewayIp.value)) {\r\n          _errors.push(this.formFieldIotGatewayIp.invalid = true);\r\n          this.__toggleError('notAllFieldsFilled', true);\r\n          return;\r\n        } else {\r\n          this.__toggleError('notAllFieldsFilled', false);\r\n        }\r\n\r\n\r\n      /* Show error if IoT Gateway IP == Gateway IP */\r\n      if (this.formFieldIotGatewayIp.value == this.formFieldGateway.value) {\r\n\r\n        if (validator.isEmpty(this.formFieldIotGatewayIp.value)) {\r\n          _errors.push(this.formFieldIotGatewayIp.invalid = true);\r\n          this.__toggleError('notAllFieldsFilled', true);\r\n          return;\r\n        } else {\r\n          this.__toggleError('notAllFieldsFilled', false);\r\n        }\r\n\r\n        this.formFieldIotGatewayIp.errorMessage = EErrorMessages.iotGatewayIpSameAsGateway;\r\n        this.formFieldGateway.errorMessage      = EErrorMessages.iotGatewayIpSameAsGateway;\r\n        _errors.push(this.formFieldIotGatewayIp.invalid = this.formFieldIotGatewayIp.value == this.formFieldGateway.value);\r\n        _errors.push(this.formFieldGateway.invalid = this.formFieldIotGatewayIp.value == this.formFieldGateway.value);\r\n        this.__toggleError('iotGatewayIpSameAsGateway', true);\r\n      } else {\r\n        this.__toggleError('iotGatewayIpSameAsGateway', false);\r\n      }\r\n\r\n      /* Show error if IoT Gateway IP == Subnet Mask */\r\n      if (this.formFieldIotGatewayIp.value == this.formFieldSubnetMask.value) {\r\n\r\n        if (validator.isEmpty(this.formFieldIotGatewayIp.value)) {\r\n          _errors.push(this.formFieldIotGatewayIp.invalid = true);\r\n          this.__toggleError('notAllFieldsFilled', true);\r\n          return;\r\n        } else {\r\n          this.__toggleError('notAllFieldsFilled', false);\r\n        }\r\n\r\n        this.formFieldIotGatewayIp.errorMessage = EErrorMessages.iotGatewayIpSameAsSubnet;\r\n        this.formFieldSubnetMask.errorMessage   = EErrorMessages.iotGatewayIpSameAsSubnet;\r\n        _errors.push(this.formFieldIotGatewayIp.invalid = this.formFieldIotGatewayIp.value == this.formFieldSubnetMask.value);\r\n        _errors.push(this.formFieldSubnetMask.invalid = this.formFieldIotGatewayIp.value == this.formFieldSubnetMask.value);\r\n        this.__toggleError('iotGatewayIpSameAsSubnet', true);\r\n      } else {\r\n        this.__toggleError('iotGatewayIpSameAsSubnet', false);\r\n      }\r\n\r\n    }\r\n\r\n    _errors = _errors.filter(e => e);\r\n    this.__toggleError('notAllFieldsFilled', _errors.length > 0);\r\n    this.__fetchAllUserInfoData();\r\n\r\n    if (_errors.length === 0 && !this.__getActiveErrors() ) {\r\n      if(download){\r\n        this.__downloadFile();\r\n      }\r\n      if(this._userInformation != null && this._machineId != null) {\r\n        this.handleBtnClick('saveNetcfg')\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * This method retrieves the user information filled out in the form and creates a new\r\n   * users object to be stored in the netcfg.json later. If no user is present, an error\r\n   * is shown.\r\n   *\r\n   * @private\r\n   * @returns {void}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private __fetchAllUserInfoData(): void {\r\n    const _userInfoObjects: IUser[] = [];\r\n    let _userDataError: boolean     = false;\r\n\r\n    const _userInfoLines: NodeList = <NodeList>this.shadowRoot!.querySelector('ld-userinput')!.shadowRoot!.querySelectorAll('ld-userinput-line');\r\n    _userInfoLines.forEach((line: any) => {\r\n      if (line.shadowRoot!.querySelectorAll('paper-input').length === 0) {\r\n        return;\r\n      }\r\n\r\n      const firstName: string    = line.shadowRoot!.querySelector('paper-input[data-attr=\"firstname\"]').value.trim();\r\n      const lastName: string     = line.shadowRoot!.querySelector('paper-input[data-attr=\"lastname\"]').value.trim();\r\n      const emailAddress: string = line.shadowRoot!.querySelector('paper-input[data-attr=\"email\"]').value.trim();\r\n      const phone: string        = line.shadowRoot!.querySelector('paper-input[data-attr=\"phone\"]').value.trim();\r\n      const department: string   = line.shadowRoot!.querySelector('paper-input[data-attr=\"department\"]').value.trim();\r\n\r\n      if (!validator.isEmpty(firstName) && !validator.isEmpty(lastName) && !validator.isEmpty(emailAddress)) {\r\n        if (validator.isEmail(emailAddress, {require_tld: false})) {\r\n          const _newUserObject: IUser = {\r\n            firstName,\r\n            lastName,\r\n            emailAddress,\r\n            phone,\r\n            department\r\n          };\r\n          _userInfoObjects.push(_newUserObject);\r\n        } else {\r\n          line.shadowRoot!.querySelector('paper-input[data-attr=\"email\"]').invalid = true;\r\n          _userDataError                                                           = true;\r\n        }\r\n      } else {\r\n        if (validator.isEmpty(firstName) && validator.isEmpty(lastName) && validator.isEmpty(emailAddress)) {\r\n          return;\r\n        }\r\n        if (validator.isEmpty(firstName)) {\r\n          line.shadowRoot!.querySelector('paper-input[data-attr=\"firstname\"]').invalid = true;\r\n        }\r\n        if (validator.isEmpty(lastName)) {\r\n          line.shadowRoot!.querySelector('paper-input[data-attr=\"lastname\"]').invalid = true;\r\n        }\r\n        if (validator.isEmpty(emailAddress)) {\r\n          line.shadowRoot!.querySelector('paper-input[data-attr=\"email\"]').invalid = true;\r\n        }\r\n        _userDataError = true;\r\n      }\r\n    });\r\n\r\n    this.__toggleError('noValidUserData', _userDataError);\r\n\r\n    this._users = _userInfoObjects;\r\n  }\r\n\r\n  /**\r\n   * (De-)activates an error message that is stored in the `_activeErrors` property.\r\n   * Hint: to trigger a property update on changed object keys, we have to re-assign\r\n   * the complete object.\r\n   *\r\n   * @param {string} errorKey\r\n   * @param {boolean} errorValue\r\n   * @private\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private __toggleError(errorKey: string, errorValue: boolean): void {\r\n    this._activeErrors[errorKey] = errorValue;\r\n    this._activeErrors           = {...this._activeErrors};\r\n  }\r\n\r\n  /**\r\n   * Check if any errors are active in the global object and returns true/false\r\n   *\r\n   * @private\r\n   * @returns {boolean}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private __getActiveErrors(): boolean {\r\n    let amount = 0;\r\n    for (let item in this._activeErrors) {\r\n      if (this._activeErrors[item]) {\r\n        amount += 1;\r\n      }\r\n    }\r\n    return amount > 0;\r\n\r\n  }\r\n\r\n  /**\r\n   * Creates the 'netcfg' object that is later stored and downloaded as 'netcfg.json'\r\n   * Uses user selection for creation\r\n   *\r\n   * @private\r\n   * @returns {INetCfg}\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private __createJson(): INetCfg {\r\n\r\n    const netCfg: INetCfg = {\r\n      check: [\r\n        {\r\n          type: 'ip',\r\n          value: '192.168.214.1'\r\n        },\r\n        {\r\n          type: 'url',\r\n          value: 'https://login.prod.sw-machines.io'\r\n        }\r\n      ],\r\n      disable: [\r\n        {\r\n          interface: 'eno3'\r\n        }\r\n      ],\r\n      static: [\r\n        {\r\n          interface: 'eno2',\r\n          address: '192.168.214.224',\r\n          netmask: '255.255.255.0'\r\n        }\r\n      ]\r\n    };\r\n\r\n    if (this.networkTypeStatic.checked) {\r\n      netCfg.static.push({\r\n        interface: 'eno1',\r\n        address: this.formFieldIotGatewayIp.value!.trim(),\r\n        netmask: this.formFieldSubnetMask.value!.trim(),\r\n        gateway: this.formFieldGateway.value!.trim(),\r\n        dns: this.formFieldDnsServer.value!.trim().replace(/\\s/g, '')\r\n      });\r\n    } else {\r\n      netCfg.dhcp = [{\r\n        interface: 'eno1'\r\n      }];\r\n    }\r\n\r\n    if (!validator.isEmpty(this.formFieldProxyHttps.value) || !validator.isEmpty(this.formFieldProxyHttp.value)) {\r\n      netCfg.proxies = {\r\n        proxyHttps: this.formFieldProxyHttps.value!.trim(),\r\n        proxyHttp: this.formFieldProxyHttp.value!.trim()\r\n      };\r\n    }\r\n\r\n    netCfg.additionalInfo = {\r\n      companyName: this.formFieldCompanyName.value!.trim(),\r\n      machineName: this.formFieldMachineName.value!.trim(),\r\n      machineIdentifier: this.formFieldSwMachineNo.value!.trim()\r\n    };\r\n\r\n    if (this._users.length > 0) {\r\n      netCfg.additionalInfo.users = this._users;\r\n    }\r\n\r\n    return netCfg;\r\n  }\r\n\r\n  /**\r\n   * This methods downloads a file, per default called 'netcfg.json' with the contents of\r\n   * the object created in `__createJson()`.\r\n   * For downloading, a new anchor (`a`) element is created, injected into the DOM,\r\n   * automatically clicked and then removed.\r\n   *\r\n   * @param {string} filename\r\n   * @private\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  private __downloadFile(filename: string = 'netcfg.json'): void {\r\n    const _element = document.createElement('a');\r\n    _element.setAttribute('href', 'data:application/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(this.__createJson(), null, 2)));\r\n    _element.setAttribute('download', filename);\r\n    _element.style.display = 'none';\r\n    this.shadowRoot!.appendChild(_element);\r\n    _element.click();\r\n    this.shadowRoot!.removeChild(_element);\r\n  }\r\n\r\n\r\n  /**\r\n   *\r\n   * @param {string} btn\r\n   * @param {string} value\r\n   * @return void\r\n   */\r\n  // --------------------------------------------------------------------------------------\r\n  handleBtnClick(btn: string) {\r\n    if (btn) {\r\n      this.dispatchEvent(new CustomEvent(btn, {\r\n        detail: {\r\n          name: btn,\r\n          id: this._machineId,\r\n          json: encodeURIComponent(JSON.stringify(this.__createJson(), null, 2))\r\n        },\r\n      }));\r\n    }\r\n  }\r\n}\r\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronResizableBehavior} from '@polymer/iron-resizable-behavior/iron-resizable-behavior.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {animationFrame} from '@polymer/polymer/lib/utils/async.js';\nimport {Debouncer} from '@polymer/polymer/lib/utils/debounce.js';\nimport {enqueueDebouncer} from '@polymer/polymer/lib/utils/flush.js';\n\n/**\n * @polymerBehavior\n */\nexport const AppLayoutBehavior = [\n  IronResizableBehavior,\n  {\n\n    listeners: {\n      'app-reset-layout': '_appResetLayoutHandler',\n      'iron-resize': 'resetLayout'\n    },\n\n    attached: function() {\n      this.fire('app-reset-layout');\n    },\n\n    _appResetLayoutHandler: function(e) {\n      if (dom(e).path[0] === this) {\n        return;\n      }\n      this.resetLayout();\n      e.stopPropagation();\n    },\n\n    _updateLayoutStates: function() {\n      console.error('unimplemented');\n    },\n\n    /**\n     * Resets the layout. If you changed the size of this element via CSS\n     * you can notify the changes by either firing the `iron-resize` event\n     * or calling `resetLayout` directly.\n     *\n     * @method resetLayout\n     */\n    resetLayout: function() {\n      var self = this;\n      var cb = this._updateLayoutStates.bind(this);\n      this._layoutDebouncer =\n          Debouncer.debounce(this._layoutDebouncer, animationFrame, cb);\n      enqueueDebouncer(this._layoutDebouncer);\n      this._notifyDescendantResize();\n    },\n\n    _notifyLayoutChanged: function() {\n      var self = this;\n      // TODO: the event `app-reset-layout` can be fired synchronously\n      // as long as `_updateLayoutStates` waits for all the microtasks after\n      // rAF. E.g. requestAnimationFrame(setTimeOut())\n      requestAnimationFrame(function() {\n        self.fire('app-reset-layout');\n      });\n    },\n\n    _notifyDescendantResize: function() {\n      if (!this.isAttached) {\n        return;\n      }\n      this._interestedResizables.forEach(function(resizable) {\n        if (this.resizerShouldNotify(resizable)) {\n          this._notifyDescendant(resizable);\n        }\n      }, this);\n    }\n  }\n];\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nexport const _scrollEffects = {};\nexport let _scrollTimer = null;\n\nexport const scrollTimingFunction = function easeOutQuad(t, b, c, d) {\n  t /= d;\n  return -c * t * (t - 2) + b;\n};\n\n/**\n * Registers a scroll effect to be used in elements that implement the\n * `Polymer.AppScrollEffectsBehavior` behavior.\n *\n * @param {string} effectName The effect name.\n * @param {Object} effectDef The effect definition.\n */\nexport const registerEffect = function registerEffect(effectName, effectDef) {\n  if (_scrollEffects[effectName] != null) {\n    throw new Error('effect `' + effectName + '` is already registered.');\n  }\n  _scrollEffects[effectName] = effectDef;\n};\n\nexport const queryAllRoot = function(selector, root) {\n  var queue = [root];\n  var matches = [];\n\n  while (queue.length > 0) {\n    var node = queue.shift();\n    matches.push.apply(matches, node.querySelectorAll(selector));\n    for (var i = 0; node.children[i]; i++) {\n      if (node.children[i].shadowRoot) {\n        queue.push(node.children[i].shadowRoot);\n      }\n    }\n  }\n  return matches;\n};\n\n/**\n * Scrolls to a particular set of coordinates in a scroll target.\n * If the scroll target is not defined, then it would use the main document as\n * the target.\n *\n * To scroll in a smooth fashion, you can set the option `behavior: 'smooth'`.\n * e.g.\n *\n * ```js\n * Polymer.AppLayout.scroll({top: 0, behavior: 'smooth'});\n * ```\n *\n * To scroll in a silent mode, without notifying scroll changes to any\n * app-layout elements, you can set the option `behavior: 'silent'`. This is\n * particularly useful we you are using `app-header` and you desire to scroll to\n * the top of a scrolling region without running scroll effects. e.g.\n *\n * ```js\n * Polymer.AppLayout.scroll({top: 0, behavior: 'silent'});\n * ```\n *\n * @param {Object} options {top: Number, left: Number, behavior: String(smooth | silent)}\n */\nexport const scroll = function scroll(options) {\n  options = options || {};\n\n  var docEl = document.documentElement;\n  var target = options.target || docEl;\n  var hasNativeScrollBehavior =\n      'scrollBehavior' in target.style && target.scroll;\n  var scrollClassName = 'app-layout-silent-scroll';\n  var scrollTop = options.top || 0;\n  var scrollLeft = options.left || 0;\n  var scrollTo = target === docEl ? window.scrollTo :\n                                    function scrollTo(scrollLeft, scrollTop) {\n                                      target.scrollLeft = scrollLeft;\n                                      target.scrollTop = scrollTop;\n                                    };\n\n  if (options.behavior === 'smooth') {\n    if (hasNativeScrollBehavior) {\n      target.scroll(options);\n\n    } else {\n      var timingFn = scrollTimingFunction;\n      var startTime = Date.now();\n      var currentScrollTop =\n          target === docEl ? window.pageYOffset : target.scrollTop;\n      var currentScrollLeft =\n          target === docEl ? window.pageXOffset : target.scrollLeft;\n      var deltaScrollTop = scrollTop - currentScrollTop;\n      var deltaScrollLeft = scrollLeft - currentScrollLeft;\n      var duration = 300;\n      var updateFrame =\n          (function updateFrame() {\n            var now = Date.now();\n            var elapsedTime = now - startTime;\n\n            if (elapsedTime < duration) {\n              scrollTo(\n                  timingFn(\n                      elapsedTime,\n                      currentScrollLeft,\n                      deltaScrollLeft,\n                      duration),\n                  timingFn(\n                      elapsedTime, currentScrollTop, deltaScrollTop, duration));\n              requestAnimationFrame(updateFrame);\n            } else {\n              scrollTo(scrollLeft, scrollTop);\n            }\n          }).bind(this);\n\n      updateFrame();\n    }\n\n  } else if (options.behavior === 'silent') {\n    var headers = queryAllRoot('app-header', document.body);\n\n    headers.forEach(function(header) {\n      header.setAttribute('silent-scroll', '');\n    });\n\n    // Browsers keep the scroll momentum even if the bottom of the scrolling\n    // content was reached. This means that calling scroll({top: 0, behavior:\n    // 'silent'}) when the momentum is still going will result in more scroll\n    // events and thus scroll effects. This seems to only apply when using\n    // document scrolling. Therefore, when should we remove the class from the\n    // document element?\n\n    if (_scrollTimer) {\n      window.cancelAnimationFrame(_scrollTimer);\n    }\n\n    _scrollTimer = window.requestAnimationFrame(function() {\n      headers.forEach(function(header) {\n        header.removeAttribute('silent-scroll');\n      });\n      _scrollTimer = null;\n    });\n\n    scrollTo(scrollLeft, scrollTop);\n\n  } else {\n    scrollTo(scrollLeft, scrollTop);\n  }\n};\n\n/**\n * @interface\n * @extends {Polymer_LegacyElementMixin}\n */\nexport class ElementWithBackground {\n  /** @return {boolean} True if there's content below the current element */\n  isContentBelow() {\n  }\n\n\n  /** @return {boolean} true if the element is on screen */\n  isOnScreen() {\n  }\n\n  /**\n   * @param {string} title\n   * @return {?Element} Element in local dom by id.\n   */\n  _getDOMRef(title) {\n  }\n}\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronScrollTargetBehavior} from '@polymer/iron-scroll-target-behavior/iron-scroll-target-behavior.js';\nimport {_scrollEffects} from '../helpers/helpers.js';\n\n/**\n * `Polymer.AppScrollEffectsBehavior` provides an interface that allows an\n * element to use scrolls effects.\n *\n * ### Importing the app-layout effects\n *\n * app-layout provides a set of scroll effects that can be used by explicitly\n * importing `app-scroll-effects.js`:\n *\n * ```js\n * import '@polymer/app-layout/app-scroll-effects/app-scroll-effects.js';\n * ```\n *\n * The scroll effects can also be used by individually importing\n * `@polymer/app-layout/app-scroll-effects/effects/[effectName].js`. For\n * example:\n *\n * ```js\n * import '@polymer/app-layout/app-scroll-effects/effects/waterfall.js';\n * ```\n *\n * ### Consuming effects\n *\n * Effects can be consumed via the `effects` property. For example:\n *\n * ```html\n * <app-header effects=\"waterfall\"></app-header>\n * ```\n *\n * ### Creating scroll effects\n *\n * You may want to create a custom scroll effect if you need to modify the CSS\n * of an element based on the scroll position.\n *\n * A scroll effect definition is an object with `setUp()`, `tearDown()` and\n * `run()` functions.\n *\n * To register the effect, you can use\n * `Polymer.AppLayout.registerEffect(effectName, effectDef)` For example, let's\n * define an effect that resizes the header's logo:\n *\n * ```js\n * Polymer.AppLayout.registerEffect('resizable-logo', {\n *   setUp: function(config) {\n *     // the effect's config is passed to the setUp.\n *     this._fxResizeLogo = { logo: Polymer.dom(this).querySelector('[logo]') };\n *   },\n *\n *   run: function(progress) {\n *      // the progress of the effect\n *      this.transform('scale3d(' + progress + ', '+ progress +', 1)',\n * this._fxResizeLogo.logo);\n *   },\n *\n *   tearDown: function() {\n *      // clean up and reset of states\n *      delete this._fxResizeLogo;\n *   }\n * });\n * ```\n * Now, you can consume the effect:\n *\n * ```html\n * <app-header id=\"appHeader\" effects=\"resizable-logo\">\n *   <img logo src=\"logo.svg\">\n * </app-header>\n * ```\n *\n * ### Imperative API\n *\n * ```js\n * var logoEffect = appHeader.createEffect('resizable-logo', effectConfig);\n * // run the effect: logoEffect.run(progress);\n * // tear down the effect: logoEffect.tearDown();\n * ```\n *\n * ### Configuring effects\n *\n * For effects installed via the `effects` property, their configuration can be\n * set via the `effectsConfig` property. For example:\n *\n * ```html\n * <app-header effects=\"waterfall\"\n *   effects-config='{\"waterfall\": {\"startsAt\": 0, \"endsAt\": 0.5}}'>\n * </app-header>\n * ```\n *\n * All effects have a `startsAt` and `endsAt` config property. They specify at\n * what point the effect should start and end. This value goes from 0 to 1\n * inclusive.\n *\n * @polymerBehavior\n */\nexport const AppScrollEffectsBehavior = [\n  IronScrollTargetBehavior,\n  {\n\n    properties: {\n\n      /**\n       * A space-separated list of the effects names that will be triggered when\n       * the user scrolls. e.g. `waterfall parallax-background` installs the\n       * `waterfall` and `parallax-background`.\n       */\n      effects: {type: String},\n\n      /**\n       * An object that configurates the effects installed via the `effects`\n       * property. e.g.\n       * ```js\n       *  element.effectsConfig = {\n       *   \"blend-background\": {\n       *     \"startsAt\": 0.5\n       *   }\n       * };\n       * ```\n       * Every effect has at least two config properties: `startsAt` and\n       * `endsAt`. These properties indicate when the event should start and end\n       * respectively and relative to the overall element progress. So for\n       * example, if `blend-background` starts at `0.5`, the effect will only\n       * start once the current element reaches 0.5 of its progress. In this\n       * context, the progress is a value in the range of `[0, 1]` that\n       * indicates where this element is on the screen relative to the viewport.\n       */\n      effectsConfig: {\n        type: Object,\n        value: function() {\n          return {};\n        }\n      },\n\n      /**\n       * Disables CSS transitions and scroll effects on the element.\n       */\n      disabled: {type: Boolean, reflectToAttribute: true, value: false},\n\n      /**\n       * Allows to set a `scrollTop` threshold. When greater than 0,\n       * `thresholdTriggered` is true only when the scroll target's `scrollTop`\n       * has reached this value.\n       *\n       * For example, if `threshold = 100`, `thresholdTriggered` is true when\n       * the `scrollTop` is at least `100`.\n       */\n      threshold: {type: Number, value: 0},\n\n      /**\n       * True if the `scrollTop` threshold (set in `scrollTopThreshold`) has\n       * been reached.\n       */\n      thresholdTriggered: {\n        type: Boolean,\n        notify: true,\n        readOnly: true,\n        reflectToAttribute: true\n      }\n    },\n\n    observers: ['_effectsChanged(effects, effectsConfig, isAttached)'],\n\n    /**\n     * Updates the scroll state. This method should be overridden\n     * by the consumer of this behavior.\n     *\n     * @method _updateScrollState\n     * @param {number} scrollTop\n     */\n    _updateScrollState: function(scrollTop) {},\n\n    /**\n     * Returns true if the current element is on the screen.\n     * That is, visible in the current viewport. This method should be\n     * overridden by the consumer of this behavior.\n     *\n     * @method isOnScreen\n     * @return {boolean}\n     */\n    isOnScreen: function() {\n      return false;\n    },\n\n    /**\n     * Returns true if there's content below the current element. This method\n     * should be overridden by the consumer of this behavior.\n     *\n     * @method isContentBelow\n     * @return {boolean}\n     */\n    isContentBelow: function() {\n      return false;\n    },\n\n    /**\n     * List of effects handlers that will take place during scroll.\n     *\n     * @type {Array<Function>}\n     */\n    _effectsRunFn: null,\n\n    /**\n     * List of the effects definitions installed via the `effects` property.\n     *\n     * @type {Array<Object>}\n     */\n    _effects: null,\n\n    /**\n     * The clamped value of `_scrollTop`.\n     * @type number\n     */\n    get _clampedScrollTop() {\n      return Math.max(0, this._scrollTop);\n    },\n\n    attached: function() {\n      this._scrollStateChanged();\n    },\n\n    detached: function() {\n      this._tearDownEffects();\n    },\n\n    /**\n     * Creates an effect object from an effect's name that can be used to run\n     * effects programmatically.\n     *\n     * @method createEffect\n     * @param {string} effectName The effect's name registered via `Polymer.AppLayout.registerEffect`.\n     * @param {Object=} effectConfig The effect config object. (Optional)\n     * @return {Object} An effect object with the following functions:\n     *\n     *  * `effect.setUp()`, Sets up the requirements for the effect.\n     *       This function is called automatically before the `effect` function\n     * returns.\n     *  * `effect.run(progress, y)`, Runs the effect given a `progress`.\n     *  * `effect.tearDown()`, Cleans up any DOM nodes or element references\n     * used by the effect.\n     *\n     * Example:\n     * ```js\n     * var parallax = element.createEffect('parallax-background');\n     * // runs the effect\n     * parallax.run(0.5, 0);\n     * ```\n     */\n    createEffect: function(effectName, effectConfig) {\n      var effectDef = _scrollEffects[effectName];\n      if (!effectDef) {\n        throw new ReferenceError(this._getUndefinedMsg(effectName));\n      }\n      var prop = this._boundEffect(effectDef, effectConfig || {});\n      prop.setUp();\n      return prop;\n    },\n\n    /**\n     * Called when `effects` or `effectsConfig` changes.\n     */\n    _effectsChanged: function(effects, effectsConfig, isAttached) {\n      this._tearDownEffects();\n\n      if (!effects || !isAttached) {\n        return;\n      }\n      effects.split(' ').forEach(function(effectName) {\n        var effectDef;\n        if (effectName !== '') {\n          if ((effectDef = _scrollEffects[effectName])) {\n            this._effects.push(\n                this._boundEffect(effectDef, effectsConfig[effectName]));\n          } else {\n            console.warn(this._getUndefinedMsg(effectName));\n          }\n        }\n      }, this);\n\n      this._setUpEffect();\n    },\n\n    /**\n     * Forces layout\n     */\n    _layoutIfDirty: function() {\n      return this.offsetWidth;\n    },\n\n    /**\n     * Returns an effect object bound to the current context.\n     *\n     * @param {Object} effectDef\n     * @param {Object=} effectsConfig The effect config object if the effect accepts config values. (Optional)\n     */\n    _boundEffect: function(effectDef, effectsConfig) {\n      effectsConfig = effectsConfig || {};\n      var startsAt = parseFloat(effectsConfig.startsAt || 0);\n      var endsAt = parseFloat(effectsConfig.endsAt || 1);\n      var deltaS = endsAt - startsAt;\n      var noop = function() {};\n      // fast path if possible\n      var runFn = (startsAt === 0 && endsAt === 1) ?\n          effectDef.run :\n          function(progress, y) {\n            effectDef.run.call(\n                this, Math.max(0, (progress - startsAt) / deltaS), y);\n          };\n      return {\n        setUp: effectDef.setUp ? effectDef.setUp.bind(this, effectsConfig) :\n                                 noop,\n        run: effectDef.run ? runFn.bind(this) : noop,\n        tearDown: effectDef.tearDown ? effectDef.tearDown.bind(this) : noop\n      };\n    },\n\n    /**\n     * Sets up the effects.\n     */\n    _setUpEffect: function() {\n      if (this.isAttached && this._effects) {\n        this._effectsRunFn = [];\n        this._effects.forEach(function(effectDef) {\n          // install the effect only if no error was reported\n          if (effectDef.setUp() !== false) {\n            this._effectsRunFn.push(effectDef.run);\n          }\n        }, this);\n      }\n    },\n\n    /**\n     * Tears down the effects.\n     */\n    _tearDownEffects: function() {\n      if (this._effects) {\n        this._effects.forEach(function(effectDef) {\n          effectDef.tearDown();\n        });\n      }\n      this._effectsRunFn = [];\n      this._effects = [];\n    },\n\n    /**\n     * Runs the effects.\n     *\n     * @param {number} p The progress\n     * @param {number} y The top position of the current element relative to the viewport.\n     */\n    _runEffects: function(p, y) {\n      if (this._effectsRunFn) {\n        this._effectsRunFn.forEach(function(run) {\n          run(p, y);\n        });\n      }\n    },\n\n    /**\n     * Overrides the `_scrollHandler`.\n     */\n    _scrollHandler: function() {\n      this._scrollStateChanged();\n    },\n\n    _scrollStateChanged: function() {\n      if (!this.disabled) {\n        var scrollTop = this._clampedScrollTop;\n        this._updateScrollState(scrollTop);\n        if (this.threshold > 0) {\n          this._setThresholdTriggered(scrollTop >= this.threshold);\n        }\n      }\n    },\n\n    /**\n     * Override this method to return a reference to a node in the local DOM.\n     * The node is consumed by a scroll effect.\n     *\n     * @param {string} id The id for the node.\n     */\n    _getDOMRef: function(id) {\n      console.warn('_getDOMRef', '`' + id + '` is undefined');\n    },\n\n    _getUndefinedMsg: function(effectName) {\n      return 'Scroll effect `' + effectName + '` is undefined. ' +\n          'Did you forget to import app-layout/app-scroll-effects/effects/' +\n          effectName + '.html ?';\n    }\n\n  }\n];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {AppLayoutBehavior} from '../app-layout-behavior/app-layout-behavior.js';\nimport {AppScrollEffectsBehavior} from '../app-scroll-effects/app-scroll-effects-behavior.js';\n\n/**\napp-header is container element for app-toolbars at the top of the screen that\ncan have scroll effects. By default, an app-header moves away from the viewport\nwhen scrolling down and if using `reveals`, the header slides back when\nscrolling back up. For example:\n\n```html\n<app-header reveals>\n  <app-toolbar>\n    <div main-title>App name</div>\n  </app-toolbar>\n</app-header>\n```\n\napp-header can also condense when scrolling down. To achieve this behavior, the\nheader must have a larger height than the `sticky` element in the light DOM. For\nexample:\n\n```html\n<app-header style=\"height: 96px;\" condenses fixed>\n  <app-toolbar style=\"height: 64px;\">\n    <div main-title>App name</div>\n  </app-toolbar>\n</app-header>\n```\n\nIn this case the header is initially `96px` tall, and it shrinks to `64px` when\nscrolling down. That is what is meant by \"condensing\".\n\n### Sticky element\n\nThe element that is positioned fixed to top of the header's `scrollTarget` when\na threshold is reached, similar to `position: sticky` in CSS. This element\n**must** be an immediate child of app-header. By default, the `sticky` element\nis the first `app-toolbar that is an immediate child of app-header.\n\n```html\n<app-header condenses>\n  <app-toolbar> Sticky element </app-toolbar>\n  <app-toolbar></app-toolbar>\n</app-header>\n```\n\n#### Customizing the sticky element\n\n```html\n<app-header condenses>\n  <app-toolbar></app-toolbar>\n  <app-toolbar sticky> Sticky element </app-toolbar>\n</app-header>\n```\n\n### Scroll target\n\nThe app-header's `scrollTarget` property allows to customize the scrollable\nelement to which the header responds when the user scrolls. By default,\napp-header uses the document as the scroll target, but you can customize this\nproperty by setting the id of the element, e.g.\n\n```html\n<div id=\"scrollingRegion\" style=\"overflow-y: auto;\">\n  <app-header scroll-target=\"scrollingRegion\">\n  </app-header>\n</div>\n```\n\nIn this case, the `scrollTarget` property points to the outer div element.\nAlternatively, you can set this property programmatically:\n\n```js\nappHeader.scrollTarget = document.querySelector(\"#scrollingRegion\");\n```\n\n## Backgrounds\napp-header has two background layers that can be used for styling when the\nheader is condensed or when the scrollable element is scrolled to the top.\n\n## Scroll effects\n\nScroll effects are _optional_ visual effects applied in app-header based on\nscroll position. For example, The [Material Design scrolling\ntechniques](https://www.google.com/design/spec/patterns/scrolling-techniques.html)\nrecommends effects that can be installed via the `effects` property. e.g.\n\n```html\n<app-header effects=\"waterfall\">\n  <app-toolbar>App name</app-toolbar>\n</app-header>\n```\n\n#### Importing the effects\n\nTo use the scroll effects, you must explicitly import them in addition to\n`app-header`:\n\n```js\nimport '@polymer/app-layout/app-scroll-effects/app-scroll-effects.js';\n```\n\n#### List of effects\n\n* **blend-background**\nFades in/out two background elements by applying CSS opacity based on scroll\nposition. You can use this effect to smoothly change the background color or\nimage of the header. For example, using the mixin\n`--app-header-background-rear-layer` lets you assign a different background when\nthe header is condensed:\n\n```css\napp-header {\n  background-color: red;\n  --app-header-background-rear-layer: {\n    /* The header is blue when condensed *\\/\n    background-color: blue;\n  };\n}\n```\n\n* **fade-background**\nUpon scrolling past a threshold, this effect will trigger an opacity transition\nto fade in/out the backgrounds. Compared to the `blend-background` effect, this\neffect doesn't interpolate the opacity based on scroll position.\n\n\n* **parallax-background**\nA simple parallax effect that vertically translates the backgrounds based on a\nfraction of the scroll position. For example:\n\n```css\napp-header {\n  --app-header-background-front-layer: {\n    background-image: url(...);\n  };\n}\n```\n```html\n<app-header style=\"height: 300px;\" effects=\"parallax-background\">\n  <app-toolbar>App name</app-toolbar>\n</app-header>\n```\n\nThe fraction determines how far the background moves relative to the scroll\nposition. This value can be assigned via the `scalar` config value and it is\ntypically a value between 0 and 1 inclusive. If `scalar=0`, the background\ndoesn't move away from the header.\n\n* **resize-title**\nProgressively interpolates the size of the title from the element with the\n`main-title` attribute to the element with the `condensed-title` attribute as\nthe header condenses. For example:\n\n```html\n<app-header condenses reveals effects=\"resize-title\">\n  <app-toolbar>\n      <h4 condensed-title>App name</h4>\n  </app-toolbar>\n  <app-toolbar>\n      <h1 main-title>App name</h1>\n  </app-toolbar>\n</app-header>\n```\n\n* **resize-snapped-title**\nUpon scrolling past a threshold, this effect fades in/out the titles using\nopacity transitions. Similarly to `resize-title`, the `main-title` and\n`condensed-title` elements must be placed in the light DOM.\n\n* **waterfall**\nToggles the shadow property in app-header to create a sense of depth (as\nrecommended in the MD spec) between the header and the underneath content. You\ncan change the shadow by customizing the `--app-header-shadow` mixin. For\nexample:\n\n```css\napp-header {\n  --app-header-shadow: {\n    box-shadow: inset 0px 5px 2px -3px rgba(0, 0, 0, 0.2);\n  };\n}\n```\n\n```html\n<app-header condenses reveals effects=\"waterfall\">\n  <app-toolbar>\n      <h1 main-title>App name</h1>\n  </app-toolbar>\n</app-header>\n```\n\n* **material**\nInstalls the waterfall, resize-title, blend-background and parallax-background\neffects.\n\n### Content attributes\n\nAttribute | Description         | Default\n----------|---------------------|----------------------------------------\n`sticky` | Element that remains at the top when the header condenses. | The first app-toolbar in the light DOM.\n\n\n## Styling\n\nMixin | Description | Default\n------|-------------|----------\n`--app-header-background-front-layer` | Applies to the front layer of the background. | {}\n`--app-header-background-rear-layer` | Applies to the rear layer of the background. | {}\n`--app-header-shadow` | Applies to the shadow. | {}\n\n@element app-header\n@demo app-header/demo/blend-background-1.html Blend Background Image\n@demo app-header/demo/blend-background-2.html Blend 2 Background Images\n@demo app-header/demo/blend-background-3.html Blend Background Colors\n@demo app-header/demo/contacts.html Contacts Demo\n@demo app-header/demo/give.html Resize Snapped Title Demo\n@demo app-header/demo/music.html Reveals Demo\n@demo app-header/demo/no-effects.html Condenses and Reveals Demo\n@demo app-header/demo/notes.html Fixed with Dynamic Shadow Demo\n@demo app-header/demo/custom-sticky-element-1.html Custom Sticky Element Demo 1\n@demo app-header/demo/custom-sticky-element-2.html Custom Sticky Element Demo 2\n\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        position: relative;\n        display: block;\n        transition-timing-function: linear;\n        transition-property: -webkit-transform;\n        transition-property: transform;\n      }\n\n      :host::before {\n        position: absolute;\n        right: 0px;\n        bottom: -5px;\n        left: 0px;\n        width: 100%;\n        height: 5px;\n        content: \"\";\n        transition: opacity 0.4s;\n        pointer-events: none;\n        opacity: 0;\n        box-shadow: inset 0px 5px 6px -3px rgba(0, 0, 0, 0.4);\n        will-change: opacity;\n        @apply --app-header-shadow;\n      }\n\n      :host([shadow])::before {\n        opacity: 1;\n      }\n\n      #background {\n        @apply --layout-fit;\n        overflow: hidden;\n      }\n\n      #backgroundFrontLayer,\n      #backgroundRearLayer {\n        @apply --layout-fit;\n        height: 100%;\n        pointer-events: none;\n        background-size: cover;\n      }\n\n      #backgroundFrontLayer {\n        @apply --app-header-background-front-layer;\n      }\n\n      #backgroundRearLayer {\n        opacity: 0;\n        @apply --app-header-background-rear-layer;\n      }\n\n      #contentContainer {\n        position: relative;\n        width: 100%;\n        height: 100%;\n      }\n\n      :host([disabled]),\n      :host([disabled])::after,\n      :host([disabled]) #backgroundFrontLayer,\n      :host([disabled]) #backgroundRearLayer,\n      /* Silent scrolling should not run CSS transitions */\n      :host([silent-scroll]),\n      :host([silent-scroll])::after,\n      :host([silent-scroll]) #backgroundFrontLayer,\n      :host([silent-scroll]) #backgroundRearLayer {\n        transition: none !important;\n      }\n\n      :host([disabled]) ::slotted(app-toolbar:first-of-type),\n      :host([disabled]) ::slotted([sticky]),\n      /* Silent scrolling should not run CSS transitions */\n      :host([silent-scroll]) ::slotted(app-toolbar:first-of-type),\n      :host([silent-scroll]) ::slotted([sticky]) {\n        transition: none !important;\n      }\n\n    </style>\n    <div id=\"contentContainer\">\n      <slot id=\"slot\"></slot>\n    </div>\n`,\n\n  is: 'app-header',\n  behaviors: [AppScrollEffectsBehavior, AppLayoutBehavior],\n\n  properties: {\n    /**\n     * If true, the header will automatically collapse when scrolling down.\n     * That is, the `sticky` element remains visible when the header is fully\n     *condensed whereas the rest of the elements will collapse below `sticky`\n     *element.\n     *\n     * By default, the `sticky` element is the first toolbar in the light DOM:\n     *\n     *```html\n     * <app-header condenses>\n     *   <app-toolbar>This toolbar remains on top</app-toolbar>\n     *   <app-toolbar></app-toolbar>\n     *   <app-toolbar></app-toolbar>\n     * </app-header>\n     * ```\n     *\n     * Additionally, you can specify which toolbar or element remains visible in\n     *condensed mode by adding the `sticky` attribute to that element. For\n     *example: if we want the last toolbar to remain visible, we can add the\n     *`sticky` attribute to it.\n     *\n     *```html\n     * <app-header condenses>\n     *   <app-toolbar></app-toolbar>\n     *   <app-toolbar></app-toolbar>\n     *   <app-toolbar sticky>This toolbar remains on top</app-toolbar>\n     * </app-header>\n     * ```\n     *\n     * Note the `sticky` element must be a direct child of `app-header`.\n     */\n    condenses: {type: Boolean, value: false},\n\n    /**\n     * Mantains the header fixed at the top so it never moves away.\n     */\n    fixed: {type: Boolean, value: false},\n\n    /**\n     * Slides back the header when scrolling back up.\n     */\n    reveals: {type: Boolean, value: false},\n\n    /**\n     * Displays a shadow below the header.\n     */\n    shadow: {type: Boolean, reflectToAttribute: true, value: false}\n  },\n\n  observers: ['_configChanged(isAttached, condenses, fixed)'],\n\n  /**\n   * A cached offsetHeight of the current element.\n   *\n   * @type {number}\n   */\n  _height: 0,\n\n  /**\n   * The distance in pixels the header will be translated to when scrolling.\n   *\n   * @type {number}\n   */\n  _dHeight: 0,\n\n  /**\n   * The offsetTop of `_stickyEl`\n   *\n   * @type {number}\n   */\n  _stickyElTop: 0,\n\n  /**\n   * A reference to the element that remains visible when the header condenses.\n   *\n   * @type {HTMLElement}\n   */\n  _stickyElRef: null,\n\n  /**\n   * The header's top value used for the `transformY`\n   *\n   * @type {number}\n   */\n  _top: 0,\n\n  /**\n   * The current scroll progress.\n   *\n   * @type {number}\n   */\n  _progress: 0,\n\n  _wasScrollingDown: false,\n  _initScrollTop: 0,\n  _initTimestamp: 0,\n  _lastTimestamp: 0,\n  _lastScrollTop: 0,\n\n  /**\n   * The distance the header is allowed to move away.\n   *\n   * @type {number}\n   */\n  get _maxHeaderTop() {\n    return this.fixed ? this._dHeight : this._height + 5;\n  },\n\n  /**\n   * Returns a reference to the sticky element.\n   *\n   * @return {HTMLElement}?\n   */\n  get _stickyEl() {\n    if (this._stickyElRef) {\n      return this._stickyElRef;\n    }\n    var nodes = dom(this.$.slot).getDistributedNodes();\n    // Get the element with the sticky attribute on it or the first element in\n    // the light DOM.\n    for (var i = 0, node; node = /** @type {!HTMLElement} */ (nodes[i]); i++) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        if (node.hasAttribute('sticky')) {\n          this._stickyElRef = node;\n          break;\n        } else if (!this._stickyElRef) {\n          this._stickyElRef = node;\n        }\n      }\n    }\n    return this._stickyElRef;\n  },\n\n  _configChanged: function() {\n    this.resetLayout();\n    this._notifyLayoutChanged();\n  },\n\n  _updateLayoutStates: function() {\n    if (this.offsetWidth === 0 && this.offsetHeight === 0) {\n      return;\n    }\n    var scrollTop = this._clampedScrollTop;\n    var firstSetup = this._height === 0 || scrollTop === 0;\n    var currentDisabled = this.disabled;\n    this._height = this.offsetHeight;\n    this._stickyElRef = null;\n    this.disabled = true;\n    // prepare for measurement\n    if (!firstSetup) {\n      this._updateScrollState(0, true);\n    }\n    if (this._mayMove()) {\n      this._dHeight =\n          this._stickyEl ? this._height - this._stickyEl.offsetHeight : 0;\n    } else {\n      this._dHeight = 0;\n    }\n    this._stickyElTop = this._stickyEl ? this._stickyEl.offsetTop : 0;\n    this._setUpEffect();\n    if (firstSetup) {\n      this._updateScrollState(scrollTop, true);\n    } else {\n      this._updateScrollState(this._lastScrollTop, true);\n      this._layoutIfDirty();\n    }\n    // restore no transition\n    this.disabled = currentDisabled;\n  },\n\n  /**\n   * Updates the scroll state.\n   *\n   * @param {number} scrollTop\n   * @param {boolean=} forceUpdate (default: false)\n   */\n  _updateScrollState: function(scrollTop, forceUpdate) {\n    if (this._height === 0) {\n      return;\n    }\n    var progress = 0;\n    var top = 0;\n    var lastTop = this._top;\n    var lastScrollTop = this._lastScrollTop;\n    var maxHeaderTop = this._maxHeaderTop;\n    var dScrollTop = scrollTop - this._lastScrollTop;\n    var absDScrollTop = Math.abs(dScrollTop);\n    var isScrollingDown = scrollTop > this._lastScrollTop;\n    var now = performance.now();\n\n    if (this._mayMove()) {\n      top = this._clamp(\n          this.reveals ? lastTop + dScrollTop : scrollTop, 0, maxHeaderTop);\n    }\n    if (scrollTop >= this._dHeight) {\n      top = this.condenses && !this.fixed ? Math.max(this._dHeight, top) : top;\n      this.style.transitionDuration = '0ms';\n    }\n    if (this.reveals && !this.disabled && absDScrollTop < 100) {\n      // set the initial scroll position\n      if (now - this._initTimestamp > 300 ||\n          this._wasScrollingDown !== isScrollingDown) {\n        this._initScrollTop = scrollTop;\n        this._initTimestamp = now;\n      }\n      if (scrollTop >= maxHeaderTop) {\n        // check if the header is allowed to snap\n        if (Math.abs(this._initScrollTop - scrollTop) > 30 ||\n            absDScrollTop > 10) {\n          if (isScrollingDown && scrollTop >= maxHeaderTop) {\n            top = maxHeaderTop;\n          } else if (!isScrollingDown && scrollTop >= this._dHeight) {\n            top = this.condenses && !this.fixed ? this._dHeight : 0;\n          }\n          var scrollVelocity = dScrollTop / (now - this._lastTimestamp);\n          this.style.transitionDuration =\n              this._clamp((top - lastTop) / scrollVelocity, 0, 300) + 'ms';\n        } else {\n          top = this._top;\n        }\n      }\n    }\n    if (this._dHeight === 0) {\n      progress = scrollTop > 0 ? 1 : 0;\n    } else {\n      progress = top / this._dHeight;\n    }\n    if (!forceUpdate) {\n      this._lastScrollTop = scrollTop;\n      this._top = top;\n      this._wasScrollingDown = isScrollingDown;\n      this._lastTimestamp = now;\n    }\n    if (forceUpdate || progress !== this._progress || lastTop !== top ||\n        scrollTop === 0) {\n      this._progress = progress;\n      this._runEffects(progress, top);\n      this._transformHeader(top);\n    }\n  },\n\n  /**\n   * Returns true if the current header is allowed to move as the user scrolls.\n   *\n   * @return {boolean}\n   */\n  _mayMove: function() {\n    return this.condenses || !this.fixed;\n  },\n\n  /**\n   * Returns true if the current header will condense based on the size of the\n   * header and the `consenses` property.\n   *\n   * @return {boolean}\n   */\n  willCondense: function() {\n    return this._dHeight > 0 && this.condenses;\n  },\n\n  /**\n   * Returns true if the current element is on the screen.\n   * That is, visible in the current viewport.\n   *\n   * @method isOnScreen\n   * @return {boolean}\n   */\n  isOnScreen: function() {\n    return this._height !== 0 && this._top < this._height;\n  },\n\n  /**\n   * Returns true if there's content below the current element.\n   *\n   * @method isContentBelow\n   * @return {boolean}\n   */\n  isContentBelow: function() {\n    return this._top === 0 ? this._clampedScrollTop > 0 :\n                             this._clampedScrollTop - this._maxHeaderTop >= 0;\n  },\n\n  /**\n   * Transforms the header.\n   *\n   * @param {number} y\n   */\n  _transformHeader: function(y) {\n    this.translate3d(0, (-y) + 'px', 0);\n    if (this._stickyEl) {\n      this.translate3d(\n          0,\n          this.condenses && y >= this._stickyElTop ?\n              (Math.min(y, this._dHeight) - this._stickyElTop) + 'px' :\n              0,\n          0,\n          this._stickyEl);\n    }\n  },\n\n  _clamp: function(v, min, max) {\n    return Math.min(max, Math.max(min, v));\n  },\n\n  _ensureBgContainers: function() {\n    if (!this._bgContainer) {\n      this._bgContainer = document.createElement('div');\n      this._bgContainer.id = 'background';\n      this._bgRear = document.createElement('div');\n      this._bgRear.id = 'backgroundRearLayer';\n      this._bgContainer.appendChild(this._bgRear);\n      this._bgFront = document.createElement('div');\n      this._bgFront.id = 'backgroundFrontLayer';\n      this._bgContainer.appendChild(this._bgFront);\n      dom(this.root).insertBefore(this._bgContainer, this.$.contentContainer);\n    }\n  },\n\n  _getDOMRef: function(id) {\n    switch (id) {\n      case 'backgroundFrontLayer':\n        this._ensureBgContainers();\n        return this._bgFront;\n      case 'backgroundRearLayer':\n        this._ensureBgContainers();\n        return this._bgRear;\n      case 'background':\n        this._ensureBgContainers();\n        return this._bgContainer;\n      case 'mainTitle':\n        return dom(this).querySelector('[main-title]');\n      case 'condensedTitle':\n        return dom(this).querySelector('[condensed-title]');\n    }\n    return null;\n  },\n\n  /**\n   * Returns an object containing the progress value of the scroll effects\n   * and the top position of the header.\n   *\n   * @method getScrollState\n   * @return {Object}\n   */\n  getScrollState: function() {\n    return {progress: this._progress, top: this._top};\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\napp-toolbar is a horizontal toolbar containing items that can be used for\nlabel, navigation, search and actions.\n\n### Example\n\nAdd a title to the toolbar.\n\n```html\n<app-toolbar>\n  <div main-title>App name</div>\n</app-toolbar>\n```\n\nAdd a button to the left and right side of the toolbar.\n\n```html\n<app-toolbar>\n  <paper-icon-button icon=\"menu\"></paper-icon-button>\n  <div main-title>App name</div>\n  <paper-icon-button icon=\"search\"></paper-icon-button>\n</app-toolbar>\n```\n\nYou can use the attributes `top-item` or `bottom-item` to completely fit an\nelement to the top or bottom of the toolbar respectively.\n\n### Content attributes\n\nAttribute            | Description\n---------------------|---------------------------------------------------------\n`main-title`         | The main title element.\n`condensed-title`    | The title element if used inside a condensed app-header.\n`spacer`             | Adds a left margin of `64px`.\n`bottom-item`        | Sticks the element to the bottom of the toolbar.\n`top-item`           | Sticks the element to the top of the toolbar.\n\n### Styling\n\nCustom property              | Description                  | Default\n-----------------------------|------------------------------|-----------------------\n`--app-toolbar-font-size`    | Toolbar font size            | 20px\n\n@element app-toolbar\n@demo app-toolbar/demo/index.html\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n\n      :host {\n        @apply --layout-horizontal;\n        @apply --layout-center;\n        position: relative;\n        height: 64px;\n        padding: 0 16px;\n        pointer-events: none;\n        font-size: var(--app-toolbar-font-size, 20px);\n      }\n\n      :host ::slotted(*) {\n        pointer-events: auto;\n      }\n\n      :host ::slotted(paper-icon-button) {\n        /* paper-icon-button/issues/33 */\n        font-size: 0;\n      }\n\n      :host ::slotted([main-title]),\n      :host ::slotted([condensed-title]) {\n        pointer-events: none;\n        @apply --layout-flex;\n      }\n\n      :host ::slotted([bottom-item]) {\n        position: absolute;\n        right: 0;\n        bottom: 0;\n        left: 0;\n      }\n\n      :host ::slotted([top-item]) {\n        position: absolute;\n        top: 0;\n        right: 0;\n        left: 0;\n      }\n\n      :host ::slotted([spacer]) {\n        margin-left: 64px;\n      }\n    </style>\n\n    <slot></slot>\n`,\n\n  is: 'app-toolbar'\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n`iron-a11y-announcer` is a singleton element that is intended to add a11y\nto features that require on-demand announcement from screen readers. In\norder to make use of the announcer, it is best to request its availability\nin the announcing element.\n\nExample:\n\n    Polymer({\n\n      is: 'x-chatty',\n\n      attached: function() {\n        // This will create the singleton element if it has not\n        // been created yet:\n        Polymer.IronA11yAnnouncer.requestAvailability();\n      }\n    });\n\nAfter the `iron-a11y-announcer` has been made available, elements can\nmake announces by firing bubbling `iron-announce` events.\n\nExample:\n\n    this.fire('iron-announce', {\n      text: 'This is an announcement!'\n    }, { bubbles: true });\n\nNote: announcements are only audible if you have a screen reader enabled.\n\n@demo demo/index.html\n*/\nexport const IronA11yAnnouncer = Polymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        position: fixed;\n        clip: rect(0px,0px,0px,0px);\n      }\n    </style>\n    <div aria-live$=\"[[mode]]\">[[_text]]</div>\n`,\n\n  is: 'iron-a11y-announcer',\n\n  properties: {\n\n    /**\n     * The value of mode is used to set the `aria-live` attribute\n     * for the element that will be announced. Valid values are: `off`,\n     * `polite` and `assertive`.\n     */\n    mode: {type: String, value: 'polite'},\n\n    /**\n     * The timeout on refreshing the announcement text. Larger timeouts are\n     * needed for certain screen readers to re-announce the same message.\n     */\n    timeout: {type: Number, value: 150},\n\n    _text: {type: String, value: ''},\n  },\n\n  /** @override */\n  created: function() {\n    if (!IronA11yAnnouncer.instance) {\n      IronA11yAnnouncer.instance = this;\n    }\n\n    document.addEventListener('iron-announce', this._onIronAnnounce.bind(this));\n  },\n\n  /**\n   * Cause a text string to be announced by screen readers.\n   *\n   * @param {string} text The text that should be announced.\n   */\n  announce: function(text) {\n    this._text = '';\n    this.async(function() {\n      this._text = text;\n    }, this.timeout);\n  },\n\n  _onIronAnnounce: function(event) {\n    if (event.detail && event.detail.text) {\n      this.announce(event.detail.text);\n    }\n  }\n});\n\nIronA11yAnnouncer.instance = null;\n\nIronA11yAnnouncer.requestAvailability = function() {\n  if (!IronA11yAnnouncer.instance) {\n    IronA11yAnnouncer.instance = document.createElement('iron-a11y-announcer');\n  }\n\n  if (document.body) {\n    document.body.appendChild(IronA11yAnnouncer.instance);\n  } else {\n    document.addEventListener('load', function() {\n      document.body.appendChild(IronA11yAnnouncer.instance);\n    });\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n * Chrome uses an older version of DOM Level 3 Keyboard Events\n *\n * Most keys are labeled as text, but some are Unicode codepoints.\n * Values taken from:\n * http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/keyset.html#KeySet-Set\n */\nvar KEY_IDENTIFIER = {\n  'U+0008': 'backspace',\n  'U+0009': 'tab',\n  'U+001B': 'esc',\n  'U+0020': 'space',\n  'U+007F': 'del'\n};\n\n/**\n * Special table for KeyboardEvent.keyCode.\n * KeyboardEvent.keyIdentifier is better, and KeyBoardEvent.key is even better\n * than that.\n *\n * Values from:\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Value_of_keyCode\n */\nvar KEY_CODE = {\n  8: 'backspace',\n  9: 'tab',\n  13: 'enter',\n  27: 'esc',\n  33: 'pageup',\n  34: 'pagedown',\n  35: 'end',\n  36: 'home',\n  32: 'space',\n  37: 'left',\n  38: 'up',\n  39: 'right',\n  40: 'down',\n  46: 'del',\n  106: '*'\n};\n\n/**\n * MODIFIER_KEYS maps the short name for modifier keys used in a key\n * combo string to the property name that references those same keys\n * in a KeyboardEvent instance.\n */\nvar MODIFIER_KEYS = {\n  'shift': 'shiftKey',\n  'ctrl': 'ctrlKey',\n  'alt': 'altKey',\n  'meta': 'metaKey'\n};\n\n/**\n * KeyboardEvent.key is mostly represented by printable character made by\n * the keyboard, with unprintable keys labeled nicely.\n *\n * However, on OS X, Alt+char can make a Unicode character that follows an\n * Apple-specific mapping. In this case, we fall back to .keyCode.\n */\nvar KEY_CHAR = /[a-z0-9*]/;\n\n/**\n * Matches a keyIdentifier string.\n */\nvar IDENT_CHAR = /U\\+/;\n\n/**\n * Matches arrow keys in Gecko 27.0+\n */\nvar ARROW_KEY = /^arrow/;\n\n/**\n * Matches space keys everywhere (notably including IE10's exceptional name\n * `spacebar`).\n */\nvar SPACE_KEY = /^space(bar)?/;\n\n/**\n * Matches ESC key.\n *\n * Value from: http://w3c.github.io/uievents-key/#key-Escape\n */\nvar ESC_KEY = /^escape$/;\n\n/**\n * Transforms the key.\n * @param {string} key The KeyBoardEvent.key\n * @param {Boolean} [noSpecialChars] Limits the transformation to\n * alpha-numeric characters.\n */\nfunction transformKey(key, noSpecialChars) {\n  var validKey = '';\n  if (key) {\n    var lKey = key.toLowerCase();\n    if (lKey === ' ' || SPACE_KEY.test(lKey)) {\n      validKey = 'space';\n    } else if (ESC_KEY.test(lKey)) {\n      validKey = 'esc';\n    } else if (lKey.length == 1) {\n      if (!noSpecialChars || KEY_CHAR.test(lKey)) {\n        validKey = lKey;\n      }\n    } else if (ARROW_KEY.test(lKey)) {\n      validKey = lKey.replace('arrow', '');\n    } else if (lKey == 'multiply') {\n      // numpad '*' can map to Multiply on IE/Windows\n      validKey = '*';\n    } else {\n      validKey = lKey;\n    }\n  }\n  return validKey;\n}\n\nfunction transformKeyIdentifier(keyIdent) {\n  var validKey = '';\n  if (keyIdent) {\n    if (keyIdent in KEY_IDENTIFIER) {\n      validKey = KEY_IDENTIFIER[keyIdent];\n    } else if (IDENT_CHAR.test(keyIdent)) {\n      keyIdent = parseInt(keyIdent.replace('U+', '0x'), 16);\n      validKey = String.fromCharCode(keyIdent).toLowerCase();\n    } else {\n      validKey = keyIdent.toLowerCase();\n    }\n  }\n  return validKey;\n}\n\nfunction transformKeyCode(keyCode) {\n  var validKey = '';\n  if (Number(keyCode)) {\n    if (keyCode >= 65 && keyCode <= 90) {\n      // ascii a-z\n      // lowercase is 32 offset from uppercase\n      validKey = String.fromCharCode(32 + keyCode);\n    } else if (keyCode >= 112 && keyCode <= 123) {\n      // function keys f1-f12\n      validKey = 'f' + (keyCode - 112 + 1);\n    } else if (keyCode >= 48 && keyCode <= 57) {\n      // top 0-9 keys\n      validKey = String(keyCode - 48);\n    } else if (keyCode >= 96 && keyCode <= 105) {\n      // num pad 0-9\n      validKey = String(keyCode - 96);\n    } else {\n      validKey = KEY_CODE[keyCode];\n    }\n  }\n  return validKey;\n}\n\n/**\n * Calculates the normalized key for a KeyboardEvent.\n * @param {KeyboardEvent} keyEvent\n * @param {Boolean} [noSpecialChars] Set to true to limit keyEvent.key\n * transformation to alpha-numeric chars. This is useful with key\n * combinations like shift + 2, which on FF for MacOS produces\n * keyEvent.key = @\n * To get 2 returned, set noSpecialChars = true\n * To get @ returned, set noSpecialChars = false\n */\nfunction normalizedKeyForEvent(keyEvent, noSpecialChars) {\n  // Fall back from .key, to .detail.key for artifical keyboard events,\n  // and then to deprecated .keyIdentifier and .keyCode.\n  if (keyEvent.key) {\n    return transformKey(keyEvent.key, noSpecialChars);\n  }\n  if (keyEvent.detail && keyEvent.detail.key) {\n    return transformKey(keyEvent.detail.key, noSpecialChars);\n  }\n  return transformKeyIdentifier(keyEvent.keyIdentifier) ||\n      transformKeyCode(keyEvent.keyCode) || '';\n}\n\nfunction keyComboMatchesEvent(keyCombo, event) {\n  // For combos with modifiers we support only alpha-numeric keys\n  var keyEvent = normalizedKeyForEvent(event, keyCombo.hasModifiers);\n  return keyEvent === keyCombo.key &&\n      (!keyCombo.hasModifiers ||\n       (!!event.shiftKey === !!keyCombo.shiftKey &&\n        !!event.ctrlKey === !!keyCombo.ctrlKey &&\n        !!event.altKey === !!keyCombo.altKey &&\n        !!event.metaKey === !!keyCombo.metaKey));\n}\n\nfunction parseKeyComboString(keyComboString) {\n  if (keyComboString.length === 1) {\n    return {combo: keyComboString, key: keyComboString, event: 'keydown'};\n  }\n  return keyComboString.split('+')\n      .reduce(function(parsedKeyCombo, keyComboPart) {\n        var eventParts = keyComboPart.split(':');\n        var keyName = eventParts[0];\n        var event = eventParts[1];\n\n        if (keyName in MODIFIER_KEYS) {\n          parsedKeyCombo[MODIFIER_KEYS[keyName]] = true;\n          parsedKeyCombo.hasModifiers = true;\n        } else {\n          parsedKeyCombo.key = keyName;\n          parsedKeyCombo.event = event || 'keydown';\n        }\n\n        return parsedKeyCombo;\n      }, {combo: keyComboString.split(':').shift()});\n}\n\nfunction parseEventString(eventString) {\n  return eventString.trim().split(' ').map(function(keyComboString) {\n    return parseKeyComboString(keyComboString);\n  });\n}\n\n/**\n * `Polymer.IronA11yKeysBehavior` provides a normalized interface for processing\n * keyboard commands that pertain to [WAI-ARIA best\n * practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). The\n * element takes care of browser differences with respect to Keyboard events and\n * uses an expressive syntax to filter key presses.\n *\n * Use the `keyBindings` prototype property to express what combination of keys\n * will trigger the callback. A key binding has the format\n * `\"KEY+MODIFIER:EVENT\": \"callback\"` (`\"KEY\": \"callback\"` or\n * `\"KEY:EVENT\": \"callback\"` are valid as well). Some examples:\n *\n *      keyBindings: {\n *        'space': '_onKeydown', // same as 'space:keydown'\n *        'shift+tab': '_onKeydown',\n *        'enter:keypress': '_onKeypress',\n *        'esc:keyup': '_onKeyup'\n *      }\n *\n * The callback will receive with an event containing the following information\n * in `event.detail`:\n *\n *      _onKeydown: function(event) {\n *        console.log(event.detail.combo); // KEY+MODIFIER, e.g. \"shift+tab\"\n *        console.log(event.detail.key); // KEY only, e.g. \"tab\"\n *        console.log(event.detail.event); // EVENT, e.g. \"keydown\"\n *        console.log(event.detail.keyboardEvent); // the original KeyboardEvent\n *      }\n *\n * Use the `keyEventTarget` attribute to set up event handlers on a specific\n * node.\n *\n * See the [demo source\n * code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)\n * for an example.\n *\n * @demo demo/index.html\n * @polymerBehavior\n */\nexport const IronA11yKeysBehavior = {\n  properties: {\n    /**\n     * The EventTarget that will be firing relevant KeyboardEvents. Set it to\n     * `null` to disable the listeners.\n     * @type {?EventTarget}\n     */\n    keyEventTarget: {\n      type: Object,\n      value: function() {\n        return this;\n      }\n    },\n\n    /**\n     * If true, this property will cause the implementing element to\n     * automatically stop propagation on any handled KeyboardEvents.\n     */\n    stopKeyboardEventPropagation: {type: Boolean, value: false},\n\n    _boundKeyHandlers: {\n      type: Array,\n      value: function() {\n        return [];\n      }\n    },\n\n    // We use this due to a limitation in IE10 where instances will have\n    // own properties of everything on the \"prototype\".\n    _imperativeKeyBindings: {\n      type: Object,\n      value: function() {\n        return {};\n      }\n    }\n  },\n\n  observers: ['_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)'],\n\n\n  /**\n   * To be used to express what combination of keys  will trigger the relative\n   * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`\n   * @type {!Object}\n   */\n  keyBindings: {},\n\n  registered: function() {\n    this._prepKeyBindings();\n  },\n\n  attached: function() {\n    this._listenKeyEventListeners();\n  },\n\n  detached: function() {\n    this._unlistenKeyEventListeners();\n  },\n\n  /**\n   * Can be used to imperatively add a key binding to the implementing\n   * element. This is the imperative equivalent of declaring a keybinding\n   * in the `keyBindings` prototype property.\n   *\n   * @param {string} eventString\n   * @param {string} handlerName\n   */\n  addOwnKeyBinding: function(eventString, handlerName) {\n    this._imperativeKeyBindings[eventString] = handlerName;\n    this._prepKeyBindings();\n    this._resetKeyEventListeners();\n  },\n\n  /**\n   * When called, will remove all imperatively-added key bindings.\n   */\n  removeOwnKeyBindings: function() {\n    this._imperativeKeyBindings = {};\n    this._prepKeyBindings();\n    this._resetKeyEventListeners();\n  },\n\n  /**\n   * Returns true if a keyboard event matches `eventString`.\n   *\n   * @param {KeyboardEvent} event\n   * @param {string} eventString\n   * @return {boolean}\n   */\n  keyboardEventMatchesKeys: function(event, eventString) {\n    var keyCombos = parseEventString(eventString);\n    for (var i = 0; i < keyCombos.length; ++i) {\n      if (keyComboMatchesEvent(keyCombos[i], event)) {\n        return true;\n      }\n    }\n    return false;\n  },\n\n  _collectKeyBindings: function() {\n    var keyBindings = this.behaviors.map(function(behavior) {\n      return behavior.keyBindings;\n    });\n\n    if (keyBindings.indexOf(this.keyBindings) === -1) {\n      keyBindings.push(this.keyBindings);\n    }\n\n    return keyBindings;\n  },\n\n  _prepKeyBindings: function() {\n    this._keyBindings = {};\n\n    this._collectKeyBindings().forEach(function(keyBindings) {\n      for (var eventString in keyBindings) {\n        this._addKeyBinding(eventString, keyBindings[eventString]);\n      }\n    }, this);\n\n    for (var eventString in this._imperativeKeyBindings) {\n      this._addKeyBinding(\n          eventString, this._imperativeKeyBindings[eventString]);\n    }\n\n    // Give precedence to combos with modifiers to be checked first.\n    for (var eventName in this._keyBindings) {\n      this._keyBindings[eventName].sort(function(kb1, kb2) {\n        var b1 = kb1[0].hasModifiers;\n        var b2 = kb2[0].hasModifiers;\n        return (b1 === b2) ? 0 : b1 ? -1 : 1;\n      })\n    }\n  },\n\n  _addKeyBinding: function(eventString, handlerName) {\n    parseEventString(eventString).forEach(function(keyCombo) {\n      this._keyBindings[keyCombo.event] =\n          this._keyBindings[keyCombo.event] || [];\n\n      this._keyBindings[keyCombo.event].push([keyCombo, handlerName]);\n    }, this);\n  },\n\n  _resetKeyEventListeners: function() {\n    this._unlistenKeyEventListeners();\n\n    if (this.isAttached) {\n      this._listenKeyEventListeners();\n    }\n  },\n\n  _listenKeyEventListeners: function() {\n    if (!this.keyEventTarget) {\n      return;\n    }\n    Object.keys(this._keyBindings).forEach(function(eventName) {\n      var keyBindings = this._keyBindings[eventName];\n      var boundKeyHandler = this._onKeyBindingEvent.bind(this, keyBindings);\n\n      this._boundKeyHandlers.push(\n          [this.keyEventTarget, eventName, boundKeyHandler]);\n\n      this.keyEventTarget.addEventListener(eventName, boundKeyHandler);\n    }, this);\n  },\n\n  _unlistenKeyEventListeners: function() {\n    var keyHandlerTuple;\n    var keyEventTarget;\n    var eventName;\n    var boundKeyHandler;\n\n    while (this._boundKeyHandlers.length) {\n      // My kingdom for block-scope binding and destructuring assignment..\n      keyHandlerTuple = this._boundKeyHandlers.pop();\n      keyEventTarget = keyHandlerTuple[0];\n      eventName = keyHandlerTuple[1];\n      boundKeyHandler = keyHandlerTuple[2];\n\n      keyEventTarget.removeEventListener(eventName, boundKeyHandler);\n    }\n  },\n\n  _onKeyBindingEvent: function(keyBindings, event) {\n    if (this.stopKeyboardEventPropagation) {\n      event.stopPropagation();\n    }\n\n    // if event has been already prevented, don't do anything\n    if (event.defaultPrevented) {\n      return;\n    }\n\n    for (var i = 0; i < keyBindings.length; i++) {\n      var keyCombo = keyBindings[i][0];\n      var handlerName = keyBindings[i][1];\n      if (keyComboMatchesEvent(keyCombo, event)) {\n        this._triggerKeyHandler(keyCombo, handlerName, event);\n        // exit the loop if eventDefault was prevented\n        if (event.defaultPrevented) {\n          return;\n        }\n      }\n    }\n  },\n\n  _triggerKeyHandler: function(keyCombo, handlerName, keyboardEvent) {\n    var detail = Object.create(keyCombo);\n    detail.keyboardEvent = keyboardEvent;\n    var event =\n        new CustomEvent(keyCombo.event, {detail: detail, cancelable: true});\n    this[handlerName].call(this, event);\n    if (event.defaultPrevented) {\n      keyboardEvent.preventDefault();\n    }\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport './iron-control-state.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n * @demo demo/index.html\n * @polymerBehavior IronButtonState\n */\nexport const IronButtonStateImpl = {\n\n  properties: {\n\n    /**\n     * If true, the user is currently holding down the button.\n     */\n    pressed: {\n      type: Boolean,\n      readOnly: true,\n      value: false,\n      reflectToAttribute: true,\n      observer: '_pressedChanged'\n    },\n\n    /**\n     * If true, the button toggles the active state with each tap or press\n     * of the spacebar.\n     */\n    toggles: {type: Boolean, value: false, reflectToAttribute: true},\n\n    /**\n     * If true, the button is a toggle and is currently in the active state.\n     */\n    active:\n        {type: Boolean, value: false, notify: true, reflectToAttribute: true},\n\n    /**\n     * True if the element is currently being pressed by a \"pointer,\" which\n     * is loosely defined as mouse or touch input (but specifically excluding\n     * keyboard input).\n     */\n    pointerDown: {type: Boolean, readOnly: true, value: false},\n\n    /**\n     * True if the input device that caused the element to receive focus\n     * was a keyboard.\n     */\n    receivedFocusFromKeyboard: {type: Boolean, readOnly: true},\n\n    /**\n     * The aria attribute to be set if the button is a toggle and in the\n     * active state.\n     */\n    ariaActiveAttribute: {\n      type: String,\n      value: 'aria-pressed',\n      observer: '_ariaActiveAttributeChanged'\n    }\n  },\n\n  listeners: {down: '_downHandler', up: '_upHandler', tap: '_tapHandler'},\n\n  observers:\n      ['_focusChanged(focused)', '_activeChanged(active, ariaActiveAttribute)'],\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {\n    'enter:keydown': '_asyncClick',\n    'space:keydown': '_spaceKeyDownHandler',\n    'space:keyup': '_spaceKeyUpHandler',\n  },\n\n  _mouseEventRe: /^mouse/,\n\n  _tapHandler: function() {\n    if (this.toggles) {\n      // a tap is needed to toggle the active state\n      this._userActivate(!this.active);\n    } else {\n      this.active = false;\n    }\n  },\n\n  _focusChanged: function(focused) {\n    this._detectKeyboardFocus(focused);\n\n    if (!focused) {\n      this._setPressed(false);\n    }\n  },\n\n  _detectKeyboardFocus: function(focused) {\n    this._setReceivedFocusFromKeyboard(!this.pointerDown && focused);\n  },\n\n  // to emulate native checkbox, (de-)activations from a user interaction fire\n  // 'change' events\n  _userActivate: function(active) {\n    if (this.active !== active) {\n      this.active = active;\n      this.fire('change');\n    }\n  },\n\n  _downHandler: function(event) {\n    this._setPointerDown(true);\n    this._setPressed(true);\n    this._setReceivedFocusFromKeyboard(false);\n  },\n\n  _upHandler: function() {\n    this._setPointerDown(false);\n    this._setPressed(false);\n  },\n\n  /**\n   * @param {!KeyboardEvent} event .\n   */\n  _spaceKeyDownHandler: function(event) {\n    var keyboardEvent = event.detail.keyboardEvent;\n    var target = dom(keyboardEvent).localTarget;\n\n    // Ignore the event if this is coming from a focused light child, since that\n    // element will deal with it.\n    if (this.isLightDescendant(/** @type {Node} */ (target)))\n      return;\n\n    keyboardEvent.preventDefault();\n    keyboardEvent.stopImmediatePropagation();\n    this._setPressed(true);\n  },\n\n  /**\n   * @param {!KeyboardEvent} event .\n   */\n  _spaceKeyUpHandler: function(event) {\n    var keyboardEvent = event.detail.keyboardEvent;\n    var target = dom(keyboardEvent).localTarget;\n\n    // Ignore the event if this is coming from a focused light child, since that\n    // element will deal with it.\n    if (this.isLightDescendant(/** @type {Node} */ (target)))\n      return;\n\n    if (this.pressed) {\n      this._asyncClick();\n    }\n    this._setPressed(false);\n  },\n\n  // trigger click asynchronously, the asynchrony is useful to allow one\n  // event handler to unwind before triggering another event\n  _asyncClick: function() {\n    this.async(function() {\n      this.click();\n    }, 1);\n  },\n\n  // any of these changes are considered a change to button state\n\n  _pressedChanged: function(pressed) {\n    this._changedButtonState();\n  },\n\n  _ariaActiveAttributeChanged: function(value, oldValue) {\n    if (oldValue && oldValue != value && this.hasAttribute(oldValue)) {\n      this.removeAttribute(oldValue);\n    }\n  },\n\n  _activeChanged: function(active, ariaActiveAttribute) {\n    if (this.toggles) {\n      this.setAttribute(this.ariaActiveAttribute, active ? 'true' : 'false');\n    } else {\n      this.removeAttribute(this.ariaActiveAttribute);\n    }\n    this._changedButtonState();\n  },\n\n  _controlStateChanged: function() {\n    if (this.disabled) {\n      this._setPressed(false);\n    } else {\n      this._changedButtonState();\n    }\n  },\n\n  // provide hook for follow-on behaviors to react to button-state\n\n  _changedButtonState: function() {\n    if (this._buttonStateChanged) {\n      this._buttonStateChanged();  // abstract\n    }\n  }\n\n};\n\n/** @polymerBehavior */\nexport const IronButtonState = [IronA11yKeysBehavior, IronButtonStateImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n * @demo demo/index.html\n * @polymerBehavior\n */\nexport const IronControlState = {\n\n  properties: {\n\n    /**\n     * If true, the element currently has focus.\n     */\n    focused: {\n      type: Boolean,\n      value: false,\n      notify: true,\n      readOnly: true,\n      reflectToAttribute: true\n    },\n\n    /**\n     * If true, the user cannot interact with this element.\n     */\n    disabled: {\n      type: Boolean,\n      value: false,\n      notify: true,\n      observer: '_disabledChanged',\n      reflectToAttribute: true\n    },\n\n    /**\n     * Value of the `tabindex` attribute before `disabled` was activated.\n     * `null` means the attribute was not present.\n     * @type {?string|undefined}\n     */\n    _oldTabIndex: {type: String},\n\n    _boundFocusBlurHandler: {\n      type: Function,\n      value: function() {\n        return this._focusBlurHandler.bind(this);\n      }\n    }\n  },\n\n  observers: ['_changedControlState(focused, disabled)'],\n\n  /**\n   * @return {void}\n   */\n  ready: function() {\n    this.addEventListener('focus', this._boundFocusBlurHandler, true);\n    this.addEventListener('blur', this._boundFocusBlurHandler, true);\n  },\n\n  _focusBlurHandler: function(event) {\n    // Polymer takes care of retargeting events.\n    this._setFocused(event.type === 'focus');\n    return;\n  },\n\n  _disabledChanged: function(disabled, old) {\n    this.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n    this.style.pointerEvents = disabled ? 'none' : '';\n    if (disabled) {\n      // Read the `tabindex` attribute instead of the `tabIndex` property.\n      // The property returns `-1` if there is no `tabindex` attribute.\n      // This distinction is important when restoring the value because\n      // leaving `-1` hides shadow root children from the tab order.\n      this._oldTabIndex = this.getAttribute('tabindex');\n      this._setFocused(false);\n      this.tabIndex = -1;\n      this.blur();\n    } else if (this._oldTabIndex !== undefined) {\n      if (this._oldTabIndex === null) {\n        this.removeAttribute('tabindex');\n      } else {\n        this.setAttribute('tabindex', this._oldTabIndex);\n      }\n    }\n  },\n\n  _changedControlState: function() {\n    // _controlStateChanged is abstract, follow-on behaviors may implement it\n    if (this._controlStateChanged) {\n      this._controlStateChanged();\n    }\n  }\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/*\nA set of layout classes that let you specify layout properties directly in\nmarkup. You must include this file in every element that needs to use them.\n\nSample use:\n\n    import '@polymer/iron-flex-layout/iron-flex-layout-classes.js';\n\n    const template = html`\n      <style is=\"custom-style\" include=\"iron-flex iron-flex-alignment\"></style>\n      <style>\n        .test { width: 100px; }\n      </style>\n      <div class=\"layout horizontal center-center\">\n        <div class=\"test\">horizontal layout center alignment</div>\n      </div>\n    `;\n    document.body.appendChild(template.content);\n\nThe following imports are available:\n - iron-flex\n - iron-flex-reverse\n - iron-flex-alignment\n - iron-flex-factors\n - iron-positioning\n*/\n\nconst template = html`\n/* Most common used flex styles*/\n<dom-module id=\"iron-flex\">\n  <template>\n    <style>\n      .layout.horizontal,\n      .layout.vertical {\n        display: -ms-flexbox;\n        display: -webkit-flex;\n        display: flex;\n      }\n\n      .layout.inline {\n        display: -ms-inline-flexbox;\n        display: -webkit-inline-flex;\n        display: inline-flex;\n      }\n\n      .layout.horizontal {\n        -ms-flex-direction: row;\n        -webkit-flex-direction: row;\n        flex-direction: row;\n      }\n\n      .layout.vertical {\n        -ms-flex-direction: column;\n        -webkit-flex-direction: column;\n        flex-direction: column;\n      }\n\n      .layout.wrap {\n        -ms-flex-wrap: wrap;\n        -webkit-flex-wrap: wrap;\n        flex-wrap: wrap;\n      }\n\n      .layout.no-wrap {\n        -ms-flex-wrap: nowrap;\n        -webkit-flex-wrap: nowrap;\n        flex-wrap: nowrap;\n      }\n\n      .layout.center,\n      .layout.center-center {\n        -ms-flex-align: center;\n        -webkit-align-items: center;\n        align-items: center;\n      }\n\n      .layout.center-justified,\n      .layout.center-center {\n        -ms-flex-pack: center;\n        -webkit-justify-content: center;\n        justify-content: center;\n      }\n\n      .flex {\n        -ms-flex: 1 1 0.000000001px;\n        -webkit-flex: 1;\n        flex: 1;\n        -webkit-flex-basis: 0.000000001px;\n        flex-basis: 0.000000001px;\n      }\n\n      .flex-auto {\n        -ms-flex: 1 1 auto;\n        -webkit-flex: 1 1 auto;\n        flex: 1 1 auto;\n      }\n\n      .flex-none {\n        -ms-flex: none;\n        -webkit-flex: none;\n        flex: none;\n      }\n    </style>\n  </template>\n</dom-module>\n/* Basic flexbox reverse styles */\n<dom-module id=\"iron-flex-reverse\">\n  <template>\n    <style>\n      .layout.horizontal-reverse,\n      .layout.vertical-reverse {\n        display: -ms-flexbox;\n        display: -webkit-flex;\n        display: flex;\n      }\n\n      .layout.horizontal-reverse {\n        -ms-flex-direction: row-reverse;\n        -webkit-flex-direction: row-reverse;\n        flex-direction: row-reverse;\n      }\n\n      .layout.vertical-reverse {\n        -ms-flex-direction: column-reverse;\n        -webkit-flex-direction: column-reverse;\n        flex-direction: column-reverse;\n      }\n\n      .layout.wrap-reverse {\n        -ms-flex-wrap: wrap-reverse;\n        -webkit-flex-wrap: wrap-reverse;\n        flex-wrap: wrap-reverse;\n      }\n    </style>\n  </template>\n</dom-module>\n/* Flexbox alignment */\n<dom-module id=\"iron-flex-alignment\">\n  <template>\n    <style>\n      /**\n       * Alignment in cross axis.\n       */\n      .layout.start {\n        -ms-flex-align: start;\n        -webkit-align-items: flex-start;\n        align-items: flex-start;\n      }\n\n      .layout.center,\n      .layout.center-center {\n        -ms-flex-align: center;\n        -webkit-align-items: center;\n        align-items: center;\n      }\n\n      .layout.end {\n        -ms-flex-align: end;\n        -webkit-align-items: flex-end;\n        align-items: flex-end;\n      }\n\n      .layout.baseline {\n        -ms-flex-align: baseline;\n        -webkit-align-items: baseline;\n        align-items: baseline;\n      }\n\n      /**\n       * Alignment in main axis.\n       */\n      .layout.start-justified {\n        -ms-flex-pack: start;\n        -webkit-justify-content: flex-start;\n        justify-content: flex-start;\n      }\n\n      .layout.center-justified,\n      .layout.center-center {\n        -ms-flex-pack: center;\n        -webkit-justify-content: center;\n        justify-content: center;\n      }\n\n      .layout.end-justified {\n        -ms-flex-pack: end;\n        -webkit-justify-content: flex-end;\n        justify-content: flex-end;\n      }\n\n      .layout.around-justified {\n        -ms-flex-pack: distribute;\n        -webkit-justify-content: space-around;\n        justify-content: space-around;\n      }\n\n      .layout.justified {\n        -ms-flex-pack: justify;\n        -webkit-justify-content: space-between;\n        justify-content: space-between;\n      }\n\n      /**\n       * Self alignment.\n       */\n      .self-start {\n        -ms-align-self: flex-start;\n        -webkit-align-self: flex-start;\n        align-self: flex-start;\n      }\n\n      .self-center {\n        -ms-align-self: center;\n        -webkit-align-self: center;\n        align-self: center;\n      }\n\n      .self-end {\n        -ms-align-self: flex-end;\n        -webkit-align-self: flex-end;\n        align-self: flex-end;\n      }\n\n      .self-stretch {\n        -ms-align-self: stretch;\n        -webkit-align-self: stretch;\n        align-self: stretch;\n      }\n\n      .self-baseline {\n        -ms-align-self: baseline;\n        -webkit-align-self: baseline;\n        align-self: baseline;\n      }\n\n      /**\n       * multi-line alignment in main axis.\n       */\n      .layout.start-aligned {\n        -ms-flex-line-pack: start;  /* IE10 */\n        -ms-align-content: flex-start;\n        -webkit-align-content: flex-start;\n        align-content: flex-start;\n      }\n\n      .layout.end-aligned {\n        -ms-flex-line-pack: end;  /* IE10 */\n        -ms-align-content: flex-end;\n        -webkit-align-content: flex-end;\n        align-content: flex-end;\n      }\n\n      .layout.center-aligned {\n        -ms-flex-line-pack: center;  /* IE10 */\n        -ms-align-content: center;\n        -webkit-align-content: center;\n        align-content: center;\n      }\n\n      .layout.between-aligned {\n        -ms-flex-line-pack: justify;  /* IE10 */\n        -ms-align-content: space-between;\n        -webkit-align-content: space-between;\n        align-content: space-between;\n      }\n\n      .layout.around-aligned {\n        -ms-flex-line-pack: distribute;  /* IE10 */\n        -ms-align-content: space-around;\n        -webkit-align-content: space-around;\n        align-content: space-around;\n      }\n    </style>\n  </template>\n</dom-module>\n/* Non-flexbox positioning helper styles */\n<dom-module id=\"iron-flex-factors\">\n  <template>\n    <style>\n      .flex,\n      .flex-1 {\n        -ms-flex: 1 1 0.000000001px;\n        -webkit-flex: 1;\n        flex: 1;\n        -webkit-flex-basis: 0.000000001px;\n        flex-basis: 0.000000001px;\n      }\n\n      .flex-2 {\n        -ms-flex: 2;\n        -webkit-flex: 2;\n        flex: 2;\n      }\n\n      .flex-3 {\n        -ms-flex: 3;\n        -webkit-flex: 3;\n        flex: 3;\n      }\n\n      .flex-4 {\n        -ms-flex: 4;\n        -webkit-flex: 4;\n        flex: 4;\n      }\n\n      .flex-5 {\n        -ms-flex: 5;\n        -webkit-flex: 5;\n        flex: 5;\n      }\n\n      .flex-6 {\n        -ms-flex: 6;\n        -webkit-flex: 6;\n        flex: 6;\n      }\n\n      .flex-7 {\n        -ms-flex: 7;\n        -webkit-flex: 7;\n        flex: 7;\n      }\n\n      .flex-8 {\n        -ms-flex: 8;\n        -webkit-flex: 8;\n        flex: 8;\n      }\n\n      .flex-9 {\n        -ms-flex: 9;\n        -webkit-flex: 9;\n        flex: 9;\n      }\n\n      .flex-10 {\n        -ms-flex: 10;\n        -webkit-flex: 10;\n        flex: 10;\n      }\n\n      .flex-11 {\n        -ms-flex: 11;\n        -webkit-flex: 11;\n        flex: 11;\n      }\n\n      .flex-12 {\n        -ms-flex: 12;\n        -webkit-flex: 12;\n        flex: 12;\n      }\n    </style>\n  </template>\n</dom-module>\n<dom-module id=\"iron-positioning\">\n  <template>\n    <style>\n      .block {\n        display: block;\n      }\n\n      [hidden] {\n        display: none !important;\n      }\n\n      .invisible {\n        visibility: hidden !important;\n      }\n\n      .relative {\n        position: relative;\n      }\n\n      .fit {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n      }\n\n      body.fullbleed {\n        margin: 0;\n        height: 100vh;\n      }\n\n      .scroll {\n        -webkit-overflow-scrolling: touch;\n        overflow: auto;\n      }\n\n      /* fixed position */\n      .fixed-bottom,\n      .fixed-left,\n      .fixed-right,\n      .fixed-top {\n        position: fixed;\n      }\n\n      .fixed-top {\n        top: 0;\n        left: 0;\n        right: 0;\n      }\n\n      .fixed-right {\n        top: 0;\n        right: 0;\n        bottom: 0;\n      }\n\n      .fixed-bottom {\n        right: 0;\n        bottom: 0;\n        left: 0;\n      }\n\n      .fixed-left {\n        top: 0;\n        bottom: 0;\n        left: 0;\n      }\n    </style>\n  </template>\n</dom-module>\n`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nThe `<iron-flex-layout>` component provides simple ways to use\n[CSS flexible box\nlayout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes),\nalso known as flexbox. Note that this is an old element, that was written\nbefore all modern browsers had non-prefixed flex styles. As such, nowadays you\ndon't really need to use this element anymore, and can use CSS flex styles\ndirectly in your code.\n\nThis component provides two different ways to use flexbox:\n\n1. [Layout\nclasses](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).\nThe layout class stylesheet provides a simple set of class-based flexbox rules,\nthat let you specify layout properties directly in markup. You must include this\nfile in every element that needs to use them.\n\n    Sample use:\n\n    ```\n    <custom-element-demo>\n      <template>\n        <script src=\"../webcomponentsjs/webcomponents-lite.js\"></script>\n        <next-code-block></next-code-block>\n      </template>\n    </custom-element-demo>\n    ```\n\n    ```js\n    import {html} from '@polymer/polymer/lib/utils/html-tag.js';\n    import '@polymer/iron-flex-layout/iron-flex-layout-classes.js';\n\n    const template = html`\n      <style is=\"custom-style\" include=\"iron-flex iron-flex-alignment\"></style>\n      <style>\n        .test { width: 100px; }\n      </style>\n      <div class=\"layout horizontal center-center\">\n        <div class=\"test\">horizontal layout center alignment</div>\n      </div>\n    `;\n    document.body.appendChild(template.content);\n    ```\n\n2. [Custom CSS\nmixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html).\nThe mixin stylesheet includes custom CSS mixins that can be applied inside a CSS\nrule using the `@apply` function.\n\nPlease note that the old [/deep/ layout\nclasses](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes)\nare deprecated, and should not be used. To continue using layout properties\ndirectly in markup, please switch to using the new `dom-module`-based\n[layout\nclasses](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).\nPlease note that the new version does not use `/deep/`, and therefore requires\nyou to import the `dom-modules` in every element that needs to use them.\n\n@group Iron Elements\n@pseudoElement iron-flex-layout\n@demo demo/index.html\n*/\nconst template = html`\n<custom-style>\n  <style is=\"custom-style\">\n    [hidden] {\n      display: none !important;\n    }\n  </style>\n</custom-style>\n<custom-style>\n  <style is=\"custom-style\">\n    html {\n\n      --layout: {\n        display: -ms-flexbox;\n        display: -webkit-flex;\n        display: flex;\n      };\n\n      --layout-inline: {\n        display: -ms-inline-flexbox;\n        display: -webkit-inline-flex;\n        display: inline-flex;\n      };\n\n      --layout-horizontal: {\n        @apply --layout;\n\n        -ms-flex-direction: row;\n        -webkit-flex-direction: row;\n        flex-direction: row;\n      };\n\n      --layout-horizontal-reverse: {\n        @apply --layout;\n\n        -ms-flex-direction: row-reverse;\n        -webkit-flex-direction: row-reverse;\n        flex-direction: row-reverse;\n      };\n\n      --layout-vertical: {\n        @apply --layout;\n\n        -ms-flex-direction: column;\n        -webkit-flex-direction: column;\n        flex-direction: column;\n      };\n\n      --layout-vertical-reverse: {\n        @apply --layout;\n\n        -ms-flex-direction: column-reverse;\n        -webkit-flex-direction: column-reverse;\n        flex-direction: column-reverse;\n      };\n\n      --layout-wrap: {\n        -ms-flex-wrap: wrap;\n        -webkit-flex-wrap: wrap;\n        flex-wrap: wrap;\n      };\n\n      --layout-wrap-reverse: {\n        -ms-flex-wrap: wrap-reverse;\n        -webkit-flex-wrap: wrap-reverse;\n        flex-wrap: wrap-reverse;\n      };\n\n      --layout-flex-auto: {\n        -ms-flex: 1 1 auto;\n        -webkit-flex: 1 1 auto;\n        flex: 1 1 auto;\n      };\n\n      --layout-flex-none: {\n        -ms-flex: none;\n        -webkit-flex: none;\n        flex: none;\n      };\n\n      --layout-flex: {\n        -ms-flex: 1 1 0.000000001px;\n        -webkit-flex: 1;\n        flex: 1;\n        -webkit-flex-basis: 0.000000001px;\n        flex-basis: 0.000000001px;\n      };\n\n      --layout-flex-2: {\n        -ms-flex: 2;\n        -webkit-flex: 2;\n        flex: 2;\n      };\n\n      --layout-flex-3: {\n        -ms-flex: 3;\n        -webkit-flex: 3;\n        flex: 3;\n      };\n\n      --layout-flex-4: {\n        -ms-flex: 4;\n        -webkit-flex: 4;\n        flex: 4;\n      };\n\n      --layout-flex-5: {\n        -ms-flex: 5;\n        -webkit-flex: 5;\n        flex: 5;\n      };\n\n      --layout-flex-6: {\n        -ms-flex: 6;\n        -webkit-flex: 6;\n        flex: 6;\n      };\n\n      --layout-flex-7: {\n        -ms-flex: 7;\n        -webkit-flex: 7;\n        flex: 7;\n      };\n\n      --layout-flex-8: {\n        -ms-flex: 8;\n        -webkit-flex: 8;\n        flex: 8;\n      };\n\n      --layout-flex-9: {\n        -ms-flex: 9;\n        -webkit-flex: 9;\n        flex: 9;\n      };\n\n      --layout-flex-10: {\n        -ms-flex: 10;\n        -webkit-flex: 10;\n        flex: 10;\n      };\n\n      --layout-flex-11: {\n        -ms-flex: 11;\n        -webkit-flex: 11;\n        flex: 11;\n      };\n\n      --layout-flex-12: {\n        -ms-flex: 12;\n        -webkit-flex: 12;\n        flex: 12;\n      };\n\n      /* alignment in cross axis */\n\n      --layout-start: {\n        -ms-flex-align: start;\n        -webkit-align-items: flex-start;\n        align-items: flex-start;\n      };\n\n      --layout-center: {\n        -ms-flex-align: center;\n        -webkit-align-items: center;\n        align-items: center;\n      };\n\n      --layout-end: {\n        -ms-flex-align: end;\n        -webkit-align-items: flex-end;\n        align-items: flex-end;\n      };\n\n      --layout-baseline: {\n        -ms-flex-align: baseline;\n        -webkit-align-items: baseline;\n        align-items: baseline;\n      };\n\n      /* alignment in main axis */\n\n      --layout-start-justified: {\n        -ms-flex-pack: start;\n        -webkit-justify-content: flex-start;\n        justify-content: flex-start;\n      };\n\n      --layout-center-justified: {\n        -ms-flex-pack: center;\n        -webkit-justify-content: center;\n        justify-content: center;\n      };\n\n      --layout-end-justified: {\n        -ms-flex-pack: end;\n        -webkit-justify-content: flex-end;\n        justify-content: flex-end;\n      };\n\n      --layout-around-justified: {\n        -ms-flex-pack: distribute;\n        -webkit-justify-content: space-around;\n        justify-content: space-around;\n      };\n\n      --layout-justified: {\n        -ms-flex-pack: justify;\n        -webkit-justify-content: space-between;\n        justify-content: space-between;\n      };\n\n      --layout-center-center: {\n        @apply --layout-center;\n        @apply --layout-center-justified;\n      };\n\n      /* self alignment */\n\n      --layout-self-start: {\n        -ms-align-self: flex-start;\n        -webkit-align-self: flex-start;\n        align-self: flex-start;\n      };\n\n      --layout-self-center: {\n        -ms-align-self: center;\n        -webkit-align-self: center;\n        align-self: center;\n      };\n\n      --layout-self-end: {\n        -ms-align-self: flex-end;\n        -webkit-align-self: flex-end;\n        align-self: flex-end;\n      };\n\n      --layout-self-stretch: {\n        -ms-align-self: stretch;\n        -webkit-align-self: stretch;\n        align-self: stretch;\n      };\n\n      --layout-self-baseline: {\n        -ms-align-self: baseline;\n        -webkit-align-self: baseline;\n        align-self: baseline;\n      };\n\n      /* multi-line alignment in main axis */\n\n      --layout-start-aligned: {\n        -ms-flex-line-pack: start;  /* IE10 */\n        -ms-align-content: flex-start;\n        -webkit-align-content: flex-start;\n        align-content: flex-start;\n      };\n\n      --layout-end-aligned: {\n        -ms-flex-line-pack: end;  /* IE10 */\n        -ms-align-content: flex-end;\n        -webkit-align-content: flex-end;\n        align-content: flex-end;\n      };\n\n      --layout-center-aligned: {\n        -ms-flex-line-pack: center;  /* IE10 */\n        -ms-align-content: center;\n        -webkit-align-content: center;\n        align-content: center;\n      };\n\n      --layout-between-aligned: {\n        -ms-flex-line-pack: justify;  /* IE10 */\n        -ms-align-content: space-between;\n        -webkit-align-content: space-between;\n        align-content: space-between;\n      };\n\n      --layout-around-aligned: {\n        -ms-flex-line-pack: distribute;  /* IE10 */\n        -ms-align-content: space-around;\n        -webkit-align-content: space-around;\n        align-content: space-around;\n      };\n\n      /*******************************\n                Other Layout\n      *******************************/\n\n      --layout-block: {\n        display: block;\n      };\n\n      --layout-invisible: {\n        visibility: hidden !important;\n      };\n\n      --layout-relative: {\n        position: relative;\n      };\n\n      --layout-fit: {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n      };\n\n      --layout-scroll: {\n        -webkit-overflow-scrolling: touch;\n        overflow: auto;\n      };\n\n      --layout-fullbleed: {\n        margin: 0;\n        height: 100vh;\n      };\n\n      /* fixed position */\n\n      --layout-fixed-top: {\n        position: fixed;\n        top: 0;\n        left: 0;\n        right: 0;\n      };\n\n      --layout-fixed-right: {\n        position: fixed;\n        top: 0;\n        right: 0;\n        bottom: 0;\n      };\n\n      --layout-fixed-bottom: {\n        position: fixed;\n        right: 0;\n        bottom: 0;\n        left: 0;\n      };\n\n      --layout-fixed-left: {\n        position: fixed;\n        top: 0;\n        bottom: 0;\n        left: 0;\n      };\n\n    }\n  </style>\n</custom-style>`;\n\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n\nvar style = document.createElement('style');\nstyle.textContent = '[hidden] { display: none !important; }';\ndocument.head.appendChild(style);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n  IronFormElementBehavior adds a `name`, `value` and `required` properties to\n  a custom element. It mostly exists for backcompatibility with Polymer 1.x, and\n  is probably not something you want to use.\n\n  @demo demo/index.html\n  @polymerBehavior\n */\nexport const IronFormElementBehavior = {\n\n  properties: {\n    /**\n     * The name of this element.\n     */\n    name: {type: String},\n\n    /**\n     * The value for this element.\n     * @type {*}\n     */\n    value: {notify: true, type: String},\n\n    /**\n     * Set to true to mark the input as required. If used in a form, a\n     * custom element that uses this behavior should also use\n     * IronValidatableBehavior and define a custom validation method.\n     * Otherwise, a `required` element will always be considered valid.\n     * It's also strongly recommended to provide a visual style for the element\n     * when its value is invalid.\n     */\n    required: {type: Boolean, value: false},\n  },\n\n  // Empty implementations for backcompatibility.\n  attached: function() {},\n  detached: function() {}\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {IronMeta} from '@polymer/iron-meta/iron-meta.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {Base} from '@polymer/polymer/polymer-legacy.js';\n\n/**\n\nThe `iron-icon` element displays an icon. By default an icon renders as a 24px\nsquare.\n\nExample using src:\n\n    <iron-icon src=\"star.png\"></iron-icon>\n\nExample setting size to 32px x 32px:\n\n    <iron-icon class=\"big\" src=\"big_star.png\"></iron-icon>\n\n    <style is=\"custom-style\">\n      .big {\n        --iron-icon-height: 32px;\n        --iron-icon-width: 32px;\n      }\n    </style>\n\nThe iron elements include several sets of icons. To use the default set of\nicons, import `iron-icons.js` and use the `icon` attribute to specify an icon:\n\n    <script type=\"module\">\n      import \"@polymer/iron-icons/iron-icons.js\";\n    </script>\n\n    <iron-icon icon=\"menu\"></iron-icon>\n\nTo use a different built-in set of icons, import the specific\n`iron-icons/<iconset>-icons.js`, and specify the icon as `<iconset>:<icon>`.\nFor example, to use a communication icon, you would use:\n\n    <script type=\"module\">\n      import \"@polymer/iron-icons/communication-icons.js\";\n    </script>\n\n    <iron-icon icon=\"communication:email\"></iron-icon>\n\nYou can also create custom icon sets of bitmap or SVG icons.\n\nExample of using an icon named `cherry` from a custom iconset with the ID\n`fruit`:\n\n    <iron-icon icon=\"fruit:cherry\"></iron-icon>\n\nSee `<iron-iconset>` and `<iron-iconset-svg>` for more information about how to\ncreate a custom iconset.\n\nSee the `iron-icons` demo to see the icons available in the various iconsets.\n\n### Styling\n\nThe following custom properties are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--iron-icon` | Mixin applied to the icon | {}\n`--iron-icon-width` | Width of the icon | `24px`\n`--iron-icon-height` | Height of the icon | `24px`\n`--iron-icon-fill-color` | Fill color of the svg icon | `currentcolor`\n`--iron-icon-stroke-color` | Stroke color of the svg icon | none\n\n@group Iron Elements\n@element iron-icon\n@demo demo/index.html\n@hero hero.svg\n@homepage polymer.github.io\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        @apply --layout-inline;\n        @apply --layout-center-center;\n        position: relative;\n\n        vertical-align: middle;\n\n        fill: var(--iron-icon-fill-color, currentcolor);\n        stroke: var(--iron-icon-stroke-color, none);\n\n        width: var(--iron-icon-width, 24px);\n        height: var(--iron-icon-height, 24px);\n        @apply --iron-icon;\n      }\n\n      :host([hidden]) {\n        display: none;\n      }\n    </style>\n`,\n\n  is: 'iron-icon',\n\n  properties: {\n\n    /**\n     * The name of the icon to use. The name should be of the form:\n     * `iconset_name:icon_name`.\n     */\n    icon: {type: String},\n\n    /**\n     * The name of the theme to used, if one is specified by the\n     * iconset.\n     */\n    theme: {type: String},\n\n    /**\n     * If using iron-icon without an iconset, you can set the src to be\n     * the URL of an individual icon image file. Note that this will take\n     * precedence over a given icon attribute.\n     */\n    src: {type: String},\n\n    /**\n     * @type {!IronMeta}\n     */\n    _meta: {value: Base.create('iron-meta', {type: 'iconset'})}\n\n  },\n\n  observers: [\n    '_updateIcon(_meta, isAttached)',\n    '_updateIcon(theme, isAttached)',\n    '_srcChanged(src, isAttached)',\n    '_iconChanged(icon, isAttached)'\n  ],\n\n  _DEFAULT_ICONSET: 'icons',\n\n  _iconChanged: function(icon) {\n    var parts = (icon || '').split(':');\n    this._iconName = parts.pop();\n    this._iconsetName = parts.pop() || this._DEFAULT_ICONSET;\n    this._updateIcon();\n  },\n\n  _srcChanged: function(src) {\n    this._updateIcon();\n  },\n\n  _usesIconset: function() {\n    return this.icon || !this.src;\n  },\n\n  /** @suppress {visibility} */\n  _updateIcon: function() {\n    if (this._usesIconset()) {\n      if (this._img && this._img.parentNode) {\n        dom(this.root).removeChild(this._img);\n      }\n      if (this._iconName === '') {\n        if (this._iconset) {\n          this._iconset.removeIcon(this);\n        }\n      } else if (this._iconsetName && this._meta) {\n        this._iconset = /** @type {?Polymer.Iconset} */ (\n            this._meta.byKey(this._iconsetName));\n        if (this._iconset) {\n          this._iconset.applyIcon(this, this._iconName, this.theme);\n          this.unlisten(window, 'iron-iconset-added', '_updateIcon');\n        } else {\n          this.listen(window, 'iron-iconset-added', '_updateIcon');\n        }\n      }\n    } else {\n      if (this._iconset) {\n        this._iconset.removeIcon(this);\n      }\n      if (!this._img) {\n        this._img = document.createElement('img');\n        this._img.style.width = '100%';\n        this._img.style.height = '100%';\n        this._img.draggable = false;\n      }\n      this._img.src = this.src;\n      dom(this.root).appendChild(this._img);\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-icon/iron-icon.js';\nimport '@polymer/iron-iconset-svg/iron-iconset-svg.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n\n`iron-icons` is a utility import that includes the definition for the\n`iron-icon` element, `iron-iconset-svg` element, as well as an import for the\ndefault icon set.\n\nThe `iron-icons` directory also includes imports for additional icon sets that\ncan be loaded into your project.\n\nExample loading icon set:\n\n    <script type=\"module\">\n      import '@polymer/iron-icons/maps-icons.js';\n    </script>\n\nTo use an icon from one of these sets, first prefix your `iron-icon` with the\nicon set name, followed by a colon, \":\", and then the icon id.\n\nExample using the directions-bus icon from the maps icon set:\n\n    <iron-icon icon=\"maps:directions-bus\"></iron-icon>\n\nSee [iron-icon](https://www.webcomponents.org/element/@polymer/iron-icon) for\nmore information about working with icons.\n\nSee [iron-iconset](https://www.webcomponents.org/element/@polymer/iron-iconset)\nand\n[iron-iconset-svg](https://www.webcomponents.org/element/@polymer/iron-iconset-svg)\nfor more information about how to create a custom iconset.\n\n@group Iron Elements\n@pseudoElement iron-icons\n@demo demo/index.html\n*/\n\nconst template = html`<iron-iconset-svg name=\"icons\" size=\"24\">\n<svg><defs>\n<g id=\"3d-rotation\"><path d=\"M7.52 21.48C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43C9.1 8.05 8.76 8 8.39 8c-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09H7.5v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27H12v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91V9.12h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zM12 0l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5C23.44 4.84 18.29 0 12 0z\"></path></g>\n<g id=\"accessibility\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z\"></path></g>\n<g id=\"accessible\"><circle cx=\"12\" cy=\"4\" r=\"2\"></circle><path d=\"M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07z\"></path></g>\n<g id=\"account-balance\"><path d=\"M4 10v7h3v-7H4zm6 0v7h3v-7h-3zM2 22h19v-3H2v3zm14-12v7h3v-7h-3zm-4.5-9L2 6v2h19V6l-9.5-5z\"></path></g>\n<g id=\"account-balance-wallet\"><path d=\"M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"></path></g>\n<g id=\"account-box\"><path d=\"M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z\"></path></g>\n<g id=\"account-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"></path></g>\n<g id=\"add\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"></path></g>\n<g id=\"add-alert\"><path d=\"M10.01 21.01c0 1.1.89 1.99 1.99 1.99s1.99-.89 1.99-1.99h-3.98zm8.87-4.19V11c0-3.25-2.25-5.97-5.29-6.69v-.72C13.59 2.71 12.88 2 12 2s-1.59.71-1.59 1.59v.72C7.37 5.03 5.12 7.75 5.12 11v5.82L3 18.94V20h18v-1.06l-2.12-2.12zM16 13.01h-3v3h-2v-3H8V11h3V8h2v3h3v2.01z\"></path></g>\n<g id=\"add-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4H7v-2h4V7h2v4h4v2z\"></path></g>\n<g id=\"add-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z\"></path></g>\n<g id=\"add-circle-outline\"><path d=\"M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"></path></g>\n<g id=\"add-shopping-cart\"><path d=\"M11 9h2V6h3V4h-3V1h-2v3H8v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01L19.42 4h-.01l-1.1 2-2.76 5H8.53l-.13-.27L6.16 6l-.95-2-.94-2H1v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.13 0-.25-.11-.25-.25z\"></path></g>\n<g id=\"alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"></path></g>\n<g id=\"alarm-add\"><path d=\"M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3H8v2h3v3h2v-3h3v-2h-3V9z\"></path></g>\n<g id=\"alarm-off\"><path d=\"M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91L9.6 6.43C10.35 6.16 11.16 6 12 6zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM2.92 2.29L1.65 3.57 2.98 4.9l-1.11.93 1.42 1.42 1.11-.94.8.8C3.83 8.69 3 10.75 3 13c0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27L3.89 3.27l-.97-.98zm13.55 16.1C15.26 19.39 13.7 20 12 20c-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zM8.02 3.28L6.6 1.86l-.86.71 1.42 1.42.86-.71z\"></path></g>\n<g id=\"alarm-on\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47L8.41 12.4l-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z\"></path></g>\n<g id=\"all-out\"><path d=\"M16.21 4.16l4 4v-4zm4 12l-4 4h4zm-12 4l-4-4v4zm-4-12l4-4h-4zm12.95-.95c-2.73-2.73-7.17-2.73-9.9 0s-2.73 7.17 0 9.9 7.17 2.73 9.9 0 2.73-7.16 0-9.9zm-1.1 8.8c-2.13 2.13-5.57 2.13-7.7 0s-2.13-5.57 0-7.7 5.57-2.13 7.7 0 2.13 5.57 0 7.7z\"></path></g>\n<g id=\"android\"><path d=\"M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h1c.55 0 1-.45 1-1V8H6v10zM3.5 8C2.67 8 2 8.67 2 9.5v7c0 .83.67 1.5 1.5 1.5S5 17.33 5 16.5v-7C5 8.67 4.33 8 3.5 8zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48C13.85 1.23 12.95 1 12 1c-.96 0-1.86.23-2.66.63L7.85.15c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31C6.97 3.26 6 5.01 6 7h12c0-1.99-.97-3.75-2.47-4.84zM10 5H9V4h1v1zm5 0h-1V4h1v1z\"></path></g>\n<g id=\"announcement\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 9h-2V5h2v6zm0 4h-2v-2h2v2z\"></path></g>\n<g id=\"apps\"><path d=\"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"></path></g>\n<g id=\"archive\"><path d=\"M20.54 5.23l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5L6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z\"></path></g>\n<g id=\"arrow-back\"><path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"></path></g>\n<g id=\"arrow-downward\"><path d=\"M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\"></path></g>\n<g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"></path></g>\n<g id=\"arrow-drop-down-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 12l-4-4h8l-4 4z\"></path></g>\n<g id=\"arrow-drop-up\"><path d=\"M7 14l5-5 5 5z\"></path></g>\n<g id=\"arrow-forward\"><path d=\"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"></path></g>\n<g id=\"arrow-upward\"><path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\"></path></g>\n<g id=\"aspect-ratio\"><path d=\"M19 12h-2v3h-3v2h5v-5zM7 9h3V7H5v5h2V9zm14-6H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z\"></path></g>\n<g id=\"assessment\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"></path></g>\n<g id=\"assignment\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z\"></path></g>\n<g id=\"assignment-ind\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1V19z\"></path></g>\n<g id=\"assignment-late\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2V8h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"></path></g>\n<g id=\"assignment-return\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z\"></path></g>\n<g id=\"assignment-returned\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3V9h4v4h3l-5 5z\"></path></g>\n<g id=\"assignment-turned-in\"><path d=\"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"></path></g>\n<g id=\"attachment\"><path d=\"M2 12.5C2 9.46 4.46 7 7.5 7H18c2.21 0 4 1.79 4 4s-1.79 4-4 4H9.5C8.12 15 7 13.88 7 12.5S8.12 10 9.5 10H17v2H9.41c-.55 0-.55 1 0 1H18c1.1 0 2-.9 2-2s-.9-2-2-2H7.5C5.57 9 4 10.57 4 12.5S5.57 16 7.5 16H17v2H7.5C4.46 18 2 15.54 2 12.5z\"></path></g>\n<g id=\"autorenew\"><path d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"></path></g>\n<g id=\"backspace\"><path d=\"M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z\"></path></g>\n<g id=\"backup\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z\"></path></g>\n<g id=\"block\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z\"></path></g>\n<g id=\"book\"><path d=\"M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z\"></path></g>\n<g id=\"bookmark\"><path d=\"M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"bookmark-border\"><path d=\"M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z\"></path></g>\n<g id=\"bug-report\"><path d=\"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z\"></path></g>\n<g id=\"build\"><path d=\"M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z\"></path></g>\n<g id=\"cached\"><path d=\"M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46C8.97 19.54 10.43 20 12 20c4.42 0 8-3.58 8-8h3l-4-4zM6 12c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46C15.03 4.46 13.57 4 12 4c-4.42 0-8 3.58-8 8H1l4 4 4-4H6z\"></path></g>\n<g id=\"camera-enhance\"><path d=\"M9 3L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2h-3.17L15 3H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-1l1.25-2.75L16 13l-2.75-1.25L12 9l-1.25 2.75L8 13l2.75 1.25z\"></path></g>\n<g id=\"cancel\"><path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z\"></path></g>\n<g id=\"card-giftcard\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z\"></path></g>\n<g id=\"card-membership\"><path d=\"M20 2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2V4c0-1.11-.89-2-2-2zm0 13H4v-2h16v2zm0-5H4V4h16v6z\"></path></g>\n<g id=\"card-travel\"><path d=\"M20 6h-3V4c0-1.11-.89-2-2-2H9c-1.11 0-2 .89-2 2v2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zM9 4h6v2H9V4zm11 15H4v-2h16v2zm0-5H4V8h3v2h2V8h6v2h2V8h3v6z\"></path></g>\n<g id=\"change-history\"><path d=\"M12 7.77L18.39 18H5.61L12 7.77M12 4L2 20h20L12 4z\"></path></g>\n<g id=\"check\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"></path></g>\n<g id=\"check-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path></g>\n<g id=\"check-box-outline-blank\"><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"check-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path></g>\n<g id=\"chevron-left\"><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path></g>\n<g id=\"chevron-right\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path></g>\n<g id=\"chrome-reader-mode\"><path d=\"M13 12h7v1.5h-7zm0-2.5h7V11h-7zm0 5h7V16h-7zM21 4H3c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 15h-9V6h9v13z\"></path></g>\n<g id=\"class\"><path d=\"M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z\"></path></g>\n<g id=\"clear\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"></path></g>\n<g id=\"close\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"></path></g>\n<g id=\"cloud\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z\"></path></g>\n<g id=\"cloud-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.5 14H8c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01C8.58 8.28 10.13 7 12 7c2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5S17.88 16 16.5 16z\"></path></g>\n<g id=\"cloud-done\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM10 17l-3.5-3.5 1.41-1.41L10 14.17 15.18 9l1.41 1.41L10 17z\"></path></g>\n<g id=\"cloud-download\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM17 13l-5 5-5-5h3V9h4v4h3z\"></path></g>\n<g id=\"cloud-off\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4c-1.48 0-2.85.43-4.01 1.17l1.46 1.46C10.21 6.23 11.08 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45C23.16 18.16 24 16.68 24 15c0-2.64-2.05-4.78-4.65-4.96zM3 5.27l2.75 2.74C2.56 8.15 0 10.77 0 14c0 3.31 2.69 6 6 6h11.73l2 2L21 20.73 4.27 4 3 5.27zM7.73 10l8 8H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z\"></path></g>\n<g id=\"cloud-queue\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71C7.37 7.69 9.48 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3s-1.34 3-3 3z\"></path></g>\n<g id=\"cloud-upload\"><path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z\"></path></g>\n<g id=\"code\"><path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"></path></g>\n<g id=\"compare-arrows\"><path d=\"M9.01 14H2v2h7.01v3L13 15l-3.99-4v3zm5.98-1v-3H22V8h-7.01V5L11 9l3.99 4z\"></path></g>\n<g id=\"content-copy\"><path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"></path></g>\n<g id=\"content-cut\"><path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4S2 3.79 2 6s1.79 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1L9.64 7.64zM6 8c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zM19 3l-6 6 2 2 7-7V3z\"></path></g>\n<g id=\"content-paste\"><path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\"></path></g>\n<g id=\"copyright\"><path d=\"M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91 1.05.34 1.7.34c.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"></path></g>\n<g id=\"create\"><path d=\"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"></path></g>\n<g id=\"create-new-folder\"><path d=\"M20 6h-8l-2-2H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-1 8h-3v3h-2v-3h-3v-2h3V9h2v3h3v2z\"></path></g>\n<g id=\"credit-card\"><path d=\"M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z\"></path></g>\n<g id=\"dashboard\"><path d=\"M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z\"></path></g>\n<g id=\"date-range\"><path d=\"M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z\"></path></g>\n<g id=\"delete\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"></path></g>\n<g id=\"delete-forever\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z\"></path></g>\n<g id=\"delete-sweep\"><path d=\"M15 16h4v2h-4zm0-8h7v2h-7zm0 4h6v2h-6zM3 18c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V8H3v10zM14 5h-3l-1-1H6L5 5H2v2h12z\"></path></g>\n<g id=\"description\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"></path></g>\n<g id=\"dns\"><path d=\"M20 13H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zM7 19c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM20 3H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zM7 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"></path></g>\n<g id=\"done\"><path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\"></path></g>\n<g id=\"done-all\"><path d=\"M18 7l-1.41-1.41-6.34 6.34 1.41 1.41L18 7zm4.24-1.41L11.66 16.17 7.48 12l-1.41 1.41L11.66 19l12-12-1.42-1.41zM.41 13.41L6 19l1.41-1.41L1.83 12 .41 13.41z\"></path></g>\n<g id=\"donut-large\"><path d=\"M11 5.08V2c-5 .5-9 4.81-9 10s4 9.5 9 10v-3.08c-3-.48-6-3.4-6-6.92s3-6.44 6-6.92zM18.97 11H22c-.47-5-4-8.53-9-9v3.08C16 5.51 18.54 8 18.97 11zM13 18.92V22c5-.47 8.53-4 9-9h-3.03c-.43 3-2.97 5.49-5.97 5.92z\"></path></g>\n<g id=\"donut-small\"><path d=\"M11 9.16V2c-5 .5-9 4.79-9 10s4 9.5 9 10v-7.16c-1-.41-2-1.52-2-2.84s1-2.43 2-2.84zM14.86 11H22c-.48-4.75-4-8.53-9-9v7.16c1 .3 1.52.98 1.86 1.84zM13 14.84V22c5-.47 8.52-4.25 9-9h-7.14c-.34.86-.86 1.54-1.86 1.84z\"></path></g>\n<g id=\"drafts\"><path d=\"M21.99 8c0-.72-.37-1.35-.94-1.7L12 1 2.95 6.3C2.38 6.65 2 7.28 2 8v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zM12 13L3.74 7.84 12 3l8.26 4.84L12 13z\"></path></g>\n<g id=\"eject\"><path d=\"M5 17h14v2H5zm7-12L5.33 15h13.34z\"></path></g>\n<g id=\"error\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"></path></g>\n<g id=\"error-outline\"><path d=\"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"></path></g>\n<g id=\"euro-symbol\"><path d=\"M15 18.5c-2.51 0-4.68-1.42-5.76-3.5H15v-2H8.58c-.05-.33-.08-.66-.08-1s.03-.67.08-1H15V9H9.24C10.32 6.92 12.5 5.5 15 5.5c1.61 0 3.09.59 4.23 1.57L21 5.3C19.41 3.87 17.3 3 15 3c-3.92 0-7.24 2.51-8.48 6H3v2h3.06c-.04.33-.06.66-.06 1 0 .34.02.67.06 1H3v2h3.52c1.24 3.49 4.56 6 8.48 6 2.31 0 4.41-.87 6-2.3l-1.78-1.77c-1.13.98-2.6 1.57-4.22 1.57z\"></path></g>\n<g id=\"event\"><path d=\"M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z\"></path></g>\n<g id=\"event-seat\"><path d=\"M4 18v3h3v-3h10v3h3v-6H4zm15-8h3v3h-3zM2 10h3v3H2zm15 3H7V5c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2v8z\"></path></g>\n<g id=\"exit-to-app\"><path d=\"M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"expand-less\"><path d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"></path></g>\n<g id=\"expand-more\"><path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"></path></g>\n<g id=\"explore\"><path d=\"M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm2.19 12.19L6 18l3.81-8.19L18 6l-3.81 8.19z\"></path></g>\n<g id=\"extension\"><path d=\"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z\"></path></g>\n<g id=\"face\"><path d=\"M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z\"></path></g>\n<g id=\"favorite\"><path d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"></path></g>\n<g id=\"favorite-border\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"></path></g>\n<g id=\"feedback\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z\"></path></g>\n<g id=\"file-download\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"></path></g>\n<g id=\"file-upload\"><path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\"></path></g>\n<g id=\"filter-list\"><path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"></path></g>\n<g id=\"find-in-page\"><path d=\"M20 19.59V8l-6-6H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75L20 19.59zM9 13c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z\"></path></g>\n<g id=\"find-replace\"><path d=\"M11 6c1.38 0 2.63.56 3.54 1.46L12 10h6V4l-2.05 2.05C14.68 4.78 12.93 4 11 4c-3.53 0-6.43 2.61-6.92 6H6.1c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14H15.9c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46L10 12H4v6l2.05-2.05C7.32 17.22 9.07 18 11 18c1.55 0 2.98-.51 4.14-1.36L20 21.49 21.49 20l-4.85-4.86z\"></path></g>\n<g id=\"fingerprint\"><path d=\"M17.81 4.47c-.08 0-.16-.02-.23-.06C15.66 3.42 14 3 12.01 3c-1.98 0-3.86.47-5.57 1.41-.24.13-.54.04-.68-.2-.13-.24-.04-.55.2-.68C7.82 2.52 9.86 2 12.01 2c2.13 0 3.99.47 6.03 1.52.25.13.34.43.21.67-.09.18-.26.28-.44.28zM3.5 9.72c-.1 0-.2-.03-.29-.09-.23-.16-.28-.47-.12-.7.99-1.4 2.25-2.5 3.75-3.27C9.98 4.04 14 4.03 17.15 5.65c1.5.77 2.76 1.86 3.75 3.25.16.22.11.54-.12.7-.23.16-.54.11-.7-.12-.9-1.26-2.04-2.25-3.39-2.94-2.87-1.47-6.54-1.47-9.4.01-1.36.7-2.5 1.7-3.4 2.96-.08.14-.23.21-.39.21zm6.25 12.07c-.13 0-.26-.05-.35-.15-.87-.87-1.34-1.43-2.01-2.64-.69-1.23-1.05-2.73-1.05-4.34 0-2.97 2.54-5.39 5.66-5.39s5.66 2.42 5.66 5.39c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-2.42-2.09-4.39-4.66-4.39-2.57 0-4.66 1.97-4.66 4.39 0 1.44.32 2.77.93 3.85.64 1.15 1.08 1.64 1.85 2.42.19.2.19.51 0 .71-.11.1-.24.15-.37.15zm7.17-1.85c-1.19 0-2.24-.3-3.1-.89-1.49-1.01-2.38-2.65-2.38-4.39 0-.28.22-.5.5-.5s.5.22.5.5c0 1.41.72 2.74 1.94 3.56.71.48 1.54.71 2.54.71.24 0 .64-.03 1.04-.1.27-.05.53.13.58.41.05.27-.13.53-.41.58-.57.11-1.07.12-1.21.12zM14.91 22c-.04 0-.09-.01-.13-.02-1.59-.44-2.63-1.03-3.72-2.1-1.4-1.39-2.17-3.24-2.17-5.22 0-1.62 1.38-2.94 3.08-2.94 1.7 0 3.08 1.32 3.08 2.94 0 1.07.93 1.94 2.08 1.94s2.08-.87 2.08-1.94c0-3.77-3.25-6.83-7.25-6.83-2.84 0-5.44 1.58-6.61 4.03-.39.81-.59 1.76-.59 2.8 0 .78.07 2.01.67 3.61.1.26-.03.55-.29.64-.26.1-.55-.04-.64-.29-.49-1.31-.73-2.61-.73-3.96 0-1.2.23-2.29.68-3.24 1.33-2.79 4.28-4.6 7.51-4.6 4.55 0 8.25 3.51 8.25 7.83 0 1.62-1.38 2.94-3.08 2.94s-3.08-1.32-3.08-2.94c0-1.07-.93-1.94-2.08-1.94s-2.08.87-2.08 1.94c0 1.71.66 3.31 1.87 4.51.95.94 1.86 1.46 3.27 1.85.27.07.42.35.35.61-.05.23-.26.38-.47.38z\"></path></g>\n<g id=\"first-page\"><path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\"></path></g>\n<g id=\"flag\"><path d=\"M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z\"></path></g>\n<g id=\"flight-land\"><path d=\"M2.5 19h19v2h-19zm7.18-5.73l4.35 1.16 5.31 1.42c.8.21 1.62-.26 1.84-1.06.21-.8-.26-1.62-1.06-1.84l-5.31-1.42-2.76-9.02L10.12 2v8.28L5.15 8.95l-.93-2.32-1.45-.39v5.17l1.6.43 5.31 1.43z\"></path></g>\n<g id=\"flight-takeoff\"><path d=\"M2.5 19h19v2h-19zm19.57-9.36c-.21-.8-1.04-1.28-1.84-1.06L14.92 10l-6.9-6.43-1.93.51 4.14 7.17-4.97 1.33-1.97-1.54-1.45.39 1.82 3.16.77 1.33 1.6-.43 5.31-1.42 4.35-1.16L21 11.49c.81-.23 1.28-1.05 1.07-1.85z\"></path></g>\n<g id=\"flip-to-back\"><path d=\"M9 7H7v2h2V7zm0 4H7v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2V3zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2V3zM9 17v-2H7c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2V7h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zM5 7H3v12c0 1.1.89 2 2 2h12v-2H5V7zm10-2h2V3h-2v2zm0 12h2v-2h-2v2z\"></path></g>\n<g id=\"flip-to-front\"><path d=\"M3 13h2v-2H3v2zm0 4h2v-2H3v2zm2 4v-2H3c0 1.1.89 2 2 2zM3 9h2V7H3v2zm12 12h2v-2h-2v2zm4-18H9c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12H9V5h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2H7v2z\"></path></g>\n<g id=\"folder\"><path d=\"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"></path></g>\n<g id=\"folder-open\"><path d=\"M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z\"></path></g>\n<g id=\"folder-shared\"><path d=\"M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z\"></path></g>\n<g id=\"font-download\"><path d=\"M9.93 13.5h4.14L12 7.98zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z\"></path></g>\n<g id=\"forward\"><path d=\"M12 8V4l8 8-8 8v-4H4V8z\"></path></g>\n<g id=\"fullscreen\"><path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"></path></g>\n<g id=\"fullscreen-exit\"><path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"></path></g>\n<g id=\"g-translate\"><path d=\"M20 5h-9.12L10 2H4c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h7l1 3h8c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zM7.17 14.59c-2.25 0-4.09-1.83-4.09-4.09s1.83-4.09 4.09-4.09c1.04 0 1.99.37 2.74 1.07l.07.06-1.23 1.18-.06-.05c-.29-.27-.78-.59-1.52-.59-1.31 0-2.38 1.09-2.38 2.42s1.07 2.42 2.38 2.42c1.37 0 1.96-.87 2.12-1.46H7.08V9.91h3.95l.01.07c.04.21.05.4.05.61 0 2.35-1.61 4-3.92 4zm6.03-1.71c.33.6.74 1.18 1.19 1.7l-.54.53-.65-2.23zm.77-.76h-.99l-.31-1.04h3.99s-.34 1.31-1.56 2.74c-.52-.62-.89-1.23-1.13-1.7zM21 20c0 .55-.45 1-1 1h-7l2-2-.81-2.77.92-.92L17.79 18l.73-.73-2.71-2.68c.9-1.03 1.6-2.25 1.92-3.51H19v-1.04h-3.64V9h-1.04v1.04h-1.96L11.18 6H20c.55 0 1 .45 1 1v13z\"></path></g>\n<g id=\"gavel\"><path d=\"M1 21h12v2H1zM5.245 8.07l2.83-2.827 14.14 14.142-2.828 2.828zM12.317 1l5.657 5.656-2.83 2.83-5.654-5.66zM3.825 9.485l5.657 5.657-2.828 2.828-5.657-5.657z\"></path></g>\n<g id=\"gesture\"><path d=\"M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1H21v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28C8.95 3.69 7.31 3 6.44 3 5.12 3 3.97 4 3.72 4.25c-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z\"></path></g>\n<g id=\"get-app\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"></path></g>\n<g id=\"gif\"><path d=\"M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z\"></path></g>\n<g id=\"grade\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"></path></g>\n<g id=\"group-work\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM8 17.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zM9.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S9.5 9.38 9.5 8zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"></path></g>\n<g id=\"help\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"></path></g>\n<g id=\"help-outline\"><path d=\"M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z\"></path></g>\n<g id=\"highlight-off\"><path d=\"M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"></path></g>\n<g id=\"history\"><path d=\"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z\"></path></g>\n<g id=\"home\"><path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"></path></g>\n<g id=\"hourglass-empty\"><path d=\"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z\"></path></g>\n<g id=\"hourglass-full\"><path d=\"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6z\"></path></g>\n<g id=\"http\"><path d=\"M4.5 11h-2V9H1v6h1.5v-2.5h2V15H6V9H4.5v2zm2.5-.5h1.5V15H10v-4.5h1.5V9H7v1.5zm5.5 0H14V15h1.5v-4.5H17V9h-4.5v1.5zm9-1.5H18v6h1.5v-2h2c.8 0 1.5-.7 1.5-1.5v-1c0-.8-.7-1.5-1.5-1.5zm0 2.5h-2v-1h2v1z\"></path></g>\n<g id=\"https\"><path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"></path></g>\n<g id=\"important-devices\"><path d=\"M23 11.01L18 11c-.55 0-1 .45-1 1v9c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-9c0-.55-.45-.99-1-.99zM23 20h-5v-7h5v7zM20 2H2C.89 2 0 2.89 0 4v12c0 1.1.89 2 2 2h7v2H7v2h8v-2h-2v-2h2v-2H2V4h18v5h2V4c0-1.11-.9-2-2-2zm-8.03 7L11 6l-.97 3H7l2.47 1.76-.94 2.91 2.47-1.8 2.47 1.8-.94-2.91L15 9h-3.03z\"></path></g>\n<g id=\"inbox\"><path d=\"M19 3H4.99c-1.11 0-1.98.89-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.11-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10z\"></path></g>\n<g id=\"indeterminate-check-box\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"></path></g>\n<g id=\"info\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"></path></g>\n<g id=\"info-outline\"><path d=\"M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z\"></path></g>\n<g id=\"input\"><path d=\"M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3z\"></path></g>\n<g id=\"invert-colors\"><path d=\"M17.66 7.93L12 2.27 6.34 7.93c-3.12 3.12-3.12 8.19 0 11.31C7.9 20.8 9.95 21.58 12 21.58c2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zM12 19.59c-1.6 0-3.11-.62-4.24-1.76C6.62 16.69 6 15.19 6 13.59s.62-3.11 1.76-4.24L12 5.1v14.49z\"></path></g>\n<g id=\"label\"><path d=\"M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16z\"></path></g>\n<g id=\"label-outline\"><path d=\"M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16zM16 17H5V7h11l3.55 5L16 17z\"></path></g>\n<g id=\"language\"><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zM12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zM4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2H4.26zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8zM12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zM14.34 14H9.66c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zM16.36 14c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\"></path></g>\n<g id=\"last-page\"><path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\"></path></g>\n<g id=\"launch\"><path d=\"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"></path></g>\n<g id=\"lightbulb-outline\"><path d=\"M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z\"></path></g>\n<g id=\"line-style\"><path d=\"M3 16h5v-2H3v2zm6.5 0h5v-2h-5v2zm6.5 0h5v-2h-5v2zM3 20h2v-2H3v2zm4 0h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM3 12h8v-2H3v2zm10 0h8v-2h-8v2zM3 4v4h18V4H3z\"></path></g>\n<g id=\"line-weight\"><path d=\"M3 17h18v-2H3v2zm0 3h18v-1H3v1zm0-7h18v-3H3v3zm0-9v4h18V4H3z\"></path></g>\n<g id=\"link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"></path></g>\n<g id=\"list\"><path d=\"M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z\"></path></g>\n<g id=\"lock\"><path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"></path></g>\n<g id=\"lock-open\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z\"></path></g>\n<g id=\"lock-outline\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H8.9V6zM18 20H6V10h12v10z\"></path></g>\n<g id=\"low-priority\"><path d=\"M14 5h8v2h-8zm0 5.5h8v2h-8zm0 5.5h8v2h-8zM2 11.5C2 15.08 4.92 18 8.5 18H9v2l3-3-3-3v2h-.5C6.02 16 4 13.98 4 11.5S6.02 7 8.5 7H12V5H8.5C4.92 5 2 7.92 2 11.5z\"></path></g>\n<g id=\"loyalty\"><path d=\"M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7zm11.77 8.27L13 19.54l-4.27-4.27C8.28 14.81 8 14.19 8 13.5c0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z\"></path></g>\n<g id=\"mail\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"></path></g>\n<g id=\"markunread\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"></path></g>\n<g id=\"markunread-mailbox\"><path d=\"M20 6H10v6H8V4h6V0H6v6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"menu\"><path d=\"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\"></path></g>\n<g id=\"more-horiz\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path></g>\n<g id=\"more-vert\"><path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path></g>\n<g id=\"motorcycle\"><path d=\"M19.44 9.03L15.41 5H11v2h3.59l2 2H5c-2.8 0-5 2.2-5 5s2.2 5 5 5c2.46 0 4.45-1.69 4.9-4h1.65l2.77-2.77c-.21.54-.32 1.14-.32 1.77 0 2.8 2.2 5 5 5s5-2.2 5-5c0-2.65-1.97-4.77-4.56-4.97zM7.82 15C7.4 16.15 6.28 17 5 17c-1.63 0-3-1.37-3-3s1.37-3 3-3c1.28 0 2.4.85 2.82 2H5v2h2.82zM19 17c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"></path></g>\n<g id=\"move-to-inbox\"><path d=\"M19 3H4.99c-1.11 0-1.98.9-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10zm-3-5h-2V7h-4v3H8l4 4 4-4z\"></path></g>\n<g id=\"next-week\"><path d=\"M20 7h-4V5c0-.55-.22-1.05-.59-1.41C15.05 3.22 14.55 3 14 3h-4c-1.1 0-2 .9-2 2v2H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zM10 5h4v2h-4V5zm1 13.5l-1-1 3-3-3-3 1-1 4 4-4 4z\"></path></g>\n<g id=\"note-add\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 14h-3v3h-2v-3H8v-2h3v-3h2v3h3v2zm-3-7V3.5L18.5 9H13z\"></path></g>\n<g id=\"offline-pin\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 16H7v-2h10v2zm-6.7-4L7 10.7l1.4-1.4 1.9 1.9 5.3-5.3L17 7.3 10.3 14z\"></path></g>\n<g id=\"opacity\"><path d=\"M17.66 8L12 2.35 6.34 8C4.78 9.56 4 11.64 4 13.64s.78 4.11 2.34 5.67 3.61 2.35 5.66 2.35 4.1-.79 5.66-2.35S20 15.64 20 13.64 19.22 9.56 17.66 8zM6 14c.01-2 .62-3.27 1.76-4.4L12 5.27l4.24 4.38C17.38 10.77 17.99 12 18 14H6z\"></path></g>\n<g id=\"open-in-browser\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"></path></g>\n<g id=\"open-in-new\"><path d=\"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"></path></g>\n<g id=\"open-with\"><path d=\"M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z\"></path></g>\n<g id=\"pageview\"><path d=\"M11.5 9C10.12 9 9 10.12 9 11.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5S12.88 9 11.5 9zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-3.21 14.21l-2.91-2.91c-.69.44-1.51.7-2.39.7C9.01 16 7 13.99 7 11.5S9.01 7 11.5 7 16 9.01 16 11.5c0 .88-.26 1.69-.7 2.39l2.91 2.9-1.42 1.42z\"></path></g>\n<g id=\"pan-tool\"><path d=\"M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z\"></path></g>\n<g id=\"payment\"><path d=\"M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z\"></path></g>\n<g id=\"perm-camera-mic\"><path d=\"M20 5h-3.17L15 3H9L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91V21h7c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2V9c0-1.1.9-2 2-2s2 .9 2 2v4z\"></path></g>\n<g id=\"perm-contact-calendar\"><path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z\"></path></g>\n<g id=\"perm-data-setting\"><path d=\"M18.99 11.5c.34 0 .67.03 1 .07L20 0 0 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"></path></g>\n<g id=\"perm-device-information\"><path d=\"M13 7h-2v2h2V7zm0 4h-2v6h2v-6zm4-9.99L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z\"></path></g>\n<g id=\"perm-identity\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"></path></g>\n<g id=\"perm-media\"><path d=\"M2 6H0v5h.01L0 20c0 1.1.9 2 2 2h18v-2H2V6zm20-2h-8l-2-2H6c-1.1 0-1.99.9-1.99 2L4 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7 15l4.5-6 3.5 4.51 2.5-3.01L21 15H7z\"></path></g>\n<g id=\"perm-phone-msg\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM12 3v10l3-3h6V3h-9z\"></path></g>\n<g id=\"perm-scan-wifi\"><path d=\"M12 3C6.95 3 3.15 4.85 0 7.23L12 22 24 7.25C20.85 4.87 17.05 3 12 3zm1 13h-2v-6h2v6zm-2-8V6h2v2h-2z\"></path></g>\n<g id=\"pets\"><circle cx=\"4.5\" cy=\"9.5\" r=\"2.5\"></circle><circle cx=\"9\" cy=\"5.5\" r=\"2.5\"></circle><circle cx=\"15\" cy=\"5.5\" r=\"2.5\"></circle><circle cx=\"19.5\" cy=\"9.5\" r=\"2.5\"></circle><path d=\"M17.34 14.86c-.87-1.02-1.6-1.89-2.48-2.91-.46-.54-1.05-1.08-1.75-1.32-.11-.04-.22-.07-.33-.09-.25-.04-.52-.04-.78-.04s-.53 0-.79.05c-.11.02-.22.05-.33.09-.7.24-1.28.78-1.75 1.32-.87 1.02-1.6 1.89-2.48 2.91-1.31 1.31-2.92 2.76-2.62 4.79.29 1.02 1.02 2.03 2.33 2.32.73.15 3.06-.44 5.54-.44h.18c2.48 0 4.81.58 5.54.44 1.31-.29 2.04-1.31 2.33-2.32.31-2.04-1.3-3.49-2.61-4.8z\"></path></g>\n<g id=\"picture-in-picture\"><path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98V5c0-1.1-.9-2-2-2zm0 16.01H3V4.98h18v14.03z\"></path></g>\n<g id=\"picture-in-picture-alt\"><path d=\"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z\"></path></g>\n<g id=\"play-for-work\"><path d=\"M11 5v5.59H7.5l4.5 4.5 4.5-4.5H13V5h-2zm-5 9c0 3.31 2.69 6 6 6s6-2.69 6-6h-2c0 2.21-1.79 4-4 4s-4-1.79-4-4H6z\"></path></g>\n<g id=\"polymer\"><path d=\"M19 4h-4L7.11 16.63 4.5 12 9 4H5L.5 12 5 20h4l7.89-12.63L19.5 12 15 20h4l4.5-8z\"></path></g>\n<g id=\"power-settings-new\"><path d=\"M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z\"></path></g>\n<g id=\"pregnant-woman\"><path d=\"M9 4c0-1.11.89-2 2-2s2 .89 2 2-.89 2-2 2-2-.89-2-2zm7 9c-.01-1.34-.83-2.51-2-3 0-1.66-1.34-3-3-3s-3 1.34-3 3v7h2v5h3v-5h3v-4z\"></path></g>\n<g id=\"print\"><path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"></path></g>\n<g id=\"query-builder\"><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z\"></path></g>\n<g id=\"question-answer\"><path d=\"M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"></path></g>\n<g id=\"radio-button-checked\"><path d=\"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"></path></g>\n<g id=\"radio-button-unchecked\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"></path></g>\n<g id=\"receipt\"><path d=\"M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z\"></path></g>\n<g id=\"record-voice-over\"><circle cx=\"9\" cy=\"9\" r=\"4\"></circle><path d=\"M9 15c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4zm7.76-9.64l-1.68 1.69c.84 1.18.84 2.71 0 3.89l1.68 1.69c2.02-2.02 2.02-5.07 0-7.27zM20.07 2l-1.63 1.63c2.77 3.02 2.77 7.56 0 10.74L20.07 16c3.9-3.89 3.91-9.95 0-14z\"></path></g>\n<g id=\"redeem\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z\"></path></g>\n<g id=\"redo\"><path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\"></path></g>\n<g id=\"refresh\"><path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"></path></g>\n<g id=\"remove\"><path d=\"M19 13H5v-2h14v2z\"></path></g>\n<g id=\"remove-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z\"></path></g>\n<g id=\"remove-circle-outline\"><path d=\"M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"></path></g>\n<g id=\"remove-shopping-cart\"><path d=\"M22.73 22.73L2.77 2.77 2 2l-.73-.73L0 2.54l4.39 4.39 2.21 4.66-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h7.46l1.38 1.38c-.5.36-.83.95-.83 1.62 0 1.1.89 2 1.99 2 .67 0 1.26-.33 1.62-.84L21.46 24l1.27-1.27zM7.42 15c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h2.36l2 2H7.42zm8.13-2c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H6.54l9.01 9zM7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2z\"></path></g>\n<g id=\"reorder\"><path d=\"M3 15h18v-2H3v2zm0 4h18v-2H3v2zm0-8h18V9H3v2zm0-6v2h18V5H3z\"></path></g>\n<g id=\"reply\"><path d=\"M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"></path></g>\n<g id=\"reply-all\"><path d=\"M7 8V5l-7 7 7 7v-3l-4-4 4-4zm6 1V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"></path></g>\n<g id=\"report\"><path d=\"M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM12 17.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2V7h2v6z\"></path></g>\n<g id=\"report-problem\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path></g>\n<g id=\"restore\"><path d=\"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z\"></path></g>\n<g id=\"restore-page\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm-2 16c-2.05 0-3.81-1.24-4.58-3h1.71c.63.9 1.68 1.5 2.87 1.5 1.93 0 3.5-1.57 3.5-3.5S13.93 9.5 12 9.5c-1.35 0-2.52.78-3.1 1.9l1.6 1.6h-4V9l1.3 1.3C8.69 8.92 10.23 8 12 8c2.76 0 5 2.24 5 5s-2.24 5-5 5z\"></path></g>\n<g id=\"room\"><path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"></path></g>\n<g id=\"rounded-corner\"><path d=\"M19 19h2v2h-2v-2zm0-2h2v-2h-2v2zM3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm0-4h2V3H3v2zm4 0h2V3H7v2zm8 16h2v-2h-2v2zm-4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm-8 0h2v-2H7v2zm-4 0h2v-2H3v2zM21 8c0-2.76-2.24-5-5-5h-5v2h5c1.65 0 3 1.35 3 3v5h2V8z\"></path></g>\n<g id=\"rowing\"><path d=\"M8.5 14.5L4 19l1.5 1.5L9 17h2l-2.5-2.5zM15 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 20.01L18 24l-2.99-3.01V19.5l-7.1-7.09c-.31.05-.61.07-.91.07v-2.16c1.66.03 3.61-.87 4.67-2.04l1.4-1.55c.19-.21.43-.38.69-.5.29-.14.62-.23.96-.23h.03C15.99 6.01 17 7.02 17 8.26v5.75c0 .84-.35 1.61-.92 2.16l-3.58-3.58v-2.27c-.63.52-1.43 1.02-2.29 1.39L16.5 18H18l3 3.01z\"></path></g>\n<g id=\"save\"><path d=\"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\"></path></g>\n<g id=\"schedule\"><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z\"></path></g>\n<g id=\"search\"><path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"></path></g>\n<g id=\"select-all\"><path d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z\"></path></g>\n<g id=\"send\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"></path></g>\n<g id=\"settings\"><path d=\"M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"></path></g>\n<g id=\"settings-applications\"><path d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z\"></path></g>\n<g id=\"settings-backup-restore\"><path d=\"M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9H0l4 4 4-4H5c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44C8.04 20.3 9.94 21 12 21c4.97 0 9-4.03 9-9s-4.03-9-9-9z\"></path></g>\n<g id=\"settings-bluetooth\"><path d=\"M11 24h2v-2h-2v2zm-4 0h2v-2H7v2zm8 0h2v-2h-2v2zm2.71-18.29L12 0h-1v7.59L6.41 3 5 4.41 10.59 10 5 15.59 6.41 17 11 12.41V20h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 3.83l1.88 1.88L13 7.59V3.83zm1.88 10.46L13 16.17v-3.76l1.88 1.88z\"></path></g>\n<g id=\"settings-brightness\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02zM8 16h2.5l1.5 1.5 1.5-1.5H16v-2.5l1.5-1.5-1.5-1.5V8h-2.5L12 6.5 10.5 8H8v2.5L6.5 12 8 13.5V16zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3V9z\"></path></g>\n<g id=\"settings-cell\"><path d=\"M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM16 .01L8 0C6.9 0 6 .9 6 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V2c0-1.1-.9-1.99-2-1.99zM16 16H8V4h8v12z\"></path></g>\n<g id=\"settings-ethernet\"><path d=\"M7.77 6.76L6.23 5.48.82 12l5.41 6.52 1.54-1.28L3.42 12l4.35-5.24zM7 13h2v-2H7v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28L20.58 12l-4.35 5.24 1.54 1.28L23.18 12l-5.41-6.52z\"></path></g>\n<g id=\"settings-input-antenna\"><path d=\"M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5S9.5 10.62 9.5 12c0 1.02.62 1.9 1.5 2.29v3.3L7.59 21 9 22.41l3-3 3 3L16.41 21 13 17.59v-3.3zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z\"></path></g>\n<g id=\"settings-input-component\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"></path></g>\n<g id=\"settings-input-composite\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"></path></g>\n<g id=\"settings-input-hdmi\"><path d=\"M18 7V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v3H5v6l3 6v3h8v-3l3-6V7h-1zM8 4h8v3h-2V5h-1v2h-2V5h-1v2H8V4z\"></path></g>\n<g id=\"settings-input-svideo\"><path d=\"M8 11.5c0-.83-.67-1.5-1.5-1.5S5 10.67 5 11.5 5.67 13 6.5 13 8 12.33 8 11.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3C9.67 5 9 5.67 9 6.5S9.67 8 10.5 8h3c.83 0 1.5-.67 1.5-1.5zM8.5 15c-.83 0-1.5.67-1.5 1.5S7.67 18 8.5 18s1.5-.67 1.5-1.5S9.33 15 8.5 15zM12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"></path></g>\n<g id=\"settings-overscan\"><path d=\"M12.01 5.5L10 8h4l-1.99-2.5zM18 10v4l2.5-1.99L18 10zM6 10l-2.5 2.01L6 14v-4zm8 6h-4l2.01 2.5L14 16zm7-13H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z\"></path></g>\n<g id=\"settings-phone\"><path d=\"M13 9h-2v2h2V9zm4 0h-2v2h2V9zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 9v2h2V9h-2z\"></path></g>\n<g id=\"settings-power\"><path d=\"M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm2-22h-2v10h2V2zm3.56 2.44l-1.45 1.45C16.84 6.94 18 8.83 18 11c0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12L7.44 4.44C5.36 5.88 4 8.28 4 11c0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zM15 24h2v-2h-2v2z\"></path></g>\n<g id=\"settings-remote\"><path d=\"M15 9H9c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V10c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7.05 6.05l1.41 1.41C9.37 6.56 10.62 6 12 6s2.63.56 3.54 1.46l1.41-1.41C15.68 4.78 13.93 4 12 4s-3.68.78-4.95 2.05zM12 0C8.96 0 6.21 1.23 4.22 3.22l1.41 1.41C7.26 3.01 9.51 2 12 2s4.74 1.01 6.36 2.64l1.41-1.41C17.79 1.23 15.04 0 12 0z\"></path></g>\n<g id=\"settings-voice\"><path d=\"M7 24h2v-2H7v2zm5-11c1.66 0 2.99-1.34 2.99-3L15 4c0-1.66-1.34-3-3-3S9 2.34 9 4v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1S6.7 13 6.7 10H5c0 3.41 2.72 6.23 6 6.72V20h2v-3.28c3.28-.49 6-3.31 6-6.72z\"></path></g>\n<g id=\"shop\"><path d=\"M16 6V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H2v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6h-6zm-6-2h4v2h-4V4zM9 18V9l7.5 4L9 18z\"></path></g>\n<g id=\"shop-two\"><path d=\"M3 9H1v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2H3V9zm15-4V3c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5h-5zm-6-2h4v2h-4V3zm0 12V8l5.5 3-5.5 4z\"></path></g>\n<g id=\"shopping-basket\"><path d=\"M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43L6.79 9H2c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27L23 10c0-.55-.45-1-1-1h-4.79zM9 9l3-4.4L15 9H9zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"></path></g>\n<g id=\"shopping-cart\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"></path></g>\n<g id=\"sort\"><path d=\"M3 18h6v-2H3v2zM3 6v2h18V6H3zm0 7h12v-2H3v2z\"></path></g>\n<g id=\"speaker-notes\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 14H6v-2h2v2zm0-3H6V9h2v2zm0-3H6V6h2v2zm7 6h-5v-2h5v2zm3-3h-8V9h8v2zm0-3h-8V6h8v2z\"></path></g>\n<g id=\"speaker-notes-off\"><path d=\"M10.54 11l-.54-.54L7.54 8 6 6.46 2.38 2.84 1.27 1.73 0 3l2.01 2.01L2 22l4-4h9l5.73 5.73L22 22.46 17.54 18l-7-7zM8 14H6v-2h2v2zm-2-3V9l2 2H6zm14-9H4.08L10 7.92V6h8v2h-7.92l1 1H18v2h-4.92l6.99 6.99C21.14 17.95 22 17.08 22 16V4c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"spellcheck\"><path d=\"M12.45 16h2.09L9.43 3H7.57L2.46 16h2.09l1.12-3h5.64l1.14 3zm-6.02-5L8.5 5.48 10.57 11H6.43zm15.16.59l-8.09 8.09L9.83 16l-1.41 1.41 5.09 5.09L23 13l-1.41-1.41z\"></path></g>\n<g id=\"star\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"></path></g>\n<g id=\"star-border\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"></path></g>\n<g id=\"star-half\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"></path></g>\n<g id=\"stars\"><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm4.24 16L12 15.45 7.77 18l1.12-4.81-3.73-3.23 4.92-.42L12 5l1.92 4.53 4.92.42-3.73 3.23L16.23 18z\"></path></g>\n<g id=\"store\"><path d=\"M20 4H4v2h16V4zm1 10v-2l-1-5H4l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4H6v-4h6v4z\"></path></g>\n<g id=\"subdirectory-arrow-left\"><path d=\"M11 9l1.42 1.42L8.83 14H18V4h2v12H8.83l3.59 3.58L11 21l-6-6 6-6z\"></path></g>\n<g id=\"subdirectory-arrow-right\"><path d=\"M19 15l-6 6-1.42-1.42L15.17 16H4V4h2v10h9.17l-3.59-3.58L13 9l6 6z\"></path></g>\n<g id=\"subject\"><path d=\"M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z\"></path></g>\n<g id=\"supervisor-account\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5S17.88 7 16.5 7C15.12 7 14 8.12 14 9.5s1.12 2.5 2.5 2.5zM9 11c1.66 0 2.99-1.34 2.99-3S10.66 5 9 5C7.34 5 6 6.34 6 8s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75V19h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zM9 13c-2.33 0-7 1.17-7 3.5V19h7v-2.25c0-.85.33-2.34 2.37-3.47C10.5 13.1 9.66 13 9 13z\"></path></g>\n<g id=\"swap-horiz\"><path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path></g>\n<g id=\"swap-vert\"><path d=\"M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z\"></path></g>\n<g id=\"swap-vertical-circle\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM6.5 9L10 5.5 13.5 9H11v4H9V9H6.5zm11 6L14 18.5 10.5 15H13v-4h2v4h2.5z\"></path></g>\n<g id=\"system-update-alt\"><path d=\"M12 16.5l4-4h-3v-9h-2v9H8l4 4zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"tab\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h10v4h8v10z\"></path></g>\n<g id=\"tab-unselected\"><path d=\"M1 9h2V7H1v2zm0 4h2v-2H1v2zm0-8h2V3c-1.1 0-2 .9-2 2zm8 16h2v-2H9v2zm-8-4h2v-2H1v2zm2 4v-2H1c0 1.1.9 2 2 2zM21 3h-8v6h10V5c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zM9 5h2V3H9v2zM5 21h2v-2H5v2zM5 5h2V3H5v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z\"></path></g>\n<g id=\"text-format\"><path d=\"M5 17v2h14v-2H5zm4.5-4.2h5l.9 2.2h2.1L12.75 4h-1.5L6.5 15h2.1l.9-2.2zM12 5.98L13.87 11h-3.74L12 5.98z\"></path></g>\n<g id=\"theaters\"><path d=\"M18 3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3h-2zM8 17H6v-2h2v2zm0-4H6v-2h2v2zm0-4H6V7h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V7h2v2z\"></path></g>\n<g id=\"thumb-down\"><path d=\"M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01L1 14c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z\"></path></g>\n<g id=\"thumb-up\"><path d=\"M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z\"></path></g>\n<g id=\"thumbs-up-down\"><path d=\"M12 6c0-.55-.45-1-1-1H5.82l.66-3.18.02-.23c0-.31-.13-.59-.33-.8L5.38 0 .44 4.94C.17 5.21 0 5.59 0 6v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55V6zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55V18c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z\"></path></g>\n<g id=\"timeline\"><path d=\"M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z\"></path></g>\n<g id=\"toc\"><path d=\"M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z\"></path></g>\n<g id=\"today\"><path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\"></path></g>\n<g id=\"toll\"><path d=\"M15 4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zM3 12c0-2.61 1.67-4.83 4-5.65V4.26C3.55 5.15 1 8.27 1 12s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65z\"></path></g>\n<g id=\"touch-app\"><path d=\"M9 11.24V7.5C9 6.12 10.12 5 11.5 5S14 6.12 14 7.5v3.74c1.21-.81 2-2.18 2-3.74C16 5.01 13.99 3 11.5 3S7 5.01 7 7.5c0 1.56.79 2.93 2 3.74zm9.84 4.63l-4.54-2.26c-.17-.07-.35-.11-.54-.11H13v-6c0-.83-.67-1.5-1.5-1.5S10 6.67 10 7.5v10.74l-3.43-.72c-.08-.01-.15-.03-.24-.03-.31 0-.59.13-.79.33l-.79.8 4.94 4.94c.27.27.65.44 1.06.44h6.79c.75 0 1.33-.55 1.44-1.28l.75-5.27c.01-.07.02-.14.02-.2 0-.62-.38-1.16-.91-1.38z\"></path></g>\n<g id=\"track-changes\"><path d=\"M19.07 4.93l-1.41 1.41C19.1 7.79 20 9.79 20 12c0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02C8.16 6.57 6 9.03 6 12c0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41C15.55 9.9 16 10.9 16 12c0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72V2h-1C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z\"></path></g>\n<g id=\"translate\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\"></path></g>\n<g id=\"trending-down\"><path d=\"M16 18l2.29-2.29-4.88-4.88-4 4L2 7.41 3.41 6l6 6 4-4 6.3 6.29L22 12v6z\"></path></g>\n<g id=\"trending-flat\"><path d=\"M22 12l-4-4v3H3v2h15v3z\"></path></g>\n<g id=\"trending-up\"><path d=\"M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z\"></path></g>\n<g id=\"turned-in\"><path d=\"M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"turned-in-not\"><path d=\"M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z\"></path></g>\n<g id=\"unarchive\"><path d=\"M20.55 5.22l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.15.55L3.46 5.22C3.17 5.57 3 6.01 3 6.5V19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.49-.17-.93-.45-1.28zM12 9.5l5.5 5.5H14v2h-4v-2H6.5L12 9.5zM5.12 5l.82-1h12l.93 1H5.12z\"></path></g>\n<g id=\"undo\"><path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\"></path></g>\n<g id=\"unfold-less\"><path d=\"M7.41 18.59L8.83 20 12 16.83 15.17 20l1.41-1.41L12 14l-4.59 4.59zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10l4.59-4.59z\"></path></g>\n<g id=\"unfold-more\"><path d=\"M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z\"></path></g>\n<g id=\"update\"><path d=\"M21 10.12h-6.78l2.74-2.82c-2.73-2.7-7.15-2.8-9.88-.1-2.73 2.71-2.73 7.08 0 9.79 2.73 2.71 7.15 2.71 9.88 0C18.32 15.65 19 14.08 19 12.1h2c0 1.98-.88 4.55-2.64 6.29-3.51 3.48-9.21 3.48-12.72 0-3.5-3.47-3.53-9.11-.02-12.58 3.51-3.47 9.14-3.47 12.65 0L21 3v7.12zM12.5 8v4.25l3.5 2.08-.72 1.21L11 13V8h1.5z\"></path></g>\n<g id=\"verified-user\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"></path></g>\n<g id=\"view-agenda\"><path d=\"M20 13H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1z\"></path></g>\n<g id=\"view-array\"><path d=\"M4 18h3V5H4v13zM18 5v13h3V5h-3zM8 18h9V5H8v13z\"></path></g>\n<g id=\"view-carousel\"><path d=\"M7 19h10V4H7v15zm-5-2h4V6H2v11zM18 6v11h4V6h-4z\"></path></g>\n<g id=\"view-column\"><path d=\"M10 18h5V5h-5v13zm-6 0h5V5H4v13zM16 5v13h5V5h-5z\"></path></g>\n<g id=\"view-day\"><path d=\"M2 21h19v-3H2v3zM20 8H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zM2 3v3h19V3H2z\"></path></g>\n<g id=\"view-headline\"><path d=\"M4 15h16v-2H4v2zm0 4h16v-2H4v2zm0-8h16V9H4v2zm0-6v2h16V5H4z\"></path></g>\n<g id=\"view-list\"><path d=\"M4 14h4v-4H4v4zm0 5h4v-4H4v4zM4 9h4V5H4v4zm5 5h12v-4H9v4zm0 5h12v-4H9v4zM9 5v4h12V5H9z\"></path></g>\n<g id=\"view-module\"><path d=\"M4 11h5V5H4v6zm0 7h5v-6H4v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5V5h-5v6zm6-6v6h5V5h-5z\"></path></g>\n<g id=\"view-quilt\"><path d=\"M10 18h5v-6h-5v6zm-6 0h5V5H4v13zm12 0h5v-6h-5v6zM10 5v6h11V5H10z\"></path></g>\n<g id=\"view-stream\"><path d=\"M4 18h17v-6H4v6zM4 5v6h17V5H4z\"></path></g>\n<g id=\"view-week\"><path d=\"M6 5H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1z\"></path></g>\n<g id=\"visibility\"><path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"></path></g>\n<g id=\"visibility-off\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"></path></g>\n<g id=\"warning\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path></g>\n<g id=\"watch-later\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z\"></path></g>\n<g id=\"weekend\"><path d=\"M21 10c-1.1 0-2 .9-2 2v3H5v-3c0-1.1-.9-2-2-2s-2 .9-2 2v5c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-5c0-1.1-.9-2-2-2zm-3-5H6c-1.1 0-2 .9-2 2v2.15c1.16.41 2 1.51 2 2.82V14h12v-2.03c0-1.3.84-2.4 2-2.82V7c0-1.1-.9-2-2-2z\"></path></g>\n<g id=\"work\"><path d=\"M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z\"></path></g>\n<g id=\"youtube-searched-for\"><path d=\"M17.01 14h-.8l-.27-.27c.98-1.14 1.57-2.61 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 3-6.5 6.5H2l3.84 4 4.16-4H6.51C6.51 7 8.53 5 11.01 5s4.5 2.01 4.5 4.5c0 2.48-2.02 4.5-4.5 4.5-.65 0-1.26-.14-1.82-.38L7.71 15.1c.97.57 2.09.9 3.3.9 1.61 0 3.08-.59 4.22-1.57l.27.27v.79l5.01 4.99L22 19l-4.99-5z\"></path></g>\n<g id=\"zoom-in\"><path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zm2.5-4h-2v2H9v-2H7V9h2V7h1v2h2v1z\"></path></g>\n<g id=\"zoom-out\"><path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z\"></path></g>\n</defs></svg>\n</iron-iconset-svg>`;\n\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronMeta} from '@polymer/iron-meta/iron-meta.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n/**\n * The `iron-iconset-svg` element allows users to define their own icon sets\n * that contain svg icons. The svg icon elements should be children of the\n * `iron-iconset-svg` element. Multiple icons should be given distinct id's.\n *\n * Using svg elements to create icons has a few advantages over traditional\n * bitmap graphics like jpg or png. Icons that use svg are vector based so\n * they are resolution independent and should look good on any device. They\n * are stylable via css. Icons can be themed, colorized, and even animated.\n *\n * Example:\n *\n *     <iron-iconset-svg name=\"my-svg-icons\" size=\"24\">\n *       <svg>\n *         <defs>\n *           <g id=\"shape\">\n *             <rect x=\"12\" y=\"0\" width=\"12\" height=\"24\" />\n *             <circle cx=\"12\" cy=\"12\" r=\"12\" />\n *           </g>\n *         </defs>\n *       </svg>\n *     </iron-iconset-svg>\n *\n * This will automatically register the icon set \"my-svg-icons\" to the iconset\n * database.  To use these icons from within another element, make a\n * `iron-iconset` element and call the `byId` method\n * to retrieve a given iconset. To apply a particular icon inside an\n * element use the `applyIcon` method. For example:\n *\n *     iconset.applyIcon(iconNode, 'car');\n *\n * @element iron-iconset-svg\n * @demo demo/index.html\n * @implements {Polymer.Iconset}\n */\nPolymer({\n  is: 'iron-iconset-svg',\n\n  properties: {\n\n    /**\n     * The name of the iconset.\n     */\n    name: {type: String, observer: '_nameChanged'},\n\n    /**\n     * The size of an individual icon. Note that icons must be square.\n     */\n    size: {type: Number, value: 24},\n\n    /**\n     * Set to true to enable mirroring of icons where specified when they are\n     * stamped. Icons that should be mirrored should be decorated with a\n     * `mirror-in-rtl` attribute.\n     *\n     * NOTE: For performance reasons, direction will be resolved once per\n     * document per iconset, so moving icons in and out of RTL subtrees will\n     * not cause their mirrored state to change.\n     */\n    rtlMirroring: {type: Boolean, value: false},\n\n    /**\n     * Set to true to measure RTL based on the dir attribute on the body or\n     * html elements (measured on document.body or document.documentElement as\n     * available).\n     */\n    useGlobalRtlAttribute: {type: Boolean, value: false}\n  },\n\n  created: function() {\n    this._meta = new IronMeta({type: 'iconset', key: null, value: null});\n  },\n\n  attached: function() {\n    this.style.display = 'none';\n  },\n\n  /**\n   * Construct an array of all icon names in this iconset.\n   *\n   * @return {!Array} Array of icon names.\n   */\n  getIconNames: function() {\n    this._icons = this._createIconMap();\n    return Object.keys(this._icons).map(function(n) {\n      return this.name + ':' + n;\n    }, this);\n  },\n\n  /**\n   * Applies an icon to the given element.\n   *\n   * An svg icon is prepended to the element's shadowRoot if it exists,\n   * otherwise to the element itself.\n   *\n   * If RTL mirroring is enabled, and the icon is marked to be mirrored in\n   * RTL, the element will be tested (once and only once ever for each\n   * iconset) to determine the direction of the subtree the element is in.\n   * This direction will apply to all future icon applications, although only\n   * icons marked to be mirrored will be affected.\n   *\n   * @method applyIcon\n   * @param {Element} element Element to which the icon is applied.\n   * @param {string} iconName Name of the icon to apply.\n   * @return {?Element} The svg element which renders the icon.\n   */\n  applyIcon: function(element, iconName) {\n    // Remove old svg element\n    this.removeIcon(element);\n    // install new svg element\n    var svg = this._cloneIcon(\n        iconName, this.rtlMirroring && this._targetIsRTL(element));\n    if (svg) {\n      // insert svg element into shadow root, if it exists\n      var pde = dom(element.root || element);\n      pde.insertBefore(svg, pde.childNodes[0]);\n      return element._svgIcon = svg;\n    }\n    return null;\n  },\n\n  /**\n   * Remove an icon from the given element by undoing the changes effected\n   * by `applyIcon`.\n   *\n   * @param {Element} element The element from which the icon is removed.\n   */\n  removeIcon: function(element) {\n    // Remove old svg element\n    if (element._svgIcon) {\n      dom(element.root || element).removeChild(element._svgIcon);\n      element._svgIcon = null;\n    }\n  },\n\n  /**\n   * Measures and memoizes the direction of the element. Note that this\n   * measurement is only done once and the result is memoized for future\n   * invocations.\n   */\n  _targetIsRTL: function(target) {\n    if (this.__targetIsRTL == null) {\n      if (this.useGlobalRtlAttribute) {\n        var globalElement =\n            (document.body && document.body.hasAttribute('dir')) ?\n            document.body :\n            document.documentElement;\n\n        this.__targetIsRTL = globalElement.getAttribute('dir') === 'rtl';\n      } else {\n        if (target && target.nodeType !== Node.ELEMENT_NODE) {\n          target = target.host;\n        }\n\n        this.__targetIsRTL =\n            target && window.getComputedStyle(target)['direction'] === 'rtl';\n      }\n    }\n\n    return this.__targetIsRTL;\n  },\n\n  /**\n   *\n   * When name is changed, register iconset metadata\n   *\n   */\n  _nameChanged: function() {\n    this._meta.value = null;\n    this._meta.key = this.name;\n    this._meta.value = this;\n\n    this.async(function() {\n      this.fire('iron-iconset-added', this, {node: window});\n    });\n  },\n\n  /**\n   * Create a map of child SVG elements by id.\n   *\n   * @return {!Object} Map of id's to SVG elements.\n   */\n  _createIconMap: function() {\n    // Objects chained to Object.prototype (`{}`) have members. Specifically,\n    // on FF there is a `watch` method that confuses the icon map, so we\n    // need to use a null-based object here.\n    var icons = Object.create(null);\n    dom(this).querySelectorAll('[id]').forEach(function(icon) {\n      icons[icon.id] = icon;\n    });\n    return icons;\n  },\n\n  /**\n   * Produce installable clone of the SVG element matching `id` in this\n   * iconset, or `undefined` if there is no matching element.\n   *\n   * @return {Element} Returns an installable clone of the SVG element\n   * matching `id`.\n   */\n  _cloneIcon: function(id, mirrorAllowed) {\n    // create the icon map on-demand, since the iconset itself has no discrete\n    // signal to know when it's children are fully parsed\n    this._icons = this._icons || this._createIconMap();\n    return this._prepareSvgClone(this._icons[id], this.size, mirrorAllowed);\n  },\n\n  /**\n   * @param {Element} sourceSvg\n   * @param {number} size\n   * @param {Boolean} mirrorAllowed\n   * @return {Element}\n   */\n  _prepareSvgClone: function(sourceSvg, size, mirrorAllowed) {\n    if (sourceSvg) {\n      var content = sourceSvg.cloneNode(true),\n          svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),\n          viewBox =\n              content.getAttribute('viewBox') || '0 0 ' + size + ' ' + size,\n          cssText =\n              'pointer-events: none; display: block; width: 100%; height: 100%;';\n\n      if (mirrorAllowed && content.hasAttribute('mirror-in-rtl')) {\n        cssText +=\n            '-webkit-transform:scale(-1,1);transform:scale(-1,1);transform-origin:center;';\n      }\n\n      svg.setAttribute('viewBox', viewBox);\n      svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n      svg.setAttribute('focusable', 'false');\n      // TODO(dfreedm): `pointer-events: none` works around\n      // https://crbug.com/370136\n      // TODO(sjmiles): inline style may not be ideal, but avoids requiring a\n      // shadow-root\n      svg.style.cssText = cssText;\n      svg.appendChild(content).removeAttribute('id');\n      return svg;\n    }\n    return null;\n  }\n\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronSelectableBehavior} from './iron-selectable.js';\n\n/**\n * @polymerBehavior IronMultiSelectableBehavior\n */\nexport const IronMultiSelectableBehaviorImpl = {\n  properties: {\n\n    /**\n     * If true, multiple selections are allowed.\n     */\n    multi: {type: Boolean, value: false, observer: 'multiChanged'},\n\n    /**\n     * Gets or sets the selected elements. This is used instead of `selected`\n     * when `multi` is true.\n     */\n    selectedValues: {\n      type: Array,\n      notify: true,\n      value: function() {\n        return [];\n      }\n    },\n\n    /**\n     * Returns an array of currently selected items.\n     */\n    selectedItems: {\n      type: Array,\n      readOnly: true,\n      notify: true,\n      value: function() {\n        return [];\n      }\n    },\n\n  },\n\n  observers: ['_updateSelected(selectedValues.splices)'],\n\n  /**\n   * Selects the given value. If the `multi` property is true, then the selected\n   * state of the `value` will be toggled; otherwise the `value` will be\n   * selected.\n   *\n   * @method select\n   * @param {string|number} value the value to select.\n   */\n  select: function(value) {\n    if (this.multi) {\n      this._toggleSelected(value);\n    } else {\n      this.selected = value;\n    }\n  },\n\n  multiChanged: function(multi) {\n    this._selection.multi = multi;\n    this._updateSelected();\n  },\n\n  // UNUSED, FOR API COMPATIBILITY\n  get _shouldUpdateSelection() {\n    return this.selected != null ||\n        (this.selectedValues != null && this.selectedValues.length);\n  },\n\n  _updateAttrForSelected: function() {\n    if (!this.multi) {\n      IronSelectableBehavior._updateAttrForSelected.apply(this);\n    } else if (this.selectedItems && this.selectedItems.length > 0) {\n      this.selectedValues =\n          this.selectedItems\n              .map(\n                  function(selectedItem) {\n                    return this._indexToValue(this.indexOf(selectedItem));\n                  },\n                  this)\n              .filter(function(unfilteredValue) {\n                return unfilteredValue != null;\n              }, this);\n    }\n  },\n\n  _updateSelected: function() {\n    if (this.multi) {\n      this._selectMulti(this.selectedValues);\n    } else {\n      this._selectSelected(this.selected);\n    }\n  },\n\n  _selectMulti: function(values) {\n    values = values || [];\n\n    var selectedItems =\n        (this._valuesToItems(values) || []).filter(function(item) {\n          return item !== null && item !== undefined;\n        });\n\n    // clear all but the current selected items\n    this._selection.clear(selectedItems);\n\n    // select only those not selected yet\n    for (var i = 0; i < selectedItems.length; i++) {\n      this._selection.setItemSelected(selectedItems[i], true);\n    }\n\n    // Check for items, since this array is populated only when attached\n    if (this.fallbackSelection && !this._selection.get().length) {\n      var fallback = this._valueToItem(this.fallbackSelection);\n      if (fallback) {\n        this.select(this.fallbackSelection);\n      }\n    }\n  },\n\n  _selectionChange: function() {\n    var s = this._selection.get();\n    if (this.multi) {\n      this._setSelectedItems(s);\n      this._setSelectedItem(s.length ? s[0] : null);\n    } else {\n      if (s !== null && s !== undefined) {\n        this._setSelectedItems([s]);\n        this._setSelectedItem(s);\n      } else {\n        this._setSelectedItems([]);\n        this._setSelectedItem(null);\n      }\n    }\n  },\n\n  _toggleSelected: function(value) {\n    var i = this.selectedValues.indexOf(value);\n    var unselected = i < 0;\n    if (unselected) {\n      this.push('selectedValues', value);\n    } else {\n      this.splice('selectedValues', i, 1);\n    }\n  },\n\n  _valuesToItems: function(values) {\n    return (values == null) ? null : values.map(function(value) {\n      return this._valueToItem(value);\n    }, this);\n  }\n};\n\n/** @polymerBehavior */\nexport const IronMultiSelectableBehavior =\n    [IronSelectableBehavior, IronMultiSelectableBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {IronMultiSelectableBehavior, IronMultiSelectableBehaviorImpl} from '@polymer/iron-selector/iron-multi-selectable.js';\nimport {IronSelectableBehavior} from '@polymer/iron-selector/iron-selectable.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n * `IronMenuBehavior` implements accessible menu behavior.\n *\n * @demo demo/index.html\n * @polymerBehavior IronMenuBehavior\n */\nexport const IronMenuBehaviorImpl = {\n\n  properties: {\n\n    /**\n     * Returns the currently focused item.\n     * @type {?Object}\n     */\n    focusedItem:\n        {observer: '_focusedItemChanged', readOnly: true, type: Object},\n\n    /**\n     * The attribute to use on menu items to look up the item title. Typing the\n     * first letter of an item when the menu is open focuses that item. If\n     * unset, `textContent` will be used.\n     */\n    attrForItemTitle: {type: String},\n\n    /**\n     * @type {boolean}\n     */\n    disabled: {\n      type: Boolean,\n      value: false,\n      observer: '_disabledChanged',\n    },\n  },\n\n  /**\n   * The list of keys has been taken from\n   * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState\n   * @private\n   */\n  _MODIFIER_KEYS: [\n    'Alt',\n    'AltGraph',\n    'CapsLock',\n    'Control',\n    'Fn',\n    'FnLock',\n    'Hyper',\n    'Meta',\n    'NumLock',\n    'OS',\n    'ScrollLock',\n    'Shift',\n    'Super',\n    'Symbol',\n    'SymbolLock'\n  ],\n\n  /** @private */\n  _SEARCH_RESET_TIMEOUT_MS: 1000,\n\n  /** @private */\n  _previousTabIndex: 0,\n\n  hostAttributes: {\n    'role': 'menu',\n  },\n\n  observers: ['_updateMultiselectable(multi)'],\n\n  listeners: {\n    'focus': '_onFocus',\n    'keydown': '_onKeydown',\n    'iron-items-changed': '_onIronItemsChanged'\n  },\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {\n    'up': '_onUpKey',\n    'down': '_onDownKey',\n    'esc': '_onEscKey',\n    'shift+tab:keydown': '_onShiftTabDown'\n  },\n\n  attached: function() {\n    this._resetTabindices();\n  },\n\n  /**\n   * Selects the given value. If the `multi` property is true, then the selected\n   * state of the `value` will be toggled; otherwise the `value` will be\n   * selected.\n   *\n   * @param {string|number} value the value to select.\n   */\n  select: function(value) {\n    // Cancel automatically focusing a default item if the menu received focus\n    // through a user action selecting a particular item.\n    if (this._defaultFocusAsync) {\n      this.cancelAsync(this._defaultFocusAsync);\n      this._defaultFocusAsync = null;\n    }\n    var item = this._valueToItem(value);\n    if (item && item.hasAttribute('disabled'))\n      return;\n    this._setFocusedItem(item);\n    IronMultiSelectableBehaviorImpl.select.apply(this, arguments);\n  },\n\n  /**\n   * Resets all tabindex attributes to the appropriate value based on the\n   * current selection state. The appropriate value is `0` (focusable) for\n   * the default selected item, and `-1` (not keyboard focusable) for all\n   * other items. Also sets the correct initial values for aria-selected\n   * attribute, true for default selected item and false for others.\n   */\n  _resetTabindices: function() {\n    var firstSelectedItem = this.multi ?\n        (this.selectedItems && this.selectedItems[0]) :\n        this.selectedItem;\n\n    this.items.forEach(function(item) {\n      item.setAttribute('tabindex', item === firstSelectedItem ? '0' : '-1');\n      item.setAttribute('aria-selected', this._selection.isSelected(item));\n    }, this);\n  },\n\n  /**\n   * Sets appropriate ARIA based on whether or not the menu is meant to be\n   * multi-selectable.\n   *\n   * @param {boolean} multi True if the menu should be multi-selectable.\n   */\n  _updateMultiselectable: function(multi) {\n    if (multi) {\n      this.setAttribute('aria-multiselectable', 'true');\n    } else {\n      this.removeAttribute('aria-multiselectable');\n    }\n  },\n\n  /**\n   * Given a KeyboardEvent, this method will focus the appropriate item in the\n   * menu (if there is a relevant item, and it is possible to focus it).\n   *\n   * @param {KeyboardEvent} event A KeyboardEvent.\n   */\n  _focusWithKeyboardEvent: function(event) {\n    // Make sure that the key pressed is not a modifier key.\n    // getModifierState is not being used, as it is not available in Safari\n    // earlier than 10.0.2 (https://trac.webkit.org/changeset/206725/webkit)\n    if (this._MODIFIER_KEYS.indexOf(event.key) !== -1)\n      return;\n\n    this.cancelDebouncer('_clearSearchText');\n\n    var searchText = this._searchText || '';\n    var key = event.key && event.key.length == 1 ?\n        event.key :\n        String.fromCharCode(event.keyCode);\n    searchText += key.toLocaleLowerCase();\n\n    var searchLength = searchText.length;\n\n    for (var i = 0, item; item = this.items[i]; i++) {\n      if (item.hasAttribute('disabled')) {\n        continue;\n      }\n\n      var attr = this.attrForItemTitle || 'textContent';\n      var title = (item[attr] || item.getAttribute(attr) || '').trim();\n\n      if (title.length < searchLength) {\n        continue;\n      }\n\n      if (title.slice(0, searchLength).toLocaleLowerCase() == searchText) {\n        this._setFocusedItem(item);\n        break;\n      }\n    }\n\n    this._searchText = searchText;\n    this.debounce(\n        '_clearSearchText',\n        this._clearSearchText,\n        this._SEARCH_RESET_TIMEOUT_MS);\n  },\n\n  _clearSearchText: function() {\n    this._searchText = '';\n  },\n\n  /**\n   * Focuses the previous item (relative to the currently focused item) in the\n   * menu, disabled items will be skipped.\n   * Loop until length + 1 to handle case of single item in menu.\n   */\n  _focusPrevious: function() {\n    var length = this.items.length;\n    var curFocusIndex = Number(this.indexOf(this.focusedItem));\n\n    for (var i = 1; i < length + 1; i++) {\n      var item = this.items[(curFocusIndex - i + length) % length];\n      if (!item.hasAttribute('disabled')) {\n        var owner = dom(item).getOwnerRoot() || document;\n        this._setFocusedItem(item);\n\n        // Focus might not have worked, if the element was hidden or not\n        // focusable. In that case, try again.\n        if (dom(owner).activeElement == item) {\n          return;\n        }\n      }\n    }\n  },\n\n  /**\n   * Focuses the next item (relative to the currently focused item) in the\n   * menu, disabled items will be skipped.\n   * Loop until length + 1 to handle case of single item in menu.\n   */\n  _focusNext: function() {\n    var length = this.items.length;\n    var curFocusIndex = Number(this.indexOf(this.focusedItem));\n\n    for (var i = 1; i < length + 1; i++) {\n      var item = this.items[(curFocusIndex + i) % length];\n      if (!item.hasAttribute('disabled')) {\n        var owner = dom(item).getOwnerRoot() || document;\n        this._setFocusedItem(item);\n\n        // Focus might not have worked, if the element was hidden or not\n        // focusable. In that case, try again.\n        if (dom(owner).activeElement == item) {\n          return;\n        }\n      }\n    }\n  },\n\n  /**\n   * Mutates items in the menu based on provided selection details, so that\n   * all items correctly reflect selection state.\n   *\n   * @param {Element} item An item in the menu.\n   * @param {boolean} isSelected True if the item should be shown in a\n   * selected state, otherwise false.\n   */\n  _applySelection: function(item, isSelected) {\n    if (isSelected) {\n      item.setAttribute('aria-selected', 'true');\n    } else {\n      item.setAttribute('aria-selected', 'false');\n    }\n    IronSelectableBehavior._applySelection.apply(this, arguments);\n  },\n\n  /**\n   * Discretely updates tabindex values among menu items as the focused item\n   * changes.\n   *\n   * @param {Element} focusedItem The element that is currently focused.\n   * @param {?Element} old The last element that was considered focused, if\n   * applicable.\n   */\n  _focusedItemChanged: function(focusedItem, old) {\n    old && old.setAttribute('tabindex', '-1');\n    if (focusedItem && !focusedItem.hasAttribute('disabled') &&\n        !this.disabled) {\n      focusedItem.setAttribute('tabindex', '0');\n      focusedItem.focus();\n    }\n  },\n\n  /**\n   * A handler that responds to mutation changes related to the list of items\n   * in the menu.\n   *\n   * @param {CustomEvent} event An event containing mutation records as its\n   * detail.\n   */\n  _onIronItemsChanged: function(event) {\n    if (event.detail.addedNodes.length) {\n      this._resetTabindices();\n    }\n  },\n\n  /**\n   * Handler that is called when a shift+tab keypress is detected by the menu.\n   *\n   * @param {CustomEvent} event A key combination event.\n   */\n  _onShiftTabDown: function(event) {\n    var oldTabIndex = this.getAttribute('tabindex');\n\n    IronMenuBehaviorImpl._shiftTabPressed = true;\n\n    this._setFocusedItem(null);\n\n    this.setAttribute('tabindex', '-1');\n\n    this.async(function() {\n      this.setAttribute('tabindex', oldTabIndex);\n      IronMenuBehaviorImpl._shiftTabPressed = false;\n      // NOTE(cdata): polymer/polymer#1305\n    }, 1);\n  },\n\n  /**\n   * Handler that is called when the menu receives focus.\n   *\n   * @param {FocusEvent} event A focus event.\n   */\n  _onFocus: function(event) {\n    if (IronMenuBehaviorImpl._shiftTabPressed) {\n      // do not focus the menu itself\n      return;\n    }\n\n    // Do not focus the selected tab if the deepest target is part of the\n    // menu element's local DOM and is focusable.\n    var rootTarget =\n        /** @type {?HTMLElement} */ (dom(event).rootTarget);\n    if (rootTarget !== this && typeof rootTarget.tabIndex !== 'undefined' &&\n        !this.isLightDescendant(rootTarget)) {\n      return;\n    }\n\n    // clear the cached focus item\n    this._defaultFocusAsync = this.async(function() {\n      // focus the selected item when the menu receives focus, or the first item\n      // if no item is selected\n      var firstSelectedItem = this.multi ?\n          (this.selectedItems && this.selectedItems[0]) :\n          this.selectedItem;\n\n      this._setFocusedItem(null);\n\n      if (firstSelectedItem) {\n        this._setFocusedItem(firstSelectedItem);\n      } else if (this.items[0]) {\n        // We find the first none-disabled item (if one exists)\n        this._focusNext();\n      }\n    });\n  },\n\n  /**\n   * Handler that is called when the up key is pressed.\n   *\n   * @param {CustomEvent} event A key combination event.\n   */\n  _onUpKey: function(event) {\n    // up and down arrows moves the focus\n    this._focusPrevious();\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  /**\n   * Handler that is called when the down key is pressed.\n   *\n   * @param {CustomEvent} event A key combination event.\n   */\n  _onDownKey: function(event) {\n    this._focusNext();\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  /**\n   * Handler that is called when the esc key is pressed.\n   *\n   * @param {CustomEvent} event A key combination event.\n   */\n  _onEscKey: function(event) {\n    var focusedItem = this.focusedItem;\n    if (focusedItem) {\n      focusedItem.blur();\n    }\n  },\n\n  /**\n   * Handler that is called when a keydown event is detected.\n   *\n   * @param {KeyboardEvent} event A keyboard event.\n   */\n  _onKeydown: function(event) {\n    if (!this.keyboardEventMatchesKeys(event, 'up down esc')) {\n      // all other keys focus the menu item starting with that character\n      this._focusWithKeyboardEvent(event);\n    }\n    event.stopPropagation();\n  },\n\n  // override _activateHandler\n  _activateHandler: function(event) {\n    IronSelectableBehavior._activateHandler.call(this, event);\n    event.stopPropagation();\n  },\n\n  /**\n   * Updates this element's tab index when it's enabled/disabled.\n   * @param {boolean} disabled\n   */\n  _disabledChanged: function(disabled) {\n    if (disabled) {\n      this._previousTabIndex =\n          this.hasAttribute('tabindex') ? this.tabIndex : 0;\n      this.removeAttribute(\n          'tabindex');  // No tabindex means not tab-able or select-able.\n    } else if (!this.hasAttribute('tabindex')) {\n      this.setAttribute('tabindex', this._previousTabIndex);\n    }\n  }\n};\n\nIronMenuBehaviorImpl._shiftTabPressed = false;\n\n/** @polymerBehavior */\nexport const IronMenuBehavior =\n    [IronMultiSelectableBehavior, IronA11yKeysBehavior, IronMenuBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronMenuBehavior} from './iron-menu-behavior.js';\n\n/**\n * `IronMenubarBehavior` implements accessible menubar behavior.\n *\n * @polymerBehavior IronMenubarBehavior\n */\nexport const IronMenubarBehaviorImpl = {\n\n  hostAttributes: {'role': 'menubar'},\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {'left': '_onLeftKey', 'right': '_onRightKey'},\n\n  _onUpKey: function(event) {\n    this.focusedItem.click();\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  _onDownKey: function(event) {\n    this.focusedItem.click();\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  get _isRTL() {\n    return window.getComputedStyle(this)['direction'] === 'rtl';\n  },\n\n  _onLeftKey: function(event) {\n    if (this._isRTL) {\n      this._focusNext();\n    } else {\n      this._focusPrevious();\n    }\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  _onRightKey: function(event) {\n    if (this._isRTL) {\n      this._focusPrevious();\n    } else {\n      this._focusNext();\n    }\n    event.detail.keyboardEvent.preventDefault();\n  },\n\n  _onKeydown: function(event) {\n    if (this.keyboardEventMatchesKeys(event, 'up down left right esc')) {\n      return;\n    }\n\n    // all other keys focus the menu item starting with that character\n    this._focusWithKeyboardEvent(event);\n  }\n\n};\n\n/** @polymerBehavior */\nexport const IronMenubarBehavior = [IronMenuBehavior, IronMenubarBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\n\nexport class IronMeta {\n  /**\n   * @param {{\n   *   type: (string|null|undefined),\n   *   key: (string|null|undefined),\n   *   value: *,\n   * }=} options\n   */\n  constructor(options) {\n    IronMeta[' '](options);\n\n    /** @type {string} */\n    this.type = (options && options.type) || 'default';\n    /** @type {string|null|undefined} */\n    this.key = options && options.key;\n    if (options && 'value' in options) {\n      /** @type {*} */\n      this.value = options.value;\n    }\n  }\n\n  /** @return {*} */\n  get value() {\n    var type = this.type;\n    var key = this.key;\n\n    if (type && key) {\n      return IronMeta.types[type] && IronMeta.types[type][key];\n    }\n  }\n\n  /** @param {*} value */\n  set value(value) {\n    var type = this.type;\n    var key = this.key;\n\n    if (type && key) {\n      type = IronMeta.types[type] = IronMeta.types[type] || {};\n      if (value == null) {\n        delete type[key];\n      } else {\n        type[key] = value;\n      }\n    }\n  }\n\n  /** @return {!Array<*>} */\n  get list() {\n    var type = this.type;\n\n    if (type) {\n      var items = IronMeta.types[this.type];\n      if (!items) {\n        return [];\n      }\n\n      return Object.keys(items).map(function(key) {\n        return metaDatas[this.type][key];\n      }, this);\n    }\n  }\n\n  /**\n   * @param {string} key\n   * @return {*}\n   */\n  byKey(key) {\n    this.key = key;\n    return this.value;\n  }\n};\n\n// This function is used to convince Closure not to remove constructor calls\n// for instances that are not held anywhere. For example, when\n// `new IronMeta({...})` is used only for the side effect of adding a value.\nIronMeta[' '] = function() {};\n\nIronMeta.types = {};\n\nvar metaDatas = IronMeta.types;\n\n/**\n`iron-meta` is a generic element you can use for sharing information across the\nDOM tree. It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern)\nsuch that any instance of iron-meta has access to the shared information. You\ncan use `iron-meta` to share whatever you want (or create an extension [like\nx-meta] for enhancements).\n\nThe `iron-meta` instances containing your actual data can be loaded in an\nimport, or constructed in any way you see fit. The only requirement is that you\ncreate them before you try to access them.\n\nExamples:\n\nIf I create an instance like this:\n\n    <iron-meta key=\"info\" value=\"foo/bar\"></iron-meta>\n\nNote that value=\"foo/bar\" is the metadata I've defined. I could define more\nattributes or use child nodes to define additional metadata.\n\nNow I can access that element (and it's metadata) from any iron-meta instance\nvia the byKey method, e.g.\n\n    meta.byKey('info');\n\nPure imperative form would be like:\n\n    document.createElement('iron-meta').byKey('info');\n\nOr, in a Polymer element, you can include a meta in your template:\n\n    <iron-meta id=\"meta\"></iron-meta>\n    ...\n    this.$.meta.byKey('info');\n\n@group Iron Elements\n@demo demo/index.html\n@element iron-meta\n*/\nPolymer({\n\n  is: 'iron-meta',\n\n  properties: {\n\n    /**\n     * The type of meta-data.  All meta-data of the same type is stored\n     * together.\n     * @type {string}\n     */\n    type: {\n      type: String,\n      value: 'default',\n    },\n\n    /**\n     * The key used to store `value` under the `type` namespace.\n     * @type {?string}\n     */\n    key: {\n      type: String,\n    },\n\n    /**\n     * The meta-data to store or retrieve.\n     * @type {*}\n     */\n    value: {\n      type: String,\n      notify: true,\n    },\n\n    /**\n     * If true, `value` is set to the iron-meta instance itself.\n     */\n    self: {type: Boolean, observer: '_selfChanged'},\n\n    __meta: {type: Boolean, computed: '__computeMeta(type, key, value)'}\n  },\n\n  hostAttributes: {hidden: true},\n\n  __computeMeta: function(type, key, value) {\n    var meta = new IronMeta({type: type, key: key});\n\n    if (value !== undefined && value !== meta.value) {\n      meta.value = value;\n    } else if (this.value !== meta.value) {\n      this.value = meta.value;\n    }\n\n    return meta;\n  },\n\n  get list() {\n    return this.__meta && this.__meta.list;\n  },\n\n  _selfChanged: function(self) {\n    if (self) {\n      this.value = this;\n    }\n  },\n\n  /**\n   * Retrieves meta data value by key.\n   *\n   * @method byKey\n   * @param {string} key The key of the meta-data to be returned.\n   * @return {*}\n   */\n  byKey: function(key) {\n    return new IronMeta({type: this.type, key: key}).value;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n// IE11 has a bug where an element with (1) `overflow: auto;`, (2) size based on\n// its content's natural size, (3) absolute positioning (either `absolute` or\n// `fixed`), and (4) use `max-width` to constrain its width will place its\n// vertical scrollbar outside the area constrained by `max-width`.\n//\n// Unlike other browsers, IE11 doesn't support changing the size of scrollbars\n// with CSS, so we don't need to read this value live from the element in\n// question when trying to work around the bug.\nlet verticalScrollbarMaxWidthBugOffset = undefined;\nconst getVerticalScrollbarMaxWidthBugOffset = () => {\n  if (verticalScrollbarMaxWidthBugOffset !== undefined) {\n    return verticalScrollbarMaxWidthBugOffset;\n  }\n\n  const container = document.createElement('div');\n  Object.assign(container.style, {\n    overflow: 'auto',\n    position: 'fixed',\n    left: '0px',\n    top: '0px',\n    maxWidth: '100px',\n    maxHeight: '100px',\n  });\n\n  const content = document.createElement('div');\n  content.style.width = '200px';\n  content.style.height = '200px';\n  container.appendChild(content);\n\n  document.body.appendChild(container);\n  verticalScrollbarMaxWidthBugOffset =\n      Math.abs(container.offsetWidth - 100) > 1 ?\n      container.offsetWidth - container.clientWidth :\n      0;\n  document.body.removeChild(container);\n\n  return verticalScrollbarMaxWidthBugOffset;\n};\n\n/**\n`Polymer.IronFitBehavior` fits an element in another element using `max-height`\nand `max-width`, and optionally centers it in the window or another element.\n\nThe element will only be sized and/or positioned if it has not already been\nsized and/or positioned by CSS.\n\nCSS properties            | Action\n--------------------------|-------------------------------------------\n`position` set            | Element is not centered horizontally or vertically\n`top` or `bottom` set     | Element is not vertically centered\n`left` or `right` set     | Element is not horizontally centered\n`max-height` set          | Element respects `max-height`\n`max-width` set           | Element respects `max-width`\n\n`Polymer.IronFitBehavior` can position an element into another element using\n`verticalAlign` and `horizontalAlign`. This will override the element's css\nposition.\n\n    <div class=\"container\">\n      <iron-fit-impl vertical-align=\"top\" horizontal-align=\"auto\">\n        Positioned into the container\n      </iron-fit-impl>\n    </div>\n\nUse `noOverlap` to position the element around another element without\noverlapping it.\n\n    <div class=\"container\">\n      <iron-fit-impl no-overlap vertical-align=\"auto\" horizontal-align=\"auto\">\n        Positioned around the container\n      </iron-fit-impl>\n    </div>\n\nUse `horizontalOffset, verticalOffset` to offset the element from its\n`positionTarget`; `Polymer.IronFitBehavior` will collapse these in order to\nkeep the element within `fitInto` boundaries, while preserving the element's\nCSS margin values.\n\n    <div class=\"container\">\n      <iron-fit-impl vertical-align=\"top\" vertical-offset=\"20\">\n        With vertical offset\n      </iron-fit-impl>\n    </div>\n\n@demo demo/index.html\n@polymerBehavior\n*/\nexport const IronFitBehavior = {\n\n  properties: {\n\n    /**\n     * The element that will receive a `max-height`/`width`. By default it is\n     * the same as `this`, but it can be set to a child element. This is useful,\n     * for example, for implementing a scrolling region inside the element.\n     * @type {!Element}\n     */\n    sizingTarget: {\n      type: Object,\n      value: function() {\n        return this;\n      }\n    },\n\n    /**\n     * The element to fit `this` into.\n     */\n    fitInto: {type: Object, value: window},\n\n    /**\n     * Will position the element around the positionTarget without overlapping\n     * it.\n     */\n    noOverlap: {type: Boolean},\n\n    /**\n     * The element that should be used to position the element. If not set, it\n     * will default to the parent node.\n     * @type {!Element}\n     */\n    positionTarget: {type: Element},\n\n    /**\n     * The orientation against which to align the element horizontally\n     * relative to the `positionTarget`. Possible values are \"left\", \"right\",\n     * \"center\", \"auto\".\n     */\n    horizontalAlign: {type: String},\n\n    /**\n     * The orientation against which to align the element vertically\n     * relative to the `positionTarget`. Possible values are \"top\", \"bottom\",\n     * \"middle\", \"auto\".\n     */\n    verticalAlign: {type: String},\n\n    /**\n     * If true, it will use `horizontalAlign` and `verticalAlign` values as\n     * preferred alignment and if there's not enough space, it will pick the\n     * values which minimize the cropping.\n     */\n    dynamicAlign: {type: Boolean},\n\n    /**\n     * A pixel value that will be added to the position calculated for the\n     * given `horizontalAlign`, in the direction of alignment. You can think\n     * of it as increasing or decreasing the distance to the side of the\n     * screen given by `horizontalAlign`.\n     *\n     * If `horizontalAlign` is \"left\" or \"center\", this offset will increase or\n     * decrease the distance to the left side of the screen: a negative offset\n     * will move the dropdown to the left; a positive one, to the right.\n     *\n     * Conversely if `horizontalAlign` is \"right\", this offset will increase\n     * or decrease the distance to the right side of the screen: a negative\n     * offset will move the dropdown to the right; a positive one, to the left.\n     */\n    horizontalOffset: {type: Number, value: 0, notify: true},\n\n    /**\n     * A pixel value that will be added to the position calculated for the\n     * given `verticalAlign`, in the direction of alignment. You can think\n     * of it as increasing or decreasing the distance to the side of the\n     * screen given by `verticalAlign`.\n     *\n     * If `verticalAlign` is \"top\" or \"middle\", this offset will increase or\n     * decrease the distance to the top side of the screen: a negative offset\n     * will move the dropdown upwards; a positive one, downwards.\n     *\n     * Conversely if `verticalAlign` is \"bottom\", this offset will increase\n     * or decrease the distance to the bottom side of the screen: a negative\n     * offset will move the dropdown downwards; a positive one, upwards.\n     */\n    verticalOffset: {type: Number, value: 0, notify: true},\n\n    /**\n     * Set to true to auto-fit on attach.\n     */\n    autoFitOnAttach: {type: Boolean, value: false},\n\n    /**\n     * If true and scrollbars are added to `sizingTarget` after it is\n     * positioned, the size of the added scrollbars will be added to its\n     * `maxWidth` and `maxHeight`.\n     */\n    expandSizingTargetForScrollbars: {type: Boolean, value: false},\n\n    /** @type {?Object} */\n    _fitInfo: {type: Object}\n  },\n\n  get _fitWidth() {\n    var fitWidth;\n    if (this.fitInto === window) {\n      fitWidth = this.fitInto.innerWidth;\n    } else {\n      fitWidth = this.fitInto.getBoundingClientRect().width;\n    }\n    return fitWidth;\n  },\n\n  get _fitHeight() {\n    var fitHeight;\n    if (this.fitInto === window) {\n      fitHeight = this.fitInto.innerHeight;\n    } else {\n      fitHeight = this.fitInto.getBoundingClientRect().height;\n    }\n    return fitHeight;\n  },\n\n  get _fitLeft() {\n    var fitLeft;\n    if (this.fitInto === window) {\n      fitLeft = 0;\n    } else {\n      fitLeft = this.fitInto.getBoundingClientRect().left;\n    }\n    return fitLeft;\n  },\n\n  get _fitTop() {\n    var fitTop;\n    if (this.fitInto === window) {\n      fitTop = 0;\n    } else {\n      fitTop = this.fitInto.getBoundingClientRect().top;\n    }\n    return fitTop;\n  },\n\n  /**\n   * The element that should be used to position the element,\n   * if no position target is configured.\n   */\n  get _defaultPositionTarget() {\n    var parent = dom(this).parentNode;\n\n    if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      parent = parent.host;\n    }\n\n    return parent;\n  },\n\n  /**\n   * The horizontal align value, accounting for the RTL/LTR text direction.\n   */\n  get _localeHorizontalAlign() {\n    if (this._isRTL) {\n      // In RTL, \"left\" becomes \"right\".\n      if (this.horizontalAlign === 'right') {\n        return 'left';\n      }\n      if (this.horizontalAlign === 'left') {\n        return 'right';\n      }\n    }\n    return this.horizontalAlign;\n  },\n\n  /**\n   * True if the element should be positioned instead of centered.\n   * @private\n   */\n  get __shouldPosition() {\n    return (this.horizontalAlign || this.verticalAlign) && this.positionTarget;\n  },\n\n  /**\n   * True if the component is RTL.\n   * @private\n   */\n  get _isRTL() {\n    // Memoize this to avoid expensive calculations & relayouts.\n    // Make sure we do it only once\n    if (typeof this._memoizedIsRTL === 'undefined') {\n      this._memoizedIsRTL = window.getComputedStyle(this).direction == 'rtl';\n    }\n    return this._memoizedIsRTL;\n  },\n\n  /** @override */\n  attached: function() {\n    this.positionTarget = this.positionTarget || this._defaultPositionTarget;\n    if (this.autoFitOnAttach) {\n      if (window.getComputedStyle(this).display === 'none') {\n        setTimeout(function() {\n          this.fit();\n        }.bind(this));\n      } else {\n        // NOTE: shadydom applies distribution asynchronously\n        // for performance reasons webcomponents/shadydom#120\n        // Flush to get correct layout info.\n        window.ShadyDOM && ShadyDOM.flush();\n        this.fit();\n      }\n    }\n  },\n\n  /** @override */\n  detached: function() {\n    if (this.__deferredFit) {\n      clearTimeout(this.__deferredFit);\n      this.__deferredFit = null;\n    }\n  },\n\n  /**\n   * Positions and fits the element into the `fitInto` element.\n   */\n  fit: function() {\n    this.position();\n    this.constrain();\n    this.center();\n  },\n\n  /**\n   * Memoize information needed to position and size the target element.\n   * @suppress {deprecated}\n   */\n  _discoverInfo: function() {\n    if (this._fitInfo) {\n      return;\n    }\n    var target = window.getComputedStyle(this);\n    var sizer = window.getComputedStyle(this.sizingTarget);\n\n    this._fitInfo = {\n      inlineStyle: {\n        top: this.style.top || '',\n        left: this.style.left || '',\n        position: this.style.position || ''\n      },\n      sizerInlineStyle: {\n        maxWidth: this.sizingTarget.style.maxWidth || '',\n        maxHeight: this.sizingTarget.style.maxHeight || '',\n        boxSizing: this.sizingTarget.style.boxSizing || ''\n      },\n      positionedBy: {\n        vertically: target.top !== 'auto' ?\n            'top' :\n            (target.bottom !== 'auto' ? 'bottom' : null),\n        horizontally: target.left !== 'auto' ?\n            'left' :\n            (target.right !== 'auto' ? 'right' : null)\n      },\n      sizedBy: {\n        height: sizer.maxHeight !== 'none',\n        width: sizer.maxWidth !== 'none',\n        minWidth: parseInt(sizer.minWidth, 10) || 0,\n        minHeight: parseInt(sizer.minHeight, 10) || 0\n      },\n      margin: {\n        top: parseInt(target.marginTop, 10) || 0,\n        right: parseInt(target.marginRight, 10) || 0,\n        bottom: parseInt(target.marginBottom, 10) || 0,\n        left: parseInt(target.marginLeft, 10) || 0\n      }\n    };\n  },\n\n  /**\n   * Resets the target element's position and size constraints, and clear\n   * the memoized data.\n   */\n  resetFit: function() {\n    var info = this._fitInfo || {};\n    for (var property in info.sizerInlineStyle) {\n      this.sizingTarget.style[property] = info.sizerInlineStyle[property];\n    }\n    for (var property in info.inlineStyle) {\n      this.style[property] = info.inlineStyle[property];\n    }\n\n    this._fitInfo = null;\n  },\n\n  /**\n   * Equivalent to calling `resetFit()` and `fit()`. Useful to call this after\n   * the element or the `fitInto` element has been resized, or if any of the\n   * positioning properties (e.g. `horizontalAlign, verticalAlign`) is updated.\n   * It preserves the scroll position of the sizingTarget.\n   */\n  refit: function() {\n    var scrollLeft = this.sizingTarget.scrollLeft;\n    var scrollTop = this.sizingTarget.scrollTop;\n    this.resetFit();\n    this.fit();\n    this.sizingTarget.scrollLeft = scrollLeft;\n    this.sizingTarget.scrollTop = scrollTop;\n  },\n\n  /**\n   * Positions the element according to `horizontalAlign, verticalAlign`.\n   */\n  position: function() {\n    if (!this.__shouldPosition) {\n      // needs to be centered, and it is done after constrain.\n      return;\n    }\n    this._discoverInfo();\n\n    window.ShadyDOM && window.ShadyDOM.flush();\n\n    this.style.position = 'fixed';\n    // Need border-box for margin/padding.\n    this.sizingTarget.style.boxSizing = 'border-box';\n    // Set to 0, 0 in order to discover any offset caused by parent stacking\n    // contexts.\n    this.style.left = '0px';\n    this.style.top = '0px';\n\n    var rect = this.getBoundingClientRect();\n    var positionRect = this.__getNormalizedRect(this.positionTarget);\n    var fitRect = this.__getNormalizedRect(this.fitInto);\n\n    let unpositionedOffsetWidth;\n    let unpositionedOffsetHeight;\n    let unpositionedClientWidth;\n    let unpositionedClientHeight;\n    if (this.expandSizingTargetForScrollbars) {\n      unpositionedOffsetWidth = this.sizingTarget.offsetWidth;\n      unpositionedOffsetHeight = this.sizingTarget.offsetHeight;\n      unpositionedClientWidth = this.sizingTarget.clientWidth;\n      unpositionedClientHeight = this.sizingTarget.clientHeight;\n    }\n\n    var margin = this._fitInfo.margin;\n\n    // Consider the margin as part of the size for position calculations.\n    var size = {\n      width: rect.width + margin.left + margin.right,\n      height: rect.height + margin.top + margin.bottom\n    };\n\n    var position = this.__getPosition(\n        this._localeHorizontalAlign,\n        this.verticalAlign,\n        size,\n        rect,\n        positionRect,\n        fitRect);\n\n    var left = position.left + margin.left;\n    var top = position.top + margin.top;\n\n    // We first limit right/bottom within fitInto respecting the margin,\n    // then use those values to limit top/left.\n    var right = Math.min(fitRect.right - margin.right, left + rect.width);\n    var bottom = Math.min(fitRect.bottom - margin.bottom, top + rect.height);\n\n    // Keep left/top within fitInto respecting the margin.\n    left = Math.max(\n        fitRect.left + margin.left,\n        Math.min(left, right - this._fitInfo.sizedBy.minWidth));\n    top = Math.max(\n        fitRect.top + margin.top,\n        Math.min(top, bottom - this._fitInfo.sizedBy.minHeight));\n\n    // Use right/bottom to set maxWidth/maxHeight, and respect\n    // minWidth/minHeight.\n    const maxWidth = Math.max(right - left, this._fitInfo.sizedBy.minWidth);\n    const maxHeight = Math.max(bottom - top, this._fitInfo.sizedBy.minHeight);\n    this.sizingTarget.style.maxWidth = maxWidth + 'px';\n    this.sizingTarget.style.maxHeight = maxHeight + 'px';\n\n    // Remove the offset caused by any stacking context.\n    const leftPosition = left - rect.left;\n    const topPosition = top - rect.top;\n    this.style.left = `${leftPosition}px`;\n    this.style.top = `${topPosition}px`;\n\n    if (this.expandSizingTargetForScrollbars) {\n      // Expand the height first - i.e. in the typical block direction - in case\n      // this expands the element enough to remove the vertical scrollbar.\n\n      const positionedOffsetHeight = this.sizingTarget.offsetHeight;\n      const positionedClientHeight = this.sizingTarget.clientHeight;\n      const unpositionedHeightDelta =\n          unpositionedOffsetHeight - unpositionedClientHeight;\n      const positionedHeightDelta =\n          positionedOffsetHeight - positionedClientHeight;\n\n      const sizingTargetScrollbarHeight =\n          positionedHeightDelta - unpositionedHeightDelta;\n      if (sizingTargetScrollbarHeight > 0) {\n        // Expand `maxHeight` by `sizingTargetScrollbarHeight` up to the overall\n        // allowed height within `fitRect`.\n        const fitRectMaxHeight = fitRect.height - margin.top - margin.bottom;\n        const newMaxHeight =\n            Math.min(fitRectMaxHeight, maxHeight + sizingTargetScrollbarHeight);\n        this.sizingTarget.style.maxHeight = `${newMaxHeight}px`;\n\n        // Measure the element's real change in height. This may not equal\n        // `sizingTargetScrollbarHeight` if the overflow amount is less than the\n        // scrollbar size.\n        const offsetHeight = this.sizingTarget.offsetHeight;\n        const addedHeight = offsetHeight - positionedOffsetHeight;\n\n        // Adjust the top position if the alignment requires it.\n        let newTopPosition;\n        if (position.verticalAlign === 'top') {\n          newTopPosition = topPosition;\n        } else if (position.verticalAlign === 'middle') {\n          newTopPosition = topPosition - addedHeight / 2;\n        } else if (position.verticalAlign === 'bottom') {\n          newTopPosition = topPosition - addedHeight;\n        }\n\n        // Constrain the new top position based on `fitRect` again.\n        newTopPosition = Math.max(\n            fitRect.top + margin.top,\n            Math.min(\n                newTopPosition, fitRect.bottom - margin.bottom - offsetHeight));\n        this.style.top = `${newTopPosition}px`;\n      }\n\n      const positionedOffsetWidth = this.sizingTarget.offsetWidth;\n      const positionedClientWidth = this.sizingTarget.clientWidth;\n      const unpositionedWidthDelta =\n          unpositionedOffsetWidth - unpositionedClientWidth;\n      const positionedWidthDelta =\n          positionedOffsetWidth - positionedClientWidth;\n\n      const sizingTargetScrollbarWidth =\n          positionedWidthDelta - unpositionedWidthDelta;\n      if (sizingTargetScrollbarWidth > 0) {\n        const maxWidthBugOffset = getVerticalScrollbarMaxWidthBugOffset();\n\n        // Expand `maxWidth` by `sizingTargetScrollbarWidth` up to the overall\n        // allowed width within `fitRect`.\n        const fitRectMaxWidth = fitRect.width - margin.left - margin.right;\n        const newMaxWidth = Math.min(\n            fitRectMaxWidth,\n            maxWidth + sizingTargetScrollbarWidth - maxWidthBugOffset);\n        this.sizingTarget.style.maxWidth = `${newMaxWidth}px`;\n\n        // Measure the element's real change in width. This may not equal\n        // `sizingTargetScrollbarWidth` if the overflow amount is less than the\n        // scrollbar size.\n        const offsetWidth = this.sizingTarget.offsetWidth + maxWidthBugOffset;\n        const addedWidth = offsetWidth - positionedOffsetWidth;\n\n        // Adjust the left position if the alignment requires it.\n        let newLeftPosition;\n        if (position.horizontalAlign === 'left') {\n          newLeftPosition = leftPosition;\n        } else if (position.horizontalAlign === 'center') {\n          newLeftPosition = leftPosition - addedWidth / 2;\n        } else if (position.horizontalAlign === 'right') {\n          newLeftPosition = leftPosition - addedWidth;\n        }\n\n        // Constrain the new left position based on `fitRect` again.\n        newLeftPosition = Math.max(\n            fitRect.left + margin.left,\n            Math.min(\n                newLeftPosition, fitRect.right - margin.right - offsetWidth));\n        this.style.left = `${newLeftPosition}px`;\n      }\n    }\n  },\n\n  /**\n   * Constrains the size of the element to `fitInto` by setting `max-height`\n   * and/or `max-width`.\n   */\n  constrain: function() {\n    if (this.__shouldPosition) {\n      return;\n    }\n    this._discoverInfo();\n\n    var info = this._fitInfo;\n    // position at (0px, 0px) if not already positioned, so we can measure the\n    // natural size.\n    if (!info.positionedBy.vertically) {\n      this.style.position = 'fixed';\n      this.style.top = '0px';\n    }\n    if (!info.positionedBy.horizontally) {\n      this.style.position = 'fixed';\n      this.style.left = '0px';\n    }\n\n    // need border-box for margin/padding\n    this.sizingTarget.style.boxSizing = 'border-box';\n    // constrain the width and height if not already set\n    var rect = this.getBoundingClientRect();\n    if (!info.sizedBy.height) {\n      this.__sizeDimension(\n          rect, info.positionedBy.vertically, 'top', 'bottom', 'Height');\n    }\n    if (!info.sizedBy.width) {\n      this.__sizeDimension(\n          rect, info.positionedBy.horizontally, 'left', 'right', 'Width');\n    }\n  },\n\n  /**\n   * @protected\n   * @deprecated\n   */\n  _sizeDimension: function(rect, positionedBy, start, end, extent) {\n    this.__sizeDimension(rect, positionedBy, start, end, extent);\n  },\n\n  /**\n   * @private\n   */\n  __sizeDimension: function(rect, positionedBy, start, end, extent) {\n    var info = this._fitInfo;\n    var fitRect = this.__getNormalizedRect(this.fitInto);\n    var max = extent === 'Width' ? fitRect.width : fitRect.height;\n    var flip = (positionedBy === end);\n    var offset = flip ? max - rect[end] : rect[start];\n    var margin = info.margin[flip ? start : end];\n    var offsetExtent = 'offset' + extent;\n    var sizingOffset = this[offsetExtent] - this.sizingTarget[offsetExtent];\n    this.sizingTarget.style['max' + extent] =\n        (max - margin - offset - sizingOffset) + 'px';\n  },\n\n  /**\n   * Centers horizontally and vertically if not already positioned. This also\n   * sets `position:fixed`.\n   */\n  center: function() {\n    if (this.__shouldPosition) {\n      return;\n    }\n    this._discoverInfo();\n\n    var positionedBy = this._fitInfo.positionedBy;\n    if (positionedBy.vertically && positionedBy.horizontally) {\n      // Already positioned.\n      return;\n    }\n    // Need position:fixed to center\n    this.style.position = 'fixed';\n    // Take into account the offset caused by parents that create stacking\n    // contexts (e.g. with transform: translate3d). Translate to 0,0 and\n    // measure the bounding rect.\n    if (!positionedBy.vertically) {\n      this.style.top = '0px';\n    }\n    if (!positionedBy.horizontally) {\n      this.style.left = '0px';\n    }\n    // It will take in consideration margins and transforms\n    var rect = this.getBoundingClientRect();\n    var fitRect = this.__getNormalizedRect(this.fitInto);\n    if (!positionedBy.vertically) {\n      var top = fitRect.top - rect.top + (fitRect.height - rect.height) / 2;\n      this.style.top = top + 'px';\n    }\n    if (!positionedBy.horizontally) {\n      var left = fitRect.left - rect.left + (fitRect.width - rect.width) / 2;\n      this.style.left = left + 'px';\n    }\n  },\n\n  __getNormalizedRect: function(target) {\n    if (target === document.documentElement || target === window) {\n      return {\n        top: 0,\n        left: 0,\n        width: window.innerWidth,\n        height: window.innerHeight,\n        right: window.innerWidth,\n        bottom: window.innerHeight\n      };\n    }\n    return target.getBoundingClientRect();\n  },\n\n  __getOffscreenArea: function(position, size, fitRect) {\n    var verticalCrop = Math.min(0, position.top) +\n        Math.min(0, fitRect.bottom - (position.top + size.height));\n    var horizontalCrop = Math.min(0, position.left) +\n        Math.min(0, fitRect.right - (position.left + size.width));\n    return Math.abs(verticalCrop) * size.width +\n        Math.abs(horizontalCrop) * size.height;\n  },\n\n\n  __getPosition: function(\n      hAlign, vAlign, size, sizeNoMargins, positionRect, fitRect) {\n    // All the possible configurations.\n    // Ordered as top-left, top-right, bottom-left, bottom-right.\n    var positions = [\n      {\n        verticalAlign: 'top',\n        horizontalAlign: 'left',\n        top: positionRect.top + this.verticalOffset,\n        left: positionRect.left + this.horizontalOffset\n      },\n      {\n        verticalAlign: 'top',\n        horizontalAlign: 'right',\n        top: positionRect.top + this.verticalOffset,\n        left: positionRect.right - size.width - this.horizontalOffset\n      },\n      {\n        verticalAlign: 'bottom',\n        horizontalAlign: 'left',\n        top: positionRect.bottom - size.height - this.verticalOffset,\n        left: positionRect.left + this.horizontalOffset\n      },\n      {\n        verticalAlign: 'bottom',\n        horizontalAlign: 'right',\n        top: positionRect.bottom - size.height - this.verticalOffset,\n        left: positionRect.right - size.width - this.horizontalOffset\n      }\n    ];\n\n    if (this.noOverlap) {\n      // Duplicate.\n      for (var i = 0, l = positions.length; i < l; i++) {\n        var copy = {};\n        for (var key in positions[i]) {\n          copy[key] = positions[i][key];\n        }\n        positions.push(copy);\n      }\n      // Horizontal overlap only.\n      positions[0].top = positions[1].top += positionRect.height;\n      positions[2].top = positions[3].top -= positionRect.height;\n      // Vertical overlap only.\n      positions[4].left = positions[6].left += positionRect.width;\n      positions[5].left = positions[7].left -= positionRect.width;\n    }\n\n    // Consider auto as null for coding convenience.\n    vAlign = vAlign === 'auto' ? null : vAlign;\n    hAlign = hAlign === 'auto' ? null : hAlign;\n\n    if (!hAlign || hAlign === 'center') {\n      positions.push({\n        verticalAlign: 'top',\n        horizontalAlign: 'center',\n        top: positionRect.top + this.verticalOffset +\n            (this.noOverlap ? positionRect.height : 0),\n        left: positionRect.left - sizeNoMargins.width / 2 +\n            positionRect.width / 2 + this.horizontalOffset\n      });\n      positions.push({\n        verticalAlign: 'bottom',\n        horizontalAlign: 'center',\n        top: positionRect.bottom - size.height - this.verticalOffset -\n            (this.noOverlap ? positionRect.height : 0),\n        left: positionRect.left - sizeNoMargins.width / 2 +\n            positionRect.width / 2 + this.horizontalOffset\n      });\n    }\n\n    if (!vAlign || vAlign === 'middle') {\n      positions.push({\n        verticalAlign: 'middle',\n        horizontalAlign: 'left',\n        top: positionRect.top - sizeNoMargins.height / 2 +\n            positionRect.height / 2 + this.verticalOffset,\n        left: positionRect.left + this.horizontalOffset +\n            (this.noOverlap ? positionRect.width : 0)\n      });\n      positions.push({\n        verticalAlign: 'middle',\n        horizontalAlign: 'right',\n        top: positionRect.top - sizeNoMargins.height / 2 +\n            positionRect.height / 2 + this.verticalOffset,\n        left: positionRect.right - size.width - this.horizontalOffset -\n            (this.noOverlap ? positionRect.width : 0)\n      });\n    }\n\n    if (vAlign === 'middle' && hAlign === 'center') {\n      positions.push({\n        verticalAlign: 'middle',\n        horizontalAlign: 'center',\n        top: positionRect.top - sizeNoMargins.height / 2 +\n            positionRect.height / 2 + this.verticalOffset,\n        left: positionRect.left - sizeNoMargins.width / 2 +\n            positionRect.width / 2 + this.horizontalOffset\n      });\n    }\n\n    var position;\n    for (var i = 0; i < positions.length; i++) {\n      var candidate = positions[i];\n      var vAlignOk = candidate.verticalAlign === vAlign;\n      var hAlignOk = candidate.horizontalAlign === hAlign;\n\n      // If both vAlign and hAlign are defined, return exact match.\n      // For dynamicAlign and noOverlap we'll have more than one candidate, so\n      // we'll have to check the offscreenArea to make the best choice.\n      if (!this.dynamicAlign && !this.noOverlap && vAlignOk && hAlignOk) {\n        position = candidate;\n        break;\n      }\n\n      // Align is ok if alignment preferences are respected. If no preferences,\n      // it is considered ok.\n      var alignOk = (!vAlign || vAlignOk) && (!hAlign || hAlignOk);\n\n      // Filter out elements that don't match the alignment (if defined).\n      // With dynamicAlign, we need to consider all the positions to find the\n      // one that minimizes the cropped area.\n      if (!this.dynamicAlign && !alignOk) {\n        continue;\n      }\n\n      candidate.offscreenArea =\n          this.__getOffscreenArea(candidate, size, fitRect);\n      // If not cropped and respects the align requirements, keep it.\n      // This allows to prefer positions overlapping horizontally over the\n      // ones overlapping vertically.\n      if (candidate.offscreenArea === 0 && alignOk) {\n        position = candidate;\n        break;\n      }\n      position = position || candidate;\n      var diff = candidate.offscreenArea - position.offscreenArea;\n      // Check which crops less. If it crops equally, check if at least one\n      // align setting is ok.\n      if (diff < 0 || (diff === 0 && (vAlignOk || hAlignOk))) {\n        position = candidate;\n      }\n    }\n\n    return position;\n  }\n\n};\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\nvar p = Element.prototype;\nvar matches = p.matches || p.matchesSelector || p.mozMatchesSelector ||\n    p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector;\n\nclass IronFocusablesHelperClass {\n  /**\n   * Returns a sorted array of tabbable nodes, including the root node.\n   * It searches the tabbable nodes in the light and shadow dom of the chidren,\n   * sorting the result by tabindex.\n   * @param {!Node} node\n   * @return {!Array<!HTMLElement>}\n   */\n  getTabbableNodes(node) {\n    var result = [];\n    // If there is at least one element with tabindex > 0, we need to sort\n    // the final array by tabindex.\n    var needsSortByTabIndex = this._collectTabbableNodes(node, result);\n    if (needsSortByTabIndex) {\n      return this._sortByTabIndex(result);\n    }\n    return result;\n  }\n\n  /**\n   * Returns if a element is focusable.\n   * @param {!HTMLElement} element\n   * @return {boolean}\n   */\n  isFocusable(element) {\n    // From http://stackoverflow.com/a/1600194/4228703:\n    // There isn't a definite list, it's up to the browser. The only\n    // standard we have is DOM Level 2 HTML\n    // https://www.w3.org/TR/DOM-Level-2-HTML/html.html, according to which the\n    // only elements that have a focus() method are HTMLInputElement,\n    // HTMLSelectElement, HTMLTextAreaElement and HTMLAnchorElement. This\n    // notably omits HTMLButtonElement and HTMLAreaElement. Referring to these\n    // tests with tabbables in different browsers\n    // http://allyjs.io/data-tables/focusable.html\n\n    // Elements that cannot be focused if they have [disabled] attribute.\n    if (matches.call(element, 'input, select, textarea, button, object')) {\n      return matches.call(element, ':not([disabled])');\n    }\n    // Elements that can be focused even if they have [disabled] attribute.\n    return matches.call(\n        element, 'a[href], area[href], iframe, [tabindex], [contentEditable]');\n  }\n\n  /**\n   * Returns if a element is tabbable. To be tabbable, a element must be\n   * focusable, visible, and with a tabindex !== -1.\n   * @param {!HTMLElement} element\n   * @return {boolean}\n   */\n  isTabbable(element) {\n    return this.isFocusable(element) &&\n        matches.call(element, ':not([tabindex=\"-1\"])') &&\n        this._isVisible(element);\n  }\n\n  /**\n   * Returns the normalized element tabindex. If not focusable, returns -1.\n   * It checks for the attribute \"tabindex\" instead of the element property\n   * `tabIndex` since browsers assign different values to it.\n   * e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`\n   * @param {!HTMLElement} element\n   * @return {!number}\n   * @private\n   */\n  _normalizedTabIndex(element) {\n    if (this.isFocusable(element)) {\n      var tabIndex = element.getAttribute('tabindex') || 0;\n      return Number(tabIndex);\n    }\n    return -1;\n  }\n\n  /**\n   * Searches for nodes that are tabbable and adds them to the `result` array.\n   * Returns if the `result` array needs to be sorted by tabindex.\n   * @param {!Node} node The starting point for the search; added to `result`\n   * if tabbable.\n   * @param {!Array<!HTMLElement>} result\n   * @return {boolean}\n   * @private\n   */\n  _collectTabbableNodes(node, result) {\n    // If not an element or not visible, no need to explore children.\n    if (node.nodeType !== Node.ELEMENT_NODE) {\n      return false;\n    }\n    var element = /** @type {!HTMLElement} */ (node);\n    if (!this._isVisible(element)) {\n      return false;\n    }\n    var tabIndex = this._normalizedTabIndex(element);\n    var needsSort = tabIndex > 0;\n    if (tabIndex >= 0) {\n      result.push(element);\n    }\n    // In ShadowDOM v1, tab order is affected by the order of distrubution.\n    // E.g. getTabbableNodes(#root) in ShadowDOM v1 should return [#A, #B];\n    // in ShadowDOM v0 tab order is not affected by the distrubution order,\n    // in fact getTabbableNodes(#root) returns [#B, #A].\n    //  <div id=\"root\">\n    //   <!-- shadow -->\n    //     <slot name=\"a\">\n    //     <slot name=\"b\">\n    //   <!-- /shadow -->\n    //   <input id=\"A\" slot=\"a\">\n    //   <input id=\"B\" slot=\"b\" tabindex=\"1\">\n    //  </div>\n    // TODO(valdrin) support ShadowDOM v1 when upgrading to Polymer v2.0.\n    var children;\n    if (element.localName === 'content' || element.localName === 'slot') {\n      children = dom(element).getDistributedNodes();\n    } else {\n      // Use shadow root if possible, will check for distributed nodes.\n      children = dom(element.root || element).children;\n    }\n    for (var i = 0; i < children.length; i++) {\n      // Ensure method is always invoked to collect tabbable children.\n      needsSort = this._collectTabbableNodes(children[i], result) || needsSort;\n    }\n    return needsSort;\n  }\n\n  /**\n   * Returns false if the element has `visibility: hidden` or `display: none`\n   * @param {!HTMLElement} element\n   * @return {boolean}\n   * @private\n   */\n  _isVisible(element) {\n    // Check inline style first to save a re-flow. If looks good, check also\n    // computed style.\n    var style = element.style;\n    if (style.visibility !== 'hidden' && style.display !== 'none') {\n      style = window.getComputedStyle(element);\n      return (style.visibility !== 'hidden' && style.display !== 'none');\n    }\n    return false;\n  }\n\n  /**\n   * Sorts an array of tabbable elements by tabindex. Returns a new array.\n   * @param {!Array<!HTMLElement>} tabbables\n   * @return {!Array<!HTMLElement>}\n   * @private\n   */\n  _sortByTabIndex(tabbables) {\n    // Implement a merge sort as Array.prototype.sort does a non-stable sort\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n    var len = tabbables.length;\n    if (len < 2) {\n      return tabbables;\n    }\n    var pivot = Math.ceil(len / 2);\n    var left = this._sortByTabIndex(tabbables.slice(0, pivot));\n    var right = this._sortByTabIndex(tabbables.slice(pivot));\n    return this._mergeSortByTabIndex(left, right);\n  }\n\n  /**\n   * Merge sort iterator, merges the two arrays into one, sorted by tab index.\n   * @param {!Array<!HTMLElement>} left\n   * @param {!Array<!HTMLElement>} right\n   * @return {!Array<!HTMLElement>}\n   * @private\n   */\n  _mergeSortByTabIndex(left, right) {\n    var result = [];\n    while ((left.length > 0) && (right.length > 0)) {\n      if (this._hasLowerTabOrder(left[0], right[0])) {\n        result.push(right.shift());\n      } else {\n        result.push(left.shift());\n      }\n    }\n\n    return result.concat(left, right);\n  }\n\n  /**\n   * Returns if element `a` has lower tab order compared to element `b`\n   * (both elements are assumed to be focusable and tabbable).\n   * Elements with tabindex = 0 have lower tab order compared to elements\n   * with tabindex > 0.\n   * If both have same tabindex, it returns false.\n   * @param {!HTMLElement} a\n   * @param {!HTMLElement} b\n   * @return {boolean}\n   * @private\n   */\n  _hasLowerTabOrder(a, b) {\n    // Normalize tabIndexes\n    // e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`\n    var ati = Math.max(a.tabIndex, 0);\n    var bti = Math.max(b.tabIndex, 0);\n    return (ati === 0 || bti === 0) ? bti > ati : ati > bti;\n  }\n}\n\nexport const IronFocusablesHelper = new IronFocusablesHelperClass();\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/*\n`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It\nshould be a singleton.\n\n### Styling\n\nThe following custom properties and mixins are available for styling.\n\nCustom property | Description | Default\n-------------------------------------------|------------------------|---------\n`--iron-overlay-backdrop-background-color` | Backdrop background color | #000\n`--iron-overlay-backdrop-opacity`          | Backdrop opacity | 0.6\n`--iron-overlay-backdrop`                  | Mixin applied to `iron-overlay-backdrop`.                      | {}\n`--iron-overlay-backdrop-opened`           | Mixin applied to `iron-overlay-backdrop` when it is displayed | {}\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: var(--iron-overlay-backdrop-background-color, #000);\n        opacity: 0;\n        transition: opacity 0.2s;\n        pointer-events: none;\n        @apply --iron-overlay-backdrop;\n      }\n\n      :host(.opened) {\n        opacity: var(--iron-overlay-backdrop-opacity, 0.6);\n        pointer-events: auto;\n        @apply --iron-overlay-backdrop-opened;\n      }\n    </style>\n\n    <slot></slot>\n`,\n\n  is: 'iron-overlay-backdrop',\n\n  properties: {\n\n    /**\n     * Returns true if the backdrop is opened.\n     */\n    opened: {\n      reflectToAttribute: true,\n      type: Boolean,\n      value: false,\n      observer: '_openedChanged',\n    }\n\n  },\n\n  listeners: {\n    'transitionend': '_onTransitionend',\n  },\n\n  /** @override */\n  created: function() {\n    // Used to cancel previous requestAnimationFrame calls when opened changes.\n    this.__openedRaf = null;\n  },\n\n  /** @override */\n  attached: function() {\n    this.opened && this._openedChanged(this.opened);\n  },\n\n  /**\n   * Appends the backdrop to document body if needed.\n   */\n  prepare: function() {\n    if (this.opened && !this.parentNode) {\n      dom(document.body).appendChild(this);\n    }\n  },\n\n  /**\n   * Shows the backdrop.\n   */\n  open: function() {\n    this.opened = true;\n  },\n\n  /**\n   * Hides the backdrop.\n   */\n  close: function() {\n    this.opened = false;\n  },\n\n  /**\n   * Removes the backdrop from document body if needed.\n   */\n  complete: function() {\n    if (!this.opened && this.parentNode === document.body) {\n      dom(this.parentNode).removeChild(this);\n    }\n  },\n\n  _onTransitionend: function(event) {\n    if (event && event.target === this) {\n      this.complete();\n    }\n  },\n\n  /**\n   * @param {boolean} opened\n   * @private\n   */\n  _openedChanged: function(opened) {\n    if (opened) {\n      // Auto-attach.\n      this.prepare();\n    } else {\n      // Animation might be disabled via the mixin or opacity custom property.\n      // If it is disabled in other ways, it's up to the user to call complete.\n      var cs = window.getComputedStyle(this);\n      if (cs.transitionDuration === '0s' || cs.opacity == 0) {\n        this.complete();\n      }\n    }\n\n    if (!this.isAttached) {\n      return;\n    }\n\n    // Always cancel previous requestAnimationFrame.\n    if (this.__openedRaf) {\n      window.cancelAnimationFrame(this.__openedRaf);\n      this.__openedRaf = null;\n    }\n    // Force relayout to ensure proper transitions.\n    this.scrollTop = this.scrollTop;\n    this.__openedRaf = window.requestAnimationFrame(function() {\n      this.__openedRaf = null;\n      this.toggleClass('opened', this.opened);\n    }.bind(this));\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport './iron-overlay-backdrop.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport * as gestures from '@polymer/polymer/lib/utils/gestures.js';\n\n/**\n * @package\n */\nexport class IronOverlayManagerClass {\n  constructor() {\n    /**\n     * Used to keep track of the opened overlays.\n     * @private {!Array<!Element>}\n     */\n    this._overlays = [];\n\n    /**\n     * iframes have a default z-index of 100,\n     * so this default should be at least that.\n     * @private {number}\n     */\n    this._minimumZ = 101;\n\n    /**\n     * Memoized backdrop element.\n     * @private {Element|null}\n     */\n    this._backdropElement = null;\n\n    // Enable document-wide tap recognizer.\n    // NOTE: Use useCapture=true to avoid accidentally prevention of the closing\n    // of an overlay via event.stopPropagation(). The only way to prevent\n    // closing of an overlay should be through its APIs.\n    // NOTE: enable tap on <html> to workaround Polymer/polymer#4459\n    // Pass no-op function because MSEdge 15 doesn't handle null as 2nd argument\n    // https://github.com/Microsoft/ChakraCore/issues/3863\n    gestures.addListener(document.documentElement, 'tap', function() {});\n    document.addEventListener('tap', this._onCaptureClick.bind(this), true);\n    document.addEventListener('focus', this._onCaptureFocus.bind(this), true);\n    document.addEventListener(\n        'keydown', this._onCaptureKeyDown.bind(this), true);\n  }\n\n  /**\n   * The shared backdrop element.\n   * @return {!Element} backdropElement\n   */\n  get backdropElement() {\n    if (!this._backdropElement) {\n      this._backdropElement = document.createElement('iron-overlay-backdrop');\n    }\n    return this._backdropElement;\n  }\n\n  /**\n   * The deepest active element.\n   * @return {!Element} activeElement the active element\n   */\n  get deepActiveElement() {\n    var active = document.activeElement;\n    // document.activeElement can be null\n    // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement\n    // In IE 11, it can also be an object when operating in iframes.\n    // In these cases, default it to document.body.\n    if (!active || active instanceof Element === false) {\n      active = document.body;\n    }\n    while (active.root && dom(active.root).activeElement) {\n      active = dom(active.root).activeElement;\n    }\n    return active;\n  }\n\n  /**\n   * Brings the overlay at the specified index to the front.\n   * @param {number} i\n   * @private\n   */\n  _bringOverlayAtIndexToFront(i) {\n    var overlay = this._overlays[i];\n    if (!overlay) {\n      return;\n    }\n    var lastI = this._overlays.length - 1;\n    var currentOverlay = this._overlays[lastI];\n    // Ensure always-on-top overlay stays on top.\n    if (currentOverlay &&\n        this._shouldBeBehindOverlay(overlay, currentOverlay)) {\n      lastI--;\n    }\n    // If already the top element, return.\n    if (i >= lastI) {\n      return;\n    }\n    // Update z-index to be on top.\n    var minimumZ = Math.max(this.currentOverlayZ(), this._minimumZ);\n    if (this._getZ(overlay) <= minimumZ) {\n      this._applyOverlayZ(overlay, minimumZ);\n    }\n\n    // Shift other overlays behind the new on top.\n    while (i < lastI) {\n      this._overlays[i] = this._overlays[i + 1];\n      i++;\n    }\n    this._overlays[lastI] = overlay;\n  }\n\n  /**\n   * Adds the overlay and updates its z-index if it's opened, or removes it if\n   * it's closed. Also updates the backdrop z-index.\n   * @param {!Element} overlay\n   */\n  addOrRemoveOverlay(overlay) {\n    if (overlay.opened) {\n      this.addOverlay(overlay);\n    } else {\n      this.removeOverlay(overlay);\n    }\n  }\n\n  /**\n   * Tracks overlays for z-index and focus management.\n   * Ensures the last added overlay with always-on-top remains on top.\n   * @param {!Element} overlay\n   */\n  addOverlay(overlay) {\n    var i = this._overlays.indexOf(overlay);\n    if (i >= 0) {\n      this._bringOverlayAtIndexToFront(i);\n      this.trackBackdrop();\n      return;\n    }\n    var insertionIndex = this._overlays.length;\n    var currentOverlay = this._overlays[insertionIndex - 1];\n    var minimumZ = Math.max(this._getZ(currentOverlay), this._minimumZ);\n    var newZ = this._getZ(overlay);\n\n    // Ensure always-on-top overlay stays on top.\n    if (currentOverlay &&\n        this._shouldBeBehindOverlay(overlay, currentOverlay)) {\n      // This bumps the z-index of +2.\n      this._applyOverlayZ(currentOverlay, minimumZ);\n      insertionIndex--;\n      // Update minimumZ to match previous overlay's z-index.\n      var previousOverlay = this._overlays[insertionIndex - 1];\n      minimumZ = Math.max(this._getZ(previousOverlay), this._minimumZ);\n    }\n\n    // Update z-index and insert overlay.\n    if (newZ <= minimumZ) {\n      this._applyOverlayZ(overlay, minimumZ);\n    }\n    this._overlays.splice(insertionIndex, 0, overlay);\n\n    this.trackBackdrop();\n  }\n\n  /**\n   * @param {!Element} overlay\n   */\n  removeOverlay(overlay) {\n    var i = this._overlays.indexOf(overlay);\n    if (i === -1) {\n      return;\n    }\n    this._overlays.splice(i, 1);\n\n    this.trackBackdrop();\n  }\n\n  /**\n   * Returns the current overlay.\n   * @return {!Element|undefined}\n   */\n  currentOverlay() {\n    var i = this._overlays.length - 1;\n    return this._overlays[i];\n  }\n\n  /**\n   * Returns the current overlay z-index.\n   * @return {number}\n   */\n  currentOverlayZ() {\n    return this._getZ(this.currentOverlay());\n  }\n\n  /**\n   * Ensures that the minimum z-index of new overlays is at least `minimumZ`.\n   * This does not effect the z-index of any existing overlays.\n   * @param {number} minimumZ\n   */\n  ensureMinimumZ(minimumZ) {\n    this._minimumZ = Math.max(this._minimumZ, minimumZ);\n  }\n\n  focusOverlay() {\n    var current = /** @type {?} */ (this.currentOverlay());\n    if (current) {\n      current._applyFocus();\n    }\n  }\n\n  /**\n   * Updates the backdrop z-index.\n   */\n  trackBackdrop() {\n    var overlay = this._overlayWithBackdrop();\n    // Avoid creating the backdrop if there is no overlay with backdrop.\n    if (!overlay && !this._backdropElement) {\n      return;\n    }\n    this.backdropElement.style.zIndex = this._getZ(overlay) - 1;\n    this.backdropElement.opened = !!overlay;\n    // Property observers are not fired until element is attached\n    // in Polymer 2.x, so we ensure element is attached if needed.\n    // https://github.com/Polymer/polymer/issues/4526\n    this.backdropElement.prepare();\n  }\n\n  /**\n   * @return {!Array<!Element>}\n   */\n  getBackdrops() {\n    var backdrops = [];\n    for (var i = 0; i < this._overlays.length; i++) {\n      if (this._overlays[i].withBackdrop) {\n        backdrops.push(this._overlays[i]);\n      }\n    }\n    return backdrops;\n  }\n\n  /**\n   * Returns the z-index for the backdrop.\n   * @return {number}\n   */\n  backdropZ() {\n    return this._getZ(this._overlayWithBackdrop()) - 1;\n  }\n\n  /**\n   * Returns the top opened overlay that has a backdrop.\n   * @return {!Element|undefined}\n   * @private\n   */\n  _overlayWithBackdrop() {\n    for (var i = this._overlays.length - 1; i >= 0; i--) {\n      if (this._overlays[i].withBackdrop) {\n        return this._overlays[i];\n      }\n    }\n  }\n\n  /**\n   * Calculates the minimum z-index for the overlay.\n   * @param {Element=} overlay\n   * @private\n   */\n  _getZ(overlay) {\n    var z = this._minimumZ;\n    if (overlay) {\n      var z1 = Number(\n          overlay.style.zIndex || window.getComputedStyle(overlay).zIndex);\n      // Check if is a number\n      // Number.isNaN not supported in IE 10+\n      if (z1 === z1) {\n        z = z1;\n      }\n    }\n    return z;\n  }\n\n  /**\n   * @param {!Element} element\n   * @param {number|string} z\n   * @private\n   */\n  _setZ(element, z) {\n    element.style.zIndex = z;\n  }\n\n  /**\n   * @param {!Element} overlay\n   * @param {number} aboveZ\n   * @private\n   */\n  _applyOverlayZ(overlay, aboveZ) {\n    this._setZ(overlay, aboveZ + 2);\n  }\n\n  /**\n   * Returns the deepest overlay in the path.\n   * @param {!Array<!Element>=} path\n   * @return {!Element|undefined}\n   * @suppress {missingProperties}\n   * @private\n   */\n  _overlayInPath(path) {\n    path = path || [];\n    for (var i = 0; i < path.length; i++) {\n      if (path[i]._manager === this) {\n        return path[i];\n      }\n    }\n  }\n\n  /**\n   * Ensures the click event is delegated to the right overlay.\n   * @param {!Event} event\n   * @private\n   */\n  _onCaptureClick(event) {\n    var i = this._overlays.length - 1;\n    if (i === -1)\n      return;\n    var path = /** @type {!Array<!EventTarget>} */ (dom(event).path);\n    var overlay;\n    // Check if clicked outside of overlay.\n    while ((overlay = /** @type {?} */ (this._overlays[i])) &&\n           this._overlayInPath(path) !== overlay) {\n      overlay._onCaptureClick(event);\n      if (overlay.allowClickThrough) {\n        i--;\n      } else {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Ensures the focus event is delegated to the right overlay.\n   * @param {!Event} event\n   * @private\n   */\n  _onCaptureFocus(event) {\n    var overlay = /** @type {?} */ (this.currentOverlay());\n    if (overlay) {\n      overlay._onCaptureFocus(event);\n    }\n  }\n\n  /**\n   * Ensures TAB and ESC keyboard events are delegated to the right overlay.\n   * @param {!Event} event\n   * @private\n   */\n  _onCaptureKeyDown(event) {\n    var overlay = /** @type {?} */ (this.currentOverlay());\n    if (overlay) {\n      if (IronA11yKeysBehavior.keyboardEventMatchesKeys(event, 'esc')) {\n        overlay._onCaptureEsc(event);\n      } else if (IronA11yKeysBehavior.keyboardEventMatchesKeys(event, 'tab')) {\n        overlay._onCaptureTab(event);\n      }\n    }\n  }\n\n  /**\n   * Returns if the overlay1 should be behind overlay2.\n   * @param {!Element} overlay1\n   * @param {!Element} overlay2\n   * @return {boolean}\n   * @suppress {missingProperties}\n   * @private\n   */\n  _shouldBeBehindOverlay(overlay1, overlay2) {\n    return !overlay1.alwaysOnTop && overlay2.alwaysOnTop;\n  }\n};\n\nexport const IronOverlayManager = new IronOverlayManagerClass();\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n/**\n * Used to calculate the scroll direction during touch events.\n * @type {!Object}\n */\nvar lastTouchPosition = {pageX: 0, pageY: 0};\n/**\n * Used to avoid computing event.path and filter scrollable nodes (better perf).\n * @type {?EventTarget}\n */\nvar lastRootTarget = null;\n/**\n * @type {!Array<!Node>}\n */\nvar lastScrollableNodes = [];\n/**\n * @type {!Array<string>}\n */\nvar scrollEvents = [\n  // Modern `wheel` event for mouse wheel scrolling:\n  'wheel',\n  // Older, non-standard `mousewheel` event for some FF:\n  'mousewheel',\n  // IE:\n  'DOMMouseScroll',\n  // Touch enabled devices\n  'touchstart',\n  'touchmove'\n];\n// must be defined for modulizer\nvar _boundScrollHandler;\n\n/**\n * The current element that defines the DOM boundaries of the\n * scroll lock. This is always the most recently locking element.\n *\n * @type {!Node|undefined}\n */\nvar currentLockingElement;\n\nexport {currentLockingElement};\n\n/**\n * Returns true if the provided element is \"scroll locked\", which is to\n * say that it cannot be scrolled via pointer or keyboard interactions.\n *\n * @param {!HTMLElement} element An HTML element instance which may or may\n * not be scroll locked.\n */\nexport function elementIsScrollLocked(element) {\n  var lockingElement = currentLockingElement;\n\n  if (lockingElement === undefined) {\n    return false;\n  }\n\n  var scrollLocked;\n\n  if (_hasCachedLockedElement(element)) {\n    return true;\n  }\n\n  if (_hasCachedUnlockedElement(element)) {\n    return false;\n  }\n\n  scrollLocked = !!lockingElement && lockingElement !== element &&\n      !_composedTreeContains(lockingElement, element);\n\n  if (scrollLocked) {\n    _lockedElementCache.push(element);\n  } else {\n    _unlockedElementCache.push(element);\n  }\n\n  return scrollLocked;\n}\n\n/**\n * Push an element onto the current scroll lock stack. The most recently\n * pushed element and its children will be considered scrollable. All\n * other elements will not be scrollable.\n *\n * Scroll locking is implemented as a stack so that cases such as\n * dropdowns within dropdowns are handled well.\n *\n * @param {!HTMLElement} element The element that should lock scroll.\n */\nexport function pushScrollLock(element) {\n  // Prevent pushing the same element twice\n  if (_lockingElements.indexOf(element) >= 0) {\n    return;\n  }\n\n  if (_lockingElements.length === 0) {\n    _lockScrollInteractions();\n  }\n\n  _lockingElements.push(element);\n  currentLockingElement = _lockingElements[_lockingElements.length - 1];\n\n  _lockedElementCache = [];\n  _unlockedElementCache = [];\n}\n\n/**\n * Remove an element from the scroll lock stack. The element being\n * removed does not need to be the most recently pushed element. However,\n * the scroll lock constraints only change when the most recently pushed\n * element is removed.\n *\n * @param {!HTMLElement} element The element to remove from the scroll\n * lock stack.\n */\nexport function removeScrollLock(element) {\n  var index = _lockingElements.indexOf(element);\n\n  if (index === -1) {\n    return;\n  }\n\n  _lockingElements.splice(index, 1);\n  currentLockingElement = _lockingElements[_lockingElements.length - 1];\n\n  _lockedElementCache = [];\n  _unlockedElementCache = [];\n\n  if (_lockingElements.length === 0) {\n    _unlockScrollInteractions();\n  }\n}\n\nexport const _lockingElements = [];\nexport let _lockedElementCache = null;\nexport let _unlockedElementCache = null;\n\nexport function _hasCachedLockedElement(element) {\n  return _lockedElementCache.indexOf(element) > -1;\n}\n\nexport function _hasCachedUnlockedElement(element) {\n  return _unlockedElementCache.indexOf(element) > -1;\n}\n\nexport function _composedTreeContains(element, child) {\n  // NOTE(cdata): This method iterates over content elements and their\n  // corresponding distributed nodes to implement a contains-like method\n  // that pierces through the composed tree of the ShadowDOM. Results of\n  // this operation are cached (elsewhere) on a per-scroll-lock basis, to\n  // guard against potentially expensive lookups happening repeatedly as\n  // a user scrolls / touchmoves.\n  var contentElements;\n  var distributedNodes;\n  var contentIndex;\n  var nodeIndex;\n\n  if (element.contains(child)) {\n    return true;\n  }\n\n  contentElements = dom(element).querySelectorAll('content,slot');\n\n  for (contentIndex = 0; contentIndex < contentElements.length;\n       ++contentIndex) {\n    distributedNodes = dom(contentElements[contentIndex]).getDistributedNodes();\n\n    for (nodeIndex = 0; nodeIndex < distributedNodes.length; ++nodeIndex) {\n      // Polymer 2.x returns slot.assignedNodes which can contain text nodes.\n      if (distributedNodes[nodeIndex].nodeType !== Node.ELEMENT_NODE)\n        continue;\n\n      if (_composedTreeContains(distributedNodes[nodeIndex], child)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport function _scrollInteractionHandler(event) {\n  // Avoid canceling an event with cancelable=false, e.g. scrolling is in\n  // progress and cannot be interrupted.\n  if (event.cancelable && _shouldPreventScrolling(event)) {\n    event.preventDefault();\n  }\n  // If event has targetTouches (touch event), update last touch position.\n  if (event.targetTouches) {\n    var touch = event.targetTouches[0];\n    lastTouchPosition.pageX = touch.pageX;\n    lastTouchPosition.pageY = touch.pageY;\n  }\n}\n\n/**\n * @package\n */\nexport {_boundScrollHandler};\n\nexport function _lockScrollInteractions() {\n  _boundScrollHandler =\n      _boundScrollHandler || _scrollInteractionHandler.bind(undefined);\n  for (var i = 0, l = scrollEvents.length; i < l; i++) {\n    // NOTE: browsers that don't support objects as third arg will\n    // interpret it as boolean, hence useCapture = true in this case.\n    document.addEventListener(\n        scrollEvents[i], _boundScrollHandler, {capture: true, passive: false});\n  }\n}\n\nexport function _unlockScrollInteractions() {\n  for (var i = 0, l = scrollEvents.length; i < l; i++) {\n    // NOTE: browsers that don't support objects as third arg will\n    // interpret it as boolean, hence useCapture = true in this case.\n    document.removeEventListener(\n        scrollEvents[i], _boundScrollHandler, {capture: true, passive: false});\n  }\n}\n\n/**\n * Returns true if the event causes scroll outside the current locking\n * element, e.g. pointer/keyboard interactions, or scroll \"leaking\"\n * outside the locking element when it is already at its scroll boundaries.\n * @param {!Event} event\n * @return {boolean}\n * @package\n */\nexport function _shouldPreventScrolling(event) {\n  // Update if root target changed. For touch events, ensure we don't\n  // update during touchmove.\n  var target = dom(event).rootTarget;\n  if (event.type !== 'touchmove' && lastRootTarget !== target) {\n    lastRootTarget = target;\n    lastScrollableNodes = _getScrollableNodes(dom(event).path);\n  }\n\n  // Prevent event if no scrollable nodes.\n  if (!lastScrollableNodes.length) {\n    return true;\n  }\n  // Don't prevent touchstart event inside the locking element when it has\n  // scrollable nodes.\n  if (event.type === 'touchstart') {\n    return false;\n  }\n  // Get deltaX/Y.\n  var info = _getScrollInfo(event);\n  // Prevent if there is no child that can scroll.\n  return !_getScrollingNode(lastScrollableNodes, info.deltaX, info.deltaY);\n}\n\n/**\n * Returns an array of scrollable nodes up to the current locking element,\n * which is included too if scrollable.\n * @param {!Array<!Node>} nodes\n * @return {!Array<!Node>} scrollables\n * @package\n */\nexport function _getScrollableNodes(nodes) {\n  var scrollables = [];\n  var lockingIndex =\n      nodes.indexOf(/** @type {!Node} */ (currentLockingElement));\n  // Loop from root target to locking element (included).\n  for (var i = 0; i <= lockingIndex; i++) {\n    // Skip non-Element nodes.\n    if (nodes[i].nodeType !== Node.ELEMENT_NODE) {\n      continue;\n    }\n    var node = /** @type {!Element} */ (nodes[i]);\n    // Check inline style before checking computed style.\n    var style = node.style;\n    if (style.overflow !== 'scroll' && style.overflow !== 'auto') {\n      style = window.getComputedStyle(node);\n    }\n    if (style.overflow === 'scroll' || style.overflow === 'auto') {\n      scrollables.push(node);\n    }\n  }\n  return scrollables;\n}\n\n/**\n * Returns the node that is scrolling. If there is no scrolling,\n * returns undefined.\n * @param {!Array<!Node>} nodes\n * @param {number} deltaX Scroll delta on the x-axis\n * @param {number} deltaY Scroll delta on the y-axis\n * @return {!Node|undefined}\n * @package\n */\nexport function _getScrollingNode(nodes, deltaX, deltaY) {\n  // No scroll.\n  if (!deltaX && !deltaY) {\n    return;\n  }\n  // Check only one axis according to where there is more scroll.\n  // Prefer vertical to horizontal.\n  var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);\n  for (var i = 0; i < nodes.length; i++) {\n    var node = nodes[i];\n    var canScroll = false;\n    if (verticalScroll) {\n      // delta < 0 is scroll up, delta > 0 is scroll down.\n      canScroll = deltaY < 0 ?\n          node.scrollTop > 0 :\n          node.scrollTop < node.scrollHeight - node.clientHeight;\n    } else {\n      // delta < 0 is scroll left, delta > 0 is scroll right.\n      canScroll = deltaX < 0 ?\n          node.scrollLeft > 0 :\n          node.scrollLeft < node.scrollWidth - node.clientWidth;\n    }\n    if (canScroll) {\n      return node;\n    }\n  }\n}\n\n/**\n * Returns scroll `deltaX` and `deltaY`.\n * @param {!Event} event The scroll event\n * @return {{deltaX: number, deltaY: number}} Object containing the\n * x-axis scroll delta (positive: scroll right, negative: scroll left,\n * 0: no scroll), and the y-axis scroll delta (positive: scroll down,\n * negative: scroll up, 0: no scroll).\n * @package\n */\nexport function _getScrollInfo(event) {\n  var info = {deltaX: event.deltaX, deltaY: event.deltaY};\n  // Already available.\n  if ('deltaX' in event) {\n    // do nothing, values are already good.\n  }\n  // Safari has scroll info in `wheelDeltaX/Y`.\n  else if ('wheelDeltaX' in event && 'wheelDeltaY' in event) {\n    info.deltaX = -event.wheelDeltaX;\n    info.deltaY = -event.wheelDeltaY;\n  }\n  // IE10 has only vertical scroll info in `wheelDelta`.\n  else if ('wheelDelta' in event) {\n    info.deltaX = 0;\n    info.deltaY = -event.wheelDelta;\n  }\n  // Firefox has scroll info in `detail` and `axis`.\n  else if ('axis' in event) {\n    info.deltaX = event.axis === 1 ? event.detail : 0;\n    info.deltaY = event.axis === 2 ? event.detail : 0;\n  }\n  // On mobile devices, calculate scroll direction.\n  else if (event.targetTouches) {\n    var touch = event.targetTouches[0];\n    // Touch moves from right to left => scrolling goes right.\n    info.deltaX = lastTouchPosition.pageX - touch.pageX;\n    // Touch moves from down to up => scrolling goes down.\n    info.deltaY = lastTouchPosition.pageY - touch.pageY;\n  }\n  return info;\n}\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronFitBehavior} from '@polymer/iron-fit-behavior/iron-fit-behavior.js';\nimport {IronResizableBehavior} from '@polymer/iron-resizable-behavior/iron-resizable-behavior.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {useShadow} from '@polymer/polymer/lib/utils/settings.js';\n\nimport {IronFocusablesHelper} from './iron-focusables-helper.js';\nimport {IronOverlayManager, IronOverlayManagerClass} from './iron-overlay-manager.js';\nimport {pushScrollLock, removeScrollLock} from './iron-scroll-manager.js';\n\n/** @polymerBehavior */\nexport const IronOverlayBehaviorImpl = {\n\n  properties: {\n\n    /**\n     * True if the overlay is currently displayed.\n     */\n    opened:\n        {observer: '_openedChanged', type: Boolean, value: false, notify: true},\n\n    /**\n     * True if the overlay was canceled when it was last closed.\n     */\n    canceled: {\n      observer: '_canceledChanged',\n      readOnly: true,\n      type: Boolean,\n      value: false\n    },\n\n    /**\n     * Set to true to display a backdrop behind the overlay. It traps the focus\n     * within the light DOM of the overlay.\n     */\n    withBackdrop: {\n      observer: '_withBackdropChanged',\n      type: Boolean,\n    },\n\n    /**\n     * Set to true to disable auto-focusing the overlay or child nodes with\n     * the `autofocus` attribute` when the overlay is opened.\n     */\n    noAutoFocus: {\n      type: Boolean,\n      value: false,\n    },\n\n    /**\n     * Set to true to disable canceling the overlay with the ESC key.\n     */\n    noCancelOnEscKey: {\n      type: Boolean,\n      value: false,\n    },\n\n    /**\n     * Set to true to disable canceling the overlay by clicking outside it.\n     */\n    noCancelOnOutsideClick: {\n      type: Boolean,\n      value: false,\n    },\n\n    /**\n     * Contains the reason(s) this overlay was last closed (see\n     * `iron-overlay-closed`). `IronOverlayBehavior` provides the `canceled`\n     * reason; implementers of the behavior can provide other reasons in\n     * addition to `canceled`.\n     */\n    closingReason: {\n      // was a getter before, but needs to be a property so other\n      // behaviors can override this.\n      type: Object,\n    },\n\n    /**\n     * Set to true to enable restoring of focus when overlay is closed.\n     */\n    restoreFocusOnClose: {\n      type: Boolean,\n      value: false,\n    },\n\n    /**\n     * Set to true to allow clicks to go through overlays.\n     * When the user clicks outside this overlay, the click may\n     * close the overlay below.\n     */\n    allowClickThrough: {\n      type: Boolean,\n    },\n\n    /**\n     * Set to true to keep overlay always on top.\n     */\n    alwaysOnTop: {\n      type: Boolean,\n    },\n\n    /**\n     * Determines which action to perform when scroll outside an opened overlay\n     * happens. Possible values: lock - blocks scrolling from happening, refit -\n     * computes the new position on the overlay cancel - causes the overlay to\n     * close\n     */\n    scrollAction: {\n      type: String,\n    },\n\n    /**\n     * Shortcut to access to the overlay manager.\n     * @private\n     * @type {!IronOverlayManagerClass}\n     */\n    _manager: {\n      type: Object,\n      value: IronOverlayManager,\n    },\n\n    /**\n     * The node being focused.\n     * @type {?Node}\n     */\n    _focusedChild: {\n      type: Object,\n    }\n\n  },\n\n  listeners: {'iron-resize': '_onIronResize'},\n\n  observers: ['__updateScrollObservers(isAttached, opened, scrollAction)'],\n\n  /**\n   * The backdrop element.\n   * @return {!Element}\n   */\n  get backdropElement() {\n    return this._manager.backdropElement;\n  },\n\n  /**\n   * Returns the node to give focus to.\n   * @return {!Node}\n   */\n  get _focusNode() {\n    return this._focusedChild || dom(this).querySelector('[autofocus]') || this;\n  },\n\n  /**\n   * Array of nodes that can receive focus (overlay included), ordered by\n   * `tabindex`. This is used to retrieve which is the first and last focusable\n   * nodes in order to wrap the focus for overlays `with-backdrop`.\n   *\n   * If you know what is your content (specifically the first and last focusable\n   * children), you can override this method to return only `[firstFocusable,\n   * lastFocusable];`\n   * @return {!Array<!Node>}\n   * @protected\n   */\n  get _focusableNodes() {\n    return IronFocusablesHelper.getTabbableNodes(this);\n  },\n\n  /**\n   * @return {void}\n   */\n  ready: function() {\n    // Used to skip calls to notifyResize and refit while the overlay is\n    // animating.\n    this.__isAnimating = false;\n    // with-backdrop needs tabindex to be set in order to trap the focus.\n    // If it is not set, IronOverlayBehavior will set it, and remove it if\n    // with-backdrop = false.\n    this.__shouldRemoveTabIndex = false;\n    // Used for wrapping the focus on TAB / Shift+TAB.\n    this.__firstFocusableNode = this.__lastFocusableNode = null;\n    // Used by to keep track of the RAF callbacks.\n    this.__rafs = {};\n    // Focused node before overlay gets opened. Can be restored on close.\n    this.__restoreFocusNode = null;\n    // Scroll info to be restored.\n    this.__scrollTop = this.__scrollLeft = null;\n    this.__onCaptureScroll = this.__onCaptureScroll.bind(this);\n    // Root nodes hosting the overlay, used to listen for scroll events on them.\n    this.__rootNodes = null;\n    this._ensureSetup();\n  },\n\n  /** @override */\n  attached: function() {\n    // Call _openedChanged here so that position can be computed correctly.\n    if (this.opened) {\n      this._openedChanged(this.opened);\n    }\n    this._observer = dom(this).observeNodes(this._onNodesChange);\n  },\n\n  /** @override */\n  detached: function() {\n    // TODO(bicknellr): Per spec, checking `this._observer` should never be\n    // necessary because `connectedCallback` and `disconnectedCallback` should\n    // always be called in alternating order. However, the custom elements\n    // polyfill doesn't implement the reactions stack, so this can sometimes\n    // happen, particularly if ShadyDOM is in noPatch mode where the custom\n    // elements polyfill is installed before ShadyDOM. We should investigate\n    // whether or not we can either implement the reactions stack without major\n    // performance implications or patch ShadyDOM's functions to restore the\n    // typical ShadyDOM-then-custom-elements order and remove this workaround.\n    if (this._observer) {\n      dom(this).unobserveNodes(this._observer);\n    }\n    this._observer = null;\n    for (var cb in this.__rafs) {\n      if (this.__rafs[cb] !== null) {\n        cancelAnimationFrame(this.__rafs[cb]);\n      }\n    }\n    this.__rafs = {};\n    this._manager.removeOverlay(this);\n\n    // We got detached while animating, ensure we show/hide the overlay\n    // and fire iron-overlay-opened/closed event!\n    if (this.__isAnimating) {\n      if (this.opened) {\n        this._finishRenderOpened();\n      } else {\n        // Restore the focus if necessary.\n        this._applyFocus();\n        this._finishRenderClosed();\n      }\n    }\n  },\n\n  /**\n   * Toggle the opened state of the overlay.\n   */\n  toggle: function() {\n    this._setCanceled(false);\n    this.opened = !this.opened;\n  },\n\n  /**\n   * Open the overlay.\n   */\n  open: function() {\n    this._setCanceled(false);\n    this.opened = true;\n  },\n\n  /**\n   * Close the overlay.\n   */\n  close: function() {\n    this._setCanceled(false);\n    this.opened = false;\n  },\n\n  /**\n   * Cancels the overlay.\n   * @param {Event=} event The original event\n   */\n  cancel: function(event) {\n    var cancelEvent =\n        this.fire('iron-overlay-canceled', event, {cancelable: true});\n    if (cancelEvent.defaultPrevented) {\n      return;\n    }\n\n    this._setCanceled(true);\n    this.opened = false;\n  },\n\n  /**\n   * Invalidates the cached tabbable nodes. To be called when any of the\n   * focusable content changes (e.g. a button is disabled).\n   */\n  invalidateTabbables: function() {\n    this.__firstFocusableNode = this.__lastFocusableNode = null;\n  },\n\n  _ensureSetup: function() {\n    if (this._overlaySetup) {\n      return;\n    }\n    this._overlaySetup = true;\n    this.style.outline = 'none';\n    this.style.display = 'none';\n  },\n\n  /**\n   * Called when `opened` changes.\n   * @param {boolean=} opened\n   * @protected\n   */\n  _openedChanged: function(opened) {\n    if (opened) {\n      this.removeAttribute('aria-hidden');\n    } else {\n      this.setAttribute('aria-hidden', 'true');\n    }\n\n    // Defer any animation-related code on attached\n    // (_openedChanged gets called again on attached).\n    if (!this.isAttached) {\n      return;\n    }\n\n    this.__isAnimating = true;\n\n    // Deraf for non-blocking rendering.\n    this.__deraf('__openedChanged', this.__openedChanged);\n  },\n\n  _canceledChanged: function() {\n    this.closingReason = this.closingReason || {};\n    this.closingReason.canceled = this.canceled;\n  },\n\n  _withBackdropChanged: function() {\n    // If tabindex is already set, no need to override it.\n    if (this.withBackdrop && !this.hasAttribute('tabindex')) {\n      this.setAttribute('tabindex', '-1');\n      this.__shouldRemoveTabIndex = true;\n    } else if (this.__shouldRemoveTabIndex) {\n      this.removeAttribute('tabindex');\n      this.__shouldRemoveTabIndex = false;\n    }\n    if (this.opened && this.isAttached) {\n      this._manager.trackBackdrop();\n    }\n  },\n\n  /**\n   * tasks which must occur before opening; e.g. making the element visible.\n   * @protected\n   */\n  _prepareRenderOpened: function() {\n    // Store focused node.\n    this.__restoreFocusNode = this._manager.deepActiveElement;\n\n    // Needed to calculate the size of the overlay so that transitions on its\n    // size will have the correct starting points.\n    this._preparePositioning();\n    this.refit();\n    this._finishPositioning();\n\n    // Safari will apply the focus to the autofocus element when displayed\n    // for the first time, so we make sure to return the focus where it was.\n    if (this.noAutoFocus && document.activeElement === this._focusNode) {\n      this._focusNode.blur();\n      this.__restoreFocusNode.focus();\n    }\n  },\n\n  /**\n   * Tasks which cause the overlay to actually open; typically play an\n   * animation.\n   * @protected\n   */\n  _renderOpened: function() {\n    this._finishRenderOpened();\n  },\n\n  /**\n   * Tasks which cause the overlay to actually close; typically play an\n   * animation.\n   * @protected\n   */\n  _renderClosed: function() {\n    this._finishRenderClosed();\n  },\n\n  /**\n   * Tasks to be performed at the end of open action. Will fire\n   * `iron-overlay-opened`.\n   * @protected\n   */\n  _finishRenderOpened: function() {\n    this.notifyResize();\n    this.__isAnimating = false;\n\n    this.fire('iron-overlay-opened');\n  },\n\n  /**\n   * Tasks to be performed at the end of close action. Will fire\n   * `iron-overlay-closed`.\n   * @protected\n   */\n  _finishRenderClosed: function() {\n    // Hide the overlay.\n    this.style.display = 'none';\n    // Reset z-index only at the end of the animation.\n    this.style.zIndex = '';\n    this.notifyResize();\n    this.__isAnimating = false;\n    this.fire('iron-overlay-closed', this.closingReason);\n  },\n\n  _preparePositioning: function() {\n    this.style.transition = this.style.webkitTransition = 'none';\n    this.style.transform = this.style.webkitTransform = 'none';\n    this.style.display = '';\n  },\n\n  _finishPositioning: function() {\n    // First, make it invisible & reactivate animations.\n    this.style.display = 'none';\n    // Force reflow before re-enabling animations so that they don't start.\n    // Set scrollTop to itself so that Closure Compiler doesn't remove this.\n    this.scrollTop = this.scrollTop;\n    this.style.transition = this.style.webkitTransition = '';\n    this.style.transform = this.style.webkitTransform = '';\n    // Now that animations are enabled, make it visible again\n    this.style.display = '';\n    // Force reflow, so that following animations are properly started.\n    // Set scrollTop to itself so that Closure Compiler doesn't remove this.\n    this.scrollTop = this.scrollTop;\n  },\n\n  /**\n   * Applies focus according to the opened state.\n   * @protected\n   */\n  _applyFocus: function() {\n    if (this.opened) {\n      if (!this.noAutoFocus) {\n        this._focusNode.focus();\n      }\n    } else {\n      // Restore focus.\n      if (this.restoreFocusOnClose && this.__restoreFocusNode) {\n        // If the activeElement is `<body>` or inside the overlay,\n        // we are allowed to restore the focus. In all the other\n        // cases focus might have been moved elsewhere by another\n        // component or by an user interaction (e.g. click on a\n        // button outside the overlay).\n        var activeElement = this._manager.deepActiveElement;\n        if (activeElement === document.body ||\n            composedContains(this, activeElement)) {\n          this.__restoreFocusNode.focus();\n        }\n      }\n      this.__restoreFocusNode = null;\n      this._focusNode.blur();\n      this._focusedChild = null;\n    }\n  },\n\n  /**\n   * Cancels (closes) the overlay. Call when click happens outside the overlay.\n   * @param {!Event} event\n   * @protected\n   */\n  _onCaptureClick: function(event) {\n    if (!this.noCancelOnOutsideClick) {\n      this.cancel(event);\n    }\n  },\n\n  /**\n   * Keeps track of the focused child. If withBackdrop, traps focus within\n   * overlay.\n   * @param {!Event} event\n   * @protected\n   */\n  _onCaptureFocus: function(event) {\n    if (!this.withBackdrop) {\n      return;\n    }\n    var path = dom(event).path;\n    if (path.indexOf(this) === -1) {\n      event.stopPropagation();\n      this._applyFocus();\n    } else {\n      this._focusedChild = /** @type {Node} */ (path[0]);\n    }\n  },\n\n  /**\n   * Handles the ESC key event and cancels (closes) the overlay.\n   * @param {!Event} event\n   * @protected\n   */\n  _onCaptureEsc: function(event) {\n    if (!this.noCancelOnEscKey) {\n      this.cancel(event);\n    }\n  },\n\n  /**\n   * Handles TAB key events to track focus changes.\n   * Will wrap focus for overlays withBackdrop.\n   * @param {!Event} event\n   * @protected\n   */\n  _onCaptureTab: function(event) {\n    if (!this.withBackdrop) {\n      return;\n    }\n    this.__ensureFirstLastFocusables();\n    // TAB wraps from last to first focusable.\n    // Shift + TAB wraps from first to last focusable.\n    var shift = event.shiftKey;\n    var nodeToCheck =\n        shift ? this.__firstFocusableNode : this.__lastFocusableNode;\n    var nodeToSet =\n        shift ? this.__lastFocusableNode : this.__firstFocusableNode;\n    var shouldWrap = false;\n    if (nodeToCheck === nodeToSet) {\n      // If nodeToCheck is the same as nodeToSet, it means we have an overlay\n      // with 0 or 1 focusables; in either case we still need to trap the\n      // focus within the overlay.\n      shouldWrap = true;\n    } else {\n      // In dom=shadow, the manager will receive focus changes on the main\n      // root but not the ones within other shadow roots, so we can't rely on\n      // _focusedChild, but we should check the deepest active element.\n      var focusedNode = this._manager.deepActiveElement;\n      // If the active element is not the nodeToCheck but the overlay itself,\n      // it means the focus is about to go outside the overlay, hence we\n      // should prevent that (e.g. user opens the overlay and hit Shift+TAB).\n      shouldWrap = (focusedNode === nodeToCheck || focusedNode === this);\n    }\n\n    if (shouldWrap) {\n      // When the overlay contains the last focusable element of the document\n      // and it's already focused, pressing TAB would move the focus outside\n      // the document (e.g. to the browser search bar). Similarly, when the\n      // overlay contains the first focusable element of the document and it's\n      // already focused, pressing Shift+TAB would move the focus outside the\n      // document (e.g. to the browser search bar).\n      // In both cases, we would not receive a focus event, but only a blur.\n      // In order to achieve focus wrapping, we prevent this TAB event and\n      // force the focus. This will also prevent the focus to temporarily move\n      // outside the overlay, which might cause scrolling.\n      event.preventDefault();\n      this._focusedChild = nodeToSet;\n      this._applyFocus();\n    }\n  },\n\n  /**\n   * Refits if the overlay is opened and not animating.\n   * @protected\n   */\n  _onIronResize: function() {\n    if (this.opened && !this.__isAnimating) {\n      this.__deraf('refit', this.refit);\n    }\n  },\n\n  /**\n   * Will call notifyResize if overlay is opened.\n   * Can be overridden in order to avoid multiple observers on the same node.\n   * @protected\n   */\n  _onNodesChange: function() {\n    if (this.opened && !this.__isAnimating) {\n      // It might have added focusable nodes, so invalidate cached values.\n      this.invalidateTabbables();\n      this.notifyResize();\n    }\n  },\n\n  /**\n   * Updates the references to the first and last focusable nodes.\n   * @private\n   */\n  __ensureFirstLastFocusables: function() {\n    var focusableNodes = this._focusableNodes;\n    this.__firstFocusableNode = focusableNodes[0];\n    this.__lastFocusableNode = focusableNodes[focusableNodes.length - 1];\n  },\n\n  /**\n   * Tasks executed when opened changes: prepare for the opening, move the\n   * focus, update the manager, render opened/closed.\n   * @private\n   */\n  __openedChanged: function() {\n    if (this.opened) {\n      // Make overlay visible, then add it to the manager.\n      this._prepareRenderOpened();\n      this._manager.addOverlay(this);\n      // Move the focus to the child node with [autofocus].\n      this._applyFocus();\n\n      this._renderOpened();\n    } else {\n      // Remove overlay, then restore the focus before actually closing.\n      this._manager.removeOverlay(this);\n      this._applyFocus();\n\n      this._renderClosed();\n    }\n  },\n\n  /**\n   * Debounces the execution of a callback to the next animation frame.\n   * @param {!string} jobname\n   * @param {!Function} callback Always bound to `this`\n   * @private\n   */\n  __deraf: function(jobname, callback) {\n    var rafs = this.__rafs;\n    if (rafs[jobname] !== null) {\n      cancelAnimationFrame(rafs[jobname]);\n    }\n    rafs[jobname] = requestAnimationFrame(function nextAnimationFrame() {\n      rafs[jobname] = null;\n      callback.call(this);\n    }.bind(this));\n  },\n\n  /**\n   * @param {boolean} isAttached\n   * @param {boolean} opened\n   * @param {string=} scrollAction\n   * @private\n   */\n  __updateScrollObservers: function(isAttached, opened, scrollAction) {\n    if (!isAttached || !opened || !this.__isValidScrollAction(scrollAction)) {\n      removeScrollLock(this);\n      this.__removeScrollListeners();\n    } else {\n      if (scrollAction === 'lock') {\n        this.__saveScrollPosition();\n        pushScrollLock(this);\n      }\n      this.__addScrollListeners();\n    }\n  },\n\n  /**\n   * @private\n   */\n  __addScrollListeners: function() {\n    if (!this.__rootNodes) {\n      this.__rootNodes = [];\n      // Listen for scroll events in all shadowRoots hosting this overlay only\n      // when in native ShadowDOM.\n      if (useShadow) {\n        var node = this;\n        while (node) {\n          if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && node.host) {\n            this.__rootNodes.push(node);\n          }\n          node = node.host || node.assignedSlot || node.parentNode;\n        }\n      }\n      this.__rootNodes.push(document);\n    }\n    this.__rootNodes.forEach(function(el) {\n      el.addEventListener('scroll', this.__onCaptureScroll, {\n        capture: true,\n        passive: true,\n      });\n    }, this);\n  },\n\n  /**\n   * @private\n   */\n  __removeScrollListeners: function() {\n    if (this.__rootNodes) {\n      this.__rootNodes.forEach(function(el) {\n        el.removeEventListener('scroll', this.__onCaptureScroll, {\n          capture: true,\n          passive: true,\n        });\n      }, this);\n    }\n    if (!this.isAttached) {\n      this.__rootNodes = null;\n    }\n  },\n\n  /**\n   * @param {string=} scrollAction\n   * @return {boolean}\n   * @private\n   */\n  __isValidScrollAction: function(scrollAction) {\n    return scrollAction === 'lock' || scrollAction === 'refit' ||\n        scrollAction === 'cancel';\n  },\n\n  /**\n   * @private\n   */\n  __onCaptureScroll: function(event) {\n    if (this.__isAnimating) {\n      return;\n    }\n    // Check if scroll outside the overlay.\n    if (dom(event).path.indexOf(this) >= 0) {\n      return;\n    }\n    switch (this.scrollAction) {\n      case 'lock':\n        // NOTE: scrolling might happen if a scroll event is not cancellable, or\n        // if user pressed keys that cause scrolling (they're not prevented in\n        // order not to break a11y features like navigate with arrow keys).\n        this.__restoreScrollPosition();\n        break;\n      case 'refit':\n        this.__deraf('refit', this.refit);\n        break;\n      case 'cancel':\n        this.cancel(event);\n        break;\n    }\n  },\n\n  /**\n   * Memoizes the scroll position of the outside scrolling element.\n   * @private\n   */\n  __saveScrollPosition: function() {\n    if (document.scrollingElement) {\n      this.__scrollTop = document.scrollingElement.scrollTop;\n      this.__scrollLeft = document.scrollingElement.scrollLeft;\n    } else {\n      // Since we don't know if is the body or html, get max.\n      this.__scrollTop =\n          Math.max(document.documentElement.scrollTop, document.body.scrollTop);\n      this.__scrollLeft = Math.max(\n          document.documentElement.scrollLeft, document.body.scrollLeft);\n    }\n  },\n\n  /**\n   * Resets the scroll position of the outside scrolling element.\n   * @private\n   */\n  __restoreScrollPosition: function() {\n    if (document.scrollingElement) {\n      document.scrollingElement.scrollTop = this.__scrollTop;\n      document.scrollingElement.scrollLeft = this.__scrollLeft;\n    } else {\n      // Since we don't know if is the body or html, set both.\n      document.documentElement.scrollTop = document.body.scrollTop =\n          this.__scrollTop;\n      document.documentElement.scrollLeft = document.body.scrollLeft =\n          this.__scrollLeft;\n    }\n  },\n\n};\n\nconst composedParent = node =>\n    node.assignedSlot || node.parentNode || node.host;\n\nconst composedContains = (ancestor, descendant) => {\n  for (let element = descendant; element; element = composedParent(element)) {\n    if (element === ancestor) {\n      return true;\n    }\n  }\n  return false;\n};\n\n/**\n  Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden\n  or shown, and displays on top of other content. It includes an optional\n  backdrop, and can be used to implement a variety of UI controls including\n  dialogs and drop downs. Multiple overlays may be displayed at once.\n\n  See the [demo source\n  code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)\n  for an example.\n\n  ### Closing and canceling\n\n  An overlay may be hidden by closing or canceling. The difference between close\n  and cancel is user intent. Closing generally implies that the user\n  acknowledged the content on the overlay. By default, it will cancel whenever\n  the user taps outside it or presses the escape key. This behavior is\n  configurable with the `no-cancel-on-esc-key` and the\n  `no-cancel-on-outside-click` properties. `close()` should be called explicitly\n  by the implementer when the user interacts with a control in the overlay\n  element. When the dialog is canceled, the overlay fires an\n  'iron-overlay-canceled' event. Call `preventDefault` on this event to prevent\n  the overlay from closing.\n\n  ### Positioning\n\n  By default the element is sized and positioned to fit and centered inside the\n  window. You can position and size it manually using CSS. See\n  `Polymer.IronFitBehavior`.\n\n  ### Backdrop\n\n  Set the `with-backdrop` attribute to display a backdrop behind the overlay.\n  The backdrop is appended to `<body>` and is of type `<iron-overlay-backdrop>`.\n  See its doc page for styling options.\n\n  In addition, `with-backdrop` will wrap the focus within the content in the\n  light DOM. Override the [`_focusableNodes`\n  getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) to achieve a\n  different behavior.\n\n  ### Limitations\n\n  The element is styled to appear on top of other content by setting its\n  `z-index` property. You must ensure no element has a stacking context with a\n  higher `z-index` than its parent stacking context. You should place this\n  element as a child of `<body>` whenever possible.\n\n  @demo demo/index.html\n  @polymerBehavior\n */\nexport const IronOverlayBehavior =\n    [IronFitBehavior, IronResizableBehavior, IronOverlayBehaviorImpl];\n\n/**\n * Fired after the overlay opens.\n * @event iron-overlay-opened\n */\n\n/**\n * Fired when the overlay is canceled, but before it is closed.\n * @event iron-overlay-canceled\n * @param {Event} event The closing of the overlay can be prevented\n * by calling `event.preventDefault()`. The `event.detail` is the original event\n * that originated the canceling (e.g. ESC keyboard event or click event outside\n * the overlay).\n */\n\n/**\n * Fired after the overlay closes.\n * @event iron-overlay-closed\n * @param {Event} event The `event.detail` is the `closingReason` property\n * (contains `canceled`, whether the overlay was canceled).\n */\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n * `iron-range-behavior` provides the behavior for something with a minimum to\n * maximum range.\n *\n * @demo demo/index.html\n * @polymerBehavior\n */\nexport const IronRangeBehavior = {\n\n  properties: {\n\n    /**\n     * The number that represents the current value.\n     */\n    value: {type: Number, value: 0, notify: true, reflectToAttribute: true},\n\n    /**\n     * The number that indicates the minimum value of the range.\n     */\n    min: {type: Number, value: 0, notify: true},\n\n    /**\n     * The number that indicates the maximum value of the range.\n     */\n    max: {type: Number, value: 100, notify: true},\n\n    /**\n     * Specifies the value granularity of the range's value.\n     */\n    step: {type: Number, value: 1, notify: true},\n\n    /**\n     * Returns the ratio of the value.\n     */\n    ratio: {type: Number, value: 0, readOnly: true, notify: true},\n  },\n\n  observers: ['_update(value, min, max, step)'],\n\n  _calcRatio: function(value) {\n    return (this._clampValue(value) - this.min) / (this.max - this.min);\n  },\n\n  _clampValue: function(value) {\n    return Math.min(this.max, Math.max(this.min, this._calcStep(value)));\n  },\n\n  _calcStep: function(value) {\n    // polymer/issues/2493\n    value = parseFloat(value);\n\n    if (!this.step) {\n      return value;\n    }\n\n    var numSteps = Math.round((value - this.min) / this.step);\n    if (this.step < 1) {\n      /**\n       * For small values of this.step, if we calculate the step using\n       * `Math.round(value / step) * step` we may hit a precision point issue\n       * eg. 0.1 * 0.2 =  0.020000000000000004\n       * http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\n       *\n       * as a work around we can divide by the reciprocal of `step`\n       */\n      return numSteps / (1 / this.step) + this.min;\n    } else {\n      return numSteps * this.step + this.min;\n    }\n  },\n\n  _validateValue: function() {\n    var v = this._clampValue(this.value);\n    this.value = this.oldValue = isNaN(v) ? this.oldValue : v;\n    return this.value !== v;\n  },\n\n  _update: function() {\n    this._validateValue();\n    this._setRatio(this._calcRatio(this.value) * 100);\n  }\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {useShadow} from '@polymer/polymer/lib/utils/settings.js';\n\n// Contains all connected resizables that do not have a parent.\nvar ORPHANS = new Set();\n\n/**\n * `IronResizableBehavior` is a behavior that can be used in Polymer elements to\n * coordinate the flow of resize events between \"resizers\" (elements that\n *control the size or hidden state of their children) and \"resizables\" (elements\n *that need to be notified when they are resized or un-hidden by their parents\n *in order to take action on their new measurements).\n *\n * Elements that perform measurement should add the `IronResizableBehavior`\n *behavior to their element definition and listen for the `iron-resize` event on\n *themselves. This event will be fired when they become showing after having\n *been hidden, when they are resized explicitly by another resizable, or when\n *the window has been resized.\n *\n * Note, the `iron-resize` event is non-bubbling.\n *\n * @polymerBehavior\n * @demo demo/index.html\n **/\nexport const IronResizableBehavior = {\n  properties: {\n    /**\n     * The closest ancestor element that implements `IronResizableBehavior`.\n     */\n    _parentResizable: {\n      type: Object,\n      observer: '_parentResizableChanged',\n    },\n\n    /**\n     * True if this element is currently notifying its descendant elements of\n     * resize.\n     */\n    _notifyingDescendant: {\n      type: Boolean,\n      value: false,\n    }\n  },\n\n  listeners: {\n    'iron-request-resize-notifications': '_onIronRequestResizeNotifications'\n  },\n\n  created: function() {\n    // We don't really need property effects on these, and also we want them\n    // to be created before the `_parentResizable` observer fires:\n    this._interestedResizables = [];\n    this._boundNotifyResize = this.notifyResize.bind(this);\n    this._boundOnDescendantIronResize = this._onDescendantIronResize.bind(this);\n  },\n\n  attached: function() {\n    this._requestResizeNotifications();\n  },\n\n  detached: function() {\n    if (this._parentResizable) {\n      this._parentResizable.stopResizeNotificationsFor(this);\n    } else {\n      ORPHANS.delete(this);\n      window.removeEventListener('resize', this._boundNotifyResize);\n    }\n\n    this._parentResizable = null;\n  },\n\n  /**\n   * Can be called to manually notify a resizable and its descendant\n   * resizables of a resize change.\n   */\n  notifyResize: function() {\n    if (!this.isAttached) {\n      return;\n    }\n\n    this._interestedResizables.forEach(function(resizable) {\n      if (this.resizerShouldNotify(resizable)) {\n        this._notifyDescendant(resizable);\n      }\n    }, this);\n\n    this._fireResize();\n  },\n\n  /**\n   * Used to assign the closest resizable ancestor to this resizable\n   * if the ancestor detects a request for notifications.\n   */\n  assignParentResizable: function(parentResizable) {\n    if (this._parentResizable) {\n      this._parentResizable.stopResizeNotificationsFor(this);\n    }\n\n    this._parentResizable = parentResizable;\n\n    if (parentResizable &&\n        parentResizable._interestedResizables.indexOf(this) === -1) {\n      parentResizable._interestedResizables.push(this);\n      parentResizable._subscribeIronResize(this);\n    }\n  },\n\n  /**\n   * Used to remove a resizable descendant from the list of descendants\n   * that should be notified of a resize change.\n   */\n  stopResizeNotificationsFor: function(target) {\n    var index = this._interestedResizables.indexOf(target);\n\n    if (index > -1) {\n      this._interestedResizables.splice(index, 1);\n      this._unsubscribeIronResize(target);\n    }\n  },\n\n  /**\n   * Subscribe this element to listen to iron-resize events on the given target.\n   *\n   * Preferred over target.listen because the property renamer does not\n   * understand to rename when the target is not specifically \"this\"\n   *\n   * @param {!HTMLElement} target Element to listen to for iron-resize events.\n   */\n  _subscribeIronResize: function(target) {\n    target.addEventListener('iron-resize', this._boundOnDescendantIronResize);\n  },\n\n  /**\n   * Unsubscribe this element from listening to to iron-resize events on the\n   * given target.\n   *\n   * Preferred over target.unlisten because the property renamer does not\n   * understand to rename when the target is not specifically \"this\"\n   *\n   * @param {!HTMLElement} target Element to listen to for iron-resize events.\n   */\n  _unsubscribeIronResize: function(target) {\n    target.removeEventListener(\n        'iron-resize', this._boundOnDescendantIronResize);\n  },\n\n  /**\n   * This method can be overridden to filter nested elements that should or\n   * should not be notified by the current element. Return true if an element\n   * should be notified, or false if it should not be notified.\n   *\n   * @param {HTMLElement} element A candidate descendant element that\n   * implements `IronResizableBehavior`.\n   * @return {boolean} True if the `element` should be notified of resize.\n   */\n  resizerShouldNotify: function(element) {\n    return true;\n  },\n\n  _onDescendantIronResize: function(event) {\n    if (this._notifyingDescendant) {\n      event.stopPropagation();\n      return;\n    }\n\n    // no need to use this during shadow dom because of event retargeting\n    if (!useShadow) {\n      this._fireResize();\n    }\n  },\n\n  _fireResize: function() {\n    this.fire('iron-resize', null, {node: this, bubbles: false});\n  },\n\n  _onIronRequestResizeNotifications: function(event) {\n    var target = /** @type {!EventTarget} */ (dom(event).rootTarget);\n    if (target === this) {\n      return;\n    }\n\n    target.assignParentResizable(this);\n    this._notifyDescendant(target);\n\n    event.stopPropagation();\n  },\n\n  _parentResizableChanged: function(parentResizable) {\n    if (parentResizable) {\n      window.removeEventListener('resize', this._boundNotifyResize);\n    }\n  },\n\n  _notifyDescendant: function(descendant) {\n    // NOTE(cdata): In IE10, attached is fired on children first, so it's\n    // important not to notify them if the parent is not attached yet (or\n    // else they will get redundantly notified when the parent attaches).\n    if (!this.isAttached) {\n      return;\n    }\n\n    this._notifyingDescendant = true;\n    descendant.notifyResize();\n    this._notifyingDescendant = false;\n  },\n\n  _requestResizeNotifications: function() {\n    if (!this.isAttached) {\n      return;\n    }\n\n    if (document.readyState === 'loading') {\n      var _requestResizeNotifications =\n          this._requestResizeNotifications.bind(this);\n      document.addEventListener(\n          'readystatechange', function readystatechanged() {\n            document.removeEventListener('readystatechange', readystatechanged);\n            _requestResizeNotifications();\n          });\n    } else {\n      this._findParent();\n\n      if (!this._parentResizable) {\n        // If this resizable is an orphan, tell other orphans to try to find\n        // their parent again, in case it's this resizable.\n        ORPHANS.forEach(function(orphan) {\n          if (orphan !== this) {\n            orphan._findParent();\n          }\n        }, this);\n\n        window.addEventListener('resize', this._boundNotifyResize);\n        this.notifyResize();\n      } else {\n        // If this resizable has a parent, tell other child resizables of\n        // that parent to try finding their parent again, in case it's this\n        // resizable.\n        this._parentResizable._interestedResizables\n            .forEach(function(resizable) {\n              if (resizable !== this) {\n                resizable._findParent();\n              }\n            }, this);\n      }\n    }\n  },\n\n  _findParent: function() {\n    this.assignParentResizable(null);\n    this.fire(\n        'iron-request-resize-notifications',\n        null,\n        {node: this, bubbles: true, cancelable: true});\n\n    if (!this._parentResizable) {\n      ORPHANS.add(this);\n    } else {\n      ORPHANS.delete(this);\n    }\n  }\n};\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n * `Polymer.IronScrollTargetBehavior` allows an element to respond to scroll\n * events from a designated scroll target.\n *\n * Elements that consume this behavior can override the `_scrollHandler`\n * method to add logic on the scroll event.\n *\n * @demo demo/scrolling-region.html Scrolling Region\n * @demo demo/document.html Document Element\n * @polymerBehavior\n */\nexport const IronScrollTargetBehavior = {\n\n  properties: {\n\n    /**\n     * Specifies the element that will handle the scroll event\n     * on the behalf of the current element. This is typically a reference to an\n     *element, but there are a few more posibilities:\n     *\n     * ### Elements id\n     *\n     *```html\n     * <div id=\"scrollable-element\" style=\"overflow: auto;\">\n     *  <x-element scroll-target=\"scrollable-element\">\n     *    <!-- Content-->\n     *  </x-element>\n     * </div>\n     *```\n     * In this case, the `scrollTarget` will point to the outer div element.\n     *\n     * ### Document scrolling\n     *\n     * For document scrolling, you can use the reserved word `document`:\n     *\n     *```html\n     * <x-element scroll-target=\"document\">\n     *   <!-- Content -->\n     * </x-element>\n     *```\n     *\n     * ### Elements reference\n     *\n     *```js\n     * appHeader.scrollTarget = document.querySelector('#scrollable-element');\n     *```\n     *\n     * @type {HTMLElement}\n     * @default document\n     */\n    scrollTarget: {\n      type: HTMLElement,\n      value: function() {\n        return this._defaultScrollTarget;\n      }\n    }\n  },\n\n  observers: ['_scrollTargetChanged(scrollTarget, isAttached)'],\n\n  /**\n   * True if the event listener should be installed.\n   */\n  _shouldHaveListener: true,\n\n  _scrollTargetChanged: function(scrollTarget, isAttached) {\n    var eventTarget;\n\n    if (this._oldScrollTarget) {\n      this._toggleScrollListener(false, this._oldScrollTarget);\n      this._oldScrollTarget = null;\n    }\n    if (!isAttached) {\n      return;\n    }\n    // Support element id references\n    if (scrollTarget === 'document') {\n      this.scrollTarget = this._doc;\n\n    } else if (typeof scrollTarget === 'string') {\n      var domHost = this.domHost;\n\n      this.scrollTarget = domHost && domHost.$ ?\n          domHost.$[scrollTarget] :\n          dom(this.ownerDocument).querySelector('#' + scrollTarget);\n\n    } else if (this._isValidScrollTarget()) {\n      this._oldScrollTarget = scrollTarget;\n      this._toggleScrollListener(this._shouldHaveListener, scrollTarget);\n    }\n  },\n\n  /**\n   * Runs on every scroll event. Consumer of this behavior may override this\n   * method.\n   *\n   * @protected\n   */\n  _scrollHandler: function scrollHandler() {},\n\n  /**\n   * The default scroll target. Consumers of this behavior may want to customize\n   * the default scroll target.\n   *\n   * @type {Element}\n   */\n  get _defaultScrollTarget() {\n    return this._doc;\n  },\n\n  /**\n   * Shortcut for the document element\n   *\n   * @type {Element}\n   */\n  get _doc() {\n    return this.ownerDocument.documentElement;\n  },\n\n  /**\n   * Gets the number of pixels that the content of an element is scrolled\n   * upward.\n   *\n   * @type {number}\n   */\n  get _scrollTop() {\n    if (this._isValidScrollTarget()) {\n      return this.scrollTarget === this._doc ? window.pageYOffset :\n                                               this.scrollTarget.scrollTop;\n    }\n    return 0;\n  },\n\n  /**\n   * Gets the number of pixels that the content of an element is scrolled to the\n   * left.\n   *\n   * @type {number}\n   */\n  get _scrollLeft() {\n    if (this._isValidScrollTarget()) {\n      return this.scrollTarget === this._doc ? window.pageXOffset :\n                                               this.scrollTarget.scrollLeft;\n    }\n    return 0;\n  },\n\n  /**\n   * Sets the number of pixels that the content of an element is scrolled\n   * upward.\n   *\n   * @type {number}\n   */\n  set _scrollTop(top) {\n    if (this.scrollTarget === this._doc) {\n      window.scrollTo(window.pageXOffset, top);\n    } else if (this._isValidScrollTarget()) {\n      this.scrollTarget.scrollTop = top;\n    }\n  },\n\n  /**\n   * Sets the number of pixels that the content of an element is scrolled to the\n   * left.\n   *\n   * @type {number}\n   */\n  set _scrollLeft(left) {\n    if (this.scrollTarget === this._doc) {\n      window.scrollTo(left, window.pageYOffset);\n    } else if (this._isValidScrollTarget()) {\n      this.scrollTarget.scrollLeft = left;\n    }\n  },\n\n  /**\n   * Scrolls the content to a particular place.\n   *\n   * @method scroll\n   * @param {number|!{left: number, top: number}} leftOrOptions The left position or scroll options\n   * @param {number=} top The top position\n   * @return {void}\n   */\n  scroll: function(leftOrOptions, top) {\n    var left;\n\n    if (typeof leftOrOptions === 'object') {\n      left = leftOrOptions.left;\n      top = leftOrOptions.top;\n    } else {\n      left = leftOrOptions;\n    }\n\n    left = left || 0;\n    top = top || 0;\n    if (this.scrollTarget === this._doc) {\n      window.scrollTo(left, top);\n    } else if (this._isValidScrollTarget()) {\n      this.scrollTarget.scrollLeft = left;\n      this.scrollTarget.scrollTop = top;\n    }\n  },\n\n  /**\n   * Gets the width of the scroll target.\n   *\n   * @type {number}\n   */\n  get _scrollTargetWidth() {\n    if (this._isValidScrollTarget()) {\n      return this.scrollTarget === this._doc ? window.innerWidth :\n                                               this.scrollTarget.offsetWidth;\n    }\n    return 0;\n  },\n\n  /**\n   * Gets the height of the scroll target.\n   *\n   * @type {number}\n   */\n  get _scrollTargetHeight() {\n    if (this._isValidScrollTarget()) {\n      return this.scrollTarget === this._doc ? window.innerHeight :\n                                               this.scrollTarget.offsetHeight;\n    }\n    return 0;\n  },\n\n  /**\n   * Returns true if the scroll target is a valid HTMLElement.\n   *\n   * @return {boolean}\n   */\n  _isValidScrollTarget: function() {\n    return this.scrollTarget instanceof HTMLElement;\n  },\n\n  _toggleScrollListener: function(yes, scrollTarget) {\n    var eventTarget = scrollTarget === this._doc ? window : scrollTarget;\n    if (yes) {\n      if (!this._boundScrollHandler) {\n        this._boundScrollHandler = this._scrollHandler.bind(this);\n        eventTarget.addEventListener('scroll', this._boundScrollHandler);\n      }\n    } else {\n      if (this._boundScrollHandler) {\n        eventTarget.removeEventListener('scroll', this._boundScrollHandler);\n        this._boundScrollHandler = null;\n      }\n    }\n  },\n\n  /**\n   * Enables or disables the scroll event listener.\n   *\n   * @param {boolean} yes True to add the event, False to remove it.\n   */\n  toggleScrollListener: function(yes) {\n    this._shouldHaveListener = yes;\n    this._toggleScrollListener(yes, this.scrollTarget);\n  }\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nexport class IronSelection {\n  /**\n   * @param {!Function} selectCallback\n   * @suppress {missingProvide}\n   */\n  constructor(selectCallback) {\n    this.selection = [];\n    this.selectCallback = selectCallback;\n  }\n\n  /**\n   * Retrieves the selected item(s).\n   *\n   * @returns Returns the selected item(s). If the multi property is true,\n   * `get` will return an array, otherwise it will return\n   * the selected item or undefined if there is no selection.\n   */\n  get() {\n    return this.multi ? this.selection.slice() : this.selection[0];\n  }\n\n  /**\n   * Clears all the selection except the ones indicated.\n   *\n   * @param {Array} excludes items to be excluded.\n   */\n  clear(excludes) {\n    this.selection.slice().forEach(function(item) {\n      if (!excludes || excludes.indexOf(item) < 0) {\n        this.setItemSelected(item, false);\n      }\n    }, this);\n  }\n\n  /**\n   * Indicates if a given item is selected.\n   *\n   * @param {*} item The item whose selection state should be checked.\n   * @return {boolean} Returns true if `item` is selected.\n   */\n  isSelected(item) {\n    return this.selection.indexOf(item) >= 0;\n  }\n\n  /**\n   * Sets the selection state for a given item to either selected or deselected.\n   *\n   * @param {*} item The item to select.\n   * @param {boolean} isSelected True for selected, false for deselected.\n   */\n  setItemSelected(item, isSelected) {\n    if (item != null) {\n      if (isSelected !== this.isSelected(item)) {\n        // proceed to update selection only if requested state differs from\n        // current\n        if (isSelected) {\n          this.selection.push(item);\n        } else {\n          var i = this.selection.indexOf(item);\n          if (i >= 0) {\n            this.selection.splice(i, 1);\n          }\n        }\n        if (this.selectCallback) {\n          this.selectCallback(item, isSelected);\n        }\n      }\n    }\n  }\n\n  /**\n   * Sets the selection state for a given item. If the `multi` property\n   * is true, then the selected state of `item` will be toggled; otherwise\n   * the `item` will be selected.\n   *\n   * @param {*} item The item to select.\n   */\n  select(item) {\n    if (this.multi) {\n      this.toggle(item);\n    } else if (this.get() !== item) {\n      this.setItemSelected(this.get(), false);\n      this.setItemSelected(item, true);\n    }\n  }\n\n  /**\n   * Toggles the selection state for `item`.\n   *\n   * @param {*} item The item to toggle.\n   */\n  toggle(item) {\n    this.setItemSelected(item, !this.isSelected(item));\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {dashToCamelCase} from '@polymer/polymer/lib/utils/case-map.js';\n\nimport {IronSelection} from './iron-selection.js';\n\n/**\n * @polymerBehavior\n */\nexport const IronSelectableBehavior = {\n\n  /**\n   * Fired when iron-selector is activated (selected or deselected).\n   * It is fired before the selected items are changed.\n   * Cancel the event to abort selection.\n   *\n   * @event iron-activate\n   */\n\n  /**\n   * Fired when an item is selected\n   *\n   * @event iron-select\n   */\n\n  /**\n   * Fired when an item is deselected\n   *\n   * @event iron-deselect\n   */\n\n  /**\n   * Fired when the list of selectable items changes (e.g., items are\n   * added or removed). The detail of the event is a mutation record that\n   * describes what changed.\n   *\n   * @event iron-items-changed\n   */\n\n  properties: {\n\n    /**\n     * If you want to use an attribute value or property of an element for\n     * `selected` instead of the index, set this to the name of the attribute\n     * or property. Hyphenated values are converted to camel case when used to\n     * look up the property of a selectable element. Camel cased values are\n     * *not* converted to hyphenated values for attribute lookup. It's\n     * recommended that you provide the hyphenated form of the name so that\n     * selection works in both cases. (Use `attr-or-property-name` instead of\n     * `attrOrPropertyName`.)\n     */\n    attrForSelected: {type: String, value: null},\n\n    /**\n     * Gets or sets the selected element. The default is to use the index of the\n     * item.\n     * @type {string|number}\n     */\n    selected: {type: String, notify: true},\n\n    /**\n     * Returns the currently selected item.\n     *\n     * @type {?Object}\n     */\n    selectedItem: {type: Object, readOnly: true, notify: true},\n\n    /**\n     * The event that fires from items when they are selected. Selectable\n     * will listen for this event from items and update the selection state.\n     * Set to empty string to listen to no events.\n     */\n    activateEvent:\n        {type: String, value: 'tap', observer: '_activateEventChanged'},\n\n    /**\n     * This is a CSS selector string.  If this is set, only items that match the\n     * CSS selector are selectable.\n     */\n    selectable: String,\n\n    /**\n     * The class to set on elements when selected.\n     */\n    selectedClass: {type: String, value: 'iron-selected'},\n\n    /**\n     * The attribute to set on elements when selected.\n     */\n    selectedAttribute: {type: String, value: null},\n\n    /**\n     * Default fallback if the selection based on selected with\n     * `attrForSelected` is not found.\n     */\n    fallbackSelection: {type: String, value: null},\n\n    /**\n     * The list of items from which a selection can be made.\n     */\n    items: {\n      type: Array,\n      readOnly: true,\n      notify: true,\n      value: function() {\n        return [];\n      }\n    },\n\n    /**\n     * The set of excluded elements where the key is the `localName`\n     * of the element that will be ignored from the item list.\n     *\n     * @default {template: 1}\n     */\n    _excludedLocalNames: {\n      type: Object,\n      value: function() {\n        return {\n          'template': 1,\n          'dom-bind': 1,\n          'dom-if': 1,\n          'dom-repeat': 1,\n        };\n      }\n    }\n  },\n\n  observers: [\n    '_updateAttrForSelected(attrForSelected)',\n    '_updateSelected(selected)',\n    '_checkFallback(fallbackSelection)'\n  ],\n\n  created: function() {\n    this._bindFilterItem = this._filterItem.bind(this);\n    this._selection = new IronSelection(this._applySelection.bind(this));\n  },\n\n  attached: function() {\n    this._observer = this._observeItems(this);\n    this._addListener(this.activateEvent);\n  },\n\n  detached: function() {\n    if (this._observer) {\n      dom(this).unobserveNodes(this._observer);\n    }\n    this._removeListener(this.activateEvent);\n  },\n\n  /**\n   * Returns the index of the given item.\n   *\n   * @method indexOf\n   * @param {Object} item\n   * @returns Returns the index of the item\n   */\n  indexOf: function(item) {\n    return this.items ? this.items.indexOf(item) : -1;\n  },\n\n  /**\n   * Selects the given value.\n   *\n   * @method select\n   * @param {string|number} value the value to select.\n   */\n  select: function(value) {\n    this.selected = value;\n  },\n\n  /**\n   * Selects the previous item.\n   *\n   * @method selectPrevious\n   */\n  selectPrevious: function() {\n    var length = this.items.length;\n    var index = length - 1;\n    if (this.selected !== undefined) {\n      index = (Number(this._valueToIndex(this.selected)) - 1 + length) % length;\n    }\n    this.selected = this._indexToValue(index);\n  },\n\n  /**\n   * Selects the next item.\n   *\n   * @method selectNext\n   */\n  selectNext: function() {\n    var index = 0;\n    if (this.selected !== undefined) {\n      index =\n          (Number(this._valueToIndex(this.selected)) + 1) % this.items.length;\n    }\n    this.selected = this._indexToValue(index);\n  },\n\n  /**\n   * Selects the item at the given index.\n   *\n   * @method selectIndex\n   */\n  selectIndex: function(index) {\n    this.select(this._indexToValue(index));\n  },\n\n  /**\n   * Force a synchronous update of the `items` property.\n   *\n   * NOTE: Consider listening for the `iron-items-changed` event to respond to\n   * updates to the set of selectable items after updates to the DOM list and\n   * selection state have been made.\n   *\n   * WARNING: If you are using this method, you should probably consider an\n   * alternate approach. Synchronously querying for items is potentially\n   * slow for many use cases. The `items` property will update asynchronously\n   * on its own to reflect selectable items in the DOM.\n   */\n  forceSynchronousItemUpdate: function() {\n    if (this._observer && typeof this._observer.flush === 'function') {\n      // NOTE(bicknellr): `dom.flush` above is no longer sufficient to trigger\n      // `observeNodes` callbacks. Polymer 2.x returns an object from\n      // `observeNodes` with a `flush` that synchronously gives the callback any\n      // pending MutationRecords (retrieved with `takeRecords`). Any case where\n      // ShadyDOM flushes were expected to synchronously trigger item updates\n      // will now require calling `forceSynchronousItemUpdate`.\n      this._observer.flush();\n    } else {\n      this._updateItems();\n    }\n  },\n\n  // UNUSED, FOR API COMPATIBILITY\n  get _shouldUpdateSelection() {\n    return this.selected != null;\n  },\n\n  _checkFallback: function() {\n    this._updateSelected();\n  },\n\n  _addListener: function(eventName) {\n    this.listen(this, eventName, '_activateHandler');\n  },\n\n  _removeListener: function(eventName) {\n    this.unlisten(this, eventName, '_activateHandler');\n  },\n\n  _activateEventChanged: function(eventName, old) {\n    this._removeListener(old);\n    this._addListener(eventName);\n  },\n\n  _updateItems: function() {\n    var nodes = dom(this).queryDistributedElements(this.selectable || '*');\n    nodes = Array.prototype.filter.call(nodes, this._bindFilterItem);\n    this._setItems(nodes);\n  },\n\n  _updateAttrForSelected: function() {\n    if (this.selectedItem) {\n      this.selected = this._valueForItem(this.selectedItem);\n    }\n  },\n\n  _updateSelected: function() {\n    this._selectSelected(this.selected);\n  },\n\n  _selectSelected: function(selected) {\n    if (!this.items) {\n      return;\n    }\n\n    var item = this._valueToItem(this.selected);\n    if (item) {\n      this._selection.select(item);\n    } else {\n      this._selection.clear();\n    }\n    // Check for items, since this array is populated only when attached\n    // Since Number(0) is falsy, explicitly check for undefined\n    if (this.fallbackSelection && this.items.length &&\n        (this._selection.get() === undefined)) {\n      this.selected = this.fallbackSelection;\n    }\n  },\n\n  _filterItem: function(node) {\n    return !this._excludedLocalNames[node.localName];\n  },\n\n  _valueToItem: function(value) {\n    return (value == null) ? null : this.items[this._valueToIndex(value)];\n  },\n\n  _valueToIndex: function(value) {\n    if (this.attrForSelected) {\n      for (var i = 0, item; item = this.items[i]; i++) {\n        if (this._valueForItem(item) == value) {\n          return i;\n        }\n      }\n    } else {\n      return Number(value);\n    }\n  },\n\n  _indexToValue: function(index) {\n    if (this.attrForSelected) {\n      var item = this.items[index];\n      if (item) {\n        return this._valueForItem(item);\n      }\n    } else {\n      return index;\n    }\n  },\n\n  _valueForItem: function(item) {\n    if (!item) {\n      return null;\n    }\n    if (!this.attrForSelected) {\n      var i = this.indexOf(item);\n      return i === -1 ? null : i;\n    }\n    var propValue = item[dashToCamelCase(this.attrForSelected)];\n    return propValue != undefined ? propValue :\n                                    item.getAttribute(this.attrForSelected);\n  },\n\n  _applySelection: function(item, isSelected) {\n    if (this.selectedClass) {\n      this.toggleClass(this.selectedClass, isSelected, item);\n    }\n    if (this.selectedAttribute) {\n      this.toggleAttribute(this.selectedAttribute, isSelected, item);\n    }\n    this._selectionChange();\n    this.fire('iron-' + (isSelected ? 'select' : 'deselect'), {item: item});\n  },\n\n  _selectionChange: function() {\n    this._setSelectedItem(this._selection.get());\n  },\n\n  // observe items change under the given node.\n  _observeItems: function(node) {\n    return dom(node).observeNodes(function(mutation) {\n      this._updateItems();\n      this._updateSelected();\n\n      // Let other interested parties know about the change so that\n      // we don't have to recreate mutation observers everywhere.\n      this.fire(\n          'iron-items-changed', mutation, {bubbles: false, cancelable: false});\n    });\n  },\n\n  _activateHandler: function(e) {\n    var t = e.target;\n    var items = this.items;\n    while (t && t != this) {\n      var i = items.indexOf(t);\n      if (i >= 0) {\n        var value = this._indexToValue(i);\n        this._itemActivate(value, t);\n        return;\n      }\n      t = t.parentNode;\n    }\n  },\n\n  _itemActivate: function(value, item) {\n    if (!this.fire('iron-activate', {selected: value, item: item}, {\n               cancelable: true\n             })\n             .defaultPrevented) {\n      this.select(value);\n    }\n  }\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronMeta} from '@polymer/iron-meta/iron-meta.js';\n\n/**\n * Singleton IronMeta instance.\n */\nexport let IronValidatableBehaviorMeta = null;\n\n/**\n * `Use IronValidatableBehavior` to implement an element that validates\n * user input. Use the related `IronValidatorBehavior` to add custom\n * validation logic to an iron-input.\n *\n * By default, an `<iron-form>` element validates its fields when the user\n * presses the submit button. To validate a form imperatively, call the form's\n * `validate()` method, which in turn will call `validate()` on all its\n * children. By using `IronValidatableBehavior`, your custom element\n * will get a public `validate()`, which will return the validity of the\n * element, and a corresponding `invalid` attribute, which can be used for\n * styling.\n *\n * To implement the custom validation logic of your element, you must override\n * the protected `_getValidity()` method of this behaviour, rather than\n * `validate()`. See\n * [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)\n * for an example.\n *\n * ### Accessibility\n *\n * Changing the `invalid` property, either manually or by calling `validate()`\n * will update the `aria-invalid` attribute.\n *\n * @demo demo/index.html\n * @polymerBehavior\n */\nexport const IronValidatableBehavior = {\n\n  properties: {\n    /**\n     * Name of the validator to use.\n     */\n    validator: {type: String},\n\n    /**\n     * True if the last call to `validate` is invalid.\n     */\n    invalid: {\n      notify: true,\n      reflectToAttribute: true,\n      type: Boolean,\n      value: false,\n      observer: '_invalidChanged'\n    },\n  },\n\n  registered: function() {\n    IronValidatableBehaviorMeta = new IronMeta({type: 'validator'});\n  },\n\n  _invalidChanged: function() {\n    if (this.invalid) {\n      this.setAttribute('aria-invalid', 'true');\n    } else {\n      this.removeAttribute('aria-invalid');\n    }\n  },\n\n  /* Recompute this every time it's needed, because we don't know if the\n   * underlying IronValidatableBehaviorMeta has changed. */\n  get _validator() {\n    return IronValidatableBehaviorMeta &&\n        IronValidatableBehaviorMeta.byKey(this.validator);\n  },\n\n  /**\n   * @return {boolean} True if the validator `validator` exists.\n   */\n  hasValidator: function() {\n    return this._validator != null;\n  },\n\n  /**\n   * Returns true if the `value` is valid, and updates `invalid`. If you want\n   * your element to have custom validation logic, do not override this method;\n   * override `_getValidity(value)` instead.\n\n   * @param {Object} value Deprecated: The value to be validated. By default,\n   * it is passed to the validator's `validate()` function, if a validator is\n   set.\n   * If this argument is not specified, then the element's `value` property\n   * is used, if it exists.\n   * @return {boolean} True if `value` is valid.\n   */\n  validate: function(value) {\n    // If this is an element that also has a value property, and there was\n    // no explicit value argument passed, use the element's property instead.\n    if (value === undefined && this.value !== undefined)\n      this.invalid = !this._getValidity(this.value);\n    else\n      this.invalid = !this._getValidity(value);\n    return !this.invalid;\n  },\n\n  /**\n   * Returns true if `value` is valid.  By default, it is passed\n   * to the validator's `validate()` function, if a validator is set. You\n   * should override this method if you want to implement custom validity\n   * logic for your element.\n   *\n   * @param {Object} value The value to be validated.\n   * @return {boolean} True if `value` is valid.\n   */\n\n  _getValidity: function(value) {\n    if (this.hasValidator()) {\n      return this._validator.validate(value);\n    }\n    return true;\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n * `NeonAnimatableBehavior` is implemented by elements containing\n * animations for use with elements implementing\n * `NeonAnimationRunnerBehavior`.\n * @polymerBehavior\n */\nexport const NeonAnimatableBehavior = {\n\n  properties: {\n\n    /**\n     * Animation configuration. See README for more info.\n     */\n    animationConfig: {type: Object},\n\n    /**\n     * Convenience property for setting an 'entry' animation. Do not set\n     * `animationConfig.entry` manually if using this. The animated node is set\n     * to `this` if using this property.\n     */\n    entryAnimation: {\n      observer: '_entryAnimationChanged',\n      type: String,\n    },\n\n    /**\n     * Convenience property for setting an 'exit' animation. Do not set\n     * `animationConfig.exit` manually if using this. The animated node is set\n     * to `this` if using this property.\n     */\n    exitAnimation: {\n      observer: '_exitAnimationChanged',\n      type: String,\n    },\n\n  },\n\n  _entryAnimationChanged: function() {\n    this.animationConfig = this.animationConfig || {};\n    this.animationConfig['entry'] = [{name: this.entryAnimation, node: this}];\n  },\n\n  _exitAnimationChanged: function() {\n    this.animationConfig = this.animationConfig || {};\n    this.animationConfig['exit'] = [{name: this.exitAnimation, node: this}];\n  },\n\n  _copyProperties: function(config1, config2) {\n    // shallowly copy properties from config2 to config1\n    for (var property in config2) {\n      config1[property] = config2[property];\n    }\n  },\n\n  _cloneConfig: function(config) {\n    var clone = {isClone: true};\n    this._copyProperties(clone, config);\n    return clone;\n  },\n\n  _getAnimationConfigRecursive: function(type, map, allConfigs) {\n    if (!this.animationConfig) {\n      return;\n    }\n\n    if (this.animationConfig.value &&\n        typeof this.animationConfig.value === 'function') {\n      this._warn(this._logf(\n          'playAnimation',\n          'Please put \\'animationConfig\\' inside of your components \\'properties\\' object instead of outside of it.'));\n      return;\n    }\n\n    // type is optional\n    var thisConfig;\n    if (type) {\n      thisConfig = this.animationConfig[type];\n    } else {\n      thisConfig = this.animationConfig;\n    }\n\n    if (!Array.isArray(thisConfig)) {\n      thisConfig = [thisConfig];\n    }\n\n    // iterate animations and recurse to process configurations from child nodes\n    if (thisConfig) {\n      for (var config, index = 0; config = thisConfig[index]; index++) {\n        if (config.animatable) {\n          config.animatable._getAnimationConfigRecursive(\n              config.type || type, map, allConfigs);\n        } else {\n          if (config.id) {\n            var cachedConfig = map[config.id];\n            if (cachedConfig) {\n              // merge configurations with the same id, making a clone lazily\n              if (!cachedConfig.isClone) {\n                map[config.id] = this._cloneConfig(cachedConfig);\n                cachedConfig = map[config.id];\n              }\n              this._copyProperties(cachedConfig, config);\n            } else {\n              // put any configs with an id into a map\n              map[config.id] = config;\n            }\n          } else {\n            allConfigs.push(config);\n          }\n        }\n      }\n    }\n  },\n\n  /**\n   * An element implementing `NeonAnimationRunnerBehavior` calls this\n   * method to configure an animation with an optional type. Elements\n   * implementing `NeonAnimatableBehavior` should define the property\n   * `animationConfig`, which is either a configuration object or a map of\n   * animation type to array of configuration objects.\n   */\n  getAnimationConfig: function(type) {\n    var map = {};\n    var allConfigs = [];\n    this._getAnimationConfigRecursive(type, map, allConfigs);\n    // append the configurations saved in the map to the array\n    for (var key in map) {\n      allConfigs.push(map[key]);\n    }\n    return allConfigs;\n  }\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {NeonAnimatableBehavior} from './neon-animatable-behavior.js';\n\n/**\n * `NeonAnimationRunnerBehavior` adds a method to run animations.\n *\n * @polymerBehavior NeonAnimationRunnerBehavior\n */\nexport const NeonAnimationRunnerBehaviorImpl = {\n\n  _configureAnimations: function(configs) {\n    var results = [];\n    var resultsToPlay = [];\n\n    if (configs.length > 0) {\n      for (let config, index = 0; config = configs[index]; index++) {\n        let neonAnimation = document.createElement(config.name);\n        // is this element actually a neon animation?\n        if (neonAnimation.isNeonAnimation) {\n          let result = null;\n          // Closure compiler does not work well with a try / catch here.\n          // .configure needs to be explicitly defined\n          if (!neonAnimation.configure) {\n            /**\n             * @param {Object} config\n             * @return {AnimationEffectReadOnly}\n             */\n            neonAnimation.configure = function(config) {\n              return null;\n            }\n          }\n\n          result = neonAnimation.configure(config);\n          resultsToPlay.push({\n            result: result,\n            config: config,\n            neonAnimation: neonAnimation,\n          });\n        } else {\n          console.warn(this.is + ':', config.name, 'not found!');\n        }\n      }\n    }\n\n    for (var i = 0; i < resultsToPlay.length; i++) {\n      let result = resultsToPlay[i].result;\n      let config = resultsToPlay[i].config;\n      let neonAnimation = resultsToPlay[i].neonAnimation;\n      // configuration or play could fail if polyfills aren't loaded\n      try {\n        // Check if we have an Effect rather than an Animation\n        if (typeof result.cancel != 'function') {\n          result = document.timeline.play(result);\n        }\n      } catch (e) {\n        result = null;\n        console.warn('Couldnt play', '(', config.name, ').', e);\n      }\n\n      if (result) {\n        results.push({\n          neonAnimation: neonAnimation,\n          config: config,\n          animation: result,\n        });\n      }\n    }\n\n    return results;\n  },\n\n  _shouldComplete: function(activeEntries) {\n    var finished = true;\n    for (var i = 0; i < activeEntries.length; i++) {\n      if (activeEntries[i].animation.playState != 'finished') {\n        finished = false;\n        break;\n      }\n    }\n    return finished;\n  },\n\n  _complete: function(activeEntries) {\n    for (var i = 0; i < activeEntries.length; i++) {\n      activeEntries[i].neonAnimation.complete(activeEntries[i].config);\n    }\n    for (var i = 0; i < activeEntries.length; i++) {\n      activeEntries[i].animation.cancel();\n    }\n  },\n\n  /**\n   * Plays an animation with an optional `type`.\n   * @param {string=} type\n   * @param {!Object=} cookie\n   */\n  playAnimation: function(type, cookie) {\n    var configs = this.getAnimationConfig(type);\n    if (!configs) {\n      return;\n    }\n    this._active = this._active || {};\n    if (this._active[type]) {\n      this._complete(this._active[type]);\n      delete this._active[type];\n    }\n\n    var activeEntries = this._configureAnimations(configs);\n\n    if (activeEntries.length == 0) {\n      this.fire('neon-animation-finish', cookie, {bubbles: false});\n      return;\n    }\n\n    this._active[type] = activeEntries;\n\n    for (var i = 0; i < activeEntries.length; i++) {\n      activeEntries[i].animation.onfinish = function() {\n        if (this._shouldComplete(activeEntries)) {\n          this._complete(activeEntries);\n          delete this._active[type];\n          this.fire('neon-animation-finish', cookie, {bubbles: false});\n        }\n      }.bind(this);\n    }\n  },\n\n  /**\n   * Cancels the currently running animations.\n   */\n  cancelAnimation: function() {\n    for (var k in this._active) {\n      var entries = this._active[k]\n\n                    for (var j in entries) {\n        entries[j].animation.cancel();\n      }\n    }\n\n    this._active = {};\n  }\n};\n\n/** @polymerBehavior */\nexport const NeonAnimationRunnerBehavior =\n    [NeonAnimatableBehavior, NeonAnimationRunnerBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronButtonState, IronButtonStateImpl} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\n\nimport {PaperRippleBehavior} from './paper-ripple-behavior.js';\n\n/** @polymerBehavior PaperButtonBehavior */\nexport const PaperButtonBehaviorImpl = {\n  properties: {\n    /**\n     * The z-depth of this element, from 0-5. Setting to 0 will remove the\n     * shadow, and each increasing number greater than 0 will be \"deeper\"\n     * than the last.\n     *\n     * @attribute elevation\n     * @type number\n     * @default 1\n     */\n    elevation: {type: Number, reflectToAttribute: true, readOnly: true}\n  },\n\n  observers: [\n    '_calculateElevation(focused, disabled, active, pressed, receivedFocusFromKeyboard)',\n    '_computeKeyboardClass(receivedFocusFromKeyboard)'\n  ],\n\n  hostAttributes: {role: 'button', tabindex: '0', animated: true},\n\n  _calculateElevation: function() {\n    var e = 1;\n    if (this.disabled) {\n      e = 0;\n    } else if (this.active || this.pressed) {\n      e = 4;\n    } else if (this.receivedFocusFromKeyboard) {\n      e = 3;\n    }\n    this._setElevation(e);\n  },\n\n  _computeKeyboardClass: function(receivedFocusFromKeyboard) {\n    this.toggleClass('keyboard-focus', receivedFocusFromKeyboard);\n  },\n\n  /**\n   * In addition to `IronButtonState` behavior, when space key goes down,\n   * create a ripple down effect.\n   *\n   * @param {!KeyboardEvent} event .\n   */\n  _spaceKeyDownHandler: function(event) {\n    IronButtonStateImpl._spaceKeyDownHandler.call(this, event);\n    // Ensure that there is at most one ripple when the space key is held down.\n    if (this.hasRipple() && this.getRipple().ripples.length < 1) {\n      this._ripple.uiDownAction();\n    }\n  },\n\n  /**\n   * In addition to `IronButtonState` behavior, when space key goes up,\n   * create a ripple up effect.\n   *\n   * @param {!KeyboardEvent} event .\n   */\n  _spaceKeyUpHandler: function(event) {\n    IronButtonStateImpl._spaceKeyUpHandler.call(this, event);\n    if (this.hasRipple()) {\n      this._ripple.uiUpAction();\n    }\n  }\n};\n\n/** @polymerBehavior */\nexport const PaperButtonBehavior = [\n  IronButtonState,\n  IronControlState,\n  PaperRippleBehavior,\n  PaperButtonBehaviorImpl\n];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronFormElementBehavior} from '@polymer/iron-form-element-behavior/iron-form-element-behavior.js';\nimport {IronValidatableBehavior} from '@polymer/iron-validatable-behavior/iron-validatable-behavior.js';\n\n/**\n * Use `IronCheckedElementBehavior` to implement a custom element that has a\n * `checked` property, which can be used for validation if the element is also\n * `required`. Element instances implementing this behavior will also be\n * registered for use in an `iron-form` element.\n *\n * @demo demo/index.html\n * @polymerBehavior IronCheckedElementBehavior\n */\nexport const IronCheckedElementBehaviorImpl = {\n\n  properties: {\n    /**\n     * Fired when the checked state changes.\n     *\n     * @event iron-change\n     */\n\n    /**\n     * Gets or sets the state, `true` is checked and `false` is unchecked.\n     */\n    checked: {\n      type: Boolean,\n      value: false,\n      reflectToAttribute: true,\n      notify: true,\n      observer: '_checkedChanged'\n    },\n\n    /**\n     * If true, the button toggles the active state with each tap or press\n     * of the spacebar.\n     */\n    toggles: {type: Boolean, value: true, reflectToAttribute: true},\n\n    /* Overriden from IronFormElementBehavior */\n    value: {type: String, value: 'on', observer: '_valueChanged'}\n  },\n\n  observers: ['_requiredChanged(required)'],\n\n  created: function() {\n    // Used by `iron-form` to handle the case that an element with this behavior\n    // doesn't have a role of 'checkbox' or 'radio', but should still only be\n    // included when the form is serialized if `this.checked === true`.\n    this._hasIronCheckedElementBehavior = true;\n  },\n\n  /**\n   * Returns false if the element is required and not checked, and true\n   * otherwise.\n   * @param {*=} _value Ignored.\n   * @return {boolean} true if `required` is false or if `checked` is true.\n   */\n  _getValidity: function(_value) {\n    return this.disabled || !this.required || this.checked;\n  },\n\n  /**\n   * Update the aria-required label when `required` is changed.\n   */\n  _requiredChanged: function() {\n    if (this.required) {\n      this.setAttribute('aria-required', 'true');\n    } else {\n      this.removeAttribute('aria-required');\n    }\n  },\n\n  /**\n   * Fire `iron-changed` when the checked state changes.\n   */\n  _checkedChanged: function() {\n    this.active = this.checked;\n    this.fire('iron-change');\n  },\n\n  /**\n   * Reset value to 'on' if it is set to `undefined`.\n   */\n  _valueChanged: function() {\n    if (this.value === undefined || this.value === null) {\n      this.value = 'on';\n    }\n  }\n};\n\n/** @polymerBehavior */\nexport const IronCheckedElementBehavior = [\n  IronFormElementBehavior,\n  IronValidatableBehavior,\n  IronCheckedElementBehaviorImpl\n];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronCheckedElementBehavior, IronCheckedElementBehaviorImpl} from '@polymer/iron-checked-element-behavior/iron-checked-element-behavior.js';\n\nimport {PaperInkyFocusBehavior} from './paper-inky-focus-behavior.js';\nimport {PaperRippleBehavior} from './paper-ripple-behavior.js';\n\n/**\n * Use `PaperCheckedElementBehavior` to implement a custom element that has a\n * `checked` property similar to `IronCheckedElementBehavior` and is compatible\n * with having a ripple effect.\n * @polymerBehavior PaperCheckedElementBehavior\n */\nexport const PaperCheckedElementBehaviorImpl = {\n  /**\n   * Synchronizes the element's checked state with its ripple effect.\n   */\n  _checkedChanged: function() {\n    IronCheckedElementBehaviorImpl._checkedChanged.call(this);\n    if (this.hasRipple()) {\n      if (this.checked) {\n        this._ripple.setAttribute('checked', '');\n      } else {\n        this._ripple.removeAttribute('checked');\n      }\n    }\n  },\n\n  /**\n   * Synchronizes the element's `active` and `checked` state.\n   */\n  _buttonStateChanged: function() {\n    PaperRippleBehavior._buttonStateChanged.call(this);\n    if (this.disabled) {\n      return;\n    }\n    if (this.isAttached) {\n      this.checked = this.active;\n    }\n  }\n};\n\n/** @polymerBehavior */\nexport const PaperCheckedElementBehavior = [\n  PaperInkyFocusBehavior,\n  IronCheckedElementBehavior,\n  PaperCheckedElementBehaviorImpl\n];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronButtonState} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\n\nimport {PaperRippleBehavior} from './paper-ripple-behavior.js';\n\n/**\n * `PaperInkyFocusBehavior` implements a ripple when the element has keyboard\n * focus.\n *\n * @polymerBehavior PaperInkyFocusBehavior\n */\nexport const PaperInkyFocusBehaviorImpl = {\n  observers: ['_focusedChanged(receivedFocusFromKeyboard)'],\n\n  _focusedChanged: function(receivedFocusFromKeyboard) {\n    if (receivedFocusFromKeyboard) {\n      this.ensureRipple();\n    }\n    if (this.hasRipple()) {\n      this._ripple.holdDown = receivedFocusFromKeyboard;\n    }\n  },\n\n  _createRipple: function() {\n    var ripple = PaperRippleBehavior._createRipple();\n    ripple.id = 'ink';\n    ripple.setAttribute('center', '');\n    ripple.classList.add('circle');\n    return ripple;\n  }\n};\n\n/** @polymerBehavior */\nexport const PaperInkyFocusBehavior = [\n  IronButtonState,\n  IronControlState,\n  PaperRippleBehavior,\n  PaperInkyFocusBehaviorImpl\n];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-ripple/paper-ripple.js';\n\nimport {IronButtonStateImpl} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n * `PaperRippleBehavior` dynamically implements a ripple when the element has\n * focus via pointer or keyboard.\n *\n * NOTE: This behavior is intended to be used in conjunction with and after\n * `IronButtonState` and `IronControlState`.\n *\n * @polymerBehavior PaperRippleBehavior\n */\nexport const PaperRippleBehavior = {\n  properties: {\n    /**\n     * If true, the element will not produce a ripple effect when interacted\n     * with via the pointer.\n     */\n    noink: {type: Boolean, observer: '_noinkChanged'},\n\n    /**\n     * @type {Element|undefined}\n     */\n    _rippleContainer: {\n      type: Object,\n    }\n  },\n\n  /**\n   * Ensures a `<paper-ripple>` element is available when the element is\n   * focused.\n   */\n  _buttonStateChanged: function() {\n    if (this.focused) {\n      this.ensureRipple();\n    }\n  },\n\n  /**\n   * In addition to the functionality provided in `IronButtonState`, ensures\n   * a ripple effect is created when the element is in a `pressed` state.\n   */\n  _downHandler: function(event) {\n    IronButtonStateImpl._downHandler.call(this, event);\n    if (this.pressed) {\n      this.ensureRipple(event);\n    }\n  },\n\n  /**\n   * Ensures this element contains a ripple effect. For startup efficiency\n   * the ripple effect is dynamically on demand when needed.\n   * @param {!Event=} optTriggeringEvent (optional) event that triggered the\n   * ripple.\n   */\n  ensureRipple: function(optTriggeringEvent) {\n    if (!this.hasRipple()) {\n      this._ripple = this._createRipple();\n      this._ripple.noink = this.noink;\n      var rippleContainer = this._rippleContainer || this.root;\n      if (rippleContainer) {\n        dom(rippleContainer).appendChild(this._ripple);\n      }\n      if (optTriggeringEvent) {\n        // Check if the event happened inside of the ripple container\n        // Fall back to host instead of the root because distributed text\n        // nodes are not valid event targets\n        var domContainer = dom(this._rippleContainer || this);\n        var target = dom(optTriggeringEvent).rootTarget;\n        if (domContainer.deepContains(/** @type {Node} */ (target))) {\n          this._ripple.uiDownAction(optTriggeringEvent);\n        }\n      }\n    }\n  },\n\n  /**\n   * Returns the `<paper-ripple>` element used by this element to create\n   * ripple effects. The element's ripple is created on demand, when\n   * necessary, and calling this method will force the\n   * ripple to be created.\n   */\n  getRipple: function() {\n    this.ensureRipple();\n    return this._ripple;\n  },\n\n  /**\n   * Returns true if this element currently contains a ripple effect.\n   * @return {boolean}\n   */\n  hasRipple: function() {\n    return Boolean(this._ripple);\n  },\n\n  /**\n   * Create the element's ripple effect via creating a `<paper-ripple>`.\n   * Override this method to customize the ripple element.\n   * @return {!PaperRippleElement} Returns a `<paper-ripple>` element.\n   */\n  _createRipple: function() {\n    var element = /** @type {!PaperRippleElement} */ (\n        document.createElement('paper-ripple'));\n    return element;\n  },\n\n  _noinkChanged: function(noink) {\n    if (this.hasRipple()) {\n      this._ripple.noink = noink;\n    }\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/element-styles/paper-material-styles.js';\n\nimport {PaperButtonBehavior, PaperButtonBehaviorImpl} from '@polymer/paper-behaviors/paper-button-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/polymer-legacy.js';\n\nconst template = html`\n  <style include=\"paper-material-styles\">\n    /* Need to specify the same specificity as the styles imported from paper-material. */\n    :host {\n      @apply --layout-inline;\n      @apply --layout-center-center;\n      position: relative;\n      box-sizing: border-box;\n      min-width: 5.14em;\n      margin: 0 0.29em;\n      background: transparent;\n      -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n      -webkit-tap-highlight-color: transparent;\n      font: inherit;\n      text-transform: uppercase;\n      outline-width: 0;\n      border-radius: 3px;\n      -moz-user-select: none;\n      -ms-user-select: none;\n      -webkit-user-select: none;\n      user-select: none;\n      cursor: pointer;\n      z-index: 0;\n      padding: 0.7em 0.57em;\n\n      @apply --paper-font-common-base;\n      @apply --paper-button;\n    }\n\n    :host([elevation=\"1\"]) {\n      @apply --paper-material-elevation-1;\n    }\n\n    :host([elevation=\"2\"]) {\n      @apply --paper-material-elevation-2;\n    }\n\n    :host([elevation=\"3\"]) {\n      @apply --paper-material-elevation-3;\n    }\n\n    :host([elevation=\"4\"]) {\n      @apply --paper-material-elevation-4;\n    }\n\n    :host([elevation=\"5\"]) {\n      @apply --paper-material-elevation-5;\n    }\n\n    :host([hidden]) {\n      display: none !important;\n    }\n\n    :host([raised].keyboard-focus) {\n      font-weight: bold;\n      @apply --paper-button-raised-keyboard-focus;\n    }\n\n    :host(:not([raised]).keyboard-focus) {\n      font-weight: bold;\n      @apply --paper-button-flat-keyboard-focus;\n    }\n\n    :host([disabled]) {\n      background: none;\n      color: #a8a8a8;\n      cursor: auto;\n      pointer-events: none;\n\n      @apply --paper-button-disabled;\n    }\n\n    :host([disabled][raised]) {\n      background: #eaeaea;\n    }\n\n\n    :host([animated]) {\n      @apply --shadow-transition;\n    }\n\n    paper-ripple {\n      color: var(--paper-button-ink-color);\n    }\n  </style>\n\n  <slot></slot>`;\n\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design:\n[Buttons](https://www.google.com/design/spec/components/buttons.html)\n\n`paper-button` is a button. When the user touches the button, a ripple effect\nemanates from the point of contact. It may be flat or raised. A raised button is\nstyled with a shadow.\n\nExample:\n\n    <paper-button>Flat button</paper-button>\n    <paper-button raised>Raised button</paper-button>\n    <paper-button noink>No ripple effect</paper-button>\n    <paper-button toggles>Toggle-able button</paper-button>\n\nA button that has `toggles` true will remain `active` after being clicked (and\nwill have an `active` attribute set). For more information, see the\n`IronButtonState` behavior.\n\nYou may use custom DOM in the button body to create a variety of buttons. For\nexample, to create a button with an icon and some text:\n\n    <paper-button>\n      <iron-icon icon=\"favorite\"></iron-icon>\n      custom button content\n    </paper-button>\n\nTo use `paper-button` as a link, wrap it in an anchor tag. Since `paper-button`\nwill already receive focus, you may want to prevent the anchor tag from\nreceiving focus as well by setting its tabindex to -1.\n\n    <a href=\"https://www.polymer-project.org/\" tabindex=\"-1\">\n      <paper-button raised>Polymer Project</paper-button>\n    </a>\n\n### Styling\n\nStyle the button with CSS as you would a normal DOM element.\n\n    paper-button.fancy {\n      background: green;\n      color: yellow;\n    }\n\n    paper-button.fancy:hover {\n      background: lime;\n    }\n\n    paper-button[disabled],\n    paper-button[toggles][active] {\n      background: red;\n    }\n\nBy default, the ripple is the same color as the foreground at 25% opacity. You\nmay customize the color using the `--paper-button-ink-color` custom property.\n\nThe following custom properties and mixins are also available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-button-ink-color` | Background color of the ripple | `Based on the button's color`\n`--paper-button` | Mixin applied to the button | `{}`\n`--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}`\n`--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}`\n`--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}`\n\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-button',\n\n  behaviors: [PaperButtonBehavior],\n\n  properties: {\n    /**\n     * If true, the button should be styled with a shadow.\n     */\n    raised: {\n      type: Boolean,\n      reflectToAttribute: true,\n      value: false,\n      observer: '_calculateElevation',\n    }\n  },\n\n  _calculateElevation: function() {\n    if (!this.raised) {\n      this._setElevation(0);\n    } else {\n      PaperButtonBehaviorImpl._calculateElevation.apply(this);\n    }\n  }\n\n  /**\n  Fired when the animation finishes.\n  This is useful if you want to wait until\n  the ripple animation finishes to perform some action.\n\n  @event transitionend\n  Event param: {{node: Object}} detail Contains the animated node.\n  */\n});\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {PaperCheckedElementBehavior} from '@polymer/paper-behaviors/paper-checked-element-behavior.js';\nimport {PaperInkyFocusBehaviorImpl} from '@polymer/paper-behaviors/paper-inky-focus-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {afterNextRender} from '@polymer/polymer/lib/utils/render-status.js';\n\nconst template = html`<style>\n  :host {\n    display: inline-block;\n    white-space: nowrap;\n    cursor: pointer;\n    --calculated-paper-checkbox-size: var(--paper-checkbox-size, 18px);\n    /* -1px is a sentinel for the default and is replaced in \\`attached\\`. */\n    --calculated-paper-checkbox-ink-size: var(--paper-checkbox-ink-size, -1px);\n    @apply --paper-font-common-base;\n    line-height: 0;\n    -webkit-tap-highlight-color: transparent;\n  }\n\n  :host([hidden]) {\n    display: none !important;\n  }\n\n  :host(:focus) {\n    outline: none;\n  }\n\n  .hidden {\n    display: none;\n  }\n\n  #checkboxContainer {\n    display: inline-block;\n    position: relative;\n    width: var(--calculated-paper-checkbox-size);\n    height: var(--calculated-paper-checkbox-size);\n    min-width: var(--calculated-paper-checkbox-size);\n    margin: var(--paper-checkbox-margin, initial);\n    vertical-align: var(--paper-checkbox-vertical-align, middle);\n    background-color: var(--paper-checkbox-unchecked-background-color, transparent);\n  }\n\n  #ink {\n    position: absolute;\n\n    /* Center the ripple in the checkbox by negative offsetting it by\n     * (inkWidth - rippleWidth) / 2 */\n    top: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);\n    left: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);\n    width: var(--calculated-paper-checkbox-ink-size);\n    height: var(--calculated-paper-checkbox-ink-size);\n    color: var(--paper-checkbox-unchecked-ink-color, var(--primary-text-color));\n    opacity: 0.6;\n    pointer-events: none;\n  }\n\n  #ink:dir(rtl) {\n    right: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);\n    left: auto;\n  }\n\n  #ink[checked] {\n    color: var(--paper-checkbox-checked-ink-color, var(--primary-color));\n  }\n\n  #checkbox {\n    position: relative;\n    box-sizing: border-box;\n    height: 100%;\n    border: solid 2px;\n    border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));\n    border-radius: 2px;\n    pointer-events: none;\n    -webkit-transition: background-color 140ms, border-color 140ms;\n    transition: background-color 140ms, border-color 140ms;\n\n    -webkit-transition-duration: var(--paper-checkbox-animation-duration, 140ms);\n    transition-duration: var(--paper-checkbox-animation-duration, 140ms);\n  }\n\n  /* checkbox checked animations */\n  #checkbox.checked #checkmark {\n    -webkit-animation: checkmark-expand 140ms ease-out forwards;\n    animation: checkmark-expand 140ms ease-out forwards;\n\n    -webkit-animation-duration: var(--paper-checkbox-animation-duration, 140ms);\n    animation-duration: var(--paper-checkbox-animation-duration, 140ms);\n  }\n\n  @-webkit-keyframes checkmark-expand {\n    0% {\n      -webkit-transform: scale(0, 0) rotate(45deg);\n    }\n    100% {\n      -webkit-transform: scale(1, 1) rotate(45deg);\n    }\n  }\n\n  @keyframes checkmark-expand {\n    0% {\n      transform: scale(0, 0) rotate(45deg);\n    }\n    100% {\n      transform: scale(1, 1) rotate(45deg);\n    }\n  }\n\n  #checkbox.checked {\n    background-color: var(--paper-checkbox-checked-color, var(--primary-color));\n    border-color: var(--paper-checkbox-checked-color, var(--primary-color));\n  }\n\n  #checkmark {\n    position: absolute;\n    width: 36%;\n    height: 70%;\n    border-style: solid;\n    border-top: none;\n    border-left: none;\n    border-right-width: calc(2/15 * var(--calculated-paper-checkbox-size));\n    border-bottom-width: calc(2/15 * var(--calculated-paper-checkbox-size));\n    border-color: var(--paper-checkbox-checkmark-color, white);\n    -webkit-transform-origin: 97% 86%;\n    transform-origin: 97% 86%;\n    box-sizing: content-box; /* protect against page-level box-sizing */\n  }\n\n  #checkmark:dir(rtl) {\n    -webkit-transform-origin: 50% 14%;\n    transform-origin: 50% 14%;\n  }\n\n  /* label */\n  #checkboxLabel {\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n    padding-left: var(--paper-checkbox-label-spacing, 8px);\n    white-space: normal;\n    line-height: normal;\n    color: var(--paper-checkbox-label-color, var(--primary-text-color));\n    @apply --paper-checkbox-label;\n  }\n\n  :host([checked]) #checkboxLabel {\n    color: var(--paper-checkbox-label-checked-color, var(--paper-checkbox-label-color, var(--primary-text-color)));\n    @apply --paper-checkbox-label-checked;\n  }\n\n  #checkboxLabel:dir(rtl) {\n    padding-right: var(--paper-checkbox-label-spacing, 8px);\n    padding-left: 0;\n  }\n\n  #checkboxLabel[hidden] {\n    display: none;\n  }\n\n  /* disabled state */\n\n  :host([disabled]) #checkbox {\n    opacity: 0.5;\n    border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));\n  }\n\n  :host([disabled][checked]) #checkbox {\n    background-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));\n    opacity: 0.5;\n  }\n\n  :host([disabled]) #checkboxLabel  {\n    opacity: 0.65;\n  }\n\n  /* invalid state */\n  #checkbox.invalid:not(.checked) {\n    border-color: var(--paper-checkbox-error-color, var(--error-color));\n  }\n</style>\n\n<div id=\"checkboxContainer\">\n  <div id=\"checkbox\" class$=\"[[_computeCheckboxClass(checked, invalid)]]\">\n    <div id=\"checkmark\" class$=\"[[_computeCheckmarkClass(checked)]]\"></div>\n  </div>\n</div>\n\n<div id=\"checkboxLabel\"><slot></slot></div>`;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design:\n[Checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox)\n\n`paper-checkbox` is a button that can be either checked or unchecked. User can\ntap the checkbox to check or uncheck it. Usually you use checkboxes to allow\nuser to select multiple options from a set. If you have a single ON/OFF option,\navoid using a single checkbox and use `paper-toggle-button` instead.\n\nExample:\n\n    <paper-checkbox>label</paper-checkbox>\n\n    <paper-checkbox checked> label</paper-checkbox>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-checkbox-unchecked-background-color` | Checkbox background color when the input is not checked | `transparent`\n`--paper-checkbox-unchecked-color` | Checkbox border color when the input is not checked | `--primary-text-color`\n`--paper-checkbox-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`\n`--paper-checkbox-checked-color` | Checkbox color when the input is checked | `--primary-color`\n`--paper-checkbox-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`\n`--paper-checkbox-checkmark-color` | Checkmark color | `white`\n`--paper-checkbox-label-color` | Label color | `--primary-text-color`\n`--paper-checkbox-label-checked-color` | Label color when the input is checked | `--paper-checkbox-label-color`\n`--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px`\n`--paper-checkbox-label` | Mixin applied to the label | `{}`\n`--paper-checkbox-label-checked` | Mixin applied to the label when the input is checked | `{}`\n`--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color`\n`--paper-checkbox-size` | Size of the checkbox | `18px`\n`--paper-checkbox-ink-size` | Size of the ripple | `48px`\n`--paper-checkbox-margin` | Margin around the checkbox container | `initial`\n`--paper-checkbox-vertical-align` | Vertical alignment of the checkbox container | `middle`\n\nThis element applies the mixin `--paper-font-common-base` but does not import\n`paper-styles/typography.html`. In order to apply the `Roboto` font to this\nelement, make sure you've imported `paper-styles/typography.html`.\n\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-checkbox',\n\n  behaviors: [PaperCheckedElementBehavior],\n\n  /** @private */\n  hostAttributes: {role: 'checkbox', 'aria-checked': false, tabindex: 0},\n\n  properties: {\n    /**\n     * Fired when the checked state changes due to user interaction.\n     *\n     * @event change\n     */\n\n    /**\n     * Fired when the checked state changes.\n     *\n     * @event iron-change\n     */\n    ariaActiveAttribute: {type: String, value: 'aria-checked'}\n  },\n\n  attached: function() {\n    // Wait until styles have resolved to check for the default sentinel.\n    // See polymer#4009 for more details.\n    afterNextRender(this, function() {\n      var inkSize =\n          this.getComputedStyleValue('--calculated-paper-checkbox-ink-size')\n              .trim();\n      // If unset, compute and set the default `--paper-checkbox-ink-size`.\n      if (inkSize === '-1px') {\n        var checkboxSizeText =\n            this.getComputedStyleValue('--calculated-paper-checkbox-size')\n                .trim();\n\n        var units = 'px';\n        var unitsMatches = checkboxSizeText.match(/[A-Za-z]+$/);\n        if (unitsMatches !== null) {\n          units = unitsMatches[0];\n        }\n\n        var checkboxSize = parseFloat(checkboxSizeText);\n        var defaultInkSize = (8 / 3) * checkboxSize;\n\n        if (units === 'px') {\n          defaultInkSize = Math.floor(defaultInkSize);\n\n          // The checkbox and ripple need to have the same parity so that their\n          // centers align.\n          if (defaultInkSize % 2 !== checkboxSize % 2) {\n            defaultInkSize++;\n          }\n        }\n\n        this.updateStyles({\n          '--paper-checkbox-ink-size': defaultInkSize + units,\n        });\n      }\n    });\n  },\n\n  _computeCheckboxClass: function(checked, invalid) {\n    var className = '';\n    if (checked) {\n      className += 'checked ';\n    }\n    if (invalid) {\n      className += 'invalid';\n    }\n    return className;\n  },\n\n  _computeCheckmarkClass: function(checked) {\n    return checked ? '' : 'hidden';\n  },\n\n  // create ripple inside the checkboxContainer\n  _createRipple: function() {\n    this._rippleContainer = this.$.checkboxContainer;\n    return PaperInkyFocusBehaviorImpl._createRipple.call(this);\n  }\n\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronOverlayBehavior} from '@polymer/iron-overlay-behavior/iron-overlay-behavior.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n\n/**\n  Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to\n  implement a Material Design dialog.\n\n  For example, if `<paper-dialog-impl>` implements this behavior:\n\n      <paper-dialog-impl>\n          <h2>Header</h2>\n          <div>Dialog body</div>\n          <div class=\"buttons\">\n              <paper-button dialog-dismiss>Cancel</paper-button>\n              <paper-button dialog-confirm>Accept</paper-button>\n          </div>\n      </paper-dialog-impl>\n\n  `paper-dialog-shared-styles.html` provide styles for a header, content area,\n  and an action area for buttons. Use the `<h2>` tag for the header and the\n  `buttons` class for the action area. You can use the `paper-dialog-scrollable`\n  element (in its own repository) if you need a scrolling content area.\n\n  Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive\n  controls to close the dialog. If the user dismisses the dialog with\n  `dialog-confirm`, the `closingReason` will update to include `confirmed:\n  true`.\n\n  ### Accessibility\n\n  This element has `role=\"dialog\"` by default. Depending on the context, it may\n  be more appropriate to override this attribute with `role=\"alertdialog\"`.\n\n  If `modal` is set, the element will prevent the focus from exiting the\n  element. It will also ensure that focus remains in the dialog.\n\n  @hero hero.svg\n  @demo demo/index.html\n  @polymerBehavior PaperDialogBehavior\n */\nexport const PaperDialogBehaviorImpl = {\n\n  hostAttributes: {'role': 'dialog', 'tabindex': '-1'},\n\n  properties: {\n\n    /**\n     * If `modal` is true, this implies `no-cancel-on-outside-click`,\n     * `no-cancel-on-esc-key` and `with-backdrop`.\n     */\n    modal: {type: Boolean, value: false},\n\n    __readied: {type: Boolean, value: false}\n\n  },\n\n  observers: ['_modalChanged(modal, __readied)'],\n\n  listeners: {'tap': '_onDialogClick'},\n\n  /**\n   * @return {void}\n   */\n  ready: function() {\n    // Only now these properties can be read.\n    this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;\n    this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;\n    this.__prevWithBackdrop = this.withBackdrop;\n    this.__readied = true;\n  },\n\n  _modalChanged: function(modal, readied) {\n    // modal implies noCancelOnOutsideClick, noCancelOnEscKey and withBackdrop.\n    // We need to wait for the element to be ready before we can read the\n    // properties values.\n    if (!readied) {\n      return;\n    }\n\n    if (modal) {\n      this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;\n      this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;\n      this.__prevWithBackdrop = this.withBackdrop;\n      this.noCancelOnOutsideClick = true;\n      this.noCancelOnEscKey = true;\n      this.withBackdrop = true;\n    } else {\n      // If the value was changed to false, let it false.\n      this.noCancelOnOutsideClick =\n          this.noCancelOnOutsideClick && this.__prevNoCancelOnOutsideClick;\n      this.noCancelOnEscKey =\n          this.noCancelOnEscKey && this.__prevNoCancelOnEscKey;\n      this.withBackdrop = this.withBackdrop && this.__prevWithBackdrop;\n    }\n  },\n\n  _updateClosingReasonConfirmed: function(confirmed) {\n    this.closingReason = this.closingReason || {};\n    this.closingReason.confirmed = confirmed;\n  },\n\n  /**\n   * Will dismiss the dialog if user clicked on an element with dialog-dismiss\n   * or dialog-confirm attribute.\n   */\n  _onDialogClick: function(event) {\n    // Search for the element with dialog-confirm or dialog-dismiss,\n    // from the root target until this (excluded).\n    var path = dom(event).path;\n    for (var i = 0, l = path.indexOf(this); i < l; i++) {\n      var target = path[i];\n      if (target.hasAttribute &&\n          (target.hasAttribute('dialog-dismiss') ||\n           target.hasAttribute('dialog-confirm'))) {\n        this._updateClosingReasonConfirmed(\n            target.hasAttribute('dialog-confirm'));\n        this.close();\n        event.stopPropagation();\n        break;\n      }\n    }\n  }\n\n};\n\n/** @polymerBehavior */\nexport const PaperDialogBehavior =\n    [IronOverlayBehavior, PaperDialogBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {PaperDialogBehaviorImpl} from '@polymer/paper-dialog-behavior/paper-dialog-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design:\n[Dialogs](https://www.google.com/design/spec/components/dialogs.html)\n\n`paper-dialog-scrollable` implements a scrolling area used in a Material Design\ndialog. It shows a divider at the top and/or bottom indicating more content,\ndepending on scroll position. Use this together with elements implementing\n`Polymer.PaperDialogBehavior`.\n\n    <paper-dialog-impl>\n      <h2>Header</h2>\n      <paper-dialog-scrollable>\n        Lorem ipsum...\n      </paper-dialog-scrollable>\n      <div class=\"buttons\">\n        <paper-button>OK</paper-button>\n      </div>\n    </paper-dialog-impl>\n\nIt shows a top divider after scrolling if it is not the first child in its\nparent container, indicating there is more content above. It shows a bottom\ndivider if it is scrollable and it is not the last child in its parent\ncontainer, indicating there is more content below. The bottom divider is hidden\nif it is scrolled to the bottom.\n\nIf `paper-dialog-scrollable` is not a direct child of the element implementing\n`Polymer.PaperDialogBehavior`, remember to set the `dialogElement`:\n\n    <paper-dialog-impl id=\"myDialog\">\n      <h2>Header</h2>\n      <div class=\"my-content-wrapper\">\n        <h4>Sub-header</h4>\n        <paper-dialog-scrollable>\n          Lorem ipsum...\n        </paper-dialog-scrollable>\n      </div>\n      <div class=\"buttons\">\n        <paper-button>OK</paper-button>\n      </div>\n    </paper-dialog-impl>\n\n    <script>\n      var scrollable =\nPolymer.dom(myDialog).querySelector('paper-dialog-scrollable');\n      scrollable.dialogElement = myDialog;\n    </script>\n\n### Styling\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-dialog-scrollable` | Mixin for the scrollable content | {}\n\n@group Paper Elements\n@element paper-dialog-scrollable\n@demo demo/index.html\n@hero hero.svg\n*/\nPolymer({\n  _template: html`\n    <style>\n\n      :host {\n        display: block;\n        @apply --layout-relative;\n      }\n\n      :host(.is-scrolled:not(:first-child))::before {\n        content: '';\n        position: absolute;\n        top: 0;\n        left: 0;\n        right: 0;\n        height: 1px;\n        background: var(--divider-color);\n      }\n\n      :host(.can-scroll:not(.scrolled-to-bottom):not(:last-child))::after {\n        content: '';\n        position: absolute;\n        bottom: 0;\n        left: 0;\n        right: 0;\n        height: 1px;\n        background: var(--divider-color);\n      }\n\n      .scrollable {\n        padding: 0 24px;\n\n        @apply --layout-scroll;\n        @apply --paper-dialog-scrollable;\n      }\n\n      .fit {\n        @apply --layout-fit;\n      }\n    </style>\n\n    <div id=\"scrollable\" class=\"scrollable\" on-scroll=\"updateScrollState\">\n      <slot></slot>\n    </div>\n`,\n\n  is: 'paper-dialog-scrollable',\n\n  properties: {\n\n    /**\n     * The dialog element that implements `Polymer.PaperDialogBehavior`\n     * containing this element.\n     * @type {?Node}\n     */\n    dialogElement: {type: Object}\n\n  },\n\n  /**\n   * Returns the scrolling element.\n   */\n  get scrollTarget() {\n    return this.$.scrollable;\n  },\n\n  ready: function() {\n    this._ensureTarget();\n    this.classList.add('no-padding');\n  },\n\n  attached: function() {\n    this._ensureTarget();\n    requestAnimationFrame(this.updateScrollState.bind(this));\n  },\n\n  updateScrollState: function() {\n    this.toggleClass('is-scrolled', this.scrollTarget.scrollTop > 0);\n    this.toggleClass(\n        'can-scroll',\n        this.scrollTarget.offsetHeight < this.scrollTarget.scrollHeight);\n    this.toggleClass(\n        'scrolled-to-bottom',\n        this.scrollTarget.scrollTop + this.scrollTarget.offsetHeight >=\n            this.scrollTarget.scrollHeight);\n  },\n\n  _ensureTarget: function() {\n    // Read parentElement instead of parentNode in order to skip shadowRoots.\n    this.dialogElement = this.dialogElement || this.parentElement;\n    // Check if dialog implements paper-dialog-behavior. If not, fit\n    // scrollTarget to host.\n    if (this.dialogElement && this.dialogElement.behaviors &&\n        this.dialogElement.behaviors.indexOf(PaperDialogBehaviorImpl) >= 0) {\n      this.dialogElement.sizingTarget = this.scrollTarget;\n      this.scrollTarget.classList.remove('fit');\n    } else if (this.dialogElement) {\n      this.scrollTarget.classList.add('fit');\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n/*\n### Styling\n\nThe following custom properties and mixins are available for styling.\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-dialog-background-color` | Dialog background color | `--primary-background-color`\n`--paper-dialog-color` | Dialog foreground color | `--primary-text-color`\n`--paper-dialog` | Mixin applied to the dialog | `{}`\n`--paper-dialog-title` | Mixin applied to the title (`<h2>`) element | `{}`\n`--paper-dialog-button-color` | Button area foreground color | `--default-primary-color`\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/typography.js';\nimport '@polymer/paper-styles/shadow.js';\nconst $_documentContainer = document.createElement('template');\n$_documentContainer.setAttribute('style', 'display: none;');\n\n$_documentContainer.innerHTML = `<dom-module id=\"paper-dialog-shared-styles\">\n  <template>\n    <style>\n      :host {\n        display: block;\n        margin: 24px 40px;\n\n        background: var(--paper-dialog-background-color, var(--primary-background-color));\n        color: var(--paper-dialog-color, var(--primary-text-color));\n\n        @apply --paper-font-body1;\n        @apply --shadow-elevation-16dp;\n        @apply --paper-dialog;\n      }\n\n      :host > ::slotted(*) {\n        margin-top: 20px;\n        padding: 0 24px;\n      }\n\n      :host > ::slotted(.no-padding) {\n        padding: 0;\n      }\n\n      \n      :host > ::slotted(*:first-child) {\n        margin-top: 24px;\n      }\n\n      :host > ::slotted(*:last-child) {\n        margin-bottom: 24px;\n      }\n\n      /* In 1.x, this selector was \\`:host > ::content h2\\`. In 2.x <slot> allows\n      to select direct children only, which increases the weight of this\n      selector, so we have to re-define first-child/last-child margins below. */\n      :host > ::slotted(h2) {\n        position: relative;\n        margin: 0;\n\n        @apply --paper-font-title;\n        @apply --paper-dialog-title;\n      }\n\n      /* Apply mixin again, in case it sets margin-top. */\n      :host > ::slotted(h2:first-child) {\n        margin-top: 24px;\n        @apply --paper-dialog-title;\n      }\n\n      /* Apply mixin again, in case it sets margin-bottom. */\n      :host > ::slotted(h2:last-child) {\n        margin-bottom: 24px;\n        @apply --paper-dialog-title;\n      }\n\n      :host > ::slotted(.paper-dialog-buttons),\n      :host > ::slotted(.buttons) {\n        position: relative;\n        padding: 8px 8px 8px 24px;\n        margin: 0;\n\n        color: var(--paper-dialog-button-color, var(--primary-color));\n\n        @apply --layout-horizontal;\n        @apply --layout-end-justified;\n      }\n    </style>\n  </template>\n</dom-module>`;\n\ndocument.head.appendChild($_documentContainer.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-dialog-behavior/paper-dialog-shared-styles.js';\n\nimport {NeonAnimationRunnerBehavior} from '@polymer/neon-animation/neon-animation-runner-behavior.js';\nimport {PaperDialogBehavior} from '@polymer/paper-dialog-behavior/paper-dialog-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design:\n[Dialogs](https://www.google.com/design/spec/components/dialogs.html)\n\n`<paper-dialog>` is a dialog with Material Design styling and optional\nanimations when it is opened or closed. It provides styles for a header, content\narea, and an action area for buttons. You can use the\n`<paper-dialog-scrollable>` element (in its own repository) if you need a\nscrolling content area. To autofocus a specific child element after opening the\ndialog, give it the `autofocus` attribute. See `Polymer.PaperDialogBehavior` and\n`Polymer.IronOverlayBehavior` for specifics.\n\nFor example, the following code implements a dialog with a header, scrolling\ncontent area and buttons. Focus will be given to the `dialog-confirm` button\nwhen the dialog is opened.\n\n    <paper-dialog>\n      <h2>Header</h2>\n      <paper-dialog-scrollable>\n        Lorem ipsum...\n      </paper-dialog-scrollable>\n      <div class=\"buttons\">\n        <paper-button dialog-dismiss>Cancel</paper-button>\n        <paper-button dialog-confirm autofocus>Accept</paper-button>\n      </div>\n    </paper-dialog>\n\n### Styling\n\nSee the docs for `Polymer.PaperDialogBehavior` for the custom properties\navailable for styling this element.\n\n### Animations\n\nSet the `entry-animation` and/or `exit-animation` attributes to add an animation\nwhen the dialog is opened or closed. See the documentation in\n[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation)\nfor more info.\n\nFor example:\n\n    <script type=\"module\">\n      import '@polymer/neon-animation/animations/fade-out-animation.js';\n      import '@polymer/neon-animation/animations/scale-up-animation.js';\n    </script>\n\n    <paper-dialog entry-animation=\"scale-up-animation\"\n                  exit-animation=\"fade-out-animation\">\n      <h2>Header</h2>\n      <div>Dialog body</div>\n    </paper-dialog>\n\n### Accessibility\n\nSee the docs for `Polymer.PaperDialogBehavior` for accessibility features\nimplemented by this element.\n\n@group Paper Elements\n@element paper-dialog\n@hero hero.svg\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style include=\"paper-dialog-shared-styles\"></style>\n    <slot></slot>\n`,\n\n  is: 'paper-dialog',\n  behaviors: [PaperDialogBehavior, NeonAnimationRunnerBehavior],\n  listeners: {'neon-animation-finish': '_onNeonAnimationFinish'},\n\n  _renderOpened: function() {\n    this.cancelAnimation();\n    this.playAnimation('entry');\n  },\n\n  _renderClosed: function() {\n    this.cancelAnimation();\n    this.playAnimation('exit');\n  },\n\n  _onNeonAnimationFinish: function() {\n    if (this.opened) {\n      this._finishRenderOpened();\n    } else {\n      this._finishRenderClosed();\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-iconset-svg/iron-iconset-svg.js';\nconst $_documentContainer = document.createElement('template');\n$_documentContainer.setAttribute('style', 'display: none;');\n\n$_documentContainer.innerHTML =\n    `<iron-iconset-svg name=\"paper-dropdown-menu\" size=\"24\">\n<svg><defs>\n<g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"></path></g>\n</defs></svg>\n</iron-iconset-svg>`;\n\ndocument.head.appendChild($_documentContainer.content);\n","/**\n@license\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/paper-styles/default-theme.js';\nconst $_documentContainer = document.createElement('template');\n$_documentContainer.setAttribute('style', 'display: none;');\n\n$_documentContainer.innerHTML =\n    `<dom-module id=\"paper-dropdown-menu-shared-styles\">\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        position: relative;\n        text-align: left;\n\n        /* NOTE(cdata): Both values are needed, since some phones require the\n         * value to be \\`transparent\\`.\n         */\n        -webkit-tap-highlight-color: rgba(0,0,0,0);\n        -webkit-tap-highlight-color: transparent;\n\n        --paper-input-container-input: {\n          overflow: hidden;\n          white-space: nowrap;\n          text-overflow: ellipsis;\n          max-width: 100%;\n          box-sizing: border-box;\n          cursor: pointer;\n        };\n\n        @apply --paper-dropdown-menu;\n      }\n\n      /* paper-dropdown-menu and paper-dropdown-menu-light both delegate focus\n       * to other internal elements which manage focus styling. */\n      :host(:focus) {\n        outline: none;\n      }\n\n      :host(:dir(rtl)) {\n        text-align: right;\n\n        @apply(--paper-dropdown-menu);\n      }\n\n      :host([disabled]) {\n        @apply --paper-dropdown-menu-disabled;\n      }\n\n      :host([noink]) paper-ripple {\n        display: none;\n      }\n\n      :host([no-label-float]) paper-ripple {\n        top: 8px;\n      }\n\n      paper-ripple {\n        top: 12px;\n        left: 0px;\n        bottom: 8px;\n        right: 0px;\n\n        @apply --paper-dropdown-menu-ripple;\n      }\n\n      paper-menu-button {\n        display: block;\n        padding: 0;\n\n        @apply --paper-dropdown-menu-button;\n      }\n\n      paper-input {\n        @apply --paper-dropdown-menu-input;\n      }\n\n      iron-icon {\n        color: var(--disabled-text-color);\n\n        @apply --paper-dropdown-menu-icon;\n      }\n    </style>\n  </template>\n</dom-module>`;\n\ndocument.head.appendChild($_documentContainer.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport '@polymer/iron-icon/iron-icon.js';\nimport '@polymer/paper-input/paper-input.js';\nimport '@polymer/paper-menu-button/paper-menu-button.js';\nimport '@polymer/paper-ripple/paper-ripple.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport './paper-dropdown-menu-icons.js';\nimport './paper-dropdown-menu-shared-styles.js';\n\nimport {IronButtonState} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {IronFormElementBehavior} from '@polymer/iron-form-element-behavior/iron-form-element-behavior.js';\nimport {IronValidatableBehavior} from '@polymer/iron-validatable-behavior/iron-validatable-behavior.js';\nimport {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport * as gestures from '@polymer/polymer/lib/utils/gestures.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {wrap} from '@polymer/polymer/lib/utils/wrap.js';\n\n// LegacyElementMixin dedupes and this is the base class for elements created\n// with the `Polymer` function, so this is only a cache lookup.\n// https://github.com/Polymer/polymer/blob/640bc80ac7177b761d46b2fa9c455c318f2b85c6/lib/legacy/class.js#L533-L534\nconst LegacyPolymerElementBase = LegacyElementMixin(HTMLElement);\n\n/**\nMaterial design: [Dropdown\nmenus](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)\n\n`paper-dropdown-menu` is similar to a native browser select element.\n`paper-dropdown-menu` works with selectable content. The currently selected\nitem is displayed in the control. If no item is selected, the `label` is\ndisplayed instead.\n\nExample:\n\n    <paper-dropdown-menu label=\"Your favourite pastry\">\n      <paper-listbox slot=\"dropdown-content\">\n        <paper-item>Croissant</paper-item>\n        <paper-item>Donut</paper-item>\n        <paper-item>Financier</paper-item>\n        <paper-item>Madeleine</paper-item>\n      </paper-listbox>\n    </paper-dropdown-menu>\n\nThis example renders a dropdown menu with 4 options.\n\nThe child element with the slot `dropdown-content` is used as the dropdown\nmenu. This can be a [`paper-listbox`](paper-listbox), or any other or\nelement that acts like an [`iron-selector`](iron-selector).\n\nSpecifically, the menu child must fire an\n[`iron-select`](iron-selector#event-iron-select) event when one of its\nchildren is selected, and an\n[`iron-deselect`](iron-selector#event-iron-deselect) event when a child is\ndeselected. The selected or deselected item must be passed as the event's\n`detail.item` property.\n\nApplications can listen for the `iron-select` and `iron-deselect` events\nto react when options are selected and deselected.\n\n### Styling\n\nThe following custom properties and mixins are also available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-dropdown-menu` | A mixin that is applied to the element host | `{}`\n`--paper-dropdown-menu-disabled` | A mixin that is applied to the element host when disabled | `{}`\n`--paper-dropdown-menu-ripple` | A mixin that is applied to the internal ripple | `{}`\n`--paper-dropdown-menu-button` | A mixin that is applied to the internal menu button | `{}`\n`--paper-dropdown-menu-input` | A mixin that is applied to the internal paper input | `{}`\n`--paper-dropdown-menu-icon` | A mixin that is applied to the internal icon | `{}`\n\nYou can also use any of the `paper-input-container` and `paper-menu-button`\nstyle mixins and custom properties to style the internal input and menu button\nrespectively.\n\n@element paper-dropdown-menu\n@demo demo/index.html\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style include=\"paper-dropdown-menu-shared-styles\"></style>\n\n    <paper-menu-button id=\"menuButton\" vertical-align=\"[[verticalAlign]]\" horizontal-align=\"[[horizontalAlign]]\" dynamic-align=\"[[dynamicAlign]]\" vertical-offset=\"[[_computeMenuVerticalOffset(noLabelFloat, verticalOffset)]]\" disabled=\"[[disabled]]\" no-animations=\"[[noAnimations]]\" on-iron-select=\"_onIronSelect\" on-iron-deselect=\"_onIronDeselect\" opened=\"{{opened}}\" close-on-activate allow-outside-scroll=\"[[allowOutsideScroll]]\" restore-focus-on-close=\"[[restoreFocusOnClose]]\" expand-sizing-target-for-scrollbars=\"[[expandSizingTargetForScrollbars]]\">\n      <!-- support hybrid mode: user might be using paper-menu-button 1.x which distributes via <content> -->\n      <div class=\"dropdown-trigger\" slot=\"dropdown-trigger\">\n        <paper-ripple></paper-ripple>\n        <!-- paper-input has type=\"text\" for a11y, do not remove -->\n        <paper-input id=\"input\" type=\"text\" invalid=\"[[invalid]]\" readonly disabled=\"[[disabled]]\" value=\"[[value]]\" placeholder=\"[[placeholder]]\" error-message=\"[[errorMessage]]\" always-float-label=\"[[alwaysFloatLabel]]\" no-label-float=\"[[noLabelFloat]]\" label=\"[[label]]\" input-role=\"button\" input-aria-haspopup=\"listbox\" autocomplete=\"off\">\n          <!-- support hybrid mode: user might be using paper-input 1.x which distributes via <content> -->\n          <iron-icon icon=\"paper-dropdown-menu:arrow-drop-down\" suffix slot=\"suffix\"></iron-icon>\n        </paper-input>\n      </div>\n      <slot id=\"content\" name=\"dropdown-content\" slot=\"dropdown-content\"></slot>\n    </paper-menu-button>\n`,\n\n  is: 'paper-dropdown-menu',\n\n  behaviors: [\n    IronButtonState,\n    IronControlState,\n    IronFormElementBehavior,\n    IronValidatableBehavior\n  ],\n\n  properties: {\n    /**\n     * The derived \"label\" of the currently selected item. This value\n     * is the `label` property on the selected item if set, or else the\n     * trimmed text content of the selected item.\n     */\n    selectedItemLabel: {type: String, notify: true, readOnly: true},\n\n    /**\n     * The last selected item. An item is selected if the dropdown menu has\n     * a child with slot `dropdown-content`, and that child triggers an\n     * `iron-select` event with the selected `item` in the `detail`.\n     *\n     * @type {?Object}\n     */\n    selectedItem: {type: Object, notify: true, readOnly: true},\n\n    /**\n     * The value for this element that will be used when submitting in\n     * a form. It reflects the value of `selectedItemLabel`. If set directly,\n     * it will not update the `selectedItemLabel` value.\n     */\n    value: {\n      type: String,\n      notify: true,\n    },\n\n    /**\n     * The label for the dropdown.\n     */\n    label: {type: String},\n\n    /**\n     * The placeholder for the dropdown.\n     */\n    placeholder: {type: String},\n\n    /**\n     * The error message to display when invalid.\n     */\n    errorMessage: {type: String},\n\n    /**\n     * True if the dropdown is open. Otherwise, false.\n     */\n    opened:\n        {type: Boolean, notify: true, value: false, observer: '_openedChanged'},\n\n    /**\n     * By default, the dropdown will constrain scrolling on the page\n     * to itself when opened.\n     * Set to true in order to prevent scroll from being constrained\n     * to the dropdown when it opens.\n     */\n    allowOutsideScroll: {type: Boolean, value: false},\n\n    /**\n     * Set to true to disable the floating label. Bind this to the\n     * `<paper-input-container>`'s `noLabelFloat` property.\n     */\n    noLabelFloat: {type: Boolean, value: false, reflectToAttribute: true},\n\n    /**\n     * Set to true to always float the label. Bind this to the\n     * `<paper-input-container>`'s `alwaysFloatLabel` property.\n     */\n    alwaysFloatLabel: {type: Boolean, value: false},\n\n    /**\n     * Set to true to disable animations when opening and closing the\n     * dropdown.\n     */\n    noAnimations: {type: Boolean, value: false},\n\n    /**\n     * The orientation against which to align the menu dropdown\n     * horizontally relative to the dropdown trigger.\n     */\n    horizontalAlign: {type: String, value: 'right'},\n\n    /**\n     * The orientation against which to align the menu dropdown\n     * vertically relative to the dropdown trigger.\n     */\n    verticalAlign: {type: String, value: 'top'},\n\n    /**\n     * Overrides the vertical offset computed in\n     * _computeMenuVerticalOffset.\n     */\n    verticalOffset: Number,\n\n    /**\n     * If true, the `horizontalAlign` and `verticalAlign` properties will\n     * be considered preferences instead of strict requirements when\n     * positioning the dropdown and may be changed if doing so reduces\n     * the area of the dropdown falling outside of `fitInto`.\n     */\n    dynamicAlign: {type: Boolean},\n\n    /**\n     * Whether focus should be restored to the dropdown when the menu closes.\n     */\n    restoreFocusOnClose: {type: Boolean, value: true},\n\n    /**\n     * If true and scrollbars are added to the dropdown after it is positioned,\n     * the size of the added scrollbars will be added to its `maxWidth` and\n     * `maxHeight`.\n     */\n    expandSizingTargetForScrollbars: {type: Boolean, value: false},\n  },\n\n  listeners: {'tap': '_onTap'},\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {'up down': 'open', 'esc': 'close'},\n\n  observers: ['_selectedItemChanged(selectedItem)'],\n\n  /**\n   * Override `_attachDom` so that we can pass `delegatesFocus`. The overridden\n   * implementation of `_attachDom` specifically skips the steps performed here\n   * if the node already hosts a shadow root:\n   * https://github.com/Polymer/polymer/blob/640bc80ac7177b761d46b2fa9c455c318f2b85c6/lib/mixins/element-mixin.js#L691-L694\n   * @override\n   */\n  _attachDom(dom) {\n    const wrappedThis = wrap(this);\n    wrappedThis.attachShadow({\n      mode: 'open',\n      delegatesFocus: true,\n      shadyUpgradeFragment: dom,\n    });\n    wrappedThis.shadowRoot.appendChild(dom);\n    return LegacyPolymerElementBase.prototype._attachDom.call(this, dom);\n  },\n\n  /** @override */\n  focus() {\n    // When using Shady DOM and in browsers that don't support\n    // `delegatesFocus`, attempting to focus this element with the browser's\n    // native `HTMLElement#focus` will cause focus to be lost because this\n    // element isn't focusable in those situations. To work around this, the\n    // element in the shadow root that this element intends to delegate focus\n    // to is manually focused instead.\n    this.$.input._focusableElement.focus();\n  },\n\n  /** @override */\n  attached: function() {\n    // NOTE(cdata): Due to timing, a preselected value in a `IronSelectable`\n    // child will cause an `iron-select` event to fire while the element is\n    // still in a `DocumentFragment`. This has the effect of causing\n    // handlers not to fire. So, we double check this value on attached:\n    var contentElement = this.contentElement;\n    if (contentElement && contentElement.selectedItem) {\n      this._setSelectedItem(contentElement.selectedItem);\n    }\n  },\n\n  /**\n   * The content element that is contained by the dropdown menu, if any.\n   */\n  get contentElement() {\n    // Polymer 2.x returns slot.assignedNodes which can contain text nodes.\n    var nodes = dom(this.$.content).getDistributedNodes();\n    for (var i = 0, l = nodes.length; i < l; i++) {\n      if (nodes[i].nodeType === Node.ELEMENT_NODE) {\n        return nodes[i];\n      }\n    }\n  },\n\n  /**\n   * Show the dropdown content.\n   */\n  open: function() {\n    this.$.menuButton.open();\n  },\n\n  /**\n   * Hide the dropdown content.\n   */\n  close: function() {\n    this.$.menuButton.close();\n  },\n\n  /**\n   * A handler that is called when `iron-select` is fired.\n   *\n   * @param {CustomEvent} event An `iron-select` event.\n   */\n  _onIronSelect: function(event) {\n    this._setSelectedItem(event.detail.item);\n  },\n\n  /**\n   * A handler that is called when `iron-deselect` is fired.\n   *\n   * @param {CustomEvent} event An `iron-deselect` event.\n   */\n  _onIronDeselect: function(event) {\n    this._setSelectedItem(null);\n  },\n\n  /**\n   * A handler that is called when the dropdown is tapped.\n   *\n   * @param {CustomEvent} event A tap event.\n   */\n  _onTap: function(event) {\n    if (gestures.findOriginalTarget(event) === this) {\n      this.open();\n    }\n  },\n\n  /**\n   * Compute the label for the dropdown given a selected item.\n   *\n   * @param {Element} selectedItem A selected Element item, with an\n   * optional `label` property.\n   */\n  _selectedItemChanged: function(selectedItem) {\n    var value = '';\n    if (!selectedItem) {\n      value = '';\n    } else {\n      value = selectedItem.label || selectedItem.getAttribute('label') ||\n          selectedItem.textContent.trim();\n    }\n\n    this.value = value;\n    this._setSelectedItemLabel(value);\n  },\n\n  /**\n   * Compute the vertical offset of the menu based on the value of\n   * `noLabelFloat`.\n   *\n   * @param {boolean} noLabelFloat True if the label should not float\n   * @param {number=} opt_verticalOffset Optional offset from the user\n   * above the input, otherwise false.\n   */\n  _computeMenuVerticalOffset: function(noLabelFloat, opt_verticalOffset) {\n    // Override offset if it's passed from the user.\n    if (opt_verticalOffset) {\n      return opt_verticalOffset;\n    }\n\n    // NOTE(cdata): These numbers are somewhat magical because they are\n    // derived from the metrics of elements internal to `paper-input`'s\n    // template. The metrics will change depending on whether or not the\n    // input has a floating label.\n    return noLabelFloat ? -4 : 8;\n  },\n\n  /**\n   * Returns false if the element is required and does not have a selection,\n   * and true otherwise.\n   * @param {*=} _value Ignored.\n   * @return {boolean} true if `required` is false, or if `required` is true\n   * and the element has a valid selection.\n   */\n  _getValidity: function(_value) {\n    return this.disabled || !this.required || (this.required && !!this.value);\n  },\n\n  _openedChanged: function() {\n    var openState = this.opened ? 'true' : 'false';\n    var e = this.contentElement;\n    if (e) {\n      e.setAttribute('aria-expanded', openState);\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/iron-icon/iron-icon.js';\nimport '@polymer/paper-styles/element-styles/paper-material-styles.js';\nimport '@polymer/paper-styles/color.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {PaperButtonBehavior} from '@polymer/paper-behaviors/paper-button-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nconst template = html`\n  <style include=\"paper-material-styles\">\n    :host {\n      @apply --layout-vertical;\n      @apply --layout-center-center;\n\n      background: var(--paper-fab-background, var(--accent-color));\n      border-radius: 50%;\n      box-sizing: border-box;\n      color: var(--text-primary-color);\n      cursor: pointer;\n      height: 56px;\n      min-width: 0;\n      outline: none;\n      padding: 16px;\n      position: relative;\n      -moz-user-select: none;\n      -ms-user-select: none;\n      -webkit-user-select: none;\n      user-select: none;\n      width: 56px;\n      z-index: 0;\n\n      /* NOTE: Both values are needed, since some phones require the value \\`transparent\\`. */\n      -webkit-tap-highlight-color: rgba(0,0,0,0);\n      -webkit-tap-highlight-color: transparent;\n\n      @apply --paper-fab;\n    }\n\n    [hidden] {\n      display: none !important;\n    }\n\n    :host([mini]) {\n      width: 40px;\n      height: 40px;\n      padding: 8px;\n\n      @apply --paper-fab-mini;\n    }\n\n    :host([disabled]) {\n      color: var(--paper-fab-disabled-text, var(--paper-grey-500));\n      background: var(--paper-fab-disabled-background, var(--paper-grey-300));\n\n      @apply --paper-fab-disabled;\n    }\n\n    iron-icon {\n      @apply --paper-fab-iron-icon;\n    }\n\n    span {\n      width: 100%;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      text-align: center;\n\n      @apply --paper-fab-label;\n    }\n\n    :host(.keyboard-focus) {\n      background: var(--paper-fab-keyboard-focus-background, var(--paper-pink-900));\n    }\n\n    :host([elevation=\"1\"]) {\n      @apply --paper-material-elevation-1;\n    }\n\n    :host([elevation=\"2\"]) {\n      @apply --paper-material-elevation-2;\n    }\n\n    :host([elevation=\"3\"]) {\n      @apply --paper-material-elevation-3;\n    }\n\n    :host([elevation=\"4\"]) {\n      @apply --paper-material-elevation-4;\n    }\n\n    :host([elevation=\"5\"]) {\n      @apply --paper-material-elevation-5;\n    }\n  </style>\n\n  <iron-icon id=\"icon\" hidden\\$=\"{{!_computeIsIconFab(icon, src)}}\" src=\"[[src]]\" icon=\"[[icon]]\"></iron-icon>\n  <span hidden\\$=\"{{_computeIsIconFab(icon, src)}}\">{{label}}</span>\n`;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design: [Floating Action\nButton](https://www.google.com/design/spec/components/buttons-floating-action-button.html)\n\n`paper-fab` is a floating action button. It contains an image placed in the\ncenter and comes in two sizes: regular size and a smaller size by applying the\nattribute `mini`. When the user touches the button, a ripple effect emanates\nfrom the center of the button.\n\nYou may import `iron-icons` to use with this element, or provide a URL to a\ncustom icon. See `iron-iconset` for more information about how to use a custom\nicon set.\n\nExample:\n\n    <script type=\"module\">\n      import '@polymer/iron-icons/iron-icons.js';\n    </script>\n\n    <paper-fab icon=\"add\"></paper-fab>\n    <paper-fab mini icon=\"favorite\"></paper-fab>\n    <paper-fab src=\"star.png\"></paper-fab>\n\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-fab-background` | The background color of the button | `--accent-color`\n`--paper-fab-keyboard-focus-background` | The background color of the button when focused | `--paper-pink-900`\n`--paper-fab-disabled-background` | The background color of the button when it's disabled | `--paper-grey-300`\n`--paper-fab-disabled-text` | The text color of the button when it's disabled | `--paper-grey-500`\n`--paper-fab` | Mixin applied to the button | `{}`\n`--paper-fab-mini` | Mixin applied to a mini button | `{}`\n`--paper-fab-disabled` | Mixin applied to a disabled button | `{}`\n`--paper-fab-iron-icon` | Mixin applied to the iron-icon within the button | `{}`\n`--paper-fab-label` | Mixin applied to the label within the button | `{}`\n\n@group Paper Elements\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-fab',\n\n  behaviors: [PaperButtonBehavior],\n\n  properties: {\n    /**\n     * The URL of an image for the icon. If the src property is specified,\n     * the icon property should not be.\n     */\n    src: {type: String, value: ''},\n\n    /**\n     * Specifies the icon name or index in the set of icons available in\n     * the icon's icon set. If the icon property is specified,\n     * the src property should not be.\n     */\n    icon: {type: String, value: ''},\n\n    /**\n     * Set this to true to style this is a \"mini\" FAB.\n     */\n    mini: {type: Boolean, value: false, reflectToAttribute: true},\n\n    /**\n     * The label displayed in the badge. The label is centered, and ideally\n     * should have very few characters.\n     */\n    label: {type: String, observer: '_labelChanged'}\n  },\n\n  _labelChanged: function() {\n    this.setAttribute('aria-label', this.label);\n  },\n\n  _computeIsIconFab: function(icon, src) {\n    return (icon.length > 0) || (src.length > 0);\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-icon/iron-icon.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {PaperInkyFocusBehavior} from '@polymer/paper-behaviors/paper-inky-focus-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design: [Icon\ntoggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)\n\n`paper-icon-button` is a button with an image placed at the center. When the\nuser touches the button, a ripple effect emanates from the center of the button.\n\n`paper-icon-button` does not include a default icon set. To use icons from the\ndefault set, include `PolymerElements/iron-icons/iron-icons.html`, and use the\n`icon` attribute to specify which icon from the icon set to use.\n\n    <paper-icon-button icon=\"menu\"></paper-icon-button>\n\nSee [`iron-iconset`](iron-iconset) for more information about\nhow to use a custom icon set.\n\nExample:\n\n    <script type=\"module\">\n      import '@polymer/iron-icons/iron-icons.js';\n    </script>\n\n    <paper-icon-button icon=\"favorite\"></paper-icon-button>\n    <paper-icon-button src=\"star.png\"></paper-icon-button>\n\nTo use `paper-icon-button` as a link, wrap it in an anchor tag. Since\n`paper-icon-button` will already receive focus, you may want to prevent the\nanchor tag from receiving focus as well by setting its tabindex to -1.\n\n    <a href=\"https://www.polymer-project.org\" tabindex=\"-1\">\n      <paper-icon-button icon=\"polymer\"></paper-icon-button>\n    </a>\n\n### Styling\n\nStyle the button with CSS as you would a normal DOM element. If you are using\nthe icons provided by `iron-icons`, they will inherit the foreground color of\nthe button.\n\n    /* make a red \"favorite\" button *\\/\n    <paper-icon-button icon=\"favorite\" style=\"color: red;\"></paper-icon-button>\n\nBy default, the ripple is the same color as the foreground at 25% opacity. You\nmay customize the color using the `--paper-icon-button-ink-color` custom\nproperty.\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color`\n`--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color`\n`--paper-icon-button` | Mixin for a button | `{}`\n`--paper-icon-button-disabled` | Mixin for a disabled button | `{}`\n`--paper-icon-button-hover` | Mixin for button on hover | `{}`\n\n@group Paper Elements\n@element paper-icon-button\n@demo demo/index.html\n*/\nPolymer({\n  is: 'paper-icon-button',\n\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        position: relative;\n        padding: 8px;\n        outline: none;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n        cursor: pointer;\n        z-index: 0;\n        line-height: 1;\n\n        width: 40px;\n        height: 40px;\n\n        /*\n          NOTE: Both values are needed, since some phones require the value to\n          be \\`transparent\\`.\n        */\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        -webkit-tap-highlight-color: transparent;\n\n        /* Because of polymer/2558, this style has lower specificity than * */\n        box-sizing: border-box !important;\n\n        @apply --paper-icon-button;\n      }\n\n      :host #ink {\n        color: var(--paper-icon-button-ink-color, var(--primary-text-color));\n        opacity: 0.6;\n      }\n\n      :host([disabled]) {\n        color: var(--paper-icon-button-disabled-text, var(--disabled-text-color));\n        pointer-events: none;\n        cursor: auto;\n\n        @apply --paper-icon-button-disabled;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      :host(:hover) {\n        @apply --paper-icon-button-hover;\n      }\n\n      iron-icon {\n        --iron-icon-width: 100%;\n        --iron-icon-height: 100%;\n      }\n    </style>\n\n    <iron-icon id=\"icon\" src=\"[[src]]\" icon=\"[[icon]]\"\n               alt$=\"[[alt]]\"></iron-icon>\n  `,\n\n  hostAttributes: {role: 'button', tabindex: '0'},\n\n  behaviors: [PaperInkyFocusBehavior],\n\n  registered: function() {\n    this._template.setAttribute('strip-whitespace', '');\n  },\n\n  properties: {\n    /**\n     * The URL of an image for the icon. If the src property is specified,\n     * the icon property should not be.\n     */\n    src: {type: String},\n\n    /**\n     * Specifies the icon name or index in the set of icons available in\n     * the icon's icon set. If the icon property is specified,\n     * the src property should not be.\n     */\n    icon: {type: String},\n\n    /**\n     * Specifies the alternate text for the button, for accessibility.\n     */\n    alt: {type: String, observer: '_altChanged'}\n  },\n\n  _altChanged: function(newValue, oldValue) {\n    var label = this.getAttribute('aria-label');\n\n    // Don't stomp over a user-set aria-label.\n    if (!label || oldValue == label) {\n      this.setAttribute('aria-label', newValue);\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n * Use `Polymer.PaperInputAddonBehavior` to implement an add-on for\n * `<paper-input-container>`. A add-on appears below the input, and may display\n * information based on the input value and validity such as a character counter\n * or an error message.\n * @polymerBehavior\n */\nexport const PaperInputAddonBehavior = {\n  attached: function() {\n    this.fire('addon-attached');\n  },\n\n  /**\n   * The function called by `<paper-input-container>` when the input value or\n   * validity changes.\n   * @param {{\n   *   invalid: boolean,\n   *   inputElement: (Element|undefined),\n   *   value: (string|undefined)\n   * }} state -\n   *     inputElement: The input element.\n   *     value: The input value.\n   *     invalid: True if the input value is invalid.\n   */\n  update: function(state) {}\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {PolymerElement} from '@polymer/polymer/polymer-element.js';\n\n// Generate unique, monotonically increasing IDs for labels (needed by\n// aria-labelledby) and add-ons.\nexport const PaperInputHelper = {};\n\nPaperInputHelper.NextLabelID = 1;\nPaperInputHelper.NextAddonID = 1;\nPaperInputHelper.NextInputID = 1;\n\n/**\n * Use `PaperInputBehavior` to implement inputs with `<paper-input-container>`.\n * This behavior is implemented by `<paper-input>`. It exposes a number of\n * properties from `<paper-input-container>` and `<input is=\"iron-input\">` and\n * they should be bound in your template.\n *\n * The input element can be accessed by the `inputElement` property if you need\n * to access properties or methods that are not exposed.\n * @polymerBehavior PaperInputBehavior\n */\nexport const PaperInputBehaviorImpl = {\n\n  properties: {\n    /**\n     * Fired when the input changes due to user interaction.\n     *\n     * @event change\n     */\n\n    /**\n     * The label for this input. If you're using PaperInputBehavior to\n     * implement your own paper-input-like element, bind this to\n     * `<label>`'s content and `hidden` property, e.g.\n     * `<label hidden$=\"[[!label]]\">[[label]]</label>` in your `template`\n     */\n    label: {type: String},\n\n    /**\n     * The value for this input. If you're using PaperInputBehavior to\n     * implement your own paper-input-like element, bind this to\n     * the `<iron-input>`'s `bindValue`\n     * property, or the value property of your input that is `notify:true`.\n     * @type {*}\n     */\n    value: {notify: true, type: String},\n\n    /**\n     * Set to true to disable this input. If you're using PaperInputBehavior to\n     * implement your own paper-input-like element, bind this to\n     * both the `<paper-input-container>`'s and the input's `disabled` property.\n     */\n    disabled: {type: Boolean, value: false},\n\n    /**\n     * Returns true if the value is invalid. If you're using PaperInputBehavior\n     * to implement your own paper-input-like element, bind this to both the\n     * `<paper-input-container>`'s and the input's `invalid` property.\n     *\n     * If `autoValidate` is true, the `invalid` attribute is managed\n     * automatically, which can clobber attempts to manage it manually.\n     */\n    invalid: {type: Boolean, value: false, notify: true},\n\n    /**\n     * Set this to specify the pattern allowed by `preventInvalidInput`. If\n     * you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `allowedPattern`\n     * property.\n     */\n    allowedPattern: {type: String},\n\n    /**\n     * The type of the input. The supported types are the\n     * [native input's\n     * types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types).\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the (Polymer 1) `<input is=\"iron-input\">`'s or\n     * (Polymer 2)\n     * `<iron-input>`'s `type` property.\n     */\n    type: {type: String},\n\n    /**\n     * The datalist of the input (if any). This should match the id of an\n     * existing `<datalist>`. If you're using PaperInputBehavior to implement\n     * your own paper-input-like element, bind this to the `<input\n     * is=\"iron-input\">`'s `list` property.\n     */\n    list: {type: String},\n\n    /**\n     * A pattern to validate the `input` with. If you're using\n     * PaperInputBehavior to implement your own paper-input-like element, bind\n     * this to the `<input is=\"iron-input\">`'s `pattern` property.\n     */\n    pattern: {type: String},\n\n    /**\n     * Set to true to mark the input as required. If you're using\n     * PaperInputBehavior to implement your own paper-input-like element, bind\n     * this to the `<input is=\"iron-input\">`'s `required` property.\n     */\n    required: {type: Boolean, value: false},\n\n    /**\n     * The error message to display when the input is invalid. If you're using\n     * PaperInputBehavior to implement your own paper-input-like element,\n     * bind this to the `<paper-input-error>`'s content, if using.\n     */\n    errorMessage: {type: String},\n\n    /**\n     * Set to true to show a character counter.\n     */\n    charCounter: {type: Boolean, value: false},\n\n    /**\n     * Set to true to disable the floating label. If you're using\n     * PaperInputBehavior to implement your own paper-input-like element, bind\n     * this to the `<paper-input-container>`'s `noLabelFloat` property.\n     */\n    noLabelFloat: {type: Boolean, value: false},\n\n    /**\n     * Set to true to always float the label. If you're using PaperInputBehavior\n     * to implement your own paper-input-like element, bind this to the\n     * `<paper-input-container>`'s `alwaysFloatLabel` property.\n     */\n    alwaysFloatLabel: {type: Boolean, value: false},\n\n    /**\n     * Set to true to auto-validate the input value. If you're using\n     * PaperInputBehavior to implement your own paper-input-like element, bind\n     * this to the `<paper-input-container>`'s `autoValidate` property.\n     */\n    autoValidate: {type: Boolean, value: false},\n\n    /**\n     * Name of the validator to use. If you're using PaperInputBehavior to\n     * implement your own paper-input-like element, bind this to\n     * the `<input is=\"iron-input\">`'s `validator` property.\n     */\n    validator: {type: String},\n\n    // HTMLInputElement attributes for binding if needed\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `autocomplete`\n     * property.\n     */\n    autocomplete: {type: String, value: 'off'},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `autofocus`\n     * property.\n     *\n     * @type {!boolean}\n     */\n    autofocus: {type: Boolean, observer: '_autofocusChanged'},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `inputmode`\n     * property.\n     */\n    inputmode: {type: String},\n\n    /**\n     * The minimum length of the input value.\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `minlength`\n     * property.\n     */\n    minlength: {type: Number},\n\n    /**\n     * The maximum length of the input value.\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `maxlength`\n     * property.\n     */\n    maxlength: {type: Number},\n\n    /**\n     * The minimum (numeric or date-time) input value.\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `min` property.\n     */\n    min: {type: String},\n\n    /**\n     * The maximum (numeric or date-time) input value.\n     * Can be a String (e.g. `\"2000-01-01\"`) or a Number (e.g. `2`).\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `max` property.\n     */\n    max: {type: String},\n\n    /**\n     * Limits the numeric or date-time increments.\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `step` property.\n     */\n    step: {type: String},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `name` property.\n     */\n    name: {type: String},\n\n    /**\n     * A placeholder string in addition to the label. If this is set, the label\n     * will always float.\n     */\n    placeholder: {\n      type: String,\n      // need to set a default so _computeAlwaysFloatLabel is run\n      value: ''\n    },\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `readonly`\n     * property.\n     */\n    readonly: {type: Boolean, value: false},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `size` property.\n     */\n    size: {type: Number},\n\n    // Nonstandard attributes for binding if needed\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `autocapitalize`\n     * property.\n     *\n     * @type {string}\n     */\n    autocapitalize: {type: String, value: 'none'},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `autocorrect`\n     * property.\n     */\n    autocorrect: {type: String, value: 'off'},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `autosave`\n     * property, used with type=search.\n     */\n    autosave: {type: String},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `results` property,\n     * used with type=search.\n     */\n    results: {type: Number},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the `<input is=\"iron-input\">`'s `accept` property,\n     * used with type=file.\n     */\n    accept: {type: String},\n\n    /**\n     * If you're using PaperInputBehavior to implement your own paper-input-like\n     * element, bind this to the`<input is=\"iron-input\">`'s `multiple` property,\n     * used with type=file.\n     */\n    multiple: {type: Boolean},\n\n    /** @private */\n    _ariaDescribedBy: {type: String, value: ''},\n\n    /** @private */\n    _ariaLabelledBy: {type: String, value: ''},\n\n    /** @private */\n    _inputId: {type: String, value: ''}\n  },\n\n  listeners: {\n    'addon-attached': '_onAddonAttached',\n  },\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {'shift+tab:keydown': '_onShiftTabDown'},\n\n  /** @private */\n  hostAttributes: {tabindex: 0},\n\n  /**\n   * Returns a reference to the input element.\n   * @return {!HTMLElement}\n   */\n  get inputElement() {\n    // Chrome generates audit errors if an <input type=\"password\"> has a\n    // duplicate ID, which is almost always true in Shady DOM. Generate\n    // a unique ID instead.\n    if (!this.$) {\n      this.$ = {}\n    }\n    if (!this.$.input) {\n      this._generateInputId();\n      this.$.input = this.$$('#' + this._inputId);\n    }\n    return this.$.input;\n  },\n\n  /**\n   * Returns a reference to the focusable element.\n   * @return {!HTMLElement}\n   */\n  get _focusableElement() {\n    return this.inputElement;\n  },\n\n  /** @override */\n  created: function() {\n    // These types have some default placeholder text; overlapping\n    // the label on top of it looks terrible. Auto-float the label in this case.\n    this._typesThatHaveText =\n        ['date', 'datetime', 'datetime-local', 'month', 'time', 'week', 'file'];\n  },\n\n  /** @override */\n  attached: function() {\n    this._updateAriaLabelledBy();\n\n    // In the 2.0 version of the element, this is handled in `onIronInputReady`,\n    // i.e. after the native input has finished distributing. In the 1.0\n    // version, the input is in the shadow tree, so it's already available.\n    if (!PolymerElement && this.inputElement &&\n        this._typesThatHaveText.indexOf(this.inputElement.type) !== -1) {\n      this.alwaysFloatLabel = true;\n    }\n  },\n\n  _appendStringWithSpace: function(str, more) {\n    if (str) {\n      str = str + ' ' + more;\n    } else {\n      str = more;\n    }\n    return str;\n  },\n\n  _onAddonAttached: function(event) {\n    var target = dom(event).rootTarget;\n    if (target.id) {\n      this._ariaDescribedBy =\n          this._appendStringWithSpace(this._ariaDescribedBy, target.id);\n    } else {\n      var id = 'paper-input-add-on-' + PaperInputHelper.NextAddonID++;\n      target.id = id;\n      this._ariaDescribedBy =\n          this._appendStringWithSpace(this._ariaDescribedBy, id);\n    }\n  },\n\n  /**\n   * Validates the input element and sets an error style if needed.\n   *\n   * @return {boolean}\n   */\n  validate: function() {\n    return this.inputElement.validate();\n  },\n\n  /**\n   * Forward focus to inputElement. Overriden from IronControlState.\n   */\n  _focusBlurHandler: function(event) {\n    IronControlState._focusBlurHandler.call(this, event);\n\n    // Forward the focus to the nested input.\n    if (this.focused && !this._shiftTabPressed && this._focusableElement) {\n      this._focusableElement.focus();\n    }\n  },\n\n  /**\n   * Handler that is called when a shift+tab keypress is detected by the menu.\n   *\n   * @param {CustomEvent} event A key combination event.\n   */\n  _onShiftTabDown: function(event) {\n    var oldTabIndex = this.getAttribute('tabindex');\n    this._shiftTabPressed = true;\n    this.setAttribute('tabindex', '-1');\n    this.async(function() {\n      this.setAttribute('tabindex', oldTabIndex);\n      this._shiftTabPressed = false;\n    }, 1);\n  },\n\n  /**\n   * If `autoValidate` is true, then validates the element.\n   */\n  _handleAutoValidate: function() {\n    if (this.autoValidate)\n      this.validate();\n  },\n\n  /**\n   * Restores the cursor to its original position after updating the value.\n   * @param {string} newValue The value that should be saved.\n   */\n  updateValueAndPreserveCaret: function(newValue) {\n    // Not all elements might have selection, and even if they have the\n    // right properties, accessing them might throw an exception (like for\n    // <input type=number>)\n    try {\n      var start = this.inputElement.selectionStart;\n      this.value = newValue;\n\n      // The cursor automatically jumps to the end after re-setting the value,\n      // so restore it to its original position.\n      this.inputElement.selectionStart = start;\n      this.inputElement.selectionEnd = start;\n    } catch (e) {\n      // Just set the value and give up on the caret.\n      this.value = newValue;\n    }\n  },\n\n  _computeAlwaysFloatLabel: function(alwaysFloatLabel, placeholder) {\n    return placeholder || alwaysFloatLabel;\n  },\n\n  _updateAriaLabelledBy: function() {\n    var label = dom(this.root).querySelector('label');\n    if (!label) {\n      this._ariaLabelledBy = '';\n      return;\n    }\n    var labelledBy;\n    if (label.id) {\n      labelledBy = label.id;\n    } else {\n      labelledBy = 'paper-input-label-' + PaperInputHelper.NextLabelID++;\n      label.id = labelledBy;\n    }\n    this._ariaLabelledBy = labelledBy;\n  },\n\n  _generateInputId: function() {\n    if (!this._inputId || this._inputId === '') {\n      this._inputId = 'input-' + PaperInputHelper.NextInputID++;\n    }\n  },\n\n  _onChange: function(event) {\n    // In the Shadow DOM, the `change` event is not leaked into the\n    // ancestor tree, so we must do this manually.\n    // See\n    // https://w3c.github.io/webcomponents/spec/shadow/#events-that-are-not-leaked-into-ancestor-trees.\n    if (this.shadowRoot) {\n      this.fire(\n          event.type,\n          {sourceEvent: event},\n          {node: this, bubbles: event.bubbles, cancelable: event.cancelable});\n    }\n  },\n\n  _autofocusChanged: function() {\n    // Firefox doesn't respect the autofocus attribute if it's applied after\n    // the page is loaded (Chrome/WebKit do respect it), preventing an\n    // autofocus attribute specified in markup from taking effect when the\n    // element is upgraded. As a workaround, if the autofocus property is set,\n    // and the focus hasn't already been moved elsewhere, we take focus.\n    if (this.autofocus && this._focusableElement) {\n      // In IE 11, the default document.activeElement can be the page's\n      // outermost html element, but there are also cases (under the\n      // polyfill?) in which the activeElement is not a real HTMLElement, but\n      // just a plain object. We identify the latter case as having no valid\n      // activeElement.\n      var activeElement = document.activeElement;\n      var isActiveElementValid = activeElement instanceof HTMLElement;\n\n      // Has some other element has already taken the focus?\n      var isSomeElementActive = isActiveElementValid &&\n          activeElement !== document.body &&\n          activeElement !== document.documentElement; /* IE 11 */\n      if (!isSomeElementActive) {\n        // No specific element has taken the focus yet, so we can take it.\n        this._focusableElement.focus();\n      }\n    }\n  }\n};\n\n/** @polymerBehavior */\nexport const PaperInputBehavior =\n    [IronControlState, IronA11yKeysBehavior, PaperInputBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/typography.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperInputAddonBehavior} from './paper-input-addon-behavior.js';\n\n/*\n`<paper-input-char-counter>` is a character counter for use with\n`<paper-input-container>`. It shows the number of characters entered in the\ninput and the max length if it is specified.\n\n    <paper-input-container>\n      <input maxlength=\"20\">\n      <paper-input-char-counter></paper-input-char-counter>\n    </paper-input-container>\n\n### Styling\n\nThe following mixin is available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-input-char-counter` | Mixin applied to the element | `{}`\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        float: right;\n\n        @apply --paper-font-caption;\n        @apply --paper-input-char-counter;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      :host(:dir(rtl)) {\n        float: left;\n      }\n    </style>\n\n    <span>[[_charCounterStr]]</span>\n`,\n\n  is: 'paper-input-char-counter',\n  behaviors: [PaperInputAddonBehavior],\n  properties: {_charCounterStr: {type: String, value: '0'}},\n\n  /**\n   * This overrides the update function in PaperInputAddonBehavior.\n   * @param {{\n   *   inputElement: (Element|undefined),\n   *   value: (string|undefined),\n   *   invalid: boolean\n   * }} state -\n   *     inputElement: The input element.\n   *     value: The input value.\n   *     invalid: True if the input value is invalid.\n   */\n  update: function(state) {\n    if (!state.inputElement) {\n      return;\n    }\n\n    state.value = state.value || '';\n\n    var counter = state.value.toString().length.toString();\n\n    if (state.inputElement.hasAttribute('maxlength')) {\n      counter += '/' + state.inputElement.getAttribute('maxlength');\n    }\n\n    this._charCounterStr = counter;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/typography.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {dashToCamelCase} from '@polymer/polymer/lib/utils/case-map.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`\n<custom-style>\n  <style is=\"custom-style\">\n    html {\n      --paper-input-container-shared-input-style: {\n        position: relative; /* to make a stacking context */\n        outline: none;\n        box-shadow: none;\n        padding: 0;\n        margin: 0;\n        width: 100%;\n        max-width: 100%;\n        background: transparent;\n        border: none;\n        color: var(--paper-input-container-input-color, var(--primary-text-color));\n        -webkit-appearance: none;\n        text-align: inherit;\n        vertical-align: var(--paper-input-container-input-align, bottom);\n\n        @apply --paper-font-subhead;\n      };\n    }\n  </style>\n</custom-style>\n`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n\n/*\n`<paper-input-container>` is a container for a `<label>`, an `<iron-input>` or\n`<textarea>` and optional add-on elements such as an error message or character\ncounter, used to implement Material Design text fields.\n\nFor example:\n\n    <paper-input-container>\n      <label slot=\"label\">Your name</label>\n      <iron-input slot=\"input\">\n        <input>\n      </iron-input>\n      // In Polymer 1.0, you would use `<input is=\"iron-input\" slot=\"input\">`\ninstead of the above.\n    </paper-input-container>\n\nYou can style the nested `<input>` however you want; if you want it to look like\na Material Design input, you can style it with the\n--paper-input-container-shared-input-style mixin.\n\nDo not wrap `<paper-input-container>` around elements that already include it,\nsuch as `<paper-input>`. Doing so may cause events to bounce infinitely between\nthe container and its contained element.\n\n### Listening for input changes\n\nBy default, it listens for changes on the `bind-value` attribute on its children\nnodes and perform tasks such as auto-validating and label styling when the\n`bind-value` changes. You can configure the attribute it listens to with the\n`attr-for-value` attribute.\n\n### Using a custom input element\n\nYou can use a custom input element in a `<paper-input-container>`, for example\nto implement a compound input field like a social security number input. The\ncustom input element should have the `paper-input-input` class, have a\n`notify:true` value property and optionally implements\n`Polymer.IronValidatableBehavior` if it is validatable.\n\n    <paper-input-container attr-for-value=\"ssn-value\">\n      <label slot=\"label\">Social security number</label>\n      <ssn-input slot=\"input\" class=\"paper-input-input\"></ssn-input>\n    </paper-input-container>\n\n\nIf you're using a `<paper-input-container>` imperatively, it's important to make\nsure that you attach its children (the `iron-input` and the optional `label`)\nbefore you attach the `<paper-input-container>` itself, so that it can be set up\ncorrectly.\n\n### Validation\n\nIf the `auto-validate` attribute is set, the input container will validate the\ninput and update the container styling when the input value changes.\n\n### Add-ons\n\nAdd-ons are child elements of a `<paper-input-container>` with the `add-on`\nattribute and implements the `Polymer.PaperInputAddonBehavior` behavior. They\nare notified when the input value or validity changes, and may implement\nfunctionality such as error messages or character counters. They appear at the\nbottom of the input.\n\n### Prefixes and suffixes\nThese are child elements of a `<paper-input-container>` with the `prefix`\nor `suffix` attribute, and are displayed inline with the input, before or after.\n\n    <paper-input-container>\n      <div slot=\"prefix\">$</div>\n      <label slot=\"label\">Total</label>\n      <iron-input slot=\"input\">\n        <input>\n      </iron-input>\n      // In Polymer 1.0, you would use `<input is=\"iron-input\" slot=\"input\">`\ninstead of the above. <paper-icon-button slot=\"suffix\"\nicon=\"clear\"></paper-icon-button>\n    </paper-input-container>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-input-container-color` | Label and underline color when the input is not focused | `--secondary-text-color`\n`--paper-input-container-focus-color` | Label and underline color when the input is focused | `--primary-color`\n`--paper-input-container-invalid-color` | Label and underline color when the input is is invalid | `--error-color`\n`--paper-input-container-input-color` | Input foreground color | `--primary-text-color`\n`--paper-input-container` | Mixin applied to the container | `{}`\n`--paper-input-container-disabled` | Mixin applied to the container when it's disabled | `{}`\n`--paper-input-container-label` | Mixin applied to the label | `{}`\n`--paper-input-container-label-focus` | Mixin applied to the label when the input is focused | `{}`\n`--paper-input-container-label-floating` | Mixin applied to the label when floating | `{}`\n`--paper-input-container-input` | Mixin applied to the input | `{}`\n`--paper-input-container-input-align` | The vertical-align property of the input | `bottom`\n`--paper-input-container-input-disabled` | Mixin applied to the input when the component is disabled | `{}`\n`--paper-input-container-input-focus` | Mixin applied to the input when focused | `{}`\n`--paper-input-container-input-invalid` | Mixin applied to the input when invalid | `{}`\n`--paper-input-container-input-webkit-spinner` | Mixin applied to the webkit spinner | `{}`\n`--paper-input-container-input-webkit-clear` | Mixin applied to the webkit clear button | `{}`\n`--paper-input-container-input-webkit-calendar-picker-indicator` | Mixin applied to the webkit calendar picker indicator | `{}`\n`--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer clear button | `{}`\n`--paper-input-container-underline` | Mixin applied to the underline | `{}`\n`--paper-input-container-underline-focus` | Mixin applied to the underline when the input is focused | `{}`\n`--paper-input-container-underline-disabled` | Mixin applied to the underline when the input is disabled | `{}`\n`--paper-input-prefix` | Mixin applied to the input prefix | `{}`\n`--paper-input-suffix` | Mixin applied to the input suffix | `{}`\n`--paper-input-container-label-before` | Mixin applied to label before pseudo element | {}\n`--paper-input-container-label-after` | Mixin applied to label after pseudo element (useful for required asterisk) | {}\n\nThis element is `display:block` by default, but you can set the `inline`\nattribute to make it `display:inline-block`.\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        padding: 8px 0;\n        @apply --paper-input-container;\n      }\n\n      :host([inline]) {\n        display: inline-block;\n      }\n\n      :host([disabled]) {\n        pointer-events: none;\n        opacity: 0.33;\n\n        @apply --paper-input-container-disabled;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      [hidden] {\n        display: none !important;\n      }\n\n      .floated-label-placeholder {\n        @apply --paper-font-caption;\n      }\n\n      .underline {\n        height: 2px;\n        position: relative;\n      }\n\n      .focused-line {\n        @apply --layout-fit;\n        border-bottom: 2px solid var(--paper-input-container-focus-color, var(--primary-color));\n\n        -webkit-transform-origin: center center;\n        transform-origin: center center;\n        -webkit-transform: scale3d(0,1,1);\n        transform: scale3d(0,1,1);\n\n        @apply --paper-input-container-underline-focus;\n      }\n\n      .underline.is-highlighted .focused-line {\n        -webkit-transform: none;\n        transform: none;\n        -webkit-transition: -webkit-transform 0.25s;\n        transition: transform 0.25s;\n\n        @apply --paper-transition-easing;\n      }\n\n      .underline.is-invalid .focused-line {\n        border-color: var(--paper-input-container-invalid-color, var(--error-color));\n        -webkit-transform: none;\n        transform: none;\n        -webkit-transition: -webkit-transform 0.25s;\n        transition: transform 0.25s;\n\n        @apply --paper-transition-easing;\n      }\n\n      .unfocused-line {\n        @apply --layout-fit;\n        border-bottom: 1px solid var(--paper-input-container-color, var(--secondary-text-color));\n        @apply --paper-input-container-underline;\n      }\n\n      :host([disabled]) .unfocused-line {\n        border-bottom: 1px dashed;\n        border-color: var(--paper-input-container-color, var(--secondary-text-color));\n        @apply --paper-input-container-underline-disabled;\n      }\n\n      .input-wrapper {\n        @apply --layout-horizontal;\n        @apply --layout-center;\n        position: relative;\n      }\n\n      .input-content {\n        @apply --layout-flex-auto;\n        @apply --layout-relative;\n        max-width: 100%;\n      }\n\n      .input-content ::slotted(label),\n      .input-content ::slotted(.paper-input-label) {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        font: inherit;\n        color: var(--paper-input-container-color, var(--secondary-text-color));\n        -webkit-transition: -webkit-transform 0.25s, width 0.25s;\n        transition: transform 0.25s, width 0.25s;\n        -webkit-transform-origin: left top;\n        transform-origin: left top;\n        /* Fix for safari not focusing 0-height date/time inputs with -webkit-apperance: none; */\n        min-height: 1px;\n\n        @apply --paper-font-common-nowrap;\n        @apply --paper-font-subhead;\n        @apply --paper-input-container-label;\n        @apply --paper-transition-easing;\n      }\n\n\n      .input-content ::slotted(label):before,\n      .input-content ::slotted(.paper-input-label):before {\n        @apply --paper-input-container-label-before;\n      }\n\n      .input-content ::slotted(label):after,\n      .input-content ::slotted(.paper-input-label):after {\n        @apply --paper-input-container-label-after;\n      }\n\n      .input-content.label-is-floating ::slotted(label),\n      .input-content.label-is-floating ::slotted(.paper-input-label) {\n        -webkit-transform: translateY(-75%) scale(0.75);\n        transform: translateY(-75%) scale(0.75);\n\n        /* Since we scale to 75/100 of the size, we actually have 100/75 of the\n        original space now available */\n        width: 133%;\n\n        @apply --paper-input-container-label-floating;\n      }\n\n      :host(:dir(rtl)) .input-content.label-is-floating ::slotted(label),\n      :host(:dir(rtl)) .input-content.label-is-floating ::slotted(.paper-input-label) {\n        right: 0;\n        left: auto;\n        -webkit-transform-origin: right top;\n        transform-origin: right top;\n      }\n\n      .input-content.label-is-highlighted ::slotted(label),\n      .input-content.label-is-highlighted ::slotted(.paper-input-label) {\n        color: var(--paper-input-container-focus-color, var(--primary-color));\n\n        @apply --paper-input-container-label-focus;\n      }\n\n      .input-content.is-invalid ::slotted(label),\n      .input-content.is-invalid ::slotted(.paper-input-label) {\n        color: var(--paper-input-container-invalid-color, var(--error-color));\n      }\n\n      .input-content.label-is-hidden ::slotted(label),\n      .input-content.label-is-hidden ::slotted(.paper-input-label) {\n        visibility: hidden;\n      }\n\n      .input-content ::slotted(input),\n      .input-content ::slotted(iron-input),\n      .input-content ::slotted(textarea),\n      .input-content ::slotted(iron-autogrow-textarea),\n      .input-content ::slotted(.paper-input-input) {\n        @apply --paper-input-container-shared-input-style;\n        /* The apply shim doesn't apply the nested color custom property,\n          so we have to re-apply it here. */\n        color: var(--paper-input-container-input-color, var(--primary-text-color));\n        @apply --paper-input-container-input;\n      }\n\n      .input-content ::slotted(input)::-webkit-outer-spin-button,\n      .input-content ::slotted(input)::-webkit-inner-spin-button {\n        @apply --paper-input-container-input-webkit-spinner;\n      }\n\n      .input-content.focused ::slotted(input),\n      .input-content.focused ::slotted(iron-input),\n      .input-content.focused ::slotted(textarea),\n      .input-content.focused ::slotted(iron-autogrow-textarea),\n      .input-content.focused ::slotted(.paper-input-input) {\n        @apply --paper-input-container-input-focus;\n      }\n\n      .input-content.is-invalid ::slotted(input),\n      .input-content.is-invalid ::slotted(iron-input),\n      .input-content.is-invalid ::slotted(textarea),\n      .input-content.is-invalid ::slotted(iron-autogrow-textarea),\n      .input-content.is-invalid ::slotted(.paper-input-input) {\n        @apply --paper-input-container-input-invalid;\n      }\n\n      .prefix ::slotted(*) {\n        display: inline-block;\n        @apply --paper-font-subhead;\n        @apply --layout-flex-none;\n        @apply --paper-input-prefix;\n      }\n\n      .suffix ::slotted(*) {\n        display: inline-block;\n        @apply --paper-font-subhead;\n        @apply --layout-flex-none;\n\n        @apply --paper-input-suffix;\n      }\n\n      /* Firefox sets a min-width on the input, which can cause layout issues */\n      .input-content ::slotted(input) {\n        min-width: 0;\n      }\n\n      .input-content ::slotted(textarea) {\n        resize: none;\n      }\n\n      .add-on-content {\n        position: relative;\n      }\n\n      .add-on-content.is-invalid ::slotted(*) {\n        color: var(--paper-input-container-invalid-color, var(--error-color));\n      }\n\n      .add-on-content.is-highlighted ::slotted(*) {\n        color: var(--paper-input-container-focus-color, var(--primary-color));\n      }\n    </style>\n\n    <div class=\"floated-label-placeholder\" aria-hidden=\"true\" hidden=\"[[noLabelFloat]]\">&nbsp;</div>\n\n    <div class=\"input-wrapper\">\n      <span class=\"prefix\"><slot name=\"prefix\"></slot></span>\n\n      <div class$=\"[[_computeInputContentClass(noLabelFloat,alwaysFloatLabel,focused,invalid,_inputHasContent)]]\" id=\"labelAndInputContainer\">\n        <slot name=\"label\"></slot>\n        <slot name=\"input\"></slot>\n      </div>\n\n      <span class=\"suffix\"><slot name=\"suffix\"></slot></span>\n    </div>\n\n    <div class$=\"[[_computeUnderlineClass(focused,invalid)]]\">\n      <div class=\"unfocused-line\"></div>\n      <div class=\"focused-line\"></div>\n    </div>\n\n    <div class$=\"[[_computeAddOnContentClass(focused,invalid)]]\">\n      <slot name=\"add-on\"></slot>\n    </div>\n`,\n\n  is: 'paper-input-container',\n\n  properties: {\n    /**\n     * Set to true to disable the floating label. The label disappears when the\n     * input value is not null.\n     */\n    noLabelFloat: {type: Boolean, value: false},\n\n    /**\n     * Set to true to always float the floating label.\n     */\n    alwaysFloatLabel: {type: Boolean, value: false},\n\n    /**\n     * The attribute to listen for value changes on.\n     */\n    attrForValue: {type: String, value: 'bind-value'},\n\n    /**\n     * Set to true to auto-validate the input value when it changes.\n     */\n    autoValidate: {type: Boolean, value: false},\n\n    /**\n     * True if the input is invalid. This property is set automatically when the\n     * input value changes if auto-validating, or when the `iron-input-validate`\n     * event is heard from a child.\n     */\n    invalid: {observer: '_invalidChanged', type: Boolean, value: false},\n\n    /**\n     * True if the input has focus.\n     */\n    focused: {readOnly: true, type: Boolean, value: false, notify: true},\n\n    _addons: {\n      type: Array\n      // do not set a default value here intentionally - it will be initialized\n      // lazily when a distributed child is attached, which may occur before\n      // configuration for this element in polyfill.\n    },\n\n    _inputHasContent: {type: Boolean, value: false},\n\n    _inputSelector:\n        {type: String, value: 'input,iron-input,textarea,.paper-input-input'},\n\n    _boundOnFocus: {\n      type: Function,\n      value: function() {\n        return this._onFocus.bind(this);\n      }\n    },\n\n    _boundOnBlur: {\n      type: Function,\n      value: function() {\n        return this._onBlur.bind(this);\n      }\n    },\n\n    _boundOnInput: {\n      type: Function,\n      value: function() {\n        return this._onInput.bind(this);\n      }\n    },\n\n    _boundValueChanged: {\n      type: Function,\n      value: function() {\n        return this._onValueChanged.bind(this);\n      }\n    }\n  },\n\n  listeners: {\n    'addon-attached': '_onAddonAttached',\n    'iron-input-validate': '_onIronInputValidate'\n  },\n\n  get _valueChangedEvent() {\n    return this.attrForValue + '-changed';\n  },\n\n  get _propertyForValue() {\n    return dashToCamelCase(this.attrForValue);\n  },\n\n  get _inputElement() {\n    return dom(this).querySelector(this._inputSelector);\n  },\n\n  get _inputElementValue() {\n    return this._inputElement[this._propertyForValue] ||\n        this._inputElement.value;\n  },\n\n  /** @override */\n  ready: function() {\n    // Paper-input treats a value of undefined differently at startup than\n    // the rest of the time (specifically: it does not validate it at startup,\n    // but it does after that. We need to track whether the first time we\n    // encounter the value is basically this first time, so that we can validate\n    // it correctly the rest of the time. See\n    // https://github.com/PolymerElements/paper-input/issues/605\n    this.__isFirstValueUpdate = true;\n    if (!this._addons) {\n      this._addons = [];\n    }\n    this.addEventListener('focus', this._boundOnFocus, true);\n    this.addEventListener('blur', this._boundOnBlur, true);\n  },\n\n  /** @override */\n  attached: function() {\n    if (this.attrForValue) {\n      this._inputElement.addEventListener(\n          this._valueChangedEvent, this._boundValueChanged);\n    } else {\n      this.addEventListener('input', this._onInput);\n    }\n\n    // Only validate when attached if the input already has a value.\n    if (this._inputElementValue && this._inputElementValue != '') {\n      this._handleValueAndAutoValidate(this._inputElement);\n    } else {\n      this._handleValue(this._inputElement);\n    }\n  },\n\n  /** @private */\n  _onAddonAttached: function(event) {\n    if (!this._addons) {\n      this._addons = [];\n    }\n    var target = event.target;\n    if (this._addons.indexOf(target) === -1) {\n      this._addons.push(target);\n      if (this.isAttached) {\n        this._handleValue(this._inputElement);\n      }\n    }\n  },\n\n  /** @private */\n  _onFocus: function() {\n    this._setFocused(true);\n  },\n\n  /** @private */\n  _onBlur: function() {\n    this._setFocused(false);\n    this._handleValueAndAutoValidate(this._inputElement);\n  },\n\n  /** @private */\n  _onInput: function(event) {\n    this._handleValueAndAutoValidate(event.target);\n  },\n\n  /** @private */\n  _onValueChanged: function(event) {\n    var input = event.target;\n\n    // Paper-input treats a value of undefined differently at startup than\n    // the rest of the time (specifically: it does not validate it at startup,\n    // but it does after that. If this is in fact the bootup case, ignore\n    // validation, just this once.\n    if (this.__isFirstValueUpdate) {\n      this.__isFirstValueUpdate = false;\n      if (input.value === undefined || input.value === '') {\n        return;\n      }\n    }\n\n    this._handleValueAndAutoValidate(event.target);\n  },\n\n  /** @private */\n  _handleValue: function(inputElement) {\n    var value = this._inputElementValue;\n\n    // type=\"number\" hack needed because this.value is empty until it's valid\n    if (value || value === 0 ||\n        (inputElement.type === 'number' && !inputElement.checkValidity())) {\n      this._inputHasContent = true;\n    } else {\n      this._inputHasContent = false;\n    }\n\n    this.updateAddons(\n        {inputElement: inputElement, value: value, invalid: this.invalid});\n  },\n\n  /** @private */\n  _handleValueAndAutoValidate: function(inputElement) {\n    if (this.autoValidate && inputElement) {\n      var valid;\n\n      if (inputElement.validate) {\n        valid = inputElement.validate(this._inputElementValue);\n      } else {\n        valid = inputElement.checkValidity();\n      }\n      this.invalid = !valid;\n    }\n\n    // Call this last to notify the add-ons.\n    this._handleValue(inputElement);\n  },\n\n  /** @private */\n  _onIronInputValidate: function(event) {\n    this.invalid = this._inputElement.invalid;\n  },\n\n  /** @private */\n  _invalidChanged: function() {\n    if (this._addons) {\n      this.updateAddons({invalid: this.invalid});\n    }\n  },\n\n  /**\n   * Call this to update the state of add-ons.\n   * @param {Object} state Add-on state.\n   */\n  updateAddons: function(state) {\n    for (var addon, index = 0; addon = this._addons[index]; index++) {\n      addon.update(state);\n    }\n  },\n\n  /** @private */\n  _computeInputContentClass: function(\n      noLabelFloat, alwaysFloatLabel, focused, invalid, _inputHasContent) {\n    var cls = 'input-content';\n    if (!noLabelFloat) {\n      var label = this.querySelector('label');\n\n      if (alwaysFloatLabel || _inputHasContent) {\n        cls += ' label-is-floating';\n        // If the label is floating, ignore any offsets that may have been\n        // applied from a prefix element.\n        this.$.labelAndInputContainer.style.position = 'static';\n\n        if (invalid) {\n          cls += ' is-invalid';\n        } else if (focused) {\n          cls += ' label-is-highlighted';\n        }\n      } else {\n        // When the label is not floating, it should overlap the input element.\n        if (label) {\n          this.$.labelAndInputContainer.style.position = 'relative';\n        }\n        if (invalid) {\n          cls += ' is-invalid';\n        }\n      }\n    } else {\n      if (_inputHasContent) {\n        cls += ' label-is-hidden';\n      }\n      if (invalid) {\n        cls += ' is-invalid';\n      }\n    }\n    if (focused) {\n      cls += ' focused';\n    }\n    return cls;\n  },\n\n  /** @private */\n  _computeUnderlineClass: function(focused, invalid) {\n    var cls = 'underline';\n    if (invalid) {\n      cls += ' is-invalid';\n    } else if (focused) {\n      cls += ' is-highlighted'\n    }\n    return cls;\n  },\n\n  /** @private */\n  _computeAddOnContentClass: function(focused, invalid) {\n    var cls = 'add-on-content';\n    if (invalid) {\n      cls += ' is-invalid';\n    } else if (focused) {\n      cls += ' is-highlighted'\n    }\n    return cls;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/typography.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperInputAddonBehavior} from './paper-input-addon-behavior.js';\n\n/*\n`<paper-input-error>` is an error message for use with\n`<paper-input-container>`. The error is displayed when the\n`<paper-input-container>` is `invalid`.\n\n    <paper-input-container>\n      <input pattern=\"[0-9]*\">\n      <paper-input-error slot=\"add-on\">Only numbers are\nallowed!</paper-input-error>\n    </paper-input-container>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-input-container-invalid-color` | The foreground color of the error | `--error-color`\n`--paper-input-error` | Mixin applied to the error | `{}`\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        visibility: hidden;\n\n        color: var(--paper-input-container-invalid-color, var(--error-color));\n\n        @apply --paper-font-caption;\n        @apply --paper-input-error;\n        position: absolute;\n        left:0;\n        right:0;\n      }\n\n      :host([invalid]) {\n        visibility: visible;\n      }\n\n      #a11yWrapper {\n        visibility: hidden;\n      }\n\n      :host([invalid]) #a11yWrapper {\n        visibility: visible;\n      }\n    </style>\n\n    <!--\n    If the paper-input-error element is directly referenced by an\n    \\`aria-describedby\\` attribute, such as when used as a paper-input add-on,\n    then applying \\`visibility: hidden;\\` to the paper-input-error element itself\n    does not hide the error.\n\n    For more information, see:\n    https://www.w3.org/TR/accname-1.1/#mapping_additional_nd_description\n    -->\n    <div id=\"a11yWrapper\">\n      <slot></slot>\n    </div>\n`,\n\n  is: 'paper-input-error',\n  behaviors: [PaperInputAddonBehavior],\n\n  properties: {\n    /**\n     * True if the error is showing.\n     */\n    invalid: {readOnly: true, reflectToAttribute: true, type: Boolean}\n  },\n\n  /**\n   * This overrides the update function in PaperInputAddonBehavior.\n   * @param {{\n   *   inputElement: (Element|undefined),\n   *   value: (string|undefined),\n   *   invalid: boolean\n   * }} state -\n   *     inputElement: The input element.\n   *     value: The input value.\n   *     invalid: True if the input value is invalid.\n   */\n  update: function(state) {\n    this._setInvalid(state.invalid);\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer.js';\nimport {IronValidatableBehavior} from '@polymer/iron-validatable-behavior/iron-validatable-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n`<iron-input>` is a wrapper to a native `<input>` element, that adds two-way\nbinding and prevention of invalid input. To use it, you must distribute a native\n`<input>` yourself. You can continue to use the native `input` as you would\nnormally:\n\n    <iron-input>\n      <input>\n    </iron-input>\n\n    <iron-input>\n      <input type=\"email\" disabled>\n    </iron-input>\n\n### Two-way binding\n\nBy default you can only get notified of changes to a native `<input>`'s `value`\ndue to user input:\n\n    <input value=\"{{myValue::input}}\">\n\nThis means that if you imperatively set the value (i.e. `someNativeInput.value =\n'foo'`), no events will be fired and this change cannot be observed.\n\n`iron-input` adds the `bind-value` property that mirrors the native `input`'s\n'`value` property; this property can be used for two-way data binding.\n`bind-value` will notify if it is changed either by user input or by script.\n\n    <iron-input bind-value=\"{{myValue}}\">\n      <input>\n    </iron-input>\n\nNote: this means that if you want to imperatively set the native `input`'s, you\n_must_ set `bind-value` instead, so that the wrapper `iron-input` can be\nnotified.\n\n### Validation\n\n`iron-input` uses the native `input`'s validation. For simplicity, `iron-input`\nhas a `validate()` method (which internally just checks the distributed\n`input`'s validity), which sets an `invalid` attribute that can also be used for\nstyling.\n\nTo validate automatically as you type, you can use the `auto-validate`\nattribute.\n\n`iron-input` also fires an `iron-input-validate` event after `validate()` is\ncalled. You can use it to implement a custom validator:\n\n    var CatsOnlyValidator = {\n      validate: function(ironInput) {\n        var valid = !ironInput.bindValue || ironInput.bindValue === 'cat';\n        ironInput.invalid = !valid;\n        return valid;\n      }\n    }\n    ironInput.addEventListener('iron-input-validate', function() {\n      CatsOnly.validate(input2);\n    });\n\nYou can also use an element implementing an\n[`IronValidatorBehavior`](/element/PolymerElements/iron-validatable-behavior).\nThis example can also be found in the demo for this element:\n\n    <iron-input validator=\"cats-only\">\n      <input>\n    </iron-input>\n\n### Preventing invalid input\n\nIt may be desirable to only allow users to enter certain characters. You can use\nthe `allowed-pattern` attribute to accomplish this. This feature is separate\nfrom validation, and `allowed-pattern` does not affect how the input is\nvalidated.\n\n    // Only allow typing digits, but a valid input has exactly 5 digits.\n    <iron-input allowed-pattern=\"[0-9]\">\n      <input pattern=\"\\d{5}\">\n    </iron-input>\n\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n      }\n    </style>\n    <slot id=\"content\"></slot>\n`,\n\n  is: 'iron-input',\n  behaviors: [IronValidatableBehavior],\n\n  /**\n   * Fired whenever `validate()` is called.\n   *\n   * @event iron-input-validate\n   */\n\n  properties: {\n\n    /**\n     * Use this property instead of `value` for two-way data binding, or to\n     * set a default value for the input. **Do not** use the distributed\n     * input's `value` property to set a default value.\n     */\n    bindValue: {type: String, value: ''},\n\n    /**\n     * Computed property that echoes `bindValue` (mostly used for Polymer 1.0\n     * backcompatibility, if you were one-way binding to the Polymer 1.0\n     * `input is=\"iron-input\"` value attribute).\n     */\n    value: {type: String, computed: '_computeValue(bindValue)'},\n\n    /**\n     * Regex-like list of characters allowed as input; all characters not in the\n     * list will be rejected. The recommended format should be a list of allowed\n     * characters, for example, `[a-zA-Z0-9.+-!;:]`.\n     *\n     * This pattern represents the allowed characters for the field; as the user\n     * inputs text, each individual character will be checked against the\n     * pattern (rather than checking the entire value as a whole). If a\n     * character is not a match, it will be rejected.\n     *\n     * Pasted input will have each character checked individually; if any\n     * character doesn't match `allowedPattern`, the entire pasted string will\n     * be rejected.\n     *\n     * Note: if you were using `iron-input` in 1.0, you were also required to\n     * set `prevent-invalid-input`. This is no longer needed as of Polymer 2.0,\n     * and will be set automatically for you if an `allowedPattern` is provided.\n     *\n     */\n    allowedPattern: {type: String},\n\n    /**\n     * Set to true to auto-validate the input value as you type.\n     */\n    autoValidate: {type: Boolean, value: false},\n\n    /**\n     * The native input element.\n     */\n    _inputElement: Object,\n  },\n\n  observers: ['_bindValueChanged(bindValue, _inputElement)'],\n  listeners: {'input': '_onInput', 'keypress': '_onKeypress'},\n\n  created: function() {\n    IronA11yAnnouncer.requestAvailability();\n    this._previousValidInput = '';\n    this._patternAlreadyChecked = false;\n  },\n\n  attached: function() {\n    // If the input is added at a later time, update the internal reference.\n    this._observer = dom(this).observeNodes(function(info) {\n      this._initSlottedInput();\n    }.bind(this));\n  },\n\n  detached: function() {\n    if (this._observer) {\n      dom(this).unobserveNodes(this._observer);\n      this._observer = null;\n    }\n  },\n\n  /**\n   * Returns the distributed input element.\n   */\n  get inputElement() {\n    return this._inputElement;\n  },\n\n  _initSlottedInput: function() {\n    this._inputElement = this.getEffectiveChildren()[0];\n\n    if (this.inputElement && this.inputElement.value) {\n      this.bindValue = this.inputElement.value;\n    }\n\n    this.fire('iron-input-ready');\n  },\n\n  get _patternRegExp() {\n    var pattern;\n    if (this.allowedPattern) {\n      pattern = new RegExp(this.allowedPattern);\n    } else {\n      switch (this.inputElement.type) {\n        case 'number':\n          pattern = /[0-9.,e-]/;\n          break;\n      }\n    }\n    return pattern;\n  },\n\n  /**\n   * @suppress {checkTypes}\n   */\n  _bindValueChanged: function(bindValue, inputElement) {\n    // The observer could have run before attached() when we have actually\n    // initialized this property.\n    if (!inputElement) {\n      return;\n    }\n\n    if (bindValue === undefined) {\n      inputElement.value = null;\n    } else if (bindValue !== inputElement.value) {\n      this.inputElement.value = bindValue;\n    }\n\n    if (this.autoValidate) {\n      this.validate();\n    }\n\n    // manually notify because we don't want to notify until after setting value\n    this.fire('bind-value-changed', {value: bindValue});\n  },\n\n  _onInput: function() {\n    // Need to validate each of the characters pasted if they haven't\n    // been validated inside `_onKeypress` already.\n    if (this.allowedPattern && !this._patternAlreadyChecked) {\n      var valid = this._checkPatternValidity();\n      if (!valid) {\n        this._announceInvalidCharacter(\n            'Invalid string of characters not entered.');\n        this.inputElement.value = this._previousValidInput;\n      }\n    }\n    this.bindValue = this._previousValidInput = this.inputElement.value;\n    this._patternAlreadyChecked = false;\n  },\n\n  _isPrintable: function(event) {\n    // What a control/printable character is varies wildly based on the browser.\n    // - most control characters (arrows, backspace) do not send a `keypress`\n    // event\n    //   in Chrome, but the *do* on Firefox\n    // - in Firefox, when they do send a `keypress` event, control chars have\n    //   a charCode = 0, keyCode = xx (for ex. 40 for down arrow)\n    // - printable characters always send a keypress event.\n    // - in Firefox, printable chars always have a keyCode = 0. In Chrome, the\n    // keyCode\n    //   always matches the charCode.\n    // None of this makes any sense.\n\n    // For these keys, ASCII code == browser keycode.\n    var anyNonPrintable = (event.keyCode == 8) ||  // backspace\n        (event.keyCode == 9) ||                    // tab\n        (event.keyCode == 13) ||                   // enter\n        (event.keyCode == 27);                     // escape\n\n    // For these keys, make sure it's a browser keycode and not an ASCII code.\n    var mozNonPrintable = (event.keyCode == 19) ||  // pause\n        (event.keyCode == 20) ||                    // caps lock\n        (event.keyCode == 45) ||                    // insert\n        (event.keyCode == 46) ||                    // delete\n        (event.keyCode == 144) ||                   // num lock\n        (event.keyCode == 145) ||                   // scroll lock\n        (event.keyCode > 32 &&\n         event.keyCode < 41) ||  // page up/down, end, home, arrows\n        (event.keyCode > 111 && event.keyCode < 124);  // fn keys\n\n    return !anyNonPrintable && !(event.charCode == 0 && mozNonPrintable);\n  },\n\n  _onKeypress: function(event) {\n    if (!this.allowedPattern && this.inputElement.type !== 'number') {\n      return;\n    }\n    var regexp = this._patternRegExp;\n    if (!regexp) {\n      return;\n    }\n\n    // Handle special keys and backspace\n    if (event.metaKey || event.ctrlKey || event.altKey) {\n      return;\n    }\n\n    // Check the pattern either here or in `_onInput`, but not in both.\n    this._patternAlreadyChecked = true;\n\n    var thisChar = String.fromCharCode(event.charCode);\n    if (this._isPrintable(event) && !regexp.test(thisChar)) {\n      event.preventDefault();\n      this._announceInvalidCharacter(\n          'Invalid character ' + thisChar + ' not entered.');\n    }\n  },\n\n  _checkPatternValidity: function() {\n    var regexp = this._patternRegExp;\n    if (!regexp) {\n      return true;\n    }\n    for (var i = 0; i < this.inputElement.value.length; i++) {\n      if (!regexp.test(this.inputElement.value[i])) {\n        return false;\n      }\n    }\n    return true;\n  },\n\n  /**\n   * Returns true if `value` is valid. The validator provided in `validator`\n   * will be used first, then any constraints.\n   * @return {boolean} True if the value is valid.\n   */\n  validate: function() {\n    if (!this.inputElement) {\n      this.invalid = false;\n      return true;\n    }\n\n    // Use the nested input's native validity.\n    var valid = this.inputElement.checkValidity();\n\n    // Only do extra checking if the browser thought this was valid.\n    if (valid) {\n      // Empty, required input is invalid\n      if (this.required && this.bindValue === '') {\n        valid = false;\n      } else if (this.hasValidator()) {\n        valid = IronValidatableBehavior.validate.call(this, this.bindValue);\n      }\n    }\n\n    this.invalid = !valid;\n    this.fire('iron-input-validate');\n    return valid;\n  },\n\n  _announceInvalidCharacter: function(message) {\n    this.fire('iron-announce', {text: message});\n  },\n\n  _computeValue: function(bindValue) {\n    return bindValue;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-input/iron-input.js';\nimport './paper-input-char-counter.js';\nimport './paper-input-container.js';\nimport './paper-input-error.js';\n\nimport {IronFormElementBehavior} from '@polymer/iron-form-element-behavior/iron-form-element-behavior.js';\nimport {DomModule} from '@polymer/polymer/lib/elements/dom-module.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {PaperInputBehavior} from './paper-input-behavior.js';\n\n/**\nMaterial design: [Text\nfields](https://www.google.com/design/spec/components/text-fields.html)\n\n`<paper-input>` is a single-line text field with Material Design styling.\n\n    <paper-input label=\"Input label\"></paper-input>\n\nIt may include an optional error message or character counter.\n\n    <paper-input error-message=\"Invalid input!\" label=\"Input\n    label\"></paper-input> <paper-input char-counter label=\"Input\n    label\"></paper-input>\n\nIt can also include custom prefix or suffix elements, which are displayed\nbefore or after the text input itself. In order for an element to be\nconsidered as a prefix, it must have the `prefix` attribute (and similarly\nfor `suffix`).\n\n    <paper-input label=\"total\">\n      <div prefix>$</div>\n      <paper-icon-button slot=\"suffix\" icon=\"clear\"></paper-icon-button>\n    </paper-input>\n\nA `paper-input` can use the native `type=search` or `type=file` features.\nHowever, since we can't control the native styling of the input (search icon,\nfile button, date placeholder, etc.), in these cases the label will be\nautomatically floated. The `placeholder` attribute can still be used for\nadditional informational text.\n\n    <paper-input label=\"search!\" type=\"search\"\n        placeholder=\"search for cats\" autosave=\"test\" results=\"5\">\n    </paper-input>\n\nSee `Polymer.PaperInputBehavior` for more API docs.\n\n### Focus\n\nTo focus a paper-input, you can call the native `focus()` method as long as the\npaper input has a tab index. Similarly, `blur()` will blur the element.\n\n### Styling\n\nSee `Polymer.PaperInputContainer` for a list of custom properties used to\nstyle this element.\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer reveal button (the eyeball) | {}\n\n@element paper-input\n@demo demo/index.html\n*/\nPolymer({\n  is: 'paper-input',\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: block;\n      }\n\n      :host([focused]) {\n        outline: none;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      input {\n        /* Firefox sets a min-width on the input, which can cause layout issues */\n        min-width: 0;\n      }\n\n      /* In 1.x, the <input> is distributed to paper-input-container, which styles it.\n      In 2.x the <iron-input> is distributed to paper-input-container, which styles\n      it, but in order for this to work correctly, we need to reset some\n      of the native input's properties to inherit (from the iron-input) */\n      iron-input > input {\n        @apply --paper-input-container-shared-input-style;\n        font-family: inherit;\n        font-weight: inherit;\n        font-size: inherit;\n        letter-spacing: inherit;\n        word-spacing: inherit;\n        line-height: inherit;\n        text-shadow: inherit;\n        color: inherit;\n        cursor: inherit;\n      }\n\n      input:disabled {\n        @apply --paper-input-container-input-disabled;\n      }\n\n      input::-webkit-outer-spin-button,\n      input::-webkit-inner-spin-button {\n        @apply --paper-input-container-input-webkit-spinner;\n      }\n\n      input::-webkit-clear-button {\n        @apply --paper-input-container-input-webkit-clear;\n      }\n\n      input::-webkit-calendar-picker-indicator {\n        @apply --paper-input-container-input-webkit-calendar-picker-indicator;\n      }\n\n      input::-webkit-input-placeholder {\n        color: var(--paper-input-container-color, var(--secondary-text-color));\n      }\n\n      input:-moz-placeholder {\n        color: var(--paper-input-container-color, var(--secondary-text-color));\n      }\n\n      input::-moz-placeholder {\n        color: var(--paper-input-container-color, var(--secondary-text-color));\n      }\n\n      input::-ms-clear {\n        @apply --paper-input-container-ms-clear;\n      }\n\n      input::-ms-reveal {\n        @apply --paper-input-container-ms-reveal;\n      }\n\n      input:-ms-input-placeholder {\n        color: var(--paper-input-container-color, var(--secondary-text-color));\n      }\n\n      label {\n        pointer-events: none;\n      }\n    </style>\n\n    <paper-input-container id=\"container\" no-label-float=\"[[noLabelFloat]]\" always-float-label=\"[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]\" auto-validate$=\"[[autoValidate]]\" disabled$=\"[[disabled]]\" invalid=\"[[invalid]]\">\n\n      <slot name=\"prefix\" slot=\"prefix\"></slot>\n\n      <label hidden$=\"[[!label]]\" aria-hidden=\"true\" for$=\"[[_inputId]]\" slot=\"label\">[[label]]</label>\n\n      <!-- Need to bind maxlength so that the paper-input-char-counter works correctly -->\n      <iron-input bind-value=\"{{value}}\" slot=\"input\" class=\"input-element\" id$=\"[[_inputId]]\" maxlength$=\"[[maxlength]]\" allowed-pattern=\"[[allowedPattern]]\" invalid=\"{{invalid}}\" validator=\"[[validator]]\">\n        <input aria-labelledby$=\"[[_ariaLabelledBy]]\" aria-describedby$=\"[[_ariaDescribedBy]]\" disabled$=\"[[disabled]]\" title$=\"[[title]]\" type$=\"[[type]]\" pattern$=\"[[pattern]]\" required$=\"[[required]]\" autocomplete$=\"[[autocomplete]]\" autofocus$=\"[[autofocus]]\" inputmode$=\"[[inputmode]]\" minlength$=\"[[minlength]]\" maxlength$=\"[[maxlength]]\" min$=\"[[min]]\" max$=\"[[max]]\" step$=\"[[step]]\" name$=\"[[name]]\" placeholder$=\"[[placeholder]]\" readonly$=\"[[readonly]]\" list$=\"[[list]]\" size$=\"[[size]]\" autocapitalize$=\"[[autocapitalize]]\" autocorrect$=\"[[autocorrect]]\" on-change=\"_onChange\" tabindex$=\"[[tabIndex]]\" autosave$=\"[[autosave]]\" results$=\"[[results]]\" accept$=\"[[accept]]\" multiple$=\"[[multiple]]\" role$=\"[[inputRole]]\" aria-haspopup$=\"[[inputAriaHaspopup]]\">\n      </iron-input>\n\n      <slot name=\"suffix\" slot=\"suffix\"></slot>\n\n      <template is=\"dom-if\" if=\"[[errorMessage]]\">\n        <paper-input-error aria-live=\"assertive\" slot=\"add-on\">[[errorMessage]]</paper-input-error>\n      </template>\n\n      <template is=\"dom-if\" if=\"[[charCounter]]\">\n        <paper-input-char-counter slot=\"add-on\"></paper-input-char-counter>\n      </template>\n\n    </paper-input-container>\n  `,\n\n  behaviors: [PaperInputBehavior, IronFormElementBehavior],\n\n  properties: {\n    value: {\n      // Required for the correct TypeScript type-generation\n      type: String\n    },\n\n    inputRole: {\n      type: String,\n      value: undefined,\n    },\n\n    inputAriaHaspopup: {\n      type: String,\n      value: undefined,\n    },\n  },\n\n  /**\n   * Returns a reference to the focusable element. Overridden from\n   * PaperInputBehavior to correctly focus the native input.\n   *\n   * @return {!HTMLElement}\n   */\n  get _focusableElement() {\n    return this.inputElement._inputElement;\n  },\n\n  // Note: This event is only available in the 1.0 version of this element.\n  // In 2.0, the functionality of `_onIronInputReady` is done in\n  // PaperInputBehavior::attached.\n  listeners: {'iron-input-ready': '_onIronInputReady'},\n\n  _onIronInputReady: function() {\n    // Even though this is only used in the next line, save this for\n    // backwards compatibility, since the native input had this ID until 2.0.5.\n    if (!this.$.nativeInput) {\n      this.$.nativeInput = /** @type {!Element} */ (this.$$('input'));\n    }\n    if (this.inputElement &&\n        this._typesThatHaveText.indexOf(this.$.nativeInput.type) !== -1) {\n      this.alwaysFloatLabel = true;\n    }\n\n    // Only validate when attached if the input already has a value.\n    if (!!this.inputElement.bindValue) {\n      this.$.container._handleValueAndAutoValidate(this.inputElement);\n    }\n  },\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {IronValidatableBehavior} from '@polymer/iron-validatable-behavior/iron-validatable-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n`iron-autogrow-textarea` is an element containing a textarea that grows in\nheight as more lines of input are entered. Unless an explicit height or the\n`maxRows` property is set, it will never scroll.\n\nExample:\n\n    <iron-autogrow-textarea></iron-autogrow-textarea>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--iron-autogrow-textarea` | Mixin applied to the textarea | `{}`\n`--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}`\n\n@demo demo/index.html\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        position: relative;\n        width: 400px;\n        border: 1px solid;\n        padding: 2px;\n        -moz-appearance: textarea;\n        -webkit-appearance: textarea;\n        overflow: hidden;\n      }\n\n      .mirror-text {\n        visibility: hidden;\n        word-wrap: break-word;\n        @apply --iron-autogrow-textarea;\n      }\n\n      .fit {\n        @apply --layout-fit;\n      }\n\n      textarea {\n        position: relative;\n        outline: none;\n        border: none;\n        resize: none;\n        background: inherit;\n        color: inherit;\n        /* see comments in template */\n        width: 100%;\n        height: 100%;\n        font-size: inherit;\n        font-family: inherit;\n        line-height: inherit;\n        text-align: inherit;\n        @apply --iron-autogrow-textarea;\n      }\n\n      textarea::-webkit-input-placeholder {\n        @apply --iron-autogrow-textarea-placeholder;\n      }\n\n      textarea:-moz-placeholder {\n        @apply --iron-autogrow-textarea-placeholder;\n      }\n\n      textarea::-moz-placeholder {\n        @apply --iron-autogrow-textarea-placeholder;\n      }\n\n      textarea:-ms-input-placeholder {\n        @apply --iron-autogrow-textarea-placeholder;\n      }\n    </style>\n\n    <!-- the mirror sizes the input/textarea so it grows with typing -->\n    <!-- use &#160; instead &nbsp; of to allow this element to be used in XHTML -->\n    <div id=\"mirror\" class=\"mirror-text\" aria-hidden=\"true\">&nbsp;</div>\n\n    <!-- size the input/textarea with a div, because the textarea has intrinsic size in ff -->\n    <div class=\"textarea-container fit\">\n      <textarea id=\"textarea\" name$=\"[[name]]\" aria-label$=\"[[label]]\" autocomplete$=\"[[autocomplete]]\" autofocus$=\"[[autofocus]]\" autocapitalize$=\"[[autocapitalize]]\" inputmode$=\"[[inputmode]]\" placeholder$=\"[[placeholder]]\" readonly$=\"[[readonly]]\" required$=\"[[required]]\" disabled$=\"[[disabled]]\" rows$=\"[[rows]]\" minlength$=\"[[minlength]]\" maxlength$=\"[[maxlength]]\"></textarea>\n    </div>\n`,\n\n  is: 'iron-autogrow-textarea',\n  behaviors: [IronValidatableBehavior, IronControlState],\n\n  properties: {\n    /**\n     * Use this property instead of `bind-value` for two-way data binding.\n     * @type {string|number}\n     */\n    value: {observer: '_valueChanged', type: String, notify: true},\n\n    /**\n     * This property is deprecated, and just mirrors `value`. Use `value`\n     * instead.\n     * @type {string|number}\n     */\n    bindValue: {observer: '_bindValueChanged', type: String, notify: true},\n\n    /**\n     * The initial number of rows.\n     *\n     * @attribute rows\n     * @type number\n     * @default 1\n     */\n    rows: {type: Number, value: 1, observer: '_updateCached'},\n\n    /**\n     * The maximum number of rows this element can grow to until it\n     * scrolls. 0 means no maximum.\n     *\n     * @attribute maxRows\n     * @type number\n     * @default 0\n     */\n    maxRows: {type: Number, value: 0, observer: '_updateCached'},\n\n    /**\n     * Bound to the textarea's `autocomplete` attribute.\n     */\n    autocomplete: {type: String, value: 'off'},\n\n    /**\n     * Bound to the textarea's `autofocus` attribute.\n     *\n     * @type {!boolean}\n     */\n    autofocus: {type: Boolean, value: false},\n\n    /**\n     * Bound to the textarea's `autocapitalize` attribute.\n     */\n    autocapitalize: {type: String, value: 'none'},\n\n    /**\n     * Bound to the textarea's `inputmode` attribute.\n     */\n    inputmode: {type: String},\n\n    /**\n     * Bound to the textarea's `placeholder` attribute.\n     */\n    placeholder: {type: String},\n\n    /**\n     * Bound to the textarea's `readonly` attribute.\n     */\n    readonly: {type: String},\n\n    /**\n     * Set to true to mark the textarea as required.\n     */\n    required: {type: Boolean},\n\n    /**\n     * The minimum length of the input value.\n     */\n    minlength: {type: Number},\n\n    /**\n     * The maximum length of the input value.\n     */\n    maxlength: {type: Number},\n\n    /**\n     * Bound to the textarea's `aria-label` attribute.\n     */\n    label: {type: String}\n\n  },\n\n  listeners: {'input': '_onInput'},\n\n  /**\n   * Returns the underlying textarea.\n   * @return {!HTMLTextAreaElement}\n   */\n  get textarea() {\n    return /** @type {!HTMLTextAreaElement} */ (this.$.textarea);\n  },\n\n  /**\n   * Returns textarea's selection start.\n   * @return {number}\n   */\n  get selectionStart() {\n    return this.$.textarea.selectionStart;\n  },\n\n  /**\n   * Returns textarea's selection end.\n   * @return {number}\n   */\n  get selectionEnd() {\n    return this.$.textarea.selectionEnd;\n  },\n\n  /**\n   * Sets the textarea's selection start.\n   */\n  set selectionStart(value) {\n    this.$.textarea.selectionStart = value;\n  },\n\n  /**\n   * Sets the textarea's selection end.\n   */\n  set selectionEnd(value) {\n    this.$.textarea.selectionEnd = value;\n  },\n\n  /** @override */\n  attached: function() {\n    /* iOS has an arbitrary left margin of 3px that isn't present\n     * in any other browser, and means that the paper-textarea's cursor\n     * overlaps the label.\n     * See https://github.com/PolymerElements/paper-input/issues/468.\n     */\n    var IS_IOS = navigator.userAgent.match(/iP(?:[oa]d|hone)/) &&\n        !navigator.userAgent.match(/OS 1[3456789]/);\n    if (IS_IOS) {\n      this.$.textarea.style.marginLeft = '-3px';\n    }\n  },\n\n  /**\n   * Returns true if `value` is valid. The validator provided in `validator`\n   * will be used first, if it exists; otherwise, the `textarea`'s validity\n   * is used.\n   * @return {boolean} True if the value is valid.\n   */\n  validate: function() {\n    // Use the nested input's native validity.\n    var valid = this.$.textarea.validity.valid;\n\n    // Only do extra checking if the browser thought this was valid.\n    if (valid) {\n      // Empty, required input is invalid\n      if (this.required && this.value === '') {\n        valid = false;\n      } else if (this.hasValidator()) {\n        valid = IronValidatableBehavior.validate.call(this, this.value);\n      }\n    }\n\n    this.invalid = !valid;\n    this.fire('iron-input-validate');\n    return valid;\n  },\n\n  _bindValueChanged: function(bindValue) {\n    this.value = bindValue;\n  },\n\n  _valueChanged: function(value) {\n    var textarea = this.textarea;\n    if (!textarea) {\n      return;\n    }\n\n    // If the bindValue changed manually, then we need to also update\n    // the underlying textarea's value. Otherwise this change was probably\n    // generated from the _onInput handler, and the two values are already\n    // the same.\n    if (textarea.value !== value) {\n      textarea.value = !(value || value === 0) ? '' : value;\n    }\n\n    this.bindValue = value;\n    this.$.mirror.innerHTML = this._valueForMirror();\n\n    // Manually notify because we don't want to notify until after setting\n    // value.\n    this.fire('bind-value-changed', {value: this.bindValue});\n  },\n\n  _onInput: function(event) {\n    var eventPath = dom(event).path;\n    this.value = eventPath ? eventPath[0].value : event.target.value;\n  },\n\n  _constrain: function(tokens) {\n    var _tokens;\n    tokens = tokens || [''];\n    // Enforce the min and max heights for a multiline input to avoid\n    // measurement\n    if (this.maxRows > 0 && tokens.length > this.maxRows) {\n      _tokens = tokens.slice(0, this.maxRows);\n    } else {\n      _tokens = tokens.slice(0);\n    }\n    while (this.rows > 0 && _tokens.length < this.rows) {\n      _tokens.push('');\n    }\n    // Use &#160; instead &nbsp; of to allow this element to be used in XHTML.\n    return _tokens.join('<br/>') + '&#160;';\n  },\n\n  _valueForMirror: function() {\n    var input = this.textarea;\n    if (!input) {\n      return;\n    }\n    this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&amp;')\n                                               .replace(/\"/gm, '&quot;')\n                                               .replace(/'/gm, '&#39;')\n                                               .replace(/</gm, '&lt;')\n                                               .replace(/>/gm, '&gt;')\n                                               .split('\\n') :\n                                           [''];\n    return this._constrain(this.tokens);\n  },\n\n  _updateCached: function() {\n    this.$.mirror.innerHTML = this._constrain(this.tokens);\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-autogrow-textarea/iron-autogrow-textarea.js';\nimport './paper-input-char-counter.js';\nimport './paper-input-container.js';\nimport './paper-input-error.js';\n\nimport {IronFormElementBehavior} from '@polymer/iron-form-element-behavior/iron-form-element-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperInputBehavior} from './paper-input-behavior.js';\n\n/*\n`<paper-textarea>` is a multi-line text field with Material Design styling.\n\n    <paper-textarea label=\"Textarea label\"></paper-textarea>\n\nSee `Polymer.PaperInputBehavior` for more API docs.\n\n### Validation\n\nCurrently only `required` and `maxlength` validation is supported.\n\n### Styling\n\nSee `Polymer.PaperInputContainer` for a list of custom properties used to\nstyle this element.\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: block;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n\n      label {\n        pointer-events: none;\n      }\n    </style>\n\n    <paper-input-container no-label-float$=\"[[noLabelFloat]]\" always-float-label=\"[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]\" auto-validate$=\"[[autoValidate]]\" disabled$=\"[[disabled]]\" invalid=\"[[invalid]]\">\n\n      <label hidden$=\"[[!label]]\" aria-hidden=\"true\" for$=\"[[_inputId]]\" slot=\"label\">[[label]]</label>\n\n      <iron-autogrow-textarea class=\"paper-input-input\" slot=\"input\" id$=\"[[_inputId]]\" aria-labelledby$=\"[[_ariaLabelledBy]]\" aria-describedby$=\"[[_ariaDescribedBy]]\" bind-value=\"{{value}}\" invalid=\"{{invalid}}\" validator$=\"[[validator]]\" disabled$=\"[[disabled]]\" autocomplete$=\"[[autocomplete]]\" autofocus$=\"[[autofocus]]\" inputmode$=\"[[inputmode]]\" name$=\"[[name]]\" placeholder$=\"[[placeholder]]\" readonly$=\"[[readonly]]\" required$=\"[[required]]\" minlength$=\"[[minlength]]\" maxlength$=\"[[maxlength]]\" autocapitalize$=\"[[autocapitalize]]\" rows$=\"[[rows]]\" max-rows$=\"[[maxRows]]\" on-change=\"_onChange\"></iron-autogrow-textarea>\n\n      <template is=\"dom-if\" if=\"[[errorMessage]]\">\n        <paper-input-error aria-live=\"assertive\" slot=\"add-on\">[[errorMessage]]</paper-input-error>\n      </template>\n\n      <template is=\"dom-if\" if=\"[[charCounter]]\">\n        <paper-input-char-counter slot=\"add-on\"></paper-input-char-counter>\n      </template>\n\n    </paper-input-container>\n`,\n\n  is: 'paper-textarea',\n\n  behaviors: [\n    PaperInputBehavior,\n    IronFormElementBehavior,\n  ],\n\n  properties: {\n    _ariaLabelledBy: {\n      observer: '_ariaLabelledByChanged',\n      type: String,\n    },\n\n    _ariaDescribedBy: {\n      observer: '_ariaDescribedByChanged',\n      type: String,\n    },\n\n    value: {\n      // Required for the correct TypeScript type-generation\n      type: String,\n    },\n\n    /**\n     * The initial number of rows.\n     * @type {number}\n     * @default 1\n     */\n    rows: {\n      type: Number,\n      value: 1,\n    },\n\n    /**\n     * The maximum number of rows this element can grow to until it\n     * scrolls. 0 means no maximum.\n     * @type {number}\n     * @default 0\n     */\n    maxRows: {\n      type: Number,\n      value: 0,\n    },\n  },\n\n  /**\n   * @return {number}\n   */\n  get selectionStart() {\n    return this.$.input.textarea.selectionStart;\n  },\n\n  set selectionStart(start) {\n    this.$.input.textarea.selectionStart = start;\n  },\n\n  /**\n   * @return {number}\n   */\n  get selectionEnd() {\n    return this.$.input.textarea.selectionEnd;\n  },\n\n  set selectionEnd(end) {\n    this.$.input.textarea.selectionEnd = end;\n  },\n\n  _ariaLabelledByChanged: function(ariaLabelledBy) {\n    this._focusableElement.setAttribute('aria-labelledby', ariaLabelledBy);\n  },\n\n  _ariaDescribedByChanged: function(ariaDescribedBy) {\n    this._focusableElement.setAttribute('aria-describedby', ariaDescribedBy);\n  },\n\n  get _focusableElement() {\n    return this.inputElement.textarea;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronButtonState} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\n\n/*\n`PaperItemBehavior` is a convenience behavior shared by <paper-item> and\n<paper-icon-item> that manages the shared control states and attributes of\nthe items.\n*/\n/** @polymerBehavior PaperItemBehavior */\nexport const PaperItemBehaviorImpl = {\n  hostAttributes: {role: 'option', tabindex: '0'}\n};\n\n/** @polymerBehavior */\nexport const PaperItemBehavior =\n    [IronButtonState, IronControlState, PaperItemBehaviorImpl];\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/typography.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/*\nUse `<paper-item-body>` in a `<paper-item>` or `<paper-icon-item>` to make two-\nor three- line items. It is a flex item that is a vertical flexbox.\n\n    <paper-item>\n      <paper-item-body two-line>\n        <div>Show your status</div>\n        <div secondary>Your status is visible to everyone</div>\n      </paper-item-body>\n    </paper-item>\n\nThe child elements with the `secondary` attribute is given secondary text\nstyling.\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px`\n`--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px`\n`--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color`\n`--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}`\n\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        overflow: hidden; /* needed for text-overflow: ellipsis to work on ff */\n        @apply --layout-vertical;\n        @apply --layout-center-justified;\n        @apply --layout-flex;\n      }\n\n      :host([two-line]) {\n        min-height: var(--paper-item-body-two-line-min-height, 72px);\n      }\n\n      :host([three-line]) {\n        min-height: var(--paper-item-body-three-line-min-height, 88px);\n      }\n\n      :host > ::slotted(*) {\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n\n      :host > ::slotted([secondary]) {\n        @apply --paper-font-body1;\n\n        color: var(--paper-item-body-secondary-color, var(--secondary-text-color));\n\n        @apply --paper-item-body-secondary;\n      }\n    </style>\n\n    <slot></slot>\n`,\n\n  is: 'paper-item-body'\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/color.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/typography.js';\nconst $_documentContainer = document.createElement('template');\n$_documentContainer.setAttribute('style', 'display: none;');\n\n$_documentContainer.innerHTML = `<dom-module id=\"paper-item-shared-styles\">\n  <template>\n    <style>\n      :host, .paper-item {\n        display: block;\n        position: relative;\n        min-height: var(--paper-item-min-height, 48px);\n        padding: 0px 16px;\n      }\n\n      .paper-item {\n        @apply --paper-font-subhead;\n        border:none;\n        outline: none;\n        background: white;\n        width: 100%;\n        text-align: left;\n      }\n\n      :host([hidden]), .paper-item[hidden] {\n        display: none !important;\n      }\n\n      :host(.iron-selected), .paper-item.iron-selected {\n        font-weight: var(--paper-item-selected-weight, bold);\n\n        @apply --paper-item-selected;\n      }\n\n      :host([disabled]), .paper-item[disabled] {\n        color: var(--paper-item-disabled-color, var(--disabled-text-color));\n\n        @apply --paper-item-disabled;\n      }\n\n      :host(:focus), .paper-item:focus {\n        position: relative;\n        outline: 0;\n\n        @apply --paper-item-focused;\n      }\n\n      :host(:focus):before, .paper-item:focus:before {\n        @apply --layout-fit;\n\n        background: currentColor;\n        content: '';\n        opacity: var(--dark-divider-opacity);\n        pointer-events: none;\n\n        @apply --paper-item-focused-before;\n      }\n    </style>\n  </template>\n</dom-module>`;\n\ndocument.head.appendChild($_documentContainer.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport './paper-item-shared-styles.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperItemBehavior} from './paper-item-behavior.js';\n\n/**\nMaterial design:\n[Lists](https://www.google.com/design/spec/components/lists.html)\n\n`<paper-item>` is an interactive list item. By default, it is a horizontal\nflexbox.\n\n    <paper-item>Item</paper-item>\n\nUse this element with `<paper-item-body>` to make Material Design styled\ntwo-line and three-line items.\n\n    <paper-item>\n      <paper-item-body two-line>\n        <div>Show your status</div>\n        <div secondary>Your status is visible to everyone</div>\n      </paper-item-body>\n      <iron-icon icon=\"warning\"></iron-icon>\n    </paper-item>\n\nTo use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will\nalready receive focus, you may want to prevent the anchor tag from receiving\nfocus as well by setting its tabindex to -1.\n\n    <a href=\"https://www.polymer-project.org/\" tabindex=\"-1\">\n      <paper-item raised>Polymer Project</paper-item>\n    </a>\n\nIf you are concerned about performance and want to use `paper-item` in a\n`paper-listbox` with many items, you can just use a native `button` with the\n`paper-item` class applied (provided you have correctly included the shared\nstyles):\n\n    <style is=\"custom-style\" include=\"paper-item-shared-styles\"></style>\n\n    <paper-listbox>\n      <button class=\"paper-item\" role=\"option\">Inbox</button>\n      <button class=\"paper-item\" role=\"option\">Starred</button>\n      <button class=\"paper-item\" role=\"option\">Sent mail</button>\n    </paper-listbox>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-item-min-height` | Minimum height of the item | `48px`\n`--paper-item` | Mixin applied to the item | `{}`\n`--paper-item-selected-weight` | The font weight of a selected item | `bold`\n`--paper-item-selected` | Mixin applied to selected paper-items | `{}`\n`--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color`\n`--paper-item-disabled` | Mixin applied to disabled paper-items | `{}`\n`--paper-item-focused` | Mixin applied to focused paper-items | `{}`\n`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`\n\n### Accessibility\n\nThis element has `role=\"listitem\"` by default. Depending on usage, it may be\nmore appropriate to set `role=\"menuitem\"`, `role=\"menuitemcheckbox\"` or\n`role=\"menuitemradio\"`.\n\n    <paper-item role=\"menuitemcheckbox\">\n      <paper-item-body>\n        Show your status\n      </paper-item-body>\n      <paper-checkbox></paper-checkbox>\n    </paper-item>\n\n@group Paper Elements\n@element paper-item\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style include=\"paper-item-shared-styles\">\n      :host {\n        @apply --layout-horizontal;\n        @apply --layout-center;\n        @apply --paper-font-subhead;\n\n        @apply --paper-item;\n      }\n    </style>\n    <slot></slot>\n`,\n\n  is: 'paper-item',\n  behaviors: [PaperItemBehavior]\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {IronMenuBehavior} from '@polymer/iron-menu-behavior/iron-menu-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design:\n[Menus](https://www.google.com/design/spec/components/menus.html)\n\n`<paper-listbox>` implements an accessible listbox control with Material Design\nstyling. The focused item is highlighted, and the selected item has bolded text.\n\n    <paper-listbox>\n      <paper-item>Item 1</paper-item>\n      <paper-item>Item 2</paper-item>\n    </paper-listbox>\n\nAn initial selection can be specified with the `selected` attribute.\n\n    <paper-listbox selected=\"0\">\n      <paper-item>Item 1</paper-item>\n      <paper-item>Item 2</paper-item>\n    </paper-listbox>\n\nMake a multi-select listbox with the `multi` attribute. Items in a multi-select\nlistbox can be deselected, and multiple item can be selected.\n\n    <paper-listbox multi>\n      <paper-item>Item 1</paper-item>\n      <paper-item>Item 2</paper-item>\n    </paper-listbox>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-listbox-background-color`   | Menu background color |\n`--primary-background-color`\n`--paper-listbox-color`              | Menu foreground color |\n`--primary-text-color`\n`--paper-listbox`                    | Mixin applied to the listbox | `{}`\n\n### Accessibility\n\n`<paper-listbox>` has `role=\"listbox\"` by default. A multi-select listbox will\nalso have `aria-multiselectable` set. It implements key bindings to navigate\nthrough the listbox with the up and down arrow keys, esc to exit the listbox,\nand enter to activate a listbox item. Typing the first letter of a listbox item\nwill also focus it.\n\n@group Paper Elements\n@element paper-listbox\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        padding: 8px 0;\n\n        background: var(--paper-listbox-background-color, var(--primary-background-color));\n        color: var(--paper-listbox-color, var(--primary-text-color));\n\n        @apply --paper-listbox;\n      }\n    </style>\n\n    <slot></slot>\n`,\n\n  is: 'paper-listbox',\n  behaviors: [IronMenuBehavior],\n\n  /** @private */\n  hostAttributes: {role: 'listbox'}\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {IronOverlayBehavior, IronOverlayBehaviorImpl} from '@polymer/iron-overlay-behavior/iron-overlay-behavior.js';\nimport {NeonAnimationRunnerBehavior} from '@polymer/neon-animation/neon-animation-runner-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n`<iron-dropdown>` is a generalized element that is useful when you have\nhidden content (`dropdown-content`) that is revealed due to some change in\nstate that should cause it to do so.\n\nNote that this is a low-level element intended to be used as part of other\ncomposite elements that cause dropdowns to be revealed.\n\nExamples of elements that might be implemented using an `iron-dropdown`\ninclude comboboxes, menubuttons, selects. The list goes on.\n\nThe `<iron-dropdown>` element exposes attributes that allow the position\nof the `dropdown-content` relative to the `dropdown-trigger` to be\nconfigured.\n\n    <iron-dropdown horizontal-align=\"right\" vertical-align=\"top\">\n      <div slot=\"dropdown-content\">Hello!</div>\n    </iron-dropdown>\n\nIn the above example, the `<div>` assigned to the `dropdown-content` slot will\nbe hidden until the dropdown element has `opened` set to true, or when the\n`open` method is called on the element.\n\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        position: fixed;\n      }\n\n      #contentWrapper ::slotted(*) {\n        overflow: auto;\n      }\n\n      #contentWrapper.animating ::slotted(*) {\n        overflow: hidden;\n        pointer-events: none;\n      }\n    </style>\n\n    <div id=\"contentWrapper\">\n      <slot id=\"content\" name=\"dropdown-content\"></slot>\n    </div>\n`,\n\n  is: 'iron-dropdown',\n\n  behaviors: [\n    IronControlState,\n    IronA11yKeysBehavior,\n    IronOverlayBehavior,\n    NeonAnimationRunnerBehavior\n  ],\n\n  properties: {\n    /**\n     * The orientation against which to align the dropdown content\n     * horizontally relative to the dropdown trigger.\n     * Overridden from `Polymer.IronFitBehavior`.\n     */\n    horizontalAlign: {type: String, value: 'left', reflectToAttribute: true},\n\n    /**\n     * The orientation against which to align the dropdown content\n     * vertically relative to the dropdown trigger.\n     * Overridden from `Polymer.IronFitBehavior`.\n     */\n    verticalAlign: {type: String, value: 'top', reflectToAttribute: true},\n\n    /**\n     * An animation config. If provided, this will be used to animate the\n     * opening of the dropdown. Pass an Array for multiple animations.\n     * See `neon-animation` documentation for more animation configuration\n     * details.\n     */\n    openAnimationConfig: {type: Object},\n\n    /**\n     * An animation config. If provided, this will be used to animate the\n     * closing of the dropdown. Pass an Array for multiple animations.\n     * See `neon-animation` documentation for more animation configuration\n     * details.\n     */\n    closeAnimationConfig: {type: Object},\n\n    /**\n     * If provided, this will be the element that will be focused when\n     * the dropdown opens.\n     */\n    focusTarget: {type: Object},\n\n    /**\n     * Set to true to disable animations when opening and closing the\n     * dropdown.\n     */\n    noAnimations: {type: Boolean, value: false},\n\n    /**\n     * By default, the dropdown will constrain scrolling on the page\n     * to itself when opened.\n     * Set to true in order to prevent scroll from being constrained\n     * to the dropdown when it opens.\n     * This property is a shortcut to set `scrollAction` to lock or refit.\n     * Prefer directly setting the `scrollAction` property.\n     */\n    allowOutsideScroll:\n        {type: Boolean, value: false, observer: '_allowOutsideScrollChanged'}\n  },\n\n  listeners: {'neon-animation-finish': '_onNeonAnimationFinish'},\n\n  observers: [\n    '_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)'\n  ],\n\n  /**\n   * The element that is contained by the dropdown, if any.\n   */\n  get containedElement() {\n    // Polymer 2.x returns slot.assignedNodes which can contain text nodes.\n    var nodes = dom(this.$.content).getDistributedNodes();\n    for (var i = 0, l = nodes.length; i < l; i++) {\n      if (nodes[i].nodeType === Node.ELEMENT_NODE) {\n        return nodes[i];\n      }\n    }\n  },\n\n  ready: function() {\n    // Ensure scrollAction is set.\n    if (!this.scrollAction) {\n      this.scrollAction = this.allowOutsideScroll ? 'refit' : 'lock';\n    }\n    this._readied = true;\n  },\n\n  attached: function() {\n    if (!this.sizingTarget || this.sizingTarget === this) {\n      this.sizingTarget = this.containedElement || this;\n    }\n  },\n\n  detached: function() {\n    this.cancelAnimation();\n  },\n\n  /**\n   * Called when the value of `opened` changes.\n   * Overridden from `IronOverlayBehavior`\n   */\n  _openedChanged: function() {\n    if (this.opened && this.disabled) {\n      this.cancel();\n    } else {\n      this.cancelAnimation();\n      this._updateAnimationConfig();\n      IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);\n    }\n  },\n\n  /**\n   * Overridden from `IronOverlayBehavior`.\n   */\n  _renderOpened: function() {\n    if (!this.noAnimations && this.animationConfig.open) {\n      this.$.contentWrapper.classList.add('animating');\n      this.playAnimation('open');\n    } else {\n      IronOverlayBehaviorImpl._renderOpened.apply(this, arguments);\n    }\n  },\n\n  /**\n   * Overridden from `IronOverlayBehavior`.\n   */\n  _renderClosed: function() {\n    if (!this.noAnimations && this.animationConfig.close) {\n      this.$.contentWrapper.classList.add('animating');\n      this.playAnimation('close');\n    } else {\n      IronOverlayBehaviorImpl._renderClosed.apply(this, arguments);\n    }\n  },\n\n  /**\n   * Called when animation finishes on the dropdown (when opening or\n   * closing). Responsible for \"completing\" the process of opening or\n   * closing the dropdown by positioning it or setting its display to\n   * none.\n   */\n  _onNeonAnimationFinish: function() {\n    this.$.contentWrapper.classList.remove('animating');\n    if (this.opened) {\n      this._finishRenderOpened();\n    } else {\n      this._finishRenderClosed();\n    }\n  },\n\n  /**\n   * Constructs the final animation config from different properties used\n   * to configure specific parts of the opening and closing animations.\n   */\n  _updateAnimationConfig: function() {\n    // Update the animation node to be the containedElement.\n    var animationNode = this.containedElement;\n    var animations = [].concat(this.openAnimationConfig || [])\n                         .concat(this.closeAnimationConfig || []);\n    for (var i = 0; i < animations.length; i++) {\n      animations[i].node = animationNode;\n    }\n    this.animationConfig = {\n      open: this.openAnimationConfig,\n      close: this.closeAnimationConfig\n    };\n  },\n\n  /**\n   * Updates the overlay position based on configured horizontal\n   * and vertical alignment.\n   */\n  _updateOverlayPosition: function() {\n    if (this.isAttached) {\n      // This triggers iron-resize, and iron-overlay-behavior will call refit if\n      // needed.\n      this.notifyResize();\n    }\n  },\n\n  /**\n   * Sets scrollAction according to the value of allowOutsideScroll.\n   * Prefer setting directly scrollAction.\n   */\n  _allowOutsideScrollChanged: function(allowOutsideScroll) {\n    // Wait until initial values are all set.\n    if (!this._readied) {\n      return;\n    }\n    if (!allowOutsideScroll) {\n      this.scrollAction = 'lock';\n    } else if (!this.scrollAction || this.scrollAction === 'lock') {\n      this.scrollAction = 'refit';\n    }\n  },\n\n  /**\n   * Apply focus to focusTarget or containedElement\n   */\n  _applyFocus: function() {\n    var focusTarget = this.focusTarget || this.containedElement;\n    if (focusTarget && this.opened && !this.noAutoFocus) {\n      focusTarget.focus();\n    } else {\n      IronOverlayBehaviorImpl._applyFocus.apply(this, arguments);\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/**\n * Use `NeonAnimationBehavior` to implement an animation.\n * @polymerBehavior\n */\nexport const NeonAnimationBehavior = {\n\n  properties: {\n\n    /**\n     * Defines the animation timing.\n     */\n    animationTiming: {\n      type: Object,\n      value: function() {\n        return {\n          duration: 500, easing: 'cubic-bezier(0.4, 0, 0.2, 1)', fill: 'both'\n        }\n      }\n    }\n\n  },\n\n  /**\n   * Can be used to determine that elements implement this behavior.\n   */\n  isNeonAnimation: true,\n\n  /**\n   * Do any animation configuration here.\n   */\n  // configure: function(config) {\n  // },\n\n  created: function() {\n    if (!document.body.animate) {\n      console.warn(\n          'No web animations detected. This element will not' +\n          ' function without a web animations polyfill.');\n    }\n  },\n\n  /**\n   * Returns the animation timing by mixing in properties from `config` to the\n   * defaults defined by the animation.\n   */\n  timingFromConfig: function(config) {\n    if (config.timing) {\n      for (var property in config.timing) {\n        this.animationTiming[property] = config.timing[property];\n      }\n    }\n    return this.animationTiming;\n  },\n\n  /**\n   * Sets `transform` and `transformOrigin` properties along with the prefixed\n   * versions.\n   */\n  setPrefixedProperty: function(node, property, value) {\n    var map = {\n      'transform': ['webkitTransform'],\n      'transformOrigin': ['mozTransformOrigin', 'webkitTransformOrigin']\n    };\n    var prefixes = map[property];\n    for (var prefix, index = 0; prefix = prefixes[index]; index++) {\n      node.style[prefix] = value;\n    }\n    node.style[property] = value;\n  },\n\n  /**\n   * Called when the animation finishes.\n   */\n  complete: function(config) {}\n\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {NeonAnimationBehavior} from '../neon-animation-behavior.js';\n/*\n`<fade-in-animation>` animates the opacity of an element from 0 to 1.\n\nConfiguration:\n```\n{\n  name: 'fade-in-animation',\n  node: <node>\n  timing: <animation-timing>\n}\n```\n*/\nPolymer({\n\n  is: 'fade-in-animation',\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    this._effect = new KeyframeEffect(\n        node,\n        [{'opacity': '0'}, {'opacity': '1'}],\n        this.timingFromConfig(config));\n    return this._effect;\n  }\n\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {NeonAnimationBehavior} from '../neon-animation-behavior.js';\n/*\n`<fade-out-animation>` animates the opacity of an element from 1 to 0.\n\nConfiguration:\n```\n{\n  name: 'fade-out-animation',\n  node: <node>\n  timing: <animation-timing>\n}\n```\n*/\nPolymer({\n\n  is: 'fade-out-animation',\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    this._effect = new KeyframeEffect(\n        node,\n        [\n          {'opacity': '1'},\n          {'opacity': '0'},\n        ],\n        this.timingFromConfig(config));\n    return this._effect;\n  }\n\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {NeonAnimationBehavior} from '@polymer/neon-animation/neon-animation-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nPolymer({\n  is: 'paper-menu-grow-height-animation',\n  /** @override */\n  _template: null,\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    var rect = node.getBoundingClientRect();\n    var height = rect.height;\n\n    this._effect = new KeyframeEffect(\n        node,\n        [{height: (height / 2) + 'px'}, {height: height + 'px'}],\n        this.timingFromConfig(config));\n\n    return this._effect;\n  }\n});\n\nPolymer({\n  is: 'paper-menu-grow-width-animation',\n  /** @override */\n  _template: null,\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    var rect = node.getBoundingClientRect();\n    var width = rect.width;\n\n    this._effect = new KeyframeEffect(\n        node,\n        [{width: (width / 2) + 'px'}, {width: width + 'px'}],\n        this.timingFromConfig(config));\n\n    return this._effect;\n  }\n});\n\nPolymer({\n  is: 'paper-menu-shrink-width-animation',\n  /** @override */\n  _template: null,\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    var rect = node.getBoundingClientRect();\n    var width = rect.width;\n\n    this._effect = new KeyframeEffect(\n        node,\n        [{width: width + 'px'}, {width: width - (width / 20) + 'px'}],\n        this.timingFromConfig(config));\n\n    return this._effect;\n  }\n});\n\nPolymer({\n  is: 'paper-menu-shrink-height-animation',\n  /** @override */\n  _template: null,\n\n  behaviors: [NeonAnimationBehavior],\n\n  configure: function(config) {\n    var node = config.node;\n    var rect = node.getBoundingClientRect();\n    var height = rect.height;\n\n    this.setPrefixedProperty(node, 'transformOrigin', '0 0');\n\n    this._effect = new KeyframeEffect(\n        node,\n        [\n          {height: height + 'px', transform: 'translateY(0)'},\n          {height: height / 2 + 'px', transform: 'translateY(-20px)'}\n        ],\n        this.timingFromConfig(config));\n\n    return this._effect;\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-dropdown/iron-dropdown.js';\nimport '@polymer/neon-animation/animations/fade-in-animation.js';\nimport '@polymer/neon-animation/animations/fade-out-animation.js';\nimport '@polymer/paper-styles/default-theme.js';\nimport '@polymer/paper-styles/shadow.js';\nimport './paper-menu-button-animations.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nvar config = {\n  ANIMATION_CUBIC_BEZIER: 'cubic-bezier(.3,.95,.5,1)',\n  MAX_ANIMATION_TIME_MS: 400\n};\n\n/**\nMaterial design: [Dropdown\nbuttons](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)\n\n`paper-menu-button` allows one to compose a designated \"trigger\" element with\nanother element that represents \"content\", to create a dropdown menu that\ndisplays the \"content\" when the \"trigger\" is clicked.\n\nThe child element assigned to the `dropdown-trigger` slot will be used as the\n\"trigger\" element. The child element assigned to the `dropdown-content` slot\nwill be used as the \"content\" element.\n\nThe `paper-menu-button` is sensitive to its content's `iron-select` events. If\nthe \"content\" element triggers an `iron-select` event, the `paper-menu-button`\nwill close automatically.\n\nExample:\n\n    <paper-menu-button>\n      <paper-icon-button icon=\"menu\"\nslot=\"dropdown-trigger\"></paper-icon-button> <paper-listbox\nslot=\"dropdown-content\"> <paper-item>Share</paper-item>\n        <paper-item>Settings</paper-item>\n        <paper-item>Help</paper-item>\n      </paper-listbox>\n    </paper-menu-button>\n\n### Styling\n\nThe following custom properties and mixins are also available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-menu-button-dropdown-background` | Background color of the paper-menu-button dropdown | `--primary-background-color`\n`--paper-menu-button` | Mixin applied to the paper-menu-button | `{}`\n`--paper-menu-button-disabled` | Mixin applied to the paper-menu-button when disabled | `{}`\n`--paper-menu-button-dropdown` | Mixin applied to the paper-menu-button dropdown | `{}`\n`--paper-menu-button-content` | Mixin applied to the paper-menu-button content | `{}`\n\n@demo demo/index.html\n*/\nexport const PaperMenuButton = Polymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: inline-block;\n        position: relative;\n        padding: 8px;\n        outline: none;\n\n        @apply --paper-menu-button;\n      }\n\n      :host([disabled]) {\n        cursor: auto;\n        color: var(--disabled-text-color);\n\n        @apply --paper-menu-button-disabled;\n      }\n\n      iron-dropdown {\n        @apply --paper-menu-button-dropdown;\n      }\n\n      .dropdown-content {\n        @apply --shadow-elevation-2dp;\n\n        position: relative;\n        border-radius: 2px;\n        background-color: var(--paper-menu-button-dropdown-background, var(--primary-background-color));\n\n        @apply --paper-menu-button-content;\n      }\n\n      :host([vertical-align=\"top\"]) .dropdown-content {\n        margin-bottom: 20px;\n        margin-top: -10px;\n        top: 10px;\n      }\n\n      :host([vertical-align=\"bottom\"]) .dropdown-content {\n        bottom: 10px;\n        margin-bottom: -10px;\n        margin-top: 20px;\n      }\n\n      #trigger {\n        cursor: pointer;\n      }\n    </style>\n\n    <div id=\"trigger\" on-tap=\"toggle\">\n      <slot name=\"dropdown-trigger\"></slot>\n    </div>\n\n    <iron-dropdown id=\"dropdown\" opened=\"{{opened}}\" horizontal-align=\"[[horizontalAlign]]\" vertical-align=\"[[verticalAlign]]\" dynamic-align=\"[[dynamicAlign]]\" horizontal-offset=\"[[horizontalOffset]]\" vertical-offset=\"[[verticalOffset]]\" no-overlap=\"[[noOverlap]]\" open-animation-config=\"[[openAnimationConfig]]\" close-animation-config=\"[[closeAnimationConfig]]\" no-animations=\"[[noAnimations]]\" focus-target=\"[[_dropdownContent]]\" allow-outside-scroll=\"[[allowOutsideScroll]]\" restore-focus-on-close=\"[[restoreFocusOnClose]]\" on-iron-overlay-canceled=\"__onIronOverlayCanceled\" expand-sizing-target-for-scrollbars=\"[[expandSizingTargetForScrollbars]]\">\n      <div slot=\"dropdown-content\" class=\"dropdown-content\">\n        <slot id=\"content\" name=\"dropdown-content\"></slot>\n      </div>\n    </iron-dropdown>\n`,\n\n  is: 'paper-menu-button',\n\n  /**\n   * Fired when the dropdown opens.\n   *\n   * @event paper-dropdown-open\n   */\n\n  /**\n   * Fired when the dropdown closes.\n   *\n   * @event paper-dropdown-close\n   */\n\n  behaviors: [IronA11yKeysBehavior, IronControlState],\n\n  properties: {\n    /**\n     * True if the content is currently displayed.\n     */\n    opened:\n        {type: Boolean, value: false, notify: true, observer: '_openedChanged'},\n\n    /**\n     * The orientation against which to align the menu dropdown\n     * horizontally relative to the dropdown trigger.\n     */\n    horizontalAlign: {type: String, value: 'left', reflectToAttribute: true},\n\n    /**\n     * The orientation against which to align the menu dropdown\n     * vertically relative to the dropdown trigger.\n     */\n    verticalAlign: {type: String, value: 'top', reflectToAttribute: true},\n\n    /**\n     * If true, the `horizontalAlign` and `verticalAlign` properties will\n     * be considered preferences instead of strict requirements when\n     * positioning the dropdown and may be changed if doing so reduces\n     * the area of the dropdown falling outside of `fitInto`.\n     */\n    dynamicAlign: {type: Boolean},\n\n    /**\n     * A pixel value that will be added to the position calculated for the\n     * given `horizontalAlign`. Use a negative value to offset to the\n     * left, or a positive value to offset to the right.\n     */\n    horizontalOffset: {type: Number, value: 0, notify: true},\n\n    /**\n     * A pixel value that will be added to the position calculated for the\n     * given `verticalAlign`. Use a negative value to offset towards the\n     * top, or a positive value to offset towards the bottom.\n     */\n    verticalOffset: {type: Number, value: 0, notify: true},\n\n    /**\n     * If true, the dropdown will be positioned so that it doesn't overlap\n     * the button.\n     */\n    noOverlap: {type: Boolean},\n\n    /**\n     * Set to true to disable animations when opening and closing the\n     * dropdown.\n     */\n    noAnimations: {type: Boolean, value: false},\n\n    /**\n     * Set to true to disable automatically closing the dropdown after\n     * a selection has been made.\n     */\n    ignoreSelect: {type: Boolean, value: false},\n\n    /**\n     * Set to true to enable automatically closing the dropdown after an\n     * item has been activated, even if the selection did not change.\n     */\n    closeOnActivate: {type: Boolean, value: false},\n\n    /**\n     * An animation config. If provided, this will be used to animate the\n     * opening of the dropdown.\n     */\n    openAnimationConfig: {\n      type: Object,\n      value: function() {\n        return [\n          {name: 'fade-in-animation', timing: {delay: 100, duration: 200}},\n          {\n            name: 'paper-menu-grow-width-animation',\n            timing: {\n              delay: 100,\n              duration: 150,\n              easing: config.ANIMATION_CUBIC_BEZIER\n            }\n          },\n          {\n            name: 'paper-menu-grow-height-animation',\n            timing: {\n              delay: 100,\n              duration: 275,\n              easing: config.ANIMATION_CUBIC_BEZIER\n            }\n          }\n        ];\n      }\n    },\n\n    /**\n     * An animation config. If provided, this will be used to animate the\n     * closing of the dropdown.\n     */\n    closeAnimationConfig: {\n      type: Object,\n      value: function() {\n        return [\n          {name: 'fade-out-animation', timing: {duration: 150}},\n          {\n            name: 'paper-menu-shrink-width-animation',\n            timing: {\n              delay: 100,\n              duration: 50,\n              easing: config.ANIMATION_CUBIC_BEZIER\n            }\n          },\n          {\n            name: 'paper-menu-shrink-height-animation',\n            timing: {duration: 200, easing: 'ease-in'}\n          }\n        ];\n      }\n    },\n\n    /**\n     * By default, the dropdown will constrain scrolling on the page\n     * to itself when opened.\n     * Set to true in order to prevent scroll from being constrained\n     * to the dropdown when it opens.\n     */\n    allowOutsideScroll: {type: Boolean, value: false},\n\n    /**\n     * Whether focus should be restored to the button when the menu closes.\n     */\n    restoreFocusOnClose: {type: Boolean, value: true},\n\n    /**\n     * If true and scrollbars are added to the dropdown after it is positioned,\n     * the size of the added scrollbars will be added to its `maxWidth` and\n     * `maxHeight`.\n     */\n    expandSizingTargetForScrollbars: {type: Boolean, value: false},\n\n    /**\n     * This is the element intended to be bound as the focus target\n     * for the `iron-dropdown` contained by `paper-menu-button`.\n     */\n    _dropdownContent: {type: Object}\n  },\n\n  hostAttributes: {role: 'group', 'aria-haspopup': 'true'},\n\n  listeners:\n      {'iron-activate': '_onIronActivate', 'iron-select': '_onIronSelect'},\n\n  /**\n   * The content element that is contained by the menu button, if any.\n   */\n  get contentElement() {\n    // Polymer 2.x returns slot.assignedNodes which can contain text nodes.\n    var nodes = dom(this.$.content).getDistributedNodes();\n    for (var i = 0, l = nodes.length; i < l; i++) {\n      if (nodes[i].nodeType === Node.ELEMENT_NODE) {\n        return nodes[i];\n      }\n    }\n  },\n\n  /**\n   * Toggles the dropdown content between opened and closed.\n   */\n  toggle: function() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  },\n\n  /**\n   * Make the dropdown content appear as an overlay positioned relative\n   * to the dropdown trigger.\n   */\n  open: function() {\n    if (this.disabled) {\n      return;\n    }\n\n    this.$.dropdown.open();\n  },\n\n  /**\n   * Hide the dropdown content.\n   */\n  close: function() {\n    this.$.dropdown.close();\n  },\n\n  /**\n   * When an `iron-select` event is received, the dropdown should\n   * automatically close on the assumption that a value has been chosen.\n   *\n   * @param {CustomEvent} event A CustomEvent instance with type\n   * set to `\"iron-select\"`.\n   */\n  _onIronSelect: function(event) {\n    if (!this.ignoreSelect) {\n      this.close();\n    }\n  },\n\n  /**\n   * Closes the dropdown when an `iron-activate` event is received if\n   * `closeOnActivate` is true.\n   *\n   * @param {CustomEvent} event A CustomEvent of type 'iron-activate'.\n   */\n  _onIronActivate: function(event) {\n    if (this.closeOnActivate) {\n      this.close();\n    }\n  },\n\n  /**\n   * When the dropdown opens, the `paper-menu-button` fires `paper-open`.\n   * When the dropdown closes, the `paper-menu-button` fires `paper-close`.\n   *\n   * @param {boolean} opened True if the dropdown is opened, otherwise false.\n   * @param {boolean} oldOpened The previous value of `opened`.\n   */\n  _openedChanged: function(opened, oldOpened) {\n    if (opened) {\n      // TODO(cdata): Update this when we can measure changes in distributed\n      // children in an idiomatic way.\n      // We poke this property in case the element has changed. This will\n      // cause the focus target for the `iron-dropdown` to be updated as\n      // necessary:\n      this._dropdownContent = this.contentElement;\n      this.fire('paper-dropdown-open');\n    } else if (oldOpened != null) {\n      this.fire('paper-dropdown-close');\n    }\n  },\n\n  /**\n   * If the dropdown is open when disabled becomes true, close the\n   * dropdown.\n   *\n   * @param {boolean} disabled True if disabled, otherwise false.\n   */\n  _disabledChanged: function(disabled) {\n    IronControlState._disabledChanged.apply(this, arguments);\n    if (disabled && this.opened) {\n      this.close();\n    }\n  },\n\n  __onIronOverlayCanceled: function(event) {\n    var uiEvent = event.detail;\n    var trigger = this.$.trigger;\n    var path = dom(uiEvent).path;\n\n    if (path.indexOf(trigger) > -1) {\n      event.preventDefault();\n    }\n  }\n});\n\nObject.keys(config).forEach(function(key) {\n  PaperMenuButton[key] = config[key];\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/color.js';\n\nimport {IronRangeBehavior} from '@polymer/iron-range-behavior/iron-range-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design: [Progress &\nactivity](https://www.google.com/design/spec/components/progress-activity.html)\n\nThe progress bars are for situations where the percentage completed can be\ndetermined. They give users a quick sense of how much longer an operation\nwill take.\n\nExample:\n\n    <paper-progress value=\"10\"></paper-progress>\n\nThere is also a secondary progress which is useful for displaying intermediate\nprogress, such as the buffer level during a streaming playback progress bar.\n\nExample:\n\n    <paper-progress value=\"10\" secondary-progress=\"30\"></paper-progress>\n\n### Styling progress bar:\n\nTo change the active progress bar color:\n\n    paper-progress {\n       --paper-progress-active-color: #e91e63;\n    }\n\nTo change the secondary progress bar color:\n\n    paper-progress {\n      --paper-progress-secondary-color: #f8bbd0;\n    }\n\nTo change the progress bar background color:\n\n    paper-progress {\n      --paper-progress-container-color: #64ffda;\n    }\n\nAdd the class `transiting` to a paper-progress to animate the progress bar when\nthe value changed. You can also customize the transition:\n\n    paper-progress {\n      --paper-progress-transition-duration: 0.08s;\n      --paper-progress-transition-timing-function: ease;\n      --paper-progress-transition-delay: 0s;\n    }\n\nTo change the duration of the indeterminate cycle:\n\n    paper-progress {\n      --paper-progress-indeterminate-cycle-duration: 2s;\n    }\n\nThe following mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|---------\n`--paper-progress-container` | Mixin applied to container | `{}`\n`--paper-progress-transition-duration` | Duration of the transition | `0.08s`\n`--paper-progress-transition-timing-function` | The timing function for the transition | `ease`\n`--paper-progress-transition-delay` | delay for the transition | `0s`\n`--paper-progress-container-color` | Color of the container | `--google-grey-300`\n`--paper-progress-active-color` | The color of the active bar | `--google-green-500`\n`--paper-progress-secondary-color` | The color of the secondary bar | `--google-green-100`\n`--paper-progress-disabled-active-color` | The color of the active bar if disabled | `--google-grey-500`\n`--paper-progress-disabled-secondary-color` | The color of the secondary bar if disabled  | `--google-grey-300`\n`--paper-progress-height` | The height of the progress bar | `4px`\n`--paper-progress-indeterminate-cycle-duration` | Duration of an indeterminate cycle | `2s`\n\n@group Paper Elements\n@element paper-progress\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        width: 200px;\n        position: relative;\n        overflow: hidden;\n      }\n\n      :host([hidden]), [hidden] {\n        display: none !important;\n      }\n\n      #progressContainer {\n        @apply --paper-progress-container;\n        position: relative;\n      }\n\n      #progressContainer,\n      /* the stripe for the indeterminate animation*/\n      .indeterminate::after {\n        height: var(--paper-progress-height, 4px);\n      }\n\n      #primaryProgress,\n      #secondaryProgress,\n      .indeterminate::after {\n        @apply --layout-fit;\n      }\n\n      #progressContainer,\n      .indeterminate::after {\n        background: var(--paper-progress-container-color, var(--google-grey-300));\n      }\n\n      :host(.transiting) #primaryProgress,\n      :host(.transiting) #secondaryProgress {\n        -webkit-transition-property: -webkit-transform;\n        transition-property: transform;\n\n        /* Duration */\n        -webkit-transition-duration: var(--paper-progress-transition-duration, 0.08s);\n        transition-duration: var(--paper-progress-transition-duration, 0.08s);\n\n        /* Timing function */\n        -webkit-transition-timing-function: var(--paper-progress-transition-timing-function, ease);\n        transition-timing-function: var(--paper-progress-transition-timing-function, ease);\n\n        /* Delay */\n        -webkit-transition-delay: var(--paper-progress-transition-delay, 0s);\n        transition-delay: var(--paper-progress-transition-delay, 0s);\n      }\n\n      #primaryProgress,\n      #secondaryProgress {\n        @apply --layout-fit;\n        -webkit-transform-origin: left center;\n        transform-origin: left center;\n        -webkit-transform: scaleX(0);\n        transform: scaleX(0);\n        will-change: transform;\n      }\n\n      #primaryProgress {\n        background: var(--paper-progress-active-color, var(--google-green-500));\n      }\n\n      #secondaryProgress {\n        background: var(--paper-progress-secondary-color, var(--google-green-100));\n      }\n\n      :host([disabled]) #primaryProgress {\n        background: var(--paper-progress-disabled-active-color, var(--google-grey-500));\n      }\n\n      :host([disabled]) #secondaryProgress {\n        background: var(--paper-progress-disabled-secondary-color, var(--google-grey-300));\n      }\n\n      :host(:not([disabled])) #primaryProgress.indeterminate {\n        -webkit-transform-origin: right center;\n        transform-origin: right center;\n        -webkit-animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;\n        animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;\n      }\n\n      :host(:not([disabled])) #primaryProgress.indeterminate::after {\n        content: \"\";\n        -webkit-transform-origin: center center;\n        transform-origin: center center;\n\n        -webkit-animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;\n        animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;\n      }\n\n      @-webkit-keyframes indeterminate-bar {\n        0% {\n          -webkit-transform: scaleX(1) translateX(-100%);\n        }\n        50% {\n          -webkit-transform: scaleX(1) translateX(0%);\n        }\n        75% {\n          -webkit-transform: scaleX(1) translateX(0%);\n          -webkit-animation-timing-function: cubic-bezier(.28,.62,.37,.91);\n        }\n        100% {\n          -webkit-transform: scaleX(0) translateX(0%);\n        }\n      }\n\n      @-webkit-keyframes indeterminate-splitter {\n        0% {\n          -webkit-transform: scaleX(.75) translateX(-125%);\n        }\n        30% {\n          -webkit-transform: scaleX(.75) translateX(-125%);\n          -webkit-animation-timing-function: cubic-bezier(.42,0,.6,.8);\n        }\n        90% {\n          -webkit-transform: scaleX(.75) translateX(125%);\n        }\n        100% {\n          -webkit-transform: scaleX(.75) translateX(125%);\n        }\n      }\n\n      @keyframes indeterminate-bar {\n        0% {\n          transform: scaleX(1) translateX(-100%);\n        }\n        50% {\n          transform: scaleX(1) translateX(0%);\n        }\n        75% {\n          transform: scaleX(1) translateX(0%);\n          animation-timing-function: cubic-bezier(.28,.62,.37,.91);\n        }\n        100% {\n          transform: scaleX(0) translateX(0%);\n        }\n      }\n\n      @keyframes indeterminate-splitter {\n        0% {\n          transform: scaleX(.75) translateX(-125%);\n        }\n        30% {\n          transform: scaleX(.75) translateX(-125%);\n          animation-timing-function: cubic-bezier(.42,0,.6,.8);\n        }\n        90% {\n          transform: scaleX(.75) translateX(125%);\n        }\n        100% {\n          transform: scaleX(.75) translateX(125%);\n        }\n      }\n    </style>\n\n    <div id=\"progressContainer\">\n      <div id=\"secondaryProgress\" hidden\\$=\"[[_hideSecondaryProgress(secondaryRatio)]]\"></div>\n      <div id=\"primaryProgress\"></div>\n    </div>\n`,\n\n  is: 'paper-progress',\n  behaviors: [IronRangeBehavior],\n\n  properties: {\n    /**\n     * The number that represents the current secondary progress.\n     */\n    secondaryProgress: {type: Number, value: 0},\n\n    /**\n     * The secondary ratio\n     */\n    secondaryRatio: {type: Number, value: 0, readOnly: true},\n\n    /**\n     * Use an indeterminate progress indicator.\n     */\n    indeterminate:\n        {type: Boolean, value: false, observer: '_toggleIndeterminate'},\n\n    /**\n     * True if the progress is disabled.\n     */\n    disabled: {\n      type: Boolean,\n      value: false,\n      reflectToAttribute: true,\n      observer: '_disabledChanged'\n    }\n  },\n\n  observers:\n      ['_progressChanged(secondaryProgress, value, min, max, indeterminate)'],\n\n  hostAttributes: {role: 'progressbar'},\n\n  _toggleIndeterminate: function(indeterminate) {\n    // If we use attribute/class binding, the animation sometimes doesn't\n    // translate properly on Safari 7.1. So instead, we toggle the class here in\n    // the update method.\n    this.toggleClass('indeterminate', indeterminate, this.$.primaryProgress);\n  },\n\n  _transformProgress: function(progress, ratio) {\n    var transform = 'scaleX(' + (ratio / 100) + ')';\n    progress.style.transform = progress.style.webkitTransform = transform;\n  },\n\n  _mainRatioChanged: function(ratio) {\n    this._transformProgress(this.$.primaryProgress, ratio);\n  },\n\n  _progressChanged: function(\n      secondaryProgress, value, min, max, indeterminate) {\n    secondaryProgress = this._clampValue(secondaryProgress);\n    value = this._clampValue(value);\n\n    var secondaryRatio = this._calcRatio(secondaryProgress) * 100;\n    var mainRatio = this._calcRatio(value) * 100;\n\n    this._setSecondaryRatio(secondaryRatio);\n    this._transformProgress(this.$.secondaryProgress, secondaryRatio);\n    this._transformProgress(this.$.primaryProgress, mainRatio);\n\n    this.secondaryProgress = secondaryProgress;\n\n    if (indeterminate) {\n      this.removeAttribute('aria-valuenow');\n    } else {\n      this.setAttribute('aria-valuenow', value);\n    }\n    this.setAttribute('aria-valuemin', min);\n    this.setAttribute('aria-valuemax', max);\n  },\n\n  _disabledChanged: function(disabled) {\n    this.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n  },\n\n  _hideSecondaryProgress: function(secondaryRatio) {\n    return secondaryRatio === 0;\n  }\n});\n","/**\n@license\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nvar Utility = {\n  distance: function(x1, y1, x2, y2) {\n    var xDelta = (x1 - x2);\n    var yDelta = (y1 - y2);\n\n    return Math.sqrt(xDelta * xDelta + yDelta * yDelta);\n  },\n\n  now: window.performance && window.performance.now ?\n      window.performance.now.bind(window.performance) :\n      Date.now\n};\n\n/**\n * @param {HTMLElement} element\n * @constructor\n */\nfunction ElementMetrics(element) {\n  this.element = element;\n  this.width = this.boundingRect.width;\n  this.height = this.boundingRect.height;\n\n  this.size = Math.max(this.width, this.height);\n}\n\nElementMetrics.prototype = {\n  get boundingRect() {\n    return this.element.getBoundingClientRect();\n  },\n\n  furthestCornerDistanceFrom: function(x, y) {\n    var topLeft = Utility.distance(x, y, 0, 0);\n    var topRight = Utility.distance(x, y, this.width, 0);\n    var bottomLeft = Utility.distance(x, y, 0, this.height);\n    var bottomRight = Utility.distance(x, y, this.width, this.height);\n\n    return Math.max(topLeft, topRight, bottomLeft, bottomRight);\n  }\n};\n\n/**\n * @param {HTMLElement} element\n * @constructor\n */\nfunction Ripple(element) {\n  this.element = element;\n  this.color = window.getComputedStyle(element).color;\n\n  this.wave = document.createElement('div');\n  this.waveContainer = document.createElement('div');\n  this.wave.style.backgroundColor = this.color;\n  this.wave.classList.add('wave');\n  this.waveContainer.classList.add('wave-container');\n  dom(this.waveContainer).appendChild(this.wave);\n\n  this.resetInteractionState();\n}\n\nRipple.MAX_RADIUS = 300;\n\nRipple.prototype = {\n  get recenters() {\n    return this.element.recenters;\n  },\n\n  get center() {\n    return this.element.center;\n  },\n\n  get mouseDownElapsed() {\n    var elapsed;\n\n    if (!this.mouseDownStart) {\n      return 0;\n    }\n\n    elapsed = Utility.now() - this.mouseDownStart;\n\n    if (this.mouseUpStart) {\n      elapsed -= this.mouseUpElapsed;\n    }\n\n    return elapsed;\n  },\n\n  get mouseUpElapsed() {\n    return this.mouseUpStart ? Utility.now() - this.mouseUpStart : 0;\n  },\n\n  get mouseDownElapsedSeconds() {\n    return this.mouseDownElapsed / 1000;\n  },\n\n  get mouseUpElapsedSeconds() {\n    return this.mouseUpElapsed / 1000;\n  },\n\n  get mouseInteractionSeconds() {\n    return this.mouseDownElapsedSeconds + this.mouseUpElapsedSeconds;\n  },\n\n  get initialOpacity() {\n    return this.element.initialOpacity;\n  },\n\n  get opacityDecayVelocity() {\n    return this.element.opacityDecayVelocity;\n  },\n\n  get radius() {\n    var width2 = this.containerMetrics.width * this.containerMetrics.width;\n    var height2 = this.containerMetrics.height * this.containerMetrics.height;\n    var waveRadius =\n        Math.min(Math.sqrt(width2 + height2), Ripple.MAX_RADIUS) * 1.1 + 5;\n\n    var duration = 1.1 - 0.2 * (waveRadius / Ripple.MAX_RADIUS);\n    var timeNow = this.mouseInteractionSeconds / duration;\n    var size = waveRadius * (1 - Math.pow(80, -timeNow));\n\n    return Math.abs(size);\n  },\n\n  get opacity() {\n    if (!this.mouseUpStart) {\n      return this.initialOpacity;\n    }\n\n    return Math.max(\n        0,\n        this.initialOpacity -\n            this.mouseUpElapsedSeconds * this.opacityDecayVelocity);\n  },\n\n  get outerOpacity() {\n    // Linear increase in background opacity, capped at the opacity\n    // of the wavefront (waveOpacity).\n    var outerOpacity = this.mouseUpElapsedSeconds * 0.3;\n    var waveOpacity = this.opacity;\n\n    return Math.max(0, Math.min(outerOpacity, waveOpacity));\n  },\n\n  get isOpacityFullyDecayed() {\n    return this.opacity < 0.01 &&\n        this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);\n  },\n\n  get isRestingAtMaxRadius() {\n    return this.opacity >= this.initialOpacity &&\n        this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);\n  },\n\n  get isAnimationComplete() {\n    return this.mouseUpStart ? this.isOpacityFullyDecayed :\n                               this.isRestingAtMaxRadius;\n  },\n\n  get translationFraction() {\n    return Math.min(\n        1, this.radius / this.containerMetrics.size * 2 / Math.sqrt(2));\n  },\n\n  get xNow() {\n    if (this.xEnd) {\n      return this.xStart + this.translationFraction * (this.xEnd - this.xStart);\n    }\n\n    return this.xStart;\n  },\n\n  get yNow() {\n    if (this.yEnd) {\n      return this.yStart + this.translationFraction * (this.yEnd - this.yStart);\n    }\n\n    return this.yStart;\n  },\n\n  get isMouseDown() {\n    return this.mouseDownStart && !this.mouseUpStart;\n  },\n\n  resetInteractionState: function() {\n    this.maxRadius = 0;\n    this.mouseDownStart = 0;\n    this.mouseUpStart = 0;\n\n    this.xStart = 0;\n    this.yStart = 0;\n    this.xEnd = 0;\n    this.yEnd = 0;\n    this.slideDistance = 0;\n\n    this.containerMetrics = new ElementMetrics(this.element);\n  },\n\n  draw: function() {\n    var scale;\n    var dx;\n    var dy;\n\n    this.wave.style.opacity = this.opacity;\n\n    scale = this.radius / (this.containerMetrics.size / 2);\n    dx = this.xNow - (this.containerMetrics.width / 2);\n    dy = this.yNow - (this.containerMetrics.height / 2);\n\n\n    // 2d transform for safari because of border-radius and overflow:hidden\n    // clipping bug. https://bugs.webkit.org/show_bug.cgi?id=98538\n    this.waveContainer.style.webkitTransform =\n        'translate(' + dx + 'px, ' + dy + 'px)';\n    this.waveContainer.style.transform =\n        'translate3d(' + dx + 'px, ' + dy + 'px, 0)';\n    this.wave.style.webkitTransform = 'scale(' + scale + ',' + scale + ')';\n    this.wave.style.transform = 'scale3d(' + scale + ',' + scale + ',1)';\n  },\n\n  /** @param {Event=} event */\n  downAction: function(event) {\n    var xCenter = this.containerMetrics.width / 2;\n    var yCenter = this.containerMetrics.height / 2;\n\n    this.resetInteractionState();\n    this.mouseDownStart = Utility.now();\n\n    if (this.center) {\n      this.xStart = xCenter;\n      this.yStart = yCenter;\n      this.slideDistance =\n          Utility.distance(this.xStart, this.yStart, this.xEnd, this.yEnd);\n    } else {\n      this.xStart = event ?\n          event.detail.x - this.containerMetrics.boundingRect.left :\n          this.containerMetrics.width / 2;\n      this.yStart = event ?\n          event.detail.y - this.containerMetrics.boundingRect.top :\n          this.containerMetrics.height / 2;\n    }\n\n    if (this.recenters) {\n      this.xEnd = xCenter;\n      this.yEnd = yCenter;\n      this.slideDistance =\n          Utility.distance(this.xStart, this.yStart, this.xEnd, this.yEnd);\n    }\n\n    this.maxRadius = this.containerMetrics.furthestCornerDistanceFrom(\n        this.xStart, this.yStart);\n\n    this.waveContainer.style.top =\n        (this.containerMetrics.height - this.containerMetrics.size) / 2 + 'px';\n    this.waveContainer.style.left =\n        (this.containerMetrics.width - this.containerMetrics.size) / 2 + 'px';\n\n    this.waveContainer.style.width = this.containerMetrics.size + 'px';\n    this.waveContainer.style.height = this.containerMetrics.size + 'px';\n  },\n\n  /** @param {Event=} event */\n  upAction: function(event) {\n    if (!this.isMouseDown) {\n      return;\n    }\n\n    this.mouseUpStart = Utility.now();\n  },\n\n  remove: function() {\n    dom(dom(this.waveContainer).parentNode).removeChild(this.waveContainer);\n  }\n};\n\n/**\nMaterial design: [Surface\nreaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)\n\n`paper-ripple` provides a visual effect that other paper elements can\nuse to simulate a rippling effect emanating from the point of contact.  The\neffect can be visualized as a concentric circle with motion.\n\nExample:\n\n    <div style=\"position:relative\">\n      <paper-ripple></paper-ripple>\n    </div>\n\nNote, it's important that the parent container of the ripple be relative\nposition, otherwise the ripple will emanate outside of the desired container.\n\n`paper-ripple` listens to \"mousedown\" and \"mouseup\" events so it would display\nripple effect when touches on it.  You can also defeat the default behavior and\nmanually route the down and up actions to the ripple element.  Note that it is\nimportant if you call `downAction()` you will have to make sure to call\n`upAction()` so that `paper-ripple` would end the animation loop.\n\nExample:\n\n    <paper-ripple id=\"ripple\" style=\"pointer-events: none;\"></paper-ripple>\n    ...\n    downAction: function(e) {\n      this.$.ripple.downAction(e.detail);\n    },\n    upAction: function(e) {\n      this.$.ripple.upAction();\n    }\n\nStyling ripple effect:\n\n  Use CSS color property to style the ripple:\n\n    paper-ripple {\n      color: #4285f4;\n    }\n\n  Note that CSS color property is inherited so it is not required to set it on\n  the `paper-ripple` element directly.\n\nBy default, the ripple is centered on the point of contact.  Apply the\n`recenters` attribute to have the ripple grow toward the center of its\ncontainer.\n\n    <paper-ripple recenters></paper-ripple>\n\nYou can also  center the ripple inside its container from the start.\n\n    <paper-ripple center></paper-ripple>\n\nApply `circle` class to make the rippling effect within a circle.\n\n    <paper-ripple class=\"circle\"></paper-ripple>\n\n@element paper-ripple\n@demo demo/index.html\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        position: absolute;\n        border-radius: inherit;\n        overflow: hidden;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n\n        /* See PolymerElements/paper-behaviors/issues/34. On non-Chrome browsers,\n         * creating a node (with a position:absolute) in the middle of an event\n         * handler \"interrupts\" that event handler (which happens when the\n         * ripple is created on demand) */\n        pointer-events: none;\n      }\n\n      :host([animating]) {\n        /* This resolves a rendering issue in Chrome (as of 40) where the\n           ripple is not properly clipped by its parent (which may have\n           rounded corners). See: http://jsbin.com/temexa/4\n\n           Note: We only apply this style conditionally. Otherwise, the browser\n           will create a new compositing layer for every ripple element on the\n           page, and that would be bad. */\n        -webkit-transform: translate(0, 0);\n        transform: translate3d(0, 0, 0);\n      }\n\n      #background,\n      #waves,\n      .wave-container,\n      .wave {\n        pointer-events: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n      }\n\n      #background,\n      .wave {\n        opacity: 0;\n      }\n\n      #waves,\n      .wave {\n        overflow: hidden;\n      }\n\n      .wave-container,\n      .wave {\n        border-radius: 50%;\n      }\n\n      :host(.circle) #background,\n      :host(.circle) #waves {\n        border-radius: 50%;\n      }\n\n      :host(.circle) .wave-container {\n        overflow: hidden;\n      }\n    </style>\n\n    <div id=\"background\"></div>\n    <div id=\"waves\"></div>\n`,\n\n  is: 'paper-ripple',\n  behaviors: [IronA11yKeysBehavior],\n\n  properties: {\n    /**\n     * The initial opacity set on the wave.\n     * @type number\n     * @default 0.25\n     */\n    initialOpacity: {type: Number, value: 0.25},\n\n    /**\n     * How fast (opacity per second) the wave fades out.\n     *\n     * @type number\n     * @default 0.8\n     */\n    opacityDecayVelocity: {type: Number, value: 0.8},\n\n    /**\n     * If true, ripples will exhibit a gravitational pull towards\n     * the center of their container as they fade away.\n     *\n     * @type boolean\n     * @default false\n     */\n    recenters: {type: Boolean, value: false},\n\n    /**\n     * If true, ripples will center inside its container\n     *\n     * @type boolean\n     * @default false\n     */\n    center: {type: Boolean, value: false},\n\n    /**\n     * A list of the visual ripples.\n     *\n     * @type Array\n     * @default []\n     */\n    ripples: {\n      type: Array,\n      value: function() {\n        return [];\n      }\n    },\n\n    /**\n     * True when there are visible ripples animating within the\n     * element.\n     */\n    animating:\n        {type: Boolean, readOnly: true, reflectToAttribute: true, value: false},\n\n    /**\n     * If true, the ripple will remain in the \"down\" state until `holdDown`\n     * is set to false again.\n     */\n    holdDown: {type: Boolean, value: false, observer: '_holdDownChanged'},\n\n    /**\n     * If true, the ripple will not generate a ripple effect\n     * via pointer interaction.\n     * Calling ripple's imperative api like `simulatedRipple` will\n     * still generate the ripple effect.\n     */\n    noink: {type: Boolean, value: false},\n\n    _animating: {type: Boolean},\n\n    _boundAnimate: {\n      type: Function,\n      value: function() {\n        return this.animate.bind(this);\n      }\n    }\n  },\n\n  get target() {\n    return this.keyEventTarget;\n  },\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {\n    'enter:keydown': '_onEnterKeydown',\n    'space:keydown': '_onSpaceKeydown',\n    'space:keyup': '_onSpaceKeyup'\n  },\n\n  /** @override */\n  attached: function() {\n    // Set up a11yKeysBehavior to listen to key events on the target,\n    // so that space and enter activate the ripple even if the target doesn't\n    // handle key events. The key handlers deal with `noink` themselves.\n    if (dom(this).parentNode.nodeType == 11) {  // DOCUMENT_FRAGMENT_NODE\n      this.keyEventTarget = dom(this).getOwnerRoot().host;\n    } else {\n      this.keyEventTarget = dom(this).parentNode;\n    }\n    var keyEventTarget = /** @type {!EventTarget} */ (this.keyEventTarget);\n    this.listen(keyEventTarget, 'up', 'uiUpAction');\n    this.listen(keyEventTarget, 'down', 'uiDownAction');\n  },\n\n  /** @override */\n  detached: function() {\n    this.unlisten(this.keyEventTarget, 'up', 'uiUpAction');\n    this.unlisten(this.keyEventTarget, 'down', 'uiDownAction');\n    this.keyEventTarget = null;\n  },\n\n  get shouldKeepAnimating() {\n    for (var index = 0; index < this.ripples.length; ++index) {\n      if (!this.ripples[index].isAnimationComplete) {\n        return true;\n      }\n    }\n\n    return false;\n  },\n\n  simulatedRipple: function() {\n    this.downAction(null);\n\n    // Please see polymer/polymer#1305\n    this.async(function() {\n      this.upAction();\n    }, 1);\n  },\n\n  /**\n   * Provokes a ripple down effect via a UI event,\n   * respecting the `noink` property.\n   * @param {Event=} event\n   */\n  uiDownAction: function(event) {\n    if (!this.noink) {\n      this.downAction(event);\n    }\n  },\n\n  /**\n   * Provokes a ripple down effect via a UI event,\n   * *not* respecting the `noink` property.\n   * @param {Event=} event\n   */\n  downAction: function(event) {\n    if (this.holdDown && this.ripples.length > 0) {\n      return;\n    }\n\n    var ripple = this.addRipple();\n\n    ripple.downAction(event);\n\n    if (!this._animating) {\n      this._animating = true;\n      this.animate();\n    }\n  },\n\n  /**\n   * Provokes a ripple up effect via a UI event,\n   * respecting the `noink` property.\n   * @param {Event=} event\n   */\n  uiUpAction: function(event) {\n    if (!this.noink) {\n      this.upAction(event);\n    }\n  },\n\n  /**\n   * Provokes a ripple up effect via a UI event,\n   * *not* respecting the `noink` property.\n   * @param {Event=} event\n   */\n  upAction: function(event) {\n    if (this.holdDown) {\n      return;\n    }\n\n    this.ripples.forEach(function(ripple) {\n      ripple.upAction(event);\n    });\n\n    this._animating = true;\n    this.animate();\n  },\n\n  onAnimationComplete: function() {\n    this._animating = false;\n    this.$.background.style.backgroundColor = '';\n    this.fire('transitionend');\n  },\n\n  addRipple: function() {\n    var ripple = new Ripple(this);\n\n    dom(this.$.waves).appendChild(ripple.waveContainer);\n    this.$.background.style.backgroundColor = ripple.color;\n    this.ripples.push(ripple);\n\n    this._setAnimating(true);\n\n    return ripple;\n  },\n\n  removeRipple: function(ripple) {\n    var rippleIndex = this.ripples.indexOf(ripple);\n\n    if (rippleIndex < 0) {\n      return;\n    }\n\n    this.ripples.splice(rippleIndex, 1);\n\n    ripple.remove();\n\n    if (!this.ripples.length) {\n      this._setAnimating(false);\n    }\n  },\n\n  /**\n   * Deprecated. Please use animateRipple() instead.\n   *\n   * This method name conflicts with Element#animate().\n   * https://developer.mozilla.org/en-US/docs/Web/API/Element/animate.\n   *\n   * @suppress {checkTypes}\n   * @override\n   */\n  animate: function() {\n    if (!this._animating) {\n      return;\n    }\n    var index;\n    var ripple;\n\n    for (index = 0; index < this.ripples.length; ++index) {\n      ripple = this.ripples[index];\n\n      ripple.draw();\n\n      this.$.background.style.opacity = ripple.outerOpacity;\n\n      if (ripple.isOpacityFullyDecayed && !ripple.isRestingAtMaxRadius) {\n        this.removeRipple(ripple);\n      }\n    }\n\n    if (!this.shouldKeepAnimating && this.ripples.length === 0) {\n      this.onAnimationComplete();\n    } else {\n      window.requestAnimationFrame(this._boundAnimate);\n    }\n  },\n\n  /**\n   * An alias for animate() whose name does not conflict with the platform\n   * Element.animate() method.\n   */\n  animateRipple: function() {\n    return this.animate();\n  },\n\n  _onEnterKeydown: function() {\n    this.uiDownAction();\n    this.async(this.uiUpAction, 1);\n  },\n\n  _onSpaceKeydown: function() {\n    this.uiDownAction();\n  },\n\n  _onSpaceKeyup: function() {\n    this.uiUpAction();\n  },\n\n  // note: holdDown does not respect noink since it can be a focus based\n  // effect.\n  _holdDownChanged: function(newVal, oldVal) {\n    if (oldVal === undefined) {\n      return;\n    }\n    if (newVal) {\n      this.downAction();\n    } else {\n      this.upAction();\n    }\n  }\n\n  /**\n  Fired when the animation finishes.\n  This is useful if you want to wait until\n  the ripple animation finishes to perform some action.\n\n  @event transitionend\n  @param {{node: Object}} detail Contains the animated node.\n  */\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\n/** @polymerBehavior */\nexport const PaperSpinnerBehavior = {\n\n  properties: {\n    /**\n     * Displays the spinner.\n     */\n    active: {\n      type: Boolean,\n      value: false,\n      reflectToAttribute: true,\n      observer: '__activeChanged'\n    },\n\n    /**\n     * Alternative text content for accessibility support.\n     * If alt is present, it will add an aria-label whose content matches alt\n     * when active. If alt is not present, it will default to 'loading' as the\n     * alt value.\n     */\n    alt: {type: String, value: 'loading', observer: '__altChanged'},\n\n    __coolingDown: {type: Boolean, value: false}\n  },\n\n  __computeContainerClasses: function(active, coolingDown) {\n    return [\n      active || coolingDown ? 'active' : '',\n      coolingDown ? 'cooldown' : ''\n    ].join(' ');\n  },\n\n  __activeChanged: function(active, old) {\n    this.__setAriaHidden(!active);\n    this.__coolingDown = !active && old;\n  },\n\n  __altChanged: function(alt) {\n    // user-provided `aria-label` takes precedence over prototype default\n    if (alt === 'loading') {\n      this.alt = this.getAttribute('aria-label') || alt;\n    } else {\n      this.__setAriaHidden(alt === '');\n      this.setAttribute('aria-label', alt);\n    }\n  },\n\n  __setAriaHidden: function(hidden) {\n    var attr = 'aria-hidden';\n    if (hidden) {\n      this.setAttribute(attr, 'true');\n    } else {\n      this.removeAttribute(attr);\n    }\n  },\n\n  __reset: function() {\n    this.active = false;\n    this.__coolingDown = false;\n  }\n};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/color.js';\nimport './paper-spinner-styles.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperSpinnerBehavior} from './paper-spinner-behavior.js';\n\nconst template = html`\n  <style include=\"paper-spinner-styles\"></style>\n\n  <div id=\"spinnerContainer\" class-name=\"[[__computeContainerClasses(active, __coolingDown)]]\" on-animationend=\"__reset\" on-webkit-animation-end=\"__reset\">\n    <div class=\"spinner-layer\">\n      <div class=\"circle-clipper left\">\n        <div class=\"circle\"></div>\n      </div>\n      <div class=\"circle-clipper right\">\n        <div class=\"circle\"></div>\n      </div>\n    </div>\n  </div>\n`;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design: [Progress &\nactivity](https://www.google.com/design/spec/components/progress-activity.html)\n\nElement providing a single color material design circular spinner.\n\n    <paper-spinner-lite active></paper-spinner-lite>\n\nThe default spinner is blue. It can be customized to be a different color.\n\n### Accessibility\n\nAlt attribute should be set to provide adequate context for accessibility. If\nnot provided, it defaults to 'loading'. Empty alt can be provided to mark the\nelement as decorative if alternative content is provided in another form (e.g. a\ntext block following the spinner).\n\n    <paper-spinner-lite alt=\"Loading contacts list\" active></paper-spinner-lite>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-spinner-color` | Color of the spinner | `--google-blue-500`\n`--paper-spinner-stroke-width` | The width of the spinner stroke | 3px\n\n@group Paper Elements\n@element paper-spinner-lite\n@hero hero.svg\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-spinner-lite',\n\n  behaviors: [PaperSpinnerBehavior]\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nconst $_documentContainer = document.createElement('template');\n$_documentContainer.setAttribute('style', 'display: none;');\n\n$_documentContainer.innerHTML = `<dom-module id=\"paper-spinner-styles\">\n  <template>\n    <style>\n      /*\n      /**************************/\n      /* STYLES FOR THE SPINNER */\n      /**************************/\n\n      /*\n       * Constants:\n       *      ARCSIZE     = 270 degrees (amount of circle the arc takes up)\n       *      ARCTIME     = 1333ms (time it takes to expand and contract arc)\n       *      ARCSTARTROT = 216 degrees (how much the start location of the arc\n       *                                should rotate each time, 216 gives us a\n       *                                5 pointed star shape (it's 360/5 * 3).\n       *                                For a 7 pointed star, we might do\n       *                                360/7 * 3 = 154.286)\n       *      SHRINK_TIME = 400ms\n       */\n\n      :host {\n        display: inline-block;\n        position: relative;\n        width: 28px;\n        height: 28px;\n\n        /* 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */\n        --paper-spinner-container-rotation-duration: 1568ms;\n\n        /* ARCTIME */\n        --paper-spinner-expand-contract-duration: 1333ms;\n\n        /* 4 * ARCTIME */\n        --paper-spinner-full-cycle-duration: 5332ms;\n\n        /* SHRINK_TIME */\n        --paper-spinner-cooldown-duration: 400ms;\n      }\n\n      #spinnerContainer {\n        width: 100%;\n        height: 100%;\n\n        /* The spinner does not have any contents that would have to be\n         * flipped if the direction changes. Always use ltr so that the\n         * style works out correctly in both cases. */\n        direction: ltr;\n      }\n\n      #spinnerContainer.active {\n        -webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;\n        animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;\n      }\n\n      @-webkit-keyframes container-rotate {\n        to { -webkit-transform: rotate(360deg) }\n      }\n\n      @keyframes container-rotate {\n        to { transform: rotate(360deg) }\n      }\n\n      .spinner-layer {\n        position: absolute;\n        width: 100%;\n        height: 100%;\n        opacity: 0;\n        white-space: nowrap;\n        color: var(--paper-spinner-color, var(--google-blue-500));\n      }\n\n      .layer-1 {\n        color: var(--paper-spinner-layer-1-color, var(--google-blue-500));\n      }\n\n      .layer-2 {\n        color: var(--paper-spinner-layer-2-color, var(--google-red-500));\n      }\n\n      .layer-3 {\n        color: var(--paper-spinner-layer-3-color, var(--google-yellow-500));\n      }\n\n      .layer-4 {\n        color: var(--paper-spinner-layer-4-color, var(--google-green-500));\n      }\n\n      /**\n       * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):\n       *\n       * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't\n       * guarantee that the animation will start _exactly_ after that value. So we avoid using\n       * animation-delay and instead set custom keyframes for each color (as layer-2undant as it\n       * seems).\n       */\n      .active .spinner-layer {\n        -webkit-animation-name: fill-unfill-rotate;\n        -webkit-animation-duration: var(--paper-spinner-full-cycle-duration);\n        -webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);\n        -webkit-animation-iteration-count: infinite;\n        animation-name: fill-unfill-rotate;\n        animation-duration: var(--paper-spinner-full-cycle-duration);\n        animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);\n        animation-iteration-count: infinite;\n        opacity: 1;\n      }\n\n      .active .spinner-layer.layer-1 {\n        -webkit-animation-name: fill-unfill-rotate, layer-1-fade-in-out;\n        animation-name: fill-unfill-rotate, layer-1-fade-in-out;\n      }\n\n      .active .spinner-layer.layer-2 {\n        -webkit-animation-name: fill-unfill-rotate, layer-2-fade-in-out;\n        animation-name: fill-unfill-rotate, layer-2-fade-in-out;\n      }\n\n      .active .spinner-layer.layer-3 {\n        -webkit-animation-name: fill-unfill-rotate, layer-3-fade-in-out;\n        animation-name: fill-unfill-rotate, layer-3-fade-in-out;\n      }\n\n      .active .spinner-layer.layer-4 {\n        -webkit-animation-name: fill-unfill-rotate, layer-4-fade-in-out;\n        animation-name: fill-unfill-rotate, layer-4-fade-in-out;\n      }\n\n      @-webkit-keyframes fill-unfill-rotate {\n        12.5% { -webkit-transform: rotate(135deg) } /* 0.5 * ARCSIZE */\n        25%   { -webkit-transform: rotate(270deg) } /* 1   * ARCSIZE */\n        37.5% { -webkit-transform: rotate(405deg) } /* 1.5 * ARCSIZE */\n        50%   { -webkit-transform: rotate(540deg) } /* 2   * ARCSIZE */\n        62.5% { -webkit-transform: rotate(675deg) } /* 2.5 * ARCSIZE */\n        75%   { -webkit-transform: rotate(810deg) } /* 3   * ARCSIZE */\n        87.5% { -webkit-transform: rotate(945deg) } /* 3.5 * ARCSIZE */\n        to    { -webkit-transform: rotate(1080deg) } /* 4   * ARCSIZE */\n      }\n\n      @keyframes fill-unfill-rotate {\n        12.5% { transform: rotate(135deg) } /* 0.5 * ARCSIZE */\n        25%   { transform: rotate(270deg) } /* 1   * ARCSIZE */\n        37.5% { transform: rotate(405deg) } /* 1.5 * ARCSIZE */\n        50%   { transform: rotate(540deg) } /* 2   * ARCSIZE */\n        62.5% { transform: rotate(675deg) } /* 2.5 * ARCSIZE */\n        75%   { transform: rotate(810deg) } /* 3   * ARCSIZE */\n        87.5% { transform: rotate(945deg) } /* 3.5 * ARCSIZE */\n        to    { transform: rotate(1080deg) } /* 4   * ARCSIZE */\n      }\n\n      @-webkit-keyframes layer-1-fade-in-out {\n        0% { opacity: 1 }\n        25% { opacity: 1 }\n        26% { opacity: 0 }\n        89% { opacity: 0 }\n        90% { opacity: 1 }\n        to { opacity: 1 }\n      }\n\n      @keyframes layer-1-fade-in-out {\n        0% { opacity: 1 }\n        25% { opacity: 1 }\n        26% { opacity: 0 }\n        89% { opacity: 0 }\n        90% { opacity: 1 }\n        to { opacity: 1 }\n      }\n\n      @-webkit-keyframes layer-2-fade-in-out {\n        0% { opacity: 0 }\n        15% { opacity: 0 }\n        25% { opacity: 1 }\n        50% { opacity: 1 }\n        51% { opacity: 0 }\n        to { opacity: 0 }\n      }\n\n      @keyframes layer-2-fade-in-out {\n        0% { opacity: 0 }\n        15% { opacity: 0 }\n        25% { opacity: 1 }\n        50% { opacity: 1 }\n        51% { opacity: 0 }\n        to { opacity: 0 }\n      }\n\n      @-webkit-keyframes layer-3-fade-in-out {\n        0% { opacity: 0 }\n        40% { opacity: 0 }\n        50% { opacity: 1 }\n        75% { opacity: 1 }\n        76% { opacity: 0 }\n        to { opacity: 0 }\n      }\n\n      @keyframes layer-3-fade-in-out {\n        0% { opacity: 0 }\n        40% { opacity: 0 }\n        50% { opacity: 1 }\n        75% { opacity: 1 }\n        76% { opacity: 0 }\n        to { opacity: 0 }\n      }\n\n      @-webkit-keyframes layer-4-fade-in-out {\n        0% { opacity: 0 }\n        65% { opacity: 0 }\n        75% { opacity: 1 }\n        90% { opacity: 1 }\n        to { opacity: 0 }\n      }\n\n      @keyframes layer-4-fade-in-out {\n        0% { opacity: 0 }\n        65% { opacity: 0 }\n        75% { opacity: 1 }\n        90% { opacity: 1 }\n        to { opacity: 0 }\n      }\n\n      .circle-clipper {\n        display: inline-block;\n        position: relative;\n        width: 50%;\n        height: 100%;\n        overflow: hidden;\n      }\n\n      /**\n       * Patch the gap that appear between the two adjacent div.circle-clipper while the\n       * spinner is rotating (appears on Chrome 50, Safari 9.1.1, and Edge).\n       */\n      .spinner-layer::after {\n        content: '';\n        left: 45%;\n        width: 10%;\n        border-top-style: solid;\n      }\n\n      .spinner-layer::after,\n      .circle-clipper .circle {\n        box-sizing: border-box;\n        position: absolute;\n        top: 0;\n        border-width: var(--paper-spinner-stroke-width, 3px);\n        border-radius: 50%;\n      }\n\n      .circle-clipper .circle {\n        bottom: 0;\n        width: 200%;\n        border-style: solid;\n        border-bottom-color: transparent !important;\n      }\n\n      .circle-clipper.left .circle {\n        left: 0;\n        border-right-color: transparent !important;\n        -webkit-transform: rotate(129deg);\n        transform: rotate(129deg);\n      }\n\n      .circle-clipper.right .circle {\n        left: -100%;\n        border-left-color: transparent !important;\n        -webkit-transform: rotate(-129deg);\n        transform: rotate(-129deg);\n      }\n\n      .active .gap-patch::after,\n      .active .circle-clipper .circle {\n        -webkit-animation-duration: var(--paper-spinner-expand-contract-duration);\n        -webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);\n        -webkit-animation-iteration-count: infinite;\n        animation-duration: var(--paper-spinner-expand-contract-duration);\n        animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);\n        animation-iteration-count: infinite;\n      }\n\n      .active .circle-clipper.left .circle {\n        -webkit-animation-name: left-spin;\n        animation-name: left-spin;\n      }\n\n      .active .circle-clipper.right .circle {\n        -webkit-animation-name: right-spin;\n        animation-name: right-spin;\n      }\n\n      @-webkit-keyframes left-spin {\n        0% { -webkit-transform: rotate(130deg) }\n        50% { -webkit-transform: rotate(-5deg) }\n        to { -webkit-transform: rotate(130deg) }\n      }\n\n      @keyframes left-spin {\n        0% { transform: rotate(130deg) }\n        50% { transform: rotate(-5deg) }\n        to { transform: rotate(130deg) }\n      }\n\n      @-webkit-keyframes right-spin {\n        0% { -webkit-transform: rotate(-130deg) }\n        50% { -webkit-transform: rotate(5deg) }\n        to { -webkit-transform: rotate(-130deg) }\n      }\n\n      @keyframes right-spin {\n        0% { transform: rotate(-130deg) }\n        50% { transform: rotate(5deg) }\n        to { transform: rotate(-130deg) }\n      }\n\n      #spinnerContainer.cooldown {\n        -webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);\n        animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);\n      }\n\n      @-webkit-keyframes fade-out {\n        0% { opacity: 1 }\n        to { opacity: 0 }\n      }\n\n      @keyframes fade-out {\n        0% { opacity: 1 }\n        to { opacity: 0 }\n      }\n    </style>\n  </template>\n</dom-module>`;\n\ndocument.head.appendChild($_documentContainer.content);\n\nexport {};\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`\n<custom-style>\n  <style is=\"custom-style\">\n    html {\n\n      /* Material Design color palette for Google products */\n\n      --google-red-100: #f4c7c3;\n      --google-red-300: #e67c73;\n      --google-red-500: #db4437;\n      --google-red-700: #c53929;\n\n      --google-blue-100: #c6dafc;\n      --google-blue-300: #7baaf7;\n      --google-blue-500: #4285f4;\n      --google-blue-700: #3367d6;\n\n      --google-green-100: #b7e1cd;\n      --google-green-300: #57bb8a;\n      --google-green-500: #0f9d58;\n      --google-green-700: #0b8043;\n\n      --google-yellow-100: #fce8b2;\n      --google-yellow-300: #f7cb4d;\n      --google-yellow-500: #f4b400;\n      --google-yellow-700: #f09300;\n\n      --google-grey-100: #f5f5f5;\n      --google-grey-300: #e0e0e0;\n      --google-grey-500: #9e9e9e;\n      --google-grey-700: #616161;\n\n      /* Material Design color palette from online spec document */\n\n      --paper-red-50: #ffebee;\n      --paper-red-100: #ffcdd2;\n      --paper-red-200: #ef9a9a;\n      --paper-red-300: #e57373;\n      --paper-red-400: #ef5350;\n      --paper-red-500: #f44336;\n      --paper-red-600: #e53935;\n      --paper-red-700: #d32f2f;\n      --paper-red-800: #c62828;\n      --paper-red-900: #b71c1c;\n      --paper-red-a100: #ff8a80;\n      --paper-red-a200: #ff5252;\n      --paper-red-a400: #ff1744;\n      --paper-red-a700: #d50000;\n\n      --paper-pink-50: #fce4ec;\n      --paper-pink-100: #f8bbd0;\n      --paper-pink-200: #f48fb1;\n      --paper-pink-300: #f06292;\n      --paper-pink-400: #ec407a;\n      --paper-pink-500: #e91e63;\n      --paper-pink-600: #d81b60;\n      --paper-pink-700: #c2185b;\n      --paper-pink-800: #ad1457;\n      --paper-pink-900: #880e4f;\n      --paper-pink-a100: #ff80ab;\n      --paper-pink-a200: #ff4081;\n      --paper-pink-a400: #f50057;\n      --paper-pink-a700: #c51162;\n\n      --paper-purple-50: #f3e5f5;\n      --paper-purple-100: #e1bee7;\n      --paper-purple-200: #ce93d8;\n      --paper-purple-300: #ba68c8;\n      --paper-purple-400: #ab47bc;\n      --paper-purple-500: #9c27b0;\n      --paper-purple-600: #8e24aa;\n      --paper-purple-700: #7b1fa2;\n      --paper-purple-800: #6a1b9a;\n      --paper-purple-900: #4a148c;\n      --paper-purple-a100: #ea80fc;\n      --paper-purple-a200: #e040fb;\n      --paper-purple-a400: #d500f9;\n      --paper-purple-a700: #aa00ff;\n\n      --paper-deep-purple-50: #ede7f6;\n      --paper-deep-purple-100: #d1c4e9;\n      --paper-deep-purple-200: #b39ddb;\n      --paper-deep-purple-300: #9575cd;\n      --paper-deep-purple-400: #7e57c2;\n      --paper-deep-purple-500: #673ab7;\n      --paper-deep-purple-600: #5e35b1;\n      --paper-deep-purple-700: #512da8;\n      --paper-deep-purple-800: #4527a0;\n      --paper-deep-purple-900: #311b92;\n      --paper-deep-purple-a100: #b388ff;\n      --paper-deep-purple-a200: #7c4dff;\n      --paper-deep-purple-a400: #651fff;\n      --paper-deep-purple-a700: #6200ea;\n\n      --paper-indigo-50: #e8eaf6;\n      --paper-indigo-100: #c5cae9;\n      --paper-indigo-200: #9fa8da;\n      --paper-indigo-300: #7986cb;\n      --paper-indigo-400: #5c6bc0;\n      --paper-indigo-500: #3f51b5;\n      --paper-indigo-600: #3949ab;\n      --paper-indigo-700: #303f9f;\n      --paper-indigo-800: #283593;\n      --paper-indigo-900: #1a237e;\n      --paper-indigo-a100: #8c9eff;\n      --paper-indigo-a200: #536dfe;\n      --paper-indigo-a400: #3d5afe;\n      --paper-indigo-a700: #304ffe;\n\n      --paper-blue-50: #e3f2fd;\n      --paper-blue-100: #bbdefb;\n      --paper-blue-200: #90caf9;\n      --paper-blue-300: #64b5f6;\n      --paper-blue-400: #42a5f5;\n      --paper-blue-500: #2196f3;\n      --paper-blue-600: #1e88e5;\n      --paper-blue-700: #1976d2;\n      --paper-blue-800: #1565c0;\n      --paper-blue-900: #0d47a1;\n      --paper-blue-a100: #82b1ff;\n      --paper-blue-a200: #448aff;\n      --paper-blue-a400: #2979ff;\n      --paper-blue-a700: #2962ff;\n\n      --paper-light-blue-50: #e1f5fe;\n      --paper-light-blue-100: #b3e5fc;\n      --paper-light-blue-200: #81d4fa;\n      --paper-light-blue-300: #4fc3f7;\n      --paper-light-blue-400: #29b6f6;\n      --paper-light-blue-500: #03a9f4;\n      --paper-light-blue-600: #039be5;\n      --paper-light-blue-700: #0288d1;\n      --paper-light-blue-800: #0277bd;\n      --paper-light-blue-900: #01579b;\n      --paper-light-blue-a100: #80d8ff;\n      --paper-light-blue-a200: #40c4ff;\n      --paper-light-blue-a400: #00b0ff;\n      --paper-light-blue-a700: #0091ea;\n\n      --paper-cyan-50: #e0f7fa;\n      --paper-cyan-100: #b2ebf2;\n      --paper-cyan-200: #80deea;\n      --paper-cyan-300: #4dd0e1;\n      --paper-cyan-400: #26c6da;\n      --paper-cyan-500: #00bcd4;\n      --paper-cyan-600: #00acc1;\n      --paper-cyan-700: #0097a7;\n      --paper-cyan-800: #00838f;\n      --paper-cyan-900: #006064;\n      --paper-cyan-a100: #84ffff;\n      --paper-cyan-a200: #18ffff;\n      --paper-cyan-a400: #00e5ff;\n      --paper-cyan-a700: #00b8d4;\n\n      --paper-teal-50: #e0f2f1;\n      --paper-teal-100: #b2dfdb;\n      --paper-teal-200: #80cbc4;\n      --paper-teal-300: #4db6ac;\n      --paper-teal-400: #26a69a;\n      --paper-teal-500: #009688;\n      --paper-teal-600: #00897b;\n      --paper-teal-700: #00796b;\n      --paper-teal-800: #00695c;\n      --paper-teal-900: #004d40;\n      --paper-teal-a100: #a7ffeb;\n      --paper-teal-a200: #64ffda;\n      --paper-teal-a400: #1de9b6;\n      --paper-teal-a700: #00bfa5;\n\n      --paper-green-50: #e8f5e9;\n      --paper-green-100: #c8e6c9;\n      --paper-green-200: #a5d6a7;\n      --paper-green-300: #81c784;\n      --paper-green-400: #66bb6a;\n      --paper-green-500: #4caf50;\n      --paper-green-600: #43a047;\n      --paper-green-700: #388e3c;\n      --paper-green-800: #2e7d32;\n      --paper-green-900: #1b5e20;\n      --paper-green-a100: #b9f6ca;\n      --paper-green-a200: #69f0ae;\n      --paper-green-a400: #00e676;\n      --paper-green-a700: #00c853;\n\n      --paper-light-green-50: #f1f8e9;\n      --paper-light-green-100: #dcedc8;\n      --paper-light-green-200: #c5e1a5;\n      --paper-light-green-300: #aed581;\n      --paper-light-green-400: #9ccc65;\n      --paper-light-green-500: #8bc34a;\n      --paper-light-green-600: #7cb342;\n      --paper-light-green-700: #689f38;\n      --paper-light-green-800: #558b2f;\n      --paper-light-green-900: #33691e;\n      --paper-light-green-a100: #ccff90;\n      --paper-light-green-a200: #b2ff59;\n      --paper-light-green-a400: #76ff03;\n      --paper-light-green-a700: #64dd17;\n\n      --paper-lime-50: #f9fbe7;\n      --paper-lime-100: #f0f4c3;\n      --paper-lime-200: #e6ee9c;\n      --paper-lime-300: #dce775;\n      --paper-lime-400: #d4e157;\n      --paper-lime-500: #cddc39;\n      --paper-lime-600: #c0ca33;\n      --paper-lime-700: #afb42b;\n      --paper-lime-800: #9e9d24;\n      --paper-lime-900: #827717;\n      --paper-lime-a100: #f4ff81;\n      --paper-lime-a200: #eeff41;\n      --paper-lime-a400: #c6ff00;\n      --paper-lime-a700: #aeea00;\n\n      --paper-yellow-50: #fffde7;\n      --paper-yellow-100: #fff9c4;\n      --paper-yellow-200: #fff59d;\n      --paper-yellow-300: #fff176;\n      --paper-yellow-400: #ffee58;\n      --paper-yellow-500: #ffeb3b;\n      --paper-yellow-600: #fdd835;\n      --paper-yellow-700: #fbc02d;\n      --paper-yellow-800: #f9a825;\n      --paper-yellow-900: #f57f17;\n      --paper-yellow-a100: #ffff8d;\n      --paper-yellow-a200: #ffff00;\n      --paper-yellow-a400: #ffea00;\n      --paper-yellow-a700: #ffd600;\n\n      --paper-amber-50: #fff8e1;\n      --paper-amber-100: #ffecb3;\n      --paper-amber-200: #ffe082;\n      --paper-amber-300: #ffd54f;\n      --paper-amber-400: #ffca28;\n      --paper-amber-500: #ffc107;\n      --paper-amber-600: #ffb300;\n      --paper-amber-700: #ffa000;\n      --paper-amber-800: #ff8f00;\n      --paper-amber-900: #ff6f00;\n      --paper-amber-a100: #ffe57f;\n      --paper-amber-a200: #ffd740;\n      --paper-amber-a400: #ffc400;\n      --paper-amber-a700: #ffab00;\n\n      --paper-orange-50: #fff3e0;\n      --paper-orange-100: #ffe0b2;\n      --paper-orange-200: #ffcc80;\n      --paper-orange-300: #ffb74d;\n      --paper-orange-400: #ffa726;\n      --paper-orange-500: #ff9800;\n      --paper-orange-600: #fb8c00;\n      --paper-orange-700: #f57c00;\n      --paper-orange-800: #ef6c00;\n      --paper-orange-900: #e65100;\n      --paper-orange-a100: #ffd180;\n      --paper-orange-a200: #ffab40;\n      --paper-orange-a400: #ff9100;\n      --paper-orange-a700: #ff6500;\n\n      --paper-deep-orange-50: #fbe9e7;\n      --paper-deep-orange-100: #ffccbc;\n      --paper-deep-orange-200: #ffab91;\n      --paper-deep-orange-300: #ff8a65;\n      --paper-deep-orange-400: #ff7043;\n      --paper-deep-orange-500: #ff5722;\n      --paper-deep-orange-600: #f4511e;\n      --paper-deep-orange-700: #e64a19;\n      --paper-deep-orange-800: #d84315;\n      --paper-deep-orange-900: #bf360c;\n      --paper-deep-orange-a100: #ff9e80;\n      --paper-deep-orange-a200: #ff6e40;\n      --paper-deep-orange-a400: #ff3d00;\n      --paper-deep-orange-a700: #dd2c00;\n\n      --paper-brown-50: #efebe9;\n      --paper-brown-100: #d7ccc8;\n      --paper-brown-200: #bcaaa4;\n      --paper-brown-300: #a1887f;\n      --paper-brown-400: #8d6e63;\n      --paper-brown-500: #795548;\n      --paper-brown-600: #6d4c41;\n      --paper-brown-700: #5d4037;\n      --paper-brown-800: #4e342e;\n      --paper-brown-900: #3e2723;\n\n      --paper-grey-50: #fafafa;\n      --paper-grey-100: #f5f5f5;\n      --paper-grey-200: #eeeeee;\n      --paper-grey-300: #e0e0e0;\n      --paper-grey-400: #bdbdbd;\n      --paper-grey-500: #9e9e9e;\n      --paper-grey-600: #757575;\n      --paper-grey-700: #616161;\n      --paper-grey-800: #424242;\n      --paper-grey-900: #212121;\n\n      --paper-blue-grey-50: #eceff1;\n      --paper-blue-grey-100: #cfd8dc;\n      --paper-blue-grey-200: #b0bec5;\n      --paper-blue-grey-300: #90a4ae;\n      --paper-blue-grey-400: #78909c;\n      --paper-blue-grey-500: #607d8b;\n      --paper-blue-grey-600: #546e7a;\n      --paper-blue-grey-700: #455a64;\n      --paper-blue-grey-800: #37474f;\n      --paper-blue-grey-900: #263238;\n\n      /* opacity for dark text on a light background */\n      --dark-divider-opacity: 0.12;\n      --dark-disabled-opacity: 0.38; /* or hint text or icon */\n      --dark-secondary-opacity: 0.54;\n      --dark-primary-opacity: 0.87;\n\n      /* opacity for light text on a dark background */\n      --light-divider-opacity: 0.12;\n      --light-disabled-opacity: 0.3; /* or hint text or icon */\n      --light-secondary-opacity: 0.7;\n      --light-primary-opacity: 1.0;\n\n    }\n\n  </style>\n</custom-style>\n`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n/* Taken from\n * https://www.google.com/design/spec/style/color.html#color-ui-color-application\n */\nimport '@polymer/polymer/polymer-legacy.js';\nimport './color.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`\n<custom-style>\n  <style is=\"custom-style\">\n    html {\n      /*\n       * You can use these generic variables in your elements for easy theming.\n       * For example, if all your elements use \\`--primary-text-color\\` as its main\n       * color, then switching from a light to a dark theme is just a matter of\n       * changing the value of \\`--primary-text-color\\` in your application.\n       */\n      --primary-text-color: var(--light-theme-text-color);\n      --primary-background-color: var(--light-theme-background-color);\n      --secondary-text-color: var(--light-theme-secondary-color);\n      --disabled-text-color: var(--light-theme-disabled-color);\n      --divider-color: var(--light-theme-divider-color);\n      --error-color: var(--paper-deep-orange-a700);\n\n      /*\n       * Primary and accent colors. Also see color.js for more colors.\n       */\n      --primary-color: var(--paper-indigo-500);\n      --light-primary-color: var(--paper-indigo-100);\n      --dark-primary-color: var(--paper-indigo-700);\n\n      --accent-color: var(--paper-pink-a200);\n      --light-accent-color: var(--paper-pink-a100);\n      --dark-accent-color: var(--paper-pink-a400);\n\n\n      /*\n       * Material Design Light background theme\n       */\n      --light-theme-background-color: #ffffff;\n      --light-theme-base-color: #000000;\n      --light-theme-text-color: var(--paper-grey-900);\n      --light-theme-secondary-color: #737373;  /* for secondary text and icons */\n      --light-theme-disabled-color: #9b9b9b;  /* disabled/hint text */\n      --light-theme-divider-color: #dbdbdb;\n\n      /*\n       * Material Design Dark background theme\n       */\n      --dark-theme-background-color: var(--paper-grey-900);\n      --dark-theme-base-color: #ffffff;\n      --dark-theme-text-color: #ffffff;\n      --dark-theme-secondary-color: #bcbcbc;  /* for secondary text and icons */\n      --dark-theme-disabled-color: #646464;  /* disabled/hint text */\n      --dark-theme-divider-color: #3c3c3c;\n\n      /*\n       * Deprecated values because of their confusing names.\n       */\n      --text-primary-color: var(--dark-theme-text-color);\n      --default-primary-color: var(--primary-color);\n    }\n  </style>\n</custom-style>`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n/**\nMaterial design:\n[Cards](https://www.google.com/design/spec/components/cards.html)\n\nShared styles that you can apply to an element to renders two shadows on top\nof each other,that create the effect of a lifted piece of paper.\n\nExample:\n\n    <custom-style>\n      <style is=\"custom-style\" include=\"paper-material-styles\"></style>\n    </custom-style>\n\n    <div class=\"paper-material\" elevation=\"1\">\n      ... content ...\n    </div>\n\n@group Paper Elements\n@demo demo/index.html\n*/\n\nimport '@polymer/polymer/polymer-legacy.js';\nimport '../shadow.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`\n<dom-module id=\"paper-material-styles\">\n  <template>\n    <style>\n      html {\n        --paper-material: {\n          display: block;\n          position: relative;\n        };\n        --paper-material-elevation-1: {\n          @apply --shadow-elevation-2dp;\n        };\n        --paper-material-elevation-2: {\n          @apply --shadow-elevation-4dp;\n        };\n        --paper-material-elevation-3: {\n          @apply --shadow-elevation-6dp;\n        };\n        --paper-material-elevation-4: {\n          @apply --shadow-elevation-8dp;\n        };\n        --paper-material-elevation-5: {\n          @apply --shadow-elevation-16dp;\n        };\n      }\n      .paper-material {\n        @apply --paper-material;\n      }\n      .paper-material[elevation=\"1\"] {\n        @apply --paper-material-elevation-1;\n      }\n      .paper-material[elevation=\"2\"] {\n        @apply --paper-material-elevation-2;\n      }\n      .paper-material[elevation=\"3\"] {\n        @apply --paper-material-elevation-3;\n      }\n      .paper-material[elevation=\"4\"] {\n        @apply --paper-material-elevation-4;\n      }\n      .paper-material[elevation=\"5\"] {\n        @apply --paper-material-elevation-5;\n      }\n\n      /* Duplicate the styles because of https://github.com/webcomponents/shadycss/issues/193 */\n      :host {\n        --paper-material: {\n          display: block;\n          position: relative;\n        };\n        --paper-material-elevation-1: {\n          @apply --shadow-elevation-2dp;\n        };\n        --paper-material-elevation-2: {\n          @apply --shadow-elevation-4dp;\n        };\n        --paper-material-elevation-3: {\n          @apply --shadow-elevation-6dp;\n        };\n        --paper-material-elevation-4: {\n          @apply --shadow-elevation-8dp;\n        };\n        --paper-material-elevation-5: {\n          @apply --shadow-elevation-16dp;\n        };\n      }\n      :host(.paper-material) {\n        @apply --paper-material;\n      }\n      :host(.paper-material[elevation=\"1\"]) {\n        @apply --paper-material-elevation-1;\n      }\n      :host(.paper-material[elevation=\"2\"]) {\n        @apply --paper-material-elevation-2;\n      }\n      :host(.paper-material[elevation=\"3\"]) {\n        @apply --paper-material-elevation-3;\n      }\n      :host(.paper-material[elevation=\"4\"]) {\n        @apply --paper-material-elevation-4;\n      }\n      :host(.paper-material[elevation=\"5\"]) {\n        @apply --paper-material-elevation-5;\n      }\n    </style>\n  </template>\n</dom-module>`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`\n<custom-style>\n  <style is=\"custom-style\">\n    html {\n\n      --shadow-transition: {\n        transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);\n      };\n\n      --shadow-none: {\n        box-shadow: none;\n      };\n\n      /* from http://codepen.io/shyndman/pen/c5394ddf2e8b2a5c9185904b57421cdb */\n\n      --shadow-elevation-2dp: {\n        box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n                    0 1px 5px 0 rgba(0, 0, 0, 0.12),\n                    0 3px 1px -2px rgba(0, 0, 0, 0.2);\n      };\n\n      --shadow-elevation-3dp: {\n        box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14),\n                    0 1px 8px 0 rgba(0, 0, 0, 0.12),\n                    0 3px 3px -2px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-4dp: {\n        box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),\n                    0 1px 10px 0 rgba(0, 0, 0, 0.12),\n                    0 2px 4px -1px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-6dp: {\n        box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14),\n                    0 1px 18px 0 rgba(0, 0, 0, 0.12),\n                    0 3px 5px -1px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-8dp: {\n        box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n                    0 3px 14px 2px rgba(0, 0, 0, 0.12),\n                    0 5px 5px -3px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-12dp: {\n        box-shadow: 0 12px 16px 1px rgba(0, 0, 0, 0.14),\n                    0 4px 22px 3px rgba(0, 0, 0, 0.12),\n                    0 6px 7px -4px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-16dp: {\n        box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),\n                    0  6px 30px 5px rgba(0, 0, 0, 0.12),\n                    0  8px 10px -5px rgba(0, 0, 0, 0.4);\n      };\n\n      --shadow-elevation-24dp: {\n        box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14),\n                    0 9px 46px 8px rgba(0, 0, 0, 0.12),\n                    0 11px 15px -7px rgba(0, 0, 0, 0.4);\n      };\n    }\n  </style>\n</custom-style>`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n\nexport {}; // ensure this file can only be parsed as a module.\n\n// Give the user the choice to opt out of font loading.\nif (!window.polymerSkipLoadingFontRoboto) {\n  const link = document.createElement('link');\n  link.rel = 'stylesheet';\n  link.type = 'text/css';\n  link.crossOrigin = 'anonymous';\n  link.href =\n      'https://fonts.googleapis.com/css?family=Roboto+Mono:400,700|Roboto:400,300,300italic,400italic,500,500italic,700,700italic';\n  document.head.appendChild(link);\n}\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n/*\nTypographic styles are provided matching the Material Design standard styles:\nhttp://www.google.com/design/spec/style/typography.html#typography-standard-styles\n\nNote that these are English/Latin centric styles. You may need to further adjust\nline heights and weights for CJK typesetting. See the notes in the Material\nDesign typography section.\n*/\n\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/font-roboto/roboto.js';\n\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nconst template = html`<custom-style>\n  <style is=\"custom-style\">\n    html {\n\n      /* Shared Styles */\n      --paper-font-common-base: {\n        font-family: 'Roboto', 'Noto', sans-serif;\n        -webkit-font-smoothing: antialiased;\n      };\n\n      --paper-font-common-code: {\n        font-family: 'Roboto Mono', 'Consolas', 'Menlo', monospace;\n        -webkit-font-smoothing: antialiased;\n      };\n\n      --paper-font-common-expensive-kerning: {\n        text-rendering: optimizeLegibility;\n      };\n\n      --paper-font-common-nowrap: {\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      };\n\n      /* Material Font Styles */\n\n      --paper-font-display4: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 112px;\n        font-weight: 300;\n        letter-spacing: -.044em;\n        line-height: 120px;\n      };\n\n      --paper-font-display3: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 56px;\n        font-weight: 400;\n        letter-spacing: -.026em;\n        line-height: 60px;\n      };\n\n      --paper-font-display2: {\n        @apply --paper-font-common-base;\n\n        font-size: 45px;\n        font-weight: 400;\n        letter-spacing: -.018em;\n        line-height: 48px;\n      };\n\n      --paper-font-display1: {\n        @apply --paper-font-common-base;\n\n        font-size: 34px;\n        font-weight: 400;\n        letter-spacing: -.01em;\n        line-height: 40px;\n      };\n\n      --paper-font-headline: {\n        @apply --paper-font-common-base;\n\n        font-size: 24px;\n        font-weight: 400;\n        letter-spacing: -.012em;\n        line-height: 32px;\n      };\n\n      --paper-font-title: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 20px;\n        font-weight: 500;\n        line-height: 28px;\n      };\n\n      --paper-font-subhead: {\n        @apply --paper-font-common-base;\n\n        font-size: 16px;\n        font-weight: 400;\n        line-height: 24px;\n      };\n\n      --paper-font-body2: {\n        @apply --paper-font-common-base;\n\n        font-size: 14px;\n        font-weight: 500;\n        line-height: 24px;\n      };\n\n      --paper-font-body1: {\n        @apply --paper-font-common-base;\n\n        font-size: 14px;\n        font-weight: 400;\n        line-height: 20px;\n      };\n\n      --paper-font-caption: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 12px;\n        font-weight: 400;\n        letter-spacing: 0.011em;\n        line-height: 20px;\n      };\n\n      --paper-font-menu: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 13px;\n        font-weight: 500;\n        line-height: 24px;\n      };\n\n      --paper-font-button: {\n        @apply --paper-font-common-base;\n        @apply --paper-font-common-nowrap;\n\n        font-size: 14px;\n        font-weight: 500;\n        letter-spacing: 0.018em;\n        line-height: 24px;\n        text-transform: uppercase;\n      };\n\n      --paper-font-code2: {\n        @apply --paper-font-common-code;\n\n        font-size: 14px;\n        font-weight: 700;\n        line-height: 20px;\n      };\n\n      --paper-font-code1: {\n        @apply --paper-font-common-code;\n\n        font-size: 14px;\n        font-weight: 500;\n        line-height: 20px;\n      };\n\n    }\n\n  </style>\n</custom-style>`;\ntemplate.setAttribute('style', 'display: none;');\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {IronButtonState} from '@polymer/iron-behaviors/iron-button-state.js';\nimport {IronControlState} from '@polymer/iron-behaviors/iron-control-state.js';\nimport {PaperRippleBehavior} from '@polymer/paper-behaviors/paper-ripple-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/*\n`paper-tab` is styled to look like a tab. It should be used in conjunction with\n`paper-tabs`.\n\nExample:\n\n    <paper-tabs selected=\"0\">\n      <paper-tab>TAB 1</paper-tab>\n      <paper-tab>TAB 2</paper-tab>\n      <paper-tab>TAB 3</paper-tab>\n    </paper-tabs>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-tab-ink` | Ink color | `--paper-yellow-a100`\n`--paper-tab` | Mixin applied to the tab | `{}`\n`--paper-tab-content` | Mixin applied to the tab content | `{}`\n`--paper-tab-content-focused` | Mixin applied to the tab content when the tab is focused | `{}`\n`--paper-tab-content-unselected` | Mixin applied to the tab content when the tab is not selected | `{}`\n\nThis element applies the mixin `--paper-font-common-base` but does not import\n`paper-styles/typography.html`. In order to apply the `Roboto` font to this\nelement, make sure you've imported `paper-styles/typography.html`.\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        @apply --layout-inline;\n        @apply --layout-center;\n        @apply --layout-center-justified;\n        @apply --layout-flex-auto;\n\n        position: relative;\n        padding: 0 12px;\n        overflow: hidden;\n        cursor: pointer;\n        vertical-align: middle;\n\n        @apply --paper-font-common-base;\n        @apply --paper-tab;\n      }\n\n      :host(:focus) {\n        outline: none;\n      }\n\n      :host([link]) {\n        padding: 0;\n      }\n\n      .tab-content {\n        height: 100%;\n        transform: translateZ(0);\n          -webkit-transform: translateZ(0);\n        transition: opacity 0.1s cubic-bezier(0.4, 0.0, 1, 1);\n        @apply --layout-horizontal;\n        @apply --layout-center-center;\n        @apply --layout-flex-auto;\n        @apply --paper-tab-content;\n      }\n\n      :host(:not(.iron-selected)) > .tab-content {\n        opacity: 0.8;\n\n        @apply --paper-tab-content-unselected;\n      }\n\n      :host(:focus) .tab-content {\n        opacity: 1;\n        font-weight: 700;\n\n        @apply --paper-tab-content-focused;\n      }\n\n      paper-ripple {\n        color: var(--paper-tab-ink, var(--paper-yellow-a100));\n      }\n\n      .tab-content > ::slotted(a) {\n        @apply --layout-flex-auto;\n\n        height: 100%;\n      }\n    </style>\n\n    <div class=\"tab-content\">\n      <slot></slot>\n    </div>\n`,\n\n  is: 'paper-tab',\n\n  behaviors: [IronControlState, IronButtonState, PaperRippleBehavior],\n\n  properties: {\n\n    /**\n     * If true, the tab will forward keyboard clicks (enter/space) to\n     * the first anchor element found in its descendants\n     */\n    link: {type: Boolean, value: false, reflectToAttribute: true}\n\n  },\n\n  /** @private */\n  hostAttributes: {role: 'tab'},\n\n  listeners: {down: '_updateNoink', tap: '_onTap'},\n\n  attached: function() {\n    this._updateNoink();\n  },\n\n  get _parentNoink() {\n    var parent = dom(this).parentNode;\n    return !!parent && !!parent.noink;\n  },\n\n  _updateNoink: function() {\n    this.noink = !!this.noink || !!this._parentNoink;\n  },\n\n  _onTap: function(event) {\n    if (this.link) {\n      var anchor = this.queryEffectiveChildren('a');\n\n      if (!anchor) {\n        return;\n      }\n\n      // Don't get stuck in a loop delegating\n      // the listener from the child anchor\n      if (event.target === anchor) {\n        return;\n      }\n\n      anchor.click();\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/iron-iconset-svg/iron-iconset-svg.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nconst template = html`<iron-iconset-svg name=\"paper-tabs\" size=\"24\">\n<svg><defs>\n<g id=\"chevron-left\"><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path></g>\n<g id=\"chevron-right\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path></g>\n</defs></svg>\n</iron-iconset-svg>`;\ndocument.head.appendChild(template.content);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/iron-icon/iron-icon.js';\nimport '@polymer/paper-icon-button/paper-icon-button.js';\nimport '@polymer/paper-styles/color.js';\nimport './paper-tabs-icons.js';\nimport './paper-tab.js';\n\nimport {IronMenuBehaviorImpl} from '@polymer/iron-menu-behavior/iron-menu-behavior.js';\nimport {IronMenubarBehavior} from '@polymer/iron-menu-behavior/iron-menubar-behavior.js';\nimport {IronResizableBehavior} from '@polymer/iron-resizable-behavior/iron-resizable-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design: [Tabs](https://www.google.com/design/spec/components/tabs.html)\n\n`paper-tabs` makes it easy to explore and switch between different views or\nfunctional aspects of an app, or to browse categorized data sets.\n\nUse `selected` property to get or set the selected tab.\n\nExample:\n\n    <paper-tabs selected=\"0\">\n      <paper-tab>TAB 1</paper-tab>\n      <paper-tab>TAB 2</paper-tab>\n      <paper-tab>TAB 3</paper-tab>\n    </paper-tabs>\n\nSee <a href=\"?active=paper-tab\">paper-tab</a> for more information about\n`paper-tab`.\n\nA common usage for `paper-tabs` is to use it along with `iron-pages` to switch\nbetween different views.\n\n    <paper-tabs selected=\"{{selected}}\">\n      <paper-tab>Tab 1</paper-tab>\n      <paper-tab>Tab 2</paper-tab>\n      <paper-tab>Tab 3</paper-tab>\n    </paper-tabs>\n\n    <iron-pages selected=\"{{selected}}\">\n      <div>Page 1</div>\n      <div>Page 2</div>\n      <div>Page 3</div>\n    </iron-pages>\n\nTo use links in tabs, add `link` attribute to `paper-tab` and put an `<a>`\nelement in `paper-tab` with a `tabindex` of -1.\n\nExample:\n\n<pre><code>\n&lt;style is=\"custom-style\">\n  .link {\n    &#64;apply --layout-horizontal;\n    &#64;apply --layout-center-center;\n  }\n&lt;/style>\n\n&lt;paper-tabs selected=\"0\">\n  &lt;paper-tab link>\n    &lt;a href=\"#link1\" class=\"link\" tabindex=\"-1\">TAB ONE&lt;/a>\n  &lt;/paper-tab>\n  &lt;paper-tab link>\n    &lt;a href=\"#link2\" class=\"link\" tabindex=\"-1\">TAB TWO&lt;/a>\n  &lt;/paper-tab>\n  &lt;paper-tab link>\n    &lt;a href=\"#link3\" class=\"link\" tabindex=\"-1\">TAB THREE&lt;/a>\n  &lt;/paper-tab>\n&lt;/paper-tabs>\n</code></pre>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-tabs-selection-bar-color` | Color for the selection bar | `--paper-yellow-a100`\n`--paper-tabs-selection-bar` | Mixin applied to the selection bar | `{}`\n`--paper-tabs` | Mixin applied to the tabs | `{}`\n`--paper-tabs-content` | Mixin applied to the content container of tabs | `{}`\n`--paper-tabs-container` | Mixin applied to the layout container of tabs | `{}`\n\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        @apply --layout;\n        @apply --layout-center;\n\n        height: 48px;\n        font-size: 14px;\n        font-weight: 500;\n        overflow: hidden;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        -webkit-user-select: none;\n        user-select: none;\n\n        /* NOTE: Both values are needed, since some phones require the value to be \\`transparent\\`. */\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        -webkit-tap-highlight-color: transparent;\n\n        @apply --paper-tabs;\n      }\n\n      :host(:dir(rtl)) {\n        @apply --layout-horizontal-reverse;\n      }\n\n      #tabsContainer {\n        position: relative;\n        height: 100%;\n        white-space: nowrap;\n        overflow: hidden;\n        @apply --layout-flex-auto;\n        @apply --paper-tabs-container;\n      }\n\n      #tabsContent {\n        height: 100%;\n        -moz-flex-basis: auto;\n        -ms-flex-basis: auto;\n        flex-basis: auto;\n        @apply --paper-tabs-content;\n      }\n\n      #tabsContent.scrollable {\n        position: absolute;\n        white-space: nowrap;\n      }\n\n      #tabsContent:not(.scrollable),\n      #tabsContent.scrollable.fit-container {\n        @apply --layout-horizontal;\n      }\n\n      #tabsContent.scrollable.fit-container {\n        min-width: 100%;\n      }\n\n      #tabsContent.scrollable.fit-container > ::slotted(*) {\n        /* IE - prevent tabs from compressing when they should scroll. */\n        -ms-flex: 1 0 auto;\n        -webkit-flex: 1 0 auto;\n        flex: 1 0 auto;\n      }\n\n      .hidden {\n        display: none;\n      }\n\n      .not-visible {\n        opacity: 0;\n        cursor: default;\n      }\n\n      paper-icon-button {\n        width: 48px;\n        height: 48px;\n        padding: 12px;\n        margin: 0 4px;\n      }\n\n      #selectionBar {\n        position: absolute;\n        height: 0;\n        bottom: 0;\n        left: 0;\n        right: 0;\n        border-bottom: 2px solid var(--paper-tabs-selection-bar-color, var(--paper-yellow-a100));\n          -webkit-transform: scale(0);\n        transform: scale(0);\n          -webkit-transform-origin: left center;\n        transform-origin: left center;\n          transition: -webkit-transform;\n        transition: transform;\n\n        @apply --paper-tabs-selection-bar;\n      }\n\n      #selectionBar.align-bottom {\n        top: 0;\n        bottom: auto;\n      }\n\n      #selectionBar.expand {\n        transition-duration: 0.15s;\n        transition-timing-function: cubic-bezier(0.4, 0.0, 1, 1);\n      }\n\n      #selectionBar.contract {\n        transition-duration: 0.18s;\n        transition-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);\n      }\n\n      #tabsContent > ::slotted(:not(#selectionBar)) {\n        height: 100%;\n      }\n    </style>\n\n    <paper-icon-button icon=\"paper-tabs:chevron-left\" class$=\"[[_computeScrollButtonClass(_leftHidden, scrollable, hideScrollButtons)]]\" on-up=\"_onScrollButtonUp\" on-down=\"_onLeftScrollButtonDown\" tabindex=\"-1\"></paper-icon-button>\n\n    <div id=\"tabsContainer\" on-track=\"_scroll\" on-down=\"_down\">\n      <div id=\"tabsContent\" class$=\"[[_computeTabsContentClass(scrollable, fitContainer)]]\">\n        <div id=\"selectionBar\" class$=\"[[_computeSelectionBarClass(noBar, alignBottom)]]\" on-transitionend=\"_onBarTransitionEnd\"></div>\n        <slot></slot>\n      </div>\n    </div>\n\n    <paper-icon-button icon=\"paper-tabs:chevron-right\" class$=\"[[_computeScrollButtonClass(_rightHidden, scrollable, hideScrollButtons)]]\" on-up=\"_onScrollButtonUp\" on-down=\"_onRightScrollButtonDown\" tabindex=\"-1\"></paper-icon-button>\n`,\n\n  is: 'paper-tabs',\n  behaviors: [IronResizableBehavior, IronMenubarBehavior],\n\n  properties: {\n    /**\n     * If true, ink ripple effect is disabled. When this property is changed,\n     * all descendant `<paper-tab>` elements have their `noink` property\n     * changed to the new value as well.\n     */\n    noink: {type: Boolean, value: false, observer: '_noinkChanged'},\n\n    /**\n     * If true, the bottom bar to indicate the selected tab will not be shown.\n     */\n    noBar: {type: Boolean, value: false},\n\n    /**\n     * If true, the slide effect for the bottom bar is disabled.\n     */\n    noSlide: {type: Boolean, value: false},\n\n    /**\n     * If true, tabs are scrollable and the tab width is based on the label\n     * width.\n     */\n    scrollable: {type: Boolean, value: false},\n\n    /**\n     * If true, tabs expand to fit their container. This currently only applies\n     * when scrollable is true.\n     */\n    fitContainer: {type: Boolean, value: false},\n\n    /**\n     * If true, dragging on the tabs to scroll is disabled.\n     */\n    disableDrag: {type: Boolean, value: false},\n\n    /**\n     * If true, scroll buttons (left/right arrow) will be hidden for scrollable\n     * tabs.\n     */\n    hideScrollButtons: {type: Boolean, value: false},\n\n    /**\n     * If true, the tabs are aligned to bottom (the selection bar appears at the\n     * top).\n     */\n    alignBottom: {type: Boolean, value: false},\n\n    selectable: {type: String, value: 'paper-tab'},\n\n    /**\n     * If true, tabs are automatically selected when focused using the\n     * keyboard.\n     */\n    autoselect: {type: Boolean, value: false},\n\n    /**\n     * The delay (in milliseconds) between when the user stops interacting\n     * with the tabs through the keyboard and when the focused item is\n     * automatically selected (if `autoselect` is true).\n     */\n    autoselectDelay: {type: Number, value: 0},\n\n    _step: {type: Number, value: 10},\n\n    _holdDelay: {type: Number, value: 1},\n\n    _leftHidden: {type: Boolean, value: false},\n\n    _rightHidden: {type: Boolean, value: false},\n\n    _previousTab: {type: Object}\n  },\n\n  /** @private */\n  hostAttributes: {role: 'tablist'},\n\n  listeners: {\n    'iron-resize': '_onTabSizingChanged',\n    'iron-items-changed': '_onTabSizingChanged',\n    'iron-select': '_onIronSelect',\n    'iron-deselect': '_onIronDeselect'\n  },\n\n  /**\n   * @type {!Object}\n   */\n  keyBindings: {'left:keyup right:keyup': '_onArrowKeyup'},\n\n  created: function() {\n    this._holdJob = null;\n    this._pendingActivationItem = undefined;\n    this._pendingActivationTimeout = undefined;\n    this._bindDelayedActivationHandler =\n        this._delayedActivationHandler.bind(this);\n    this.addEventListener('blur', this._onBlurCapture.bind(this), true);\n  },\n\n  ready: function() {\n    this.setScrollDirection('y', this.$.tabsContainer);\n  },\n\n  detached: function() {\n    this._cancelPendingActivation();\n  },\n\n  _noinkChanged: function(noink) {\n    var childTabs = dom(this).querySelectorAll('paper-tab');\n    childTabs.forEach(\n        noink ? this._setNoinkAttribute : this._removeNoinkAttribute);\n  },\n\n  _setNoinkAttribute: function(element) {\n    element.setAttribute('noink', '');\n  },\n\n  _removeNoinkAttribute: function(element) {\n    element.removeAttribute('noink');\n  },\n\n  _computeScrollButtonClass: function(\n      hideThisButton, scrollable, hideScrollButtons) {\n    if (!scrollable || hideScrollButtons) {\n      return 'hidden';\n    }\n\n    if (hideThisButton) {\n      return 'not-visible';\n    }\n\n    return '';\n  },\n\n  _computeTabsContentClass: function(scrollable, fitContainer) {\n    return scrollable ? 'scrollable' + (fitContainer ? ' fit-container' : '') :\n                        ' fit-container';\n  },\n\n  _computeSelectionBarClass: function(noBar, alignBottom) {\n    if (noBar) {\n      return 'hidden';\n    } else if (alignBottom) {\n      return 'align-bottom';\n    }\n\n    return '';\n  },\n\n  // TODO(cdata): Add `track` response back in when gesture lands.\n\n  _onTabSizingChanged: function() {\n    this.debounce('_onTabSizingChanged', function() {\n      this._scroll();\n      this._tabChanged(this.selectedItem);\n    }, 10);\n  },\n\n  _onIronSelect: function(event) {\n    this._tabChanged(event.detail.item, this._previousTab);\n    this._previousTab = event.detail.item;\n    this.cancelDebouncer('tab-changed');\n  },\n\n  _onIronDeselect: function(event) {\n    this.debounce('tab-changed', function() {\n      this._tabChanged(null, this._previousTab);\n      this._previousTab = null;\n      // See polymer/polymer#1305\n    }, 1);\n  },\n\n  _activateHandler: function() {\n    // Cancel item activations scheduled by keyboard events when any other\n    // action causes an item to be activated (e.g. clicks).\n    this._cancelPendingActivation();\n\n    IronMenuBehaviorImpl._activateHandler.apply(this, arguments);\n  },\n\n  /**\n   * Activates an item after a delay (in milliseconds).\n   */\n  _scheduleActivation: function(item, delay) {\n    this._pendingActivationItem = item;\n    this._pendingActivationTimeout =\n        this.async(this._bindDelayedActivationHandler, delay);\n  },\n\n  /**\n   * Activates the last item given to `_scheduleActivation`.\n   */\n  _delayedActivationHandler: function() {\n    var item = this._pendingActivationItem;\n    this._pendingActivationItem = undefined;\n    this._pendingActivationTimeout = undefined;\n    item.fire(this.activateEvent, null, {bubbles: true, cancelable: true});\n  },\n\n  /**\n   * Cancels a previously scheduled item activation made with\n   * `_scheduleActivation`.\n   */\n  _cancelPendingActivation: function() {\n    if (this._pendingActivationTimeout !== undefined) {\n      this.cancelAsync(this._pendingActivationTimeout);\n      this._pendingActivationItem = undefined;\n      this._pendingActivationTimeout = undefined;\n    }\n  },\n\n  _onArrowKeyup: function(event) {\n    if (this.autoselect) {\n      this._scheduleActivation(this.focusedItem, this.autoselectDelay);\n    }\n  },\n\n  _onBlurCapture: function(event) {\n    // Cancel a scheduled item activation (if any) when that item is\n    // blurred.\n    if (event.target === this._pendingActivationItem) {\n      this._cancelPendingActivation();\n    }\n  },\n\n  get _tabContainerScrollSize() {\n    return Math.max(\n        0, this.$.tabsContainer.scrollWidth - this.$.tabsContainer.offsetWidth);\n  },\n\n  _scroll: function(e, detail) {\n    if (!this.scrollable) {\n      return;\n    }\n\n    var ddx = (detail && -detail.ddx) || 0;\n    this._affectScroll(ddx);\n  },\n\n  _down: function(e) {\n    // go one beat async to defeat IronMenuBehavior\n    // autorefocus-on-no-selection timeout\n    this.async(function() {\n      if (this._defaultFocusAsync) {\n        this.cancelAsync(this._defaultFocusAsync);\n        this._defaultFocusAsync = null;\n      }\n    }, 1);\n  },\n\n  _affectScroll: function(dx) {\n    this.$.tabsContainer.scrollLeft += dx;\n\n    var scrollLeft = this.$.tabsContainer.scrollLeft;\n\n    this._leftHidden = scrollLeft === 0;\n    this._rightHidden = scrollLeft === this._tabContainerScrollSize;\n  },\n\n  _onLeftScrollButtonDown: function() {\n    this._scrollToLeft();\n    this._holdJob = setInterval(this._scrollToLeft.bind(this), this._holdDelay);\n  },\n\n  _onRightScrollButtonDown: function() {\n    this._scrollToRight();\n    this._holdJob =\n        setInterval(this._scrollToRight.bind(this), this._holdDelay);\n  },\n\n  _onScrollButtonUp: function() {\n    clearInterval(this._holdJob);\n    this._holdJob = null;\n  },\n\n  _scrollToLeft: function() {\n    this._affectScroll(-this._step);\n  },\n\n  _scrollToRight: function() {\n    this._affectScroll(this._step);\n  },\n\n  _tabChanged: function(tab, old) {\n    if (!tab) {\n      // Remove the bar without animation.\n      this.$.selectionBar.classList.remove('expand');\n      this.$.selectionBar.classList.remove('contract');\n      this._positionBar(0, 0);\n      return;\n    }\n\n    var r = this.$.tabsContent.getBoundingClientRect();\n    var w = r.width;\n    var tabRect = tab.getBoundingClientRect();\n    var tabOffsetLeft = tabRect.left - r.left;\n\n    this._pos = {\n      width: this._calcPercent(tabRect.width, w),\n      left: this._calcPercent(tabOffsetLeft, w)\n    };\n\n    if (this.noSlide || old == null) {\n      // Position the bar without animation.\n      this.$.selectionBar.classList.remove('expand');\n      this.$.selectionBar.classList.remove('contract');\n      this._positionBar(this._pos.width, this._pos.left);\n      return;\n    }\n\n    var oldRect = old.getBoundingClientRect();\n    var oldIndex = this.items.indexOf(old);\n    var index = this.items.indexOf(tab);\n    var m = 5;\n\n    // bar animation: expand\n    this.$.selectionBar.classList.add('expand');\n\n    var moveRight = oldIndex < index;\n    var isRTL = this._isRTL;\n    if (isRTL) {\n      moveRight = !moveRight;\n    }\n\n    if (moveRight) {\n      this._positionBar(\n          this._calcPercent(tabRect.left + tabRect.width - oldRect.left, w) - m,\n          this._left);\n    } else {\n      this._positionBar(\n          this._calcPercent(oldRect.left + oldRect.width - tabRect.left, w) - m,\n          this._calcPercent(tabOffsetLeft, w) + m);\n    }\n\n    if (this.scrollable) {\n      this._scrollToSelectedIfNeeded(tabRect.width, tabOffsetLeft);\n    }\n  },\n\n  _scrollToSelectedIfNeeded: function(tabWidth, tabOffsetLeft) {\n    var l = tabOffsetLeft - this.$.tabsContainer.scrollLeft;\n    if (l < 0) {\n      this.$.tabsContainer.scrollLeft += l;\n    } else {\n      l += (tabWidth - this.$.tabsContainer.offsetWidth);\n      if (l > 0) {\n        this.$.tabsContainer.scrollLeft += l;\n      }\n    }\n  },\n\n  _calcPercent: function(w, w0) {\n    return 100 * w / w0;\n  },\n\n  _positionBar: function(width, left) {\n    width = width || 0;\n    left = left || 0;\n\n    this._width = width;\n    this._left = left;\n    this.transform(\n        'translateX(' + left + '%) scaleX(' + (width / 100) + ')',\n        this.$.selectionBar);\n  },\n\n  _onBarTransitionEnd: function(e) {\n    var cl = this.$.selectionBar.classList;\n    // bar animation: expand -> contract\n    if (cl.contains('expand')) {\n      cl.remove('expand');\n      cl.add('contract');\n      this._positionBar(this._pos.width, this._pos.left);\n      // bar animation done\n    } else if (cl.contains('contract')) {\n      cl.remove('contract');\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer.js';\nimport {IronOverlayBehavior, IronOverlayBehaviorImpl} from '@polymer/iron-overlay-behavior/iron-overlay-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {Base} from '@polymer/polymer/polymer-legacy.js';\n\n// Keeps track of the toast currently opened.\nvar currentToast = null;\n\n/**\nMaterial design: [Snackbars &\ntoasts](https://www.google.com/design/spec/components/snackbars-toasts.html)\n\n`paper-toast` provides a subtle notification toast. Only one `paper-toast` will\nbe visible on screen.\n\nUse `opened` to show the toast:\n\nExample:\n\n    <paper-toast text=\"Hello world!\" opened></paper-toast>\n\nAlso `open()` or `show()` can be used to show the toast:\n\nExample:\n\n    <paper-button on-click=\"openToast\">Open Toast</paper-button>\n    <paper-toast id=\"toast\" text=\"Hello world!\"></paper-toast>\n\n    ...\n\n    openToast: function() {\n      this.$.toast.open();\n    }\n\nSet `duration` to 0, a negative number or Infinity to persist the toast on\nscreen:\n\nExample:\n\n    <paper-toast text=\"Terms and conditions\" opened duration=\"0\">\n      <a href=\"#\">Show more</a>\n    </paper-toast>\n\n\n### Styling\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-toast-background-color` | The paper-toast background-color | `#323232`\n`--paper-toast-color` | The paper-toast color | `#f1f1f1`\n\nThis element applies the mixin `--paper-font-common-base` but does not import\n`paper-styles/typography.html`. In order to apply the `Roboto` font to this\nelement, make sure you've imported `paper-styles/typography.html`.\n\n@group Paper Elements\n@element paper-toast\n@demo demo/index.html\n@hero hero.svg\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        position: fixed;\n        background-color: var(--paper-toast-background-color, #323232);\n        color: var(--paper-toast-color, #f1f1f1);\n        min-height: 48px;\n        min-width: 288px;\n        padding: 16px 24px;\n        box-sizing: border-box;\n        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n        border-radius: 2px;\n        margin: 12px;\n        font-size: 14px;\n        cursor: default;\n        -webkit-transition: -webkit-transform 0.3s, opacity 0.3s;\n        transition: transform 0.3s, opacity 0.3s;\n        opacity: 0;\n        -webkit-transform: translateY(100px);\n        transform: translateY(100px);\n        @apply --paper-font-common-base;\n      }\n\n      :host(.capsule) {\n        border-radius: 24px;\n      }\n\n      :host(.fit-bottom) {\n        width: 100%;\n        min-width: 0;\n        border-radius: 0;\n        margin: 0;\n      }\n\n      :host(.paper-toast-open) {\n        opacity: 1;\n        -webkit-transform: translateY(0px);\n        transform: translateY(0px);\n      }\n    </style>\n\n    <span id=\"label\">{{text}}</span>\n    <slot></slot>\n`,\n\n  is: 'paper-toast',\n  behaviors: [IronOverlayBehavior],\n\n  properties: {\n    /**\n     * The element to fit `this` into.\n     * Overridden from `Polymer.IronFitBehavior`.\n     */\n    fitInto: {type: Object, value: window, observer: '_onFitIntoChanged'},\n\n    /**\n     * The orientation against which to align the dropdown content\n     * horizontally relative to `positionTarget`.\n     * Overridden from `Polymer.IronFitBehavior`.\n     */\n    horizontalAlign: {type: String, value: 'left'},\n\n    /**\n     * The orientation against which to align the dropdown content\n     * vertically relative to `positionTarget`.\n     * Overridden from `Polymer.IronFitBehavior`.\n     */\n    verticalAlign: {type: String, value: 'bottom'},\n\n    /**\n     * The duration in milliseconds to show the toast.\n     * Set to `0`, a negative number, or `Infinity`, to disable the\n     * toast auto-closing.\n     */\n    duration: {type: Number, value: 3000},\n\n    /**\n     * The text to display in the toast.\n     */\n    text: {type: String, value: ''},\n\n    /**\n     * Overridden from `IronOverlayBehavior`.\n     * Set to false to enable closing of the toast by clicking outside it.\n     */\n    noCancelOnOutsideClick: {type: Boolean, value: true},\n\n    /**\n     * Overridden from `IronOverlayBehavior`.\n     * Set to true to disable auto-focusing the toast or child nodes with\n     * the `autofocus` attribute` when the overlay is opened.\n     */\n    noAutoFocus: {type: Boolean, value: true}\n  },\n\n  listeners: {'transitionend': '__onTransitionEnd'},\n\n  /**\n   * Read-only. Deprecated. Use `opened` from `IronOverlayBehavior`.\n   * @property visible\n   * @deprecated\n   */\n  get visible() {\n    Base._warn('`visible` is deprecated, use `opened` instead');\n    return this.opened;\n  },\n\n  /**\n   * Read-only. Can auto-close if duration is a positive finite number.\n   * @property _canAutoClose\n   */\n  get _canAutoClose() {\n    return this.duration > 0 && this.duration !== Infinity;\n  },\n\n  created: function() {\n    this._autoClose = null;\n    IronA11yAnnouncer.requestAvailability();\n  },\n\n  /**\n   * Show the toast. Without arguments, this is the same as `open()` from\n   * `IronOverlayBehavior`.\n   * @param {(Object|string)=} properties Properties to be set before opening the toast.\n   * e.g. `toast.show('hello')` or `toast.show({text: 'hello', duration: 3000})`\n   */\n  show: function(properties) {\n    if (typeof properties == 'string') {\n      properties = {text: properties};\n    }\n    for (var property in properties) {\n      if (property.indexOf('_') === 0) {\n        Base._warn(\n            'The property \"' + property + '\" is private and was not set.');\n      } else if (property in this) {\n        this[property] = properties[property];\n      } else {\n        Base._warn('The property \"' + property + '\" is not valid.');\n      }\n    }\n    this.open();\n  },\n\n  /**\n   * Hide the toast. Same as `close()` from `IronOverlayBehavior`.\n   */\n  hide: function() {\n    this.close();\n  },\n\n  /**\n   * Called on transitions of the toast, indicating a finished animation\n   * @private\n   */\n  __onTransitionEnd: function(e) {\n    // there are different transitions that are happening when opening and\n    // closing the toast. The last one so far is for `opacity`.\n    // This marks the end of the transition, so we check for this to determine\n    // if this is the correct event.\n    if (e && e.target === this && e.propertyName === 'opacity') {\n      if (this.opened) {\n        this._finishRenderOpened();\n      } else {\n        this._finishRenderClosed();\n      }\n    }\n  },\n\n  /**\n   * Overridden from `IronOverlayBehavior`.\n   * Called when the value of `opened` changes.\n   */\n  _openedChanged: function() {\n    if (this._autoClose !== null) {\n      this.cancelAsync(this._autoClose);\n      this._autoClose = null;\n    }\n    if (this.opened) {\n      if (currentToast && currentToast !== this) {\n        currentToast.close();\n      }\n      currentToast = this;\n      this.fire('iron-announce', {text: this.text});\n      if (this._canAutoClose) {\n        this._autoClose = this.async(this.close, this.duration);\n      }\n    } else if (currentToast === this) {\n      currentToast = null;\n    }\n    IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);\n  },\n\n  /**\n   * Overridden from `IronOverlayBehavior`.\n   */\n  _renderOpened: function() {\n    this.classList.add('paper-toast-open');\n  },\n\n  /**\n   * Overridden from `IronOverlayBehavior`.\n   */\n  _renderClosed: function() {\n    this.classList.remove('paper-toast-open');\n  },\n\n  /**\n   * @private\n   */\n  _onFitIntoChanged: function(fitInto) {\n    this.positionTarget = fitInto;\n  }\n\n  /**\n   * Fired when `paper-toast` is opened.\n   *\n   * @event 'iron-announce'\n   * @param {{text: string}} detail Contains text that will be announced.\n   */\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/color.js';\nimport '@polymer/paper-styles/default-theme.js';\n\nimport {PaperCheckedElementBehavior} from '@polymer/paper-behaviors/paper-checked-element-behavior.js';\nimport {PaperRippleBehavior} from '@polymer/paper-behaviors/paper-ripple-behavior.js';\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {setTouchAction} from '@polymer/polymer/lib/utils/gestures.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {afterNextRender} from '@polymer/polymer/lib/utils/render-status.js';\n\nconst template = html`\n\n    <style>\n      :host {\n        display: inline-block;\n        @apply --layout-horizontal;\n        @apply --layout-center;\n        @apply --paper-font-common-base;\n      }\n\n      :host([disabled]) {\n        pointer-events: none;\n      }\n\n      :host(:focus) {\n        outline:none;\n      }\n\n      .toggle-bar {\n        position: absolute;\n        height: 100%;\n        width: 100%;\n        border-radius: 8px;\n        pointer-events: none;\n        opacity: 0.4;\n        transition: background-color linear .08s;\n        background-color: var(--paper-toggle-button-unchecked-bar-color, #000000);\n\n        @apply --paper-toggle-button-unchecked-bar;\n      }\n\n      .toggle-button {\n        position: absolute;\n        top: -3px;\n        left: 0;\n        height: 20px;\n        width: 20px;\n        border-radius: 50%;\n        box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.6);\n        transition: -webkit-transform linear .08s, background-color linear .08s;\n        transition: transform linear .08s, background-color linear .08s;\n        will-change: transform;\n        background-color: var(--paper-toggle-button-unchecked-button-color, var(--paper-grey-50));\n\n        @apply --paper-toggle-button-unchecked-button;\n      }\n\n      .toggle-button.dragging {\n        -webkit-transition: none;\n        transition: none;\n      }\n\n      :host([checked]:not([disabled])) .toggle-bar {\n        opacity: 0.5;\n        background-color: var(--paper-toggle-button-checked-bar-color, var(--primary-color));\n\n        @apply --paper-toggle-button-checked-bar;\n      }\n\n      :host([disabled]) .toggle-bar {\n        background-color: #000;\n        opacity: 0.12;\n      }\n\n      :host([checked]) .toggle-button {\n        -webkit-transform: translate(16px, 0);\n        transform: translate(16px, 0);\n      }\n\n      :host([checked]:not([disabled])) .toggle-button {\n        background-color: var(--paper-toggle-button-checked-button-color, var(--primary-color));\n\n        @apply --paper-toggle-button-checked-button;\n      }\n\n      :host([disabled]) .toggle-button {\n        background-color: #bdbdbd;\n        opacity: 1;\n      }\n\n      .toggle-ink {\n        position: absolute;\n        top: -14px;\n        left: -14px;\n        right: auto;\n        bottom: auto;\n        width: 48px;\n        height: 48px;\n        opacity: 0.5;\n        pointer-events: none;\n        color: var(--paper-toggle-button-unchecked-ink-color, var(--primary-text-color));\n\n        @apply --paper-toggle-button-unchecked-ink;\n      }\n\n      :host([checked]) .toggle-ink {\n        color: var(--paper-toggle-button-checked-ink-color, var(--primary-color));\n\n        @apply --paper-toggle-button-checked-ink;\n      }\n\n      .toggle-container {\n        display: inline-block;\n        position: relative;\n        width: 36px;\n        height: 14px;\n        /* The toggle button has an absolute position of -3px; The extra 1px\n        /* accounts for the toggle button shadow box. */\n        margin: 4px 1px;\n      }\n\n      .toggle-label {\n        position: relative;\n        display: inline-block;\n        vertical-align: middle;\n        padding-left: var(--paper-toggle-button-label-spacing, 8px);\n        pointer-events: none;\n        color: var(--paper-toggle-button-label-color, var(--primary-text-color));\n      }\n\n      /* invalid state */\n      :host([invalid]) .toggle-bar {\n        background-color: var(--paper-toggle-button-invalid-bar-color, var(--error-color));\n      }\n\n      :host([invalid]) .toggle-button {\n        background-color: var(--paper-toggle-button-invalid-button-color, var(--error-color));\n      }\n\n      :host([invalid]) .toggle-ink {\n        color: var(--paper-toggle-button-invalid-ink-color, var(--error-color));\n      }\n    </style>\n\n    <div class=\"toggle-container\">\n      <div id=\"toggleBar\" class=\"toggle-bar\"></div>\n      <div id=\"toggleButton\" class=\"toggle-button\"></div>\n    </div>\n\n    <div class=\"toggle-label\"><slot></slot></div>\n\n  `;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design: [Switch](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-switch)\n\n`paper-toggle-button` provides a ON/OFF switch that user can toggle the state\nby tapping or by dragging the switch.\n\nExample:\n\n    <paper-toggle-button></paper-toggle-button>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-toggle-button-unchecked-bar-color` | Slider color when the input is not checked | `#000000`\n`--paper-toggle-button-unchecked-button-color` | Button color when the input is not checked | `--paper-grey-50`\n`--paper-toggle-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--dark-primary-color`\n`--paper-toggle-button-checked-bar-color` | Slider button color when the input is checked | `--primary-color`\n`--paper-toggle-button-checked-button-color` | Button color when the input is checked | `--primary-color`\n`--paper-toggle-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`\n`--paper-toggle-button-invalid-bar-color` | Slider button color when the input is invalid | `--error-color`\n`--paper-toggle-button-invalid-button-color` | Button color when the input is invalid | `--error-color`\n`--paper-toggle-button-invalid-ink-color` | Selected/focus ripple color when the input is invalid | `--error-color`\n`--paper-toggle-button-unchecked-bar` | Mixin applied to the slider when the input is not checked | `{}`\n`--paper-toggle-button-unchecked-button` | Mixin applied to the slider button when the input is not checked | `{}`\n`--paper-toggle-button-unchecked-ink` | Mixin applied to the ripple when the input is not checked | `{}`\n`--paper-toggle-button-checked-bar` | Mixin applied to the slider when the input is checked | `{}`\n`--paper-toggle-button-checked-button` | Mixin applied to the slider button when the input is checked | `{}`\n`--paper-toggle-button-checked-ink` | Mixin applied to the ripple when the input is checked | `{}`\n`--paper-toggle-button-label-color` | Label color | `--primary-text-color`\n`--paper-toggle-button-label-spacing` | Spacing between the label and the button | `8px`\n\nThis element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.\nIn order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.\n\n@group Paper Elements\n@element paper-toggle-button\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-toggle-button',\n\n  behaviors: [PaperCheckedElementBehavior],\n\n  /** @private */\n  hostAttributes: {role: 'button', 'aria-pressed': 'false', tabindex: 0},\n\n  properties: {\n      /**\n       * Fired when the checked state changes due to user interaction.\n       *\n       * @event change\n       */\n      /**\n       * Fired when the checked state changes.\n       *\n       * @event iron-change\n       */\n  },\n\n  listeners: {track: '_ontrack'},\n\n  attached: function() {\n    afterNextRender(this, function() {\n      setTouchAction(this, 'pan-y');\n    });\n  },\n\n  _ontrack: function(event) {\n    var track = event.detail;\n    if (track.state === 'start') {\n      this._trackStart(track);\n    } else if (track.state === 'track') {\n      this._trackMove(track);\n    } else if (track.state === 'end') {\n      this._trackEnd(track);\n    }\n  },\n\n  _trackStart: function(track) {\n    this._width = this.$.toggleBar.offsetWidth / 2;\n    /*\n     * keep an track-only check state to keep the dragging behavior smooth\n     * while toggling activations\n     */\n    this._trackChecked = this.checked;\n    this.$.toggleButton.classList.add('dragging');\n  },\n\n  _trackMove: function(track) {\n    var dx = track.dx;\n    this._x = Math.min(\n        this._width, Math.max(0, this._trackChecked ? this._width + dx : dx));\n    this.translate3d(this._x + 'px', 0, 0, this.$.toggleButton);\n    this._userActivate(this._x > (this._width / 2));\n  },\n\n  _trackEnd: function(track) {\n    this.$.toggleButton.classList.remove('dragging');\n    this.transform('', this.$.toggleButton);\n  },\n\n  // customize the element's ripple\n  _createRipple: function() {\n    this._rippleContainer = this.$.toggleButton;\n    var ripple = PaperRippleBehavior._createRipple();\n    ripple.id = 'ink';\n    ripple.setAttribute('recenters', '');\n    ripple.classList.add('circle', 'toggle-ink');\n    return ripple;\n  }\n\n});\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\nMaterial design:\n[Tooltips](https://www.google.com/design/spec/components/tooltips.html)\n`<paper-tooltip>` is a label that appears on hover and focus when the user\nhovers over an element with the cursor or with the keyboard. It will be centered\nto an anchor element specified in the `for` attribute, or, if that doesn't\nexist, centered to the parent node containing it.\nExample:\n    <div style=\"display:inline-block\">\n      <button>Click me!</button>\n      <paper-tooltip>Tooltip text</paper-tooltip>\n    </div>\n    <div>\n      <button id=\"btn\">Click me!</button>\n      <paper-tooltip for=\"btn\">Tooltip text</paper-tooltip>\n    </div>\nThe tooltip can be positioned on the top|bottom|left|right of the anchor using\nthe `position` attribute. The default position is bottom.\n    <paper-tooltip for=\"btn\" position=\"left\">Tooltip text</paper-tooltip>\n    <paper-tooltip for=\"btn\" position=\"top\">Tooltip text</paper-tooltip>\n\n### Styling\nThe following custom properties and mixins are available for styling:\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-tooltip-background` | The background color of the tooltip | `#616161`\n`--paper-tooltip-opacity` | The opacity of the tooltip | `0.9`\n`--paper-tooltip-text-color` | The text color of the tooltip | `white`\n`--paper-tooltip` | Mixin applied to the tooltip | `{}`\n`--paper-tooltip-delay-in` | Delay before tooltip starts to fade in | `500`\n`--paper-tooltip-delay-out` | Delay before tooltip starts to fade out | `0`\n`--paper-tooltip-duration-in` | Timing for animation when showing tooltip | `500`\n`--paper-tooltip-duration-out` | Timing for animation when hiding tooltip | `0`\n`--paper-tooltip-animation` | Mixin applied to the tooltip animation | `{}`\n@group Paper Elements\n@element paper-tooltip\n@demo demo/index.html\n*/\nPolymer({\n  _template: html`\n    <style>\n      :host {\n        display: block;\n        position: absolute;\n        outline: none;\n        z-index: 1002;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        -webkit-user-select: none;\n        user-select: none;\n        cursor: default;\n      }\n\n      #tooltip {\n        display: block;\n        outline: none;\n        @apply --paper-font-common-base;\n        font-size: 10px;\n        line-height: 1;\n        background-color: var(--paper-tooltip-background, #616161);\n        color: var(--paper-tooltip-text-color, white);\n        padding: 8px;\n        border-radius: 2px;\n        @apply --paper-tooltip;\n      }\n\n      @keyframes keyFrameScaleUp {\n        0% {\n          transform: scale(0.0);\n        }\n        100% {\n          transform: scale(1.0);\n        }\n      }\n\n      @keyframes keyFrameScaleDown {\n        0% {\n          transform: scale(1.0);\n        }\n        100% {\n          transform: scale(0.0);\n        }\n      }\n\n      @keyframes keyFrameFadeInOpacity {\n        0% {\n          opacity: 0;\n        }\n        100% {\n          opacity: var(--paper-tooltip-opacity, 0.9);\n        }\n      }\n\n      @keyframes keyFrameFadeOutOpacity {\n        0% {\n          opacity: var(--paper-tooltip-opacity, 0.9);\n        }\n        100% {\n          opacity: 0;\n        }\n      }\n\n      @keyframes keyFrameSlideDownIn {\n        0% {\n          transform: translateY(-2000px);\n          opacity: 0;\n        }\n        10% {\n          opacity: 0.2;\n        }\n        100% {\n          transform: translateY(0);\n          opacity: var(--paper-tooltip-opacity, 0.9);\n        }\n      }\n\n      @keyframes keyFrameSlideDownOut {\n        0% {\n          transform: translateY(0);\n          opacity: var(--paper-tooltip-opacity, 0.9);\n        }\n        10% {\n          opacity: 0.2;\n        }\n        100% {\n          transform: translateY(-2000px);\n          opacity: 0;\n        }\n      }\n\n      .fade-in-animation {\n        opacity: 0;\n        animation-delay: var(--paper-tooltip-delay-in, 500ms);\n        animation-name: keyFrameFadeInOpacity;\n        animation-iteration-count: 1;\n        animation-timing-function: ease-in;\n        animation-duration: var(--paper-tooltip-duration-in, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .fade-out-animation {\n        opacity: var(--paper-tooltip-opacity, 0.9);\n        animation-delay: var(--paper-tooltip-delay-out, 0ms);\n        animation-name: keyFrameFadeOutOpacity;\n        animation-iteration-count: 1;\n        animation-timing-function: ease-in;\n        animation-duration: var(--paper-tooltip-duration-out, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .scale-up-animation {\n        transform: scale(0);\n        opacity: var(--paper-tooltip-opacity, 0.9);\n        animation-delay: var(--paper-tooltip-delay-in, 500ms);\n        animation-name: keyFrameScaleUp;\n        animation-iteration-count: 1;\n        animation-timing-function: ease-in;\n        animation-duration: var(--paper-tooltip-duration-in, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .scale-down-animation {\n        transform: scale(1);\n        opacity: var(--paper-tooltip-opacity, 0.9);\n        animation-delay: var(--paper-tooltip-delay-out, 500ms);\n        animation-name: keyFrameScaleDown;\n        animation-iteration-count: 1;\n        animation-timing-function: ease-in;\n        animation-duration: var(--paper-tooltip-duration-out, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .slide-down-animation {\n        transform: translateY(-2000px);\n        opacity: 0;\n        animation-delay: var(--paper-tooltip-delay-out, 500ms);\n        animation-name: keyFrameSlideDownIn;\n        animation-iteration-count: 1;\n        animation-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);\n        animation-duration: var(--paper-tooltip-duration-out, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .slide-down-animation-out {\n        transform: translateY(0);\n        opacity: var(--paper-tooltip-opacity, 0.9);\n        animation-delay: var(--paper-tooltip-delay-out, 500ms);\n        animation-name: keyFrameSlideDownOut;\n        animation-iteration-count: 1;\n        animation-timing-function: cubic-bezier(0.4, 0.0, 1, 1);\n        animation-duration: var(--paper-tooltip-duration-out, 500ms);\n        animation-fill-mode: forwards;\n        @apply --paper-tooltip-animation;\n      }\n\n      .cancel-animation {\n        animation-delay: -30s !important;\n      }\n\n      /* Thanks IE 10. */\n\n      .hidden {\n        display: none !important;\n      }\n    </style>\n\n    <div id=\"tooltip\" class=\"hidden\">\n      <slot></slot>\n    </div>\n`,\n\n  is: 'paper-tooltip',\n  hostAttributes: {role: 'tooltip', tabindex: -1},\n\n  properties: {\n    /**\n     * The id of the element that the tooltip is anchored to. This element\n     * must be a sibling of the tooltip. If this property is not set,\n     * then the tooltip will be centered to the parent node containing it.\n     */\n    for: {type: String, observer: '_findTarget'},\n    /**\n     * Set this to true if you want to manually control when the tooltip\n     * is shown or hidden.\n     */\n    manualMode: {type: Boolean, value: false, observer: '_manualModeChanged'},\n    /**\n     * Positions the tooltip to the top, right, bottom, left of its content.\n     */\n    position: {type: String, value: 'bottom'},\n    /**\n     * If true, no parts of the tooltip will ever be shown offscreen.\n     */\n    fitToVisibleBounds: {type: Boolean, value: false},\n    /**\n     * The spacing between the top of the tooltip and the element it is\n     * anchored to.\n     */\n    offset: {type: Number, value: 14},\n    /**\n     * This property is deprecated, but left over so that it doesn't\n     * break exiting code. Please use `offset` instead. If both `offset` and\n     * `marginTop` are provided, `marginTop` will be ignored.\n     * @deprecated since version 1.0.3\n     */\n    marginTop: {type: Number, value: 14},\n    /**\n     * The delay that will be applied before the `entry` animation is\n     * played when showing the tooltip.\n     */\n    animationDelay: {type: Number, value: 500, observer: '_delayChange'},\n    /**\n     * The animation that will be played on entry.  This replaces the\n     * deprecated animationConfig.  Entries here will override the\n     * animationConfig settings.  You can enter your own animation\n     * by setting it to the css class name.\n     */\n    animationEntry: {type: String, value: ''},\n    /**\n     * The animation that will be played on exit.  This replaces the\n     * deprecated animationConfig.  Entries here will override the\n     * animationConfig settings.  You can enter your own animation\n     * by setting it to the css class name.\n     */\n    animationExit: {type: String, value: ''},\n    /**\n     * This property is deprecated.  Use --paper-tooltip-animation to change the\n     * animation. The entry and exit animations that will be played when showing\n     * and hiding the tooltip. If you want to override this, you must ensure\n     * that your animationConfig has the exact format below.\n     * @deprecated since version\n     *\n     * The entry and exit animations that will be played when showing and\n     * hiding the tooltip. If you want to override this, you must ensure\n     * that your animationConfig has the exact format below.\n     */\n    animationConfig: {\n      type: Object,\n      value: function() {\n        return {\n          'entry':\n              [{name: 'fade-in-animation', node: this, timing: {delay: 0}}],\n              'exit': [{name: 'fade-out-animation', node: this}]\n        }\n      }\n    },\n    _showing: {type: Boolean, value: false}\n  },\n\n  listeners: {\n    'webkitAnimationEnd': '_onAnimationEnd',\n  },\n\n  /**\n   * Returns the target element that this tooltip is anchored to. It is\n   * either the element given by the `for` attribute, or the immediate parent\n   * of the tooltip.\n   *\n   * @type {Node}\n   */\n  get target() {\n    var parentNode = dom(this).parentNode;\n    // If the parentNode is a document fragment, then we need to use the host.\n    var ownerRoot = dom(this).getOwnerRoot();\n    var target;\n    if (this.for) {\n      target = dom(ownerRoot).querySelector('#' + this.for);\n    } else {\n      target = parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE ?\n          ownerRoot.host :\n          parentNode;\n    }\n    return target;\n  },\n\n  /**\n   * @return {void}\n   */\n  attached: function() {\n    this._findTarget();\n  },\n\n  /**\n   * @return {void}\n   */\n  detached: function() {\n    if (!this.manualMode)\n      this._removeListeners();\n  },\n\n  /**\n   * Replaces Neon-Animation playAnimation - just calls show and hide.\n   * @deprecated Use show and hide instead.\n   * @param {string} type Either `entry` or `exit`\n   */\n  playAnimation: function(type) {\n    if (type === 'entry') {\n      this.show();\n    } else if (type === 'exit') {\n      this.hide();\n    }\n  },\n\n  /**\n   * Cancels the animation and either fully shows or fully hides tooltip\n   */\n  cancelAnimation: function() {\n    // Short-cut and cancel all animations and hide\n    this.$.tooltip.classList.add('cancel-animation');\n  },\n\n  /**\n   * Shows the tooltip programatically\n   * @return {void}\n   */\n  show: function() {\n    // If the tooltip is already showing, there's nothing to do.\n    if (this._showing)\n      return;\n\n    if (dom(this).textContent.trim() === '') {\n      // Check if effective children are also empty\n      var allChildrenEmpty = true;\n      var effectiveChildren = dom(this).getEffectiveChildNodes();\n      for (var i = 0; i < effectiveChildren.length; i++) {\n        if (effectiveChildren[i].textContent.trim() !== '') {\n          allChildrenEmpty = false;\n          break;\n        }\n      }\n      if (allChildrenEmpty) {\n        return;\n      }\n    }\n\n    this._showing = true;\n    this.$.tooltip.classList.remove('hidden');\n    this.$.tooltip.classList.remove('cancel-animation');\n    this.$.tooltip.classList.remove(this._getAnimationType('exit'));\n    this.updatePosition();\n    this._animationPlaying = true;\n    this.$.tooltip.classList.add(this._getAnimationType('entry'));\n  },\n\n  /**\n   * Hides the tooltip programatically\n   * @return {void}\n   */\n  hide: function() {\n    // If the tooltip is already hidden, there's nothing to do.\n    if (!this._showing) {\n      return;\n    }\n\n    // If the entry animation is still playing, don't try to play the exit\n    // animation since this will reset the opacity to 1. Just end the animation.\n    if (this._animationPlaying) {\n      this._showing = false;\n      this._cancelAnimation();\n      return;\n    } else {\n      // Play Exit Animation\n      this._onAnimationFinish();\n    }\n\n    this._showing = false;\n    this._animationPlaying = true;\n  },\n\n  /**\n   * @return {void}\n   */\n  updatePosition: function() {\n    if (!this._target || !this.offsetParent)\n      return;\n    var offset = this.offset;\n    // If a marginTop has been provided by the user (pre 1.0.3), use it.\n    if (this.marginTop != 14 && this.offset == 14)\n      offset = this.marginTop;\n    var parentRect = this.offsetParent.getBoundingClientRect();\n    var targetRect = this._target.getBoundingClientRect();\n    var thisRect = this.getBoundingClientRect();\n    var horizontalCenterOffset = (targetRect.width - thisRect.width) / 2;\n    var verticalCenterOffset = (targetRect.height - thisRect.height) / 2;\n    var targetLeft = targetRect.left - parentRect.left;\n    var targetTop = targetRect.top - parentRect.top;\n    var tooltipLeft, tooltipTop;\n    switch (this.position) {\n      case 'top':\n        tooltipLeft = targetLeft + horizontalCenterOffset;\n        tooltipTop = targetTop - thisRect.height - offset;\n        break;\n      case 'bottom':\n        tooltipLeft = targetLeft + horizontalCenterOffset;\n        tooltipTop = targetTop + targetRect.height + offset;\n        break;\n      case 'left':\n        tooltipLeft = targetLeft - thisRect.width - offset;\n        tooltipTop = targetTop + verticalCenterOffset;\n        break;\n      case 'right':\n        tooltipLeft = targetLeft + targetRect.width + offset;\n        tooltipTop = targetTop + verticalCenterOffset;\n        break;\n    }\n    // TODO(noms): This should use IronFitBehavior if possible.\n    if (this.fitToVisibleBounds) {\n      // Clip the left/right side\n      if (parentRect.left + tooltipLeft + thisRect.width > window.innerWidth) {\n        this.style.right = '0px';\n        this.style.left = 'auto';\n      } else {\n        this.style.left = Math.max(0, tooltipLeft) + 'px';\n        this.style.right = 'auto';\n      }\n      // Clip the top/bottom side.\n      if (parentRect.top + tooltipTop + thisRect.height > window.innerHeight) {\n        this.style.bottom = (parentRect.height - targetTop + offset) + 'px';\n        this.style.top = 'auto';\n      } else {\n        this.style.top = Math.max(-parentRect.top, tooltipTop) + 'px';\n        this.style.bottom = 'auto';\n      }\n    } else {\n      this.style.left = tooltipLeft + 'px';\n      this.style.top = tooltipTop + 'px';\n    }\n  },\n\n  _addListeners: function() {\n    if (this._target) {\n      this.listen(this._target, 'mouseenter', 'show');\n      this.listen(this._target, 'focus', 'show');\n      this.listen(this._target, 'mouseleave', 'hide');\n      this.listen(this._target, 'blur', 'hide');\n      this.listen(this._target, 'tap', 'hide');\n    }\n    this.listen(this.$.tooltip, 'animationend', '_onAnimationEnd');\n    this.listen(this, 'mouseenter', 'hide');\n  },\n\n  _findTarget: function() {\n    if (!this.manualMode)\n      this._removeListeners();\n    this._target = this.target;\n    if (!this.manualMode)\n      this._addListeners();\n  },\n\n  _delayChange: function(newValue) {\n    // Only Update delay if different value set\n    if (newValue !== 500) {\n      this.updateStyles({'--paper-tooltip-delay-in': newValue + 'ms'});\n    }\n  },\n\n  _manualModeChanged: function() {\n    if (this.manualMode)\n      this._removeListeners();\n    else\n      this._addListeners();\n  },\n\n  _cancelAnimation: function() {\n    // Short-cut and cancel all animations and hide\n    this.$.tooltip.classList.remove(this._getAnimationType('entry'));\n    this.$.tooltip.classList.remove(this._getAnimationType('exit'));\n    this.$.tooltip.classList.remove('cancel-animation');\n    this.$.tooltip.classList.add('hidden');\n  },\n\n  _onAnimationFinish: function() {\n    if (this._showing) {\n      this.$.tooltip.classList.remove(this._getAnimationType('entry'));\n      this.$.tooltip.classList.remove('cancel-animation');\n      this.$.tooltip.classList.add(this._getAnimationType('exit'));\n    }\n  },\n\n  _onAnimationEnd: function() {\n    // If no longer showing add class hidden to completely hide tooltip\n    this._animationPlaying = false;\n    if (!this._showing) {\n      this.$.tooltip.classList.remove(this._getAnimationType('exit'));\n      this.$.tooltip.classList.add('hidden');\n    }\n  },\n\n  _getAnimationType: function(type) {\n    // These properties have priority over animationConfig values\n    if ((type === 'entry') && (this.animationEntry !== '')) {\n      return this.animationEntry;\n    }\n    if ((type === 'exit') && (this.animationExit !== '')) {\n      return this.animationExit;\n    }\n    // If no results then return the legacy value from animationConfig\n    if (this.animationConfig[type] &&\n        typeof this.animationConfig[type][0].name === 'string') {\n      // Checking Timing and Update if necessary - Legacy for animationConfig\n      if (this.animationConfig[type][0].timing &&\n          this.animationConfig[type][0].timing.delay &&\n          this.animationConfig[type][0].timing.delay !== 0) {\n        var timingDelay = this.animationConfig[type][0].timing.delay;\n        // Has Timing Change - Update CSS\n        if (type === 'entry') {\n          this.updateStyles({'--paper-tooltip-delay-in': timingDelay + 'ms'});\n        } else if (type === 'exit') {\n          this.updateStyles({'--paper-tooltip-delay-out': timingDelay + 'ms'});\n        }\n      }\n      return this.animationConfig[type][0].name;\n    }\n  },\n\n  _removeListeners: function() {\n    if (this._target) {\n      this.unlisten(this._target, 'mouseenter', 'show');\n      this.unlisten(this._target, 'focus', 'show');\n      this.unlisten(this._target, 'mouseleave', 'hide');\n      this.unlisten(this._target, 'blur', 'hide');\n      this.unlisten(this._target, 'tap', 'hide');\n    }\n    this.unlisten(this.$.tooltip, 'animationend', '_onAnimationEnd');\n    this.unlisten(this, 'mouseenter', 'hide');\n  }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { resolveUrl, pathFromUrl } from '../utils/resolve-url.js';\nimport { strictTemplatePolicy } from '../utils/settings.js';\n\nlet modules = {};\nlet lcModules = {};\n/**\n * Sets a dom-module into the global registry by id.\n *\n * @param {string} id dom-module id\n * @param {DomModule} module dom-module instance\n * @return {void}\n */\nfunction setModule(id, module) {\n  // store id separate from lowercased id so that\n  // in all cases mixedCase id will stored distinctly\n  // and lowercase version is a fallback\n  modules[id] = lcModules[id.toLowerCase()] = module;\n}\n/**\n * Retrieves a dom-module from the global registry by id.\n *\n * @param {string} id dom-module id\n * @return {DomModule!} dom-module instance\n */\nfunction findModule(id) {\n  return modules[id] || lcModules[id.toLowerCase()];\n}\n\nfunction styleOutsideTemplateCheck(inst) {\n  if (inst.querySelector('style')) {\n    console.warn('dom-module %s has style outside template', inst.id);\n  }\n}\n\n/**\n * The `dom-module` element registers the dom it contains to the name given\n * by the module's id attribute. It provides a unified database of dom\n * accessible via its static `import` API.\n *\n * A key use case of `dom-module` is for providing custom element `<template>`s\n * via HTML imports that are parsed by the native HTML parser, that can be\n * relocated during a bundling pass and still looked up by `id`.\n *\n * Example:\n *\n *     <dom-module id=\"foo\">\n *       <img src=\"stuff.png\">\n *     </dom-module>\n *\n * Then in code in some other location that cannot access the dom-module above\n *\n *     let img = customElements.get('dom-module').import('foo', 'img');\n *\n * @customElement\n * @extends HTMLElement\n * @summary Custom element that provides a registry of relocatable DOM content\n *   by `id` that is agnostic to bundling.\n * @unrestricted\n */\nexport class DomModule extends HTMLElement {\n\n  /** @override */\n  static get observedAttributes() { return ['id']; }\n\n  /**\n   * Retrieves the element specified by the css `selector` in the module\n   * registered by `id`. For example, this.import('foo', 'img');\n   * @param {string} id The id of the dom-module in which to search.\n   * @param {string=} selector The css selector by which to find the element.\n   * @return {Element} Returns the element which matches `selector` in the\n   * module registered at the specified `id`.\n   *\n   * @export\n   * @nocollapse Referred to indirectly in style-gather.js\n   */\n  static import(id, selector) {\n    if (id) {\n      let m = findModule(id);\n      if (m && selector) {\n        return m.querySelector(selector);\n      }\n      return m;\n    }\n    return null;\n  }\n\n  /* eslint-disable no-unused-vars */\n  /**\n   * @param {string} name Name of attribute.\n   * @param {?string} old Old value of attribute.\n   * @param {?string} value Current value of attribute.\n   * @param {?string} namespace Attribute namespace.\n   * @return {void}\n   * @override\n   */\n  attributeChangedCallback(name, old, value, namespace) {\n    if (old !== value) {\n      this.register();\n    }\n  }\n  /* eslint-enable no-unused-args */\n\n  /**\n   * The absolute URL of the original location of this `dom-module`.\n   *\n   * This value will differ from this element's `ownerDocument` in the\n   * following ways:\n   * - Takes into account any `assetpath` attribute added during bundling\n   *   to indicate the original location relative to the bundled location\n   * - Uses the HTMLImports polyfill's `importForElement` API to ensure\n   *   the path is relative to the import document's location since\n   *   `ownerDocument` is not currently polyfilled\n   */\n  get assetpath() {\n    // Don't override existing assetpath.\n    if (!this.__assetpath) {\n      // note: assetpath set via an attribute must be relative to this\n      // element's location; accommodate polyfilled HTMLImports\n      const owner = window.HTMLImports && HTMLImports.importForElement ?\n        HTMLImports.importForElement(this) || document : this.ownerDocument;\n      const url = resolveUrl(\n        this.getAttribute('assetpath') || '', owner.baseURI);\n      this.__assetpath = pathFromUrl(url);\n    }\n    return this.__assetpath;\n  }\n\n  /**\n   * Registers the dom-module at a given id. This method should only be called\n   * when a dom-module is imperatively created. For\n   * example, `document.createElement('dom-module').register('foo')`.\n   * @param {string=} id The id at which to register the dom-module.\n   * @return {void}\n   */\n  register(id) {\n    id = id || this.id;\n    if (id) {\n      // Under strictTemplatePolicy, reject and null out any re-registered\n      // dom-module since it is ambiguous whether first-in or last-in is trusted\n      if (strictTemplatePolicy && findModule(id) !== undefined) {\n        setModule(id, null);\n        throw new Error(`strictTemplatePolicy: dom-module ${id} re-registered`);\n      }\n      this.id = id;\n      setModule(id, this);\n      styleOutsideTemplateCheck(this);\n    }\n  }\n}\n\nDomModule.prototype['modules'] = modules;\n\ncustomElements.define('dom-module', DomModule);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n  constructor() {\n    /** @type {number} */\n    this['start'] = 0;\n    /** @type {number} */\n    this['end'] = 0;\n    /** @type {StyleNode} */\n    this['previous'] = null;\n    /** @type {StyleNode} */\n    this['parent'] = null;\n    /** @type {Array<StyleNode>} */\n    this['rules'] = null;\n    /** @type {string} */\n    this['parsedCssText'] = '';\n    /** @type {string} */\n    this['cssText'] = '';\n    /** @type {boolean} */\n    this['atRule'] = false;\n    /** @type {number} */\n    this['type'] = 0;\n    /** @type {string} */\n    this['keyframesName'] = '';\n    /** @type {string} */\n    this['selector'] = '';\n    /** @type {string} */\n    this['parsedSelector'] = '';\n  }\n}\n\nexport {StyleNode};\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n  text = clean(text);\n  return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n  return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {!StyleNode}\n */\nfunction lex(text) {\n  let root = new StyleNode();\n  root['start'] = 0;\n  root['end'] = text.length;\n  let n = root;\n  for (let i = 0, l = text.length; i < l; i++) {\n    if (text[i] === OPEN_BRACE) {\n      if (!n['rules']) {\n        n['rules'] = [];\n      }\n      let p = n;\n      let previous = p['rules'][p['rules'].length - 1] || null;\n      n = new StyleNode();\n      n['start'] = i + 1;\n      n['parent'] = p;\n      n['previous'] = previous;\n      p['rules'].push(n);\n    } else if (text[i] === CLOSE_BRACE) {\n      n['end'] = i + 1;\n      n = n['parent'] || root;\n    }\n  }\n  return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {!StyleNode}\n */\nfunction parseCss(node, text) {\n  let t = text.substring(node['start'], node['end'] - 1);\n  node['parsedCssText'] = node['cssText'] = t.trim();\n  if (node['parent']) {\n    let ss = node['previous']\n      ? node['previous']['end']\n      : node['parent']['start'];\n    t = text.substring(ss, node['start'] - 1);\n    t = _expandUnicodeEscapes(t);\n    t = t.replace(RX.multipleSpaces, ' ');\n    // TODO(sorvell): ad hoc; make selector include only after last ;\n    // helps with mixin syntax\n    t = t.substring(t.lastIndexOf(';') + 1);\n    let s = (node['parsedSelector'] = node['selector'] = t.trim());\n    node['atRule'] = s.indexOf(AT_START) === 0;\n    // note, support a subset of rule types...\n    if (node['atRule']) {\n      if (s.indexOf(MEDIA_START) === 0) {\n        node['type'] = types.MEDIA_RULE;\n      } else if (s.match(RX.keyframesRule)) {\n        node['type'] = types.KEYFRAMES_RULE;\n        node['keyframesName'] = node['selector'].split(RX.multipleSpaces).pop();\n      }\n    } else {\n      if (s.indexOf(VAR_START) === 0) {\n        node['type'] = types.MIXIN_RULE;\n      } else {\n        node['type'] = types.STYLE_RULE;\n      }\n    }\n  }\n  let r$ = node['rules'];\n  if (r$) {\n    for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {\n      parseCss(r, text);\n    }\n  }\n  return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n  return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function () {\n    let code = arguments[1],\n      repeat = 6 - code.length;\n    while (repeat--) {\n      code = '0' + code;\n    }\n    return '\\\\' + code;\n  });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n  // calc rule cssText\n  let cssText = '';\n  if (node['cssText'] || node['rules']) {\n    let r$ = node['rules'];\n    if (r$ && !_hasMixinRules(r$)) {\n      for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {\n        cssText = stringify(r, preserveProperties, cssText);\n      }\n    } else {\n      cssText = preserveProperties\n        ? node['cssText']\n        : removeCustomProps(node['cssText']);\n      cssText = cssText.trim();\n      if (cssText) {\n        cssText = '  ' + cssText + '\\n';\n      }\n    }\n  }\n  // emit rule if there is cssText\n  if (cssText) {\n    if (node['selector']) {\n      text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n    }\n    text += cssText;\n    if (node['selector']) {\n      text += CLOSE_BRACE + '\\n\\n';\n    }\n  }\n  return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n  let r = rules[0];\n  return (\n    Boolean(r) &&\n    Boolean(r['selector']) &&\n    r['selector'].indexOf(VAR_START) === 0\n  );\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n  cssText = removeCustomPropAssignment(cssText);\n  return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n  return cssText.replace(RX.customProp, '').replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n  return cssText.replace(RX.mixinApply, '').replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n  STYLE_RULE: 1,\n  KEYFRAMES_RULE: 7,\n  MEDIA_RULE: 4,\n  MIXIN_RULE: 1000,\n};\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n  comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n  port: /@import[^;]*;/gim,\n  customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n  mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n  mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n  varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n  keyframesRule: /^@[^\\s]*keyframes/,\n  multipleSpaces: /\\s+/g,\n};\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n  const text = style.textContent;\n  if (!styleTextSet.has(text)) {\n    styleTextSet.add(text);\n    const newStyle = document.createElement('style');\n    newStyle.setAttribute('shady-unscoped', '');\n    newStyle.textContent = text;\n    document.head.appendChild(newStyle);\n  }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n  return style.hasAttribute(scopingAttribute);\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables, cssBuild} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\n// prettier-ignore\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText(rules, callback) {\n  if (!rules) {\n    return '';\n  }\n  if (typeof rules === 'string') {\n    rules = parse(rules);\n  }\n  if (callback) {\n    forEachRule(rules, callback);\n  }\n  return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n  if (!style['__cssRules'] && style.textContent) {\n    style['__cssRules'] = parse(style.textContent);\n  }\n  return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n  return (\n    Boolean(rule['parent']) && rule['parent']['type'] === types.KEYFRAMES_RULE\n  );\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(\n  node,\n  styleRuleCallback,\n  keyframesRuleCallback,\n  onlyActiveRules\n) {\n  if (!node) {\n    return;\n  }\n  let skipRules = false;\n  let type = node['type'];\n  if (onlyActiveRules) {\n    if (type === types.MEDIA_RULE) {\n      let matchMedia = node['selector'].match(MEDIA_MATCH);\n      if (matchMedia) {\n        // if rule is a non matching @media rule, skip subrules\n        if (!window.matchMedia(matchMedia[1]).matches) {\n          skipRules = true;\n        }\n      }\n    }\n  }\n  if (type === types.STYLE_RULE) {\n    styleRuleCallback(node);\n  } else if (keyframesRuleCallback && type === types.KEYFRAMES_RULE) {\n    keyframesRuleCallback(node);\n  } else if (type === types.MIXIN_RULE) {\n    skipRules = true;\n  }\n  let r$ = node['rules'];\n  if (r$ && !skipRules) {\n    for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {\n      forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n    }\n  }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n  let style = createScopeStyle(cssText, moniker);\n  applyStyle(style, target, contextNode);\n  return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {!HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n  let style = /** @type {HTMLStyleElement} */ (document.createElement('style'));\n  if (moniker) {\n    style.setAttribute('scope', moniker);\n  }\n  style.textContent = cssText;\n  return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n  let placeHolder = document.createComment(\n    ' Shady DOM styles for ' + moniker + ' '\n  );\n  let after = lastHeadApplyNode ? lastHeadApplyNode['nextSibling'] : null;\n  let scope = document.head;\n  scope.insertBefore(placeHolder, after || scope.firstChild);\n  lastHeadApplyNode = placeHolder;\n  return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n  target = target || document.head;\n  let after = (contextNode && contextNode.nextSibling) || target.firstChild;\n  target.insertBefore(style, after);\n  if (!lastHeadApplyNode) {\n    lastHeadApplyNode = style;\n  } else {\n    // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n    let position = style.compareDocumentPosition(lastHeadApplyNode);\n    if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n      lastHeadApplyNode = style;\n    }\n  }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n  return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nexport function findMatchingParen(text, start) {\n  let level = 0;\n  for (let i = start, l = text.length; i < l; i++) {\n    if (text[i] === '(') {\n      level++;\n    } else if (text[i] === ')') {\n      if (--level === 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n  // find 'var('\n  let start = str.indexOf('var(');\n  if (start === -1) {\n    // no var?, everything is prefix\n    return callback(str, '', '', '');\n  }\n  //${prefix}var(${inner})${suffix}\n  let end = findMatchingParen(str, start + 3);\n  let inner = str.substring(start + 4, end);\n  let prefix = str.substring(0, start);\n  // suffix may have other variables\n  let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n  let comma = inner.indexOf(',');\n  // value and fallback args should be trimmed to match in property lookup\n  if (comma === -1) {\n    // variable, no fallback\n    return callback(prefix, inner.trim(), '', suffix);\n  }\n  // var(${value},${fallback})\n  let value = inner.substring(0, comma).trim();\n  let fallback = inner.substring(comma + 1).trim();\n  return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n  // use native setAttribute provided by ShadyDOM when setAttribute is patched\n  if (nativeShadow) {\n    element.setAttribute('class', value);\n  } else {\n    window['ShadyDOM']['nativeMethods']['setAttribute'].call(\n      element,\n      'class',\n      value\n    );\n  }\n}\n\n/**\n * @type {function(*):*}\n */\nexport const wrap =\n  (window['ShadyDOM'] && window['ShadyDOM']['wrap']) || ((node) => node);\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n  let localName = element['localName'];\n  let is = '',\n    typeExtension = '';\n  /*\n  NOTE: technically, this can be wrong for certain svg elements\n  with `-` in the name like `<font-face>`\n  */\n  if (localName) {\n    if (localName.indexOf('-') > -1) {\n      is = localName;\n    } else {\n      typeExtension = localName;\n      is = (element.getAttribute && element.getAttribute('is')) || '';\n    }\n  } else {\n    is = /** @type {?} */ (element).is;\n    typeExtension = /** @type {?} */ (element).extends;\n  }\n  return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n  /** @type {!Array<string>} */\n  const styleTextParts = [];\n  const styles = /** @type {!NodeList<!HTMLStyleElement>} */ (element.querySelectorAll(\n    'style'\n  ));\n  for (let i = 0; i < styles.length; i++) {\n    const style = styles[i];\n    if (isUnscopedStyle(style)) {\n      if (!nativeShadow) {\n        processUnscopedStyle(style);\n        style.parentNode.removeChild(style);\n      }\n    } else {\n      styleTextParts.push(style.textContent);\n      style.parentNode.removeChild(style);\n    }\n  }\n  return styleTextParts.join('').trim();\n}\n\n/**\n * Split a selector separated by commas into an array in a smart way\n * @param {string} selector\n * @return {!Array<string>}\n */\nexport function splitSelectorList(selector) {\n  const parts = [];\n  let part = '';\n  for (let i = 0; i >= 0 && i < selector.length; i++) {\n    // A selector with parentheses will be one complete part\n    if (selector[i] === '(') {\n      // find the matching paren\n      const end = findMatchingParen(selector, i);\n      // push the paren block into the part\n      part += selector.slice(i, end + 1);\n      // move the index to after the paren block\n      i = end;\n    } else if (selector[i] === ',') {\n      parts.push(part);\n      part = '';\n    } else {\n      part += selector[i];\n    }\n  }\n  // catch any pieces after the last comma\n  if (part) {\n    parts.push(part);\n  }\n  return parts;\n}\n\nconst CSS_BUILD_ATTR = 'css-build';\n\n/**\n * Return the polymer-css-build \"build type\" applied to this element\n *\n * @param {!HTMLElement} element\n * @return {string} Can be \"\", \"shady\", or \"shadow\"\n */\nexport function getCssBuild(element) {\n  if (cssBuild !== undefined) {\n    return /** @type {string} */ (cssBuild);\n  }\n  if (element.__cssBuild === undefined) {\n    // try attribute first, as it is the common case\n    const attrValue = element.getAttribute(CSS_BUILD_ATTR);\n    if (attrValue) {\n      element.__cssBuild = attrValue;\n    } else {\n      const buildComment = getBuildComment(element);\n      if (buildComment !== '') {\n        // remove build comment so it is not needlessly copied into every element instance\n        removeBuildComment(element);\n      }\n      element.__cssBuild = buildComment;\n    }\n  }\n  return element.__cssBuild || '';\n}\n\n/**\n * Check if the given element, either a <template> or <style>, has been processed\n * by polymer-css-build.\n *\n * If so, then we can make a number of optimizations:\n * - polymer-css-build will decompose mixins into individual CSS Custom Properties,\n * so the ApplyShim can be skipped entirely.\n * - Under native ShadowDOM, the style text can just be copied into each instance\n * without modification\n * - If the build is \"shady\" and ShadyDOM is in use, the styling does not need\n * scoping beyond the shimming of CSS Custom Properties\n *\n * @param {!HTMLElement} element\n * @return {boolean}\n */\nexport function elementHasBuiltCss(element) {\n  return getCssBuild(element) !== '';\n}\n\n/**\n * For templates made with tagged template literals, polymer-css-build will\n * insert a comment of the form `<!--css-build:shadow-->`\n *\n * @param {!HTMLElement} element\n * @return {string}\n */\nexport function getBuildComment(element) {\n  const buildComment =\n    element.localName === 'template'\n      ? /** @type {!HTMLTemplateElement} */ (element).content.firstChild\n      : element.firstChild;\n  if (buildComment instanceof Comment) {\n    const commentParts = buildComment.textContent.trim().split(':');\n    if (commentParts[0] === CSS_BUILD_ATTR) {\n      return commentParts[1];\n    }\n  }\n  return '';\n}\n\n/**\n * Check if the css build status is optimal, and do no unneeded work.\n *\n * @param {string=} cssBuild CSS build status\n * @return {boolean} css build is optimal or not\n */\nexport function isOptimalCssBuild(cssBuild = '') {\n  // CSS custom property shim always requires work\n  if (cssBuild === '' || !nativeCssVariables) {\n    return false;\n  }\n  return nativeShadow ? cssBuild === 'shadow' : cssBuild === 'shady';\n}\n\n/**\n * @param {!HTMLElement} element\n */\nfunction removeBuildComment(element) {\n  const buildComment =\n    element.localName === 'template'\n      ? /** @type {!HTMLTemplateElement} */ (element).content.firstChild\n      : element.firstChild;\n  buildComment.parentNode.removeChild(buildComment);\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n/*\n * The apply shim simulates the behavior of `@apply` proposed at\n * https://tabatkins.github.io/specs/css-apply-rule/.\n * The approach is to convert a property like this:\n *\n *    --foo: {color: red; background: blue;}\n *\n * to this:\n *\n *    --foo_-_color: red;\n *    --foo_-_background: blue;\n *\n * Then where `@apply --foo` is used, that is converted to:\n *\n *    color: var(--foo_-_color);\n *    background: var(--foo_-_background);\n *\n * This approach generally works but there are some issues and limitations.\n * Consider, for example, that somewhere *between* where `--foo` is set and used,\n * another element sets it to:\n *\n *    --foo: { border: 2px solid red; }\n *\n * We must now ensure that the color and background from the previous setting\n * do not apply. This is accomplished by changing the property set to this:\n *\n *    --foo_-_border: 2px solid red;\n *    --foo_-_color: initial;\n *    --foo_-_background: initial;\n *\n * This works but introduces one new issue.\n * Consider this setup at the point where the `@apply` is used:\n *\n *    background: orange;\n *    `@apply` --foo;\n *\n * In this case the background will be unset (initial) rather than the desired\n * `orange`. We address this by altering the property set to use a fallback\n * value like this:\n *\n *    color: var(--foo_-_color);\n *    background: var(--foo_-_background, orange);\n *    border: var(--foo_-_border);\n *\n * Note that the default is retained in the property set and the `background` is\n * the desired `orange`. This leads us to a limitation.\n *\n * Limitation 1:\n\n * Only properties in the rule where the `@apply`\n * is used are considered as default values.\n * If another rule matches the element and sets `background` with\n * less specificity than the rule in which `@apply` appears,\n * the `background` will not be set.\n *\n * Limitation 2:\n *\n * When using Polymer's `updateStyles` api, new properties may not be set for\n * `@apply` properties.\n\n*/\n\n'use strict';\n\n// prettier-ignore\nimport {forEachRule, processVariableAndFallback, rulesForStyle, toCssText, gatherStyleText} from './style-util.js';\nimport {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';\nimport {detectMixin} from './common-utils.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst APPLY_NAME_CLEAN = /;\\s*/m;\nconst INITIAL_INHERIT = /^\\s*(initial)|(inherit)\\s*$/;\nconst IMPORTANT = /\\s*!important/;\n\n// separator used between mixin-name and mixin-property-name when producing properties\n// NOTE: plain '-' may cause collisions in user styles\nconst MIXIN_VAR_SEP = '_-_';\n\n/**\n * @typedef {!Object<string, string>}\n */\nlet PropertyEntry; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n/**\n * @typedef {!Object<string, boolean>}\n */\nlet DependantsEntry; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n/** @typedef {{\n *    properties: PropertyEntry,\n *    dependants: DependantsEntry\n * }}\n */\nlet MixinMapEntry; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n// map of mixin to property names\n// --foo: {border: 2px} -> {properties: {(--foo, ['border'])}, dependants: {'element-name': proto}}\nclass MixinMap {\n  constructor() {\n    /** @type {!Object<string, !MixinMapEntry>} */\n    this._map = {};\n  }\n  /**\n   * @param {string} name\n   * @param {!PropertyEntry} props\n   */\n  set(name, props) {\n    name = name.trim();\n    this._map[name] = {\n      properties: props,\n      dependants: {},\n    };\n  }\n  /**\n   * @param {string} name\n   * @return {MixinMapEntry}\n   */\n  get(name) {\n    name = name.trim();\n    return this._map[name] || null;\n  }\n}\n\n/**\n * Callback for when an element is marked invalid\n * @type {?function(string)}\n */\nlet invalidCallback = null;\n\n/** @unrestricted */\nclass ApplyShim {\n  constructor() {\n    /** @type {?string} */\n    this._currentElement = null;\n    /** @type {HTMLMetaElement} */\n    this._measureElement = null;\n    this._map = new MixinMap();\n  }\n  /**\n   * return true if `cssText` contains a mixin definition or consumption\n   * @param {string} cssText\n   * @return {boolean}\n   */\n  detectMixin(cssText) {\n    return detectMixin(cssText);\n  }\n\n  /**\n   * Gather styles into one style for easier processing\n   * @param {!HTMLTemplateElement} template\n   * @return {HTMLStyleElement}\n   */\n  gatherStyles(template) {\n    const styleText = gatherStyleText(template.content);\n    if (styleText) {\n      const style = /** @type {!HTMLStyleElement} */ (document.createElement(\n        'style'\n      ));\n      style.textContent = styleText;\n      template.content.insertBefore(style, template.content.firstChild);\n      return style;\n    }\n    return null;\n  }\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @return {StyleNode}\n   */\n  transformTemplate(template, elementName) {\n    if (template._gatheredStyle === undefined) {\n      template._gatheredStyle = this.gatherStyles(template);\n    }\n    /** @type {HTMLStyleElement} */\n    const style = template._gatheredStyle;\n    return style ? this.transformStyle(style, elementName) : null;\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   * @param {string} elementName\n   * @return {StyleNode}\n   */\n  transformStyle(style, elementName = '') {\n    let ast = rulesForStyle(style);\n    this.transformRules(ast, elementName);\n    style.textContent = toCssText(ast);\n    return ast;\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   * @return {StyleNode}\n   */\n  transformCustomStyle(style) {\n    let ast = rulesForStyle(style);\n    forEachRule(ast, (rule) => {\n      if (rule['selector'] === ':root') {\n        rule['selector'] = 'html';\n      }\n      this.transformRule(rule);\n    });\n    style.textContent = toCssText(ast);\n    return ast;\n  }\n  /**\n   * @param {StyleNode} rules\n   * @param {string} elementName\n   */\n  transformRules(rules, elementName) {\n    this._currentElement = elementName;\n    forEachRule(rules, (r) => {\n      this.transformRule(r);\n    });\n    this._currentElement = null;\n  }\n  /**\n   * @param {!StyleNode} rule\n   */\n  transformRule(rule) {\n    rule['cssText'] = this.transformCssText(rule['parsedCssText'], rule);\n    // :root was only used for variable assignment in property shim,\n    // but generates invalid selectors with real properties.\n    // replace with `:host > *`, which serves the same effect\n    if (rule['selector'] === ':root') {\n      rule['selector'] = ':host > *';\n    }\n  }\n  /**\n   * @param {string} cssText\n   * @param {!StyleNode} rule\n   * @return {string}\n   */\n  transformCssText(cssText, rule) {\n    // produce variables\n    cssText = cssText.replace(\n      VAR_ASSIGN,\n      (matchText, propertyName, valueProperty, valueMixin) =>\n        this._produceCssProperties(\n          matchText,\n          propertyName,\n          valueProperty,\n          valueMixin,\n          rule\n        )\n    );\n    // consume mixins\n    return this._consumeCssProperties(cssText, rule);\n  }\n  /**\n   * @param {string} property\n   * @return {string}\n   */\n  _getInitialValueForProperty(property) {\n    if (!this._measureElement) {\n      this._measureElement = /** @type {HTMLMetaElement} */ (document.createElement(\n        'meta'\n      ));\n      this._measureElement.setAttribute('apply-shim-measure', '');\n      this._measureElement.style.all = 'initial';\n      document.head.appendChild(this._measureElement);\n    }\n    return window\n      .getComputedStyle(this._measureElement)\n      .getPropertyValue(property);\n  }\n  /**\n   * Walk over all rules before this rule to find fallbacks for mixins\n   *\n   * @param {!StyleNode} startRule\n   * @return {!Object}\n   */\n  _fallbacksFromPreviousRules(startRule) {\n    // find the \"top\" rule\n    let topRule = startRule;\n    while (topRule['parent']) {\n      topRule = topRule['parent'];\n    }\n    const fallbacks = {};\n    let seenStartRule = false;\n    forEachRule(topRule, (r) => {\n      // stop when we hit the input rule\n      seenStartRule = seenStartRule || r === startRule;\n      if (seenStartRule) {\n        return;\n      }\n      // NOTE: Only matching selectors are \"safe\" for this fallback processing\n      // It would be prohibitive to run `matchesSelector()` on each selector,\n      // so we cheat and only check if the same selector string is used, which\n      // guarantees things like specificity matching\n      if (r['selector'] === startRule['selector']) {\n        Object.assign(fallbacks, this._cssTextToMap(r['parsedCssText']));\n      }\n    });\n    return fallbacks;\n  }\n  /**\n   * replace mixin consumption with variable consumption\n   * @param {string} text\n   * @param {!StyleNode=} rule\n   * @return {string}\n   */\n  _consumeCssProperties(text, rule) {\n    /** @type {Array} */\n    let m = null;\n    // loop over text until all mixins with defintions have been applied\n    while ((m = MIXIN_MATCH.exec(text))) {\n      let matchText = m[0];\n      let mixinName = m[1];\n      let idx = m.index;\n      // collect properties before apply to be \"defaults\" if mixin might override them\n      // match includes a \"prefix\", so find the start and end positions of @apply\n      let applyPos = idx + matchText.indexOf('@apply');\n      let afterApplyPos = idx + matchText.length;\n      // find props defined before this @apply\n      let textBeforeApply = text.slice(0, applyPos);\n      let textAfterApply = text.slice(afterApplyPos);\n      let defaults = rule ? this._fallbacksFromPreviousRules(rule) : {};\n      Object.assign(defaults, this._cssTextToMap(textBeforeApply));\n      let replacement = this._atApplyToCssProperties(mixinName, defaults);\n      // use regex match position to replace mixin, keep linear processing time\n      text = `${textBeforeApply}${replacement}${textAfterApply}`;\n      // move regex search to _after_ replacement\n      MIXIN_MATCH.lastIndex = idx + replacement.length;\n    }\n    return text;\n  }\n  /**\n   * produce variable consumption at the site of mixin consumption\n   * `@apply` --foo; -> for all props (${propname}: var(--foo_-_${propname}, ${fallback[propname]}}))\n   * Example:\n   *  border: var(--foo_-_border); padding: var(--foo_-_padding, 2px)\n   *\n   * @param {string} mixinName\n   * @param {Object} fallbacks\n   * @return {string}\n   */\n  _atApplyToCssProperties(mixinName, fallbacks) {\n    mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');\n    let vars = [];\n    let mixinEntry = this._map.get(mixinName);\n    // if we depend on a mixin before it is created\n    // make a sentinel entry in the map to add this element as a dependency for when it is defined.\n    if (!mixinEntry) {\n      this._map.set(mixinName, {});\n      mixinEntry = this._map.get(mixinName);\n    }\n    if (mixinEntry) {\n      if (this._currentElement) {\n        mixinEntry.dependants[this._currentElement] = true;\n      }\n      let p, parts, f;\n      const properties = mixinEntry.properties;\n      for (p in properties) {\n        f = fallbacks && fallbacks[p];\n        parts = [p, ': var(', mixinName, MIXIN_VAR_SEP, p];\n        if (f) {\n          parts.push(',', f.replace(IMPORTANT, ''));\n        }\n        parts.push(')');\n        if (IMPORTANT.test(properties[p])) {\n          parts.push(' !important');\n        }\n        vars.push(parts.join(''));\n      }\n    }\n    return vars.join('; ');\n  }\n\n  /**\n   * @param {string} property\n   * @param {string} value\n   * @return {string}\n   */\n  _replaceInitialOrInherit(property, value) {\n    let match = INITIAL_INHERIT.exec(value);\n    if (match) {\n      if (match[1]) {\n        // initial\n        // replace `initial` with the concrete initial value for this property\n        value = this._getInitialValueForProperty(property);\n      } else {\n        // inherit\n        // with this purposfully illegal value, the variable will be invalid at\n        // compute time (https://www.w3.org/TR/css-variables/#invalid-at-computed-value-time)\n        // and for inheriting values, will behave similarly\n        // we cannot support the same behavior for non inheriting values like 'border'\n        value = 'apply-shim-inherit';\n      }\n    }\n    return value;\n  }\n\n  /**\n   * \"parse\" a mixin definition into a map of properties and values\n   * cssTextToMap('border: 2px solid black') -> ('border', '2px solid black')\n   * @param {string} text\n   * @param {boolean=} replaceInitialOrInherit\n   * @return {!Object<string, string>}\n   */\n  _cssTextToMap(text, replaceInitialOrInherit = false) {\n    let props = text.split(';');\n    let property, value;\n    let out = {};\n    for (let i = 0, p, sp; i < props.length; i++) {\n      p = props[i];\n      if (p) {\n        sp = p.split(':');\n        // ignore lines that aren't definitions like @media\n        if (sp.length > 1) {\n          property = sp[0].trim();\n          // some properties may have ':' in the value, like data urls\n          value = sp.slice(1).join(':');\n          if (replaceInitialOrInherit) {\n            value = this._replaceInitialOrInherit(property, value);\n          }\n          out[property] = value;\n        }\n      }\n    }\n    return out;\n  }\n\n  /**\n   * @param {MixinMapEntry} mixinEntry\n   */\n  _invalidateMixinEntry(mixinEntry) {\n    if (!invalidCallback) {\n      return;\n    }\n    for (let elementName in mixinEntry.dependants) {\n      if (elementName !== this._currentElement) {\n        invalidCallback(elementName);\n      }\n    }\n  }\n\n  /**\n   * @param {string} matchText\n   * @param {string} propertyName\n   * @param {?string} valueProperty\n   * @param {?string} valueMixin\n   * @param {!StyleNode} rule\n   * @return {string}\n   */\n  _produceCssProperties(\n    matchText,\n    propertyName,\n    valueProperty,\n    valueMixin,\n    rule\n  ) {\n    // handle case where property value is a mixin\n    if (valueProperty) {\n      // form: --mixin2: var(--mixin1), where --mixin1 is in the map\n      processVariableAndFallback(valueProperty, (prefix, value) => {\n        if (value && this._map.get(value)) {\n          valueMixin = `@apply ${value};`;\n        }\n      });\n    }\n    if (!valueMixin) {\n      return matchText;\n    }\n    let mixinAsProperties = this._consumeCssProperties('' + valueMixin, rule);\n    let prefix = matchText.slice(0, matchText.indexOf('--'));\n    // `initial` and `inherit` as properties in a map should be replaced because\n    // these keywords are eagerly evaluated when the mixin becomes CSS Custom Properties,\n    // and would set the variable value, rather than carry the keyword to the `var()` usage.\n    let mixinValues = this._cssTextToMap(mixinAsProperties, true);\n    let combinedProps = mixinValues;\n    let mixinEntry = this._map.get(propertyName);\n    let oldProps = mixinEntry && mixinEntry.properties;\n    if (oldProps) {\n      // NOTE: since we use mixin, the map of properties is updated here\n      // and this is what we want.\n      combinedProps = Object.assign(Object.create(oldProps), mixinValues);\n    } else {\n      this._map.set(propertyName, combinedProps);\n    }\n    let out = [];\n    let p, v;\n    // set variables defined by current mixin\n    let needToInvalidate = false;\n    for (p in combinedProps) {\n      v = mixinValues[p];\n      // if property not defined by current mixin, set initial\n      if (v === undefined) {\n        v = 'initial';\n      }\n      if (oldProps && !(p in oldProps)) {\n        needToInvalidate = true;\n      }\n      out.push(`${propertyName}${MIXIN_VAR_SEP}${p}: ${v}`);\n    }\n    if (needToInvalidate) {\n      this._invalidateMixinEntry(mixinEntry);\n    }\n    if (mixinEntry) {\n      mixinEntry.properties = combinedProps;\n    }\n    // because the mixinMap is global, the mixin might conflict with\n    // a different scope's simple variable definition:\n    // Example:\n    // some style somewhere:\n    // --mixin1:{ ... }\n    // --mixin2: var(--mixin1);\n    // some other element:\n    // --mixin1: 10px solid red;\n    // --foo: var(--mixin1);\n    // In this case, we leave the original variable definition in place.\n    if (valueProperty) {\n      prefix = `${matchText};${prefix}`;\n    }\n    return `${prefix}${out.join('; ')};`;\n  }\n}\n\n/* exports */\n/* eslint-disable no-self-assign */\nApplyShim.prototype['detectMixin'] = ApplyShim.prototype.detectMixin;\nApplyShim.prototype['transformStyle'] = ApplyShim.prototype.transformStyle;\nApplyShim.prototype['transformCustomStyle'] =\n  ApplyShim.prototype.transformCustomStyle;\nApplyShim.prototype['transformRules'] = ApplyShim.prototype.transformRules;\nApplyShim.prototype['transformRule'] = ApplyShim.prototype.transformRule;\nApplyShim.prototype['transformTemplate'] =\n  ApplyShim.prototype.transformTemplate;\nApplyShim.prototype['_separator'] = MIXIN_VAR_SEP;\n/* eslint-enable no-self-assign */\nObject.defineProperty(ApplyShim.prototype, 'invalidCallback', {\n  /** @return {?function(string)} */\n  get() {\n    return invalidCallback;\n  },\n  /** @param {?function(string)} cb */\n  set(cb) {\n    invalidCallback = cb;\n  },\n});\n\nexport default ApplyShim;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    invalidateTemplate(template);\n  }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n  // default the current version to 0\n  template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n  // ensure the \"validating for\" flag exists\n  template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n  // increment the next version\n  template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValid(template);\n  }\n  return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n  return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValidating(template);\n  }\n  return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n  return (\n    !templateIsValid(template) &&\n    template[VALIDATING_VERSION] === template[NEXT_VERSION]\n  );\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n */\nexport function startValidating(elementName) {\n  let template = templateMap[elementName];\n  startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n  // remember that the current \"next version\" is the reason for this validation cycle\n  template[VALIDATING_VERSION] = template[NEXT_VERSION];\n  // however, there only needs to be one async task to clear the counters\n  if (!template._validating) {\n    template._validating = true;\n    promise.then(function () {\n      // sync the current version to let future invalidations cause a refresh cycle\n      template[CURRENT_VERSION] = template[NEXT_VERSION];\n      template._validating = false;\n    });\n  }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n  for (let elementName in templateMap) {\n    let template = templateMap[elementName];\n    if (!templateIsValid(template)) {\n      return true;\n    }\n  }\n  return false;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ApplyShim from '../src/apply-shim.js';\nimport templateMap from '../src/template-map.js';\n// prettier-ignore\nimport {getIsExtends, toCssText, elementHasBuiltCss} from '../src/style-util.js';\nimport * as ApplyShimUtils from '../src/apply-shim-utils.js';\n// prettier-ignore\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\nimport {CustomStyleInterfaceInterface} from '../src/custom-style-interface.js'; // eslint-disable-line @typescript-eslint/no-unused-vars\n// prettier-ignore\nimport {nativeCssVariables, nativeShadow, cssBuild, disableRuntime} from '../src/style-settings.js';\n\n/** @const {ApplyShim} */\nconst applyShim = new ApplyShim();\n\nclass ApplyShimInterface {\n  constructor() {\n    /** @type {?CustomStyleInterfaceInterface} */\n    this.customStyleInterface = null;\n    applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n  }\n  ensure() {\n    if (this.customStyleInterface) {\n      return;\n    }\n    if (window.ShadyCSS.CustomStyleInterface) {\n      this.customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */ (window\n        .ShadyCSS.CustomStyleInterface);\n      this.customStyleInterface['transformCallback'] = (style) => {\n        applyShim.transformCustomStyle(style);\n      };\n      this.customStyleInterface['validateCallback'] = () => {\n        requestAnimationFrame(() => {\n          if (this.customStyleInterface['enqueued']) {\n            this.flushCustomStyles();\n          }\n        });\n      };\n    }\n  }\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   */\n  prepareTemplate(template, elementName) {\n    this.ensure();\n    if (elementHasBuiltCss(template)) {\n      return;\n    }\n    templateMap[elementName] = template;\n    let ast = applyShim.transformTemplate(template, elementName);\n    // save original style ast to use for revalidating instances\n    template['_styleAst'] = ast;\n  }\n  flushCustomStyles() {\n    this.ensure();\n    if (!this.customStyleInterface) {\n      return;\n    }\n    let styles = this.customStyleInterface['processStyles']();\n    if (!this.customStyleInterface['enqueued']) {\n      return;\n    }\n    for (let i = 0; i < styles.length; i++) {\n      let cs = styles[i];\n      let style = this.customStyleInterface['getStyleForCustomStyle'](cs);\n      if (style) {\n        applyShim.transformCustomStyle(style);\n      }\n    }\n    this.customStyleInterface['enqueued'] = false;\n  }\n  /**\n   * @param {HTMLElement} element\n   * @param {Object=} properties\n   */\n  styleSubtree(element, properties) {\n    this.ensure();\n    if (properties) {\n      updateNativeProperties(element, properties);\n    }\n    if (element.shadowRoot) {\n      this.styleElement(element);\n      let shadowChildren =\n        /** @type {!ParentNode} */ (element.shadowRoot).children ||\n        element.shadowRoot.childNodes;\n      for (let i = 0; i < shadowChildren.length; i++) {\n        this.styleSubtree(/** @type {HTMLElement} */ (shadowChildren[i]));\n      }\n    } else {\n      let children = element.children || element.childNodes;\n      for (let i = 0; i < children.length; i++) {\n        this.styleSubtree(/** @type {HTMLElement} */ (children[i]));\n      }\n    }\n  }\n  /**\n   * @param {HTMLElement} element\n   */\n  styleElement(element) {\n    this.ensure();\n    let {is} = getIsExtends(element);\n    let template = templateMap[is];\n    if (template && elementHasBuiltCss(template)) {\n      return;\n    }\n    if (template && !ApplyShimUtils.templateIsValid(template)) {\n      // only revalidate template once\n      if (!ApplyShimUtils.templateIsValidating(template)) {\n        this.prepareTemplate(template, is);\n        ApplyShimUtils.startValidatingTemplate(template);\n      }\n      // update this element instance\n      let root = element.shadowRoot;\n      if (root) {\n        let style = /** @type {HTMLStyleElement} */ (root.querySelector(\n          'style'\n        ));\n        if (style) {\n          // reuse the template's style ast, it has all the original css text\n          style['__cssRules'] = template['_styleAst'];\n          style.textContent = toCssText(template['_styleAst']);\n        }\n      }\n    }\n  }\n  /**\n   * @param {Object=} properties\n   */\n  styleDocument(properties) {\n    this.ensure();\n    this.styleSubtree(document.body, properties);\n  }\n}\n\nif (!window.ShadyCSS || !window.ShadyCSS.ScopingShim) {\n  const applyShimInterface = new ApplyShimInterface();\n  let CustomStyleInterface =\n    window.ShadyCSS && window.ShadyCSS.CustomStyleInterface;\n\n  /** @suppress {duplicate} */\n  window.ShadyCSS = {\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    prepareTemplate(template, elementName, elementExtends) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.prepareTemplate(template, elementName);\n    },\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplateStyles(template, elementName, elementExtends) {\n      window.ShadyCSS.prepareTemplate(template, elementName, elementExtends);\n    },\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     */\n    prepareTemplateDom(template, elementName) {}, // eslint-disable-line @typescript-eslint/no-unused-vars\n\n    /**\n     * @param {!HTMLElement} element\n     * @param {Object=} properties\n     */\n    styleSubtree(element, properties) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleSubtree(element, properties);\n    },\n\n    /**\n     * @param {!HTMLElement} element\n     */\n    styleElement(element) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleElement(element);\n    },\n\n    /**\n     * @param {Object=} properties\n     */\n    styleDocument(properties) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleDocument(properties);\n    },\n\n    /**\n     * @param {Element} element\n     * @param {string} property\n     * @return {string}\n     */\n    getComputedStyleValue(element, property) {\n      return getComputedStyleValue(element, property);\n    },\n\n    flushCustomStyles() {\n      applyShimInterface.flushCustomStyles();\n    },\n\n    nativeCss: nativeCssVariables,\n    nativeShadow: nativeShadow,\n    cssBuild: cssBuild,\n    disableRuntime: disableRuntime,\n  };\n\n  if (CustomStyleInterface) {\n    window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n  }\n}\n\nwindow.ShadyCSS.ApplyShim = applyShim;\n","/**\n * @fileoverview\n * @suppress {checkPrototypalTypes}\n * @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport { PropertyAccessors } from './property-accessors.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\n\nconst HOST_DIR = /:host\\(:dir\\((ltr|rtl)\\)\\)/g;\nconst HOST_DIR_REPLACMENT = ':host([dir=\"$1\"])';\n\nconst EL_DIR = /([\\s\\w-#\\.\\[\\]\\*]*):dir\\((ltr|rtl)\\)/g;\nconst EL_DIR_REPLACMENT = ':host([dir=\"$2\"]) $1';\n\nconst DIR_CHECK = /:dir\\((?:ltr|rtl)\\)/;\n\nconst SHIM_SHADOW = Boolean(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\n\n/**\n * @type {!Array<!Polymer_DirMixin>}\n */\nconst DIR_INSTANCES = [];\n\n/** @type {?MutationObserver} */\nlet observer = null;\n\nlet documentDir = '';\n\nfunction getRTL() {\n  documentDir = document.documentElement.getAttribute('dir');\n}\n\n/**\n * @param {!Polymer_DirMixin} instance Instance to set RTL status on\n */\nfunction setRTL(instance) {\n  if (!instance.__autoDirOptOut) {\n    const el = /** @type {!HTMLElement} */(instance);\n    el.setAttribute('dir', documentDir);\n  }\n}\n\nfunction updateDirection() {\n  getRTL();\n  documentDir = document.documentElement.getAttribute('dir');\n  for (let i = 0; i < DIR_INSTANCES.length; i++) {\n    setRTL(DIR_INSTANCES[i]);\n  }\n}\n\nfunction takeRecords() {\n  if (observer && observer.takeRecords().length) {\n    updateDirection();\n  }\n}\n\n/**\n * Element class mixin that allows elements to use the `:dir` CSS Selector to\n * have text direction specific styling.\n *\n * With this mixin, any stylesheet provided in the template will transform\n * `:dir` into `:host([dir])` and sync direction with the page via the\n * element's `dir` attribute.\n *\n * Elements can opt out of the global page text direction by setting the `dir`\n * attribute directly in `ready()` or in HTML.\n *\n * Caveats:\n * - Applications must set `<html dir=\"ltr\">` or `<html dir=\"rtl\">` to sync\n *   direction\n * - Automatic left-to-right or right-to-left styling is sync'd with the\n *   `<html>` element only.\n * - Changing `dir` at runtime is supported.\n * - Opting out of the global direction styling is permanent\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin PropertyAccessors\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const DirMixin = dedupingMixin((base) => {\n\n  if (!SHIM_SHADOW) {\n    if (!observer) {\n      getRTL();\n      observer = new MutationObserver(updateDirection);\n      observer.observe(document.documentElement, {attributes: true, attributeFilter: ['dir']});\n    }\n  }\n\n  /**\n   * @constructor\n   * @implements {Polymer_PropertyAccessors}\n   * @private\n   */\n  const elementBase = PropertyAccessors(base);\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_DirMixin}\n   */\n  class Dir extends elementBase {\n\n    /**\n     * @param {string} cssText .\n     * @param {string} baseURI .\n     * @return {string} .\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _processStyleText(cssText, baseURI) {\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      cssText = elementBase._processStyleText.call(this, cssText, baseURI);\n      if (!SHIM_SHADOW && DIR_CHECK.test(cssText)) {\n        cssText = this._replaceDirInCssText(cssText);\n        this.__activateDir = true;\n      }\n      return cssText;\n    }\n\n    /**\n     * Replace `:dir` in the given CSS text\n     *\n     * @param {string} text CSS text to replace DIR\n     * @return {string} Modified CSS\n     * @nocollapse\n     */\n    static _replaceDirInCssText(text) {\n      let replacedText = text;\n      replacedText = replacedText.replace(HOST_DIR, HOST_DIR_REPLACMENT);\n      replacedText = replacedText.replace(EL_DIR, EL_DIR_REPLACMENT);\n      return replacedText;\n    }\n\n    constructor() {\n      super();\n      /** @type {boolean} */\n      this.__autoDirOptOut = false;\n    }\n\n    /**\n     * @override\n     * @suppress {invalidCasts} Closure doesn't understand that `this` is an\n     *     HTMLElement\n     * @return {void}\n     */\n    ready() {\n      super.ready();\n      this.__autoDirOptOut = /** @type {!HTMLElement} */(this).hasAttribute('dir');\n    }\n\n    /**\n     * @override\n     * @suppress {missingProperties} If it exists on elementBase, it can be\n     *   super'd\n     * @return {void}\n     */\n    connectedCallback() {\n      if (elementBase.prototype.connectedCallback) {\n        super.connectedCallback();\n      }\n      if (this.constructor.__activateDir) {\n        takeRecords();\n        DIR_INSTANCES.push(this);\n        setRTL(this);\n      }\n    }\n\n    /**\n     * @override\n     * @suppress {missingProperties} If it exists on elementBase, it can be\n     *   super'd\n     * @return {void}\n     */\n    disconnectedCallback() {\n      if (elementBase.prototype.disconnectedCallback) {\n        super.disconnectedCallback();\n      }\n      if (this.constructor.__activateDir) {\n        const idx = DIR_INSTANCES.indexOf(this);\n        if (idx > -1) {\n          DIR_INSTANCES.splice(idx, 1);\n        }\n      }\n    }\n  }\n\n  Dir.__activateDir = false;\n\n  return Dir;\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nfunction resolve() {\n  document.body.removeAttribute('unresolved');\n}\n\nif (document.readyState === 'interactive' || document.readyState === 'complete') {\n  resolve();\n} else {\n  window.addEventListener('DOMContentLoaded', resolve);\n}\n\nexport {};\n","/**\n@license\nCopyright (c) 2019 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport './boot.js';\nimport {wrap} from './wrap.js';\n\nconst ShadyDOM = window.ShadyDOM;\nconst ShadyCSS = window.ShadyCSS;\n\n/**\n * Return true if node scope is correct.\n *\n * @param {!Element} node Node to check scope\n * @param {!Node} scope Scope reference\n * @return {boolean} True if node is in scope\n */\nfunction sameScope(node, scope) {\n  return wrap(node).getRootNode() === scope;\n}\n\n/**\n * Ensure that elements in a ShadowDOM container are scoped correctly.\n * This function is only needed when ShadyDOM is used and unpatched DOM APIs are used in third party code.\n * This can happen in noPatch mode or when specialized APIs like ranges or tables are used to mutate DOM.\n *\n * @param  {!Element} container Container element to scope\n * @param  {boolean=} shouldObserve if true, start a mutation observer for added nodes to the container\n * @return {?MutationObserver} Returns a new MutationObserver on `container` if `shouldObserve` is true.\n */\nexport function scopeSubtree(container, shouldObserve = false) {\n  // If using native ShadowDOM, abort\n  if (!ShadyDOM || !ShadyCSS) {\n    return null;\n  }\n  // ShadyCSS handles DOM mutations when ShadyDOM does not handle scoping itself\n  if (!ShadyDOM['handlesDynamicScoping']) {\n    return null;\n  }\n  const ScopingShim = ShadyCSS['ScopingShim'];\n  // if ScopingShim is not available, abort\n  if (!ScopingShim) {\n    return null;\n  }\n  // capture correct scope for container\n  const containerScope = ScopingShim['scopeForNode'](container);\n  const root = wrap(container).getRootNode();\n\n  const scopify = (node) => {\n    if (!sameScope(node, root)) {\n      return;\n    }\n    // NOTE: native qSA does not honor scoped DOM, but it is faster, and the same behavior as Polymer v1\n    const elements = Array.from(ShadyDOM['nativeMethods']['querySelectorAll'].call(node, '*'));\n    elements.push(node);\n    for (let i = 0; i < elements.length; i++) {\n      const el = elements[i];\n      if (!sameScope(el, root)) {\n        continue;\n      }\n      const currentScope = ScopingShim['currentScopeForNode'](el);\n      if (currentScope !== containerScope) {\n        if (currentScope !== '') {\n          ScopingShim['unscopeNode'](el, currentScope);\n        }\n        ScopingShim['scopeNode'](el, containerScope);\n      }\n    }\n  };\n\n  // scope everything in container\n  scopify(container);\n\n  if (shouldObserve) {\n    const mo = new MutationObserver((mxns) => {\n      for (let i = 0; i < mxns.length; i++) {\n        const mxn = mxns[i];\n        for (let j = 0; j < mxn.addedNodes.length; j++) {\n          const addedNode = mxn.addedNodes[j];\n          if (addedNode.nodeType === Node.ELEMENT_NODE) {\n            scopify(addedNode);\n          }\n        }\n      }\n    });\n    mo.observe(container, {childList: true, subtree: true});\n    return mo;\n  } else {\n    return null;\n  }\n}","/**\n * @fileoverview\n * @suppress {checkPrototypalTypes}\n * @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport { ElementMixin } from './element-mixin.js';\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { wrap } from '../utils/wrap.js';\n\nconst DISABLED_ATTR = 'disable-upgrade';\n\nexport const findObservedAttributesGetter = (ctor) => {\n  while (ctor) {\n    const desc = Object.getOwnPropertyDescriptor(ctor, 'observedAttributes');\n    if (desc) {\n      return desc.get;\n    }\n    ctor = Object.getPrototypeOf(ctor.prototype).constructor;\n  }\n  return () => [];\n};\n\n/**\n * Element class mixin that allows the element to boot up in a non-enabled\n * state when the `disable-upgrade` attribute is present. This mixin is\n * designed to be used with element classes like PolymerElement that perform\n * initial startup work when they are first connected. When the\n * `disable-upgrade` attribute is removed, if the element is connected, it\n * boots up and \"enables\" as it otherwise would; if it is not connected, the\n * element boots up when it is next connected.\n *\n * Using `disable-upgrade` with PolymerElement prevents any data propagation\n * to the element, any element DOM from stamping, or any work done in\n * connected/disconnctedCallback from occuring, but it does not prevent work\n * done in the element constructor.\n *\n * Note, this mixin must be applied on top of any element class that\n * itself implements a `connectedCallback` so that it can control the work\n * done in `connectedCallback`. For example,\n *\n *     MyClass = DisableUpgradeMixin(class extends BaseClass {...});\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin ElementMixin\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const DisableUpgradeMixin = dedupingMixin((base) => {\n  /**\n   * @constructor\n   * @implements {Polymer_ElementMixin}\n   * @extends {HTMLElement}\n   * @private\n   */\n  const superClass = ElementMixin(base);\n\n  // Work around for closure bug #126934458. Using `super` in a property\n  // getter does not work so instead we search the Base prototype for an\n  // implementation of observedAttributes so that we can override and call\n  // the `super` getter. Note, this is done one time ever because we assume\n  // that `Base` is always comes from `Polymer.LegacyElementMixn`.\n  let observedAttributesGetter = findObservedAttributesGetter(superClass);\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_DisableUpgradeMixin}\n   */\n  class DisableUpgradeClass extends superClass {\n\n    constructor() {\n      super();\n      /** @type {boolean|undefined} */\n      this.__isUpgradeDisabled;\n    }\n\n    static get observedAttributes() {\n      return observedAttributesGetter.call(this).concat(DISABLED_ATTR);\n    }\n\n    // Prevent element from initializing properties when it's upgrade disabled.\n    /** @override */\n    _initializeProperties() {\n      if (this.hasAttribute(DISABLED_ATTR)) {\n        this.__isUpgradeDisabled = true;\n      } else {\n        super._initializeProperties();\n      }\n    }\n\n    // Prevent element from enabling properties when it's upgrade disabled.\n    // Normally overriding connectedCallback would be enough, but dom-* elements\n    /** @override */\n    _enableProperties() {\n      if (!this.__isUpgradeDisabled) {\n        super._enableProperties();\n      }\n    }\n\n    // If the element starts upgrade-disabled and a property is set for\n    // which an accessor exists, the default should not be applied.\n    // This additional check is needed because defaults are applied via\n    // `_initializeProperties` which is called after initial properties\n    // have been set when the element starts upgrade-disabled.\n    /** @override */\n    _canApplyPropertyDefault(property) {\n      return super._canApplyPropertyDefault(property) &&\n        !(this.__isUpgradeDisabled && this._isPropertyPending(property));\n    }\n\n    /**\n     * @override\n     * @param {string} name Attribute name.\n     * @param {?string} old The previous value for the attribute.\n     * @param {?string} value The new value for the attribute.\n     * @param {?string} namespace The XML namespace for the attribute.\n     * @return {void}\n     */\n    attributeChangedCallback(name, old, value, namespace) {\n      if (name == DISABLED_ATTR) {\n        // When disable-upgrade is removed, initialize properties and\n        // provoke connectedCallback if the element is already connected.\n        if (this.__isUpgradeDisabled && value == null) {\n          super._initializeProperties();\n          this.__isUpgradeDisabled = false;\n          if (wrap(this).isConnected) {\n            super.connectedCallback();\n          }\n        }\n      } else {\n        super.attributeChangedCallback(\n            name, old, value, /** @type {null|string} */ (namespace));\n      }\n    }\n\n    // Prevent element from connecting when it's upgrade disabled.\n    // This prevents user code in `attached` from being called.\n    /** @override */\n    connectedCallback() {\n      if (!this.__isUpgradeDisabled) {\n        super.connectedCallback();\n      }\n    }\n\n    // Prevent element from disconnecting when it's upgrade disabled.\n    // This avoids allowing user code `detached` from being called without a\n    // paired call to `attached`.\n    /** @override */\n    disconnectedCallback() {\n      if (!this.__isUpgradeDisabled) {\n        super.disconnectedCallback();\n      }\n    }\n\n  }\n\n  return DisableUpgradeClass;\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@webcomponents/shadycss/entrypoints/apply-shim.js';\nimport { ElementMixin, builtCSS } from '../mixins/element-mixin.js';\nimport { GestureEventListeners } from '../mixins/gesture-event-listeners.js';\nimport { DirMixin } from '../mixins/dir-mixin.js';\nimport { dedupingMixin } from '../utils/mixin.js';\nimport '../utils/render-status.js';\nimport '../utils/unresolved.js';\nimport { dom, matchesSelector } from './polymer.dom.js';\nimport { setTouchAction } from '../utils/gestures.js';\nimport { Debouncer } from '../utils/debounce.js';\nimport { timeOut, microTask } from '../utils/async.js';\nimport { get } from '../utils/path.js';\nimport { wrap } from '../utils/wrap.js';\nimport { scopeSubtree } from '../utils/scope-subtree.js';\nimport { legacyOptimizations, legacyNoObservedAttributes } from '../utils/settings.js';\nimport { findObservedAttributesGetter } from '../mixins/disable-upgrade-mixin.js';\nimport { register } from '../utils/telemetry.js';\n\nconst DISABLED_ATTR = 'disable-upgrade';\n\nlet styleInterface = window.ShadyCSS;\n\n/**\n * Element class mixin that provides Polymer's \"legacy\" API intended to be\n * backward-compatible to the greatest extent possible with the API\n * found on the Polymer 1.x `Polymer.Base` prototype applied to all elements\n * defined using the `Polymer({...})` function.\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin ElementMixin\n * @appliesMixin GestureEventListeners\n * @appliesMixin DirMixin\n * @property isAttached {boolean} Set to `true` in this element's\n *   `connectedCallback` and `false` in `disconnectedCallback`\n * @summary Element class mixin that provides Polymer's \"legacy\" API\n */\nexport const LegacyElementMixin = dedupingMixin((base) => {\n\n  // TODO(kschaaf): Note, the `@implements {Polymer_DirMixin}` is required here\n  // (rather than on legacyElementBase) for unknown reasons.\n  /**\n   * @constructor\n   * @implements {Polymer_ElementMixin}\n   * @implements {Polymer_GestureEventListeners}\n   * @implements {Polymer_DirMixin}\n   * @extends {HTMLElement}\n   * @private\n   */\n  const GesturesElement = GestureEventListeners(ElementMixin(base));\n\n  // Note, the DirMixin does nothing if css is built so avoid including it\n  // in that case.\n\n  /**\n   * @constructor\n   * @extends {GesturesElement}\n   * @private\n   */\n  const legacyElementBase = builtCSS ? GesturesElement :\n    DirMixin(GesturesElement);\n\n  const observedAttributesGetter = findObservedAttributesGetter(legacyElementBase);\n\n  /**\n   * Map of simple names to touch action names\n   * @dict\n   */\n  const DIRECTION_MAP = {\n    'x': 'pan-x',\n    'y': 'pan-y',\n    'none': 'none',\n    'all': 'auto'\n  };\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @extends {legacyElementBase}\n   * @implements {Polymer_LegacyElementMixin}\n   * @unrestricted\n   */\n  class LegacyElement extends legacyElementBase {\n\n    constructor() {\n      super();\n      /** @type {boolean} */\n      this.isAttached;\n      /** @type {?WeakMap<!Element, !Object<string, !Function>>} */\n      this.__boundListeners;\n      /** @type {?Object<string, ?Function>} */\n      this._debouncers;\n      // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n      /** @type {boolean|undefined} */\n      this.__isUpgradeDisabled;\n      /** @type {boolean|undefined} */\n      this.__needsAttributesAtConnected;\n      /** @type {boolean|undefined} */\n      this._legacyForceObservedAttributes;\n    }\n\n    /**\n     * Forwards `importMeta` from the prototype (i.e. from the info object\n     * passed to `Polymer({...})`) to the static API.\n     *\n     * @return {!Object} The `import.meta` object set on the prototype\n     * @suppress {missingProperties} `this` is always in the instance in\n     *  closure for some reason even in a static method, rather than the class\n     * @nocollapse\n     */\n    static get importMeta() {\n      return this.prototype.importMeta;\n    }\n\n    /**\n     * Legacy callback called during the `constructor`, for overriding\n     * by the user.\n     * @override\n     * @return {void}\n     */\n    created() {}\n\n    /**\n     * Processes an attribute reaction when the `legacyNoObservedAttributes`\n     * setting is in use.\n     * @param {string} name Name of attribute that changed\n     * @param {?string} old Old attribute value\n     * @param {?string} value New attribute value\n     * @return {void}\n     */\n    __attributeReaction(name, old, value) {\n      if ((this.__dataAttributes && this.__dataAttributes[name]) || name === DISABLED_ATTR) {\n        this.attributeChangedCallback(name, old, value, null);\n      }\n    }\n\n    /**\n     * Sets the value of an attribute.\n     * @override\n     */\n    setAttribute(name, value) {\n      if (legacyNoObservedAttributes && !this._legacyForceObservedAttributes) {\n        const oldValue = this.getAttribute(name);\n        super.setAttribute(name, value);\n        // value coerced to String for closure's benefit\n        this.__attributeReaction(name, oldValue, String(value));\n      } else {\n        super.setAttribute(name, value);\n      }\n    }\n\n    /**\n     * Removes an attribute.\n     * @override\n     */\n    removeAttribute(name) {\n      if (legacyNoObservedAttributes && !this._legacyForceObservedAttributes) {\n        const oldValue = this.getAttribute(name);\n        super.removeAttribute(name);\n        this.__attributeReaction(name, oldValue, null);\n      } else {\n        super.removeAttribute(name);\n      }\n    }\n\n    // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n    static get observedAttributes() {\n      if (legacyNoObservedAttributes && !this.prototype._legacyForceObservedAttributes) {\n        // Ensure this element is property registered with the telemetry system.\n        if (!this.hasOwnProperty(JSCompiler_renameProperty('__observedAttributes', this))) {\n          this.__observedAttributes = [];\n          register(this.prototype);\n        }\n        return this.__observedAttributes;\n      } else {\n        return observedAttributesGetter.call(this).concat(DISABLED_ATTR);\n      }\n    }\n\n    // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n    // Prevent element from enabling properties when it's upgrade disabled.\n    // Normally overriding connectedCallback would be enough, but dom-* elements\n    /** @override */\n    _enableProperties() {\n      if (!this.__isUpgradeDisabled) {\n        super._enableProperties();\n      }\n    }\n\n    // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n    // If the element starts upgrade-disabled and a property is set for\n    // which an accessor exists, the default should not be applied.\n    // This additional check is needed because defaults are applied via\n    // `_initializeProperties` which is called after initial properties\n    // have been set when the element starts upgrade-disabled.\n    /** @override */\n    _canApplyPropertyDefault(property) {\n      return super._canApplyPropertyDefault(property) &&\n        !(this.__isUpgradeDisabled && this._isPropertyPending(property));\n    }\n\n    /**\n     * Provides an implementation of `connectedCallback`\n     * which adds Polymer legacy API's `attached` method.\n     * @return {void}\n     * @override\n     */\n    connectedCallback() {\n      if (this.__needsAttributesAtConnected) {\n        this._takeAttributes();\n      }\n      // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n      if (!this.__isUpgradeDisabled) {\n        super.connectedCallback();\n        this.isAttached = true;\n        this.attached();\n      }\n    }\n\n    /**\n     * Legacy callback called during `connectedCallback`, for overriding\n     * by the user.\n     * @override\n     * @return {void}\n     */\n    attached() {}\n\n    /**\n     * Provides an implementation of `disconnectedCallback`\n     * which adds Polymer legacy API's `detached` method.\n     * @return {void}\n     * @override\n     */\n    disconnectedCallback() {\n      // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n      if (!this.__isUpgradeDisabled) {\n        super.disconnectedCallback();\n        this.isAttached = false;\n        this.detached();\n      }\n    }\n\n    /**\n     * Legacy callback called during `disconnectedCallback`, for overriding\n     * by the user.\n     * @override\n     * @return {void}\n     */\n    detached() {}\n\n    /**\n     * Provides an override implementation of `attributeChangedCallback`\n     * which adds the Polymer legacy API's `attributeChanged` method.\n     * @param {string} name Name of attribute.\n     * @param {?string} old Old value of attribute.\n     * @param {?string} value Current value of attribute.\n     * @param {?string} namespace Attribute namespace.\n     * @return {void}\n     * @override\n     */\n    attributeChangedCallback(name, old, value, namespace) {\n      if (old !== value) {\n        // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n        if (name == DISABLED_ATTR) {\n          // When disable-upgrade is removed, intialize properties and\n          // provoke connectedCallback if the element is already connected.\n          if (this.__isUpgradeDisabled && value == null) {\n            this._initializeProperties();\n            this.__isUpgradeDisabled = false;\n            if (wrap(this).isConnected) {\n              this.connectedCallback();\n            }\n          }\n        } else {\n          super.attributeChangedCallback(name, old, value, namespace);\n          this.attributeChanged(name, old, value);\n        }\n      }\n    }\n\n    /**\n     * Legacy callback called during `attributeChangedChallback`, for overriding\n     * by the user.\n     * @param {string} name Name of attribute.\n     * @param {?string} old Old value of attribute.\n     * @param {?string} value Current value of attribute.\n     * @return {void}\n     * @override\n     */\n    attributeChanged(name, old, value) {} // eslint-disable-line no-unused-vars\n\n    /**\n     * Overrides the default `Polymer.PropertyEffects` implementation to\n     * add support for class initialization via the `_registered` callback.\n     * This is called only when the first instance of the element is created.\n     *\n     * @return {void}\n     * @override\n     * @suppress {invalidCasts}\n     */\n    _initializeProperties() {\n      // NOTE: Inlined for perf from version of DisableUpgradeMixin.\n      // Only auto-use disable-upgrade if legacyOptimizations is set.\n      if (legacyOptimizations && this.hasAttribute(DISABLED_ATTR)) {\n        this.__isUpgradeDisabled = true;\n      } else {\n        let proto = Object.getPrototypeOf(this);\n        if (!proto.hasOwnProperty(JSCompiler_renameProperty('__hasRegisterFinished', proto))) {\n          this._registered();\n          // backstop in case the `_registered` implementation does not set this\n          proto.__hasRegisterFinished = true;\n        }\n        super._initializeProperties();\n        this.root = /** @type {HTMLElement} */(this);\n        this.created();\n        // Pull all attribute values 1x if `legacyNoObservedAttributes` is set.\n        if (legacyNoObservedAttributes && !this._legacyForceObservedAttributes) {\n          if (this.hasAttributes()) {\n            this._takeAttributes();\n          // Element created from scratch or parser generated\n          } else if (!this.parentNode) {\n            this.__needsAttributesAtConnected = true;\n          }\n        }\n        // Ensure listeners are applied immediately so that they are\n        // added before declarative event listeners. This allows an element to\n        // decorate itself via an event prior to any declarative listeners\n        // seeing the event. Note, this ensures compatibility with 1.x ordering.\n        this._applyListeners();\n      }\n    }\n\n    _takeAttributes() {\n      const a = this.attributes;\n      for (let i=0, l=a.length; i < l; i++) {\n        const attr = a[i];\n        this.__attributeReaction(attr.name, null, attr.value);\n      }\n    }\n\n    /**\n     * Called automatically when an element is initializing.\n     * Users may override this method to perform class registration time\n     * work. The implementation should ensure the work is performed\n     * only once for the class.\n     * @protected\n     * @return {void}\n     * @override\n     */\n    _registered() {}\n\n    /**\n     * Overrides the default `Polymer.PropertyEffects` implementation to\n     * add support for installing `hostAttributes` and `listeners`.\n     *\n     * @return {void}\n     * @override\n     */\n    ready() {\n      this._ensureAttributes();\n      super.ready();\n    }\n\n    /**\n     * Ensures an element has required attributes. Called when the element\n     * is being readied via `ready`. Users should override to set the\n     * element's required attributes. The implementation should be sure\n     * to check and not override existing attributes added by\n     * the user of the element. Typically, setting attributes should be left\n     * to the element user and not done here; reasonable exceptions include\n     * setting aria roles and focusability.\n     * @protected\n     * @return {void}\n     * @override\n     */\n    _ensureAttributes() {}\n\n    /**\n     * Adds element event listeners. Called when the element\n     * is being readied via `ready`. Users should override to\n     * add any required element event listeners.\n     * In performance critical elements, the work done here should be kept\n     * to a minimum since it is done before the element is rendered. In\n     * these elements, consider adding listeners asynchronously so as not to\n     * block render.\n     * @protected\n     * @return {void}\n     * @override\n     */\n    _applyListeners() {}\n\n    /**\n     * Converts a typed JavaScript value to a string.\n     *\n     * Note this method is provided as backward-compatible legacy API\n     * only.  It is not directly called by any Polymer features. To customize\n     * how properties are serialized to attributes for attribute bindings and\n     * `reflectToAttribute: true` properties as well as this method, override\n     * the `_serializeValue` method provided by `Polymer.PropertyAccessors`.\n     *\n     * @param {*} value Value to deserialize\n     * @return {string | undefined} Serialized value\n     * @override\n     */\n    serialize(value) {\n      return this._serializeValue(value);\n    }\n\n    /**\n     * Converts a string to a typed JavaScript value.\n     *\n     * Note this method is provided as backward-compatible legacy API\n     * only.  It is not directly called by any Polymer features.  To customize\n     * how attributes are deserialized to properties for in\n     * `attributeChangedCallback`, override `_deserializeValue` method\n     * provided by `Polymer.PropertyAccessors`.\n     *\n     * @param {string} value String to deserialize\n     * @param {*} type Type to deserialize the string to\n     * @return {*} Returns the deserialized value in the `type` given.\n     * @override\n     */\n    deserialize(value, type) {\n      return this._deserializeValue(value, type);\n    }\n\n    /**\n     * Serializes a property to its associated attribute.\n     *\n     * Note this method is provided as backward-compatible legacy API\n     * only.  It is not directly called by any Polymer features.\n     *\n     * @param {string} property Property name to reflect.\n     * @param {string=} attribute Attribute name to reflect.\n     * @param {*=} value Property value to reflect.\n     * @return {void}\n     * @override\n     */\n    reflectPropertyToAttribute(property, attribute, value) {\n      this._propertyToAttribute(property, attribute, value);\n    }\n\n    /**\n     * Sets a typed value to an HTML attribute on a node.\n     *\n     * Note this method is provided as backward-compatible legacy API\n     * only.  It is not directly called by any Polymer features.\n     *\n     * @param {*} value Value to serialize.\n     * @param {string} attribute Attribute name to serialize to.\n     * @param {Element} node Element to set attribute to.\n     * @return {void}\n     * @override\n     */\n    serializeValueToAttribute(value, attribute, node) {\n      this._valueToNodeAttribute(/** @type {Element} */ (node || this), value, attribute);\n    }\n\n    /**\n     * Copies own properties (including accessor descriptors) from a source\n     * object to a target object.\n     *\n     * @param {Object} prototype Target object to copy properties to.\n     * @param {Object} api Source object to copy properties from.\n     * @return {Object} prototype object that was passed as first argument.\n     * @override\n     */\n    extend(prototype, api) {\n      if (!(prototype && api)) {\n        return prototype || api;\n      }\n      let n$ = Object.getOwnPropertyNames(api);\n      for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {\n        let pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          Object.defineProperty(prototype, n, pd);\n        }\n      }\n      return prototype;\n    }\n\n    /**\n     * Copies props from a source object to a target object.\n     *\n     * Note, this method uses a simple `for...in` strategy for enumerating\n     * properties.  To ensure only `ownProperties` are copied from source\n     * to target and that accessor implementations are copied, use `extend`.\n     *\n     * @param {!Object} target Target object to copy properties to.\n     * @param {!Object} source Source object to copy properties from.\n     * @return {!Object} Target object that was passed as first argument.\n     * @override\n     */\n    mixin(target, source) {\n      for (let i in source) {\n        target[i] = source[i];\n      }\n      return target;\n    }\n\n    /**\n     * Sets the prototype of an object.\n     *\n     * Note this method is provided as backward-compatible legacy API\n     * only.  It is not directly called by any Polymer features.\n     * @param {Object} object The object on which to set the prototype.\n     * @param {Object} prototype The prototype that will be set on the given\n     * `object`.\n     * @return {Object} Returns the given `object` with its prototype set\n     * to the given `prototype` object.\n     * @override\n     */\n    chainObject(object, prototype) {\n      if (object && prototype && object !== prototype) {\n        object.__proto__ = prototype;\n      }\n      return object;\n    }\n\n    /* **** Begin Template **** */\n\n    /**\n     * Calls `importNode` on the `content` of the `template` specified and\n     * returns a document fragment containing the imported content.\n     *\n     * @param {HTMLTemplateElement} template HTML template element to instance.\n     * @return {!DocumentFragment} Document fragment containing the imported\n     *   template content.\n     * @override\n     * @suppress {missingProperties} go/missingfnprops\n     */\n    instanceTemplate(template) {\n      let content = this.constructor._contentForTemplate(template);\n      let dom = /** @type {!DocumentFragment} */\n        (document.importNode(content, true));\n      return dom;\n    }\n\n    /* **** Begin Events **** */\n\n\n\n    /**\n     * Dispatches a custom event with an optional detail value.\n     *\n     * @param {string} type Name of event type.\n     * @param {*=} detail Detail value containing event-specific\n     *   payload.\n     * @param {{ bubbles: (boolean|undefined), cancelable: (boolean|undefined),\n     *     composed: (boolean|undefined) }=}\n     *  options Object specifying options.  These may include:\n     *  `bubbles` (boolean, defaults to `true`),\n     *  `cancelable` (boolean, defaults to false), and\n     *  `node` on which to fire the event (HTMLElement, defaults to `this`).\n     * @return {!Event} The new event that was fired.\n     * @override\n     */\n    fire(type, detail, options) {\n      options = options || {};\n      detail = (detail === null || detail === undefined) ? {} : detail;\n      let event = new Event(type, {\n        bubbles: options.bubbles === undefined ? true : options.bubbles,\n        cancelable: Boolean(options.cancelable),\n        composed: options.composed === undefined ? true: options.composed\n      });\n      event.detail = detail;\n      let node = options.node || this;\n      wrap(node).dispatchEvent(event);\n      return event;\n    }\n\n    /**\n     * Convenience method to add an event listener on a given element,\n     * late bound to a named method on this element.\n     *\n     * @param {?EventTarget} node Element to add event listener to.\n     * @param {string} eventName Name of event to listen for.\n     * @param {string} methodName Name of handler method on `this` to call.\n     * @return {void}\n     * @override\n     */\n    listen(node, eventName, methodName) {\n      node = /** @type {!EventTarget} */ (node || this);\n      let hbl = this.__boundListeners ||\n        (this.__boundListeners = new WeakMap());\n      let bl = hbl.get(node);\n      if (!bl) {\n        bl = {};\n        hbl.set(node, bl);\n      }\n      let key = eventName + methodName;\n      if (!bl[key]) {\n        bl[key] = this._addMethodEventListenerToNode(\n            /** @type {!Node} */ (node), eventName, methodName, this);\n      }\n    }\n\n    /**\n     * Convenience method to remove an event listener from a given element,\n     * late bound to a named method on this element.\n     *\n     * @param {?EventTarget} node Element to remove event listener from.\n     * @param {string} eventName Name of event to stop listening to.\n     * @param {string} methodName Name of handler method on `this` to not call\n     anymore.\n     * @return {void}\n     * @override\n     */\n    unlisten(node, eventName, methodName) {\n      node = /** @type {!EventTarget} */ (node || this);\n      let bl = this.__boundListeners &&\n          this.__boundListeners.get(/** @type {!Element} */ (node));\n      let key = eventName + methodName;\n      let handler = bl && bl[key];\n      if (handler) {\n        this._removeEventListenerFromNode(\n            /** @type {!Node} */ (node), eventName, handler);\n        bl[key] = /** @type {?} */ (null);\n      }\n    }\n\n    /**\n     * Override scrolling behavior to all direction, one direction, or none.\n     *\n     * Valid scroll directions:\n     *   - 'all': scroll in any direction\n     *   - 'x': scroll only in the 'x' direction\n     *   - 'y': scroll only in the 'y' direction\n     *   - 'none': disable scrolling for this node\n     *\n     * @param {string=} direction Direction to allow scrolling\n     * Defaults to `all`.\n     * @param {Element=} node Element to apply scroll direction setting.\n     * Defaults to `this`.\n     * @return {void}\n     * @override\n     */\n    setScrollDirection(direction, node) {\n      setTouchAction(\n          /** @type {!Element} */ (node || this),\n          DIRECTION_MAP[direction] || 'auto');\n    }\n    /* **** End Events **** */\n\n    /**\n     * Convenience method to run `querySelector` on this local DOM scope.\n     *\n     * This function calls `Polymer.dom(this.root).querySelector(slctr)`.\n     *\n     * @param {string} slctr Selector to run on this local DOM scope\n     * @return {Element} Element found by the selector, or null if not found.\n     * @override\n     */\n    $$(slctr) {\n      // Note, no need to `wrap` this because root is always patched\n      return this.root.querySelector(slctr);\n    }\n\n    /**\n     * Return the element whose local dom within which this element\n     * is contained. This is a shorthand for\n     * `this.getRootNode().host`.\n     * @this {Element}\n     * @return {?Node} The element whose local dom within which this element is\n     * contained.\n     * @override\n     */\n    get domHost() {\n      let root = wrap(this).getRootNode();\n      return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n    }\n\n    /**\n     * Force this element to distribute its children to its local dom.\n     * This should not be necessary as of Polymer 2.0.2 and is provided only\n     * for backwards compatibility.\n     * @return {void}\n     * @override\n     */\n    distributeContent() {\n      const thisEl = /** @type {Element} */ (this);\n      const domApi = /** @type {PolymerDomApi} */(dom(thisEl));\n      if (window.ShadyDOM && domApi.shadowRoot) {\n        ShadyDOM.flush();\n      }\n    }\n\n    /**\n     * Returns a list of nodes that are the effective childNodes. The effective\n     * childNodes list is the same as the element's childNodes except that\n     * any `<content>` elements are replaced with the list of nodes distributed\n     * to the `<content>`, the result of its `getDistributedNodes` method.\n     * @return {!Array<!Node>} List of effective child nodes.\n     * @suppress {invalidCasts} LegacyElementMixin must be applied to an\n     *     HTMLElement\n     * @override\n     */\n    getEffectiveChildNodes() {\n      const thisEl = /** @type {Element} */ (this);\n      const domApi = /** @type {PolymerDomApi} */ (dom(thisEl));\n      return domApi.getEffectiveChildNodes();\n    }\n\n    /**\n     * Returns a list of nodes distributed within this element that match\n     * `selector`. These can be dom children or elements distributed to\n     * children that are insertion points.\n     * @param {string} selector Selector to run.\n     * @return {!Array<!Node>} List of distributed elements that match selector.\n     * @suppress {invalidCasts} LegacyElementMixin must be applied to an\n     * HTMLElement\n     * @override\n     */\n    queryDistributedElements(selector) {\n      const thisEl = /** @type {Element} */ (this);\n      const domApi = /** @type {PolymerDomApi} */ (dom(thisEl));\n      return domApi.queryDistributedElements(selector);\n    }\n\n    /**\n     * Returns a list of elements that are the effective children. The effective\n     * children list is the same as the element's children except that\n     * any `<content>` elements are replaced with the list of elements\n     * distributed to the `<content>`.\n     *\n     * @return {!Array<!Node>} List of effective children.\n     * @override\n     */\n    getEffectiveChildren() {\n      let list = this.getEffectiveChildNodes();\n      return list.filter(function(/** @type {!Node} */ n) {\n        return (n.nodeType === Node.ELEMENT_NODE);\n      });\n    }\n\n    /**\n     * Returns a string of text content that is the concatenation of the\n     * text content's of the element's effective childNodes (the elements\n     * returned by <a href=\"#getEffectiveChildNodes>getEffectiveChildNodes</a>.\n     *\n     * @return {string} List of effective children.\n     * @override\n     */\n    getEffectiveTextContent() {\n      let cn = this.getEffectiveChildNodes();\n      let tc = [];\n      for (let i=0, c; (c = cn[i]); i++) {\n        if (c.nodeType !== Node.COMMENT_NODE) {\n          tc.push(c.textContent);\n        }\n      }\n      return tc.join('');\n    }\n\n    /**\n     * Returns the first effective childNode within this element that\n     * match `selector`. These can be dom child nodes or elements distributed\n     * to children that are insertion points.\n     * @param {string} selector Selector to run.\n     * @return {Node} First effective child node that matches selector.\n     * @override\n     */\n    queryEffectiveChildren(selector) {\n      let e$ = this.queryDistributedElements(selector);\n      return e$ && e$[0];\n    }\n\n    /**\n     * Returns a list of effective childNodes within this element that\n     * match `selector`. These can be dom child nodes or elements distributed\n     * to children that are insertion points.\n     * @param {string} selector Selector to run.\n     * @return {!Array<!Node>} List of effective child nodes that match\n     *     selector.\n     * @override\n     */\n    queryAllEffectiveChildren(selector) {\n      return this.queryDistributedElements(selector);\n    }\n\n    /**\n     * Returns a list of nodes distributed to this element's `<slot>`.\n     *\n     * If this element contains more than one `<slot>` in its local DOM,\n     * an optional selector may be passed to choose the desired content.\n     *\n     * @param {string=} slctr CSS selector to choose the desired\n     *   `<slot>`.  Defaults to `content`.\n     * @return {!Array<!Node>} List of distributed nodes for the `<slot>`.\n     * @override\n     */\n    getContentChildNodes(slctr) {\n      // Note, no need to `wrap` this because root is always\n      let content = this.root.querySelector(slctr || 'slot');\n      return content ?\n          /** @type {PolymerDomApi} */ (dom(content)).getDistributedNodes() :\n          [];\n    }\n\n    /**\n     * Returns a list of element children distributed to this element's\n     * `<slot>`.\n     *\n     * If this element contains more than one `<slot>` in its\n     * local DOM, an optional selector may be passed to choose the desired\n     * content.  This method differs from `getContentChildNodes` in that only\n     * elements are returned.\n     *\n     * @param {string=} slctr CSS selector to choose the desired\n     *   `<content>`.  Defaults to `content`.\n     * @return {!Array<!HTMLElement>} List of distributed nodes for the\n     *   `<slot>`.\n     * @suppress {invalidCasts}\n     * @override\n     */\n    getContentChildren(slctr) {\n      let children = /** @type {!Array<!HTMLElement>} */(this.getContentChildNodes(slctr).filter(function(n) {\n        return (n.nodeType === Node.ELEMENT_NODE);\n      }));\n      return children;\n    }\n\n    /**\n     * Checks whether an element is in this element's light DOM tree.\n     *\n     * @param {?Node} node The element to be checked.\n     * @return {boolean} true if node is in this element's light DOM tree.\n     * @suppress {invalidCasts} LegacyElementMixin must be applied to an\n     * HTMLElement\n     * @override\n     */\n    isLightDescendant(node) {\n      const thisNode = /** @type {Node} */ (this);\n      return thisNode !== node && wrap(thisNode).contains(node) &&\n        wrap(thisNode).getRootNode() === wrap(node).getRootNode();\n    }\n\n    /**\n     * Checks whether an element is in this element's local DOM tree.\n     *\n     * @param {!Element} node The element to be checked.\n     * @return {boolean} true if node is in this element's local DOM tree.\n     * @override\n     */\n    isLocalDescendant(node) {\n      return this.root === wrap(node).getRootNode();\n    }\n\n    /**\n     * No-op for backwards compatibility. This should now be handled by\n     * ShadyCss library.\n     * @param  {!Element} container Container element to scope\n     * @param  {boolean=} shouldObserve if true, start a mutation observer for added nodes to the container\n     * @return {?MutationObserver} Returns a new MutationObserver on `container` if `shouldObserve` is true.\n     * @override\n     */\n    scopeSubtree(container, shouldObserve = false) {\n      return scopeSubtree(container, shouldObserve);\n    }\n\n    /**\n     * Returns the computed style value for the given property.\n     * @param {string} property The css property name.\n     * @return {string} Returns the computed css property value for the given\n     * `property`.\n     * @suppress {invalidCasts} LegacyElementMixin must be applied to an\n     *     HTMLElement\n     * @override\n     */\n    getComputedStyleValue(property) {\n      return styleInterface.getComputedStyleValue(/** @type {!Element} */(this), property);\n    }\n\n    // debounce\n\n    /**\n     * Call `debounce` to collapse multiple requests for a named task into\n     * one invocation which is made after the wait time has elapsed with\n     * no new request.  If no wait time is given, the callback will be called\n     * at microtask timing (guaranteed before paint).\n     *\n     *     debouncedClickAction(e) {\n     *       // will not call `processClick` more than once per 100ms\n     *       this.debounce('click', function() {\n     *        this.processClick();\n     *       } 100);\n     *     }\n     *\n     * @param {string} jobName String to identify the debounce job.\n     * @param {function():void} callback Function that is called (with `this`\n     *   context) when the wait time elapses.\n     * @param {number=} wait Optional wait time in milliseconds (ms) after the\n     *   last signal that must elapse before invoking `callback`\n     * @return {!Object} Returns a debouncer object on which exists the\n     * following methods: `isActive()` returns true if the debouncer is\n     * active; `cancel()` cancels the debouncer if it is active;\n     * `flush()` immediately invokes the debounced callback if the debouncer\n     * is active.\n     * @override\n     */\n    debounce(jobName, callback, wait) {\n      this._debouncers = this._debouncers || {};\n      return this._debouncers[jobName] = Debouncer.debounce(\n            this._debouncers[jobName]\n          , wait > 0 ? timeOut.after(wait) : microTask\n          , callback.bind(this));\n    }\n\n    /**\n     * Returns whether a named debouncer is active.\n     *\n     * @param {string} jobName The name of the debouncer started with `debounce`\n     * @return {boolean} Whether the debouncer is active (has not yet fired).\n     * @override\n     */\n    isDebouncerActive(jobName) {\n      this._debouncers = this._debouncers || {};\n      let debouncer = this._debouncers[jobName];\n      return !!(debouncer && debouncer.isActive());\n    }\n\n    /**\n     * Immediately calls the debouncer `callback` and inactivates it.\n     *\n     * @param {string} jobName The name of the debouncer started with `debounce`\n     * @return {void}\n     * @override\n     */\n    flushDebouncer(jobName) {\n      this._debouncers = this._debouncers || {};\n      let debouncer = this._debouncers[jobName];\n      if (debouncer) {\n        debouncer.flush();\n      }\n    }\n\n    /**\n     * Cancels an active debouncer.  The `callback` will not be called.\n     *\n     * @param {string} jobName The name of the debouncer started with `debounce`\n     * @return {void}\n     * @override\n     */\n    cancelDebouncer(jobName) {\n      this._debouncers = this._debouncers || {};\n      let debouncer = this._debouncers[jobName];\n      if (debouncer) {\n        debouncer.cancel();\n      }\n    }\n\n    /**\n     * Runs a callback function asynchronously.\n     *\n     * By default (if no waitTime is specified), async callbacks are run at\n     * microtask timing, which will occur before paint.\n     *\n     * @param {!Function} callback The callback function to run, bound to\n     *     `this`.\n     * @param {number=} waitTime Time to wait before calling the\n     *   `callback`.  If unspecified or 0, the callback will be run at microtask\n     *   timing (before paint).\n     * @return {number} Handle that may be used to cancel the async job.\n     * @override\n     */\n    async(callback, waitTime) {\n      return waitTime > 0 ? timeOut.run(callback.bind(this), waitTime) :\n          ~microTask.run(callback.bind(this));\n    }\n\n    /**\n     * Cancels an async operation started with `async`.\n     *\n     * @param {number} handle Handle returned from original `async` call to\n     *   cancel.\n     * @return {void}\n     * @override\n     */\n    cancelAsync(handle) {\n      handle < 0 ? microTask.cancel(~handle) :\n          timeOut.cancel(handle);\n    }\n\n    // other\n\n    /**\n     * Convenience method for creating an element and configuring it.\n     *\n     * @param {string} tag HTML element tag to create.\n     * @param {Object=} props Object of properties to configure on the\n     *    instance.\n     * @return {!Element} Newly created and configured element.\n     * @override\n     */\n    create(tag, props) {\n      let elt = document.createElement(tag);\n      if (props) {\n        if (elt.setProperties) {\n          elt.setProperties(props);\n        } else {\n          for (let n in props) {\n            elt[n] = props[n];\n          }\n        }\n      }\n      return elt;\n    }\n\n    /**\n     * Polyfill for Element.prototype.matches, which is sometimes still\n     * prefixed.\n     *\n     * @param {string} selector Selector to test.\n     * @param {!Element=} node Element to test the selector against.\n     * @return {boolean} Whether the element matches the selector.\n     * @override\n     */\n    elementMatches(selector, node) {\n      return matchesSelector( (node || this), selector);\n    }\n\n    /**\n     * Toggles an HTML attribute on or off.\n     *\n     * @param {string} name HTML attribute name\n     * @param {boolean=} bool Boolean to force the attribute on or off.\n     *    When unspecified, the state of the attribute will be reversed.\n     * @return {boolean} true if the attribute now exists\n     * @override\n     */\n    toggleAttribute(name, bool) {\n      let node = /** @type {Element} */(this);\n      if (arguments.length === 3) {\n        node = /** @type {Element} */(arguments[2]);\n      }\n      if (arguments.length == 1) {\n        bool = !node.hasAttribute(name);\n      }\n      if (bool) {\n        wrap(node).setAttribute(name, '');\n        return true;\n      } else {\n        wrap(node).removeAttribute(name);\n        return false;\n      }\n    }\n\n\n    /**\n     * Toggles a CSS class on or off.\n     *\n     * @param {string} name CSS class name\n     * @param {boolean=} bool Boolean to force the class on or off.\n     *    When unspecified, the state of the class will be reversed.\n     * @param {Element=} node Node to target.  Defaults to `this`.\n     * @return {void}\n     * @override\n     */\n    toggleClass(name, bool, node) {\n      node = /** @type {Element} */ (node || this);\n      if (arguments.length == 1) {\n        bool = !node.classList.contains(name);\n      }\n      if (bool) {\n        node.classList.add(name);\n      } else {\n        node.classList.remove(name);\n      }\n    }\n\n    /**\n     * Cross-platform helper for setting an element's CSS `transform` property.\n     *\n     * @param {string} transformText Transform setting.\n     * @param {Element=} node Element to apply the transform to.\n     * Defaults to `this`\n     * @return {void}\n     * @override\n     */\n    transform(transformText, node) {\n      node = /** @type {Element} */ (node || this);\n      node.style.webkitTransform = transformText;\n      node.style.transform = transformText;\n    }\n\n    /**\n     * Cross-platform helper for setting an element's CSS `translate3d`\n     * property.\n     *\n     * @param {number|string} x X offset.\n     * @param {number|string} y Y offset.\n     * @param {number|string} z Z offset.\n     * @param {Element=} node Element to apply the transform to.\n     * Defaults to `this`.\n     * @return {void}\n     * @override\n     */\n    translate3d(x, y, z, node) {\n      node = /** @type {Element} */ (node || this);\n      this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);\n    }\n\n    /**\n     * Removes an item from an array, if it exists.\n     *\n     * If the array is specified by path, a change notification is\n     * generated, so that observers, data bindings and computed\n     * properties watching that path can update.\n     *\n     * If the array is passed directly, **no change\n     * notification is generated**.\n     *\n     * @param {string | !Array<number|string>} arrayOrPath Path to array from\n     *     which to remove the item\n     *   (or the array itself).\n     * @param {*} item Item to remove.\n     * @return {Array} Array containing item removed.\n     * @override\n     */\n    arrayDelete(arrayOrPath, item) {\n      let index;\n      if (Array.isArray(arrayOrPath)) {\n        index = arrayOrPath.indexOf(item);\n        if (index >= 0) {\n          return arrayOrPath.splice(index, 1);\n        }\n      } else {\n        let arr = get(this, arrayOrPath);\n        index = arr.indexOf(item);\n        if (index >= 0) {\n          return this.splice(arrayOrPath, index, 1);\n        }\n      }\n      return null;\n    }\n\n    // logging\n\n    /**\n     * Facades `console.log`/`warn`/`error` as override point.\n     *\n     * @param {string} level One of 'log', 'warn', 'error'\n     * @param {Array} args Array of strings or objects to log\n     * @return {void}\n     * @override\n     */\n    _logger(level, args) {\n      // accept ['foo', 'bar'] and [['foo', 'bar']]\n      if (Array.isArray(args) && args.length === 1 && Array.isArray(args[0])) {\n        args = args[0];\n      }\n      switch(level) {\n        case 'log':\n        case 'warn':\n        case 'error':\n          console[level](...args);\n      }\n    }\n\n    /**\n     * Facades `console.log` as an override point.\n     *\n     * @param {...*} args Array of strings or objects to log\n     * @return {void}\n     * @override\n     */\n    _log(...args) {\n      this._logger('log', args);\n    }\n\n    /**\n     * Facades `console.warn` as an override point.\n     *\n     * @param {...*} args Array of strings or objects to log\n     * @return {void}\n     * @override\n     */\n    _warn(...args) {\n      this._logger('warn', args);\n    }\n\n    /**\n     * Facades `console.error` as an override point.\n     *\n     * @param {...*} args Array of strings or objects to log\n     * @return {void}\n     * @override\n     */\n    _error(...args) {\n      this._logger('error', args);\n    }\n\n    /**\n     * Formats a message using the element type an a method name.\n     *\n     * @param {string} methodName Method name to associate with message\n     * @param {...*} args Array of strings or objects to log\n     * @return {!Array} Array with formatting information for `console`\n     *   logging.\n     * @override\n     */\n    _logf(methodName, ...args) {\n      return ['[%s::%s]', this.is, methodName, ...args];\n    }\n\n  }\n\n  LegacyElement.prototype.is = '';\n\n  return LegacyElement;\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { MutableData } from '../mixins/mutable-data.js';\n\nlet mutablePropertyChange;\n/** @suppress {missingProperties} */\n(() => {\n  mutablePropertyChange = MutableData._mutablePropertyChange;\n})();\n\n/**\n * Legacy element behavior to skip strict dirty-checking for objects and arrays,\n * (always consider them to be \"dirty\") for use on legacy API Polymer elements.\n *\n * By default, `Polymer.PropertyEffects` performs strict dirty checking on\n * objects, which means that any deep modifications to an object or array will\n * not be propagated unless \"immutable\" data patterns are used (i.e. all object\n * references from the root to the mutation were changed).\n *\n * Polymer also provides a proprietary data mutation and path notification API\n * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient\n * mutation and notification of deep changes in an object graph to all elements\n * bound to the same object graph.\n *\n * In cases where neither immutable patterns nor the data mutation API can be\n * used, applying this mixin will cause Polymer to skip dirty checking for\n * objects and arrays (always consider them to be \"dirty\").  This allows a\n * user to make a deep modification to a bound object graph, and then either\n * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`\n * (e.g. `this.notifyPath('items')`) to update the tree.  Note that all\n * elements that wish to be updated based on deep mutations must apply this\n * mixin or otherwise skip strict dirty checking for objects/arrays.\n * Specifically, any elements in the binding tree between the source of a\n * mutation and the consumption of it must apply this behavior or enable the\n * `Polymer.OptionalMutableDataBehavior`.\n *\n * In order to make the dirty check strategy configurable, see\n * `Polymer.OptionalMutableDataBehavior`.\n *\n * Note, the performance characteristics of propagating large object graphs\n * will be worse as opposed to using strict dirty checking with immutable\n * patterns or Polymer's path notification API.\n *\n * @polymerBehavior\n * @summary Behavior to skip strict dirty-checking for objects and\n *   arrays\n */\nexport const MutableDataBehavior = {\n\n  /**\n   * Overrides `Polymer.PropertyEffects` to provide option for skipping\n   * strict equality checking for Objects and Arrays.\n   *\n   * This method pulls the value to dirty check against from the `__dataTemp`\n   * cache (rather than the normal `__data` cache) for Objects.  Since the temp\n   * cache is cleared at the end of a turn, this implementation allows\n   * side-effects of deep object changes to be processed by re-setting the\n   * same object (using the temp cache as an in-turn backstop to prevent\n   * cycles due to 2-way notification).\n   *\n   * @param {string} property Property name\n   * @param {*} value New property value\n   * @param {*} old Previous property value\n   * @return {boolean} Whether the property should be considered a change\n   * @protected\n   * @override\n   */\n  _shouldPropertyChange(property, value, old) {\n    return mutablePropertyChange(this, property, value, old, true);\n  }\n};\n\n/**\n * Legacy element behavior to add the optional ability to skip strict\n * dirty-checking for objects and arrays (always consider them to be\n * \"dirty\") by setting a `mutable-data` attribute on an element instance.\n *\n * By default, `Polymer.PropertyEffects` performs strict dirty checking on\n * objects, which means that any deep modifications to an object or array will\n * not be propagated unless \"immutable\" data patterns are used (i.e. all object\n * references from the root to the mutation were changed).\n *\n * Polymer also provides a proprietary data mutation and path notification API\n * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient\n * mutation and notification of deep changes in an object graph to all elements\n * bound to the same object graph.\n *\n * In cases where neither immutable patterns nor the data mutation API can be\n * used, applying this mixin will allow Polymer to skip dirty checking for\n * objects and arrays (always consider them to be \"dirty\").  This allows a\n * user to make a deep modification to a bound object graph, and then either\n * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`\n * (e.g. `this.notifyPath('items')`) to update the tree.  Note that all\n * elements that wish to be updated based on deep mutations must apply this\n * mixin or otherwise skip strict dirty checking for objects/arrays.\n * Specifically, any elements in the binding tree between the source of a\n * mutation and the consumption of it must enable this behavior or apply the\n * `Polymer.OptionalMutableDataBehavior`.\n *\n * While this behavior adds the ability to forgo Object/Array dirty checking,\n * the `mutableData` flag defaults to false and must be set on the instance.\n *\n * Note, the performance characteristics of propagating large object graphs\n * will be worse by relying on `mutableData: true` as opposed to using\n * strict dirty checking with immutable patterns or Polymer's path notification\n * API.\n *\n * @polymerBehavior\n * @summary Behavior to optionally skip strict dirty-checking for objects and\n *   arrays\n */\nexport const OptionalMutableDataBehavior = {\n\n  properties: {\n    /**\n     * Instance-level flag for configuring the dirty-checking strategy\n     * for this element.  When true, Objects and Arrays will skip dirty\n     * checking, otherwise strict equality checking will be used.\n     */\n    mutableData: Boolean\n  },\n\n  /**\n   * Overrides `Polymer.PropertyEffects` to skip strict equality checking\n   * for Objects and Arrays.\n   *\n   * Pulls the value to dirty check against from the `__dataTemp` cache\n   * (rather than the normal `__data` cache) for Objects.  Since the temp\n   * cache is cleared at the end of a turn, this implementation allows\n   * side-effects of deep object changes to be processed by re-setting the\n   * same object (using the temp cache as an in-turn backstop to prevent\n   * cycles due to 2-way notification).\n   *\n   * @param {string} property Property name\n   * @param {*} value New property value\n   * @param {*} old Previous property value\n   * @return {boolean} Whether the property should be considered a change\n   * @protected\n   * @override\n   */\n  _shouldPropertyChange(property, value, old) {\n    return mutablePropertyChange(this, property, value, old, this.mutableData);\n  }\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport { LegacyElementMixin } from './legacy-element-mixin.js';\nimport { legacyOptimizations } from '../utils/settings.js';\n\nconst lifecycleProps = {\n  attached: true,\n  detached: true,\n  ready: true,\n  created: true,\n  beforeRegister: true,\n  registered: true,\n  attributeChanged: true,\n  listeners: true,\n  hostAttributes: true\n};\n\nconst excludeOnInfo = {\n  attached: true,\n  detached: true,\n  ready: true,\n  created: true,\n  beforeRegister: true,\n  registered: true,\n  attributeChanged: true,\n  behaviors: true,\n  _noAccessors: true\n};\n\nconst excludeOnBehaviors = Object.assign({\n  listeners: true,\n  hostAttributes: true,\n  properties: true,\n  observers: true,\n}, excludeOnInfo);\n\nfunction copyProperties(source, target, excludeProps) {\n  const noAccessors = source._noAccessors;\n  const propertyNames = Object.getOwnPropertyNames(source);\n  for (let i = 0; i < propertyNames.length; i++) {\n    let p = propertyNames[i];\n    if (p in excludeProps) {\n      continue;\n    }\n    if (noAccessors) {\n      target[p] = source[p];\n    } else {\n      let pd = Object.getOwnPropertyDescriptor(source, p);\n      if (pd) {\n        // ensure property is configurable so that a later behavior can\n        // re-configure it.\n        pd.configurable = true;\n        Object.defineProperty(target, p, pd);\n      }\n    }\n  }\n}\n\n/**\n * Applies a \"legacy\" behavior or array of behaviors to the provided class.\n *\n * Note: this method will automatically also apply the `LegacyElementMixin`\n * to ensure that any legacy behaviors can rely on legacy Polymer API on\n * the underlying element.\n *\n * @function\n * @template T\n * @param {!Object|!Array<!Object>} behaviors Behavior object or array of behaviors.\n * @param {function(new:T)} klass Element class.\n * @return {?} Returns a new Element class extended by the\n * passed in `behaviors` and also by `LegacyElementMixin`.\n * @suppress {invalidCasts, checkTypes}\n */\nexport function mixinBehaviors(behaviors, klass) {\n  return GenerateClassFromInfo({}, LegacyElementMixin(klass), behaviors);\n}\n\n// NOTE:\n// 1.x\n// Behaviors were mixed in *in reverse order* and de-duped on the fly.\n// The rule was that behavior properties were copied onto the element\n// prototype if and only if the property did not already exist.\n// Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was:\n// (1), B, (2), A, (3) C. This means prototype properties win over\n// B properties win over A win over C. This mirrors what would happen\n// with inheritance if element extended B extended A extended C.\n//\n// Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting\n// `behaviors` array was [C, A, B].\n// Behavior lifecycle methods were called in behavior array order\n// followed by the element, e.g. (1) C.created, (2) A.created,\n// (3) B.created, (4) element.created. There was no support for\n// super, and \"super-behavior\" methods were callable only by name).\n//\n// 2.x\n// Behaviors are made into proper mixins which live in the\n// element's prototype chain. Behaviors are placed in the element prototype\n// eldest to youngest and de-duped youngest to oldest:\n// So, first [A, B, C, A, B] becomes [C, A, B] then,\n// the element prototype becomes (oldest) (1) PolymerElement, (2) class(C),\n// (3) class(A), (4) class(B), (5) class(Polymer({...})).\n// Result:\n// This means element properties win over B properties win over A win\n// over C. (same as 1.x)\n// If lifecycle is called (super then me), order is\n// (1) C.created, (2) A.created, (3) B.created, (4) element.created\n// (again same as 1.x)\nfunction applyBehaviors(proto, behaviors, lifecycle) {\n  for (let i=0; i<behaviors.length; i++) {\n    applyInfo(proto, behaviors[i], lifecycle, excludeOnBehaviors);\n  }\n}\n\nfunction applyInfo(proto, info, lifecycle, excludeProps) {\n  copyProperties(info, proto, excludeProps);\n  for (let p in lifecycleProps) {\n    if (info[p]) {\n      lifecycle[p] = lifecycle[p] || [];\n      lifecycle[p].push(info[p]);\n    }\n  }\n}\n\n/**\n * @param {Array} behaviors List of behaviors to flatten.\n * @param {Array=} list Target list to flatten behaviors into.\n * @param {Array=} exclude List of behaviors to exclude from the list.\n * @return {!Array} Returns the list of flattened behaviors.\n */\nfunction flattenBehaviors(behaviors, list, exclude) {\n  list = list || [];\n  for (let i=behaviors.length-1; i >= 0; i--) {\n    let b = behaviors[i];\n    if (b) {\n      if (Array.isArray(b)) {\n        flattenBehaviors(b, list);\n      } else {\n        // dedup\n        if (list.indexOf(b) < 0 && (!exclude || exclude.indexOf(b) < 0)) {\n          list.unshift(b);\n        }\n      }\n    } else {\n      console.warn('behavior is null, check for missing or 404 import');\n    }\n  }\n  return list;\n}\n\n/**\n * Copies property descriptors from source to target, overwriting all fields\n * of any previous descriptor for a property *except* for `value`, which is\n * merged in from the target if it does not exist on the source.\n *\n * @param {*} target Target properties object\n * @param {*} source Source properties object\n */\nfunction mergeProperties(target, source) {\n  for (const p in source) {\n    const targetInfo = target[p];\n    const sourceInfo = source[p];\n    if (!('value' in sourceInfo) && targetInfo && ('value' in targetInfo)) {\n      target[p] = Object.assign({value: targetInfo.value}, sourceInfo);\n    } else {\n      target[p] = sourceInfo;\n    }\n  }\n}\n\nconst LegacyElement = LegacyElementMixin(HTMLElement);\n\n/* Note about construction and extension of legacy classes.\n  [Changed in Q4 2018 to optimize performance.]\n\n  When calling `Polymer` or `mixinBehaviors`, the generated class below is\n  made. The list of behaviors was previously made into one generated class per\n  behavior, but this is no longer the case as behaviors are now called\n  manually. Note, there may *still* be multiple generated classes in the\n  element's prototype chain if extension is used with `mixinBehaviors`.\n\n  The generated class is directly tied to the info object and behaviors\n  used to create it. That list of behaviors is filtered so it's only the\n  behaviors not active on the superclass. In order to call through to the\n  entire list of lifecycle methods, it's important to call `super`.\n\n  The element's `properties` and `observers` are controlled via the finalization\n  mechanism provided by `PropertiesMixin`. `Properties` and `observers` are\n  collected by manually traversing the prototype chain and merging.\n\n  To limit changes, the `_registered` method is called via `_initializeProperties`\n  and not `_finalizeClass`.\n\n*/\n/**\n * @param {!PolymerInit} info Polymer info object\n * @param {function(new:HTMLElement)} Base base class to extend with info object\n * @param {Object=} behaviors behaviors to copy into the element\n * @return {function(new:HTMLElement)} Generated class\n * @suppress {checkTypes}\n * @private\n */\nfunction GenerateClassFromInfo(info, Base, behaviors) {\n\n  // manages behavior and lifecycle processing (filled in after class definition)\n  let behaviorList;\n  const lifecycle = {};\n\n  /** @private */\n  class PolymerGenerated extends Base {\n\n    // explicitly not calling super._finalizeClass\n    /** @nocollapse */\n    static _finalizeClass() {\n      // if calling via a subclass that hasn't been generated, pass through to super\n      if (!this.hasOwnProperty(JSCompiler_renameProperty('generatedFrom', this))) {\n        // TODO(https://github.com/google/closure-compiler/issues/3240):\n        //     Change back to just super.methodCall()\n        Base._finalizeClass.call(this);\n      } else {\n        // interleave properties and observers per behavior and `info`\n        if (behaviorList) {\n          for (let i=0, b; i < behaviorList.length; i++) {\n            b = behaviorList[i];\n            if (b.properties) {\n              this.createProperties(b.properties);\n            }\n            if (b.observers) {\n              this.createObservers(b.observers, b.properties);\n            }\n          }\n        }\n        if (info.properties) {\n          this.createProperties(info.properties);\n        }\n        if (info.observers) {\n          this.createObservers(info.observers, info.properties);\n        }\n        // make sure to prepare the element template\n        this._prepareTemplate();\n      }\n    }\n\n    /** @nocollapse */\n    static get properties() {\n      const properties = {};\n      if (behaviorList) {\n        for (let i=0; i < behaviorList.length; i++) {\n          mergeProperties(properties, behaviorList[i].properties);\n        }\n      }\n      mergeProperties(properties, info.properties);\n      return properties;\n    }\n\n    /** @nocollapse */\n    static get observers() {\n      let observers = [];\n      if (behaviorList) {\n        for (let i=0, b; i < behaviorList.length; i++) {\n          b = behaviorList[i];\n          if (b.observers) {\n            observers = observers.concat(b.observers);\n          }\n        }\n      }\n      if (info.observers) {\n        observers = observers.concat(info.observers);\n      }\n      return observers;\n    }\n\n    /**\n     * @return {void}\n     */\n    created() {\n      super.created();\n      const list = lifecycle.created;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          list[i].call(this);\n        }\n      }\n    }\n\n    /**\n     * @return {void}\n     */\n    _registered() {\n      /* NOTE: `beforeRegister` is called here for bc, but the behavior\n        is different than in 1.x. In 1.0, the method was called *after*\n        mixing prototypes together but *before* processing of meta-objects.\n        However, dynamic effects can still be set here and can be done either\n        in `beforeRegister` or `registered`. It is no longer possible to set\n        `is` in `beforeRegister` as you could in 1.x.\n      */\n      // only proceed if the generated class' prototype has not been registered.\n      const generatedProto = PolymerGenerated.prototype;\n      if (!generatedProto.hasOwnProperty(JSCompiler_renameProperty('__hasRegisterFinished', generatedProto))) {\n        generatedProto.__hasRegisterFinished = true;\n        // ensure superclass is registered first.\n        super._registered();\n        // copy properties onto the generated class lazily if we're optimizing,\n        if (legacyOptimizations) {\n          copyPropertiesToProto(generatedProto);\n        }\n        // make sure legacy lifecycle is called on the *element*'s prototype\n        // and not the generated class prototype; if the element has been\n        // extended, these are *not* the same.\n        const proto = Object.getPrototypeOf(this);\n        let list = lifecycle.beforeRegister;\n        if (list) {\n          for (let i=0; i < list.length; i++) {\n            list[i].call(proto);\n          }\n        }\n        list = lifecycle.registered;\n        if (list) {\n          for (let i=0; i < list.length; i++) {\n            list[i].call(proto);\n          }\n        }\n      }\n    }\n\n    /**\n     * @return {void}\n     */\n    _applyListeners() {\n      super._applyListeners();\n      const list = lifecycle.listeners;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          const listeners = list[i];\n          if (listeners) {\n            for (let l in listeners) {\n              this._addMethodEventListenerToNode(this, l, listeners[l]);\n            }\n          }\n        }\n      }\n    }\n\n    // note: exception to \"super then me\" rule;\n    // do work before calling super so that super attributes\n    // only apply if not already set.\n    /**\n     * @return {void}\n     */\n    _ensureAttributes() {\n      const list = lifecycle.hostAttributes;\n      if (list) {\n        for (let i=list.length-1; i >= 0; i--) {\n          const hostAttributes = list[i];\n          for (let a in hostAttributes) {\n              this._ensureAttribute(a, hostAttributes[a]);\n            }\n        }\n      }\n      super._ensureAttributes();\n    }\n\n    /**\n     * @return {void}\n     */\n    ready() {\n      super.ready();\n      let list = lifecycle.ready;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          list[i].call(this);\n        }\n      }\n    }\n\n    /**\n     * @return {void}\n     */\n    attached() {\n      super.attached();\n      let list = lifecycle.attached;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          list[i].call(this);\n        }\n      }\n    }\n\n    /**\n     * @return {void}\n     */\n    detached() {\n      super.detached();\n      let list = lifecycle.detached;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          list[i].call(this);\n        }\n      }\n    }\n\n    /**\n     * Implements native Custom Elements `attributeChangedCallback` to\n     * set an attribute value to a property via `_attributeToProperty`.\n     *\n     * @param {string} name Name of attribute that changed\n     * @param {?string} old Old attribute value\n     * @param {?string} value New attribute value\n     * @return {void}\n     */\n    attributeChanged(name, old, value) {\n      super.attributeChanged();\n      let list = lifecycle.attributeChanged;\n      if (list) {\n        for (let i=0; i < list.length; i++) {\n          list[i].call(this, name, old, value);\n        }\n      }\n    }\n  }\n\n  // apply behaviors, note actual copying is done lazily at first instance creation\n  if (behaviors) {\n    // NOTE: ensure the behavior is extending a class with\n    // legacy element api. This is necessary since behaviors expect to be able\n    // to access 1.x legacy api.\n    if (!Array.isArray(behaviors)) {\n      behaviors = [behaviors];\n    }\n    let superBehaviors = Base.prototype.behaviors;\n    // get flattened, deduped list of behaviors *not* already on super class\n    behaviorList = flattenBehaviors(behaviors, null, superBehaviors);\n    PolymerGenerated.prototype.behaviors = superBehaviors ?\n      superBehaviors.concat(behaviors) : behaviorList;\n  }\n\n  const copyPropertiesToProto = (proto) => {\n    if (behaviorList) {\n      applyBehaviors(proto, behaviorList, lifecycle);\n    }\n    applyInfo(proto, info, lifecycle, excludeOnInfo);\n  };\n\n  // copy properties if we're not optimizing\n  if (!legacyOptimizations) {\n    copyPropertiesToProto(PolymerGenerated.prototype);\n  }\n\n  PolymerGenerated.generatedFrom = info;\n\n  return PolymerGenerated;\n}\n\n/**\n * Generates a class that extends `LegacyElement` based on the\n * provided info object.  Metadata objects on the `info` object\n * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used\n * for Polymer's meta-programming systems, and any functions are copied\n * to the generated class.\n *\n * Valid \"metadata\" values are as follows:\n *\n * `is`: String providing the tag name to register the element under. In\n * addition, if a `dom-module` with the same id exists, the first template\n * in that `dom-module` will be stamped into the shadow root of this element,\n * with support for declarative event listeners (`on-...`), Polymer data\n * bindings (`[[...]]` and `{{...}}`), and id-based node finding into\n * `this.$`.\n *\n * `properties`: Object describing property-related metadata used by Polymer\n * features (key: property names, value: object containing property metadata).\n * Valid keys in per-property metadata include:\n * - `type` (String|Number|Object|Array|...): Used by\n *   `attributeChangedCallback` to determine how string-based attributes\n *   are deserialized to JavaScript property values.\n * - `notify` (boolean): Causes a change in the property to fire a\n *   non-bubbling event called `<property>-changed`. Elements that have\n *   enabled two-way binding to the property use this event to observe changes.\n * - `readOnly` (boolean): Creates a getter for the property, but no setter.\n *   To set a read-only property, use the private setter method\n *   `_setProperty(property, value)`.\n * - `observer` (string): Observer method name that will be called when\n *   the property changes. The arguments of the method are\n *   `(value, previousValue)`.\n * - `computed` (string): String describing method and dependent properties\n *   for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).\n *   Computed properties are read-only by default and can only be changed\n *   via the return value of the computing method.\n *\n * `observers`: Array of strings describing multi-property observer methods\n *  and their dependent properties (e.g. `'observeABC(a, b, c)'`).\n *\n * `listeners`: Object describing event listeners to be added to each\n *  instance of this element (key: event name, value: method name).\n *\n * `behaviors`: Array of additional `info` objects containing metadata\n * and callbacks in the same format as the `info` object here which are\n * merged into this element.\n *\n * `hostAttributes`: Object listing attributes to be applied to the host\n *  once created (key: attribute name, value: attribute value).  Values\n *  are serialized based on the type of the value.  Host attributes should\n *  generally be limited to attributes such as `tabIndex` and `aria-...`.\n *  Attributes in `hostAttributes` are only applied if a user-supplied\n *  attribute is not already present (attributes in markup override\n *  `hostAttributes`).\n *\n * In addition, the following Polymer-specific callbacks may be provided:\n * - `registered`: called after first instance of this element,\n * - `created`: called during `constructor`\n * - `attached`: called during `connectedCallback`\n * - `detached`: called during `disconnectedCallback`\n * - `ready`: called before first `attached`, after all properties of\n *   this element have been propagated to its template and all observers\n *   have run\n *\n * @param {!PolymerInit} info Object containing Polymer metadata and functions\n *   to become class methods.\n * @template T\n * @param {function(T):T} mixin Optional mixin to apply to legacy base class\n *   before extending with Polymer metaprogramming.\n * @return {function(new:HTMLElement)} Generated class\n */\nexport const Class = function(info, mixin) {\n  if (!info) {\n    console.warn('Polymer.Class requires `info` argument');\n  }\n  let klass = mixin ? mixin(LegacyElement) :\n      LegacyElement;\n  klass = GenerateClassFromInfo(info, klass, info.behaviors);\n  // decorate klass with registration info\n  klass.is = klass.prototype.is = info.is;\n  return klass;\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { Class } from './class.js';\n\nimport '../utils/boot.js';\n\n/**\n * Legacy class factory and registration helper for defining Polymer\n * elements.\n *\n * This method is equivalent to\n *\n *     import {Class} from '@polymer/polymer/lib/legacy/class.js';\n *     customElements.define(info.is, Class(info));\n *\n * See `Class` for details on valid legacy metadata format for `info`.\n *\n * @global\n * @override\n * @function\n * @param {!PolymerInit} info Object containing Polymer metadata and functions\n *   to become class methods.\n * @return {function(new: HTMLElement)} Generated class\n * @suppress {duplicate, invalidCasts, checkTypes}\n */\nconst Polymer = function(info) {\n  // if input is a `class` (aka a function with a prototype), use the prototype\n  // remember that the `constructor` will never be called\n  let klass;\n  if (typeof info === 'function') {\n    klass = info;\n  } else {\n    klass = Polymer.Class(info);\n  }\n  // Copy opt out for `legacyNoObservedAttributes` from info object to class.\n  if (info._legacyForceObservedAttributes) {\n    klass.prototype._legacyForceObservedAttributes = info._legacyForceObservedAttributes;\n  }\n  customElements.define(klass.is, /** @type {!HTMLElement} */(klass));\n  return klass;\n};\n\nPolymer.Class = Class;\n\nexport { Polymer };","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\nimport { wrap } from '../utils/wrap.js';\nimport '../utils/settings.js';\nimport { FlattenedNodesObserver } from '../utils/flattened-nodes-observer.js';\nexport { flush, enqueueDebouncer as addDebouncer } from '../utils/flush.js';\n/* eslint-disable no-unused-vars */\nimport { Debouncer } from '../utils/debounce.js';  // used in type annotations\n/* eslint-enable no-unused-vars */\n\nconst p = Element.prototype;\n/**\n * @const {function(this:Node, string): boolean}\n */\nconst normalizedMatchesSelector = p.matches || p.matchesSelector ||\n  p.mozMatchesSelector || p.msMatchesSelector ||\n  p.oMatchesSelector || p.webkitMatchesSelector;\n\n/**\n * Cross-platform `element.matches` shim.\n *\n * @function matchesSelector\n * @param {!Node} node Node to check selector against\n * @param {string} selector Selector to match\n * @return {boolean} True if node matched selector\n */\nexport const matchesSelector = function(node, selector) {\n  return normalizedMatchesSelector.call(node, selector);\n};\n\n/**\n * Node API wrapper class returned from `Polymer.dom.(target)` when\n * `target` is a `Node`.\n * @implements {PolymerDomApi}\n * @unrestricted\n */\nclass DomApiNative {\n\n  /**\n   * @param {!Node} node Node for which to create a Polymer.dom helper object.\n   */\n  constructor(node) {\n    if (window['ShadyDOM'] && window['ShadyDOM']['inUse']) {\n      window['ShadyDOM']['patch'](node);\n    }\n    this.node = node;\n  }\n\n  /**\n   * Returns an instance of `FlattenedNodesObserver` that\n   * listens for node changes on this element.\n   *\n   * @param {function(this:HTMLElement, { target: !HTMLElement, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Called when direct or distributed children\n   *   of this element changes\n   * @return {!PolymerDomApi.ObserveHandle} Observer instance\n   * @override\n   */\n  observeNodes(callback) {\n    return new FlattenedNodesObserver(\n        /** @type {!HTMLElement} */(this.node), callback);\n  }\n\n  /**\n   * Disconnects an observer previously created via `observeNodes`\n   *\n   * @param {!PolymerDomApi.ObserveHandle} observerHandle Observer instance\n   *   to disconnect.\n   * @return {void}\n   * @override\n   */\n  unobserveNodes(observerHandle) {\n    observerHandle.disconnect();\n  }\n\n  /**\n   * Provided as a backwards-compatible API only.  This method does nothing.\n   * @return {void}\n   */\n  notifyObserver() {}\n\n  /**\n   * Returns true if the provided node is contained with this element's\n   * light-DOM children or shadow root, including any nested shadow roots\n   * of children therein.\n   *\n   * @param {Node} node Node to test\n   * @return {boolean} Returns true if the given `node` is contained within\n   *   this element's light or shadow DOM.\n   * @override\n   */\n  deepContains(node) {\n    if (wrap(this.node).contains(node)) {\n      return true;\n    }\n    let n = node;\n    let doc = node.ownerDocument;\n    // walk from node to `this` or `document`\n    while (n && n !== doc && n !== this.node) {\n      // use logical parentnode, or native ShadowRoot host\n      n = wrap(n).parentNode || wrap(n).host;\n    }\n    return n === this.node;\n  }\n\n  /**\n   * Returns the root node of this node.  Equivalent to `getRootNode()`.\n   *\n   * @return {!Node} Top most element in the dom tree in which the node\n   * exists. If the node is connected to a document this is either a\n   * shadowRoot or the document; otherwise, it may be the node\n   * itself or a node or document fragment containing it.\n   * @override\n   */\n  getOwnerRoot() {\n    return wrap(this.node).getRootNode();\n  }\n\n  /**\n   * For slot elements, returns the nodes assigned to the slot; otherwise\n   * an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.\n   *\n   * @return {!Array<!Node>} Array of assigned nodes\n   * @override\n   */\n  getDistributedNodes() {\n    return (this.node.localName === 'slot') ?\n      wrap(this.node).assignedNodes({flatten: true}) :\n      [];\n  }\n\n  /**\n   * Returns an array of all slots this element was distributed to.\n   *\n   * @return {!Array<!HTMLSlotElement>} Description\n   * @override\n   */\n  getDestinationInsertionPoints() {\n    let ip$ = [];\n    let n = wrap(this.node).assignedSlot;\n    while (n) {\n      ip$.push(n);\n      n = wrap(n).assignedSlot;\n    }\n    return ip$;\n  }\n\n  /**\n   * Calls `importNode` on the `ownerDocument` for this node.\n   *\n   * @param {!Node} node Node to import\n   * @param {boolean} deep True if the node should be cloned deeply during\n   *   import\n   * @return {Node} Clone of given node imported to this owner document\n   */\n  importNode(node, deep) {\n    let doc = this.node instanceof Document ? this.node :\n      this.node.ownerDocument;\n    return wrap(doc).importNode(node, deep);\n  }\n\n  /**\n   * @return {!Array<!Node>} Returns a flattened list of all child nodes and\n   * nodes assigned to child slots.\n   * @override\n   */\n  getEffectiveChildNodes() {\n    return FlattenedNodesObserver.getFlattenedNodes(\n        /** @type {!HTMLElement} */ (this.node));\n  }\n\n  /**\n   * Returns a filtered list of flattened child elements for this element based\n   * on the given selector.\n   *\n   * @param {string} selector Selector to filter nodes against\n   * @return {!Array<!HTMLElement>} List of flattened child elements\n   * @override\n   */\n  queryDistributedElements(selector) {\n    let c$ = this.getEffectiveChildNodes();\n    let list = [];\n    for (let i=0, l=c$.length, c; (i<l) && (c=c$[i]); i++) {\n      if ((c.nodeType === Node.ELEMENT_NODE) &&\n          matchesSelector(c, selector)) {\n        list.push(c);\n      }\n    }\n    return list;\n  }\n\n  /**\n   * For shadow roots, returns the currently focused element within this\n   * shadow root.\n   *\n   * return {Node|undefined} Currently focused element\n   * @override\n   */\n  get activeElement() {\n    let node = this.node;\n    return node._activeElement !== undefined ? node._activeElement : node.activeElement;\n  }\n}\n\nfunction forwardMethods(proto, methods) {\n  for (let i=0; i < methods.length; i++) {\n    let method = methods[i];\n    /* eslint-disable valid-jsdoc */\n    proto[method] = /** @this {DomApiNative} */ function() {\n      return this.node[method].apply(this.node, arguments);\n    };\n    /* eslint-enable */\n  }\n}\n\nfunction forwardReadOnlyProperties(proto, properties) {\n  for (let i=0; i < properties.length; i++) {\n    let name = properties[i];\n    Object.defineProperty(proto, name, {\n      get: function() {\n        const domApi = /** @type {DomApiNative} */(this);\n        return domApi.node[name];\n      },\n      configurable: true\n    });\n  }\n}\n\nfunction forwardProperties(proto, properties) {\n  for (let i=0; i < properties.length; i++) {\n    let name = properties[i];\n    Object.defineProperty(proto, name, {\n      /**\n       * @this {DomApiNative}\n       * @return {*} .\n       */\n      get: function() {\n        return this.node[name];\n      },\n      /**\n       * @this {DomApiNative}\n       * @param {*} value .\n       */\n      set: function(value) {\n        this.node[name] = value;\n      },\n      configurable: true\n    });\n  }\n}\n\n\n/**\n * Event API wrapper class returned from `dom.(target)` when\n * `target` is an `Event`.\n */\nexport class EventApi {\n  constructor(event) {\n    this.event = event;\n  }\n\n  /**\n   * Returns the first node on the `composedPath` of this event.\n   *\n   * @return {!EventTarget} The node this event was dispatched to\n   */\n  get rootTarget() {\n    return this.path[0];\n  }\n\n  /**\n   * Returns the local (re-targeted) target for this event.\n   *\n   * @return {!EventTarget} The local (re-targeted) target for this event.\n   */\n  get localTarget() {\n    return this.event.target;\n  }\n\n  /**\n   * Returns the `composedPath` for this event.\n   * @return {!Array<!EventTarget>} The nodes this event propagated through\n   */\n  get path() {\n    return this.event.composedPath();\n  }\n}\n\n/**\n * @function\n * @param {boolean=} deep\n * @return {!Node}\n */\nDomApiNative.prototype.cloneNode;\n/**\n * @function\n * @param {!Node} node\n * @return {!Node}\n */\nDomApiNative.prototype.appendChild;\n/**\n * @function\n * @param {!Node} newChild\n * @param {Node} refChild\n * @return {!Node}\n */\nDomApiNative.prototype.insertBefore;\n/**\n * @function\n * @param {!Node} node\n * @return {!Node}\n */\nDomApiNative.prototype.removeChild;\n/**\n * @function\n * @param {!Node} oldChild\n * @param {!Node} newChild\n * @return {!Node}\n */\nDomApiNative.prototype.replaceChild;\n/**\n * @function\n * @param {string} name\n * @param {string} value\n * @return {void}\n */\nDomApiNative.prototype.setAttribute;\n/**\n * @function\n * @param {string} name\n * @return {void}\n */\nDomApiNative.prototype.removeAttribute;\n/**\n * @function\n * @param {string} selector\n * @return {?Element}\n */\nDomApiNative.prototype.querySelector;\n/**\n * @function\n * @param {string} selector\n * @return {!NodeList<!Element>}\n */\nDomApiNative.prototype.querySelectorAll;\n\n/** @type {?Node} */\nDomApiNative.prototype.parentNode;\n/** @type {?Node} */\nDomApiNative.prototype.firstChild;\n/** @type {?Node} */\nDomApiNative.prototype.lastChild;\n/** @type {?Node} */\nDomApiNative.prototype.nextSibling;\n/** @type {?Node} */\nDomApiNative.prototype.previousSibling;\n/** @type {?HTMLElement} */\nDomApiNative.prototype.firstElementChild;\n/** @type {?HTMLElement} */\nDomApiNative.prototype.lastElementChild;\n/** @type {?HTMLElement} */\nDomApiNative.prototype.nextElementSibling;\n/** @type {?HTMLElement} */\nDomApiNative.prototype.previousElementSibling;\n/** @type {!Array<!Node>} */\nDomApiNative.prototype.childNodes;\n/** @type {!Array<!HTMLElement>} */\nDomApiNative.prototype.children;\n/** @type {?DOMTokenList} */\nDomApiNative.prototype.classList;\n\n/** @type {string} */\nDomApiNative.prototype.textContent;\n/** @type {string} */\nDomApiNative.prototype.innerHTML;\n\nlet DomApiImpl = DomApiNative;\n\nif (window['ShadyDOM'] && window['ShadyDOM']['inUse'] && window['ShadyDOM']['noPatch'] && window['ShadyDOM']['Wrapper']) {\n\n  /**\n   * @private\n   * @extends {HTMLElement}\n   */\n  class Wrapper extends window['ShadyDOM']['Wrapper'] {}\n\n  // copy bespoke API onto wrapper\n  Object.getOwnPropertyNames(DomApiNative.prototype).forEach((prop) => {\n    if (prop != 'activeElement') {\n      Wrapper.prototype[prop] = DomApiNative.prototype[prop];\n    }\n  });\n\n  // Note, `classList` is here only for legacy compatibility since it does not\n  // trigger distribution in v1 Shadow DOM.\n  forwardReadOnlyProperties(Wrapper.prototype, [\n    'classList'\n  ]);\n\n  DomApiImpl = Wrapper;\n\n  Object.defineProperties(EventApi.prototype, {\n\n    // Returns the \"lowest\" node in the same root as the event's currentTarget.\n    // When in `noPatch` mode, this must be calculated by walking the event's\n    // path.\n    localTarget: {\n      get() {\n        const current = this.event.currentTarget;\n        const currentRoot = current && dom(current).getOwnerRoot();\n        const p$ = this.path;\n        for (let i = 0; i < p$.length; i++) {\n          const e = p$[i];\n          if (dom(e).getOwnerRoot() === currentRoot) {\n            return e;\n          }\n        }\n      },\n      configurable: true\n    },\n\n    path: {\n      get() {\n        return window['ShadyDOM']['composedPath'](this.event);\n      },\n      configurable: true\n    }\n  });\n\n} else {\n\n  // Methods that can provoke distribution or must return the logical, not\n  // composed tree.\n  forwardMethods(DomApiNative.prototype, [\n    'cloneNode', 'appendChild', 'insertBefore', 'removeChild',\n    'replaceChild', 'setAttribute', 'removeAttribute',\n    'querySelector', 'querySelectorAll', 'attachShadow'\n  ]);\n\n  // Properties that should return the logical, not composed tree. Note, `classList`\n  // is here only for legacy compatibility since it does not trigger distribution\n  // in v1 Shadow DOM.\n  forwardReadOnlyProperties(DomApiNative.prototype, [\n    'parentNode', 'firstChild', 'lastChild',\n    'nextSibling', 'previousSibling', 'firstElementChild',\n    'lastElementChild', 'nextElementSibling', 'previousElementSibling',\n    'childNodes', 'children', 'classList', 'shadowRoot'\n  ]);\n\n  forwardProperties(DomApiNative.prototype, [\n    'textContent', 'innerHTML', 'className'\n  ]);\n}\n\nexport const DomApi = DomApiImpl;\n\n/**\n * Legacy DOM and Event manipulation API wrapper factory used to abstract\n * differences between native Shadow DOM and \"Shady DOM\" when polyfilling on\n * older browsers.\n *\n * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and\n * in the majority of cases simply facades directly to the standard native\n * API.\n *\n * @summary Legacy DOM and Event manipulation API wrapper factory used to\n * abstract differences between native Shadow DOM and \"Shady DOM.\"\n * @param {(Node|Event|DomApiNative|EventApi)=} obj Node or event to operate on\n * @return {!DomApiNative|!EventApi} Wrapper providing either node API or event API\n */\nexport const dom = function(obj) {\n  obj = obj || document;\n  if (obj instanceof DomApiImpl) {\n    return /** @type {!DomApi} */(obj);\n  }\n  if (obj instanceof EventApi) {\n    return /** @type {!EventApi} */(obj);\n  }\n  let helper = obj['__domApi'];\n  if (!helper) {\n    if (obj instanceof Event) {\n      helper = new EventApi(obj);\n    } else {\n      helper = new DomApiImpl(/** @type {Node} */(obj));\n    }\n    obj['__domApi'] = helper;\n  }\n  return helper;\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { TemplateInstanceBase, templatize, modelForElement } from '../utils/templatize.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @typedef {{\n *   _templatizerTemplate: HTMLTemplateElement,\n *   _parentModel: boolean,\n *   _instanceProps: Object,\n *   _forwardHostPropV2: Function,\n *   _notifyInstancePropV2: Function,\n *   ctor: function(new:TemplateInstanceBase, Object=)\n * }}\n */\nlet TemplatizerUser; // eslint-disable-line\n\n/**\n * The `Templatizer` behavior adds methods to generate instances of\n * templates that are each managed by an anonymous `PropertyEffects`\n * instance where data-bindings in the stamped template content are bound to\n * accessors on itself.\n *\n * This behavior is provided in Polymer 2.x-3.x as a hybrid-element convenience\n * only.  For non-hybrid usage, the `Templatize` library\n * should be used instead.\n *\n * Example:\n *\n *     import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\n *     // Get a template from somewhere, e.g. light DOM\n *     let template = this.querySelector('template');\n *     // Prepare the template\n *     this.templatize(template);\n *     // Instance the template with an initial data model\n *     let instance = this.stamp({myProp: 'initial'});\n *     // Insert the instance's DOM somewhere, e.g. light DOM\n *     dom(this).appendChild(instance.root);\n *     // Changing a property on the instance will propagate to bindings\n *     // in the template\n *     instance.myProp = 'new value';\n *\n * Users of `Templatizer` may need to implement the following abstract\n * API's to determine how properties and paths from the host should be\n * forwarded into to instances:\n *\n *     _forwardHostPropV2: function(prop, value)\n *\n * Likewise, users may implement these additional abstract API's to determine\n * how instance-specific properties that change on the instance should be\n * forwarded out to the host, if necessary.\n *\n *     _notifyInstancePropV2: function(inst, prop, value)\n *\n * In order to determine which properties are instance-specific and require\n * custom notification via `_notifyInstanceProp`, define an `_instanceProps`\n * object containing keys for each instance prop, for example:\n *\n *     _instanceProps: {\n *       item: true,\n *       index: true\n *     }\n *\n * Any properties used in the template that are not defined in _instanceProp\n * will be forwarded out to the Templatize `owner` automatically.\n *\n * Users may also implement the following abstract function to show or\n * hide any DOM generated using `stamp`:\n *\n *     _showHideChildren: function(shouldHide)\n *\n * Note that some callbacks are suffixed with `V2` in the Polymer 2.x behavior\n * as the implementations will need to differ from the callbacks required\n * by the 1.x Templatizer API due to changes in the `TemplateInstance` API\n * between versions 1.x and 2.x.\n *\n * @polymerBehavior\n */\nexport const Templatizer = {\n\n  /**\n   * Generates an anonymous `TemplateInstance` class (stored as `this.ctor`)\n   * for the provided template.  This method should be called once per\n   * template to prepare an element for stamping the template, followed\n   * by `stamp` to create new instances of the template.\n   *\n   * @param {!HTMLTemplateElement} template Template to prepare\n   * @param {boolean=} mutableData When `true`, the generated class will skip\n   *   strict dirty-checking for objects and arrays (always consider them to\n   *   be \"dirty\"). Defaults to false.\n   * @return {void}\n   * @this {TemplatizerUser}\n   */\n  templatize(template, mutableData) {\n    this._templatizerTemplate = template;\n    this.ctor =\n        templatize(template, /** @type {!Polymer_PropertyEffects} */ (this), {\n          mutableData: Boolean(mutableData),\n          parentModel: this._parentModel,\n          instanceProps: this._instanceProps,\n          forwardHostProp: this._forwardHostPropV2,\n          notifyInstanceProp: this._notifyInstancePropV2\n        });\n  },\n\n  /**\n   * Creates an instance of the template prepared by `templatize`.  The object\n   * returned is an instance of the anonymous class generated by `templatize`\n   * whose `root` property is a document fragment containing newly cloned\n   * template content, and which has property accessors corresponding to\n   * properties referenced in template bindings.\n   *\n   * @param {Object=} model Object containing initial property values to\n   *   populate into the template bindings.\n   * @return {TemplateInstanceBase} Returns the created instance of\n   * the template prepared by `templatize`.\n   * @this {TemplatizerUser}\n   */\n  stamp(model) {\n    return new this.ctor(model);\n  },\n\n  /**\n   * Returns the template \"model\" (`TemplateInstance`) associated with\n   * a given element, which serves as the binding scope for the template\n   * instance the element is contained in.  A template model should be used\n   * to manipulate data associated with this template instance.\n   *\n   * @param {HTMLElement} el Element for which to return a template model.\n   * @return {TemplateInstanceBase} Model representing the binding scope for\n   *   the element.\n   * @this {TemplatizerUser}\n   */\n  modelForElement(el) {\n    return modelForElement(this._templatizerTemplate, el);\n  }\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { register, incrementInstanceCount } from '../utils/telemetry.js';\nimport { PropertiesChanged } from './properties-changed.js';\n\n/**\n * Creates a copy of `props` with each property normalized such that\n * upgraded it is an object with at least a type property { type: Type}.\n *\n * @param {!Object} props Properties to normalize\n * @return {!Object} Copy of input `props` with normalized properties that\n * are in the form {type: Type}\n * @private\n */\nfunction normalizeProperties(props) {\n  const output = {};\n  for (let p in props) {\n    const o = props[p];\n    output[p] = (typeof o === 'function') ? {type: o} : o;\n  }\n  return output;\n}\n\n/**\n * Mixin that provides a minimal starting point to using the PropertiesChanged\n * mixin by providing a mechanism to declare properties in a static\n * getter (e.g. static get properties() { return { foo: String } }). Changes\n * are reported via the `_propertiesChanged` method.\n *\n * This mixin provides no specific support for rendering. Users are expected\n * to create a ShadowRoot and put content into it and update it in whatever\n * way makes sense. This can be done in reaction to properties changing by\n * implementing `_propertiesChanged`.\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin PropertiesChanged\n * @summary Mixin that provides a minimal starting point for using\n * the PropertiesChanged mixin by providing a declarative `properties` object.\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const PropertiesMixin = dedupingMixin(superClass => {\n\n /**\n  * @constructor\n  * @implements {Polymer_PropertiesChanged}\n  * @private\n  */\n const base = PropertiesChanged(superClass);\n\n /**\n  * Returns the super class constructor for the given class, if it is an\n  * instance of the PropertiesMixin.\n  *\n  * @param {!PropertiesMixinConstructor} constructor PropertiesMixin constructor\n  * @return {?PropertiesMixinConstructor} Super class constructor\n  */\n function superPropertiesClass(constructor) {\n   const superCtor = Object.getPrototypeOf(constructor);\n\n   // Note, the `PropertiesMixin` class below only refers to the class\n   // generated by this call to the mixin; the instanceof test only works\n   // because the mixin is deduped and guaranteed only to apply once, hence\n   // all constructors in a proto chain will see the same `PropertiesMixin`\n   return (superCtor.prototype instanceof PropertiesMixin) ?\n     /** @type {!PropertiesMixinConstructor} */ (superCtor) : null;\n }\n\n /**\n  * Returns a memoized version of the `properties` object for the\n  * given class. Properties not in object format are converted to at\n  * least {type}.\n  *\n  * @param {PropertiesMixinConstructor} constructor PropertiesMixin constructor\n  * @return {Object} Memoized properties object\n  */\n function ownProperties(constructor) {\n   if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) {\n     let props = null;\n\n     if (constructor.hasOwnProperty(JSCompiler_renameProperty('properties', constructor))) {\n       const properties = constructor.properties;\n\n       if (properties) {\n        props = normalizeProperties(properties);\n       }\n     }\n\n     constructor.__ownProperties = props;\n   }\n   return constructor.__ownProperties;\n }\n\n /**\n  * @polymer\n  * @mixinClass\n  * @extends {base}\n  * @implements {Polymer_PropertiesMixin}\n  * @unrestricted\n  */\n class PropertiesMixin extends base {\n\n   /**\n    * Implements standard custom elements getter to observes the attributes\n    * listed in `properties`.\n    * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n    * @nocollapse\n    */\n   static get observedAttributes() {\n     if (!this.hasOwnProperty(JSCompiler_renameProperty('__observedAttributes', this))) {\n       register(this.prototype);\n       const props = this._properties;\n       this.__observedAttributes = props ? Object.keys(props).map(p => this.prototype._addPropertyToAttributeMap(p)) : [];\n     }\n     return this.__observedAttributes;\n   }\n\n   /**\n    * Finalizes an element definition, including ensuring any super classes\n    * are also finalized. This includes ensuring property\n    * accessors exist on the element prototype. This method calls\n    * `_finalizeClass` to finalize each constructor in the prototype chain.\n    * @return {void}\n    * @nocollapse\n    */\n   static finalize() {\n     if (!this.hasOwnProperty(JSCompiler_renameProperty('__finalized', this))) {\n       const superCtor = superPropertiesClass(/** @type {!PropertiesMixinConstructor} */(this));\n       if (superCtor) {\n         superCtor.finalize();\n       }\n       this.__finalized = true;\n       this._finalizeClass();\n     }\n   }\n\n   /**\n    * Finalize an element class. This includes ensuring property\n    * accessors exist on the element prototype. This method is called by\n    * `finalize` and finalizes the class constructor.\n    *\n    * @protected\n    * @nocollapse\n    */\n   static _finalizeClass() {\n     const props = ownProperties(/** @type {!PropertiesMixinConstructor} */(this));\n     if (props) {\n       /** @type {?} */ (this).createProperties(props);\n     }\n   }\n\n   /**\n    * Returns a memoized version of all properties, including those inherited\n    * from super classes. Properties not in object format are converted to\n    * at least {type}.\n    *\n    * @return {Object} Object containing properties for this class\n    * @protected\n    * @nocollapse\n    */\n   static get _properties() {\n     if (!this.hasOwnProperty(\n       JSCompiler_renameProperty('__properties', this))) {\n       const superCtor = superPropertiesClass(/** @type {!PropertiesMixinConstructor} */(this));\n       this.__properties = Object.assign({},\n         superCtor && superCtor._properties,\n         ownProperties(/** @type {PropertiesMixinConstructor} */(this)));\n     }\n     return this.__properties;\n   }\n\n   /**\n    * Overrides `PropertiesChanged` method to return type specified in the\n    * static `properties` object for the given property.\n    * @param {string} name Name of property\n    * @return {*} Type to which to deserialize attribute\n    *\n    * @protected\n    * @nocollapse\n    */\n   static typeForProperty(name) {\n     const info = this._properties[name];\n     return info && info.type;\n   }\n\n   /**\n    * Overrides `PropertiesChanged` method and adds a call to\n    * `finalize` which lazily configures the element's property accessors.\n    * @override\n    * @return {void}\n    */\n   _initializeProperties() {\n     incrementInstanceCount();\n     this.constructor.finalize();\n     super._initializeProperties();\n   }\n\n   /**\n    * Called when the element is added to a document.\n    * Calls `_enableProperties` to turn on property system from\n    * `PropertiesChanged`.\n    * @suppress {missingProperties} Super may or may not implement the callback\n    * @return {void}\n    * @override\n    */\n   connectedCallback() {\n     if (super.connectedCallback) {\n       super.connectedCallback();\n     }\n     this._enableProperties();\n   }\n\n   /**\n    * Called when the element is removed from a document\n    * @suppress {missingProperties} Super may or may not implement the callback\n    * @return {void}\n    * @override\n    */\n   disconnectedCallback() {\n     if (super.disconnectedCallback) {\n       super.disconnectedCallback();\n     }\n   }\n\n }\n\n return PropertiesMixin;\n\n});\n","/**\n * @fileoverview\n * @suppress {checkPrototypalTypes}\n * @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport '../utils/boot.js';\n\nimport { rootPath, strictTemplatePolicy, allowTemplateFromDomModule, legacyOptimizations, legacyWarnings, syncInitialRender, supportsAdoptingStyleSheets, useAdoptedStyleSheetsWithBuiltCSS } from '../utils/settings.js';\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { stylesFromTemplate, stylesFromModuleImports } from '../utils/style-gather.js';\nimport { pathFromUrl, resolveCss, resolveUrl } from '../utils/resolve-url.js';\nimport { DomModule } from '../elements/dom-module.js';\nimport { PropertyEffects } from './property-effects.js';\nimport { PropertiesMixin } from './properties-mixin.js';\nimport { wrap } from '../utils/wrap.js';\n\n/**\n * Current Polymer version in Semver notation.\n * @type {string} Semver notation of the current version of Polymer.\n */\nexport const version = '3.5.2';\n\nexport const builtCSS = window.ShadyCSS && window.ShadyCSS['cssBuild'];\n\n/**\n * Element class mixin that provides the core API for Polymer's meta-programming\n * features including template stamping, data-binding, attribute deserialization,\n * and property change observation.\n *\n * Subclassers may provide the following static getters to return metadata\n * used to configure Polymer's features for the class:\n *\n * - `static get is()`: When the template is provided via a `dom-module`,\n *   users should return the `dom-module` id from a static `is` getter.  If\n *   no template is needed or the template is provided directly via the\n *   `template` getter, there is no need to define `is` for the element.\n *\n * - `static get template()`: Users may provide the template directly (as\n *   opposed to via `dom-module`) by implementing a static `template` getter.\n *   The getter must return an `HTMLTemplateElement`.\n *\n * - `static get properties()`: Should return an object describing\n *   property-related metadata used by Polymer features (key: property name\n *   value: object containing property metadata). Valid keys in per-property\n *   metadata include:\n *   - `type` (String|Number|Object|Array|...): Used by\n *     `attributeChangedCallback` to determine how string-based attributes\n *     are deserialized to JavaScript property values.\n *   - `notify` (boolean): Causes a change in the property to fire a\n *     non-bubbling event called `<property>-changed`. Elements that have\n *     enabled two-way binding to the property use this event to observe changes.\n *   - `readOnly` (boolean): Creates a getter for the property, but no setter.\n *     To set a read-only property, use the private setter method\n *     `_setProperty(property, value)`.\n *   - `observer` (string): Observer method name that will be called when\n *     the property changes. The arguments of the method are\n *     `(value, previousValue)`.\n *   - `computed` (string): String describing method and dependent properties\n *     for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).\n *     Computed properties are read-only by default and can only be changed\n *     via the return value of the computing method.\n *\n * - `static get observers()`: Array of strings describing multi-property\n *   observer methods and their dependent properties (e.g.\n *   `'observeABC(a, b, c)'`).\n *\n * The base class provides default implementations for the following standard\n * custom element lifecycle callbacks; users may override these, but should\n * call the super method to ensure\n * - `constructor`: Run when the element is created or upgraded\n * - `connectedCallback`: Run each time the element is connected to the\n *   document\n * - `disconnectedCallback`: Run each time the element is disconnected from\n *   the document\n * - `attributeChangedCallback`: Run each time an attribute in\n *   `observedAttributes` is set or removed (note: this element's default\n *   `observedAttributes` implementation will automatically return an array\n *   of dash-cased attributes based on `properties`)\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin PropertyEffects\n * @appliesMixin PropertiesMixin\n * @property rootPath {string} Set to the value of `rootPath`,\n *   which defaults to the main document path\n * @property importPath {string} Set to the value of the class's static\n *   `importPath` property, which defaults to the path of this element's\n *   `dom-module` (when `is` is used), but can be overridden for other\n *   import strategies.\n * @summary Element class mixin that provides the core API for Polymer's\n * meta-programming features.\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const ElementMixin = dedupingMixin(base => {\n  /**\n   * @constructor\n   * @implements {Polymer_PropertyEffects}\n   * @implements {Polymer_PropertiesMixin}\n   * @extends {HTMLElement}\n   * @private\n   */\n  const polymerElementBase = PropertiesMixin(PropertyEffects(base));\n\n  /**\n   * Returns a list of properties with default values.\n   * This list is created as an optimization since it is a subset of\n   * the list returned from `_properties`.\n   * This list is used in `_initializeProperties` to set property defaults.\n   *\n   * @param {PolymerElementConstructor} constructor Element class\n   * @return {PolymerElementProperties} Flattened properties for this class\n   *   that have default values\n   * @private\n   */\n  function propertyDefaults(constructor) {\n    if (!constructor.hasOwnProperty(\n      JSCompiler_renameProperty('__propertyDefaults', constructor))) {\n      constructor.__propertyDefaults = null;\n      let props = constructor._properties;\n      for (let p in props) {\n        let info = props[p];\n        if ('value' in info) {\n          constructor.__propertyDefaults = constructor.__propertyDefaults || {};\n          constructor.__propertyDefaults[p] = info;\n        }\n      }\n    }\n    return constructor.__propertyDefaults;\n  }\n\n  /**\n   * Returns a memoized version of the `observers` array.\n   * @param {PolymerElementConstructor} constructor Element class\n   * @return {Array} Array containing own observers for the given class\n   * @protected\n   */\n  function ownObservers(constructor) {\n    if (!constructor.hasOwnProperty(\n      JSCompiler_renameProperty('__ownObservers', constructor))) {\n      constructor.__ownObservers =\n          constructor.hasOwnProperty(\n              JSCompiler_renameProperty('observers', constructor)) ?\n          /** @type {PolymerElementConstructor} */ (constructor).observers :\n          null;\n    }\n    return constructor.__ownObservers;\n  }\n\n  /**\n   * Creates effects for a property.\n   *\n   * Note, once a property has been set to\n   * `readOnly`, `computed`, `reflectToAttribute`, or `notify`\n   * these values may not be changed. For example, a subclass cannot\n   * alter these settings. However, additional `observers` may be added\n   * by subclasses.\n   *\n   * The info object should contain property metadata as follows:\n   *\n   * * `type`: {function} type to which an attribute matching the property\n   * is deserialized. Note the property is camel-cased from a dash-cased\n   * attribute. For example, 'foo-bar' attribute is deserialized to a\n   * property named 'fooBar'.\n   *\n   * * `readOnly`: {boolean} creates a readOnly property and\n   * makes a private setter for the private of the form '_setFoo' for a\n   * property 'foo',\n   *\n   * * `computed`: {string} creates a computed property. A computed property\n   * is also automatically set to `readOnly: true`. The value is calculated\n   * by running a method and arguments parsed from the given string. For\n   * example 'compute(foo)' will compute a given property when the\n   * 'foo' property changes by executing the 'compute' method. This method\n   * must return the computed value.\n   *\n   * * `reflectToAttribute`: {boolean} If true, the property value is reflected\n   * to an attribute of the same name. Note, the attribute is dash-cased\n   * so a property named 'fooBar' is reflected as 'foo-bar'.\n   *\n   * * `notify`: {boolean} sends a non-bubbling notification event when\n   * the property changes. For example, a property named 'foo' sends an\n   * event named 'foo-changed' with `event.detail` set to the value of\n   * the property.\n   *\n   * * observer: {string} name of a method that runs when the property\n   * changes. The arguments of the method are (value, previousValue).\n   *\n   * Note: Users may want control over modifying property\n   * effects via subclassing. For example, a user might want to make a\n   * reflectToAttribute property not do so in a subclass. We've chosen to\n   * disable this because it leads to additional complication.\n   * For example, a readOnly effect generates a special setter. If a subclass\n   * disables the effect, the setter would fail unexpectedly.\n   * Based on feedback, we may want to try to make effects more malleable\n   * and/or provide an advanced api for manipulating them.\n   *\n   * @param {!PolymerElement} proto Element class prototype to add accessors\n   *   and effects to\n   * @param {string} name Name of the property.\n   * @param {Object} info Info object from which to create property effects.\n   * Supported keys:\n   * @param {Object} allProps Flattened map of all properties defined in this\n   *   element (including inherited properties)\n   * @return {void}\n   * @private\n   */\n  function createPropertyFromConfig(proto, name, info, allProps) {\n    // computed forces readOnly...\n    if (info.computed) {\n      info.readOnly = true;\n    }\n    // Note, since all computed properties are readOnly, this prevents\n    // adding additional computed property effects (which leads to a confusing\n    // setup where multiple triggers for setting a property)\n    // While we do have `hasComputedEffect` this is set on the property's\n    // dependencies rather than itself.\n    if (info.computed) {\n      if (proto._hasReadOnlyEffect(name)) {\n        console.warn(`Cannot redefine computed property '${name}'.`);\n      } else {\n        proto._createComputedProperty(name, info.computed, allProps);\n      }\n    }\n    if (info.readOnly && !proto._hasReadOnlyEffect(name)) {\n      proto._createReadOnlyProperty(name, !info.computed);\n    } else if (info.readOnly === false && proto._hasReadOnlyEffect(name)) {\n      console.warn(`Cannot make readOnly property '${name}' non-readOnly.`);\n    }\n    if (info.reflectToAttribute && !proto._hasReflectEffect(name)) {\n      proto._createReflectedProperty(name);\n    } else if (info.reflectToAttribute === false && proto._hasReflectEffect(name)) {\n      console.warn(`Cannot make reflected property '${name}' non-reflected.`);\n    }\n    if (info.notify && !proto._hasNotifyEffect(name)) {\n      proto._createNotifyingProperty(name);\n    } else if (info.notify === false && proto._hasNotifyEffect(name)) {\n      console.warn(`Cannot make notify property '${name}' non-notify.`);\n    }\n    // always add observer\n    if (info.observer) {\n      proto._createPropertyObserver(name, info.observer, allProps[info.observer]);\n    }\n    // always create the mapping from attribute back to property for deserialization.\n    proto._addPropertyToAttributeMap(name);\n  }\n\n  /**\n   * Process all style elements in the element template. Styles with the\n   * `include` attribute are processed such that any styles in\n   * the associated \"style modules\" are included in the element template.\n   * @param {PolymerElementConstructor} klass Element class\n   * @param {!HTMLTemplateElement} template Template to process\n   * @param {string} is Name of element\n   * @param {string} baseURI Base URI for element\n   * @private\n   */\n  function processElementStyles(klass, template, is, baseURI) {\n    if (!builtCSS) {\n      const templateStyles = template.content.querySelectorAll('style');\n      const stylesWithImports = stylesFromTemplate(template);\n      // insert styles from <link rel=\"import\" type=\"css\"> at the top of the template\n      const linkedStyles = stylesFromModuleImports(is);\n      const firstTemplateChild = template.content.firstElementChild;\n      for (let idx = 0; idx < linkedStyles.length; idx++) {\n        let s = linkedStyles[idx];\n        s.textContent = klass._processStyleText(s.textContent, baseURI);\n        template.content.insertBefore(s, firstTemplateChild);\n      }\n      // keep track of the last \"concrete\" style in the template we have encountered\n      let templateStyleIndex = 0;\n      // ensure all gathered styles are actually in this template.\n      for (let i = 0; i < stylesWithImports.length; i++) {\n        let s = stylesWithImports[i];\n        let templateStyle = templateStyles[templateStyleIndex];\n        // if the style is not in this template, it's been \"included\" and\n        // we put a clone of it in the template before the style that included it\n        if (templateStyle !== s) {\n          s = s.cloneNode(true);\n          templateStyle.parentNode.insertBefore(s, templateStyle);\n        } else {\n          templateStyleIndex++;\n        }\n        s.textContent = klass._processStyleText(s.textContent, baseURI);\n      }\n    }\n    if (window.ShadyCSS) {\n      window.ShadyCSS.prepareTemplate(template, is);\n    }\n    // Support for `adoptedStylesheets` relies on using native Shadow DOM\n    // and built CSS. Built CSS is required because runtime transformation of\n    // `@apply` is not supported. This is because ShadyCSS relies on being able\n    // to update a `style` element in the element template and this is\n    // removed when using `adoptedStyleSheets`.\n    // Note, it would be more efficient to allow style includes to become\n    // separate stylesheets; however, because of `@apply` these are\n    // potentially not shareable and sharing the ones that could be shared\n    // would require some coordination. To keep it simple, all the includes\n    // and styles are collapsed into a single shareable stylesheet.\n    if (useAdoptedStyleSheetsWithBuiltCSS && builtCSS &&\n        supportsAdoptingStyleSheets) {\n      // Remove styles in template and make a shareable stylesheet\n      const styles = template.content.querySelectorAll('style');\n      if (styles) {\n        let css = '';\n        Array.from(styles).forEach(s => {\n          css += s.textContent;\n          s.parentNode.removeChild(s);\n        });\n        klass._styleSheet = new CSSStyleSheet();\n        klass._styleSheet.replaceSync(css);\n      }\n    }\n  }\n\n  /**\n   * Look up template from dom-module for element\n   *\n   * @param {string} is Element name to look up\n   * @return {?HTMLTemplateElement|undefined} Template found in dom module, or\n   *   undefined if not found\n   * @protected\n   */\n  function getTemplateFromDomModule(is) {\n    let template = null;\n    // Under strictTemplatePolicy in 3.x+, dom-module lookup is only allowed\n    // when opted-in via allowTemplateFromDomModule\n    if (is && (!strictTemplatePolicy || allowTemplateFromDomModule)) {\n      template = /** @type {?HTMLTemplateElement} */ (\n          DomModule.import(is, 'template'));\n      // Under strictTemplatePolicy, require any element with an `is`\n      // specified to have a dom-module\n      if (strictTemplatePolicy && !template) {\n        throw new Error(`strictTemplatePolicy: expecting dom-module or null template for ${is}`);\n      }\n    }\n    return template;\n  }\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @unrestricted\n   * @implements {Polymer_ElementMixin}\n   * @extends {polymerElementBase}\n   */\n  class PolymerElement extends polymerElementBase {\n\n    /**\n     * Current Polymer version in Semver notation.\n     * @type {string} Semver notation of the current version of Polymer.\n     * @nocollapse\n     */\n    static get polymerElementVersion() {\n      return version;\n    }\n\n    /**\n     * Override of PropertiesMixin _finalizeClass to create observers and\n     * find the template.\n     * @return {void}\n     * @protected\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _finalizeClass() {\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      polymerElementBase._finalizeClass.call(this);\n      const observers = ownObservers(this);\n      if (observers) {\n        this.createObservers(observers, this._properties);\n      }\n      this._prepareTemplate();\n    }\n\n    /** @nocollapse */\n    static _prepareTemplate() {\n      // note: create \"working\" template that is finalized at instance time\n      let template = /** @type {PolymerElementConstructor} */ (this).template;\n      if (template) {\n        if (typeof template === 'string') {\n          console.error('template getter must return HTMLTemplateElement');\n          template = null;\n        } else if (!legacyOptimizations) {\n          template = template.cloneNode(true);\n        }\n      }\n\n      /** @override */\n      this.prototype._template = template;\n    }\n\n    /**\n     * Override of PropertiesChanged createProperties to create accessors\n     * and property effects for all of the properties.\n     * @param {!Object} props .\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createProperties(props) {\n      for (let p in props) {\n        createPropertyFromConfig(\n            /** @type {?} */ (this.prototype), p, props[p], props);\n      }\n    }\n\n    /**\n     * Creates observers for the given `observers` array.\n     * Leverages `PropertyEffects` to create observers.\n     * @param {Object} observers Array of observer descriptors for\n     *   this class\n     * @param {Object} dynamicFns Object containing keys for any properties\n     *   that are functions and should trigger the effect when the function\n     *   reference is changed\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createObservers(observers, dynamicFns) {\n      const proto = this.prototype;\n      for (let i=0; i < observers.length; i++) {\n        proto._createMethodObserver(observers[i], dynamicFns);\n      }\n    }\n\n    /**\n     * Returns the template that will be stamped into this element's shadow root.\n     *\n     * If a `static get is()` getter is defined, the default implementation will\n     * return the first `<template>` in a `dom-module` whose `id` matches this\n     * element's `is` (note that a `_template` property on the class prototype\n     * takes precedence over the `dom-module` template, to maintain legacy\n     * element semantics; a subclass will subsequently fall back to its super\n     * class template if neither a `prototype._template` or a `dom-module` for\n     * the class's `is` was found).\n     *\n     * Users may override this getter to return an arbitrary template\n     * (in which case the `is` getter is unnecessary). The template returned\n     * must be an `HTMLTemplateElement`.\n     *\n     * Note that when subclassing, if the super class overrode the default\n     * implementation and the subclass would like to provide an alternate\n     * template via a `dom-module`, it should override this getter and\n     * return `DomModule.import(this.is, 'template')`.\n     *\n     * If a subclass would like to modify the super class template, it should\n     * clone it rather than modify it in place.  If the getter does expensive\n     * work such as cloning/modifying a template, it should memoize the\n     * template for maximum performance:\n     *\n     *   let memoizedTemplate;\n     *   class MySubClass extends MySuperClass {\n     *     static get template() {\n     *       if (!memoizedTemplate) {\n     *         memoizedTemplate = super.template.cloneNode(true);\n     *         let subContent = document.createElement('div');\n     *         subContent.textContent = 'This came from MySubClass';\n     *         memoizedTemplate.content.appendChild(subContent);\n     *       }\n     *       return memoizedTemplate;\n     *     }\n     *   }\n     *\n     * @return {!HTMLTemplateElement|string} Template to be stamped\n     * @nocollapse\n     */\n    static get template() {\n      // Explanation of template-related properties:\n      // - constructor.template (this getter): the template for the class.\n      //     This can come from the prototype (for legacy elements), from a\n      //     dom-module, or from the super class's template (or can be overridden\n      //     altogether by the user)\n      // - constructor._template: memoized version of constructor.template\n      // - prototype._template: working template for the element, which will be\n      //     parsed and modified in place. It is a cloned version of\n      //     constructor.template, saved in _finalizeClass(). Note that before\n      //     this getter is called, for legacy elements this could be from a\n      //     _template field on the info object passed to Polymer(), a behavior,\n      //     or set in registered(); once the static getter runs, a clone of it\n      //     will overwrite it on the prototype as the working template.\n      if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {\n        let protoTemplate = this.prototype.hasOwnProperty(\n          JSCompiler_renameProperty('_template', this.prototype)) ?\n          this.prototype._template : undefined;\n        // Accept a function for the legacy Polymer({_template:...}) field for\n        // lazy parsing\n        if (typeof protoTemplate === 'function') {\n          protoTemplate = protoTemplate();\n        }\n        this._template =\n          // If user has put template on prototype (e.g. in legacy via registered\n          // callback or info object), prefer that first. Note that `null` is\n          // used as a sentinel to indicate \"no template\" and can be used to\n          // override a super template, whereas `undefined` is used as a\n          // sentinel to mean \"fall-back to default template lookup\" via\n          // dom-module and/or super.template.\n          protoTemplate !== undefined ? protoTemplate :\n          // Look in dom-module associated with this element's is\n          ((this.hasOwnProperty(JSCompiler_renameProperty('is', this)) &&\n          (getTemplateFromDomModule(/** @type {PolymerElementConstructor}*/ (this).is))) ||\n          // Next look for superclass template (call the super impl this\n          // way so that `this` points to the superclass)\n          Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template);\n      }\n      return this._template;\n    }\n\n    /**\n     * Set the template.\n     *\n     * @param {!HTMLTemplateElement|string} value Template to set.\n     * @nocollapse\n     */\n    static set template(value) {\n      this._template = value;\n    }\n\n    /**\n     * Path matching the url from which the element was imported.\n     *\n     * This path is used to resolve url's in template style cssText.\n     * The `importPath` property is also set on element instances and can be\n     * used to create bindings relative to the import path.\n     *\n     * For elements defined in ES modules, users should implement\n     * `static get importMeta() { return import.meta; }`, and the default\n     * implementation of `importPath` will  return `import.meta.url`'s path.\n     * For elements defined in HTML imports, this getter will return the path\n     * to the document containing a `dom-module` element matching this\n     * element's static `is` property.\n     *\n     * Note, this path should contain a trailing `/`.\n     *\n     * @return {string} The import path for this element class\n     * @suppress {missingProperties}\n     * @nocollapse\n     */\n    static get importPath() {\n      if (!this.hasOwnProperty(JSCompiler_renameProperty('_importPath', this))) {\n        const meta = this.importMeta;\n        if (meta) {\n          this._importPath = pathFromUrl(meta.url);\n        } else {\n          const module = DomModule.import(/** @type {PolymerElementConstructor} */ (this).is);\n          this._importPath = (module && module.assetpath) ||\n            Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.importPath;\n        }\n      }\n      return this._importPath;\n    }\n\n    constructor() {\n      super();\n      /** @type {HTMLTemplateElement} */\n      this._template;\n      /** @type {string} */\n      this._importPath;\n      /** @type {string} */\n      this.rootPath;\n      /** @type {string} */\n      this.importPath;\n      /** @type {StampedTemplate | HTMLElement | ShadowRoot} */\n      this.root;\n      /** @type {!Object<string, !Element>} */\n      this.$;\n    }\n\n    /**\n     * Overrides the default `PropertyAccessors` to ensure class\n     * metaprogramming related to property accessors and effects has\n     * completed (calls `finalize`).\n     *\n     * It also initializes any property defaults provided via `value` in\n     * `properties` metadata.\n     *\n     * @return {void}\n     * @override\n     * @suppress {invalidCasts,missingProperties} go/missingfnprops\n     */\n    _initializeProperties() {\n      this.constructor.finalize();\n      // note: finalize template when we have access to `localName` to\n      // avoid dependence on `is` for polyfilling styling.\n      this.constructor._finalizeTemplate(/** @type {!HTMLElement} */(this).localName);\n      super._initializeProperties();\n      // set path defaults\n      this.rootPath = rootPath;\n      this.importPath = this.constructor.importPath;\n      // apply property defaults...\n      let p$ = propertyDefaults(this.constructor);\n      if (!p$) {\n        return;\n      }\n      for (let p in p$) {\n        let info = p$[p];\n        if (this._canApplyPropertyDefault(p)) {\n          let value = typeof info.value == 'function' ?\n            info.value.call(this) :\n            info.value;\n          // Set via `_setProperty` if there is an accessor, to enable\n          // initializing readOnly property defaults\n          if (this._hasAccessor(p)) {\n            this._setPendingProperty(p, value, true);\n          } else {\n            this[p] = value;\n          }\n        }\n      }\n    }\n\n    /**\n     * Determines if a property dfeault can be applied. For example, this\n     * prevents a default from being applied when a property that has no\n     * accessor is overridden by its host before upgrade (e.g. via a binding).\n     * @override\n     * @param {string} property Name of the property\n     * @return {boolean} Returns true if the property default can be applied.\n     */\n    _canApplyPropertyDefault(property) {\n      return !this.hasOwnProperty(property);\n    }\n\n    /**\n     * Gather style text for a style element in the template.\n     *\n     * @param {string} cssText Text containing styling to process\n     * @param {string} baseURI Base URI to rebase CSS paths against\n     * @return {string} The processed CSS text\n     * @protected\n     * @nocollapse\n     */\n    static _processStyleText(cssText, baseURI) {\n      return resolveCss(cssText, baseURI);\n    }\n\n    /**\n    * Configures an element `proto` to function with a given `template`.\n    * The element name `is` and extends `ext` must be specified for ShadyCSS\n    * style scoping.\n    *\n    * @param {string} is Tag name (or type extension name) for this element\n    * @return {void}\n    * @protected\n    * @nocollapse\n    */\n    static _finalizeTemplate(is) {\n      /** @const {HTMLTemplateElement} */\n      const template = this.prototype._template;\n      if (template && !template.__polymerFinalized) {\n        template.__polymerFinalized = true;\n        const importPath = this.importPath;\n        const baseURI = importPath ? resolveUrl(importPath) : '';\n        // e.g. support `include=\"module-name\"`, and ShadyCSS\n        processElementStyles(this, template, is, baseURI);\n        this.prototype._bindTemplate(template);\n      }\n    }\n\n    /**\n     * Provides a default implementation of the standard Custom Elements\n     * `connectedCallback`.\n     *\n     * The default implementation enables the property effects system and\n     * flushes any pending properties, and updates shimmed CSS properties\n     * when using the ShadyCSS scoping/custom properties polyfill.\n     *\n     * @override\n     * @suppress {missingProperties, invalidCasts} Super may or may not\n     *     implement the callback\n     * @return {void}\n     */\n    connectedCallback() {\n      if (window.ShadyCSS && this._template) {\n        window.ShadyCSS.styleElement(/** @type {!HTMLElement} */(this));\n      }\n      super.connectedCallback();\n    }\n\n    /**\n     * Stamps the element template.\n     *\n     * @return {void}\n     * @override\n     */\n    ready() {\n      if (this._template) {\n        this.root = this._stampTemplate(this._template);\n        this.$ = this.root.$;\n      }\n      super.ready();\n    }\n\n    /**\n     * Implements `PropertyEffects`'s `_readyClients` call. Attaches\n     * element dom by calling `_attachDom` with the dom stamped from the\n     * element's template via `_stampTemplate`. Note that this allows\n     * client dom to be attached to the element prior to any observers\n     * running.\n     *\n     * @return {void}\n     * @override\n     */\n    _readyClients() {\n      if (this._template) {\n        this.root = this._attachDom(/** @type {StampedTemplate} */(this.root));\n      }\n      // The super._readyClients here sets the clients initialized flag.\n      // We must wait to do this until after client dom is created/attached\n      // so that this flag can be checked to prevent notifications fired\n      // during this process from being handled before clients are ready.\n      super._readyClients();\n    }\n\n\n    /**\n     * Attaches an element's stamped dom to itself. By default,\n     * this method creates a `shadowRoot` and adds the dom to it.\n     * However, this method may be overridden to allow an element\n     * to put its dom in another location.\n     *\n     * @override\n     * @throws {Error}\n     * @suppress {missingReturn}\n     * @param {StampedTemplate} dom to attach to the element.\n     * @return {ShadowRoot} node to which the dom has been attached.\n     */\n    _attachDom(dom) {\n      const n = wrap(this);\n      if (n.attachShadow) {\n        if (dom) {\n          if (!n.shadowRoot) {\n            n.attachShadow({mode: 'open', shadyUpgradeFragment: dom});\n            n.shadowRoot.appendChild(dom);\n            // When `adoptedStyleSheets` is supported a stylesheet is made\n            // available on the element constructor.\n            if (this.constructor._styleSheet) {\n              n.shadowRoot.adoptedStyleSheets = [this.constructor._styleSheet];\n            }\n          }\n          if (syncInitialRender && window.ShadyDOM) {\n            window.ShadyDOM.flushInitial(n.shadowRoot);\n          }\n          return n.shadowRoot;\n        }\n        return null;\n      } else {\n        throw new Error('ShadowDOM not available. ' +\n          // TODO(sorvell): move to compile-time conditional when supported\n        'PolymerElement can create dom as children instead of in ' +\n        'ShadowDOM by setting `this.root = this;\\` before \\`ready\\`.');\n      }\n    }\n\n    /**\n     * When using the ShadyCSS scoping and custom property shim, causes all\n     * shimmed styles in this element (and its subtree) to be updated\n     * based on current custom property values.\n     *\n     * The optional parameter overrides inline custom property styles with an\n     * object of properties where the keys are CSS properties, and the values\n     * are strings.\n     *\n     * Example: `this.updateStyles({'--color': 'blue'})`\n     *\n     * These properties are retained unless a value of `null` is set.\n     *\n     * Note: This function does not support updating CSS mixins.\n     * You can not dynamically change the value of an `@apply`.\n     *\n     * @override\n     * @param {Object=} properties Bag of custom property key/values to\n     *   apply to this element.\n     * @return {void}\n     * @suppress {invalidCasts}\n     */\n    updateStyles(properties) {\n      if (window.ShadyCSS) {\n        window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(this), properties);\n      }\n    }\n\n    /**\n     * Rewrites a given URL relative to a base URL. The base URL defaults to\n     * the original location of the document containing the `dom-module` for\n     * this element. This method will return the same URL before and after\n     * bundling.\n     *\n     * Note that this function performs no resolution for URLs that start\n     * with `/` (absolute URLs) or `#` (hash identifiers).  For general purpose\n     * URL resolution, use `window.URL`.\n     *\n     * @override\n     * @param {string} url URL to resolve.\n     * @param {string=} base Optional base URL to resolve against, defaults\n     * to the element's `importPath`\n     * @return {string} Rewritten URL relative to base\n     */\n    resolveUrl(url, base) {\n      if (!base && this.importPath) {\n        base = resolveUrl(this.importPath);\n      }\n      return resolveUrl(url, base);\n    }\n\n    /**\n     * Overrides `PropertyEffects` to add map of dynamic functions on\n     * template info, for consumption by `PropertyEffects` template binding\n     * code. This map determines which method templates should have accessors\n     * created for them.\n     *\n     * @param {!HTMLTemplateElement} template Template\n     * @param {!TemplateInfo} templateInfo Template metadata for current template\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @return {boolean} .\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _parseTemplateContent(template, templateInfo, nodeInfo) {\n      templateInfo.dynamicFns = templateInfo.dynamicFns || this._properties;\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      return polymerElementBase._parseTemplateContent.call(\n        this, template, templateInfo, nodeInfo);\n    }\n\n    /**\n     * Overrides `PropertyEffects` to warn on use of undeclared properties in\n     * template.\n     *\n     * @param {Object} templateInfo Template metadata to add effect to\n     * @param {string} prop Property that should trigger the effect\n     * @param {Object=} effect Effect metadata object\n     * @return {void}\n     * @protected\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _addTemplatePropertyEffect(templateInfo, prop, effect) {\n      // Warn if properties are used in template without being declared.\n      // Properties must be listed in `properties` to be included in\n      // `observedAttributes` since CE V1 reads that at registration time, and\n      // since we want to keep template parsing lazy, we can't automatically\n      // add undeclared properties used in templates to `observedAttributes`.\n      // The warning is only enabled in `legacyOptimizations` mode, since\n      // we don't want to spam existing users who might have adopted the\n      // shorthand when attribute deserialization is not important.\n      if (legacyWarnings && !(prop in this._properties) &&\n          // Methods used in templates with no dependencies (or only literal\n          // dependencies) become accessors with template effects; ignore these\n          !(effect.info.part.signature && effect.info.part.signature.static) &&\n          // Warnings for bindings added to nested templates are handled by\n          // templatizer so ignore both the host-to-template bindings\n          // (`hostProp`) and TemplateInstance-to-child bindings\n          // (`nestedTemplate`)\n          !effect.info.part.hostProp && !templateInfo.nestedTemplate) {\n        console.warn(`Property '${prop}' used in template but not declared in 'properties'; ` +\n          `attribute will not be observed.`);\n      }\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      return polymerElementBase._addTemplatePropertyEffect.call(\n        this, templateInfo, prop, effect);\n    }\n\n  }\n\n  return PolymerElement;\n});\n\n/**\n * When using the ShadyCSS scoping and custom property shim, causes all\n * shimmed `styles` (via `custom-style`) in the document (and its subtree)\n * to be updated based on current custom property values.\n *\n * The optional parameter overrides inline custom property styles with an\n * object of properties where the keys are CSS properties, and the values\n * are strings.\n *\n * Example: `updateStyles({'--color': 'blue'})`\n *\n * These properties are retained unless a value of `null` is set.\n *\n * @param {Object=} props Bag of custom property key/values to\n *   apply to the document.\n * @return {void}\n */\nexport const updateStyles = function(props) {\n  if (window.ShadyCSS) {\n    window.ShadyCSS.styleDocument(props);\n  }\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { addListener, removeListener } from '../utils/gestures.js';\n\n/**\n * Element class mixin that provides API for adding Polymer's cross-platform\n * gesture events to nodes.\n *\n * The API is designed to be compatible with override points implemented\n * in `TemplateStamp` such that declarative event listeners in\n * templates will support gesture events when this mixin is applied along with\n * `TemplateStamp`.\n *\n * @mixinFunction\n * @polymer\n * @summary Element class mixin that provides API for adding Polymer's\n *   cross-platform gesture events to nodes\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const GestureEventListeners = dedupingMixin((superClass) => {\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_GestureEventListeners}\n   */\n  class GestureEventListeners extends superClass {\n    /**\n     * Add the event listener to the node if it is a gestures event.\n     *\n     * @param {!EventTarget} node Node to add event listener to\n     * @param {string} eventName Name of event\n     * @param {function(!Event):void} handler Listener function to add\n     * @return {void}\n     * @override\n     */\n    _addEventListenerToNode(node, eventName, handler) {\n      if (!addListener(node, eventName, handler)) {\n        super._addEventListenerToNode(node, eventName, handler);\n      }\n    }\n\n    /**\n     * Remove the event listener to the node if it is a gestures event.\n     *\n     * @param {!EventTarget} node Node to remove event listener from\n     * @param {string} eventName Name of event\n     * @param {function(!Event):void} handler Listener function to remove\n     * @return {void}\n     * @override\n     */\n    _removeEventListenerFromNode(node, eventName, handler) {\n      if (!removeListener(node, eventName, handler)) {\n        super._removeEventListenerFromNode(node, eventName, handler);\n      }\n    }\n  }\n\n  return GestureEventListeners;\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { dedupingMixin } from '../utils/mixin.js';\n\n// Common implementation for mixin & behavior\nfunction mutablePropertyChange(inst, property, value, old, mutableData) {\n  let isObject;\n  if (mutableData) {\n    isObject = (typeof value === 'object' && value !== null);\n    // Pull `old` for Objects from temp cache, but treat `null` as a primitive\n    if (isObject) {\n      old = inst.__dataTemp[property];\n    }\n  }\n  // Strict equality check, but return false for NaN===NaN\n  let shouldChange = (old !== value && (old === old || value === value));\n  // Objects are stored in temporary cache (cleared at end of\n  // turn), which is used for dirty-checking\n  if (isObject && shouldChange) {\n    inst.__dataTemp[property] = value;\n  }\n  return shouldChange;\n}\n\n/**\n * Element class mixin to skip strict dirty-checking for objects and arrays\n * (always consider them to be \"dirty\"), for use on elements utilizing\n * `PropertyEffects`\n *\n * By default, `PropertyEffects` performs strict dirty checking on\n * objects, which means that any deep modifications to an object or array will\n * not be propagated unless \"immutable\" data patterns are used (i.e. all object\n * references from the root to the mutation were changed).\n *\n * Polymer also provides a proprietary data mutation and path notification API\n * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient\n * mutation and notification of deep changes in an object graph to all elements\n * bound to the same object graph.\n *\n * In cases where neither immutable patterns nor the data mutation API can be\n * used, applying this mixin will cause Polymer to skip dirty checking for\n * objects and arrays (always consider them to be \"dirty\").  This allows a\n * user to make a deep modification to a bound object graph, and then either\n * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`\n * (e.g. `this.notifyPath('items')`) to update the tree.  Note that all\n * elements that wish to be updated based on deep mutations must apply this\n * mixin or otherwise skip strict dirty checking for objects/arrays.\n * Specifically, any elements in the binding tree between the source of a\n * mutation and the consumption of it must apply this mixin or enable the\n * `OptionalMutableData` mixin.\n *\n * In order to make the dirty check strategy configurable, see\n * `OptionalMutableData`.\n *\n * Note, the performance characteristics of propagating large object graphs\n * will be worse as opposed to using strict dirty checking with immutable\n * patterns or Polymer's path notification API.\n *\n * @mixinFunction\n * @polymer\n * @summary Element class mixin to skip strict dirty-checking for objects\n *   and arrays\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const MutableData = dedupingMixin(superClass => {\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_MutableData}\n   */\n  class MutableData extends superClass {\n    /**\n     * Overrides `PropertyEffects` to provide option for skipping\n     * strict equality checking for Objects and Arrays.\n     *\n     * This method pulls the value to dirty check against from the `__dataTemp`\n     * cache (rather than the normal `__data` cache) for Objects.  Since the temp\n     * cache is cleared at the end of a turn, this implementation allows\n     * side-effects of deep object changes to be processed by re-setting the\n     * same object (using the temp cache as an in-turn backstop to prevent\n     * cycles due to 2-way notification).\n     *\n     * @param {string} property Property name\n     * @param {*} value New property value\n     * @param {*} old Previous property value\n     * @return {boolean} Whether the property should be considered a change\n     * @protected\n     */\n    _shouldPropertyChange(property, value, old) {\n      return mutablePropertyChange(this, property, value, old, true);\n    }\n\n  }\n\n  return MutableData;\n\n});\n\n/**\n * Element class mixin to add the optional ability to skip strict\n * dirty-checking for objects and arrays (always consider them to be\n * \"dirty\") by setting a `mutable-data` attribute on an element instance.\n *\n * By default, `PropertyEffects` performs strict dirty checking on\n * objects, which means that any deep modifications to an object or array will\n * not be propagated unless \"immutable\" data patterns are used (i.e. all object\n * references from the root to the mutation were changed).\n *\n * Polymer also provides a proprietary data mutation and path notification API\n * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient\n * mutation and notification of deep changes in an object graph to all elements\n * bound to the same object graph.\n *\n * In cases where neither immutable patterns nor the data mutation API can be\n * used, applying this mixin will allow Polymer to skip dirty checking for\n * objects and arrays (always consider them to be \"dirty\").  This allows a\n * user to make a deep modification to a bound object graph, and then either\n * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`\n * (e.g. `this.notifyPath('items')`) to update the tree.  Note that all\n * elements that wish to be updated based on deep mutations must apply this\n * mixin or otherwise skip strict dirty checking for objects/arrays.\n * Specifically, any elements in the binding tree between the source of a\n * mutation and the consumption of it must enable this mixin or apply the\n * `MutableData` mixin.\n *\n * While this mixin adds the ability to forgo Object/Array dirty checking,\n * the `mutableData` flag defaults to false and must be set on the instance.\n *\n * Note, the performance characteristics of propagating large object graphs\n * will be worse by relying on `mutableData: true` as opposed to using\n * strict dirty checking with immutable patterns or Polymer's path notification\n * API.\n *\n * @mixinFunction\n * @polymer\n * @summary Element class mixin to optionally skip strict dirty-checking\n *   for objects and arrays\n */\nexport const OptionalMutableData = dedupingMixin(superClass => {\n\n  /**\n   * @mixinClass\n   * @polymer\n   * @implements {Polymer_OptionalMutableData}\n   */\n  class OptionalMutableData extends superClass {\n\n    /** @nocollapse */\n    static get properties() {\n      return {\n        /**\n         * Instance-level flag for configuring the dirty-checking strategy\n         * for this element.  When true, Objects and Arrays will skip dirty\n         * checking, otherwise strict equality checking will be used.\n         */\n        mutableData: Boolean\n      };\n    }\n\n    /**\n     * Overrides `PropertyEffects` to provide option for skipping\n     * strict equality checking for Objects and Arrays.\n     *\n     * When `this.mutableData` is true on this instance, this method\n     * pulls the value to dirty check against from the `__dataTemp` cache\n     * (rather than the normal `__data` cache) for Objects.  Since the temp\n     * cache is cleared at the end of a turn, this implementation allows\n     * side-effects of deep object changes to be processed by re-setting the\n     * same object (using the temp cache as an in-turn backstop to prevent\n     * cycles due to 2-way notification).\n     *\n     * @param {string} property Property name\n     * @param {*} value New property value\n     * @param {*} old Previous property value\n     * @return {boolean} Whether the property should be considered a change\n     * @protected\n     */\n    _shouldPropertyChange(property, value, old) {\n      return mutablePropertyChange(this, property, value, old, this.mutableData);\n    }\n  }\n\n  return OptionalMutableData;\n\n});\n\n// Export for use by legacy behavior\nMutableData._mutablePropertyChange = mutablePropertyChange;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { microTask } from '../utils/async.js';\nimport { wrap } from '../utils/wrap.js';\n\n/** @const {!AsyncInterface} */\nconst microtask = microTask;\n\n/**\n * Element class mixin that provides basic meta-programming for creating one\n * or more property accessors (getter/setter pair) that enqueue an async\n * (batched) `_propertiesChanged` callback.\n *\n * For basic usage of this mixin, call `MyClass.createProperties(props)`\n * once at class definition time to create property accessors for properties\n * named in props, implement `_propertiesChanged` to react as desired to\n * property changes, and implement `static get observedAttributes()` and\n * include lowercase versions of any property names that should be set from\n * attributes. Last, call `this._enableProperties()` in the element's\n * `connectedCallback` to enable the accessors.\n *\n * @mixinFunction\n * @polymer\n * @summary Element class mixin for reacting to property changes from\n *   generated property accessors.\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const PropertiesChanged = dedupingMixin(\n    /**\n     * @template T\n     * @param {function(new:T)} superClass Class to apply mixin to.\n     * @return {function(new:T)} superClass with mixin applied.\n     */\n    (superClass) => {\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_PropertiesChanged}\n   * @unrestricted\n   */\n  class PropertiesChanged extends superClass {\n\n    /**\n     * Creates property accessors for the given property names.\n     * @param {!Object} props Object whose keys are names of accessors.\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createProperties(props) {\n      const proto = this.prototype;\n      for (let prop in props) {\n        // don't stomp an existing accessor\n        if (!(prop in proto)) {\n          proto._createPropertyAccessor(prop);\n        }\n      }\n    }\n\n    /**\n     * Returns an attribute name that corresponds to the given property.\n     * The attribute name is the lowercased property name. Override to\n     * customize this mapping.\n     * @param {string} property Property to convert\n     * @return {string} Attribute name corresponding to the given property.\n     *\n     * @protected\n     * @nocollapse\n     */\n    static attributeNameForProperty(property) {\n      return property.toLowerCase();\n    }\n\n    /**\n     * Override point to provide a type to which to deserialize a value to\n     * a given property.\n     * @param {string} name Name of property\n     *\n     * @protected\n     * @nocollapse\n     */\n    static typeForProperty(name) { } //eslint-disable-line no-unused-vars\n\n    /**\n     * Creates a setter/getter pair for the named property with its own\n     * local storage.  The getter returns the value in the local storage,\n     * and the setter calls `_setProperty`, which updates the local storage\n     * for the property and enqueues a `_propertiesChanged` callback.\n     *\n     * This method may be called on a prototype or an instance.  Calling\n     * this method may overwrite a property value that already exists on\n     * the prototype/instance by creating the accessor.\n     *\n     * @param {string} property Name of the property\n     * @param {boolean=} readOnly When true, no setter is created; the\n     *   protected `_setProperty` function must be used to set the property\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _createPropertyAccessor(property, readOnly) {\n      this._addPropertyToAttributeMap(property);\n      if (!this.hasOwnProperty(JSCompiler_renameProperty('__dataHasAccessor', this))) {\n        this.__dataHasAccessor = Object.assign({}, this.__dataHasAccessor);\n      }\n      if (!this.__dataHasAccessor[property]) {\n        this.__dataHasAccessor[property] = true;\n        this._definePropertyAccessor(property, readOnly);\n      }\n    }\n\n    /**\n     * Adds the given `property` to a map matching attribute names\n     * to property names, using `attributeNameForProperty`. This map is\n     * used when deserializing attribute values to properties.\n     *\n     * @param {string} property Name of the property\n     * @override\n     */\n    _addPropertyToAttributeMap(property) {\n      if (!this.hasOwnProperty(JSCompiler_renameProperty('__dataAttributes', this))) {\n        this.__dataAttributes = Object.assign({}, this.__dataAttributes);\n      }\n      // This check is technically not correct; it's an optimization that\n      // assumes that if a _property_ name is already in the map (note this is\n      // an attr->property map), the property mapped directly to the attribute\n      // and it has already been mapped.  This would fail if\n      // `attributeNameForProperty` were overridden such that this was not the\n      // case.\n      let attr = this.__dataAttributes[property];\n      if (!attr) {\n        attr = this.constructor.attributeNameForProperty(property);\n        this.__dataAttributes[attr] = property;\n      }\n      return attr;\n    }\n\n    /**\n     * Defines a property accessor for the given property.\n     * @param {string} property Name of the property\n     * @param {boolean=} readOnly When true, no setter is created\n     * @return {void}\n     * @override\n     */\n     _definePropertyAccessor(property, readOnly) {\n      Object.defineProperty(this, property, {\n        /* eslint-disable valid-jsdoc */\n        /** @this {PropertiesChanged} */\n        get() {\n          // Inline for perf instead of using `_getProperty`\n          return this.__data[property];\n        },\n        /** @this {PropertiesChanged} */\n        set: readOnly ? function () {} : function (value) {\n          // Inline for perf instead of using `_setProperty`\n          if (this._setPendingProperty(property, value, true)) {\n            this._invalidateProperties();\n          }\n        }\n        /* eslint-enable */\n      });\n    }\n\n    constructor() {\n      super();\n      /** @type {boolean} */\n      this.__dataEnabled = false;\n      this.__dataReady = false;\n      this.__dataInvalid = false;\n      this.__data = {};\n      this.__dataPending = null;\n      this.__dataOld = null;\n      this.__dataInstanceProps = null;\n      /** @type {number} */\n      // NOTE: used to track re-entrant calls to `_flushProperties`\n      this.__dataCounter = 0;\n      this.__serializing = false;\n      this._initializeProperties();\n    }\n\n    /**\n     * Lifecycle callback called when properties are enabled via\n     * `_enableProperties`.\n     *\n     * Users may override this function to implement behavior that is\n     * dependent on the element having its property data initialized, e.g.\n     * from defaults (initialized from `constructor`, `_initializeProperties`),\n     * `attributeChangedCallback`, or values propagated from host e.g. via\n     * bindings.  `super.ready()` must be called to ensure the data system\n     * becomes enabled.\n     *\n     * @return {void}\n     * @public\n     * @override\n     */\n    ready() {\n      this.__dataReady = true;\n      this._flushProperties();\n    }\n\n    /**\n     * Initializes the local storage for property accessors.\n     *\n     * Provided as an override point for performing any setup work prior\n     * to initializing the property accessor system.\n     *\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _initializeProperties() {\n      // Capture instance properties; these will be set into accessors\n      // during first flush. Don't set them here, since we want\n      // these to overwrite defaults/constructor assignments\n      for (let p in this.__dataHasAccessor) {\n        if (this.hasOwnProperty(p)) {\n          this.__dataInstanceProps = this.__dataInstanceProps || {};\n          this.__dataInstanceProps[p] = this[p];\n          delete this[p];\n        }\n      }\n    }\n\n    /**\n     * Called at ready time with bag of instance properties that overwrote\n     * accessors when the element upgraded.\n     *\n     * The default implementation sets these properties back into the\n     * setter at ready time.  This method is provided as an override\n     * point for customizing or providing more efficient initialization.\n     *\n     * @param {Object} props Bag of property values that were overwritten\n     *   when creating property accessors.\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _initializeInstanceProperties(props) {\n      Object.assign(this, props);\n    }\n\n    /**\n     * Updates the local storage for a property (via `_setPendingProperty`)\n     * and enqueues a `_proeprtiesChanged` callback.\n     *\n     * @param {string} property Name of the property\n     * @param {*} value Value to set\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _setProperty(property, value) {\n      if (this._setPendingProperty(property, value)) {\n        this._invalidateProperties();\n      }\n    }\n\n    /**\n     * Returns the value for the given property.\n     * @param {string} property Name of property\n     * @return {*} Value for the given property\n     * @protected\n     * @override\n     */\n    _getProperty(property) {\n      return this.__data[property];\n    }\n\n    /* eslint-disable no-unused-vars */\n    /**\n     * Updates the local storage for a property, records the previous value,\n     * and adds it to the set of \"pending changes\" that will be passed to the\n     * `_propertiesChanged` callback.  This method does not enqueue the\n     * `_propertiesChanged` callback.\n     *\n     * @param {string} property Name of the property\n     * @param {*} value Value to set\n     * @param {boolean=} ext Not used here; affordance for closure\n     * @return {boolean} Returns true if the property changed\n     * @protected\n     * @override\n     */\n    _setPendingProperty(property, value, ext) {\n      let old = this.__data[property];\n      let changed = this._shouldPropertyChange(property, value, old);\n      if (changed) {\n        if (!this.__dataPending) {\n          this.__dataPending = {};\n          this.__dataOld = {};\n        }\n        // Ensure old is captured from the last turn\n        if (this.__dataOld && !(property in this.__dataOld)) {\n          this.__dataOld[property] = old;\n        }\n        this.__data[property] = value;\n        this.__dataPending[property] = value;\n      }\n      return changed;\n    }\n    /* eslint-enable */\n\n    /**\n     * @param {string} property Name of the property\n     * @return {boolean} Returns true if the property is pending.\n     */\n    _isPropertyPending(property) {\n      return !!(this.__dataPending && this.__dataPending.hasOwnProperty(property));\n    }\n\n    /**\n     * Marks the properties as invalid, and enqueues an async\n     * `_propertiesChanged` callback.\n     *\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _invalidateProperties() {\n      if (!this.__dataInvalid && this.__dataReady) {\n        this.__dataInvalid = true;\n        microtask.run(() => {\n          if (this.__dataInvalid) {\n            this.__dataInvalid = false;\n            this._flushProperties();\n          }\n        });\n      }\n    }\n\n    /**\n     * Call to enable property accessor processing. Before this method is\n     * called accessor values will be set but side effects are\n     * queued. When called, any pending side effects occur immediately.\n     * For elements, generally `connectedCallback` is a normal spot to do so.\n     * It is safe to call this method multiple times as it only turns on\n     * property accessors once.\n     *\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _enableProperties() {\n      if (!this.__dataEnabled) {\n        this.__dataEnabled = true;\n        if (this.__dataInstanceProps) {\n          this._initializeInstanceProperties(this.__dataInstanceProps);\n          this.__dataInstanceProps = null;\n        }\n        this.ready();\n      }\n    }\n\n    /**\n     * Calls the `_propertiesChanged` callback with the current set of\n     * pending changes (and old values recorded when pending changes were\n     * set), and resets the pending set of changes. Generally, this method\n     * should not be called in user code.\n     *\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _flushProperties() {\n      this.__dataCounter++;\n      const props = this.__data;\n      const changedProps = this.__dataPending;\n      const old = this.__dataOld;\n      if (this._shouldPropertiesChange(props, changedProps, old)) {\n        this.__dataPending = null;\n        this.__dataOld = null;\n        this._propertiesChanged(props, changedProps, old);\n      }\n      this.__dataCounter--;\n    }\n\n    /**\n     * Called in `_flushProperties` to determine if `_propertiesChanged`\n     * should be called. The default implementation returns true if\n     * properties are pending. Override to customize when\n     * `_propertiesChanged` is called.\n     * @param {!Object} currentProps Bag of all current accessor values\n     * @param {?Object} changedProps Bag of properties changed since the last\n     *   call to `_propertiesChanged`\n     * @param {?Object} oldProps Bag of previous values for each property\n     *   in `changedProps`\n     * @return {boolean} true if changedProps is truthy\n     * @override\n     */\n    _shouldPropertiesChange(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars\n      return Boolean(changedProps);\n    }\n\n    /**\n     * Callback called when any properties with accessors created via\n     * `_createPropertyAccessor` have been set.\n     *\n     * @param {!Object} currentProps Bag of all current accessor values\n     * @param {?Object} changedProps Bag of properties changed since the last\n     *   call to `_propertiesChanged`\n     * @param {?Object} oldProps Bag of previous values for each property\n     *   in `changedProps`\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _propertiesChanged(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars\n    }\n\n    /**\n     * Method called to determine whether a property value should be\n     * considered as a change and cause the `_propertiesChanged` callback\n     * to be enqueued.\n     *\n     * The default implementation returns `true` if a strict equality\n     * check fails. The method always returns false for `NaN`.\n     *\n     * Override this method to e.g. provide stricter checking for\n     * Objects/Arrays when using immutable patterns.\n     *\n     * @param {string} property Property name\n     * @param {*} value New property value\n     * @param {*} old Previous property value\n     * @return {boolean} Whether the property should be considered a change\n     *   and enqueue a `_proeprtiesChanged` callback\n     * @protected\n     * @override\n     */\n    _shouldPropertyChange(property, value, old) {\n      return (\n        // Strict equality check\n        (old !== value &&\n          // This ensures (old==NaN, value==NaN) always returns false\n          (old === old || value === value))\n      );\n    }\n\n    /**\n     * Implements native Custom Elements `attributeChangedCallback` to\n     * set an attribute value to a property via `_attributeToProperty`.\n     *\n     * @param {string} name Name of attribute that changed\n     * @param {?string} old Old attribute value\n     * @param {?string} value New attribute value\n     * @param {?string} namespace Attribute namespace.\n     * @return {void}\n     * @suppress {missingProperties} Super may or may not implement the callback\n     * @override\n     */\n    attributeChangedCallback(name, old, value, namespace) {\n      if (old !== value) {\n        this._attributeToProperty(name, value);\n      }\n      if (super.attributeChangedCallback) {\n        super.attributeChangedCallback(name, old, value, namespace);\n      }\n    }\n\n    /**\n     * Deserializes an attribute to its associated property.\n     *\n     * This method calls the `_deserializeValue` method to convert the string to\n     * a typed value.\n     *\n     * @param {string} attribute Name of attribute to deserialize.\n     * @param {?string} value of the attribute.\n     * @param {*=} type type to deserialize to, defaults to the value\n     * returned from `typeForProperty`\n     * @return {void}\n     * @override\n     */\n    _attributeToProperty(attribute, value, type) {\n      if (!this.__serializing) {\n        const map = this.__dataAttributes;\n        const property = map && map[attribute] || attribute;\n        this[property] = this._deserializeValue(value, type ||\n          this.constructor.typeForProperty(property));\n      }\n    }\n\n    /**\n     * Serializes a property to its associated attribute.\n     *\n     * @suppress {invalidCasts} Closure can't figure out `this` is an element.\n     *\n     * @param {string} property Property name to reflect.\n     * @param {string=} attribute Attribute name to reflect to.\n     * @param {*=} value Property value to refect.\n     * @return {void}\n     * @override\n     */\n    _propertyToAttribute(property, attribute, value) {\n      this.__serializing = true;\n      value = (arguments.length < 3) ? this[property] : value;\n      this._valueToNodeAttribute(/** @type {!HTMLElement} */(this), value,\n        attribute || this.constructor.attributeNameForProperty(property));\n      this.__serializing = false;\n    }\n\n    /**\n     * Sets a typed value to an HTML attribute on a node.\n     *\n     * This method calls the `_serializeValue` method to convert the typed\n     * value to a string.  If the `_serializeValue` method returns `undefined`,\n     * the attribute will be removed (this is the default for boolean\n     * type `false`).\n     *\n     * @param {Element} node Element to set attribute to.\n     * @param {*} value Value to serialize.\n     * @param {string} attribute Attribute name to serialize to.\n     * @return {void}\n     * @override\n     */\n    _valueToNodeAttribute(node, value, attribute) {\n      const str = this._serializeValue(value);\n      if (attribute === 'class' || attribute === 'name' || attribute === 'slot') {\n        node = /** @type {?Element} */(wrap(node));\n      }\n      if (str === undefined) {\n        node.removeAttribute(attribute);\n      } else {\n        node.setAttribute(\n            attribute,\n            // Closure's type for `setAttribute`'s second parameter incorrectly\n            // excludes `TrustedScript`.\n            (str === '' && window.trustedTypes) ?\n                /** @type {?} */ (window.trustedTypes.emptyScript) :\n                str);\n      }\n    }\n\n    /**\n     * Converts a typed JavaScript value to a string.\n     *\n     * This method is called when setting JS property values to\n     * HTML attributes.  Users may override this method to provide\n     * serialization for custom types.\n     *\n     * @param {*} value Property value to serialize.\n     * @return {string | undefined} String serialized from the provided\n     * property  value.\n     * @override\n     */\n    _serializeValue(value) {\n      switch (typeof value) {\n        case 'boolean':\n          return value ? '' : undefined;\n        default:\n          return value != null ? value.toString() : undefined;\n      }\n    }\n\n    /**\n     * Converts a string to a typed JavaScript value.\n     *\n     * This method is called when reading HTML attribute values to\n     * JS properties.  Users may override this method to provide\n     * deserialization for custom `type`s. Types for `Boolean`, `String`,\n     * and `Number` convert attributes to the expected types.\n     *\n     * @param {?string} value Value to deserialize.\n     * @param {*=} type Type to deserialize the string to.\n     * @return {*} Typed value deserialized from the provided string.\n     * @override\n     */\n    _deserializeValue(value, type) {\n      switch (type) {\n        case Boolean:\n          return (value !== null);\n        case Number:\n          return Number(value);\n        default:\n          return value;\n      }\n    }\n\n  }\n\n  return PropertiesChanged;\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { camelToDashCase, dashToCamelCase } from '../utils/case-map.js';\nimport { PropertiesChanged } from './properties-changed.js';\n\n// Save map of native properties; this forms a blacklist or properties\n// that won't have their values \"saved\" by `saveAccessorValue`, since\n// reading from an HTMLElement accessor from the context of a prototype throws\nconst nativeProperties = {};\nlet proto = HTMLElement.prototype;\nwhile (proto) {\n  let props = Object.getOwnPropertyNames(proto);\n  for (let i=0; i<props.length; i++) {\n    nativeProperties[props[i]] = true;\n  }\n  proto = Object.getPrototypeOf(proto);\n}\n\nconst isTrustedType = (() => {\n  if (!window.trustedTypes) {\n    return () => false;\n  }\n  return (val) => trustedTypes.isHTML(val) ||\n        trustedTypes.isScript(val) || trustedTypes.isScriptURL(val);\n})();\n\n/**\n * Used to save the value of a property that will be overridden with\n * an accessor. If the `model` is a prototype, the values will be saved\n * in `__dataProto`, and it's up to the user (or downstream mixin) to\n * decide how/when to set these values back into the accessors.\n * If `model` is already an instance (it has a `__data` property), then\n * the value will be set as a pending property, meaning the user should\n * call `_invalidateProperties` or `_flushProperties` to take effect\n *\n * @param {Object} model Prototype or instance\n * @param {string} property Name of property\n * @return {void}\n * @private\n */\nfunction saveAccessorValue(model, property) {\n  // Don't read/store value for any native properties since they could throw\n  if (!nativeProperties[property]) {\n    let value = model[property];\n    if (value !== undefined) {\n      if (model.__data) {\n        // Adding accessor to instance; update the property\n        // It is the user's responsibility to call _flushProperties\n        model._setPendingProperty(property, value);\n      } else {\n        // Adding accessor to proto; save proto's value for instance-time use\n        if (!model.__dataProto) {\n          model.__dataProto = {};\n        } else if (!model.hasOwnProperty(JSCompiler_renameProperty('__dataProto', model))) {\n          model.__dataProto = Object.create(model.__dataProto);\n        }\n        model.__dataProto[property] = value;\n      }\n    }\n  }\n}\n\n/**\n * Element class mixin that provides basic meta-programming for creating one\n * or more property accessors (getter/setter pair) that enqueue an async\n * (batched) `_propertiesChanged` callback.\n *\n * For basic usage of this mixin:\n *\n * -   Declare attributes to observe via the standard `static get\n *     observedAttributes()`. Use `dash-case` attribute names to represent\n *     `camelCase` property names.\n * -   Implement the `_propertiesChanged` callback on the class.\n * -   Call `MyClass.createPropertiesForAttributes()` **once** on the class to\n *     generate property accessors for each observed attribute. This must be\n *     called before the first instance is created, for example, by calling it\n *     before calling `customElements.define`. It can also be called lazily from\n *     the element's `constructor`, as long as it's guarded so that the call is\n *     only made once, when the first instance is created.\n * -   Call `this._enableProperties()` in the element's `connectedCallback` to\n *     enable the accessors.\n *\n * Any `observedAttributes` will automatically be\n * deserialized via `attributeChangedCallback` and set to the associated\n * property using `dash-case`-to-`camelCase` convention.\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin PropertiesChanged\n * @summary Element class mixin for reacting to property changes from\n *   generated property accessors.\n * @template T\n * @param {function(new:T)} superClass Class to apply mixin to.\n * @return {function(new:T)} superClass with mixin applied.\n */\nexport const PropertyAccessors = dedupingMixin(superClass => {\n\n  /**\n   * @constructor\n   * @implements {Polymer_PropertiesChanged}\n   * @unrestricted\n   * @private\n   */\n   const base = PropertiesChanged(superClass);\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_PropertyAccessors}\n   * @extends {base}\n   * @unrestricted\n   */\n  class PropertyAccessors extends base {\n\n    /**\n     * Generates property accessors for all attributes in the standard\n     * static `observedAttributes` array.\n     *\n     * Attribute names are mapped to property names using the `dash-case` to\n     * `camelCase` convention\n     *\n     * @return {void}\n     * @nocollapse\n     */\n    static createPropertiesForAttributes() {\n      let a$ =  /** @type {?} */ (this).observedAttributes;\n      for (let i=0; i < a$.length; i++) {\n        this.prototype._createPropertyAccessor(dashToCamelCase(a$[i]));\n      }\n    }\n\n    /**\n     * Returns an attribute name that corresponds to the given property.\n     * By default, converts camel to dash case, e.g. `fooBar` to `foo-bar`.\n     * @param {string} property Property to convert\n     * @return {string} Attribute name corresponding to the given property.\n     *\n     * @protected\n     * @nocollapse\n     */\n    static attributeNameForProperty(property) {\n      return camelToDashCase(property);\n    }\n\n    /**\n     * Overrides PropertiesChanged implementation to initialize values for\n     * accessors created for values that already existed on the element\n     * prototype.\n     *\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _initializeProperties() {\n      if (this.__dataProto) {\n        this._initializeProtoProperties(this.__dataProto);\n        this.__dataProto = null;\n      }\n      super._initializeProperties();\n    }\n\n    /**\n     * Called at instance time with bag of properties that were overwritten\n     * by accessors on the prototype when accessors were created.\n     *\n     * The default implementation sets these properties back into the\n     * setter at instance time.  This method is provided as an override\n     * point for customizing or providing more efficient initialization.\n     *\n     * @param {Object} props Bag of property values that were overwritten\n     *   when creating property accessors.\n     * @return {void}\n     * @protected\n     * @override\n     */\n    _initializeProtoProperties(props) {\n      for (let p in props) {\n        this._setProperty(p, props[p]);\n      }\n    }\n\n    /**\n     * Ensures the element has the given attribute. If it does not,\n     * assigns the given value to the attribute.\n     *\n     * @suppress {invalidCasts} Closure can't figure out `this` is infact an\n     *     element\n     *\n     * @param {string} attribute Name of attribute to ensure is set.\n     * @param {string} value of the attribute.\n     * @return {void}\n     * @override\n     */\n    _ensureAttribute(attribute, value) {\n      const el = /** @type {!HTMLElement} */(this);\n      if (!el.hasAttribute(attribute)) {\n        this._valueToNodeAttribute(el, value, attribute);\n      }\n    }\n\n    /**\n     * Overrides PropertiesChanged implemention to serialize objects as JSON.\n     *\n     * @param {*} value Property value to serialize.\n     * @return {string | undefined} String serialized from the provided property\n     *     value.\n     * @override\n     */\n    _serializeValue(value) {\n      /* eslint-disable no-fallthrough */\n      switch (typeof value) {\n        case 'object':\n          if (value instanceof Date) {\n            return value.toString();\n          } else if (value) {\n            if (isTrustedType(value)) {\n              /**\n               * Here `value` isn't actually a string, but it should be\n               * passed into APIs that normally expect a string, like\n               * elem.setAttribute.\n               */\n              return /** @type {?} */ (value);\n            }\n            try {\n              return JSON.stringify(value);\n            } catch(x) {\n              return '';\n            }\n          }\n\n        default:\n          return super._serializeValue(value);\n      }\n    }\n\n    /**\n     * Converts a string to a typed JavaScript value.\n     *\n     * This method is called by Polymer when reading HTML attribute values to\n     * JS properties.  Users may override this method on Polymer element\n     * prototypes to provide deserialization for custom `type`s.  Note,\n     * the `type` argument is the value of the `type` field provided in the\n     * `properties` configuration object for a given property, and is\n     * by convention the constructor for the type to deserialize.\n     *\n     *\n     * @param {?string} value Attribute value to deserialize.\n     * @param {*=} type Type to deserialize the string to.\n     * @return {*} Typed value deserialized from the provided string.\n     * @override\n     */\n    _deserializeValue(value, type) {\n      /**\n       * @type {*}\n       */\n      let outValue;\n      switch (type) {\n        case Object:\n          try {\n            outValue = JSON.parse(/** @type {string} */(value));\n          } catch(x) {\n            // allow non-JSON literals like Strings and Numbers\n            outValue = value;\n          }\n          break;\n        case Array:\n          try {\n            outValue = JSON.parse(/** @type {string} */(value));\n          } catch(x) {\n            outValue = null;\n            console.warn(`Polymer::Attributes: couldn't decode Array as JSON: ${value}`);\n          }\n          break;\n        case Date:\n          outValue = isNaN(value) ? String(value) : Number(value);\n          outValue = new Date(outValue);\n          break;\n        default:\n          outValue = super._deserializeValue(value, type);\n          break;\n      }\n      return outValue;\n    }\n    /* eslint-enable no-fallthrough */\n\n    /**\n     * Overrides PropertiesChanged implementation to save existing prototype\n     * property value so that it can be reset.\n     * @param {string} property Name of the property\n     * @param {boolean=} readOnly When true, no setter is created\n     *\n     * When calling on a prototype, any overwritten values are saved in\n     * `__dataProto`, and it is up to the subclasser to decide how/when\n     * to set those properties back into the accessor.  When calling on an\n     * instance, the overwritten value is set via `_setPendingProperty`,\n     * and the user should call `_invalidateProperties` or `_flushProperties`\n     * for the values to take effect.\n     * @protected\n     * @return {void}\n     * @override\n     */\n    _definePropertyAccessor(property, readOnly) {\n      saveAccessorValue(this, property);\n      super._definePropertyAccessor(property, readOnly);\n    }\n\n    /**\n     * Returns true if this library created an accessor for the given property.\n     *\n     * @param {string} property Property name\n     * @return {boolean} True if an accessor was created\n     * @override\n     */\n    _hasAccessor(property) {\n      return this.__dataHasAccessor && this.__dataHasAccessor[property];\n    }\n\n    /**\n     * Returns true if the specified property has a pending change.\n     *\n     * @param {string} prop Property name\n     * @return {boolean} True if property has a pending change\n     * @protected\n     * @override\n     */\n    _isPropertyPending(prop) {\n      return Boolean(this.__dataPending && (prop in this.__dataPending));\n    }\n\n  }\n\n  return PropertyAccessors;\n\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\n\n// 1.x backwards-compatible auto-wrapper for template type extensions\n// This is a clear layering violation and gives favored-nation status to\n// dom-if and dom-repeat templates.  This is a conceit we're choosing to keep\n// a.) to ease 1.x backwards-compatibility due to loss of `is`, and\n// b.) to maintain if/repeat capability in parser-constrained elements\n//     (e.g. table, select) in lieu of native CE type extensions without\n//     massive new invention in this space (e.g. directive system)\nconst templateExtensions = {\n  'dom-if': true,\n  'dom-repeat': true\n};\n\nlet placeholderBugDetect = false;\nlet placeholderBug = false;\n\nfunction hasPlaceholderBug() {\n  if (!placeholderBugDetect) {\n    placeholderBugDetect = true;\n    const t = document.createElement('textarea');\n    t.placeholder = 'a';\n    placeholderBug = t.placeholder === t.textContent;\n  }\n  return placeholderBug;\n}\n\n/**\n * Some browsers have a bug with textarea, where placeholder text is copied as\n * a textnode child of the textarea.\n *\n * If the placeholder is a binding, this can break template stamping in two\n * ways.\n *\n * One issue is that when the `placeholder` attribute is removed when the\n * binding is processed, the textnode child of the textarea is deleted, and the\n * template info tries to bind into that node.\n *\n * With `legacyOptimizations` in use, when the template is stamped and the\n * `textarea.textContent` binding is processed, no corresponding node is found\n * because it was removed during parsing. An exception is generated when this\n * binding is updated.\n *\n * With `legacyOptimizations` not in use, the template is cloned before\n * processing and this changes the above behavior. The cloned template also has\n * a value property set to the placeholder and textContent. This prevents the\n * removal of the textContent when the placeholder attribute is removed.\n * Therefore the exception does not occur. However, there is an extra\n * unnecessary binding.\n *\n * @param {!Node} node Check node for placeholder bug\n * @return {void}\n */\nfunction fixPlaceholder(node) {\n  if (hasPlaceholderBug() && node.localName === 'textarea' && node.placeholder\n        && node.placeholder === node.textContent) {\n    node.textContent = null;\n  }\n}\n\n/**\n * Copies an attribute from one element to another, converting the value to a\n * `TrustedScript` if it is named like a Polymer template event listener.\n *\n * @param {!Element} dest The element to set the attribute on\n * @param {!Element} src The element to read the attribute from\n * @param {string} name The name of the attribute\n */\nconst copyAttributeWithTemplateEventPolicy = (() => {\n  /**\n   * This `TrustedTypePolicy` is used to work around a Chrome bug in the Trusted\n   * Types API where any attribute that starts with `on` may only be set to a\n   * `TrustedScript` value, even if that attribute would not cause an event\n   * listener to be created. (See https://crbug.com/993268 for details.)\n   *\n   * Polymer's template system allows `<dom-if>` and `<dom-repeat>` to be\n   * written using the `<template is=\"...\">` syntax, even if there is no UA\n   * support for custom element extensions of built-in elements. In doing so, it\n   * copies attributes from the original `<template>` to a newly created\n   * `<dom-if>` or `<dom-repeat>`, which can trigger the bug mentioned above if\n   * any of those attributes uses Polymer's `on-` syntax for event listeners.\n   * (Note, the value of these `on-` listeners is not evaluated as script: it is\n   * the name of a member function of a component that will be used as the event\n   * listener.)\n   *\n   * @type {!TrustedTypePolicy|undefined}\n   */\n  const polymerTemplateEventAttributePolicy = window.trustedTypes &&\n      window.trustedTypes.createPolicy(\n          'polymer-template-event-attribute-policy', {\n            createScript: x => x,\n          });\n\n  return (dest, src, name) => {\n    const value = src.getAttribute(name);\n\n    if (polymerTemplateEventAttributePolicy && name.startsWith('on-')) {\n      dest.setAttribute(\n          name, polymerTemplateEventAttributePolicy.createScript(value, name));\n      return;\n    }\n\n    dest.setAttribute(name, value);\n  };\n})();\n\nfunction wrapTemplateExtension(node) {\n  let is = node.getAttribute('is');\n  if (is && templateExtensions[is]) {\n    let t = node;\n    t.removeAttribute('is');\n    node = t.ownerDocument.createElement(is);\n    t.parentNode.replaceChild(node, t);\n    node.appendChild(t);\n    while(t.attributes.length) {\n      const {name} = t.attributes[0];\n      copyAttributeWithTemplateEventPolicy(node, t, name);\n      t.removeAttribute(name);\n    }\n  }\n  return node;\n}\n\nfunction findTemplateNode(root, nodeInfo) {\n  // recursively ascend tree until we hit root\n  let parent = nodeInfo.parentInfo && findTemplateNode(root, nodeInfo.parentInfo);\n  // unwind the stack, returning the indexed node at each level\n  if (parent) {\n    // note: marginally faster than indexing via childNodes\n    // (http://jsperf.com/childnodes-lookup)\n    for (let n=parent.firstChild, i=0; n; n=n.nextSibling) {\n      if (nodeInfo.parentIndex === i++) {\n        return n;\n      }\n    }\n  } else {\n    return root;\n  }\n}\n\n// construct `$` map (from id annotations)\nfunction applyIdToMap(inst, map, node, nodeInfo) {\n  if (nodeInfo.id) {\n    map[nodeInfo.id] = node;\n  }\n}\n\n// install event listeners (from event annotations)\nfunction applyEventListener(inst, node, nodeInfo) {\n  if (nodeInfo.events && nodeInfo.events.length) {\n    for (let j=0, e$=nodeInfo.events, e; (j<e$.length) && (e=e$[j]); j++) {\n      inst._addMethodEventListenerToNode(node, e.name, e.value, inst);\n    }\n  }\n}\n\n// push configuration references at configure time\nfunction applyTemplateInfo(inst, node, nodeInfo, parentTemplateInfo) {\n  if (nodeInfo.templateInfo) {\n    // Give the node an instance of this templateInfo and set its parent\n    node._templateInfo = nodeInfo.templateInfo;\n    node._parentTemplateInfo = parentTemplateInfo;\n  }\n}\n\nfunction createNodeEventHandler(context, eventName, methodName) {\n  // Instances can optionally have a _methodHost which allows redirecting where\n  // to find methods. Currently used by `templatize`.\n  context = context._methodHost || context;\n  let handler = function(e) {\n    if (context[methodName]) {\n      context[methodName](e, e.detail);\n    } else {\n      console.warn('listener method `' + methodName + '` not defined');\n    }\n  };\n  return handler;\n}\n\n/**\n * Element mixin that provides basic template parsing and stamping, including\n * the following template-related features for stamped templates:\n *\n * - Declarative event listeners (`on-eventname=\"listener\"`)\n * - Map of node id's to stamped node instances (`this.$.id`)\n * - Nested template content caching/removal and re-installation (performance\n *   optimization)\n *\n * @mixinFunction\n * @polymer\n * @summary Element class mixin that provides basic template parsing and stamping\n */\nexport const TemplateStamp = dedupingMixin(\n    /**\n     * @template T\n     * @param {function(new:T)} superClass Class to apply mixin to.\n     * @return {function(new:T)} superClass with mixin applied.\n     */\n    (superClass) => {\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_TemplateStamp}\n   */\n  class TemplateStamp extends superClass {\n\n    /**\n     * Scans a template to produce template metadata.\n     *\n     * Template-specific metadata are stored in the object returned, and node-\n     * specific metadata are stored in objects in its flattened `nodeInfoList`\n     * array.  Only nodes in the template that were parsed as nodes of\n     * interest contain an object in `nodeInfoList`.  Each `nodeInfo` object\n     * contains an `index` (`childNodes` index in parent) and optionally\n     * `parent`, which points to node info of its parent (including its index).\n     *\n     * The template metadata object returned from this method has the following\n     * structure (many fields optional):\n     *\n     * ```js\n     *   {\n     *     // Flattened list of node metadata (for nodes that generated metadata)\n     *     nodeInfoList: [\n     *       {\n     *         // `id` attribute for any nodes with id's for generating `$` map\n     *         id: {string},\n     *         // `on-event=\"handler\"` metadata\n     *         events: [\n     *           {\n     *             name: {string},   // event name\n     *             value: {string},  // handler method name\n     *           }, ...\n     *         ],\n     *         // Notes when the template contained a `<slot>` for shady DOM\n     *         // optimization purposes\n     *         hasInsertionPoint: {boolean},\n     *         // For nested `<template>`` nodes, nested template metadata\n     *         templateInfo: {object}, // nested template metadata\n     *         // Metadata to allow efficient retrieval of instanced node\n     *         // corresponding to this metadata\n     *         parentInfo: {number},   // reference to parent nodeInfo>\n     *         parentIndex: {number},  // index in parent's `childNodes` collection\n     *         infoIndex: {number},    // index of this `nodeInfo` in `templateInfo.nodeInfoList`\n     *       },\n     *       ...\n     *     ],\n     *     // When true, the template had the `strip-whitespace` attribute\n     *     // or was nested in a template with that setting\n     *     stripWhitespace: {boolean},\n     *     // For nested templates, nested template content is moved into\n     *     // a document fragment stored here; this is an optimization to\n     *     // avoid the cost of nested template cloning\n     *     content: {DocumentFragment}\n     *   }\n     * ```\n     *\n     * This method kicks off a recursive treewalk as follows:\n     *\n     * ```\n     *    _parseTemplate <---------------------+\n     *      _parseTemplateContent              |\n     *        _parseTemplateNode  <------------|--+\n     *          _parseTemplateNestedTemplate --+  |\n     *          _parseTemplateChildNodes ---------+\n     *          _parseTemplateNodeAttributes\n     *            _parseTemplateNodeAttribute\n     *\n     * ```\n     *\n     * These methods may be overridden to add custom metadata about templates\n     * to either `templateInfo` or `nodeInfo`.\n     *\n     * Note that this method may be destructive to the template, in that\n     * e.g. event annotations may be removed after being noted in the\n     * template metadata.\n     *\n     * @param {!HTMLTemplateElement} template Template to parse\n     * @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer\n     *   template, for parsing nested templates\n     * @return {!TemplateInfo} Parsed template metadata\n     * @nocollapse\n     */\n    static _parseTemplate(template, outerTemplateInfo) {\n      // since a template may be re-used, memo-ize metadata\n      if (!template._templateInfo) {\n        // TODO(rictic): fix typing\n        let /** ? */ templateInfo = template._templateInfo = {};\n        templateInfo.nodeInfoList = [];\n        templateInfo.nestedTemplate = Boolean(outerTemplateInfo);\n        templateInfo.stripWhiteSpace =\n          (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||\n          (template.hasAttribute && template.hasAttribute('strip-whitespace'));\n         // TODO(rictic): fix typing\n         this._parseTemplateContent(\n             template, templateInfo, /** @type {?} */ ({parent: null}));\n      }\n      return template._templateInfo;\n    }\n\n    /**\n     * See docs for _parseTemplateNode.\n     *\n     * @param {!HTMLTemplateElement} template .\n     * @param {!TemplateInfo} templateInfo .\n     * @param {!NodeInfo} nodeInfo .\n     * @return {boolean} .\n     * @nocollapse\n     */\n    static _parseTemplateContent(template, templateInfo, nodeInfo) {\n      return this._parseTemplateNode(template.content, templateInfo, nodeInfo);\n    }\n\n    /**\n     * Parses template node and adds template and node metadata based on\n     * the current node, and its `childNodes` and `attributes`.\n     *\n     * This method may be overridden to add custom node or template specific\n     * metadata based on this node.\n     *\n     * @param {Node} node Node to parse\n     * @param {!TemplateInfo} templateInfo Template metadata for current template\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @nocollapse\n     */\n    static _parseTemplateNode(node, templateInfo, nodeInfo) {\n      let noted = false;\n      let element = /** @type {!HTMLTemplateElement} */ (node);\n      if (element.localName == 'template' && !element.hasAttribute('preserve-content')) {\n        noted = this._parseTemplateNestedTemplate(element, templateInfo, nodeInfo) || noted;\n      } else if (element.localName === 'slot') {\n        // For ShadyDom optimization, indicating there is an insertion point\n        templateInfo.hasInsertionPoint = true;\n      }\n      fixPlaceholder(element);\n      if (element.firstChild) {\n        this._parseTemplateChildNodes(element, templateInfo, nodeInfo);\n      }\n      if (element.hasAttributes && element.hasAttributes()) {\n        noted = this._parseTemplateNodeAttributes(element, templateInfo, nodeInfo) || noted;\n      }\n      // Checking `nodeInfo.noted` allows a child node of this node (who gets\n      // access to `parentInfo`) to cause the parent to be noted, which\n      // otherwise has no return path via `_parseTemplateChildNodes` (used by\n      // some optimizations)\n      return noted || nodeInfo.noted;\n    }\n\n    /**\n     * Parses template child nodes for the given root node.\n     *\n     * This method also wraps whitelisted legacy template extensions\n     * (`is=\"dom-if\"` and `is=\"dom-repeat\"`) with their equivalent element\n     * wrappers, collapses text nodes, and strips whitespace from the template\n     * if the `templateInfo.stripWhitespace` setting was provided.\n     *\n     * @param {Node} root Root node whose `childNodes` will be parsed\n     * @param {!TemplateInfo} templateInfo Template metadata for current template\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @return {void}\n     */\n    static _parseTemplateChildNodes(root, templateInfo, nodeInfo) {\n      if (root.localName === 'script' || root.localName === 'style') {\n        return;\n      }\n      for (let node=root.firstChild, parentIndex=0, next; node; node=next) {\n        // Wrap templates\n        if (node.localName == 'template') {\n          node = wrapTemplateExtension(node);\n        }\n        // collapse adjacent textNodes: fixes an IE issue that can cause\n        // text nodes to be inexplicably split =(\n        // note that root.normalize() should work but does not so we do this\n        // manually.\n        next = node.nextSibling;\n        if (node.nodeType === Node.TEXT_NODE) {\n          let /** Node */ n = next;\n          while (n && (n.nodeType === Node.TEXT_NODE)) {\n            node.textContent += n.textContent;\n            next = n.nextSibling;\n            root.removeChild(n);\n            n = next;\n          }\n          // optionally strip whitespace\n          if (templateInfo.stripWhiteSpace && !node.textContent.trim()) {\n            root.removeChild(node);\n            continue;\n          }\n        }\n        let childInfo =\n            /** @type {!NodeInfo} */ ({parentIndex, parentInfo: nodeInfo});\n        if (this._parseTemplateNode(node, templateInfo, childInfo)) {\n          childInfo.infoIndex = templateInfo.nodeInfoList.push(childInfo) - 1;\n        }\n        // Increment if not removed\n        if (node.parentNode) {\n          parentIndex++;\n        }\n      }\n    }\n\n    /**\n     * Parses template content for the given nested `<template>`.\n     *\n     * Nested template info is stored as `templateInfo` in the current node's\n     * `nodeInfo`. `template.content` is removed and stored in `templateInfo`.\n     * It will then be the responsibility of the host to set it back to the\n     * template and for users stamping nested templates to use the\n     * `_contentForTemplate` method to retrieve the content for this template\n     * (an optimization to avoid the cost of cloning nested template content).\n     *\n     * @param {HTMLTemplateElement} node Node to parse (a <template>)\n     * @param {TemplateInfo} outerTemplateInfo Template metadata for current template\n     *   that includes the template `node`\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @nocollapse\n     */\n    static _parseTemplateNestedTemplate(node, outerTemplateInfo, nodeInfo) {\n      // TODO(rictic): the type of node should be non-null\n      let element = /** @type {!HTMLTemplateElement} */ (node);\n      let templateInfo = this._parseTemplate(element, outerTemplateInfo);\n      let content = templateInfo.content =\n          element.content.ownerDocument.createDocumentFragment();\n      content.appendChild(element.content);\n      nodeInfo.templateInfo = templateInfo;\n      return true;\n    }\n\n    /**\n     * Parses template node attributes and adds node metadata to `nodeInfo`\n     * for nodes of interest.\n     *\n     * @param {Element} node Node to parse\n     * @param {!TemplateInfo} templateInfo Template metadata for current\n     *     template\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @nocollapse\n     */\n    static _parseTemplateNodeAttributes(node, templateInfo, nodeInfo) {\n      // Make copy of original attribute list, since the order may change\n      // as attributes are added and removed\n      let noted = false;\n      let attrs = Array.from(node.attributes);\n      for (let i=attrs.length-1, a; (a=attrs[i]); i--) {\n        noted = this._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, a.name, a.value) || noted;\n      }\n      return noted;\n    }\n\n    /**\n     * Parses a single template node attribute and adds node metadata to\n     * `nodeInfo` for attributes of interest.\n     *\n     * This implementation adds metadata for `on-event=\"handler\"` attributes\n     * and `id` attributes.\n     *\n     * @param {Element} node Node to parse\n     * @param {!TemplateInfo} templateInfo Template metadata for current template\n     * @param {!NodeInfo} nodeInfo Node metadata for current template.\n     * @param {string} name Attribute name\n     * @param {string} value Attribute value\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @nocollapse\n     */\n    static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {\n      // events (on-*)\n      if (name.slice(0, 3) === 'on-') {\n        node.removeAttribute(name);\n        nodeInfo.events = nodeInfo.events || [];\n        nodeInfo.events.push({\n          name: name.slice(3),\n          value\n        });\n        return true;\n      }\n      // static id\n      else if (name === 'id') {\n        nodeInfo.id = value;\n        return true;\n      }\n      return false;\n    }\n\n    /**\n     * Returns the `content` document fragment for a given template.\n     *\n     * For nested templates, Polymer performs an optimization to cache nested\n     * template content to avoid the cost of cloning deeply nested templates.\n     * This method retrieves the cached content for a given template.\n     *\n     * @param {HTMLTemplateElement} template Template to retrieve `content` for\n     * @return {DocumentFragment} Content fragment\n     * @nocollapse\n     */\n    static _contentForTemplate(template) {\n      let templateInfo = /** @type {HTMLTemplateElementWithInfo} */ (template)._templateInfo;\n      return (templateInfo && templateInfo.content) || template.content;\n    }\n\n    /**\n     * Clones the provided template content and returns a document fragment\n     * containing the cloned dom.\n     *\n     * The template is parsed (once and memoized) using this library's\n     * template parsing features, and provides the following value-added\n     * features:\n     * * Adds declarative event listeners for `on-event=\"handler\"` attributes\n     * * Generates an \"id map\" for all nodes with id's under `$` on returned\n     *   document fragment\n     * * Passes template info including `content` back to templates as\n     *   `_templateInfo` (a performance optimization to avoid deep template\n     *   cloning)\n     *\n     * Note that the memoized template parsing process is destructive to the\n     * template: attributes for bindings and declarative event listeners are\n     * removed after being noted in notes, and any nested `<template>.content`\n     * is removed and stored in notes as well.\n     *\n     * @param {!HTMLTemplateElement} template Template to stamp\n     * @param {TemplateInfo=} templateInfo Optional template info associated\n     *   with the template to be stamped; if omitted the template will be\n     *   automatically parsed.\n     * @return {!StampedTemplate} Cloned template content\n     * @override\n     */\n    _stampTemplate(template, templateInfo) {\n      // Polyfill support: bootstrap the template if it has not already been\n      if (template && !template.content &&\n          window.HTMLTemplateElement && HTMLTemplateElement.decorate) {\n        HTMLTemplateElement.decorate(template);\n      }\n      // Accepting the `templateInfo` via an argument allows for creating\n      // instances of the `templateInfo` by the caller, useful for adding\n      // instance-time information to the prototypical data\n      templateInfo = templateInfo || this.constructor._parseTemplate(template);\n      let nodeInfo = templateInfo.nodeInfoList;\n      let content = templateInfo.content || template.content;\n      let dom = /** @type {DocumentFragment} */ (document.importNode(content, true));\n      // NOTE: ShadyDom optimization indicating there is an insertion point\n      dom.__noInsertionPoint = !templateInfo.hasInsertionPoint;\n      let nodes = dom.nodeList = new Array(nodeInfo.length);\n      dom.$ = {};\n      for (let i=0, l=nodeInfo.length, info; (i<l) && (info=nodeInfo[i]); i++) {\n        let node = nodes[i] = findTemplateNode(dom, info);\n        applyIdToMap(this, dom.$, node, info);\n        applyTemplateInfo(this, node, info, templateInfo);\n        applyEventListener(this, node, info);\n      }\n      dom = /** @type {!StampedTemplate} */(dom); // eslint-disable-line no-self-assign\n      return dom;\n    }\n\n    /**\n     * Adds an event listener by method name for the event provided.\n     *\n     * This method generates a handler function that looks up the method\n     * name at handling time.\n     *\n     * @param {!EventTarget} node Node to add listener on\n     * @param {string} eventName Name of event\n     * @param {string} methodName Name of method\n     * @param {*=} context Context the method will be called on (defaults\n     *   to `node`)\n     * @return {Function} Generated handler function\n     * @override\n     */\n    _addMethodEventListenerToNode(node, eventName, methodName, context) {\n      context = context || node;\n      let handler = createNodeEventHandler(context, eventName, methodName);\n      this._addEventListenerToNode(node, eventName, handler);\n      return handler;\n    }\n\n    /**\n     * Override point for adding custom or simulated event handling.\n     *\n     * @param {!EventTarget} node Node to add event listener to\n     * @param {string} eventName Name of event\n     * @param {function(!Event):void} handler Listener function to add\n     * @return {void}\n     * @override\n     */\n    _addEventListenerToNode(node, eventName, handler) {\n      node.addEventListener(eventName, handler);\n    }\n\n    /**\n     * Override point for adding custom or simulated event handling.\n     *\n     * @param {!EventTarget} node Node to remove event listener from\n     * @param {string} eventName Name of event\n     * @param {function(!Event):void} handler Listener function to remove\n     * @return {void}\n     * @override\n     */\n    _removeEventListenerFromNode(node, eventName, handler) {\n      node.removeEventListener(eventName, handler);\n    }\n\n  }\n\n  return TemplateStamp;\n\n});\n","/**\n * @fileoverview\n * @suppress {checkPrototypalTypes}\n * @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n * at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n * be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n * Google as part of the polymer project is also subject to an additional IP\n * rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport '../utils/boot.js';\nimport { wrap } from '../utils/wrap.js';\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { root, isAncestor, isDescendant, get, translate, isPath, set, normalize } from '../utils/path.js';\n/* for notify, reflect */\nimport { camelToDashCase, dashToCamelCase } from '../utils/case-map.js';\nimport { PropertyAccessors } from './property-accessors.js';\n/* for annotated effects */\nimport { TemplateStamp } from './template-stamp.js';\nimport { sanitizeDOMValue, legacyUndefined, orderedComputed, removeNestedTemplates, fastDomIf } from '../utils/settings.js';\n\n// Monotonically increasing unique ID used for de-duping effects triggered\n// from multiple properties in the same turn\nlet dedupeId = 0;\n\nconst NOOP = [];\n\n/**\n * Property effect types; effects are stored on the prototype using these keys\n * @enum {string}\n */\nconst TYPES = {\n  COMPUTE: '__computeEffects',\n  REFLECT: '__reflectEffects',\n  NOTIFY: '__notifyEffects',\n  PROPAGATE: '__propagateEffects',\n  OBSERVE: '__observeEffects',\n  READ_ONLY: '__readOnly'\n};\n\nconst COMPUTE_INFO = '__computeInfo';\n\n/** @const {!RegExp} */\nconst capitalAttributeRegex = /[A-Z]/;\n\n/**\n * @typedef {{\n * name: (string | undefined),\n * structured: (boolean | undefined),\n * wildcard: (boolean | undefined)\n * }}\n */\nlet DataTrigger; //eslint-disable-line no-unused-vars\n\n/**\n * @typedef {{\n * info: ?,\n * trigger: (!DataTrigger | undefined),\n * fn: (!Function | undefined)\n * }}\n */\nlet DataEffect; //eslint-disable-line no-unused-vars\n\n/**\n * Ensures that the model has an own-property map of effects for the given type.\n * The model may be a prototype or an instance.\n *\n * Property effects are stored as arrays of effects by property in a map,\n * by named type on the model. e.g.\n *\n *   __computeEffects: {\n *     foo: [ ... ],\n *     bar: [ ... ]\n *   }\n *\n * If the model does not yet have an effect map for the type, one is created\n * and returned.  If it does, but it is not an own property (i.e. the\n * prototype had effects), the the map is deeply cloned and the copy is\n * set on the model and returned, ready for new effects to be added.\n *\n * @param {Object} model Prototype or instance\n * @param {string} type Property effect type\n * @param {boolean=} cloneArrays Clone any arrays assigned to the map when\n *   extending a superclass map onto this subclass\n * @return {Object} The own-property map of effects for the given type\n * @private\n */\nfunction ensureOwnEffectMap(model, type, cloneArrays) {\n  let effects = model[type];\n  if (!effects) {\n    effects = model[type] = {};\n  } else if (!model.hasOwnProperty(type)) {\n    effects = model[type] = Object.create(model[type]);\n    if (cloneArrays) {\n      for (let p in effects) {\n        let protoFx = effects[p];\n        // Perf optimization over Array.slice\n        let instFx = effects[p] = Array(protoFx.length);\n        for (let i=0; i<protoFx.length; i++) {\n          instFx[i] = protoFx[i];\n        }\n      }\n    }\n  }\n  return effects;\n}\n\n// -- effects ----------------------------------------------\n\n/**\n * Runs all effects of a given type for the given set of property changes\n * on an instance.\n *\n * @param {!Polymer_PropertyEffects} inst The instance with effects to run\n * @param {?Object} effects Object map of property-to-Array of effects\n * @param {?Object} props Bag of current property changes\n * @param {?Object=} oldProps Bag of previous values for changed properties\n * @param {boolean=} hasPaths True with `props` contains one or more paths\n * @param {*=} extraArgs Additional metadata to pass to effect function\n * @return {boolean} True if an effect ran for this property\n * @private\n */\nfunction runEffects(inst, effects, props, oldProps, hasPaths, extraArgs) {\n  if (effects) {\n    let ran = false;\n    const id = dedupeId++;\n    for (let prop in props) {\n      // Inline `runEffectsForProperty` for perf.\n      let rootProperty = hasPaths ? root(prop) : prop;\n      let fxs = effects[rootProperty];\n      if (fxs) {\n        for (let i=0, l=fxs.length, fx; (i<l) && (fx=fxs[i]); i++) {\n          if ((!fx.info || fx.info.lastRun !== id) &&\n              (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {\n            if (fx.info) {\n              fx.info.lastRun = id;\n            }\n            fx.fn(inst, prop, props, oldProps, fx.info, hasPaths, extraArgs);\n            ran = true;\n          }\n        }\n      }\n    }\n    return ran;\n  }\n  return false;\n}\n\n/**\n * Runs a list of effects for a given property.\n *\n * @param {!Polymer_PropertyEffects} inst The instance with effects to run\n * @param {!Object} effects Object map of property-to-Array of effects\n * @param {number} dedupeId Counter used for de-duping effects\n * @param {string} prop Name of changed property\n * @param {*} props Changed properties\n * @param {*} oldProps Old properties\n * @param {boolean=} hasPaths True with `props` contains one or more paths\n * @param {*=} extraArgs Additional metadata to pass to effect function\n * @return {boolean} True if an effect ran for this property\n * @private\n */\nfunction runEffectsForProperty(inst, effects, dedupeId, prop, props, oldProps, hasPaths, extraArgs) {\n  let ran = false;\n  let rootProperty = hasPaths ? root(prop) : prop;\n  let fxs = effects[rootProperty];\n  if (fxs) {\n    for (let i=0, l=fxs.length, fx; (i<l) && (fx=fxs[i]); i++) {\n      if ((!fx.info || fx.info.lastRun !== dedupeId) &&\n          (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {\n        if (fx.info) {\n          fx.info.lastRun = dedupeId;\n        }\n        fx.fn(inst, prop, props, oldProps, fx.info, hasPaths, extraArgs);\n        ran = true;\n      }\n    }\n  }\n  return ran;\n}\n\n/**\n * Determines whether a property/path that has changed matches the trigger\n * criteria for an effect.  A trigger is a descriptor with the following\n * structure, which matches the descriptors returned from `parseArg`.\n * e.g. for `foo.bar.*`:\n * ```\n * trigger: {\n *   name: 'a.b',\n *   structured: true,\n *   wildcard: true\n * }\n * ```\n * If no trigger is given, the path is deemed to match.\n *\n * @param {string} path Path or property that changed\n * @param {?DataTrigger} trigger Descriptor\n * @return {boolean} Whether the path matched the trigger\n */\nfunction pathMatchesTrigger(path, trigger) {\n  if (trigger) {\n    let triggerPath = /** @type {string} */ (trigger.name);\n    return (triggerPath == path) ||\n        !!(trigger.structured && isAncestor(triggerPath, path)) ||\n        !!(trigger.wildcard && isDescendant(triggerPath, path));\n  } else {\n    return true;\n  }\n}\n\n/**\n * Implements the \"observer\" effect.\n *\n * Calls the method with `info.methodName` on the instance, passing the\n * new and old values.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} property Name of property\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @return {void}\n * @private\n */\nfunction runObserverEffect(inst, property, props, oldProps, info) {\n  let fn = typeof info.method === \"string\" ? inst[info.method] : info.method;\n  let changedProp = info.property;\n  if (fn) {\n    fn.call(inst, inst.__data[changedProp], oldProps[changedProp]);\n  } else if (!info.dynamicFn) {\n    console.warn('observer method `' + info.method + '` not defined');\n  }\n}\n\n/**\n * Runs \"notify\" effects for a set of changed properties.\n *\n * This method differs from the generic `runEffects` method in that it\n * will dispatch path notification events in the case that the property\n * changed was a path and the root property for that path didn't have a\n * \"notify\" effect.  This is to maintain 1.0 behavior that did not require\n * `notify: true` to ensure object sub-property notifications were\n * sent.\n *\n * @param {!Polymer_PropertyEffects} inst The instance with effects to run\n * @param {Object} notifyProps Bag of properties to notify\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {boolean} hasPaths True with `props` contains one or more paths\n * @return {void}\n * @private\n */\nfunction runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {\n  // Notify\n  let fxs = inst[TYPES.NOTIFY];\n  let notified;\n  let id = dedupeId++;\n  // Try normal notify effects; if none, fall back to try path notification\n  for (let prop in notifyProps) {\n    if (notifyProps[prop]) {\n      if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {\n        notified = true;\n      } else if (hasPaths && notifyPath(inst, prop, props)) {\n        notified = true;\n      }\n    }\n  }\n  // Flush host if we actually notified and host was batching\n  // And the host has already initialized clients; this prevents\n  // an issue with a host observing data changes before clients are ready.\n  let host;\n  if (notified && (host = inst.__dataHost) && host._invalidateProperties) {\n    host._invalidateProperties();\n  }\n}\n\n/**\n * Dispatches {property}-changed events with path information in the detail\n * object to indicate a sub-path of the property was changed.\n *\n * @param {!Polymer_PropertyEffects} inst The element from which to fire the\n *     event\n * @param {string} path The path that was changed\n * @param {Object} props Bag of current property changes\n * @return {boolean} Returns true if the path was notified\n * @private\n */\nfunction notifyPath(inst, path, props) {\n  let rootProperty = root(path);\n  if (rootProperty !== path) {\n    let eventName = camelToDashCase(rootProperty) + '-changed';\n    dispatchNotifyEvent(inst, eventName, props[path], path);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Dispatches {property}-changed events to indicate a property (or path)\n * changed.\n *\n * @param {!Polymer_PropertyEffects} inst The element from which to fire the\n *     event\n * @param {string} eventName The name of the event to send\n *     ('{property}-changed')\n * @param {*} value The value of the changed property\n * @param {string | null | undefined} path If a sub-path of this property\n *     changed, the path that changed (optional).\n * @return {void}\n * @private\n * @suppress {invalidCasts}\n */\nfunction dispatchNotifyEvent(inst, eventName, value, path) {\n  let detail = {\n    value: value,\n    queueProperty: true\n  };\n  if (path) {\n    detail.path = path;\n  }\n  // As a performance optimization, we could elide the wrap here since notifying\n  // events are non-bubbling and shouldn't need retargeting. However, a very\n  // small number of internal tests failed in obscure ways, which may indicate\n  // user code relied on timing differences resulting from ShadyDOM flushing\n  // as a result of the wrapped `dispatchEvent`.\n  wrap(/** @type {!HTMLElement} */(inst)).dispatchEvent(new CustomEvent(eventName, { detail }));\n}\n\n/**\n * Implements the \"notify\" effect.\n *\n * Dispatches a non-bubbling event named `info.eventName` on the instance\n * with a detail object containing the new `value`.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} property Name of property\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @param {boolean} hasPaths True with `props` contains one or more paths\n * @return {void}\n * @private\n */\nfunction runNotifyEffect(inst, property, props, oldProps, info, hasPaths) {\n  let rootProperty = hasPaths ? root(property) : property;\n  let path = rootProperty != property ? property : null;\n  let value = path ? get(inst, path) : inst.__data[property];\n  if (path && value === undefined) {\n    value = props[property];  // specifically for .splices\n  }\n  dispatchNotifyEvent(inst, info.eventName, value, path);\n}\n\n/**\n * Handler function for 2-way notification events. Receives context\n * information captured in the `addNotifyListener` closure from the\n * `__notifyListeners` metadata.\n *\n * Sets the value of the notified property to the host property or path.  If\n * the event contained path information, translate that path to the host\n * scope's name for that path first.\n *\n * @param {CustomEvent} event Notification event (e.g. '<property>-changed')\n * @param {!Polymer_PropertyEffects} inst Host element instance handling the\n *     notification event\n * @param {string} fromProp Child element property that was bound\n * @param {string} toPath Host property/path that was bound\n * @param {boolean} negate Whether the binding was negated\n * @return {void}\n * @private\n */\nfunction handleNotification(event, inst, fromProp, toPath, negate) {\n  let value;\n  let detail = /** @type {Object} */(event.detail);\n  let fromPath = detail && detail.path;\n  if (fromPath) {\n    toPath = translate(fromProp, toPath, fromPath);\n    value = detail && detail.value;\n  } else {\n    value = event.currentTarget[fromProp];\n  }\n  value = negate ? !value : value;\n  if (!inst[TYPES.READ_ONLY] || !inst[TYPES.READ_ONLY][toPath]) {\n    if (inst._setPendingPropertyOrPath(toPath, value, true, Boolean(fromPath))\n      && (!detail || !detail.queueProperty)) {\n      inst._invalidateProperties();\n    }\n  }\n}\n\n/**\n * Implements the \"reflect\" effect.\n *\n * Sets the attribute named `info.attrName` to the given property value.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} property Name of property\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @return {void}\n * @private\n */\nfunction runReflectEffect(inst, property, props, oldProps, info) {\n  let value = inst.__data[property];\n  if (sanitizeDOMValue) {\n    value = sanitizeDOMValue(value, info.attrName, 'attribute', /** @type {Node} */(inst));\n  }\n  inst._propertyToAttribute(property, info.attrName, value);\n}\n\n/**\n * Runs \"computed\" effects for a set of changed properties.\n *\n * This method differs from the generic `runEffects` method in that it\n * continues to run computed effects based on the output of each pass until\n * there are no more newly computed properties.  This ensures that all\n * properties that will be computed by the initial set of changes are\n * computed before other effects (binding propagation, observers, and notify)\n * run.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {?Object} changedProps Bag of changed properties\n * @param {?Object} oldProps Bag of previous values for changed properties\n * @param {boolean} hasPaths True with `props` contains one or more paths\n * @return {void}\n * @private\n */\nfunction runComputedEffects(inst, changedProps, oldProps, hasPaths) {\n  let computeEffects = inst[TYPES.COMPUTE];\n  if (computeEffects) {\n    if (orderedComputed) {\n      // Runs computed effects in efficient order by keeping a topologically-\n      // sorted queue of compute effects to run, and inserting subsequently\n      // invalidated effects as they are run\n      dedupeId++;\n      const order = getComputedOrder(inst);\n      const queue = [];\n      for (let p in changedProps) {\n        enqueueEffectsFor(p, computeEffects, queue, order, hasPaths);\n      }\n      let info;\n      while ((info = queue.shift())) {\n        if (runComputedEffect(inst, '', changedProps, oldProps, info)) {\n          enqueueEffectsFor(info.methodInfo, computeEffects, queue, order, hasPaths);\n        }\n      }\n      Object.assign(/** @type {!Object} */ (oldProps), inst.__dataOld);\n      Object.assign(/** @type {!Object} */ (changedProps), inst.__dataPending);\n      inst.__dataPending = null;\n    } else {\n      // Original Polymer 2.x computed effects order, which continues running\n      // effects until no further computed properties have been invalidated\n      let inputProps = changedProps;\n      while (runEffects(inst, computeEffects, inputProps, oldProps, hasPaths)) {\n        Object.assign(/** @type {!Object} */ (oldProps), inst.__dataOld);\n        Object.assign(/** @type {!Object} */ (changedProps), inst.__dataPending);\n        inputProps = inst.__dataPending;\n        inst.__dataPending = null;\n      }\n    }\n  }\n}\n\n/**\n * Inserts a computed effect into a queue, given the specified order. Performs\n * the insert using a binary search.\n *\n * Used by `orderedComputed: true` computed property algorithm.\n *\n * @param {Object} info Property effects metadata\n * @param {Array<Object>} queue Ordered queue of effects\n * @param {Map<string,number>} order Map of computed property name->topological\n *   sort order\n */\nconst insertEffect = (info, queue, order) => {\n  let start = 0;\n  let end = queue.length - 1;\n  let idx = -1;\n  while (start <= end) {\n    const mid = (start + end) >> 1;\n    // Note `methodInfo` is where the computed property name is stored in\n    // the effect metadata\n    const cmp = order.get(queue[mid].methodInfo) - order.get(info.methodInfo);\n    if (cmp < 0) {\n      start = mid + 1;\n    } else if (cmp > 0) {\n      end = mid - 1;\n    } else {\n      idx = mid;\n      break;\n    }\n  }\n  if (idx < 0) {\n    idx = end + 1;\n  }\n  queue.splice(idx, 0, info);\n};\n\n/**\n * Inserts all downstream computed effects invalidated by the specified property\n * into the topologically-sorted queue of effects to be run.\n *\n * Used by `orderedComputed: true` computed property algorithm.\n *\n * @param {string} prop Property name\n * @param {Object} computeEffects Computed effects for this element\n * @param {Array<Object>} queue Topologically-sorted queue of computed effects\n *   to be run\n * @param {Map<string,number>} order Map of computed property name->topological\n *   sort order\n * @param {boolean} hasPaths True with `changedProps` contains one or more paths\n */\nconst enqueueEffectsFor = (prop, computeEffects, queue, order, hasPaths) => {\n  const rootProperty = hasPaths ? root(prop) : prop;\n  const fxs = computeEffects[rootProperty];\n  if (fxs) {\n    for (let i=0; i<fxs.length; i++) {\n      const fx = fxs[i];\n      if ((fx.info.lastRun !== dedupeId) &&\n          (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {\n        fx.info.lastRun = dedupeId;\n        insertEffect(fx.info, queue, order);\n      }\n    }\n  }\n};\n\n/**\n * Generates and retrieves a memoized map of computed property name to its\n * topologically-sorted order.\n *\n * The map is generated by first assigning a \"dependency count\" to each property\n * (defined as number properties it depends on, including its method for\n * \"dynamic functions\"). Any properties that have no dependencies are added to\n * the `ready` queue, which are properties whose order can be added to the final\n * order map. Properties are popped off the `ready` queue one by one and a.) added as\n * the next property in the order map, and b.) each property that it is a\n * dependency for has its dep count decremented (and if that property's dep\n * count goes to zero, it is added to the `ready` queue), until all properties\n * have been visited and ordered.\n *\n * Used by `orderedComputed: true` computed property algorithm.\n *\n * @param {!Polymer_PropertyEffects} inst The instance to retrieve the computed\n *   effect order for.\n * @return {Map<string,number>} Map of computed property name->topological sort\n *   order\n */\nfunction getComputedOrder(inst) {\n  let ordered = inst.constructor.__orderedComputedDeps;\n  if (!ordered) {\n    ordered = new Map();\n    const effects = inst[TYPES.COMPUTE];\n    let {counts, ready, total} = dependencyCounts(inst);\n    let curr;\n    while ((curr = ready.shift())) {\n      ordered.set(curr, ordered.size);\n      const computedByCurr = effects[curr];\n      if (computedByCurr) {\n        computedByCurr.forEach(fx => {\n          // Note `methodInfo` is where the computed property name is stored\n          const computedProp = fx.info.methodInfo;\n          --total;\n          if (--counts[computedProp] === 0) {\n            ready.push(computedProp);\n          }\n        });\n      }\n    }\n    if (total !== 0) {\n      const el = /** @type {HTMLElement} */ (inst);\n      console.warn(`Computed graph for ${el.localName} incomplete; circular?`);\n    }\n    inst.constructor.__orderedComputedDeps = ordered;\n  }\n  return ordered;\n}\n\n/**\n * Generates a map of property-to-dependency count (`counts`, where \"dependency\n * count\" is the number of dependencies a given property has assuming it is a\n * computed property, otherwise 0).  It also returns a pre-populated list of\n * `ready` properties that have no dependencies and a `total` count, which is\n * used for error-checking the graph.\n *\n * Used by `orderedComputed: true` computed property algorithm.\n *\n * @param {!Polymer_PropertyEffects} inst The instance to generate dependency\n *   counts for.\n * @return {!Object} Object containing `counts` map (property-to-dependency\n *   count) and pre-populated `ready` array of properties that had zero\n *   dependencies.\n */\nfunction dependencyCounts(inst) {\n  const infoForComputed = inst[COMPUTE_INFO];\n  const counts = {};\n  const computedDeps = inst[TYPES.COMPUTE];\n  const ready = [];\n  let total = 0;\n  // Count dependencies for each computed property\n  for (let p in infoForComputed) {\n    const info = infoForComputed[p];\n    // Be sure to add the method name itself in case of \"dynamic functions\"\n    total += counts[p] =\n      info.args.filter(a => !a.literal).length + (info.dynamicFn ? 1 : 0);\n  }\n  // Build list of ready properties (that aren't themselves computed)\n  for (let p in computedDeps) {\n    if (!infoForComputed[p]) {\n      ready.push(p);\n    }\n  }\n  return {counts, ready, total};\n}\n\n/**\n * Implements the \"computed property\" effect by running the method with the\n * values of the arguments specified in the `info` object and setting the\n * return value to the computed property specified.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} property Name of property\n * @param {?Object} changedProps Bag of current property changes\n * @param {?Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @return {boolean} True when the property being computed changed\n * @private\n */\nfunction runComputedEffect(inst, property, changedProps, oldProps, info) {\n  // Dirty check dependencies and run if any invalid\n  let result = runMethodEffect(inst, property, changedProps, oldProps, info);\n  // Abort if method returns a no-op result\n  if (result === NOOP) {\n    return false;\n  }\n  let computedProp = info.methodInfo;\n  if (inst.__dataHasAccessor && inst.__dataHasAccessor[computedProp]) {\n    return inst._setPendingProperty(computedProp, result, true);\n  } else {\n    inst[computedProp] = result;\n    return false;\n  }\n}\n\n/**\n * Computes path changes based on path links set up using the `linkPaths`\n * API.\n *\n * @param {!Polymer_PropertyEffects} inst The instance whose props are changing\n * @param {string} path Path that has changed\n * @param {*} value Value of changed path\n * @return {void}\n * @private\n */\nfunction computeLinkedPaths(inst, path, value) {\n  let links = inst.__dataLinkedPaths;\n  if (links) {\n    let link;\n    for (let a in links) {\n      let b = links[a];\n      if (isDescendant(a, path)) {\n        link = translate(a, b, path);\n        inst._setPendingPropertyOrPath(link, value, true, true);\n      } else if (isDescendant(b, path)) {\n        link = translate(b, a, path);\n        inst._setPendingPropertyOrPath(link, value, true, true);\n      }\n    }\n  }\n}\n\n// -- bindings ----------------------------------------------\n\n/**\n * Adds binding metadata to the current `nodeInfo`, and binding effects\n * for all part dependencies to `templateInfo`.\n *\n * @param {Function} constructor Class that `_parseTemplate` is currently\n *   running on\n * @param {TemplateInfo} templateInfo Template metadata for current template\n * @param {NodeInfo} nodeInfo Node metadata for current template node\n * @param {string} kind Binding kind, either 'property', 'attribute', or 'text'\n * @param {string} target Target property name\n * @param {!Array<!BindingPart>} parts Array of binding part metadata\n * @param {string=} literal Literal text surrounding binding parts (specified\n *   only for 'property' bindings, since these must be initialized as part\n *   of boot-up)\n * @return {void}\n * @private\n */\nfunction addBinding(constructor, templateInfo, nodeInfo, kind, target, parts, literal) {\n  // Create binding metadata and add to nodeInfo\n  nodeInfo.bindings = nodeInfo.bindings || [];\n  let /** Binding */ binding = { kind, target, parts, literal, isCompound: (parts.length !== 1) };\n  nodeInfo.bindings.push(binding);\n  // Add listener info to binding metadata\n  if (shouldAddListener(binding)) {\n    let {event, negate} = binding.parts[0];\n    binding.listenerEvent = event || (camelToDashCase(target) + '-changed');\n    binding.listenerNegate = negate;\n  }\n  // Add \"propagate\" property effects to templateInfo\n  let index = templateInfo.nodeInfoList.length;\n  for (let i=0; i<binding.parts.length; i++) {\n    let part = binding.parts[i];\n    part.compoundIndex = i;\n    addEffectForBindingPart(constructor, templateInfo, binding, part, index);\n  }\n}\n\n/**\n * Adds property effects to the given `templateInfo` for the given binding\n * part.\n *\n * @param {Function} constructor Class that `_parseTemplate` is currently\n *   running on\n * @param {TemplateInfo} templateInfo Template metadata for current template\n * @param {!Binding} binding Binding metadata\n * @param {!BindingPart} part Binding part metadata\n * @param {number} index Index into `nodeInfoList` for this node\n * @return {void}\n */\nfunction addEffectForBindingPart(constructor, templateInfo, binding, part, index) {\n  if (!part.literal) {\n    if (binding.kind === 'attribute' && binding.target[0] === '-') {\n      console.warn('Cannot set attribute ' + binding.target +\n        ' because \"-\" is not a valid attribute starting character');\n    } else {\n      let dependencies = part.dependencies;\n      let info = { index, binding, part, evaluator: constructor };\n      for (let j=0; j<dependencies.length; j++) {\n        let trigger = dependencies[j];\n        if (typeof trigger == 'string') {\n          trigger = parseArg(trigger);\n          trigger.wildcard = true;\n        }\n        constructor._addTemplatePropertyEffect(templateInfo, trigger.rootProperty, {\n          fn: runBindingEffect,\n          info, trigger\n        });\n      }\n    }\n  }\n}\n\n/**\n * Implements the \"binding\" (property/path binding) effect.\n *\n * Note that binding syntax is overridable via `_parseBindings` and\n * `_evaluateBinding`.  This method will call `_evaluateBinding` for any\n * non-literal parts returned from `_parseBindings`.  However,\n * there is no support for _path_ bindings via custom binding parts,\n * as this is specific to Polymer's path binding syntax.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} path Name of property\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @param {boolean} hasPaths True with `props` contains one or more paths\n * @param {Array} nodeList List of nodes associated with `nodeInfoList` template\n *   metadata\n * @return {void}\n * @private\n */\nfunction runBindingEffect(inst, path, props, oldProps, info, hasPaths, nodeList) {\n  let node = nodeList[info.index];\n  let binding = info.binding;\n  let part = info.part;\n  // Subpath notification: transform path and set to client\n  // e.g.: foo=\"{{obj.sub}}\", path: 'obj.sub.prop', set 'foo.prop'=obj.sub.prop\n  if (hasPaths && part.source && (path.length > part.source.length) &&\n      (binding.kind == 'property') && !binding.isCompound &&\n      node.__isPropertyEffectsClient &&\n      node.__dataHasAccessor && node.__dataHasAccessor[binding.target]) {\n    let value = props[path];\n    path = translate(part.source, binding.target, path);\n    if (node._setPendingPropertyOrPath(path, value, false, true)) {\n      inst._enqueueClient(node);\n    }\n  } else {\n    let value = info.evaluator._evaluateBinding(inst, part, path, props, oldProps, hasPaths);\n    // Propagate value to child\n    // Abort if value is a no-op result\n    if (value !== NOOP) {\n      applyBindingValue(inst, node, binding, part, value);\n    }\n  }\n}\n\n/**\n * Sets the value for an \"binding\" (binding) effect to a node,\n * either as a property or attribute.\n *\n * @param {!Polymer_PropertyEffects} inst The instance owning the binding effect\n * @param {Node} node Target node for binding\n * @param {!Binding} binding Binding metadata\n * @param {!BindingPart} part Binding part metadata\n * @param {*} value Value to set\n * @return {void}\n * @private\n */\nfunction applyBindingValue(inst, node, binding, part, value) {\n  value = computeBindingValue(node, value, binding, part);\n  if (sanitizeDOMValue) {\n    value = sanitizeDOMValue(value, binding.target, binding.kind, node);\n  }\n  if (binding.kind == 'attribute') {\n    // Attribute binding\n    inst._valueToNodeAttribute(/** @type {Element} */(node), value, binding.target);\n  } else {\n    // Property binding\n    let prop = binding.target;\n    if (node.__isPropertyEffectsClient &&\n        node.__dataHasAccessor && node.__dataHasAccessor[prop]) {\n      if (!node[TYPES.READ_ONLY] || !node[TYPES.READ_ONLY][prop]) {\n        if (node._setPendingProperty(prop, value)) {\n          inst._enqueueClient(node);\n        }\n      }\n    } else {\n      // In legacy no-batching mode, bindings applied before dataReady are\n      // equivalent to the \"apply config\" phase, which only set managed props\n      inst._setUnmanagedPropertyToNode(node, prop, value);\n    }\n  }\n}\n\n/**\n * Transforms an \"binding\" effect value based on compound & negation\n * effect metadata, as well as handling for special-case properties\n *\n * @param {Node} node Node the value will be set to\n * @param {*} value Value to set\n * @param {!Binding} binding Binding metadata\n * @param {!BindingPart} part Binding part metadata\n * @return {*} Transformed value to set\n * @private\n */\nfunction computeBindingValue(node, value, binding, part) {\n  if (binding.isCompound) {\n    let storage = node.__dataCompoundStorage[binding.target];\n    storage[part.compoundIndex] = value;\n    value = storage.join('');\n  }\n  if (binding.kind !== 'attribute') {\n    // Some browsers serialize `undefined` to `\"undefined\"`\n    if (binding.target === 'textContent' ||\n        (binding.target === 'value' &&\n          (node.localName === 'input' || node.localName === 'textarea'))) {\n      value = value == undefined ? '' : value;\n    }\n  }\n  return value;\n}\n\n/**\n * Returns true if a binding's metadata meets all the requirements to allow\n * 2-way binding, and therefore a `<property>-changed` event listener should be\n * added:\n * - used curly braces\n * - is a property (not attribute) binding\n * - is not a textContent binding\n * - is not compound\n *\n * @param {!Binding} binding Binding metadata\n * @return {boolean} True if 2-way listener should be added\n * @private\n */\nfunction shouldAddListener(binding) {\n  return Boolean(binding.target) &&\n         binding.kind != 'attribute' &&\n         binding.kind != 'text' &&\n         !binding.isCompound &&\n         binding.parts[0].mode === '{';\n}\n\n/**\n * Setup compound binding storage structures, notify listeners, and dataHost\n * references onto the bound nodeList.\n *\n * @param {!Polymer_PropertyEffects} inst Instance that bas been previously\n *     bound\n * @param {TemplateInfo} templateInfo Template metadata\n * @return {void}\n * @private\n */\nfunction setupBindings(inst, templateInfo) {\n  // Setup compound storage, dataHost, and notify listeners\n  let {nodeList, nodeInfoList} = templateInfo;\n  if (nodeInfoList.length) {\n    for (let i=0; i < nodeInfoList.length; i++) {\n      let info = nodeInfoList[i];\n      let node = nodeList[i];\n      let bindings = info.bindings;\n      if (bindings) {\n        for (let i=0; i<bindings.length; i++) {\n          let binding = bindings[i];\n          setupCompoundStorage(node, binding);\n          addNotifyListener(node, inst, binding);\n        }\n      }\n      // This ensures all bound elements have a host set, regardless\n      // of whether they upgrade synchronous to creation\n      node.__dataHost = inst;\n    }\n  }\n}\n\n/**\n * Initializes `__dataCompoundStorage` local storage on a bound node with\n * initial literal data for compound bindings, and sets the joined\n * literal parts to the bound property.\n *\n * When changes to compound parts occur, they are first set into the compound\n * storage array for that property, and then the array is joined to result in\n * the final value set to the property/attribute.\n *\n * @param {Node} node Bound node to initialize\n * @param {Binding} binding Binding metadata\n * @return {void}\n * @private\n */\nfunction setupCompoundStorage(node, binding) {\n  if (binding.isCompound) {\n    // Create compound storage map\n    let storage = node.__dataCompoundStorage ||\n      (node.__dataCompoundStorage = {});\n    let parts = binding.parts;\n    // Copy literals from parts into storage for this binding\n    let literals = new Array(parts.length);\n    for (let j=0; j<parts.length; j++) {\n      literals[j] = parts[j].literal;\n    }\n    let target = binding.target;\n    storage[target] = literals;\n    // Configure properties with their literal parts\n    if (binding.literal && binding.kind == 'property') {\n      // Note, className needs style scoping so this needs wrapping.\n      // We may also want to consider doing this for `textContent` and\n      // `innerHTML`.\n      if (target === 'className') {\n        node = wrap(node);\n      }\n      node[target] = binding.literal;\n    }\n  }\n}\n\n/**\n * Adds a 2-way binding notification event listener to the node specified\n *\n * @param {Object} node Child element to add listener to\n * @param {!Polymer_PropertyEffects} inst Host element instance to handle\n *     notification event\n * @param {Binding} binding Binding metadata\n * @return {void}\n * @private\n */\nfunction addNotifyListener(node, inst, binding) {\n  if (binding.listenerEvent) {\n    let part = binding.parts[0];\n    node.addEventListener(binding.listenerEvent, function(e) {\n      handleNotification(e, inst, binding.target, part.source, part.negate);\n    });\n  }\n}\n\n// -- for method-based effects (complexObserver & computed) --------------\n\n/**\n * Adds property effects for each argument in the method signature (and\n * optionally, for the method name if `dynamic` is true) that calls the\n * provided effect function.\n *\n * @param {Element | Object} model Prototype or instance\n * @param {!MethodSignature} sig Method signature metadata\n * @param {string} type Type of property effect to add\n * @param {Function} effectFn Function to run when arguments change\n * @param {*=} methodInfo Effect-specific information to be included in\n *   method effect metadata\n * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether\n *   method names should be included as a dependency to the effect. Note,\n *   defaults to true if the signature is static (sig.static is true).\n * @return {!Object} Effect metadata for this method effect\n * @private\n */\nfunction createMethodEffect(model, sig, type, effectFn, methodInfo, dynamicFn) {\n  dynamicFn = sig.static || (dynamicFn &&\n    (typeof dynamicFn !== 'object' || dynamicFn[sig.methodName]));\n  let info = {\n    methodName: sig.methodName,\n    args: sig.args,\n    methodInfo,\n    dynamicFn\n  };\n  for (let i=0, arg; (i<sig.args.length) && (arg=sig.args[i]); i++) {\n    if (!arg.literal) {\n      model._addPropertyEffect(arg.rootProperty, type, {\n        fn: effectFn, info: info, trigger: arg\n      });\n    }\n  }\n  if (dynamicFn) {\n    model._addPropertyEffect(sig.methodName, type, {\n      fn: effectFn, info: info\n    });\n  }\n  return info;\n}\n\n/**\n * Calls a method with arguments marshaled from properties on the instance\n * based on the method signature contained in the effect metadata.\n *\n * Multi-property observers, computed properties, and inline computing\n * functions call this function to invoke the method, then use the return\n * value accordingly.\n *\n * @param {!Polymer_PropertyEffects} inst The instance the effect will be run on\n * @param {string} property Name of property\n * @param {Object} props Bag of current property changes\n * @param {Object} oldProps Bag of previous values for changed properties\n * @param {?} info Effect metadata\n * @return {*} Returns the return value from the method invocation\n * @private\n */\nfunction runMethodEffect(inst, property, props, oldProps, info) {\n  // Instances can optionally have a _methodHost which allows redirecting where\n  // to find methods. Currently used by `templatize`.\n  let context = inst._methodHost || inst;\n  let fn = context[info.methodName];\n  if (fn) {\n    let args = inst._marshalArgs(info.args, property, props);\n    return args === NOOP ? NOOP : fn.apply(context, args);\n  } else if (!info.dynamicFn) {\n    console.warn('method `' + info.methodName + '` not defined');\n  }\n}\n\nconst emptyArray = [];\n\n// Regular expressions used for binding\nconst IDENT  = '(?:' + '[a-zA-Z_$][\\\\w.:$\\\\-*]*' + ')';\nconst NUMBER = '(?:' + '[-+]?[0-9]*\\\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')';\nconst SQUOTE_STRING = '(?:' + '\\'(?:[^\\'\\\\\\\\]|\\\\\\\\.)*\\'' + ')';\nconst DQUOTE_STRING = '(?:' + '\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\"' + ')';\nconst STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')';\nconst ARGUMENT = '(?:(' + IDENT + '|' + NUMBER + '|' +  STRING + ')\\\\s*' + ')';\nconst ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\\\s*' + ARGUMENT + ')*' + ')';\nconst ARGUMENT_LIST = '(?:' + '\\\\(\\\\s*' +\n                              '(?:' + ARGUMENTS + '?' + ')' +\n                            '\\\\)\\\\s*' + ')';\nconst BINDING = '(' + IDENT + '\\\\s*' + ARGUMENT_LIST + '?' + ')'; // Group 3\nconst OPEN_BRACKET = '(\\\\[\\\\[|{{)' + '\\\\s*';\nconst CLOSE_BRACKET = '(?:]]|}})';\nconst NEGATE = '(?:(!)\\\\s*)?'; // Group 2\nconst EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET;\nconst bindingRegex = new RegExp(EXPRESSION, \"g\");\n\n/**\n * Create a string from binding parts of all the literal parts\n *\n * @param {!Array<BindingPart>} parts All parts to stringify\n * @return {string} String made from the literal parts\n */\nfunction literalFromParts(parts) {\n  let s = '';\n  for (let i=0; i<parts.length; i++) {\n    let literal = parts[i].literal;\n    s += literal || '';\n  }\n  return s;\n}\n\n/**\n * Parses an expression string for a method signature, and returns a metadata\n * describing the method in terms of `methodName`, `static` (whether all the\n * arguments are literals), and an array of `args`\n *\n * @param {string} expression The expression to parse\n * @return {?MethodSignature} The method metadata object if a method expression was\n *   found, otherwise `undefined`\n * @private\n */\nfunction parseMethod(expression) {\n  // tries to match valid javascript property names\n  let m = expression.match(/([^\\s]+?)\\(([\\s\\S]*)\\)/);\n  if (m) {\n    let methodName = m[1];\n    let sig = { methodName, static: true, args: emptyArray };\n    if (m[2].trim()) {\n      // replace escaped commas with comma entity, split on un-escaped commas\n      let args = m[2].replace(/\\\\,/g, '&comma;').split(',');\n      return parseArgs(args, sig);\n    } else {\n      return sig;\n    }\n  }\n  return null;\n}\n\n/**\n * Parses an array of arguments and sets the `args` property of the supplied\n * signature metadata object. Sets the `static` property to false if any\n * argument is a non-literal.\n *\n * @param {!Array<string>} argList Array of argument names\n * @param {!MethodSignature} sig Method signature metadata object\n * @return {!MethodSignature} The updated signature metadata object\n * @private\n */\nfunction parseArgs(argList, sig) {\n  sig.args = argList.map(function(rawArg) {\n    let arg = parseArg(rawArg);\n    if (!arg.literal) {\n      sig.static = false;\n    }\n    return arg;\n  }, this);\n  return sig;\n}\n\n/**\n * Parses an individual argument, and returns an argument metadata object\n * with the following fields:\n *\n *   {\n *     value: 'prop',        // property/path or literal value\n *     literal: false,       // whether argument is a literal\n *     structured: false,    // whether the property is a path\n *     rootProperty: 'prop', // the root property of the path\n *     wildcard: false       // whether the argument was a wildcard '.*' path\n *   }\n *\n * @param {string} rawArg The string value of the argument\n * @return {!MethodArg} Argument metadata object\n * @private\n */\nfunction parseArg(rawArg) {\n  // clean up whitespace\n  let arg = rawArg.trim()\n    // replace comma entity with comma\n    .replace(/&comma;/g, ',')\n    // repair extra escape sequences; note only commas strictly need\n    // escaping, but we allow any other char to be escaped since its\n    // likely users will do this\n    .replace(/\\\\(.)/g, '$1')\n    ;\n  // basic argument descriptor\n  let a = {\n    name: arg,\n    value: '',\n    literal: false\n  };\n  // detect literal value (must be String or Number)\n  let fc = arg[0];\n  if (fc === '-') {\n    fc = arg[1];\n  }\n  if (fc >= '0' && fc <= '9') {\n    fc = '#';\n  }\n  switch(fc) {\n    case \"'\":\n    case '\"':\n      a.value = arg.slice(1, -1);\n      a.literal = true;\n      break;\n    case '#':\n      a.value = Number(arg);\n      a.literal = true;\n      break;\n  }\n  // if not literal, look for structured path\n  if (!a.literal) {\n    a.rootProperty = root(arg);\n    // detect structured path (has dots)\n    a.structured = isPath(arg);\n    if (a.structured) {\n      a.wildcard = (arg.slice(-2) == '.*');\n      if (a.wildcard) {\n        a.name = arg.slice(0, -2);\n      }\n    }\n  }\n  return a;\n}\n\nfunction getArgValue(data, props, path) {\n  let value = get(data, path);\n  // when data is not stored e.g. `splices`, get the value from changedProps\n  // TODO(kschaaf): Note, this can cause a rare issue where the wildcard\n  // info.value could pull a stale value out of changedProps during a reentrant\n  // change that sets the value back to undefined.\n  // https://github.com/Polymer/polymer/issues/5479\n  if (value === undefined) {\n    value = props[path];\n  }\n  return value;\n}\n\n// data api\n\n/**\n * Sends array splice notifications (`.splices` and `.length`)\n *\n * Note: this implementation only accepts normalized paths\n *\n * @param {!Polymer_PropertyEffects} inst Instance to send notifications to\n * @param {Array} array The array the mutations occurred on\n * @param {string} path The path to the array that was mutated\n * @param {Array} splices Array of splice records\n * @return {void}\n * @private\n */\nfunction notifySplices(inst, array, path, splices) {\n  const splicesData = { indexSplices: splices };\n  // Legacy behavior stored splices in `__data__` so it was *not* ephemeral.\n  // To match this behavior, we store splices directly on the array.\n  if (legacyUndefined && !inst._overrideLegacyUndefined) {\n    array.splices = splicesData;\n  }\n  inst.notifyPath(path + '.splices', splicesData);\n  inst.notifyPath(path + '.length', array.length);\n  // Clear splice data only when it's stored on the array.\n  if (legacyUndefined && !inst._overrideLegacyUndefined) {\n    splicesData.indexSplices = [];\n  }\n}\n\n/**\n * Creates a splice record and sends an array splice notification for\n * the described mutation\n *\n * Note: this implementation only accepts normalized paths\n *\n * @param {!Polymer_PropertyEffects} inst Instance to send notifications to\n * @param {Array} array The array the mutations occurred on\n * @param {string} path The path to the array that was mutated\n * @param {number} index Index at which the array mutation occurred\n * @param {number} addedCount Number of added items\n * @param {Array} removed Array of removed items\n * @return {void}\n * @private\n */\nfunction notifySplice(inst, array, path, index, addedCount, removed) {\n  notifySplices(inst, array, path, [{\n    index: index,\n    addedCount: addedCount,\n    removed: removed,\n    object: array,\n    type: 'splice'\n  }]);\n}\n\n/**\n * Returns an upper-cased version of the string.\n *\n * @param {string} name String to uppercase\n * @return {string} Uppercased string\n * @private\n */\nfunction upper(name) {\n  return name[0].toUpperCase() + name.substring(1);\n}\n\n/**\n * Element class mixin that provides meta-programming for Polymer's template\n * binding and data observation (collectively, \"property effects\") system.\n *\n * This mixin uses provides the following key static methods for adding\n * property effects to an element class:\n * - `addPropertyEffect`\n * - `createPropertyObserver`\n * - `createMethodObserver`\n * - `createNotifyingProperty`\n * - `createReadOnlyProperty`\n * - `createReflectedProperty`\n * - `createComputedProperty`\n * - `bindTemplate`\n *\n * Each method creates one or more property accessors, along with metadata\n * used by this mixin's implementation of `_propertiesChanged` to perform\n * the property effects.\n *\n * Underscored versions of the above methods also exist on the element\n * prototype for adding property effects on instances at runtime.\n *\n * Note that this mixin overrides several `PropertyAccessors` methods, in\n * many cases to maintain guarantees provided by the Polymer 1.x features;\n * notably it changes property accessors to be synchronous by default\n * whereas the default when using `PropertyAccessors` standalone is to be\n * async by default.\n *\n * @mixinFunction\n * @polymer\n * @appliesMixin TemplateStamp\n * @appliesMixin PropertyAccessors\n * @summary Element class mixin that provides meta-programming for Polymer's\n * template binding and data observation system.\n */\nexport const PropertyEffects = dedupingMixin(superClass => {\n\n  /**\n   * @constructor\n   * @implements {Polymer_PropertyAccessors}\n   * @implements {Polymer_TemplateStamp}\n   * @unrestricted\n   * @private\n   */\n  const propertyEffectsBase = TemplateStamp(PropertyAccessors(superClass));\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_PropertyEffects}\n   * @extends {propertyEffectsBase}\n   * @unrestricted\n   */\n  class PropertyEffects extends propertyEffectsBase {\n\n    constructor() {\n      super();\n      /** @type {boolean} */\n      // Used to identify users of this mixin, ala instanceof\n      this.__isPropertyEffectsClient = true;\n      /** @type {boolean} */\n      this.__dataClientsReady;\n      /** @type {Array} */\n      this.__dataPendingClients;\n      /** @type {Object} */\n      this.__dataToNotify;\n      /** @type {Object} */\n      this.__dataLinkedPaths;\n      /** @type {boolean} */\n      this.__dataHasPaths;\n      /** @type {Object} */\n      this.__dataCompoundStorage;\n      /** @type {Polymer_PropertyEffects} */\n      this.__dataHost;\n      /** @type {!Object} */\n      this.__dataTemp;\n      /** @type {boolean} */\n      this.__dataClientsInitialized;\n      /** @type {!Object} */\n      this.__data;\n      /** @type {!Object|null} */\n      this.__dataPending;\n      /** @type {!Object} */\n      this.__dataOld;\n      /** @type {Object} */\n      this.__computeEffects;\n      /** @type {Object} */\n      this.__computeInfo;\n      /** @type {Object} */\n      this.__reflectEffects;\n      /** @type {Object} */\n      this.__notifyEffects;\n      /** @type {Object} */\n      this.__propagateEffects;\n      /** @type {Object} */\n      this.__observeEffects;\n      /** @type {Object} */\n      this.__readOnly;\n      /** @type {!TemplateInfo} */\n      this.__templateInfo;\n      /** @type {boolean} */\n      this._overrideLegacyUndefined;\n    }\n\n    get PROPERTY_EFFECT_TYPES() {\n      return TYPES;\n    }\n\n    /**\n     * @override\n     * @return {void}\n     */\n    _initializeProperties() {\n      super._initializeProperties();\n      this._registerHost();\n      this.__dataClientsReady = false;\n      this.__dataPendingClients = null;\n      this.__dataToNotify = null;\n      this.__dataLinkedPaths = null;\n      this.__dataHasPaths = false;\n      // May be set on instance prior to upgrade\n      this.__dataCompoundStorage = this.__dataCompoundStorage || null;\n      this.__dataHost = this.__dataHost || null;\n      this.__dataTemp = {};\n      this.__dataClientsInitialized = false;\n    }\n\n    _registerHost() {\n      if (hostStack.length) {\n        let host = hostStack[hostStack.length-1];\n        host._enqueueClient(this);\n        // This ensures even non-bound elements have a host set, as\n        // long as they upgrade synchronously\n        this.__dataHost = host;\n      }\n    }\n\n    /**\n     * Overrides `PropertyAccessors` implementation to provide a\n     * more efficient implementation of initializing properties from\n     * the prototype on the instance.\n     *\n     * @override\n     * @param {Object} props Properties to initialize on the prototype\n     * @return {void}\n     */\n    _initializeProtoProperties(props) {\n      this.__data = Object.create(props);\n      this.__dataPending = Object.create(props);\n      this.__dataOld = {};\n    }\n\n    /**\n     * Overrides `PropertyAccessors` implementation to avoid setting\n     * `_setProperty`'s `shouldNotify: true`.\n     *\n     * @override\n     * @param {Object} props Properties to initialize on the instance\n     * @return {void}\n     */\n    _initializeInstanceProperties(props) {\n      let readOnly = this[TYPES.READ_ONLY];\n      for (let prop in props) {\n        if (!readOnly || !readOnly[prop]) {\n          this.__dataPending = this.__dataPending || {};\n          this.__dataOld = this.__dataOld || {};\n          this.__data[prop] = this.__dataPending[prop] = props[prop];\n        }\n      }\n    }\n\n    // Prototype setup ----------------------------------------\n\n    /**\n     * Equivalent to static `addPropertyEffect` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Property that should trigger the effect\n     * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES\n     * @param {Object=} effect Effect metadata object\n     * @return {void}\n     * @protected\n     */\n    _addPropertyEffect(property, type, effect) {\n      this._createPropertyAccessor(property, type == TYPES.READ_ONLY);\n      // effects are accumulated into arrays per property based on type\n      let effects = ensureOwnEffectMap(this, type, true)[property];\n      if (!effects) {\n        effects = this[type][property] = [];\n      }\n      effects.push(effect);\n    }\n\n    /**\n     * Removes the given property effect.\n     *\n     * @override\n     * @param {string} property Property the effect was associated with\n     * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES\n     * @param {Object=} effect Effect metadata object to remove\n     * @return {void}\n     */\n    _removePropertyEffect(property, type, effect) {\n      let effects = ensureOwnEffectMap(this, type, true)[property];\n      let idx = effects.indexOf(effect);\n      if (idx >= 0) {\n        effects.splice(idx, 1);\n      }\n    }\n\n    /**\n     * Returns whether the current prototype/instance has a property effect\n     * of a certain type.\n     *\n     * @override\n     * @param {string} property Property name\n     * @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES\n     * @return {boolean} True if the prototype/instance has an effect of this\n     *     type\n     * @protected\n     */\n    _hasPropertyEffect(property, type) {\n      let effects = this[type];\n      return Boolean(effects && effects[property]);\n    }\n\n    /**\n     * Returns whether the current prototype/instance has a \"read only\"\n     * accessor for the given property.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {boolean} True if the prototype/instance has an effect of this\n     *     type\n     * @protected\n     */\n    _hasReadOnlyEffect(property) {\n      return this._hasPropertyEffect(property, TYPES.READ_ONLY);\n    }\n\n    /**\n     * Returns whether the current prototype/instance has a \"notify\"\n     * property effect for the given property.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {boolean} True if the prototype/instance has an effect of this\n     *     type\n     * @protected\n     */\n    _hasNotifyEffect(property) {\n      return this._hasPropertyEffect(property, TYPES.NOTIFY);\n    }\n\n    /**\n     * Returns whether the current prototype/instance has a \"reflect to\n     * attribute\" property effect for the given property.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {boolean} True if the prototype/instance has an effect of this\n     *     type\n     * @protected\n     */\n    _hasReflectEffect(property) {\n      return this._hasPropertyEffect(property, TYPES.REFLECT);\n    }\n\n    /**\n     * Returns whether the current prototype/instance has a \"computed\"\n     * property effect for the given property.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {boolean} True if the prototype/instance has an effect of this\n     *     type\n     * @protected\n     */\n    _hasComputedEffect(property) {\n      return this._hasPropertyEffect(property, TYPES.COMPUTE);\n    }\n\n    // Runtime ----------------------------------------\n\n    /**\n     * Sets a pending property or path.  If the root property of the path in\n     * question had no accessor, the path is set, otherwise it is enqueued\n     * via `_setPendingProperty`.\n     *\n     * This function isolates relatively expensive functionality necessary\n     * for the public API (`set`, `setProperties`, `notifyPath`, and property\n     * change listeners via {{...}} bindings), such that it is only done\n     * when paths enter the system, and not at every propagation step.  It\n     * also sets a `__dataHasPaths` flag on the instance which is used to\n     * fast-path slower path-matching code in the property effects host paths.\n     *\n     * `path` can be a path string or array of path parts as accepted by the\n     * public API.\n     *\n     * @override\n     * @param {string | !Array<number|string>} path Path to set\n     * @param {*} value Value to set\n     * @param {boolean=} shouldNotify Set to true if this change should\n     *  cause a property notification event dispatch\n     * @param {boolean=} isPathNotification If the path being set is a path\n     *   notification of an already changed value, as opposed to a request\n     *   to set and notify the change.  In the latter `false` case, a dirty\n     *   check is performed and then the value is set to the path before\n     *   enqueuing the pending property change.\n     * @return {boolean} Returns true if the property/path was enqueued in\n     *   the pending changes bag.\n     * @protected\n     */\n    _setPendingPropertyOrPath(path, value, shouldNotify, isPathNotification) {\n      if (isPathNotification ||\n          root(Array.isArray(path) ? path[0] : path) !== path) {\n        // Dirty check changes being set to a path against the actual object,\n        // since this is the entry point for paths into the system; from here\n        // the only dirty checks are against the `__dataTemp` cache to prevent\n        // duplicate work in the same turn only. Note, if this was a notification\n        // of a change already set to a path (isPathNotification: true),\n        // we always let the change through and skip the `set` since it was\n        // already dirty checked at the point of entry and the underlying\n        // object has already been updated\n        if (!isPathNotification) {\n          let old = get(this, path);\n          path = /** @type {string} */ (set(this, path, value));\n          // Use property-accessor's simpler dirty check\n          if (!path || !super._shouldPropertyChange(path, value, old)) {\n            return false;\n          }\n        }\n        this.__dataHasPaths = true;\n        if (this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify)) {\n          computeLinkedPaths(this, /**@type{string}*/ (path), value);\n          return true;\n        }\n      } else {\n        if (this.__dataHasAccessor && this.__dataHasAccessor[path]) {\n          return this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify);\n        } else {\n          this[path] = value;\n        }\n      }\n      return false;\n    }\n\n    /**\n     * Applies a value to a non-Polymer element/node's property.\n     *\n     * The implementation makes a best-effort at binding interop:\n     * Some native element properties have side-effects when\n     * re-setting the same value (e.g. setting `<input>.value` resets the\n     * cursor position), so we do a dirty-check before setting the value.\n     * However, for better interop with non-Polymer custom elements that\n     * accept objects, we explicitly re-set object changes coming from the\n     * Polymer world (which may include deep object changes without the\n     * top reference changing), erring on the side of providing more\n     * information.\n     *\n     * Users may override this method to provide alternate approaches.\n     *\n     * @override\n     * @param {!Node} node The node to set a property on\n     * @param {string} prop The property to set\n     * @param {*} value The value to set\n     * @return {void}\n     * @protected\n     */\n    _setUnmanagedPropertyToNode(node, prop, value) {\n      // It is a judgment call that resetting primitives is\n      // \"bad\" and resettings objects is also \"good\"; alternatively we could\n      // implement a whitelist of tag & property values that should never\n      // be reset (e.g. <input>.value && <select>.value)\n      if (value !== node[prop] || typeof value == 'object') {\n        // Note, className needs style scoping so this needs wrapping.\n        if (prop === 'className') {\n          node = /** @type {!Node} */(wrap(node));\n        }\n        node[prop] = value;\n      }\n    }\n\n    /**\n     * Overrides the `PropertiesChanged` implementation to introduce special\n     * dirty check logic depending on the property & value being set:\n     *\n     * 1. Any value set to a path (e.g. 'obj.prop': 42 or 'obj.prop': {...})\n     *    Stored in `__dataTemp`, dirty checked against `__dataTemp`\n     * 2. Object set to simple property (e.g. 'prop': {...})\n     *    Stored in `__dataTemp` and `__data`, dirty checked against\n     *    `__dataTemp` by default implementation of `_shouldPropertyChange`\n     * 3. Primitive value set to simple property (e.g. 'prop': 42)\n     *    Stored in `__data`, dirty checked against `__data`\n     *\n     * The dirty-check is important to prevent cycles due to two-way\n     * notification, but paths and objects are only dirty checked against any\n     * previous value set during this turn via a \"temporary cache\" that is\n     * cleared when the last `_propertiesChanged` exits. This is so:\n     * a. any cached array paths (e.g. 'array.3.prop') may be invalidated\n     *    due to array mutations like shift/unshift/splice; this is fine\n     *    since path changes are dirty-checked at user entry points like `set`\n     * b. dirty-checking for objects only lasts one turn to allow the user\n     *    to mutate the object in-place and re-set it with the same identity\n     *    and have all sub-properties re-propagated in a subsequent turn.\n     *\n     * The temp cache is not necessarily sufficient to prevent invalid array\n     * paths, since a splice can happen during the same turn (with pathological\n     * user code); we could introduce a \"fixup\" for temporarily cached array\n     * paths if needed: https://github.com/Polymer/polymer/issues/4227\n     *\n     * @override\n     * @param {string} property Name of the property\n     * @param {*} value Value to set\n     * @param {boolean=} shouldNotify True if property should fire notification\n     *   event (applies only for `notify: true` properties)\n     * @return {boolean} Returns true if the property changed\n     */\n    _setPendingProperty(property, value, shouldNotify) {\n      let propIsPath = this.__dataHasPaths && isPath(property);\n      let prevProps = propIsPath ? this.__dataTemp : this.__data;\n      if (this._shouldPropertyChange(property, value, prevProps[property])) {\n        if (!this.__dataPending) {\n          this.__dataPending = {};\n          this.__dataOld = {};\n        }\n        // Ensure old is captured from the last turn\n        if (!(property in this.__dataOld)) {\n          this.__dataOld[property] = this.__data[property];\n        }\n        // Paths are stored in temporary cache (cleared at end of turn),\n        // which is used for dirty-checking, all others stored in __data\n        if (propIsPath) {\n          this.__dataTemp[property] = value;\n        } else {\n          this.__data[property] = value;\n        }\n        // All changes go into pending property bag, passed to _propertiesChanged\n        this.__dataPending[property] = value;\n        // Track properties that should notify separately\n        if (propIsPath || (this[TYPES.NOTIFY] && this[TYPES.NOTIFY][property])) {\n          this.__dataToNotify = this.__dataToNotify || {};\n          this.__dataToNotify[property] = shouldNotify;\n        }\n        return true;\n      }\n      return false;\n    }\n\n    /**\n     * Overrides base implementation to ensure all accessors set `shouldNotify`\n     * to true, for per-property notification tracking.\n     *\n     * @override\n     * @param {string} property Name of the property\n     * @param {*} value Value to set\n     * @return {void}\n     */\n    _setProperty(property, value) {\n      if (this._setPendingProperty(property, value, true)) {\n        this._invalidateProperties();\n      }\n    }\n\n    /**\n     * Overrides `PropertyAccessor`'s default async queuing of\n     * `_propertiesChanged`: if `__dataReady` is false (has not yet been\n     * manually flushed), the function no-ops; otherwise flushes\n     * `_propertiesChanged` synchronously.\n     *\n     * @override\n     * @return {void}\n     */\n    _invalidateProperties() {\n      if (this.__dataReady) {\n        this._flushProperties();\n      }\n    }\n\n    /**\n     * Enqueues the given client on a list of pending clients, whose\n     * pending property changes can later be flushed via a call to\n     * `_flushClients`.\n     *\n     * @override\n     * @param {Object} client PropertyEffects client to enqueue\n     * @return {void}\n     * @protected\n     */\n    _enqueueClient(client) {\n      this.__dataPendingClients = this.__dataPendingClients || [];\n      if (client !== this) {\n        this.__dataPendingClients.push(client);\n      }\n    }\n\n    /**\n     * Flushes any clients previously enqueued via `_enqueueClient`, causing\n     * their `_flushProperties` method to run.\n     *\n     * @override\n     * @return {void}\n     * @protected\n     */\n    _flushClients() {\n      if (!this.__dataClientsReady) {\n        this.__dataClientsReady = true;\n        this._readyClients();\n        // Override point where accessors are turned on; importantly,\n        // this is after clients have fully readied, providing a guarantee\n        // that any property effects occur only after all clients are ready.\n        this.__dataReady = true;\n      } else {\n        this.__enableOrFlushClients();\n      }\n    }\n\n    // NOTE: We ensure clients either enable or flush as appropriate. This\n    // handles two corner cases:\n    // (1) clients flush properly when connected/enabled before the host\n    // enables; e.g.\n    //   (a) Templatize stamps with no properties and does not flush and\n    //   (b) the instance is inserted into dom and\n    //   (c) then the instance flushes.\n    // (2) clients enable properly when not connected/enabled when the host\n    // flushes; e.g.\n    //   (a) a template is runtime stamped and not yet connected/enabled\n    //   (b) a host sets a property, causing stamped dom to flush\n    //   (c) the stamped dom enables.\n    __enableOrFlushClients() {\n      let clients = this.__dataPendingClients;\n      if (clients) {\n        this.__dataPendingClients = null;\n        for (let i=0; i < clients.length; i++) {\n          let client = clients[i];\n          if (!client.__dataEnabled) {\n            client._enableProperties();\n          } else if (client.__dataPending) {\n            client._flushProperties();\n          }\n        }\n      }\n    }\n\n    /**\n     * Perform any initial setup on client dom. Called before the first\n     * `_flushProperties` call on client dom and before any element\n     * observers are called.\n     *\n     * @override\n     * @return {void}\n     * @protected\n     */\n    _readyClients() {\n      this.__enableOrFlushClients();\n    }\n\n    /**\n     * Sets a bag of property changes to this instance, and\n     * synchronously processes all effects of the properties as a batch.\n     *\n     * Property names must be simple properties, not paths.  Batched\n     * path propagation is not supported.\n     *\n     * @override\n     * @param {Object} props Bag of one or more key-value pairs whose key is\n     *   a property and value is the new value to set for that property.\n     * @param {boolean=} setReadOnly When true, any private values set in\n     *   `props` will be set. By default, `setProperties` will not set\n     *   `readOnly: true` root properties.\n     * @return {void}\n     * @public\n     */\n    setProperties(props, setReadOnly) {\n      for (let path in props) {\n        if (setReadOnly || !this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][path]) {\n          //TODO(kschaaf): explicitly disallow paths in setProperty?\n          // wildcard observers currently only pass the first changed path\n          // in the `info` object, and you could do some odd things batching\n          // paths, e.g. {'foo.bar': {...}, 'foo': null}\n          this._setPendingPropertyOrPath(path, props[path], true);\n        }\n      }\n      this._invalidateProperties();\n    }\n\n    /**\n     * Overrides `PropertyAccessors` so that property accessor\n     * side effects are not enabled until after client dom is fully ready.\n     * Also calls `_flushClients` callback to ensure client dom is enabled\n     * that was not enabled as a result of flushing properties.\n     *\n     * @override\n     * @return {void}\n     */\n    ready() {\n      // It is important that `super.ready()` is not called here as it\n      // immediately turns on accessors. Instead, we wait until `readyClients`\n      // to enable accessors to provide a guarantee that clients are ready\n      // before processing any accessors side effects.\n      this._flushProperties();\n      // If no data was pending, `_flushProperties` will not `flushClients`\n      // so ensure this is done.\n      if (!this.__dataClientsReady) {\n        this._flushClients();\n      }\n      // Before ready, client notifications do not trigger _flushProperties.\n      // Therefore a flush is necessary here if data has been set.\n      if (this.__dataPending) {\n        this._flushProperties();\n      }\n    }\n\n    /**\n     * Implements `PropertyAccessors`'s properties changed callback.\n     *\n     * Runs each class of effects for the batch of changed properties in\n     * a specific order (compute, propagate, reflect, observe, notify).\n     *\n     * @override\n     * @param {!Object} currentProps Bag of all current accessor values\n     * @param {?Object} changedProps Bag of properties changed since the last\n     *   call to `_propertiesChanged`\n     * @param {?Object} oldProps Bag of previous values for each property\n     *   in `changedProps`\n     * @return {void}\n     */\n    _propertiesChanged(currentProps, changedProps, oldProps) {\n      // ----------------------------\n      // let c = Object.getOwnPropertyNames(changedProps || {});\n      // window.debug && console.group(this.localName + '#' + this.id + ': ' + c);\n      // if (window.debug) { debugger; }\n      // ----------------------------\n      let hasPaths = this.__dataHasPaths;\n      this.__dataHasPaths = false;\n      let notifyProps;\n      // Compute properties\n      runComputedEffects(this, changedProps, oldProps, hasPaths);\n      // Clear notify properties prior to possible reentry (propagate, observe),\n      // but after computing effects have a chance to add to them\n      notifyProps = this.__dataToNotify;\n      this.__dataToNotify = null;\n      // Propagate properties to clients\n      this._propagatePropertyChanges(changedProps, oldProps, hasPaths);\n      // Flush clients\n      this._flushClients();\n      // Reflect properties\n      runEffects(this, this[TYPES.REFLECT], changedProps, oldProps, hasPaths);\n      // Observe properties\n      runEffects(this, this[TYPES.OBSERVE], changedProps, oldProps, hasPaths);\n      // Notify properties to host\n      if (notifyProps) {\n        runNotifyEffects(this, notifyProps, changedProps, oldProps, hasPaths);\n      }\n      // Clear temporary cache at end of turn\n      if (this.__dataCounter == 1) {\n        this.__dataTemp = {};\n      }\n      // ----------------------------\n      // window.debug && console.groupEnd(this.localName + '#' + this.id + ': ' + c);\n      // ----------------------------\n    }\n\n    /**\n     * Called to propagate any property changes to stamped template nodes\n     * managed by this element.\n     *\n     * @override\n     * @param {Object} changedProps Bag of changed properties\n     * @param {Object} oldProps Bag of previous values for changed properties\n     * @param {boolean} hasPaths True with `props` contains one or more paths\n     * @return {void}\n     * @protected\n     */\n    _propagatePropertyChanges(changedProps, oldProps, hasPaths) {\n      if (this[TYPES.PROPAGATE]) {\n        runEffects(this, this[TYPES.PROPAGATE], changedProps, oldProps, hasPaths);\n      }\n      if (this.__templateInfo) {\n        this._runEffectsForTemplate(this.__templateInfo, changedProps, oldProps, hasPaths);\n      }\n    }\n\n    _runEffectsForTemplate(templateInfo, changedProps, oldProps, hasPaths) {\n      const baseRunEffects = (changedProps, hasPaths) => {\n        runEffects(this, templateInfo.propertyEffects, changedProps, oldProps,\n          hasPaths, templateInfo.nodeList);\n        for (let info=templateInfo.firstChild; info; info=info.nextSibling) {\n          this._runEffectsForTemplate(info, changedProps, oldProps, hasPaths);\n        }\n      };\n      if (templateInfo.runEffects) {\n        templateInfo.runEffects(baseRunEffects, changedProps, hasPaths);\n      } else {\n        baseRunEffects(changedProps, hasPaths);\n      }\n    }\n\n    /**\n     * Aliases one data path as another, such that path notifications from one\n     * are routed to the other.\n     *\n     * @override\n     * @param {string | !Array<string|number>} to Target path to link.\n     * @param {string | !Array<string|number>} from Source path to link.\n     * @return {void}\n     * @public\n     */\n    linkPaths(to, from) {\n      to = normalize(to);\n      from = normalize(from);\n      this.__dataLinkedPaths = this.__dataLinkedPaths || {};\n      this.__dataLinkedPaths[to] = from;\n    }\n\n    /**\n     * Removes a data path alias previously established with `_linkPaths`.\n     *\n     * Note, the path to unlink should be the target (`to`) used when\n     * linking the paths.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Target path to unlink.\n     * @return {void}\n     * @public\n     */\n    unlinkPaths(path) {\n      path = normalize(path);\n      if (this.__dataLinkedPaths) {\n        delete this.__dataLinkedPaths[path];\n      }\n    }\n\n    /**\n     * Notify that an array has changed.\n     *\n     * Example:\n     *\n     *     this.items = [ {name: 'Jim'}, {name: 'Todd'}, {name: 'Bill'} ];\n     *     ...\n     *     this.items.splice(1, 1, {name: 'Sam'});\n     *     this.items.push({name: 'Bob'});\n     *     this.notifySplices('items', [\n     *       { index: 1, removed: [{name: 'Todd'}], addedCount: 1,\n     *         object: this.items, type: 'splice' },\n     *       { index: 3, removed: [], addedCount: 1,\n     *         object: this.items, type: 'splice'}\n     *     ]);\n     *\n     * @param {string} path Path that should be notified.\n     * @param {Array} splices Array of splice records indicating ordered\n     *   changes that occurred to the array. Each record should have the\n     *   following fields:\n     *    * index: index at which the change occurred\n     *    * removed: array of items that were removed from this index\n     *    * addedCount: number of new items added at this index\n     *    * object: a reference to the array in question\n     *    * type: the string literal 'splice'\n     *\n     *   Note that splice records _must_ be normalized such that they are\n     *   reported in index order (raw results from `Object.observe` are not\n     *   ordered and must be normalized/merged before notifying).\n     *\n     * @override\n     * @return {void}\n     * @public\n     */\n    notifySplices(path, splices) {\n      let info = {path: ''};\n      let array = /** @type {Array} */(get(this, path, info));\n      notifySplices(this, array, info.path, splices);\n    }\n\n    /**\n     * Convenience method for reading a value from a path.\n     *\n     * Note, if any part in the path is undefined, this method returns\n     * `undefined` (this method does not throw when dereferencing undefined\n     * paths).\n     *\n     * @override\n     * @param {(string|!Array<(string|number)>)} path Path to the value\n     *   to read.  The path may be specified as a string (e.g. `foo.bar.baz`)\n     *   or an array of path parts (e.g. `['foo.bar', 'baz']`).  Note that\n     *   bracketed expressions are not supported; string-based path parts\n     *   *must* be separated by dots.  Note that when dereferencing array\n     *   indices, the index may be used as a dotted part directly\n     *   (e.g. `users.12.name` or `['users', 12, 'name']`).\n     * @param {Object=} root Root object from which the path is evaluated.\n     * @return {*} Value at the path, or `undefined` if any part of the path\n     *   is undefined.\n     * @public\n     */\n    get(path, root) {\n      return get(root || this, path);\n    }\n\n    /**\n     * Convenience method for setting a value to a path and notifying any\n     * elements bound to the same path.\n     *\n     * Note, if any part in the path except for the last is undefined,\n     * this method does nothing (this method does not throw when\n     * dereferencing undefined paths).\n     *\n     * @override\n     * @param {(string|!Array<(string|number)>)} path Path to the value\n     *   to write.  The path may be specified as a string (e.g. `'foo.bar.baz'`)\n     *   or an array of path parts (e.g. `['foo.bar', 'baz']`).  Note that\n     *   bracketed expressions are not supported; string-based path parts\n     *   *must* be separated by dots.  Note that when dereferencing array\n     *   indices, the index may be used as a dotted part directly\n     *   (e.g. `'users.12.name'` or `['users', 12, 'name']`).\n     * @param {*} value Value to set at the specified path.\n     * @param {Object=} root Root object from which the path is evaluated.\n     *   When specified, no notification will occur.\n     * @return {void}\n     * @public\n     */\n    set(path, value, root) {\n      if (root) {\n        set(root, path, value);\n      } else {\n        if (!this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][/** @type {string} */(path)]) {\n          if (this._setPendingPropertyOrPath(path, value, true)) {\n            this._invalidateProperties();\n          }\n        }\n      }\n    }\n\n    /**\n     * Adds items onto the end of the array at the path specified.\n     *\n     * The arguments after `path` and return value match that of\n     * `Array.prototype.push`.\n     *\n     * This method notifies other paths to the same array that a\n     * splice occurred to the array.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Path to array.\n     * @param {...*} items Items to push onto array\n     * @return {number} New length of the array.\n     * @public\n     */\n    push(path, ...items) {\n      let info = {path: ''};\n      let array = /** @type {Array}*/(get(this, path, info));\n      let len = array.length;\n      let ret = array.push(...items);\n      if (items.length) {\n        notifySplice(this, array, info.path, len, items.length, []);\n      }\n      return ret;\n    }\n\n    /**\n     * Removes an item from the end of array at the path specified.\n     *\n     * The arguments after `path` and return value match that of\n     * `Array.prototype.pop`.\n     *\n     * This method notifies other paths to the same array that a\n     * splice occurred to the array.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Path to array.\n     * @return {*} Item that was removed.\n     * @public\n     */\n    pop(path) {\n      let info = {path: ''};\n      let array = /** @type {Array} */(get(this, path, info));\n      let hadLength = Boolean(array.length);\n      let ret = array.pop();\n      if (hadLength) {\n        notifySplice(this, array, info.path, array.length, 0, [ret]);\n      }\n      return ret;\n    }\n\n    /**\n     * Starting from the start index specified, removes 0 or more items\n     * from the array and inserts 0 or more new items in their place.\n     *\n     * The arguments after `path` and return value match that of\n     * `Array.prototype.splice`.\n     *\n     * This method notifies other paths to the same array that a\n     * splice occurred to the array.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Path to array.\n     * @param {number} start Index from which to start removing/inserting.\n     * @param {number=} deleteCount Number of items to remove.\n     * @param {...*} items Items to insert into array.\n     * @return {!Array} Array of removed items.\n     * @public\n     */\n    splice(path, start, deleteCount, ...items) {\n      let info = {path : ''};\n      let array = /** @type {Array} */(get(this, path, info));\n      // Normalize fancy native splice handling of crazy start values\n      if (start < 0) {\n        start = array.length - Math.floor(-start);\n      } else if (start) {\n        start = Math.floor(start);\n      }\n      // array.splice does different things based on the number of arguments\n      // you pass in. Therefore, array.splice(0) and array.splice(0, undefined)\n      // do different things. In the former, the whole array is cleared. In the\n      // latter, no items are removed.\n      // This means that we need to detect whether 1. one of the arguments\n      // is actually passed in and then 2. determine how many arguments\n      // we should pass on to the native array.splice\n      //\n      let ret;\n      // Omit any additional arguments if they were not passed in\n      if (arguments.length === 2) {\n        ret = array.splice(start);\n      // Either start was undefined and the others were defined, but in this\n      // case we can safely pass on all arguments\n      //\n      // Note: this includes the case where none of the arguments were passed in,\n      // e.g. this.splice('array'). However, if both start and deleteCount\n      // are undefined, array.splice will not modify the array (as expected)\n      } else {\n        ret = array.splice(start, deleteCount, ...items);\n      }\n      // At the end, check whether any items were passed in (e.g. insertions)\n      // or if the return array contains items (e.g. deletions).\n      // Only notify if items were added or deleted.\n      if (items.length || ret.length) {\n        notifySplice(this, array, info.path, start, items.length, ret);\n      }\n      return ret;\n    }\n\n    /**\n     * Removes an item from the beginning of array at the path specified.\n     *\n     * The arguments after `path` and return value match that of\n     * `Array.prototype.pop`.\n     *\n     * This method notifies other paths to the same array that a\n     * splice occurred to the array.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Path to array.\n     * @return {*} Item that was removed.\n     * @public\n     */\n    shift(path) {\n      let info = {path: ''};\n      let array = /** @type {Array} */(get(this, path, info));\n      let hadLength = Boolean(array.length);\n      let ret = array.shift();\n      if (hadLength) {\n        notifySplice(this, array, info.path, 0, 0, [ret]);\n      }\n      return ret;\n    }\n\n    /**\n     * Adds items onto the beginning of the array at the path specified.\n     *\n     * The arguments after `path` and return value match that of\n     * `Array.prototype.push`.\n     *\n     * This method notifies other paths to the same array that a\n     * splice occurred to the array.\n     *\n     * @override\n     * @param {string | !Array<string|number>} path Path to array.\n     * @param {...*} items Items to insert info array\n     * @return {number} New length of the array.\n     * @public\n     */\n    unshift(path, ...items) {\n      let info = {path: ''};\n      let array = /** @type {Array} */(get(this, path, info));\n      let ret = array.unshift(...items);\n      if (items.length) {\n        notifySplice(this, array, info.path, 0, items.length, []);\n      }\n      return ret;\n    }\n\n    /**\n     * Notify that a path has changed.\n     *\n     * Example:\n     *\n     *     this.item.user.name = 'Bob';\n     *     this.notifyPath('item.user.name');\n     *\n     * @override\n     * @param {string} path Path that should be notified.\n     * @param {*=} value Value at the path (optional).\n     * @return {void}\n     * @public\n     */\n    notifyPath(path, value) {\n      /** @type {string} */\n      let propPath;\n      if (arguments.length == 1) {\n        // Get value if not supplied\n        let info = {path: ''};\n        value = get(this, path, info);\n        propPath = info.path;\n      } else if (Array.isArray(path)) {\n        // Normalize path if needed\n        propPath = normalize(path);\n      } else {\n        propPath = /** @type{string} */(path);\n      }\n      if (this._setPendingPropertyOrPath(propPath, value, true, true)) {\n        this._invalidateProperties();\n      }\n    }\n\n    /**\n     * Equivalent to static `createReadOnlyProperty` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Property name\n     * @param {boolean=} protectedSetter Creates a custom protected setter\n     *   when `true`.\n     * @return {void}\n     * @protected\n     */\n    _createReadOnlyProperty(property, protectedSetter) {\n      this._addPropertyEffect(property, TYPES.READ_ONLY);\n      if (protectedSetter) {\n        this['_set' + upper(property)] = /** @this {PropertyEffects} */function(value) {\n          this._setProperty(property, value);\n        };\n      }\n    }\n\n    /**\n     * Equivalent to static `createPropertyObserver` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Property name\n     * @param {string|function(*,*)} method Function or name of observer method\n     *     to call\n     * @param {boolean=} dynamicFn Whether the method name should be included as\n     *   a dependency to the effect.\n     * @return {void}\n     * @protected\n     */\n    _createPropertyObserver(property, method, dynamicFn) {\n      let info = { property, method, dynamicFn: Boolean(dynamicFn) };\n      this._addPropertyEffect(property, TYPES.OBSERVE, {\n        fn: runObserverEffect, info, trigger: {name: property}\n      });\n      if (dynamicFn) {\n        this._addPropertyEffect(/** @type {string} */(method), TYPES.OBSERVE, {\n          fn: runObserverEffect, info, trigger: {name: method}\n        });\n      }\n    }\n\n    /**\n     * Equivalent to static `createMethodObserver` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} expression Method expression\n     * @param {boolean|Object=} dynamicFn Boolean or object map indicating\n     *   whether method names should be included as a dependency to the effect.\n     * @return {void}\n     * @protected\n     */\n    _createMethodObserver(expression, dynamicFn) {\n      let sig = parseMethod(expression);\n      if (!sig) {\n        throw new Error(\"Malformed observer expression '\" + expression + \"'\");\n      }\n      createMethodEffect(this, sig, TYPES.OBSERVE, runMethodEffect, null, dynamicFn);\n    }\n\n    /**\n     * Equivalent to static `createNotifyingProperty` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {void}\n     * @protected\n     */\n    _createNotifyingProperty(property) {\n      this._addPropertyEffect(property, TYPES.NOTIFY, {\n        fn: runNotifyEffect,\n        info: {\n          eventName: camelToDashCase(property) + '-changed',\n          property: property\n        }\n      });\n    }\n\n    /**\n     * Equivalent to static `createReflectedProperty` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Property name\n     * @return {void}\n     * @protected\n     * @suppress {missingProperties} go/missingfnprops\n     */\n    _createReflectedProperty(property) {\n      let attr = this.constructor.attributeNameForProperty(property);\n      if (attr[0] === '-') {\n        console.warn('Property ' + property + ' cannot be reflected to attribute ' +\n          attr + ' because \"-\" is not a valid starting attribute name. Use a lowercase first letter for the property instead.');\n      } else {\n        this._addPropertyEffect(property, TYPES.REFLECT, {\n          fn: runReflectEffect,\n          info: {\n            attrName: attr\n          }\n        });\n      }\n    }\n\n    /**\n     * Equivalent to static `createComputedProperty` API but can be called on\n     * an instance to add effects at runtime.  See that method for\n     * full API docs.\n     *\n     * @override\n     * @param {string} property Name of computed property to set\n     * @param {string} expression Method expression\n     * @param {boolean|Object=} dynamicFn Boolean or object map indicating\n     *   whether method names should be included as a dependency to the effect.\n     * @return {void}\n     * @protected\n     */\n    _createComputedProperty(property, expression, dynamicFn) {\n      let sig = parseMethod(expression);\n      if (!sig) {\n        throw new Error(\"Malformed computed expression '\" + expression + \"'\");\n      }\n      const info = createMethodEffect(this, sig, TYPES.COMPUTE, runComputedEffect, property, dynamicFn);\n      // Effects are normally stored as map of dependency->effect, but for\n      // ordered computation, we also need tree of computedProp->dependencies\n      ensureOwnEffectMap(this, COMPUTE_INFO)[property] = info;\n    }\n\n    /**\n     * Gather the argument values for a method specified in the provided array\n     * of argument metadata.\n     *\n     * The `path` and `value` arguments are used to fill in wildcard descriptor\n     * when the method is being called as a result of a path notification.\n     *\n     * @param {!Array<!MethodArg>} args Array of argument metadata\n     * @param {string} path Property/path name that triggered the method effect\n     * @param {Object} props Bag of current property changes\n     * @return {!Array<*>} Array of argument values\n     * @private\n     */\n    _marshalArgs(args, path, props) {\n      const data = this.__data;\n      const values = [];\n      for (let i=0, l=args.length; i<l; i++) {\n        let {name, structured, wildcard, value, literal} = args[i];\n        if (!literal) {\n          if (wildcard) {\n            const matches = isDescendant(name, path);\n            const pathValue = getArgValue(data, props, matches ? path : name);\n            value = {\n              path: matches ? path : name,\n              value: pathValue,\n              base: matches ? get(data, name) : pathValue\n            };\n          } else {\n            value = structured ? getArgValue(data, props, name) : data[name];\n          }\n        }\n        // When the `legacyUndefined` flag is enabled, pass a no-op value\n        // so that the observer, computed property, or compound binding is aborted.\n        if (legacyUndefined && !this._overrideLegacyUndefined && value === undefined && args.length > 1) {\n          return NOOP;\n        }\n        values[i] = value;\n      }\n      return values;\n    }\n\n    // -- static class methods ------------\n\n    /**\n     * Ensures an accessor exists for the specified property, and adds\n     * to a list of \"property effects\" that will run when the accessor for\n     * the specified property is set.  Effects are grouped by \"type\", which\n     * roughly corresponds to a phase in effect processing.  The effect\n     * metadata should be in the following form:\n     *\n     *     {\n     *       fn: effectFunction, // Reference to function to call to perform effect\n     *       info: { ... }       // Effect metadata passed to function\n     *       trigger: {          // Optional triggering metadata; if not provided\n     *         name: string      // the property is treated as a wildcard\n     *         structured: boolean\n     *         wildcard: boolean\n     *       }\n     *     }\n     *\n     * Effects are called from `_propertiesChanged` in the following order by\n     * type:\n     *\n     * 1. COMPUTE\n     * 2. PROPAGATE\n     * 3. REFLECT\n     * 4. OBSERVE\n     * 5. NOTIFY\n     *\n     * Effect functions are called with the following signature:\n     *\n     *     effectFunction(inst, path, props, oldProps, info, hasPaths)\n     *\n     * @param {string} property Property that should trigger the effect\n     * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES\n     * @param {Object=} effect Effect metadata object\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static addPropertyEffect(property, type, effect) {\n      this.prototype._addPropertyEffect(property, type, effect);\n    }\n\n    /**\n     * Creates a single-property observer for the given property.\n     *\n     * @param {string} property Property name\n     * @param {string|function(*,*)} method Function or name of observer method to call\n     * @param {boolean=} dynamicFn Whether the method name should be included as\n     *   a dependency to the effect.\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createPropertyObserver(property, method, dynamicFn) {\n      this.prototype._createPropertyObserver(property, method, dynamicFn);\n    }\n\n    /**\n     * Creates a multi-property \"method observer\" based on the provided\n     * expression, which should be a string in the form of a normal JavaScript\n     * function signature: `'methodName(arg1, [..., argn])'`.  Each argument\n     * should correspond to a property or path in the context of this\n     * prototype (or instance), or may be a literal string or number.\n     *\n     * @param {string} expression Method expression\n     * @param {boolean|Object=} dynamicFn Boolean or object map indicating\n     * @return {void}\n     *   whether method names should be included as a dependency to the effect.\n     * @protected\n     * @nocollapse\n     */\n    static createMethodObserver(expression, dynamicFn) {\n      this.prototype._createMethodObserver(expression, dynamicFn);\n    }\n\n    /**\n     * Causes the setter for the given property to dispatch `<property>-changed`\n     * events to notify of changes to the property.\n     *\n     * @param {string} property Property name\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createNotifyingProperty(property) {\n      this.prototype._createNotifyingProperty(property);\n    }\n\n    /**\n     * Creates a read-only accessor for the given property.\n     *\n     * To set the property, use the protected `_setProperty` API.\n     * To create a custom protected setter (e.g. `_setMyProp()` for\n     * property `myProp`), pass `true` for `protectedSetter`.\n     *\n     * Note, if the property will have other property effects, this method\n     * should be called first, before adding other effects.\n     *\n     * @param {string} property Property name\n     * @param {boolean=} protectedSetter Creates a custom protected setter\n     *   when `true`.\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createReadOnlyProperty(property, protectedSetter) {\n      this.prototype._createReadOnlyProperty(property, protectedSetter);\n    }\n\n    /**\n     * Causes the setter for the given property to reflect the property value\n     * to a (dash-cased) attribute of the same name.\n     *\n     * @param {string} property Property name\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createReflectedProperty(property) {\n      this.prototype._createReflectedProperty(property);\n    }\n\n    /**\n     * Creates a computed property whose value is set to the result of the\n     * method described by the given `expression` each time one or more\n     * arguments to the method changes.  The expression should be a string\n     * in the form of a normal JavaScript function signature:\n     * `'methodName(arg1, [..., argn])'`\n     *\n     * @param {string} property Name of computed property to set\n     * @param {string} expression Method expression\n     * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether\n     *   method names should be included as a dependency to the effect.\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static createComputedProperty(property, expression, dynamicFn) {\n      this.prototype._createComputedProperty(property, expression, dynamicFn);\n    }\n\n    /**\n     * Parses the provided template to ensure binding effects are created\n     * for them, and then ensures property accessors are created for any\n     * dependent properties in the template.  Binding effects for bound\n     * templates are stored in a linked list on the instance so that\n     * templates can be efficiently stamped and unstamped.\n     *\n     * @param {!HTMLTemplateElement} template Template containing binding\n     *   bindings\n     * @return {!TemplateInfo} Template metadata object\n     * @protected\n     * @nocollapse\n     */\n    static bindTemplate(template) {\n      return this.prototype._bindTemplate(template);\n    }\n\n    // -- binding ----------------------------------------------\n\n    /*\n     * Overview of binding flow:\n     *\n     * During finalization (`instanceBinding==false`, `wasPreBound==false`):\n     *  `_bindTemplate(t, false)` called directly during finalization - parses\n     *  the template (for the first time), and then assigns that _prototypical_\n     *  template info to `__preboundTemplateInfo` _on the prototype_; note in\n     *  this case `wasPreBound` is false; this is the first time we're binding\n     *  it, thus we create accessors.\n     *\n     * During first stamping (`instanceBinding==true`, `wasPreBound==true`):\n     *   `_stampTemplate` calls `_bindTemplate(t, true)`: the `templateInfo`\n     *   returned matches the prebound one, and so this is `wasPreBound == true`\n     *   state; thus we _skip_ creating accessors, but _do_ create an instance\n     *   of the template info to serve as the start of our linked list (needs to\n     *   be an instance, not the prototypical one, so that we can add `nodeList`\n     *   to it to contain the `nodeInfo`-ordered list of instance nodes for\n     *   bindings, and so we can chain runtime-stamped template infos off of\n     *   it). At this point, the call to `_stampTemplate` calls\n     *   `applyTemplateInfo` for each nested `<template>` found during parsing\n     *   to hand prototypical `_templateInfo` to them; we also pass the _parent_\n     *   `templateInfo` to the `<template>` so that we have the instance-time\n     *   parent to link the `templateInfo` under in the case it was\n     *   runtime-stamped.\n     *\n     * During subsequent runtime stamping (`instanceBinding==true`,\n     *   `wasPreBound==false`): `_stampTemplate` calls `_bindTemplate(t, true)`\n     *   - here `templateInfo` is guaranteed to _not_ match the prebound one,\n     *   because it was either a different template altogether, or even if it\n     *   was the same template, the step above created a instance of the info;\n     *   in this case `wasPreBound == false`, so we _do_ create accessors, _and_\n     *   link a instance into the linked list.\n     */\n\n    /**\n     * Equivalent to static `bindTemplate` API but can be called on an instance\n     * to add effects at runtime.  See that method for full API docs.\n     *\n     * This method may be called on the prototype (for prototypical template\n     * binding, to avoid creating accessors every instance) once per prototype,\n     * and will be called with `runtimeBinding: true` by `_stampTemplate` to\n     * create and link an instance of the template metadata associated with a\n     * particular stamping.\n     *\n     * @override\n     * @param {!HTMLTemplateElement} template Template containing binding\n     * bindings\n     * @param {boolean=} instanceBinding When false (default), performs\n     * \"prototypical\" binding of the template and overwrites any previously\n     * bound template for the class. When true (as passed from\n     * `_stampTemplate`), the template info is instanced and linked into the\n     * list of bound templates.\n     * @return {!TemplateInfo} Template metadata object; for `runtimeBinding`,\n     * this is an instance of the prototypical template info\n     * @protected\n     * @suppress {missingProperties} go/missingfnprops\n     */\n    _bindTemplate(template, instanceBinding) {\n      let templateInfo = this.constructor._parseTemplate(template);\n      let wasPreBound = this.__preBoundTemplateInfo == templateInfo;\n      // Optimization: since this is called twice for proto-bound templates,\n      // don't attempt to recreate accessors if this template was pre-bound\n      if (!wasPreBound) {\n        for (let prop in templateInfo.propertyEffects) {\n          this._createPropertyAccessor(prop);\n        }\n      }\n      if (instanceBinding) {\n        // For instance-time binding, create instance of template metadata\n        // and link into tree of templates if necessary\n        templateInfo = /** @type {!TemplateInfo} */(Object.create(templateInfo));\n        templateInfo.wasPreBound = wasPreBound;\n        if (!this.__templateInfo) {\n          // Set the info to the root of the tree\n          this.__templateInfo = templateInfo;\n        } else {\n          // Append this template info onto the end of its parent template's\n          // list, which will determine the tree structure via which property\n          // effects are run; if this template was not nested in another\n          // template, use the root template (the first stamped one) as the\n          // parent. Note, `parent` is the `templateInfo` instance for this\n          // template's parent (containing) template, which was set up in\n          // `applyTemplateInfo`.  While a given template's `parent` is set\n          // apriori, it is only added to the parent's child list at the point\n          // that it is being bound, since a template may or may not ever be\n          // stamped, and may be stamped more than once (in which case instances\n          // of the template info will be in the tree under its parent more than\n          // once).\n          const parent = template._parentTemplateInfo || this.__templateInfo;\n          const previous = parent.lastChild;\n          templateInfo.parent = parent;\n          parent.lastChild = templateInfo;\n          templateInfo.previousSibling = previous;\n          if (previous) {\n            previous.nextSibling = templateInfo;\n          } else {\n            parent.firstChild = templateInfo;\n          }\n        }\n      } else {\n        this.__preBoundTemplateInfo = templateInfo;\n      }\n      return templateInfo;\n    }\n\n    /**\n     * Adds a property effect to the given template metadata, which is run\n     * at the \"propagate\" stage of `_propertiesChanged` when the template\n     * has been bound to the element via `_bindTemplate`.\n     *\n     * The `effect` object should match the format in `_addPropertyEffect`.\n     *\n     * @param {Object} templateInfo Template metadata to add effect to\n     * @param {string} prop Property that should trigger the effect\n     * @param {Object=} effect Effect metadata object\n     * @return {void}\n     * @protected\n     * @nocollapse\n     */\n    static _addTemplatePropertyEffect(templateInfo, prop, effect) {\n      let hostProps = templateInfo.hostProps = templateInfo.hostProps || {};\n      hostProps[prop] = true;\n      let effects = templateInfo.propertyEffects = templateInfo.propertyEffects || {};\n      let propEffects = effects[prop] = effects[prop] || [];\n      propEffects.push(effect);\n    }\n\n    /**\n     * Stamps the provided template and performs instance-time setup for\n     * Polymer template features, including data bindings, declarative event\n     * listeners, and the `this.$` map of `id`'s to nodes.  A document fragment\n     * is returned containing the stamped DOM, ready for insertion into the\n     * DOM.\n     *\n     * This method may be called more than once; however note that due to\n     * `shadycss` polyfill limitations, only styles from templates prepared\n     * using `ShadyCSS.prepareTemplate` will be correctly polyfilled (scoped\n     * to the shadow root and support CSS custom properties), and note that\n     * `ShadyCSS.prepareTemplate` may only be called once per element. As such,\n     * any styles required by in runtime-stamped templates must be included\n     * in the main element template.\n     *\n     * @param {!HTMLTemplateElement} template Template to stamp\n     * @param {TemplateInfo=} templateInfo Optional bound template info associated\n     *   with the template to be stamped; if omitted the template will be\n     *   automatically bound.\n     * @return {!StampedTemplate} Cloned template content\n     * @override\n     * @protected\n     */\n    _stampTemplate(template, templateInfo) {\n      templateInfo =  templateInfo || /** @type {!TemplateInfo} */(this._bindTemplate(template, true));\n      // Ensures that created dom is `_enqueueClient`'d to this element so\n      // that it can be flushed on next call to `_flushProperties`\n      hostStack.push(this);\n      let dom = super._stampTemplate(template, templateInfo);\n      hostStack.pop();\n      // Add template-instance-specific data to instanced templateInfo\n      templateInfo.nodeList = dom.nodeList;\n      // Capture child nodes to allow unstamping of non-prototypical templates\n      if (!templateInfo.wasPreBound) {\n        let nodes = templateInfo.childNodes = [];\n        for (let n=dom.firstChild; n; n=n.nextSibling) {\n          nodes.push(n);\n        }\n      }\n      dom.templateInfo = templateInfo;\n      // Setup compound storage, 2-way listeners, and dataHost for bindings\n      setupBindings(this, templateInfo);\n      // Flush properties into template nodes; the check on `__dataClientsReady`\n      // ensures we don't needlessly run effects for an element's initial\n      // prototypical template stamping since they will happen as a part of the\n      // first call to `_propertiesChanged`. This flag is set to true\n      // after running the initial propagate effects, and immediately before\n      // flushing clients. Since downstream clients could cause stamping on\n      // this host (e.g. a fastDomIf `dom-if` being forced to render\n      // synchronously), this flag ensures effects for runtime-stamped templates\n      // are run at this point during the initial element boot-up.\n      if (this.__dataClientsReady) {\n        this._runEffectsForTemplate(templateInfo, this.__data, null, false);\n        this._flushClients();\n      }\n      return dom;\n    }\n\n    /**\n     * Removes and unbinds the nodes previously contained in the provided\n     * DocumentFragment returned from `_stampTemplate`.\n     *\n     * @override\n     * @param {!StampedTemplate} dom DocumentFragment previously returned\n     *   from `_stampTemplate` associated with the nodes to be removed\n     * @return {void}\n     * @protected\n     */\n    _removeBoundDom(dom) {\n      // Unlink template info; Note that while the child is unlinked from its\n      // parent list, a template's `parent` reference is never removed, since\n      // this is is determined by the tree structure and applied at\n      // `applyTemplateInfo` time.\n      const templateInfo = dom.templateInfo;\n      const {previousSibling, nextSibling, parent} = templateInfo;\n      if (previousSibling) {\n        previousSibling.nextSibling = nextSibling;\n      } else if (parent) {\n        parent.firstChild = nextSibling;\n      }\n      if (nextSibling) {\n        nextSibling.previousSibling = previousSibling;\n      } else if (parent) {\n        parent.lastChild = previousSibling;\n      }\n      templateInfo.nextSibling = templateInfo.previousSibling = null;\n      // Remove stamped nodes\n      let nodes = templateInfo.childNodes;\n      for (let i=0; i<nodes.length; i++) {\n        let node = nodes[i];\n        wrap(wrap(node).parentNode).removeChild(node);\n      }\n    }\n\n    /**\n     * Overrides default `TemplateStamp` implementation to add support for\n     * parsing bindings from `TextNode`'s' `textContent`.  A `bindings`\n     * array is added to `nodeInfo` and populated with binding metadata\n     * with information capturing the binding target, and a `parts` array\n     * with one or more metadata objects capturing the source(s) of the\n     * binding.\n     *\n     * @param {Node} node Node to parse\n     * @param {TemplateInfo} templateInfo Template metadata for current template\n     * @param {NodeInfo} nodeInfo Node metadata for current template node\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @protected\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _parseTemplateNode(node, templateInfo, nodeInfo) {\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      let noted = propertyEffectsBase._parseTemplateNode.call(\n        this, node, templateInfo, nodeInfo);\n      if (node.nodeType === Node.TEXT_NODE) {\n        let parts = this._parseBindings(node.textContent, templateInfo);\n        if (parts) {\n          // Initialize the textContent with any literal parts\n          // NOTE: default to a space here so the textNode remains; some browsers\n          // (IE) omit an empty textNode following cloneNode/importNode.\n          node.textContent = literalFromParts(parts) || ' ';\n          addBinding(this, templateInfo, nodeInfo, 'text', 'textContent', parts);\n          noted = true;\n        }\n      }\n      return noted;\n    }\n\n    /**\n     * Overrides default `TemplateStamp` implementation to add support for\n     * parsing bindings from attributes.  A `bindings`\n     * array is added to `nodeInfo` and populated with binding metadata\n     * with information capturing the binding target, and a `parts` array\n     * with one or more metadata objects capturing the source(s) of the\n     * binding.\n     *\n     * @param {Element} node Node to parse\n     * @param {TemplateInfo} templateInfo Template metadata for current template\n     * @param {NodeInfo} nodeInfo Node metadata for current template node\n     * @param {string} name Attribute name\n     * @param {string} value Attribute value\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @protected\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {\n      let parts = this._parseBindings(value, templateInfo);\n      if (parts) {\n        // Attribute or property\n        let origName = name;\n        let kind = 'property';\n        // The only way we see a capital letter here is if the attr has\n        // a capital letter in it per spec. In this case, to make sure\n        // this binding works, we go ahead and make the binding to the attribute.\n        if (capitalAttributeRegex.test(name)) {\n          kind = 'attribute';\n        } else if (name[name.length-1] == '$') {\n          name = name.slice(0, -1);\n          kind = 'attribute';\n        }\n        // Initialize attribute bindings with any literal parts\n        let literal = literalFromParts(parts);\n        if (literal && kind == 'attribute') {\n          // Ensure a ShadyCSS template scoped style is not removed\n          // when a class$ binding's initial literal value is set.\n          if (name == 'class' && node.hasAttribute('class')) {\n            literal += ' ' + node.getAttribute(name);\n          }\n          node.setAttribute(name, literal);\n        }\n        // support disable-upgrade\n        if (kind == 'attribute' && origName == 'disable-upgrade$') {\n          node.setAttribute(name, '');\n        }\n        // Clear attribute before removing, since IE won't allow removing\n        // `value` attribute if it previously had a value (can't\n        // unconditionally set '' before removing since attributes with `$`\n        // can't be set using setAttribute)\n        if (node.localName === 'input' && origName === 'value') {\n          node.setAttribute(origName, '');\n        }\n        // Remove annotation\n        node.removeAttribute(origName);\n        // Case hackery: attributes are lower-case, but bind targets\n        // (properties) are case sensitive. Gambit is to map dash-case to\n        // camel-case: `foo-bar` becomes `fooBar`.\n        // Attribute bindings are excepted.\n        if (kind === 'property') {\n          name = dashToCamelCase(name);\n        }\n        addBinding(this, templateInfo, nodeInfo, kind, name, parts, literal);\n        return true;\n      } else {\n        // TODO(https://github.com/google/closure-compiler/issues/3240):\n        //     Change back to just super.methodCall()\n        return propertyEffectsBase._parseTemplateNodeAttribute.call(\n          this, node, templateInfo, nodeInfo, name, value);\n      }\n    }\n\n    /**\n     * Overrides default `TemplateStamp` implementation to add support for\n     * binding the properties that a nested template depends on to the template\n     * as `_host_<property>`.\n     *\n     * @param {Node} node Node to parse\n     * @param {TemplateInfo} templateInfo Template metadata for current template\n     * @param {NodeInfo} nodeInfo Node metadata for current template node\n     * @return {boolean} `true` if the visited node added node-specific\n     *   metadata to `nodeInfo`\n     * @protected\n     * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do\n     * @nocollapse\n     */\n    static _parseTemplateNestedTemplate(node, templateInfo, nodeInfo) {\n      // TODO(https://github.com/google/closure-compiler/issues/3240):\n      //     Change back to just super.methodCall()\n      let noted = propertyEffectsBase._parseTemplateNestedTemplate.call(\n        this, node, templateInfo, nodeInfo);\n      const parent = node.parentNode;\n      const nestedTemplateInfo = nodeInfo.templateInfo;\n      const isDomIf = parent.localName === 'dom-if';\n      const isDomRepeat = parent.localName === 'dom-repeat';\n      // Remove nested template and redirect its host bindings & templateInfo\n      // onto the parent (dom-if/repeat element)'s nodeInfo\n      if (removeNestedTemplates && (isDomIf || isDomRepeat)) {\n        parent.removeChild(node);\n        // Use the parent's nodeInfo (for the dom-if/repeat) to record the\n        // templateInfo, and use that for any host property bindings below\n        nodeInfo = nodeInfo.parentInfo;\n        nodeInfo.templateInfo = nestedTemplateInfo;\n        // Ensure the parent dom-if/repeat is noted since it now may have host\n        // bindings; it may not have been if it did not have its own bindings\n        nodeInfo.noted = true;\n        noted = false;\n      }\n      // Merge host props into outer template and add bindings\n      let hostProps = nestedTemplateInfo.hostProps;\n      if (fastDomIf && isDomIf) {\n        // `fastDomIf` mode uses runtime-template stamping to add accessors/\n        // effects to properties used in its template; as such we don't need to\n        // tax the host element with `_host_` bindings for the `dom-if`.\n        // However, in the event it is nested in a `dom-repeat`, it is still\n        // important that its host properties are added to the\n        // TemplateInstance's `hostProps` so that they are forwarded to the\n        // TemplateInstance.\n        if (hostProps) {\n          templateInfo.hostProps =\n            Object.assign(templateInfo.hostProps || {}, hostProps);\n          // Ensure the dom-if is noted so that it has a __dataHost, since\n          // `fastDomIf` uses the host for runtime template stamping; note this\n          // was already ensured above in the `removeNestedTemplates` case\n          if (!removeNestedTemplates) {\n            nodeInfo.parentInfo.noted = true;\n          }\n        }\n      } else {\n        let mode = '{';\n        for (let source in hostProps) {\n          let parts = [{ mode, source, dependencies: [source], hostProp: true }];\n          addBinding(this, templateInfo, nodeInfo, 'property', '_host_' + source, parts);\n        }\n      }\n      return noted;\n    }\n\n    /**\n     * Called to parse text in a template (either attribute values or\n     * textContent) into binding metadata.\n     *\n     * Any overrides of this method should return an array of binding part\n     * metadata  representing one or more bindings found in the provided text\n     * and any \"literal\" text in between.  Any non-literal parts will be passed\n     * to `_evaluateBinding` when any dependencies change.  The only required\n     * fields of each \"part\" in the returned array are as follows:\n     *\n     * - `dependencies` - Array containing trigger metadata for each property\n     *   that should trigger the binding to update\n     * - `literal` - String containing text if the part represents a literal;\n     *   in this case no `dependencies` are needed\n     *\n     * Additional metadata for use by `_evaluateBinding` may be provided in\n     * each part object as needed.\n     *\n     * The default implementation handles the following types of bindings\n     * (one or more may be intermixed with literal strings):\n     * - Property binding: `[[prop]]`\n     * - Path binding: `[[object.prop]]`\n     * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`\n     * - Two-way property or path bindings (supports negation):\n     *   `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`\n     * - Inline computed method (supports negation):\n     *   `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`\n     *\n     * The default implementation uses a regular expression for best\n     * performance. However, the regular expression uses a white-list of\n     * allowed characters in a data-binding, which causes problems for\n     * data-bindings that do use characters not in this white-list.\n     *\n     * Instead of updating the white-list with all allowed characters,\n     * there is a StrictBindingParser (see lib/mixins/strict-binding-parser)\n     * that uses a state machine instead. This state machine is able to handle\n     * all characters. However, it is slightly less performant, therefore we\n     * extracted it into a separate optional mixin.\n     *\n     * @param {string} text Text to parse from attribute or textContent\n     * @param {Object} templateInfo Current template metadata\n     * @return {Array<!BindingPart>} Array of binding part metadata\n     * @protected\n     * @nocollapse\n     */\n    static _parseBindings(text, templateInfo) {\n      let parts = [];\n      let lastIndex = 0;\n      let m;\n      // Example: \"literal1{{prop}}literal2[[!compute(foo,bar)]]final\"\n      // Regex matches:\n      //        Iteration 1:  Iteration 2:\n      // m[1]: '{{'          '[['\n      // m[2]: ''            '!'\n      // m[3]: 'prop'        'compute(foo,bar)'\n      while ((m = bindingRegex.exec(text)) !== null) {\n        // Add literal part\n        if (m.index > lastIndex) {\n          parts.push({literal: text.slice(lastIndex, m.index)});\n        }\n        // Add binding part\n        let mode = m[1][0];\n        let negate = Boolean(m[2]);\n        let source = m[3].trim();\n        let customEvent = false, notifyEvent = '', colon = -1;\n        if (mode == '{' && (colon = source.indexOf('::')) > 0) {\n          notifyEvent = source.substring(colon + 2);\n          source = source.substring(0, colon);\n          customEvent = true;\n        }\n        let signature = parseMethod(source);\n        let dependencies = [];\n        if (signature) {\n          // Inline computed function\n          let {args, methodName} = signature;\n          for (let i=0; i<args.length; i++) {\n            let arg = args[i];\n            if (!arg.literal) {\n              dependencies.push(arg);\n            }\n          }\n          let dynamicFns = templateInfo.dynamicFns;\n          if (dynamicFns && dynamicFns[methodName] || signature.static) {\n            dependencies.push(methodName);\n            signature.dynamicFn = true;\n          }\n        } else {\n          // Property or path\n          dependencies.push(source);\n        }\n        parts.push({\n          source, mode, negate, customEvent, signature, dependencies,\n          event: notifyEvent\n        });\n        lastIndex = bindingRegex.lastIndex;\n      }\n      // Add a final literal part\n      if (lastIndex && lastIndex < text.length) {\n        let literal = text.substring(lastIndex);\n        if (literal) {\n          parts.push({\n            literal: literal\n          });\n        }\n      }\n      if (parts.length) {\n        return parts;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Called to evaluate a previously parsed binding part based on a set of\n     * one or more changed dependencies.\n     *\n     * @param {!Polymer_PropertyEffects} inst Element that should be used as\n     *     scope for binding dependencies\n     * @param {BindingPart} part Binding part metadata\n     * @param {string} path Property/path that triggered this effect\n     * @param {Object} props Bag of current property changes\n     * @param {Object} oldProps Bag of previous values for changed properties\n     * @param {boolean} hasPaths True with `props` contains one or more paths\n     * @return {*} Value the binding part evaluated to\n     * @protected\n     * @nocollapse\n     */\n    static _evaluateBinding(inst, part, path, props, oldProps, hasPaths) {\n      let value;\n      if (part.signature) {\n        value = runMethodEffect(inst, path, props, oldProps, part.signature);\n      } else if (path != part.source) {\n        value = get(inst, part.source);\n      } else {\n        if (hasPaths && isPath(path)) {\n          value = get(inst, path);\n        } else {\n          value = inst.__data[path];\n        }\n      }\n      if (part.negate) {\n        value = !value;\n      }\n      return value;\n    }\n\n  }\n\n  return PropertyEffects;\n});\n\n/**\n * Stack for enqueuing client dom created by a host element.\n *\n * By default elements are flushed via `_flushProperties` when\n * `connectedCallback` is called. Elements attach their client dom to\n * themselves at `ready` time which results from this first flush.\n * This provides an ordering guarantee that the client dom an element\n * creates is flushed before the element itself (i.e. client `ready`\n * fires before host `ready`).\n *\n * However, if `_flushProperties` is called *before* an element is connected,\n * as for example `Templatize` does, this ordering guarantee cannot be\n * satisfied because no elements are connected. (Note: Bound elements that\n * receive data do become enqueued clients and are properly ordered but\n * unbound elements are not.)\n *\n * To maintain the desired \"client before host\" ordering guarantee for this\n * case we rely on the \"host stack. Client nodes registers themselves with\n * the creating host element when created. This ensures that all client dom\n * is readied in the proper order, maintaining the desired guarantee.\n *\n * @private\n */\nconst hostStack = [];\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\nfunction newSplice(index, removed, addedCount) {\n  return {\n    index: index,\n    removed: removed,\n    addedCount: addedCount\n  };\n}\n\nconst EDIT_LEAVE = 0;\nconst EDIT_UPDATE = 1;\nconst EDIT_ADD = 2;\nconst EDIT_DELETE = 3;\n\n// Note: This function is *based* on the computation of the Levenshtein\n// \"edit\" distance. The one change is that \"updates\" are treated as two\n// edits - not one. With Array splices, an update is really a delete\n// followed by an add. By retaining this, we optimize for \"keeping\" the\n// maximum array items in the original array. For example:\n//\n//   'xxxx123' -> '123yyyy'\n//\n// With 1-edit updates, the shortest path would be just to update all seven\n// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n// leaves the substring '123' intact.\nfunction calcEditDistances(current, currentStart, currentEnd,\n                            old, oldStart, oldEnd) {\n  // \"Deletion\" columns\n  let rowCount = oldEnd - oldStart + 1;\n  let columnCount = currentEnd - currentStart + 1;\n  let distances = new Array(rowCount);\n\n  // \"Addition\" rows. Initialize null column.\n  for (let i = 0; i < rowCount; i++) {\n    distances[i] = new Array(columnCount);\n    distances[i][0] = i;\n  }\n\n  // Initialize null row\n  for (let j = 0; j < columnCount; j++)\n    distances[0][j] = j;\n\n  for (let i = 1; i < rowCount; i++) {\n    for (let j = 1; j < columnCount; j++) {\n      if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n        distances[i][j] = distances[i - 1][j - 1];\n      else {\n        let north = distances[i - 1][j] + 1;\n        let west = distances[i][j - 1] + 1;\n        distances[i][j] = north < west ? north : west;\n      }\n    }\n  }\n\n  return distances;\n}\n\n// This starts at the final weight, and walks \"backward\" by finding\n// the minimum previous weight recursively until the origin of the weight\n// matrix.\nfunction spliceOperationsFromEditDistances(distances) {\n  let i = distances.length - 1;\n  let j = distances[0].length - 1;\n  let current = distances[i][j];\n  let edits = [];\n  while (i > 0 || j > 0) {\n    if (i == 0) {\n      edits.push(EDIT_ADD);\n      j--;\n      continue;\n    }\n    if (j == 0) {\n      edits.push(EDIT_DELETE);\n      i--;\n      continue;\n    }\n    let northWest = distances[i - 1][j - 1];\n    let west = distances[i - 1][j];\n    let north = distances[i][j - 1];\n\n    let min;\n    if (west < north)\n      min = west < northWest ? west : northWest;\n    else\n      min = north < northWest ? north : northWest;\n\n    if (min == northWest) {\n      if (northWest == current) {\n        edits.push(EDIT_LEAVE);\n      } else {\n        edits.push(EDIT_UPDATE);\n        current = northWest;\n      }\n      i--;\n      j--;\n    } else if (min == west) {\n      edits.push(EDIT_DELETE);\n      i--;\n      current = west;\n    } else {\n      edits.push(EDIT_ADD);\n      j--;\n      current = north;\n    }\n  }\n\n  edits.reverse();\n  return edits;\n}\n\n/**\n * Splice Projection functions:\n *\n * A splice map is a representation of how a previous array of items\n * was transformed into a new array of items. Conceptually it is a list of\n * tuples of\n *\n *   <index, removed, addedCount>\n *\n * which are kept in ascending index order of. The tuple represents that at\n * the |index|, |removed| sequence of items were removed, and counting forward\n * from |index|, |addedCount| items were added.\n */\n\n/**\n * Lacking individual splice mutation information, the minimal set of\n * splices can be synthesized given the previous state and final state of an\n * array. The basic approach is to calculate the edit distance matrix and\n * choose the shortest path through it.\n *\n * Complexity: O(l * p)\n *   l: The length of the current array\n *   p: The length of the old array\n *\n * @param {!Array} current The current \"changed\" array for which to\n * calculate splices.\n * @param {number} currentStart Starting index in the `current` array for\n * which splices are calculated.\n * @param {number} currentEnd Ending index in the `current` array for\n * which splices are calculated.\n * @param {!Array} old The original \"unchanged\" array to compare `current`\n * against to determine splices.\n * @param {number} oldStart Starting index in the `old` array for\n * which splices are calculated.\n * @param {number} oldEnd Ending index in the `old` array for\n * which splices are calculated.\n * @return {!Array} Returns an array of splice record objects. Each of these\n * contains: `index` the location where the splice occurred; `removed`\n * the array of removed items from this location; `addedCount` the number\n * of items added at this location.\n */\nfunction calcSplices(current, currentStart, currentEnd,\n                      old, oldStart, oldEnd) {\n  let prefixCount = 0;\n  let suffixCount = 0;\n  let splice;\n\n  let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n  if (currentStart == 0 && oldStart == 0)\n    prefixCount = sharedPrefix(current, old, minLength);\n\n  if (currentEnd == current.length && oldEnd == old.length)\n    suffixCount = sharedSuffix(current, old, minLength - prefixCount);\n\n  currentStart += prefixCount;\n  oldStart += prefixCount;\n  currentEnd -= suffixCount;\n  oldEnd -= suffixCount;\n\n  if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n    return [];\n\n  if (currentStart == currentEnd) {\n    splice = newSplice(currentStart, [], 0);\n    while (oldStart < oldEnd)\n      splice.removed.push(old[oldStart++]);\n\n    return [ splice ];\n  } else if (oldStart == oldEnd)\n    return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n  let ops = spliceOperationsFromEditDistances(\n      calcEditDistances(current, currentStart, currentEnd,\n                             old, oldStart, oldEnd));\n\n  splice = undefined;\n  let splices = [];\n  let index = currentStart;\n  let oldIndex = oldStart;\n  for (let i = 0; i < ops.length; i++) {\n    switch(ops[i]) {\n      case EDIT_LEAVE:\n        if (splice) {\n          splices.push(splice);\n          splice = undefined;\n        }\n\n        index++;\n        oldIndex++;\n        break;\n      case EDIT_UPDATE:\n        if (!splice)\n          splice = newSplice(index, [], 0);\n\n        splice.addedCount++;\n        index++;\n\n        splice.removed.push(old[oldIndex]);\n        oldIndex++;\n        break;\n      case EDIT_ADD:\n        if (!splice)\n          splice = newSplice(index, [], 0);\n\n        splice.addedCount++;\n        index++;\n        break;\n      case EDIT_DELETE:\n        if (!splice)\n          splice = newSplice(index, [], 0);\n\n        splice.removed.push(old[oldIndex]);\n        oldIndex++;\n        break;\n    }\n  }\n\n  if (splice) {\n    splices.push(splice);\n  }\n  return splices;\n}\n\nfunction sharedPrefix(current, old, searchLength) {\n  for (let i = 0; i < searchLength; i++)\n    if (!equals(current[i], old[i]))\n      return i;\n  return searchLength;\n}\n\nfunction sharedSuffix(current, old, searchLength) {\n  let index1 = current.length;\n  let index2 = old.length;\n  let count = 0;\n  while (count < searchLength && equals(current[--index1], old[--index2]))\n    count++;\n\n  return count;\n}\n\n/**\n * Returns an array of splice records indicating the minimum edits required\n * to transform the `previous` array into the `current` array.\n *\n * Splice records are ordered by index and contain the following fields:\n * - `index`: index where edit started\n * - `removed`: array of removed items from this index\n * - `addedCount`: number of items added at this index\n *\n * This function is based on the Levenshtein \"minimum edit distance\"\n * algorithm. Note that updates are treated as removal followed by addition.\n *\n * The worst-case time complexity of this algorithm is `O(l * p)`\n *   l: The length of the current array\n *   p: The length of the previous array\n *\n * However, the worst-case complexity is reduced by an `O(n)` optimization\n * to detect any shared prefix & suffix between the two arrays and only\n * perform the more expensive minimum edit distance calculation over the\n * non-shared portions of the arrays.\n *\n * @function\n * @param {!Array} current The \"changed\" array for which splices will be\n * calculated.\n * @param {!Array} previous The \"unchanged\" original array to compare\n * `current` against to determine the splices.\n * @return {!Array} Returns an array of splice record objects. Each of these\n * contains: `index` the location where the splice occurred; `removed`\n * the array of removed items from this location; `addedCount` the number\n * of items added at this location.\n */\nexport function calculateSplices(current, previous) {\n  return calcSplices(current, 0, current.length, previous, 0,\n                          previous.length);\n}\n\nfunction equals(currentValue, previousValue) {\n  return currentValue === previousValue;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * @fileoverview\n *\n * This module provides a number of strategies for enqueuing asynchronous\n * tasks. Each sub-module provides a standard `run(fn)` interface that returns a\n * handle, and a `cancel(handle)` interface for canceling async tasks before\n * they run.\n *\n * @summary Module that provides a number of strategies for enqueuing\n * asynchronous tasks.\n */\n\nimport './boot.js';\n\n// Microtask implemented using Mutation Observer\nlet microtaskCurrHandle = 0;\nlet microtaskLastHandle = 0;\nlet microtaskCallbacks = [];\nlet microtaskNodeContent = 0;\nlet microtaskScheduled = false;\nlet microtaskNode = document.createTextNode('');\nnew window.MutationObserver(microtaskFlush).observe(microtaskNode, {characterData: true});\n\nfunction microtaskFlush() {\n  microtaskScheduled = false;\n  const len = microtaskCallbacks.length;\n  for (let i = 0; i < len; i++) {\n    let cb = microtaskCallbacks[i];\n    if (cb) {\n      try {\n        cb();\n      } catch (e) {\n        setTimeout(() => { throw e; });\n      }\n    }\n  }\n  microtaskCallbacks.splice(0, len);\n  microtaskLastHandle += len;\n}\n\n/**\n * Async interface wrapper around `setTimeout`.\n *\n * @namespace\n * @summary Async interface wrapper around `setTimeout`.\n */\nconst timeOut = {\n  /**\n   * Returns a sub-module with the async interface providing the provided\n   * delay.\n   *\n   * @memberof timeOut\n   * @param {number=} delay Time to wait before calling callbacks in ms\n   * @return {!AsyncInterface} An async timeout interface\n   */\n  after(delay) {\n    return {\n      run(fn) { return window.setTimeout(fn, delay); },\n      cancel(handle) {\n        window.clearTimeout(handle);\n      }\n    };\n  },\n  /**\n   * Enqueues a function called in the next task.\n   *\n   * @memberof timeOut\n   * @param {!Function} fn Callback to run\n   * @param {number=} delay Delay in milliseconds\n   * @return {number} Handle used for canceling task\n   */\n  run(fn, delay) {\n    return window.setTimeout(fn, delay);\n  },\n  /**\n   * Cancels a previously enqueued `timeOut` callback.\n   *\n   * @memberof timeOut\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    window.clearTimeout(handle);\n  }\n};\nexport {timeOut};\n\n/**\n * Async interface wrapper around `requestAnimationFrame`.\n *\n * @namespace\n * @summary Async interface wrapper around `requestAnimationFrame`.\n */\nconst animationFrame = {\n  /**\n   * Enqueues a function called at `requestAnimationFrame` timing.\n   *\n   * @memberof animationFrame\n   * @param {function(number):void} fn Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(fn) {\n    return window.requestAnimationFrame(fn);\n  },\n  /**\n   * Cancels a previously enqueued `animationFrame` callback.\n   *\n   * @memberof animationFrame\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    window.cancelAnimationFrame(handle);\n  }\n};\nexport {animationFrame};\n\n/**\n * Async interface wrapper around `requestIdleCallback`.  Falls back to\n * `setTimeout` on browsers that do not support `requestIdleCallback`.\n *\n * @namespace\n * @summary Async interface wrapper around `requestIdleCallback`.\n */\nconst idlePeriod = {\n  /**\n   * Enqueues a function called at `requestIdleCallback` timing.\n   *\n   * @memberof idlePeriod\n   * @param {function(!IdleDeadline):void} fn Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(fn) {\n    return window.requestIdleCallback ?\n      window.requestIdleCallback(fn) :\n      window.setTimeout(fn, 16);\n  },\n  /**\n   * Cancels a previously enqueued `idlePeriod` callback.\n   *\n   * @memberof idlePeriod\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    window.cancelIdleCallback ?\n      window.cancelIdleCallback(handle) :\n      window.clearTimeout(handle);\n  }\n};\nexport {idlePeriod};\n\n/**\n * Async interface for enqueuing callbacks that run at microtask timing.\n *\n * Note that microtask timing is achieved via a single `MutationObserver`,\n * and thus callbacks enqueued with this API will all run in a single\n * batch, and not interleaved with other microtasks such as promises.\n * Promises are avoided as an implementation choice for the time being\n * due to Safari bugs that cause Promises to lack microtask guarantees.\n *\n * @namespace\n * @summary Async interface for enqueuing callbacks that run at microtask\n *   timing.\n */\nconst microTask = {\n\n  /**\n   * Enqueues a function called at microtask timing.\n   *\n   * @memberof microTask\n   * @param {!Function=} callback Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(callback) {\n    if (!microtaskScheduled) {\n      microtaskScheduled = true;\n      microtaskNode.textContent = microtaskNodeContent++;\n    }\n    microtaskCallbacks.push(callback);\n    return microtaskCurrHandle++;\n  },\n\n  /**\n   * Cancels a previously enqueued `microTask` callback.\n   *\n   * @memberof microTask\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    const idx = handle - microtaskLastHandle;\n    if (idx >= 0) {\n      if (!microtaskCallbacks[idx]) {\n        throw new Error('invalid async handle: ' + handle);\n      }\n      microtaskCallbacks[idx] = null;\n    }\n  }\n\n};\nexport {microTask};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/* eslint-disable no-unused-vars */\n/**\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is replaced by the munged name for object[property]\n * We cannot alias this function, so we have to use a small shim that has the same behavior when not compiling.\n *\n * @param {?} prop Property name\n * @param {*} obj Reference object\n * @return {string} Potentially renamed property name\n */\nwindow.JSCompiler_renameProperty = function(prop, obj) {\n  return prop;\n};\n/* eslint-enable */\n\nexport {};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\nconst caseMap = {};\nconst DASH_TO_CAMEL = /-[a-z]/g;\nconst CAMEL_TO_DASH = /([A-Z])/g;\n\n/**\n * @fileoverview Module with utilities for converting between \"dash-case\" and\n * \"camelCase\" identifiers.\n */\n\n/**\n * Converts \"dash-case\" identifier (e.g. `foo-bar-baz`) to \"camelCase\"\n * (e.g. `fooBarBaz`).\n *\n * @param {string} dash Dash-case identifier\n * @return {string} Camel-case representation of the identifier\n */\nexport function dashToCamelCase(dash) {\n  return caseMap[dash] || (\n    caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(DASH_TO_CAMEL,\n      (m) => m[1].toUpperCase()\n    )\n  );\n}\n\n/**\n * Converts \"camelCase\" identifier (e.g. `fooBarBaz`) to \"dash-case\"\n * (e.g. `foo-bar-baz`).\n *\n * @param {string} camel Camel-case identifier\n * @return {string} Dash-case representation of the identifier\n */\nexport function camelToDashCase(camel) {\n  return caseMap[camel] || (\n    caseMap[camel] = camel.replace(CAMEL_TO_DASH, '-$1').toLowerCase()\n  );\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\nimport './mixin.js';\nimport './async.js';\n\n/**\n * @summary Collapse multiple callbacks into one invocation after a timer.\n */\nexport class Debouncer {\n  constructor() {\n    this._asyncModule = null;\n    this._callback = null;\n    this._timer = null;\n  }\n  /**\n   * Sets the scheduler; that is, a module with the Async interface,\n   * a callback and optional arguments to be passed to the run function\n   * from the async module.\n   *\n   * @param {!AsyncInterface} asyncModule Object with Async interface.\n   * @param {function()} callback Callback to run.\n   * @return {void}\n   */\n  setConfig(asyncModule, callback) {\n    this._asyncModule = asyncModule;\n    this._callback = callback;\n    this._timer = this._asyncModule.run(() => {\n      this._timer = null;\n      debouncerQueue.delete(this);\n      this._callback();\n    });\n  }\n  /**\n   * Cancels an active debouncer and returns a reference to itself.\n   *\n   * @return {void}\n   */\n  cancel() {\n    if (this.isActive()) {\n      this._cancelAsync();\n      // Canceling a debouncer removes its spot from the flush queue,\n      // so if a debouncer is manually canceled and re-debounced, it\n      // will reset its flush order (this is a very minor difference from 1.x)\n      // Re-debouncing via the `debounce` API retains the 1.x FIFO flush order\n      debouncerQueue.delete(this);\n    }\n  }\n  /**\n   * Cancels a debouncer's async callback.\n   *\n   * @return {void}\n   */\n  _cancelAsync() {\n    if (this.isActive()) {\n      this._asyncModule.cancel(/** @type {number} */(this._timer));\n      this._timer = null;\n    }\n  }\n  /**\n   * Flushes an active debouncer and returns a reference to itself.\n   *\n   * @return {void}\n   */\n  flush() {\n    if (this.isActive()) {\n      this.cancel();\n      this._callback();\n    }\n  }\n  /**\n   * Returns true if the debouncer is active.\n   *\n   * @return {boolean} True if active.\n   */\n  isActive() {\n    return this._timer != null;\n  }\n  /**\n   * Creates a debouncer if no debouncer is passed as a parameter\n   * or it cancels an active debouncer otherwise. The following\n   * example shows how a debouncer can be called multiple times within a\n   * microtask and \"debounced\" such that the provided callback function is\n   * called once. Add this method to a custom element:\n   *\n   * ```js\n   * import {microTask} from '@polymer/polymer/lib/utils/async.js';\n   * import {Debouncer} from '@polymer/polymer/lib/utils/debounce.js';\n   * // ...\n   *\n   * _debounceWork() {\n   *   this._debounceJob = Debouncer.debounce(this._debounceJob,\n   *       microTask, () => this._doWork());\n   * }\n   * ```\n   *\n   * If the `_debounceWork` method is called multiple times within the same\n   * microtask, the `_doWork` function will be called only once at the next\n   * microtask checkpoint.\n   *\n   * Note: In testing it is often convenient to avoid asynchrony. To accomplish\n   * this with a debouncer, you can use `enqueueDebouncer` and\n   * `flush`. For example, extend the above example by adding\n   * `enqueueDebouncer(this._debounceJob)` at the end of the\n   * `_debounceWork` method. Then in a test, call `flush` to ensure\n   * the debouncer has completed.\n   *\n   * @param {Debouncer?} debouncer Debouncer object.\n   * @param {!AsyncInterface} asyncModule Object with Async interface\n   * @param {function()} callback Callback to run.\n   * @return {!Debouncer} Returns a debouncer object.\n   */\n  static debounce(debouncer, asyncModule, callback) {\n    if (debouncer instanceof Debouncer) {\n      // Cancel the async callback, but leave in debouncerQueue if it was\n      // enqueued, to maintain 1.x flush order\n      debouncer._cancelAsync();\n    } else {\n      debouncer = new Debouncer();\n    }\n    debouncer.setConfig(asyncModule, callback);\n    return debouncer;\n  }\n}\n\nlet debouncerQueue = new Set();\n\n/**\n * Adds a `Debouncer` to a list of globally flushable tasks.\n *\n * @param {!Debouncer} debouncer Debouncer to enqueue\n * @return {void}\n */\nexport const enqueueDebouncer = function(debouncer) {\n  debouncerQueue.add(debouncer);\n};\n\n/**\n * Flushes any enqueued debouncers\n *\n * @return {boolean} Returns whether any debouncers were flushed\n */\nexport const flushDebouncers = function() {\n  const didFlush = Boolean(debouncerQueue.size);\n  // If new debouncers are added while flushing, Set.forEach will ensure\n  // newly added ones are also flushed\n  debouncerQueue.forEach(debouncer => {\n    try {\n      debouncer.flush();\n    } catch(e) {\n      setTimeout(() => {\n        throw e;\n      });\n    }\n  });\n  return didFlush;\n};","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\nimport { calculateSplices } from './array-splice.js';\nimport { microTask } from './async.js';\nimport { wrap } from './wrap.js';\n\n/**\n * Returns true if `node` is a slot element\n * @param {!Node} node Node to test.\n * @return {boolean} Returns true if the given `node` is a slot\n * @private\n */\nfunction isSlot(node) {\n  return (node.localName === 'slot');\n}\n\n/**\n * Class that listens for changes (additions or removals) to\n * \"flattened nodes\" on a given `node`. The list of flattened nodes consists\n * of a node's children and, for any children that are `<slot>` elements,\n * the expanded flattened list of `assignedNodes`.\n * For example, if the observed node has children `<a></a><slot></slot><b></b>`\n * and the `<slot>` has one `<div>` assigned to it, then the flattened\n * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other\n * `<slot>` elements assigned to it, these are flattened as well.\n *\n * The provided `callback` is called whenever any change to this list\n * of flattened nodes occurs, where an addition or removal of a node is\n * considered a change. The `callback` is called with one argument, an object\n * containing an array of any `addedNodes` and `removedNodes`.\n *\n * Note: the callback is called asynchronous to any changes\n * at a microtask checkpoint. This is because observation is performed using\n * `MutationObserver` and the `<slot>` element's `slotchange` event which\n * are asynchronous.\n *\n * An example:\n * ```js\n * class TestSelfObserve extends PolymerElement {\n *   static get is() { return 'test-self-observe';}\n *   connectedCallback() {\n *     super.connectedCallback();\n *     this._observer = new FlattenedNodesObserver(this, (info) => {\n *       this.info = info;\n *     });\n *   }\n *   disconnectedCallback() {\n *     super.disconnectedCallback();\n *     this._observer.disconnect();\n *   }\n * }\n * customElements.define(TestSelfObserve.is, TestSelfObserve);\n * ```\n *\n * @summary Class that listens for changes (additions or removals) to\n * \"flattened nodes\" on a given `node`.\n * @implements {PolymerDomApi.ObserveHandle}\n */\nexport let FlattenedNodesObserver = class {\n\n  /**\n   * Returns the list of flattened nodes for the given `node`.\n   * This list consists of a node's children and, for any children\n   * that are `<slot>` elements, the expanded flattened list of `assignedNodes`.\n   * For example, if the observed node has children `<a></a><slot></slot><b></b>`\n   * and the `<slot>` has one `<div>` assigned to it, then the flattened\n   * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other\n   * `<slot>` elements assigned to it, these are flattened as well.\n   *\n   * @param {!HTMLElement|!HTMLSlotElement} node The node for which to\n   *      return the list of flattened nodes.\n   * @return {!Array<!Node>} The list of flattened nodes for the given `node`.\n   * @nocollapse See https://github.com/google/closure-compiler/issues/2763\n   */\n  // eslint-disable-next-line\n  static getFlattenedNodes(node) {\n    const wrapped = wrap(node);\n    if (isSlot(node)) {\n      node = /** @type {!HTMLSlotElement} */(node); // eslint-disable-line no-self-assign\n      return wrapped.assignedNodes({flatten: true});\n    } else {\n      const results = [];\n      for (let i = 0; i < wrapped.childNodes.length; i++) {\n        const node = wrapped.childNodes[i];\n        if (isSlot(node)) {\n          const slotNode = /** @type {!HTMLSlotElement} */ (node);\n          results.push(...wrap(slotNode).assignedNodes({ flatten: true }));\n        } else {\n          results.push(node);\n        }\n      }\n      return results;\n    }\n  }\n\n  /**\n   * @param {!HTMLElement} target Node on which to listen for changes.\n   * @param {?function(this: Element, { target: !HTMLElement, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Function called when there are additions\n   * or removals from the target's list of flattened nodes.\n   */\n  // eslint-disable-next-line\n  constructor(target, callback) {\n    /**\n     * @type {MutationObserver}\n     * @private\n     */\n    this._shadyChildrenObserver = null;\n    /**\n     * @type {MutationObserver}\n     * @private\n     */\n    this._nativeChildrenObserver = null;\n    this._connected = false;\n    /**\n     * @type {!HTMLElement}\n     * @private\n     */\n    this._target = target;\n    this.callback = callback;\n    this._effectiveNodes = [];\n    this._observer = null;\n    this._scheduled = false;\n    /**\n     * @type {function()}\n     * @private\n     */\n    this._boundSchedule = () => {\n      this._schedule();\n    };\n    this.connect();\n    this._schedule();\n  }\n\n  /**\n   * Activates an observer. This method is automatically called when\n   * a `FlattenedNodesObserver` is created. It should only be called to\n   * re-activate an observer that has been deactivated via the `disconnect` method.\n   *\n   * @return {void}\n   */\n  connect() {\n    if (isSlot(this._target)) {\n      this._listenSlots([this._target]);\n    } else if (wrap(this._target).children) {\n      this._listenSlots(\n          /** @type {!NodeList<!Node>} */ (wrap(this._target).children));\n      if (window.ShadyDOM) {\n        this._shadyChildrenObserver =\n          window.ShadyDOM.observeChildren(this._target, (mutations) => {\n            this._processMutations(mutations);\n          });\n      } else {\n        this._nativeChildrenObserver =\n          new MutationObserver((mutations) => {\n            this._processMutations(mutations);\n          });\n        this._nativeChildrenObserver.observe(this._target, {childList: true});\n      }\n    }\n    this._connected = true;\n  }\n\n  /**\n   * Deactivates the flattened nodes observer. After calling this method\n   * the observer callback will not be called when changes to flattened nodes\n   * occur. The `connect` method may be subsequently called to reactivate\n   * the observer.\n   *\n   * @return {void}\n   * @override\n   */\n  disconnect() {\n    if (isSlot(this._target)) {\n      this._unlistenSlots([this._target]);\n    } else if (wrap(this._target).children) {\n      this._unlistenSlots(\n          /** @type {!NodeList<!Node>} */ (wrap(this._target).children));\n      if (window.ShadyDOM && this._shadyChildrenObserver) {\n        window.ShadyDOM.unobserveChildren(this._shadyChildrenObserver);\n        this._shadyChildrenObserver = null;\n      } else if (this._nativeChildrenObserver) {\n        this._nativeChildrenObserver.disconnect();\n        this._nativeChildrenObserver = null;\n      }\n    }\n    this._connected = false;\n  }\n\n  /**\n   * @return {void}\n   * @private\n   */\n  _schedule() {\n    if (!this._scheduled) {\n      this._scheduled = true;\n      microTask.run(() => this.flush());\n    }\n  }\n\n  /**\n   * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer\n   * @return {void}\n   * @private\n   */\n  _processMutations(mutations) {\n    this._processSlotMutations(mutations);\n    this.flush();\n  }\n\n  /**\n   * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer\n   * @return {void}\n   * @private\n   */\n  _processSlotMutations(mutations) {\n    if (mutations) {\n      for (let i=0; i < mutations.length; i++) {\n        let mutation = mutations[i];\n        if (mutation.addedNodes) {\n          this._listenSlots(mutation.addedNodes);\n        }\n        if (mutation.removedNodes) {\n          this._unlistenSlots(mutation.removedNodes);\n        }\n      }\n    }\n  }\n\n  /**\n   * Flushes the observer causing any pending changes to be immediately\n   * delivered the observer callback. By default these changes are delivered\n   * asynchronously at the next microtask checkpoint.\n   *\n   * @return {boolean} Returns true if any pending changes caused the observer\n   * callback to run.\n   */\n  flush() {\n    if (!this._connected) {\n      return false;\n    }\n    if (window.ShadyDOM) {\n      ShadyDOM.flush();\n    }\n    if (this._nativeChildrenObserver) {\n      this._processSlotMutations(this._nativeChildrenObserver.takeRecords());\n    } else if (this._shadyChildrenObserver) {\n      this._processSlotMutations(this._shadyChildrenObserver.takeRecords());\n    }\n    this._scheduled = false;\n    let info = {\n      target: this._target,\n      addedNodes: [],\n      removedNodes: []\n    };\n    let newNodes = this.constructor.getFlattenedNodes(this._target);\n    let splices = calculateSplices(newNodes,\n      this._effectiveNodes);\n    // process removals\n    for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {\n      for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {\n        info.removedNodes.push(n);\n      }\n    }\n    // process adds\n    for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {\n      for (let j=s.index; j < s.index + s.addedCount; j++) {\n        info.addedNodes.push(newNodes[j]);\n      }\n    }\n    // update cache\n    this._effectiveNodes = newNodes;\n    let didFlush = false;\n    if (info.addedNodes.length || info.removedNodes.length) {\n      didFlush = true;\n      this.callback.call(this._target, info);\n    }\n    return didFlush;\n  }\n\n  /**\n   * @param {!Array<!Node>|!NodeList<!Node>} nodeList Nodes that could change\n   * @return {void}\n   * @private\n   */\n  _listenSlots(nodeList) {\n    for (let i=0; i < nodeList.length; i++) {\n      let n = nodeList[i];\n      if (isSlot(n)) {\n        n.addEventListener('slotchange', this._boundSchedule);\n      }\n    }\n  }\n\n  /**\n   * @param {!Array<!Node>|!NodeList<!Node>} nodeList Nodes that could change\n   * @return {void}\n   * @private\n   */\n  _unlistenSlots(nodeList) {\n    for (let i=0; i < nodeList.length; i++) {\n      let n = nodeList[i];\n      if (isSlot(n)) {\n        n.removeEventListener('slotchange', this._boundSchedule);\n      }\n    }\n  }\n\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\nimport {enqueueDebouncer, flushDebouncers} from '../utils/debounce.js';\nexport {enqueueDebouncer};\n\n/**\n * Forces several classes of asynchronously queued tasks to flush:\n * - Debouncers added via `enqueueDebouncer`\n * - ShadyDOM distribution\n *\n * @return {void}\n */\nexport const flush = function() {\n  let shadyDOM, debouncers;\n  do {\n    shadyDOM = window.ShadyDOM && ShadyDOM.flush();\n    if (window.ShadyCSS && window.ShadyCSS.ScopingShim) {\n      window.ShadyCSS.ScopingShim.flush();\n    }\n    debouncers = flushDebouncers();\n  } while (shadyDOM || debouncers);\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * @fileoverview\n *\n * Module for adding listeners to a node for the following normalized\n * cross-platform \"gesture\" events:\n * - `down` - mouse or touch went down\n * - `up` - mouse or touch went up\n * - `tap` - mouse click or finger tap\n * - `track` - mouse drag or touch move\n *\n * @summary Module for adding cross-platform gesture event listeners.\n */\n\nimport './boot.js';\n\nimport { timeOut, microTask } from './async.js';\nimport { Debouncer } from './debounce.js';\nimport { passiveTouchGestures, cancelSyntheticClickEvents } from './settings.js';\nimport { wrap } from './wrap.js';\n\n// detect native touch action support\nlet HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';\nlet GESTURE_KEY = '__polymerGestures';\nlet HANDLED_OBJ = '__polymerGesturesHandled';\nlet TOUCH_ACTION = '__polymerGesturesTouchAction';\n// radius for tap and track\nlet TAP_DISTANCE = 25;\nlet TRACK_DISTANCE = 5;\n// number of last N track positions to keep\nlet TRACK_LENGTH = 2;\n\n// Disabling \"mouse\" handlers for 2500ms is enough\nlet MOUSE_TIMEOUT = 2500;\nlet MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'click'];\n// an array of bitmask values for mapping MouseEvent.which to MouseEvent.buttons\nlet MOUSE_WHICH_TO_BUTTONS = [0, 1, 4, 2];\nlet MOUSE_HAS_BUTTONS = (function() {\n  try {\n    return new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {\n    return false;\n  }\n})();\n\n/**\n * @param {string} name Possible mouse event name\n * @return {boolean} true if mouse event, false if not\n */\nfunction isMouseEvent(name) {\n  return MOUSE_EVENTS.indexOf(name) > -1;\n}\n\n/* eslint no-empty: [\"error\", { \"allowEmptyCatch\": true }] */\n// check for passive event listeners\nlet supportsPassive = false;\n(function() {\n  try {\n    let opts = Object.defineProperty({}, 'passive', {get() {supportsPassive = true;}});\n    window.addEventListener('test', null, opts);\n    window.removeEventListener('test', null, opts);\n  } catch(e) {}\n})();\n\n/**\n * Generate settings for event listeners, dependant on `passiveTouchGestures`\n *\n * @param {string} eventName Event name to determine if `{passive}` option is\n *   needed\n * @return {{passive: boolean} | undefined} Options to use for addEventListener\n *   and removeEventListener\n */\nfunction PASSIVE_TOUCH(eventName) {\n  if (isMouseEvent(eventName) || eventName === 'touchend') {\n    return;\n  }\n  if (HAS_NATIVE_TA && supportsPassive && passiveTouchGestures) {\n    return {passive: true};\n  } else {\n    return;\n  }\n}\n\n// Check for touch-only devices\nlet IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);\n\n// keep track of any labels hit by the mouseCanceller\n/** @type {!Array<!HTMLLabelElement>} */\nconst clickedLabels = [];\n\n/** @type {!Object<boolean>} */\nconst labellable = {\n  'button': true,\n  'input': true,\n  'keygen': true,\n  'meter': true,\n  'output': true,\n  'textarea': true,\n  'progress': true,\n  'select': true\n};\n\n// Defined at https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#enabling-and-disabling-form-controls:-the-disabled-attribute\n/** @type {!Object<boolean>} */\nconst canBeDisabled = {\n  'button': true,\n  'command': true,\n  'fieldset': true,\n  'input': true,\n  'keygen': true,\n  'optgroup': true,\n  'option': true,\n  'select': true,\n  'textarea': true\n};\n\n/**\n * @param {HTMLElement} el Element to check labelling status\n * @return {boolean} element can have labels\n */\nfunction canBeLabelled(el) {\n  return labellable[el.localName] || false;\n}\n\n/**\n * @param {HTMLElement} el Element that may be labelled.\n * @return {!Array<!HTMLLabelElement>} Relevant label for `el`\n */\nfunction matchingLabels(el) {\n  let labels = Array.prototype.slice.call(/** @type {HTMLInputElement} */(el).labels || []);\n  // IE doesn't have `labels` and Safari doesn't populate `labels`\n  // if element is in a shadowroot.\n  // In this instance, finding the non-ancestor labels is enough,\n  // as the mouseCancellor code will handle ancstor labels\n  if (!labels.length) {\n    labels = [];\n    try {\n      let root = el.getRootNode();\n      // if there is an id on `el`, check for all labels with a matching `for` attribute\n      if (el.id) {\n        let matching = root.querySelectorAll(`label[for = '${el.id}']`);\n        for (let i = 0; i < matching.length; i++) {\n          labels.push(/** @type {!HTMLLabelElement} */(matching[i]));\n        }\n      }\n    } catch (e) {\n      // Either:\n      // 1. el.getRootNode() failed.\n      // 2. el.id cannot be used in `querySelectorAll`\n      // In both cases, do nothing.\n    }\n  }\n  return labels;\n}\n\n// touch will make synthetic mouse events\n// `preventDefault` on touchend will cancel them,\n// but this breaks `<input>` focus and link clicks\n// disable mouse handlers for MOUSE_TIMEOUT ms after\n// a touchend to ignore synthetic mouse events\nlet mouseCanceller = function(mouseEvent) {\n  // Check for sourceCapabilities, used to distinguish synthetic events\n  // if mouseEvent did not come from a device that fires touch events,\n  // it was made by a real mouse and should be counted\n  // http://wicg.github.io/InputDeviceCapabilities/#dom-inputdevicecapabilities-firestouchevents\n  let sc = mouseEvent.sourceCapabilities;\n  if (sc && !sc.firesTouchEvents) {\n    return;\n  }\n  // skip synthetic mouse events\n  mouseEvent[HANDLED_OBJ] = {skip: true};\n  // disable \"ghost clicks\"\n  if (mouseEvent.type === 'click') {\n    let clickFromLabel = false;\n    let path = getComposedPath(mouseEvent);\n    for (let i = 0; i < path.length; i++) {\n      if (path[i].nodeType === Node.ELEMENT_NODE) {\n        if (path[i].localName === 'label') {\n          clickedLabels.push(/** @type {!HTMLLabelElement} */ (path[i]));\n        } else if (canBeLabelled(/** @type {!HTMLElement} */ (path[i]))) {\n          let ownerLabels =\n              matchingLabels(/** @type {!HTMLElement} */ (path[i]));\n          // check if one of the clicked labels is labelling this element\n          for (let j = 0; j < ownerLabels.length; j++) {\n            clickFromLabel = clickFromLabel || clickedLabels.indexOf(ownerLabels[j]) > -1;\n          }\n        }\n      }\n      if (path[i] === POINTERSTATE.mouse.target) {\n        return;\n      }\n    }\n    // if one of the clicked labels was labelling the target element,\n    // this is not a ghost click\n    if (clickFromLabel) {\n      return;\n    }\n    mouseEvent.preventDefault();\n    mouseEvent.stopPropagation();\n  }\n};\n\n/**\n * @param {boolean=} setup True to add, false to remove.\n * @return {void}\n */\nfunction setupTeardownMouseCanceller(setup) {\n  let events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;\n  for (let i = 0, en; i < events.length; i++) {\n    en = events[i];\n    if (setup) {\n      // reset clickLabels array\n      clickedLabels.length = 0;\n      document.addEventListener(en, mouseCanceller, true);\n    } else {\n      document.removeEventListener(en, mouseCanceller, true);\n    }\n  }\n}\n\nfunction ignoreMouse(e) {\n  if (!cancelSyntheticClickEvents) {\n    return;\n  }\n  if (!POINTERSTATE.mouse.mouseIgnoreJob) {\n    setupTeardownMouseCanceller(true);\n  }\n  let unset = function() {\n    setupTeardownMouseCanceller();\n    POINTERSTATE.mouse.target = null;\n    POINTERSTATE.mouse.mouseIgnoreJob = null;\n  };\n  POINTERSTATE.mouse.target = getComposedPath(e)[0];\n  POINTERSTATE.mouse.mouseIgnoreJob = Debouncer.debounce(\n        POINTERSTATE.mouse.mouseIgnoreJob\n      , timeOut.after(MOUSE_TIMEOUT)\n      , unset);\n}\n\n/**\n * @param {MouseEvent} ev event to test for left mouse button down\n * @return {boolean} has left mouse button down\n */\nfunction hasLeftMouseButton(ev) {\n  let type = ev.type;\n  // exit early if the event is not a mouse event\n  if (!isMouseEvent(type)) {\n    return false;\n  }\n  // ev.button is not reliable for mousemove (0 is overloaded as both left button and no buttons)\n  // instead we use ev.buttons (bitmask of buttons) or fall back to ev.which (deprecated, 0 for no buttons, 1 for left button)\n  if (type === 'mousemove') {\n    // allow undefined for testing events\n    let buttons = ev.buttons === undefined ? 1 : ev.buttons;\n    if ((ev instanceof window.MouseEvent) && !MOUSE_HAS_BUTTONS) {\n      buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;\n    }\n    // buttons is a bitmask, check that the left button bit is set (1)\n    return Boolean(buttons & 1);\n  } else {\n    // allow undefined for testing events\n    let button = ev.button === undefined ? 0 : ev.button;\n    // ev.button is 0 in mousedown/mouseup/click for left button activation\n    return button === 0;\n  }\n}\n\nfunction isSyntheticClick(ev) {\n  if (ev.type === 'click') {\n    // ev.detail is 0 for HTMLElement.click in most browsers\n    if (ev.detail === 0) {\n      return true;\n    }\n    // in the worst case, check that the x/y position of the click is within\n    // the bounding box of the target of the event\n    // Thanks IE 10 >:(\n    let t = _findOriginalTarget(ev);\n    // make sure the target of the event is an element so we can use getBoundingClientRect,\n    // if not, just assume it is a synthetic click\n    if (!t.nodeType || /** @type {Element} */(t).nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    let bcr = /** @type {Element} */(t).getBoundingClientRect();\n    // use page x/y to account for scrolling\n    let x = ev.pageX, y = ev.pageY;\n    // ev is a synthetic click if the position is outside the bounding box of the target\n    return !((x >= bcr.left && x <= bcr.right) && (y >= bcr.top && y <= bcr.bottom));\n  }\n  return false;\n}\n\nlet POINTERSTATE = {\n  mouse: {\n    target: null,\n    mouseIgnoreJob: null\n  },\n  touch: {\n    x: 0,\n    y: 0,\n    id: -1,\n    scrollDecided: false\n  }\n};\n\nfunction firstTouchAction(ev) {\n  let ta = 'auto';\n  let path = getComposedPath(ev);\n  for (let i = 0, n; i < path.length; i++) {\n    n = path[i];\n    if (n[TOUCH_ACTION]) {\n      ta = n[TOUCH_ACTION];\n      break;\n    }\n  }\n  return ta;\n}\n\nfunction trackDocument(stateObj, movefn, upfn) {\n  stateObj.movefn = movefn;\n  stateObj.upfn = upfn;\n  document.addEventListener('mousemove', movefn);\n  document.addEventListener('mouseup', upfn);\n}\n\nfunction untrackDocument(stateObj) {\n  document.removeEventListener('mousemove', stateObj.movefn);\n  document.removeEventListener('mouseup', stateObj.upfn);\n  stateObj.movefn = null;\n  stateObj.upfn = null;\n}\n\nif (cancelSyntheticClickEvents) {\n  // use a document-wide touchend listener to start the ghost-click prevention mechanism\n  // Use passive event listeners, if supported, to not affect scrolling performance\n  document.addEventListener('touchend', ignoreMouse, supportsPassive ? {passive: true} : false);\n}\n\n/**\n * Returns the composedPath for the given event.\n * @param {Event} event to process\n * @return {!Array<!EventTarget>} Path of the event\n */\nconst getComposedPath = window.ShadyDOM && window.ShadyDOM.noPatch ?\n  window.ShadyDOM.composedPath :\n  (event) => event.composedPath && event.composedPath() || [];\n\n/** @type {!Object<string, !GestureRecognizer>} */\nexport const gestures = {};\n\n/** @type {!Array<!GestureRecognizer>} */\nexport const recognizers = [];\n\n/**\n * Finds the element rendered on the screen at the provided coordinates.\n *\n * Similar to `document.elementFromPoint`, but pierces through\n * shadow roots.\n *\n * @param {number} x Horizontal pixel coordinate\n * @param {number} y Vertical pixel coordinate\n * @return {Element} Returns the deepest shadowRoot inclusive element\n * found at the screen position given.\n */\nexport function deepTargetFind(x, y) {\n  let node = document.elementFromPoint(x, y);\n  let next = node;\n  // this code path is only taken when native ShadowDOM is used\n  // if there is a shadowroot, it may have a node at x/y\n  // if there is not a shadowroot, exit the loop\n  while (next && next.shadowRoot && !window.ShadyDOM) {\n    // if there is a node at x/y in the shadowroot, look deeper\n    let oldNext = next;\n    next = next.shadowRoot.elementFromPoint(x, y);\n    // on Safari, elementFromPoint may return the shadowRoot host\n    if (oldNext === next) {\n      break;\n    }\n    if (next) {\n      node = next;\n    }\n  }\n  return node;\n}\n\n/**\n * a cheaper check than ev.composedPath()[0];\n *\n * @private\n * @param {Event|Touch} ev Event.\n * @return {EventTarget} Returns the event target.\n */\nfunction _findOriginalTarget(ev) {\n  const path = getComposedPath(/** @type {?Event} */ (ev));\n  // It shouldn't be, but sometimes path is empty (window on Safari).\n  return path.length > 0 ? path[0] : ev.target;\n}\n\n/**\n * @private\n * @param {Event} ev Event.\n * @return {void}\n */\nfunction _handleNative(ev) {\n  let handled;\n  let type = ev.type;\n  let node = ev.currentTarget;\n  let gobj = node[GESTURE_KEY];\n  if (!gobj) {\n    return;\n  }\n  let gs = gobj[type];\n  if (!gs) {\n    return;\n  }\n  if (!ev[HANDLED_OBJ]) {\n    ev[HANDLED_OBJ] = {};\n    if (type.slice(0, 5) === 'touch') {\n      ev = /** @type {TouchEvent} */(ev); // eslint-disable-line no-self-assign\n      let t = ev.changedTouches[0];\n      if (type === 'touchstart') {\n        // only handle the first finger\n        if (ev.touches.length === 1) {\n          POINTERSTATE.touch.id = t.identifier;\n        }\n      }\n      if (POINTERSTATE.touch.id !== t.identifier) {\n        return;\n      }\n      if (!HAS_NATIVE_TA) {\n        if (type === 'touchstart' || type === 'touchmove') {\n          _handleTouchAction(ev);\n        }\n      }\n    }\n  }\n  handled = ev[HANDLED_OBJ];\n  // used to ignore synthetic mouse events\n  if (handled.skip) {\n    return;\n  }\n  // reset recognizer state\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    if (gs[r.name] && !handled[r.name]) {\n      if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {\n        r.reset();\n      }\n    }\n  }\n  // enforce gesture recognizer order\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    if (gs[r.name] && !handled[r.name]) {\n      handled[r.name] = true;\n      r[type](ev);\n    }\n  }\n}\n\n/**\n * @private\n * @param {TouchEvent} ev Event.\n * @return {void}\n */\nfunction _handleTouchAction(ev) {\n  let t = ev.changedTouches[0];\n  let type = ev.type;\n  if (type === 'touchstart') {\n    POINTERSTATE.touch.x = t.clientX;\n    POINTERSTATE.touch.y = t.clientY;\n    POINTERSTATE.touch.scrollDecided = false;\n  } else if (type === 'touchmove') {\n    if (POINTERSTATE.touch.scrollDecided) {\n      return;\n    }\n    POINTERSTATE.touch.scrollDecided = true;\n    let ta = firstTouchAction(ev);\n    let shouldPrevent = false;\n    let dx = Math.abs(POINTERSTATE.touch.x - t.clientX);\n    let dy = Math.abs(POINTERSTATE.touch.y - t.clientY);\n    if (!ev.cancelable) {\n      // scrolling is happening\n    } else if (ta === 'none') {\n      shouldPrevent = true;\n    } else if (ta === 'pan-x') {\n      shouldPrevent = dy > dx;\n    } else if (ta === 'pan-y') {\n      shouldPrevent = dx > dy;\n    }\n    if (shouldPrevent) {\n      ev.preventDefault();\n    } else {\n      prevent('track');\n    }\n  }\n}\n\n/**\n * Adds an event listener to a node for the given gesture type.\n *\n * @param {!EventTarget} node Node to add listener on\n * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`\n * @param {!function(!Event):void} handler Event listener function to call\n * @return {boolean} Returns true if a gesture event listener was added.\n */\nexport function addListener(node, evType, handler) {\n  if (gestures[evType]) {\n    _add(node, evType, handler);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Removes an event listener from a node for the given gesture type.\n *\n * @param {!EventTarget} node Node to remove listener from\n * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`\n * @param {!function(!Event):void} handler Event listener function previously passed to\n *  `addListener`.\n * @return {boolean} Returns true if a gesture event listener was removed.\n */\nexport function removeListener(node, evType, handler) {\n  if (gestures[evType]) {\n    _remove(node, evType, handler);\n    return true;\n  }\n  return false;\n}\n\n/**\n * automate the event listeners for the native events\n *\n * @private\n * @param {!EventTarget} node Node on which to add the event.\n * @param {string} evType Event type to add.\n * @param {function(!Event)} handler Event handler function.\n * @return {void}\n */\nfunction _add(node, evType, handler) {\n  let recognizer = gestures[evType];\n  let deps = recognizer.deps;\n  let name = recognizer.name;\n  let gobj = node[GESTURE_KEY];\n  if (!gobj) {\n    node[GESTURE_KEY] = gobj = {};\n  }\n  for (let i = 0, dep, gd; i < deps.length; i++) {\n    dep = deps[i];\n    // don't add mouse handlers on iOS because they cause gray selection overlays\n    if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {\n      continue;\n    }\n    gd = gobj[dep];\n    if (!gd) {\n      gobj[dep] = gd = {_count: 0};\n    }\n    if (gd._count === 0) {\n      node.addEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));\n    }\n    gd[name] = (gd[name] || 0) + 1;\n    gd._count = (gd._count || 0) + 1;\n  }\n  node.addEventListener(evType, handler);\n  if (recognizer.touchAction) {\n    setTouchAction(node, recognizer.touchAction);\n  }\n}\n\n/**\n * automate event listener removal for native events\n *\n * @private\n * @param {!EventTarget} node Node on which to remove the event.\n * @param {string} evType Event type to remove.\n * @param {function(!Event): void} handler Event handler function.\n * @return {void}\n */\nfunction _remove(node, evType, handler) {\n  let recognizer = gestures[evType];\n  let deps = recognizer.deps;\n  let name = recognizer.name;\n  let gobj = node[GESTURE_KEY];\n  if (gobj) {\n    for (let i = 0, dep, gd; i < deps.length; i++) {\n      dep = deps[i];\n      gd = gobj[dep];\n      if (gd && gd[name]) {\n        gd[name] = (gd[name] || 1) - 1;\n        gd._count = (gd._count || 1) - 1;\n        if (gd._count === 0) {\n          node.removeEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));\n        }\n      }\n    }\n  }\n  node.removeEventListener(evType, handler);\n}\n\n/**\n * Registers a new gesture event recognizer for adding new custom\n * gesture event types.\n *\n * @param {!GestureRecognizer} recog Gesture recognizer descriptor\n * @return {void}\n */\nexport function register(recog) {\n  recognizers.push(recog);\n  for (let i = 0; i < recog.emits.length; i++) {\n    gestures[recog.emits[i]] = recog;\n  }\n}\n\n/**\n * @private\n * @param {string} evName Event name.\n * @return {Object} Returns the gesture for the given event name.\n */\nfunction _findRecognizerByEvent(evName) {\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    for (let j = 0, n; j < r.emits.length; j++) {\n      n = r.emits[j];\n      if (n === evName) {\n        return r;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * Sets scrolling direction on node.\n *\n * This value is checked on first move, thus it should be called prior to\n * adding event listeners.\n *\n * @param {!EventTarget} node Node to set touch action setting on\n * @param {string} value Touch action value\n * @return {void}\n */\nexport function setTouchAction(node, value) {\n  if (HAS_NATIVE_TA && node instanceof HTMLElement) {\n    // NOTE: add touchAction async so that events can be added in\n    // custom element constructors. Otherwise we run afoul of custom\n    // elements restriction against settings attributes (style) in the\n    // constructor.\n    microTask.run(() => {\n      node.style.touchAction = value;\n    });\n  }\n  node[TOUCH_ACTION] = value;\n}\n\n/**\n * Dispatches an event on the `target` element of `type` with the given\n * `detail`.\n * @private\n * @param {!EventTarget} target The element on which to fire an event.\n * @param {string} type The type of event to fire.\n * @param {!Object=} detail The detail object to populate on the event.\n * @return {void}\n */\nfunction _fire(target, type, detail) {\n  let ev = new Event(type, { bubbles: true, cancelable: true, composed: true });\n  ev.detail = detail;\n  wrap(/** @type {!Node} */(target)).dispatchEvent(ev);\n  // forward `preventDefault` in a clean way\n  if (ev.defaultPrevented) {\n    let preventer = detail.preventer || detail.sourceEvent;\n    if (preventer && preventer.preventDefault) {\n      preventer.preventDefault();\n    }\n  }\n}\n\n/**\n * Prevents the dispatch and default action of the given event name.\n *\n * @param {string} evName Event name.\n * @return {void}\n */\nexport function prevent(evName) {\n  let recognizer = _findRecognizerByEvent(evName);\n  if (recognizer.info) {\n    recognizer.info.prevent = true;\n  }\n}\n\n/**\n * Reset the 2500ms timeout on processing mouse input after detecting touch input.\n *\n * Touch inputs create synthesized mouse inputs anywhere from 0 to 2000ms after the touch.\n * This method should only be called during testing with simulated touch inputs.\n * Calling this method in production may cause duplicate taps or other Gestures.\n *\n * @return {void}\n */\nexport function resetMouseCanceller() {\n  if (POINTERSTATE.mouse.mouseIgnoreJob) {\n    POINTERSTATE.mouse.mouseIgnoreJob.flush();\n  }\n}\n\n/* eslint-disable valid-jsdoc */\n\nregister({\n  name: 'downup',\n  deps: ['mousedown', 'touchstart', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['mouseup', 'touchend']\n  },\n  emits: ['down', 'up'],\n\n  info: {\n    movefn: null,\n    upfn: null\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset: function() {\n    untrackDocument(this.info);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown: function(e) {\n    if (!hasLeftMouseButton(e)) {\n      return;\n    }\n    let t = _findOriginalTarget(e);\n    let self = this;\n    let movefn = function movefn(e) {\n      if (!hasLeftMouseButton(e)) {\n        downupFire('up', t, e);\n        untrackDocument(self.info);\n      }\n    };\n    let upfn = function upfn(e) {\n      if (hasLeftMouseButton(e)) {\n        downupFire('up', t, e);\n      }\n      untrackDocument(self.info);\n    };\n    trackDocument(this.info, movefn, upfn);\n    downupFire('down', t, e);\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart: function(e) {\n    downupFire('down', _findOriginalTarget(e), e.changedTouches[0], e);\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend: function(e) {\n    downupFire('up', _findOriginalTarget(e), e.changedTouches[0], e);\n  }\n});\n\n/**\n * @param {string} type\n * @param {EventTarget} target\n * @param {Event|Touch} event\n * @param {Event=} preventer\n * @return {void}\n */\nfunction downupFire(type, target, event, preventer) {\n  if (!target) {\n    return;\n  }\n  _fire(target, type, {\n    x: event.clientX,\n    y: event.clientY,\n    sourceEvent: event,\n    preventer: preventer,\n    prevent: function(e) {\n      return prevent(e);\n    }\n  });\n}\n\nregister({\n  name: 'track',\n  touchAction: 'none',\n  deps: ['mousedown', 'touchstart', 'touchmove', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['mouseup', 'touchend']\n  },\n  emits: ['track'],\n\n  info: {\n    x: 0,\n    y: 0,\n    state: 'start',\n    started: false,\n    moves: [],\n    /** @this {GestureInfo} */\n    addMove: function(move) {\n      if (this.moves.length > TRACK_LENGTH) {\n        this.moves.shift();\n      }\n      this.moves.push(move);\n    },\n    movefn: null,\n    upfn: null,\n    prevent: false\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset: function() {\n    this.info.state = 'start';\n    this.info.started = false;\n    this.info.moves = [];\n    this.info.x = 0;\n    this.info.y = 0;\n    this.info.prevent = false;\n    untrackDocument(this.info);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown: function(e) {\n    if (!hasLeftMouseButton(e)) {\n      return;\n    }\n    let t = _findOriginalTarget(e);\n    let self = this;\n    let movefn = function movefn(e) {\n      let x = e.clientX, y = e.clientY;\n      if (trackHasMovedEnough(self.info, x, y)) {\n        // first move is 'start', subsequent moves are 'move', mouseup is 'end'\n        self.info.state = self.info.started ? (e.type === 'mouseup' ? 'end' : 'track') : 'start';\n        if (self.info.state === 'start') {\n          // if and only if tracking, always prevent tap\n          prevent('tap');\n        }\n        self.info.addMove({x: x, y: y});\n        if (!hasLeftMouseButton(e)) {\n          // always fire \"end\"\n          self.info.state = 'end';\n          untrackDocument(self.info);\n        }\n        if (t) {\n          trackFire(self.info, t, e);\n        }\n        self.info.started = true;\n      }\n    };\n    let upfn = function upfn(e) {\n      if (self.info.started) {\n        movefn(e);\n      }\n\n      // remove the temporary listeners\n      untrackDocument(self.info);\n    };\n    // add temporary document listeners as mouse retargets\n    trackDocument(this.info, movefn, upfn);\n    this.info.x = e.clientX;\n    this.info.y = e.clientY;\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart: function(e) {\n    let ct = e.changedTouches[0];\n    this.info.x = ct.clientX;\n    this.info.y = ct.clientY;\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchmove: function(e) {\n    let t = _findOriginalTarget(e);\n    let ct = e.changedTouches[0];\n    let x = ct.clientX, y = ct.clientY;\n    if (trackHasMovedEnough(this.info, x, y)) {\n      if (this.info.state === 'start') {\n        // if and only if tracking, always prevent tap\n        prevent('tap');\n      }\n      this.info.addMove({x: x, y: y});\n      trackFire(this.info, t, ct);\n      this.info.state = 'track';\n      this.info.started = true;\n    }\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend: function(e) {\n    let t = _findOriginalTarget(e);\n    let ct = e.changedTouches[0];\n    // only trackend if track was started and not aborted\n    if (this.info.started) {\n      // reset started state on up\n      this.info.state = 'end';\n      this.info.addMove({x: ct.clientX, y: ct.clientY});\n      trackFire(this.info, t, ct);\n    }\n  }\n});\n\n/**\n * @param {!GestureInfo} info\n * @param {number} x\n * @param {number} y\n * @return {boolean}\n */\nfunction trackHasMovedEnough(info, x, y) {\n  if (info.prevent) {\n    return false;\n  }\n  if (info.started) {\n    return true;\n  }\n  let dx = Math.abs(info.x - x);\n  let dy = Math.abs(info.y - y);\n  return (dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE);\n}\n\n/**\n * @param {!GestureInfo} info\n * @param {?EventTarget} target\n * @param {Touch} touch\n * @return {void}\n */\nfunction trackFire(info, target, touch) {\n  if (!target) {\n    return;\n  }\n  let secondlast = info.moves[info.moves.length - 2];\n  let lastmove = info.moves[info.moves.length - 1];\n  let dx = lastmove.x - info.x;\n  let dy = lastmove.y - info.y;\n  let ddx, ddy = 0;\n  if (secondlast) {\n    ddx = lastmove.x - secondlast.x;\n    ddy = lastmove.y - secondlast.y;\n  }\n  _fire(target, 'track', {\n    state: info.state,\n    x: touch.clientX,\n    y: touch.clientY,\n    dx: dx,\n    dy: dy,\n    ddx: ddx,\n    ddy: ddy,\n    sourceEvent: touch,\n    hover: function() {\n      return deepTargetFind(touch.clientX, touch.clientY);\n    }\n  });\n}\n\nregister({\n  name: 'tap',\n  deps: ['mousedown', 'click', 'touchstart', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['click', 'touchend']\n  },\n  emits: ['tap'],\n  info: {\n    x: NaN,\n    y: NaN,\n    prevent: false\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset: function() {\n    this.info.x = NaN;\n    this.info.y = NaN;\n    this.info.prevent = false;\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown: function(e) {\n    if (hasLeftMouseButton(e)) {\n      this.info.x = e.clientX;\n      this.info.y = e.clientY;\n    }\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  click: function(e) {\n    if (hasLeftMouseButton(e)) {\n      trackForward(this.info, e);\n    }\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart: function(e) {\n    const touch = e.changedTouches[0];\n    this.info.x = touch.clientX;\n    this.info.y = touch.clientY;\n  },\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend: function(e) {\n    trackForward(this.info, e.changedTouches[0], e);\n  }\n});\n\n/**\n * @param {!GestureInfo} info\n * @param {Event | Touch} e\n * @param {Event=} preventer\n * @return {void}\n */\nfunction trackForward(info, e, preventer) {\n  let dx = Math.abs(e.clientX - info.x);\n  let dy = Math.abs(e.clientY - info.y);\n  // find original target from `preventer` for TouchEvents, or `e` for MouseEvents\n  let t = _findOriginalTarget((preventer || e));\n  if (!t || (canBeDisabled[/** @type {!HTMLElement} */(t).localName] && t.hasAttribute('disabled'))) {\n    return;\n  }\n  // dx,dy can be NaN if `click` has been simulated and there was no `down` for `start`\n  if (isNaN(dx) || isNaN(dy) || (dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) || isSyntheticClick(e)) {\n    // prevent taps from being generated if an event has canceled them\n    if (!info.prevent) {\n      _fire(t, 'tap', {\n        x: e.clientX,\n        y: e.clientY,\n        sourceEvent: e,\n        preventer: preventer\n      });\n    }\n  }\n}\n\n/* eslint-enable valid-jsdoc */\n\n/** @deprecated */\nexport const findOriginalTarget = _findOriginalTarget;\n\n/** @deprecated */\nexport const add = addListener;\n\n/** @deprecated */\nexport const remove = removeListener;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Our TrustedTypePolicy for HTML which is declared using the Polymer html\n * template tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n *\n * @type {!TrustedTypePolicy|undefined}\n */\nconst policy = window.trustedTypes &&\n    trustedTypes.createPolicy('polymer-html-literal', {createHTML: (s) => s});\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n  /**\n   * @param {!ITemplateArray} strings Constant parts of tagged template literal\n   * @param {!Array<*>} values Variable parts of tagged template literal\n   */\n  constructor(strings, values) {\n    assertValidTemplateStringParameters(strings, values);\n    const string = values.reduce(\n        (acc, v, idx) => acc + literalValue(v) + strings[idx + 1], strings[0]);\n    /** @type {string} */\n    this.value = string.toString();\n  }\n  /**\n   * @return {string} LiteralString string value\n   * @override\n   */\n  toString() {\n    return this.value;\n  }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n  if (value instanceof LiteralString) {\n    return /** @type {!LiteralString} */(value).value;\n  } else {\n    throw new Error(\n        `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n    );\n  }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n  if (value instanceof HTMLTemplateElement) {\n    // This might be an mXSS risk – mainly in the case where this template\n    // contains untrusted content that was believed to be sanitized.\n    // However we can't just use the XMLSerializer here because it misencodes\n    // `>` characters inside style tags.\n    // For an example of an actual case that hit this encoding issue,\n    // see b/198592167\n    return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n  } else if (value instanceof LiteralString) {\n    return literalValue(value);\n  } else {\n    throw new Error(\n        `non-template value passed to Polymer's html function: ${value}`);\n  }\n}\n\n/**\n * A template literal tag that creates an HTML <template> element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template.  The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n *     static get template() {\n *       return html`\n *         <style>:host{ content:\"...\" }</style>\n *         <div class=\"shadowed\">${this.partialTemplate}</div>\n *         ${super.template}\n *       `;\n *     }\n *     static get partialTemplate() { return html`<span>Partial!</span>`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n  assertValidTemplateStringParameters(strings, values);\n  const template =\n      /** @type {!HTMLTemplateElement} */ (document.createElement('template'));\n  let value = values.reduce(\n      (acc, v, idx) => acc + htmlValue(v) + strings[idx + 1], strings[0]);\n  if (policy) {\n    value = policy.createHTML(value);\n  }\n  template.innerHTML = value;\n  return template;\n};\n\n/**\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {!Array<*>} values Array of values from quasis\n */\nconst assertValidTemplateStringParameters = (strings, values) => {\n  // Note: if/when https://github.com/tc39/proposal-array-is-template-object\n  // is standardized, use that instead when available, as it can perform an\n  // unforgable check (though of course, the function itself can be forged).\n  if (!Array.isArray(strings) || !Array.isArray(strings.raw) ||\n      (values.length !== strings.length - 1)) {\n    // This is either caused by a browser bug, a compiler bug, or someone\n    // calling the html template tag function as a regular function.\n    //\n    throw new TypeError('Invalid call to the html template tag');\n  }\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n *     static get template() {\n *       return html`\n *         <style>\n *           :host { display: block; }\n *           ${this.styleTemplate()}\n *         </style>\n *         <div class=\"shadowed\">${staticValue}</div>\n *         ${super.template}\n *       `;\n *     }\n *     static get styleTemplate() {\n *        return htmlLiteral`.shadowed { background: gray; }`;\n *     }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n  return new LiteralString(strings, values);\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n// unique global id for deduping mixins.\nlet dedupeId = 0;\n\n/**\n * @constructor\n * @extends {Function}\n * @private\n */\nfunction MixinFunction(){}\n/** @type {(WeakMap | undefined)} */\nMixinFunction.prototype.__mixinApplications;\n/** @type {(Object | undefined)} */\nMixinFunction.prototype.__mixinSet;\n\n/* eslint-disable valid-jsdoc */\n/**\n * Wraps an ES6 class expression mixin such that the mixin is only applied\n * if it has not already been applied its base argument. Also memoizes mixin\n * applications.\n *\n * @template T\n * @param {T} mixin ES6 class expression mixin to wrap\n * @return {T}\n * @suppress {invalidCasts}\n */\nexport const dedupingMixin = function(mixin) {\n  let mixinApplications = /** @type {!MixinFunction} */(mixin).__mixinApplications;\n  if (!mixinApplications) {\n    mixinApplications = new WeakMap();\n    /** @type {!MixinFunction} */(mixin).__mixinApplications = mixinApplications;\n  }\n  // maintain a unique id for each mixin\n  let mixinDedupeId = dedupeId++;\n  function dedupingMixin(base) {\n    let baseSet = /** @type {!MixinFunction} */(base).__mixinSet;\n    if (baseSet && baseSet[mixinDedupeId]) {\n      return base;\n    }\n    let map = mixinApplications;\n    let extended = map.get(base);\n    if (!extended) {\n      extended = /** @type {!Function} */(mixin)(base);\n      map.set(base, extended);\n      // copy inherited mixin set from the extended class, or the base class\n      // NOTE: we avoid use of Set here because some browser (IE11)\n      // cannot extend a base Set via the constructor.\n      let mixinSet = Object.create(/** @type {!MixinFunction} */(extended).__mixinSet || baseSet || null);\n      mixinSet[mixinDedupeId] = true;\n      /** @type {!MixinFunction} */(extended).__mixinSet = mixinSet;\n    }\n    return extended;\n  }\n\n  return dedupingMixin;\n};\n/* eslint-enable valid-jsdoc */\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Module with utilities for manipulating structured data path strings.\n *\n * @summary Module with utilities for manipulating structured data path strings.\n */\n\n/**\n * Returns true if the given string is a structured data path (has dots).\n *\n * Example:\n *\n * ```\n * isPath('foo.bar.baz') // true\n * isPath('foo')         // false\n * ```\n *\n * @param {string} path Path string\n * @return {boolean} True if the string contained one or more dots\n */\nexport function isPath(path) {\n  return path.indexOf('.') >= 0;\n}\n\n/**\n * Returns the root property name for the given path.\n *\n * Example:\n *\n * ```\n * root('foo.bar.baz') // 'foo'\n * root('foo')         // 'foo'\n * ```\n *\n * @param {string} path Path string\n * @return {string} Root property name\n */\nexport function root(path) {\n  let dotIndex = path.indexOf('.');\n  if (dotIndex === -1) {\n    return path;\n  }\n  return path.slice(0, dotIndex);\n}\n\n/**\n * Given `base` is `foo.bar`, `foo` is an ancestor, `foo.bar` is not\n * Returns true if the given path is an ancestor of the base path.\n *\n * Example:\n *\n * ```\n * isAncestor('foo.bar', 'foo')         // true\n * isAncestor('foo.bar', 'foo.bar')     // false\n * isAncestor('foo.bar', 'foo.bar.baz') // false\n * ```\n *\n * @param {string} base Path string to test against.\n * @param {string} path Path string to test.\n * @return {boolean} True if `path` is an ancestor of `base`.\n */\nexport function isAncestor(base, path) {\n  //     base.startsWith(path + '.');\n  return base.indexOf(path + '.') === 0;\n}\n\n/**\n * Given `base` is `foo.bar`, `foo.bar.baz` is an descendant\n *\n * Example:\n *\n * ```\n * isDescendant('foo.bar', 'foo.bar.baz') // true\n * isDescendant('foo.bar', 'foo.bar')     // false\n * isDescendant('foo.bar', 'foo')         // false\n * ```\n *\n * @param {string} base Path string to test against.\n * @param {string} path Path string to test.\n * @return {boolean} True if `path` is a descendant of `base`.\n */\nexport function isDescendant(base, path) {\n  //     path.startsWith(base + '.');\n  return path.indexOf(base + '.') === 0;\n}\n\n/**\n * Replaces a previous base path with a new base path, preserving the\n * remainder of the path.\n *\n * User must ensure `path` has a prefix of `base`.\n *\n * Example:\n *\n * ```\n * translate('foo.bar', 'zot', 'foo.bar.baz') // 'zot.baz'\n * ```\n *\n * @param {string} base Current base string to remove\n * @param {string} newBase New base string to replace with\n * @param {string} path Path to translate\n * @return {string} Translated string\n */\nexport function translate(base, newBase, path) {\n  return newBase + path.slice(base.length);\n}\n\n/**\n * @param {string} base Path string to test against\n * @param {string} path Path string to test\n * @return {boolean} True if `path` is equal to `base`\n */\nexport function matches(base, path) {\n  return (base === path) ||\n         isAncestor(base, path) ||\n         isDescendant(base, path);\n}\n\n/**\n * Converts array-based paths to flattened path.  String-based paths\n * are returned as-is.\n *\n * Example:\n *\n * ```\n * normalize(['foo.bar', 0, 'baz'])  // 'foo.bar.0.baz'\n * normalize('foo.bar.0.baz')        // 'foo.bar.0.baz'\n * ```\n *\n * @param {string | !Array<string|number>} path Input path\n * @return {string} Flattened path\n */\nexport function normalize(path) {\n  if (Array.isArray(path)) {\n    let parts = [];\n    for (let i=0; i<path.length; i++) {\n      let args = path[i].toString().split('.');\n      for (let j=0; j<args.length; j++) {\n        parts.push(args[j]);\n      }\n    }\n    return parts.join('.');\n  } else {\n    return path;\n  }\n}\n\n/**\n * Splits a path into an array of property names. Accepts either arrays\n * of path parts or strings.\n *\n * Example:\n *\n * ```\n * split(['foo.bar', 0, 'baz'])  // ['foo', 'bar', '0', 'baz']\n * split('foo.bar.0.baz')        // ['foo', 'bar', '0', 'baz']\n * ```\n *\n * @param {string | !Array<string|number>} path Input path\n * @return {!Array<string>} Array of path parts\n * @suppress {checkTypes}\n */\nexport function split(path) {\n  if (Array.isArray(path)) {\n    return normalize(path).split('.');\n  }\n  return path.toString().split('.');\n}\n\n/**\n * Reads a value from a path.  If any sub-property in the path is `undefined`,\n * this method returns `undefined` (will never throw.\n *\n * @param {Object} root Object from which to dereference path from\n * @param {string | !Array<string|number>} path Path to read\n * @param {Object=} info If an object is provided to `info`, the normalized\n *  (flattened) path will be set to `info.path`.\n * @return {*} Value at path, or `undefined` if the path could not be\n *  fully dereferenced.\n */\nexport function get(root, path, info) {\n  let prop = root;\n  let parts = split(path);\n  // Loop over path parts[0..n-1] and dereference\n  for (let i=0; i<parts.length; i++) {\n    if (!prop) {\n      return;\n    }\n    let part = parts[i];\n    prop = prop[part];\n  }\n  if (info) {\n    info.path = parts.join('.');\n  }\n  return prop;\n}\n\n/**\n * Sets a value to a path.  If any sub-property in the path is `undefined`,\n * this method will no-op.\n *\n * @param {Object} root Object from which to dereference path from\n * @param {string | !Array<string|number>} path Path to set\n * @param {*} value Value to set to path\n * @return {string | undefined} The normalized version of the input path\n */\nexport function set(root, path, value) {\n  let prop = root;\n  let parts = split(path);\n  let last = parts[parts.length-1];\n  if (parts.length > 1) {\n    // Loop over path parts[0..n-2] and dereference\n    for (let i=0; i<parts.length-1; i++) {\n      let part = parts[i];\n      prop = prop[part];\n      if (!prop) {\n        return;\n      }\n    }\n    // Set value to object at end of path\n    prop[last] = value;\n  } else {\n    // Simple property set\n    prop[path] = value;\n  }\n  return parts.join('.');\n}\n\n/**\n * Returns true if the given string is a structured data path (has dots).\n *\n * This function is deprecated.  Use `isPath` instead.\n *\n * Example:\n *\n * ```\n * isDeep('foo.bar.baz') // true\n * isDeep('foo')         // false\n * ```\n *\n * @deprecated\n * @param {string} path Path string\n * @return {boolean} True if the string contained one or more dots\n */\nexport const isDeep = isPath;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Module for scheduling flushable pre-render and post-render tasks.\n *\n * @summary Module for scheduling flushable pre-render and post-render tasks.\n */\n\nimport './boot.js';\n\nlet scheduled = false;\nlet beforeRenderQueue = [];\nlet afterRenderQueue = [];\n\nfunction schedule() {\n  scheduled = true;\n  // before next render\n  requestAnimationFrame(function() {\n    scheduled = false;\n    flushQueue(beforeRenderQueue);\n    // after the render\n    setTimeout(function() {\n      runQueue(afterRenderQueue);\n    });\n  });\n}\n\nfunction flushQueue(queue) {\n  while (queue.length) {\n    callMethod(queue.shift());\n  }\n}\n\nfunction runQueue(queue) {\n  for (let i=0, l=queue.length; i < l; i++) {\n    callMethod(queue.shift());\n  }\n}\n\nfunction callMethod(info) {\n  const context = info[0];\n  const callback = info[1];\n  const args = info[2];\n  try {\n    callback.apply(context, args);\n  } catch(e) {\n    setTimeout(() => {\n      throw e;\n    });\n  }\n}\n\n/**\n * Flushes all `beforeNextRender` tasks, followed by all `afterNextRender`\n * tasks.\n *\n * @return {void}\n */\nexport function flush() {\n  while (beforeRenderQueue.length || afterRenderQueue.length) {\n    flushQueue(beforeRenderQueue);\n    flushQueue(afterRenderQueue);\n  }\n  scheduled = false;\n}\n\n\n/**\n * Enqueues a callback which will be run before the next render, at\n * `requestAnimationFrame` timing.\n *\n * This method is useful for enqueuing work that requires DOM measurement,\n * since measurement may not be reliable in custom element callbacks before\n * the first render, as well as for batching measurement tasks in general.\n *\n * Tasks in this queue may be flushed by calling `flush()`.\n *\n * @param {*} context Context object the callback function will be bound to\n * @param {function(...*):void} callback Callback function\n * @param {!Array=} args An array of arguments to call the callback function with\n * @return {void}\n */\nexport function beforeNextRender(context, callback, args) {\n  if (!scheduled) {\n    schedule();\n  }\n  beforeRenderQueue.push([context, callback, args]);\n}\n\n/**\n * Enqueues a callback which will be run after the next render, equivalent\n * to one task (`setTimeout`) after the next `requestAnimationFrame`.\n *\n * This method is useful for tuning the first-render performance of an\n * element or application by deferring non-critical work until after the\n * first paint.  Typical non-render-critical work may include adding UI\n * event listeners and aria attributes.\n *\n * @param {*} context Context object the callback function will be bound to\n * @param {function(...*):void} callback Callback function\n * @param {!Array=} args An array of arguments to call the callback function with\n * @return {void}\n */\nexport function afterNextRender(context, callback, args) {\n  if (!scheduled) {\n    schedule();\n  }\n  afterRenderQueue.push([context, callback, args]);\n}\n\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\nlet CSS_URL_RX = /(url\\()([^)]*)(\\))/g;\nlet ABS_URL = /(^\\/[^\\/])|(^#)|(^[\\w-\\d]*:)/;\nlet workingURL;\nlet resolveDoc;\n/**\n * Resolves the given URL against the provided `baseUri'.\n *\n * Note that this function performs no resolution for URLs that start\n * with `/` (absolute URLs) or `#` (hash identifiers).  For general purpose\n * URL resolution, use `window.URL`.\n *\n * @param {string} url Input URL to resolve\n * @param {?string=} baseURI Base URI to resolve the URL against\n * @return {string} resolved URL\n */\nexport function resolveUrl(url, baseURI) {\n  if (url && ABS_URL.test(url)) {\n    return url;\n  }\n  if (url === '//') {\n    return url;\n  }\n  // Lazy feature detection.\n  if (workingURL === undefined) {\n    workingURL = false;\n    try {\n      const u = new URL('b', 'http://a');\n      u.pathname = 'c%20d';\n      workingURL = (u.href === 'http://a/c%20d');\n    } catch (e) {\n      // silently fail\n    }\n  }\n  if (!baseURI) {\n    baseURI = document.baseURI || window.location.href;\n  }\n  if (workingURL) {\n    try {\n      return (new URL(url, baseURI)).href;\n    } catch (e) {\n      // Bad url or baseURI structure. Do not attempt to resolve.\n      return url;\n    }\n  }\n  // Fallback to creating an anchor into a disconnected document.\n  if (!resolveDoc) {\n    resolveDoc = document.implementation.createHTMLDocument('temp');\n    resolveDoc.base = resolveDoc.createElement('base');\n    resolveDoc.head.appendChild(resolveDoc.base);\n    resolveDoc.anchor = resolveDoc.createElement('a');\n    resolveDoc.body.appendChild(resolveDoc.anchor);\n  }\n  resolveDoc.base.href = baseURI;\n  resolveDoc.anchor.href = url;\n  return resolveDoc.anchor.href || url;\n\n}\n\n/**\n * Resolves any relative URL's in the given CSS text against the provided\n * `ownerDocument`'s `baseURI`.\n *\n * @param {string} cssText CSS text to process\n * @param {string} baseURI Base URI to resolve the URL against\n * @return {string} Processed CSS text with resolved URL's\n */\nexport function resolveCss(cssText, baseURI) {\n  return cssText.replace(CSS_URL_RX, function(m, pre, url, post) {\n    return pre + '\\'' +\n      resolveUrl(url.replace(/[\"']/g, ''), baseURI) +\n      '\\'' + post;\n  });\n}\n\n/**\n * Returns a path from a given `url`. The path includes the trailing\n * `/` from the url.\n *\n * @param {string} url Input URL to transform\n * @return {string} resolved path\n */\nexport function pathFromUrl(url) {\n  return url.substring(0, url.lastIndexOf('/') + 1);\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\nimport { pathFromUrl } from './resolve-url.js';\nexport const useShadow = !(window.ShadyDOM) || !(window.ShadyDOM.inUse);\nexport const useNativeCSSProperties = Boolean(!window.ShadyCSS || window.ShadyCSS.nativeCss);\nexport const useNativeCustomElements = !(window.customElements.polyfillWrapFlushCallback);\nexport const supportsAdoptingStyleSheets = useShadow &&\n    ('adoptedStyleSheets' in Document.prototype) &&\n    ('replaceSync' in CSSStyleSheet.prototype) &&\n    // Since spec may change, feature detect exact API we need\n    (() => {\n      try {\n        const sheet = new CSSStyleSheet();\n        sheet.replaceSync('');\n        const host = document.createElement('div');\n        host.attachShadow({mode: 'open'});\n        host.shadowRoot.adoptedStyleSheets = [sheet];\n        return (host.shadowRoot.adoptedStyleSheets[0] === sheet);\n      } catch(e) {\n        return false;\n      }\n    })();\n\n/**\n * Globally settable property that is automatically assigned to\n * `ElementMixin` instances, useful for binding in templates to\n * make URL's relative to an application's root.  Defaults to the main\n * document URL, but can be overridden by users.  It may be useful to set\n * `rootPath` to provide a stable application mount path when\n * using client side routing.\n */\nexport let rootPath = window.Polymer && window.Polymer.rootPath ||\n  pathFromUrl(document.baseURI || window.location.href);\n\n/**\n * Sets the global rootPath property used by `ElementMixin` and\n * available via `rootPath`.\n *\n * @param {string} path The new root path\n * @return {void}\n */\nexport const setRootPath = function(path) {\n  rootPath = path;\n};\n\n/**\n * A global callback used to sanitize any value before inserting it into the DOM.\n * The callback signature is:\n *\n *  function sanitizeDOMValue(value, name, type, node) { ... }\n *\n * Where:\n *\n * `value` is the value to sanitize.\n * `name` is the name of an attribute or property (for example, href).\n * `type` indicates where the value is being inserted: one of property, attribute, or text.\n * `node` is the node where the value is being inserted.\n *\n * @type {(function(*,string,string,?Node):*)|undefined}\n */\nexport let sanitizeDOMValue =\n  window.Polymer && window.Polymer.sanitizeDOMValue || undefined;\n\n/**\n * Sets the global sanitizeDOMValue available via this module's exported\n * `sanitizeDOMValue` variable.\n *\n * @param {(function(*,string,string,?Node):*)|undefined} newSanitizeDOMValue the global sanitizeDOMValue callback\n * @return {void}\n */\nexport const setSanitizeDOMValue = function(newSanitizeDOMValue) {\n  sanitizeDOMValue = newSanitizeDOMValue;\n};\n\n/**\n * Gets sanitizeDOMValue, for environments that don't well support `export let`.\n *\n * @return {(function(*,string,string,?Node):*)|undefined} sanitizeDOMValue\n */\nexport const getSanitizeDOMValue = function() {\n  return sanitizeDOMValue;\n};\n\n/**\n * Globally settable property to make Polymer Gestures use passive TouchEvent listeners when recognizing gestures.\n * When set to `true`, gestures made from touch will not be able to prevent scrolling, allowing for smoother\n * scrolling performance.\n * Defaults to `false` for backwards compatibility.\n */\nexport let passiveTouchGestures =\n  window.Polymer && window.Polymer.setPassiveTouchGestures || false;\n\n/**\n * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures.\n *\n * @param {boolean} usePassive enable or disable passive touch gestures globally\n * @return {void}\n */\nexport const setPassiveTouchGestures = function(usePassive) {\n  passiveTouchGestures = usePassive;\n};\n\n/**\n * Setting to ensure Polymer template evaluation only occurs based on tempates\n * defined in trusted script.  When true, `<dom-module>` re-registration is\n * disallowed, `<dom-bind>` is disabled, and `<dom-if>`/`<dom-repeat>`\n * templates will only evaluate in the context of a trusted element template.\n */\nexport let strictTemplatePolicy =\n  window.Polymer && window.Polymer.strictTemplatePolicy || false;\n\n/**\n * Sets `strictTemplatePolicy` globally for all elements\n *\n * @param {boolean} useStrictPolicy enable or disable strict template policy\n *   globally\n * @return {void}\n */\nexport const setStrictTemplatePolicy = function(useStrictPolicy) {\n  strictTemplatePolicy = useStrictPolicy;\n};\n\n/**\n * Setting to enable dom-module lookup from Polymer.Element.  By default,\n * templates must be defined in script using the `static get template()`\n * getter and the `html` tag function.  To enable legacy loading of templates\n * via dom-module, set this flag to true.\n */\nexport let allowTemplateFromDomModule =\n  window.Polymer && window.Polymer.allowTemplateFromDomModule || false;\n\n/**\n * Sets `lookupTemplateFromDomModule` globally for all elements\n *\n * @param {boolean} allowDomModule enable or disable template lookup\n *   globally\n * @return {void}\n */\nexport const setAllowTemplateFromDomModule = function(allowDomModule) {\n  allowTemplateFromDomModule = allowDomModule;\n};\n\n/**\n * Setting to skip processing style includes and re-writing urls in css styles.\n * Normally \"included\" styles are pulled into the element and all urls in styles\n * are re-written to be relative to the containing script url.\n * If no includes or relative urls are used in styles, these steps can be\n * skipped as an optimization.\n */\nexport let legacyOptimizations =\n  window.Polymer && window.Polymer.legacyOptimizations || false;\n\n/**\n * Sets `legacyOptimizations` globally for all elements to enable optimizations\n * when only legacy based elements are used.\n *\n * @param {boolean} useLegacyOptimizations enable or disable legacy optimizations\n * includes and url rewriting\n * @return {void}\n */\nexport const setLegacyOptimizations = function(useLegacyOptimizations) {\n  legacyOptimizations = useLegacyOptimizations;\n};\n\n/**\n * Setting to add warnings useful when migrating from Polymer 1.x to 2.x.\n */\nexport let legacyWarnings =\n  window.Polymer && window.Polymer.legacyWarnings || false;\n\n/**\n * Sets `legacyWarnings` globally for all elements to migration warnings.\n *\n * @param {boolean} useLegacyWarnings enable or disable warnings\n * @return {void}\n */\nexport const setLegacyWarnings = function(useLegacyWarnings) {\n  legacyWarnings = useLegacyWarnings;\n};\n\n/**\n * Setting to perform initial rendering synchronously when running under ShadyDOM.\n * This matches the behavior of Polymer 1.\n */\nexport let syncInitialRender =\n  window.Polymer && window.Polymer.syncInitialRender || false;\n\n/**\n * Sets `syncInitialRender` globally for all elements to enable synchronous\n * initial rendering.\n *\n * @param {boolean} useSyncInitialRender enable or disable synchronous initial\n * rendering globally.\n * @return {void}\n */\nexport const setSyncInitialRender = function(useSyncInitialRender) {\n  syncInitialRender = useSyncInitialRender;\n};\n\n/**\n * Setting to retain the legacy Polymer 1 behavior for multi-property\n * observers around undefined values. Observers and computed property methods\n * are not called until no argument is undefined.\n */\nexport let legacyUndefined =\n  window.Polymer && window.Polymer.legacyUndefined || false;\n\n/**\n * Sets `legacyUndefined` globally for all elements to enable legacy\n * multi-property behavior for undefined values.\n *\n * @param {boolean} useLegacyUndefined enable or disable legacy\n * multi-property behavior for undefined.\n * @return {void}\n */\nexport const setLegacyUndefined = function(useLegacyUndefined) {\n  legacyUndefined = useLegacyUndefined;\n};\n\n/**\n * Setting to ensure computed properties are computed in order to ensure\n * re-computation never occurs in a given turn.\n */\nexport let orderedComputed =\n  window.Polymer && window.Polymer.orderedComputed || false;\n\n/**\n * Sets `orderedComputed` globally for all elements to enable ordered computed\n * property computation.\n *\n * @param {boolean} useOrderedComputed enable or disable ordered computed effects\n * @return {void}\n */\nexport const setOrderedComputed = function(useOrderedComputed) {\n  orderedComputed = useOrderedComputed;\n};\n\n/**\n * Setting to cancel synthetic click events fired by older mobile browsers. Modern browsers\n * no longer fire synthetic click events, and the cancellation behavior can interfere\n * when programmatically clicking on elements.\n */\nexport let cancelSyntheticClickEvents = true;\n\n/**\n * Sets `setCancelSyntheticEvents` globally for all elements to cancel synthetic click events.\n *\n * @param {boolean} useCancelSyntheticClickEvents enable or disable cancelling synthetic\n * events\n * @return {void}\n */\nexport const setCancelSyntheticClickEvents = function(useCancelSyntheticClickEvents) {\n  cancelSyntheticClickEvents = useCancelSyntheticClickEvents;\n};\n\n/**\n * Setting to remove nested templates inside `dom-if` and `dom-repeat` as\n * part of element template parsing.  This is a performance optimization that\n * eliminates most of the tax of needing two elements due to the loss of\n * type-extended templates as a result of the V1 specification changes.\n */\nexport let removeNestedTemplates =\n  window.Polymer && window.Polymer.removeNestedTemplates || false;\n\n/**\n * Sets `removeNestedTemplates` globally, to eliminate nested templates\n * inside `dom-if` and `dom-repeat` as part of template parsing.\n *\n * @param {boolean} useRemoveNestedTemplates enable or disable removing nested\n *   templates during parsing\n * @return {void}\n */\nexport const setRemoveNestedTemplates = function(useRemoveNestedTemplates) {\n  removeNestedTemplates = useRemoveNestedTemplates;\n};\n\n/**\n * Setting to place `dom-if` elements in a performance-optimized mode that takes\n * advantage of lighter-weight host runtime template stamping to eliminate the\n * need for an intermediate Templatizer `TemplateInstance` to mange the nodes\n * stamped by `dom-if`.  Under this setting, any Templatizer-provided API's\n * such as `modelForElement` will not be available for nodes stamped by\n * `dom-if`.\n */\nexport let fastDomIf = window.Polymer && window.Polymer.fastDomIf || false;\n\n/**\n * Sets `fastDomIf` globally, to put `dom-if` in a performance-optimized mode.\n *\n * @param {boolean} useFastDomIf enable or disable `dom-if` fast-mode\n * @return {void}\n */\nexport const setFastDomIf = function(useFastDomIf) {\n  fastDomIf = useFastDomIf;\n};\n\n/**\n * Setting to disable `dom-change` and `rendered-item-count` events from\n * `dom-if` and `dom-repeat`. Users can opt back into `dom-change` events by\n * setting the `notify-dom-change` attribute (`notifyDomChange: true` property)\n * to `dom-if`/`don-repeat` instances.\n */\nexport let suppressTemplateNotifications =\n  window.Polymer && window.Polymer.suppressTemplateNotifications || false;\n\n/**\n * Sets `suppressTemplateNotifications` globally, to disable `dom-change` and\n * `rendered-item-count` events from `dom-if` and `dom-repeat`.\n *\n * @param {boolean} suppress enable or disable `suppressTemplateNotifications`\n * @return {void}\n */\nexport const setSuppressTemplateNotifications = function(suppress) {\n  suppressTemplateNotifications = suppress;\n};\n\n/**\n * Setting to disable use of dynamic attributes. This is an optimization\n * to avoid setting `observedAttributes`. Instead attributes are read\n * once at create time and set/removeAttribute are patched.\n */\nexport let legacyNoObservedAttributes =\n  window.Polymer && window.Polymer.legacyNoObservedAttributes || false;\n\n/**\n * Sets `legacyNoObservedAttributes` globally, to disable `observedAttributes`.\n *\n * @param {boolean} noObservedAttributes enable or disable `legacyNoObservedAttributes`\n * @return {void}\n */\nexport const setLegacyNoObservedAttributes = function(noObservedAttributes) {\n  legacyNoObservedAttributes = noObservedAttributes;\n};\n\n/**\n * Setting to enable use of `adoptedStyleSheets` for sharing style sheets\n * between component instances' shadow roots, if the app uses built Shady CSS\n * styles.\n */\nexport let useAdoptedStyleSheetsWithBuiltCSS =\n  window.Polymer && window.Polymer.useAdoptedStyleSheetsWithBuiltCSS || false;\n\n/**\n * Sets `useAdoptedStyleSheetsWithBuiltCSS` globally.\n *\n * @param {boolean} value enable or disable `useAdoptedStyleSheetsWithBuiltCSS`\n * @return {void}\n */\nexport const setUseAdoptedStyleSheetsWithBuiltCSS = function(value) {\n  useAdoptedStyleSheetsWithBuiltCSS = value;\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Module with utilities for collection CSS text from `<templates>`, external\n * stylesheets, and `dom-module`s.\n *\n * @summary Module with utilities for collection CSS text from various sources.\n */\n\nimport { DomModule } from '../elements/dom-module.js';\nimport { resolveCss } from './resolve-url.js';\n\nconst MODULE_STYLE_LINK_SELECTOR = 'link[rel=import][type~=css]';\nconst INCLUDE_ATTR = 'include';\nconst SHADY_UNSCOPED_ATTR = 'shady-unscoped';\n\n/**\n * @param {string} moduleId .\n * @return {?DomModule} .\n */\nfunction importModule(moduleId) {\n  return /** @type {?DomModule} */(DomModule.import(moduleId));\n}\n\nfunction styleForImport(importDoc) {\n  // NOTE: polyfill affordance.\n  // under the HTMLImports polyfill, there will be no 'body',\n  // but the import pseudo-doc can be used directly.\n  let container = importDoc.body ? importDoc.body : importDoc;\n  const importCss = resolveCss(container.textContent,\n    importDoc.baseURI);\n  const style = document.createElement('style');\n  style.textContent = importCss;\n  return style;\n}\n\n/** @typedef {{assetpath: string}} */\nlet templateWithAssetPath; // eslint-disable-line no-unused-vars\n\n\n/**\n * Returns a list of <style> elements in a space-separated list of `dom-module`s.\n *\n * @function\n * @param {string} moduleIds List of dom-module id's within which to\n * search for css.\n * @return {!Array<!HTMLStyleElement>} Array of contained <style> elements\n */\nexport function stylesFromModules(moduleIds) {\n const modules = moduleIds.trim().split(/\\s+/);\n const styles = [];\n for (let i=0; i < modules.length; i++) {\n   styles.push(...stylesFromModule(modules[i]));\n }\n return styles;\n}\n\n/**\n * Returns a list of <style> elements in a given `dom-module`.\n * Styles in a `dom-module` can come either from `<style>`s within the\n * first `<template>`, or else from one or more\n * `<link rel=\"import\" type=\"css\">` links outside the template.\n *\n * @param {string} moduleId dom-module id to gather styles from\n * @return {!Array<!HTMLStyleElement>} Array of contained styles.\n */\nexport function stylesFromModule(moduleId) {\n  const m = importModule(moduleId);\n\n  if (!m) {\n    console.warn('Could not find style data in module named', moduleId);\n    return [];\n  }\n\n  if (m._styles === undefined) {\n    const styles = [];\n    // module imports: <link rel=\"import\" type=\"css\">\n    styles.push(..._stylesFromModuleImports(m));\n    // include css from the first template in the module\n    const template = /** @type {?HTMLTemplateElement} */(\n        m.querySelector('template'));\n    if (template) {\n      styles.push(...stylesFromTemplate(template,\n        /** @type {templateWithAssetPath} */(m).assetpath));\n    }\n\n    m._styles = styles;\n  }\n\n  return m._styles;\n}\n\n/**\n * Returns the `<style>` elements within a given template.\n *\n * @param {!HTMLTemplateElement} template Template to gather styles from\n * @param {string=} baseURI baseURI for style content\n * @return {!Array<!HTMLStyleElement>} Array of styles\n */\nexport function stylesFromTemplate(template, baseURI) {\n  if (!template._styles) {\n    const styles = [];\n    // if element is a template, get content from its .content\n    const e$ = template.content.querySelectorAll('style');\n    for (let i=0; i < e$.length; i++) {\n      let e = e$[i];\n      // support style sharing by allowing styles to \"include\"\n      // other dom-modules that contain styling\n      let include = e.getAttribute(INCLUDE_ATTR);\n      if (include) {\n        styles.push(...stylesFromModules(include).filter(function(item, index, self) {\n          return self.indexOf(item) === index;\n        }));\n      }\n      if (baseURI) {\n        e.textContent =\n            resolveCss(e.textContent, /** @type {string} */ (baseURI));\n      }\n      styles.push(e);\n    }\n    template._styles = styles;\n  }\n  return template._styles;\n}\n\n/**\n * Returns a list of <style> elements  from stylesheets loaded via `<link rel=\"import\" type=\"css\">` links within the specified `dom-module`.\n *\n * @param {string} moduleId Id of `dom-module` to gather CSS from\n * @return {!Array<!HTMLStyleElement>} Array of contained styles.\n */\nexport function stylesFromModuleImports(moduleId) {\n let m = importModule(moduleId);\n return m ? _stylesFromModuleImports(m) : [];\n}\n\n/**\n * @param {!HTMLElement} module dom-module element that could contain `<link rel=\"import\" type=\"css\">` styles\n * @return {!Array<!HTMLStyleElement>} Array of contained styles\n */\nfunction _stylesFromModuleImports(module) {\n  const styles = [];\n  const p$ = module.querySelectorAll(MODULE_STYLE_LINK_SELECTOR);\n  for (let i=0; i < p$.length; i++) {\n    let p = p$[i];\n    if (p.import) {\n      const importDoc = p.import;\n      const unscoped = p.hasAttribute(SHADY_UNSCOPED_ATTR);\n      if (unscoped && !importDoc._unscopedStyle) {\n        const style = styleForImport(importDoc);\n        style.setAttribute(SHADY_UNSCOPED_ATTR, '');\n        importDoc._unscopedStyle = style;\n      } else if (!importDoc._style) {\n        importDoc._style = styleForImport(importDoc);\n      }\n      styles.push(unscoped ? importDoc._unscopedStyle : importDoc._style);\n    }\n  }\n  return styles;\n}\n\n/**\n *\n * Returns CSS text of styles in a space-separated list of `dom-module`s.\n * Note: This method is deprecated, use `stylesFromModules` instead.\n *\n * @deprecated\n * @param {string} moduleIds List of dom-module id's within which to\n * search for css.\n * @return {string} Concatenated CSS content from specified `dom-module`s\n */\nexport function cssFromModules(moduleIds) {\n let modules = moduleIds.trim().split(/\\s+/);\n let cssText = '';\n for (let i=0; i < modules.length; i++) {\n   cssText += cssFromModule(modules[i]);\n }\n return cssText;\n}\n\n/**\n * Returns CSS text of styles in a given `dom-module`.  CSS in a `dom-module`\n * can come either from `<style>`s within the first `<template>`, or else\n * from one or more `<link rel=\"import\" type=\"css\">` links outside the\n * template.\n *\n * Any `<styles>` processed are removed from their original location.\n * Note: This method is deprecated, use `styleFromModule` instead.\n *\n * @deprecated\n * @param {string} moduleId dom-module id to gather styles from\n * @return {string} Concatenated CSS content from specified `dom-module`\n */\nexport function cssFromModule(moduleId) {\n  let m = importModule(moduleId);\n  if (m && m._cssText === undefined) {\n    // module imports: <link rel=\"import\" type=\"css\">\n    let cssText = _cssFromModuleImports(m);\n    // include css from the first template in the module\n    let t = /** @type {?HTMLTemplateElement} */(m.querySelector('template'));\n    if (t) {\n      cssText += cssFromTemplate(t,\n        /** @type {templateWithAssetPath} */(m).assetpath);\n    }\n    m._cssText = cssText || null;\n  }\n  if (!m) {\n    console.warn('Could not find style data in module named', moduleId);\n  }\n  return m && m._cssText || '';\n}\n\n/**\n * Returns CSS text of `<styles>` within a given template.\n *\n * Any `<styles>` processed are removed from their original location.\n * Note: This method is deprecated, use `styleFromTemplate` instead.\n *\n * @deprecated\n * @param {!HTMLTemplateElement} template Template to gather styles from\n * @param {string} baseURI Base URI to resolve the URL against\n * @return {string} Concatenated CSS content from specified template\n */\nexport function cssFromTemplate(template, baseURI) {\n  let cssText = '';\n  const e$ = stylesFromTemplate(template, baseURI);\n  // if element is a template, get content from its .content\n  for (let i=0; i < e$.length; i++) {\n    let e = e$[i];\n    if (e.parentNode) {\n      e.parentNode.removeChild(e);\n    }\n    cssText += e.textContent;\n  }\n  return cssText;\n}\n\n/**\n * Returns CSS text from stylesheets loaded via `<link rel=\"import\" type=\"css\">`\n * links within the specified `dom-module`.\n *\n * Note: This method is deprecated, use `stylesFromModuleImports` instead.\n *\n * @deprecated\n *\n * @param {string} moduleId Id of `dom-module` to gather CSS from\n * @return {string} Concatenated CSS content from links in specified `dom-module`\n */\nexport function cssFromModuleImports(moduleId) {\n  let m = importModule(moduleId);\n  return m ? _cssFromModuleImports(m) : '';\n}\n\n/**\n * @deprecated\n * @param {!HTMLElement} module dom-module element that could contain `<link rel=\"import\" type=\"css\">` styles\n * @return {string} Concatenated CSS content from links in the dom-module\n */\nfunction _cssFromModuleImports(module) {\n  let cssText = '';\n  let styles = _stylesFromModuleImports(module);\n  for (let i=0; i < styles.length; i++) {\n    cssText += styles[i].textContent;\n  }\n  return cssText;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Total number of Polymer element instances created.\n * @type {number}\n */\nexport let instanceCount = 0;\n\nexport function incrementInstanceCount() {\n  instanceCount++;\n}\n\n/**\n * Array of Polymer element classes that have been finalized.\n * @type {!Array<!PolymerElementConstructor>}\n */\nexport const registrations = [];\n\n/**\n * @param {!PolymerElementConstructor} prototype Element prototype to log\n * @private\n */\nfunction _regLog(prototype) {\n  console.log('[' + /** @type {?} */(prototype).is + ']: registered');\n}\n\n/**\n * Registers a class prototype for telemetry purposes.\n * @param {!PolymerElementConstructor} prototype Element prototype to register\n * @protected\n */\nexport function register(prototype) {\n  registrations.push(prototype);\n}\n\n/**\n * Logs all elements registered with an `is` to the console.\n * @public\n */\nexport function dumpRegistrations() {\n  registrations.forEach(_regLog);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Module for preparing and stamping instances of templates that utilize\n * Polymer's data-binding and declarative event listener features.\n *\n * Example:\n *\n *     // Get a template from somewhere, e.g. light DOM\n *     let template = this.querySelector('template');\n *     // Prepare the template\n *     let TemplateClass = Templatize.templatize(template);\n *     // Instance the template with an initial data model\n *     let instance = new TemplateClass({myProp: 'initial'});\n *     // Insert the instance's DOM somewhere, e.g. element's shadow DOM\n *     this.shadowRoot.appendChild(instance.root);\n *     // Changing a property on the instance will propagate to bindings\n *     // in the template\n *     instance.myProp = 'new value';\n *\n * The `options` dictionary passed to `templatize` allows for customizing\n * features of the generated template class, including how outer-scope host\n * properties should be forwarded into template instances, how any instance\n * properties added into the template's scope should be notified out to\n * the host, and whether the instance should be decorated as a \"parent model\"\n * of any event handlers.\n *\n *     // Customize property forwarding and event model decoration\n *     let TemplateClass = Templatize.templatize(template, this, {\n *       parentModel: true,\n *       forwardHostProp(property, value) {...},\n *       instanceProps: {...},\n *       notifyInstanceProp(instance, property, value) {...},\n *     });\n *\n * @summary Module for preparing and stamping instances of templates\n *   utilizing Polymer templating features.\n */\n\nimport './boot.js';\n\nimport { PropertyEffects } from '../mixins/property-effects.js';\nimport { MutableData } from '../mixins/mutable-data.js';\nimport { strictTemplatePolicy, legacyWarnings } from './settings.js';\nimport { wrap } from './wrap.js';\n\n// Base class for HTMLTemplateElement extension that has property effects\n// machinery for propagating host properties to children. This is an ES5\n// class only because Babel (incorrectly) requires super() in the class\n// constructor even though no `this` is used and it returns an instance.\nlet newInstance = null;\n\n/**\n * @constructor\n * @extends {HTMLTemplateElement}\n * @private\n */\nfunction HTMLTemplateElementExtension() { return newInstance; }\nHTMLTemplateElementExtension.prototype = Object.create(HTMLTemplateElement.prototype, {\n  constructor: {\n    value: HTMLTemplateElementExtension,\n    writable: true\n  }\n});\n\n/**\n * @constructor\n * @implements {Polymer_PropertyEffects}\n * @extends {HTMLTemplateElementExtension}\n * @private\n */\nconst DataTemplate = PropertyEffects(HTMLTemplateElementExtension);\n\n/**\n * @constructor\n * @implements {Polymer_MutableData}\n * @extends {DataTemplate}\n * @private\n */\nconst MutableDataTemplate = MutableData(DataTemplate);\n\n// Applies a DataTemplate subclass to a <template> instance\nfunction upgradeTemplate(template, constructor) {\n  newInstance = template;\n  Object.setPrototypeOf(template, constructor.prototype);\n  new constructor();\n  newInstance = null;\n}\n\n/**\n * Base class for TemplateInstance.\n * @constructor\n * @extends {HTMLElement}\n * @implements {Polymer_PropertyEffects}\n * @private\n */\nconst templateInstanceBase = PropertyEffects(class {});\n\nexport function showHideChildren(hide, children) {\n  for (let i=0; i<children.length; i++) {\n    let n = children[i];\n    // Ignore non-changes\n    if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) {\n      // clear and restore text\n      if (n.nodeType === Node.TEXT_NODE) {\n        if (hide) {\n          n.__polymerTextContent__ = n.textContent;\n          n.textContent = '';\n        } else {\n          n.textContent = n.__polymerTextContent__;\n        }\n      // remove and replace slot\n      } else if (n.localName === 'slot') {\n        if (hide) {\n          n.__polymerReplaced__ = document.createComment('hidden-slot');\n          wrap(wrap(n).parentNode).replaceChild(n.__polymerReplaced__, n);\n        } else {\n          const replace = n.__polymerReplaced__;\n          if (replace) {\n            wrap(wrap(replace).parentNode).replaceChild(n, replace);\n          }\n        }\n      }\n      // hide and show nodes\n      else if (n.style) {\n        if (hide) {\n          n.__polymerDisplay__ = n.style.display;\n          n.style.display = 'none';\n        } else {\n          n.style.display = n.__polymerDisplay__;\n        }\n      }\n    }\n    n.__hideTemplateChildren__ = hide;\n    if (n._showHideChildren) {\n      n._showHideChildren(hide);\n    }\n  }\n}\n\n/**\n * @polymer\n * @customElement\n * @appliesMixin PropertyEffects\n * @unrestricted\n */\nclass TemplateInstanceBase extends templateInstanceBase {\n  constructor(props) {\n    super();\n    this._configureProperties(props);\n    /** @type {!StampedTemplate} */\n    this.root = this._stampTemplate(this.__dataHost);\n    // Save list of stamped children\n    let children = [];\n    /** @suppress {invalidCasts} */\n    this.children = /** @type {!NodeList} */ (children);\n    // Polymer 1.x did not use `Polymer.dom` here so not bothering.\n    for (let n = this.root.firstChild; n; n=n.nextSibling) {\n      children.push(n);\n      n.__templatizeInstance = this;\n    }\n    if (this.__templatizeOwner &&\n      this.__templatizeOwner.__hideTemplateChildren__) {\n      this._showHideChildren(true);\n    }\n    // Flush props only when props are passed if instance props exist\n    // or when there isn't instance props.\n    let options = this.__templatizeOptions;\n    if ((props && options.instanceProps) || !options.instanceProps) {\n      this._enableProperties();\n    }\n  }\n  /**\n   * Configure the given `props` by calling `_setPendingProperty`. Also\n   * sets any properties stored in `__hostProps`.\n   * @private\n   * @param {Object} props Object of property name-value pairs to set.\n   * @return {void}\n   */\n  _configureProperties(props) {\n    let options = this.__templatizeOptions;\n    if (options.forwardHostProp) {\n      for (let hprop in this.__hostProps) {\n        this._setPendingProperty(hprop, this.__dataHost['_host_' + hprop]);\n      }\n    }\n    // Any instance props passed in the constructor will overwrite host props;\n    // normally this would be a user error but we don't specifically filter them\n    for (let iprop in props) {\n      this._setPendingProperty(iprop, props[iprop]);\n    }\n  }\n  /**\n   * Forwards a host property to this instance.  This method should be\n   * called on instances from the `options.forwardHostProp` callback\n   * to propagate changes of host properties to each instance.\n   *\n   * Note this method enqueues the change, which are flushed as a batch.\n   *\n   * @param {string} prop Property or path name\n   * @param {*} value Value of the property to forward\n   * @return {void}\n   */\n  forwardHostProp(prop, value) {\n    if (this._setPendingPropertyOrPath(prop, value, false, true)) {\n      this.__dataHost._enqueueClient(this);\n    }\n  }\n\n  /**\n   * Override point for adding custom or simulated event handling.\n   *\n   * @override\n   * @param {!Node} node Node to add event listener to\n   * @param {string} eventName Name of event\n   * @param {function(!Event):void} handler Listener function to add\n   * @return {void}\n   */\n  _addEventListenerToNode(node, eventName, handler) {\n    if (this._methodHost && this.__templatizeOptions.parentModel) {\n      // If this instance should be considered a parent model, decorate\n      // events this template instance as `model`\n      this._methodHost._addEventListenerToNode(node, eventName, (e) => {\n        e.model = this;\n        handler(e);\n      });\n    } else {\n      // Otherwise delegate to the template's host (which could be)\n      // another template instance\n      let templateHost = this.__dataHost.__dataHost;\n      if (templateHost) {\n        templateHost._addEventListenerToNode(node, eventName, handler);\n      }\n    }\n  }\n  /**\n   * Shows or hides the template instance top level child elements. For\n   * text nodes, `textContent` is removed while \"hidden\" and replaced when\n   * \"shown.\"\n   * @param {boolean} hide Set to true to hide the children;\n   * set to false to show them.\n   * @return {void}\n   * @protected\n   */\n  _showHideChildren(hide) {\n    showHideChildren(hide, this.children);\n  }\n  /**\n   * Overrides default property-effects implementation to intercept\n   * textContent bindings while children are \"hidden\" and cache in\n   * private storage for later retrieval.\n   *\n   * @override\n   * @param {!Node} node The node to set a property on\n   * @param {string} prop The property to set\n   * @param {*} value The value to set\n   * @return {void}\n   * @protected\n   */\n  _setUnmanagedPropertyToNode(node, prop, value) {\n    if (node.__hideTemplateChildren__ &&\n        node.nodeType == Node.TEXT_NODE && prop == 'textContent') {\n      node.__polymerTextContent__ = value;\n    } else {\n      super._setUnmanagedPropertyToNode(node, prop, value);\n    }\n  }\n  /**\n   * Find the parent model of this template instance.  The parent model\n   * is either another templatize instance that had option `parentModel: true`,\n   * or else the host element.\n   *\n   * @return {!Polymer_PropertyEffects} The parent model of this instance\n   */\n  get parentModel() {\n    let model = this.__parentModel;\n    if (!model) {\n      let options;\n      model = this;\n      do {\n        // A template instance's `__dataHost` is a <template>\n        // `model.__dataHost.__dataHost` is the template's host\n        model = model.__dataHost.__dataHost;\n      } while ((options = model.__templatizeOptions) && !options.parentModel);\n      this.__parentModel = model;\n    }\n    return model;\n  }\n\n  /**\n   * Stub of HTMLElement's `dispatchEvent`, so that effects that may\n   * dispatch events safely no-op.\n   *\n   * @param {Event} event Event to dispatch\n   * @return {boolean} Always true.\n   * @override\n   */\n   dispatchEvent(event) { // eslint-disable-line no-unused-vars\n     return true;\n  }\n}\n\n/** @type {!DataTemplate} */\nTemplateInstanceBase.prototype.__dataHost;\n/** @type {!TemplatizeOptions} */\nTemplateInstanceBase.prototype.__templatizeOptions;\n/** @type {!Polymer_PropertyEffects} */\nTemplateInstanceBase.prototype._methodHost;\n/** @type {!Object} */\nTemplateInstanceBase.prototype.__templatizeOwner;\n/** @type {!Object} */\nTemplateInstanceBase.prototype.__hostProps;\n\n/**\n * @constructor\n * @extends {TemplateInstanceBase}\n * @implements {Polymer_MutableData}\n * @private\n */\nconst MutableTemplateInstanceBase = MutableData(\n    // This cast shouldn't be neccessary, but Closure doesn't understand that\n    // TemplateInstanceBase is a constructor function.\n    /** @type {function(new:TemplateInstanceBase)} */ (TemplateInstanceBase));\n\nfunction findMethodHost(template) {\n  // Technically this should be the owner of the outermost template.\n  // In shadow dom, this is always getRootNode().host, but we can\n  // approximate this via cooperation with our dataHost always setting\n  // `_methodHost` as long as there were bindings (or id's) on this\n  // instance causing it to get a dataHost.\n  let templateHost = template.__dataHost;\n  return templateHost && templateHost._methodHost || templateHost;\n}\n\n/* eslint-disable valid-jsdoc */\n/**\n * @suppress {missingProperties} class.prototype is not defined for some reason\n */\nfunction createTemplatizerClass(template, templateInfo, options) {\n  /**\n   * @constructor\n   * @extends {TemplateInstanceBase}\n   */\n  let templatizerBase = options.mutableData ?\n    MutableTemplateInstanceBase : TemplateInstanceBase;\n\n  // Affordance for global mixins onto TemplatizeInstance\n  if (templatize.mixin) {\n    templatizerBase = templatize.mixin(templatizerBase);\n  }\n\n  /**\n   * Anonymous class created by the templatize\n   * @constructor\n   * @private\n   */\n  let klass = class extends templatizerBase { };\n  /** @override */\n  klass.prototype.__templatizeOptions = options;\n  klass.prototype._bindTemplate(template);\n  addNotifyEffects(klass, template, templateInfo, options);\n  return klass;\n}\n\n/**\n * Adds propagate effects from the template to the template instance for\n * properties that the host binds to the template using the `_host_` prefix.\n *\n * @suppress {missingProperties} class.prototype is not defined for some reason\n */\nfunction addPropagateEffects(target, templateInfo, options, methodHost) {\n  let userForwardHostProp = options.forwardHostProp;\n  if (userForwardHostProp && templateInfo.hasHostProps) {\n    // Under the `removeNestedTemplates` optimization, a custom element like\n    // `dom-if` or `dom-repeat` can itself be treated as the \"template\"; this\n    // flag is used to switch between upgrading a `<template>` to be a property\n    // effects client vs. adding the effects directly to the custom element\n    const isTemplate = target.localName == 'template';\n    // Provide data API and property effects on memoized template class\n    let klass = templateInfo.templatizeTemplateClass;\n    if (!klass) {\n      if (isTemplate) {\n        /**\n         * @constructor\n         * @extends {DataTemplate}\n         */\n        let templatizedBase =\n            options.mutableData ? MutableDataTemplate : DataTemplate;\n\n        // NOTE: due to https://github.com/google/closure-compiler/issues/2928,\n        // combining the next two lines into one assignment causes a spurious\n        // type error.\n        /** @private */\n        class TemplatizedTemplate extends templatizedBase {}\n        klass = templateInfo.templatizeTemplateClass = TemplatizedTemplate;\n      } else {\n        /**\n         * @constructor\n         * @extends {PolymerElement}\n         */\n        const templatizedBase = target.constructor;\n\n        // Create a cached subclass of the base custom element class onto which\n        // to put the template-specific propagate effects\n        // NOTE: due to https://github.com/google/closure-compiler/issues/2928,\n        // combining the next two lines into one assignment causes a spurious\n        // type error.\n        /** @private */\n        class TemplatizedTemplateExtension extends templatizedBase {}\n        klass = templateInfo.templatizeTemplateClass =\n            TemplatizedTemplateExtension;\n      }\n      // Add template - >instances effects\n      // and host <- template effects\n      let hostProps = templateInfo.hostProps;\n      for (let prop in hostProps) {\n        klass.prototype._addPropertyEffect('_host_' + prop,\n          klass.prototype.PROPERTY_EFFECT_TYPES.PROPAGATE,\n          {fn: createForwardHostPropEffect(prop, userForwardHostProp)});\n        klass.prototype._createNotifyingProperty('_host_' + prop);\n      }\n      if (legacyWarnings && methodHost) {\n        warnOnUndeclaredProperties(templateInfo, options, methodHost);\n      }\n    }\n    // Mix any pre-bound data into __data; no need to flush this to\n    // instances since they pull from the template at instance-time\n    if (target.__dataProto) {\n      // Note, generally `__dataProto` could be chained, but it's guaranteed\n      // to not be since this is a vanilla template we just added effects to\n      Object.assign(target.__data, target.__dataProto);\n    }\n    if (isTemplate) {\n      upgradeTemplate(target, klass);\n      // Clear any pending data for performance\n      target.__dataTemp = {};\n      target.__dataPending = null;\n      target.__dataOld = null;\n      target._enableProperties();\n    } else {\n      // Swizzle the cached subclass prototype onto the custom element\n      Object.setPrototypeOf(target, klass.prototype);\n      // Check for any pre-bound instance host properties, and do the\n      // instance property delete/assign dance for those (directly into data;\n      // not need to go through accessor since they are pulled at instance time)\n      const hostProps = templateInfo.hostProps;\n      for (let prop in hostProps) {\n        prop = '_host_' + prop;\n        if (prop in target) {\n          const val = target[prop];\n          delete target[prop];\n          target.__data[prop] = val;\n        }\n      }\n    }\n  }\n}\n/* eslint-enable valid-jsdoc */\n\nfunction createForwardHostPropEffect(hostProp, userForwardHostProp) {\n  return function forwardHostProp(template, prop, props) {\n    userForwardHostProp.call(template.__templatizeOwner,\n      prop.substring('_host_'.length), props[prop]);\n  };\n}\n\nfunction addNotifyEffects(klass, template, templateInfo, options) {\n  let hostProps = templateInfo.hostProps || {};\n  for (let iprop in options.instanceProps) {\n    delete hostProps[iprop];\n    let userNotifyInstanceProp = options.notifyInstanceProp;\n    if (userNotifyInstanceProp) {\n      klass.prototype._addPropertyEffect(iprop,\n        klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,\n        {fn: createNotifyInstancePropEffect(iprop, userNotifyInstanceProp)});\n    }\n  }\n  if (options.forwardHostProp && template.__dataHost) {\n    for (let hprop in hostProps) {\n      // As we're iterating hostProps in this function, note whether\n      // there were any, for an optimization in addPropagateEffects\n      if (!templateInfo.hasHostProps) {\n        templateInfo.hasHostProps = true;\n      }\n      klass.prototype._addPropertyEffect(hprop,\n        klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,\n        {fn: createNotifyHostPropEffect()});\n    }\n  }\n}\n\nfunction createNotifyInstancePropEffect(instProp, userNotifyInstanceProp) {\n  return function notifyInstanceProp(inst, prop, props) {\n    userNotifyInstanceProp.call(inst.__templatizeOwner,\n      inst, prop, props[prop]);\n  };\n}\n\nfunction createNotifyHostPropEffect() {\n  return function notifyHostProp(inst, prop, props) {\n    inst.__dataHost._setPendingPropertyOrPath('_host_' + prop, props[prop], true, true);\n  };\n}\n\n\n/**\n * Returns an anonymous `PropertyEffects` class bound to the\n * `<template>` provided.  Instancing the class will result in the\n * template being stamped into a document fragment stored as the instance's\n * `root` property, after which it can be appended to the DOM.\n *\n * Templates may utilize all Polymer data-binding features as well as\n * declarative event listeners.  Event listeners and inline computing\n * functions in the template will be called on the host of the template.\n *\n * The constructor returned takes a single argument dictionary of initial\n * property values to propagate into template bindings.  Additionally\n * host properties can be forwarded in, and instance properties can be\n * notified out by providing optional callbacks in the `options` dictionary.\n *\n * Valid configuration in `options` are as follows:\n *\n * - `forwardHostProp(property, value)`: Called when a property referenced\n *   in the template changed on the template's host. As this library does\n *   not retain references to templates instanced by the user, it is the\n *   templatize owner's responsibility to forward host property changes into\n *   user-stamped instances.  The `instance.forwardHostProp(property, value)`\n *    method on the generated class should be called to forward host\n *   properties into the template to prevent unnecessary property-changed\n *   notifications. Any properties referenced in the template that are not\n *   defined in `instanceProps` will be notified up to the template's host\n *   automatically.\n * - `instanceProps`: Dictionary of property names that will be added\n *   to the instance by the templatize owner.  These properties shadow any\n *   host properties, and changes within the template to these properties\n *   will result in `notifyInstanceProp` being called.\n * - `mutableData`: When `true`, the generated class will skip strict\n *   dirty-checking for objects and arrays (always consider them to be\n *   \"dirty\").\n * - `notifyInstanceProp(instance, property, value)`: Called when\n *   an instance property changes.  Users may choose to call `notifyPath`\n *   on e.g. the owner to notify the change.\n * - `parentModel`: When `true`, events handled by declarative event listeners\n *   (`on-event=\"handler\"`) will be decorated with a `model` property pointing\n *   to the template instance that stamped it.  It will also be returned\n *   from `instance.parentModel` in cases where template instance nesting\n *   causes an inner model to shadow an outer model.\n *\n * All callbacks are called bound to the `owner`. Any context\n * needed for the callbacks (such as references to `instances` stamped)\n * should be stored on the `owner` such that they can be retrieved via\n * `this`.\n *\n * When `options.forwardHostProp` is declared as an option, any properties\n * referenced in the template will be automatically forwarded from the host of\n * the `<template>` to instances, with the exception of any properties listed in\n * the `options.instanceProps` object.  `instanceProps` are assumed to be\n * managed by the owner of the instances, either passed into the constructor\n * or set after the fact.  Note, any properties passed into the constructor will\n * always be set to the instance (regardless of whether they would normally\n * be forwarded from the host).\n *\n * Note that `templatize()` can be run only once for a given `<template>`.\n * Further calls will result in an error. Also, there is a special\n * behavior if the template was duplicated through a mechanism such as\n * `<dom-repeat>` or `<test-fixture>`. In this case, all calls to\n * `templatize()` return the same class for all duplicates of a template.\n * The class returned from `templatize()` is generated only once using\n * the `options` from the first call. This means that any `options`\n * provided to subsequent calls will be ignored. Therefore, it is very\n * important not to close over any variables inside the callbacks. Also,\n * arrow functions must be avoided because they bind the outer `this`.\n * Inside the callbacks, any contextual information can be accessed\n * through `this`, which points to the `owner`.\n *\n * @param {!HTMLTemplateElement} template Template to templatize\n * @param {Polymer_PropertyEffects=} owner Owner of the template instances;\n *   any optional callbacks will be bound to this owner.\n * @param {Object=} options Options dictionary (see summary for details)\n * @return {function(new:TemplateInstanceBase, Object=)} Generated class bound\n *   to the template provided\n * @suppress {invalidCasts}\n */\nexport function templatize(template, owner, options) {\n  // Under strictTemplatePolicy, the templatized element must be owned\n  // by a (trusted) Polymer element, indicated by existence of _methodHost;\n  // e.g. for dom-if & dom-repeat in main document, _methodHost is null\n  if (strictTemplatePolicy && !findMethodHost(template)) {\n    throw new Error('strictTemplatePolicy: template owner not trusted');\n  }\n  options = /** @type {!TemplatizeOptions} */(options || {});\n  if (template.__templatizeOwner) {\n    throw new Error('A <template> can only be templatized once');\n  }\n  template.__templatizeOwner = owner;\n  const ctor = owner ? owner.constructor : TemplateInstanceBase;\n  let templateInfo = ctor._parseTemplate(template);\n  // Get memoized base class for the prototypical template, which\n  // includes property effects for binding template & forwarding\n  /**\n   * @constructor\n   * @extends {TemplateInstanceBase}\n   */\n  let baseClass = templateInfo.templatizeInstanceClass;\n  if (!baseClass) {\n    baseClass = createTemplatizerClass(template, templateInfo, options);\n    templateInfo.templatizeInstanceClass = baseClass;\n  }\n  const methodHost = findMethodHost(template);\n  // Host property forwarding must be installed onto template instance\n  addPropagateEffects(template, templateInfo, options, methodHost);\n  // Subclass base class and add reference for this specific template\n  /** @private */\n  let klass = class TemplateInstance extends baseClass {};\n  /** @override */\n  klass.prototype._methodHost = methodHost;\n  /** @override */\n  klass.prototype.__dataHost = /** @type {!DataTemplate} */ (template);\n  /** @override */\n  klass.prototype.__templatizeOwner = /** @type {!Object} */ (owner);\n  /** @override */\n  klass.prototype.__hostProps = templateInfo.hostProps;\n  klass = /** @type {function(new:TemplateInstanceBase)} */(klass); //eslint-disable-line no-self-assign\n  return klass;\n}\n\nfunction warnOnUndeclaredProperties(templateInfo, options, methodHost) {\n  const declaredProps = methodHost.constructor._properties;\n  const {propertyEffects} = templateInfo;\n  const {instanceProps} = options;\n  for (let prop in propertyEffects) {\n    // Ensure properties with template effects are declared on the outermost\n    // host (`methodHost`), unless they are instance props or static functions\n    if (!declaredProps[prop] && !(instanceProps && instanceProps[prop])) {\n      const effects = propertyEffects[prop];\n      for (let i=0; i<effects.length; i++) {\n        const {part} = effects[i].info;\n        if (!(part.signature && part.signature.static)) {\n          console.warn(`Property '${prop}' used in template but not ` +\n            `declared in 'properties'; attribute will not be observed.`);\n          break;\n        }\n      }\n    }\n  }\n}\n\n/**\n * Returns the template \"model\" associated with a given element, which\n * serves as the binding scope for the template instance the element is\n * contained in. A template model is an instance of\n * `TemplateInstanceBase`, and should be used to manipulate data\n * associated with this template instance.\n *\n * Example:\n *\n *   let model = modelForElement(el);\n *   if (model.index < 10) {\n *     model.set('item.checked', true);\n *   }\n *\n * @param {HTMLElement} template The model will be returned for\n *   elements stamped from this template (accepts either an HTMLTemplateElement)\n *   or a `<dom-if>`/`<dom-repeat>` element when using `removeNestedTemplates`\n *   optimization.\n * @param {Node=} node Node for which to return a template model.\n * @return {TemplateInstanceBase} Template instance representing the\n *   binding scope for the element\n */\nexport function modelForElement(template, node) {\n  let model;\n  while (node) {\n    // An element with a __templatizeInstance marks the top boundary\n    // of a scope; walk up until we find one, and then ensure that\n    // its __dataHost matches `this`, meaning this dom-repeat stamped it\n    if ((model = node.__dataHost ? node : node.__templatizeInstance)) {\n      // Found an element stamped by another template; keep walking up\n      // from its __dataHost\n      if (model.__dataHost != template) {\n        node = model.__dataHost;\n      } else {\n        return model;\n      }\n    } else {\n      // Still in a template scope, keep going up until\n      // a __templatizeInstance is found\n      node = wrap(node).parentNode;\n    }\n  }\n  return null;\n}\n\nexport { TemplateInstanceBase };\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/* eslint-disable valid-jsdoc */\n/**\n * Node wrapper to ensure ShadowDOM safe operation regardless of polyfill\n * presence or mode. Note that with the introduction of `ShadyDOM.noPatch`,\n * a node wrapper must be used to access ShadowDOM API.\n * This is similar to using `Polymer.dom` but relies exclusively\n * on the presence of the ShadyDOM polyfill rather than requiring the loading\n * of legacy (Polymer.dom) API.\n * @type {function(Node):Node}\n */\nexport const wrap = (window['ShadyDOM'] && window['ShadyDOM']['noPatch'] && window['ShadyDOM']['wrap']) ?\n  window['ShadyDOM']['wrap'] :\n  (window['ShadyDOM'] ? (n) => ShadyDOM['patch'](n) : (n) => n);\n\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport { ElementMixin, version } from './lib/mixins/element-mixin.js';\nexport { html } from './lib/utils/html-tag.js';\n\nexport { version };\n\n/**\n * Base class that provides the core API for Polymer's meta-programming\n * features including template stamping, data-binding, attribute deserialization,\n * and property change observation.\n *\n * @customElement\n * @polymer\n * @constructor\n * @implements {Polymer_ElementMixin}\n * @extends HTMLElement\n * @appliesMixin ElementMixin\n * @summary Custom element base class that provides the core API for Polymer's\n *   key meta-programming features including template stamping, data-binding,\n *   attribute deserialization, and property change observation\n */\nexport const PolymerElement = ElementMixin(HTMLElement);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * @fileoverview\n *\n * Module to hide `<dom-bind>`, `<dom-if>`, and `<dom-repeat>` elements\n * optimally in ShadyDOM\n */\n\nimport {legacyOptimizations, useShadow} from './settings.js';\n\nlet elementsHidden = false;\n\n/**\n * @return {boolean} True if elements will be hidden globally\n */\nexport function hideElementsGlobally() {\n  if (legacyOptimizations && !useShadow) {\n    if (!elementsHidden) {\n      elementsHidden = true;\n      const style = document.createElement('style');\n      style.textContent = 'dom-bind,dom-if,dom-repeat{display:none;}';\n      document.head.appendChild(style);\n    }\n    return true;\n  }\n  return false;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '../utils/boot.js';\n\nimport { PropertyEffects } from '../mixins/property-effects.js';\nimport { OptionalMutableData } from '../mixins/mutable-data.js';\nimport { GestureEventListeners } from '../mixins/gesture-event-listeners.js';\nimport { strictTemplatePolicy } from '../utils/settings.js';\nimport { wrap } from '../utils/wrap.js';\nimport { hideElementsGlobally } from '../utils/hide-template-controls.js';\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @implements {Polymer_PropertyEffects}\n * @implements {Polymer_OptionalMutableData}\n * @implements {Polymer_GestureEventListeners}\n * @private\n */\nconst domBindBase =\n  GestureEventListeners(\n    OptionalMutableData(\n      PropertyEffects(HTMLElement)));\n\n/**\n * Custom element to allow using Polymer's template features (data binding,\n * declarative event listeners, etc.) in the main document without defining\n * a new custom element.\n *\n * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>`\n * element, which will immediately stamp the wrapped template into the main\n * document and bind elements to the `dom-bind` element itself as the\n * binding scope.\n *\n * @polymer\n * @customElement\n * @appliesMixin PropertyEffects\n * @appliesMixin OptionalMutableData\n * @appliesMixin GestureEventListeners\n * @extends {domBindBase}\n * @summary Custom element to allow using Polymer's template features (data\n *   binding, declarative event listeners, etc.) in the main document.\n */\nexport class DomBind extends domBindBase {\n\n  static get observedAttributes() { return ['mutable-data']; }\n\n  constructor() {\n    super();\n    if (strictTemplatePolicy) {\n      throw new Error(`strictTemplatePolicy: dom-bind not allowed`);\n    }\n    this.root = null;\n    this.$ = null;\n    this.__children = null;\n  }\n\n  /* eslint-disable no-unused-vars */\n  /**\n   * @override\n   * @param {string} name Name of attribute that changed\n   * @param {?string} old Old attribute value\n   * @param {?string} value New attribute value\n   * @param {?string} namespace Attribute namespace.\n   * @return {void}\n   */\n  attributeChangedCallback(name, old, value, namespace) {\n    // assumes only one observed attribute\n    this.mutableData = true;\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  connectedCallback() {\n    if (!hideElementsGlobally()) {\n      this.style.display = 'none';\n    }\n    this.render();\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  disconnectedCallback() {\n    this.__removeChildren();\n  }\n\n  __insertChildren() {\n    wrap(wrap(this).parentNode).insertBefore(this.root, this);\n  }\n\n  __removeChildren() {\n    if (this.__children) {\n      for (let i=0; i<this.__children.length; i++) {\n        this.root.appendChild(this.__children[i]);\n      }\n    }\n  }\n\n  /**\n   * Forces the element to render its content. This is typically only\n   * necessary to call if HTMLImports with the async attribute are used.\n   * @return {void}\n   */\n  render() {\n    let template;\n    if (!this.__children) {\n      template = /** @type {?HTMLTemplateElement} */(template || this.querySelector('template'));\n      if (!template) {\n        // Wait until childList changes and template should be there by then\n        let observer = new MutationObserver(() => {\n          template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));\n          if (template) {\n            observer.disconnect();\n            this.render();\n          } else {\n            throw new Error('dom-bind requires a <template> child');\n          }\n        });\n        observer.observe(this, {childList: true});\n        return;\n      }\n      this.root = this._stampTemplate(\n        /** @type {!HTMLTemplateElement} */(template));\n      this.$ = this.root.$;\n      this.__children = [];\n      for (let n=this.root.firstChild; n; n=n.nextSibling) {\n        this.__children[this.__children.length] = n;\n      }\n      this._enableProperties();\n    }\n    this.__insertChildren();\n    this.dispatchEvent(new CustomEvent('dom-change', {\n      bubbles: true,\n      composed: true\n    }));\n  }\n\n}\n\ncustomElements.define('dom-bind', DomBind);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { PolymerElement } from '../../polymer-element.js';\n\nimport { TemplateInstanceBase, templatize, modelForElement } from '../utils/templatize.js'; // eslint-disable-line no-unused-vars\nimport { Debouncer } from '../utils/debounce.js';\nimport { enqueueDebouncer, flush } from '../utils/flush.js';\nimport { OptionalMutableData } from '../mixins/mutable-data.js';\nimport { matches, translate } from '../utils/path.js';\nimport { timeOut, microTask } from '../utils/async.js';\nimport { wrap } from '../utils/wrap.js';\nimport { hideElementsGlobally } from '../utils/hide-template-controls.js';\nimport { suppressTemplateNotifications } from '../utils/settings.js';\n\n/**\n * @constructor\n * @implements {Polymer_OptionalMutableData}\n * @extends {PolymerElement}\n * @private\n */\nconst domRepeatBase = OptionalMutableData(PolymerElement);\n\n/**\n * The `<dom-repeat>` element will automatically stamp and binds one instance\n * of template content to each object in a user-provided array.\n * `dom-repeat` accepts an `items` property, and one instance of the template\n * is stamped for each item into the DOM at the location of the `dom-repeat`\n * element.  The `item` property will be set on each instance's binding\n * scope, thus templates should bind to sub-properties of `item`.\n *\n * Example:\n *\n * ```html\n * <dom-module id=\"employee-list\">\n *\n *   <template>\n *\n *     <div> Employee list: </div>\n *     <dom-repeat items=\"{{employees}}\">\n *       <template>\n *         <div>First name: <span>{{item.first}}</span></div>\n *         <div>Last name: <span>{{item.last}}</span></div>\n *       </template>\n *     </dom-repeat>\n *\n *   </template>\n *\n * </dom-module>\n * ```\n *\n * With the following custom element definition:\n *\n * ```js\n * class EmployeeList extends PolymerElement {\n *   static get is() { return 'employee-list'; }\n *   static get properties() {\n *     return {\n *       employees: {\n *         value() {\n *           return [\n *             {first: 'Bob', last: 'Smith'},\n *             {first: 'Sally', last: 'Johnson'},\n *             ...\n *           ];\n *         }\n *       }\n *     };\n *   }\n * }\n * ```\n *\n * Notifications for changes to items sub-properties will be forwarded to template\n * instances, which will update via the normal structured data notification system.\n *\n * Mutations to the `items` array itself should be made using the Array\n * mutation API's on the PropertyEffects mixin (`push`, `pop`, `splice`,\n * `shift`, `unshift`), and template instances will be kept in sync with the\n * data in the array.\n *\n * Events caught by event handlers within the `dom-repeat` template will be\n * decorated with a `model` property, which represents the binding scope for\n * each template instance.  The model should be used to manipulate data on the\n * instance, for example `event.model.set('item.checked', true);`.\n *\n * Alternatively, the model for a template instance for an element stamped by\n * a `dom-repeat` can be obtained using the `modelForElement` API on the\n * `dom-repeat` that stamped it, for example\n * `this.$.domRepeat.modelForElement(event.target).set('item.checked', true);`.\n * This may be useful for manipulating instance data of event targets obtained\n * by event handlers on parents of the `dom-repeat` (event delegation).\n *\n * A view-specific filter/sort may be applied to each `dom-repeat` by supplying a\n * `filter` and/or `sort` property.  This may be a string that names a function on\n * the host, or a function may be assigned to the property directly.  The functions\n * should implemented following the standard `Array` filter/sort API.\n *\n * In order to re-run the filter or sort functions based on changes to sub-fields\n * of `items`, the `observe` property may be set as a space-separated list of\n * `item` sub-fields that should cause a re-filter/sort when modified.  If\n * the filter or sort function depends on properties not contained in `items`,\n * the user should observe changes to those properties and call `render` to update\n * the view based on the dependency change.\n *\n * For example, for an `dom-repeat` with a filter of the following:\n *\n * ```js\n * isEngineer(item) {\n *   return item.type == 'engineer' || item.manager.type == 'engineer';\n * }\n * ```\n *\n * Then the `observe` property should be configured as follows:\n *\n * ```html\n * <dom-repeat items=\"{{employees}}\" filter=\"isEngineer\" observe=\"type manager.type\">\n * ```\n *\n * @customElement\n * @polymer\n * @extends {domRepeatBase}\n * @appliesMixin OptionalMutableData\n * @summary Custom element for stamping instance of a template bound to\n *   items in an array.\n */\nexport class DomRepeat extends domRepeatBase {\n\n  // Not needed to find template; can be removed once the analyzer\n  // can find the tag name from customElements.define call\n  static get is() { return 'dom-repeat'; }\n\n  static get template() { return null; }\n\n  static get properties() {\n\n    /**\n     * Fired whenever DOM is added or removed by this template (by\n     * default, rendering occurs lazily).  To force immediate rendering, call\n     * `render`.\n     *\n     * @event dom-change\n     */\n    return {\n\n      /**\n       * An array containing items determining how many instances of the template\n       * to stamp and that that each template instance should bind to.\n       */\n      items: {\n        type: Array\n      },\n\n      /**\n       * The name of the variable to add to the binding scope for the array\n       * element associated with a given template instance.\n       */\n      as: {\n        type: String,\n        value: 'item'\n      },\n\n      /**\n       * The name of the variable to add to the binding scope with the index\n       * of the instance in the sorted and filtered list of rendered items.\n       * Note, for the index in the `this.items` array, use the value of the\n       * `itemsIndexAs` property.\n       */\n      indexAs: {\n        type: String,\n        value: 'index'\n      },\n\n      /**\n       * The name of the variable to add to the binding scope with the index\n       * of the instance in the `this.items` array. Note, for the index of\n       * this instance in the sorted and filtered list of rendered items,\n       * use the value of the `indexAs` property.\n       */\n      itemsIndexAs: {\n        type: String,\n        value: 'itemsIndex'\n      },\n\n      /**\n       * A function that should determine the sort order of the items.  This\n       * property should either be provided as a string, indicating a method\n       * name on the element's host, or else be an actual function.  The\n       * function should match the sort function passed to `Array.sort`.\n       * Using a sort function has no effect on the underlying `items` array.\n       */\n      sort: {\n        type: Function,\n        observer: '__sortChanged'\n      },\n\n      /**\n       * A function that can be used to filter items out of the view.  This\n       * property should either be provided as a string, indicating a method\n       * name on the element's host, or else be an actual function.  The\n       * function should match the sort function passed to `Array.filter`.\n       * Using a filter function has no effect on the underlying `items` array.\n       */\n      filter: {\n        type: Function,\n        observer: '__filterChanged'\n      },\n\n      /**\n       * When using a `filter` or `sort` function, the `observe` property\n       * should be set to a space-separated list of the names of item\n       * sub-fields that should trigger a re-sort or re-filter when changed.\n       * These should generally be fields of `item` that the sort or filter\n       * function depends on.\n       */\n      observe: {\n        type: String,\n        observer: '__observeChanged'\n      },\n\n      /**\n       * When using a `filter` or `sort` function, the `delay` property\n       * determines a debounce time in ms after a change to observed item\n       * properties that must pass before the filter or sort is re-run.\n       * This is useful in rate-limiting shuffling of the view when\n       * item changes may be frequent.\n       */\n      delay: Number,\n\n      /**\n       * Count of currently rendered items after `filter` (if any) has been applied.\n       * If \"chunking mode\" is enabled, `renderedItemCount` is updated each time a\n       * set of template instances is rendered.\n       *\n       */\n      renderedItemCount: {\n        type: Number,\n        notify: !suppressTemplateNotifications,\n        readOnly: true\n      },\n\n      /**\n       * When greater than zero, defines an initial count of template instances\n       * to render after setting the `items` array, before the next paint, and\n       * puts the `dom-repeat` into \"chunking mode\".  The remaining items (and\n       * any future items as a result of pushing onto the array) will be created\n       * and rendered incrementally at each animation frame thereof until all\n       * instances have been rendered.\n       */\n      initialCount: {\n        type: Number\n      },\n\n      /**\n       * When `initialCount` is used, this property defines a frame rate (in\n       * fps) to target by throttling the number of instances rendered each\n       * frame to not exceed the budget for the target frame rate.  The\n       * framerate is effectively the number of `requestAnimationFrame`s that\n       * it tries to allow to actually fire in a given second. It does this\n       * by measuring the time between `rAF`s and continuously adjusting the\n       * number of items created each `rAF` to maintain the target framerate.\n       * Setting this to a higher number allows lower latency and higher\n       * throughput for event handlers and other tasks, but results in a\n       * longer time for the remaining items to complete rendering.\n       */\n      targetFramerate: {\n        type: Number,\n        value: 20\n      },\n\n      _targetFrameTime: {\n        type: Number,\n        computed: '__computeFrameTime(targetFramerate)'\n      },\n\n      /**\n       * When the global `suppressTemplateNotifications` setting is used, setting\n       * `notifyDomChange: true` will enable firing `dom-change` events on this\n       * element.\n       */\n      notifyDomChange: {\n        type: Boolean\n      },\n\n      /**\n       * When chunking is enabled via `initialCount` and the `items` array is\n       * set to a new array, this flag controls whether the previously rendered\n       * instances are reused or not.\n       *\n       * When `true`, any previously rendered template instances are updated in\n       * place to their new item values synchronously in one shot, and then any\n       * further items (if any) are chunked out.  When `false`, the list is\n       * returned back to its `initialCount` (any instances over the initial\n       * count are discarded) and the remainder of the list is chunked back in.\n       * Set this to `true` to avoid re-creating the list and losing scroll\n       * position, although note that when changing the list to completely\n       * different data the render thread will be blocked until all existing\n       * instances are updated to their new data.\n       */\n      reuseChunkedInstances: {\n        type: Boolean\n      }\n\n    };\n\n  }\n\n  static get observers() {\n    return [ '__itemsChanged(items.*)' ];\n  }\n\n  constructor() {\n    super();\n    this.__instances = [];\n    this.__renderDebouncer = null;\n    this.__itemsIdxToInstIdx = {};\n    this.__chunkCount = null;\n    this.__renderStartTime = null;\n    this.__itemsArrayChanged = false;\n    this.__shouldMeasureChunk = false;\n    this.__shouldContinueChunking = false;\n    this.__chunkingId = 0;\n    this.__sortFn = null;\n    this.__filterFn = null;\n    this.__observePaths = null;\n    /** @type {?function(new:TemplateInstanceBase, Object=)} */\n    this.__ctor = null;\n    this.__isDetached = true;\n    this.template = null;\n    /** @type {TemplateInfo} */\n    this._templateInfo;\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.__isDetached = true;\n    for (let i=0; i<this.__instances.length; i++) {\n      this.__detachInstance(i);\n    }\n    // Stop chunking if one was in progress\n    if (this.__chunkingId) {\n      cancelAnimationFrame(this.__chunkingId);\n    }\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  connectedCallback() {\n    super.connectedCallback();\n    if (!hideElementsGlobally()) {\n      this.style.display = 'none';\n    }\n    // only perform attachment if the element was previously detached.\n    if (this.__isDetached) {\n      this.__isDetached = false;\n      let wrappedParent = wrap(wrap(this).parentNode);\n      for (let i=0; i<this.__instances.length; i++) {\n        this.__attachInstance(i, wrappedParent);\n      }\n      // Restart chunking if one was in progress when disconnected\n      if (this.__chunkingId) {\n        this.__render();\n      }\n    }\n  }\n\n  __ensureTemplatized() {\n    // Templatizing (generating the instance constructor) needs to wait\n    // until ready, since won't have its template content handed back to\n    // it until then\n    if (!this.__ctor) {\n      // When `removeNestedTemplates` is true, the \"template\" is the element\n      // itself, which has been given a `_templateInfo` property\n      const thisAsTemplate = /** @type {!HTMLTemplateElement} */ (\n          /** @type {!HTMLElement} */ (this));\n      let template = this.template = thisAsTemplate._templateInfo ?\n          thisAsTemplate :\n          /** @type {!HTMLTemplateElement} */ (this.querySelector('template'));\n      if (!template) {\n        // Wait until childList changes and template should be there by then\n        let observer = new MutationObserver(() => {\n          if (this.querySelector('template')) {\n            observer.disconnect();\n            this.__render();\n          } else {\n            throw new Error('dom-repeat requires a <template> child');\n          }\n        });\n        observer.observe(this, {childList: true});\n        return false;\n      }\n      // Template instance props that should be excluded from forwarding\n      let instanceProps = {};\n      instanceProps[this.as] = true;\n      instanceProps[this.indexAs] = true;\n      instanceProps[this.itemsIndexAs] = true;\n      this.__ctor = templatize(template, this, {\n        mutableData: this.mutableData,\n        parentModel: true,\n        instanceProps: instanceProps,\n        /**\n         * @this {DomRepeat}\n         * @param {string} prop Property to set\n         * @param {*} value Value to set property to\n         */\n        forwardHostProp: function(prop, value) {\n          let i$ = this.__instances;\n          for (let i=0, inst; (i<i$.length) && (inst=i$[i]); i++) {\n            inst.forwardHostProp(prop, value);\n          }\n        },\n        /**\n         * @this {DomRepeat}\n         * @param {Object} inst Instance to notify\n         * @param {string} prop Property to notify\n         * @param {*} value Value to notify\n         */\n        notifyInstanceProp: function(inst, prop, value) {\n          if (matches(this.as, prop)) {\n            let idx = inst[this.itemsIndexAs];\n            if (prop == this.as) {\n              this.items[idx] = value;\n            }\n            let path = translate(this.as, `${JSCompiler_renameProperty('items', this)}.${idx}`, prop);\n            this.notifyPath(path, value);\n          }\n        }\n      });\n    }\n    return true;\n  }\n\n  __getMethodHost() {\n    // Technically this should be the owner of the outermost template.\n    // In shadow dom, this is always getRootNode().host, but we can\n    // approximate this via cooperation with our dataHost always setting\n    // `_methodHost` as long as there were bindings (or id's) on this\n    // instance causing it to get a dataHost.\n    return this.__dataHost._methodHost || this.__dataHost;\n  }\n\n  __functionFromPropertyValue(functionOrMethodName) {\n    if (typeof functionOrMethodName === 'string') {\n      let methodName = functionOrMethodName;\n      let obj = this.__getMethodHost();\n      return function() { return obj[methodName].apply(obj, arguments); };\n    }\n\n    return functionOrMethodName;\n  }\n\n  __sortChanged(sort) {\n    this.__sortFn = this.__functionFromPropertyValue(sort);\n    if (this.items) { this.__debounceRender(this.__render); }\n  }\n\n  __filterChanged(filter) {\n    this.__filterFn = this.__functionFromPropertyValue(filter);\n    if (this.items) { this.__debounceRender(this.__render); }\n  }\n\n  __computeFrameTime(rate) {\n    return Math.ceil(1000/rate);\n  }\n\n  __observeChanged() {\n    this.__observePaths = this.observe &&\n      this.observe.replace('.*', '.').split(' ');\n  }\n\n  __handleObservedPaths(path) {\n    // Handle cases where path changes should cause a re-sort/filter\n    if (this.__sortFn || this.__filterFn) {\n      if (!path) {\n        // Always re-render if the item itself changed\n        this.__debounceRender(this.__render, this.delay);\n      } else if (this.__observePaths) {\n        // Otherwise, re-render if the path changed matches an observed path\n        let paths = this.__observePaths;\n        for (let i=0; i<paths.length; i++) {\n          if (path.indexOf(paths[i]) === 0) {\n            this.__debounceRender(this.__render, this.delay);\n          }\n        }\n      }\n    }\n  }\n\n  __itemsChanged(change) {\n    if (this.items && !Array.isArray(this.items)) {\n      console.warn('dom-repeat expected array for `items`, found', this.items);\n    }\n    // If path was to an item (e.g. 'items.3' or 'items.3.foo'), forward the\n    // path to that instance synchronously (returns false for non-item paths)\n    if (!this.__handleItemPath(change.path, change.value)) {\n      // Otherwise, the array was reset ('items') or spliced ('items.splices'),\n      // so queue a render.  Restart chunking when the items changed (for\n      // backward compatibility), unless `reuseChunkedInstances` option is set\n      if (change.path === 'items') {\n        this.__itemsArrayChanged = true;\n      }\n      this.__debounceRender(this.__render);\n    }\n  }\n\n  /**\n   * @param {function(this:DomRepeat)} fn Function to debounce.\n   * @param {number=} delay Delay in ms to debounce by.\n   */\n  __debounceRender(fn, delay = 0) {\n    this.__renderDebouncer = Debouncer.debounce(\n          this.__renderDebouncer\n        , delay > 0 ? timeOut.after(delay) : microTask\n        , fn.bind(this));\n    enqueueDebouncer(this.__renderDebouncer);\n  }\n\n  /**\n   * Forces the element to render its content. Normally rendering is\n   * asynchronous to a provoking change. This is done for efficiency so\n   * that multiple changes trigger only a single render. The render method\n   * should be called if, for example, template rendering is required to\n   * validate application state.\n   * @return {void}\n   */\n  render() {\n    // Queue this repeater, then flush all in order\n    this.__debounceRender(this.__render);\n    flush();\n  }\n\n  __render() {\n    if (!this.__ensureTemplatized()) {\n      // No template found yet\n      return;\n    }\n    let items = this.items || [];\n    // Sort and filter the items into a mapping array from instance->item\n    const isntIdxToItemsIdx = this.__sortAndFilterItems(items);\n    // If we're chunking, increase the limit if there are new instances to\n    // create and schedule the next chunk\n    const limit = this.__calculateLimit(isntIdxToItemsIdx.length);\n    // Create, update, and/or remove instances\n    this.__updateInstances(items, limit, isntIdxToItemsIdx);\n    // If we're chunking, schedule a rAF task to measure/continue chunking.     \n    // Do this before any notifying events (renderedItemCount & dom-change)\n    // since those could modify items and enqueue a new full render which will\n    // pre-empt this measurement.\n    if (this.initialCount &&\n       (this.__shouldMeasureChunk || this.__shouldContinueChunking)) {\n      cancelAnimationFrame(this.__chunkingId);\n      this.__chunkingId = requestAnimationFrame(() => {\n        this.__chunkingId = null;\n        this.__continueChunking();\n      });\n    }\n    // Set rendered item count\n    this._setRenderedItemCount(this.__instances.length);\n    // Notify users\n    if (!suppressTemplateNotifications || this.notifyDomChange) {\n      this.dispatchEvent(new CustomEvent('dom-change', {\n        bubbles: true,\n        composed: true\n      }));\n    }\n  }\n\n  __sortAndFilterItems(items) {\n    // Generate array maping the instance index to the items array index\n    let isntIdxToItemsIdx = new Array(items.length);\n    for (let i=0; i<items.length; i++) {\n      isntIdxToItemsIdx[i] = i;\n    }\n    // Apply user filter\n    if (this.__filterFn) {\n      isntIdxToItemsIdx = isntIdxToItemsIdx.filter((i, idx, array) =>\n        this.__filterFn(items[i], idx, array));\n    }\n    // Apply user sort\n    if (this.__sortFn) {\n      isntIdxToItemsIdx.sort((a, b) => this.__sortFn(items[a], items[b]));\n    }\n    return isntIdxToItemsIdx;\n  }\n\n  __calculateLimit(filteredItemCount) {\n    let limit = filteredItemCount;\n    const currentCount = this.__instances.length;\n    // When chunking, we increase the limit from the currently rendered count\n    // by the chunk count that is re-calculated after each rAF (with special\n    // cases for resetting the limit to initialCount after changing items)\n    if (this.initialCount) {\n      let newCount;\n      if (!this.__chunkCount ||\n        (this.__itemsArrayChanged && !this.reuseChunkedInstances)) {\n        // Limit next render to the initial count\n        limit = Math.min(filteredItemCount, this.initialCount);\n        // Subtract off any existing instances to determine the number of\n        // instances that will be created\n        newCount = Math.max(limit - currentCount, 0);\n        // Initialize the chunk size with how many items we're creating\n        this.__chunkCount = newCount || 1;\n      } else {\n        // The number of new instances that will be created is based on the\n        // existing instances, the new list size, and the chunk size\n        newCount = Math.min(\n          Math.max(filteredItemCount - currentCount, 0), \n          this.__chunkCount);\n        // Update the limit based on how many new items we're making, limited\n        // buy the total size of the list\n        limit = Math.min(currentCount + newCount, filteredItemCount);\n      }\n      // Record some state about chunking for use in `__continueChunking`\n      this.__shouldMeasureChunk = newCount === this.__chunkCount;\n      this.__shouldContinueChunking = limit < filteredItemCount;\n      this.__renderStartTime = performance.now();\n    }\n    this.__itemsArrayChanged = false;\n    return limit;\n  }\n\n  __continueChunking() {\n    // Simple auto chunkSize throttling algorithm based on feedback loop:\n    // measure actual time between frames and scale chunk count by ratio of\n    // target/actual frame time.  Only modify chunk size if our measurement\n    // reflects the cost of a creating a full chunk's worth of instances; this\n    // avoids scaling up the chunk size if we e.g. quickly re-rendered instances\n    // in place\n    if (this.__shouldMeasureChunk) {\n      const renderTime = performance.now() - this.__renderStartTime;\n      const ratio = this._targetFrameTime / renderTime;\n      this.__chunkCount = Math.round(this.__chunkCount * ratio) || 1;\n    }\n    // Enqueue a new render if we haven't reached the full size of the list\n    if (this.__shouldContinueChunking) {\n      this.__debounceRender(this.__render);\n    }\n  }\n  \n  __updateInstances(items, limit, isntIdxToItemsIdx) {\n    // items->inst map kept for item path forwarding\n    const itemsIdxToInstIdx = this.__itemsIdxToInstIdx = {};\n    let instIdx;\n    // Generate instances and assign items\n    for (instIdx=0; instIdx<limit; instIdx++) {\n      let inst = this.__instances[instIdx];\n      let itemIdx = isntIdxToItemsIdx[instIdx];\n      let item = items[itemIdx];\n      itemsIdxToInstIdx[itemIdx] = instIdx;\n      if (inst) {\n        inst._setPendingProperty(this.as, item);\n        inst._setPendingProperty(this.indexAs, instIdx);\n        inst._setPendingProperty(this.itemsIndexAs, itemIdx);\n        inst._flushProperties();\n      } else {\n        this.__insertInstance(item, instIdx, itemIdx);\n      }\n    }\n    // Remove any extra instances from previous state\n    for (let i=this.__instances.length-1; i>=instIdx; i--) {\n      this.__detachAndRemoveInstance(i);\n    }\n  }\n\n  __detachInstance(idx) {\n    let inst = this.__instances[idx];\n    const wrappedRoot = wrap(inst.root);\n    for (let i=0; i<inst.children.length; i++) {\n      let el = inst.children[i];\n      wrappedRoot.appendChild(el);\n    }\n    return inst;\n  }\n\n  __attachInstance(idx, parent) {\n    let inst = this.__instances[idx];\n    // Note, this is pre-wrapped as an optimization\n    parent.insertBefore(inst.root, this);\n  }\n\n  __detachAndRemoveInstance(idx) {\n    this.__detachInstance(idx);\n    this.__instances.splice(idx, 1);\n  }\n\n  __stampInstance(item, instIdx, itemIdx) {\n    let model = {};\n    model[this.as] = item;\n    model[this.indexAs] = instIdx;\n    model[this.itemsIndexAs] = itemIdx;\n    return new this.__ctor(model);\n  }\n\n  __insertInstance(item, instIdx, itemIdx) {\n    const inst = this.__stampInstance(item, instIdx, itemIdx);\n    let beforeRow = this.__instances[instIdx + 1];\n    let beforeNode = beforeRow ? beforeRow.children[0] : this;\n    wrap(wrap(this).parentNode).insertBefore(inst.root, beforeNode);\n    this.__instances[instIdx] = inst;\n    return inst;\n  }\n\n  // Implements extension point from Templatize mixin\n  /**\n   * Shows or hides the template instance top level child elements. For\n   * text nodes, `textContent` is removed while \"hidden\" and replaced when\n   * \"shown.\"\n   * @param {boolean} hidden Set to true to hide the children;\n   * set to false to show them.\n   * @return {void}\n   * @protected\n   */\n  _showHideChildren(hidden) {\n    for (let i=0; i<this.__instances.length; i++) {\n      this.__instances[i]._showHideChildren(hidden);\n    }\n  }\n\n  // Called as a side effect of a host items.<key>.<path> path change,\n  // responsible for notifying item.<path> changes to inst for key\n  __handleItemPath(path, value) {\n    let itemsPath = path.slice(6); // 'items.'.length == 6\n    let dot = itemsPath.indexOf('.');\n    let itemsIdx = dot < 0 ? itemsPath : itemsPath.substring(0, dot);\n    // If path was index into array...\n    if (itemsIdx == parseInt(itemsIdx, 10)) {\n      let itemSubPath = dot < 0 ? '' : itemsPath.substring(dot+1);\n      // If the path is observed, it will trigger a full refresh\n      this.__handleObservedPaths(itemSubPath);\n      // Note, even if a rull refresh is triggered, always do the path\n      // notification because unless mutableData is used for dom-repeat\n      // and all elements in the instance subtree, a full refresh may\n      // not trigger the proper update.\n      let instIdx = this.__itemsIdxToInstIdx[itemsIdx];\n      let inst = this.__instances[instIdx];\n      if (inst) {\n        let itemPath = this.as + (itemSubPath ? '.' + itemSubPath : '');\n        // This is effectively `notifyPath`, but avoids some of the overhead\n        // of the public API\n        inst._setPendingPropertyOrPath(itemPath, value, false, true);\n        inst._flushProperties();\n      }\n      return true;\n    }\n  }\n\n  /**\n   * Returns the item associated with a given element stamped by\n   * this `dom-repeat`.\n   *\n   * Note, to modify sub-properties of the item,\n   * `modelForElement(el).set('item.<sub-prop>', value)`\n   * should be used.\n   *\n   * @param {!HTMLElement} el Element for which to return the item.\n   * @return {*} Item associated with the element.\n   */\n  itemForElement(el) {\n    let instance = this.modelForElement(el);\n    return instance && instance[this.as];\n  }\n\n  /**\n   * Returns the inst index for a given element stamped by this `dom-repeat`.\n   * If `sort` is provided, the index will reflect the sorted order (rather\n   * than the original array order).\n   *\n   * @param {!HTMLElement} el Element for which to return the index.\n   * @return {?number} Row index associated with the element (note this may\n   *   not correspond to the array index if a user `sort` is applied).\n   */\n  indexForElement(el) {\n    let instance = this.modelForElement(el);\n    return instance && instance[this.indexAs];\n  }\n\n  /**\n   * Returns the template \"model\" associated with a given element, which\n   * serves as the binding scope for the template instance the element is\n   * contained in. A template model\n   * should be used to manipulate data associated with this template instance.\n   *\n   * Example:\n   *\n   *   let model = modelForElement(el);\n   *   if (model.index < 10) {\n   *     model.set('item.checked', true);\n   *   }\n   *\n   * @param {!HTMLElement} el Element for which to return a template model.\n   * @return {TemplateInstanceBase} Model representing the binding scope for\n   *   the element.\n   */\n  modelForElement(el) {\n    return modelForElement(this.template, el);\n  }\n\n}\n\ncustomElements.define(DomRepeat.is, DomRepeat);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { PolymerElement } from '../../polymer-element.js';\n\nimport { Debouncer } from '../utils/debounce.js';\nimport { enqueueDebouncer, flush } from '../utils/flush.js';\nimport { microTask } from '../utils/async.js';\nimport { root } from '../utils/path.js';\nimport { wrap } from '../utils/wrap.js';\nimport { hideElementsGlobally } from '../utils/hide-template-controls.js';\nimport { fastDomIf, strictTemplatePolicy, suppressTemplateNotifications } from '../utils/settings.js';\nimport { showHideChildren, templatize } from '../utils/templatize.js';\n\n/**\n * @customElement\n * @polymer\n * @extends PolymerElement\n * @summary Base class for dom-if element; subclassed into concrete\n *   implementation.\n */\nclass DomIfBase extends PolymerElement {\n\n  // Not needed to find template; can be removed once the analyzer\n  // can find the tag name from customElements.define call\n  static get is() { return 'dom-if'; }\n\n  static get template() { return null; }\n\n  static get properties() {\n\n    return {\n\n      /**\n       * Fired whenever DOM is added or removed/hidden by this template (by\n       * default, rendering occurs lazily).  To force immediate rendering, call\n       * `render`.\n       *\n       * @event dom-change\n       */\n\n      /**\n       * A boolean indicating whether this template should stamp.\n       */\n      if: {\n        type: Boolean,\n        observer: '__debounceRender'\n      },\n\n      /**\n       * When true, elements will be removed from DOM and discarded when `if`\n       * becomes false and re-created and added back to the DOM when `if`\n       * becomes true.  By default, stamped elements will be hidden but left\n       * in the DOM when `if` becomes false, which is generally results\n       * in better performance.\n       */\n      restamp: {\n        type: Boolean,\n        observer: '__debounceRender'\n      },\n\n      /**\n       * When the global `suppressTemplateNotifications` setting is used, setting\n       * `notifyDomChange: true` will enable firing `dom-change` events on this\n       * element.\n       */\n      notifyDomChange: {\n        type: Boolean\n      }\n    };\n\n  }\n\n  constructor() {\n    super();\n    this.__renderDebouncer = null;\n    this._lastIf = false;\n    this.__hideTemplateChildren__ = false;\n    /** @type {!HTMLTemplateElement|undefined} */\n    this.__template;\n    /** @type {!TemplateInfo|undefined} */\n    this._templateInfo;\n  }\n\n  __debounceRender() {\n    // Render is async for 2 reasons:\n    // 1. To eliminate dom creation trashing if user code thrashes `if` in the\n    //    same turn. This was more common in 1.x where a compound computed\n    //    property could result in the result changing multiple times, but is\n    //    mitigated to a large extent by batched property processing in 2.x.\n    // 2. To avoid double object propagation when a bag including values bound\n    //    to the `if` property as well as one or more hostProps could enqueue\n    //    the <dom-if> to flush before the <template>'s host property\n    //    forwarding. In that scenario creating an instance would result in\n    //    the host props being set once, and then the enqueued changes on the\n    //    template would set properties a second time, potentially causing an\n    //    object to be set to an instance more than once.  Creating the\n    //    instance async from flushing data ensures this doesn't happen. If\n    //    we wanted a sync option in the future, simply having <dom-if> flush\n    //    (or clear) its template's pending host properties before creating\n    //    the instance would also avoid the problem.\n    this.__renderDebouncer = Debouncer.debounce(\n          this.__renderDebouncer\n        , microTask\n        , () => this.__render());\n    enqueueDebouncer(this.__renderDebouncer);\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    const parent = wrap(this).parentNode;\n    if (!parent || (parent.nodeType == Node.DOCUMENT_FRAGMENT_NODE &&\n        !wrap(parent).host)) {\n      this.__teardownInstance();\n    }\n  }\n\n  /**\n   * @override\n   * @return {void}\n   */\n  connectedCallback() {\n    super.connectedCallback();\n    if (!hideElementsGlobally()) {\n      this.style.display = 'none';\n    }\n    if (this.if) {\n      this.__debounceRender();\n    }\n  }\n\n  /**\n   * Ensures a template has been assigned to `this.__template`.  If it has not\n   * yet been, it querySelectors for it in its children and if it does not yet\n   * exist (e.g. in parser-generated case), opens a mutation observer and\n   * waits for it to appear (returns false if it has not yet been found,\n   * otherwise true).  In the `removeNestedTemplates` case, the \"template\" will\n   * be the `dom-if` element itself.\n   *\n   * @return {boolean} True when a template has been found, false otherwise\n   */\n  __ensureTemplate() {\n    if (!this.__template) {\n      // When `removeNestedTemplates` is true, the \"template\" is the element\n      // itself, which has been given a `_templateInfo` property\n      const thisAsTemplate = /** @type {!HTMLTemplateElement} */ (\n          /** @type {!HTMLElement} */ (this));\n      let template = thisAsTemplate._templateInfo ?\n          thisAsTemplate :\n          /** @type {!HTMLTemplateElement} */\n          (wrap(thisAsTemplate).querySelector('template'));\n      if (!template) {\n        // Wait until childList changes and template should be there by then\n        let observer = new MutationObserver(() => {\n          if (wrap(this).querySelector('template')) {\n            observer.disconnect();\n            this.__render();\n          } else {\n            throw new Error('dom-if requires a <template> child');\n          }\n        });\n        observer.observe(this, {childList: true});\n        return false;\n      }\n      this.__template = template;\n    }\n    return true;\n  }\n\n  /**\n   * Ensures a an instance of the template has been created and inserted. This\n   * method may return false if the template has not yet been found or if\n   * there is no `parentNode` to insert the template into (in either case,\n   * connection or the template-finding mutation observer firing will queue\n   * another render, causing this method to be called again at a more\n   * appropriate time).\n   *\n   * Subclasses should implement the following methods called here:\n   * - `__hasInstance`\n   * - `__createAndInsertInstance`\n   * - `__getInstanceNodes`\n   *\n   * @return {boolean} True if the instance was created, false otherwise.\n   */\n  __ensureInstance() {\n    let parentNode = wrap(this).parentNode;\n    if (!this.__hasInstance()) {\n      // Guard against element being detached while render was queued\n      if (!parentNode) {\n        return false;\n      }\n      // Find the template (when false, there was no template yet)\n      if (!this.__ensureTemplate()) {\n        return false;\n      }\n      this.__createAndInsertInstance(parentNode);\n    } else {\n      // Move instance children if necessary\n      let children = this.__getInstanceNodes();\n      if (children && children.length) {\n        // Detect case where dom-if was re-attached in new position\n        let lastChild = wrap(this).previousSibling;\n        if (lastChild !== children[children.length-1]) {\n          for (let i=0, n; (i<children.length) && (n=children[i]); i++) {\n            wrap(parentNode).insertBefore(n, this);\n          }\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Forces the element to render its content. Normally rendering is\n   * asynchronous to a provoking change. This is done for efficiency so\n   * that multiple changes trigger only a single render. The render method\n   * should be called if, for example, template rendering is required to\n   * validate application state.\n   *\n   * @return {void}\n   */\n  render() {\n    flush();\n  }\n\n  /**\n   * Performs the key rendering steps:\n   * 1. Ensure a template instance has been stamped (when true)\n   * 2. Remove the template instance (when false and restamp:true)\n   * 3. Sync the hidden state of the instance nodes with the if/restamp state\n   * 4. Fires the `dom-change` event when necessary\n   *\n   * @return {void}\n   */\n  __render() {\n    if (this.if) {\n      if (!this.__ensureInstance()) {\n        // No template found yet\n        return;\n      }\n    } else if (this.restamp) {\n      this.__teardownInstance();\n    }\n    this._showHideChildren();\n    if ((!suppressTemplateNotifications || this.notifyDomChange)\n        && this.if != this._lastIf) {\n      this.dispatchEvent(new CustomEvent('dom-change', {\n        bubbles: true,\n        composed: true\n      }));\n      this._lastIf = this.if;\n    }\n  }\n\n  // Ideally these would be annotated as abstract methods in an abstract class,\n  // but closure compiler is finnicky\n  /* eslint-disable valid-jsdoc */\n  /**\n   * Abstract API to be implemented by subclass: Returns true if a template\n   * instance has been created and inserted.\n   *\n   * @protected\n   * @return {boolean} True when an instance has been created.\n   */\n  __hasInstance() { }\n\n  /**\n   * Abstract API to be implemented by subclass: Returns the child nodes stamped\n   * from a template instance.\n   *\n   * @protected\n   * @return {Array<Node>} Array of child nodes stamped from the template\n   * instance.\n   */\n  __getInstanceNodes() { }\n\n  /**\n   * Abstract API to be implemented by subclass: Creates an instance of the\n   * template and inserts it into the given parent node.\n   *\n   * @protected\n   * @param {Node} parentNode The parent node to insert the instance into\n   * @return {void}\n   */\n  __createAndInsertInstance(parentNode) { } // eslint-disable-line no-unused-vars\n\n  /**\n   * Abstract API to be implemented by subclass: Removes nodes created by an\n   * instance of a template and any associated cleanup.\n   *\n   * @protected\n   * @return {void}\n   */\n  __teardownInstance() { }\n\n  /**\n   * Abstract API to be implemented by subclass: Shows or hides any template\n   * instance childNodes based on the `if` state of the element and its\n   * `__hideTemplateChildren__` property.\n   *\n   * @protected\n   * @return {void}\n   */\n  _showHideChildren() { }\n  /* eslint-enable valid-jsdoc */\n}\n\n/**\n * The version of DomIf used when `fastDomIf` setting is in use, which is\n * optimized for first-render (but adds a tax to all subsequent property updates\n * on the host, whether they were used in a given `dom-if` or not).\n *\n * This implementation avoids use of `Templatizer`, which introduces a new scope\n * (a non-element PropertyEffects instance), which is not strictly necessary\n * since `dom-if` never introduces new properties to its scope (unlike\n * `dom-repeat`). Taking advantage of this fact, the `dom-if` reaches up to its\n * `__dataHost` and stamps the template directly from the host using the host's\n * runtime `_stampTemplate` API, which binds the property effects of the\n * template directly to the host. This both avoids the intermediary\n * `Templatizer` instance, but also avoids the need to bind host properties to\n * the `<template>` element and forward those into the template instance.\n *\n * In this version of `dom-if`, the `this.__instance` method is the\n * `DocumentFragment` returned from `_stampTemplate`, which also serves as the\n * handle for later removing it using the `_removeBoundDom` method.\n */\nclass DomIfFast extends DomIfBase {\n\n  constructor() {\n    super();\n    this.__instance = null;\n    this.__syncInfo = null;\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * @override\n   * @return {boolean} True when an instance has been created.\n   */\n  __hasInstance() {\n    return Boolean(this.__instance);\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * @override\n   * @return {Array<Node>} Array of child nodes stamped from the template\n   * instance.\n   */\n  __getInstanceNodes() {\n    return this.__instance.templateInfo.childNodes;\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Stamps the template by calling `_stampTemplate` on the `__dataHost` of this\n   * element and then inserts the resulting nodes into the given `parentNode`.\n   *\n   * @override\n   * @param {Node} parentNode The parent node to insert the instance into\n   * @return {void}\n   */\n  __createAndInsertInstance(parentNode) {\n    const host = this.__dataHost || this;\n    if (strictTemplatePolicy) {\n      if (!this.__dataHost) {\n        throw new Error('strictTemplatePolicy: template owner not trusted');\n      }\n    }\n    // Pre-bind and link the template into the effects system\n    const templateInfo = host._bindTemplate(\n        /** @type {!HTMLTemplateElement} */ (this.__template), true);\n    // Install runEffects hook that prevents running property effects\n    // (and any nested template effects) when the `if` is false\n    templateInfo.runEffects = (runEffects, changedProps, hasPaths) => {\n      let syncInfo = this.__syncInfo;\n      if (this.if) {\n        // Mix any props that changed while the `if` was false into `changedProps`\n        if (syncInfo) {\n          // If there were properties received while the `if` was false, it is\n          // important to sync the hidden state with the element _first_, so that\n          // new bindings to e.g. `textContent` do not get stomped on by\n          // pre-hidden values if `_showHideChildren` were to be called later at\n          // the next render. Clearing `__invalidProps` here ensures\n          // `_showHideChildren`'s call to `__syncHostProperties` no-ops, so\n          // that we don't call `runEffects` more often than necessary.\n          this.__syncInfo = null;\n          this._showHideChildren();\n          changedProps = Object.assign(syncInfo.changedProps, changedProps);\n        }\n        runEffects(changedProps, hasPaths);\n      } else {\n        // Accumulate any values changed while `if` was false, along with the\n        // runEffects method to sync them, so that we can replay them once `if`\n        // becomes true\n        if (this.__instance) {\n          if (!syncInfo) {\n            syncInfo = this.__syncInfo = { runEffects, changedProps: {} };\n          }\n          if (hasPaths) {\n            // Store root object of any paths; this will ensure direct bindings\n            // like [[obj.foo]] bindings run after a `set('obj.foo', v)`, but\n            // note that path notifications like `set('obj.foo.bar', v)` will\n            // not propagate. Since batched path notifications are not\n            // supported, we cannot simply accumulate path notifications. This\n            // is equivalent to the non-fastDomIf case, which stores root(p) in\n            // __invalidProps.\n            for (const p in changedProps) {\n              const rootProp = root(p);\n              syncInfo.changedProps[rootProp] = this.__dataHost[rootProp];\n            }\n          } else {\n            Object.assign(syncInfo.changedProps, changedProps);\n          }\n        }\n      }\n    };\n    // Stamp the template, and set its DocumentFragment to the \"instance\"\n    this.__instance = host._stampTemplate(\n        /** @type {!HTMLTemplateElement} */ (this.__template), templateInfo);\n    wrap(parentNode).insertBefore(this.__instance, this);\n  }\n\n  /**\n   * Run effects for any properties that changed while the `if` was false.\n   *\n   * @return {void}\n   */\n  __syncHostProperties() {\n    const syncInfo = this.__syncInfo;\n    if (syncInfo) {\n      this.__syncInfo = null;\n      syncInfo.runEffects(syncInfo.changedProps, false);\n    }\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Remove the instance and any nodes it created.  Uses the `__dataHost`'s\n   * runtime `_removeBoundDom` method.\n   *\n   * @override\n   * @return {void}\n   */\n  __teardownInstance() {\n    const host = this.__dataHost || this;\n    if (this.__instance) {\n      host._removeBoundDom(this.__instance);\n      this.__instance = null;\n      this.__syncInfo = null;\n    }\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Shows or hides the template instance top level child nodes. For\n   * text nodes, `textContent` is removed while \"hidden\" and replaced when\n   * \"shown.\"\n   *\n   * @override\n   * @return {void}\n   * @protected\n   * @suppress {visibility}\n   */\n  _showHideChildren() {\n    const hidden = this.__hideTemplateChildren__ || !this.if;\n    if (this.__instance && Boolean(this.__instance.__hidden) !== hidden) {\n      this.__instance.__hidden = hidden;\n      showHideChildren(hidden, this.__instance.templateInfo.childNodes);\n    }\n    if (!hidden) {\n      this.__syncHostProperties();\n    }\n  }\n}\n\n/**\n * The \"legacy\" implementation of `dom-if`, implemented using `Templatizer`.\n *\n * In this version, `this.__instance` is the `TemplateInstance` returned\n * from the templatized constructor.\n */\nclass DomIfLegacy extends DomIfBase {\n\n  constructor() {\n    super();\n    this.__ctor = null;\n    this.__instance = null;\n    this.__invalidProps = null;\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * @override\n   * @return {boolean} True when an instance has been created.\n   */\n  __hasInstance() {\n    return Boolean(this.__instance);\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * @override\n   * @return {Array<Node>} Array of child nodes stamped from the template\n   * instance.\n   */\n  __getInstanceNodes() {\n    return this.__instance.children;\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Stamps the template by creating a new instance of the templatized\n   * constructor (which is created lazily if it does not yet exist), and then\n   * inserts its resulting `root` doc fragment into the given `parentNode`.\n   *\n   * @override\n   * @param {Node} parentNode The parent node to insert the instance into\n   * @return {void}\n   */\n  __createAndInsertInstance(parentNode) {\n    // Ensure we have an instance constructor\n    if (!this.__ctor) {\n      this.__ctor = templatize(\n          /** @type {!HTMLTemplateElement} */ (this.__template), this, {\n            // dom-if templatizer instances require `mutable: true`, as\n            // `__syncHostProperties` relies on that behavior to sync objects\n            mutableData: true,\n            /**\n             * @param {string} prop Property to forward\n             * @param {*} value Value of property\n             * @this {DomIfLegacy}\n             */\n            forwardHostProp: function(prop, value) {\n              if (this.__instance) {\n                if (this.if) {\n                  this.__instance.forwardHostProp(prop, value);\n                } else {\n                  // If we have an instance but are squelching host property\n                  // forwarding due to if being false, note the invalidated\n                  // properties so `__syncHostProperties` can sync them the next\n                  // time `if` becomes true\n                  this.__invalidProps =\n                      this.__invalidProps || Object.create(null);\n                  this.__invalidProps[root(prop)] = true;\n                }\n              }\n            }\n          });\n    }\n    // Create and insert the instance\n    this.__instance = new this.__ctor();\n    wrap(parentNode).insertBefore(this.__instance.root, this);\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Removes the instance and any nodes it created.\n   *\n   * @override\n   * @return {void}\n   */\n  __teardownInstance() {\n    if (this.__instance) {\n      let c$ = this.__instance.children;\n      if (c$ && c$.length) {\n        // use first child parent, for case when dom-if may have been detached\n        let parent = wrap(c$[0]).parentNode;\n        // Instance children may be disconnected from parents when dom-if\n        // detaches if a tree was innerHTML'ed\n        if (parent) {\n          parent = wrap(parent);\n          for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {\n            parent.removeChild(n);\n          }\n        }\n      }\n      this.__invalidProps = null;\n      this.__instance = null;\n    }\n  }\n\n  /**\n   * Forwards any properties that changed while the `if` was false into the\n   * template instance and flushes it.\n   *\n   * @return {void}\n   */\n  __syncHostProperties() {\n    let props = this.__invalidProps;\n    if (props) {\n      this.__invalidProps = null;\n      for (let prop in props) {\n        this.__instance._setPendingProperty(prop, this.__dataHost[prop]);\n      }\n      this.__instance._flushProperties();\n    }\n  }\n\n  /**\n   * Implementation of abstract API needed by DomIfBase.\n   *\n   * Shows or hides the template instance top level child elements. For\n   * text nodes, `textContent` is removed while \"hidden\" and replaced when\n   * \"shown.\"\n   *\n   * @override\n   * @protected\n   * @return {void}\n   * @suppress {visibility}\n   */\n  _showHideChildren() {\n    const hidden = this.__hideTemplateChildren__ || !this.if;\n    if (this.__instance && Boolean(this.__instance.__hidden) !== hidden) {\n      this.__instance.__hidden = hidden;\n      this.__instance._showHideChildren(hidden);\n    }\n    if (!hidden) {\n      this.__syncHostProperties();\n    }\n  }\n}\n\n/**\n * The `<dom-if>` element will stamp a light-dom `<template>` child when\n * the `if` property becomes truthy, and the template can use Polymer\n * data-binding and declarative event features when used in the context of\n * a Polymer element's template.\n *\n * When `if` becomes falsy, the stamped content is hidden but not\n * removed from dom. When `if` subsequently becomes truthy again, the content\n * is simply re-shown. This approach is used due to its favorable performance\n * characteristics: the expense of creating template content is paid only\n * once and lazily.\n *\n * Set the `restamp` property to true to force the stamped content to be\n * created / destroyed when the `if` condition changes.\n *\n * @customElement\n * @polymer\n * @extends DomIfBase\n * @constructor\n * @summary Custom element that conditionally stamps and hides or removes\n *   template content based on a boolean flag.\n */\nexport const DomIf = fastDomIf ? DomIfFast : DomIfLegacy;\n\ncustomElements.define(DomIf.is, DomIf);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport { PolymerElement } from '../../polymer-element.js';\n\nimport { dedupingMixin } from '../utils/mixin.js';\nimport { calculateSplices } from '../utils/array-splice.js';\nimport { ElementMixin } from '../mixins/element-mixin.js';\n\n/**\n * Element mixin for recording dynamic associations between item paths in a\n * master `items` array and a `selected` array such that path changes to the\n * master array (at the host) element or elsewhere via data-binding) are\n * correctly propagated to items in the selected array and vice-versa.\n *\n * The `items` property accepts an array of user data, and via the\n * `select(item)` and `deselect(item)` API, updates the `selected` property\n * which may be bound to other parts of the application, and any changes to\n * sub-fields of `selected` item(s) will be kept in sync with items in the\n * `items` array.  When `multi` is false, `selected` is a property\n * representing the last selected item.  When `multi` is true, `selected`\n * is an array of multiply selected items.\n *\n * @polymer\n * @mixinFunction\n * @appliesMixin ElementMixin\n * @summary Element mixin for recording dynamic associations between item paths in a\n * master `items` array and a `selected` array\n */\nlet ArraySelectorMixin = dedupingMixin(superClass => {\n\n  /**\n   * @constructor\n   * @implements {Polymer_ElementMixin}\n   * @private\n   */\n  let elementBase = ElementMixin(superClass);\n\n  /**\n   * @polymer\n   * @mixinClass\n   * @implements {Polymer_ArraySelectorMixin}\n   * @unrestricted\n   */\n  class ArraySelectorMixin extends elementBase {\n\n    static get properties() {\n      return {\n\n        /**\n         * An array containing items from which selection will be made.\n         */\n        items: {\n          type: Array,\n        },\n\n        /**\n         * When `true`, multiple items may be selected at once (in this case,\n         * `selected` is an array of currently selected items).  When `false`,\n         * only one item may be selected at a time.\n         */\n        multi: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * When `multi` is true, this is an array that contains any selected.\n         * When `multi` is false, this is the currently selected item, or `null`\n         * if no item is selected.\n         * @type {?Object|?Array<!Object>}\n         */\n        selected: {type: Object, notify: true},\n\n        /**\n         * When `multi` is false, this is the currently selected item, or `null`\n         * if no item is selected.\n         * @type {?Object}\n         */\n        selectedItem: {type: Object, notify: true},\n\n        /**\n         * When `true`, calling `select` on an item that is already selected\n         * will deselect the item.\n         */\n        toggle: {type: Boolean, value: false}\n\n      };\n    }\n\n    static get observers() {\n      return ['__updateSelection(multi, items.*)'];\n    }\n\n    constructor() {\n      super();\n      this.__lastItems = null;\n      this.__lastMulti = null;\n      this.__selectedMap = null;\n    }\n\n    __updateSelection(multi, itemsInfo) {\n      let path = itemsInfo.path;\n      if (path == JSCompiler_renameProperty('items', this)) {\n        // Case 1 - items array changed, so diff against previous array and\n        // deselect any removed items and adjust selected indices\n        let newItems = itemsInfo.base || [];\n        let lastItems = this.__lastItems;\n        let lastMulti = this.__lastMulti;\n        if (multi !== lastMulti) {\n          this.clearSelection();\n        }\n        if (lastItems) {\n          let splices = calculateSplices(newItems, lastItems);\n          this.__applySplices(splices);\n        }\n        this.__lastItems = newItems;\n        this.__lastMulti = multi;\n      } else if (itemsInfo.path == `${JSCompiler_renameProperty('items', this)}.splices`) {\n        // Case 2 - got specific splice information describing the array mutation:\n        // deselect any removed items and adjust selected indices\n        this.__applySplices(itemsInfo.value.indexSplices);\n      } else {\n        // Case 3 - an array element was changed, so deselect the previous\n        // item for that index if it was previously selected\n        let part = path.slice(`${JSCompiler_renameProperty('items', this)}.`.length);\n        let idx = parseInt(part, 10);\n        if ((part.indexOf('.') < 0) && part == idx) {\n          this.__deselectChangedIdx(idx);\n        }\n      }\n    }\n\n    __applySplices(splices) {\n      let selected = this.__selectedMap;\n      // Adjust selected indices and mark removals\n      for (let i=0; i<splices.length; i++) {\n        let s = splices[i];\n        selected.forEach((idx, item) => {\n          if (idx < s.index) {\n            // no change\n          } else if (idx >= s.index + s.removed.length) {\n            // adjust index\n            selected.set(item, idx + s.addedCount - s.removed.length);\n          } else {\n            // remove index\n            selected.set(item, -1);\n          }\n        });\n        for (let j=0; j<s.addedCount; j++) {\n          let idx = s.index + j;\n          if (selected.has(this.items[idx])) {\n            selected.set(this.items[idx], idx);\n          }\n        }\n      }\n      // Update linked paths\n      this.__updateLinks();\n      // Remove selected items that were removed from the items array\n      let sidx = 0;\n      selected.forEach((idx, item) => {\n        if (idx < 0) {\n          if (this.multi) {\n            this.splice(JSCompiler_renameProperty('selected', this), sidx, 1);\n          } else {\n            this.selected = this.selectedItem = null;\n          }\n          selected.delete(item);\n        } else {\n          sidx++;\n        }\n      });\n    }\n\n    __updateLinks() {\n      this.__dataLinkedPaths = {};\n      if (this.multi) {\n        let sidx = 0;\n        this.__selectedMap.forEach(idx => {\n          if (idx >= 0) {\n            this.linkPaths(\n                `${JSCompiler_renameProperty('items', this)}.${idx}`,\n                `${JSCompiler_renameProperty('selected', this)}.${sidx++}`);\n          }\n        });\n      } else {\n        this.__selectedMap.forEach(idx => {\n          this.linkPaths(\n              JSCompiler_renameProperty('selected', this),\n              `${JSCompiler_renameProperty('items', this)}.${idx}`);\n          this.linkPaths(\n              JSCompiler_renameProperty('selectedItem', this),\n              `${JSCompiler_renameProperty('items', this)}.${idx}`);\n        });\n      }\n    }\n\n    /**\n     * Clears the selection state.\n     * @override\n     * @return {void}\n     */\n    clearSelection() {\n      // Unbind previous selection\n      this.__dataLinkedPaths = {};\n      // The selected map stores 3 pieces of information:\n      // key: items array object\n      // value: items array index\n      // order: selected array index\n      this.__selectedMap = new Map();\n      // Initialize selection\n      this.selected = this.multi ? [] : null;\n      this.selectedItem = null;\n    }\n\n    /**\n     * Returns whether the item is currently selected.\n     *\n     * @override\n     * @param {*} item Item from `items` array to test\n     * @return {boolean} Whether the item is selected\n     */\n    isSelected(item) {\n      return this.__selectedMap.has(item);\n    }\n\n    /**\n     * Returns whether the item is currently selected.\n     *\n     * @override\n     * @param {number} idx Index from `items` array to test\n     * @return {boolean} Whether the item is selected\n     */\n    isIndexSelected(idx) {\n      return this.isSelected(this.items[idx]);\n    }\n\n    __deselectChangedIdx(idx) {\n      let sidx = this.__selectedIndexForItemIndex(idx);\n      if (sidx >= 0) {\n        let i = 0;\n        this.__selectedMap.forEach((idx, item) => {\n          if (sidx == i++) {\n            this.deselect(item);\n          }\n        });\n      }\n    }\n\n    __selectedIndexForItemIndex(idx) {\n      let selected = this.__dataLinkedPaths[`${JSCompiler_renameProperty('items', this)}.${idx}`];\n      if (selected) {\n        return parseInt(selected.slice(`${JSCompiler_renameProperty('selected', this)}.`.length), 10);\n      }\n    }\n\n    /**\n     * Deselects the given item if it is already selected.\n     *\n     * @override\n     * @param {*} item Item from `items` array to deselect\n     * @return {void}\n     */\n    deselect(item) {\n      let idx = this.__selectedMap.get(item);\n      if (idx >= 0) {\n        this.__selectedMap.delete(item);\n        let sidx;\n        if (this.multi) {\n          sidx = this.__selectedIndexForItemIndex(idx);\n        }\n        this.__updateLinks();\n        if (this.multi) {\n          this.splice(JSCompiler_renameProperty('selected', this), sidx, 1);\n        } else {\n          this.selected = this.selectedItem = null;\n        }\n      }\n    }\n\n    /**\n     * Deselects the given index if it is already selected.\n     *\n     * @override\n     * @param {number} idx Index from `items` array to deselect\n     * @return {void}\n     */\n    deselectIndex(idx) {\n      this.deselect(this.items[idx]);\n    }\n\n    /**\n     * Selects the given item.  When `toggle` is true, this will automatically\n     * deselect the item if already selected.\n     *\n     * @override\n     * @param {*} item Item from `items` array to select\n     * @return {void}\n     */\n    select(item) {\n      this.selectIndex(this.items.indexOf(item));\n    }\n\n    /**\n     * Selects the given index.  When `toggle` is true, this will automatically\n     * deselect the item if already selected.\n     *\n     * @override\n     * @param {number} idx Index from `items` array to select\n     * @return {void}\n     */\n    selectIndex(idx) {\n      let item = this.items[idx];\n      if (!this.isSelected(item)) {\n        if (!this.multi) {\n          this.__selectedMap.clear();\n        }\n        this.__selectedMap.set(item, idx);\n        this.__updateLinks();\n        if (this.multi) {\n          this.push(JSCompiler_renameProperty('selected', this), item);\n        } else {\n          this.selected = this.selectedItem = item;\n        }\n      } else if (this.toggle) {\n        this.deselectIndex(idx);\n      }\n    }\n\n  }\n\n  return ArraySelectorMixin;\n\n});\n\n// export mixin\nexport { ArraySelectorMixin };\n\n/**\n * @constructor\n * @extends {PolymerElement}\n * @implements {Polymer_ArraySelectorMixin}\n * @private\n */\nlet baseArraySelector = ArraySelectorMixin(PolymerElement);\n\n/**\n * Element implementing the `ArraySelector` mixin, which records\n * dynamic associations between item paths in a master `items` array and a\n * `selected` array such that path changes to the master array (at the host)\n * element or elsewhere via data-binding) are correctly propagated to items\n * in the selected array and vice-versa.\n *\n * The `items` property accepts an array of user data, and via the\n * `select(item)` and `deselect(item)` API, updates the `selected` property\n * which may be bound to other parts of the application, and any changes to\n * sub-fields of `selected` item(s) will be kept in sync with items in the\n * `items` array.  When `multi` is false, `selected` is a property\n * representing the last selected item.  When `multi` is true, `selected`\n * is an array of multiply selected items.\n *\n * Example:\n *\n * ```js\n * import {PolymerElement} from '@polymer/polymer';\n * import '@polymer/polymer/lib/elements/array-selector.js';\n *\n * class EmployeeList extends PolymerElement {\n *   static get _template() {\n *     return html`\n *         <div> Employee list: </div>\n *         <dom-repeat id=\"employeeList\" items=\"{{employees}}\">\n *           <template>\n *             <div>First name: <span>{{item.first}}</span></div>\n *               <div>Last name: <span>{{item.last}}</span></div>\n *               <button on-click=\"toggleSelection\">Select</button>\n *           </template>\n *         </dom-repeat>\n *\n *         <array-selector id=\"selector\"\n *                         items=\"{{employees}}\"\n *                         selected=\"{{selected}}\"\n *                         multi toggle></array-selector>\n *\n *         <div> Selected employees: </div>\n *         <dom-repeat items=\"{{selected}}\">\n *           <template>\n *             <div>First name: <span>{{item.first}}</span></div>\n *             <div>Last name: <span>{{item.last}}</span></div>\n *           </template>\n *         </dom-repeat>`;\n *   }\n *   static get is() { return 'employee-list'; }\n *   static get properties() {\n *     return {\n *       employees: {\n *         value() {\n *           return [\n *             {first: 'Bob', last: 'Smith'},\n *             {first: 'Sally', last: 'Johnson'},\n *             ...\n *           ];\n *         }\n *       }\n *     };\n *   }\n *   toggleSelection(e) {\n *     const item = this.$.employeeList.itemForElement(e.target);\n *     this.$.selector.select(item);\n *   }\n * }\n * ```\n *\n * @polymer\n * @customElement\n * @extends {baseArraySelector}\n * @appliesMixin ArraySelectorMixin\n * @summary Custom element that links paths between an input `items` array and\n *   an output `selected` item or array based on calls to its selection API.\n */\nclass ArraySelector extends baseArraySelector {\n  // Not needed to find template; can be removed once the analyzer\n  // can find the tag name from customElements.define call\n  static get is() { return 'array-selector'; }\n  static get template() { return null; }\n}\ncustomElements.define(ArraySelector.is, ArraySelector);\nexport { ArraySelector };\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport CustomStyleInterface from '../src/custom-style-interface.js';\n// prettier-ignore\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\n// prettier-ignore\nimport {nativeCssVariables, nativeShadow, cssBuild, disableRuntime} from '../src/style-settings.js';\n\nconst customStyleInterface = new CustomStyleInterface();\n\nif (!window.ShadyCSS) {\n  window.ShadyCSS = {\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplate(template, elementName, elementExtends) {}, // eslint-disable-line @typescript-eslint/no-unused-vars\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     */\n    prepareTemplateDom(template, elementName) {}, // eslint-disable-line @typescript-eslint/no-unused-vars\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplateStyles(template, elementName, elementExtends) {}, // eslint-disable-line @typescript-eslint/no-unused-vars\n\n    /**\n     * @param {Element} element\n     * @param {Object=} properties\n     */\n    styleSubtree(element, properties) {\n      customStyleInterface.processStyles();\n      updateNativeProperties(element, properties);\n    },\n\n    /**\n     * @param {Element} element\n     */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    styleElement(element) {\n      customStyleInterface.processStyles();\n    },\n\n    /**\n     * @param {Object=} properties\n     */\n    styleDocument(properties) {\n      customStyleInterface.processStyles();\n      updateNativeProperties(document.body, properties);\n    },\n\n    /**\n     * @param {Element} element\n     * @param {string} property\n     * @return {string}\n     */\n    getComputedStyleValue(element, property) {\n      return getComputedStyleValue(element, property);\n    },\n\n    flushCustomStyles() {},\n    nativeCss: nativeCssVariables,\n    nativeShadow: nativeShadow,\n    cssBuild: cssBuild,\n    disableRuntime: disableRuntime,\n  };\n}\n\nwindow.ShadyCSS.CustomStyleInterface = customStyleInterface;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport '@webcomponents/shadycss/entrypoints/custom-style-interface.js';\n\nimport { cssFromModules } from '../utils/style-gather.js';\n\nconst attr = 'include';\n\nconst CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;\n\n/**\n * Custom element for defining styles in the main document that can take\n * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims\n * for style encapsulation, custom properties, and custom mixins.\n *\n * - Document styles defined in a `<custom-style>` are shimmed to ensure they\n *   do not leak into local DOM when running on browsers without native\n *   Shadow DOM.\n * - Custom properties can be defined in a `<custom-style>`. Use the `html` selector\n *   to define custom properties that apply to all custom elements.\n * - Custom mixins can be defined in a `<custom-style>`, if you import the optional\n *   [apply shim](https://github.com/webcomponents/shadycss#about-applyshim)\n *   (`shadycss/apply-shim.html`).\n *\n * To use:\n *\n * - Import `custom-style.html`.\n * - Place a `<custom-style>` element in the main document, wrapping an inline `<style>` tag that\n *   contains the CSS rules you want to shim.\n *\n * For example:\n *\n * ```html\n * <!-- import apply shim--only required if using mixins -->\n * <link rel=\"import\" href=\"bower_components/shadycss/apply-shim.html\">\n * <!-- import custom-style element -->\n * <link rel=\"import\" href=\"bower_components/polymer/lib/elements/custom-style.html\">\n *\n * <custom-style>\n *   <style>\n *     html {\n *       --custom-color: blue;\n *       --custom-mixin: {\n *         font-weight: bold;\n *         color: red;\n *       };\n *     }\n *   </style>\n * </custom-style>\n * ```\n *\n * @customElement\n * @extends HTMLElement\n * @summary Custom element for defining styles in the main document that can\n *   take advantage of Polymer's style scoping and custom properties shims.\n */\nexport class CustomStyle extends HTMLElement {\n  constructor() {\n    super();\n    this._style = null;\n    CustomStyleInterface.addCustomStyle(this);\n  }\n  /**\n   * Returns the light-DOM `<style>` child this element wraps.  Upon first\n   * call any style modules referenced via the `include` attribute will be\n   * concatenated to this element's `<style>`.\n   *\n   * @export\n   * @return {HTMLStyleElement} This element's light-DOM `<style>`\n   */\n  getStyle() {\n    if (this._style) {\n      return this._style;\n    }\n    const style = /** @type {HTMLStyleElement} */(this.querySelector('style'));\n    if (!style) {\n      return null;\n    }\n    this._style = style;\n    const include = style.getAttribute(attr);\n    if (include) {\n      style.removeAttribute(attr);\n      /** @suppress {deprecated} */\n      style.textContent = cssFromModules(include) + style.textContent;\n    }\n    /*\n    HTML Imports styling the main document are deprecated in Chrome\n    https://crbug.com/523952\n\n    If this element is not in the main document, then it must be in an HTML Import document.\n    In that case, move the custom style to the main document.\n\n    The ordering of `<custom-style>` should stay the same as when loaded by HTML Imports, but there may be odd\n    cases of ordering w.r.t the main document styles.\n    */\n    if (this.ownerDocument !== window.document) {\n      window.document.head.appendChild(this);\n    }\n    return this._style;\n  }\n}\n\nwindow.customElements.define('custom-style', CustomStyle);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport { LegacyElementMixin } from './lib/legacy/legacy-element-mixin.js';\nexport { Polymer } from  './lib/legacy/polymer-fn.js';\n/* template elements */\nimport './lib/legacy/templatizer-behavior.js';\nimport './lib/elements/dom-bind.js';\nimport './lib/elements/dom-repeat.js';\nimport './lib/elements/dom-if.js';\nimport './lib/elements/array-selector.js';\n/* custom-style */\nimport './lib/elements/custom-style.js';\n/* bc behaviors */\nimport './lib/legacy/mutable-data-behavior.js';\n/* import html-tag to export html */\nexport { html } from './lib/utils/html-tag.js';\n\n// bc\nexport const Base = LegacyElementMixin(HTMLElement).prototype;\n","export const fromUtf8 = (input) => new TextEncoder().encode(input);\n","export const toUtf8 = (input) => {\n    if (typeof input === \"string\") {\n        return input;\n    }\n    if (typeof input !== \"object\" || typeof input.byteOffset !== \"number\" || typeof input.byteLength !== \"number\") {\n        throw new Error(\"@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.\");\n    }\n    return new TextDecoder(\"utf-8\").decode(input);\n};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n  // remove previous properties\n  for (let p in properties) {\n    // NOTE: for bc with shim, don't apply null values.\n    if (p === null) {\n      element.style.removeProperty(p);\n    } else {\n      element.style.setProperty(p, properties[p]);\n    }\n  }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n  /**\n   * @const {string}\n   */\n  const value = window.getComputedStyle(element).getPropertyValue(property);\n  if (!value) {\n    return '';\n  } else {\n    return value.trim();\n  }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n  const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n  // reset state of the regexes\n  MIXIN_MATCH.lastIndex = 0;\n  VAR_ASSIGN.lastIndex = 0;\n  return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady =\n  (window['HTMLImports'] && window['HTMLImports']['whenReady']) || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n  requestAnimationFrame(function () {\n    if (whenReady) {\n      whenReady(callback);\n    } else {\n      if (!readyPromise) {\n        readyPromise = new Promise((resolve) => {\n          resolveFn = resolve;\n        });\n        if (document.readyState === 'complete') {\n          resolveFn();\n        } else {\n          document.addEventListener('readystatechange', () => {\n            if (document.readyState === 'complete') {\n              resolveFn();\n            }\n          });\n        }\n      }\n      readyPromise.then(function () {\n        callback && callback();\n      });\n    }\n  });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport documentWait from './document-wait.js';\n\n/**\n * @typedef {HTMLStyleElement | {getStyle: function():HTMLStyleElement}}\n */\nexport let CustomStyleProvider;\n\nconst SEEN_MARKER = '__seenByShadyCSS';\nconst CACHED_STYLE = '__shadyCSSCachedStyle';\n\n/** @type {?function(!HTMLStyleElement)} */\nlet transformFn = null;\n\n/** @type {?function()} */\nlet validateFn = null;\n\n/**\nThis interface is provided to add document-level <style> elements to ShadyCSS for processing.\nThese styles must be processed by ShadyCSS to simulate ShadowRoot upper-bound encapsulation from outside styles\nIn addition, these styles may also need to be processed for @apply rules and CSS Custom Properties\n\nTo add document-level styles to ShadyCSS, one can call `ShadyCSS.addDocumentStyle(styleElement)` or `ShadyCSS.addDocumentStyle({getStyle: () => styleElement})`\n\nIn addition, if the process used to discover document-level styles can be synchronously flushed, one should set `ShadyCSS.documentStyleFlush`.\nThis function will be called when calculating styles.\n\nAn example usage of the document-level styling api can be found in `examples/document-style-lib.js`\n\n@unrestricted\n*/\nexport default class CustomStyleInterface {\n  constructor() {\n    /** @type {!Array<!CustomStyleProvider>} */\n    this['customStyles'] = [];\n    this['enqueued'] = false;\n    // NOTE(dfreedm): use quotes here to prevent closure inlining to `function(){}`;\n    documentWait(() => {\n      if (window['ShadyCSS']['flushCustomStyles']) {\n        window['ShadyCSS']['flushCustomStyles']();\n      }\n    });\n  }\n  /**\n   * Queue a validation for new custom styles to batch style recalculations\n   */\n  enqueueDocumentValidation() {\n    if (this['enqueued'] || !validateFn) {\n      return;\n    }\n    this['enqueued'] = true;\n    documentWait(validateFn);\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   */\n  addCustomStyle(style) {\n    if (!style[SEEN_MARKER]) {\n      style[SEEN_MARKER] = true;\n      this['customStyles'].push(style);\n      this.enqueueDocumentValidation();\n    }\n  }\n  /**\n   * @param {!CustomStyleProvider} customStyle\n   * @return {HTMLStyleElement}\n   */\n  getStyleForCustomStyle(customStyle) {\n    if (customStyle[CACHED_STYLE]) {\n      return customStyle[CACHED_STYLE];\n    }\n    let style;\n    if (customStyle['getStyle']) {\n      style = customStyle['getStyle']();\n    } else {\n      style = customStyle;\n    }\n    return style;\n  }\n  /**\n   * @return {!Array<!CustomStyleProvider>}\n   */\n  processStyles() {\n    const cs = this['customStyles'];\n    for (let i = 0; i < cs.length; i++) {\n      const customStyle = cs[i];\n      if (customStyle[CACHED_STYLE]) {\n        continue;\n      }\n      const style = this.getStyleForCustomStyle(customStyle);\n      if (style) {\n        // HTMLImports polyfill may have cloned the style into the main document,\n        // which is referenced with __appliedElement.\n        const styleToTransform = /** @type {!HTMLStyleElement} */ (style[\n          '__appliedElement'\n        ] || style);\n        if (transformFn) {\n          transformFn(styleToTransform);\n        }\n        customStyle[CACHED_STYLE] = styleToTransform;\n      }\n    }\n    return cs;\n  }\n}\n\n/* eslint-disable no-self-assign */\nCustomStyleInterface.prototype['addCustomStyle'] =\n  CustomStyleInterface.prototype.addCustomStyle;\nCustomStyleInterface.prototype['getStyleForCustomStyle'] =\n  CustomStyleInterface.prototype.getStyleForCustomStyle;\nCustomStyleInterface.prototype['processStyles'] =\n  CustomStyleInterface.prototype.processStyles;\n/* eslint-enable no-self-assign */\n\nObject.defineProperties(CustomStyleInterface.prototype, {\n  'transformCallback': {\n    /** @return {?function(!HTMLStyleElement)} */\n    get() {\n      return transformFn;\n    },\n    /** @param {?function(!HTMLStyleElement)} fn */\n    set(fn) {\n      transformFn = fn;\n    },\n  },\n  'validateCallback': {\n    /** @return {?function()} */\n    get() {\n      return validateFn;\n    },\n    /**\n     * @param {?function()} fn\n     * @this {CustomStyleInterface}\n     */\n    set(fn) {\n      let needsEnqueue = false;\n      if (!validateFn) {\n        needsEnqueue = true;\n      }\n      validateFn = fn;\n      if (needsEnqueue) {\n        this.enqueueDocumentValidation();\n      }\n    },\n  },\n});\n\n/** @typedef {{\n * customStyles: !Array<!CustomStyleProvider>,\n * addCustomStyle: function(!CustomStyleProvider),\n * getStyleForCustomStyle: function(!CustomStyleProvider): HTMLStyleElement,\n * findStyles: function(),\n * transformCallback: ?function(!HTMLStyleElement),\n * validateCallback: ?function()\n * }}\n */\nexport const CustomStyleInterfaceInterface = {};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(\n  window['ShadyDOM'] && window['ShadyDOM']['inUse']\n);\n/** @type {boolean} */\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n  if (settings && settings.shimcssproperties) {\n    nativeCssVariables_ = false;\n  } else {\n    // chrome 49 has semi-working css vars, check if box-shadow works\n    // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n    // However, shim css custom properties are only supported with ShadyDOM enabled,\n    // so fall back on native if we do not detect ShadyDOM\n    // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n    nativeCssVariables_ =\n      nativeShadow ||\n      Boolean(\n        !navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n          window.CSS &&\n          CSS.supports &&\n          CSS.supports('box-shadow', '0 0 0 var(--foo)')\n      );\n  }\n}\n\n/** @type {string | undefined} */\nexport let cssBuild;\nif (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) {\n  cssBuild = window.ShadyCSS.cssBuild;\n}\n\n/** @type {boolean} */\nexport const disableRuntime = Boolean(\n  window.ShadyCSS && window.ShadyCSS.disableRuntime\n);\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n  nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n  calcCssVariables(window.ShadyCSS);\n  // reset window variable to let ShadyCSS API take its place\n  window.ShadyCSS = undefined;\n} else {\n  calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */ (nativeCssVariables_);\n","import {\n  BLOCK_SIZE,\n  DIGEST_LENGTH,\n  INIT,\n  KEY,\n  MAX_HASHABLE_LENGTH\n} from \"./constants\";\n\n/**\n * @internal\n */\nexport class RawSha256 {\n  private state: Int32Array = Int32Array.from(INIT);\n  private temp: Int32Array = new Int32Array(64);\n  private buffer: Uint8Array = new Uint8Array(64);\n  private bufferLength: number = 0;\n  private bytesHashed: number = 0;\n\n  /**\n   * @internal\n   */\n  finished: boolean = false;\n\n  update(data: Uint8Array): void {\n    if (this.finished) {\n      throw new Error(\"Attempted to update an already finished hash.\");\n    }\n\n    let position = 0;\n    let { byteLength } = data;\n    this.bytesHashed += byteLength;\n\n    if (this.bytesHashed * 8 > MAX_HASHABLE_LENGTH) {\n      throw new Error(\"Cannot hash more than 2^53 - 1 bits\");\n    }\n\n    while (byteLength > 0) {\n      this.buffer[this.bufferLength++] = data[position++];\n      byteLength--;\n\n      if (this.bufferLength === BLOCK_SIZE) {\n        this.hashBuffer();\n        this.bufferLength = 0;\n      }\n    }\n  }\n\n  digest(): Uint8Array {\n    if (!this.finished) {\n      const bitsHashed = this.bytesHashed * 8;\n      const bufferView = new DataView(\n        this.buffer.buffer,\n        this.buffer.byteOffset,\n        this.buffer.byteLength\n      );\n\n      const undecoratedLength = this.bufferLength;\n      bufferView.setUint8(this.bufferLength++, 0x80);\n\n      // Ensure the final block has enough room for the hashed length\n      if (undecoratedLength % BLOCK_SIZE >= BLOCK_SIZE - 8) {\n        for (let i = this.bufferLength; i < BLOCK_SIZE; i++) {\n          bufferView.setUint8(i, 0);\n        }\n        this.hashBuffer();\n        this.bufferLength = 0;\n      }\n\n      for (let i = this.bufferLength; i < BLOCK_SIZE - 8; i++) {\n        bufferView.setUint8(i, 0);\n      }\n      bufferView.setUint32(\n        BLOCK_SIZE - 8,\n        Math.floor(bitsHashed / 0x100000000),\n        true\n      );\n      bufferView.setUint32(BLOCK_SIZE - 4, bitsHashed);\n\n      this.hashBuffer();\n\n      this.finished = true;\n    }\n\n    // The value in state is little-endian rather than big-endian, so flip\n    // each word into a new Uint8Array\n    const out = new Uint8Array(DIGEST_LENGTH);\n    for (let i = 0; i < 8; i++) {\n      out[i * 4] = (this.state[i] >>> 24) & 0xff;\n      out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n      out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n      out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n    }\n\n    return out;\n  }\n\n  private hashBuffer(): void {\n    const { buffer, state } = this;\n\n    let state0 = state[0],\n      state1 = state[1],\n      state2 = state[2],\n      state3 = state[3],\n      state4 = state[4],\n      state5 = state[5],\n      state6 = state[6],\n      state7 = state[7];\n\n    for (let i = 0; i < BLOCK_SIZE; i++) {\n      if (i < 16) {\n        this.temp[i] =\n          ((buffer[i * 4] & 0xff) << 24) |\n          ((buffer[i * 4 + 1] & 0xff) << 16) |\n          ((buffer[i * 4 + 2] & 0xff) << 8) |\n          (buffer[i * 4 + 3] & 0xff);\n      } else {\n        let u = this.temp[i - 2];\n        const t1 =\n          ((u >>> 17) | (u << 15)) ^ ((u >>> 19) | (u << 13)) ^ (u >>> 10);\n\n        u = this.temp[i - 15];\n        const t2 =\n          ((u >>> 7) | (u << 25)) ^ ((u >>> 18) | (u << 14)) ^ (u >>> 3);\n\n        this.temp[i] =\n          ((t1 + this.temp[i - 7]) | 0) + ((t2 + this.temp[i - 16]) | 0);\n      }\n\n      const t1 =\n        ((((((state4 >>> 6) | (state4 << 26)) ^\n          ((state4 >>> 11) | (state4 << 21)) ^\n          ((state4 >>> 25) | (state4 << 7))) +\n          ((state4 & state5) ^ (~state4 & state6))) |\n          0) +\n          ((state7 + ((KEY[i] + this.temp[i]) | 0)) | 0)) |\n        0;\n\n      const t2 =\n        ((((state0 >>> 2) | (state0 << 30)) ^\n          ((state0 >>> 13) | (state0 << 19)) ^\n          ((state0 >>> 22) | (state0 << 10))) +\n          ((state0 & state1) ^ (state0 & state2) ^ (state1 & state2))) |\n        0;\n\n      state7 = state6;\n      state6 = state5;\n      state5 = state4;\n      state4 = (state3 + t1) | 0;\n      state3 = state2;\n      state2 = state1;\n      state1 = state0;\n      state0 = (t1 + t2) | 0;\n    }\n\n    state[0] += state0;\n    state[1] += state1;\n    state[2] += state2;\n    state[3] += state3;\n    state[4] += state4;\n    state[5] += state5;\n    state[6] += state6;\n    state[7] += state7;\n  }\n}\n","/**\n * @internal\n */\nexport const BLOCK_SIZE: number = 64;\n\n/**\n * @internal\n */\nexport const DIGEST_LENGTH: number = 32;\n\n/**\n * @internal\n */\nexport const KEY = new Uint32Array([\n  0x428a2f98,\n  0x71374491,\n  0xb5c0fbcf,\n  0xe9b5dba5,\n  0x3956c25b,\n  0x59f111f1,\n  0x923f82a4,\n  0xab1c5ed5,\n  0xd807aa98,\n  0x12835b01,\n  0x243185be,\n  0x550c7dc3,\n  0x72be5d74,\n  0x80deb1fe,\n  0x9bdc06a7,\n  0xc19bf174,\n  0xe49b69c1,\n  0xefbe4786,\n  0x0fc19dc6,\n  0x240ca1cc,\n  0x2de92c6f,\n  0x4a7484aa,\n  0x5cb0a9dc,\n  0x76f988da,\n  0x983e5152,\n  0xa831c66d,\n  0xb00327c8,\n  0xbf597fc7,\n  0xc6e00bf3,\n  0xd5a79147,\n  0x06ca6351,\n  0x14292967,\n  0x27b70a85,\n  0x2e1b2138,\n  0x4d2c6dfc,\n  0x53380d13,\n  0x650a7354,\n  0x766a0abb,\n  0x81c2c92e,\n  0x92722c85,\n  0xa2bfe8a1,\n  0xa81a664b,\n  0xc24b8b70,\n  0xc76c51a3,\n  0xd192e819,\n  0xd6990624,\n  0xf40e3585,\n  0x106aa070,\n  0x19a4c116,\n  0x1e376c08,\n  0x2748774c,\n  0x34b0bcb5,\n  0x391c0cb3,\n  0x4ed8aa4a,\n  0x5b9cca4f,\n  0x682e6ff3,\n  0x748f82ee,\n  0x78a5636f,\n  0x84c87814,\n  0x8cc70208,\n  0x90befffa,\n  0xa4506ceb,\n  0xbef9a3f7,\n  0xc67178f2\n]);\n\n/**\n * @internal\n */\nexport const INIT = [\n  0x6a09e667,\n  0xbb67ae85,\n  0x3c6ef372,\n  0xa54ff53a,\n  0x510e527f,\n  0x9b05688c,\n  0x1f83d9ab,\n  0x5be0cd19\n];\n\n/**\n * @internal\n */\nexport const MAX_HASHABLE_LENGTH = 2 ** 53 - 1;\n","export * from \"./jsSha256\";\n","import { BLOCK_SIZE } from \"./constants\";\nimport { RawSha256 } from \"./RawSha256\";\nimport { Hash, SourceData } from \"@aws-sdk/types\";\nimport { isEmptyData, convertToBuffer } from \"@aws-crypto/util\";\n\nexport class Sha256 implements Hash {\n  private readonly hash = new RawSha256();\n  private readonly outer?: RawSha256;\n  private error: any;\n\n  constructor(secret?: SourceData) {\n    if (secret) {\n      this.outer = new RawSha256();\n      const inner = bufferFromSecret(secret);\n      const outer = new Uint8Array(BLOCK_SIZE);\n      outer.set(inner);\n\n      for (let i = 0; i < BLOCK_SIZE; i++) {\n        inner[i] ^= 0x36;\n        outer[i] ^= 0x5c;\n      }\n\n      this.hash.update(inner);\n      this.outer.update(outer);\n\n      // overwrite the copied key in memory\n      for (let i = 0; i < inner.byteLength; i++) {\n        inner[i] = 0;\n      }\n    }\n  }\n\n  update(toHash: SourceData): void {\n    if (isEmptyData(toHash) || this.error) {\n      return;\n    }\n\n    try {\n      this.hash.update(convertToBuffer(toHash));\n    } catch (e) {\n      this.error = e;\n    }\n  }\n\n  /* This synchronous method keeps compatibility\n   * with the v2 aws-sdk.\n   */\n  digestSync(): Uint8Array {\n    if (this.error) {\n      throw this.error;\n    }\n\n    if (this.outer) {\n      if (!this.outer.finished) {\n        this.outer.update(this.hash.digest());\n      }\n\n      return this.outer.digest();\n    }\n\n    return this.hash.digest();\n  }\n\n  /* The underlying digest method here is synchronous.\n   * To keep the same interface with the other hash functions\n   * the default is to expose this as an async method.\n   * However, it can sometimes be useful to have a sync method.\n   */\n  async digest(): Promise<Uint8Array> {\n    return this.digestSync();\n  }\n}\n\nfunction bufferFromSecret(secret: SourceData): Uint8Array {\n  let input = convertToBuffer(secret);\n\n  if (input.byteLength > BLOCK_SIZE) {\n    const bufferHash = new RawSha256();\n    bufferHash.update(input);\n    input = bufferHash.digest();\n  }\n\n  const buffer = new Uint8Array(BLOCK_SIZE);\n  buffer.set(input);\n  return buffer;\n}\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SourceData } from \"@aws-sdk/types\";\nimport { fromUtf8 as fromUtf8Browser } from \"@aws-sdk/util-utf8-browser\";\n\n// Quick polyfill\nconst fromUtf8 =\n  typeof Buffer !== \"undefined\" && Buffer.from\n    ? (input: string) => Buffer.from(input, \"utf8\")\n    : fromUtf8Browser;\n\nexport function convertToBuffer(data: SourceData): Uint8Array {\n  // Already a Uint8, do nothing\n  if (data instanceof Uint8Array) return data;\n\n  if (typeof data === \"string\") {\n    return fromUtf8(data);\n  }\n\n  if (ArrayBuffer.isView(data)) {\n    return new Uint8Array(\n      data.buffer,\n      data.byteOffset,\n      data.byteLength / Uint8Array.BYTES_PER_ELEMENT\n    );\n  }\n\n  return new Uint8Array(data);\n}\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport { convertToBuffer } from \"./convertToBuffer\";\nexport { isEmptyData } from \"./isEmptyData\";\nexport { numToUint8 } from \"./numToUint8\";\nexport {uint32ArrayFrom} from './uint32ArrayFrom';\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SourceData } from \"@aws-sdk/types\";\n\nexport function isEmptyData(data: SourceData): boolean {\n  if (typeof data === \"string\") {\n    return data.length === 0;\n  }\n\n  return data.byteLength === 0;\n}\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function numToUint8(num: number) {\n  return new Uint8Array([\n    (num & 0xff000000) >> 24,\n    (num & 0x00ff0000) >> 16,\n    (num & 0x0000ff00) >> 8,\n    num & 0x000000ff,\n  ]);\n}\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// IE 11 does not support Array.from, so we do it manually\nexport function uint32ArrayFrom(a_lookUpTable: Array<number>): Uint32Array {\n  if (!Array.from) {\n    const return_array = new Uint32Array(a_lookUpTable.length)\n    let a_index = 0\n    while (a_index < a_lookUpTable.length) {\n      return_array[a_index] = a_lookUpTable[a_index]\n    }\n    return return_array\n  }\n  return Uint32Array.from(a_lookUpTable)\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export const baseConfig = {\n \"debug\": false,\n \"defaultRedirectUrl\": \"https://platform.prod.sw-machines.io/\",\n \"privacyPolicy\": {\n  \"baseUrl\": \"/static/\",\n  \"documentUrls\": {\n   \"de\": \"PRIVACY_POLICY_DE.md\",\n   \"en\": \"PRIVACY_POLICY_EN.md\",\n   \"version\": \"2.0\"\n  }\n },\n \"aws\": {\n  \"cognito\": {\n   \"userPool\": {\n    \"userPoolIdLogin\": \"eu-central-1_iIhtU9UXM\",\n    \"userPoolId\": \"eu-central-1\",\n    \"clientId\": \"3uqbavikgm34i9pkhkirqi6itb\"\n   }\n  }\n },\n \"backend\": {\n  \"services\": {\n   \"alarm\": {\n    \"base_url\": \"https://alarm.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"list\": \"/alarms/list\",\n     \"top\": \"/alarms/top/amount\",\n     \"topWithTimesFilter\": \"/alarms/amount\"\n    }\n   },\n   \"device\": {\n    \"base_url\": \"https://device.prod.sw-machines.io\",\n    \"base_url_zip\": \"https://static.prod.sw-machines.io/swcp/migration/aws-migrate-iot.zip\",\n    \"endpoints\": {\n     \"enrollment\": \"/devices\",\n     \"teamviewer_install\": \"/iot/groups\",\n     \"iot\": \"/iot\",\n     \"groups\": \"/groups\",\n     \"teamviewer_deployment\": \"/deployments\",\n     \"template_upload\": \"/template/teamviewer\"\n    }\n   },\n   \"datawarehouse\": {\n    \"base_url\": \"https://datawarehouse.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"assets\": \"/datawarehouse/assets\"\n    }\n   },\n   \"assets\": {\n    \"base_url\": \"https://asset.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"breadcrumb\": \"/breadcrumb\",\n     \"companies\": \"/companies\",\n     \"controllers\": \"/controllers\",\n     \"controller\": \"/controller\",\n     \"countries\": \"/countries\",\n     \"customer_number\": \"/customerNumber\",\n     \"enrollment\": \"/devices\",\n     \"halls\": \"/halls\",\n     \"industry_sectors\": \"/industrySectors\",\n     \"industry_sector\": \"/industrySector\",\n     \"lines\": \"/lines\",\n     \"locations\": \"/locations\",\n     \"machines\": \"/machines\",\n     \"machine_types\": \"/machine_types\",\n     \"machine_type\": \"/machineType\",\n     \"search\": {\n      \"base_endpoint\": \"/search/machines\",\n      \"machineType\": \"/machineType\"\n     }\n    }\n   },\n   \"shopfloor\": {\n    \"base_url\": \"https://content.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"netcfg\": {\n      \"machines\": \"/machines/\",\n      \"netcfg_endpoint\": \"/netcfg\"\n     },\n     \"shopfloor\": {\n      \"base_endpoint\": \"/shopfloor\",\n      \"line\": {\n       \"data\": \"/lines/\",\n       \"image\": \"/lines/\"\n      },\n      \"hall\": {\n       \"data\": \"/halls/\",\n       \"image\": \"/halls/\"\n      }\n     }\n    }\n   },\n   \"auth\": {\n    \"base_url\": \"https://auth.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"check_access_token\": \"/check\",\n     \"logout\": \"/revoke\",\n     \"refresh\": \"/refresh\"\n    }\n   },\n   \"axistest\": {\n    \"base_url\": \"https://axistest.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"overview\": \"/overview\",\n     \"result\": \"/result\"\n    }\n   },\n   \"timeseries\": {\n    \"base_url\": \"https://timeseries.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"alarms\": {\n      \"list\": \"/alarms/list\",\n      \"top\": \"/alarms/top/amount\"\n     },\n     \"process_time\": \"/process_time\",\n     \"process_time_export\": \"/process_time/export\",\n     \"process_time_aggregated\": \"/process_time/aggregated\",\n     \"process_time_distribution\": \"/process_time/distribution\",\n     \"availability\": \"/availability\",\n     \"availability_aggregated\": \"/availability/aggregated\",\n     \"export_availability\": \"/availability/export\",\n     \"export_timeline\": \"/generic/timeline/export\",\n     \"cycle_time\": \"/generic/timeline\",\n     \"feedrate_override\": {\n      \"current\": \"/v2/override/feedrate\"\n     },\n     \"multi_timeline\": {\n      \"timeline\": \"/generic/timeline\",\n      \"collections\": \"/collections\",\n      \"spindle_collections_ids\": [\n       \"7b2b65c7-4c64-4d8b-94ba-fd02826b82ab\",\n       \"be89cddb-72a0-481f-828d-075d32cbe19c\",\n       \"a07fd607-bbf5-4e6c-aad1-ac65ca0a2c82\",\n       \"81e7b55e-e756-4a8c-a5ca-556c844e514d\",\n       \"a7a9d141-bb93-4512-93f0-a64d150b1e51\",\n       \"77145879-c9a3-4a47-a28a-a626cfda95fa\",\n       \"5d771339-185d-4dbe-9d81-dd5edcf865d8\",\n       \"57fe4512-10e6-4d05-9cdc-51afdb2875ab\",\n       \"2795ad6f-91f4-49fc-9f59-d9cb55eb6e44\",\n       \"ff7940f9-59ea-403f-981c-c39d0cb64f78\",\n       \"6773e806-a3af-4aa0-834b-d6bde8dbc398\",\n       \"21a64a2b-4ae4-47c2-a450-2c9445d7442d\",\n       \"e4e31942-8a03-4118-bf47-f03b4368b164\",\n       \"d695be95-18d2-4e50-bf21-b0554668863b\",\n       \"78bf98c9-4907-43c8-ae7c-7a3e2711bbf0\",\n       \"6dbf489b-5eb3-4fde-a20e-75791c2187cd\",\n       \"b7df76d1-d609-4a6b-9fd4-c9c5a65412c2\",\n       \"499535a7-3976-4fbb-98bc-2cce5b609902\",\n       \"ee9674bb-0cd4-4c69-b40d-bc762e369d0d\",\n       \"c480acfe-6019-4fa8-b386-4637150cc0f4\",\n       \"4accd21b-6efc-4070-b92c-6979ec4fa5bf\",\n       \"8f4db641-beab-4489-bf84-baacc3d81958\",\n       \"1feac422-fc75-44d3-bf03-0c6f1f872910\",\n       \"d42961c5-6e8e-4e82-9ef9-ffcfb8f21a5e\",\n       \"d6b6764e-1483-4518-bd0a-fe35985904d8\",\n       \"5924bfa9-8230-4101-a9fa-94e57bd8d559\",\n       \"aa690344-72df-4fc7-abc6-34ae61e56764\",\n       \"b787d83b-2199-4212-a6b8-e0cd297d5dd1\",\n       \"d0e34d4b-97fd-44e6-8d7a-126f9cdeb03a\",\n       \"0aed3b5d-fcb5-4507-a00b-494abcf3330d\",\n       \"046d3751-60ee-442d-b9d3-2f965fd4f40a\",\n       \"cda792ca-906a-4623-b446-36e8655570d9\",\n       \"934f720c-2d9f-403d-9e3e-6268ae0610d3\",\n       \"541e9d2a-a82e-4ec0-921b-7238722bd7fa\",\n       \"5dac3c82-dfd7-4315-9800-1524035738ad\",\n       \"8611c194-b59d-41a9-9fae-f28b4d13d1ad\"\n      ],\n      \"variables\": \"/variables\",\n      \"current\": \"/generic/latest\"\n     },\n     \"operation_mode\": {\n      \"timeline\": \"/generic/timeline\",\n      \"current\": \"/generic/latest\"\n     },\n     \"runtime_monitor\": {\n      \"timeline\": \"/generic/timeline\",\n      \"current\": \"/generic/latest\"\n     },\n     \"uptime_controller\": {\n      \"kpi\": \"/availability/distribution\",\n      \"timeline\": \"/generic/timeline\"\n     },\n     \"spindle_override\": {\n      \"current\": \"/v2/override/spindle\"\n     },\n     \"tiles\": {\n      \"detail_tile\": \"/tiles/detail\"\n     },\n     \"workpiece_counter\": \"/tiles/counter\",\n     \"maintenance\": {\n      \"available_axis_tests\": \"/axisTest/availableAxisTests\",\n      \"axis_test_result\": \"/axisTest/axisTestResult\"\n     },\n     \"variables\": {\n      \"collections\": \"/collections\",\n      \"variables\": \"/variables\"\n     }\n    },\n    \"variable_ids\": {\n     \"CONNECTION_STATE_BOX\": \"51cb59ce-373a-4ba0-87f4-e903594a9fda\",\n     \"SENDING_STATE\": \"2bd70b18-05e3-4c20-b9f3-3bb2f4afee11\",\n     \"RUNTIME_DATA_AND_OPERATION_MODE\": [\n      \"aacf3da7-740a-406e-b897-070bf722913c\",\n      \"f6f5e6a7-5053-4603-ab1a-d7ee9cb7c7be\"\n     ],\n     \"G_FUNCTION_AND_ACTIVE_TOOL\": [\n      \"eb9c8165-b63a-446b-a2a7-0a53b6288c78\",\n      \"6d850e81-480b-40b4-ac61-d9afafde7673\"\n     ],\n     \"P8_TOOL_BREAKAGE_STEP_END_INCREASING\": [\n      \"c580b25b-9da7-4c90-8730-49aa250152cd\"\n     ],\n     \"P8_TOOL_BREAKAGE_STEP_END\": [\n      \"9c38fabc-5f29-45c3-ad64-9344c5610f6e\"\n     ],\n     \"P8_TOOLMON_SKIP_STEP\": [\n      \"ae444eeb-5d2c-4a89-9baf-43102c3db4bd\"\n     ],\n     \"P8_TOOLMON_TOOL_LIFE_AND_SKIP_STEP\": [\n      \"ae444eeb-5d2c-4a89-9baf-43102c3db4bd\",\n      \"c8021510-4b2c-4cfc-95ae-d1191edbc4e5\"\n     ],\n     \"P8_TOOLMON_DELTA_T_FIRST_G1\": [\n      \"c3f201ae-0c18-4721-88f5-5e37ce90d53b\"\n     ],\n     \"TARGET_SPINDLE_SPEED\": [\n      \"b8ce425b-ba71-4e5e-a864-8bbad8f9fc01\"\n     ],\n     \"TOOL_CHANGE_IN_PROCESS\": [\n      \"f4166c44-7645-40bd-a61e-22ef3894f3eb\"\n     ],\n     \"P8_TOOL_BREAKAGE_STATE_A\": [\n      \"37bb232b-1358-4fa2-b679-c12c3cb75fb1\"\n     ],\n     \"P8_TOOL_BREAKAGE_STATE_U\": [\n      \"5344acc7-3e7d-4dd2-88a3-4bdc35c0ef8d\"\n     ],\n     \"P8_TOOLMON_BAD_WORKPIECE\": [\n      \"a638140a-d235-43e3-9cd9-bd562376990b\"\n     ],\n     \"TECH_FINALIZED\": [\n      \"bb2e0900-379b-4114-a5f5-4404d2f37f58\",\n      \"aad4ce95-4f89-47f9-9cf5-19f29cc41900\"\n     ],\n     \"STATE_A_U\": [\n      \"37bb232b-1358-4fa2-b679-c12c3cb75fb1\",\n      \"5344acc7-3e7d-4dd2-88a3-4bdc35c0ef8d\"\n     ],\n     \"SPINDLE_ACTIVE\": [\n      \"7b30dc27-4746-4232-9f8f-d2c89195b9d4\",\n      \"17e8d664-c009-4040-b7d3-d376501b8ab0\",\n      \"9b228ca5-4b6c-4b6e-8e93-6c08642ff6ac\",\n      \"8eab6393-ec01-4181-aace-3be85579fa8e\"\n     ],\n     \"SCORE\": [\n      \"98502371-e947-4c48-a39d-12d8d5482601\",\n      \"e8262a6d-fb75-4b3a-98fe-fa74db5d32c1\",\n      \"201e52a2-67d7-4bb6-ad3e-576886524c9e\",\n      \"a3fa7ff1-1097-4c4e-9102-203b5dad8886\",\n      \"49cd917e-e33e-48f3-b8e0-fbf573231f95\",\n      \"4fed9fe6-13fa-4b46-959a-d5fc689ce666\",\n      \"3e94fc95-b04e-4c9e-8a80-366dbca7c8f2\",\n      \"64711ee4-0ff1-4457-b98d-d336cd15ec04\"\n     ],\n     \"BAD_WORKPIECE\": [\n      \"ee378e67-3d2b-4dc4-8df3-9ad2846ebada\",\n      \"91ef0d35-84ab-4328-a8aa-461c1fa1e6f7\",\n      \"e5cbad4c-4049-4eb3-b9f2-d03ea3f0de86\",\n      \"cd604e9d-3dc5-4cc1-9ffe-6cda03e7a096\",\n      \"62477f89-0bf1-4263-83f8-049ac9ba8140\",\n      \"48ec57fa-2679-4441-a146-5d81a3e91bde\",\n      \"dd4b3288-d078-4ff4-902c-4aeedd74833e\",\n      \"3a918bc9-4de9-4560-985d-1a4a4c2dddf9\"\n     ],\n     \"P8_TOOLMON_ACTIVE\": [\n      \"20436167-1573-43e2-82c0-db3c07af854d\"\n     ],\n     \"P8_TOOLMON_ANALYZER_CHECK_RESULT\": [\n      \"92f6c7bb-3ddb-4f3d-b6ab-363faa1f34c9\"\n     ],\n     \"P8_TOOL_BREAKAGE_SENSITIVITY_LIMIT\": [\n      \"6d45e08a-ef50-4a65-a1f2-e500a7e9add3\"\n     ],\n     \"P8_TOOLMON_N_ENCODER_STROKES\": [\n      \"d30395ef-b13b-49cb-9572-40688a8314ee\"\n     ],\n     \"G_FUNCTION_AND_ACTIVE_TOOL_AND_TABLE\": [\n      \"eb9c8165-b63a-446b-a2a7-0a53b6288c78\",\n      \"6d850e81-480b-40b4-ac61-d9afafde7673\",\n      \"341ccda9-06f6-47cd-b398-7cff82282358\",\n      \"b383986d-16c7-4c27-93d0-d04f9af280f9\"\n     ],\n     \"G_FUNCTION\": [\n      \"eb9c8165-b63a-446b-a2a7-0a53b6288c78\"\n     ],\n     \"Q_AXIS_AND_SPINDLE\": [\n      \"341ccda9-06f6-47cd-b398-7cff82282358\",\n      \"b383986d-16c7-4c27-93d0-d04f9af280f9\",\n      \"530b97d9-efde-4fd3-b201-d5dfed14b7be\",\n      \"3ca71ae1-1e6b-4ba5-935d-0156066e2fec\",\n      \"7e9e0866-8e03-4336-85f8-663fd38d57f6\",\n      \"b470fdee-05b0-4b31-a147-482f8d0815dc\"\n     ],\n     \"ANALYZER_OK\": [\n      \"92f6c7bb-3ddb-4f3d-b6ab-363faa1f34c9\"\n     ],\n     \"ACTIVE_TOOL\": [\n      \"6d850e81-480b-40b4-ac61-d9afafde7673\"\n     ],\n     \"RUNTIME_DATA\": [\n      \"aacf3da7-740a-406e-b897-070bf722913c\"\n     ],\n     \"OPERATION_MODE\": [\n      \"f6f5e6a7-5053-4603-ab1a-d7ee9cb7c7be\"\n     ],\n     \"CYCLETIME_TABLES\": [\n      \"3f3430fb-4820-4e9c-baad-79c3ec78ca55\",\n      \"0c8caacc-1251-4537-95d2-7d591fda2661\"\n     ],\n     \"MACHINE_STATE\": [\n      \"aacf3da7-740a-406e-b897-070bf722913c\"\n     ],\n     \"FEEDRATE_OVERRIDE\": [\n      \"8af8fe41-e740-4b4c-961c-e8ae3a1faafb\"\n     ],\n     \"SPINDLE_OVERRIDE\": [\n      \"195db9c0-59a7-462e-b04c-5159ac4d9a04\"\n     ],\n     \"NUMBER_ALARMS_AND_RUNTIME_DATA\": [\n      \"aacf3da7-740a-406e-b897-070bf722913c\",\n      \"6a6ecdb1-6df9-4ff5-989a-74de62cbd167\"\n     ],\n     \"ENERGY_MONITORING_AIR\": [\n      \"f8ac107c-508b-43bd-a021-0fee9b3e051e\",\n      \"b8e21147-a6e4-440a-837b-8c9689f2710c\",\n      \"3d8ec2b9-de3c-4b81-9f4a-078c0045ede2\",\n      \"910e969c-3051-451a-801e-d851d92ffaf0\",\n      \"dffda5c0-dfb5-42c2-a81f-4b06bb4d2ec3\",\n      \"77ab8131-d771-4985-8e9a-34aa0d2bf102\"\n     ],\n     \"ENERGY_MONITORING_CURRENT\": [\n      \"24d76757-d672-4de8-837a-b1c3696da1cf\",\n      \"d532eb8f-1777-420d-b4e4-9c78b1872d4d\",\n      \"caf68ced-a27b-40b3-9146-932202ab7b5d\",\n      \"15009529-5e49-48b6-9778-732ef3ee7d97\",\n      \"7f288be5-0501-4cdf-89ef-b8829fd90c51\",\n      \"1e9646c4-6801-49f9-a1d4-c2a5ab29bc9b\"\n     ],\n     \"ENERGY_MONITORING_HOUR\": [\n      \"1d21755b-7649-44f7-a24a-d46cbdc0c353\",\n      \"dcf8084f-387f-4e23-883c-2409defc1892\"\n     ],\n     \"DB370_MESSAGE\": \"2e791d7f-36ce-4df5-bc2b-940b4cd6429c\",\n     \"NC_PROGRAM\": [\n      \"140cf1a8-7ccb-4325-ad9e-6ac08872dac3\"\n     ],\n     \"ENDURANCE_TEST\": [\n      \"5f93838d-5daf-4b03-b258-b97e4ab4b2aa\"\n     ],\n     \"STACKLIGHTS\": [\n      \"af142f39-6a79-484c-be24-708fdd053742\",\n      \"37761fa8-beb5-449b-aef4-906ec79c5351\",\n      \"77edf403-b7e7-48eb-a2df-0be408b3651e\"\n     ],\n     \"QAXIS_180\": [\n      \"b383986d-16c7-4c27-93d0-d04f9af280f9\"\n     ]\n    }\n   },\n   \"limits\": {\n    \"base_url\": \"https://limits.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"machines\": \"/machines\",\n     \"limits\": \"/limits\",\n     \"updateLimits\": \"/update\",\n     \"machine_types\": \"/machine_types\",\n     \"table\": {\n      \"limit\": \"/table\",\n      \"alarms\": \"/alarms/table\"\n     }\n    }\n   },\n   \"service\": {\n    \"base_url\": \"https://mail.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"mail\": \"/mail\"\n    },\n    \"request\": {\n     \"types\": [\n      {\n       \"id\": \"service\"\n      },\n      {\n       \"id\": \"inspection\"\n      },\n      {\n       \"id\": \"expansion\"\n      },\n      {\n       \"id\": \"retrofit\"\n      },\n      {\n       \"id\": \"request\"\n      }\n     ]\n    },\n    \"file_languages\": [\n     {\n      \"id\": \"cs\"\n     },\n     {\n      \"id\": \"cz\"\n     },\n     {\n      \"id\": \"da\"\n     },\n     {\n      \"id\": \"de\"\n     },\n     {\n      \"id\": \"en\"\n     },\n     {\n      \"id\": \"es\"\n     },\n     {\n      \"id\": \"fr\"\n     },\n     {\n      \"id\": \"hu\"\n     },\n     {\n      \"id\": \"it\"\n     },\n     {\n      \"id\": \"ko\"\n     },\n     {\n      \"id\": \"mk\"\n     },\n     {\n      \"id\": \"nl\"\n     },\n     {\n      \"id\": \"pl\"\n     },\n     {\n      \"id\": \"pt\"\n     },\n     {\n      \"id\": \"ro\"\n     },\n     {\n      \"id\": \"sk\"\n     },\n     {\n      \"id\": \"sl\"\n     },\n     {\n      \"id\": \"sv\"\n     },\n     {\n      \"id\": \"tr\"\n     },\n     {\n      \"id\": \"zh\"\n     }\n    ],\n    \"maxUploadSizeInMB\": 2000\n   },\n   \"nc_state\": {\n    \"base_url\": \"https://machineevents.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"machines\": \"/machines\",\n     \"suffix_nc_state\": \"nc_data\"\n    }\n   },\n   \"manuals\": {\n    \"base_url\": \"https://content.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"manuals\": \"/machines\"\n    }\n   },\n   \"users\": {\n    \"base_url\": \"https://user.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"new\": \"/users\",\n     \"privacy_policy\": \"/users/me\",\n     \"settings\": \"/users/me/settings\",\n     \"userinfo\": \"/users/me\",\n     \"userlist\": \"/users\",\n     \"accountinfo\": \"/users\",\n     \"user_edit\": \"/users\",\n     \"user_delete\": \"/users\"\n    },\n    \"availableRoles\": [\n     \"DEVELOPER\",\n     \"SUPERUSER\",\n     \"OEM\",\n     \"OEM_QA\",\n     \"OEM_DOCS\",\n     \"OEM_USER_MANAGER\",\n     \"OEM_TECHNICIAN\",\n     \"USER\",\n     \"VISITOR\"\n    ],\n    \"availableGenders\": [\n     \"female\",\n     \"diverse\",\n     \"male\"\n    ]\n   },\n   \"save_user_settings\": {\n    \"base_url\": \"https://user.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"settings\": \"/users/me/settings\"\n    }\n   },\n   \"search\": {\n    \"base_endpoint\": \"/search/machines?query=\",\n    \"base_url\": \"https://search.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"search_users\": \"/search/users\"\n    },\n    \"search_all\": \"/search/machines?query=\"\n   },\n   \"release\": {\n    \"base_url\": \"https://release.prod.sw-machines.io\",\n    \"endpoints\": {\n     \"activeRelease\": \"/active\"\n    }\n   }\n  }\n },\n \"frontend\": {\n  \"applications\": {\n   \"login\": {\n    \"base_url\": \"https://platform.prod.sw-machines.io/login\"\n   }\n  }\n },\n \"generic\": {\n  \"variables\": {},\n  \"base_window_title\": \"SW lifedata CloudPlatform\",\n  \"window_title_separator\": \"-\",\n  \"geo_reference_url\": \"https://nominatim.openstreetmap.org/search?q=%query&format=json\",\n  \"patterns\": {\n   \"machine_sw_identifier\": {\n    \"pattern\": \"^[a-z0-9-_]{7,}$\",\n    \"modifier\": \"i\"\n   },\n   \"valid_email_address\": {\n    \"pattern\": \"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}\"\n   }\n  },\n  \"log\": {\n   \"console\": true,\n   \"server\": true,\n   \"log_levels\": {\n    \"log\": true,\n    \"info\": true,\n    \"warn\": true,\n    \"error\": true\n   }\n  },\n  \"chart\": {\n   \"height\": 400\n  },\n  \"datepicker\": {\n   \"enable_select_limit\": true,\n   \"max_selectable_days\": 31\n  },\n  \"color_side_bar\": \"rgba(36, 58, 79, 1)\",\n  \"logo\": \"/images/swlogo.svg\"\n },\n \"i18n\": {\n  \"language_file_url\": \"/_config/locales/{{language}}.json\",\n  \"default_language\": \"en\",\n  \"availableLanguages\": [\n   {\n    \"id\": \"cz\",\n    \"title\": \"czech\"\n   },\n   {\n    \"id\": \"en\",\n    \"title\": \"english\"\n   },\n   {\n    \"id\": \"de\",\n    \"title\": \"german\"\n   },\n   {\n    \"id\": \"zh\",\n    \"title\": \"chinese\"\n   },\n   {\n    \"id\": \"pl\",\n    \"title\": \"polish\"\n   },\n   {\n    \"id\": \"es\",\n    \"title\": \"spanish\"\n   },\n   {\n    \"id\": \"fr\",\n    \"title\": \"french\"\n   },\n   {\n    \"id\": \"it\",\n    \"title\": \"italian\"\n   },\n   {\n    \"id\": \"hu\",\n    \"title\": \"hungarian\"\n   },\n   {\n    \"id\": \"tr\",\n    \"title\": \"Turkish\"\n   },\n   {\n    \"id\": \"ko\",\n    \"title\": \"korean\"\n   }\n  ]\n },\n \"localstorage\": {\n  \"storage_key\": \"__SWCP__\",\n  \"token_key\": \"swcp-jwt\",\n  \"equability_limits_key\": \"equability_limits\",\n  \"circularity_limits_key\": \"circularity_limits\"\n },\n \"qs\": {\n  \"collection_id\": \"8d29c2b2-3530-4e5e-94ce-d14bcaa6e345\"\n },\n \"interval\": {\n  \"longTime\": 30000,\n  \"shortTime\": 30000\n },\n \"passwordCriteria\": {\n  \"length\": {\n   \"title\": \"min. 8 characters\",\n   \"pattern\": \"(?=^.{8,255}$).*\"\n  },\n  \"upperCaseLetters\": {\n   \"title\": \"min. 1 uppercase letter (A-Z)\",\n   \"pattern\": \"(?=.*[A-Z]).*\"\n  },\n  \"lowerCaseLetters\": {\n   \"title\": \"min. 1 lowercase letter (a-z)\",\n   \"pattern\": \"(?=.*[a-z]).*\"\n  },\n  \"number\": {\n   \"title\": \"min. 1 number (0-9)\",\n   \"pattern\": \"(?=.*[0-9]).*\"\n  },\n  \"specialChar\": {\n   \"title\": \"min. 1 special character\",\n   \"pattern\": \"(?=.*[~!@#$%^&*()_+-.?,;:}{\\\\]|[=\\\\/,<>`'\\\"])\"\n  },\n  \"dontMatchOld\": {\n   \"title\": \"must not match with old password\",\n   \"pattern\": \"dontMatchOld\"\n  },\n  \"matchConfirmationPassword\": {\n   \"title\": \"new password and re-typed password must match\",\n   \"pattern\": \"matchConfirmationPassword\"\n  },\n  \"enterValidationCode\": {\n   \"title\": \"Enter the validation code\",\n   \"pattern\": \"none\"\n  }\n },\n \"allowedBrowsers\": [\n  \"chrome\",\n  \"crios\",\n  \"chromium\",\n  \"edge\",\n  \"safari\",\n  \"firefox\",\n  \"opera\"\n ]\n};","function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nexport { _createClass as default };","function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nexport { _assertThisInitialized as default };","function _setPrototypeOf(t, e) {\n  return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inherits(t, e) {\n  if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n  t.prototype = Object.create(e && e.prototype, {\n    constructor: {\n      value: t,\n      writable: !0,\n      configurable: !0\n    }\n  }), Object.defineProperty(t, \"prototype\", {\n    writable: !1\n  }), e && setPrototypeOf(t, e);\n}\nexport { _inherits as default };","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nfunction _possibleConstructorReturn(t, e) {\n  if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n  if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n  return assertThisInitialized(t);\n}\nexport { _possibleConstructorReturn as default };","function _getPrototypeOf(t) {\n  return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n    return t.__proto__ || Object.getPrototypeOf(t);\n  }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nexport { _arrayLikeToArray as default };","import _typeof from '@babel/runtime/helpers/esm/typeof';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/esm/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/esm/getPrototypeOf';\nimport _defineProperty from '@babel/runtime/helpers/esm/defineProperty';\nimport _toArray from '@babel/runtime/helpers/esm/toArray';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar consoleLogger = {\n  type: 'logger',\n  log: function log(args) {\n    this.output('log', args);\n  },\n  warn: function warn(args) {\n    this.output('warn', args);\n  },\n  error: function error(args) {\n    this.output('error', args);\n  },\n  output: function output(type, args) {\n    if (console && console[type]) console[type].apply(console, args);\n  }\n};\n\nvar Logger = function () {\n  function Logger(concreteLogger) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Logger);\n\n    this.init(concreteLogger, options);\n  }\n\n  _createClass(Logger, [{\n    key: \"init\",\n    value: function init(concreteLogger) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      this.prefix = options.prefix || 'i18next:';\n      this.logger = concreteLogger || consoleLogger;\n      this.options = options;\n      this.debug = options.debug;\n    }\n  }, {\n    key: \"setDebug\",\n    value: function setDebug(bool) {\n      this.debug = bool;\n    }\n  }, {\n    key: \"log\",\n    value: function log() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return this.forward(args, 'log', '', true);\n    }\n  }, {\n    key: \"warn\",\n    value: function warn() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return this.forward(args, 'warn', '', true);\n    }\n  }, {\n    key: \"error\",\n    value: function error() {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return this.forward(args, 'error', '');\n    }\n  }, {\n    key: \"deprecate\",\n    value: function deprecate() {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n    }\n  }, {\n    key: \"forward\",\n    value: function forward(args, lvl, prefix, debugOnly) {\n      if (debugOnly && !this.debug) return null;\n      if (typeof args[0] === 'string') args[0] = \"\".concat(prefix).concat(this.prefix, \" \").concat(args[0]);\n      return this.logger[lvl](args);\n    }\n  }, {\n    key: \"create\",\n    value: function create(moduleName) {\n      return new Logger(this.logger, _objectSpread(_objectSpread({}, {\n        prefix: \"\".concat(this.prefix, \":\").concat(moduleName, \":\")\n      }), this.options));\n    }\n  }, {\n    key: \"clone\",\n    value: function clone(options) {\n      options = options || this.options;\n      options.prefix = options.prefix || this.prefix;\n      return new Logger(this.logger, options);\n    }\n  }]);\n\n  return Logger;\n}();\n\nvar baseLogger = new Logger();\n\nvar EventEmitter = function () {\n  function EventEmitter() {\n    _classCallCheck(this, EventEmitter);\n\n    this.observers = {};\n  }\n\n  _createClass(EventEmitter, [{\n    key: \"on\",\n    value: function on(events, listener) {\n      var _this = this;\n\n      events.split(' ').forEach(function (event) {\n        _this.observers[event] = _this.observers[event] || [];\n\n        _this.observers[event].push(listener);\n      });\n      return this;\n    }\n  }, {\n    key: \"off\",\n    value: function off(event, listener) {\n      if (!this.observers[event]) return;\n\n      if (!listener) {\n        delete this.observers[event];\n        return;\n      }\n\n      this.observers[event] = this.observers[event].filter(function (l) {\n        return l !== listener;\n      });\n    }\n  }, {\n    key: \"emit\",\n    value: function emit(event) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      if (this.observers[event]) {\n        var cloned = [].concat(this.observers[event]);\n        cloned.forEach(function (observer) {\n          observer.apply(void 0, args);\n        });\n      }\n\n      if (this.observers['*']) {\n        var _cloned = [].concat(this.observers['*']);\n\n        _cloned.forEach(function (observer) {\n          observer.apply(observer, [event].concat(args));\n        });\n      }\n    }\n  }]);\n\n  return EventEmitter;\n}();\n\nfunction defer() {\n  var res;\n  var rej;\n  var promise = new Promise(function (resolve, reject) {\n    res = resolve;\n    rej = reject;\n  });\n  promise.resolve = res;\n  promise.reject = rej;\n  return promise;\n}\nfunction makeString(object) {\n  if (object == null) return '';\n  return '' + object;\n}\nfunction copy(a, s, t) {\n  a.forEach(function (m) {\n    if (s[m]) t[m] = s[m];\n  });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n  function cleanKey(key) {\n    return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n  }\n\n  function canNotTraverseDeeper() {\n    return !object || typeof object === 'string';\n  }\n\n  var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n\n  while (stack.length > 1) {\n    if (canNotTraverseDeeper()) return {};\n    var key = cleanKey(stack.shift());\n    if (!object[key] && Empty) object[key] = new Empty();\n\n    if (Object.prototype.hasOwnProperty.call(object, key)) {\n      object = object[key];\n    } else {\n      object = {};\n    }\n  }\n\n  if (canNotTraverseDeeper()) return {};\n  return {\n    obj: object,\n    k: cleanKey(stack.shift())\n  };\n}\n\nfunction setPath(object, path, newValue) {\n  var _getLastOfPath = getLastOfPath(object, path, Object),\n      obj = _getLastOfPath.obj,\n      k = _getLastOfPath.k;\n\n  obj[k] = newValue;\n}\nfunction pushPath(object, path, newValue, concat) {\n  var _getLastOfPath2 = getLastOfPath(object, path, Object),\n      obj = _getLastOfPath2.obj,\n      k = _getLastOfPath2.k;\n\n  obj[k] = obj[k] || [];\n  if (concat) obj[k] = obj[k].concat(newValue);\n  if (!concat) obj[k].push(newValue);\n}\nfunction getPath(object, path) {\n  var _getLastOfPath3 = getLastOfPath(object, path),\n      obj = _getLastOfPath3.obj,\n      k = _getLastOfPath3.k;\n\n  if (!obj) return undefined;\n  return obj[k];\n}\nfunction getPathWithDefaults(data, defaultData, key) {\n  var value = getPath(data, key);\n\n  if (value !== undefined) {\n    return value;\n  }\n\n  return getPath(defaultData, key);\n}\nfunction deepExtend(target, source, overwrite) {\n  for (var prop in source) {\n    if (prop !== '__proto__' && prop !== 'constructor') {\n      if (prop in target) {\n        if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n          if (overwrite) target[prop] = source[prop];\n        } else {\n          deepExtend(target[prop], source[prop], overwrite);\n        }\n      } else {\n        target[prop] = source[prop];\n      }\n    }\n  }\n\n  return target;\n}\nfunction regexEscape(str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\nvar _entityMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  '/': '&#x2F;'\n};\nfunction escape(data) {\n  if (typeof data === 'string') {\n    return data.replace(/[&<>\"'\\/]/g, function (s) {\n      return _entityMap[s];\n    });\n  }\n\n  return data;\n}\nvar isIE10 = typeof window !== 'undefined' && window.navigator && typeof window.navigator.userAgentData === 'undefined' && window.navigator.userAgent && window.navigator.userAgent.indexOf('MSIE') > -1;\nvar chars = [' ', ',', '?', '!', ';'];\nfunction looksLikeObjectPath(key, nsSeparator, keySeparator) {\n  nsSeparator = nsSeparator || '';\n  keySeparator = keySeparator || '';\n  var possibleChars = chars.filter(function (c) {\n    return nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0;\n  });\n  if (possibleChars.length === 0) return true;\n  var r = new RegExp(\"(\".concat(possibleChars.map(function (c) {\n    return c === '?' ? '\\\\?' : c;\n  }).join('|'), \")\"));\n  var matched = !r.test(key);\n\n  if (!matched) {\n    var ki = key.indexOf(keySeparator);\n\n    if (ki > 0 && !r.test(key.substring(0, ki))) {\n      matched = true;\n    }\n  }\n\n  return matched;\n}\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction deepFind(obj, path) {\n  var keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n  if (!obj) return undefined;\n  if (obj[path]) return obj[path];\n  var paths = path.split(keySeparator);\n  var current = obj;\n\n  for (var i = 0; i < paths.length; ++i) {\n    if (!current) return undefined;\n\n    if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) {\n      return undefined;\n    }\n\n    if (current[paths[i]] === undefined) {\n      var j = 2;\n      var p = paths.slice(i, i + j).join(keySeparator);\n      var mix = current[p];\n\n      while (mix === undefined && paths.length > i + j) {\n        j++;\n        p = paths.slice(i, i + j).join(keySeparator);\n        mix = current[p];\n      }\n\n      if (mix === undefined) return undefined;\n      if (mix === null) return null;\n\n      if (path.endsWith(p)) {\n        if (typeof mix === 'string') return mix;\n        if (p && typeof mix[p] === 'string') return mix[p];\n      }\n\n      var joinedPath = paths.slice(i + j).join(keySeparator);\n      if (joinedPath) return deepFind(mix, joinedPath, keySeparator);\n      return undefined;\n    }\n\n    current = current[paths[i]];\n  }\n\n  return current;\n}\n\nvar ResourceStore = function (_EventEmitter) {\n  _inherits(ResourceStore, _EventEmitter);\n\n  var _super = _createSuper(ResourceStore);\n\n  function ResourceStore(data) {\n    var _this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n      ns: ['translation'],\n      defaultNS: 'translation'\n    };\n\n    _classCallCheck(this, ResourceStore);\n\n    _this = _super.call(this);\n\n    if (isIE10) {\n      EventEmitter.call(_assertThisInitialized(_this));\n    }\n\n    _this.data = data || {};\n    _this.options = options;\n\n    if (_this.options.keySeparator === undefined) {\n      _this.options.keySeparator = '.';\n    }\n\n    if (_this.options.ignoreJSONStructure === undefined) {\n      _this.options.ignoreJSONStructure = true;\n    }\n\n    return _this;\n  }\n\n  _createClass(ResourceStore, [{\n    key: \"addNamespaces\",\n    value: function addNamespaces(ns) {\n      if (this.options.ns.indexOf(ns) < 0) {\n        this.options.ns.push(ns);\n      }\n    }\n  }, {\n    key: \"removeNamespaces\",\n    value: function removeNamespaces(ns) {\n      var index = this.options.ns.indexOf(ns);\n\n      if (index > -1) {\n        this.options.ns.splice(index, 1);\n      }\n    }\n  }, {\n    key: \"getResource\",\n    value: function getResource(lng, ns, key) {\n      var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n      var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n      var ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n      var path = [lng, ns];\n      if (key && typeof key !== 'string') path = path.concat(key);\n      if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n      if (lng.indexOf('.') > -1) {\n        path = lng.split('.');\n      }\n\n      var result = getPath(this.data, path);\n      if (result || !ignoreJSONStructure || typeof key !== 'string') return result;\n      return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n    }\n  }, {\n    key: \"addResource\",\n    value: function addResource(lng, ns, key, value) {\n      var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n        silent: false\n      };\n      var keySeparator = this.options.keySeparator;\n      if (keySeparator === undefined) keySeparator = '.';\n      var path = [lng, ns];\n      if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n      if (lng.indexOf('.') > -1) {\n        path = lng.split('.');\n        value = ns;\n        ns = path[1];\n      }\n\n      this.addNamespaces(ns);\n      setPath(this.data, path, value);\n      if (!options.silent) this.emit('added', lng, ns, key, value);\n    }\n  }, {\n    key: \"addResources\",\n    value: function addResources(lng, ns, resources) {\n      var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n        silent: false\n      };\n\n      for (var m in resources) {\n        if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], {\n          silent: true\n        });\n      }\n\n      if (!options.silent) this.emit('added', lng, ns, resources);\n    }\n  }, {\n    key: \"addResourceBundle\",\n    value: function addResourceBundle(lng, ns, resources, deep, overwrite) {\n      var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n        silent: false\n      };\n      var path = [lng, ns];\n\n      if (lng.indexOf('.') > -1) {\n        path = lng.split('.');\n        deep = resources;\n        resources = ns;\n        ns = path[1];\n      }\n\n      this.addNamespaces(ns);\n      var pack = getPath(this.data, path) || {};\n\n      if (deep) {\n        deepExtend(pack, resources, overwrite);\n      } else {\n        pack = _objectSpread$1(_objectSpread$1({}, pack), resources);\n      }\n\n      setPath(this.data, path, pack);\n      if (!options.silent) this.emit('added', lng, ns, resources);\n    }\n  }, {\n    key: \"removeResourceBundle\",\n    value: function removeResourceBundle(lng, ns) {\n      if (this.hasResourceBundle(lng, ns)) {\n        delete this.data[lng][ns];\n      }\n\n      this.removeNamespaces(ns);\n      this.emit('removed', lng, ns);\n    }\n  }, {\n    key: \"hasResourceBundle\",\n    value: function hasResourceBundle(lng, ns) {\n      return this.getResource(lng, ns) !== undefined;\n    }\n  }, {\n    key: \"getResourceBundle\",\n    value: function getResourceBundle(lng, ns) {\n      if (!ns) ns = this.options.defaultNS;\n      if (this.options.compatibilityAPI === 'v1') return _objectSpread$1(_objectSpread$1({}, {}), this.getResource(lng, ns));\n      return this.getResource(lng, ns);\n    }\n  }, {\n    key: \"getDataByLanguage\",\n    value: function getDataByLanguage(lng) {\n      return this.data[lng];\n    }\n  }, {\n    key: \"hasLanguageSomeTranslations\",\n    value: function hasLanguageSomeTranslations(lng) {\n      var data = this.getDataByLanguage(lng);\n      var n = data && Object.keys(data) || [];\n      return !!n.find(function (v) {\n        return data[v] && Object.keys(data[v]).length > 0;\n      });\n    }\n  }, {\n    key: \"toJSON\",\n    value: function toJSON() {\n      return this.data;\n    }\n  }]);\n\n  return ResourceStore;\n}(EventEmitter);\n\nvar postProcessor = {\n  processors: {},\n  addPostProcessor: function addPostProcessor(module) {\n    this.processors[module.name] = module;\n  },\n  handle: function handle(processors, value, key, options, translator) {\n    var _this = this;\n\n    processors.forEach(function (processor) {\n      if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n    });\n    return value;\n  }\n};\n\nfunction ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$1() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nvar checkedLoadedFor = {};\n\nvar Translator = function (_EventEmitter) {\n  _inherits(Translator, _EventEmitter);\n\n  var _super = _createSuper$1(Translator);\n\n  function Translator(services) {\n    var _this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Translator);\n\n    _this = _super.call(this);\n\n    if (isIE10) {\n      EventEmitter.call(_assertThisInitialized(_this));\n    }\n\n    copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, _assertThisInitialized(_this));\n    _this.options = options;\n\n    if (_this.options.keySeparator === undefined) {\n      _this.options.keySeparator = '.';\n    }\n\n    _this.logger = baseLogger.create('translator');\n    return _this;\n  }\n\n  _createClass(Translator, [{\n    key: \"changeLanguage\",\n    value: function changeLanguage(lng) {\n      if (lng) this.language = lng;\n    }\n  }, {\n    key: \"exists\",\n    value: function exists(key) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n        interpolation: {}\n      };\n\n      if (key === undefined || key === null) {\n        return false;\n      }\n\n      var resolved = this.resolve(key, options);\n      return resolved && resolved.res !== undefined;\n    }\n  }, {\n    key: \"extractFromKey\",\n    value: function extractFromKey(key, options) {\n      var nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n      if (nsSeparator === undefined) nsSeparator = ':';\n      var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n      var namespaces = options.ns || this.options.defaultNS || [];\n      var wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n      var seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n\n      if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n        var m = key.match(this.interpolator.nestingRegexp);\n\n        if (m && m.length > 0) {\n          return {\n            key: key,\n            namespaces: namespaces\n          };\n        }\n\n        var parts = key.split(nsSeparator);\n        if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n        key = parts.join(keySeparator);\n      }\n\n      if (typeof namespaces === 'string') namespaces = [namespaces];\n      return {\n        key: key,\n        namespaces: namespaces\n      };\n    }\n  }, {\n    key: \"translate\",\n    value: function translate(keys, options, lastKey) {\n      var _this2 = this;\n\n      if (_typeof(options) !== 'object' && this.options.overloadTranslationOptionHandler) {\n        options = this.options.overloadTranslationOptionHandler(arguments);\n      }\n\n      if (!options) options = {};\n      if (keys === undefined || keys === null) return '';\n      if (!Array.isArray(keys)) keys = [String(keys)];\n      var returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n      var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n\n      var _this$extractFromKey = this.extractFromKey(keys[keys.length - 1], options),\n          key = _this$extractFromKey.key,\n          namespaces = _this$extractFromKey.namespaces;\n\n      var namespace = namespaces[namespaces.length - 1];\n      var lng = options.lng || this.language;\n      var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n\n      if (lng && lng.toLowerCase() === 'cimode') {\n        if (appendNamespaceToCIMode) {\n          var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n\n          if (returnDetails) {\n            resolved.res = \"\".concat(namespace).concat(nsSeparator).concat(key);\n            return resolved;\n          }\n\n          return \"\".concat(namespace).concat(nsSeparator).concat(key);\n        }\n\n        if (returnDetails) {\n          resolved.res = key;\n          return resolved;\n        }\n\n        return key;\n      }\n\n      var resolved = this.resolve(keys, options);\n      var res = resolved && resolved.res;\n      var resUsedKey = resolved && resolved.usedKey || key;\n      var resExactUsedKey = resolved && resolved.exactUsedKey || key;\n      var resType = Object.prototype.toString.apply(res);\n      var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n      var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n      var handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n      var handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number';\n\n      if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) {\n        if (!options.returnObjects && !this.options.returnObjects) {\n          if (!this.options.returnedObjectHandler) {\n            this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n          }\n\n          var r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, _objectSpread$2(_objectSpread$2({}, options), {}, {\n            ns: namespaces\n          })) : \"key '\".concat(key, \" (\").concat(this.language, \")' returned an object instead of string.\");\n\n          if (returnDetails) {\n            resolved.res = r;\n            return resolved;\n          }\n\n          return r;\n        }\n\n        if (keySeparator) {\n          var resTypeIsArray = resType === '[object Array]';\n          var copy = resTypeIsArray ? [] : {};\n          var newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n\n          for (var m in res) {\n            if (Object.prototype.hasOwnProperty.call(res, m)) {\n              var deepKey = \"\".concat(newKeyToUse).concat(keySeparator).concat(m);\n              copy[m] = this.translate(deepKey, _objectSpread$2(_objectSpread$2({}, options), {\n                joinArrays: false,\n                ns: namespaces\n              }));\n              if (copy[m] === deepKey) copy[m] = res[m];\n            }\n          }\n\n          res = copy;\n        }\n      } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') {\n        res = res.join(joinArrays);\n        if (res) res = this.extendTranslation(res, keys, options, lastKey);\n      } else {\n        var usedDefault = false;\n        var usedKey = false;\n        var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n        var hasDefaultValue = Translator.hasDefaultValue(options);\n        var defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n        var defaultValue = options[\"defaultValue\".concat(defaultValueSuffix)] || options.defaultValue;\n\n        if (!this.isValidLookup(res) && hasDefaultValue) {\n          usedDefault = true;\n          res = defaultValue;\n        }\n\n        if (!this.isValidLookup(res)) {\n          usedKey = true;\n          res = key;\n        }\n\n        var missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n        var resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n        var updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n\n        if (usedKey || usedDefault || updateMissing) {\n          this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n\n          if (keySeparator) {\n            var fk = this.resolve(key, _objectSpread$2(_objectSpread$2({}, options), {}, {\n              keySeparator: false\n            }));\n            if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n          }\n\n          var lngs = [];\n          var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n\n          if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n            for (var i = 0; i < fallbackLngs.length; i++) {\n              lngs.push(fallbackLngs[i]);\n            }\n          } else if (this.options.saveMissingTo === 'all') {\n            lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n          } else {\n            lngs.push(options.lng || this.language);\n          }\n\n          var send = function send(l, k, specificDefaultValue) {\n            var defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n\n            if (_this2.options.missingKeyHandler) {\n              _this2.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n            } else if (_this2.backendConnector && _this2.backendConnector.saveMissing) {\n              _this2.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n            }\n\n            _this2.emit('missingKey', l, namespace, k, res);\n          };\n\n          if (this.options.saveMissing) {\n            if (this.options.saveMissingPlurals && needsPluralHandling) {\n              lngs.forEach(function (language) {\n                _this2.pluralResolver.getSuffixes(language, options).forEach(function (suffix) {\n                  send([language], key + suffix, options[\"defaultValue\".concat(suffix)] || defaultValue);\n                });\n              });\n            } else {\n              send(lngs, key, defaultValue);\n            }\n          }\n        }\n\n        res = this.extendTranslation(res, keys, options, resolved, lastKey);\n        if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = \"\".concat(namespace, \":\").concat(key);\n\n        if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n          if (this.options.compatibilityAPI !== 'v1') {\n            res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? \"\".concat(namespace, \":\").concat(key) : key, usedDefault ? res : undefined);\n          } else {\n            res = this.options.parseMissingKeyHandler(res);\n          }\n        }\n      }\n\n      if (returnDetails) {\n        resolved.res = res;\n        return resolved;\n      }\n\n      return res;\n    }\n  }, {\n    key: \"extendTranslation\",\n    value: function extendTranslation(res, key, options, resolved, lastKey) {\n      var _this3 = this;\n\n      if (this.i18nFormat && this.i18nFormat.parse) {\n        res = this.i18nFormat.parse(res, _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), options), resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n          resolved: resolved\n        });\n      } else if (!options.skipInterpolation) {\n        if (options.interpolation) this.interpolator.init(_objectSpread$2(_objectSpread$2({}, options), {\n          interpolation: _objectSpread$2(_objectSpread$2({}, this.options.interpolation), options.interpolation)\n        }));\n        var skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n        var nestBef;\n\n        if (skipOnVariables) {\n          var nb = res.match(this.interpolator.nestingRegexp);\n          nestBef = nb && nb.length;\n        }\n\n        var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n        if (this.options.interpolation.defaultVariables) data = _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), data);\n        res = this.interpolator.interpolate(res, data, options.lng || this.language, options);\n\n        if (skipOnVariables) {\n          var na = res.match(this.interpolator.nestingRegexp);\n          var nestAft = na && na.length;\n          if (nestBef < nestAft) options.nest = false;\n        }\n\n        if (options.nest !== false) res = this.interpolator.nest(res, function () {\n          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n            args[_key] = arguments[_key];\n          }\n\n          if (lastKey && lastKey[0] === args[0] && !options.context) {\n            _this3.logger.warn(\"It seems you are nesting recursively key: \".concat(args[0], \" in key: \").concat(key[0]));\n\n            return null;\n          }\n\n          return _this3.translate.apply(_this3, args.concat([key]));\n        }, options);\n        if (options.interpolation) this.interpolator.reset();\n      }\n\n      var postProcess = options.postProcess || this.options.postProcess;\n      var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n      if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n        res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? _objectSpread$2({\n          i18nResolved: resolved\n        }, options) : options, this);\n      }\n\n      return res;\n    }\n  }, {\n    key: \"resolve\",\n    value: function resolve(keys) {\n      var _this4 = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var found;\n      var usedKey;\n      var exactUsedKey;\n      var usedLng;\n      var usedNS;\n      if (typeof keys === 'string') keys = [keys];\n      keys.forEach(function (k) {\n        if (_this4.isValidLookup(found)) return;\n\n        var extracted = _this4.extractFromKey(k, options);\n\n        var key = extracted.key;\n        usedKey = key;\n        var namespaces = extracted.namespaces;\n        if (_this4.options.fallbackNS) namespaces = namespaces.concat(_this4.options.fallbackNS);\n        var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n\n        var needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && _this4.pluralResolver.shouldUseIntlApi();\n\n        var needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== '';\n        var codes = options.lngs ? options.lngs : _this4.languageUtils.toResolveHierarchy(options.lng || _this4.language, options.fallbackLng);\n        namespaces.forEach(function (ns) {\n          if (_this4.isValidLookup(found)) return;\n          usedNS = ns;\n\n          if (!checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] && _this4.utils && _this4.utils.hasLoadedNamespace && !_this4.utils.hasLoadedNamespace(usedNS)) {\n            checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] = true;\n\n            _this4.logger.warn(\"key \\\"\".concat(usedKey, \"\\\" for languages \\\"\").concat(codes.join(', '), \"\\\" won't get resolved as namespace \\\"\").concat(usedNS, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n          }\n\n          codes.forEach(function (code) {\n            if (_this4.isValidLookup(found)) return;\n            usedLng = code;\n            var finalKeys = [key];\n\n            if (_this4.i18nFormat && _this4.i18nFormat.addLookupKeys) {\n              _this4.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n            } else {\n              var pluralSuffix;\n              if (needsPluralHandling) pluralSuffix = _this4.pluralResolver.getSuffix(code, options.count, options);\n              var zeroSuffix = \"\".concat(_this4.options.pluralSeparator, \"zero\");\n\n              if (needsPluralHandling) {\n                finalKeys.push(key + pluralSuffix);\n\n                if (needsZeroSuffixLookup) {\n                  finalKeys.push(key + zeroSuffix);\n                }\n              }\n\n              if (needsContextHandling) {\n                var contextKey = \"\".concat(key).concat(_this4.options.contextSeparator).concat(options.context);\n                finalKeys.push(contextKey);\n\n                if (needsPluralHandling) {\n                  finalKeys.push(contextKey + pluralSuffix);\n\n                  if (needsZeroSuffixLookup) {\n                    finalKeys.push(contextKey + zeroSuffix);\n                  }\n                }\n              }\n            }\n\n            var possibleKey;\n\n            while (possibleKey = finalKeys.pop()) {\n              if (!_this4.isValidLookup(found)) {\n                exactUsedKey = possibleKey;\n                found = _this4.getResource(code, ns, possibleKey, options);\n              }\n            }\n          });\n        });\n      });\n      return {\n        res: found,\n        usedKey: usedKey,\n        exactUsedKey: exactUsedKey,\n        usedLng: usedLng,\n        usedNS: usedNS\n      };\n    }\n  }, {\n    key: \"isValidLookup\",\n    value: function isValidLookup(res) {\n      return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n    }\n  }, {\n    key: \"getResource\",\n    value: function getResource(code, ns, key) {\n      var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n      if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n      return this.resourceStore.getResource(code, ns, key, options);\n    }\n  }], [{\n    key: \"hasDefaultValue\",\n    value: function hasDefaultValue(options) {\n      var prefix = 'defaultValue';\n\n      for (var option in options) {\n        if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }]);\n\n  return Translator;\n}(EventEmitter);\n\nfunction capitalize(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n  function LanguageUtil(options) {\n    _classCallCheck(this, LanguageUtil);\n\n    this.options = options;\n    this.supportedLngs = this.options.supportedLngs || false;\n    this.logger = baseLogger.create('languageUtils');\n  }\n\n  _createClass(LanguageUtil, [{\n    key: \"getScriptPartFromCode\",\n    value: function getScriptPartFromCode(code) {\n      if (!code || code.indexOf('-') < 0) return null;\n      var p = code.split('-');\n      if (p.length === 2) return null;\n      p.pop();\n      if (p[p.length - 1].toLowerCase() === 'x') return null;\n      return this.formatLanguageCode(p.join('-'));\n    }\n  }, {\n    key: \"getLanguagePartFromCode\",\n    value: function getLanguagePartFromCode(code) {\n      if (!code || code.indexOf('-') < 0) return code;\n      var p = code.split('-');\n      return this.formatLanguageCode(p[0]);\n    }\n  }, {\n    key: \"formatLanguageCode\",\n    value: function formatLanguageCode(code) {\n      if (typeof code === 'string' && code.indexOf('-') > -1) {\n        var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n        var p = code.split('-');\n\n        if (this.options.lowerCaseLng) {\n          p = p.map(function (part) {\n            return part.toLowerCase();\n          });\n        } else if (p.length === 2) {\n          p[0] = p[0].toLowerCase();\n          p[1] = p[1].toUpperCase();\n          if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n        } else if (p.length === 3) {\n          p[0] = p[0].toLowerCase();\n          if (p[1].length === 2) p[1] = p[1].toUpperCase();\n          if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n          if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n          if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n        }\n\n        return p.join('-');\n      }\n\n      return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n    }\n  }, {\n    key: \"isSupportedCode\",\n    value: function isSupportedCode(code) {\n      if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n        code = this.getLanguagePartFromCode(code);\n      }\n\n      return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n    }\n  }, {\n    key: \"getBestMatchFromCodes\",\n    value: function getBestMatchFromCodes(codes) {\n      var _this = this;\n\n      if (!codes) return null;\n      var found;\n      codes.forEach(function (code) {\n        if (found) return;\n\n        var cleanedLng = _this.formatLanguageCode(code);\n\n        if (!_this.options.supportedLngs || _this.isSupportedCode(cleanedLng)) found = cleanedLng;\n      });\n\n      if (!found && this.options.supportedLngs) {\n        codes.forEach(function (code) {\n          if (found) return;\n\n          var lngOnly = _this.getLanguagePartFromCode(code);\n\n          if (_this.isSupportedCode(lngOnly)) return found = lngOnly;\n          found = _this.options.supportedLngs.find(function (supportedLng) {\n            if (supportedLng.indexOf(lngOnly) === 0) return supportedLng;\n          });\n        });\n      }\n\n      if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n      return found;\n    }\n  }, {\n    key: \"getFallbackCodes\",\n    value: function getFallbackCodes(fallbacks, code) {\n      if (!fallbacks) return [];\n      if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n      if (typeof fallbacks === 'string') fallbacks = [fallbacks];\n      if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks;\n      if (!code) return fallbacks[\"default\"] || [];\n      var found = fallbacks[code];\n      if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n      if (!found) found = fallbacks[this.formatLanguageCode(code)];\n      if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n      if (!found) found = fallbacks[\"default\"];\n      return found || [];\n    }\n  }, {\n    key: \"toResolveHierarchy\",\n    value: function toResolveHierarchy(code, fallbackCode) {\n      var _this2 = this;\n\n      var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n      var codes = [];\n\n      var addCode = function addCode(c) {\n        if (!c) return;\n\n        if (_this2.isSupportedCode(c)) {\n          codes.push(c);\n        } else {\n          _this2.logger.warn(\"rejecting language code not found in supportedLngs: \".concat(c));\n        }\n      };\n\n      if (typeof code === 'string' && code.indexOf('-') > -1) {\n        if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n        if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n        if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n      } else if (typeof code === 'string') {\n        addCode(this.formatLanguageCode(code));\n      }\n\n      fallbackCodes.forEach(function (fc) {\n        if (codes.indexOf(fc) < 0) addCode(_this2.formatLanguageCode(fc));\n      });\n      return codes;\n    }\n  }]);\n\n  return LanguageUtil;\n}();\n\nvar sets = [{\n  lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n  nr: [1, 2],\n  fc: 1\n}, {\n  lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n  nr: [1, 2],\n  fc: 2\n}, {\n  lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n  nr: [1],\n  fc: 3\n}, {\n  lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n  nr: [1, 2, 5],\n  fc: 4\n}, {\n  lngs: ['ar'],\n  nr: [0, 1, 2, 3, 11, 100],\n  fc: 5\n}, {\n  lngs: ['cs', 'sk'],\n  nr: [1, 2, 5],\n  fc: 6\n}, {\n  lngs: ['csb', 'pl'],\n  nr: [1, 2, 5],\n  fc: 7\n}, {\n  lngs: ['cy'],\n  nr: [1, 2, 3, 8],\n  fc: 8\n}, {\n  lngs: ['fr'],\n  nr: [1, 2],\n  fc: 9\n}, {\n  lngs: ['ga'],\n  nr: [1, 2, 3, 7, 11],\n  fc: 10\n}, {\n  lngs: ['gd'],\n  nr: [1, 2, 3, 20],\n  fc: 11\n}, {\n  lngs: ['is'],\n  nr: [1, 2],\n  fc: 12\n}, {\n  lngs: ['jv'],\n  nr: [0, 1],\n  fc: 13\n}, {\n  lngs: ['kw'],\n  nr: [1, 2, 3, 4],\n  fc: 14\n}, {\n  lngs: ['lt'],\n  nr: [1, 2, 10],\n  fc: 15\n}, {\n  lngs: ['lv'],\n  nr: [1, 2, 0],\n  fc: 16\n}, {\n  lngs: ['mk'],\n  nr: [1, 2],\n  fc: 17\n}, {\n  lngs: ['mnk'],\n  nr: [0, 1, 2],\n  fc: 18\n}, {\n  lngs: ['mt'],\n  nr: [1, 2, 11, 20],\n  fc: 19\n}, {\n  lngs: ['or'],\n  nr: [2, 1],\n  fc: 2\n}, {\n  lngs: ['ro'],\n  nr: [1, 2, 20],\n  fc: 20\n}, {\n  lngs: ['sl'],\n  nr: [5, 1, 2, 3],\n  fc: 21\n}, {\n  lngs: ['he', 'iw'],\n  nr: [1, 2, 20, 21],\n  fc: 22\n}];\nvar _rulesPluralsTypes = {\n  1: function _(n) {\n    return Number(n > 1);\n  },\n  2: function _(n) {\n    return Number(n != 1);\n  },\n  3: function _(n) {\n    return 0;\n  },\n  4: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  5: function _(n) {\n    return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n  },\n  6: function _(n) {\n    return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n  },\n  7: function _(n) {\n    return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  8: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n  },\n  9: function _(n) {\n    return Number(n >= 2);\n  },\n  10: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n  },\n  11: function _(n) {\n    return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n  },\n  12: function _(n) {\n    return Number(n % 10 != 1 || n % 100 == 11);\n  },\n  13: function _(n) {\n    return Number(n !== 0);\n  },\n  14: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n  },\n  15: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  16: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n  },\n  17: function _(n) {\n    return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1);\n  },\n  18: function _(n) {\n    return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n  },\n  19: function _(n) {\n    return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n  },\n  20: function _(n) {\n    return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n  },\n  21: function _(n) {\n    return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n  },\n  22: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);\n  }\n};\nvar deprecatedJsonVersions = ['v1', 'v2', 'v3'];\nvar suffixesOrder = {\n  zero: 0,\n  one: 1,\n  two: 2,\n  few: 3,\n  many: 4,\n  other: 5\n};\n\nfunction createRules() {\n  var rules = {};\n  sets.forEach(function (set) {\n    set.lngs.forEach(function (l) {\n      rules[l] = {\n        numbers: set.nr,\n        plurals: _rulesPluralsTypes[set.fc]\n      };\n    });\n  });\n  return rules;\n}\n\nvar PluralResolver = function () {\n  function PluralResolver(languageUtils) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, PluralResolver);\n\n    this.languageUtils = languageUtils;\n    this.options = options;\n    this.logger = baseLogger.create('pluralResolver');\n\n    if ((!this.options.compatibilityJSON || this.options.compatibilityJSON === 'v4') && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n      this.options.compatibilityJSON = 'v3';\n      this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n    }\n\n    this.rules = createRules();\n  }\n\n  _createClass(PluralResolver, [{\n    key: \"addRule\",\n    value: function addRule(lng, obj) {\n      this.rules[lng] = obj;\n    }\n  }, {\n    key: \"getRule\",\n    value: function getRule(code) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (this.shouldUseIntlApi()) {\n        try {\n          return new Intl.PluralRules(code, {\n            type: options.ordinal ? 'ordinal' : 'cardinal'\n          });\n        } catch (_unused) {\n          return;\n        }\n      }\n\n      return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n    }\n  }, {\n    key: \"needsPlural\",\n    value: function needsPlural(code) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var rule = this.getRule(code, options);\n\n      if (this.shouldUseIntlApi()) {\n        return rule && rule.resolvedOptions().pluralCategories.length > 1;\n      }\n\n      return rule && rule.numbers.length > 1;\n    }\n  }, {\n    key: \"getPluralFormsOfKey\",\n    value: function getPluralFormsOfKey(code, key) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return this.getSuffixes(code, options).map(function (suffix) {\n        return \"\".concat(key).concat(suffix);\n      });\n    }\n  }, {\n    key: \"getSuffixes\",\n    value: function getSuffixes(code) {\n      var _this = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var rule = this.getRule(code, options);\n\n      if (!rule) {\n        return [];\n      }\n\n      if (this.shouldUseIntlApi()) {\n        return rule.resolvedOptions().pluralCategories.sort(function (pluralCategory1, pluralCategory2) {\n          return suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2];\n        }).map(function (pluralCategory) {\n          return \"\".concat(_this.options.prepend).concat(pluralCategory);\n        });\n      }\n\n      return rule.numbers.map(function (number) {\n        return _this.getSuffix(code, number, options);\n      });\n    }\n  }, {\n    key: \"getSuffix\",\n    value: function getSuffix(code, count) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var rule = this.getRule(code, options);\n\n      if (rule) {\n        if (this.shouldUseIntlApi()) {\n          return \"\".concat(this.options.prepend).concat(rule.select(count));\n        }\n\n        return this.getSuffixRetroCompatible(rule, count);\n      }\n\n      this.logger.warn(\"no plural rule found for: \".concat(code));\n      return '';\n    }\n  }, {\n    key: \"getSuffixRetroCompatible\",\n    value: function getSuffixRetroCompatible(rule, count) {\n      var _this2 = this;\n\n      var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n      var suffix = rule.numbers[idx];\n\n      if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n        if (suffix === 2) {\n          suffix = 'plural';\n        } else if (suffix === 1) {\n          suffix = '';\n        }\n      }\n\n      var returnSuffix = function returnSuffix() {\n        return _this2.options.prepend && suffix.toString() ? _this2.options.prepend + suffix.toString() : suffix.toString();\n      };\n\n      if (this.options.compatibilityJSON === 'v1') {\n        if (suffix === 1) return '';\n        if (typeof suffix === 'number') return \"_plural_\".concat(suffix.toString());\n        return returnSuffix();\n      } else if (this.options.compatibilityJSON === 'v2') {\n        return returnSuffix();\n      } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n        return returnSuffix();\n      }\n\n      return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n    }\n  }, {\n    key: \"shouldUseIntlApi\",\n    value: function shouldUseIntlApi() {\n      return !deprecatedJsonVersions.includes(this.options.compatibilityJSON);\n    }\n  }]);\n\n  return PluralResolver;\n}();\n\nfunction ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar Interpolator = function () {\n  function Interpolator() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Interpolator);\n\n    this.logger = baseLogger.create('interpolator');\n    this.options = options;\n\n    this.format = options.interpolation && options.interpolation.format || function (value) {\n      return value;\n    };\n\n    this.init(options);\n  }\n\n  _createClass(Interpolator, [{\n    key: \"init\",\n    value: function init() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      if (!options.interpolation) options.interpolation = {\n        escapeValue: true\n      };\n      var iOpts = options.interpolation;\n      this.escape = iOpts.escape !== undefined ? iOpts.escape : escape;\n      this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true;\n      this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false;\n      this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n      this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n      this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n      this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n      this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n      this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape('$t(');\n      this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(')');\n      this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ',';\n      this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000;\n      this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false;\n      this.resetRegExp();\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      if (this.options) this.init(this.options);\n    }\n  }, {\n    key: \"resetRegExp\",\n    value: function resetRegExp() {\n      var regexpStr = \"\".concat(this.prefix, \"(.+?)\").concat(this.suffix);\n      this.regexp = new RegExp(regexpStr, 'g');\n      var regexpUnescapeStr = \"\".concat(this.prefix).concat(this.unescapePrefix, \"(.+?)\").concat(this.unescapeSuffix).concat(this.suffix);\n      this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n      var nestingRegexpStr = \"\".concat(this.nestingPrefix, \"(.+?)\").concat(this.nestingSuffix);\n      this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n    }\n  }, {\n    key: \"interpolate\",\n    value: function interpolate(str, data, lng, options) {\n      var _this = this;\n\n      var match;\n      var value;\n      var replaces;\n      var defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n\n      function regexSafe(val) {\n        return val.replace(/\\$/g, '$$$$');\n      }\n\n      var handleFormat = function handleFormat(key) {\n        if (key.indexOf(_this.formatSeparator) < 0) {\n          var path = getPathWithDefaults(data, defaultData, key);\n          return _this.alwaysFormat ? _this.format(path, undefined, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n            interpolationkey: key\n          })) : path;\n        }\n\n        var p = key.split(_this.formatSeparator);\n        var k = p.shift().trim();\n        var f = p.join(_this.formatSeparator).trim();\n        return _this.format(getPathWithDefaults(data, defaultData, k), f, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n          interpolationkey: k\n        }));\n      };\n\n      this.resetRegExp();\n      var missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n      var skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n      var todos = [{\n        regex: this.regexpUnescape,\n        safeValue: function safeValue(val) {\n          return regexSafe(val);\n        }\n      }, {\n        regex: this.regexp,\n        safeValue: function safeValue(val) {\n          return _this.escapeValue ? regexSafe(_this.escape(val)) : regexSafe(val);\n        }\n      }];\n      todos.forEach(function (todo) {\n        replaces = 0;\n\n        while (match = todo.regex.exec(str)) {\n          var matchedVar = match[1].trim();\n          value = handleFormat(matchedVar);\n\n          if (value === undefined) {\n            if (typeof missingInterpolationHandler === 'function') {\n              var temp = missingInterpolationHandler(str, match, options);\n              value = typeof temp === 'string' ? temp : '';\n            } else if (options && options.hasOwnProperty(matchedVar)) {\n              value = '';\n            } else if (skipOnVariables) {\n              value = match[0];\n              continue;\n            } else {\n              _this.logger.warn(\"missed to pass in variable \".concat(matchedVar, \" for interpolating \").concat(str));\n\n              value = '';\n            }\n          } else if (typeof value !== 'string' && !_this.useRawValueToEscape) {\n            value = makeString(value);\n          }\n\n          var safeValue = todo.safeValue(value);\n          str = str.replace(match[0], safeValue);\n\n          if (skipOnVariables) {\n            todo.regex.lastIndex += value.length;\n            todo.regex.lastIndex -= match[0].length;\n          } else {\n            todo.regex.lastIndex = 0;\n          }\n\n          replaces++;\n\n          if (replaces >= _this.maxReplaces) {\n            break;\n          }\n        }\n      });\n      return str;\n    }\n  }, {\n    key: \"nest\",\n    value: function nest(str, fc) {\n      var _this2 = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var match;\n      var value;\n\n      var clonedOptions = _objectSpread$3({}, options);\n\n      clonedOptions.applyPostProcessor = false;\n      delete clonedOptions.defaultValue;\n\n      function handleHasOptions(key, inheritedOptions) {\n        var sep = this.nestingOptionsSeparator;\n        if (key.indexOf(sep) < 0) return key;\n        var c = key.split(new RegExp(\"\".concat(sep, \"[ ]*{\")));\n        var optionsString = \"{\".concat(c[1]);\n        key = c[0];\n        optionsString = this.interpolate(optionsString, clonedOptions);\n        var matchedSingleQuotes = optionsString.match(/'/g);\n        var matchedDoubleQuotes = optionsString.match(/\"/g);\n\n        if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n          optionsString = optionsString.replace(/'/g, '\"');\n        }\n\n        try {\n          clonedOptions = JSON.parse(optionsString);\n          if (inheritedOptions) clonedOptions = _objectSpread$3(_objectSpread$3({}, inheritedOptions), clonedOptions);\n        } catch (e) {\n          this.logger.warn(\"failed parsing options string in nesting for key \".concat(key), e);\n          return \"\".concat(key).concat(sep).concat(optionsString);\n        }\n\n        delete clonedOptions.defaultValue;\n        return key;\n      }\n\n      while (match = this.nestingRegexp.exec(str)) {\n        var formatters = [];\n        var doReduce = false;\n\n        if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n          var r = match[1].split(this.formatSeparator).map(function (elem) {\n            return elem.trim();\n          });\n          match[1] = r.shift();\n          formatters = r;\n          doReduce = true;\n        }\n\n        value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n        if (value && match[0] === str && typeof value !== 'string') return value;\n        if (typeof value !== 'string') value = makeString(value);\n\n        if (!value) {\n          this.logger.warn(\"missed to resolve \".concat(match[1], \" for nesting \").concat(str));\n          value = '';\n        }\n\n        if (doReduce) {\n          value = formatters.reduce(function (v, f) {\n            return _this2.format(v, f, options.lng, _objectSpread$3(_objectSpread$3({}, options), {}, {\n              interpolationkey: match[1].trim()\n            }));\n          }, value.trim());\n        }\n\n        str = str.replace(match[0], value);\n        this.regexp.lastIndex = 0;\n      }\n\n      return str;\n    }\n  }]);\n\n  return Interpolator;\n}();\n\nfunction ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction parseFormatStr(formatStr) {\n  var formatName = formatStr.toLowerCase().trim();\n  var formatOptions = {};\n\n  if (formatStr.indexOf('(') > -1) {\n    var p = formatStr.split('(');\n    formatName = p[0].toLowerCase().trim();\n    var optStr = p[1].substring(0, p[1].length - 1);\n\n    if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n      if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n    } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n      if (!formatOptions.range) formatOptions.range = optStr.trim();\n    } else {\n      var opts = optStr.split(';');\n      opts.forEach(function (opt) {\n        if (!opt) return;\n\n        var _opt$split = opt.split(':'),\n            _opt$split2 = _toArray(_opt$split),\n            key = _opt$split2[0],\n            rest = _opt$split2.slice(1);\n\n        var val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n        if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val;\n        if (val === 'false') formatOptions[key.trim()] = false;\n        if (val === 'true') formatOptions[key.trim()] = true;\n        if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10);\n      });\n    }\n  }\n\n  return {\n    formatName: formatName,\n    formatOptions: formatOptions\n  };\n}\n\nfunction createCachedFormatter(fn) {\n  var cache = {};\n  return function invokeFormatter(val, lng, options) {\n    var key = lng + JSON.stringify(options);\n    var formatter = cache[key];\n\n    if (!formatter) {\n      formatter = fn(lng, options);\n      cache[key] = formatter;\n    }\n\n    return formatter(val);\n  };\n}\n\nvar Formatter = function () {\n  function Formatter() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Formatter);\n\n    this.logger = baseLogger.create('formatter');\n    this.options = options;\n    this.formats = {\n      number: createCachedFormatter(function (lng, options) {\n        var formatter = new Intl.NumberFormat(lng, options);\n        return function (val) {\n          return formatter.format(val);\n        };\n      }),\n      currency: createCachedFormatter(function (lng, options) {\n        var formatter = new Intl.NumberFormat(lng, _objectSpread$4(_objectSpread$4({}, options), {}, {\n          style: 'currency'\n        }));\n        return function (val) {\n          return formatter.format(val);\n        };\n      }),\n      datetime: createCachedFormatter(function (lng, options) {\n        var formatter = new Intl.DateTimeFormat(lng, _objectSpread$4({}, options));\n        return function (val) {\n          return formatter.format(val);\n        };\n      }),\n      relativetime: createCachedFormatter(function (lng, options) {\n        var formatter = new Intl.RelativeTimeFormat(lng, _objectSpread$4({}, options));\n        return function (val) {\n          return formatter.format(val, options.range || 'day');\n        };\n      }),\n      list: createCachedFormatter(function (lng, options) {\n        var formatter = new Intl.ListFormat(lng, _objectSpread$4({}, options));\n        return function (val) {\n          return formatter.format(val);\n        };\n      })\n    };\n    this.init(options);\n  }\n\n  _createClass(Formatter, [{\n    key: \"init\",\n    value: function init(services) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n        interpolation: {}\n      };\n      var iOpts = options.interpolation;\n      this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n    }\n  }, {\n    key: \"add\",\n    value: function add(name, fc) {\n      this.formats[name.toLowerCase().trim()] = fc;\n    }\n  }, {\n    key: \"addCached\",\n    value: function addCached(name, fc) {\n      this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n    }\n  }, {\n    key: \"format\",\n    value: function format(value, _format, lng, options) {\n      var _this = this;\n\n      var formats = _format.split(this.formatSeparator);\n\n      var result = formats.reduce(function (mem, f) {\n        var _parseFormatStr = parseFormatStr(f),\n            formatName = _parseFormatStr.formatName,\n            formatOptions = _parseFormatStr.formatOptions;\n\n        if (_this.formats[formatName]) {\n          var formatted = mem;\n\n          try {\n            var valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n            var l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n            formatted = _this.formats[formatName](mem, l, _objectSpread$4(_objectSpread$4(_objectSpread$4({}, formatOptions), options), valOptions));\n          } catch (error) {\n            _this.logger.warn(error);\n          }\n\n          return formatted;\n        } else {\n          _this.logger.warn(\"there was no format function for \".concat(formatName));\n        }\n\n        return mem;\n      }, value);\n      return result;\n    }\n  }]);\n\n  return Formatter;\n}();\n\nfunction ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$2() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction removePending(q, name) {\n  if (q.pending[name] !== undefined) {\n    delete q.pending[name];\n    q.pendingCount--;\n  }\n}\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  var _super = _createSuper$2(Connector);\n\n  function Connector(backend, store, services) {\n    var _this;\n\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    _classCallCheck(this, Connector);\n\n    _this = _super.call(this);\n\n    if (isIE10) {\n      EventEmitter.call(_assertThisInitialized(_this));\n    }\n\n    _this.backend = backend;\n    _this.store = store;\n    _this.services = services;\n    _this.languageUtils = services.languageUtils;\n    _this.options = options;\n    _this.logger = baseLogger.create('backendConnector');\n    _this.waitingReads = [];\n    _this.maxParallelReads = options.maxParallelReads || 10;\n    _this.readingCalls = 0;\n    _this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n    _this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n    _this.state = {};\n    _this.queue = [];\n\n    if (_this.backend && _this.backend.init) {\n      _this.backend.init(services, options.backend, options);\n    }\n\n    return _this;\n  }\n\n  _createClass(Connector, [{\n    key: \"queueLoad\",\n    value: function queueLoad(languages, namespaces, options, callback) {\n      var _this2 = this;\n\n      var toLoad = {};\n      var pending = {};\n      var toLoadLanguages = {};\n      var toLoadNamespaces = {};\n      languages.forEach(function (lng) {\n        var hasAllNamespaces = true;\n        namespaces.forEach(function (ns) {\n          var name = \"\".concat(lng, \"|\").concat(ns);\n\n          if (!options.reload && _this2.store.hasResourceBundle(lng, ns)) {\n            _this2.state[name] = 2;\n          } else if (_this2.state[name] < 0) ; else if (_this2.state[name] === 1) {\n            if (pending[name] === undefined) pending[name] = true;\n          } else {\n            _this2.state[name] = 1;\n            hasAllNamespaces = false;\n            if (pending[name] === undefined) pending[name] = true;\n            if (toLoad[name] === undefined) toLoad[name] = true;\n            if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n          }\n        });\n        if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n      });\n\n      if (Object.keys(toLoad).length || Object.keys(pending).length) {\n        this.queue.push({\n          pending: pending,\n          pendingCount: Object.keys(pending).length,\n          loaded: {},\n          errors: [],\n          callback: callback\n        });\n      }\n\n      return {\n        toLoad: Object.keys(toLoad),\n        pending: Object.keys(pending),\n        toLoadLanguages: Object.keys(toLoadLanguages),\n        toLoadNamespaces: Object.keys(toLoadNamespaces)\n      };\n    }\n  }, {\n    key: \"loaded\",\n    value: function loaded(name, err, data) {\n      var s = name.split('|');\n      var lng = s[0];\n      var ns = s[1];\n      if (err) this.emit('failedLoading', lng, ns, err);\n\n      if (data) {\n        this.store.addResourceBundle(lng, ns, data);\n      }\n\n      this.state[name] = err ? -1 : 2;\n      var loaded = {};\n      this.queue.forEach(function (q) {\n        pushPath(q.loaded, [lng], ns);\n        removePending(q, name);\n        if (err) q.errors.push(err);\n\n        if (q.pendingCount === 0 && !q.done) {\n          Object.keys(q.loaded).forEach(function (l) {\n            if (!loaded[l]) loaded[l] = {};\n            var loadedKeys = q.loaded[l];\n\n            if (loadedKeys.length) {\n              loadedKeys.forEach(function (ns) {\n                if (loaded[l][ns] === undefined) loaded[l][ns] = true;\n              });\n            }\n          });\n          q.done = true;\n\n          if (q.errors.length) {\n            q.callback(q.errors);\n          } else {\n            q.callback();\n          }\n        }\n      });\n      this.emit('loaded', loaded);\n      this.queue = this.queue.filter(function (q) {\n        return !q.done;\n      });\n    }\n  }, {\n    key: \"read\",\n    value: function read(lng, ns, fcName) {\n      var _this3 = this;\n\n      var tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n      var wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n      var callback = arguments.length > 5 ? arguments[5] : undefined;\n      if (!lng.length) return callback(null, {});\n\n      if (this.readingCalls >= this.maxParallelReads) {\n        this.waitingReads.push({\n          lng: lng,\n          ns: ns,\n          fcName: fcName,\n          tried: tried,\n          wait: wait,\n          callback: callback\n        });\n        return;\n      }\n\n      this.readingCalls++;\n      return this.backend[fcName](lng, ns, function (err, data) {\n        _this3.readingCalls--;\n\n        if (_this3.waitingReads.length > 0) {\n          var next = _this3.waitingReads.shift();\n\n          _this3.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n        }\n\n        if (err && data && tried < _this3.maxRetries) {\n          setTimeout(function () {\n            _this3.read.call(_this3, lng, ns, fcName, tried + 1, wait * 2, callback);\n          }, wait);\n          return;\n        }\n\n        callback(err, data);\n      });\n    }\n  }, {\n    key: \"prepareLoading\",\n    value: function prepareLoading(languages, namespaces) {\n      var _this4 = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var callback = arguments.length > 3 ? arguments[3] : undefined;\n\n      if (!this.backend) {\n        this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n        return callback && callback();\n      }\n\n      if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages);\n      if (typeof namespaces === 'string') namespaces = [namespaces];\n      var toLoad = this.queueLoad(languages, namespaces, options, callback);\n\n      if (!toLoad.toLoad.length) {\n        if (!toLoad.pending.length) callback();\n        return null;\n      }\n\n      toLoad.toLoad.forEach(function (name) {\n        _this4.loadOne(name);\n      });\n    }\n  }, {\n    key: \"load\",\n    value: function load(languages, namespaces, callback) {\n      this.prepareLoading(languages, namespaces, {}, callback);\n    }\n  }, {\n    key: \"reload\",\n    value: function reload(languages, namespaces, callback) {\n      this.prepareLoading(languages, namespaces, {\n        reload: true\n      }, callback);\n    }\n  }, {\n    key: \"loadOne\",\n    value: function loadOne(name) {\n      var _this5 = this;\n\n      var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n      var s = name.split('|');\n      var lng = s[0];\n      var ns = s[1];\n      this.read(lng, ns, 'read', undefined, undefined, function (err, data) {\n        if (err) _this5.logger.warn(\"\".concat(prefix, \"loading namespace \").concat(ns, \" for language \").concat(lng, \" failed\"), err);\n        if (!err && data) _this5.logger.log(\"\".concat(prefix, \"loaded namespace \").concat(ns, \" for language \").concat(lng), data);\n\n        _this5.loaded(name, err, data);\n      });\n    }\n  }, {\n    key: \"saveMissing\",\n    value: function saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n      var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n\n      if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n        this.logger.warn(\"did not save key \\\"\".concat(key, \"\\\" as the namespace \\\"\").concat(namespace, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n        return;\n      }\n\n      if (key === undefined || key === null || key === '') return;\n\n      if (this.backend && this.backend.create) {\n        this.backend.create(languages, namespace, key, fallbackValue, null, _objectSpread$5(_objectSpread$5({}, options), {}, {\n          isUpdate: isUpdate\n        }));\n      }\n\n      if (!languages || !languages[0]) return;\n      this.store.addResource(languages[0], namespace, key, fallbackValue);\n    }\n  }]);\n\n  return Connector;\n}(EventEmitter);\n\nfunction get() {\n  return {\n    debug: false,\n    initImmediate: true,\n    ns: ['translation'],\n    defaultNS: ['translation'],\n    fallbackLng: ['dev'],\n    fallbackNS: false,\n    supportedLngs: false,\n    nonExplicitSupportedLngs: false,\n    load: 'all',\n    preload: false,\n    simplifyPluralSuffix: true,\n    keySeparator: '.',\n    nsSeparator: ':',\n    pluralSeparator: '_',\n    contextSeparator: '_',\n    partialBundledLanguages: false,\n    saveMissing: false,\n    updateMissing: false,\n    saveMissingTo: 'fallback',\n    saveMissingPlurals: true,\n    missingKeyHandler: false,\n    missingInterpolationHandler: false,\n    postProcess: false,\n    postProcessPassResolved: false,\n    returnNull: true,\n    returnEmptyString: true,\n    returnObjects: false,\n    joinArrays: false,\n    returnedObjectHandler: false,\n    parseMissingKeyHandler: false,\n    appendNamespaceToMissingKey: false,\n    appendNamespaceToCIMode: false,\n    overloadTranslationOptionHandler: function handle(args) {\n      var ret = {};\n      if (_typeof(args[1]) === 'object') ret = args[1];\n      if (typeof args[1] === 'string') ret.defaultValue = args[1];\n      if (typeof args[2] === 'string') ret.tDescription = args[2];\n\n      if (_typeof(args[2]) === 'object' || _typeof(args[3]) === 'object') {\n        var options = args[3] || args[2];\n        Object.keys(options).forEach(function (key) {\n          ret[key] = options[key];\n        });\n      }\n\n      return ret;\n    },\n    interpolation: {\n      escapeValue: true,\n      format: function format(value, _format, lng, options) {\n        return value;\n      },\n      prefix: '{{',\n      suffix: '}}',\n      formatSeparator: ',',\n      unescapePrefix: '-',\n      nestingPrefix: '$t(',\n      nestingSuffix: ')',\n      nestingOptionsSeparator: ',',\n      maxReplaces: 1000,\n      skipOnVariables: true\n    }\n  };\n}\nfunction transformOptions(options) {\n  if (typeof options.ns === 'string') options.ns = [options.ns];\n  if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n  if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n  if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n    options.supportedLngs = options.supportedLngs.concat(['cimode']);\n  }\n\n  return options;\n}\n\nfunction ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$3(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$3() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction noop() {}\n\nfunction bindMemberFunctions(inst) {\n  var mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n  mems.forEach(function (mem) {\n    if (typeof inst[mem] === 'function') {\n      inst[mem] = inst[mem].bind(inst);\n    }\n  });\n}\n\nvar I18n = function (_EventEmitter) {\n  _inherits(I18n, _EventEmitter);\n\n  var _super = _createSuper$3(I18n);\n\n  function I18n() {\n    var _this;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n    _classCallCheck(this, I18n);\n\n    _this = _super.call(this);\n\n    if (isIE10) {\n      EventEmitter.call(_assertThisInitialized(_this));\n    }\n\n    _this.options = transformOptions(options);\n    _this.services = {};\n    _this.logger = baseLogger;\n    _this.modules = {\n      external: []\n    };\n    bindMemberFunctions(_assertThisInitialized(_this));\n\n    if (callback && !_this.isInitialized && !options.isClone) {\n      if (!_this.options.initImmediate) {\n        _this.init(options, callback);\n\n        return _possibleConstructorReturn(_this, _assertThisInitialized(_this));\n      }\n\n      setTimeout(function () {\n        _this.init(options, callback);\n      }, 0);\n    }\n\n    return _this;\n  }\n\n  _createClass(I18n, [{\n    key: \"init\",\n    value: function init() {\n      var _this2 = this;\n\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n      if (typeof options === 'function') {\n        callback = options;\n        options = {};\n      }\n\n      if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n        if (typeof options.ns === 'string') {\n          options.defaultNS = options.ns;\n        } else if (options.ns.indexOf('translation') < 0) {\n          options.defaultNS = options.ns[0];\n        }\n      }\n\n      var defOpts = get();\n      this.options = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, defOpts), this.options), transformOptions(options));\n\n      if (this.options.compatibilityAPI !== 'v1') {\n        this.options.interpolation = _objectSpread$6(_objectSpread$6({}, defOpts.interpolation), this.options.interpolation);\n      }\n\n      if (options.keySeparator !== undefined) {\n        this.options.userDefinedKeySeparator = options.keySeparator;\n      }\n\n      if (options.nsSeparator !== undefined) {\n        this.options.userDefinedNsSeparator = options.nsSeparator;\n      }\n\n      function createClassOnDemand(ClassOrObject) {\n        if (!ClassOrObject) return null;\n        if (typeof ClassOrObject === 'function') return new ClassOrObject();\n        return ClassOrObject;\n      }\n\n      if (!this.options.isClone) {\n        if (this.modules.logger) {\n          baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n        } else {\n          baseLogger.init(null, this.options);\n        }\n\n        var formatter;\n\n        if (this.modules.formatter) {\n          formatter = this.modules.formatter;\n        } else if (typeof Intl !== 'undefined') {\n          formatter = Formatter;\n        }\n\n        var lu = new LanguageUtil(this.options);\n        this.store = new ResourceStore(this.options.resources, this.options);\n        var s = this.services;\n        s.logger = baseLogger;\n        s.resourceStore = this.store;\n        s.languageUtils = lu;\n        s.pluralResolver = new PluralResolver(lu, {\n          prepend: this.options.pluralSeparator,\n          compatibilityJSON: this.options.compatibilityJSON,\n          simplifyPluralSuffix: this.options.simplifyPluralSuffix\n        });\n\n        if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n          s.formatter = createClassOnDemand(formatter);\n          s.formatter.init(s, this.options);\n          this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n        }\n\n        s.interpolator = new Interpolator(this.options);\n        s.utils = {\n          hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n        };\n        s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n        s.backendConnector.on('*', function (event) {\n          for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n            args[_key - 1] = arguments[_key];\n          }\n\n          _this2.emit.apply(_this2, [event].concat(args));\n        });\n\n        if (this.modules.languageDetector) {\n          s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n          s.languageDetector.init(s, this.options.detection, this.options);\n        }\n\n        if (this.modules.i18nFormat) {\n          s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n          if (s.i18nFormat.init) s.i18nFormat.init(this);\n        }\n\n        this.translator = new Translator(this.services, this.options);\n        this.translator.on('*', function (event) {\n          for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n            args[_key2 - 1] = arguments[_key2];\n          }\n\n          _this2.emit.apply(_this2, [event].concat(args));\n        });\n        this.modules.external.forEach(function (m) {\n          if (m.init) m.init(_this2);\n        });\n      }\n\n      this.format = this.options.interpolation.format;\n      if (!callback) callback = noop;\n\n      if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n        var codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n        if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n      }\n\n      if (!this.services.languageDetector && !this.options.lng) {\n        this.logger.warn('init: no languageDetector is used and no lng is defined');\n      }\n\n      var storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n      storeApi.forEach(function (fcName) {\n        _this2[fcName] = function () {\n          var _this2$store;\n\n          return (_this2$store = _this2.store)[fcName].apply(_this2$store, arguments);\n        };\n      });\n      var storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n      storeApiChained.forEach(function (fcName) {\n        _this2[fcName] = function () {\n          var _this2$store2;\n\n          (_this2$store2 = _this2.store)[fcName].apply(_this2$store2, arguments);\n\n          return _this2;\n        };\n      });\n      var deferred = defer();\n\n      var load = function load() {\n        var finish = function finish(err, t) {\n          if (_this2.isInitialized && !_this2.initializedStoreOnce) _this2.logger.warn('init: i18next is already initialized. You should call init just once!');\n          _this2.isInitialized = true;\n          if (!_this2.options.isClone) _this2.logger.log('initialized', _this2.options);\n\n          _this2.emit('initialized', _this2.options);\n\n          deferred.resolve(t);\n          callback(err, t);\n        };\n\n        if (_this2.languages && _this2.options.compatibilityAPI !== 'v1' && !_this2.isInitialized) return finish(null, _this2.t.bind(_this2));\n\n        _this2.changeLanguage(_this2.options.lng, finish);\n      };\n\n      if (this.options.resources || !this.options.initImmediate) {\n        load();\n      } else {\n        setTimeout(load, 0);\n      }\n\n      return deferred;\n    }\n  }, {\n    key: \"loadResources\",\n    value: function loadResources(language) {\n      var _this3 = this;\n\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n      var usedCallback = callback;\n      var usedLng = typeof language === 'string' ? language : this.language;\n      if (typeof language === 'function') usedCallback = language;\n\n      if (!this.options.resources || this.options.partialBundledLanguages) {\n        if (usedLng && usedLng.toLowerCase() === 'cimode') return usedCallback();\n        var toLoad = [];\n\n        var append = function append(lng) {\n          if (!lng) return;\n\n          var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n\n          lngs.forEach(function (l) {\n            if (toLoad.indexOf(l) < 0) toLoad.push(l);\n          });\n        };\n\n        if (!usedLng) {\n          var fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n          fallbacks.forEach(function (l) {\n            return append(l);\n          });\n        } else {\n          append(usedLng);\n        }\n\n        if (this.options.preload) {\n          this.options.preload.forEach(function (l) {\n            return append(l);\n          });\n        }\n\n        this.services.backendConnector.load(toLoad, this.options.ns, function (e) {\n          if (!e && !_this3.resolvedLanguage && _this3.language) _this3.setResolvedLanguage(_this3.language);\n          usedCallback(e);\n        });\n      } else {\n        usedCallback(null);\n      }\n    }\n  }, {\n    key: \"reloadResources\",\n    value: function reloadResources(lngs, ns, callback) {\n      var deferred = defer();\n      if (!lngs) lngs = this.languages;\n      if (!ns) ns = this.options.ns;\n      if (!callback) callback = noop;\n      this.services.backendConnector.reload(lngs, ns, function (err) {\n        deferred.resolve();\n        callback(err);\n      });\n      return deferred;\n    }\n  }, {\n    key: \"use\",\n    value: function use(module) {\n      if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n      if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n\n      if (module.type === 'backend') {\n        this.modules.backend = module;\n      }\n\n      if (module.type === 'logger' || module.log && module.warn && module.error) {\n        this.modules.logger = module;\n      }\n\n      if (module.type === 'languageDetector') {\n        this.modules.languageDetector = module;\n      }\n\n      if (module.type === 'i18nFormat') {\n        this.modules.i18nFormat = module;\n      }\n\n      if (module.type === 'postProcessor') {\n        postProcessor.addPostProcessor(module);\n      }\n\n      if (module.type === 'formatter') {\n        this.modules.formatter = module;\n      }\n\n      if (module.type === '3rdParty') {\n        this.modules.external.push(module);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"setResolvedLanguage\",\n    value: function setResolvedLanguage(l) {\n      if (!l || !this.languages) return;\n      if (['cimode', 'dev'].indexOf(l) > -1) return;\n\n      for (var li = 0; li < this.languages.length; li++) {\n        var lngInLngs = this.languages[li];\n        if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n\n        if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n          this.resolvedLanguage = lngInLngs;\n          break;\n        }\n      }\n    }\n  }, {\n    key: \"changeLanguage\",\n    value: function changeLanguage(lng, callback) {\n      var _this4 = this;\n\n      this.isLanguageChangingTo = lng;\n      var deferred = defer();\n      this.emit('languageChanging', lng);\n\n      var setLngProps = function setLngProps(l) {\n        _this4.language = l;\n        _this4.languages = _this4.services.languageUtils.toResolveHierarchy(l);\n        _this4.resolvedLanguage = undefined;\n\n        _this4.setResolvedLanguage(l);\n      };\n\n      var done = function done(err, l) {\n        if (l) {\n          setLngProps(l);\n\n          _this4.translator.changeLanguage(l);\n\n          _this4.isLanguageChangingTo = undefined;\n\n          _this4.emit('languageChanged', l);\n\n          _this4.logger.log('languageChanged', l);\n        } else {\n          _this4.isLanguageChangingTo = undefined;\n        }\n\n        deferred.resolve(function () {\n          return _this4.t.apply(_this4, arguments);\n        });\n        if (callback) callback(err, function () {\n          return _this4.t.apply(_this4, arguments);\n        });\n      };\n\n      var setLng = function setLng(lngs) {\n        if (!lng && !lngs && _this4.services.languageDetector) lngs = [];\n        var l = typeof lngs === 'string' ? lngs : _this4.services.languageUtils.getBestMatchFromCodes(lngs);\n\n        if (l) {\n          if (!_this4.language) {\n            setLngProps(l);\n          }\n\n          if (!_this4.translator.language) _this4.translator.changeLanguage(l);\n          if (_this4.services.languageDetector) _this4.services.languageDetector.cacheUserLanguage(l);\n        }\n\n        _this4.loadResources(l, function (err) {\n          done(err, l);\n        });\n      };\n\n      if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n        setLng(this.services.languageDetector.detect());\n      } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n        this.services.languageDetector.detect(setLng);\n      } else {\n        setLng(lng);\n      }\n\n      return deferred;\n    }\n  }, {\n    key: \"getFixedT\",\n    value: function getFixedT(lng, ns, keyPrefix) {\n      var _this5 = this;\n\n      var fixedT = function fixedT(key, opts) {\n        var options;\n\n        if (_typeof(opts) !== 'object') {\n          for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n            rest[_key3 - 2] = arguments[_key3];\n          }\n\n          options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n        } else {\n          options = _objectSpread$6({}, opts);\n        }\n\n        options.lng = options.lng || fixedT.lng;\n        options.lngs = options.lngs || fixedT.lngs;\n        options.ns = options.ns || fixedT.ns;\n        options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n        var keySeparator = _this5.options.keySeparator || '.';\n        var resultKey = options.keyPrefix ? \"\".concat(options.keyPrefix).concat(keySeparator).concat(key) : key;\n        return _this5.t(resultKey, options);\n      };\n\n      if (typeof lng === 'string') {\n        fixedT.lng = lng;\n      } else {\n        fixedT.lngs = lng;\n      }\n\n      fixedT.ns = ns;\n      fixedT.keyPrefix = keyPrefix;\n      return fixedT;\n    }\n  }, {\n    key: \"t\",\n    value: function t() {\n      var _this$translator;\n\n      return this.translator && (_this$translator = this.translator).translate.apply(_this$translator, arguments);\n    }\n  }, {\n    key: \"exists\",\n    value: function exists() {\n      var _this$translator2;\n\n      return this.translator && (_this$translator2 = this.translator).exists.apply(_this$translator2, arguments);\n    }\n  }, {\n    key: \"setDefaultNamespace\",\n    value: function setDefaultNamespace(ns) {\n      this.options.defaultNS = ns;\n    }\n  }, {\n    key: \"hasLoadedNamespace\",\n    value: function hasLoadedNamespace(ns) {\n      var _this6 = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (!this.isInitialized) {\n        this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n        return false;\n      }\n\n      if (!this.languages || !this.languages.length) {\n        this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n        return false;\n      }\n\n      var lng = this.resolvedLanguage || this.languages[0];\n      var fallbackLng = this.options ? this.options.fallbackLng : false;\n      var lastLng = this.languages[this.languages.length - 1];\n      if (lng.toLowerCase() === 'cimode') return true;\n\n      var loadNotPending = function loadNotPending(l, n) {\n        var loadState = _this6.services.backendConnector.state[\"\".concat(l, \"|\").concat(n)];\n\n        return loadState === -1 || loadState === 2;\n      };\n\n      if (options.precheck) {\n        var preResult = options.precheck(this, loadNotPending);\n        if (preResult !== undefined) return preResult;\n      }\n\n      if (this.hasResourceBundle(lng, ns)) return true;\n      if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n      if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n      return false;\n    }\n  }, {\n    key: \"loadNamespaces\",\n    value: function loadNamespaces(ns, callback) {\n      var _this7 = this;\n\n      var deferred = defer();\n\n      if (!this.options.ns) {\n        callback && callback();\n        return Promise.resolve();\n      }\n\n      if (typeof ns === 'string') ns = [ns];\n      ns.forEach(function (n) {\n        if (_this7.options.ns.indexOf(n) < 0) _this7.options.ns.push(n);\n      });\n      this.loadResources(function (err) {\n        deferred.resolve();\n        if (callback) callback(err);\n      });\n      return deferred;\n    }\n  }, {\n    key: \"loadLanguages\",\n    value: function loadLanguages(lngs, callback) {\n      var deferred = defer();\n      if (typeof lngs === 'string') lngs = [lngs];\n      var preloaded = this.options.preload || [];\n      var newLngs = lngs.filter(function (lng) {\n        return preloaded.indexOf(lng) < 0;\n      });\n\n      if (!newLngs.length) {\n        if (callback) callback();\n        return Promise.resolve();\n      }\n\n      this.options.preload = preloaded.concat(newLngs);\n      this.loadResources(function (err) {\n        deferred.resolve();\n        if (callback) callback(err);\n      });\n      return deferred;\n    }\n  }, {\n    key: \"dir\",\n    value: function dir(lng) {\n      if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n      if (!lng) return 'rtl';\n      var rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n      return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n    }\n  }, {\n    key: \"cloneInstance\",\n    value: function cloneInstance() {\n      var _this8 = this;\n\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n\n      var mergedOptions = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, this.options), options), {\n        isClone: true\n      });\n\n      var clone = new I18n(mergedOptions);\n\n      if (options.debug !== undefined || options.prefix !== undefined) {\n        clone.logger = clone.logger.clone(options);\n      }\n\n      var membersToCopy = ['store', 'services', 'language'];\n      membersToCopy.forEach(function (m) {\n        clone[m] = _this8[m];\n      });\n      clone.services = _objectSpread$6({}, this.services);\n      clone.services.utils = {\n        hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n      };\n      clone.translator = new Translator(clone.services, clone.options);\n      clone.translator.on('*', function (event) {\n        for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n          args[_key4 - 1] = arguments[_key4];\n        }\n\n        clone.emit.apply(clone, [event].concat(args));\n      });\n      clone.init(mergedOptions, callback);\n      clone.translator.options = clone.options;\n      clone.translator.backendConnector.services.utils = {\n        hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n      };\n      return clone;\n    }\n  }, {\n    key: \"toJSON\",\n    value: function toJSON() {\n      return {\n        options: this.options,\n        store: this.store,\n        language: this.language,\n        languages: this.languages,\n        resolvedLanguage: this.resolvedLanguage\n      };\n    }\n  }]);\n\n  return I18n;\n}(EventEmitter);\n\n_defineProperty(I18n, \"createInstance\", function () {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var callback = arguments.length > 1 ? arguments[1] : undefined;\n  return new I18n(options, callback);\n});\n\nvar instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nvar createInstance = instance.createInstance;\nvar init = instance.init;\nvar loadResources = instance.loadResources;\nvar reloadResources = instance.reloadResources;\nvar use = instance.use;\nvar changeLanguage = instance.changeLanguage;\nvar getFixedT = instance.getFixedT;\nvar t = instance.t;\nvar exists = instance.exists;\nvar setDefaultNamespace = instance.setDefaultNamespace;\nvar hasLoadedNamespace = instance.hasLoadedNamespace;\nvar loadNamespaces = instance.loadNamespaces;\nvar loadLanguages = instance.loadLanguages;\n\nexport default instance;\nexport { changeLanguage, createInstance, exists, getFixedT, hasLoadedNamespace, init, loadLanguages, loadNamespaces, loadResources, reloadResources, setDefaultNamespace, t, use };\n","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _toArray(r) {\n  return arrayWithHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableRest();\n}\nexport { _toArray as default };","function _iterableToArray(r) {\n  if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint class-methods-use-this: \"off\" */\n\nimport { LitElement } from 'lit-element';\nimport i18next from 'i18next';\nimport { swLocales } from '../../../auto-generated/locales.bundle';\n\nconst LdI18Next = (() => {\n  i18next.init({\n    lng: 'en',\n    fallbackLng: 'default',\n    debug: false,\n    resources: swLocales\n  });\n  return i18next;\n})()\n\nexport default LdI18Next;\n\n/**\n *\n * @mixin\n * @polymerMixin\n */\nexport const LdI18NextMixin = (superClass) => class extends superClass {\n\n  constructor() {\n    super();\n\n    if (superClass === LitElement) {\n      LdI18Next.on('languageChanged', () => {\n        super.requestUpdate();\n        this.dispatchEvent(new CustomEvent('language-changed', { detail: { language: i18next.language } }));\n      });\n    }\n  }\n\n  LdTranslate(string) {\n    return i18next.t(string);\n  }\n\n  LdTranslationExists(string) {\n    return i18next.exists(string);\n  }\n\n  LdGetLanguage() {\n    return i18next.language;\n  }\n\n  LdGetArray(key) {\n    return i18next.t(key, { returnObjects: true });\n  }\n\n  LdChangeLanguage(language, callback) {\n    i18next.changeLanguage(language, callback);\n  }\n\n};\n\nexport const LdTranslate = (string) => {\n  LdGetLanguage();\n  return i18next.t(string);\n};\n\n\nexport const LdTranslationExists = (string) => {\n  return i18next.exists(string);\n};\n\nexport const LdGetLanguage = () => {\n  return i18next.language;\n};\n\nexport const LdGetArray = (key) => {\n  return i18next.t(key, { returnObjects: true });\n};\n\nexport const LdChangeLanguage = (language, callback) => {\n  i18next.changeLanguage(language, callback);\n};\n","export const swLocales = {\r\n  cz: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Odhlásit',\r\n        release: 'Dne ‚%replaceValue1‘ bude v době od‘%replaceValue2‘ do ‚%replaceValue3‘ probíhat údržba platformy. Dostupnost platformy bude v této době omezena.',\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Zavřít',\r\n        acceptLabel: 'Přijmout',\r\n        userProfile: 'Uživatelský profil',\r\n        button: {\r\n          clear: 'Odstranit diagram',\r\n          timeline: 'Úpravy mezních hodnot',\r\n          separateCharts: 'Zvláštní diagramy',\r\n        },\r\n        declineLabel: 'Odmítnout',\r\n        backToDashboard: 'Zpět na panel',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / Standardy',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Kontakt',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: 'Tiráž',\r\n          },\r\n          privacy: {\r\n            title: 'Respektování soukromí',\r\n            header: 'Zásady ochrany osobních údajů',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'Domovské stránky fy SW',\r\n          },\r\n        },\r\n        noInternetConnection: 'Zdá se, že Vám nefunguje internetové připojení. Správně se připojte a zkuste to znovu.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'z',\r\n          noData: 'Žádná data',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'staženo',\r\n          noDuration: 'Doba není k dispozici',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'Stroj nemá platnou licenci.',\r\n          alarmPending: 'Nevyřízený alarm',\r\n          buttons: {\r\n            back: 'Zpět',\r\n            save: 'Uložit',\r\n            view: 'Zobrazit',\r\n            cancel: 'Zrušit',\r\n            custom: 'Uožit + Nastavit vlastní rozsah',\r\n            submit: 'Převzít',\r\n            export: {\r\n              limit: 'Download mezních hodnot',\r\n              alarms: 'Download alarmů',\r\n            },\r\n            import: {\r\n              limit: 'Spustit',\r\n              alarms: 'Spustit',\r\n            },\r\n            refreshReset: 'Resetovat na standardní čas',\r\n            selectAllCheckboxes: 'Vybrat vše',\r\n            unselectAllCheckboxes: 'Zrušit výběr',\r\n          },\r\n          notAvailable: 'Nedostupné',\r\n          notConnected: 'Ještě nepřipojeno',\r\n          download: {\r\n            file: 'Downloady souborů',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'den',\r\n            days: 'dny',\r\n            hour: 'hodina',\r\n            year: 'rok',\r\n            hours: 'hodiny',\r\n            month: 'měsíc',\r\n            years: 'roky',\r\n            minute: 'minuta',\r\n            months: 'měsíce',\r\n            second: 'vteřina',\r\n            minutes: 'minuty',\r\n            seconds: 'vteřiny',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Rozumím',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Krok nepůjde vrátit zpět!',\r\n        },\r\n        error: {\r\n          upload: 'Neúspěšné uploady',\r\n          download: 'Neúspěšné downloady',\r\n          message: {\r\n            enrollment_code_409: 'Toto zařízení jste si do aws již přihlásili.',\r\n            limit_change_failed: 'Mezní hodnoty nelze změnit. Zkuste to znovu později anebo napište e-mail na adresu ifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Měřené časy',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Výběr proměnných',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Datum',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Zabezpečený řízený přístup',\r\n            directAccess: 'Přímý přístup',\r\n            new: {\r\n              fields: {\r\n                id: 'Zadejte ID',\r\n                cOnePanel: 's C|One',\r\n                sessionType: 'Typ relace',\r\n              },\r\n              error_messages: {\r\n                id: 'Zadejte, prosím, ID relace nebo ID zařízení',\r\n                sessionType: 'Vyberte, prosím, typ relace',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPI',\r\n              list: 'Stroje',\r\n              shopfloor: 'Provozovna',\r\n            },\r\n            fab_title: 'Přidat novou linku',\r\n            grid: {\r\n              hall: 'Hala',\r\n              line: 'Linka',\r\n              type: 'Typ',\r\n              contractEnd: 'Konec smlouvy [volitelný údaj]',\r\n              cellPosition: 'Buňka / pozice [volitelný údaj]',\r\n              operationStep: 'Krok',\r\n              machineIdentifierSw: 'Č. stroje (SW)',\r\n              machineIdentifierCustomer: 'Název stroje',\r\n            },\r\n            success: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Linka byla úspěšně založena.',\r\n            },\r\n            new_form_title: 'Nová linka',\r\n            edit_form_title: 'Upravit linku',\r\n            new: {\r\n              fields: {\r\n                name: 'Název linky',\r\n                name_short: 'Název linky (zkrácený) [nepovinný údaj]',\r\n                description: 'Popis [nepovinný údaj]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Zadejte název linky.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Linka byla úspěšně aktualizována.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Přidat novou halu',\r\n            grid: {\r\n              part: 'Typ dílu',\r\n              lineName: 'Linka',\r\n              typeOfLoading: 'Způsob nakládání',\r\n              lineResponsible: 'Osoba zodpovědná za linku',\r\n              plannedQuantity: 'Plánované množství',\r\n              numberOfMachines: '# strojů',\r\n            },\r\n            tabs: {\r\n              list: 'Linky',\r\n              shopfloor: 'Provozovna',\r\n            },\r\n            success: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Hala byla úspěšně založena.',\r\n            },\r\n            new_form_title: 'Nová hala',\r\n            shopfloor: {\r\n              edit: 'Editační režim',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Uložit konfiguraci',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Zamítnout konfiguraci',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Upravit halu',\r\n            new: {\r\n              fields: {\r\n                name: 'Název haly',\r\n                name_short: 'Název haly (zkrácený) [nepovinný údaj]',\r\n                description: 'Popis [nepovinný údaj]',\r\n                description_external: 'Popis (externí) [nepovinný údaj]',\r\n                description_internal: 'Popis (interní) [nepovinný údaj]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Zadejte název haly.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Hala byla úspěšně aktualizována.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Popis [nepovinný údaj]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Založit nový objekt',\r\n            tabs: {\r\n              info: 'Časové průběhy',\r\n              alarms: 'Alarmy',\r\n              events: 'Události stroje',\r\n              gateway: 'Gateway',\r\n              service: 'Servis',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Disponibilita linky',\r\n              'axis-test': 'Zkouška os',\r\n              collection: 'Kolekce',\r\n              technology: 'Technologie',\r\n              maintenance: 'Údržba',\r\n              performance: 'Výkon',\r\n              spindledata: 'Data vřeten',\r\n              remoteaccess: 'Vzdálený přístup',\r\n              enduranceTest: 'Testování na konci linky',\r\n              administration: 'Správa',\r\n              y_title: {\r\n                status: 'Stav',\r\n                status_table_one: 'Stůl 1',\r\n                status_table_two: 'Stůl 2',\r\n              },\r\n              energymonitoring: 'Energetický monitoring',\r\n              technology_undefined: 'nedefinováno',\r\n              technology_undefined_condition: 'Nedefinovaný stav!',\r\n            },\r\n            move: {\r\n              message: \"Objekt '%replaceValue' je možno přesunout do jiného podniku, lokality, haly a/nebo linky.\",\r\n              select_hall_label: 'Vybrat novou halu',\r\n              select_line_label: 'Vybrat novou linku',\r\n              select_company_label: 'Vybrat nový podnik',\r\n              select_location_label: 'Vybrat novou lokalitu',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Číslo stroje (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Dodávka [nepovinný údaj]',\r\n                shipping: 'Expedice [nepovinný údaj]',\r\n                controller: 'Řídicí systém',\r\n                machine_type: 'Typ stroje',\r\n                warranty_end: 'Konec záruky [nepovinný údaj]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Správce systémů',\r\n                warranty_start: 'Začátek záruky [nepovinný údaj]',\r\n                machine_swmp_api: 'Ukončení SWMP API [volitelné]',\r\n                machine_swsp_trace: 'Ukončení SWSP Trace [volitelné]',\r\n                machine_swcp_portal: 'Ukončení portálu SWCP [volitelné]',\r\n                start_of_production: 'Začátek výroby [nepovinný údaj]',\r\n                machine_swcp_support: 'Ukončení suportu pro SWCP [volitelné]',\r\n                machine_cell_position: 'Buňka / pozice stroje',\r\n                machine_swsp_line_mon: 'Ukončení SWSP LineMon [volitelné]',\r\n                machine_identifier_customer: 'ID stroje (zákaznické)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Zadejte platné číslo stroje fy SW (min. 7 znaků: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Vyberte řídicí systém.',\r\n                machine_type_not_specified: 'Vyberte typ stroje.',\r\n                machine_identifier_customer_not_specified: 'Zadejte ID stroje.',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Objekt byl úspěšně založen.',\r\n            },\r\n            new_form_title: 'Přidat objekt',\r\n            edit_form_title: 'Upravit objekt',\r\n            move_form_title: 'Přesunout objekt',\r\n            editSuccess: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Objekt byl úspěšně aktualizován.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'Portál SWCP',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'Suport pro SWCP',\r\n                shipping: 'Datum expedice',\r\n                controller: 'Řídicí systém',\r\n                contractEnd: 'Konec smlouvy',\r\n                machineType: 'Typ stroje',\r\n                startupDate: 'Datum uvedení do provozu',\r\n                warrantyEnd: 'Konec záruky',\r\n                cellPosition: 'Buňka / pozice',\r\n                warrantyStart: 'Začátek záruky',\r\n                customerNumber: 'Zákaznické číslo',\r\n                enrollmentConfig: 'Přihlašovací konfigurace',\r\n                startOfProduction: 'Začátek výroby',\r\n                machineIdentifierSw: 'Č. stroje SW',\r\n                enrollmentConfigDownload: 'Stáhnout',\r\n                machineIdentifierCustomer: 'Zákaznický název stroje',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Výměna',\r\n              g_mode: 'G funkce',\r\n              off_time: 'Vedlejší čas',\r\n              no_change: 'Žádná výměna',\r\n              undefined: 'Nedefinováno',\r\n              active_tool: 'Aktivní nástroj',\r\n              tool_change: 'Výměna nástroje',\r\n              machining_time: 'Hlavní čas',\r\n              tool_change_time: 'Čas výměny nástroje',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Procesní čas stolu 1',\r\n                  name_two: 'Procesní čas stolu 2',\r\n                  name_one_undefined: 'Nedefinovaný procesní čas stolu 1',\r\n                  name_two_undefined: 'Nedefinovaný procesní čas stolu 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Osa Q a vřeteno',\r\n              undefined_gmode_data: 'Žádná data ke G funkci',\r\n              auxiliary_process_time: 'Dodatečný procesní čas',\r\n              undefined_activetool_data: 'Žádná data k aktivnímu nástroji',\r\n              undefined_tool_change_data: 'Žádná data k výměně nástroje',\r\n              undefined_machining_time_table_one: 'Nenadefinovaný stav stolu 1',\r\n              undefined_machining_time_table_two: 'Nenadefinovaný stav stolu 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Hlavní čas, čas výměny nástroje & vedlejší čas stolu 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Hlavní čas, čas výměny nástroje & vedlejší čas stolu 2',\r\n            },\r\n            add_line_to_dashboard: 'Přidání linky do panelu',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Jednotky',\r\n                value: 'Hodnota',\r\n                kpiUnit: 'Jednotky',\r\n                headline: 'Zkouška os',\r\n                kpiValue: 'Hodnota',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Načíst z paměti prohlížeče',\r\n                limitsSave: 'Uložit do paměti prohlížeče',\r\n                selectAxis: 'Vybrat osu',\r\n                limitsExport: 'Exportovat mezní hodnoty do dočasné paměti',\r\n                openAxistest: 'Otevřít zkoušku os',\r\n                axisTestPlural: 'Zkouška os',\r\n                adjustments: {\r\n                  add: 'Přidat lokální úpravu',\r\n                  range: 'Dosah',\r\n                  header: 'Lokální úprava',\r\n                  remove: 'Odstranit',\r\n                  position: 'Pozice',\r\n                  amplitude: 'Amplituda',\r\n                  spreadMultiplier: 'Multiplikátor mezních hodnot',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Pozice',\r\n                    y: 'Proud',\r\n                    up: 'nahoru',\r\n                    down: 'dolů',\r\n                    limitsUp: 'omezí v kladném směru',\r\n                    limitsDown: 'omezí v záporném směru',\r\n                    sliderSlopeCenter: 'Počátek stoupání',\r\n                    sliderSlopeFactor: 'Koeficient stoupání',\r\n                    sliderVerticalOffset: 'Vyosení Y',\r\n                    sliderVerticalSpread: 'Omezit šířku',\r\n                    sliderQuadraticCenter: 'Počátek kvadratického úseku',\r\n                    sliderQuadraticFactor: 'Koeficient kvadratického úseku',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Po směru hodinových ručiček',\r\n                    limitsClockwise: 'Meze po směru hodinových ručiček',\r\n                    counterClockwise: 'Proti směru hodinových ručiček',\r\n                    sliderSineOffset: 'Vyosení vlny',\r\n                    sliderSineAmplitude: 'Amplituda vlny',\r\n                    sliderSineFrequency: 'Kmitočet vlny',\r\n                    sliderVerticalOffset: 'Vyosení Y',\r\n                    sliderVerticalSpread: 'Omezit šířku',\r\n                    limitsCounterClockwise: 'Meze proti směru hodinových ručiček',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Rychlost',\r\n                  pulseMaxRampUp: 'Rampa ->',\r\n                  pulseMaxRampDown: 'Rampa <-',\r\n                  pulseMaxStiffness: 'Tuhost maximální',\r\n                  pulseMinStiffness: 'Tuhost minimální',\r\n                  pulseMeanStiffness: 'Tuhost Ø',\r\n                  circularReversalRange: 'Vratné rozpětí',\r\n                  pulseMaxUpPathCurrent: 'Proud maximální ->',\r\n                  pulseMinUpPathCurrent: 'Proud minimální >',\r\n                  pulseMeanUpPathCurrent: 'Proud Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Proud maximální <-',\r\n                  pulseMinDownPathCurrent: 'Proud minimální <-',\r\n                  pulseMeanDownPathCurrent: 'Proud Ø <-',\r\n                  circularShapeDeviationClockwise: 'Odchylka od kruhovitosti při pravotočivé interpolaci',\r\n                  pulseStiffnessStandardDeviation: 'Tuhost σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Proud σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Proud σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Odchylka od kruhovitosti při levotočivé interpolaci',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Zkouška kruhové interpolace',\r\n                  EQUABILITY: 'Zkouška synchronnosti',\r\n                  CIRCULARITY: 'Zkouška kruhové interpolace',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Tento typ zkoušky osy neexistuje',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'V případě výskytu chyby se obraťte na',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Prostřednictvím formuláře Netcfg nám, prosím, sdělte odpovídající data.',\r\n                  intro: 'Informace o konfiguraci sítě jsou nezbytné pro správné připojení Vašeho stroje.',\r\n                  title: 'Konfigurace sítě',\r\n                  goToNetconfig: 'Otevřít konfiguraci sítě',\r\n                },\r\n                device: {\r\n                  title: 'Detaily zařízení',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Jestliže bude ioT Gateway vypadat takto, proveďte následující kroky:',\r\n                  line1: 'Soubor pro enrollment si stáhnete kliknutím na tlačítko na dolním okraji kachlíku.',\r\n                  line2: 'Soubor se začne stahovat automaticky.',\r\n                  line3: 'Soubor s příponou .json si uložte do kmenového adresáře paměťového zařízení USB. Zkontrolujte, zda soubor nese tento název:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Zkontrolujte, zda kmenový adresář paměťového zařízení USB obsahuje tyto soubory:',\r\n                  line6: 'Paměťové zařízení USB zasuňte do příslušného gateway pro IoT.',\r\n                  line7: 'Poté se ihned spustí automatické učení, které bude provázet blikající zelená uživatelská LED.',\r\n                  line8: 'Po úspěšném přihlášení se rozsvítí zelená LED, která zhasne až po vysunutí paměťového úložiště USB.',\r\n                  title: 'Enrollment',\r\n                  button: 'Soubor pro enrollment',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Stáhněte si soubor s názvem „migrate-iot.zip“ a obsah extrahujte na prázdné paměťové zařízení USB.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Stáhněte si též ',\r\n                  line4: ' a uložte rovněž na paměťové zařízení USB. Zkontrolujte, zda soubor nese tento název:',\r\n                  line5: 'Zkontrolujte, zda kmenový adresář paměťového zařízení USB obsahuje tyto soubory:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Migrace platformy',\r\n                  line10: 'Paměťové zařízení USB zasuňte do příslušného gateway pro IoT.',\r\n                  line11: 'Poté se ihned spustí automatická instalace softwaru, kterou bude provázet blikající žlutá LED.',\r\n                  line12: 'Po úspěšném dokončení migrace se rozsvítí zelená LED, která zhasne až po vysunutí paměťového zařízení USB.',\r\n                  line13: 'Po úspěšném dokončení migrace se rozsvítí zelená LED, která zhasne až po vysunutí paměťového zařízení USB.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Vygenerovat',\r\n                headline: 'Časové průběhy',\r\n                noChartMessage: 'Vyberte alespoň jednu proměnnou a kliknutím vygenerujte potřebné údaje',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarmy',\r\n              },\r\n              service: {\r\n                contact: 'Kontaktujte',\r\n                headline: 'Servis',\r\n                update: {\r\n                  title: 'Aktualizovat soubor',\r\n                },\r\n                upload: {\r\n                  title: 'Nahrát soubor',\r\n                  fields: {\r\n                    file: 'Soubor',\r\n                    language: 'Jazyk souboru',\r\n                    file_name: 'Název souboru',\r\n                    list_of_languages: {\r\n                      cz: 'Čeština',\r\n                      de: 'Němčina',\r\n                      en: 'Angličtina',\r\n                      es: 'Španělština',\r\n                      fr: 'Francouzština',\r\n                      hu: 'Maďarština',\r\n                      it: 'Italština',\r\n                      ko: 'Korejština',\r\n                      pl: 'Polština',\r\n                      tr: 'Turečtina',\r\n                      zh: 'Čínština',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Nahrát',\r\n                    cancel: 'Zrušit',\r\n                  },\r\n                  success: {\r\n                    title: 'Povedlo se',\r\n                    button: 'Zpět na přehled servisu',\r\n                    message: 'Soubor byl úspěšně nahrán.',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Zadejte název souboru.',\r\n                    file_not_valid: 'Zadejte soubor / vyberte menší soubor.',\r\n                    language_not_specified: 'Zadejte jazyk souboru.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Příručky',\r\n                },\r\n                version: {\r\n                  title: 'Soubory verzí',\r\n                },\r\n                contracts: {\r\n                  title: 'Smlouvy',\r\n                },\r\n                components: {\r\n                  title: 'Hardwarové a softwarové komponenty',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Seznam náhradních dílů',\r\n                },\r\n                consumeables: {\r\n                  title: 'Provozní látky',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Aktualizovat',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Pro dálkový přístup k určitému stroji musí být na IoT-Gateway nainstalovaný program TeamViewer. ',\r\n                  line2: 'Instalaci programu TeamViewer si v případě potřeby provedete kliknutím na „Instalovat“.',\r\n                  title: 'Nainstalujte program pro vzdálenou technickou podporu',\r\n                  status: 'Deployment stav',\r\n                  copy: {\r\n                    button: 'Kopírovat odkaz',\r\n                  },\r\n                  install: {\r\n                    button: 'Nainstalujte program TeamViewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Spustit relaci',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT Gateway',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Operační systém',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Potřebujete se strojem pomoci?',\r\n                  line2: 'Kontaktujte nás!',\r\n                  title: 'Zpráva pro servis SW',\r\n                  button: 'Kontaktovat servis',\r\n                  fields: {\r\n                    name: 'Číslo stroje (SW)',\r\n                    type: 'Typ dotazu',\r\n                    email: 'E-mail',\r\n                    message: 'Zpráva',\r\n                    phone_no: 'Telefonní číslo',\r\n                    last_name: 'Příjmení',\r\n                    first_name: 'Jméno',\r\n                    contact_person: 'Kontaktní osoba (SW) [nepovinný údaj]',\r\n                    list_of_types: {\r\n                      request: 'Obecný dotaz',\r\n                      service: 'Servis',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Rozšíření',\r\n                      inspection: 'Inspekce',\r\n                    },\r\n                    machine_identifier_customer: 'ID stroje (zákaznické) [nepovinný údaj]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Odeslat dotaz',\r\n                    cancel: 'Zrušit',\r\n                  },\r\n                  success: {\r\n                    title: 'Povedlo se!',\r\n                    button: 'Zpět na přehled servisu',\r\n                    message: 'Dotaz byl úspěšně odeslán do servisního oddělení SW.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Zadejte platnou e-mailovou adresu.',\r\n                    name_not_specified: 'Zadejte platné číslo stroje fy SW (min. 7 znaků: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Zadejte platné telefonní číslo.',\r\n                    message_not_specified: 'Zadejte text zprávy.',\r\n                    last_name_not_specified: 'Zadejte příjmení.',\r\n                    first_name_not_specified: 'Zadejte jméno.',\r\n                    family_name_not_specified: 'Zadejte příjmení.',\r\n                    contact_type_not_specified: 'Zadejte typ dotazu.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Software stroje',\r\n                  values: {\r\n                    nc_version: 'Verze NC',\r\n                    hmi_version: 'Verze HMI',\r\n                    plc_version: 'Verze PLC',\r\n                    compile_cycles: 'Kompilovací cykly',\r\n                    operating_system: 'Operační systém',\r\n                    pcu_base_version: 'Verze PCU-Base',\r\n                    plc_toolbox_version: 'PLC-Toolbox',\r\n                    plc_user_program_version: 'Uživatelský program PLC',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Název souboru byl úspěšně změněn',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Vzdálený suport',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'Problém Vám pomůže vyřešit asistent.',\r\n                  title: 'Asistent',\r\n                  sub_title: 'Máte potíže s nějakým z Vašich objektů?',\r\n                  open_assistant: 'Otevřít asistenta',\r\n                  request_account: 'Vyžádat si účet',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Statistiky vřeten SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'zap',\r\n                labelOffline: 'vyp',\r\n              },\r\n              swimlane: {\r\n                headline: 'Disponibilita linky',\r\n              },\r\n              endurance: {\r\n                headline: 'Testování na konci linky',\r\n                chartTitles: {\r\n                  runtime: 'Data v době běhu programu ',\r\n                  endurance: 'Testování na konci linky',\r\n                  operation: 'Provozní režim',\r\n                  qaxis_180: 'Q osa 180°',\r\n                  nc_program: 'NC program',\r\n                  stacklights: '3 signální výstražná světla',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Stav odesílání',\r\n                aborted: 'zrušen',\r\n                sending: 'odesílá',\r\n                undefined: 'nenadefinováno',\r\n                interrupted: 'přerušen',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Mapa alarmů',\r\n              },\r\n              collection: {\r\n                headline: 'Kolekce',\r\n                noChartMessage: 'Z levého sloupečku vyberte kolekci.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Součet',\r\n                  header: 'Performance Kpi',\r\n                  target: 'Plán',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarmy',\r\n                  category: [\r\n                    'Neklasifikováno',\r\n                    'Chybové hlášení',\r\n                    'Provozní hlášení',\r\n                    'Stavové hlášení',\r\n                    'Instrukce pro obsluhu',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Doba do vyřízení',\r\n                    flatlist: 'Prostý seznam',\r\n                    frequency: 'Hojnost výskytu',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Čas',\r\n                    trend: 'Trend',\r\n                    duration: 'Doba do vyřízení',\r\n                    leftTime: 'Alarm zrušen',\r\n                    alarmCount: 'Počet',\r\n                    alarmNumber: 'Č. alarmu',\r\n                    description: 'Popis',\r\n                    alarmOccured: 'Alarm nahlášen',\r\n                    alarmClassification: 'Klasifikace alarmů',\r\n                    alarmCountSecondRange: 'Počet T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'vzestupný',\r\n                      down: 'sestupný',\r\n                      flat: 'konstantní',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Detaily',\r\n                  ncProgram: 'NC program',\r\n                  lastModified: 'Poslední záznam hodnot',\r\n                  machineState: 'Stav stroje',\r\n                  numberAlarms: 'Nevyřízené alarmy',\r\n                  stopCondition: 'Podmínky zastavení',\r\n                  ncProgramState: 'Stav NC programu',\r\n                  protectionLevel: 'Ochranná úroveň',\r\n                  ncProgramStates: [\r\n                    'zrušen',\r\n                    'zastaven',\r\n                    'běží',\r\n                    'čeká',\r\n                    'přerušen',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Systém',\r\n                    'Výrobce',\r\n                    'Servis',\r\n                    'Uživatel',\r\n                    'Klíčový spínač v poloze 3',\r\n                    'Klíčový spínač v poloze 2',\r\n                    'Klíčový spínač v poloze 1',\r\n                    'Klíčový spínač v poloze 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Doba trvání cyklu',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Doba trvání cyklu v s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'NE OK',\r\n                  sum: 'Součet',\r\n                  title: 'Kusové počítadlo',\r\n                  titleDayCounter: 'Denní počítadlo',\r\n                  titleShiftCounter: 'Směnové počítadlo',\r\n                  titleTotalCounter: 'Celkové počítadlo',\r\n                  titleTotalCounterSmall: 'Celkem',\r\n                },\r\n                availability: {\r\n                  title: 'Disponibilita',\r\n                  kpi: {\r\n                    title: 'Disponibilita KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG s chybou',\r\n                    MDA_with_error: 'MDA s chybou',\r\n                    JOG_without_error: 'JOG bez chyby',\r\n                    MDA_without_error: 'MDA bez chyby',\r\n                    not_defined_condition: 'Nedefinovaný stav',\r\n                    auto_no_program_active: 'AUTO žádný aktivní program',\r\n                    auto_waiting_for_parts: 'AUTO čeká na díly',\r\n                    auto_with_error_program_stopped: 'AUTO s chybou - zastavený program',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO čeká na díly + chybné zastavení',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Agregovaná dostupnost',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Disponibilita',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Stav',\r\n                },\r\n                operationMode: {\r\n                  title: 'Provozní stav',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Provozní stav',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Monitor provozní doby',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'zap',\r\n                        off: 'vyp',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Override vřetena',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Override posuvu',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Správa',\r\n                headline: 'Správa',\r\n                aws: {\r\n                  title: 'Odkazy na AWS',\r\n                },\r\n                groups: {\r\n                  title: 'Skupiny věcí',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Správce systémů',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Kusovník',\r\n                },\r\n                component: {\r\n                  title: 'Komponenty',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Údržba',\r\n              },\r\n              spindleData: {\r\n                headline: 'Data vřeten',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Vzdálený přístup',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Čas před alarmem (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Čas po alarmu (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Energetický monitoring',\r\n                chartTitles: {\r\n                  air: 'Spotřeba vzduchu',\r\n                  current: 'Spotřeba elektřiny',\r\n                  consumption: 'Průměrná hodinová spotřeba',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Hlídání stavu',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Přidat nový podnik',\r\n            grid: {\r\n              city: 'Lokalita',\r\n              email: 'E-mail',\r\n              street: 'Adresa',\r\n              country: 'Stát',\r\n              website: 'Webové stránky',\r\n              postalCode: 'PSČ',\r\n              locationName: 'Lokalita',\r\n              locationCustomerNumber: 'Zákaznické číslo',\r\n            },\r\n            tabs: {\r\n              list: 'Lokality',\r\n              worldmap: 'Mapa světa',\r\n            },\r\n            success: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Podnik byl úspěšně založen.',\r\n            },\r\n            toggle_switch: 'Vytvořit novou lokalitu se stejnými údaji',\r\n            new_form_title: 'Nový podnik',\r\n            edit_form_title: 'Upravit podnik',\r\n            new: {\r\n              fields: {\r\n                city: 'Město',\r\n                name: 'Název podniku',\r\n                email: 'E-mail [nepovinný údaj]',\r\n                state: 'Spolková země [nepovinný údaj]',\r\n                street: 'Adresa',\r\n                country: 'Stát',\r\n                website: 'Webové stránky [nepovinný údaj]',\r\n                zipcode: 'PSČ',\r\n                legal_form: 'Právní forma [nepovinný údaj]',\r\n                name_short: 'Název podniku (krátký) [nepovinný údaj]',\r\n                description: 'Popis [nepovinný údaj]',\r\n                company_logo: 'Logo podniku (URL) [nepovinný údaj]',\r\n                customer_number: 'Zákaznické číslo',\r\n                industry_sector: 'Průmyslové odvětví',\r\n                description_external: 'Popis (externí) [nepovinný údaj]',\r\n                description_internal: 'Popis (interní) [nepovinný údaj]',\r\n              },\r\n              error_messages: {\r\n                url: 'Zadejte platné URL.',\r\n                email: 'Zadejte platnou e-mailovou adresu.',\r\n                city_not_specified: 'Zadejte město.',\r\n                name_not_specified: 'Zadejte název podniku.',\r\n                street_not_specified: 'Zadejte adresu.',\r\n                country_not_specified: 'Zadejte stát.',\r\n                zipcode_not_specified: 'Zadejte PSČ.',\r\n                customer_number_not_specified: 'Zadejte zákaznické číslo.',\r\n                industry_sector_not_specified: 'Zadejte průmyslové odvětví.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Podnik byl úspěšně aktualizován.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Adresa',\r\n                country: 'Stát',\r\n                website: 'Webové stránky',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'Podnik vyhledaný podle zadané zeměpisné šířky a délky se v rámci platformy SW CloudPlatform zobrazí na mapě.',\r\n              intro_heading: 'Informace o místě',\r\n              location_name: 'Název místa:',\r\n              label_latitude: 'Zeměpisná šířka',\r\n              label_longitude: 'Zeměpisná délka',\r\n              text_fallback_info: 'V ostatních případech se použijí standardní souřadnice.',\r\n              text_location_found: 'Bylo nalezeno místo.',\r\n              text_location_entered: 'Místo bylo úspěšně zadáno.',\r\n              text_success_location: 'Automaticky byla doplněna tato data:',\r\n              button_define_coordinates: 'Zadání souřadnic',\r\n              text_no_coordinates_found: 'K zadaným datům nebyly nalezeny žádné souřadnice.',\r\n              text_coordinates_success_set: 'Podle automaticky doplněných souřadnic.',\r\n              button_set_custom_coordinates: 'Automatické doplnění souřadnic',\r\n              text_specify_coordinates_yourself: 'Souřadnice můžete také zadat sami.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Přidat novou lokalitu',\r\n            tabs: {\r\n              list: 'Haly',\r\n              shopfloor: 'Provozovna',\r\n            },\r\n            grid: {\r\n              hallName: 'Hala',\r\n            },\r\n            success: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Lokalita byla úspěšně založena.',\r\n            },\r\n            new_form_title: 'Nová lokalita',\r\n            edit_form_title: 'Upravit lokalitu',\r\n            new: {\r\n              fields: {\r\n                city: 'Město',\r\n                name: 'Název lokality',\r\n                email: 'E-mail [nepovinný údaj]',\r\n                state: 'Spolková země [nepovinný údaj]',\r\n                street: 'Adresa',\r\n                country: 'Stát',\r\n                website: 'Webové stránky [nepovinný údaj]',\r\n                zipcode: 'PSČ',\r\n                language: 'Jazyk [nepovinný údaj]',\r\n                name_short: 'Název lokality (zkrácený) [nepovinný údaj]',\r\n                description: 'Popis [nepovinný údaj]',\r\n                customer_number: 'Zákaznické číslo [nepovinný údaj]',\r\n                description_internal: 'Popis (interní) [nepovinný údaj]',\r\n              },\r\n              error_messages: {\r\n                email: 'Zadejte platnou e-mailovou adresu.',\r\n                city_not_specified: 'Zadejte město.',\r\n                name_not_specified: 'Zadejte název lokality.',\r\n                street_not_specified: 'Zadejte adresu.',\r\n                country_not_specified: 'Zadejte stát.',\r\n                zipcode_not_specified: 'Zadejte PSČ.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Povedlo se!',\r\n              button: 'Zpět na seznam',\r\n              message: 'Lokalita byla úspěšně aktualizována.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Adresa',\r\n                country: 'Stát',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Lokalita',\r\n              email: 'E-mail',\r\n              street: 'Adresa',\r\n              country: 'Stát',\r\n              website: 'Webové stránky',\r\n              postalCode: 'PSČ',\r\n              companyName: 'Podnik',\r\n            },\r\n            tabs: {\r\n              list: 'Podnik',\r\n              worldmap: 'Mapa světa',\r\n            },\r\n            map: {\r\n              description_not_available: 'Neexistuje žádný popis',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Přidat',\r\n                back: 'Zpět na seznam',\r\n                edit: 'Aktualizovat',\r\n                save: 'Uložit',\r\n                email: 'Odeslat obrázek',\r\n                cancel: 'Zrušit',\r\n                addMultiple: 'Přidat + Nový',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Upravit správu',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Zajištění kvality',\r\n          users: 'Správa uživatelů',\r\n          assets: 'Správa zařízení',\r\n          settings: 'Nastavení',\r\n          dashboard: 'Panel',\r\n          userProfile: 'Uživatelský profil',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Správa uživatelů',\r\n          assets: 'Správa zařízení',\r\n          dashboard: 'Panel',\r\n          userProfile: 'Uživatelský profil',\r\n        },\r\n        variables: {\r\n          bar: 'Čárová',\r\n          plc: 'PLC',\r\n          area: 'Oblast',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Linka',\r\n          long: 'Dlouhá',\r\n          real: 'REAL',\r\n          true: 'Aktivní',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Neaktivní',\r\n          float: 'S pohyblivou čárkou',\r\n          uword: 'UWORD',\r\n          double: 'Dvojitá',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Boolská',\r\n          integer: 'Celá',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Externí',\r\n          internal: 'Interní',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Jeden rok',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Uložit novou proměnnou',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Jeden měsíc',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Obdélník',\r\n          tabs: {\r\n            list: 'Seznam proměnných',\r\n          },\r\n          ten_years: 'Deset let',\r\n          two_weeks: 'Dva týdny',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Šest měsíců',\r\n          categorical: 'Kategorická',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Při vytváření proměnné se někde stala chyba. Zkuste to znovu za chvilku.',\r\n          },\r\n          new_form_title: 'Nová proměnná',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Upravit proměnnou',\r\n          new: {\r\n            fields: {\r\n              hint: '(Změny mohou vést k poruše stroje)',\r\n              showId: 'Zobrazit vstupní pole pro ID proměnné',\r\n              maxTime: 'Max. čas',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Typ dat',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Typ grafu',\r\n              namePrefix: 'Předpona',\r\n              variableId: 'ID proměnné',\r\n              collections: '',\r\n              displayName: 'Indikační název',\r\n              showInitial: 'Zobrazit iniciálu',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Viditelnost',\r\n            },\r\n            buttons: {\r\n              delete: 'Odstranit proměnnou',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Zadejte max. čas',\r\n              dataType: 'Vyberte typ dat',\r\n              chartType: 'Vyberte typ grafu',\r\n              namePrefix: 'Zadejte platnou předponu. (platné znaky: A-Z, _).',\r\n              variableId: 'Zadejte platné UUID',\r\n              displayName: 'Zadejte indikační název',\r\n              showInitial: 'Vyberte iniciálu',\r\n              namePrefixEdit: 'Zadejte platnou předponu. (platné znaky: A-Z a-z, _).',\r\n              visibilityType: 'Vyberte typ viditelnosti',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'Proměnná byla úspěšně vytvořena',\r\n          },\r\n          editError: {\r\n            message: 'Při aktualizaci proměnné se někde stala chyba. Zkuste to znovu za chvilku.',\r\n          },\r\n          editSuccess: {\r\n            message: 'Proměnná byla úspěšně aktualizována',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Úspěšné uploady',\r\n          downloads: 'Úspěšné downloady',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Vyskytla se neočekávaná chyba. Zkuste si stránku načíst znovu.',\r\n            },\r\n            s_1: {\r\n              message: 'Změny byly uloženy.',\r\n            },\r\n            s_930: {\r\n              message: 'Objekt ‚%replaceValue‘ byl odstraněn.',\r\n            },\r\n            s_931: {\r\n              message: 'Podnik ‚%replaceValue‘ byl odstraněn.',\r\n            },\r\n            s_932: {\r\n              message: 'Linka ‚%replaceValue‘ byla odstraněna.',\r\n            },\r\n            s_933: {\r\n              message: 'Hala ‚%replaceValue‘ byla odstraněna.',\r\n            },\r\n            s_934: {\r\n              message: 'Lokalita ‚%replaceValue‘ byla odstraněna.',\r\n            },\r\n            s_935: {\r\n              message: 'Soubor ‚%replaceValue‘ byl úspěšně vymazán.',\r\n            },\r\n            s_936: {\r\n              message: 'Proměnná ‚%replaceValue‘ byla úspěšně odstraněna.',\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Duplicitní karty byly vymazány!',\r\n            add_line_to_dashboard: 'Linka byla přidána do panelu',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Mezní hodnoty',\r\n            type: 'Vyberte podle typu',\r\n            alarms: 'Alarmy',\r\n            machine: 'Vyberte podle ID stroje',\r\n            variables: 'Proměnné',\r\n            listImport: 'Import mezních hodnot',\r\n            listDownload: 'Download mezních hodnot',\r\n          },\r\n          text: {\r\n            text: 'Mezní hodnoty si stanovíte pro proměnné, které budete potřebovat sledovat. Pokud sledovaná proměnná nadefinovaný interval mezních hodnot opustí, obdržíte příslušné oznámení. Mezní hodnoty si můžete nechat zobrazit také formou diagramu, který si vygenerujete v záložce „Časové řady“.',\r\n            title: 'Mezní hodnoty',\r\n          },\r\n          export: {\r\n            text: 'Aktuálně nastavené mezní hodnoty všech proměnných z platformy Cloud si můžete kdykoliv vyexportovat. Tato sestava Vám poslouží jako reference i jako nástroj pro jednorázový import všech mezních hodnot pomocí funkce „Importovat mezní hodnoty do CSV“',\r\n            title: 'Exportovat mezní hodnoty do CSV',\r\n          },\r\n          import: {\r\n            text: 'Dříve stažený soubor CSV si můžete naimportovat spolu s informacemi týkajícími se mezních hodnot a abonentů, a tím si aktuálně uložené hodnoty příslušně aktualizovat. Na který typ zařízení nebo stroje budete chtít naimportované mezní hodnoty aplikovat, si můžete určit později',\r\n            title: 'Importovat mezní hodnoty z CSV',\r\n            machines: {\r\n              title: 'Vyberte stroj nebo typ stroje, na který chcete mezní hodnoty aplikovat.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Vyberte si soubor CSV pro import',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Ve správě objektů si otevřete potřebnou linku.',\r\n            two: 'V řádce s nadpisem najdete kontextové menu.',\r\n            four: 'Linkový kachlík bude přidán do panelu.',\r\n            three: 'Klikněte na kontextové menu a otevřete možnost „Přidat do panelu”.',\r\n            header: 'Přidávání linkových kachlíků',\r\n          },\r\n          individual: {\r\n            one: 'Klikněte na symbol „ozubeného kolečka“ po levé straně.',\r\n            two: 'Použijte symbol „plus“.',\r\n            four: 'Potvrďte pomocí „Uložit“. Kachlík bude přidán do panelu.',\r\n            three: 'Kachlík pojmenujte a přidejte potřebný stroj.',\r\n            header: 'Přidávání jednotlivých kachlíků',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Založení nového uživatele',\r\n          new: {\r\n            title: 'Založit uživatele',\r\n            status: 'Stav uživatele:',\r\n            buttons: {\r\n              add: 'Přidat',\r\n              back: 'Zpět na seznam',\r\n              save: 'Uložit',\r\n              cancel: 'Zrušit',\r\n              delete: 'Vymazat uživatele',\r\n              sendMail: 'Zaslat e-mail znovu',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'Skupina uživatelů',\r\n              gender: 'Pohlaví',\r\n              created: 'Vytvořeno',\r\n              lastName: 'Příjmení',\r\n              firstName: 'Jméno',\r\n              breadcrumb: 'Zobrazit navigaci',\r\n              main_group: 'Uživatelská skupina',\r\n              phoneNumber: 'Telefonní číslo [nepovinný údaj]',\r\n              customer_org: 'Oddělení',\r\n              last_modified: 'Naposledy upraveno',\r\n              email_validation: 'E-mail (pro ověření)',\r\n            },\r\n            statusText: {\r\n              unknown: 'neznámý',\r\n              archived: 'archivovaný',\r\n              confirmed: 'potvrzený',\r\n              compromised: 'napadený',\r\n              unconfirmed: 'nepotvrzený',\r\n              reset_required: 'nutné obnovení',\r\n              external_provider: 'externí poskytovatel',\r\n              force_change_password: 'nedokončená změna hesla',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'E-mailové adresy nesouhlasí.',\r\n              email_not_valid: 'Zadejte platnou e-mailovou adresu.',\r\n              phone_not_specified: 'Zadejte platné telefonní číslo, které bude začínat + a pokračovat mezinárodní předvolbou.',\r\n              roles_not_specified: 'Vyberte skupinu uživatelů.',\r\n              gender_not_specified: 'Zadejte pohlaví.',\r\n              last_name_not_specified: 'Zadejte příjmení.',\r\n              first_name_not_specified: 'Zadejte jméno.',\r\n              main_group_not_specified: 'Vyberte skupinu uživatelů.',\r\n              family_name_not_specified: 'Zadejte příjmení.',\r\n              customer_organization_not_specified: 'Vyberte oddělení.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Neprovedeno!',\r\n          },\r\n          mail: {\r\n            success: 'Na zadanou e-mailovou adresu byl zaslán e-mail s automaticky vygenerovaným heslem.',\r\n          },\r\n          update: {\r\n            title: 'Aktualizovat uživatele',\r\n          },\r\n          success: {\r\n            title: 'Povedlo se!',\r\n            button: 'Zpět na seznam',\r\n            message: 'Uživatel byl úspěšně založen. Na zadanou e-mailovou adresu byl zaslán e-mail s automaticky vygenerovaným heslem.',\r\n            message_for_edit: 'Uživatel byl úspěšně aktualizován.',\r\n            message_send_mail: 'Na zadanou e-mailovou adresu byl zaslán e-mail s automaticky vygenerovaným heslem.',\r\n            button_back_to_last_page: 'Zpět na poslední stránku',\r\n          },\r\n          delete: {\r\n            success: 'Uživatel byl úspěšně vymazán.',\r\n            confirmation: {\r\n              title: 'Chcete tohoto uživatele opravdu vymazat?',\r\n              confirm: 'Ano, tohoto uživatele chci vymazat',\r\n              dismiss: 'Ne, zrušit',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Návštěvník',\r\n            customer: 'Zákazník',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Uživatel',\r\n              email: 'E-mail',\r\n              company: 'Firma',\r\n              enabled: 'Stav',\r\n              lastName: 'Příjmení',\r\n              sw_admin: 'Administrátor fy SW',\r\n              firstName: 'Jméno',\r\n              userRights: 'Právní stav',\r\n              phoneNumber: 'Telefonní číslo',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'mužské',\r\n              female: 'ženské',\r\n              diverse: 'diverzní',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarmy',\r\n            type: 'Vyberte podle typu',\r\n            machine: 'Vyberte podle ID stroje',\r\n            listImport: 'Importovat alarmy',\r\n            listDownload: 'Stáhnout soubor s alarmy',\r\n          },\r\n          text: {\r\n            text: 'Oznámení alarmů si stanovíte pro čísla alarmů, které budete potřebovat sledovat. Pokud se na definovaném stroji vyskytne takto nastavený alarm, obdržíte příslušné oznámení.',\r\n            title: 'Oznámení alarmů',\r\n          },\r\n          export: {\r\n            text: 'Aktuálně nastavená oznámení alarmů ze všech strojů si můžete kdykoliv z SW CloudPlatform exportovat. Tato sestava Vám poslouží jako reference i jako nástroj pro jednorázový import všech oznámení alarmů pomocí funkce „Importovat alarmy do CSV“.',\r\n            title: 'Exportovat alarmy do CSV',\r\n          },\r\n          import: {\r\n            text: 'Dříve stažený soubor CSV si můžete naimportovat spolu s informacemi týkajícími se alarmů a abonentů, a tím si aktuálně uložené hodnoty příslušně aktualizovat. Na který typ zařízení nebo stroje budete chtít naimportovaná oznámení alarmů aplikovat, si můžete určit později.',\r\n            title: 'Importovat alarmy z CSV',\r\n            machines: {\r\n              title: 'Vyberte stroj nebo typ stroje, na který chcete oznámení alarmů aplikovat.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Vyberte si soubor CSV pro import',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Nenalezeny žádné výsledky',\r\n          results: {\r\n            of: 'z',\r\n            lines: 'Linky',\r\n            machines: 'Stroje',\r\n          },\r\n          callToAction: 'Vyhledání strojů',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Neprovedeno',\r\n            queued: 'Čeká',\r\n            removed: 'Odstraněno',\r\n            canceled: 'Zrušeno',\r\n            rejected: 'Odmítnuto',\r\n            completed: 'Dokončeno',\r\n            succeeded: 'Úspěšně provedeno',\r\n            timed_out: 'Překročen časový limit',\r\n            in_progress: 'Probíhá',\r\n            not_installed: 'Nenainstalováno',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Spustit import',\r\n            dismiss: 'Zrušit',\r\n            download: 'Spustit download',\r\n          },\r\n          tabs: {\r\n            limits: 'Meze',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Název',\r\n              datatype: 'typ dat',\r\n              chartType: 'Typ grafu',\r\n              displayName: 'Indikační název',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Mapa světa',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Provozovna',\r\n          upload: {\r\n            text1: 'Obrázek schématu provozovny zašlete na adresu lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'Jestliže jste si stroje přihlásili do platformy SW CloudPlatform, pak se Vám objeví po levé straně spolu s živými resp. aktuálními daty.',\r\n            text3: 'Stavy z výkresu si pak jednoduše přetáhnete k příslušným strojům.',\r\n            mainText: 'V tomto náhledu si vytvoříte schéma provozovny s informacemi o strojích v různé míře detailnosti. Postup je následující.',\r\n            tileTitle: 'Nahrát provozovny',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Objekt byl odstraněn.',\r\n            confirmation: {\r\n              title: 'Chcete ‚%replaceValue‘ opravdu odstranit?',\r\n              confirm: 'Odstranit',\r\n              dismiss: 'Zrušit',\r\n              company: {\r\n                text: 'Odstraněním podniku si odstraníte i všechny s ním spojené uživatele.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit objekt',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Změny v NamePrefix nebo DataType mohou vést k poškození stroje. Chcete je opravdu uložit?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Chcete převzít mezní hodnoty stroje tohoto typu?',\r\n              title: 'Změnili jste typ stroje',\r\n              accept: 'Ano, převzít nové hodnoty',\r\n              decline: 'Ne, ponechat aktuální hodnoty',\r\n              dismiss: 'Zrušit',\r\n              info_accept: 'Aktuální mezní hodnoty změníte na mezní hodnoty stroje nového typu výběrem možnosti „Ano“.',\r\n              info_decline: 'Pokud budete chtít aktuální mezní hodnoty ponechat, vyberete možnost „Ne“.',\r\n              info_accept_warning: 'Aktuální mezní hodnoty je po přepisu možno vymazat.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Vymazat soubor',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit halu',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit linku',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Stav',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Čas stroje',\r\n          controller_time: 'Čas controlleru',\r\n          iot_gateway_time: 'Čas IoT Gateway',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Nejsou k dispozici žádná data',\r\n              loading: 'Načítají se data...',\r\n              months: [\r\n                'leden',\r\n                'únor',\r\n                'březen',\r\n                'duben',\r\n                'květen',\r\n                'červen',\r\n                'červenec',\r\n                'srpen',\r\n                'září',\r\n                'říjen',\r\n                'listopad',\r\n                'prosinec',\r\n              ],\r\n              resetZoom: 'Zrušit lupu',\r\n              weekdays: [\r\n                'neděle',\r\n                'pondělí',\r\n                'úterý',\r\n                'středa',\r\n                'čtvrtek',\r\n                'pátek',\r\n                'sobota',\r\n              ],\r\n              shortMonths: [\r\n                'led',\r\n                'úno',\r\n                'bře',\r\n                'dub',\r\n                'kvě',\r\n                'čer',\r\n                'čvc',\r\n                'srp',\r\n                'zář',\r\n                'říj',\r\n                'lis',\r\n                'pro',\r\n              ],\r\n              shortWeekdays: [\r\n                'ne',\r\n                'po',\r\n                'út',\r\n                'st',\r\n                'čt',\r\n                'pá',\r\n                'so',\r\n              ],\r\n              increaseDateRange: 'alespoň do',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Přednastavení',\r\n            rangeTo: 'do',\r\n            selectDateRange: 'Vyberte časové období',\r\n            predefined: {\r\n              today: 'dnes',\r\n              custom: 'Vlastní rozsah',\r\n              last7days: 'za posledních 7 dní',\r\n              yesterday: 'včera',\r\n              last24Hours: 'za posledních 24 hodin',\r\n              last5Minutes: 'za posledních 5 minut',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Upravit proměnnou',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit proměnnou',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Vybrat jazyk',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit podnik',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Odstranit lokalitu',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Stav',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Nakonfigurovat panel',\r\n            hide: {\r\n              title: 'skrýt',\r\n            },\r\n            show: {\r\n              title: 'zobrazit',\r\n            },\r\n            delete: {\r\n              title: 'vymazat',\r\n            },\r\n            add: {\r\n              fab_title: 'Přidat vlastní kachlíky',\r\n            },\r\n            save: {\r\n              fab_title: 'Uložit konfiguraci',\r\n            },\r\n            move_left: {\r\n              title: 'Přejít na předchozí pozici',\r\n            },\r\n            move_right: {\r\n              title: 'Přejít na další pozici',\r\n            },\r\n            discard: {\r\n              fab_title: 'Zamítnout konfiguraci',\r\n            },\r\n            add_custom_card: {\r\n              save: 'uložit',\r\n              input: 'Zadat název kachlíku',\r\n              title: 'Přidat vlastní kachlíky',\r\n              cancel: 'zrušit',\r\n              missingMachine: 'Vyberte alespoň jeden stroj',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Vyskytla se neočekávaná chyba. Zkuste si stránku načíst znovu.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational Error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Povedlo se',\r\n            },\r\n            e_3xx: {\r\n              message: 'Přesměrování',\r\n            },\r\n            e_400: {\r\n              message: 'Dotaz byl chybný, takže jej nebylo možno zpracovat.',\r\n            },\r\n            e_401: {\r\n              message: 'Neautentifikovaný přístup. Přihlaste se znovu.',\r\n            },\r\n            e_403: {\r\n              message: 'Pro přístup k požadovanému datovému zdroji nemáte oprávnění.',\r\n            },\r\n            e_404: {\r\n              message: 'Požadovaný datový zdroj není k dispozici.',\r\n            },\r\n            e_405: {\r\n              message: 'Nepovolená metoda.',\r\n            },\r\n            e_406: {\r\n              message: 'Postup v případě nepřípustnosti',\r\n            },\r\n            e_409: {\r\n              message: 'Tento datový zdroj již existuje.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Postup v případě nezpracovatelného obsahu',\r\n            },\r\n            e_4xx: {\r\n              message: 'Client error',\r\n            },\r\n            e_500: {\r\n              message: 'Interní chyba serveru.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Server error',\r\n            },\r\n            e_900: {\r\n              message: 'Objekt se nepodařilo založit. Zkuste to znovu později.',\r\n            },\r\n            e_901: {\r\n              message: 'Akce byla zrušena. Nový objekt nebyl založen.',\r\n            },\r\n            e_902: {\r\n              message: 'Akce byla zrušena. Dotaz nebyl odeslán do servisního oddělení.',\r\n            },\r\n            e_903: {\r\n              message: 'Při pokusu o odeslání dotazu do servisního oddělení došlo k chybě. Zkuste to znovu později.',\r\n            },\r\n            e_904: {\r\n              message: \"Objekt '%replaceValue' byl úspěšně založen. Nyní můžete přidat další objekty.\",\r\n            },\r\n            e_905: {\r\n              message: 'Akce byla zrušena. Objekt nebyl aktualizován.',\r\n            },\r\n            e_906: {\r\n              message: \"Objekt '%replaceValue' byl úspěšně přesunut.\",\r\n            },\r\n            e_910: {\r\n              message: 'Při pokusu o založení uživatele došlo k chybě. Zkuste to znovu později.',\r\n            },\r\n            e_911: {\r\n              message: 'Akce byla zrušena. Nový uživatel nebyl založen.',\r\n            },\r\n            e_912: {\r\n              message: 'Při pokusu o aktualizaci objektu došlo k chybě. Zkuste to ještě jednou.',\r\n            },\r\n            e_920: {\r\n              message: 'Akce byla zrušena. Změny nebyl uloženy.',\r\n            },\r\n            e_921: {\r\n              message: 'Vyskytla se neočekávaná chyba. Zkuste to ještě jednou.',\r\n            },\r\n            e_922: {\r\n              message: 'Nesprávné uživatelské jméno a/ nebo heslo. Zkuste to ještě jednou.',\r\n            },\r\n            e_923: {\r\n              message: 'Zadejte uživatelské jméno a heslo.',\r\n            },\r\n            e_924: {\r\n              message: 'Relace byla z důvodu nečinnosti ukončena. Přihlaste se znovu.',\r\n            },\r\n            e_925: {\r\n              message: 'Všechny uživatele SW CloudPlatform žádáme, aby nejprve potvrdili, že souhlasí s našimi zásadami ochrany osobních údajů.',\r\n            },\r\n            e_926: {\r\n              message: 'Váš účet je dočasně zablokován. Zkuste to znovu za pár minut.',\r\n            },\r\n            e_927: {\r\n              message: 'Heslo bylo úspěšně změněno.',\r\n            },\r\n            e_928: {\r\n              message: 'Akce byla zrušena. Soubor nebyl nahrán.',\r\n            },\r\n            e_929: {\r\n              message: 'Při pokusu o nahrání souboru došlo k chybě. Zkuste to znovu později.',\r\n            },\r\n            e_930: {\r\n              message: 'Při pokusu o výmaz souboru došlo k chybě. Zkuste to znovu později.',\r\n            },\r\n            e_931: {\r\n              message: 'Vlastní datový rozsah je příliš velký. Je nastaven výchozí formát 24H',\r\n            },\r\n            e_932: {\r\n              message: 'Objekt obsahuje podřazené prvky. Nejprve odstraňte podřazené prvky.',\r\n            },\r\n            e_933: {\r\n              message: 'Proměnná ‚%replaceValue‘ byla úspěšně vytvořena. Nyní můžete přidat další proměnnou.',\r\n            },\r\n            e_934: {\r\n              message: 'Při odstraňování proměnné se někde stala chyba. Zkuste to znovu za chvilku.',\r\n            },\r\n            e_10500: {\r\n              message: 'Zdá se, že Vám nefunguje internetové připojení. Zkontrolujte si, zda jste správně připojeni.',\r\n            },\r\n            e_10501: {\r\n              message: 'Používáte nepodporovaný internetový prohlížeč. Doporučujeme používat tyto prohlížeče: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'Tento objekt (číslo stroje SW %replaceValue) již existuje.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Soubor s názvem %replaceValue již existuje',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Současně je možno vybrat jen %s prvků',\r\n              title: 'Dosaženo max. počtu',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Časový filtr',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Neexistují žádné soubory.',\r\n              file_cardTitle: 'Události stroje',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Stáhnout data',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'Trasovací soubory NC',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Neexistují žádné alarmy',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'Srovnávací soubory NC',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'Datové soubory NC',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Neexistují žádné soubory.',\r\n              file_cardTitle: 'Soubory ToolMon',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Stáhnout data ToolMon',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Spoušť',\r\n              column_title_filename: 'Název souboru',\r\n              column_title_creation_date: 'Datum vytvoření',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI souborů logu měřených hodnot',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  de: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Abmelden',\r\n        release: \"Am '%replaceValue1' bis '%replaceValue2' werden Wartungsarbeiten an der Plattform durchgeführt. Die Plattform wird in diesem Zeitraum teilweise nicht verfügbar sein.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Schließen',\r\n        acceptLabel: 'Akzeptieren',\r\n        userProfile: 'Benutzerprofil',\r\n        button: {\r\n          clear: 'Diagramm entfernen',\r\n          timeline: 'Grenzwertanpassung',\r\n          separateCharts: 'Separate Diagramme',\r\n        },\r\n        declineLabel: 'Ablehnen',\r\n        backToDashboard: 'Zurück zum Dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/agb/',\r\n            title: 'GTCT / Standards',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Kontakt',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/impressum/',\r\n            title: 'Impressum',\r\n          },\r\n          privacy: {\r\n            title: 'Privatsphäre',\r\n            header: 'Datenschutz-Bestimmungen',\r\n          },\r\n          release: {\r\n            title: 'Veröffentlichungshinweise',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'SW Homepage',\r\n          },\r\n        },\r\n        noInternetConnection: 'Sie scheinen nicht mit dem Internet verbunden zu sein. Bitte verbinden Sie sich und versuchen es erneut.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'von',\r\n          noData: 'Keine Daten',\r\n          search: 'Suche',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'downloaded',\r\n          noDuration: 'keine Dauer verfügbar',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'Ihre Maschine ist nicht lizensiert.',\r\n          alarmPending: 'Alarm anstehend',\r\n          buttons: {\r\n            back: 'Zurück',\r\n            save: 'Speichern',\r\n            view: 'Anzeigen',\r\n            cancel: 'Abbrechen',\r\n            custom: 'Übernehmen + individuelle Auswahl einstellen',\r\n            submit: 'Übernehmen',\r\n            export: {\r\n              limit: 'Download Limits',\r\n              alarms: 'Download Alarme',\r\n              data_warehouse: 'Download Data Warehouse',\r\n              data_warehouse_csv: 'Download Data Warehouse als CSV',\r\n              data_warehouse_json: 'Download Data Warehouse als JSON',\r\n              data_warehouse_excel: 'Download Data Warehouse als Excel',\r\n            },\r\n            import: {\r\n              limit: 'Start',\r\n              alarms: 'Start',\r\n            },\r\n            refreshReset: 'Auf Standardzeit zurücksetzen',\r\n            refreshConfig: 'Zurücksetzen auf Config',\r\n            selectAllCheckboxes: 'Alles auswählen',\r\n            unselectAllCheckboxes: 'Auswahl aufheben',\r\n          },\r\n          notAvailable: 'Nicht verfügbar',\r\n          notConnected: 'Noch nicht verbunden',\r\n          download: {\r\n            file: 'File Downloads',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'Tag',\r\n            days: 'Tage',\r\n            hour: 'Stunde',\r\n            year: 'Jahr',\r\n            hours: 'Stunden',\r\n            month: 'Monat',\r\n            years: 'Jahre',\r\n            minute: 'Minute',\r\n            months: 'Monate',\r\n            second: 'Sekunde',\r\n            minutes: 'Minuten',\r\n            seconds: 'Sekunden',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Verstanden',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Sie können dies nicht rückgängig machen!',\r\n        },\r\n        error: {\r\n          upload: 'Fehlgeschlagene Uploads',\r\n          download: 'Fehlgeschlagene Downloads',\r\n          message: {\r\n            enrollment_code_409: 'Das Gerät ist bereits in aws registriert.',\r\n            limit_change_failed: 'Die Grenzwerte konnten nicht geändert werden. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut oder schreiben Sie eine E-Mail an lifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Zeitaufnahmen',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Variablen auswählen',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Datum',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Secure Attended Access',\r\n            directAccess: 'Direktzugriff',\r\n            new: {\r\n              fields: {\r\n                id: 'ID eingeben',\r\n                cOnePanel: 'mit C|One',\r\n                sessionType: 'Session-Typ',\r\n              },\r\n              error_messages: {\r\n                id: 'Bitte geben Sie eine Session-ID oder Geräte-ID ein',\r\n                sessionType: 'Bitte wählen Sie einen Session-Typ',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: 'Maschinen',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Neue Linie hinzufügen',\r\n            grid: {\r\n              hall: 'Halle',\r\n              line: 'Linie',\r\n              type: 'Typ',\r\n              contractEnd: 'Vertragsende [optional]',\r\n              cellPosition: 'Zelle / Position [optional]',\r\n              operationStep: 'Bearbeitungsschritt',\r\n              machineIdentifierSw: 'Maschinennr. (SW)',\r\n              machineIdentifierCustomer: 'Maschinenname',\r\n            },\r\n            success: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Die Linie wurde erfolgreich angelegt.',\r\n            },\r\n            new_form_title: 'Neue Linie',\r\n            edit_form_title: 'Linie bearbeiten',\r\n            new: {\r\n              fields: {\r\n                name: 'Linienname',\r\n                name_short: 'Linienname (Kurzform) [optional]',\r\n                description: 'Beschreibung [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Bitte geben Sie einen Liniennamen an.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Die Linie wurde erfolgreich aktualisiert.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Neue Halle hinzufügen',\r\n            grid: {\r\n              part: 'Teiletyp',\r\n              lineName: 'Linie',\r\n              typeOfLoading: 'Beladungstyp',\r\n              lineResponsible: 'Linienverantwortlicher',\r\n              plannedQuantity: 'Geplante Menge',\r\n              numberOfMachines: '# Maschinen',\r\n            },\r\n            tabs: {\r\n              list: 'Linien',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Die Halle wurde erfolgreich angelegt.',\r\n            },\r\n            new_form_title: 'Neue Halle',\r\n            shopfloor: {\r\n              edit: 'Bearbeitungsmodus',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Konfiguration speichern',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Konfiguration verwerfen',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Halle bearbeiten',\r\n            new: {\r\n              fields: {\r\n                name: 'Hallenname',\r\n                name_short: 'Hallenname (Kurzform) [optional]',\r\n                description: 'Beschreibung [optional]',\r\n                description_external: 'Beschreibung (extern) [optional]',\r\n                description_internal: 'Beschreibung (intern) [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Bitte geben Sie einen Hallennamen an.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Die Halle wurde erfolgreich aktualisiert.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Beschreibung [optional]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Neues Asset anlegen',\r\n            tabs: {\r\n              info: 'Zeitreihen',\r\n              alarms: 'Alarme',\r\n              events: 'Machine Events',\r\n              gateway: 'Gateway',\r\n              service: 'Service',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Verfügbarkeit Linie',\r\n              'axis-test': 'Achstests',\r\n              collection: 'Kollektionen',\r\n              technology: 'Technology',\r\n              maintenance: 'Wartung',\r\n              performance: 'Performance',\r\n              spindledata: 'Spindeldaten',\r\n              remoteaccess: 'Fernunterstützung',\r\n              enduranceTest: 'End of line test',\r\n              administration: 'Administration',\r\n              y_title: {\r\n                status: 'Status',\r\n                status_table_one: 'Tisch 1',\r\n                status_table_two: 'Tisch 2',\r\n              },\r\n              energymonitoring: 'Energiemonitoring',\r\n              technology_undefined: 'undefiniert',\r\n              technology_undefined_condition: 'Undefinierter Status!',\r\n            },\r\n            move: {\r\n              message: \"Das Asset '%replaceValue' kann in ein neues Unternehmen, Standort, Halle und/oder Linie verschoben werden.\",\r\n              select_hall_label: 'Neue Halle auswählen',\r\n              select_line_label: 'Neue Linie auswählen',\r\n              select_company_label: 'Neues Unternehmen auswählen',\r\n              select_location_label: 'Neuen Standort auswählen',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Maschinennummer (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Lieferung [optional]',\r\n                shipping: 'Versand [optional]',\r\n                controller: 'Steuerung',\r\n                machine_type: 'Maschinentyp',\r\n                warranty_end: 'Garantie-Ende [optional]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'System Manager',\r\n                warranty_start: 'Garantiebeginn [optional]',\r\n                machine_swmp_api: 'Maschinen SWMP API Ende [optional]',\r\n                machine_swsp_trace: 'Maschinen SWSP Trace Ende [optional]',\r\n                machine_swcp_portal: 'Maschinen SWCP Portal Ende [optional]',\r\n                start_of_production: 'Beginn der Produktion [optional]',\r\n                machine_swcp_support: 'Maschinen SWCP Support Ende [optional]',\r\n                machine_cell_position: 'Maschinen Zelle / Position',\r\n                machine_swsp_line_mon: 'Maschinen SWSP LineMon Ende [optional]',\r\n                machine_identifier_customer: 'Maschinen-ID (Kunde)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Bitte geben Sie eine gültige SW-Maschinennummer an (mind. 7 Zeichen: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Bitte wählen Sie eine Steuerung aus.',\r\n                machine_type_not_specified: 'Bitte wählen Sie einen Maschinentyp aus.',\r\n                machine_identifier_customer_not_specified: 'Bitte geben Sie eine Maschinen-ID an.',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Das Asset wurde erfolgreich angelegt.',\r\n            },\r\n            toolmon: {\r\n              score: 'Spindel-Score TISCH 1 & 2',\r\n              state_a_u: 'Teachen aktiv Tisch 1 & 2',\r\n              g_function: 'G-Funktion',\r\n              active_tool: 'Aktives Werkzeug',\r\n              analyzer_ok: 'Analyzer ok',\r\n              bad_workpiece: 'Spindel ohne Werkzeug Tisch 1 & 2',\r\n              spindle_active: 'Spindel-Überwachung aktiv',\r\n              tech_finalized: 'Teachen abgeschlossen Tisch 1 & 2',\r\n              p8_toolmon_active: 'Toolmon aktiv',\r\n              q_axis_and_spindle: 'Q-Achse und Spindel',\r\n              p8_toolmon_skip_step: 'Schritt überspringen',\r\n              target_spindle_speed: 'Spindel-soll-drehzahl',\r\n              p8_toolmon_bad_workpiece: 'Werkstück nicht OK',\r\n              p8_toolmon_delta_t_first_g1: 'Zeitdauer bis G1',\r\n              p8_toolmon_n_encoder_strokes: 'Zähnezahl (HMI)',\r\n              p8_toolmon_analyzer_check_result: 'Analyzer ok',\r\n              p8_tool_breakage_sensitivity_limit: 'Score-Grenzwert (HMI)',\r\n              p8_toolmon_tool_life_and_skip_step: 'Hochgeladene Trigger',\r\n              p8_tool_breakage_step_end_increasing: 'Schrittende zunehmend',\r\n            },\r\n            new_form_title: 'Asset hinzufügen',\r\n            edit_form_title: 'Asset bearbeiten',\r\n            move_form_title: 'Asset verschieben',\r\n            technology: {\r\n              table: 'Tisch',\r\n              change: 'Wechsel',\r\n              g_mode: 'G-Funktion',\r\n              off_time: 'Nebenzeit',\r\n              no_change: 'Kein Wechsel',\r\n              undefined: 'Undefiniert',\r\n              active_tool: 'Aktives Werkzeug',\r\n              analyzer_ok: 'analyzer ok',\r\n              tool_change: 'Werkzeug-Wechsel',\r\n              machining_time: 'Hauptzeit',\r\n              tool_change_time: 'Werkzeugwechselzeit',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Prozesszeit Tisch 1',\r\n                  name_two: 'Prozesszeit Tisch 2',\r\n                  name_one_undefined: 'Undefinierte Prozesszeit Tisch 1',\r\n                  name_two_undefined: 'Undefinierte Prozesszeit Tisch 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q-Achse and Spindel',\r\n              undefined_gmode_data: 'Keine Daten für G-Funktion',\r\n              undefined_table_data: 'Keine Daten für Tisch Zustand',\r\n              auxiliary_process_time: 'Zusätzliche Prozesszeit',\r\n              undefined_analyzer_data: 'Keine Daten für Analyzer',\r\n              undefined_activetool_data: 'Keine Daten für Aktives Werkzeug',\r\n              undefined_tool_change_data: 'Keine Daten für Werkzeug Wechsel',\r\n              undefined_machining_time_table_one: 'Nicht definierter Zustand Tisch 1',\r\n              undefined_machining_time_table_two: 'Nicht definierter Zustand Tisch 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Haupt-, Werkzeugwechsel- & Nebenzeit Tisch 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Haupt-, Werkzeugwechsel- & Nebenzeit Tisch 2',\r\n            },\r\n            editSuccess: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Das Asset wurde erfolgreich aktualisiert.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Versanddatum',\r\n                controller: 'Steuerung',\r\n                contractEnd: 'Vertragsende',\r\n                machineType: 'Maschinentyp',\r\n                startupDate: 'Inbetriebnamedatum',\r\n                warrantyEnd: 'Gewährleistungsende',\r\n                cellPosition: 'Zelle / Position',\r\n                warrantyStart: 'Gewährleistungsbeginn',\r\n                customerNumber: 'Kundennummer',\r\n                enrollmentConfig: 'Enrollment-Konfiguration',\r\n                startOfProduction: 'Beginn der Produktion',\r\n                machineIdentifierSw: 'Maschinennr. SW',\r\n                enrollmentConfigDownload: 'Herunterladen',\r\n                machineIdentifierCustomer: 'Maschinenname Kunde',\r\n              },\r\n            },\r\n            add_line_to_dashboard: 'Linie zum Dashboard hinzufügen',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Einheit',\r\n                value: 'Wert',\r\n                kpiUnit: 'Einheit',\r\n                headline: 'Achstests',\r\n                kpiValue: 'Wert',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Aus dem Browserspeicher laden',\r\n                limitsSave: 'Im Browserspeicher speichern',\r\n                selectAxis: 'Achse auswählen',\r\n                limitsExport: 'Grenzwerte in die Zwischenablage exportieren',\r\n                openAxistest: 'Achstest öffnen',\r\n                axisTestPlural: 'Achstests',\r\n                adjustments: {\r\n                  add: 'Lokale Anpassung hinzufügen',\r\n                  range: 'Reichweite',\r\n                  header: 'Lokale Anpassung',\r\n                  remove: 'Entfernen',\r\n                  position: 'Position',\r\n                  amplitude: 'Amplitude',\r\n                  spreadMultiplier: 'Limit-Multiplikator',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Position',\r\n                    y: 'Strom',\r\n                    up: 'Positive',\r\n                    down: 'Negative',\r\n                    limitsUp: 'begrenzt die positive Richtung',\r\n                    limitsDown: 'begrenzt die negative Richtung',\r\n                    sliderSlopeCenter: 'Kurvenursprung',\r\n                    sliderSlopeFactor: 'Kurvenfaktor',\r\n                    sliderVerticalOffset: 'Y-Versatz',\r\n                    sliderVerticalSpread: 'Breite begrenzen',\r\n                    sliderQuadraticCenter: 'Quadratischer Ursprung',\r\n                    sliderQuadraticFactor: 'Quadratischer Faktor',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Uhrzeigersinn',\r\n                    limitsClockwise: 'Grenzen im Uhrzeigersinn',\r\n                    counterClockwise: 'Gegen d. Uhrzeigersinn',\r\n                    sliderSineOffset: 'Wellenversatz',\r\n                    sliderSineAmplitude: 'Wellenamplitude',\r\n                    sliderSineFrequency: 'Wellenfrequenz',\r\n                    sliderVerticalOffset: 'Y-Versatz',\r\n                    sliderVerticalSpread: 'Breite begrenzen',\r\n                    limitsCounterClockwise: 'Grenzen gegen den Uhrzeigersinn',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Geschwindigkeit',\r\n                  pulseMaxRampUp: 'Rampe ->',\r\n                  pulseMaxRampDown: 'Rampe <-',\r\n                  pulseMaxStiffness: 'Steifigkeit maximal',\r\n                  pulseMinStiffness: 'Steifigkeit minimal',\r\n                  pulseMeanStiffness: 'Steifigkeit Ø',\r\n                  circularReversalRange: 'Kreisumkehrspanne',\r\n                  pulseMaxUpPathCurrent: 'Strom maximal ->',\r\n                  pulseMinUpPathCurrent: 'Strom minimal ->',\r\n                  pulseMeanUpPathCurrent: 'Strom Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Strom maximal <-',\r\n                  pulseMinDownPathCurrent: 'Strom minimal <-',\r\n                  pulseMeanDownPathCurrent: 'Strom Ø <-',\r\n                  circularShapeDeviationClockwise: 'Kreisformabweichung im Uhrzeigersinn',\r\n                  pulseStiffnessStandardDeviation: 'Steifigkeit σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Strom σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Strom σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Kreisformabweichung gegen d. Uhrzeigersinn',\r\n                },\r\n                measurementSeries: [\r\n                  'ohne Gruppierung',\r\n                  'vor Geometrie',\r\n                  'nach Geometrie',\r\n                  'IB-Ende',\r\n                  'FingerPrint',\r\n                ],\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Kreisformtest',\r\n                  EQUABILITY: 'Gleichlauftest',\r\n                  CIRCULARITY: 'Kreisformtest',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Kein Achstest dieses Typs verfügbar',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'Im Fehlerfall wenden Sie sich bitte an',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Bitte stellen Sie uns die Daten über das Netcfg-Formular zur Verfügung.',\r\n                  intro: 'Um Ihre Maschine anbinden zu können, sind wir auf Ihre Angaben zur Netzwerkkonfiguration angewiesen.',\r\n                  title: 'Netzwerkkonfiguration',\r\n                  goToNetconfig: 'Netzwerkkonfiguration öffnen',\r\n                },\r\n                device: {\r\n                  title: 'Gerätedetails',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Wenn das IoT Gateway so aussieht, führen Sie bitte folgende Schritte aus:',\r\n                  line1: 'Laden Sie die Enrollment-Datei herunter, indem Sie auf die Schaltfläche am unteren Rand der Kachel klicken.',\r\n                  line2: 'Der Download startet automatisch.',\r\n                  line3: 'Legen Sie die .json-Datei im Stammverzeichnis auf einem USB-Stick ab. Stellen Sie sicher, dass die Datei benannt ist:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Stellen Sie sicher, dass sich die folgenden Dateien im Stammverzeichnis des USB-Sticks befinden:',\r\n                  line6: 'Stecken Sie den USB-Stick in das entsprechende IoT-Gateway.',\r\n                  line7: 'Das Einlernen startet automatisch, was durch eine blinkende grüne user LED signalisiert wird.',\r\n                  line8: 'Nach erfolgreicher Anmeldung leuchtet die grüne LED, bis der USB-Stick entfernt wird.',\r\n                  title: 'Enrollment',\r\n                  button: 'Enrollment-datei',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Laden Sie die Datei „migrate-iot.zip“ herunter und extrahieren Sie deren Inhalt direkt auf einen leeren USB-Stick.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Laden Sie auch die ',\r\n                  line4: ' herunter und fügen diese auf den USB-Stick hinzu. Stellen Sie sicher, dass die Datei wie folgt benannt ist:',\r\n                  line5: 'Stellen Sie sicher, dass sich die folgenden Dateien im Stammverzeichnis des USB-Sticks befinden:',\r\n                  line6: 'install.json',\r\n                  line7: 'aws-migrate-iot.tar.gz',\r\n                  line8: 'aws-migrate-iot.tar.gz.sig',\r\n                  line9: 'aws.json',\r\n                  title: 'Plattform-Migration',\r\n                  line10: 'Die Dateien wurden am 27.10.2023 geändert. Bitte laden Sie diese unbedingt erneut herunter und verwenden Sie nicht die alte Version.',\r\n                  line11: 'Stecken Sie den USB-Stick in das entsprechende IoT-Gateway.',\r\n                  line12: 'Die Software installiert sich automatisch, was durch eine blinkende gelbe LED signalisiert wird.',\r\n                  line13: 'Nach erfolgreicher Migration leuchtet die grüne LED bis der USB-Stick entfernt wird.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generieren',\r\n                headline: 'Zeitreihen',\r\n                noChartMessage: 'Um die gewünschten Daten anzuzeigen, wählen Sie eine oder mehrere Variablen aus und klicken Sie auf Generieren',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarme',\r\n              },\r\n              service: {\r\n                contact: 'Bitte kontaktieren Sie',\r\n                headline: 'Service',\r\n                update: {\r\n                  title: 'Datei aktualisieren',\r\n                },\r\n                upload: {\r\n                  title: 'Datei hochladen',\r\n                  fields: {\r\n                    file: 'Datei',\r\n                    language: 'Dateisprache',\r\n                    file_name: 'Dateiname',\r\n                    list_of_languages: {\r\n                      cs: 'Kroatisch',\r\n                      cz: 'Tschechisch',\r\n                      da: 'Dänisch',\r\n                      de: 'Deutsch',\r\n                      en: 'Englisch',\r\n                      es: 'Spanisch',\r\n                      fr: 'Französisch',\r\n                      hu: 'Ungarisch',\r\n                      it: 'Italienisch',\r\n                      ko: 'Koreanisch',\r\n                      mk: 'Mazedonisch',\r\n                      nl: 'Niederländisch',\r\n                      pl: 'Polnisch',\r\n                      pt: 'Portugiesisch',\r\n                      ro: 'Rumänisch',\r\n                      sk: 'Slowakisch',\r\n                      sl: 'Slowenisch',\r\n                      sv: 'Schwedisch',\r\n                      tr: 'Türkisch',\r\n                      zh: 'Chinesisch',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Hochladen',\r\n                    cancel: 'Abbrechen',\r\n                  },\r\n                  success: {\r\n                    title: 'Erfolgreich',\r\n                    button: 'Zurück zur Serviceübersicht',\r\n                    message: 'Die Datei wurde erfolgreich hochgeladen',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Bitte geben Sie einen Dateinamen an.',\r\n                    file_not_valid: 'Bitte geben Sie eine Datei an / Bitte wählen Sie eine kleinere Datei aus.',\r\n                    language_not_specified: 'Bitte geben Sie eine Dateisprache an.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Handbücher',\r\n                },\r\n                version: {\r\n                  title: 'Version dateien',\r\n                },\r\n                contracts: {\r\n                  title: 'Verträge',\r\n                },\r\n                components: {\r\n                  title: 'Komponenten Hard- und Software',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Ersatzteilliste',\r\n                },\r\n                consumeables: {\r\n                  title: 'Betriebsstoffe',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Aktualisieren',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Um eine Maschine für den Fernzugriff zu aktivieren, muss TeamViewer auf dem IoT-Gateway installiert sein. ',\r\n                  line2: 'Sollte dies noch nicht der Fall sein, installieren Sie TeamViewer, indem Sie einfach auf „Installieren“ klicken.',\r\n                  title: 'Installieren Sie die Fernunterstützung',\r\n                  status: 'Deployment status',\r\n                  copy: {\r\n                    button: 'Link kopieren',\r\n                  },\r\n                  install: {\r\n                    button: 'Teamviewer installieren',\r\n                  },\r\n                  session: {\r\n                    button: 'Session starten',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT Gateway',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Betriebssystem',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Brauchen Sie Hilfe mit Ihrer Maschine?',\r\n                  line2: 'Kontaktieren Sie uns!',\r\n                  title: 'Nachricht an SW-Service',\r\n                  button: 'Service kontaktieren',\r\n                  fields: {\r\n                    name: 'Maschinennummer (SW)',\r\n                    type: 'Anfragetyp',\r\n                    email: 'E-Mail',\r\n                    message: 'Nachricht',\r\n                    phone_no: 'Telefonnummer',\r\n                    last_name: 'Nachname',\r\n                    first_name: 'Vorname',\r\n                    contact_person: 'Ansprechpartner (SW) [optional]',\r\n                    list_of_types: {\r\n                      request: 'Allgemeine Anfrage',\r\n                      service: 'Service',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Erweiterung',\r\n                      inspection: 'Inspektion',\r\n                    },\r\n                    machine_identifier_customer: 'Maschinen-ID (Kunde) [optional]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Anfrage senden',\r\n                    cancel: 'Abbrechen',\r\n                  },\r\n                  success: {\r\n                    title: 'Erfolgreich!',\r\n                    button: 'Zurück zur Service-Übersicht',\r\n                    message: 'Die Anfrage wurde erfolgreich an den SW-Service übermittelt.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Bitte geben Sie eine gültige E-Mail-Adresse an.',\r\n                    name_not_specified: 'Bitte geben Sie eine gültige SW-Maschinennummer an (mind. 7 Zeichen: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Bitte geben Sie eine gültige Telefonnummer an',\r\n                    message_not_specified: 'Bitte geben Sie eine Nachricht an.',\r\n                    last_name_not_specified: 'Bitte geben Sie einen Nachnamen an.',\r\n                    first_name_not_specified: 'Bitte geben Sie einen Vornamen an.',\r\n                    family_name_not_specified: 'Bitte geben Sie einen Nachnamen an.',\r\n                    contact_type_not_specified: 'Bitte geben Sie einen Anfragetyp an.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Software Maschine',\r\n                  values: {\r\n                    nc_version: 'NC-Version',\r\n                    hmi_version: 'HMI-Version',\r\n                    plc_version: 'PLC-Version',\r\n                    compile_cycles: 'Compile-Zyklen',\r\n                    operating_system: 'Betriebssystem',\r\n                    pcu_base_version: 'PCU-Base-Version',\r\n                    plc_toolbox_version: 'PLC-Toolbox',\r\n                    plc_user_program_version: 'PLC-Benutzerprogramm',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Der Name der Datei wurde erfolgreich geändert',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Remote support',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'Der Handlungsassistent hilft Ihnen bei der Problemlösung.',\r\n                  title: 'Handlungsassistent',\r\n                  sub_title: 'Haben Sie momentan Schwierigkeiten mit einem Ihrer Assets?',\r\n                  open_assistant: 'Handlungsassistent öffnen',\r\n                  request_account: 'Account beantragen',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Spindelstatistiken SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'an',\r\n                labelOffline: 'aus',\r\n              },\r\n              swimlane: {\r\n                headline: 'Verfügbarkeit Linie',\r\n              },\r\n              endurance: {\r\n                headline: 'End of line test',\r\n                chartTitles: {\r\n                  runtime: 'Laufzeitmonitor',\r\n                  endurance: 'End of line test',\r\n                  operation: 'Betriebsart',\r\n                  qaxis_180: 'Q-Achse 180°',\r\n                  nc_program: 'NC-Programm',\r\n                  stacklights: 'Rufleuchte',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Sende-Status',\r\n                aborted: 'abgebrochen',\r\n                sending: 'sendet',\r\n                undefined: 'nicht definiert',\r\n                interrupted: 'unterbrochen',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Alarm Map',\r\n              },\r\n              collection: {\r\n                headline: 'Kollektion',\r\n                noChartMessage: 'Bitte wählen Sie eine Kollektion auf der linken Seite.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Summe',\r\n                  header: 'Performance Kpi',\r\n                  target: 'Soll',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarme',\r\n                  category: [\r\n                    'Nicht klassifiziert',\r\n                    'Fehlermeldung',\r\n                    'Betriebsmeldung',\r\n                    'Statusmeldung',\r\n                    'Bedienungsanweisung',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Anstehdauer',\r\n                    flatlist: 'Flache Liste',\r\n                    frequency: 'Auftrittshäufigkeit',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Zeit',\r\n                    trend: 'Trend',\r\n                    duration: 'Anstehdauer',\r\n                    leftTime: 'Alarm geht',\r\n                    alarmCount: 'Anzahl',\r\n                    alarmNumber: 'Alarm-Nr.',\r\n                    description: 'Beschreibung',\r\n                    alarmOccured: 'Alarm ist aufgetreten',\r\n                    alarmClassification: 'Alarmklassifizierung',\r\n                    alarmCountSecondRange: 'Anzahl T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'ansteigend',\r\n                      down: 'absteigend',\r\n                      flat: 'gleichbleibend',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Details',\r\n                  ncProgram: 'NC-Programm',\r\n                  lastModified: 'Letzte Wertaufzeichnung',\r\n                  machineState: 'Maschinenzustand',\r\n                  numberAlarms: 'Alarme anstehend',\r\n                  stopCondition: 'Haltebedingungen',\r\n                  ncProgramState: 'NC-Programmstatus',\r\n                  protectionLevel: 'Schutzstufe',\r\n                  ncProgramStates: [\r\n                    'abgebrochen',\r\n                    'angehalten',\r\n                    'läuft',\r\n                    'wartend',\r\n                    'unterbrochen',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'System',\r\n                    'Hersteller',\r\n                    'Service',\r\n                    'Anwender',\r\n                    'Schlüsselschalter Stellung 3',\r\n                    'Schlüsselschalter Stellung 2',\r\n                    'Schlüsselschalter Stellung 1',\r\n                    'Schlüsselschalter Stellung 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Zykluszeit',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Zykluszeit in s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'NOK.',\r\n                  sum: 'Summe',\r\n                  title: 'Werkstückzähler',\r\n                  titleDayCounter: 'Tageszähler',\r\n                  titleShiftCounter: 'Schichtzähler',\r\n                  titleTotalCounter: 'Gesamtzähler',\r\n                  titleTotalCounterSmall: 'Gesamt',\r\n                },\r\n                availability: {\r\n                  title: 'Verfügbarkeit',\r\n                  kpi: {\r\n                    title: 'Verfügbarkeit KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG mit Fehler',\r\n                    MDA_with_error: 'MDA mit Fehler',\r\n                    JOG_without_error: 'JOG ohne Fehler',\r\n                    MDA_without_error: 'MDA ohne Fehler',\r\n                    not_defined_condition: 'Nicht definierter Zustand',\r\n                    auto_no_program_active: 'AUTO Kein Programm aktiv',\r\n                    auto_waiting_for_parts: 'AUTO Warte auf Teile',\r\n                    auto_with_error_program_stopped: 'AUTO mit Fehler - Programm angehalten',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO Warte auf Teile + Stoppfehler',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Aggregierte Verfügbarkeit',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Verfügbarkeit',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Status',\r\n                },\r\n                operationMode: {\r\n                  title: 'Betriebsart',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Betriebsart',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Laufzeitmonitor',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Programm',\r\n                      labels: {\r\n                        on: 'an',\r\n                        off: 'aus',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Spindel Override',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Vorschub Override',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administration',\r\n                headline: 'Administration',\r\n                aws: {\r\n                  title: 'AWS Links',\r\n                },\r\n                groups: {\r\n                  title: 'Thing-Groups',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Systems Manager',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Stückliste',\r\n                },\r\n                component: {\r\n                  title: 'Komponenten',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Wartung',\r\n              },\r\n              spindleData: {\r\n                headline: 'Spindeldaten',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Fernunterstützung',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Zeit vor Alarm (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Zeit nach Alarm (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Energie monitoring',\r\n                chartTitles: {\r\n                  air: 'Druckluftverbrauch',\r\n                  current: 'Stromverbrauch',\r\n                  consumption: 'Durchschnittlicher Verbrauch pro Stunde',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Zustandsüberwachung',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Neues Unternehmen hinzufügen',\r\n            grid: {\r\n              city: 'Ort',\r\n              email: 'E-Mail',\r\n              street: 'Anschrift',\r\n              country: 'Land',\r\n              website: 'Webseite',\r\n              postalCode: 'Postleitzahl',\r\n              locationName: 'Standort',\r\n              locationCustomerNumber: 'Kundennummer',\r\n            },\r\n            tabs: {\r\n              list: 'Standorte',\r\n              worldmap: 'Weltkarte',\r\n            },\r\n            success: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Das Unternehmen wurde erfolgreich angelegt.',\r\n            },\r\n            toggle_switch: 'Einen Standort mit denselben Daten erzeugen',\r\n            new_form_title: 'Neues Unternehmen',\r\n            edit_form_title: 'Unternehmen bearbeiten',\r\n            new: {\r\n              fields: {\r\n                city: 'Stadt',\r\n                name: 'Name des Unternehmens',\r\n                email: 'E-Mail [optional]',\r\n                state: 'Bundesland [optional]',\r\n                street: 'Anschrift',\r\n                country: 'Land',\r\n                website: 'Webseite [optional]',\r\n                zipcode: 'Postleitzahl',\r\n                legal_form: 'Rechtsform [optional]',\r\n                name_short: 'Name des Unternehmens (kurz) [optional]',\r\n                description: 'Beschreibung [optional]',\r\n                company_logo: 'Unternehmenslogo (URL) [optional]',\r\n                customer_number: 'Kundennummer',\r\n                industry_sector: 'Industriesektor',\r\n                description_external: 'Beschreibung (extern) [optional]',\r\n                description_internal: 'Beschreibung (intern) [optional]',\r\n              },\r\n              error_messages: {\r\n                url: 'Bitte geben Sie eine gültige URL an.',\r\n                email: 'Bitte geben Sie eine gültige E-Mail Adresse an.',\r\n                city_not_specified: 'Bitte geben Sie eine Stadt an.',\r\n                name_not_specified: 'Bitte geben Sie einen Unternehmensnamen an.',\r\n                street_not_specified: 'Bitte geben Sie eine Anschrift an.',\r\n                country_not_specified: 'Bitte geben Sie ein Land an.',\r\n                zipcode_not_specified: 'Bitte geben Sie eine Postleitzahl an.',\r\n                customer_number_not_specified: 'Bitte geben Sie eine Kundennummer an.',\r\n                industry_sector_not_specified: 'Bitte geben Sie einen Industriesektor an.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Das Unternehmen wurde erfolgreich aktualisiert.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-Mail',\r\n                address: 'Anschrift',\r\n                country: 'Land',\r\n                website: 'Webseite',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'Die SW CloudPlatform stellt dieses Unternehmen auf einer Karte dar und verwendet hierfür den Längen- und Breitengrad.',\r\n              intro_heading: 'Informationen zum Ort',\r\n              location_name: 'Name des Orts:',\r\n              label_latitude: 'Breitengrad',\r\n              label_longitude: 'Längengrad',\r\n              text_fallback_info: 'Falls nicht, werden die Standardkoordinaten verwendet.',\r\n              text_location_found: 'Ein Ort wurde gefunden.',\r\n              text_location_entered: 'Der Ort wurde angegeben.',\r\n              text_success_location: 'Folgende Daten wurden gesetzt:',\r\n              button_define_coordinates: 'Koordinaten selbst eintragen',\r\n              text_no_coordinates_found: 'Es wurden keine Koordinaten zu den eingetragenen Daten gefunden.',\r\n              text_coordinates_success_set: 'Koordinaten gesetzt.',\r\n              button_set_custom_coordinates: 'Koordinaten setzen',\r\n              text_specify_coordinates_yourself: 'Alternativ können Sie die Koordinaten selbst eingeben.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Neuen Standort hinzufügen',\r\n            tabs: {\r\n              list: 'Hallen',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Halle',\r\n            },\r\n            success: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Der Standort wurde erfolgreich angelegt.',\r\n            },\r\n            new_form_title: 'Neuer Standort',\r\n            edit_form_title: 'Standort bearbeiten',\r\n            new: {\r\n              fields: {\r\n                city: 'Stadt',\r\n                name: 'Standortname',\r\n                email: 'E-Mail [optional]',\r\n                state: 'Bundesland [optional]',\r\n                street: 'Anschrift',\r\n                country: 'Land',\r\n                website: 'Webseite [optional]',\r\n                zipcode: 'Postleitzahl',\r\n                language: 'Sprache [optional]',\r\n                name_short: 'Standortname (Kurzform) [optional]',\r\n                description: 'Beschreibung [optional]',\r\n                customer_number: 'Kundennummer [optional]',\r\n                description_internal: 'Beschreibung (intern) [optional]',\r\n              },\r\n              error_messages: {\r\n                email: 'Bitte geben Sie eine gültige E-Mail Adresse an.',\r\n                city_not_specified: 'Bitte geben Sie eine Stadt an.',\r\n                name_not_specified: 'Bitte geben Sie einen Standortnamen an.',\r\n                street_not_specified: 'Bitte geben Sie eine Anschrift an.',\r\n                country_not_specified: 'Bitte geben Sie ein Land an.',\r\n                zipcode_not_specified: 'Bitte geben Sie eine Postleitzahl an.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Erfolgreich!',\r\n              button: 'Zurück zur Liste',\r\n              message: 'Der Standort wurde erfolgreich aktualisiert.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Anschrift',\r\n                country: 'Land',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Ort',\r\n              email: 'E-Mail',\r\n              street: 'Anschrift',\r\n              country: 'Land',\r\n              website: 'Webseite',\r\n              postalCode: 'Postleitzahl',\r\n              companyName: 'Unternehmen',\r\n            },\r\n            tabs: {\r\n              list: 'Unternehmen',\r\n              worldmap: 'Weltkarte',\r\n            },\r\n            map: {\r\n              description_not_available: 'Keine Beschreibung vorhanden',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Hinzufügen',\r\n                back: 'Zurück zur Liste',\r\n                edit: 'Aktualisieren',\r\n                save: 'Speichern',\r\n                email: 'Bild senden',\r\n                cancel: 'Abbrechen',\r\n                addMultiple: 'Hinzufügen + Neu',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Admin bearbeiten',\r\n          },\r\n          tooltip: {\r\n            chartTitleIconText: {\r\n              bad: {\r\n                plus: [\r\n                  null,\r\n                  '1: ohne Werkzeug',\r\n                ],\r\n                minus: [\r\n                  '0: alles ok, Werkzeug wurde erkannt',\r\n                  '-1: Referenz nicht gefunden',\r\n                  '-2: Messdaten leer',\r\n                  '-3: Ungültige Datenlänge',\r\n                  null,\r\n                  '-4: Unbekannter Value Error',\r\n                  '-6: Unbekannte Expetion',\r\n                ],\r\n              },\r\n              score: {\r\n                minus: [\r\n                  '>=0: Spindel-Score',\r\n                  '-1: Referenz nicht gefunden',\r\n                  '-2: Messdaten leer',\r\n                  '-3: Ungültige Datenlänge',\r\n                  '-4: Unbekannter Value Error',\r\n                  '-5: Ungültiger Score-Wert',\r\n                  '-6: Unbekannte Expetion',\r\n                ],\r\n              },\r\n            },\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Qualitätssicherung',\r\n          users: 'Benutzerverwaltung',\r\n          assets: 'Asset-Verwaltung',\r\n          settings: 'Einstellungen',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Benutzerprofil',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Benutzerverwaltung',\r\n          assets: 'Asset-Verwaltung',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Benutzerprofil',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: 'Area',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Linie',\r\n          long: 'Long',\r\n          real: 'REAL',\r\n          true: 'Aktiv',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inaktiv',\r\n          float: 'Float',\r\n          short: 'short',\r\n          state: 'Status',\r\n          uword: 'UWORD',\r\n          '840dsl': 'Sinumerik 840dsl',\r\n          double: 'Double',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          string: 'String',\r\n          boolean: 'Boolean',\r\n          integer: 'Integer',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Extern',\r\n          internal: 'Intern',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Ein Jahr',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          fab_title: 'Neue variable hinzufügen',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Ein Monat',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rectangle',\r\n          tabs: {\r\n            list: 'Variablen-Liste',\r\n          },\r\n          ten_years: 'Zehn Jahre',\r\n          two_weeks: 'Zwei Wochen',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Sechs Monate',\r\n          categorical: 'Categorical',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Beim Erstellen einer Variable ist ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal.',\r\n          },\r\n          new: {\r\n            fields: {\r\n              row: 'Row',\r\n              hint: '(Änderungen können die Maschine beschädigen)',\r\n              tags: 'Tags',\r\n              unit: 'Unit',\r\n              column: 'Column',\r\n              showId: 'Zeige Variablen Id Eingabefeld',\r\n              address: 'Adresse',\r\n              maxTime: 'Max. Zeit',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Datentyp',\r\n              language: 'Sprache',\r\n              nckBlock: 'NCK Block',\r\n              onChange: 'On Change',\r\n              rowCount: 'Row Count',\r\n              chartType: 'Diagrammtyp',\r\n              bufferSize: 'Buffer Size',\r\n              namePrefix: 'Namenspräfix',\r\n              uiRelevant: 'UI Relevant',\r\n              variableId: 'Variablen-ID',\r\n              displayName: 'Anzeigename',\r\n              intervalInS: 'Intervall (in sekunden)',\r\n              machineType: 'Maschinentyp',\r\n              showInitial: 'Initial Anzeigen',\r\n              opcUaAddress: 'OPC UA Adresse',\r\n              brokerDataType: 'Broker Datentyp',\r\n              classicAddress: 'Klassische Adresse',\r\n              visibilityType: 'Sichtbarkeitstyp',\r\n              descriptionText: 'Beschreibung',\r\n              machineDataType: 'Maschine Datentyp',\r\n              symbolicAddress: 'Symbolische Adresse',\r\n              dataTypeSelection: 'Datentyp',\r\n            },\r\n            buttons: {\r\n              delete: 'Variable löschen',\r\n              addMachineType: 'Neuer Maschinentyp',\r\n              removeDescription: 'Beschreibung löschen',\r\n              removeMachineType: 'Entferne Maschinentyp',\r\n            },\r\n            error_messages: {\r\n              row: 'Bitte geben Sie einen a row an.',\r\n              unit: \"Bitte geben Sie eine 'unit' an.\",\r\n              column: 'Bitte geben Sie eine Spalte an.',\r\n              address: 'Bitte wählen Sie eine Adresse',\r\n              maxTime: 'Bitte wählen Sie eine max. Zeit aus.',\r\n              nckArea: 'Bitte geben Sie eine NCK Area an.',\r\n              dataType: 'Bitte wählen Sie einen Datentyp aus.',\r\n              language: 'Sprache ist erforderlich',\r\n              nckBlock: 'Bitte geben Sie eine NCK Block an.',\r\n              rowCount: \"Bitte geben Sie eine 'row count' an.\",\r\n              chartType: 'Bitte wählen Sie einen Diagrammtyp aus.',\r\n              bufferSize: 'Bitte geben Sie eine Puffer größe an.',\r\n              namePrefix: 'Bitte geben Sie einen gültige Namen an (Erlaubte Zeichen: A-Z, _).',\r\n              variableId: 'Bitte geben Sie eine gültige UUID an',\r\n              displayName: 'Bitte geben Sie einen Anzeigename an.',\r\n              intervalInS: 'Bitte geben Sie einen Intervall (in sekunden) an.',\r\n              machineType: 'Bitte wählen Sie einen Maschinentyp aus.',\r\n              showInitial: \"Bitte wählen Sie aus, ob die 'Initial' gezeigt werden soll\",\r\n              opcUaAddress: 'Bitte geben Sie eine OPC UA Adresse an.',\r\n              allLocalesUsed: 'Alle verfügbaren Sprachen sind bereits in Gebrauch.',\r\n              brokerDataType: 'Bitte wählen Sie einen Broker Datentyp aus.',\r\n              classicAddress: 'Bitte wählen Sie eine Classic Adresse',\r\n              namePrefixEdit: 'Bitte geben Sie einn gültige Namen an (Erlaubte Zeichen: A-Z a-z, _).',\r\n              visibilityType: 'Bitte wählen Sie einen Sichtbarkeitstyp aus.',\r\n              descriptionText: 'Beschreibung ist erforderlich.',\r\n              machineDataType: 'Bitte wählen Sie einen Maschinen-Datentyp aus.',\r\n              symbolicAddress: 'Bitte wählen Sie eine Symbolische Adresse',\r\n              dataTypeSelection: 'Bitte wählen Sie einen Datentyp',\r\n              minOneDescription: 'Es muss mindestens eine Beschreibung vorhanden sein.',\r\n            },\r\n            descriptionInstance: 'Beschreibungen',\r\n            machineTypeInstance: 'Machine Type',\r\n          },\r\n          new_form_title: 'Neue Variable',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Variable bearbeiten',\r\n          success: {\r\n            message: 'Die Variable wurde erfolgreich erstellt',\r\n          },\r\n          editError: {\r\n            message: 'Beim Aktualisieren einer Variable ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.',\r\n          },\r\n          editSuccess: {\r\n            message: 'Die Variable wurde erfolgreich aktualisiert',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Erfolgreiche Uploads',\r\n          downloads: 'Erfolgreiche Downloads',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie, die Seite neu zu laden.',\r\n            },\r\n            s_1: {\r\n              message: 'Die Änderungen wurden gespeichert.',\r\n            },\r\n            s_930: {\r\n              message: \"Asset '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_931: {\r\n              message: \"Unternehmen '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_932: {\r\n              message: \"Linie '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_933: {\r\n              message: \"Halle '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_934: {\r\n              message: \"Standort '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_935: {\r\n              message: \"Datei '%replaceValue' wurde erfolgreich gelöscht.\",\r\n            },\r\n            s_937: {\r\n              message: 'Shopfloor wurde erfolgreich aktualisiert.',\r\n            },\r\n            s_938: {\r\n              message: 'Die Kollektion „%replaceValue“ wurde erfolgreich gelöscht.',\r\n            },\r\n            s_936: {\r\n              message_variables: 'Die Variable „%replaceValue“ wurde erfolgreich gelöscht.',\r\n              message_collections: 'Die Kollektion „%replaceValue“ wurde erfolgreich gelöscht.',\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Doppelte Karten wurden gelöscht!',\r\n            add_line_to_dashboard: 'Linie wurde zum Dashboard hinzugefügt',\r\n          },\r\n        },\r\n        common: {\r\n          external: 'External',\r\n          internal: 'Internal',\r\n          new: {\r\n            fields: {\r\n              language: 'Sprache',\r\n              descriptions: 'Beschreibungen',\r\n              visibilityType: 'Sichtbarkeitstyp',\r\n              descriptionText: 'Beschreibung',\r\n            },\r\n            buttons: {\r\n              addDescription: 'Beschreibung hinzufügen',\r\n              removeDescription: 'Beschreibung löschen',\r\n            },\r\n            error_messages: {\r\n              language: 'Sprache ist erforderlich',\r\n              invalidId: 'Bitte geben Sie eine gültige UUID an',\r\n              allLocalesUsed: 'Alle verfügbaren Sprachen sind bereits in Gebrauch.',\r\n              visibilityType: 'Bitte wählen Sie einen Sichtbarkeitstyp aus.',\r\n              descriptionText: 'Beschreibung ist erforderlich.',\r\n            },\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limits',\r\n            type: 'Wählen Sie nach Typ aus',\r\n            alarms: 'Alarme',\r\n            machine: 'Wählen Sie nach Maschinen-ID aus',\r\n            variables: 'Variablen',\r\n            listImport: 'Limits Import',\r\n            listDownload: 'Limits Download',\r\n            data_warehouse: 'Datawarehouse',\r\n          },\r\n          text: {\r\n            text: 'Grenzwerte sind Werte, die Sie für Variablen festlegen, die Sie interessieren. Wenn eine Variable nicht innerhalb der definierten Grenzwerte liegt, erhalten Sie eine Benachrichtigung. Grenzwerte werden auch in Diagrammen angezeigt, die auf der Registerkarte „Zeitreihen“ generiert werden.',\r\n            title: 'Limits',\r\n          },\r\n          export: {\r\n            text: 'Sie können jederzeit die aktuell eingestellten Grenzwerte für alle in der Cloud Platform vorhandenen Variablen exportieren. Sie können diese Liste als Referenz verwenden oder sie verwenden, um alle Grenzwerte auf einmal im Abschnitt „Grenzwerte als CSV importieren“ zu importieren.',\r\n            title: 'Export Limits als CSV',\r\n          },\r\n          import: {\r\n            text: 'Sie können eine zuvor heruntergeladene CSV-Datei mit Informationen zu Limits und Abonnenten importieren, um die aktuell gespeicherten Werte zu aktualisieren. Sie können später auswählen, auf welche Anlagen- oder Maschinentypen Sie die importierten Grenzwerte anwenden möchten',\r\n            title: 'Grenzwerte aus CSV importieren',\r\n            machines: {\r\n              title: 'Wählen Sie die Maschinen oder den Maschinentyp aus, auf die Sie die Grenzwerte anwenden möchten.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Wählen Sie die CSV-Datei aus, die Sie importieren möchten',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Gehen Sie zur gewünschten Linie in der Asset-Verwaltung.',\r\n            two: 'In der Überschriftenzeile finden Sie ein Kontextmenü.',\r\n            four: 'Die Kachel der Line wird zum Dashboard hinzugefügt.',\r\n            three: 'Klicken Sie auf das Kontextmenü und wählen Sie „Zum Dashboard hinzufügen”.',\r\n            header: 'Hinzufügen von Linienkacheln',\r\n          },\r\n          individual: {\r\n            one: 'Klicken Sie auf das „Zahnrad“-Symbol, auf der linken Seite.',\r\n            two: 'Wählen Sie das „Plus“-Symbol.',\r\n            four: 'Bestätigen Sie mit „Speichern“. Die einzelne Kachel wird zum Dashboard hinzugefügt.',\r\n            three: 'Benennen Sie Ihre Kachel und fügen Sie Ihre gewünschten Maschinen hinzu.',\r\n            header: 'Hinzufügen von individuellen Kacheln',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Neuen Benutzer anlegen',\r\n          new: {\r\n            title: 'Nutzer anlegen',\r\n            status: 'Benutzerstatus:',\r\n            buttons: {\r\n              add: 'Hinzufügen',\r\n              back: 'Zurück zur Liste',\r\n              save: 'Speichern',\r\n              cancel: 'Abbrechen',\r\n              delete: 'Nutzer löschen',\r\n              sendMail: 'Mail erneut senden',\r\n            },\r\n            fields: {\r\n              email: 'E-Mail',\r\n              roles: 'Nutzergruppe',\r\n              gender: 'Geschlecht',\r\n              created: 'Erstellt',\r\n              lastName: 'Nachname',\r\n              firstName: 'Vorname',\r\n              breadcrumb: 'Zeige Navigation',\r\n              main_group: 'Main group',\r\n              phoneNumber: 'Telefonnummer [optional]',\r\n              customer_org: 'Kundenorganisation',\r\n              last_modified: 'Zuletzt bearbeitet',\r\n              email_validation: 'E-Mail (Validierung)',\r\n            },\r\n            statusText: {\r\n              unknown: 'unbekannt',\r\n              archived: 'archiviert',\r\n              confirmed: 'bestätigt',\r\n              compromised: 'kompromittiert',\r\n              unconfirmed: 'unbestätigt',\r\n              reset_required: 'Zurücksetzen erforderlich',\r\n              external_provider: 'externer Anbieter',\r\n              force_change_password: 'Passwortänderung ausstehend',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'E-Mail-Adressen stimmen nicht überein.',\r\n              email_not_valid: 'Bitte geben Sie eine gültige E-Mail-Adresse an.',\r\n              phone_not_specified: 'Bitte geben Sie eine gültige Telefonnummer an, die mit einem + beginnt und von der Landesvorwahl gefolgt wird!',\r\n              roles_not_specified: 'Bitte wählen Sie eine Nutzergruppe aus.',\r\n              gender_not_specified: 'Bitte geben Sie ein Geschlecht an.',\r\n              last_name_not_specified: 'Bitte geben Sie einen Namen an.',\r\n              first_name_not_specified: 'Bitte geben Sie einen Vornamen an.',\r\n              main_group_not_specified: 'Bitte wählen Sie eine Benutzergruppe aus.',\r\n              family_name_not_specified: 'Bitte geben Sie einen Nachnamen an.',\r\n              customer_organization_not_specified: 'Bitte wählen Sie eine Kundenorganisation aus.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Fehlgeschlagen!',\r\n          },\r\n          mail: {\r\n            success: 'Eine E-Mail mit einem automatisch generierten Passwort wurde an die angegebene E-Mail-Adresse versandt.',\r\n          },\r\n          update: {\r\n            title: 'Nutzer aktualisieren',\r\n          },\r\n          success: {\r\n            title: 'Erfolgreich!',\r\n            button: 'Zurück zur Liste',\r\n            message: 'Der Benutzer wurde erfolgreich angelegt. Eine E-Mail mit einem automatisch generierten Passwort wurde an die angegebene E-Mail-Adresse versandt.',\r\n            message_for_edit: 'Der Benutzer wurde erfolgreich aktualisiert.',\r\n            message_send_mail: 'Eine E-Mail mit einem automatisch generierten Passwort wurde an die angegebene E-Mail-Adresse versandt.',\r\n            button_back_to_last_page: 'Zurück zur letzten Seite',\r\n          },\r\n          delete: {\r\n            success: 'Nutzer erfolgreich gelöscht.',\r\n            confirmation: {\r\n              title: 'Soll dieser Nutzer wirklich gelöscht werden?',\r\n              confirm: 'Ja, diesen Nutzer löschen',\r\n              dismiss: 'Nein, abbrechen',\r\n              warning: 'Die Löschung wird einige Zeit benötigen bis sie angezeigt wird.',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Besucher',\r\n            customer: 'Kunde',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Benutzer',\r\n              email: 'E-Mail',\r\n              company: 'Firma',\r\n              enabled: 'Status',\r\n              lastName: 'Nachname',\r\n              sw_admin: 'SW Admin',\r\n              firstName: 'Vorname',\r\n              userRights: 'Rechtestatus',\r\n              phoneNumber: 'Telefonnummer',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'männlich',\r\n              female: 'weiblich',\r\n              diverse: 'divers',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarms',\r\n            type: 'Wählen Sie nach Typ aus',\r\n            machine: 'Wählen Sie nach Maschinen-ID aus',\r\n            listImport: 'Alarme Import',\r\n            listDownload: 'Alarm File Downloads',\r\n          },\r\n          text: {\r\n            text: 'Alarm-Benachrichtigungen können für die Alarmnummern festgelegt werden, die Sie interessieren. Wenn an einer definierten Maschine der eingestellte Alarm auftritt, erhalten Sie eine Benachrichtigung.',\r\n            title: 'Alarm-Benachrichtigungen',\r\n          },\r\n          export: {\r\n            text: 'Sie können jederzeit die aktuell eingestellten Alarm-Benachrichtigungen aller Maschinen in der SW CloudPlatform exportieren. Sie können diese Liste als Referenz verwenden oder sie verwenden, um alle Alarm-Benachrichtigungen auf einmal im Abschnitt „Alarme als CSV importieren“ zu importieren.',\r\n            title: 'Export der Alarme als CSV',\r\n          },\r\n          import: {\r\n            text: 'Sie können eine zuvor heruntergeladene CSV-Datei mit Informationen zu Alarmen und Abonnenten importieren, um die aktuell gespeicherten Werte zu aktualisieren. Sie können später auswählen, auf welche Anlagen- oder Maschinentypen Sie die importierten Alarm-Benachrichtigungen anwenden möchten.',\r\n            title: 'Alarme aus CSV importieren',\r\n            machines: {\r\n              title: 'Wählen Sie die Maschinen oder den Maschinentyp aus, auf die Sie die Alarm-Benachrichtigungen anwenden möchten.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Wählen Sie die CSV-Datei aus, die Sie importieren möchten',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Keine Ergebnisse gefunden',\r\n          results: {\r\n            of: 'von',\r\n            lines: 'Linien',\r\n            machines: 'Maschinen',\r\n          },\r\n          callToAction: 'Suche nach Maschinen',\r\n        },\r\n        maxSelectableDays: 'Max. %replaceValue Tage auswählbar.',\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Fehlgeschlagen',\r\n            queued: 'In der Warteschlange',\r\n            removed: 'Entfernt',\r\n            canceled: 'Abgesagt',\r\n            rejected: 'Abgelehnt',\r\n            completed: 'Vollendet',\r\n            succeeded: 'Erfolgreich',\r\n            timed_out: 'Zeitüberschreitung',\r\n            in_progress: 'Im Gange',\r\n            not_installed: 'Nicht installiert',\r\n          },\r\n        },\r\n        backend: {\r\n          links: {\r\n            tile: 'Backend Links (Dev)',\r\n            reset: 'Lokale Backend-Links wurden zurueckgesetzt.',\r\n            success: 'Backend-Links wurden gespeichert.',\r\n            description: 'Änderungen werden lokal gespeichert und nur in der Entwicklungsumgebung verwendet. Sind keine lokalen Werte vorhanden, werden die URLs aus der Konfiguration genutzt',\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Weltkarte',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shopfloor',\r\n          upload: {\r\n            text1: 'Senden Sie ein Bild Ihres Shopfloor-Layout an lifedata@sw-machines.com (JPG, PNG, PDF)',\r\n            text2: 'Wenn Ihre Maschinen bei der SW CloudPlatform registriert und angemeldet sind, werden sie auf der linken Seite angezeigt und senden Echtzeitdaten',\r\n            text3: 'Ziehen Sie den Status dann einfach per Drag & Drop auf Ihren Plan an der richtigen Maschine.',\r\n            mainText: 'In dieser Ansicht können Sie Ihr individuelles Shopfloor-Layout einrichten und Ihre Maschinen durch verschiedene Informationsebenen betrachten. Folgen Sie einfach diesen Schritten.',\r\n            tileTitle: 'Shopfloor upload',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset erfolgreich gelöscht.',\r\n            confirmation: {\r\n              title: \"Soll '%replaceValue' wirklich gelöscht werden?\",\r\n              confirm: 'löschen',\r\n              dismiss: 'abbrechen',\r\n              company: {\r\n                text: 'Wenn Sie das Unternehmen löschen, werden außerdem alle dazugehörigen Nutzer gelöscht.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Asset löschen',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Änderungen an NamePrefix oder DataType können die Maschine beschädigen. Möchten Sie wirklich speichern?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Möchten Sie die Grenzwerte dieses neuen Maschinentyps übernehmen?',\r\n              title: 'Sie haben den Maschinentyp geändert',\r\n              accept: 'Ja, neue Grenzwerte übernehmen',\r\n              decline: 'Nein, aktuelle Grenzwerte behalten',\r\n              dismiss: 'Abbrechen',\r\n              info_accept: \"Um die aktuellen Grenzwerte mit den Grenzwerten des neuen Maschinentyps zu überschreiben, wählen Sie 'Ja'.\",\r\n              info_decline: \"Um die aktuellen Grenzwerte beizubehalten, wählen Sie 'Nein'.\",\r\n              info_accept_warning: 'Alle aktuellen Grenzwerte werden überschrieben oder gelöscht.',\r\n            },\r\n          },\r\n        },\r\n        settings: {\r\n          tabs: {\r\n            limits: 'Grenzen',\r\n          },\r\n          button: {\r\n            import: 'Start Import',\r\n            dismiss: 'Abbruch',\r\n            download: 'Start Download',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Name',\r\n              datatype: 'Datatyp',\r\n              chartType: 'Charttyp',\r\n              displayName: 'Anzeigename',\r\n            },\r\n          },\r\n          collections: {\r\n            grid: {\r\n              displayName: 'Anzeigename',\r\n              collectionName: 'Name',\r\n            },\r\n          },\r\n        },\r\n        collections: {\r\n          tabs: {\r\n            list: 'Kollektionen-Liste',\r\n            collections: 'Kollektionen',\r\n          },\r\n          add_new_title: 'Neue Kollektion hinzufügen',\r\n          error: {\r\n            message: 'Beim Erstellen einer Kollektion ist ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal.',\r\n          },\r\n          new_form_title: 'Neue Kollektion',\r\n          edit_form_title: 'Kollektion bearbeiten',\r\n          new: {\r\n            fields: {\r\n              tags: 'Tags',\r\n              showId: 'Zeige Kollektion Id Eingabefeld',\r\n              uiRelevant: 'UI Relevant',\r\n              displayName: 'Anzeigename',\r\n              collectionId: 'Kollektion-ID',\r\n              collectionName: 'Kollektion Name',\r\n            },\r\n            buttons: {\r\n              delete: 'Kollektion löschen',\r\n            },\r\n            error_messages: {\r\n              displayName: 'Bitte geben Sie einen Anzeigename an.',\r\n              collectionId: 'Bitte geben Sie eine gültige UUID an.',\r\n              collectionName: 'Bitte geben Sie einen Kollektion Name an.',\r\n              descriptionText: 'Beschreibung ist erforderlich.',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'Die Kollektion wurde erfolgreich erstellt',\r\n          },\r\n          editError: {\r\n            message: 'Beim Aktualisieren einer Kollektion ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.',\r\n          },\r\n          editSuccess: {\r\n            message: 'Die Kollektion wurde erfolgreich aktualisiert',\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Datei löschen',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Halle löschen',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Linie löschen',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Status',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Maschinen-Zeit',\r\n          controller_time: 'Controller-Zeit',\r\n          iot_gateway_time: 'IoT-Gateway-Zeit',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          setZoomToDatepicker: 'Zoom auf Datumsauswahl einstellen',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Keine Daten vorhanden',\r\n              loading: 'Lade Daten...',\r\n              months: [\r\n                'Januar',\r\n                'Februar',\r\n                'März',\r\n                'April',\r\n                'Mai',\r\n                'Juni',\r\n                'Juli',\r\n                'August',\r\n                'September',\r\n                'Oktober',\r\n                'November',\r\n                'Dezember',\r\n              ],\r\n              resetZoom: 'Zoom zurücksetzen',\r\n              weekdays: [\r\n                'Sonntag',\r\n                'Montag',\r\n                'Dienstag',\r\n                'Mittwoch',\r\n                'Donnerstag',\r\n                'Freitag',\r\n                'Samstag',\r\n              ],\r\n              shortMonths: [\r\n                'Jan',\r\n                'Feb',\r\n                'Mar',\r\n                'Apr',\r\n                'Mai',\r\n                'Jun',\r\n                'Jul',\r\n                'Aug',\r\n                'Sep',\r\n                'Okt',\r\n                'Nov',\r\n                'Dez',\r\n              ],\r\n              shortWeekdays: [\r\n                'So',\r\n                'Mo',\r\n                'Di',\r\n                'Mi',\r\n                'Do',\r\n                'Fr',\r\n                'Sa',\r\n              ],\r\n              increaseDateRange: 'wenigstens bis',\r\n            },\r\n          },\r\n        },\r\n        data_warehouse: {\r\n          tabs: {\r\n            list: 'data warehouse',\r\n          },\r\n          export: {\r\n            csv: 'CSV',\r\n            json: 'JSON',\r\n            text: 'Sie können hier die data warehouse Daten exportieren. Wählen Sie bitte welches export Format Sie haben wollen. Sie können zwischen JSON, CSV und EXCEL export wählen.',\r\n            excel: 'EXCEL',\r\n            title: 'Export der Data Warehouse Daten',\r\n          },\r\n          text: {\r\n            title: 'data warehouse',\r\n          },\r\n          select: {\r\n            export: {\r\n              type: 'Bitte Export type wählen',\r\n            },\r\n          },\r\n          confirm: {\r\n            missing: {\r\n              export_type: 'OK',\r\n            },\r\n          },\r\n          missing: {\r\n            selected: {\r\n              export_type: 'Bitte wählen Sie das Export Format als was Sie die Datawarehouse Daten exportieren möchten.',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Voreinstellungen',\r\n            rangeTo: 'Bis',\r\n            selectDateRange: 'Bitte einen Zeitraum auswählen',\r\n            predefined: {\r\n              today: 'Heute',\r\n              custom: 'individuelle Auswahl',\r\n              last7days: 'Letzte 7 Tage',\r\n              yesterday: 'Gestern',\r\n              last24Hours: 'Letzte 24 Stunden',\r\n              last5Minutes: 'Letzte 5 Minuten',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Variable bearbeiten',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Variable löschen',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Sprache wählen',\r\n        },\r\n        informationSecurity: {\r\n          title: 'Informationssicherheit bei SW',\r\n          subtitle: 'Cybersicherheit von der Entwicklung bis zum Betrieb',\r\n          footer: {\r\n            agb: 'AGB & Normen',\r\n            copyright: 'Schwäbische Werkzeugmaschinen GmbH',\r\n            impressum: 'Impressum',\r\n            datenschutz: 'Datenschutz',\r\n          },\r\n          psirt: {\r\n            email: 'product.security@sw-machines.com',\r\n          },\r\n          table: {\r\n            title: 'Aktuelle Sicherheitsratschläge',\r\n            headers: {\r\n              status: 'Status',\r\n              severity: 'Schweregrad',\r\n              advisoryId: 'Advisory ID',\r\n              description: 'Beschreibung',\r\n              releaseDate: 'Veröffentlichungsdatum',\r\n              affectedProduct: 'Betroffenes Produkt',\r\n            },\r\n          },\r\n          download: {\r\n            text: 'Laden Sie unser Meldeformular herunter oder kontaktieren Sie unser PSIRT direkt per Email.',\r\n            title: 'Sicherheitsmeldung einreichen',\r\n            button: {\r\n              email: 'Per Email kontaktieren',\r\n              download: 'Meldeformular herunterladen',\r\n            },\r\n          },\r\n          section1: {\r\n            text: 'Bei SW ist Cybersecurity ein fester und grundlegender Bestandteil der Produktentwicklung. Bereits in der Planungs- und Entwicklungsphase identifizieren wir potenzielle Risiken und berücksichtigen geeignete Sicherheitsmaßnahmen. Durch die Anwendung der Prinzipien Secure by Design und Secure by Default sowie etablierter Sicherheitsstandards entwickeln wir Produkte, die von Beginn an auf Sicherheit und Resilienz ausgelegt sind.',\r\n            title: 'Cybersecurity von Anfang an',\r\n          },\r\n          section2: {\r\n            text: 'Cybersecurity endet nicht mit der Auslieferung eines Produkts. Während des gesamten Produktlebenszyklus beobachten und bewerten wir neue Bedrohungen sowie potenzielle Schwachstellen und stellen erforderliche Sicherheitsupdates bereit. Durch strukturierte Prozesse für Schwachstellenmanagement, Sicherheitsupdates und die Behandlung von Sicherheitsvorfällen unterstützen wir die langfristige Sicherheit unserer Produkte und ihrer Anwender.',\r\n            title: 'Kontinuierlicher Schutz im Betrieb',\r\n          },\r\n          section3: {\r\n            text: 'Nachvollziehbarkeit ist ein wichtiger Bestandteil wirksamer Cybersecurity. Deshalb dokumentieren wir Sicherheitsanforderungen, Risikobewertungen und wesentliche Schutzmaßnahmen über den gesamten Produktlebenszyklus hinweg. Klare Prozesse für Wartung, Änderungen und den Umgang mit Schwachstellen schaffen Transparenz, unterstützen die langfristige Sicherheit unserer Produkte und helfen unseren Kunden und uns regulatorische Anforderungen zu erfüllen.',\r\n            title: 'Transparenz über den gesamten Produktlebenszyklus',\r\n          },\r\n          services: {\r\n            title: 'Unsere Leistungen im Bereich Informationssicherheit',\r\n            psirt: {\r\n              text: 'Das Product Security Incident Response Team (PSIRT) von SW ist die zentrale Meldestelle für Sicherheitslücken und sicherheitsrelevante Vorfälle in unseren Produkten. Das Team koordiniert die strukturierte Bewertung, Bearbeitung und Nachverfolgung eingehender Meldungen. Damit unterstützen wir einen verantwortungsvollen Umgang mit Schwachstellen und die Anforderungen moderner Cybersecurity-Standards, einschließlich des Cyber Resilience Acts (CRA).',\r\n              title: 'SW PSIRT',\r\n            },\r\n            advisories: {\r\n              text: 'Die SW Security Advisories dienen der transparenten Kommunikation sicherheitsrelevanter Informationen zu unseren Produkten. Sie enthalten Angaben zu identifizierten Schwachstellen, deren Bewertung, verfügbaren Sicherheitsupdates sowie empfohlenen Maßnahmen zur Risikominderung. Dadurch ermöglichen wir unseren Kunden, Sicherheitsrisiken intern angemessen zu bewerten und geeignete Schutzmaßnahmen umzusetzen.',\r\n              title: 'SW Security Advisories',\r\n            },\r\n          },\r\n          linksDownloads: {\r\n            title: 'Links & Downloads',\r\n            securityTxt: 'Security TXT',\r\n            dataProtection: 'Datenschutzhinweise',\r\n            vulnerabilityGuideline: 'Richtlinie zur Offenlegung von Schwachstellen',\r\n          },\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Unternehmen löschen',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Standort löschen',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Status',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Dashboard konfigurieren',\r\n            hide: {\r\n              title: 'verbergen',\r\n            },\r\n            show: {\r\n              title: 'anzeigen',\r\n            },\r\n            delete: {\r\n              title: 'löschen',\r\n            },\r\n            add: {\r\n              fab_title: 'Eigene Kachel hinzufügen',\r\n            },\r\n            save: {\r\n              fab_title: 'Konfiguration speichern',\r\n            },\r\n            move_left: {\r\n              title: 'Zur vorherigen Position schieben',\r\n            },\r\n            move_right: {\r\n              title: 'Zur nächsten Position schieben',\r\n            },\r\n            discard: {\r\n              fab_title: 'Konfiguration verwerfen',\r\n            },\r\n            add_custom_card: {\r\n              save: 'speichern',\r\n              input: 'Kachelname angeben',\r\n              title: 'Eigene Kachel hinzufügen',\r\n              cancel: 'abbrechen',\r\n              missingMachine: 'Sie müssen mindestens eine Maschine auswählen',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie, die Seite neu zu laden.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational Error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Erfolg',\r\n            },\r\n            e_3xx: {\r\n              message: 'Weiterleitung',\r\n            },\r\n            e_400: {\r\n              message: 'Die Anfrage war fehlerhaft und konnte nicht verarbeitet werden.',\r\n            },\r\n            e_401: {\r\n              message: 'Sie sind nicht authentifiziert. Bitte loggen Sie sich erneut ein.',\r\n            },\r\n            e_403: {\r\n              message: 'Sie haben keine ausreichende Berechtigung, um auf die angeforderte Resource zuzugreifen.',\r\n            },\r\n            e_404: {\r\n              message: 'Die angeforderte Ressource ist nicht verfügbar.',\r\n            },\r\n            e_405: {\r\n              message: 'Methode nicht erlaubt.',\r\n            },\r\n            e_406: {\r\n              message: 'Method nicht akzeptabel',\r\n            },\r\n            e_409: {\r\n              message: 'Die Ressource existiert bereits.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Nicht verarbeitbarer Inhalt',\r\n            },\r\n            e_4xx: {\r\n              message: 'Client-Fehler',\r\n            },\r\n            e_500: {\r\n              message: 'Ein interner Serverfehler ist aufgetreten.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Server-Fehler',\r\n            },\r\n            e_900: {\r\n              message: 'Der Versuch ein Asset anzulegen ist fehlgeschlagen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_901: {\r\n              message: 'Die Aktion wurde abgebrochen. Es wurde kein neues Asset angelegt.',\r\n            },\r\n            e_902: {\r\n              message: 'Die Aktion wurde abgebrochen. Es wurde keine Serviceanfrage abgeschickt.',\r\n            },\r\n            e_903: {\r\n              message: 'Beim Versuch, die Serviceanfrage abzusenden, ist etwas schiefgelaufen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_904: {\r\n              message: \"Asset '%replaceValue' wurde erfolgreich angelegt. Sie können jetzt weitere Assets hinzufügen.\",\r\n            },\r\n            e_905: {\r\n              message: 'Die Aktion wurde abgebrochen. Das Asset wurde nicht aktualisiert.',\r\n            },\r\n            e_906: {\r\n              message: \"Asset '%replaceValue' wurde erfolgreich verschoben.\",\r\n            },\r\n            e_910: {\r\n              message: 'Der Versuch einen Benutzer anzulegen ist fehlgeschlagen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_911: {\r\n              message: 'Die Aktion wurde abgebrochen. Es wurde kein neuer Benutzer angelegt.',\r\n            },\r\n            e_912: {\r\n              message: 'Beim Versuch, ein Asset zu aktualisieren, ist fehlgeschlagen. Bitte versuchen Sie es erneut.',\r\n            },\r\n            e_920: {\r\n              message: 'Die Aktion wurde abgebrochen. Es wurden keine Änderungen gespeichert.',\r\n            },\r\n            e_921: {\r\n              message: 'Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es noch einmal.',\r\n            },\r\n            e_922: {\r\n              message: 'Der Benutzername und/oder das Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal.',\r\n            },\r\n            e_923: {\r\n              message: 'Bitte geben Sie einen Benutzernamen und ein Passwort an.',\r\n            },\r\n            e_924: {\r\n              message: 'Ihre Sitzung ist aufgrund Inaktivität abgelaufen. Bitte melden Sie sich erneut an.',\r\n            },\r\n            e_925: {\r\n              message: 'Um die SW Cloud Platform nutzen zu können, müssen Sie unsere Datenschutzerklärung akzeptieren.',\r\n            },\r\n            e_926: {\r\n              message: 'Ihr Account ist temporär gesperrt. Bitte versuchen Sie es in einigen Minuten erneut.',\r\n            },\r\n            e_927: {\r\n              message: 'Ihr Passwort wurde erfolgreich geändert.',\r\n            },\r\n            e_928: {\r\n              message: 'Die Aktion wurde abgebrochen. Es wurde keine Datei hochgeladen.',\r\n            },\r\n            e_929: {\r\n              message: 'Beim Versuch, eine Datei hochzuladen, ist etwas schiefgelaufen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_930: {\r\n              message: 'Beim Versuch, eine Datei zu löschen, ist etwas schiefgelaufen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_931: {\r\n              message: 'Benutzerdefinierter Datumsbereich ist zu groß. Der Standardwert 24 Stunden wurde gesetzt. Max. Datumsbereich %replaceValue Tage',\r\n            },\r\n            e_932: {\r\n              message: 'Das Asset hat untergeordnete Elemente. Löschen Sie zuerst die untergeordneten Elemente.',\r\n            },\r\n            e_935: {\r\n              message: 'Beim Löschen ist ein interner Serverfehler aufgetreten. Bitte versuchen Sie es später erneut.',\r\n            },\r\n            e_10500: {\r\n              message: 'Server-Timeout – Die Verarbeitung der Anfrage hat zu lange gedauert, um erfolgreich abgeschlossen zu werden.',\r\n            },\r\n            e_10501: {\r\n              message: 'Sie verwenden einen nicht unterstützten Browser. Bitte verwenden Sie einen der folgenden Browser: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'Das Asset (SW-Maschinennummer %replaceValue) existiert bereits.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Dieser Datei-Name %replaceValue existiert bereits',\r\n            },\r\n            e_409_variables: {\r\n              message: 'Die Variable %replaceValue existiert bereits.',\r\n            },\r\n            e_933: {\r\n              message_variables: \"Varaible '%replaceValue' wurde erfolgreich angelegt. Sie können jetzt weitere Variablen hinzufügen.\",\r\n              message_collections: \"Kollektion '%replaceValue' wurde erfolgreich angelegt. Sie können jetzt weitere Kollektion hinzufügen.\",\r\n            },\r\n            e_934: {\r\n              message_variables: 'Beim Versuch, eine Variable zu löschen, ist etwas schiefgelaufen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n              message_collections: 'Beim Versuch, eine Kollektion zu löschen, ist etwas schiefgelaufen. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut.',\r\n            },\r\n            e_409_collections: {\r\n              message: 'Die Kollektion %replaceValue existiert bereits.',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Es können nur %s Elemente gleichzeitig ausgewählt werden',\r\n              title: 'Max. Anzahl erreicht',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Datumsfilter',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Keine Dateien verfügbar.',\r\n              file_cardTitle: 'Machine Events',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Herunterladen von Daten',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC-Trace-Daten',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Keine alarme verfügbar',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'Vergleichsdaten',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'Zustandsdaten',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Keine Dateien verfügbar.',\r\n              file_cardTitle: 'ToolMon-Daten',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Herunterladen von ToolMon-Daten',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Trigger',\r\n              column_title_filename: 'Dateiname',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Daten herunterladen',\r\n                },\r\n              },\r\n              column_title_creation_date: 'Erstellungsdatum',\r\n            },\r\n            toolmon_health: {\r\n              file_cardTitle: 'ToolMon-Gesundheitsdaten',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI-Fahrtenschreiberdaten',\r\n            },\r\n            hydraulic_cylinder: {\r\n              file_cardTitle: 'Hydraulikzylinder-Daten',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  default: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Logout',\r\n        release: \"On '%replaceValue1' to '%replaceValue2' maintenance work will be carried out on the platform. The platform will be partially unavailable during this period.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Close',\r\n        acceptLabel: 'Accept',\r\n        userProfile: 'User Profile',\r\n        button: {\r\n          clear: 'Remove Chart',\r\n          timeline: 'Limit adjustment',\r\n          separateCharts: 'Separate Charts',\r\n        },\r\n        declineLabel: 'Decline',\r\n        backToDashboard: 'Back to Dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / standards',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Contact',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: 'Imprint',\r\n          },\r\n          privacy: {\r\n            title: 'Privacy',\r\n            header: 'Privacy Policy',\r\n          },\r\n          release: {\r\n            title: 'Release notes',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/en/',\r\n            title: 'SW homepage',\r\n          },\r\n        },\r\n        noInternetConnection: 'It seems that you are not connected to the internet. Please ensure you are connected.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'of',\r\n          noData: 'No data',\r\n          search: 'Search',\r\n          dateFormat: 'MM/DD/YYYY',\r\n          downloaded: 'downloaded',\r\n          noDuration: 'no duration available',\r\n          timeFormat: 'hh:mm:ss A',\r\n          notLicensed: 'Your machine is not licensed.',\r\n          alarmPending: 'alarm pending',\r\n          buttons: {\r\n            back: 'Back',\r\n            save: 'Save',\r\n            view: 'View',\r\n            cancel: 'Cancel',\r\n            custom: 'Save + Set custom range',\r\n            submit: 'Submit',\r\n            export: {\r\n              limit: 'Download Limits',\r\n              alarms: 'Download Alarms',\r\n              data_warehouse: 'Download Data Warehouse',\r\n              data_warehouse_csv: 'Download Data Warehouse as CSV',\r\n              data_warehouse_json: 'Download Data Warehouse as JSON',\r\n              data_warehouse_excel: 'Download Data Warehouse as Excel',\r\n            },\r\n            import: {\r\n              limit: 'Start',\r\n              alarms: 'Start',\r\n            },\r\n            refreshReset: 'Reset to default time',\r\n            refreshConfig: 'Reset to Config',\r\n            selectAllCheckboxes: 'Select all checkboxes',\r\n            unselectAllCheckboxes: 'Unselect all checkboxes',\r\n          },\r\n          notAvailable: 'Not available',\r\n          notConnected: 'Not connected yet',\r\n          download: {\r\n            file: 'File Downloads',\r\n          },\r\n          dateTimeFormat: 'MM/DD/YYYY hh:mm:ss A',\r\n          timeFormats: {\r\n            day: 'day',\r\n            days: 'days',\r\n            hour: 'hour',\r\n            year: 'year',\r\n            hours: 'hours',\r\n            month: 'month',\r\n            years: 'years',\r\n            minute: 'minute',\r\n            months: 'months',\r\n            second: 'second',\r\n            minutes: 'minutes',\r\n            seconds: 'seconds',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'hh:mm A',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Understood',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: \"You won't be able to revert this!\",\r\n        },\r\n        error: {\r\n          upload: 'Failed uploads',\r\n          download: 'Failed downloads',\r\n          message: {\r\n            enrollment_code_409: 'Device is already enrolled in aws.',\r\n            limit_change_failed: 'There was an error changing the limits. Please try again or contact lifedata@sw-machines.com',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'time recordings',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Select variables',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Date',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Secure Attended Access',\r\n            directAccess: 'Direct access',\r\n            new: {\r\n              fields: {\r\n                id: 'Enter ID',\r\n                cOnePanel: 'with C|One',\r\n                sessionType: 'Session type',\r\n              },\r\n              error_messages: {\r\n                id: 'Please enter a Session-ID or Device ID',\r\n                sessionType: 'Please select a Session type',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: 'Machines',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Add new line',\r\n            grid: {\r\n              hall: 'Hall',\r\n              line: 'Line',\r\n              type: 'Type',\r\n              contractEnd: 'Contract end',\r\n              cellPosition: 'Cell / position',\r\n              operationStep: 'Processing step',\r\n              machineIdentifierSw: 'Machine no. (SW)',\r\n              machineIdentifierCustomer: 'Machine name',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The line was successfully created.',\r\n            },\r\n            new_form_title: 'Add line',\r\n            edit_form_title: 'Edit line',\r\n            new: {\r\n              fields: {\r\n                name: 'Line name',\r\n                name_short: 'Line name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a line name',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The line was successfully updated.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Add new hall',\r\n            grid: {\r\n              part: 'Part',\r\n              lineName: 'Line',\r\n              typeOfLoading: 'Type of loading',\r\n              lineResponsible: 'Line manager',\r\n              plannedQuantity: 'Planned quantity',\r\n              numberOfMachines: '# Machines',\r\n            },\r\n            tabs: {\r\n              list: 'Lines',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The hall was successfully created.',\r\n            },\r\n            new_form_title: 'Add hall',\r\n            shopfloor: {\r\n              edit: 'Edit Mode',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Save configuration',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Discard configuration',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Edit hall',\r\n            new: {\r\n              fields: {\r\n                name: 'Hall name',\r\n                name_short: 'Hall name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                description_external: 'Description (external) [optional]',\r\n                description_internal: 'Description (internal) [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a hall name',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The hall was successfully updated.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Description [optional]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Add new asset',\r\n            tabs: {\r\n              info: 'Time series',\r\n              alarms: 'Alarms',\r\n              events: 'Machine Events',\r\n              gateway: 'Gateway',\r\n              service: 'Service',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Swimlane',\r\n              'axis-test': 'Axis tests',\r\n              collection: 'Collections',\r\n              technology: 'Technology',\r\n              maintenance: 'Maintenance',\r\n              performance: 'Performance',\r\n              spindledata: 'Spindle data',\r\n              remoteaccess: 'Remote Access',\r\n              enduranceTest: 'End of line Test',\r\n              administration: 'Administration',\r\n              y_title: {\r\n                status: 'status',\r\n                status_table_one: 'table 1',\r\n                status_table_two: 'table 2',\r\n              },\r\n              energymonitoring: 'Energy monitoring',\r\n              technology_undefined: 'undefined',\r\n              technology_undefined_condition: 'undefined condition!',\r\n            },\r\n            move: {\r\n              message: \"You can move the asset '%replaceValue' to a new company, location, hall and/or line now.\",\r\n              select_hall_label: 'Select new hall',\r\n              select_line_label: 'Select new line',\r\n              select_company_label: 'Select new company',\r\n              select_location_label: 'Select new location',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Machine no. (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Machine startup date [optional]',\r\n                shipping: 'Machine Shipping date [optional]',\r\n                controller: 'Controller',\r\n                machine_type: 'Machine type',\r\n                warranty_end: 'Machine warranty end [optional]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Systems Manager',\r\n                warranty_start: 'Machine warranty start [optional]',\r\n                machine_swmp_api: 'Machine SWMP api end [optional]',\r\n                machine_swsp_trace: 'Machine SWSP trace end [optional]',\r\n                machine_swcp_portal: 'Machine SWCP portal end [optional]',\r\n                start_of_production: 'Machine start of production [optional]',\r\n                machine_swcp_support: 'Machine SWCP support end [optional]',\r\n                machine_cell_position: 'Machine cell / position [optional]',\r\n                machine_swsp_line_mon: 'Machine SWSP lineMon end [optional]',\r\n                machine_identifier_customer: 'Machine ID (customer)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a valid SW machine no. (min. 7 chars: A-Z, 0-9, -)',\r\n                controller_not_specified: 'Please select a controller',\r\n                machine_type_not_specified: 'Please specify a machine type',\r\n                machine_identifier_customer_not_specified: 'Please specify a customer machine ID',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The asset was successfully created.',\r\n            },\r\n            toolmon: {\r\n              score: 'Spindle-Score Table 1 & 2',\r\n              state_a_u: 'Teach active Table 1 & 2',\r\n              g_function: 'G-Function',\r\n              active_tool: 'Active Tool',\r\n              analyzer_ok: 'Analyzer ok',\r\n              bad_workpiece: 'Spindle No Tool State Table 1 & 2',\r\n              spindle_active: 'Spindle Monitoring active',\r\n              tech_finalized: 'Teach finalized Table 1 & 2',\r\n              p8_toolmon_active: 'Toolmon active',\r\n              q_axis_and_spindle: 'Q-Axis and Spindle',\r\n              p8_toolmon_skip_step: 'Skip Step',\r\n              target_spindle_speed: 'Target spindle speed',\r\n              p8_toolmon_bad_workpiece: 'Workpiece not ok',\r\n              p8_toolmon_delta_t_first_g1: 'Delta T to G1',\r\n              p8_toolmon_n_encoder_strokes: 'Encoder strokes (HMI)',\r\n              p8_toolmon_analyzer_check_result: 'Analyzer ok',\r\n              p8_tool_breakage_sensitivity_limit: 'Sensitivity limit (HMI)',\r\n              p8_toolmon_tool_life_and_skip_step: 'Uploaded triggers',\r\n              p8_tool_breakage_step_end_increasing: 'Step end increasing',\r\n            },\r\n            new_form_title: 'New asset',\r\n            edit_form_title: 'Edit asset',\r\n            move_form_title: 'Move asset',\r\n            technology: {\r\n              table: 'Table',\r\n              change: 'Change',\r\n              g_mode: 'G-Function',\r\n              off_time: 'Auxiliary Process Time',\r\n              no_change: 'No Change',\r\n              undefined: 'Undefined',\r\n              active_tool: 'Active Tool',\r\n              analyzer_ok: 'Analyzer ok',\r\n              tool_change: 'Tool Change',\r\n              machining_time: 'Machining Time',\r\n              tool_change_time: 'Tool Change Time',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'process time table 1',\r\n                  name_two: 'process time table 2',\r\n                  name_one_undefined: 'undefined process time table 1',\r\n                  name_two_undefined: 'undefined process time table 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q-Axis and Spindle',\r\n              undefined_gmode_data: 'g-function data undefined',\r\n              undefined_table_data: 'condition table data undefined',\r\n              auxiliary_process_time: 'Auxiliary process time',\r\n              undefined_analyzer_data: 'analyzer ok data undefined',\r\n              undefined_activetool_data: 'active tool data undefined',\r\n              undefined_tool_change_data: 'tool change data undefined',\r\n              undefined_machining_time_table_one: 'undefined condition table 1',\r\n              undefined_machining_time_table_two: 'undefined condition table 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Machining-, Tool change- & Auxiliary process time Table 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Machining-, Tool change- & Auxiliary process time Table 2',\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The asset was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                support: 'SWCP Support',\r\n                shipping: 'Date of shipping',\r\n                controller: 'Controller',\r\n                contractEnd: 'Date of contract end',\r\n                machineType: 'Machine type',\r\n                startupDate: 'Date of startup',\r\n                warrantyEnd: 'End of warranty',\r\n                cellPosition: 'Machine cell / position',\r\n                warrantyStart: 'Begin of warranty',\r\n                customerNumber: 'Customer Number',\r\n                enrollmentConfig: 'Enrollment-Configuration',\r\n                startOfProduction: 'Start of production',\r\n                machineIdentifierSw: 'Machine no. SW',\r\n                enrollmentConfigDownload: 'Download',\r\n                machineIdentifierCustomer: 'Customer machine name',\r\n              },\r\n            },\r\n            add_line_to_dashboard: 'Add line to dashboard',\r\n            elements: {\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'In case of an error, please contact',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Please provide us the data via the Netcfg form.',\r\n                  intro: 'In order to be able to connect your machine, we need information on your network configuration.',\r\n                  title: 'Network Configuration',\r\n                  goToNetconfig: 'Open Network Config',\r\n                },\r\n                device: {\r\n                  title: 'Device details',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Please perform the following steps if the IoT Gateway looks like that:',\r\n                  line1: 'Download the enrollment file by clicking on the button on the tile’s bottom.',\r\n                  line2: 'Download will start automatically.',\r\n                  line3: 'Put the .json file in the root directory on a USB stick. Make sure that the file is named',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Make sure you have the following files in the root of the USB stick:',\r\n                  line6: 'Insert the USB stick into the corresponding IoT Gateway.',\r\n                  line7: 'Enrollment will start automatically, signalized by a slowly flashing green user LED.',\r\n                  line8: 'After successful enrollment, the green LED is on until the USB stick is removed.',\r\n                  title: 'Enrollment',\r\n                  button: 'Enrollment file',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Download the migrate-iot.zip and extract its content directly to an empty USB stick.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Download the',\r\n                  line4: ' and also put it directly on the USB stick. Make sure that the file is named',\r\n                  line5: 'Make sure you have the following files in the root of the USB stick:',\r\n                  line6: 'install.json',\r\n                  line7: 'aws-migrate-iot.tar.gz',\r\n                  line8: 'aws-migrate-iot.tar.gz.sig',\r\n                  line9: 'aws.json',\r\n                  title: 'Platform Migration and enrollment',\r\n                  line10: 'The, files have been modified as of 10/27/2023. Please be sure to download them again and do not use the old version.',\r\n                  line11: 'Insert the USB stick into the corresponding IoT Gateway.',\r\n                  line12: 'Software will run automatically, signalized by a flashing yellow LED.',\r\n                  line13: 'After successful migration, the green LED is on until the USB stick is removed.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generate',\r\n                headline: 'Time series',\r\n                noChartMessage: 'Please select one or more variables on the left and click on Generate to display your metrics',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarms',\r\n              },\r\n              service: {\r\n                contact: 'Please contact',\r\n                headline: 'Service',\r\n                update: {\r\n                  title: 'Update File',\r\n                },\r\n                upload: {\r\n                  title: 'Upload File',\r\n                  fields: {\r\n                    file: 'File',\r\n                    language: 'File language',\r\n                    file_name: 'File name',\r\n                    list_of_languages: {\r\n                      cs: 'Croatian',\r\n                      cz: 'Czech',\r\n                      da: 'Danish',\r\n                      de: 'German',\r\n                      en: 'English',\r\n                      es: 'Spanish',\r\n                      fr: 'French',\r\n                      hu: 'Hungarian',\r\n                      it: 'Italian',\r\n                      ko: 'Korean',\r\n                      mk: 'Macedonia',\r\n                      nl: 'Dutch',\r\n                      pl: 'Polish',\r\n                      pt: 'Portuguese',\r\n                      ro: 'Romanian',\r\n                      sk: 'Slovak',\r\n                      sl: 'Slovenian',\r\n                      sv: 'Swedish',\r\n                      tr: 'Turkish',\r\n                      zh: 'Chinese',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Upload',\r\n                    cancel: 'Cancel',\r\n                  },\r\n                  success: {\r\n                    title: 'Success',\r\n                    button: 'Back to service overview',\r\n                    message: 'The file has been successfully uploaded.',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Please specify a file name',\r\n                    file_not_valid: 'Please specify a file / Please select a smaller file.',\r\n                    language_not_specified: 'Please specify a file language.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Manuals',\r\n                },\r\n                version: {\r\n                  title: 'version files',\r\n                },\r\n                contracts: {\r\n                  title: 'Contracts',\r\n                },\r\n                components: {\r\n                  title: 'Hardware and Software Components',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Spareparts',\r\n                },\r\n                consumeables: {\r\n                  title: 'Consumeables',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Update',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'To activate a machine for remote access, TeamViewer must be installed on the IoT Gateway.',\r\n                  line2: 'If this is not yet the case, install TeamViewer by just clicking “install”.',\r\n                  title: 'Install remote support',\r\n                  status: 'Deployment state',\r\n                  copy: {\r\n                    button: 'Copy link',\r\n                  },\r\n                  install: {\r\n                    button: 'Install TeamViewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Start Session',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT-Gateway',\r\n                  values: {\r\n                    box_id: 'Box ID',\r\n                    machine_connect: 'machine connect',\r\n                    operating_system: 'operating system',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Need help with your machine?',\r\n                  line2: 'Contact us!',\r\n                  title: 'Message to SW Service',\r\n                  button: 'Contact Service',\r\n                  fields: {\r\n                    name: 'Machine identifier (SW)',\r\n                    type: 'Type',\r\n                    email: 'E-Mail',\r\n                    message: 'Message',\r\n                    phone_no: 'Phone no.',\r\n                    last_name: 'Last name',\r\n                    first_name: 'First name',\r\n                    contact_person: 'Contact person (SW) [optional]',\r\n                    list_of_types: {\r\n                      request: 'Request',\r\n                      service: 'Service',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Expansion',\r\n                      inspection: 'Inspection',\r\n                    },\r\n                    machine_identifier_customer: 'Machine identifier (customer) [optional]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Send request',\r\n                    cancel: 'Cancel',\r\n                  },\r\n                  success: {\r\n                    title: 'Success',\r\n                    button: 'Back to service overview',\r\n                    message: 'The request has been successfully sent to SW Service.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Please specify a valid e-mail address',\r\n                    name_not_specified: 'Please specify a valid SW machine no. (min. 7 chars: A-Z, 0-9, - _)',\r\n                    phone_not_specified: 'Please specify a phone number',\r\n                    message_not_specified: 'Please enter a message',\r\n                    last_name_not_specified: 'Please specify a last name',\r\n                    first_name_not_specified: 'Please specify a first name',\r\n                    family_name_not_specified: 'Please specify a last name',\r\n                    contact_type_not_specified: 'Please specify a request type',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Machine Software',\r\n                  values: {\r\n                    nc_version: 'NC version',\r\n                    hmi_version: 'HMI version',\r\n                    plc_version: 'PLC version',\r\n                    compile_cycles: 'compile cycles',\r\n                    operating_system: 'operating system',\r\n                    pcu_base_version: 'PCU base version',\r\n                    plc_toolbox_version: 'PLC toolbox version',\r\n                    plc_user_program_version: 'PLC user program version',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'The name of the file has been successfully updated.',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Remote support',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: \"In the service assistant space you'll be guided through various troubleshooting processes.\",\r\n                  title: 'Service Assistant',\r\n                  sub_title: 'Are you currently having a problem with one of your assets?',\r\n                  open_assistant: 'Open Service Assistant',\r\n                  request_account: 'Request Account',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Spindle statistics SpiStat',\r\n              },\r\n              'axis-test': {\r\n                kpiUnit: 'Unit',\r\n                headline: 'Axis test',\r\n                kpiValue: 'Value',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Load from browser storage',\r\n                limitsSave: 'Save to browser storage',\r\n                selectAxis: 'Select axis',\r\n                limitsExport: 'Export limits to clipboard',\r\n                openAxistest: 'Open Axistest',\r\n                axisTestPlural: 'Axistests',\r\n                adjustments: {\r\n                  add: 'Add local adjustment',\r\n                  range: 'Range',\r\n                  header: 'Local adjustment',\r\n                  remove: 'Remove',\r\n                  position: 'Position',\r\n                  amplitude: 'Amplitude',\r\n                  spreadMultiplier: 'Limit multiplier',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Position',\r\n                    y: 'Current',\r\n                    up: 'positive direction',\r\n                    down: 'negative direction',\r\n                    limitsUp: 'limits positive direction',\r\n                    limitsDown: 'limits negative direction',\r\n                    sliderSlopeCenter: 'Slope origin',\r\n                    sliderSlopeFactor: 'Slope factor',\r\n                    sliderVerticalOffset: 'Y offset',\r\n                    sliderVerticalSpread: 'Limit width',\r\n                    sliderQuadraticCenter: 'Quadratic origin',\r\n                    sliderQuadraticFactor: 'Quadratic factor',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'clockwise',\r\n                    limitsClockwise: 'limits clockwise',\r\n                    counterClockwise: 'counter-clockwise',\r\n                    sliderSineOffset: 'Wave offset',\r\n                    sliderSineAmplitude: 'Wave amplitude',\r\n                    sliderSineFrequency: 'Wave frequencz',\r\n                    sliderVerticalOffset: 'Y offset',\r\n                    sliderVerticalSpread: 'Limit width',\r\n                    limitsCounterClockwise: 'limits counter-clockwise',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Velocity',\r\n                  pulseMaxRampUp: 'Ramp ->',\r\n                  pulseMaxRampDown: 'Ramp <-',\r\n                  pulseMaxStiffness: 'Stiffness max',\r\n                  pulseMinStiffness: 'Stiffness min',\r\n                  pulseMeanStiffness: 'Stiffness Ø',\r\n                  circularReversalRange: 'Circular hysteresis',\r\n                  pulseMaxUpPathCurrent: 'Current max ->',\r\n                  pulseMinUpPathCurrent: 'Current min ->',\r\n                  pulseMeanUpPathCurrent: 'Current Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Current max <-',\r\n                  pulseMinDownPathCurrent: 'Current min <-',\r\n                  pulseMeanDownPathCurrent: 'Current Ø <-',\r\n                  circularShapeDeviationClockwise: 'Circular deviation clockwise',\r\n                  pulseStiffnessStandardDeviation: 'Stiffness σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Current σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Current σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Circular deviation counter-clockwise',\r\n                },\r\n                measurementSeries: [\r\n                  'without group',\r\n                  'before geometry',\r\n                  'after geometry',\r\n                  'commissioning end',\r\n                  'FingerPrint',\r\n                ],\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Circularity',\r\n                  EQUABILITY: 'Equability',\r\n                  CIRCULARITY: 'Circularity',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'No Axistest available',\r\n                },\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'On',\r\n                labelOffline: 'Off',\r\n              },\r\n              swimlane: {\r\n                headline: 'Swimlane',\r\n              },\r\n              endurance: {\r\n                headline: 'End of line test',\r\n                chartTitles: {\r\n                  runtime: 'runtime data',\r\n                  endurance: 'End of line test',\r\n                  operation: 'operation mode',\r\n                  qaxis_180: 'Q-axis 180°',\r\n                  nc_program: 'NC program',\r\n                  stacklights: '3 Stacklights',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Sending status',\r\n                aborted: 'aborted',\r\n                sending: 'sending',\r\n                undefined: 'undefined',\r\n                interrupted: 'interrupted',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Alarm map',\r\n              },\r\n              collection: {\r\n                headline: 'Collection',\r\n                noChartMessage: 'Please choose any collection on the left.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Sum',\r\n                  header: 'Performance Kpi',\r\n                  target: 'Target',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarms',\r\n                  category: [\r\n                    'Not classified',\r\n                    'Error message',\r\n                    'Operation message',\r\n                    'Status message',\r\n                    'Operating Instruction',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'trend',\r\n                    duration: 'duration',\r\n                    flatlist: 'flat list',\r\n                    frequency: 'frequency',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Time',\r\n                    trend: 'Trend',\r\n                    duration: 'Duration',\r\n                    leftTime: 'Left time',\r\n                    alarmCount: 'Number',\r\n                    alarmNumber: 'Alarm no.',\r\n                    description: 'Description',\r\n                    alarmOccured: 'Alarm occured',\r\n                    alarmClassification: 'Alarm classification',\r\n                    alarmCountSecondRange: 'Number T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'increasing',\r\n                      down: 'decreasing',\r\n                      flat: 'unchanged',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Details',\r\n                  ncProgram: 'NC program',\r\n                  lastModified: 'Last modified',\r\n                  machineState: 'Machine state',\r\n                  numberAlarms: 'Alarms pending',\r\n                  stopCondition: 'Stop conditions',\r\n                  ncProgramState: 'NC program state',\r\n                  protectionLevel: 'Protection level',\r\n                  ncProgramStates: [\r\n                    'aborted',\r\n                    'halted',\r\n                    'running',\r\n                    'waiting',\r\n                    'interrupted',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'System',\r\n                    'Manufacturer',\r\n                    'Service',\r\n                    'User',\r\n                    'Key switch position 3',\r\n                    'Key switch position 2',\r\n                    'Key switch position 1',\r\n                    'Key switch position 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Cycle time',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Cycle time in s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'o.k.',\r\n                  nok: 'n.o.k.',\r\n                  sum: 'Sum',\r\n                  title: 'Piece counter',\r\n                  titleDayCounter: 'Day counter',\r\n                  titleShiftCounter: 'Shift counter',\r\n                  titleTotalCounter: 'Total counter',\r\n                  titleTotalCounterSmall: 'Total',\r\n                },\r\n                availability: {\r\n                  title: 'Availability',\r\n                  kpi: {\r\n                    title: 'Availability KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG with error',\r\n                    MDA_with_error: 'MDA with error',\r\n                    JOG_without_error: 'JOG without error',\r\n                    MDA_without_error: 'MDA without error',\r\n                    not_defined_condition: 'not defined condition',\r\n                    auto_no_program_active: 'AUTO no program active',\r\n                    auto_waiting_for_parts: 'AUTO waiting for parts',\r\n                    auto_with_error_program_stopped: 'AUTO with error - program stopped',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO waiting for parts + stopping error',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Aggregated Availability',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Availability',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'State',\r\n                },\r\n                operationMode: {\r\n                  title: 'Operation mode',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Operation mode',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Runtime monitor',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'on',\r\n                        off: 'off',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Spindle override',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Feed rate override',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administration',\r\n                headline: 'Administration',\r\n                aws: {\r\n                  title: 'AWS Links',\r\n                },\r\n                groups: {\r\n                  title: 'Thing Groups',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Systems Manager',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Bill of Materials',\r\n                },\r\n                component: {\r\n                  title: 'Components',\r\n                },\r\n              },\r\n              spindleData: {\r\n                headline: 'Spindle data',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Remote Access',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Time before alarm (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Time after alarm (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Energy monitoring',\r\n                chartTitles: {\r\n                  air: 'Compressed air consumption',\r\n                  current: 'Power consumption',\r\n                  consumption: 'Average Consumption per hour',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Condition Monitoring',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Add new company',\r\n            grid: {\r\n              city: 'City',\r\n              email: 'E-mail',\r\n              street: 'Street',\r\n              country: 'Country',\r\n              website: 'Website',\r\n              postalCode: 'zip code',\r\n              locationName: 'Location',\r\n              locationCustomerNumber: 'Customer number',\r\n            },\r\n            tabs: {\r\n              list: 'Locations',\r\n              worldmap: 'World map',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The company was successfully created.',\r\n            },\r\n            toggle_switch: 'Create a company location with the same data',\r\n            new_form_title: 'Add company',\r\n            edit_form_title: 'Edit company',\r\n            new: {\r\n              fields: {\r\n                city: 'City',\r\n                name: 'Company name',\r\n                email: 'E-Mail [optional]',\r\n                state: 'State [optional]',\r\n                street: 'Street',\r\n                country: 'Country',\r\n                website: 'Website [optional]',\r\n                zipcode: 'Zipcode',\r\n                legal_form: 'Legal form [optional]',\r\n                name_short: 'Company name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                company_logo: 'Company logo (URL) [optional]',\r\n                customer_number: 'Customer Number',\r\n                industry_sector: 'Industry sector',\r\n                description_external: 'Description (external) [optional]',\r\n                description_internal: 'Description [optional]',\r\n              },\r\n              error_messages: {\r\n                url: 'Please specify a valid URL',\r\n                email: 'Please enter a valid e-mail address',\r\n                city_not_specified: 'Please specify a city',\r\n                name_not_specified: 'Please specify a company name',\r\n                street_not_specified: 'Please specify a street',\r\n                country_not_specified: 'Please select a country of origin',\r\n                zipcode_not_specified: 'Please specify a zipcode',\r\n                customer_number_not_specified: 'Please enter a customer number',\r\n                industry_sector_not_specified: 'Please select an industry sector',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The company was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Address',\r\n                country: 'Country',\r\n                website: 'Website',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'The CloudPlatform displays the company on a map, using latitude and longitude.',\r\n              intro_heading: 'Information regarding the location',\r\n              location_name: 'Name of the location:',\r\n              label_latitude: 'Latitude',\r\n              label_longitude: 'Longitude',\r\n              text_fallback_info: 'If not, the default coordinates will be used.',\r\n              text_location_found: 'A location was found.',\r\n              text_location_entered: 'The location was entered.',\r\n              text_success_location: 'We have set the following information based on your input:',\r\n              button_define_coordinates: 'Define coordinates yourself',\r\n              text_no_coordinates_found: 'No coordinates were found for the data you entered.',\r\n              text_coordinates_success_set: 'Coordinates successfully set.',\r\n              button_set_custom_coordinates: 'Set custom coordinates',\r\n              text_specify_coordinates_yourself: 'You can specify the coordinates yourself.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Add new location',\r\n            tabs: {\r\n              list: 'Halls',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Hall',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The location was successfully created.',\r\n            },\r\n            new_form_title: 'Add location',\r\n            edit_form_title: 'Edit location',\r\n            new: {\r\n              fields: {\r\n                city: 'City',\r\n                name: 'Location name',\r\n                email: 'E-Mail [optional]',\r\n                state: 'State [optional]',\r\n                street: 'Street',\r\n                country: 'Country',\r\n                website: 'Website [optional]',\r\n                zipcode: 'Zipcode',\r\n                language: 'spoken language [optional]',\r\n                name_short: 'Location name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                customer_number: 'Customer number [optional]',\r\n                description_internal: 'Description (internal) [optional]',\r\n              },\r\n              error_messages: {\r\n                email: 'Please enter a valid e-mail address',\r\n                city_not_specified: 'Please specify a city',\r\n                name_not_specified: 'Please specify a location name',\r\n                street_not_specified: 'Please specify a street',\r\n                country_not_specified: 'Please select a country of origin',\r\n                zipcode_not_specified: 'Please specify a zipcode',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The location was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Address',\r\n                country: 'Country',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'City',\r\n              email: 'E-mail',\r\n              street: 'Street',\r\n              country: 'Country',\r\n              website: 'Website',\r\n              postalCode: 'Zip code',\r\n              companyName: 'Company',\r\n            },\r\n            tabs: {\r\n              list: 'Companies',\r\n              worldmap: 'World map',\r\n            },\r\n            map: {\r\n              description_not_available: 'No description available',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Add',\r\n                back: 'Back to list',\r\n                edit: 'Update',\r\n                save: 'Save',\r\n                email: 'Send Image',\r\n                cancel: 'Cancel',\r\n                addMultiple: 'Add + new',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Edit Administration',\r\n          },\r\n          tooltip: {\r\n            chartTitleIconText: {\r\n              bad: {\r\n                plus: [\r\n                  null,\r\n                  '1: without tool',\r\n                ],\r\n                minus: [\r\n                  '0: Everything is fine; the tool was detected.',\r\n                  '-1: Reference not found',\r\n                  '-2: Empty measurement',\r\n                  '-3: Invalid measurement length',\r\n                  null,\r\n                  '-4: Unknown value error',\r\n                  '-6: Unknown exception',\r\n                ],\r\n              },\r\n              score: {\r\n                minus: [\r\n                  '>=0: Spindle-Score',\r\n                  '-1: Reference not found',\r\n                  '-2: Empty measurement',\r\n                  '-3: Invalid measurement length',\r\n                  '-4: Unknown value error',\r\n                  '-5: Invalid anomaly score error',\r\n                  '-6: Unknown exception',\r\n                ],\r\n              },\r\n            },\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Quality Assurance',\r\n          users: 'User management',\r\n          assets: 'Asset management',\r\n          settings: 'Settings',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'User Profile',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'User management',\r\n          assets: 'Asset management',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'User Profile',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: 'Area',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Line',\r\n          long: 'Long',\r\n          real: 'REAL',\r\n          true: 'Active',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inactive',\r\n          float: 'Float',\r\n          short: 'short',\r\n          state: 'State',\r\n          uword: 'UWORD',\r\n          '840dsl': 'Sinumerik 840dsl',\r\n          double: 'Double',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          string: 'String',\r\n          boolean: 'Boolean',\r\n          integer: 'Integer',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'External',\r\n          internal: 'Internal',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'One Year',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Add new variable',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'One month',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rectangle',\r\n          tabs: {\r\n            list: 'Variables list',\r\n          },\r\n          ten_years: 'Ten Years',\r\n          two_weeks: 'Two weeks',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Six month',\r\n          categorical: 'Categorical',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Something went wrong while trying to create an variable. Please try again later.',\r\n          },\r\n          new: {\r\n            fields: {\r\n              row: 'Row',\r\n              hint: '(Changes might break the machine)',\r\n              tags: 'Tags',\r\n              unit: 'Unit',\r\n              column: 'Column',\r\n              showId: 'Show Variable Id input field',\r\n              address: 'Address',\r\n              maxTime: 'Max time',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Data type',\r\n              language: 'Language',\r\n              nckBlock: 'NCK Block',\r\n              onChange: 'On Change',\r\n              rowCount: 'Row Count',\r\n              chartType: 'Chart type',\r\n              bufferSize: 'Buffer Size',\r\n              namePrefix: 'Name prefix',\r\n              uiRelevant: 'UI Relevant',\r\n              variableId: 'Variable Id',\r\n              collections: '',\r\n              displayName: 'Display Name',\r\n              intervalInS: 'Interval (seconds)',\r\n              machineType: 'Machine Type',\r\n              showInitial: 'Show Initial',\r\n              opcUaAddress: 'OPC UA Address',\r\n              brokerDataType: 'Broker data type',\r\n              classicAddress: 'Classic Address',\r\n              visibilityType: 'Visibility',\r\n              descriptionText: 'Description',\r\n              machineDataType: 'machine data type',\r\n              symbolicAddress: 'Symbolic Address',\r\n              dataTypeSelection: 'Data type',\r\n            },\r\n            buttons: {\r\n              delete: 'Delete variable',\r\n              addMachineType: 'Add new machine type',\r\n              removeDescription: 'Remove Description',\r\n              removeMachineType: 'Remove new machine type',\r\n            },\r\n            error_messages: {\r\n              row: 'Please specify a row',\r\n              unit: 'Please specify a unit',\r\n              column: 'Please specify a column',\r\n              address: 'Please specify a address',\r\n              maxTime: 'Please select a max time',\r\n              nckArea: 'Please specify a NCK Area',\r\n              dataType: 'Please select a data type',\r\n              language: 'Language is required',\r\n              nckBlock: 'Please specify a NCK Block',\r\n              onChange: \"Please set the 'on change' value.\",\r\n              rowCount: 'Please specify a row count',\r\n              chartType: 'Please select a chart type',\r\n              bufferSize: 'Please specify a buffer size',\r\n              namePrefix: 'Please specify a valid prefix Name. (valid chars: A-Z, _).',\r\n              variableId: 'Please specify a valid UUID',\r\n              displayName: 'Please specify a display name',\r\n              intervalInS: 'Please specify a interval (seconds)',\r\n              machineType: 'Please select a machine type',\r\n              showInitial: 'Please select a initial value.',\r\n              opcUaAddress: 'Please specify a OPC UA address',\r\n              allLocalesUsed: 'All available languages are already in use',\r\n              brokerDataType: 'Please select a broker data type',\r\n              classicAddress: 'Please specify a classic address',\r\n              namePrefixEdit: 'Please specify a valid prefix Name. (valid chars: A-Z a-z, _).',\r\n              visibilityType: 'Please select a visibility type',\r\n              descriptionText: 'Description text is required',\r\n              machineDataType: 'Please select a machine data type',\r\n              symbolicAddress: 'Please specify a symbolic address',\r\n              dataTypeSelection: 'Please select a data type',\r\n              minOneDescription: 'At least one description must be present',\r\n            },\r\n            descriptionInstance: 'Description',\r\n            machineTypeInstance: 'Machine Type',\r\n          },\r\n          new_form_title: 'New Variable',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Edit Variable',\r\n          success: {\r\n            message: 'The variable was successfully created',\r\n          },\r\n          editError: {\r\n            message: 'Something went wrong while trying to update an variable. Please try again later.',\r\n          },\r\n          editSuccess: {\r\n            message: 'The variable was successfully updated',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Successful uploads',\r\n          downloads: 'Successful downloads',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'An unexpected error occurred. Please try to reload the page.',\r\n            },\r\n            s_1: {\r\n              message: 'Your changes have been saved.',\r\n            },\r\n            s_930: {\r\n              message: \"Asset '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_931: {\r\n              message: \"Company '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_932: {\r\n              message: \"Line '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_933: {\r\n              message: \"Hall '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_934: {\r\n              message: \"Location '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_935: {\r\n              message: \"File '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_937: {\r\n              message: 'Shopfloor has been successfully updated.',\r\n            },\r\n            s_936: {\r\n              message_variables: \"Variable '%replaceValue' has been deleted successfully.\",\r\n              message_collections: \"Collection '%replaceValue' has been deleted successfully.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Duplicated Cards Deleted!',\r\n            add_line_to_dashboard: 'Line added to Dashboard',\r\n          },\r\n        },\r\n        common: {\r\n          external: 'External',\r\n          internal: 'Internal',\r\n          new: {\r\n            fields: {\r\n              language: 'Language',\r\n              descriptions: 'Descriptions',\r\n              visibilityType: 'Visibility',\r\n              descriptionText: 'Description',\r\n            },\r\n            buttons: {\r\n              addDescription: 'Add Description',\r\n              removeDescription: 'Remove Description',\r\n            },\r\n            error_messages: {\r\n              language: 'Language is required',\r\n              invalidId: 'Please specify a valid UUID',\r\n              allLocalesUsed: 'All available languages are already in use.',\r\n              visibilityType: 'Please select a visibility type',\r\n              descriptionText: 'Description text is required.',\r\n            },\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limit',\r\n            type: 'Select by type',\r\n            alarms: 'Alarms',\r\n            machine: 'Select by machine ID',\r\n            variables: 'Variables',\r\n            listImport: 'Limit Import',\r\n            listDownload: 'Limit Download',\r\n            data_warehouse: 'Datawarehouse',\r\n          },\r\n          text: {\r\n            text: 'Limits are values you set for variables that you are interested in. If a variable is not within the defined limits, you will receive a notification. Limits are also displayed in charts generated in the Time Series tab.',\r\n            title: 'Limits',\r\n          },\r\n          export: {\r\n            text: 'You can always export the currently set limits for all variables that are present in Cloud Platform. You can use this list as a reference or use it as to import all limits in one ho in the section Imports Limits as CSV',\r\n            title: 'Export Limits as CSV',\r\n          },\r\n          import: {\r\n            text: 'You can import a previsously downloaded CSV file with information on limits and subscribers to update the currently saved values. You can later choose to which asset or machine types you want to apply the imported limits',\r\n            title: 'Import Limits from CSV',\r\n            upload: {\r\n              title: '',\r\n            },\r\n            machines: {\r\n              title: 'Select the machines or machine type you want to apply the limits to.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Select the CSV file you want to Import',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Go to the desired line in the asset management.',\r\n            two: 'In the line’s header you can find a context menu.',\r\n            four: 'The line’s tile is added to the dashboard',\r\n            three: 'Click on the context menu, then select “add to dashboard”.',\r\n            header: 'Adding tiles',\r\n          },\r\n          individual: {\r\n            one: 'Select the settings button on the left.',\r\n            two: 'Select the “plus” icon.',\r\n            four: 'Confirm with “save”. The individual tile is added to the dashboard.',\r\n            three: 'Name your tile and add your desired machines.',\r\n            header: 'Adding individual tiles',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Add new user',\r\n          new: {\r\n            title: 'Create User',\r\n            status: 'User Status:',\r\n            buttons: {\r\n              add: 'Add',\r\n              back: 'Back to list',\r\n              save: 'Save',\r\n              cancel: 'Cancel',\r\n              delete: 'Delete User',\r\n              sendMail: 'Send initial mail',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'User Role',\r\n              gender: 'Gender',\r\n              created: 'Created',\r\n              lastName: 'Last name',\r\n              firstName: 'First name',\r\n              breadcrumb: 'display Breadcrumbs',\r\n              main_group: 'Main group',\r\n              phoneNumber: 'Phone number [optional]',\r\n              customer_org: 'Customer organization',\r\n              last_modified: 'Last modified',\r\n              email_validation: 'E-mail (validation)',\r\n            },\r\n            statusText: {\r\n              unknown: 'unknown',\r\n              archived: 'archived',\r\n              confirmed: 'Confirmed',\r\n              compromised: 'compromised',\r\n              unconfirmed: 'unconfirmed',\r\n              reset_required: 'reset required',\r\n              external_provider: 'external provider',\r\n              force_change_password: 'force change password',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'E-mail addresses do not match',\r\n              email_not_valid: 'Please specify a valid e-mail address',\r\n              phone_not_specified: 'Please specify a phone number start a + and followed by country code!',\r\n              roles_not_specified: 'Please select a main group',\r\n              gender_not_specified: 'Please specify a gender',\r\n              last_name_not_specified: 'Please specify a last name',\r\n              first_name_not_specified: 'Please specify a first name',\r\n              main_group_not_specified: 'Please select a main group',\r\n              family_name_not_specified: 'Please specify a last name',\r\n              customer_organization_not_specified: 'Please select a customer organization',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Failed!',\r\n          },\r\n          mail: {\r\n            success: 'An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n          },\r\n          update: {\r\n            title: 'Update User',\r\n          },\r\n          install: {\r\n            title: 'Not installed',\r\n          },\r\n          success: {\r\n            title: 'Success!',\r\n            button: 'Back to list',\r\n            message: 'The user was successfully created. An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n            message_for_edit: 'The user was successfully updated.',\r\n            message_send_mail: 'An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n            button_back_to_last_page: 'Back to last page',\r\n          },\r\n          delete: {\r\n            success: 'User successfully deleted.',\r\n            confirmation: {\r\n              title: 'Are you sure you want to delete this user?',\r\n              confirm: 'Yes, delete this user',\r\n              dismiss: 'No, cancel',\r\n              warning: 'The progress might be take a moment to appear in the list.',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Visitor',\r\n            customer: 'Customer',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'User',\r\n              email: 'E-mail',\r\n              company: 'Company',\r\n              enabled: 'Status',\r\n              lastName: 'Last name',\r\n              sw_admin: 'SW Admin',\r\n              firstName: 'First name',\r\n              userRights: 'User rights',\r\n              phoneNumber: 'Phone number',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'male',\r\n              female: 'female',\r\n              diverse: 'diverse',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarms',\r\n            type: 'Select by type',\r\n            machine: 'Select by machine ID',\r\n            listImport: 'Alarms Import',\r\n            listDownload: 'Alarms Download',\r\n          },\r\n          text: {\r\n            text: 'Alarm notifications can be set for the alarm numbers you are interested in. If the set alarm occurs on a defined machine, you will receive a notification.',\r\n            title: 'Alarm Notifications',\r\n          },\r\n          export: {\r\n            text: 'You can export the currently set alarm notifications of all machines in the SW CloudPlatform at any time. You can use this list as a reference or use it to import all alarm notifications at once in the “Import alarms as CSV” section.',\r\n            title: 'Exporting Alarms as CSV',\r\n          },\r\n          import: {\r\n            text: 'You can import a previously downloaded CSV file with information on alarms and subscribers to update the currently saved values. You can later select which system or machine types you want to apply the imported alarm notifications to.',\r\n            title: 'Import Alarms from CSV',\r\n            machines: {\r\n              title: 'Select the machines or machine type you want to apply the alarms to.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Select the CSV file you want to Import',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'no results found',\r\n          results: {\r\n            of: 'of',\r\n            lines: 'lines',\r\n            machines: 'Machines',\r\n          },\r\n          callToAction: 'search for machines',\r\n        },\r\n        maxSelectableDays: 'Max. %replaceValue days selectable.',\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Failed',\r\n            queued: 'Queued',\r\n            removed: 'Removed',\r\n            canceled: 'Canceled',\r\n            rejected: 'Rejected',\r\n            completed: 'Completed',\r\n            succeeded: 'Succeeded',\r\n            timed_out: 'Timed out',\r\n            in_progress: 'In progress',\r\n            not_installed: 'Not Installed',\r\n          },\r\n        },\r\n        backend: {\r\n          links: {\r\n            tile: 'Backend Links (Dev)',\r\n            reset: 'Local backend links have been reset.',\r\n            success: 'Backend-Links saved successfully',\r\n            description: 'Changes are saved locally and used only in the dev environment. If no local values are present, the URLs from the config are used.',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Start Import',\r\n            dismiss: 'cancel',\r\n            download: 'Start Download',\r\n          },\r\n          tabs: {\r\n            limits: 'Limits',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Name',\r\n              datatype: 'Data type',\r\n              chartType: 'Chart type',\r\n              displayName: 'Display name',\r\n            },\r\n          },\r\n          collections: {\r\n            grid: {\r\n              displayName: 'Display Name',\r\n              collectionName: 'Name',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'World map',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shop floor',\r\n          upload: {\r\n            text1: 'Send an image of your shopfloor layout to lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'If your machines are registered and enrolled in the SW CloudPlatform, they will appear on the left and send real-time data.',\r\n            text3: 'Then simply drag and drop the status on your plan at the correct machine.',\r\n            mainText: 'In this view, you can set up your individual shopfloor layout and see your machines through different information layers. Just follow these steps.',\r\n            tileTitle: 'Shopfloor upload',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset successfully deleted.',\r\n            confirmation: {\r\n              title: \"Are you sure you want to delete '%replaceValue'?\",\r\n              confirm: 'delete',\r\n              dismiss: 'cancel',\r\n              company: {\r\n                text: 'If you delete the company, all belonging users will also be deleted.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Asset',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Changes to NamePrefix or DataType may damage the machine.Are you sure you want to save?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Do you want to apply the limits of this new machine type?',\r\n              title: \"You've changed the machine type\",\r\n              accept: 'Yes, apply new Limits',\r\n              decline: 'No, keep current Limits',\r\n              dismiss: 'Cancel',\r\n              info_accept: 'To replace your current limits with the limits of the new machine type, choose Yes.',\r\n              info_decline: 'To keep your current limits, choose No.',\r\n              info_accept_warning: 'This will overwrite or delete all your current limits.',\r\n            },\r\n          },\r\n        },\r\n        locales: {\r\n          languages: {\r\n            cz: 'Český',\r\n            de: 'Deutsch',\r\n            en: 'English',\r\n            es: 'Español',\r\n            fr: 'Français',\r\n            hu: 'Magyar',\r\n            it: 'Italiano',\r\n            ko: '한국인',\r\n            pl: 'Polski',\r\n            tr: 'Türkçe',\r\n            zh: '中文',\r\n          },\r\n        },\r\n        collections: {\r\n          tabs: {\r\n            list: 'Collection list',\r\n            collections: 'Collections',\r\n          },\r\n          add_new_title: 'Add new Collection',\r\n          error: {\r\n            message: 'Something went wrong while trying to create a collection. Please try again later.',\r\n          },\r\n          new_form_title: 'New Collection',\r\n          edit_form_title: 'Edit Collection',\r\n          new: {\r\n            fields: {\r\n              tags: 'Tags',\r\n              showId: 'Show Collection Id input field',\r\n              uiRelevant: 'UI Relevant',\r\n              displayName: 'Display Name',\r\n              collectionId: 'Collection Id',\r\n              collectionName: 'Collection Name',\r\n            },\r\n            buttons: {\r\n              delete: 'Delete Collection',\r\n            },\r\n            error_messages: {\r\n              displayName: 'Please specify a display name',\r\n              collectionId: 'Please specify a valid UUID',\r\n              collectionName: 'Please specify a collection name',\r\n              descriptionText: 'Description text is required',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'The collection was successfully created',\r\n          },\r\n          editError: {\r\n            message: 'Something went wrong while trying to update a collection. Please try again later.',\r\n          },\r\n          editSuccess: {\r\n            message: 'The collection was successfully updated.',\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete File',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Hall',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Line',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'state',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Machine time',\r\n          controller_time: 'Controller time',\r\n          iot_gateway_time: 'IoT Gateway time',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'MM/DD/YYYY hh:mm:ss A',\r\n          setZoomToDatepicker: 'Set zoom to datepicker',\r\n          exporting: {\r\n            datetimeformat: 'MM/DD/YYYY hh:mm:ss A',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'No data available',\r\n              loading: 'Loading data...',\r\n              months: [\r\n                'January',\r\n                'February',\r\n                'March',\r\n                'April',\r\n                'May',\r\n                'June',\r\n                'July',\r\n                'August',\r\n                'September',\r\n                'October',\r\n                'November',\r\n                'December',\r\n              ],\r\n              resetZoom: 'Reset zoom',\r\n              weekdays: [\r\n                'Sunday',\r\n                'Monday',\r\n                'Tuesday',\r\n                'Wednesday',\r\n                'Thursday',\r\n                'Friday',\r\n                'Saturday',\r\n              ],\r\n              shortMonths: [\r\n                'Jan',\r\n                'Feb',\r\n                'Mar',\r\n                'Apr',\r\n                'May',\r\n                'June',\r\n                'July',\r\n                'Aug',\r\n                'Sept',\r\n                'Oct',\r\n                'Nov',\r\n                'Dec',\r\n              ],\r\n              shortWeekdays: [\r\n                'Sun',\r\n                'Mon',\r\n                'Tue',\r\n                'Wed',\r\n                'Thu',\r\n                'Fri',\r\n                'Sat',\r\n              ],\r\n              increaseDateRange: 'at least until',\r\n            },\r\n          },\r\n        },\r\n        data_warehouse: {\r\n          tabs: {\r\n            list: 'data warehouse',\r\n          },\r\n          export: {\r\n            csv: 'CSV',\r\n            json: 'JSON',\r\n            text: 'You can export the data warehouse data here. Please select the desired export format. You can choose between JSON, CSV, and Excel exports.',\r\n            excel: 'EXCEL',\r\n            title: 'Export of data warehouse data',\r\n          },\r\n          text: {\r\n            title: 'data warehouse',\r\n          },\r\n          select: {\r\n            export: {\r\n              type: 'Please select an export type',\r\n            },\r\n          },\r\n          confirm: {\r\n            missing: {\r\n              export_type: 'OK',\r\n            },\r\n          },\r\n          missing: {\r\n            selected: {\r\n              export_type: 'Please select the export format in which you would like to export the data warehouse data.',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Presets',\r\n            rangeTo: 'To',\r\n            selectDateRange: 'Please select a date range',\r\n            predefined: {\r\n              today: 'Today',\r\n              custom: 'Custom Range',\r\n              last7days: 'Last 7 days',\r\n              yesterday: 'Yesterday',\r\n              last24Hours: 'Last 24 hours',\r\n              last5Minutes: 'Last 5 minutes',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Edit variable',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete variable',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Select language',\r\n        },\r\n        informationSecurity: {\r\n          title: 'Information Security at SW',\r\n          subtitle: 'Cybersecurity from Development to Operation',\r\n          footer: {\r\n            agb: 'Terms & Standards',\r\n            copyright: 'Schwäbische Werkzeugmaschinen GmbH',\r\n            impressum: 'Imprint',\r\n            datenschutz: 'Data Protection',\r\n          },\r\n          psirt: {\r\n            email: 'product.security@sw-machines.com',\r\n          },\r\n          table: {\r\n            title: 'Current Security Advisories',\r\n            headers: {\r\n              status: 'Status',\r\n              severity: 'Severity',\r\n              advisoryId: 'Advisory ID',\r\n              description: 'Description',\r\n              releaseDate: 'Release Date',\r\n              affectedProduct: 'Affected Product',\r\n            },\r\n          },\r\n          download: {\r\n            text: 'Download our reporting form or contact our PSIRT directly by email.',\r\n            title: 'Submit a Security Report',\r\n            button: {\r\n              email: 'Contact us by Email',\r\n              download: 'Download Report Form',\r\n            },\r\n          },\r\n          section1: {\r\n            text: 'At SW, cybersecurity is a firm and fundamental component of product development. Already in the planning and development phase, we identify potential risks and take appropriate security measures into account. Through the application of the Secure by Design and Secure by Default principles as well as established security standards, we develop products that are designed for security and resilience from the start.',\r\n            title: 'Cybersecurity from the Start',\r\n          },\r\n          section2: {\r\n            text: 'Cybersecurity does not end with product delivery. Throughout the entire product lifecycle, we monitor and assess new threats and potential vulnerabilities, and provide necessary security updates. Through structured processes for vulnerability management, security updates, and the handling of security incidents, we support the long-term security of our products and their users.',\r\n            title: 'Continuous Protection in Operation',\r\n          },\r\n          section3: {\r\n            text: 'Traceability is an important part of effective cybersecurity. That is why we document security requirements, risk assessments, and essential protective measures throughout the entire product lifecycle. Clear processes for maintenance, changes, and handling of vulnerabilities create transparency, support the long-term security of our products, and help our customers and us to meet regulatory requirements.',\r\n            title: 'Transparency Throughout the Product Lifecycle',\r\n          },\r\n          services: {\r\n            title: 'Our Services in Information Security',\r\n            psirt: {\r\n              text: 'The Product Security Incident Response Team (PSIRT) of SW is the central point of contact for security vulnerabilities and security-related incidents in our products. The team coordinates the structured assessment, processing, and tracking of incoming reports. This supports responsible handling of vulnerabilities and the requirements of modern cybersecurity standards, including the Cyber Resilience Act (CRA).',\r\n              title: 'SW PSIRT',\r\n            },\r\n            advisories: {\r\n              text: 'SW Security Advisories serve to transparently communicate security-related information about our products. They contain information on identified vulnerabilities, their assessment, available security updates, and recommended measures to reduce risk. This enables our customers to appropriately assess security risks internally and implement suitable protective measures.',\r\n              title: 'SW Security Advisories',\r\n            },\r\n          },\r\n          linksDownloads: {\r\n            title: 'Links & Downloads',\r\n            securityTxt: 'Security TXT',\r\n            dataProtection: 'Data Protection',\r\n            vulnerabilityGuideline: 'Vulnerability Disclosure Guideline',\r\n          },\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Company',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Location',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'state',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Configure Dashboard',\r\n            hide: {\r\n              title: 'Hide',\r\n            },\r\n            show: {\r\n              title: 'Show',\r\n            },\r\n            delete: {\r\n              title: 'Delete',\r\n            },\r\n            add: {\r\n              fab_title: 'Add custom tile',\r\n            },\r\n            save: {\r\n              fab_title: 'Save configuration',\r\n            },\r\n            move_left: {\r\n              title: 'Move to the previous position',\r\n            },\r\n            move_right: {\r\n              title: 'Move to the next position',\r\n            },\r\n            discard: {\r\n              fab_title: 'Discard configuration',\r\n            },\r\n            add_custom_card: {\r\n              save: 'save',\r\n              input: 'Enter tile name',\r\n              title: 'Add custom tile',\r\n              cancel: 'cancel',\r\n              missingMachine: 'You need to select at least one machine',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'An unexpected error occurred. Please try to reload the page.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Success',\r\n            },\r\n            e_3xx: {\r\n              message: 'Redirection',\r\n            },\r\n            e_400: {\r\n              message: 'The request was malformed and could not be processed.',\r\n            },\r\n            e_401: {\r\n              message: 'You are not authenticated. Please login again.',\r\n            },\r\n            e_403: {\r\n              message: 'You do not have sufficient rights to access the requested resource.',\r\n            },\r\n            e_404: {\r\n              message: 'The requested resource is not available.',\r\n            },\r\n            e_405: {\r\n              message: 'Method Not Allowed.',\r\n            },\r\n            e_406: {\r\n              message: 'Method Not Acceptable',\r\n            },\r\n            e_409: {\r\n              message: 'The resource you are trying to add already exists.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Method Unprocessable Content',\r\n            },\r\n            e_4xx: {\r\n              message: 'Client error',\r\n            },\r\n            e_500: {\r\n              message: 'An internal server error occurred.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Server error',\r\n            },\r\n            e_900: {\r\n              message: 'Something went wrong while trying to add an asset. Please try again later.',\r\n            },\r\n            e_901: {\r\n              message: 'The action was canceled. No new asset was created.',\r\n            },\r\n            e_902: {\r\n              message: 'The action was canceled. No service request has been sent.',\r\n            },\r\n            e_903: {\r\n              message: 'Something went wrong while trying to send the service request. Please try again later.',\r\n            },\r\n            e_904: {\r\n              message: \"Asset '%replaceValue' has been created successfully. You can now add another asset.\",\r\n            },\r\n            e_905: {\r\n              message: 'The action was canceled. The asset has not been updated.',\r\n            },\r\n            e_906: {\r\n              message: \"Asset '%replaceValue' has been moved successfully.\",\r\n            },\r\n            e_910: {\r\n              message: 'Something went wrong while trying to add a user. Please try again later.',\r\n            },\r\n            e_911: {\r\n              message: 'You canceled the current action. No user has been created.',\r\n            },\r\n            e_912: {\r\n              message: 'Something went wrong while trying to update an asset. Please try again later.',\r\n            },\r\n            e_920: {\r\n              message: 'You canceled the current action. No changes saved.',\r\n            },\r\n            e_921: {\r\n              message: 'An unspecified error occured. Please try again later.',\r\n            },\r\n            e_922: {\r\n              message: 'Your username and/or password is incorrect. Please try again.',\r\n            },\r\n            e_923: {\r\n              message: 'Please specify an e-mail and a password.',\r\n            },\r\n            e_924: {\r\n              message: 'Your session expired due to inactivity. Please login again.',\r\n            },\r\n            e_925: {\r\n              message: 'You need to accept our privacy policy in order to use the platform.',\r\n            },\r\n            e_926: {\r\n              message: 'Your account is temporarily locked. Please try again later.',\r\n            },\r\n            e_927: {\r\n              message: 'Your password change request has been recorded successfully. Please check your e-mail account for further instructions.',\r\n            },\r\n            e_928: {\r\n              message: 'The action was canceled. No file has been uploaded.',\r\n            },\r\n            e_929: {\r\n              message: 'An error occurred while attempting to upload a file. Please try again at a later time.',\r\n            },\r\n            e_930: {\r\n              message: 'Something went wrong while trying to delete the file. Please try again later.',\r\n            },\r\n            e_931: {\r\n              message: 'Custom date range are to big. Default of 24H is set. Max date range %replaceValue days',\r\n            },\r\n            e_932: {\r\n              message: 'Asset has children. Delete children first.',\r\n            },\r\n            e_935: {\r\n              message: 'Internal Sever Error occurred during deletion. Please try again later.',\r\n            },\r\n            e_10500: {\r\n              message: 'Server Timeout - The processing of the request took to long to finish successfully',\r\n            },\r\n            e_10501: {\r\n              message: 'You are using an unsupported Browser. The CloudPlatform needs one of the following browsers: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'This asset (machine identifier %replaceValue) already exists',\r\n            },\r\n            e_410_asset: {\r\n              message: 'This file %replaceValue already exists',\r\n            },\r\n            e_409_variables: {\r\n              message: 'This variable %replaceValue already exists.',\r\n            },\r\n            e_933: {\r\n              message_variables: \"Variable '%replaceValue' has been created successfully. You can now add another variable.\",\r\n              message_collections: \"Collection '%replaceValue' has been created successfully. You can now add another collection.\",\r\n            },\r\n            e_934: {\r\n              message_variables: 'Something went wrong while trying to delete the variable. Please try again later.',\r\n              message_collections: 'Something went wrong while trying to delete the collection. Please try again later.',\r\n            },\r\n            e_409_collections: {\r\n              message: 'This Collection %replaceValue already exists.',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Only %s items can be selected at a time',\r\n              title: 'Max. amount reached',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Time filter',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'No files available.',\r\n              file_cardTitle: 'Machine Events',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Download data',\r\n                },\r\n              },\r\n            },\r\n            files: {\r\n              no_files_text: 'No files available.',\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC Trace Files',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'No alarms available',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC Comparison Files',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC State Files',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'No files available.',\r\n              file_cardTitle: 'ToolMon Files',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Download ToolMon data',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Trigger',\r\n              column_title_filename: 'File name',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Download data',\r\n                },\r\n              },\r\n              column_title_creation_date: 'Creation Date',\r\n            },\r\n            toolmon_health: {\r\n              file_cardTitle: 'ToolMon Health Files',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI flight recorder Files',\r\n            },\r\n            hydraulic_cylinder: {\r\n              file_cardTitle: 'Hydraulic Cylinder Files',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  en: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Logout',\r\n        release: \"On '%replaceValue1' to '%replaceValue2' maintenance work will be carried out on the platform. The platform will be partially unavailable during this period.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Close',\r\n        acceptLabel: 'Accept',\r\n        userProfile: 'User Profile',\r\n        button: {\r\n          clear: 'Remove Chart',\r\n          timeline: 'Limit adjustment',\r\n          separateCharts: 'Separate Charts',\r\n        },\r\n        declineLabel: 'Decline',\r\n        backToDashboard: 'Back to Dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / standards',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Contact',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: 'Imprint',\r\n          },\r\n          privacy: {\r\n            title: 'Privacy',\r\n            header: 'Privacy Policy',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/en/',\r\n            title: 'SW homepage',\r\n          },\r\n        },\r\n        noInternetConnection: 'It seems that you are not connected to the internet. Please ensure you are connected.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'of',\r\n          noData: 'No data',\r\n          search: 'Search',\r\n          dateFormat: 'MM/DD/YYYY',\r\n          downloaded: 'downloaded',\r\n          noDuration: 'no duration available',\r\n          timeFormat: 'hh:mm:ss A',\r\n          notLicensed: 'Your machine is not licensed.',\r\n          alarmPending: 'alarm pending',\r\n          buttons: {\r\n            back: 'Back',\r\n            save: 'Save',\r\n            view: 'View',\r\n            cancel: 'Cancel',\r\n            custom: 'Save + Set custom range',\r\n            submit: 'Submit',\r\n            export: {\r\n              limit: 'Download Limits',\r\n              alarms: 'Download Alarms',\r\n              data_warehouse: 'Download Data Warehouse',\r\n              data_warehouse_csv: 'Download Data Warehouse as CSV',\r\n              data_warehouse_json: 'Download Data Warehouse as JSON',\r\n              data_warehouse_excel: 'Download Data Warehouse as Excel',\r\n            },\r\n            import: {\r\n              limit: 'Start',\r\n              alarms: 'Start',\r\n            },\r\n            refreshReset: 'Reset to default time',\r\n            refreshConfig: 'Reset to Config',\r\n            selectAllCheckboxes: 'Select all checkboxes',\r\n            unselectAllCheckboxes: 'Unselect all checkboxes',\r\n          },\r\n          notAvailable: 'Not available',\r\n          notConnected: 'Not connected yet',\r\n          download: {\r\n            file: 'File Downloads',\r\n          },\r\n          dateTimeFormat: 'MM/DD/YYYY hh:mm:ss A',\r\n          timeFormats: {\r\n            day: 'day',\r\n            days: 'days',\r\n            hour: 'hour',\r\n            year: 'year',\r\n            hours: 'hours',\r\n            month: 'month',\r\n            years: 'years',\r\n            minute: 'minute',\r\n            months: 'months',\r\n            second: 'second',\r\n            minutes: 'minutes',\r\n            seconds: 'seconds',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'hh:mm A',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Understood',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: \"You won't be able to revert this!\",\r\n        },\r\n        error: {\r\n          upload: 'Failed uploads',\r\n          download: 'Failed downloads',\r\n          message: {\r\n            enrollment_code_409: 'Device is already enrolled in aws.',\r\n            limit_change_failed: 'There was an error changing the limits. Please try again or contact lifedata@sw-machines.com',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'time recordings',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Select variables',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Date',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Secure Attended Access',\r\n            directAccess: 'Direct access',\r\n            new: {\r\n              fields: {\r\n                id: 'Enter ID',\r\n                cOnePanel: 'with C|One',\r\n                sessionType: 'Session type',\r\n              },\r\n              error_messages: {\r\n                id: 'Please enter a Session-ID or Device ID',\r\n                sessionType: 'Please select a Session type',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: 'Machines',\r\n              shopfloor: 'Shop floor',\r\n            },\r\n            fab_title: 'Add new line',\r\n            grid: {\r\n              hall: 'Hall',\r\n              line: 'Line',\r\n              type: 'Type',\r\n              contractEnd: 'Contract end',\r\n              cellPosition: 'Cell / position',\r\n              operationStep: 'Processing step',\r\n              machineIdentifierSw: 'Machine no. (SW)',\r\n              machineIdentifierCustomer: 'Machine name',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The line was successfully created.',\r\n            },\r\n            new_form_title: 'Add line',\r\n            edit_form_title: 'Edit line',\r\n            new: {\r\n              fields: {\r\n                name: 'Line name',\r\n                name_short: 'Line name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a line name',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The line was successfully updated.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Add new hall',\r\n            grid: {\r\n              part: 'Part',\r\n              lineName: 'Line',\r\n              typeOfLoading: 'Type of loading',\r\n              lineResponsible: 'Line manager',\r\n              plannedQuantity: 'Planned quantity',\r\n              numberOfMachines: '# Machines',\r\n            },\r\n            tabs: {\r\n              list: 'Lines',\r\n              shopfloor: 'Shop floor',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The hall was successfully created.',\r\n            },\r\n            new_form_title: 'Add hall',\r\n            shopfloor: {\r\n              edit: 'Edit Mode',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Save configuration',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Discard configuration',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Edit hall',\r\n            new: {\r\n              fields: {\r\n                name: 'Hall name',\r\n                name_short: 'Hall name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                description_external: 'Description (external) [optional]',\r\n                description_internal: 'Description (internal) [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a hall name',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The hall was successfully updated.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Description [optional]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Add new asset',\r\n            tabs: {\r\n              info: 'Time series',\r\n              alarms: 'Alarms',\r\n              events: 'Machine Events',\r\n              gateway: 'Gateway',\r\n              service: 'Service',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Swimlane',\r\n              'axis-test': 'Axis tests',\r\n              collection: 'Collections',\r\n              technology: 'Technology',\r\n              maintenance: 'Maintenance',\r\n              performance: 'Performance',\r\n              spindledata: 'Spindle data',\r\n              remoteaccess: 'Remote Access',\r\n              enduranceTest: 'End of line Test',\r\n              administration: 'Administration',\r\n              y_title: {\r\n                status: 'status',\r\n                status_table_one: 'table 1',\r\n                status_table_two: 'table 2',\r\n              },\r\n              energymonitoring: 'Energy monitoring',\r\n              technology_undefined: 'undefined',\r\n              technology_undefined_condition: 'undefined condition!',\r\n            },\r\n            move: {\r\n              message: \"You can move the asset '%replaceValue' to a new company, location, hall and/or line now.\",\r\n              select_hall_label: 'Select new hall',\r\n              select_line_label: 'Select new line',\r\n              select_company_label: 'Select new company',\r\n              select_location_label: 'Select new location',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Machine no. (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Machine startup date [optional]',\r\n                shipping: 'Machine Shipping date [optional]',\r\n                controller: 'Controller',\r\n                machine_type: 'Machine type',\r\n                warranty_end: 'Machine warranty end [optional]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Systems Manager',\r\n                warranty_start: 'Machine warranty start [optional]',\r\n                machine_swmp_api: 'Machine SWMP api end [optional]',\r\n                machine_swsp_trace: 'Machine SWSP trace end [optional]',\r\n                machine_swcp_portal: 'Machine SWCP portal end [optional]',\r\n                start_of_production: 'Machine start of production [optional]',\r\n                machine_swcp_support: 'Machine SWCP support end [optional]',\r\n                machine_cell_position: 'Machine cell / position [optional]',\r\n                machine_swsp_line_mon: 'Machine SWSP lineMon end [optional]',\r\n                machine_identifier_customer: 'Machine ID (customer)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Please specify a valid SW machine no. (min. 7 chars: A-Z, 0-9, -)',\r\n                controller_not_specified: 'Please select a controller',\r\n                machine_type_not_specified: 'Please specify a machine type',\r\n                machine_identifier_customer_not_specified: 'Please specify a customer machine ID',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The asset was successfully created.',\r\n            },\r\n            toolmon: {\r\n              score: 'Spindle-Score Table 1 & 2',\r\n              state_a_u: 'Teach active Table 1 & 2',\r\n              g_function: 'G-Function',\r\n              active_tool: 'Active Tool',\r\n              analyzer_ok: 'Analyzer ok',\r\n              bad_workpiece: 'Spindle No Tool State Table 1 & 2',\r\n              spindle_active: 'Spindle active',\r\n              tech_finalized: 'Teach finalized Table 1 & 2',\r\n              p8_toolmon_active: 'Toolmon active',\r\n              q_axis_and_spindle: 'Q-Axis and Spindle',\r\n              p8_toolmon_skip_step: 'Skip Step',\r\n              target_spindle_speed: 'Target spindle speed',\r\n              p8_toolmon_bad_workpiece: 'Workpiece not ok',\r\n              p8_toolmon_delta_t_first_g1: 'Delta T to G1',\r\n              p8_toolmon_n_encoder_strokes: 'Encoder strokes (HMI)',\r\n              p8_toolmon_analyzer_check_result: 'Analyzer ok',\r\n              p8_tool_breakage_sensitivity_limit: 'Sensitivity limit (HMI)',\r\n              p8_toolmon_tool_life_and_skip_step: 'Uploaded triggers',\r\n              p8_tool_breakage_step_end_increasing: 'Step end increasing',\r\n            },\r\n            new_form_title: 'New asset',\r\n            edit_form_title: 'Edit asset',\r\n            move_form_title: 'Move asset',\r\n            technology: {\r\n              table: 'Table',\r\n              change: 'Change',\r\n              g_mode: 'G-Function',\r\n              off_time: 'Auxiliary Process Time',\r\n              no_change: 'No Change',\r\n              undefined: 'Undefined',\r\n              active_tool: 'Active Tool',\r\n              analyzer_ok: 'Analyzer ok',\r\n              tool_change: 'Tool Change',\r\n              machining_time: 'Machining Time',\r\n              tool_change_time: 'Tool Change Time',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'process time table 1',\r\n                  name_two: 'process time table 2',\r\n                  name_one_undefined: 'undefined process time table 1',\r\n                  name_two_undefined: 'undefined process time table 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q-Axis and Spindle',\r\n              undefined_gmode_data: 'g-function data undefined',\r\n              undefined_table_data: 'condition table data undefined',\r\n              auxiliary_process_time: 'Auxiliary process time',\r\n              undefined_analyzer_data: 'analyzer ok data undefined',\r\n              undefined_activetool_data: 'active tool data undefined',\r\n              undefined_tool_change_data: 'tool change data undefined',\r\n              undefined_machining_time_table_one: 'undefined condition table 1',\r\n              undefined_machining_time_table_two: 'undefined condition table 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Machining-, Tool change- & Auxiliary process time Table 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Machining-, Tool change- & Auxiliary process time Table 2',\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The asset was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Date of shipping',\r\n                controller: 'Controller',\r\n                contractEnd: 'Date of contract end',\r\n                machineType: 'Machine type',\r\n                startupDate: 'Date of startup',\r\n                warrantyEnd: 'End of warranty',\r\n                cellPosition: 'Machine cell / position',\r\n                warrantyStart: 'Begin of warranty',\r\n                customerNumber: 'Customer Number',\r\n                enrollmentConfig: 'Enrollment-Configuration',\r\n                startOfProduction: 'Start of production',\r\n                machineIdentifierSw: 'Machine no. SW',\r\n                enrollmentConfigDownload: 'Download',\r\n                machineIdentifierCustomer: 'Customer machine name',\r\n              },\r\n            },\r\n            add_line_to_dashboard: 'Add line to dashboard',\r\n            elements: {\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'In case of an error, please contact',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Please provide us the data via the Netcfg form.',\r\n                  intro: 'In order to be able to connect your machine, we need information on your network configuration.',\r\n                  title: 'Network Configuration',\r\n                  goToNetconfig: 'Open Network Config',\r\n                },\r\n                device: {\r\n                  title: 'Device details',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Please perform the following steps if the IoT Gateway looks like that:',\r\n                  line1: 'Download the enrollment file by clicking on the button on the tile’s bottom.',\r\n                  line2: 'Download will start automatically.',\r\n                  line3: 'Put the .json file in the root directory on a USB stick. Make sure that the file is named',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Make sure you have the following files in the root of the USB stick:',\r\n                  line6: 'Insert the USB stick into the corresponding IoT Gateway.',\r\n                  line7: 'Enrollment will start automatically, signalized by a slowly flashing green user LED.',\r\n                  line8: 'After successful enrollment, the green LED is on until the USB stick is removed.',\r\n                  title: 'Enrollment',\r\n                  button: 'Enrollment file',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Download the migrate-iot.zip and extract its content directly to an empty USB stick.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Download the',\r\n                  line4: ' and also put it directly on the USB stick. Make sure that the file is named',\r\n                  line5: 'Make sure you have the following files in the root of the USB stick:',\r\n                  line6: 'install.json',\r\n                  line7: 'aws-migrate-iot.tar.gz',\r\n                  line8: 'aws-migrate-iot.tar.gz.sig',\r\n                  line9: 'aws.json',\r\n                  title: 'Platform Migration and enrollment',\r\n                  line10: 'The, files have been modified as of 10/27/2023. Please be sure to download them again and do not use the old version.',\r\n                  line11: 'Insert the USB stick into the corresponding IoT Gateway.',\r\n                  line12: 'Software will run automatically, signalized by a flashing yellow LED.',\r\n                  line13: 'After successful migration, the green LED is on until the USB stick is removed.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generate',\r\n                headline: 'Time series',\r\n                noChartMessage: 'Please select one or more variables on the left and click on Generate to display your metrics',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              'axis-test': {\r\n                unit: 'Unit',\r\n                value: 'Value',\r\n                kpiUnit: 'Unit',\r\n                headline: 'Axis test',\r\n                kpiValue: 'Value',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Load from browser storage',\r\n                limitsSave: 'Save to browser storage',\r\n                selectAxis: 'Select axis',\r\n                limitsExport: 'Export limits to clipboard',\r\n                openAxistest: 'Open Axistest',\r\n                axisTestPlural: 'Axistests',\r\n                adjustments: {\r\n                  add: 'Add local adjustment',\r\n                  range: 'Range',\r\n                  header: 'Local adjustment',\r\n                  remove: 'Remove',\r\n                  position: 'Position',\r\n                  amplitude: 'Amplitude',\r\n                  spreadMultiplier: 'Limit multiplier',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Position',\r\n                    y: 'Current',\r\n                    up: 'positive direction',\r\n                    down: 'negative direction',\r\n                    limitsUp: 'limits positive direction',\r\n                    limitsDown: 'limits negative direction',\r\n                    sliderSlopeCenter: 'Slope origin',\r\n                    sliderSlopeFactor: 'Slope factor',\r\n                    sliderVerticalOffset: 'Y offset',\r\n                    sliderVerticalSpread: 'Limit width',\r\n                    sliderQuadraticCenter: 'Quadratic origin',\r\n                    sliderQuadraticFactor: 'Quadratic factor',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'clockwise',\r\n                    limitsClockwise: 'limits clockwise',\r\n                    counterClockwise: 'counter-clockwise',\r\n                    sliderSineOffset: 'Wave offset',\r\n                    sliderSineAmplitude: 'Wave amplitude',\r\n                    sliderSineFrequency: 'Wave frequencz',\r\n                    sliderVerticalOffset: 'Y offset',\r\n                    sliderVerticalSpread: 'Limit width',\r\n                    limitsCounterClockwise: 'limits counter-clockwise',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Velocity',\r\n                  pulseMaxRampUp: 'Ramp ->',\r\n                  pulseMaxRampDown: 'Ramp <-',\r\n                  pulseMaxStiffness: 'Stiffness max',\r\n                  pulseMinStiffness: 'Stiffness min',\r\n                  pulseMeanStiffness: 'Stiffness Ø',\r\n                  circularReversalRange: 'Circular hysteresis',\r\n                  pulseMaxUpPathCurrent: 'Current max ->',\r\n                  pulseMinUpPathCurrent: 'Current min ->',\r\n                  pulseMeanUpPathCurrent: 'Current Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Current max <-',\r\n                  pulseMinDownPathCurrent: 'Current min <-',\r\n                  pulseMeanDownPathCurrent: 'Current Ø <-',\r\n                  circularShapeDeviationClockwise: 'Circular deviation clockwise',\r\n                  pulseStiffnessStandardDeviation: 'Stiffness σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Current σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Current σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Circular deviation counter-clockwise',\r\n                },\r\n                measurementSeries: [\r\n                  'without group',\r\n                  'before geometry',\r\n                  'after geometry',\r\n                  'commissioning end',\r\n                  'FingerPrint',\r\n                ],\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Circularity',\r\n                  EQUABILITY: 'Equability',\r\n                  CIRCULARITY: 'Circularity',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'No Axistest available',\r\n                },\r\n              },\r\n              alarms: {\r\n                headline: 'Alarm map',\r\n              },\r\n              service: {\r\n                contact: 'Please contact',\r\n                headline: 'Service',\r\n                update: {\r\n                  title: 'Update File',\r\n                },\r\n                upload: {\r\n                  title: 'Upload File',\r\n                  fields: {\r\n                    file: 'File',\r\n                    language: 'File language',\r\n                    file_name: 'File name',\r\n                    list_of_languages: {\r\n                      cs: 'Croatian',\r\n                      cz: 'Czech',\r\n                      da: 'Danish',\r\n                      de: 'German',\r\n                      en: 'English',\r\n                      es: 'Spanish',\r\n                      fr: 'French',\r\n                      hu: 'Hungarian',\r\n                      it: 'Italian',\r\n                      ko: 'Korean',\r\n                      mk: 'Macedonia',\r\n                      nl: 'Dutch',\r\n                      pl: 'Polish',\r\n                      pt: 'Portuguese',\r\n                      ro: 'Romanian',\r\n                      sk: 'Slovak',\r\n                      sl: 'Slovenian',\r\n                      sv: 'Swedish',\r\n                      tr: 'Turkish',\r\n                      zh: 'Chinese',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Upload',\r\n                    cancel: 'Cancel',\r\n                  },\r\n                  success: {\r\n                    title: 'Success',\r\n                    button: 'Back to service overview',\r\n                    message: 'The file has been successfully uploaded.',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Please specify a file name',\r\n                    file_not_valid: 'Please specify a file / Please select a smaller file.',\r\n                    language_not_specified: 'Please specify a file language.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Manuals',\r\n                },\r\n                version: {\r\n                  title: 'version files',\r\n                },\r\n                contracts: {\r\n                  title: 'Contracts',\r\n                },\r\n                components: {\r\n                  title: 'Hardware and Software Components',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Spareparts',\r\n                },\r\n                consumeables: {\r\n                  title: 'Consumeables',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Update',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'To activate a machine for remote access, TeamViewer must be installed on the IoT Gateway.',\r\n                  line2: 'If this is not yet the case, install TeamViewer by just clicking “install”.',\r\n                  title: 'Install remote support',\r\n                  status: 'Deployment state',\r\n                  copy: {\r\n                    button: 'Copy link',\r\n                  },\r\n                  install: {\r\n                    button: 'Install TeamViewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Start Session',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT-Gateway',\r\n                  values: {\r\n                    box_id: 'Box ID',\r\n                    machine_connect: 'machine connect',\r\n                    operating_system: 'operating system',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Need help with your machine?',\r\n                  line2: 'Contact us!',\r\n                  title: 'Message to SW Service',\r\n                  button: 'Contact Service',\r\n                  fields: {\r\n                    name: 'Machine identifier (SW)',\r\n                    type: 'Type',\r\n                    email: 'E-mail',\r\n                    message: 'Message',\r\n                    phone_no: 'Phone no.',\r\n                    last_name: 'Last name',\r\n                    first_name: 'First name',\r\n                    contact_person: 'Contact person (SW) [optional]',\r\n                    list_of_types: {\r\n                      request: 'Request',\r\n                      service: 'Service',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Expansion',\r\n                      inspection: 'Inspection',\r\n                    },\r\n                    machine_identifier_customer: 'Machine identifier (customer) [optional]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Send request',\r\n                    cancel: 'Cancel',\r\n                  },\r\n                  success: {\r\n                    title: 'Success',\r\n                    button: 'Back to service overview',\r\n                    message: 'The request has been successfully sent to SW Service.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Please specify a valid e-mail address',\r\n                    name_not_specified: 'Please specify a valid SW machine no. (min. 7 chars: A-Z, 0-9, - _)',\r\n                    phone_not_specified: 'Please specify a phone number',\r\n                    message_not_specified: 'Please enter a message',\r\n                    last_name_not_specified: 'Please specify a last name',\r\n                    first_name_not_specified: 'Please specify a first name',\r\n                    family_name_not_specified: 'Please specify a last name',\r\n                    contact_type_not_specified: 'Please specify a request type',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Machine Software',\r\n                  values: {\r\n                    nc_version: 'NC version',\r\n                    hmi_version: 'HMI version',\r\n                    plc_version: 'PLC version',\r\n                    compile_cycles: 'compile cycles',\r\n                    operating_system: 'operating system',\r\n                    pcu_base_version: 'PCU base version',\r\n                    plc_toolbox_version: 'PLC toolbox version',\r\n                    plc_user_program_version: 'PLC user program version',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'The name of the file has been successfully updated.',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Remote support',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: \"In the service assistant space you'll be guided through various troubleshooting processes.\",\r\n                  title: 'Service Assistant',\r\n                  sub_title: 'Are you currently having a problem with one of your assets?',\r\n                  open_assistant: 'Open Service Assistant',\r\n                  request_account: 'Request Account',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Spindle statistics SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'On',\r\n                labelOffline: 'Off',\r\n              },\r\n              swimlane: {\r\n                headline: 'Swimlane',\r\n              },\r\n              endurance: {\r\n                headline: 'End of line test',\r\n                chartTitles: {\r\n                  runtime: 'runtime data',\r\n                  endurance: 'End of line test',\r\n                  operation: 'operation mode',\r\n                  qaxis_180: 'Q-axis 180°',\r\n                  nc_program: 'NC program',\r\n                  stacklights: '3 Stacklights',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Sending status',\r\n                aborted: 'aborted',\r\n                sending: 'sending',\r\n                undefined: 'undefined',\r\n                interrupted: 'interrupted',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Alarm map',\r\n              },\r\n              collection: {\r\n                headline: 'Collection',\r\n                noChartMessage: 'Please choose any collection on the left.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Sum',\r\n                  header: 'Performance Kpi',\r\n                  target: 'Target',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarms',\r\n                  category: [\r\n                    'Not classified',\r\n                    'Error message',\r\n                    'Operation message',\r\n                    'Status message',\r\n                    'Operating Instruction',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Duration',\r\n                    flatlist: 'Flat list',\r\n                    frequency: 'Frequency',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Time',\r\n                    trend: 'Trend',\r\n                    duration: 'Duration',\r\n                    leftTime: 'Left time',\r\n                    alarmCount: 'Number',\r\n                    alarmNumber: 'Alarm no.',\r\n                    description: 'Description',\r\n                    alarmOccured: 'Alarm occured',\r\n                    alarmClassification: 'Alarm classification',\r\n                    alarmCountSecondRange: 'Number T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'increasing',\r\n                      down: 'decreasing',\r\n                      flat: 'unchanged',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Details',\r\n                  ncProgram: 'NC program',\r\n                  lastModified: 'Last modified',\r\n                  machineState: 'Machine state',\r\n                  numberAlarms: 'Alarms pending',\r\n                  stopCondition: 'Stop conditions',\r\n                  ncProgramState: 'NC program state',\r\n                  protectionLevel: 'Protection level',\r\n                  ncProgramStates: [\r\n                    'aborted',\r\n                    'halted',\r\n                    'running',\r\n                    'waiting',\r\n                    'interrupted',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'System',\r\n                    'Manufacturer',\r\n                    'Service',\r\n                    'User',\r\n                    'Key switch position 3',\r\n                    'Key switch position 2',\r\n                    'Key switch position 1',\r\n                    'Key switch position 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Cycle time',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Cycle time in s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'o.k.',\r\n                  nok: 'n.o.k.',\r\n                  sum: 'Sum',\r\n                  title: 'Piece counter',\r\n                  titleDayCounter: 'Day counter',\r\n                  titleShiftCounter: 'Shift counter',\r\n                  titleTotalCounter: 'Total counter',\r\n                  titleTotalCounterSmall: 'Total',\r\n                },\r\n                availability: {\r\n                  title: 'Availability',\r\n                  kpi: {\r\n                    title: 'Availability KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG with error',\r\n                    MDA_with_error: 'MDA with error',\r\n                    JOG_without_error: 'JOG without error',\r\n                    MDA_without_error: 'MDA without error',\r\n                    not_defined_condition: 'not defined condition',\r\n                    auto_no_program_active: 'AUTO no program active',\r\n                    auto_waiting_for_parts: 'AUTO waiting for parts',\r\n                    auto_with_error_program_stopped: 'AUTO with error - program stopped',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO waiting for parts + stopping error',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Aggregated availability',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Availability',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'State',\r\n                },\r\n                operationMode: {\r\n                  title: 'Operation mode',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Operation mode',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Runtime monitor',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'on',\r\n                        off: 'off',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Spindle override',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Feed rate override',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administration',\r\n                headline: 'Administration',\r\n                aws: {\r\n                  title: 'AWS Links',\r\n                },\r\n                groups: {\r\n                  title: 'Thing Groups',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Systems Manager',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Bill of Materials',\r\n                },\r\n                component: {\r\n                  title: 'Components',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Maintenance',\r\n              },\r\n              spindleData: {\r\n                headline: 'Spindle data',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Remote Access',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Time before alarm (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Time after alarm (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Energy monitoring',\r\n                chartTitles: {\r\n                  air: 'Compressed air consumption',\r\n                  current: 'Power consumption',\r\n                  consumption: 'Average Consumption per hour',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Condition Monitoring',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Add new company',\r\n            grid: {\r\n              city: 'City',\r\n              email: 'E-mail',\r\n              street: 'Street',\r\n              country: 'Country',\r\n              website: 'Website',\r\n              postalCode: 'zip code',\r\n              locationName: 'Location',\r\n              locationCustomerNumber: 'Customer number',\r\n            },\r\n            tabs: {\r\n              list: 'Locations',\r\n              worldmap: 'World map',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The company was successfully created.',\r\n            },\r\n            toggle_switch: 'Create a company location with the same data',\r\n            new_form_title: 'Add company',\r\n            edit_form_title: 'Edit company',\r\n            new: {\r\n              fields: {\r\n                city: 'City',\r\n                name: 'Company name',\r\n                email: 'E-Mail [optional]',\r\n                state: 'State [optional]',\r\n                street: 'Street',\r\n                country: 'Country',\r\n                website: 'Website [optional]',\r\n                zipcode: 'Zipcode',\r\n                legal_form: 'Legal form [optional]',\r\n                name_short: 'Company name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                company_logo: 'Company logo (URL) [optional]',\r\n                customer_number: 'Customer Number',\r\n                industry_sector: 'Industry sector',\r\n                description_external: 'Description (external) [optional]',\r\n                description_internal: 'Description [optional]',\r\n              },\r\n              error_messages: {\r\n                url: 'Please specify a valid URL',\r\n                email: 'Please enter a valid e-mail address',\r\n                city_not_specified: 'Please specify a city',\r\n                name_not_specified: 'Please specify a company name',\r\n                street_not_specified: 'Please specify a street',\r\n                country_not_specified: 'Please select a country of origin',\r\n                zipcode_not_specified: 'Please specify a zipcode',\r\n                customer_number_not_specified: 'Please enter a customer number',\r\n                industry_sector_not_specified: 'Please select an industry sector',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The company was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Address',\r\n                country: 'Country',\r\n                website: 'Website',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'The CloudPlatform displays the company on a map, using latitude and longitude.',\r\n              intro_heading: 'Information regarding the location',\r\n              location_name: 'Name of the location:',\r\n              label_latitude: 'Latitude',\r\n              label_longitude: 'Longitude',\r\n              text_fallback_info: 'If not, the default coordinates will be used.',\r\n              text_location_found: 'A location was found.',\r\n              text_location_entered: 'The location was entered.',\r\n              text_success_location: 'We have set the following information based on your input:',\r\n              button_define_coordinates: 'Define coordinates yourself',\r\n              text_no_coordinates_found: 'No coordinates were found for the data you entered.',\r\n              text_coordinates_success_set: 'Coordinates successfully set.',\r\n              button_set_custom_coordinates: 'Set custom coordinates',\r\n              text_specify_coordinates_yourself: 'You can specify the coordinates yourself.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Add new location',\r\n            tabs: {\r\n              list: 'Halls',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Hall',\r\n            },\r\n            success: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The location was successfully created.',\r\n            },\r\n            new_form_title: 'Add location',\r\n            edit_form_title: 'Edit location',\r\n            new: {\r\n              fields: {\r\n                city: 'City',\r\n                name: 'Location name',\r\n                email: 'E-Mail [optional]',\r\n                state: 'State [optional]',\r\n                street: 'Street',\r\n                country: 'Country',\r\n                website: 'Website [optional]',\r\n                zipcode: 'Zipcode',\r\n                language: 'spoken language [optional]',\r\n                name_short: 'Location name (short name) [optional]',\r\n                description: 'Description [optional]',\r\n                customer_number: 'Customer number [optional]',\r\n                description_internal: 'Description (internal) [optional]',\r\n              },\r\n              error_messages: {\r\n                email: 'Please enter a valid e-mail address',\r\n                city_not_specified: 'Please specify a city',\r\n                name_not_specified: 'Please specify a location name',\r\n                street_not_specified: 'Please specify a street',\r\n                country_not_specified: 'Please select a country of origin',\r\n                zipcode_not_specified: 'Please specify a zipcode',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Success!',\r\n              button: 'Back to list',\r\n              message: 'The location was successfully updated.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Address',\r\n                country: 'Country',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'City',\r\n              email: 'E-mail',\r\n              street: 'Street',\r\n              country: 'Country',\r\n              website: 'Website',\r\n              postalCode: 'Zip code',\r\n              companyName: 'Company',\r\n            },\r\n            tabs: {\r\n              list: 'Companies',\r\n              worldmap: 'World map',\r\n            },\r\n            map: {\r\n              description_not_available: 'No description available',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Add',\r\n                back: 'Back to list',\r\n                edit: 'Update',\r\n                save: 'Save',\r\n                email: 'Send Image',\r\n                cancel: 'Cancel',\r\n                addMultiple: 'Add + new',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Edit Administration',\r\n          },\r\n          tooltip: {\r\n            chartTitleIconText: {\r\n              bad: {\r\n                plus: [\r\n                  null,\r\n                  '1: without tool',\r\n                ],\r\n                minus: [\r\n                  '0: Everything is fine; the tool was detected.',\r\n                  '-1: Reference not found',\r\n                  '-2: Empty measurement',\r\n                  '-3: Invalid measurement length',\r\n                  null,\r\n                  '-4: Unknown value error',\r\n                  '-6: Unknown exception',\r\n                ],\r\n              },\r\n              score: {\r\n                minus: [\r\n                  '>=0: Spindle-Score',\r\n                  '-1: Reference not found',\r\n                  '-2: Empty measurement',\r\n                  '-3: Invalid measurement length',\r\n                  '-4: Unknown value error',\r\n                  '-5: Invalid anomaly score error',\r\n                  '-6: Unknown exception',\r\n                ],\r\n              },\r\n            },\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Quality Assurance',\r\n          users: 'User management',\r\n          assets: 'Asset management',\r\n          settings: 'Settings',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'User Profile',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'User management',\r\n          assets: 'Asset management',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'User Profile',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: 'Area',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Line',\r\n          long: 'Long',\r\n          real: 'REAL',\r\n          true: 'Active',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inactive',\r\n          float: 'Float',\r\n          short: 'short',\r\n          state: 'State',\r\n          uword: 'UWORD',\r\n          '840dsl': 'Sinumerik 840dsl',\r\n          double: 'Double',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          string: 'String',\r\n          boolean: 'Boolean',\r\n          integer: 'Integer',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'External',\r\n          internal: 'Internal',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'One Year',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Add new variable',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'One month',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rectangle',\r\n          tabs: {\r\n            list: 'Variables list',\r\n          },\r\n          ten_years: 'Ten Years',\r\n          two_weeks: 'Two weeks',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Six months',\r\n          categorical: 'Categorical',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Something went wrong while trying to create an variable. Please try again later.',\r\n          },\r\n          new: {\r\n            fields: {\r\n              row: 'Row',\r\n              hint: '(Changes might break the machine)',\r\n              tags: 'Tags',\r\n              unit: 'Unit',\r\n              column: 'Column',\r\n              showId: 'Show Variable Id input field',\r\n              address: 'Address',\r\n              maxTime: 'Max. time',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Data type',\r\n              language: 'Language',\r\n              nckBlock: 'NCK Block',\r\n              onChange: 'On Change',\r\n              rowCount: 'Row Count',\r\n              chartType: 'Chart type',\r\n              bufferSize: 'Buffer Size',\r\n              namePrefix: 'Name prefix',\r\n              uiRelevant: 'UI Relevant',\r\n              variableId: 'Variable Id',\r\n              collections: '',\r\n              displayName: 'Display Name',\r\n              intervalInS: 'Interval (seconds)',\r\n              machineType: 'Machine Type',\r\n              showInitial: 'Show Initial',\r\n              opcUaAddress: 'OPC UA Address',\r\n              brokerDataType: 'Broker data type',\r\n              classicAddress: 'Classic Address',\r\n              visibilityType: 'Visibility',\r\n              descriptionText: 'Description',\r\n              machineDataType: 'machine data type',\r\n              symbolicAddress: 'Symbolic Address',\r\n              dataTypeSelection: 'Data type',\r\n            },\r\n            buttons: {\r\n              delete: 'Delete variable',\r\n              addMachineType: 'Add new machine type',\r\n              removeDescription: 'Remove Description',\r\n              removeMachineType: 'Remove new machine type',\r\n            },\r\n            error_messages: {\r\n              row: 'Please specify a row',\r\n              unit: 'Please specify a unit',\r\n              column: 'Please specify a column',\r\n              address: 'Please specify a address',\r\n              maxTime: 'Please select a max time',\r\n              nckArea: 'Please specify a NCK Area',\r\n              dataType: 'Please select a data type',\r\n              language: 'Language is required',\r\n              nckBlock: 'Please specify a NCK Block',\r\n              onChange: \"Please set the 'on change' value.\",\r\n              rowCount: 'Please specify a row count',\r\n              chartType: 'Please select a chart type',\r\n              bufferSize: 'Please specify a buffer size',\r\n              namePrefix: 'Please specify a valid prefix Name. (valid chars: A-Z, _).',\r\n              variableId: 'Please specify a valid UUID',\r\n              displayName: 'Please specify a display name',\r\n              intervalInS: 'Please specify a interval (seconds)',\r\n              machineType: 'Please select a machine type',\r\n              showInitial: 'Please select a initial value.',\r\n              opcUaAddress: 'Please specify a OPC UA address',\r\n              allLocalesUsed: 'All available languages are already in use',\r\n              brokerDataType: 'Please select a broker data type',\r\n              classicAddress: 'Please specify a classic address',\r\n              namePrefixEdit: 'Please specify a valid prefix Name. (valid chars: A-Z a-z, _).',\r\n              visibilityType: 'Please select a visibility type',\r\n              descriptionText: 'Description text is required',\r\n              machineDataType: 'Please select a machine data type',\r\n              symbolicAddress: 'Please specify a symbolic address',\r\n              dataTypeSelection: 'Please select a data type',\r\n              minOneDescription: 'At least one description must be present',\r\n            },\r\n            descriptionInstance: 'Description',\r\n            machineTypeInstance: 'Machine Type',\r\n          },\r\n          new_form_title: 'New Variable',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Edit Variable',\r\n          success: {\r\n            message: 'The variable was successfully created',\r\n          },\r\n          editError: {\r\n            message: 'Something went wrong while trying to update an variable. Please try again later.',\r\n          },\r\n          editSuccess: {\r\n            message: 'The variable was successfully updated',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Successful uploads',\r\n          downloads: 'Successful downloads',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'An unexpected error occurred. Please try to reload the page.',\r\n            },\r\n            s_1: {\r\n              message: 'Your changes have been saved.',\r\n            },\r\n            s_930: {\r\n              message: \"Asset '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_931: {\r\n              message: \"Company '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_932: {\r\n              message: \"Line '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_933: {\r\n              message: \"Hall '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_934: {\r\n              message: \"Location '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_935: {\r\n              message: \"File '%replaceValue' has been deleted successfully.\",\r\n            },\r\n            s_937: {\r\n              message: 'Shopfloor has been successfully updated.',\r\n            },\r\n            s_936: {\r\n              message_variables: \"Variable '%replaceValue' has been deleted successfully.\",\r\n              message_collections: \"Collection '%replaceValue' has been deleted successfully.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Duplicated Cards Deleted!',\r\n            add_line_to_dashboard: 'Line added to Dashboard',\r\n          },\r\n        },\r\n        common: {\r\n          external: 'External',\r\n          internal: 'Internal',\r\n          new: {\r\n            fields: {\r\n              language: 'Language',\r\n              descriptions: 'Descriptions',\r\n              visibilityType: 'Visibility',\r\n              descriptionText: 'Description',\r\n            },\r\n            buttons: {\r\n              addDescription: 'Add Description',\r\n              removeDescription: 'Remove Description',\r\n            },\r\n            error_messages: {\r\n              language: 'Language is required',\r\n              invalidId: 'Please specify a valid UUID',\r\n              allLocalesUsed: 'All available languages are already in use.',\r\n              visibilityType: 'Please select a visibility type',\r\n              descriptionText: 'Description text is required.',\r\n            },\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limit',\r\n            type: 'Select by type',\r\n            alarms: 'Alarms',\r\n            machine: 'Select by machine ID',\r\n            variables: 'Variables',\r\n            listImport: 'Limit Import',\r\n            listDownload: 'Limit Download',\r\n            data_warehouse: 'Datawarehouse',\r\n          },\r\n          text: {\r\n            text: 'Limits are values you set for variables that you are interested in. If a variable is not within the defined limits, you will receive a notification. Limits are also displayed in charts generated in the Time Series tab.',\r\n            title: 'Limits',\r\n          },\r\n          export: {\r\n            text: 'You can always export the currently set limits for all variables that are present in Cloud Platform. You can use this list as a reference or use it as to import all limits in one ho in the section Imports Limits as CSV',\r\n            title: 'Export Limits as CSV',\r\n          },\r\n          import: {\r\n            text: 'You can import a previsously downloaded CSV file with information on limits and subscribers to update the currently saved values. You can later choose to which asset or machine types you want to apply the imported limits',\r\n            title: 'Import Limits from CSV',\r\n            machines: {\r\n              title: 'Select the machines or machine type you want to apply the limits to.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Select the CSV file you want to Import',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Go to the desired line in the asset management.',\r\n            two: 'In the line’s header you can find a context menu.',\r\n            four: 'The line’s tile is added to the dashboard',\r\n            three: 'Click on the context menu, then select “add to dashboard”.',\r\n            header: 'Adding tiles',\r\n          },\r\n          individual: {\r\n            one: 'Select the settings button on the left.',\r\n            two: 'Select the “plus” icon.',\r\n            four: 'Confirm with “save”. The individual tile is added to the dashboard.',\r\n            three: 'Name your tile and add your desired machines.',\r\n            header: 'Adding individual tiles',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Add new user',\r\n          new: {\r\n            title: 'Create User',\r\n            status: 'User Status:',\r\n            buttons: {\r\n              add: 'Add',\r\n              back: 'Back to list',\r\n              save: 'Save',\r\n              cancel: 'Cancel',\r\n              delete: 'Delete User',\r\n              sendMail: 'Send initial mail',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'User Role',\r\n              gender: 'Gender',\r\n              created: 'Created',\r\n              lastName: 'Last name',\r\n              firstName: 'First name',\r\n              breadcrumb: 'display Breadcrumbs',\r\n              main_group: 'Main group',\r\n              phoneNumber: 'Phone number [optional]',\r\n              customer_org: 'Customer organization',\r\n              last_modified: 'Last modified',\r\n              email_validation: 'E-mail (validation)',\r\n            },\r\n            statusText: {\r\n              unknown: 'unknown',\r\n              archived: 'archived',\r\n              confirmed: 'Confirmed',\r\n              compromised: 'compromised',\r\n              unconfirmed: 'unconfirmed',\r\n              reset_required: 'reset required',\r\n              external_provider: 'external provider',\r\n              force_change_password: 'force change password',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'E-mail addresses do not match',\r\n              email_not_valid: 'Please specify a valid e-mail address',\r\n              phone_not_specified: 'Please specify a phone number start a + and followed by country code!',\r\n              roles_not_specified: 'Please select a main group',\r\n              gender_not_specified: 'Please specify a gender',\r\n              last_name_not_specified: 'Please specify a last name',\r\n              first_name_not_specified: 'Please specify a first name',\r\n              main_group_not_specified: 'Please select a main group',\r\n              family_name_not_specified: 'Please specify a last name',\r\n              customer_organization_not_specified: 'Please select a customer organization',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Failed!',\r\n          },\r\n          mail: {\r\n            success: 'An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n          },\r\n          update: {\r\n            title: 'Update User',\r\n          },\r\n          success: {\r\n            title: 'Success!',\r\n            button: 'Back to list',\r\n            message: 'The user was successfully created. An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n            message_for_edit: 'The user was successfully updated.',\r\n            message_send_mail: 'An e-mail with an automatically generated password has been sent to the specified e-mail address.',\r\n            button_back_to_last_page: 'Back to last page',\r\n          },\r\n          delete: {\r\n            success: 'User successfully deleted.',\r\n            confirmation: {\r\n              title: 'Are you sure you want to delete this user?',\r\n              confirm: 'Yes, delete this user',\r\n              dismiss: 'No, cancel',\r\n              warning: 'The progress might be take a moment to appear in the list.',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Visitor',\r\n            customer: 'Customer',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'User',\r\n              email: 'E-mail',\r\n              company: 'Company',\r\n              enabled: 'Status',\r\n              lastName: 'Last name',\r\n              sw_admin: 'SW Admin',\r\n              firstName: 'First name',\r\n              userRights: 'User rights',\r\n              phoneNumber: 'Phone number',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'male',\r\n              female: 'female',\r\n              diverse: 'diverse',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarms',\r\n            type: 'Select by type',\r\n            machine: 'Select by machine ID',\r\n            listImport: 'Alarms Import',\r\n            listDownload: 'Alarms Download',\r\n          },\r\n          text: {\r\n            text: 'Alarm notifications can be set for the alarm numbers you are interested in. If the set alarm occurs on a defined machine, you will receive a notification.',\r\n            title: 'Alarm Notifications',\r\n          },\r\n          export: {\r\n            text: 'You can export the currently set alarm notifications of all machines in the SW CloudPlatform at any time. You can use this list as a reference or use it to import all alarm notifications at once in the “Import alarms as CSV” section.',\r\n            title: 'Exporting Alarms as CSV',\r\n          },\r\n          import: {\r\n            text: 'You can import a previously downloaded CSV file with information on alarms and subscribers to update the currently saved values. You can later select which system or machine types you want to apply the imported alarm notifications to.',\r\n            title: 'Import Alarms from CSV',\r\n            machines: {\r\n              title: 'Select the machines or machine type you want to apply the alarms to.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Select the CSV file you want to Import',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'no results found',\r\n          results: {\r\n            of: 'of',\r\n            lines: 'lines',\r\n            machines: 'Machines',\r\n          },\r\n          callToAction: 'search for machines',\r\n        },\r\n        maxSelectableDays: 'Max. %replaceValue days selectable.',\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Failed',\r\n            queued: 'Queued',\r\n            removed: 'Removed',\r\n            canceled: 'Canceled',\r\n            rejected: 'Rejected',\r\n            completed: 'Completed',\r\n            succeeded: 'Succeeded',\r\n            timed_out: 'Timed out',\r\n            in_progress: 'In progress',\r\n            not_installed: 'Not Installed',\r\n          },\r\n        },\r\n        backend: {\r\n          links: {\r\n            tile: 'Backend Links (Dev)',\r\n            reset: 'Local backend links have been reset.',\r\n            success: 'Backend-Links saved successfully',\r\n            description: 'Changes are saved locally and used only in the dev environment. If no local values are present, the URLs from the config are used.',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Start Import',\r\n            dismiss: 'cancel',\r\n            download: 'Start Download',\r\n          },\r\n          tabs: {\r\n            limits: 'Limits',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Name',\r\n              datatype: 'data type',\r\n              chartType: 'Chart type',\r\n              displayName: 'Display name',\r\n            },\r\n          },\r\n          collections: {\r\n            grid: {\r\n              displayName: 'Display Name',\r\n              collectionName: 'Name',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'World map',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shop floor',\r\n          upload: {\r\n            text1: 'Send an image of your shopfloor layout to lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'If your machines are registered and enrolled in the SW CloudPlatform, they will appear on the left and send real-time data.',\r\n            text3: 'Then simply drag and drop the status on your plan at the correct machine.',\r\n            mainText: 'In this view, you can set up your individual shopfloor layout and see your machines through different information layers. Just follow these steps.',\r\n            tileTitle: 'Shopfloor upload',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset successfully deleted.',\r\n            confirmation: {\r\n              title: \"Are you sure you want to delete '%replaceValue'?\",\r\n              confirm: 'delete',\r\n              dismiss: 'cancel',\r\n              company: {\r\n                text: 'If you delete the company, all belonging users will also be deleted.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Asset',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Changes to NamePrefix or DataType may damage the machine.Are you sure you want to save?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Do you want to apply the limits of this new machine type?',\r\n              title: \"You've changed the machine type\",\r\n              accept: 'Yes, apply new Limits',\r\n              decline: 'No, keep current Limits',\r\n              dismiss: 'Cancel',\r\n              info_accept: 'To replace your current limits with the limits of the new machine type, choose Yes.',\r\n              info_decline: 'To keep your current limits, choose No.',\r\n              info_accept_warning: 'This will overwrite or delete all your current limits.',\r\n            },\r\n          },\r\n        },\r\n        collections: {\r\n          tabs: {\r\n            list: 'Collection list',\r\n            collections: 'Collections',\r\n          },\r\n          add_new_title: 'Add new Collection',\r\n          error: {\r\n            message: 'Something went wrong while trying to create a collection. Please try again later.',\r\n          },\r\n          new_form_title: 'New Collection',\r\n          edit_form_title: 'Edit Collection',\r\n          new: {\r\n            fields: {\r\n              tags: 'Tags',\r\n              showId: 'Show Collection Id input field',\r\n              uiRelevant: 'UI Relevant',\r\n              displayName: 'Display Name',\r\n              collectionId: 'Collection Id',\r\n              collectionName: 'Collection Name',\r\n            },\r\n            buttons: {\r\n              delete: 'Delete Collection',\r\n            },\r\n            error_messages: {\r\n              displayName: 'Please specify a display name',\r\n              collectionId: 'Please specify a valid UUID',\r\n              collectionName: 'Please specify a collection name',\r\n              descriptionText: 'Description text is required',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'The collection was successfully created.',\r\n          },\r\n          editError: {\r\n            message: 'Something went wrong while trying to update a collection. Please try again later.',\r\n          },\r\n          editSuccess: {\r\n            message: 'The collection was successfully updated.',\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete File',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Hall',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Line',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'state',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Machine time',\r\n          controller_time: 'Controller time',\r\n          iot_gateway_time: 'IoT Gateway time',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'MM/DD/YYYY hh:mm:ss A',\r\n          setZoomToDatepicker: 'Set zoom to datepicker',\r\n          exporting: {\r\n            datetimeformat: 'MM/DD/YYYY hh:mm:ss A',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'No data available',\r\n              loading: 'Loading data...',\r\n              months: [\r\n                'January',\r\n                'February',\r\n                'March',\r\n                'April',\r\n                'May',\r\n                'June',\r\n                'July',\r\n                'August',\r\n                'September',\r\n                'October',\r\n                'November',\r\n                'December',\r\n              ],\r\n              resetZoom: 'Reset zoom',\r\n              weekdays: [\r\n                'Sunday',\r\n                'Monday',\r\n                'Tuesday',\r\n                'Wednesday',\r\n                'Thursday',\r\n                'Friday',\r\n                'Saturday',\r\n              ],\r\n              shortMonths: [\r\n                'Jan',\r\n                'Feb',\r\n                'Mar',\r\n                'Apr',\r\n                'May',\r\n                'June',\r\n                'July',\r\n                'Aug',\r\n                'Sept',\r\n                'Oct',\r\n                'Nov',\r\n                'Dec',\r\n              ],\r\n              shortWeekdays: [\r\n                'Sun',\r\n                'Mon',\r\n                'Tue',\r\n                'Wed',\r\n                'Thu',\r\n                'Fri',\r\n                'Sat',\r\n              ],\r\n              increaseDateRange: 'at least until',\r\n            },\r\n          },\r\n        },\r\n        data_warehouse: {\r\n          tabs: {\r\n            list: 'data warehouse',\r\n          },\r\n          export: {\r\n            csv: 'CSV',\r\n            json: 'JSON',\r\n            text: 'You can export the data warehouse data here. Please select the desired export format. You can choose between JSON, CSV, and Excel exports.',\r\n            excel: 'EXCEL',\r\n            title: 'Export of data warehouse data',\r\n          },\r\n          text: {\r\n            title: 'data warehouse',\r\n          },\r\n          select: {\r\n            export: {\r\n              type: 'Please select an export type',\r\n            },\r\n          },\r\n          confirm: {\r\n            missing: {\r\n              export_type: 'OK',\r\n            },\r\n          },\r\n          missing: {\r\n            selected: {\r\n              export_type: 'Please select the export format in which you would like to export the data warehouse data.',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Presets',\r\n            rangeTo: 'To',\r\n            selectDateRange: 'Please select a date range',\r\n            predefined: {\r\n              today: 'Today',\r\n              custom: 'Custom Range',\r\n              last7days: 'Last 7 days',\r\n              yesterday: 'Yesterday',\r\n              last24Hours: 'Last 24 hours',\r\n              last5Minutes: 'Last 5 minutes',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Edit variable',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete variable',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Select language',\r\n        },\r\n        informationSecurity: {\r\n          title: 'Information Security at SW',\r\n          subtitle: 'Cybersecurity from Development to Operation',\r\n          footer: {\r\n            agb: 'Terms & Standards',\r\n            copyright: 'Schwäbische Werkzeugmaschinen GmbH',\r\n            impressum: 'Imprint',\r\n            datenschutz: 'Data Protection',\r\n          },\r\n          psirt: {\r\n            email: 'product.security@sw-machines.com',\r\n          },\r\n          table: {\r\n            title: 'Current Security Advisories',\r\n            headers: {\r\n              status: 'Status',\r\n              severity: 'Severity',\r\n              advisoryId: 'Advisory ID',\r\n              description: 'Description',\r\n              releaseDate: 'Release Date',\r\n              affectedProduct: 'Affected Product',\r\n            },\r\n          },\r\n          download: {\r\n            text: 'Download our reporting form or contact our PSIRT directly by email.',\r\n            title: 'Submit a Security Report',\r\n            button: {\r\n              email: 'Contact us by Email',\r\n              download: 'Download Report Form',\r\n            },\r\n          },\r\n          section1: {\r\n            text: 'At SW, cybersecurity is a firm and fundamental component of product development. Already in the planning and development phase, we identify potential risks and take appropriate security measures into account. Through the application of the Secure by Design and Secure by Default principles as well as established security standards, we develop products that are designed for security and resilience from the start.',\r\n            title: 'Cybersecurity from the Start',\r\n          },\r\n          section2: {\r\n            text: 'Cybersecurity does not end with product delivery. Throughout the entire product lifecycle, we monitor and assess new threats and potential vulnerabilities, and provide necessary security updates. Through structured processes for vulnerability management, security updates, and the handling of security incidents, we support the long-term security of our products and their users.',\r\n            title: 'Continuous Protection in Operation',\r\n          },\r\n          section3: {\r\n            text: 'Traceability is an important part of effective cybersecurity. That is why we document security requirements, risk assessments, and essential protective measures throughout the entire product lifecycle. Clear processes for maintenance, changes, and handling of vulnerabilities create transparency, support the long-term security of our products, and help our customers and us to meet regulatory requirements.',\r\n            title: 'Transparency Throughout the Product Lifecycle',\r\n          },\r\n          services: {\r\n            title: 'Our Services in Information Security',\r\n            psirt: {\r\n              text: 'The Product Security Incident Response Team (PSIRT) of SW is the central point of contact for security vulnerabilities and security-related incidents in our products. The team coordinates the structured assessment, processing, and tracking of incoming reports. This supports responsible handling of vulnerabilities and the requirements of modern cybersecurity standards, including the Cyber Resilience Act (CRA).',\r\n              title: 'SW PSIRT',\r\n            },\r\n            advisories: {\r\n              text: 'SW Security Advisories serve to transparently communicate security-related information about our products. They contain information on identified vulnerabilities, their assessment, available security updates, and recommended measures to reduce risk. This enables our customers to appropriately assess security risks internally and implement suitable protective measures.',\r\n              title: 'SW Security Advisories',\r\n            },\r\n          },\r\n          linksDownloads: {\r\n            title: 'Links & Downloads',\r\n            securityTxt: 'Security TXT',\r\n            dataProtection: 'Data Protection',\r\n            vulnerabilityGuideline: 'Vulnerability Disclosure Guideline',\r\n          },\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Company',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Delete Location',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'state',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Configure Dashboard',\r\n            hide: {\r\n              title: 'Hide',\r\n            },\r\n            show: {\r\n              title: 'Show',\r\n            },\r\n            delete: {\r\n              title: 'Delete',\r\n            },\r\n            add: {\r\n              fab_title: 'Add custom tile',\r\n            },\r\n            save: {\r\n              fab_title: 'Save configuration',\r\n            },\r\n            move_left: {\r\n              title: 'Move to the previous position',\r\n            },\r\n            move_right: {\r\n              title: 'Move to the next position',\r\n            },\r\n            discard: {\r\n              fab_title: 'Discard configuration',\r\n            },\r\n            add_custom_card: {\r\n              save: 'save',\r\n              input: 'Enter tile name',\r\n              title: 'Add custom tile',\r\n              cancel: 'cancel',\r\n              missingMachine: 'You need to select at least one machine',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'An unexpected error occurred. Please try to reload the page.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Success',\r\n            },\r\n            e_3xx: {\r\n              message: 'Redirection',\r\n            },\r\n            e_400: {\r\n              message: 'The request was malformed and could not be processed.',\r\n            },\r\n            e_401: {\r\n              message: 'You are not authenticated. Please login again.',\r\n            },\r\n            e_403: {\r\n              message: 'You do not have sufficient rights to access the requested resource.',\r\n            },\r\n            e_404: {\r\n              message: 'The requested resource is not available.',\r\n            },\r\n            e_405: {\r\n              message: 'Method Not Allowed.',\r\n            },\r\n            e_406: {\r\n              message: 'Method Not Acceptable',\r\n            },\r\n            e_409: {\r\n              message: 'The resource you are trying to add already exists.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Method Unprocessable Content',\r\n            },\r\n            e_4xx: {\r\n              message: 'Client error',\r\n            },\r\n            e_500: {\r\n              message: 'An internal server error occurred.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Server error',\r\n            },\r\n            e_900: {\r\n              message: 'Something went wrong while trying to add an asset. Please try again later.',\r\n            },\r\n            e_901: {\r\n              message: 'The action was canceled. No new asset was created.',\r\n            },\r\n            e_902: {\r\n              message: 'The action was canceled. No service request has been sent.',\r\n            },\r\n            e_903: {\r\n              message: 'Something went wrong while trying to send the service request. Please try again later.',\r\n            },\r\n            e_904: {\r\n              message: \"Asset '%replaceValue' has been created successfully. You can now add another asset.\",\r\n            },\r\n            e_905: {\r\n              message: 'The action was canceled. The asset has not been updated.',\r\n            },\r\n            e_906: {\r\n              message: \"Asset '%replaceValue' has been moved successfully.\",\r\n            },\r\n            e_910: {\r\n              message: 'Something went wrong while trying to add a user. Please try again later.',\r\n            },\r\n            e_911: {\r\n              message: 'You canceled the current action. No user has been created.',\r\n            },\r\n            e_912: {\r\n              message: 'Something went wrong while trying to update an asset. Please try again later.',\r\n            },\r\n            e_920: {\r\n              message: 'You canceled the current action. No changes saved.',\r\n            },\r\n            e_921: {\r\n              message: 'An unspecified error occured. Please try again later.',\r\n            },\r\n            e_922: {\r\n              message: 'Your username and/or password is incorrect. Please try again.',\r\n            },\r\n            e_923: {\r\n              message: 'Please specify an e-mail and a password.',\r\n            },\r\n            e_924: {\r\n              message: 'Your session expired due to inactivity. Please login again.',\r\n            },\r\n            e_925: {\r\n              message: 'You need to accept our privacy policy in order to use the platform.',\r\n            },\r\n            e_926: {\r\n              message: 'Your account is temporarily locked. Please try again later.',\r\n            },\r\n            e_927: {\r\n              message: 'Your password change request has been recorded successfully. Please check your e-mail account for further instructions.',\r\n            },\r\n            e_928: {\r\n              message: 'The action was canceled. No file has been uploaded.',\r\n            },\r\n            e_929: {\r\n              message: 'An error occurred while attempting to upload a file. Please try again at a later time.',\r\n            },\r\n            e_930: {\r\n              message: 'Something went wrong while trying to delete the file. Please try again later.',\r\n            },\r\n            e_931: {\r\n              message: 'Custom date range are to big. Default of 24H is set. Max date range %replaceValue days',\r\n            },\r\n            e_932: {\r\n              message: 'Asset has children. Delete children first.',\r\n            },\r\n            e_935: {\r\n              message: 'Internal Sever Error occurred during deletion. Please try again later.',\r\n            },\r\n            e_10500: {\r\n              message: 'Server Timeout - The processing of the request took to long to finish successfully',\r\n            },\r\n            e_10501: {\r\n              message: 'You are using an unsupported Browser. The CloudPlatform needs one of the following browsers: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'This asset (machine identifier %replaceValue) already exists',\r\n            },\r\n            e_410_asset: {\r\n              message: 'This file %replaceValue already exists',\r\n            },\r\n            e_409_variables: {\r\n              message: 'This variable %replaceValue already exists.',\r\n            },\r\n            e_933: {\r\n              message_variables: \"Variable '%replaceValue' has been created successfully. You can now add another variable.\",\r\n              message_collections: \"Collection '%replaceValue' has been created successfully. You can now add another collection.\",\r\n            },\r\n            e_934: {\r\n              message_variables: 'Something went wrong while trying to delete the variable. Please try again later.',\r\n              message_collections: 'Something went wrong while trying to delete the collection. Please try again later.',\r\n            },\r\n            e_409_collections: {\r\n              message: 'This Collection %replaceValue already exists.',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Only %s items can be selected at a time',\r\n              title: 'Max. amount reached',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Time filter',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'No files available.',\r\n              file_cardTitle: 'Machine Events',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Download data',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC Trace Files',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'No alarms available',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC Comparison Files',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC State Files',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'No files available.',\r\n              file_cardTitle: 'ToolMon Files',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Download ToolMon data',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Trigger',\r\n              column_title_filename: 'File name',\r\n              column_title_creation_date: 'Creation Date',\r\n            },\r\n            toolmon_health: {\r\n              file_cardTitle: 'ToolMon Health Files',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI flight recorder Files',\r\n            },\r\n            hydraulic_cylinder: {\r\n              file_cardTitle: 'Hydraulic Cylinder Files',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  es: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Cerrar sesión',\r\n        release: \"Desde '%replaceValue1' hasta '%replaceValue2' se realizarán trabajos de mantenimiento en la plataforma. Durante este periodo de tiempo la plataforma estará no disponible.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Cerrar',\r\n        acceptLabel: 'Aceptar',\r\n        userProfile: 'Perfil de usuario',\r\n        button: {\r\n          clear: 'Quitar diagrama',\r\n          timeline: 'Ajuste del valor límite',\r\n          separateCharts: 'Diagramas separados',\r\n        },\r\n        declineLabel: 'Rechazar',\r\n        backToDashboard: 'Volver al dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/es/condiciones-generales-normas/',\r\n            title: 'Condiciones generales / Normas',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Contacto',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/es/pie-de-imprenta/',\r\n            title: 'Aviso legal',\r\n          },\r\n          privacy: {\r\n            title: 'Privacidad',\r\n            header: 'Política de protección de datos',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'Página Web SW',\r\n          },\r\n        },\r\n        noInternetConnection: 'Parece ser que no está conectado al Internet. Conéctese y vuélvalo a intentar.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'de',\r\n          noData: 'Ningún dato',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'descargado',\r\n          noDuration: 'no hay duración disponible',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'La máquina no tiene licencia.',\r\n          alarmPending: 'Alarmas activas',\r\n          buttons: {\r\n            back: 'Volver',\r\n            save: 'Guardar',\r\n            view: 'Mostrar',\r\n            cancel: 'Cancelar',\r\n            custom: 'Guardar + establecer intervalo personalizado',\r\n            submit: 'Aplicar',\r\n            export: {\r\n              limit: 'Límites de descarga',\r\n              alarms: 'Alarmas de descarga',\r\n            },\r\n            import: {\r\n              limit: 'Inicio',\r\n              alarms: 'Inicio',\r\n            },\r\n            refreshReset: 'Restablecer al tiempo estándar',\r\n            selectAllCheckboxes: 'Seleccionar todo',\r\n            unselectAllCheckboxes: 'Cancelar selección',\r\n          },\r\n          notAvailable: 'No disponible',\r\n          notConnected: 'Aun no está conectado',\r\n          download: {\r\n            file: 'Descargas de archivos',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'Día',\r\n            days: 'Días',\r\n            hour: 'Hora',\r\n            year: 'Año',\r\n            hours: 'Horas',\r\n            month: 'Mes',\r\n            years: 'Años',\r\n            minute: 'Minuto',\r\n            months: 'Meses',\r\n            second: 'Segundo',\r\n            minutes: 'Minutos',\r\n            seconds: 'Segundos',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Entendido',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: '¡Esta operación no se puede deshacer!',\r\n        },\r\n        error: {\r\n          upload: 'Actualizaciones fallidas',\r\n          download: 'Descargas fallidas',\r\n          message: {\r\n            enrollment_code_409: 'El dispositivo ya está inscrito en AWS.',\r\n            limit_change_failed: 'No se pueden modificar los valores límite. Inténtelo de nuevo más tarde o envíe un correo electrónico a lifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Capturas de tiempo',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Seleccionar variables',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Fecha',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Acceso atendido seguro',\r\n            directAccess: 'Acceso directo',\r\n            new: {\r\n              fields: {\r\n                id: 'Introducir ID',\r\n                cOnePanel: 'con C|One',\r\n                sessionType: 'Tipo de sesión',\r\n              },\r\n              error_messages: {\r\n                id: 'Introduzca un ID de sesión o un ID de dispositivo',\r\n                sessionType: 'Seleccione un tipo de sesión',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: 'Máquinas',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Agregar línea nueva',\r\n            grid: {\r\n              hall: 'Nave',\r\n              line: 'Línea',\r\n              type: 'Tipo',\r\n              contractEnd: 'Fin de contrato [opcional]',\r\n              cellPosition: 'Celda / posición [opcional]',\r\n              operationStep: 'Paso del proceso',\r\n              machineIdentifierSw: 'Nº de máquina (SW)',\r\n              machineIdentifierCustomer: 'Nombre de máquina',\r\n            },\r\n            success: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La línea se ha creado con éxito.',\r\n            },\r\n            new_form_title: 'Línea nueva',\r\n            edit_form_title: 'Editar línea',\r\n            new: {\r\n              fields: {\r\n                name: 'Nombre de línea',\r\n                name_short: 'Nombre de línea (abreviado) [opcional]',\r\n                description: 'Descripción [opcional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Introduzca un nombre de línea válido.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La linea se ha actualizado con éxito.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Agregar nave nueva',\r\n            grid: {\r\n              part: 'Tipo de piezas',\r\n              lineName: 'Línea',\r\n              typeOfLoading: 'Tipo de carga',\r\n              lineResponsible: 'Responsable de líneas',\r\n              plannedQuantity: 'Cantidad planificada',\r\n              numberOfMachines: '# Máquinas',\r\n            },\r\n            tabs: {\r\n              list: 'Líneas',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La nave se ha creado con éxito.',\r\n            },\r\n            new_form_title: 'Nave nueva',\r\n            shopfloor: {\r\n              edit: 'Modo de edición',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Guardar configuración',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Desechar configuración',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Editar nave',\r\n            new: {\r\n              fields: {\r\n                name: 'Nombre de nave',\r\n                name_short: 'Nombre de nave (abreviado) [opcional]',\r\n                description: 'Descripción [opcional]',\r\n                description_external: 'Descripción (externo) [opcional]',\r\n                description_internal: 'Descripción (interno) [opcional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Introduzca un nombre de nave válido.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La nave se ha actualizado con éxito.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Descripción [opcional]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Crear recurso nuevo',\r\n            tabs: {\r\n              info: 'Series temporales',\r\n              alarms: 'Alarmas',\r\n              events: 'Eventos de la máquina',\r\n              gateway: 'Gateway',\r\n              service: 'Asistencia técnica',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Disponibilidad de línea',\r\n              'axis-test': 'Pruebas de eje',\r\n              collection: 'Colecciones',\r\n              technology: 'Tecnología',\r\n              maintenance: 'Mantenimiento',\r\n              performance: 'Rendimiento',\r\n              spindledata: 'Datos de husillo',\r\n              remoteaccess: 'Acceso remoto',\r\n              enduranceTest: 'Prueba de final de línea',\r\n              administration: 'Administración',\r\n              y_title: {\r\n                status: 'Estado',\r\n                status_table_one: 'Mesa 1',\r\n                status_table_two: 'Mesa 2',\r\n              },\r\n              energymonitoring: 'Monitorización de la energía',\r\n              technology_undefined: 'indefinido',\r\n              technology_undefined_condition: '¡Estado indefinido!',\r\n            },\r\n            move: {\r\n              message: \"El activo '%replaceValue' se puede mover a una empresa, ubicación, nave y/o línea nuevas.\",\r\n              select_hall_label: 'Seleccionar nave nueva',\r\n              select_line_label: 'Seleccionar línea nueva',\r\n              select_company_label: 'Seleccionar empresa nueva',\r\n              select_location_label: 'Seleccionar ubicación nueva',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Número de máquina (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Suministro [opcional]',\r\n                shipping: 'Expedición [opcional]',\r\n                controller: 'Control',\r\n                machine_type: 'Modelo de máquina',\r\n                warranty_end: 'Fin de garantía [opcional]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Administrador de sistemas',\r\n                warranty_start: 'Inicio de la garantía [opcional]',\r\n                machine_swmp_api: 'Máquinas SWMP fin de API [opcional]',\r\n                machine_swsp_trace: 'Máquinas SWSP fin de trace [opcional]',\r\n                machine_swcp_portal: 'Máquinas SWCP fin de portal [opcional]',\r\n                start_of_production: 'Inicio de la producción [opcional]',\r\n                machine_swcp_support: 'Máquinas SWCP fin de soporte [opcional]',\r\n                machine_cell_position: 'Celda /posición máquinas',\r\n                machine_swsp_line_mon: 'Máquinas SWSP fin LineMon [opcional]',\r\n                machine_identifier_customer: 'ID máquina (cliente)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Introduzca un número de máquina SW válido (mín. 7 caracteres: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Seleccione un control de máquina.',\r\n                machine_type_not_specified: 'Seleccione un tipo de máquina.',\r\n                machine_identifier_customer_not_specified: 'Introduzca una ID de máquina.',\r\n              },\r\n            },\r\n            success: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'El recurso se ha creado con éxito.',\r\n            },\r\n            new_form_title: 'Agregar recurso',\r\n            edit_form_title: 'Editar recurso',\r\n            move_form_title: 'Mover activo',\r\n            editSuccess: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'El activo se ha actualizado con éxito.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Fecha de expedición',\r\n                controller: 'Control',\r\n                contractEnd: 'Fin de contrato',\r\n                machineType: 'Tipo de máquina',\r\n                startupDate: 'Fecha de puesta en funcionamiento',\r\n                warrantyEnd: 'Fin de la garantía',\r\n                cellPosition: 'Celda / posición',\r\n                warrantyStart: 'Inicio de la garantía',\r\n                customerNumber: 'Número de cliente',\r\n                enrollmentConfig: 'Configuración enrollment',\r\n                startOfProduction: 'Inicio de la producción',\r\n                machineIdentifierSw: 'Nº de máquina SW',\r\n                enrollmentConfigDownload: 'Descargar',\r\n                machineIdentifierCustomer: 'Nombre de máquina cliente',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Cambio',\r\n              g_mode: 'Función G',\r\n              off_time: 'Tiempo auxiliar',\r\n              no_change: 'Sin cambio',\r\n              undefined: 'Indefinido',\r\n              active_tool: 'Herramienta activa',\r\n              tool_change: 'Cambio de herramienta',\r\n              machining_time: 'Tiempo principal',\r\n              tool_change_time: 'Tiempo de cambio de herramienta',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Tiempo de procesamiento mesa 1',\r\n                  name_two: 'Tiempo de procesamiento mesa 2',\r\n                  name_one_undefined: 'Tiempo de procesamiento indefinido mesa 1',\r\n                  name_two_undefined: 'Tiempo procesamiento indefinido mesa 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Eje Q y husillo',\r\n              undefined_gmode_data: 'Ningún dato para la función G',\r\n              auxiliary_process_time: 'Tiempo de procesamiento adicional',\r\n              undefined_activetool_data: 'Ningún dato para la herramienta activa',\r\n              undefined_tool_change_data: 'Ningún dato para el cambio de herramienta',\r\n              undefined_machining_time_table_one: 'Estado no definido mesa 1',\r\n              undefined_machining_time_table_two: 'Estado no definido mesa 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Tiempo principal, auxiliar y de cambio de herramienta & mesa 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Tiempo principal, auxiliar y de cambio de herramienta & mesa 2',\r\n            },\r\n            add_line_to_dashboard: 'Agregar línea al dashboard',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Unidad',\r\n                value: 'Valor',\r\n                kpiUnit: 'Unidad',\r\n                headline: 'Pruebas de eje',\r\n                kpiValue: 'Valor',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Cargar desde la memoria del navegador',\r\n                limitsSave: 'Guardar en la memoria del navegador',\r\n                selectAxis: 'Seleccionar eje',\r\n                limitsExport: 'Exportar valores límite a la memoria intermedia',\r\n                openAxistest: 'Abrir prueba de eje',\r\n                axisTestPlural: 'Pruebas de eje',\r\n                adjustments: {\r\n                  add: 'añadir adaptación local',\r\n                  range: 'Alcance',\r\n                  header: 'Adaptación local',\r\n                  remove: 'Retirar',\r\n                  position: 'Posición',\r\n                  amplitude: 'Amplitud',\r\n                  spreadMultiplier: 'Multiplicador de límites',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Posición',\r\n                    y: 'Corriente',\r\n                    up: 'arriba',\r\n                    down: 'abajo',\r\n                    limitsUp: 'limita el sentido negativo',\r\n                    limitsDown: 'limita el sentido negativo',\r\n                    sliderSlopeCenter: 'Origen de pendiente',\r\n                    sliderSlopeFactor: 'Factor de pendiente',\r\n                    sliderVerticalOffset: 'Decalaje Y',\r\n                    sliderVerticalSpread: 'Limitar anchura',\r\n                    sliderQuadraticCenter: 'Origen cuadrado',\r\n                    sliderQuadraticFactor: 'Factor cuadrado',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'En sentido horario',\r\n                    limitsClockwise: 'Límites en sentido horario',\r\n                    counterClockwise: 'En sentido antihorario',\r\n                    sliderSineOffset: 'Decalaje de ondas',\r\n                    sliderSineAmplitude: 'Amplitud de ondas',\r\n                    sliderSineFrequency: 'Frecuencia de ondas',\r\n                    sliderVerticalOffset: 'Decalaje Y',\r\n                    sliderVerticalSpread: 'Limitar anchura',\r\n                    limitsCounterClockwise: 'Límites en sentido antihorario',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Velocidad',\r\n                  pulseMaxRampUp: 'Rampa ->',\r\n                  pulseMaxRampDown: 'Rampa <-',\r\n                  pulseMaxStiffness: 'Rigidez máxima',\r\n                  pulseMinStiffness: 'Rigidez mínima',\r\n                  pulseMeanStiffness: 'Rigidez Ø',\r\n                  circularReversalRange: 'Reversibilidad circular',\r\n                  pulseMaxUpPathCurrent: 'Corriente máxima ->',\r\n                  pulseMinUpPathCurrent: 'Corriente mínima ->',\r\n                  pulseMeanUpPathCurrent: 'Corriente Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Corriente máxima <-',\r\n                  pulseMinDownPathCurrent: 'Corriente mínima <-',\r\n                  pulseMeanDownPathCurrent: 'Corriente Ø <-',\r\n                  circularShapeDeviationClockwise: 'Error de circularidad a la derecha',\r\n                  pulseStiffnessStandardDeviation: 'Rigidez σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Corriente σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Corriente σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Error de circularidad a la izquierda',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Prueba de circularidad',\r\n                  EQUABILITY: 'Prueba de sincronicidad',\r\n                  CIRCULARITY: 'Prueba de circularidad',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'No hay ninguna prueba de ejes de este tipo disponible',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'En caso de error, póngase en contacto con',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Proporciónenos los datos a través del formulario Netcfg.',\r\n                  intro: 'Para poder enlazar su máquina, dependemos de los datos de su configuración de red.',\r\n                  title: 'Configuración de red',\r\n                  goToNetconfig: 'Abrir configuración de red',\r\n                },\r\n                device: {\r\n                  title: 'Detalles del equipo',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Cuando IoT Gateway tenga este aspecto, realice los pasos que se indican a continuación:',\r\n                  line1: 'Descargue el archivo Enrollment haciendo clic con el botón en el borde inferior del mosaico.',\r\n                  line2: 'La descarga se inicia automáticamente.',\r\n                  line3: 'Coloque el archivo .json en el directorio raíz en una memoria USB. Asegúrese de que el archivo tenga un nombre:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Asegúrese de que los archivos siguientes se encuentren en el directorio raíz de la memoria USB:',\r\n                  line6: 'Inserte la memoria USB en el IoT Gateway correspondiente.',\r\n                  line7: 'El aprendizaje se inicia automáticamente, lo que se señaliza mediante un LED de usuario verde intermitente.',\r\n                  line8: 'Después de iniciar sesión con éxito, se ilumina el LED verde hasta que se retire la memoria USB.',\r\n                  title: 'Enrollment',\r\n                  button: 'Archivo enrollment',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Descargue el archivo \"migrate-iot.zip\" y extraiga su contenido directamente en una memoria USB vacía.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Descargue también ',\r\n                  line4: ' y lo agrega a una memoria USB. Asegúrese de que el archivo tenga el nombre siguiente:',\r\n                  line5: 'Asegúrese de que los archivos siguientes se encuentren en el directorio raíz de la memoria USB:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Migración de plataforma',\r\n                  line10: 'Inserte la memoria USB en el IoT Gateway correspondiente.',\r\n                  line11: 'El software se instala automáticamente, lo que se señaliza mediante un LED amarillo intermitente.',\r\n                  line12: 'Después de una migración con éxito, se ilumina el LED verde hasta que se retire la memoria USB.',\r\n                  line13: 'Después de una migración con éxito, se ilumina el LED verde hasta que se retire la memoria USB.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generar',\r\n                headline: 'Series temporales',\r\n                noChartMessage: 'Para mostrar los datos elegidos, seleccione una o varias variantes y haga clic en generar',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarmas',\r\n              },\r\n              service: {\r\n                contact: 'Contacte por favor',\r\n                headline: 'Asistencia técnica',\r\n                update: {\r\n                  title: 'Actualizar archivo',\r\n                },\r\n                upload: {\r\n                  title: 'Cargar el archivo',\r\n                  fields: {\r\n                    file: 'Archivo',\r\n                    language: 'Idioma del archivo',\r\n                    file_name: 'Nombre de archivo',\r\n                    list_of_languages: {\r\n                      cz: 'Checo',\r\n                      de: 'Alemán',\r\n                      en: 'Inglés',\r\n                      es: 'Español',\r\n                      fr: 'Francés',\r\n                      hu: 'Húngaro',\r\n                      it: 'Italiano',\r\n                      ko: 'Coreano',\r\n                      pl: 'Polaco',\r\n                      tr: 'Turco',\r\n                      zh: 'Chino',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Cargar',\r\n                    cancel: 'Cancelar',\r\n                  },\r\n                  success: {\r\n                    title: 'Correcto',\r\n                    button: 'Volver a la visión general de servicio',\r\n                    message: 'El archivo se ha cargado correctamente',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Introduzca un nombre de archivo.',\r\n                    file_not_valid: 'Indique un archivo/seleccione un archivo más pequeño.',\r\n                    language_not_specified: 'Indique un idioma de archivo.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Manuales',\r\n                },\r\n                version: {\r\n                  title: 'archivos de versión',\r\n                },\r\n                contracts: {\r\n                  title: 'Contratos',\r\n                },\r\n                components: {\r\n                  title: 'Componentes Hard y Software',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Lista de piezas de repuesto',\r\n                },\r\n                consumeables: {\r\n                  title: 'Materiales de producción',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Actualizar',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Para activar una máquina para el acceso remoto, deberá estar instalado TeamViewer en la IoT Gateway. ',\r\n                  line2: 'Si no es el caso aún, instale TeamViewer simplemente haciendo clic en \"Instalar\".',\r\n                  title: 'Instale el soporte remoto',\r\n                  status: 'Estado de deployment',\r\n                  copy: {\r\n                    button: 'Copiar enlace',\r\n                  },\r\n                  install: {\r\n                    button: 'Instalar TeamViewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Iniciar sesión',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT Gateway',\r\n                  values: {\r\n                    box_id: 'ID Box',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Sistema operativo',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: '¿Necesita ayuda con una máquina?',\r\n                  line2: '¡Contáctenos!',\r\n                  title: 'Mensaje al servicio SW',\r\n                  button: 'Contactar con el servicio',\r\n                  fields: {\r\n                    name: 'Número de máquina (SW)',\r\n                    type: 'Tipo de petición',\r\n                    email: 'E-Mail',\r\n                    message: 'Mensaje',\r\n                    phone_no: 'Número de teléfono',\r\n                    last_name: 'Apellido',\r\n                    first_name: 'Nombre de pila',\r\n                    contact_person: 'Persona de contacto (SW) [opcional]',\r\n                    list_of_types: {\r\n                      request: 'Petición general',\r\n                      service: 'Asistencia técnica',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Ampliación',\r\n                      inspection: 'Inspección',\r\n                    },\r\n                    machine_identifier_customer: 'ID máquina (cliente) [opcional]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Enviar petición',\r\n                    cancel: 'Cancelar',\r\n                  },\r\n                  success: {\r\n                    title: '¡Con éxito!',\r\n                    button: 'Volver a la visión global del servicio',\r\n                    message: 'La petición se ha transmitido al servicio SW con éxito.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Introduzca una dirección de E-Mail válida.',\r\n                    name_not_specified: 'Introduzca un número de máquina SW válido (mín. 7 caracteres: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Introduzca número de teléfono válido.',\r\n                    message_not_specified: 'Introduzca un mensaje.',\r\n                    last_name_not_specified: 'Introduzca un apellido.',\r\n                    first_name_not_specified: 'Introduzca un nombre de pila.',\r\n                    family_name_not_specified: 'Introduzca un apellido.',\r\n                    contact_type_not_specified: 'Introduzca un tipo de petición.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Software máquina',\r\n                  values: {\r\n                    nc_version: 'Versión NC',\r\n                    hmi_version: 'Versión HMI',\r\n                    plc_version: 'Versión PLC',\r\n                    compile_cycles: 'Ciclos compilar',\r\n                    operating_system: 'Sistema operativo',\r\n                    pcu_base_version: 'Versión base PCU',\r\n                    plc_toolbox_version: 'Toolbox PLC',\r\n                    plc_user_program_version: 'Programa usuario PLC',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'El nombre del archivo se ha modificado con éxito',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Asistencia remota',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'El asistente de acciones le ayuda en la solución de problemas.',\r\n                  title: 'Asistente de acciones',\r\n                  sub_title: '¿Tiene actualmente dificultades con uno de sus activos?',\r\n                  open_assistant: 'Abrir el asistente de acciones',\r\n                  request_account: 'Solicitar una cuenta',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Estadísticas de husillo SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'Con',\r\n                labelOffline: 'Desc',\r\n              },\r\n              swimlane: {\r\n                headline: 'Disponibilidad de línea',\r\n              },\r\n              endurance: {\r\n                headline: 'Prueba de final de línea',\r\n                chartTitles: {\r\n                  runtime: 'Datos de tiempo de servicio',\r\n                  endurance: 'Prueba de final de línea',\r\n                  operation: 'Modo de funcionamiento',\r\n                  qaxis_180: 'Eje Q 180°',\r\n                  nc_program: 'Programa NC',\r\n                  stacklights: '3 luces señalizadoras',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Estado de envío',\r\n                aborted: 'cancelado',\r\n                sending: 'enviando',\r\n                undefined: 'no definido',\r\n                interrupted: 'interrumpido',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Mapa de alarma',\r\n              },\r\n              collection: {\r\n                headline: 'Colección',\r\n                noChartMessage: 'Seleccione una colección en el lado izquierdo.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Suma',\r\n                  header: 'Rendimiento Kpi',\r\n                  target: 'Nominal',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarmas',\r\n                  category: [\r\n                    'Sin clasificar',\r\n                    'Mensaje de error',\r\n                    'Mensaje de servicio',\r\n                    'Mensaje de estado',\r\n                    'Instrucciones de uso',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Tendencia',\r\n                    duration: 'Duración de incidencia',\r\n                    flatlist: 'Lista plana',\r\n                    frequency: 'Frecuencia de incidencia',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Tiempo',\r\n                    trend: 'Tendencia',\r\n                    duration: 'Duración de incidencia',\r\n                    leftTime: 'Alarma saliente',\r\n                    alarmCount: 'Número',\r\n                    alarmNumber: 'Nº de alarma',\r\n                    description: 'Descripción',\r\n                    alarmOccured: 'Se ha generado una alarma',\r\n                    alarmClassification: 'Clasificación de alarma',\r\n                    alarmCountSecondRange: 'Número T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'ascendente',\r\n                      down: 'descendente',\r\n                      flat: 'estable',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Detalle',\r\n                  ncProgram: 'Programas NC',\r\n                  lastModified: 'Registro de valor último',\r\n                  machineState: 'Estado de máquina',\r\n                  numberAlarms: 'Alarmas activas',\r\n                  stopCondition: 'Condiciones de parada',\r\n                  ncProgramState: 'Estado de programa NC',\r\n                  protectionLevel: 'Nivel de protección',\r\n                  ncProgramStates: [\r\n                    'cancelado',\r\n                    'detenido',\r\n                    'en marcha',\r\n                    'esperando',\r\n                    'interrumpido',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Sistema',\r\n                    'Fabricante',\r\n                    'Asistencia técnica',\r\n                    'Usuario',\r\n                    'Interruptor con llave posición 3',\r\n                    'Interruptor con llave posición 2',\r\n                    'Interruptor con llave posición 1',\r\n                    'Interruptor con llave posición 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Tiempo de ciclo',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Tiempo de ciclo en s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'No OK',\r\n                  sum: 'Suma',\r\n                  title: 'Contador de piezas',\r\n                  titleDayCounter: 'Contador diario',\r\n                  titleShiftCounter: 'Contador de turno',\r\n                  titleTotalCounter: 'Contador total',\r\n                  titleTotalCounterSmall: 'Total',\r\n                },\r\n                availability: {\r\n                  title: 'Disponibilidad',\r\n                  kpi: {\r\n                    title: 'Disponibilidad KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG con error',\r\n                    MDA_with_error: 'MDA con error',\r\n                    JOG_without_error: 'JOG sin error',\r\n                    MDA_without_error: 'MDA sin error',\r\n                    not_defined_condition: 'Estado no definido',\r\n                    auto_no_program_active: 'AUTO no hay ningún programa activo',\r\n                    auto_waiting_for_parts: 'AUTO esperando piezas',\r\n                    auto_with_error_program_stopped: 'AUTO con error - programa detenido',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO esperando piezas + error de parada',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Disponibilidad agregada',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Disponibilidad',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Estado',\r\n                },\r\n                operationMode: {\r\n                  title: 'Estado de servicio',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Estado de servicio',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Monitor de la duración',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Programa',\r\n                      labels: {\r\n                        on: 'con',\r\n                        off: 'desc',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Cancelación de husillo',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Cancelación de avance',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administración',\r\n                headline: 'Administración',\r\n                aws: {\r\n                  title: 'Enlaces de AWS',\r\n                },\r\n                groups: {\r\n                  title: 'Grupos de objetos',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Administrador de sistemas',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Lista de piezas',\r\n                },\r\n                component: {\r\n                  title: 'Componentes',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Mantenimiento',\r\n              },\r\n              spindleData: {\r\n                headline: 'Datos de husillo',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Acceso remoto',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Tiempo previo alarma (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Tiempo después de alarma (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Monitorización de energía',\r\n                chartTitles: {\r\n                  air: 'Consumo de aire comprimido',\r\n                  current: 'Consumo de energía',\r\n                  consumption: 'Consumo medio por hora',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Vigilancia de estado',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Agregar una empresa nueva',\r\n            grid: {\r\n              city: 'Localidad',\r\n              email: 'E-Mail',\r\n              street: 'Dirección',\r\n              country: 'País',\r\n              website: 'Página web',\r\n              postalCode: 'Código postal',\r\n              locationName: 'Ubicación',\r\n              locationCustomerNumber: 'Número de cliente',\r\n            },\r\n            tabs: {\r\n              list: 'Ubicaciones',\r\n              worldmap: 'Mapa mundial',\r\n            },\r\n            success: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'Se ha creado la empresa con éxito.',\r\n            },\r\n            toggle_switch: 'Generar una ubicación con los mismos datos',\r\n            new_form_title: 'Empresa nueva',\r\n            edit_form_title: 'Editar empresa',\r\n            new: {\r\n              fields: {\r\n                city: 'Ciudad',\r\n                name: 'Nombre de la empresa',\r\n                email: 'E-Mail [opcional]',\r\n                state: 'Provincia [opcional]',\r\n                street: 'Dirección',\r\n                country: 'País',\r\n                website: 'Página web [opcional]',\r\n                zipcode: 'Código postal',\r\n                legal_form: 'Forma jurídica [opcional]',\r\n                name_short: 'Nombre de la empresa (corto) [opcional]',\r\n                description: 'Descripción [opcional]',\r\n                company_logo: 'Logotipo de la empresa (URL) [opcional]',\r\n                customer_number: 'Número de cliente',\r\n                industry_sector: 'Sector industrial',\r\n                description_external: 'Descripción (externo) [opcional]',\r\n                description_internal: 'Descripción (interno) [opcional]',\r\n              },\r\n              error_messages: {\r\n                url: 'Introduzca una URL válida.',\r\n                email: 'Introduzca una dirección de E-Mail válida.',\r\n                city_not_specified: 'Introduzca una ciudad.',\r\n                name_not_specified: 'Introduzca un nombre de empresa.',\r\n                street_not_specified: 'Introduzca una dirección.',\r\n                country_not_specified: 'Introduzca una País.',\r\n                zipcode_not_specified: 'Introduzca un código postal.',\r\n                customer_number_not_specified: 'Introduzca un número de cliente.',\r\n                industry_sector_not_specified: 'Introduzca un sector industrial.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'Se ha actualizado la empresa con éxito.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-Mail',\r\n                address: 'Dirección',\r\n                country: 'País',\r\n                website: 'Página web',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'La SW CloudPlatform muestra esta empresa en un mapa utilizando para ello la latitud y la longitud.',\r\n              intro_heading: 'Informaciones sobre la ubicación',\r\n              location_name: 'Nombre de la ubicación:',\r\n              label_latitude: 'Latitud',\r\n              label_longitude: 'Longitud',\r\n              text_fallback_info: 'En caso contrario se usan las coordenadas estándar.',\r\n              text_location_found: 'La ubicación se ha localizado.',\r\n              text_location_entered: 'La ubicación se ha especificado.',\r\n              text_success_location: 'Se establecen los datos siguiente:',\r\n              button_define_coordinates: 'Introduzca las coordenadas usted mismo',\r\n              text_no_coordinates_found: 'No se han encontrado coordenadas para los datos introducidos.',\r\n              text_coordinates_success_set: 'Coordenadas establecidas.',\r\n              button_set_custom_coordinates: 'Establecer coordenadas',\r\n              text_specify_coordinates_yourself: 'Alternativamente puede introducir las coordenadas usted mismo.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Agregar ubicación nueva',\r\n            tabs: {\r\n              list: 'Naves',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Nave',\r\n            },\r\n            success: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La ubicación se ha creado con éxito.',\r\n            },\r\n            new_form_title: 'Ubicación nueva',\r\n            edit_form_title: 'Editar ubicación',\r\n            new: {\r\n              fields: {\r\n                city: 'Ciudad',\r\n                name: 'Nombre de sitio',\r\n                email: 'E-Mail [opcional]',\r\n                state: 'Provincia [opcional]',\r\n                street: 'Dirección',\r\n                country: 'País',\r\n                website: 'Página web [opcional]',\r\n                zipcode: 'Código postal',\r\n                language: 'Idioma [opcional]',\r\n                name_short: 'Nombre de sitio (abreviado) [opcional]',\r\n                description: 'Descripción [opcional]',\r\n                customer_number: 'Número de cliente [opcional]',\r\n                description_internal: 'Descripción (interno) [opcional]',\r\n              },\r\n              error_messages: {\r\n                email: 'Introduzca una dirección de E-Mail válida.',\r\n                city_not_specified: 'Introduzca una ciudad.',\r\n                name_not_specified: 'Introduzca un nombre de sitio.',\r\n                street_not_specified: 'Introduzca una dirección.',\r\n                country_not_specified: 'Introduzca una País.',\r\n                zipcode_not_specified: 'Introduzca un código postal.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '¡Con éxito!',\r\n              button: 'Volver a la lista',\r\n              message: 'La ubicación se ha actualizado con éxito.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Dirección',\r\n                country: 'País',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Localidad',\r\n              email: 'E-Mail',\r\n              street: 'Dirección',\r\n              country: 'País',\r\n              website: 'Página web',\r\n              postalCode: 'Código postal',\r\n              companyName: 'Empresa',\r\n            },\r\n            tabs: {\r\n              list: 'Empresa',\r\n              worldmap: 'Mapa mundial',\r\n            },\r\n            map: {\r\n              description_not_available: 'No hay disponible ninguna descripción',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Agregar',\r\n                back: 'Volver a la lista',\r\n                edit: 'Actualizar',\r\n                save: 'Guardar',\r\n                email: 'Enviar imagen',\r\n                cancel: 'Cancelar',\r\n                addMultiple: 'Añadir + Nuevo',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Editar administración',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Garantía de calidad',\r\n          users: 'Administración de usuario',\r\n          assets: 'Administración de activos',\r\n          settings: 'Ajustes',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Perfil de usuario',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Administración de usuario',\r\n          assets: 'Administración de activos',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Perfil de usuario',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: 'Área',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Línea',\r\n          long: 'Largo',\r\n          real: 'REAL',\r\n          true: 'Activo',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inactivo',\r\n          float: 'Flotante',\r\n          uword: 'UWORD',\r\n          double: 'Doble',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Booleano',\r\n          integer: 'Entero',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Externo',\r\n          internal: 'Interno',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Un año',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Añadir nueva variable',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Un mes',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rectángulo',\r\n          tabs: {\r\n            list: 'Lista de variables',\r\n          },\r\n          ten_years: 'Diez años',\r\n          two_weeks: 'Dos semanas',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Seis meses',\r\n          categorical: 'Categórico',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Se ha producido un problema al intentar crear una variable. Inténtelo de nuevo más tarde.',\r\n          },\r\n          new_form_title: 'Nueva variable',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Editar variable',\r\n          new: {\r\n            fields: {\r\n              hint: '(Si se cambia, podrían producirse daños en la máquina)',\r\n              showId: 'Mostrar campo de entrada de ID variable',\r\n              maxTime: 'Tiempo máx.',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Tipo de datos',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Tipo de diagrama',\r\n              namePrefix: 'Prefijo de nombre',\r\n              variableId: 'ID variable',\r\n              collections: '',\r\n              displayName: 'Nombre de visualización',\r\n              showInitial: 'Mostrar inicial',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Visibilidad',\r\n            },\r\n            buttons: {\r\n              delete: 'Eliminar variable',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Seleccione un tiempo máximo',\r\n              dataType: 'Seleccione un tipo de datos',\r\n              chartType: 'Seleccione un tipo de diagrama',\r\n              namePrefix: 'Especifique un prefijo de nombre válido (caracteres válidos: A-Z, _).',\r\n              variableId: 'Especifique un UUID válido',\r\n              displayName: 'Especifique un nombre de visualización',\r\n              showInitial: 'Seleccione una inicial',\r\n              namePrefixEdit: 'Especifique un prefijo de nombre válido (caracteres válidos: A-Z a-z, _).',\r\n              visibilityType: 'Seleccione un tipo de visibilidad',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'La variable se ha creado correctamente',\r\n          },\r\n          editError: {\r\n            message: 'Se ha producido un problema al intentar actualizar una variable. Inténtelo de nuevo más tarde.',\r\n          },\r\n          editSuccess: {\r\n            message: 'La variable se ha actualizado correctamente',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Actualizaciones exitosas',\r\n          downloads: 'Descargas correctas',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Se ha producido un error inesperado. Intente cargar la página de nuevo.',\r\n            },\r\n            s_1: {\r\n              message: 'Las modificaciones se han guardado.',\r\n            },\r\n            s_930: {\r\n              message: \"El recurso '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n            s_931: {\r\n              message: \"La empresa '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n            s_932: {\r\n              message: \"La línea '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n            s_933: {\r\n              message: \"La nave '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n            s_934: {\r\n              message: \"La ubicación '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n            s_935: {\r\n              message: \"El archivo '%replaceValue' se ha borrado con éxito.\",\r\n            },\r\n            s_936: {\r\n              message: \"La variable '%replaceValue' se ha eliminado correctamente.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: '¡Se han borrado las tarjetas dobles!',\r\n            add_line_to_dashboard: 'La línea ha sido agregada al dashboard',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Límites',\r\n            type: 'Seleccione según tipo',\r\n            alarms: 'Alarmas',\r\n            machine: 'Seleccione según ID de máquina',\r\n            variables: 'Variables',\r\n            listImport: 'Límites importación',\r\n            listDownload: 'Límites descarga',\r\n          },\r\n          text: {\r\n            text: 'Los valores límite son valores que puede prefijar para las variables que le interesan. Si una variable no se encuentra dentro de los valores límite definidos, recibirá una notificación. Los valores límite también se muestran en los diagramas que se generan en la pestaña «Series temporales».',\r\n            title: 'Límites',\r\n          },\r\n          export: {\r\n            text: 'Puede exportar los valores límite actualmente ajustados para todas las variables disponibles en la Plataforma en Nube en cualquier momento. Puede utilizar esta lista como referencia o utilizarla para importar todos los valores límite de una vez en la sección «Importar valores límite como CSV»',\r\n            title: 'Exportar límites como CSV',\r\n          },\r\n          import: {\r\n            text: 'Puede importar un archivo CSV previamente descargado con información sobre límites y abonados para actualizar los valores guardados actualmente. Más tarde puede seleccionar, a qué tipos de equipos o máquinas desea aplicar los valores límites',\r\n            title: 'Importar valores limite desde CSV',\r\n            machines: {\r\n              title: 'Seleccione las máquinas o el tipo de máquina a los que desea aplicar los valores límites.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Seleccione el archivo CSV que desea importar',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Vaya a la línea elegida en la administración de activos.',\r\n            two: 'En la barra de encabezados encontrará un menú contextual.',\r\n            four: 'El mosaico de la línea se agrega al dashboard.',\r\n            three: 'Haga clic en el menú contextual y seleccione \"Agregar al dashboard\".',\r\n            header: 'Agregar mosaicos de líneas',\r\n          },\r\n          individual: {\r\n            one: 'Haga clic en el icono \"engranaje\" situado a la izquierda.',\r\n            two: 'Seleccione el icono \"positivo\".',\r\n            four: 'Confirme con \"guardar\". El mosaico individual se agrega al dashboard.',\r\n            three: 'Asigne un nombre a su mosaico y agregue sus máquinas elegidas.',\r\n            header: 'Agregar mosaicos individuales',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Crear usuario nuevo',\r\n          new: {\r\n            title: 'Crear usuario',\r\n            status: 'Estado del usuario:',\r\n            buttons: {\r\n              add: 'Agregar',\r\n              back: 'Volver a la lista',\r\n              save: 'Guardar',\r\n              cancel: 'Cancelar',\r\n              delete: 'Borrar usuario',\r\n              sendMail: 'Volver a enviar el correo',\r\n            },\r\n            fields: {\r\n              email: 'E-Mail',\r\n              roles: 'Grupo de usuarios',\r\n              gender: 'Sexo',\r\n              created: 'Creado',\r\n              lastName: 'Apellido',\r\n              firstName: 'Nombre de pila',\r\n              breadcrumb: 'Mostrar navegación',\r\n              main_group: 'Grupo de usuarios',\r\n              phoneNumber: 'Número de teléfono [opcional]',\r\n              customer_org: 'Organización de cliente',\r\n              last_modified: 'Editado por',\r\n              email_validation: 'E-Mail (validación)',\r\n            },\r\n            statusText: {\r\n              unknown: 'desconocido',\r\n              archived: 'archivado',\r\n              confirmed: 'confirmado',\r\n              compromised: 'comprometido',\r\n              unconfirmed: 'sin confirmar',\r\n              reset_required: 'Es necesario restablecer',\r\n              external_provider: 'Proveedor externo',\r\n              force_change_password: 'Cambio de contraseña pendiente',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'Las direcciones de E-mail no concuerdan.',\r\n              email_not_valid: 'Introduzca una dirección de E-Mail válida.',\r\n              phone_not_specified: 'Introduzca un número de teléfono válido que empiece con + y vaya seguido del código de país.',\r\n              roles_not_specified: 'Seleccione un grupo de usuarios.',\r\n              gender_not_specified: 'Por favor Introduzca el sexo.',\r\n              last_name_not_specified: 'Introduzca un apellido.',\r\n              first_name_not_specified: 'Introduzca un nombre de pila.',\r\n              main_group_not_specified: 'Seleccione un grupo de usuarios.',\r\n              family_name_not_specified: 'Introduzca un apellido.',\r\n              customer_organization_not_specified: 'Seleccione una organización de cliente.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: '¡Fallido!',\r\n          },\r\n          mail: {\r\n            success: 'Se ha enviado un E-mail con la contraseña generada automáticamente a la dirección de E-mail indicada.',\r\n          },\r\n          update: {\r\n            title: 'Actualizar usuario',\r\n          },\r\n          success: {\r\n            title: '¡Con éxito!',\r\n            button: 'Volver a la lista',\r\n            message: 'El usuario se ha creado con éxito. Se ha enviado un E-mail con la contraseña generada automáticamente a la dirección de E-mail indicada.',\r\n            message_for_edit: 'Se ha actualizado el usuario con éxito.',\r\n            message_send_mail: 'Se ha enviado un E-mail con la contraseña generada automáticamente a la dirección de E-mail indicada.',\r\n            button_back_to_last_page: 'Volver a la última página',\r\n          },\r\n          delete: {\r\n            success: 'Usuario borrado con éxito.',\r\n            confirmation: {\r\n              title: '¿Realmente desea borrar este usuario?',\r\n              confirm: 'Sí, borrar este usuario',\r\n              dismiss: 'No, cancelar',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Visitante',\r\n            customer: 'Cliente',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Usuario',\r\n              email: 'E-Mail',\r\n              company: 'Empresa',\r\n              enabled: 'Estado',\r\n              lastName: 'Apellido',\r\n              sw_admin: 'SW Admin',\r\n              firstName: 'Nombre de pila',\r\n              userRights: 'Estado de derechos',\r\n              phoneNumber: 'Número de teléfono',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'masculino',\r\n              female: 'femenino',\r\n              diverse: 'diverso',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarmas',\r\n            type: 'Seleccione según tipo',\r\n            machine: 'Seleccione según ID de máquina',\r\n            listImport: 'Importación de alarmas',\r\n            listDownload: 'Descargas de archivos de alarmas',\r\n          },\r\n          text: {\r\n            text: 'Las notificaciones de alarmas se pueden establecer para los números de alarma que le interesan. Cuando se produzca la alarma ajustada en una máquina especificada, recibirá una notificación.',\r\n            title: 'Notificaciones de alarmas',\r\n          },\r\n          export: {\r\n            text: 'En SW CloudPlatform puede exportar las notificaciones de alarmas ajustadas actualmente de todas las máquinas en cualquier momento. Puede utilizar esta lista como referencia o usarla para importar todas las notificaciones de alarmas de una vez en la sección «Importar alarmas como CSV».',\r\n            title: 'Exportación de las alarmas como CSV',\r\n          },\r\n          import: {\r\n            text: 'Puede importar un archivo CSV descargado previamente con información sobre las alarmas y los abonados para actualizar los valores guardados actualmente. Más tarde, puede seleccionar a qué tipos de equipos o máquinas desea aplicar las notificaciones de alarmas importadas.',\r\n            title: 'Importar alarmas desde CSV',\r\n            machines: {\r\n              title: 'Seleccione las máquinas o el tipo de máquina a los que desea aplicar las notificaciones de alarmas.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Seleccione el archivo CSV que desea importar',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'No hay resultados',\r\n          results: {\r\n            of: 'de',\r\n            lines: 'Líneas',\r\n            machines: 'Máquinas',\r\n          },\r\n          callToAction: 'Buscar máquinas',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Fallido',\r\n            queued: 'En cola de espera',\r\n            removed: 'Eliminado',\r\n            canceled: 'Cancelado',\r\n            rejected: 'Rechazado',\r\n            completed: 'Completado',\r\n            succeeded: 'Correcto',\r\n            timed_out: 'Tiempo excedido',\r\n            in_progress: 'En curso',\r\n            not_installed: 'No instalado',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Iniciar importación',\r\n            dismiss: 'Cancelar',\r\n            download: 'Iniciar descarga',\r\n          },\r\n          tabs: {\r\n            limits: 'Limites',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Nombre',\r\n              datatype: 'tipo de datos',\r\n              chartType: 'Tipo de diagrama',\r\n              displayName: 'Nombre de visualización',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Mapa mundial',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shopfloor',\r\n          upload: {\r\n            text1: 'Envíe una imagen de la distribución de la shopfloor a lifedata@sw-machines.com (en formato JPG, PNG o PDF).',\r\n            text2: 'Si sus máquinas están registradas e inscritas en SW CloudPlatform, se mostrarán a la izquierda y enviarán datos en tiempo real.',\r\n            text3: 'Arrastre el estado del plan a la máquina correcta y suéltelo ahí.',\r\n            mainText: 'Esta vista permite configurar la distribución de la shopfloor y ver las máquinas mediante distintas capas de información Solo tiene que seguir las instrucciones.',\r\n            tileTitle: 'Carga de la shopfloor',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'El recurso se ha eliminado correctamente.',\r\n            confirmation: {\r\n              title: \"¿Seguro que desea eliminar '%replaceValue'?\",\r\n              confirm: 'eliminar',\r\n              dismiss: 'cancelar',\r\n              company: {\r\n                text: 'Si elimina la empresa, también se eliminarán todos los usuarios que correspondan a ella.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar recurso',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Si se cambia el NamePrefix o el DataType, podrían producirse daños en la máquina. ¿Seguro que desea guardar?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: '¿Desea aceptar los valores límite de este tipo de máquina nuevo?',\r\n              title: 'Ha modificado el tipo de máquina',\r\n              accept: 'Si, aceptar valores límites nuevos',\r\n              decline: 'No, mantener los valores límites actuales',\r\n              dismiss: 'Cancelar',\r\n              info_accept: \"Para sobrescribir los valores límite actuales con los valores límite del nuevo tipo de máquina, seleccione 'Sí'.\",\r\n              info_decline: \"Para mantener los valores límite actuales, seleccione 'No'.\",\r\n              info_accept_warning: 'Todos los valores límites son sobrescritos o borrados.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Borrar archivo',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar nave',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar línea',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Estado',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Tiempo máquina',\r\n          controller_time: 'Tiempo controlador',\r\n          iot_gateway_time: 'Tiempo IoT Gateway',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'No hay datos disponibles',\r\n              loading: 'Cargando datos...',\r\n              months: [\r\n                'Enero',\r\n                'Febrero',\r\n                'Marzo',\r\n                'Abril',\r\n                'Mayo',\r\n                'Junio',\r\n                'Julio',\r\n                'Agosto',\r\n                'Septiembre',\r\n                'Octubre',\r\n                'Noviembre',\r\n                'Diciembre',\r\n              ],\r\n              resetZoom: 'Restablecer zoom',\r\n              weekdays: [\r\n                'Domingo',\r\n                'Lunes',\r\n                'Martes',\r\n                'Miércoles',\r\n                'Jueves',\r\n                'Viernes',\r\n                'Sábado',\r\n              ],\r\n              shortMonths: [\r\n                'Ene',\r\n                'Feb',\r\n                'Mar',\r\n                'Abr',\r\n                'May',\r\n                'Jun',\r\n                'Jul',\r\n                'Ago',\r\n                'Sep',\r\n                'Oct',\r\n                'Nov',\r\n                'Dic',\r\n              ],\r\n              shortWeekdays: [\r\n                'Do',\r\n                'Lu',\r\n                'Ma',\r\n                'Mi',\r\n                'Ju',\r\n                'Vi',\r\n                'Sa',\r\n              ],\r\n              increaseDateRange: 'al menos hasta',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Preajustes',\r\n            rangeTo: 'Hasta',\r\n            selectDateRange: 'Seleccione un periodo de tiempo',\r\n            predefined: {\r\n              today: 'Hoy',\r\n              custom: 'Intervalo personalizado',\r\n              last7days: 'Últimos 7 días',\r\n              yesterday: 'Ayer',\r\n              last24Hours: 'Últimas 24 horas',\r\n              last5Minutes: 'Últimos 5 minutos',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Editar variable',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar variable',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Seleccione idioma',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar empresa',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Eliminar ubicación',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Estado',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Configurar Dashboard',\r\n            hide: {\r\n              title: 'desechar',\r\n            },\r\n            show: {\r\n              title: 'mostrar',\r\n            },\r\n            delete: {\r\n              title: 'borrar',\r\n            },\r\n            add: {\r\n              fab_title: 'Agregar su propio cuadro',\r\n            },\r\n            save: {\r\n              fab_title: 'Guardar configuración',\r\n            },\r\n            move_left: {\r\n              title: 'Deslizar a la posición anterior',\r\n            },\r\n            move_right: {\r\n              title: 'Deslizar a la posición siguiente',\r\n            },\r\n            discard: {\r\n              fab_title: 'Desechar configuración',\r\n            },\r\n            add_custom_card: {\r\n              save: 'guardar',\r\n              input: 'Indicar nombre de cuadro',\r\n              title: 'Agregar su propio cuadro',\r\n              cancel: 'cancelar',\r\n              missingMachine: 'Deberá seleccionar una máquina como mínimo',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Se ha producido un error inesperado. Intente cargar la página de nuevo.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Error informacional',\r\n            },\r\n            e_2xx: {\r\n              message: 'Éxito',\r\n            },\r\n            e_3xx: {\r\n              message: 'Reenvío',\r\n            },\r\n            e_400: {\r\n              message: 'La petición ha sido errónea y no se ha podido procesar.',\r\n            },\r\n            e_401: {\r\n              message: 'No está autenticado. Vuelva a iniciar sesión.',\r\n            },\r\n            e_403: {\r\n              message: 'No dispone del permiso suficiente para acceder a los recursos solicitados.',\r\n            },\r\n            e_404: {\r\n              message: 'No está disponible el recurso solicitado.',\r\n            },\r\n            e_405: {\r\n              message: 'Método no permitido.',\r\n            },\r\n            e_406: {\r\n              message: 'Método no aceptable',\r\n            },\r\n            e_409: {\r\n              message: 'El recurso ya existe.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Método contenido no procesable',\r\n            },\r\n            e_4xx: {\r\n              message: 'Error cliente',\r\n            },\r\n            e_500: {\r\n              message: 'Se ha producido un error interno de servidor.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Error servidor',\r\n            },\r\n            e_900: {\r\n              message: 'El intento de crear un recurso ha fallado. Vuelva a intentarlo más tarde.',\r\n            },\r\n            e_901: {\r\n              message: 'La acción se ha interrumpido. No se ha creado un recurso nuevo.',\r\n            },\r\n            e_902: {\r\n              message: 'La acción se ha interrumpido. No se ha enviado ninguna petición de asistencia.',\r\n            },\r\n            e_903: {\r\n              message: 'Al intentar enviar la petición de asistencia se ha producido un fallo. Vuelva a intentarlo más tarde.',\r\n            },\r\n            e_904: {\r\n              message: \"El activo '%replaceValue' se ha creado con éxito. Ahora puede agregar mas activos.\",\r\n            },\r\n            e_905: {\r\n              message: 'La acción se ha interrumpido. El activo no se ha actualizado.',\r\n            },\r\n            e_906: {\r\n              message: \"El recurso '%replaceValue' se ha movido con éxito.\",\r\n            },\r\n            e_910: {\r\n              message: 'El intento de crear un usuario ha fallado. Vuelva a intentarlo más tarde.',\r\n            },\r\n            e_911: {\r\n              message: 'La acción se ha interrumpido. No se ha creado ningún usuario nuevo.',\r\n            },\r\n            e_912: {\r\n              message: 'Se ha producido un error al intentar actualizar un recurso. Inténtelo de nuevo.',\r\n            },\r\n            e_920: {\r\n              message: 'La acción se ha interrumpido. No se ha guardado ninguna modificación.',\r\n            },\r\n            e_921: {\r\n              message: 'Se ha producido un error inesperado. Inténtelo de nuevo.',\r\n            },\r\n            e_922: {\r\n              message: 'El nombre de usuario y/o la contraseña no son correctos. Inténtelo de nuevo.',\r\n            },\r\n            e_923: {\r\n              message: 'Introduzca un nombre de usuario y una contraseña.',\r\n            },\r\n            e_924: {\r\n              message: 'La sesión ha expirado por falta de actividad. Vuelva a iniciar sesión.',\r\n            },\r\n            e_925: {\r\n              message: 'Para poder utilizar SW Cloud Platform debe aceptar nuestra declaración de protección de datos.',\r\n            },\r\n            e_926: {\r\n              message: 'Su cuenta se ha bloqueado de forma temporal. Inténtelo de nuevo dentro de unos minutos.',\r\n            },\r\n            e_927: {\r\n              message: 'La contraseña se ha cambiado correctamente.',\r\n            },\r\n            e_928: {\r\n              message: 'La acción se ha interrumpido. No se ha cargado ningún archivo.',\r\n            },\r\n            e_929: {\r\n              message: 'Se ha producido un error al intentar cargar un archivo. Inténtelo de nuevo más tarde.',\r\n            },\r\n            e_930: {\r\n              message: 'Se ha producido un error al intentar borrar un archivo. Vuelva a intentarlo más tarde.',\r\n            },\r\n            e_931: {\r\n              message: 'Intervalo de fechas personalizado demasiado grande. Fijado el valor predeterminado de 24H',\r\n            },\r\n            e_932: {\r\n              message: 'El activo tiene elementos subordinados. Primero, debe eliminar los elementos subordinados.',\r\n            },\r\n            e_933: {\r\n              message: \"La variable '%replaceValue' se ha creado correctamente. Ahora puede añadir otra variable.\",\r\n            },\r\n            e_934: {\r\n              message: 'Se ha producido un problema al intentar eliminar la variable. Inténtelo de nuevo más tarde.',\r\n            },\r\n            e_10500: {\r\n              message: 'Parece que no tiene conexión a Internet. Compruebe que disponga de conexión.',\r\n            },\r\n            e_10501: {\r\n              message: 'El navegador que utiliza no es compatible. Utilice uno de estos navegadores: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'El Asset (SW número de máquina %replaceValue) ya existe.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Este nombre de archivo %replaceValue ya existe',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Solo se pueden seleccionar %s elementos al mismo tiempo',\r\n              title: 'Numero máx. alcanzado',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Filtro de tiempo',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'No hay archivos disponibles.',\r\n              file_cardTitle: 'Eventos de la máquina',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Descargar datos',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'Archivos de rastreo NC',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Alarmas no disponible',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'Archivos de comparación NC',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'Archivos de datos NC',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'No hay archivos disponibles.',\r\n              file_cardTitle: 'Archivos ToolMon',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Descargar datos ToolMon',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Activador',\r\n              column_title_filename: 'Nombre del archivo',\r\n              column_title_creation_date: 'Fecha de creación',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'Archivos de grabadora de vuelos HMI',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  fr: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Se déconnecter',\r\n        release: \"Du '%replaceValue1' au '%replaceValue2', des opérations de maintenance seront réalisées sur la plateforme. La plateforme sera partiellement indisponible pendant cette période.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Fermer',\r\n        acceptLabel: 'Accepter',\r\n        userProfile: 'Profil d’utilisateur',\r\n        button: {\r\n          clear: 'Enlever le diagramme',\r\n          timeline: 'Adaptation de valeur limite',\r\n          separateCharts: 'Diagrammes séparés',\r\n        },\r\n        declineLabel: 'Refuser',\r\n        backToDashboard: 'Retour au dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/fr/conditions-generales-de-vente/',\r\n            title: 'CONDITIONS GÉNÉRALES DE VENTE',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Contact',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/fr/mentions-legales/',\r\n            title: 'Mentions légales',\r\n          },\r\n          privacy: {\r\n            title: 'Sphère privée',\r\n            header: 'Dispositions relatives à la protection des données',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'Page d’accueil SW',\r\n          },\r\n        },\r\n        noInternetConnection: 'Il semblerait que vous n’êtes pas connecté à Internet. Veuillez vous connecter et effectuer une nouvelle tentative.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'de',\r\n          noData: 'Pas de données',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'Téléchargé',\r\n          noDuration: 'aucune durée disponible',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'Votre machine n’est pas sous licence.',\r\n          alarmPending: 'Alarmes en cours',\r\n          buttons: {\r\n            back: 'Retour',\r\n            save: 'Enregistrer',\r\n            view: 'Afficher',\r\n            cancel: 'Annuler',\r\n            custom: 'Enregistrer + régler la plage personnalisée',\r\n            submit: 'Reprendre',\r\n            export: {\r\n              limit: 'Limites de téléchargement',\r\n              alarms: 'Alarmes de téléchargement',\r\n            },\r\n            import: {\r\n              limit: 'Démarrer',\r\n              alarms: 'Démarrer',\r\n            },\r\n            refreshReset: 'Réinitialiser à l’heure standard',\r\n            selectAllCheckboxes: 'Sélectionner tout',\r\n            unselectAllCheckboxes: 'Lever la sélection',\r\n          },\r\n          notAvailable: 'Indisponible',\r\n          notConnected: 'Pas encore connecté',\r\n          download: {\r\n            file: 'Téléchargements de fichier',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'Jour',\r\n            days: 'Jours',\r\n            hour: 'Heure',\r\n            year: 'Année',\r\n            hours: 'Heures',\r\n            month: 'Mois',\r\n            years: 'Années',\r\n            minute: 'Minute',\r\n            months: 'Mois',\r\n            second: 'Seconde',\r\n            minutes: 'Minutes',\r\n            seconds: 'Secondes',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Compris',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Il sera impossible d’annuler cette action !',\r\n        },\r\n        error: {\r\n          upload: 'Téléchargements montants échoués',\r\n          download: 'Téléchargements échoués',\r\n          message: {\r\n            enrollment_code_409: 'L’appareil est déjà inscrit dans aws.',\r\n            limit_change_failed: 'Impossible de modifier les valeurs limites. Veuillez effectuer une nouvelle tentative ultérieurement.ou écrivez un courriel à lifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Enregistrements horodatés',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Sélectionner des variables',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Date',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Accès assisté sécurisé',\r\n            directAccess: 'Accès direct',\r\n            new: {\r\n              fields: {\r\n                id: 'Saisir l’ID',\r\n                cOnePanel: 'avec C|One',\r\n                sessionType: 'Type de session',\r\n              },\r\n              error_messages: {\r\n                id: 'Veuillez saisir une ID de session ou d’appareil',\r\n                sessionType: 'Veuillez sélectionner une ID de session',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'IPC',\r\n              list: 'Machines',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Ajouter une nouvelle ligne',\r\n            grid: {\r\n              hall: 'Halle',\r\n              line: 'Ligne',\r\n              type: 'Type',\r\n              contractEnd: 'Fin du contrat [en option]',\r\n              cellPosition: 'Ligne / position [en option]',\r\n              operationStep: 'Adresse de traitement',\r\n              machineIdentifierSw: 'N° machine (SW)',\r\n              machineIdentifierCustomer: 'Nom de la machine',\r\n            },\r\n            success: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'La ligne a été créée avec succès.',\r\n            },\r\n            new_form_title: 'Nouvelle ligne',\r\n            edit_form_title: 'Éditer la ligne',\r\n            new: {\r\n              fields: {\r\n                name: 'Nom de la ligne',\r\n                name_short: 'Nom de la ligne (forme courte) [en option]',\r\n                description: 'Description [en option]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Veuillez saisir un nom de ligne.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'La ligne a été actualisée avec succès.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Ajouter une nouvelle halle',\r\n            grid: {\r\n              part: 'Type de pièces',\r\n              lineName: 'Ligne',\r\n              typeOfLoading: 'Type de chargement',\r\n              lineResponsible: 'Responsable de ligne',\r\n              plannedQuantity: 'Quantité prévue',\r\n              numberOfMachines: '# machines',\r\n            },\r\n            tabs: {\r\n              list: 'Lignes',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'La halle a été créée avec succès.',\r\n            },\r\n            new_form_title: 'Nouvelle halle',\r\n            shopfloor: {\r\n              edit: 'Mode d’édition',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Enregistrer la configuration',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Rejeter la configuration',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Éditer la halle',\r\n            new: {\r\n              fields: {\r\n                name: 'Nom de la halle',\r\n                name_short: 'Nom de la halle (forme courte) [en option]',\r\n                description: 'Description [en option]',\r\n                description_external: 'Description (externe) [en option]',\r\n                description_internal: 'Description (interne) [en option]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Veuillez saisir un nom de halle.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'La halle a été actualisée avec succès.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Description [en option]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Créer un nouvel actif',\r\n            tabs: {\r\n              info: 'Séries temporelles',\r\n              alarms: 'Alarmes',\r\n              events: 'Événements machine',\r\n              gateway: 'Gateway',\r\n              service: 'Service',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Disponibilité ligne',\r\n              'axis-test': 'Tests d’axe',\r\n              collection: 'Collections',\r\n              technology: 'Technologie',\r\n              maintenance: 'Entretien',\r\n              performance: 'Performance',\r\n              spindledata: 'Données de broche',\r\n              remoteaccess: 'Accès distant',\r\n              enduranceTest: 'Test de fin de ligne',\r\n              administration: 'Administration',\r\n              y_title: {\r\n                status: 'Etat',\r\n                status_table_one: 'Table 1',\r\n                status_table_two: 'Table 2',\r\n              },\r\n              energymonitoring: 'Surveillance de l’énergie',\r\n              technology_undefined: 'Non défini',\r\n              technology_undefined_condition: 'État indéfini !',\r\n            },\r\n            move: {\r\n              message: \"L’actif '%replaceValue' peut être déplacé dans une nouvelle entreprise, un nouveau site, une nouvelle halle et/ou une nouvelle ligne.\",\r\n              select_hall_label: 'Sélectionner une nouvelle halle',\r\n              select_line_label: 'Sélectionner une nouvelle ligne',\r\n              select_company_label: 'Sélectionner une nouvelle entreprise',\r\n              select_location_label: 'Sélectionner un nouveau site',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Numéro de machine (SW)',\r\n                iotcore: 'IdO Core',\r\n                startup: 'Livraison [en option]',\r\n                shipping: 'Expédition [en option]',\r\n                controller: 'Commande',\r\n                machine_type: 'Type de machine',\r\n                warranty_end: 'Fin de la garantie [en option]',\r\n                iotgreengrass: 'IdO Greengrass',\r\n                systemsManager: 'Gestionnaire système',\r\n                warranty_start: 'Début de la garantie [en option]',\r\n                machine_swmp_api: 'Fin API SWCP machine [en option]',\r\n                machine_swsp_trace: 'Fin traçage SWCP machine [en option]',\r\n                machine_swcp_portal: 'Fin portail SWCP machine [en option]',\r\n                start_of_production: 'Début de la production [en option]',\r\n                machine_swcp_support: 'Fin support SWCP machine [en option]',\r\n                machine_cell_position: 'Cellule machine / position',\r\n                machine_swsp_line_mon: 'Fin LineMon SWCP machine [en option]',\r\n                machine_identifier_customer: 'ID machine (client)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Veuillez saisir un numéro machine SW valide (min. 7 caractères: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Veuillez sélectionner une commande.',\r\n                machine_type_not_specified: 'Veuillez sélectionner un type de machine.',\r\n                machine_identifier_customer_not_specified: 'Veuillez saisir une ID de machine valide.',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: \"L'actif a été créé avec succès.\",\r\n            },\r\n            new_form_title: 'Ajouter un actif',\r\n            edit_form_title: 'Éditer l’actif',\r\n            move_form_title: 'Déplacer un actif',\r\n            editSuccess: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: \"L'actif a été actualisé avec succès.\",\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: \"Date d'expédition\",\r\n                controller: 'Commande',\r\n                contractEnd: 'Fin du contrat',\r\n                machineType: 'Type de machine',\r\n                startupDate: 'Date de mise en service',\r\n                warrantyEnd: 'Fin de la garantie',\r\n                cellPosition: 'Cellule / position',\r\n                warrantyStart: 'Début de la garantie',\r\n                customerNumber: 'Numéro de client',\r\n                enrollmentConfig: 'Configuration Enrollment',\r\n                startOfProduction: 'Début de la production',\r\n                machineIdentifierSw: 'N° machine SW',\r\n                enrollmentConfigDownload: 'Télécharger',\r\n                machineIdentifierCustomer: 'Nom de la machine client',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Remplacement',\r\n              g_mode: 'Fonction G',\r\n              off_time: 'Durée secondaire',\r\n              no_change: 'Pas de remplacement',\r\n              undefined: 'Non défini',\r\n              active_tool: 'Outil actif',\r\n              tool_change: 'Remplacement d’outil',\r\n              machining_time: 'Durée principale',\r\n              tool_change_time: 'Durée de remplacement d’outil',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Durée de processus table 1',\r\n                  name_two: 'Durée de processus table 2',\r\n                  name_one_undefined: 'Durée de processus indéfinie table 1',\r\n                  name_two_undefined: 'Durée de processus indéfinie table 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Axe Q et broche',\r\n              undefined_gmode_data: 'Aucune donnée pour la fonction G',\r\n              auxiliary_process_time: 'Durée de processus supplémentaire',\r\n              undefined_activetool_data: 'Pas de données pour l’outil actif',\r\n              undefined_tool_change_data: 'Pas de données pour le remplacement d’outil',\r\n              undefined_machining_time_table_one: 'État non défini table 1',\r\n              undefined_machining_time_table_two: 'État non défini table 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Durées principale, de changement d’outil & secondaire table 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Durées principale, de changement d’outil & secondaire table 2',\r\n            },\r\n            add_line_to_dashboard: 'Ajouter une ligne vers le dashboard',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'IPC',\r\n                unit: 'Unité',\r\n                value: 'Valeur',\r\n                kpiUnit: 'Unité',\r\n                headline: 'Tests d’axe',\r\n                kpiValue: 'Valeur',\r\n                kpiHeader: 'IPC',\r\n                limitsLoad: 'Charger depuis la mémoire du navigateur',\r\n                limitsSave: 'Enregistrer dans la mémoire du navigateur',\r\n                selectAxis: 'Sélectionner l’axe',\r\n                limitsExport: 'Exporter les valeurs limites dans le presse-papier',\r\n                openAxistest: 'Ouvrir test d’axe',\r\n                axisTestPlural: 'Tests d’axe',\r\n                adjustments: {\r\n                  add: 'Ajouter une adaptation locale',\r\n                  range: 'Portée',\r\n                  header: 'Adaptation locale',\r\n                  remove: 'Enlever',\r\n                  position: 'Position',\r\n                  amplitude: 'Amplitude',\r\n                  spreadMultiplier: 'Multiplicateur de limites',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Position',\r\n                    y: 'Courant',\r\n                    up: 'vers le haut',\r\n                    down: 'vers le bas',\r\n                    limitsUp: 'limite la direction positive',\r\n                    limitsDown: 'limite la direction négative',\r\n                    sliderSlopeCenter: 'Origine de la pente',\r\n                    sliderSlopeFactor: 'Facteur de pente',\r\n                    sliderVerticalOffset: 'Décalage Y',\r\n                    sliderVerticalSpread: 'Limiter la largeur',\r\n                    sliderQuadraticCenter: 'Origine carrée',\r\n                    sliderQuadraticFactor: 'Facteur carré',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Sens horaire',\r\n                    limitsClockwise: 'Limites dans le sens horaire',\r\n                    counterClockwise: 'Sens antihoraire',\r\n                    sliderSineOffset: 'Décalage d’onde',\r\n                    sliderSineAmplitude: 'Amplitude d’onde',\r\n                    sliderSineFrequency: 'Fréquence d’onde',\r\n                    sliderVerticalOffset: 'Décalage Y',\r\n                    sliderVerticalSpread: 'Limiter la largeur',\r\n                    limitsCounterClockwise: 'Limites dans le sens antihoraire',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Vitesse',\r\n                  pulseMaxRampUp: 'Rampe ->',\r\n                  pulseMaxRampDown: 'Rampe <-',\r\n                  pulseMaxStiffness: 'Rigidité maximale',\r\n                  pulseMinStiffness: 'Rigidité minimale',\r\n                  pulseMeanStiffness: 'Rigidité Ø',\r\n                  circularReversalRange: 'Jeu à l’inversion circulaire',\r\n                  pulseMaxUpPathCurrent: 'Courant maximum ->',\r\n                  pulseMinUpPathCurrent: 'Courant minimum ->',\r\n                  pulseMeanUpPathCurrent: 'Courant Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Courant maximum <-',\r\n                  pulseMinDownPathCurrent: 'Courant minimum <-',\r\n                  pulseMeanDownPathCurrent: 'Courant Ø <-',\r\n                  circularShapeDeviationClockwise: 'Déviation de forme circulaire vers la droite',\r\n                  pulseStiffnessStandardDeviation: 'Rigidité σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Courant σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Courant σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Déviation de forme circulaire vers la gauche',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Test de circularité',\r\n                  EQUABILITY: 'Test de synchronisation',\r\n                  CIRCULARITY: 'Test de circularité',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Aucun test d’axe de ce type disponible',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: \"En cas d'erreur, veuillez vous adresser à\",\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Veuillez mettre les données à notre disposition au moyen du formulaire Netcfg.',\r\n                  intro: 'Pour pouvoir intégrer votre machine, nous dépendons de vos indications relatives à la configuration du réseau.',\r\n                  title: 'Configuration du réseau',\r\n                  goToNetconfig: 'Ouvrir la configuration du réseau',\r\n                },\r\n                device: {\r\n                  title: \"Détails de l'appareil\",\r\n                },\r\n                enrollment: {\r\n                  pic: 'Si l’IoT Gateway ressemble à cela, exécutez les étapes suivantes :',\r\n                  line1: 'Télécharger le fichier Enrollment en cliquant sur le bouton au bord inférieur de la vignette.',\r\n                  line2: 'Le téléchargement démarre automatiquement.',\r\n                  line3: \"Insérer le fichier .json dans le répertoire racine sur la clé USB. S'assurer que le fichier est nommé :\",\r\n                  line4: 'enrollment.json.',\r\n                  line5: \"S'assurer que les fichiers suivants se trouvent dans le répertoire racine de la clé USB :\",\r\n                  line6: \"Enficher la clé USB dans l'IoT-Gateway correspondante.\",\r\n                  line7: 'L‘apprentissage démarre automatiquement, ce qui est signalé par une diode d’utilisateur verte clignotante.',\r\n                  line8: \"Une fois la connexion effectuée, la diode verte est allumée jusqu'à ce que la clé USB soit retirée.\",\r\n                  title: 'Enrollment',\r\n                  button: 'Fichier Enrollment',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Télécharger le fichier « migrate-iot.zip » et extrayez son contenu directement sur une clé USB vide.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Télécharger également le ',\r\n                  line4: \" et l'ajouter sur la clé USB. S'assurer que le fichier est nommé de la manière suivante :\",\r\n                  line5: \"S'assurer que les fichiers suivants se trouvent dans le répertoire racine de la clé USB :\",\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Migration de la plateforme',\r\n                  line10: \"Enficher la clé USB dans l'IoT-Gateway correspondante.\",\r\n                  line11: \"Le logiciel s'installe automatiquement, ce qui est signalé par une diode jaune clignotante.\",\r\n                  line12: \"Une fois la migration terminée, la diode verte est allumée jusqu'à ce que la clé USB soit retirée.\",\r\n                  line13: \"Une fois la migration terminée, la diode verte est allumée jusqu'à ce que la clé USB soit retirée.\",\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Générer',\r\n                headline: 'Séries temporelles',\r\n                noChartMessage: 'Pour afficher les données souhaitées, sélectionnez une ou plusieurs variables et cliquez sur Générer',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarmes',\r\n              },\r\n              service: {\r\n                contact: 'Veuillez contacter',\r\n                headline: 'Service',\r\n                update: {\r\n                  title: 'Actualiser un fichier',\r\n                },\r\n                upload: {\r\n                  title: 'Télécharger le fichier',\r\n                  fields: {\r\n                    file: 'Fichier',\r\n                    language: 'Langue du fichier',\r\n                    file_name: 'Nom de fichier',\r\n                    list_of_languages: {\r\n                      cz: 'Tchèque',\r\n                      de: 'Allemand',\r\n                      en: 'Anglais',\r\n                      es: 'Espagnol',\r\n                      fr: 'Français',\r\n                      hu: 'Hongrois',\r\n                      it: 'Italien',\r\n                      ko: 'Coréen',\r\n                      pl: 'Polonais',\r\n                      tr: 'Turc',\r\n                      zh: 'Chinois',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Télécharger',\r\n                    cancel: 'Annuler',\r\n                  },\r\n                  success: {\r\n                    title: 'Réussi',\r\n                    button: 'Retour à la vue d’ensemble de service',\r\n                    message: 'Le fichier a été téléchargé avec succès',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Veuillez saisir un nom de fichier.',\r\n                    file_not_valid: 'Veuillez indiquer un fichier / veuillez sélectionner un fichier plus petit.',\r\n                    language_not_specified: 'Veuillez indiquer une langue de fichier.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Manuels',\r\n                },\r\n                version: {\r\n                  title: 'Fichiers de version',\r\n                },\r\n                contracts: {\r\n                  title: 'Contrats',\r\n                },\r\n                components: {\r\n                  title: 'Composants matériels et logiciels',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Nomenclatures de pièces de rechange',\r\n                },\r\n                consumeables: {\r\n                  title: 'Fluides de service',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Actualiser',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Pour activer une machine pour l’accès à distance, Teamviewer doit être installé sur l’IoT Gateway. ',\r\n                  line2: 'Si ce n’est pas le cas, installez Teamviewer en cliquant simplement sur « Installer ».',\r\n                  title: 'Installez l’assistance à distance',\r\n                  status: 'État du déploiement',\r\n                  copy: {\r\n                    button: 'Copier le lien',\r\n                  },\r\n                  install: {\r\n                    button: 'Installer Teamviewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Démarrer une session',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT Gateway',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Système d’exploitation',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Avez-vous besoin d’aide pour votre machine?',\r\n                  line2: 'Contactez-nous!',\r\n                  title: 'Message au SAV SW',\r\n                  button: 'Contacter le SAV',\r\n                  fields: {\r\n                    name: 'Numéro de machine (SW)',\r\n                    type: 'Type de demande',\r\n                    email: 'Courriel',\r\n                    message: 'Message',\r\n                    phone_no: 'Numéro de téléphone',\r\n                    last_name: 'Nom',\r\n                    first_name: 'Prénom',\r\n                    contact_person: 'Interlocuteur (SW) [en option]',\r\n                    list_of_types: {\r\n                      request: 'Demande générale',\r\n                      service: 'Service',\r\n                      retrofit: 'Réaménagement',\r\n                      expansion: 'Extension',\r\n                      inspection: 'Inspection',\r\n                    },\r\n                    machine_identifier_customer: 'ID machine (client) [en option]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Envoyer la demande',\r\n                    cancel: 'Annuler',\r\n                  },\r\n                  success: {\r\n                    title: 'Réussi!',\r\n                    button: 'Retour à la vue d’ensemble du SAV',\r\n                    message: 'La demande a été transmise avec succès au SAV SW.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Veuillez saisir une adresse de courriel valide.',\r\n                    name_not_specified: 'Veuillez saisir un numéro machine SW valide (min. 7 caractères: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Veuillez saisir un numéro de téléphone valide.',\r\n                    message_not_specified: 'Veuillez saisir un message.',\r\n                    last_name_not_specified: 'Veuillez saisir un nom.',\r\n                    first_name_not_specified: 'Veuillez saisir un prénom.',\r\n                    family_name_not_specified: 'Veuillez saisir un nom.',\r\n                    contact_type_not_specified: 'Veuillez saisir un type de demande.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Logiciel machine',\r\n                  values: {\r\n                    nc_version: 'Version CN',\r\n                    hmi_version: 'Version HMI',\r\n                    plc_version: 'Version PLC',\r\n                    compile_cycles: 'Cycles de compilation',\r\n                    operating_system: 'Système d’exploitation',\r\n                    pcu_base_version: 'Version de base PCU',\r\n                    plc_toolbox_version: 'Toolbox PLC',\r\n                    plc_user_program_version: 'Programme d’utilisateur PLC',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Le nom du fichier a été modifié avec succès',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Assistance à distance',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: \"L'assistant de traitement vous aide pour la résolution du problème.\",\r\n                  title: 'Assistant de traitement',\r\n                  sub_title: 'Avez-vous des difficultés actuellement avec un de vos actifs ?',\r\n                  open_assistant: \"Ouvrir l'assistant de traitement\",\r\n                  request_account: 'Demander un compte',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Statistiques de broche SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'Marche',\r\n                labelOffline: 'Arrêt',\r\n              },\r\n              swimlane: {\r\n                headline: 'Disponibilité ligne',\r\n              },\r\n              endurance: {\r\n                headline: 'Test de fin de ligne',\r\n                chartTitles: {\r\n                  runtime: 'Données de durée de fonctionnement',\r\n                  endurance: 'Test de fin de ligne',\r\n                  operation: 'Mode de service',\r\n                  qaxis_180: 'Axe Q 180°',\r\n                  nc_program: 'Programme CN',\r\n                  stacklights: '3 lampes d’appel',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: \"État de l'envoi\",\r\n                aborted: 'interrompu',\r\n                sending: 'envoie',\r\n                undefined: 'Non défini',\r\n                interrupted: 'interrompu',\r\n              },\r\n              alarms_map: {\r\n                headline: \"Carte d'alarme\",\r\n              },\r\n              collection: {\r\n                headline: 'Collection',\r\n                noChartMessage: 'Veuillez sélectionner une collection du côté gauche.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Somme',\r\n                  header: 'Performance KPI',\r\n                  target: 'Théorique',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarmes',\r\n                  category: [\r\n                    'Non classifié',\r\n                    'Message d’erreur',\r\n                    'Message de service',\r\n                    'Message d’état',\r\n                    'Instructions de service',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Tendance',\r\n                    duration: \"Durée d'activation\",\r\n                    flatlist: 'Liste plate',\r\n                    frequency: 'Fréquence d’apparition',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Temps',\r\n                    trend: 'Tendance',\r\n                    duration: \"Durée d'activation\",\r\n                    leftTime: \"L’alarme s'arrête\",\r\n                    alarmCount: 'Nombre',\r\n                    alarmNumber: 'N° d’alarme',\r\n                    description: 'Description',\r\n                    alarmOccured: 'L’alarme est survenue',\r\n                    alarmClassification: 'Classification d’alarme',\r\n                    alarmCountSecondRange: 'Nombre T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'augmentant',\r\n                      down: 'descendant',\r\n                      flat: 'constant',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Détails',\r\n                  ncProgram: 'Programme CN',\r\n                  lastModified: 'Dernier enregistrement de valeur',\r\n                  machineState: 'État machine',\r\n                  numberAlarms: 'Alarmes en cors',\r\n                  stopCondition: 'Conditions d’arrêt',\r\n                  ncProgramState: 'État de programme CN',\r\n                  protectionLevel: 'Niveau de protection',\r\n                  ncProgramStates: [\r\n                    'interrompu',\r\n                    'arrêté',\r\n                    'tourne',\r\n                    'en attente',\r\n                    'interrompu',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Système',\r\n                    'Fabricant',\r\n                    'Service',\r\n                    'Utilisateur',\r\n                    'Commutateur à clé position 3',\r\n                    'Commutateur à clé position 2',\r\n                    'Commutateur à clé position 1',\r\n                    'Commutateur à clé position 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Durée de cycle',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Durée du cycle en s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'Pas OK',\r\n                  sum: 'Somme',\r\n                  title: 'Compteur d’unités',\r\n                  titleDayCounter: 'Compteur journalier',\r\n                  titleShiftCounter: 'Compteur d’équipe',\r\n                  titleTotalCounter: 'Compteur total',\r\n                  titleTotalCounterSmall: 'Total',\r\n                },\r\n                availability: {\r\n                  title: 'Disponibilité',\r\n                  kpi: {\r\n                    title: 'IPC disponibilité',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG avec erreur',\r\n                    MDA_with_error: 'MDA avec erreur',\r\n                    JOG_without_error: 'JOG sans erreur',\r\n                    MDA_without_error: 'MDA sans erreur',\r\n                    not_defined_condition: 'État non défini',\r\n                    auto_no_program_active: 'AUTO Pas de programme actif',\r\n                    auto_waiting_for_parts: 'AUTO Attente de pièces',\r\n                    auto_with_error_program_stopped: 'AUTO avec erreur - Programme arrêté',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO Attente de pièces + erreur d’arrêt',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Disponibilité agrégée',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Disponibilité',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Etat',\r\n                },\r\n                operationMode: {\r\n                  title: 'État de service',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'État de service',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Moniteur de durée de fonctionnement',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Programme',\r\n                      labels: {\r\n                        on: 'marche',\r\n                        off: 'arrêt',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Override broche',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Override avance',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administration',\r\n                headline: 'Administration',\r\n                aws: {\r\n                  title: 'Liens AWS',\r\n                },\r\n                groups: {\r\n                  title: 'Groupes de choses',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IdO Core',\r\n                    ssm: 'Gestionnaire système',\r\n                    greengrass: 'IdO Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Nomenclature de pièces',\r\n                },\r\n                component: {\r\n                  title: 'Composants',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Entretien',\r\n              },\r\n              spindleData: {\r\n                headline: 'Données de broche',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Accès distant',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Durée avant alarme(s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Durée après alarme(s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Surveillance d’énergie',\r\n                chartTitles: {\r\n                  air: 'Consommation d’air comprimé',\r\n                  current: 'Consommation électrique',\r\n                  consumption: 'Consommation horaire moyenne',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Surveillance de l’état',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Ajouter une nouvelle entreprise',\r\n            grid: {\r\n              city: 'Lieu',\r\n              email: 'Courriel',\r\n              street: 'Adresse',\r\n              country: 'Pays',\r\n              website: 'Site Internet',\r\n              postalCode: 'Code postal',\r\n              locationName: 'Site',\r\n              locationCustomerNumber: 'Numéro de client',\r\n            },\r\n            tabs: {\r\n              list: 'Sites',\r\n              worldmap: 'Carte du monde',\r\n            },\r\n            success: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: \"L'entreprise a été créée avec succès.\",\r\n            },\r\n            toggle_switch: 'Créer un site avec les mêmes caractéristiques',\r\n            new_form_title: 'Nouvelle entreprise',\r\n            edit_form_title: 'Éditer l’entreprise',\r\n            new: {\r\n              fields: {\r\n                city: 'Ville',\r\n                name: 'Nom de l’entreprise',\r\n                email: 'Courriel [en option]',\r\n                state: 'Land [en option]',\r\n                street: 'Adresse',\r\n                country: 'Pays',\r\n                website: 'Site Internet [en option]',\r\n                zipcode: 'Code postal',\r\n                legal_form: 'Forme juridique [en option]',\r\n                name_short: \"Nom de l'entreprise (court) [en option]\",\r\n                description: 'Description [en option]',\r\n                company_logo: 'Logo de l’entreprise (URL) [en option]',\r\n                customer_number: 'Numéro de client',\r\n                industry_sector: 'Secteur industriel',\r\n                description_external: 'Description (externe) [en option]',\r\n                description_internal: 'Description (interne) [en option]',\r\n              },\r\n              error_messages: {\r\n                url: 'Veuillez saisir une URL valide.',\r\n                email: 'Veuillez saisir une adresse de courriel valide.',\r\n                city_not_specified: 'Veuillez saisir une ville.',\r\n                name_not_specified: 'Veuillez saisir un nom d’entreprise.',\r\n                street_not_specified: 'Veuillez saisir une adresse.',\r\n                country_not_specified: 'Veuillez saisir un pays.',\r\n                zipcode_not_specified: 'Veuillez saisir un code postal.',\r\n                customer_number_not_specified: 'Veuillez saisir un numéro de client.',\r\n                industry_sector_not_specified: 'Veuillez saisir un secteur industriel.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: \"L'entreprise a été actualisée avec succès.\",\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'Courriel',\r\n                address: 'Adresse',\r\n                country: 'Pays',\r\n                website: 'Site Internet',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'La SW CloudPlatform représente cette entreprise sur une carte et utilise à cet effet la longitude et la latitude.',\r\n              intro_heading: 'Informations relatives au lieu',\r\n              location_name: 'Nom du lieu :',\r\n              label_latitude: 'Latitude',\r\n              label_longitude: 'Longitude',\r\n              text_fallback_info: \"Si ce n'est pas le cas, les coordonnées par défaut sont utilisées.\",\r\n              text_location_found: 'Un lieu a été trouvé.',\r\n              text_location_entered: 'Le lieu a été indiqué.',\r\n              text_success_location: 'Les données suivantes ont été définies :',\r\n              button_define_coordinates: 'Entrer soi-même les coordonnées',\r\n              text_no_coordinates_found: \"Aucune coordonnée relative aux données entrées n'a été trouvée.\",\r\n              text_coordinates_success_set: 'Coordonnées définies.',\r\n              button_set_custom_coordinates: 'Définir les coordonnées',\r\n              text_specify_coordinates_yourself: 'Les coordonnées peuvent être entrées soi-même en alternative.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Ajouter un nouveau site',\r\n            tabs: {\r\n              list: 'Halles',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Halle',\r\n            },\r\n            success: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'Le site a été créé avec succès.',\r\n            },\r\n            new_form_title: 'Nouveau site',\r\n            edit_form_title: 'Éditer le site',\r\n            new: {\r\n              fields: {\r\n                city: 'Ville',\r\n                name: 'Nom du site',\r\n                email: 'Courriel [en option]',\r\n                state: 'Land [en option]',\r\n                street: 'Adresse',\r\n                country: 'Pays',\r\n                website: 'Site Internet [en option]',\r\n                zipcode: 'Code postal',\r\n                language: 'Langue [en option]',\r\n                name_short: 'Nom du site (forme courte) [en option]',\r\n                description: 'Description [en option]',\r\n                customer_number: 'Numéro de client [en option]',\r\n                description_internal: 'Description (interne) [en option]',\r\n              },\r\n              error_messages: {\r\n                email: 'Veuillez saisir une adresse de courriel valide.',\r\n                city_not_specified: 'Veuillez saisir une ville.',\r\n                name_not_specified: 'Veuillez saisir un nom de site.',\r\n                street_not_specified: 'Veuillez saisir une adresse.',\r\n                country_not_specified: 'Veuillez saisir un pays.',\r\n                zipcode_not_specified: 'Veuillez saisir un code postal.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Réussi!',\r\n              button: 'Retour à la liste',\r\n              message: 'Le site a été actualisé avec succès.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Adresse',\r\n                country: 'Pays',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Lieu',\r\n              email: 'Courriel',\r\n              street: 'Adresse',\r\n              country: 'Pays',\r\n              website: 'Site Internet',\r\n              postalCode: 'Code postal',\r\n              companyName: 'Entreprise',\r\n            },\r\n            tabs: {\r\n              list: 'Entreprise',\r\n              worldmap: 'Carte du monde',\r\n            },\r\n            map: {\r\n              description_not_available: 'Aucune description disponible',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Ajouter',\r\n                back: 'Retour à la liste',\r\n                edit: 'Actualiser',\r\n                save: 'Enregistrer',\r\n                email: 'Envoyer l’image',\r\n                cancel: 'Annuler',\r\n                addMultiple: 'Ajouter + nouveau',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Éditer l’administration',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Assurance qualité',\r\n          users: 'Gestion des utilisateurs',\r\n          assets: 'Gestion des installations',\r\n          settings: 'Paramètres',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profil d’utilisateur',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'IPC',\r\n        },\r\n        sidebar: {\r\n          users: 'Gestion des utilisateurs',\r\n          assets: 'Gestion des installations',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profil d’utilisateur',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: 'Zone',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Ligne',\r\n          long: 'Long',\r\n          real: 'REAL',\r\n          true: 'Actif',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inactif',\r\n          float: 'Flottant',\r\n          uword: 'UWORD',\r\n          double: 'Double',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Booléen',\r\n          integer: 'Intégral',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Externe',\r\n          internal: 'Interne',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Un an',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Ajouter une nouvelle variable',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Un mois',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rectangle',\r\n          tabs: {\r\n            list: 'Liste des variables',\r\n          },\r\n          ten_years: 'Dix ans',\r\n          two_weeks: 'Deux semaines',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Six mois',\r\n          categorical: 'Catégorique',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Quelque chose n’a pas fonctionné correctement lors de la tentative d’édition de la variable. Veuillez faire une nouvelle tentative ultérieurement.',\r\n          },\r\n          new_form_title: 'Nouvelle variable',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Éditer la variable',\r\n          new: {\r\n            fields: {\r\n              hint: '(les changements pourraient briser la machine)',\r\n              showId: 'Affichage la variable champ de saisie Id',\r\n              maxTime: 'Temps max.',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Type de données',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Type de tableau',\r\n              namePrefix: 'Nom du préfixe',\r\n              variableId: 'ID de variable',\r\n              collections: '',\r\n              displayName: 'Nom de l’écran',\r\n              showInitial: 'Montrer l’initiale',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Visibilité',\r\n            },\r\n            buttons: {\r\n              delete: 'Supprimer la variable',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Veuillez sélectionner un temps max.',\r\n              dataType: 'Veuillez sélectionner un type de données',\r\n              chartType: 'Veuillez sélectionner un type de tableau',\r\n              namePrefix: 'Veuillez spécifier un nom de préfixe valide. (caractères valides : A-Z, _).',\r\n              variableId: 'Veuillez spécifier une UUID valide',\r\n              displayName: 'Veuillez spécifier un nom d’écran',\r\n              showInitial: 'Veuillez sélectionner une initiale',\r\n              namePrefixEdit: 'Veuillez spécifier un nom de préfixe valide. (caractères valides : A-Z, a-z, _).',\r\n              visibilityType: 'Veuillez sélectionner un type de visibilité',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'La variable a été créée avec succès',\r\n          },\r\n          editError: {\r\n            message: 'Quelque chose n’a pas fonctionné correctement lors de la tentative de mettre à jour la variable. Veuillez faire une nouvelle tentative ultérieurement.',\r\n          },\r\n          editSuccess: {\r\n            message: 'La variable a été mise à jour avec succès',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Téléchargements montants réussis',\r\n          downloads: 'Téléchargements réussis',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: \"Une erreur inattendue s'est produite. Veuillez tenter de recharger la page.\",\r\n            },\r\n            s_1: {\r\n              message: 'Les modifications ont été enregistrées.',\r\n            },\r\n            s_930: {\r\n              message: 'L’actif « %replaceValue » a été supprimé avec succès.',\r\n            },\r\n            s_931: {\r\n              message: 'La société « %replaceValue » a été supprimée avec succès.',\r\n            },\r\n            s_932: {\r\n              message: 'La ligne « %replaceValue » a été supprimée avec succès.',\r\n            },\r\n            s_933: {\r\n              message: 'Le hall « %replaceValue » a été supprimé avec succès.',\r\n            },\r\n            s_934: {\r\n              message: 'L’emplacement « %replaceValue » a été supprimé avec succès.',\r\n            },\r\n            s_935: {\r\n              message: \"Le fichier '%replaceValue' a été supprimé avec succès.\",\r\n            },\r\n            s_936: {\r\n              message: \"La variable '%replaceValue' a été supprimée avec succès.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Des cartes en doublon ont été supprimées !',\r\n            add_line_to_dashboard: 'La ligne a été ajoutée au Dashboard',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limites',\r\n            type: 'Sélectionnez en fonction du type',\r\n            alarms: 'Alarmes',\r\n            machine: 'Sélectionnez l’ID de machine',\r\n            variables: 'Variables',\r\n            listImport: 'Importer les limites',\r\n            listDownload: 'Télécharger les limites',\r\n          },\r\n          text: {\r\n            text: 'Les valeurs limites sont des valeurs que vous déterminez pour des variables qui vous intéressent. Si une variable ne repose pas au sein des valeurs limites définies, vous recevez une notification. Les valeurs limites sont affichées dans des diagrammes qui sont générées sur l’onglet « Séries temporelles ».',\r\n            title: 'Limites',\r\n          },\r\n          export: {\r\n            text: 'Vous pouvez exporter à tout moment les valeurs limites réglées actuellement pour toutes les variables existantes dans la plateforme Cloud. Vous pouvez utiliser cette liste comme référence ou pour importer toutes les valeurs limites en une seule fois au chapitre « Importer les valeurs limites comme CSV »',\r\n            title: 'Exporter les limites comme CSV',\r\n          },\r\n          import: {\r\n            text: 'Vous pouvez importer un fichier CSV téléchargé auparavant avec des informations relatives aux limites et abonnements afin d’actualiser les valeurs actuellement enregistrées. Vous pouvez choisir ultérieurement sur quels types d’installation ou de machine vous souhaitez appliquer les valeurs limites importées',\r\n            title: 'Importer les valeurs limites de la CSV',\r\n            machines: {\r\n              title: 'Sélectionner les machines ou le type de machine sur lequel(lesquelles) vous souhaitez appliquer les valeurs limites.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Sélectionnez le fichier CSV que vous souhaitez importer',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Aller à la ligne souhaitée dans la gestion des actifs.',\r\n            two: \"Vous trouverez un menu contextuel dans la ligne d'en-tête.\",\r\n            four: 'La vignette de la ligne est ajoutée au Dashboard.',\r\n            three: 'Cliquer sur le menu contextuel et sélectionner « Ajouter au Dashboard ».',\r\n            header: 'Ajout de vignettes de ligne',\r\n          },\r\n          individual: {\r\n            one: 'Cliquer sur le symbole de « pignon » du côté gauche.',\r\n            two: 'Sélectionnez le symbole « Plus ».',\r\n            four: 'Confirmer avec « Enregistrer ». La vignette individuelle est ajoutée au Dashboard.',\r\n            three: 'Nommer la vignette et ajouter la machine souhaitée.',\r\n            header: 'Ajout de vignettes individuelles',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Créer un nouvel utilisateur',\r\n          new: {\r\n            title: 'Créer un utilisateur',\r\n            status: 'Statut de l’utilisateur :',\r\n            buttons: {\r\n              add: 'Ajouter',\r\n              back: 'Retour à la liste',\r\n              save: 'Enregistrer',\r\n              cancel: 'Annuler',\r\n              delete: 'Supprimer un utilisateur',\r\n              sendMail: 'Renvoyer le courriel',\r\n            },\r\n            fields: {\r\n              email: 'Courriel',\r\n              roles: \"Groupe d'utilisateurs\",\r\n              gender: 'Genre',\r\n              created: 'Créé',\r\n              lastName: 'Nom',\r\n              firstName: 'Prénom',\r\n              breadcrumb: 'Afficher la navigation',\r\n              main_group: 'Groupe d’utilisateurs',\r\n              phoneNumber: 'Numéro de téléphone [en option]',\r\n              customer_org: 'Organisation du client',\r\n              last_modified: 'Dernière édition',\r\n              email_validation: 'Courriel (validation)',\r\n            },\r\n            statusText: {\r\n              unknown: 'inconnu',\r\n              archived: 'archivé',\r\n              confirmed: 'confirmé',\r\n              compromised: 'compromis',\r\n              unconfirmed: 'non confirmé',\r\n              reset_required: 'Réinitialisation nécessaire',\r\n              external_provider: 'Fournisseur externe',\r\n              force_change_password: 'Modification de mot de passe encore à effectuer',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'Les adresses de courriel ne coïncident pas.',\r\n              email_not_valid: 'Veuillez saisir une adresse de courriel valide.',\r\n              phone_not_specified: 'Veuillez saisir un numéro de téléphone valide qui commence par un + et qui est suivi de l’indicatif du pays !',\r\n              roles_not_specified: \"Veuillez sélectionner un groupe d'utilisateurs.\",\r\n              gender_not_specified: 'Veuillez saisir un genre.',\r\n              last_name_not_specified: 'Veuillez saisir un nom.',\r\n              first_name_not_specified: 'Veuillez saisir un prénom.',\r\n              main_group_not_specified: 'Veuillez sélectionner un groupe d’utilisateurs.',\r\n              family_name_not_specified: 'Veuillez saisir un nom.',\r\n              customer_organization_not_specified: 'Veuillez sélectionner une organisation de client.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Échoué !',\r\n          },\r\n          mail: {\r\n            success: \"Un courriel avec un mot de passe généré automatiquement a été envoyé à l'adresse de courriel indiquée.\",\r\n          },\r\n          update: {\r\n            title: 'Actualier un utilisateur',\r\n          },\r\n          success: {\r\n            title: 'Réussi!',\r\n            button: 'Retour à la liste',\r\n            message: \"L’utilisateur a été créé avec succès. Un courriel avec un mot de passe généré automatiquement a été envoyé à l'adresse de courriel indiquée.\",\r\n            message_for_edit: 'L’utilisateur a été actualisé avec succès.',\r\n            message_send_mail: \"Un courriel avec un mot de passe généré automatiquement a été envoyé à l'adresse de courriel indiquée.\",\r\n            button_back_to_last_page: 'Retour à la dernière page',\r\n          },\r\n          delete: {\r\n            success: \"Suppression de l'utilisateur réussie.\",\r\n            confirmation: {\r\n              title: 'Vraiment supprimer cet utilisateur ?',\r\n              confirm: 'Oui, supprimer cet utilisateur',\r\n              dismiss: 'Non, annuler',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Visiteur',\r\n            customer: 'Client',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Utilisateur',\r\n              email: 'Courriel',\r\n              company: 'Société',\r\n              enabled: 'Etat',\r\n              lastName: 'Nom',\r\n              sw_admin: 'SW admin',\r\n              firstName: 'Prénom',\r\n              userRights: 'Statut du droit',\r\n              phoneNumber: 'Numéro de téléphone',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'Masculin',\r\n              female: 'Féminin',\r\n              diverse: 'Divers',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarmes',\r\n            type: 'Sélectionnez en fonction du type',\r\n            machine: 'Sélectionnez l’ID de machine',\r\n            listImport: 'Importation d’alarmes',\r\n            listDownload: 'Téléchargements de fichier d’alarme',\r\n          },\r\n          text: {\r\n            text: 'Les notifications d’alarme peuvent être déterminées pour les numéros d’alarme qui vous intéressent. Si l’alarme réglée survient sur une machine définie, vous recevez une notification.',\r\n            title: 'Notifications d’alarme',\r\n          },\r\n          export: {\r\n            text: 'Vous pouvez exporter à tout moment les notifications d’alarme réglées actuellement de toutes les machines dans la CloudPlatform. Vous pouvez utiliser cette liste comme référence ou pour importer toutes les notifications d’alarme en une seule fois au chapitre « Importer les alarmes comme CSV ».',\r\n            title: 'Exporter les alarmes comme CSV',\r\n          },\r\n          import: {\r\n            text: 'Vous pouvez importer un fichier CSV téléchargé auparavant avec des informations relatives aux alarmes et abonnements afin d’actualiser les valeurs actuellement enregistrées. Vous pouvez choisir ultérieurement sur quels types d’installation ou de machine vous souhaitez appliquer les notifications d’alarme importées.',\r\n            title: 'Importer les alarmes de la CSV',\r\n            machines: {\r\n              title: 'Sélectionner les machines ou le type de machine sur lequel (lesquelles) vous souhaitez appliquer les notifications d’alarme.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Sélectionnez le fichier CSV que vous souhaitez importer',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Aucun résultat trouvé',\r\n          results: {\r\n            of: 'de',\r\n            lines: 'Lignes',\r\n            machines: 'Machines',\r\n          },\r\n          callToAction: 'Recherche de machines',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Échoué',\r\n            queued: 'Dans la file d’attente',\r\n            removed: 'Supprimé',\r\n            canceled: 'Annulé',\r\n            rejected: 'Refusé',\r\n            completed: 'Complété',\r\n            succeeded: 'Réussi',\r\n            timed_out: 'Dépassement du temps',\r\n            in_progress: 'En cours',\r\n            not_installed: 'Pas installé',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Démarrer l’importation',\r\n            dismiss: 'Annuler',\r\n            download: 'Démarrer le téléchargement',\r\n          },\r\n          tabs: {\r\n            limits: 'Limites',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Nom',\r\n              datatype: 'type de données',\r\n              chartType: 'Type de tableau',\r\n              displayName: 'Nom de l’écran',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Carte du monde',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shopfloor',\r\n          upload: {\r\n            text1: 'Envoyer une photo de l’implantation de votre atelier à lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'Si vos machines sont enregistrées et inscrites dans la SW-CloudPlatform, elles apparaîtront à gauche et enverront des données en temps réel.',\r\n            text3: 'Puis simplement glissez et déposez le statut sur votre plan sur la machine correcte.',\r\n            mainText: 'Dans cette vue, vous pouvez définir votre implantation d’atelier et voir vos machines à travers différentes couches d’informations. Il suffit de suivre ces étapes.',\r\n            tileTitle: 'Télécharger l’atelier',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Actif supprimé avec succès.',\r\n            confirmation: {\r\n              title: 'Vraiment supprimer « %replaceValue »?',\r\n              confirm: 'supprimer',\r\n              dismiss: 'annuler',\r\n              company: {\r\n                text: 'Si vous supprimez la société, tous les utilisateurs correspondants sont en outre supprimés.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer l’actif',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: \"Des changements du NamePrefix ou DataType sont susceptibles d'endommager la machine. Êtes-vous sûr de vouloir enregistrer ?\",\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Souhaitez-vous accepter les valeurs limites de ce nouveau type de machine ?',\r\n              title: 'Vous avez modifié le type de machine',\r\n              accept: 'Pio, accepter de nouvelles valeurs limites',\r\n              decline: 'Non, respecter les valeurs limites actuelles',\r\n              dismiss: 'Annuler',\r\n              info_accept: 'Pour remplacer les valeurs limites actuelles par les valeurs limites du nouveau type de machine, choisissez « Oui ».',\r\n              info_decline: 'Pour conserver les valeurs limites actuelles, choisissez « Non ».',\r\n              info_accept_warning: 'Toutes les valeurs limites actuelles sont remplacées ou supprimées.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer un fichier',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer le hall',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer la ligne',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Etat',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Heure machine',\r\n          controller_time: 'Heure du contrôleur',\r\n          iot_gateway_time: 'Heure IoT Gateway',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Aucune donnée présente',\r\n              loading: 'Chargement des données...',\r\n              months: [\r\n                'Janvier',\r\n                'Février',\r\n                'Mars',\r\n                'Avril',\r\n                'Mai',\r\n                'Juin',\r\n                'Juillet',\r\n                'Août',\r\n                'Septembre',\r\n                'Octobre',\r\n                'Novembre',\r\n                'Décembre',\r\n              ],\r\n              resetZoom: 'Réinitialiser le zoom',\r\n              weekdays: [\r\n                'Dimanche',\r\n                'Lundi',\r\n                'Mardi',\r\n                'Mercredi',\r\n                'Jeudi',\r\n                'Vendredi',\r\n                'Samedi',\r\n              ],\r\n              shortMonths: [\r\n                'Jan',\r\n                'Fév',\r\n                'Mar',\r\n                'Avr',\r\n                'Mai',\r\n                'Juin',\r\n                'Jui',\r\n                'Août',\r\n                'Sep',\r\n                'Oct',\r\n                'Nov',\r\n                'Déc',\r\n              ],\r\n              shortWeekdays: [\r\n                'Di',\r\n                'Lu',\r\n                'Ma',\r\n                'Me',\r\n                'Je',\r\n                'Ve',\r\n                'Sa',\r\n              ],\r\n              increaseDateRange: 'au moins jusqu’à',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Préréglages',\r\n            rangeTo: 'Jusqu’à',\r\n            selectDateRange: 'Veuillez sélectionner une période',\r\n            predefined: {\r\n              today: 'Aujourd’hui',\r\n              custom: 'Plage personnalisée',\r\n              last7days: '7 derniers jours',\r\n              yesterday: 'Hier',\r\n              last24Hours: '24 dernières heures',\r\n              last5Minutes: '5 dernières minutes',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Éditer la variable',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer la variable',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Sélectionner la langue',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer la société',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Supprimer l’emplacement',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Etat',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Configurer le tableau de bord',\r\n            hide: {\r\n              title: 'masquer',\r\n            },\r\n            show: {\r\n              title: 'afficher',\r\n            },\r\n            delete: {\r\n              title: 'supprimer',\r\n            },\r\n            add: {\r\n              fab_title: 'Ajouter sa propre vignette',\r\n            },\r\n            save: {\r\n              fab_title: 'Enregistrer la configuration',\r\n            },\r\n            move_left: {\r\n              title: 'Ramener à la position précédente',\r\n            },\r\n            move_right: {\r\n              title: 'Amener à la position suivante',\r\n            },\r\n            discard: {\r\n              fab_title: 'Rejeter la configuration',\r\n            },\r\n            add_custom_card: {\r\n              save: 'enregistrer',\r\n              input: 'Indiquer le nom de vignette',\r\n              title: 'Ajouter sa propre vignette',\r\n              cancel: 'annuler',\r\n              missingMachine: 'Vous devez sélectionner au moins une machine',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: \"Une erreur inattendue s'est produite. Veuillez tenter de recharger la page.\",\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational Error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Succès',\r\n            },\r\n            e_3xx: {\r\n              message: 'Transfert',\r\n            },\r\n            e_400: {\r\n              message: 'La demande était incorrecte et n’a pas pu être traitée.',\r\n            },\r\n            e_401: {\r\n              message: 'Vous n’êtes pas authentifié. Veuillez vous connecter de nouveau.',\r\n            },\r\n            e_403: {\r\n              message: \"Vous n'avez pas une autorisation suffisante pour accéder à la ressource requise.\",\r\n            },\r\n            e_404: {\r\n              message: \"La ressource demandée n'est pas disponible.\",\r\n            },\r\n            e_405: {\r\n              message: 'Méthode pas autorisée.',\r\n            },\r\n            e_406: {\r\n              message: 'Méthode non acceptable',\r\n            },\r\n            e_409: {\r\n              message: 'La ressource existe déjà.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Méthode contenu impossible à traiter',\r\n            },\r\n            e_4xx: {\r\n              message: 'Erreur client',\r\n            },\r\n            e_500: {\r\n              message: \"Une erreur de serveur interne s'est produite.\",\r\n            },\r\n            e_5xx: {\r\n              message: 'Erreur serveur',\r\n            },\r\n            e_900: {\r\n              message: 'La tentative de créer un actif a échoué. Veuillez effectuer une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_901: {\r\n              message: \"L'action a été interrompue. Aucun nouvel actif n’a été créé.\",\r\n            },\r\n            e_902: {\r\n              message: \"L'action a été interrompue. Aucune demande de service n’a été envoyée.\",\r\n            },\r\n            e_903: {\r\n              message: 'Un problème est survenu lors de la tentative d’envoyer une demande de service. Veuillez effectuer une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_904: {\r\n              message: \"L’actif '%replaceValue' a été créé avec succès. Vous pouvez maintenant ajouter d’autres actifs.\",\r\n            },\r\n            e_905: {\r\n              message: \"L'action a été interrompue. L’actif n’a pas été actualisé.\",\r\n            },\r\n            e_906: {\r\n              message: \"L’actif '%replaceValue' a été déplacé avec succès.\",\r\n            },\r\n            e_910: {\r\n              message: 'La tentative de créer un utilisateur a échoué. Veuillez effectuer une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_911: {\r\n              message: \"L'action a été interrompue. Aucun nouvel utilisateur n’a été créé.\",\r\n            },\r\n            e_912: {\r\n              message: 'La tentative d’actualiser un actif a échoué. Veuillez faire une nouvelle tentative.',\r\n            },\r\n            e_920: {\r\n              message: \"L'action a été interrompue. Aucune modification n’a été enregistré.\",\r\n            },\r\n            e_921: {\r\n              message: \"Une erreur inattendue s'est produite. Veuillez faire une tentative encore une fois.\",\r\n            },\r\n            e_922: {\r\n              message: \"Le nom d’utilisateur et/ou le mot de passe n'est pas correct. Veuillez faire une tentative encore une fois.\",\r\n            },\r\n            e_923: {\r\n              message: 'Veuillez saisir un nom d’utilisateur et un mot de passe.',\r\n            },\r\n            e_924: {\r\n              message: 'Votre session est terminée pour inactivité. Veuillez vous connecter de nouveau.',\r\n            },\r\n            e_925: {\r\n              message: 'Vous devez accepter notre déclaration de protection des données pour pouvoir utiliser la SW Claud Platform.',\r\n            },\r\n            e_926: {\r\n              message: 'Votre compte est temporairement verrouillé. Veuillez effectuer une nouvelle tentative dans quelques minutes.',\r\n            },\r\n            e_927: {\r\n              message: 'Votre mot de passe a été modifié avec succès.',\r\n            },\r\n            e_928: {\r\n              message: \"L'action a été interrompue. Aucun fichier n’a été téléchargé.\",\r\n            },\r\n            e_929: {\r\n              message: 'Un problème est survenu lors de la tentative de télécharger un fichier. Veuillez effectuer une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_930: {\r\n              message: 'Un problème est survenu lors de la tentative de supprimer un fichier. Veuillez effectuer une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_931: {\r\n              message: 'La plage de dates personnalisée est trop grande 24 h est le réglage par défaut',\r\n            },\r\n            e_932: {\r\n              message: 'L’actif a des éléments subordonnés. Supprimez tout d’abord les éléments subordonnés.',\r\n            },\r\n            e_933: {\r\n              message: \"La variable '%replaceValue' a été créée avec succès. Vous pouvez maintenant ajouter une autre variable.\",\r\n            },\r\n            e_934: {\r\n              message: 'Quelque chose n’a pas fonctionné correctement lors de la tentative de supprimer la variable. Veuillez faire une nouvelle tentative ultérieurement.',\r\n            },\r\n            e_10500: {\r\n              message: 'Il semble que vous n’êtes pas connecté à Internet. Veuillez assurer que vous êtes connecté.',\r\n            },\r\n            e_10501: {\r\n              message: \"Vous utilisez un navigateur qui n'est pas pris en charge. Veuillez utiliser un des navigateurs suivants: Google Chrome, Microsoft Edge, Apple Safari.\",\r\n            },\r\n            e_409_asset: {\r\n              message: 'L’actif (numéro de machine SW %replaceValue) existe déjà.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Ce nom de fichier %replaceValue existe déjà',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Il est possible de sélectionner seulement %s éléments simultanément',\r\n              title: 'Nombre max. atteint',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Heure filtre',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Aucun fichier disponible.',\r\n              file_cardTitle: 'Événements machine',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Télécharger des données',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'Fichiers de suivi CN',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Aucune alarme disponible',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'Fichiers de comparaison CN',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'Fichiers de données CN',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Aucun fichier disponible.',\r\n              file_cardTitle: 'Fichiers ToolMon',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Télécharger les données ToolMon',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Déclencheur',\r\n              column_title_filename: 'Nom du fichier',\r\n              column_title_creation_date: 'Date de création',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'Fichiers d’enregistreur de vol HMI',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  hu: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Kijelentkezés',\r\n        release: \"Ettől a dátumtól: '%replaceValue1' eddig a dátumig: '%replaceValue2' karbantartási munkákat végeznek a platformon. Ebben az időszakban platform részben nem lesz elérhető.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Becsukás',\r\n        acceptLabel: 'Elfogadás',\r\n        userProfile: 'Felhasználói profil',\r\n        button: {\r\n          clear: 'Diagram eltávolítása',\r\n          timeline: 'Határérték-igazítás',\r\n          separateCharts: 'Külön diagram',\r\n        },\r\n        declineLabel: 'Elutasítás',\r\n        backToDashboard: 'Vissza a dashboardra',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/agb/',\r\n            title: 'GTCT / szabványok',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Kapcsolat',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/impressum/',\r\n            title: 'Impresszum',\r\n          },\r\n          privacy: {\r\n            title: 'Privátszféra',\r\n            header: 'Adatvédelmi előírások',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'SW honlap',\r\n          },\r\n        },\r\n        noInternetConnection: 'Úgy tűnik, nincs csatlakozva az internetre. Csatlakozzon az internetre és próbálja meg újra.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'innen:',\r\n          noData: 'Nincsenek adatok',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'letöltve',\r\n          noDuration: 'nem áll rendelkezésre időtartam',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'A gép nincs licencezve.',\r\n          alarmPending: 'Beérkezett riasztás',\r\n          buttons: {\r\n            back: 'Vissza',\r\n            save: 'Mentés',\r\n            view: 'Kijelzés',\r\n            cancel: 'Elvetés',\r\n            custom: 'Az egyedi tartomány mentése + alkalmazása',\r\n            submit: 'Átvétel',\r\n            export: {\r\n              limit: 'Határértékek letöltése',\r\n              alarms: 'Riasztások letöltése',\r\n            },\r\n            import: {\r\n              limit: 'Start',\r\n              alarms: 'Start',\r\n            },\r\n            refreshReset: 'Visszaállítás standard időre',\r\n            selectAllCheckboxes: 'Mindet kiválaszt',\r\n            unselectAllCheckboxes: 'Kiválasztás visszavonása',\r\n          },\r\n          notAvailable: 'Nem áll rendelkezésre',\r\n          notConnected: 'Még nincs csatlakoztatva',\r\n          download: {\r\n            file: 'Fájl-letöltések',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'Nap',\r\n            days: 'Napok',\r\n            hour: 'Óra',\r\n            year: 'Év',\r\n            hours: 'Órák',\r\n            month: 'Hónap',\r\n            years: 'Évek',\r\n            minute: 'Perc',\r\n            months: 'Hónapok',\r\n            second: 'Másodperc',\r\n            minutes: 'Percek',\r\n            seconds: 'Másodpercek',\r\n          },\r\n          notAvailableShort: 'nincs adat',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Megértettem',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Ovo nećete moći povratiti!',\r\n        },\r\n        error: {\r\n          upload: 'Sikertelen feltöltések',\r\n          download: 'Sikertelen letöltések',\r\n          message: {\r\n            enrollment_code_409: 'Uređaj je već upisan u AWS.',\r\n            limit_change_failed: 'A határértékeket nem sikerült módosítani. Próbálja meg újra egy későbbi időpontban vagy írjon egy e-mailt a lifedata@sw-machines.com címre.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Időfelvételek',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Változók kiválasztása',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Dátum',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Biztonságos, részvételen alapuló hozzáférés',\r\n            directAccess: 'Közvetlen hozzáférés',\r\n            new: {\r\n              fields: {\r\n                id: 'ID megadása',\r\n                cOnePanel: 'C|One-nal',\r\n                sessionType: 'Szessziótípus',\r\n              },\r\n              error_messages: {\r\n                id: 'Kérem, adjon meg egy szesszió ID-t vagy készülék ID-t',\r\n                sessionType: 'Válasszon ki egy szessziótípust',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPI-k',\r\n              list: 'Gépek',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Új gyártósor hozzáadása',\r\n            grid: {\r\n              hall: 'Csarnok',\r\n              line: 'Gyártósor',\r\n              type: 'Típus',\r\n              contractEnd: 'A szerződés vége [opcionális]',\r\n              cellPosition: 'Cella / pozíció [opcionális]',\r\n              operationStep: 'Megmunkálási lépés',\r\n              machineIdentifierSw: 'Gépszám (SW)',\r\n              machineIdentifierCustomer: 'Gépnév',\r\n            },\r\n            success: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A gyártósort sikeresen létrehozta.',\r\n            },\r\n            new_form_title: 'Új gyártósor',\r\n            edit_form_title: 'A gyártósor szerkesztése',\r\n            new: {\r\n              fields: {\r\n                name: 'Gyártósor neve',\r\n                name_short: 'Gyártósor neve (rövid változat) [opcionális]',\r\n                description: 'Leírás [opcionális]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Kérem, adja meg a gyártósor nevét.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A gyártósort sikeresen frissítette.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Új csarnok hozzáadása',\r\n            grid: {\r\n              part: 'Alkatrésztípus',\r\n              lineName: 'Gyártósor',\r\n              typeOfLoading: 'Berakástípus',\r\n              lineResponsible: 'Gyártósor-felelős',\r\n              plannedQuantity: 'Tervezett mennyiség',\r\n              numberOfMachines: '# Gépek',\r\n            },\r\n            tabs: {\r\n              list: 'Gyártósorok',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A csarnokot sikeresen létrehozta.',\r\n            },\r\n            new_form_title: 'Új csarnok',\r\n            shopfloor: {\r\n              edit: 'Szerkesztőmód',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'A konfiguráció mentése',\r\n                },\r\n                discard: {\r\n                  fab_title: 'A konfiguráció elvetése',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'A csarnok szerkesztése',\r\n            new: {\r\n              fields: {\r\n                name: 'Csarnoknév',\r\n                name_short: 'Csarnoknév (rövid változat) [opcionális]',\r\n                description: 'Leírás [opcionális]',\r\n                description_external: 'Leírás (külső) [opcionális]',\r\n                description_internal: 'Leírás (belső) [opcionális]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Kérem, adjon meg egy csarnoknevet.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A csarnokot sikeresen frissítette.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Leírás [opcionális]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Új megmunkáló eszköz létrehozása',\r\n            tabs: {\r\n              info: 'Idősor',\r\n              alarms: 'Riasztás',\r\n              events: 'Géppel kapcsolatos események',\r\n              gateway: 'Gateway',\r\n              service: 'Szerviz',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Gyártósor elérhetőség',\r\n              'axis-test': 'Tengelyteszt',\r\n              collection: 'Gyűjtemények',\r\n              technology: 'Technológia',\r\n              maintenance: 'Karbantartás',\r\n              performance: 'Teljesítmény',\r\n              spindledata: 'Orsóadatok',\r\n              remoteaccess: 'Távelérés',\r\n              enduranceTest: 'Sorvégteszt',\r\n              administration: 'Administracija',\r\n              y_title: {\r\n                status: 'Státusz',\r\n                status_table_one: '1. asztal',\r\n                status_table_two: '2. asztal',\r\n              },\r\n              energymonitoring: 'Energiamonitoring',\r\n              technology_undefined: 'nem értelmezett',\r\n              technology_undefined_condition: 'Nem értelmezett státusz!',\r\n            },\r\n            move: {\r\n              message: \"A '%replaceValue' megmunkáló eszközt egy új vállalathoz, telephelyre, csarnokba és/vagy gyártósorba lehet költöztetni.\",\r\n              select_hall_label: 'Új csarnok kiválasztása',\r\n              select_line_label: 'Új gyártósor kiválasztása',\r\n              select_company_label: 'Új vállalat kiválasztása',\r\n              select_location_label: 'Új telephely kiválasztása',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Gépszám (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Szállítás [opcionális]',\r\n                shipping: 'Elküldés [opcionális]',\r\n                controller: 'Vezérlés',\r\n                machine_type: 'Gép típus',\r\n                warranty_end: 'Garancia vége [opcionális]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Upravitelj sustava',\r\n                warranty_start: 'Garancia kezdete [opcionális]',\r\n                machine_swmp_api: 'Gép SWCP API vége [opció]',\r\n                machine_swsp_trace: 'Gép SWCP Trace vége [opció]',\r\n                machine_swcp_portal: 'Gép SWCP Portal vége [opció]',\r\n                start_of_production: 'A gyártás kezdete [opcionális]',\r\n                machine_swcp_support: 'Gép SWCP Support vége [opció]',\r\n                machine_cell_position: 'Gép cella / pozíció',\r\n                machine_swsp_line_mon: 'Gép SWCP LineMon vége [opció]',\r\n                machine_identifier_customer: 'Gép ID (ügyfél)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Kérem adjon meg egy érvényes SW-gépszámot (min, 7 karakter: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Kérem, válasszon ki egy vezérlést.',\r\n                machine_type_not_specified: 'Kérem, válasszon ki egy géptípust.',\r\n                machine_identifier_customer_not_specified: 'Kérem, adjon meg egy gép ID-t.',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A megmunkáló eszközt sikeresen létrehozta.',\r\n            },\r\n            new_form_title: 'Megmunkáló eszköz hozzáadása',\r\n            edit_form_title: 'A megmunkáló eszköz szerkesztése',\r\n            move_form_title: 'A megmunkáló eszköz eltolása',\r\n            editSuccess: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A megmunkáló eszközt sikeresen aktualizálta.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Elküldés dátuma',\r\n                controller: 'Vezérlés',\r\n                contractEnd: 'A megrendelés vége',\r\n                machineType: 'Gép típus',\r\n                startupDate: 'Az üzembevétel dátuma',\r\n                warrantyEnd: 'A szavatosság vége',\r\n                cellPosition: 'Cella / pozíció',\r\n                warrantyStart: 'A szavatosság kezdete',\r\n                customerNumber: 'Ügyfélszám',\r\n                enrollmentConfig: 'Enrollment-konfiguráció',\r\n                startOfProduction: 'A gyártás kezdete',\r\n                machineIdentifierSw: 'Gépszám SW',\r\n                enrollmentConfigDownload: 'Letöltés',\r\n                machineIdentifierCustomer: 'Az ügyfél gépszáma',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Csere',\r\n              g_mode: 'G-funkció',\r\n              off_time: 'Mellékidő',\r\n              no_change: 'Nincs csere',\r\n              undefined: 'Nem értelmezett',\r\n              active_tool: 'Aktív szerszám',\r\n              tool_change: 'Szerszám csere',\r\n              machining_time: 'Főidő',\r\n              tool_change_time: 'Szerszámcsere-idő',\r\n              pie: {\r\n                chart: {\r\n                  name_one: '1. asztal folyamatidő',\r\n                  name_two: '2. asztal folyamatidő',\r\n                  name_one_undefined: '1. asztal nem értelmezett folyamatidő',\r\n                  name_two_undefined: '2. asztal nem értelmezett folyamatidő',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q tengely és orsó',\r\n              undefined_gmode_data: 'Nincsenek adatok a G-funkció számára',\r\n              auxiliary_process_time: 'Plusz folyamatidő',\r\n              undefined_activetool_data: 'Nincsenek adatok az aktív szerszám számára',\r\n              undefined_tool_change_data: 'Nincsenek adatok a szerszám cseréje számára',\r\n              undefined_machining_time_table_one: '1. asztal nem értelmezett állapot',\r\n              undefined_machining_time_table_two: '2. asztal nem értelmezett állapot',\r\n              machining_auxiliary_tool_changing_table_one: '1. asztal fő-, szerszámcsere-, és mellékidő',\r\n              machining_auxiliary_tool_changing_table_two: '2. asztal fő-, szerszámcsere-, és mellékidő',\r\n            },\r\n            add_line_to_dashboard: 'Gyártósor hozzáadása a dashboardhoz',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Egység',\r\n                value: 'Érték',\r\n                kpiUnit: 'Egység',\r\n                headline: 'Tengelyteszt',\r\n                kpiValue: 'Érték',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Betöltés a böngésző tárából',\r\n                limitsSave: 'A böngésző tárába elmenteni',\r\n                selectAxis: 'Tengely kiválasztása',\r\n                limitsExport: 'A határértékek ezportálása a vágólapba',\r\n                openAxistest: 'Tengelyteszt megnyitása',\r\n                axisTestPlural: 'Tengelyteszt',\r\n                adjustments: {\r\n                  add: 'helyi kiigazítás hozzáadása',\r\n                  range: 'Hatósugár',\r\n                  header: 'Helyi kiigazítás',\r\n                  remove: 'Eltávolítás',\r\n                  position: 'Pozíció',\r\n                  amplitude: 'Amplitúdó',\r\n                  spreadMultiplier: 'Határérték-multiplikátor',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Pozíció',\r\n                    y: 'Áram',\r\n                    up: 'fel',\r\n                    down: 'le',\r\n                    limitsUp: 'a pozitív irányt határolja',\r\n                    limitsDown: 'a negatív irányt határolja',\r\n                    sliderSlopeCenter: 'Növekedési eredet',\r\n                    sliderSlopeFactor: 'Meredekségi tényező',\r\n                    sliderVerticalOffset: 'Y-eltolás',\r\n                    sliderVerticalSpread: 'Szélesség határolása',\r\n                    sliderQuadraticCenter: 'Négyzetes eredet',\r\n                    sliderQuadraticFactor: 'Négyzetes tényező',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Óramutató járásával megegyező irány',\r\n                    limitsClockwise: 'Határ az óramutató járásával megegyező irányban',\r\n                    counterClockwise: 'Óramutató járásával ellentétes irány',\r\n                    sliderSineOffset: 'Hullámeltolás',\r\n                    sliderSineAmplitude: 'Hullám-amplitúdó',\r\n                    sliderSineFrequency: 'Hullámfrekvencia',\r\n                    sliderVerticalOffset: 'Y-eltolás',\r\n                    sliderVerticalSpread: 'Szélesség határolása',\r\n                    limitsCounterClockwise: 'Határ az óramutató járásával ellentétes irányban',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Sebesség',\r\n                  pulseMaxRampUp: 'Rámpa ->',\r\n                  pulseMaxRampDown: 'Rámpa <-',\r\n                  pulseMaxStiffness: 'Maximális merevség',\r\n                  pulseMinStiffness: 'Minimális merevség',\r\n                  pulseMeanStiffness: 'Merevség Ø',\r\n                  circularReversalRange: 'Körkörös játék',\r\n                  pulseMaxUpPathCurrent: 'Maximális áram ->',\r\n                  pulseMinUpPathCurrent: 'Minimális áram ->',\r\n                  pulseMeanUpPathCurrent: 'Áram Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Maximális áram <-',\r\n                  pulseMinDownPathCurrent: 'Minimális áram <-',\r\n                  pulseMeanDownPathCurrent: 'Áram Ø <-',\r\n                  circularShapeDeviationClockwise: 'Körformától való eltérés jobbra',\r\n                  pulseStiffnessStandardDeviation: 'Merevség σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Áram σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Áram σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Körformától való eltérés balra',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Köralak-teszt',\r\n                  EQUABILITY: 'Egyenes futás teszt',\r\n                  CIRCULARITY: 'Köralak-teszt',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Ilyen típusú tengelyteszt nem áll rendelkezésre',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'Hiba esetén forduljon',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Kérjük, hogy a Netcfg-űrlap segítségével bocsássa a rendelkezésünkre az adatokat.',\r\n                  intro: 'Ahhoz, hogy a gépet be lehessen csatlakoztatni, az ön hálózati konfigurációjának adataira vagyunk utalva.',\r\n                  title: 'Hálózati konfiguráció',\r\n                  goToNetconfig: 'Nyissa meg a hálózati konfigurációt',\r\n                },\r\n                device: {\r\n                  title: 'Készülékrészletek',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Ha az IoT Gateway így néz ki, végezze el a következő lépéseket:',\r\n                  line1: 'A csempe alsó peremén levő gombra kattintva töltse le a Enrollment-fájlt.',\r\n                  line2: 'A letöltés automatikusan elindul.',\r\n                  line3: 'A .json-fájlt mentse egy USB pendrive gyökérkönyvtárába. Ellenőrizze le, hogy a fájl a következő módon van-e elnevezve:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Ellenőrizze le, hogy a következő fájlok az USB pendrive gyökérkönyvtárában vannak-e:',\r\n                  line6: 'Csatlakoztassa az USB pendrive-ot a megfelelő IoT-gateway-hoz.',\r\n                  line7: 'A betanítás automatikusan elkezdődik, ezt egy villogó zöld felhasználói LED jelzi.',\r\n                  line8: 'A sikeres bejelentkezés után a zöld LED addig világít, míg az USB pendrive-ot el nem távolítják.',\r\n                  title: 'Enrollment',\r\n                  button: 'Enrollment-fájl',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Töltse le a „migrate-iot.zip“ fájlt és csomagolja ki egy üres USB pendrive-ra.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Töltse le még a következőt is: ',\r\n                  line4: ' majd adja az USB-pendrive-hoz. Ellenőrizze le, hogy a fájl a következő módon van-e elnevezve:',\r\n                  line5: 'Ellenőrizze le, hogy a következő fájlok az USB pendrive gyökérkönyvtárában vannak-e:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Platform-migráció',\r\n                  line10: 'Csatlakoztassa az USB pendrive-ot a megfelelő IoT-gateway-hoz.',\r\n                  line11: 'A szoft telepítése automatikusan megtörténik, ezt egy villogó sárga LED jelzi.',\r\n                  line12: 'A sikeres migráció után a zöld LED addig világít, míg az USB-pendrive-ot el nem távolítják.',\r\n                  line13: 'A sikeres migráció után a zöld LED addig világít, míg az USB-pendrive-ot el nem távolítják.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generálás',\r\n                headline: 'Idősor',\r\n                noChartMessage: 'A kívánt adatok kijelzéséhez válasszon ki egy vagy több változót és kattintson a generálásra',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Riasztás',\r\n              },\r\n              service: {\r\n                contact: 'Vegye fel a kapcsolatot',\r\n                headline: 'Szerviz',\r\n                update: {\r\n                  title: 'Fájl frissítése',\r\n                },\r\n                upload: {\r\n                  title: 'Fájl feltöltése',\r\n                  fields: {\r\n                    file: 'Fájl',\r\n                    language: 'Fájl nyelve',\r\n                    file_name: 'Fájlnév',\r\n                    list_of_languages: {\r\n                      cz: 'Cseh',\r\n                      de: 'Német',\r\n                      en: 'Angol',\r\n                      es: 'Spanyol',\r\n                      fr: 'Francia',\r\n                      hu: 'Magyar',\r\n                      it: 'Olasz',\r\n                      ko: 'Koreai',\r\n                      pl: 'Lengyel',\r\n                      tr: 'Török',\r\n                      zh: 'Kínai',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Feltöltés',\r\n                    cancel: 'Elvetés',\r\n                  },\r\n                  success: {\r\n                    title: 'Sikeres',\r\n                    button: 'Vissza a szerviz-áttekintéshez',\r\n                    message: 'A fájlot sikeresen feltöltötte',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Kérem, adjon meg egy fájlnevet.',\r\n                    file_not_valid: 'Kérem adjon meg egy fájlot / válasszon ki egy kisebb fájlot.',\r\n                    language_not_specified: 'Kérem, adja meg a fájl nyelvét.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Kézikönyvek',\r\n                },\r\n                version: {\r\n                  title: 'datoteke verzije',\r\n                },\r\n                contracts: {\r\n                  title: 'Szerződések',\r\n                },\r\n                components: {\r\n                  title: 'Hard- és szoftver alkotóelemek',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Alkatrészlista',\r\n                },\r\n                consumeables: {\r\n                  title: 'Üzemanyagok',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Frissítés',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Ahhoz, hogy egy gépet aktiváljon a távhozzáféréshez, a TeamViewernek telepítve kell lennie a IoT-Gateway-en. ',\r\n                  line2: 'Ha ez nem így van, a TeamViewer telepítéséhez egyszerűen kattintson a „Telepítésre”.',\r\n                  title: 'Telepítse a távhozzáférést',\r\n                  status: 'Deployment status',\r\n                  copy: {\r\n                    button: 'Hivatkozás másolása',\r\n                  },\r\n                  install: {\r\n                    button: 'Telepítse a TeamViewert',\r\n                  },\r\n                  session: {\r\n                    button: 'Szesszió indítása',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'IoT Gateway szoftver',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Operációs rendszer',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Segítségre van szüksége a géppel kapcsolatban?',\r\n                  line2: 'Vegye fel velünk a kapcsolatot!',\r\n                  title: 'Üzenet az SW-szerviznek',\r\n                  button: 'Kapcsolatfelvétel a szervizzel',\r\n                  fields: {\r\n                    name: 'Gépszám (SW)',\r\n                    type: 'Kéréstípus',\r\n                    email: 'E-mail',\r\n                    message: 'Üzenet',\r\n                    phone_no: 'Telefonszám',\r\n                    last_name: 'Családnév',\r\n                    first_name: 'Utónév',\r\n                    contact_person: 'Kapcsolattartó (SW) [opcionális]',\r\n                    list_of_types: {\r\n                      request: 'Általános kérés',\r\n                      service: 'Szerviz',\r\n                      retrofit: 'Utólagos felszerelés',\r\n                      expansion: 'Bővítés',\r\n                      inspection: 'Inspekció',\r\n                    },\r\n                    machine_identifier_customer: 'Gép-ID (ügyfél) [opció]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Kérés küldése',\r\n                    cancel: 'Elvetés',\r\n                  },\r\n                  success: {\r\n                    title: 'Sikeres!',\r\n                    button: 'Vissza a szerviz-áttekintéshez',\r\n                    message: 'A kérést sikeresen elküldte az SW-szerviznek.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Kérem, adjon meg egy érvényes e-mail-címet.',\r\n                    name_not_specified: 'Kérem adjon meg egy érvényes SW-gépszámot (min. 7 karakter: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Kérem, adjon meg egy érvényes telefonszámot.',\r\n                    message_not_specified: 'Kérem, adjon meg egy hírt.',\r\n                    last_name_not_specified: 'Kérem, adja meg a családnevét.',\r\n                    first_name_not_specified: 'Kérem, adja meg az utónevét.',\r\n                    family_name_not_specified: 'Kérem, adja meg a családnevét.',\r\n                    contact_type_not_specified: 'Kérem, adja meg a kérés típusát.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Gép szoftver',\r\n                  values: {\r\n                    nc_version: 'NC-verzió',\r\n                    hmi_version: 'HMI-verzió',\r\n                    plc_version: 'PLC-verzió',\r\n                    compile_cycles: 'Compile-ciklusok',\r\n                    operating_system: 'Operációs rendszer',\r\n                    pcu_base_version: 'PCU-Base-verzió',\r\n                    plc_toolbox_version: 'PLC-Toolbox',\r\n                    plc_user_program_version: 'PLC-felhasználói program',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'A fájl nevét sikeren megváltoztatta',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Távszupport',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'A kezelési asszisztens segít a problémamegoldásban.',\r\n                  title: 'Kezelési asszisztens',\r\n                  sub_title: 'Nehézségei vannak valamelyik megmunkáló eszközzel?',\r\n                  open_assistant: 'Nyissa meg a kezelési asszisztenst',\r\n                  request_account: 'Kérje a kontóját',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'SpiStat orsóstatisztika',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'be',\r\n                labelOffline: 'ki',\r\n              },\r\n              swimlane: {\r\n                headline: 'Gyártósor elérhetőség',\r\n              },\r\n              endurance: {\r\n                headline: 'Sorvégteszt',\r\n                chartTitles: {\r\n                  runtime: 'Működési idő adatok',\r\n                  endurance: 'Sorvégteszt',\r\n                  operation: 'Üzemmód',\r\n                  qaxis_180: 'Q-tengely 180°',\r\n                  nc_program: 'NC-program',\r\n                  stacklights: '3 hívófény',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Küldés státusza',\r\n                aborted: 'elvetve',\r\n                sending: 'küld',\r\n                undefined: 'nem értelmezett',\r\n                interrupted: 'megszakítva',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Riasztási térkép',\r\n              },\r\n              collection: {\r\n                headline: 'Gyűjtemény',\r\n                noChartMessage: 'A bal oldalon válasszon ki egy kollekciót.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Összeg',\r\n                  header: 'Elérhetőség Kpi',\r\n                  target: 'Névleges',\r\n                },\r\n                alarms: {\r\n                  title: 'Riasztás',\r\n                  category: [\r\n                    'Nincs osztályozva',\r\n                    'Hibajelentés',\r\n                    'Üzemi jelentés',\r\n                    'Állapotjelentés',\r\n                    'Üzemeltetési utasítás',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Fennállás időtartama',\r\n                    flatlist: 'Egyszerű lista',\r\n                    frequency: 'Előfordulási gyakoriság',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Idő',\r\n                    trend: 'Trend',\r\n                    duration: 'Fennállás időtartama',\r\n                    leftTime: 'A riasztás működik',\r\n                    alarmCount: 'Darabszám',\r\n                    alarmNumber: 'Riasztás-sz.',\r\n                    description: 'Leírás',\r\n                    alarmOccured: 'Riasztás lépett fel',\r\n                    alarmClassification: 'Riasztások osztályozása',\r\n                    alarmCountSecondRange: 'Darabszám T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'növekvő',\r\n                      down: 'csökkenő',\r\n                      flat: 'egyenletes',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Részletek',\r\n                  ncProgram: 'NC-program',\r\n                  lastModified: 'Utolsó értékfeljegyzés',\r\n                  machineState: 'Gép állapota',\r\n                  numberAlarms: 'Függőben lévő riasztás',\r\n                  stopCondition: 'Leállási feltételek',\r\n                  ncProgramState: 'NC-program státusza',\r\n                  protectionLevel: 'Védelmi fokozat',\r\n                  ncProgramStates: [\r\n                    'elvetve',\r\n                    'leállítva',\r\n                    'fut',\r\n                    'várakozik',\r\n                    'megszakítva',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Rendszer',\r\n                    'Gyártó',\r\n                    'Szerviz',\r\n                    'Felhasználó',\r\n                    'Kulcsos kapcsoló 3. állás',\r\n                    'Kulcsos kapcsoló 2. állás',\r\n                    'Kulcsos kapcsoló 1. állás',\r\n                    'Kulcsos kapcsoló 0. állás',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Ciklusidő',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Ciklusidő másodpercben',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'NOK.',\r\n                  sum: 'Összeg',\r\n                  title: 'Munkadarab-számláló',\r\n                  titleDayCounter: 'Napi mennyiség számláló',\r\n                  titleShiftCounter: 'Mennyiség számláló egy műszakban',\r\n                  titleTotalCounter: 'Összmennyiség számláló',\r\n                  titleTotalCounterSmall: 'Összesen',\r\n                },\r\n                availability: {\r\n                  title: 'Elérhetőség',\r\n                  kpi: {\r\n                    title: 'Elérhetőség KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG hibával',\r\n                    MDA_with_error: 'MDA hibával',\r\n                    JOG_without_error: 'JOG hiba nélkül',\r\n                    MDA_without_error: 'MDA hiba nélkül',\r\n                    not_defined_condition: 'Nem értelmezett állapot',\r\n                    auto_no_program_active: 'AUTO nincs aktív program',\r\n                    auto_waiting_for_parts: 'AUTO alkatrészre várakozás',\r\n                    auto_with_error_program_stopped: 'AUTO hibával - program leállítva',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO alkatrészre várakozás + stophiba',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Aggregált elérhetőség',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Elérhetőség',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Státusz',\r\n                },\r\n                operationMode: {\r\n                  title: 'Üzemmód',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Üzemmód',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Működési idő monitor',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'be',\r\n                        off: 'ki',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Orsó override',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Előtolás override',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administracija',\r\n                headline: 'Administracija',\r\n                aws: {\r\n                  title: 'AWS veze',\r\n                },\r\n                groups: {\r\n                  title: 'Eszközcsoportok',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Upravitelj sustava',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Darabjegyzék',\r\n                },\r\n                component: {\r\n                  title: 'Alkotóelemek',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Karbantartás',\r\n              },\r\n              spindleData: {\r\n                headline: 'Orsóadatok',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Távelérés',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Riasztás előtti idő (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Riasztás utáni idő (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Energiamonitoring',\r\n                chartTitles: {\r\n                  air: 'Sűrítettlevegő-fogyasztás',\r\n                  current: 'Áramfogyasztás',\r\n                  consumption: 'Prosječna potrošnja po satu',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Állapotfelügyelet',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Új vállalat hozzáadása',\r\n            grid: {\r\n              city: 'Hely',\r\n              email: 'E-mail',\r\n              street: 'Cím',\r\n              country: 'Ország',\r\n              website: 'Honlap',\r\n              postalCode: 'Postai irányítószám',\r\n              locationName: 'Telephely',\r\n              locationCustomerNumber: 'Ügyfélszám',\r\n            },\r\n            tabs: {\r\n              list: 'Telephelyek',\r\n              worldmap: 'Világtérkép',\r\n            },\r\n            success: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A vállalatot sikeresen létrehozta.',\r\n            },\r\n            toggle_switch: 'Egy telephely létrehozása ugyanazokkal az adatokkal',\r\n            new_form_title: 'Új vállalat',\r\n            edit_form_title: 'A vállalat szerkesztése',\r\n            new: {\r\n              fields: {\r\n                city: 'Város',\r\n                name: 'A vállalat neve',\r\n                email: 'E-mail [opcionális]',\r\n                state: 'Szövetségi tartomány [opcionális]',\r\n                street: 'Cím',\r\n                country: 'Ország',\r\n                website: 'Honlap [opcionális]',\r\n                zipcode: 'Postai irányítószám',\r\n                legal_form: 'Jogi forma [opcionális]',\r\n                name_short: 'A vállalat neve (röviden) [opcionális]',\r\n                description: 'Leírás [opcionális]',\r\n                company_logo: 'Vállalat emblémája (URL) [opcionális]',\r\n                customer_number: 'Ügyfélszám',\r\n                industry_sector: 'Iparág',\r\n                description_external: 'Leírás (külső) [opcionális]',\r\n                description_internal: 'Leírás (belső) [opcionális]',\r\n              },\r\n              error_messages: {\r\n                url: 'Kérem, adjon meg egy érvényes URL-et.',\r\n                email: 'Kérem, adjon meg egy érvényes e-mail-címet.',\r\n                city_not_specified: 'Kérem, adja meg a várost.',\r\n                name_not_specified: 'Kérem, adja meg a cégnevet.',\r\n                street_not_specified: 'Kérem, adja meg a postai címét.',\r\n                country_not_specified: 'Kérem, adja meg az országot.',\r\n                zipcode_not_specified: 'Kérem, adja meg a postai irányítószámot.',\r\n                customer_number_not_specified: 'Kérem, adja meg a ügyfélszámot.',\r\n                industry_sector_not_specified: 'Kérem, adjon meg egy iparágat.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A vállalatot sikeresen aktualizálta.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Cím',\r\n                country: 'Ország',\r\n                website: 'Honlap',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'Az SW CloudPlatform egy térképen ábrázolja ezt a vállalatot és ehhez hosszúsági és szélességi fokokat használ.',\r\n              intro_heading: 'Helyre vonatkozó információk',\r\n              location_name: 'A helység neve:',\r\n              label_latitude: 'Szélességi fok',\r\n              label_longitude: 'Hosszúsági fok',\r\n              text_fallback_info: 'Ha nem, standard koordinátákat fog használni.',\r\n              text_location_found: 'Megtalálta helyet.',\r\n              text_location_entered: 'A helyet megadta.',\r\n              text_success_location: 'A következő adatokat állították be:',\r\n              button_define_coordinates: 'A koordináták kézi megadása',\r\n              text_no_coordinates_found: 'A megadott adatokhoz nem talált koordinátákat.',\r\n              text_coordinates_success_set: 'A koordináták be vannak állítva.',\r\n              button_set_custom_coordinates: 'A koordináták beállítása',\r\n              text_specify_coordinates_yourself: 'Alternatív megoldásként beírhatja kézzel a koordinátákat.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Új telephely hozzáadása',\r\n            tabs: {\r\n              list: 'Csarnokok',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Csarnok',\r\n            },\r\n            success: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A telephelyt sikeresen létrehozta.',\r\n            },\r\n            new_form_title: 'Új telephely',\r\n            edit_form_title: 'A telephely szerkesztése',\r\n            new: {\r\n              fields: {\r\n                city: 'Város',\r\n                name: 'Telephely neve',\r\n                email: 'E-mail [opcionális]',\r\n                state: 'Szövetségi tartomány [opcionális]',\r\n                street: 'Cím',\r\n                country: 'Ország',\r\n                website: 'Honlap [opcionális]',\r\n                zipcode: 'Postai irányítószám',\r\n                language: 'Nyelv [opcionális]',\r\n                name_short: 'Telephely neve (rövid változat) [opcionális]',\r\n                description: 'Leírás [opcionális]',\r\n                customer_number: 'Ügyfélszám [opcionális]',\r\n                description_internal: 'Leírás (belső) [opcionális]',\r\n              },\r\n              error_messages: {\r\n                email: 'Kérem, adjon meg egy érvényes e-mail-címet.',\r\n                city_not_specified: 'Kérem, adja meg a várost.',\r\n                name_not_specified: 'Kérem, adja meg a telephely nevét.',\r\n                street_not_specified: 'Kérem, adja meg a postai címét.',\r\n                country_not_specified: 'Kérem, adja meg az országot.',\r\n                zipcode_not_specified: 'Kérem, adja meg a postai irányítószámot.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Sikeres!',\r\n              button: 'Vissza a listához',\r\n              message: 'A telephelyt sikeresen frissítette.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Cím',\r\n                country: 'Ország',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Hely',\r\n              email: 'E-mail',\r\n              street: 'Cím',\r\n              country: 'Ország',\r\n              website: 'Honlap',\r\n              postalCode: 'Postai irányítószám',\r\n              companyName: 'Vállalat',\r\n            },\r\n            tabs: {\r\n              list: 'Vállalat',\r\n              worldmap: 'Világtérkép',\r\n            },\r\n            map: {\r\n              description_not_available: 'Nincs leírás',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Hozzáadás',\r\n                back: 'Vissza a listához',\r\n                edit: 'Frissítés',\r\n                save: 'Mentés',\r\n                email: 'Pošalji sliku',\r\n                cancel: 'Elvetés',\r\n                addMultiple: 'Hozzáadás + új',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Uredi administraciju',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Minőségbiztosítás',\r\n          users: 'Felhasználók kezelése',\r\n          assets: 'Megmunkáló eszköz kezelése',\r\n          settings: 'Beállítások',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Felhasználói profil',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Felhasználók kezelése',\r\n          assets: 'Megmunkáló eszköz kezelése',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Felhasználói profil',\r\n        },\r\n        variables: {\r\n          bar: 'Oszlop',\r\n          plc: 'PLC',\r\n          area: 'Terület',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Vonal',\r\n          long: 'Hosszú egész',\r\n          real: 'REAL',\r\n          true: 'Aktív',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Inaktív',\r\n          float: 'Lebegőpontos',\r\n          uword: 'UWORD',\r\n          double: 'Dupla pontosságú',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Logikai',\r\n          integer: 'Egész',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Külső',\r\n          internal: 'Belső',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Egy év',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Új változó hozzáadása',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Egy hónap',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Téglalap',\r\n          tabs: {\r\n            list: 'Változók listája',\r\n          },\r\n          ten_years: 'Tíz év',\r\n          two_weeks: 'Két hét',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Hat hónap',\r\n          categorical: 'Kategóriás',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Valami gond merült fel a változó létrehozása közben. Próbálja meg később.',\r\n          },\r\n          new_form_title: 'Új változó',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Változó szerkesztése',\r\n          new: {\r\n            fields: {\r\n              hint: '(A módosítások meghibásodást okozhatnak a gépen)',\r\n              showId: 'Változó azonosító beviteli mező megjelenítése',\r\n              maxTime: 'Max.idő',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Adattípus',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Diagramtípus',\r\n              namePrefix: 'Név prefix',\r\n              variableId: 'Változó azonosítója',\r\n              collections: '',\r\n              displayName: 'Megjelenített név',\r\n              showInitial: 'Kezdőbetű megjelenítése',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Láthatóság',\r\n            },\r\n            buttons: {\r\n              delete: 'Változó törlése',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Válasszon maximális időt',\r\n              dataType: 'Válasszon adattípust',\r\n              chartType: 'Válasszon diagramtípust',\r\n              namePrefix: 'Adjon meg egy érvényes prefix nevet. (érvényes karakterek: A-Z, _).',\r\n              variableId: 'Adjon meg egy érvényes UUID-t (egyedi azonosító)',\r\n              displayName: 'Adjon meg egy megjelenített nevet',\r\n              showInitial: 'Válasszon egy kezdőbetűt',\r\n              namePrefixEdit: 'Adjon meg egy érvényes prefix nevet. (érvényes karakterek: A-Z a-z, _).',\r\n              visibilityType: 'Válasszon egy láthatósági típust',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'A változót sikeresen létrehozta',\r\n          },\r\n          editError: {\r\n            message: 'Valami gond merült fel a változó frissítése közben. Próbálja meg később.',\r\n          },\r\n          editSuccess: {\r\n            message: 'A változó frissítése sikeresen megtörtént',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Sikeres feltöltések',\r\n          downloads: 'Sikeres letöltések',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Egy váratlan hiba lépett fel. Próbálja meg az oldalt újra betölteni.',\r\n            },\r\n            s_1: {\r\n              message: 'A módosításokat elmenti.',\r\n            },\r\n            s_930: {\r\n              message: \"Sredstvo '%replaceValue' uspješno je izbrisano.\",\r\n            },\r\n            s_931: {\r\n              message: \"Tvrtka '%replaceValue' uspješno je izbrisana.\",\r\n            },\r\n            s_932: {\r\n              message: \"Linija '%replaceValue' uspješno je izbrisana.\",\r\n            },\r\n            s_933: {\r\n              message: \"Dvorana '%replaceValue' uspješno je izbrisana.\",\r\n            },\r\n            s_934: {\r\n              message: \"Lokacija '%replaceValue' uspješno je izbrisana.\",\r\n            },\r\n            s_935: {\r\n              message: \"A '%replaceValue' fájlt sikeresen törölte.\",\r\n            },\r\n            s_936: {\r\n              message: \"A '%replaceValue' változót sikeresen törölte.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'A kétszer előforduló kártyákat kitörli!',\r\n            add_line_to_dashboard: 'A gyártósort hozzáadása a dashboardhoz',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Határértékek',\r\n            type: 'Válassza ki a típus szerint',\r\n            alarms: 'Riasztás',\r\n            machine: 'Válassza ki a gép ID szerint',\r\n            variables: 'Változók',\r\n            listImport: 'Határértékek importálása',\r\n            listDownload: 'Határértékek letöltése',\r\n          },\r\n          text: {\r\n            text: 'A határértékek azok az értékek, amelyeket azok számára a változók számára határoz meg, amelyek érdeklik. Ha egy változó nincs a meghatározott határértékek között, egy értesítést kap. A határértékeket a diagramokban is kijelzi, amelyeket az „Idősorok” fülön generál.',\r\n            title: 'Határértékek',\r\n          },\r\n          export: {\r\n            text: 'Az aktuálisan beállított határértékeket bármikor exportálni tudja a Cloud Platformba található változó számára. Ezt a listát referenciaként használhatja, vagy arra használhatja, hogy az összes határértéket egyszerre a „Határértékek importálása CSV-ként” szakaszból importálja',\r\n            title: 'Exportálási határok CSV-formátumban',\r\n          },\r\n          import: {\r\n            text: 'Annak érdekében, hogy az aktuálisan elmentett értékeket aktualizálja, a korábban letöltött CSV-fájlokat importálni tudja a határértékekre és előfizetőkre vonatkozó információkkal együtt. Később kiválaszthatja, hogy mely berendezés- vagy géptípusra szeretné alkalmazni az importált határértékeket',\r\n            title: 'Határértékek importálása a CSV-ből',\r\n            machines: {\r\n              title: 'Válassza ki azt a gépet, vagy géptípust, amelyre alkalmazni szeretné a határértékeket.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Válassza ki azt a CSV-fájlt, amelyet importálni szeretne',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'A megmunkáló eszköz kezelőben menjen a kívánt gyártósorra.',\r\n            two: 'A címsorban egy helyi menü található.',\r\n            four: 'A gyártósor csempéjét hozzáadja a dashboardhoz.',\r\n            three: 'Kattintson a helyi menüre és válassza ki a „Hozzáadás a dashboardhoz”.',\r\n            header: 'A gyártósor-csempe hozzáadása',\r\n          },\r\n          individual: {\r\n            one: 'Bal oldalon kattintson a „fogaskerék”-szimbólumra.',\r\n            two: 'Válassza ki a „plusz”-szimbólumot.',\r\n            four: 'Nyugtázza a „Mentés” gombbal. Az egyes csempéket hozzáadja a dashboardhoz.',\r\n            three: 'Adjon nevet a csempének és csatolja a kívánt géphez.',\r\n            header: 'Az egyes csempék hozzáadása',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Új felhasználó létrehozása',\r\n          new: {\r\n            title: 'Felhasználó létrehozása',\r\n            status: 'Felhasználói állapot:',\r\n            buttons: {\r\n              add: 'Hozzáadás',\r\n              back: 'Vissza a listához',\r\n              save: 'Mentés',\r\n              cancel: 'Elvetés',\r\n              delete: 'Felhasználó törlése',\r\n              sendMail: 'Levél újból elküldése',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'Felhasználói csoport',\r\n              gender: 'Nem',\r\n              created: 'Létrehozva',\r\n              lastName: 'Családnév',\r\n              firstName: 'Utónév',\r\n              breadcrumb: 'A navigáció mutatása',\r\n              main_group: 'Main group',\r\n              phoneNumber: 'Telefonszám [opcionális]',\r\n              customer_org: 'Ügyfélszervezet',\r\n              last_modified: 'Utoljára szerkesztve',\r\n              email_validation: 'E-mail (ellenőrzés)',\r\n            },\r\n            statusText: {\r\n              unknown: 'ismeretlen',\r\n              archived: 'archiválva',\r\n              confirmed: 'nyugtázva',\r\n              compromised: 'kompromittálva',\r\n              unconfirmed: 'nyugtázás nélküli',\r\n              reset_required: 'Törlés szükséges',\r\n              external_provider: 'külső ajánlattevő',\r\n              force_change_password: 'Esedékes jelszómódosítás',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'Az e-mail címek nem egyeznek.',\r\n              email_not_valid: 'Kérem, adjon meg egy érvényes e-mail-címet.',\r\n              phone_not_specified: 'Adjon meg egy olyan érvényes telefonszámot, amely +-szal kezdődik és utána egy országhívószámmal folytatódik!',\r\n              roles_not_specified: 'Kérem, válasszon ki egy felhasználói csoportot.',\r\n              gender_not_specified: 'Kérem, adja meg a nemét.',\r\n              last_name_not_specified: 'Kérem, adja meg a nevét.',\r\n              first_name_not_specified: 'Kérem, adja meg az utónevét.',\r\n              main_group_not_specified: 'Kérem, válasszon ki egy felhasználói csoportot.',\r\n              family_name_not_specified: 'Please specify a last name',\r\n              customer_organization_not_specified: 'Kérem, válasszon ki egy ügyfélszervezetet.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Sikertelen!',\r\n          },\r\n          mail: {\r\n            success: 'A megadott e-mail címre egy automatikusan generált jelszót küldött e-mailben.',\r\n          },\r\n          update: {\r\n            title: 'Felhasználó frissítése',\r\n          },\r\n          success: {\r\n            title: 'Sikeres!',\r\n            button: 'Vissza a listához',\r\n            message: 'A felhasználót sikeresen létrehozta. A megadott e-mail címre egy automatikusan generált jelszót küldött e-mailben.',\r\n            message_for_edit: 'A felhasználót sikeresen frissítette.',\r\n            message_send_mail: 'A megadott e-mail címre egy automatikusan generált jelszót küldött e-mailben.',\r\n            button_back_to_last_page: 'Vissza az utolsó oldalra',\r\n          },\r\n          delete: {\r\n            success: 'A felhasználót sikeresen kitörölte.',\r\n            confirmation: {\r\n              title: 'Ezt a felhasználót tényleg ki szeretné törölni?',\r\n              confirm: 'Igen, törölje ki ezt a felhasználót',\r\n              dismiss: 'Nem, elvetés',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Látogató',\r\n            customer: 'Ügyfél',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Felhasználó',\r\n              email: 'E-mail',\r\n              company: 'Cég',\r\n              enabled: 'Státusz',\r\n              lastName: 'Családnév',\r\n              sw_admin: 'SW admin',\r\n              firstName: 'Utónév',\r\n              userRights: 'Jogi státusz',\r\n              phoneNumber: 'Telefonszám',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'férfi',\r\n              female: 'nő',\r\n              diverse: 'divers',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Riasztások',\r\n            type: 'Válassza ki a típus szerint',\r\n            machine: 'Válassza ki a gép ID szerint',\r\n            listImport: 'Riasztás-import',\r\n            listDownload: 'Riasztásfájl letöltése',\r\n          },\r\n          text: {\r\n            text: 'A riasztás-értesítéseket azokra a riasztás-számokra lehet beállítani, amelyek érdeklik. Ha egy értelmezett gépnél fellép a beállított riasztás, egy értesítést fog kapni.',\r\n            title: 'Riasztás-értesítések',\r\n          },\r\n          export: {\r\n            text: 'Az összes gép aktuálisan beállított riasztás-értesítéseit bármikor exportálhatja az SW CloudPlatformba. Ezt a listát referenciaként, vagy arra használhatja, hogy az összes riasztás-értesítést egyszerre a „Riasztások importálása CSV-ként” szakaszba importálja.',\r\n            title: 'Riasztások importálása CSV-ként',\r\n          },\r\n          import: {\r\n            text: 'Annak érdekében, hogy az aktuálisan elmentett értékeket aktualizálja, a korábban letöltött CSV-fájlokat importálni tudja a riasztásokra és előfizetőkre vonatkozó információkkal együtt. Később kiválaszthatja, hogy mely berendezés- vagy géptípusra szeretné alkalmazni a riasztás-értesítéseket.',\r\n            title: 'Riasztások importálása CSV-ből',\r\n            machines: {\r\n              title: 'Válassza ki azt a gépet, vagy géptípust, amelyre alkalmazni szeretné a riasztás-értesítéseket.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Válassza ki azt a CSV-fájlt, amelyet importálni szeretne',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Nem talált eredményt',\r\n          results: {\r\n            of: 'innen:',\r\n            lines: 'Gyártósorok',\r\n            machines: 'Gépek',\r\n          },\r\n          callToAction: 'Gépek keresése',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Sikertelen',\r\n            queued: 'Sorban áll',\r\n            removed: 'Eltávolítva',\r\n            canceled: 'Lemondva',\r\n            rejected: 'Elutasítva',\r\n            completed: 'Befejezve',\r\n            succeeded: 'Sikeres',\r\n            timed_out: 'Időtúllépés',\r\n            in_progress: 'Folyamatban',\r\n            not_installed: 'Nincs telepítve',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Import indítása',\r\n            dismiss: 'Megszakítás',\r\n            download: 'Letöltés indítása',\r\n          },\r\n          tabs: {\r\n            limits: 'Határok',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Név',\r\n              datatype: 'adattípus',\r\n              chartType: 'Diagramtípus',\r\n              displayName: 'Megjelenített név',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Világtérkép',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shopfloor',\r\n          upload: {\r\n            text1: 'Pošaljite sliku svojeg shopfloor-a na lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'Ako su vaši strojevi registrirani i upisani u platformi SW CloudPlatform, pojavit će se s lijeve strane i slati podatke u stvarnom vremenu.',\r\n            text3: 'U tom slučaju samo povucite i ispustite status iz svog plana na pravi stroj.',\r\n            mainText: 'U ovom prikazu možete postaviti svoj pojedinačni raspored aktivnosti u proizvodnji (shopfloor) i vidjeti svoje strojeve kroz različite slojeve informacija. Samo slijedite ove korake.',\r\n            tileTitle: 'Prijenos shopfloor-a',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Sredstvo je uspješno izbrisano.',\r\n            confirmation: {\r\n              title: \"Jeste li sigurni da želite izbrisati '%replaceValue'?\",\r\n              confirm: 'izbriši',\r\n              dismiss: 'otkaži',\r\n              company: {\r\n                text: 'Ha kicseréli a vállalatot, ezzel a hozzá tartozó összes felhasználót is kitörli.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Izbriši sredstvo',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'A NamePrefix vagy DataType megváltoztatása károsíthatja a gépet. Biztosan menteni szeretne?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Át szeretné venni ennek az új géptípusnak a határértékeit?',\r\n              title: 'Megváltoztatta a géptípust',\r\n              accept: 'Igen, vegye át az új határértékeket',\r\n              decline: 'Nem, tartsa meg az aktuális határértékeket',\r\n              dismiss: 'Elvetés',\r\n              info_accept: 'Ahhoz, hogy az aktuális határértékeket felülírja az új géptípus határértékeivel, válassza az „Igen”-t.',\r\n              info_decline: 'Az aktuális határértékek megtartásához válassza a „Nem”-et.',\r\n              info_accept_warning: 'Minden aktuális határértékek felülír vagy kitöröl.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Fájl törlése',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Izbriši dvoranu',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Izbriši liniju',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Státusz',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Gépidő',\r\n          controller_time: 'Kontroller idő',\r\n          iot_gateway_time: 'IoT Gateway idő',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Nincsenek adatok',\r\n              loading: 'Adatok betöltése...',\r\n              months: [\r\n                'Január',\r\n                'Február',\r\n                'Március',\r\n                'Április',\r\n                'Május',\r\n                'Június',\r\n                'Július',\r\n                'Augusztus',\r\n                'Szeptember',\r\n                'Október',\r\n                'November',\r\n                'December',\r\n              ],\r\n              resetZoom: 'Reset zoom',\r\n              weekdays: [\r\n                'Vasárnap',\r\n                'Hétfő',\r\n                'Kedd',\r\n                'Szerda',\r\n                'Csütörtök',\r\n                'Péntek',\r\n                'Szombat',\r\n              ],\r\n              shortMonths: [\r\n                'Jan',\r\n                'Febr',\r\n                'Márc',\r\n                'Ápr',\r\n                'Máj',\r\n                'Jún',\r\n                'Júl',\r\n                'Aug',\r\n                'Szept',\r\n                'Okt',\r\n                'Nov',\r\n                'Dec',\r\n              ],\r\n              shortWeekdays: [\r\n                'V',\r\n                'H',\r\n                'K',\r\n                'Sz',\r\n                'Cs',\r\n                'P',\r\n                'Szo',\r\n              ],\r\n              increaseDateRange: 'minimum eddig:',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Előzetes beállítások',\r\n            rangeTo: 'Eddig',\r\n            selectDateRange: 'Válasszon ki egy időszakot',\r\n            predefined: {\r\n              today: 'Ma',\r\n              custom: 'Egyedi tartomány',\r\n              last7days: 'Az utolsó 7 nap',\r\n              yesterday: 'Tegnap',\r\n              last24Hours: 'Az utolsó 24 óra',\r\n              last5Minutes: 'Az utolsó 5 perc',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Változó szerkesztése',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Változó törlése',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Nyelv kiválasztása',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Izbriši tvrtku',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Izbriši lokaciju',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Státusz',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Dashboard konfigurálása',\r\n            hide: {\r\n              title: 'elrejtés',\r\n            },\r\n            show: {\r\n              title: 'kijelzés',\r\n            },\r\n            delete: {\r\n              title: 'törlés',\r\n            },\r\n            add: {\r\n              fab_title: 'Saját csempe hozzáadása',\r\n            },\r\n            save: {\r\n              fab_title: 'A konfiguráció mentése',\r\n            },\r\n            move_left: {\r\n              title: 'Az előző pozícióba tolás',\r\n            },\r\n            move_right: {\r\n              title: 'A következő pozícióba tolás',\r\n            },\r\n            discard: {\r\n              fab_title: 'A konfiguráció elvetése',\r\n            },\r\n            add_custom_card: {\r\n              save: 'mentés',\r\n              input: 'Adja meg a csempe nevét',\r\n              title: 'Saját csempe hozzáadása',\r\n              cancel: 'elvetés',\r\n              missingMachine: 'Legalább egy gépet ki kell választania',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Egy váratlan hiba lépett fel. Próbálja meg az oldalt újra betölteni.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational Error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Siker',\r\n            },\r\n            e_3xx: {\r\n              message: 'Továbbítás',\r\n            },\r\n            e_400: {\r\n              message: 'A kérés hibás volt és nem sikerült feldolgozni.',\r\n            },\r\n            e_401: {\r\n              message: 'Nincs bejelentkezve. Kérem, jelentkezzen újból be.',\r\n            },\r\n            e_403: {\r\n              message: 'Nincs elegendő jogosultsága a kért erőforráshoz való hozzáféréshez.',\r\n            },\r\n            e_404: {\r\n              message: 'A kért erőforrás nem elérhető.',\r\n            },\r\n            e_405: {\r\n              message: 'A módszer nem megengedett.',\r\n            },\r\n            e_406: {\r\n              message: 'Nem elfogadható módszer',\r\n            },\r\n            e_409: {\r\n              message: 'Az erőforrás már létezik.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Módszer tartalom feldolgozhatatlan',\r\n            },\r\n            e_4xx: {\r\n              message: 'Client-hiba',\r\n            },\r\n            e_500: {\r\n              message: 'Egy belső szerverhiba lépett fel.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Szerver-hiba',\r\n            },\r\n            e_900: {\r\n              message: 'A megmunkáló eszköz létrehozása nem sikerült. Próbálja meg újra egy későbbi időpontban.',\r\n            },\r\n            e_901: {\r\n              message: 'A műveletet megszakította. Nem lett új megmunkáló eszköz létrehozva.',\r\n            },\r\n            e_902: {\r\n              message: 'A műveletet megszakította. A szervizkérés elküldése nem történt meg.',\r\n            },\r\n            e_903: {\r\n              message: 'A szervizkérés elküldésekor valami félresikerült. Próbálja meg újra egy későbbi időpontban.',\r\n            },\r\n            e_904: {\r\n              message: \"A '%replaceValue' megmunkáló eszközt sikeresen létrehozta. Most további megmunkáló eszközöket tud hozzáadni.\",\r\n            },\r\n            e_905: {\r\n              message: 'A műveletet megszakította. A megmunkáló eszközt nem aktualizálta.',\r\n            },\r\n            e_906: {\r\n              message: \"A '%replaceValue' megmunkáló eszközt sikeresen áthelyezte.\",\r\n            },\r\n            e_910: {\r\n              message: 'Az új felhasználó létrehozása félresikerült. Próbálja meg újra egy későbbi időpontban.',\r\n            },\r\n            e_911: {\r\n              message: 'A műveletet megszakította. Nem lett új felhasználó létrehozva.',\r\n            },\r\n            e_912: {\r\n              message: 'A megmunkáló eszköz frissítése nem sikerült. Próbálja meg újra.',\r\n            },\r\n            e_920: {\r\n              message: 'A műveletet megszakította. Nem voltak módosítások elmentve.',\r\n            },\r\n            e_921: {\r\n              message: 'Egy váratlan hiba lépett fel. Próbálja meg még egyszer.',\r\n            },\r\n            e_922: {\r\n              message: 'A felhasználónév és/vagy jelszó nem helyes. Próbálja meg még egyszer.',\r\n            },\r\n            e_923: {\r\n              message: 'Kérem, adjon meg egy felhasználónevet és egy jelszót.',\r\n            },\r\n            e_924: {\r\n              message: 'A munkamenet az inaktivitás miatt lejárt. Kérem, jelentkezzen be újból.',\r\n            },\r\n            e_925: {\r\n              message: 'Ahhoz, hogy az SW Cloud Platformot használni tudja, el kell fogadnia az adatvédelmi nyilatkozatunkat.',\r\n            },\r\n            e_926: {\r\n              message: 'A fiókja ideiglenesen le van tiltva. Egy pár perc múlva próbálja meg újból.',\r\n            },\r\n            e_927: {\r\n              message: 'A jelszavát sikeresen megváltoztatta.',\r\n            },\r\n            e_928: {\r\n              message: 'A műveletet megszakította. Nem töltött fel egyetlen fájlt sem.',\r\n            },\r\n            e_929: {\r\n              message: 'Egy fájl feltöltésekor valami félresikerült. Próbálja meg újra egy későbbi időpontban...',\r\n            },\r\n            e_930: {\r\n              message: 'Egy fájl törlési próbálkozásánál valami félresikerült. Próbálja meg újra egy későbbi időpontban.',\r\n            },\r\n            e_931: {\r\n              message: 'Az egyedi tartomány túl nagy. Az alapértelmezett 24 óra van beállítva',\r\n            },\r\n            e_932: {\r\n              message: 'A megmunkáló eszköznek alárendelt elemei vannak. Először az alárendelt elemeket törölje ki.',\r\n            },\r\n            e_933: {\r\n              message: \"A '%replaceValue' változót sikeresen létrehozta. Most hozzáadhat egy másik változót.\",\r\n            },\r\n            e_934: {\r\n              message: 'Valami gond merült fel a változó törlése közben. Próbálja meg később.',\r\n            },\r\n            e_10500: {\r\n              message: 'Úgy tűnik, nincs az internethez csatlakozva. Ellenőrizze le a csatlakozását.',\r\n            },\r\n            e_10501: {\r\n              message: 'Egy nem támogatott böngészőt használ. Használja a következő böngészők egyikét: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'A megmunkáló eszköz (SW-gépszám %replaceValue) már létezik.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Ez a fájlnév %replaceValue már létezik',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Egyidejűleg csak %s elemet lehet kiválasztani',\r\n              title: 'Elérte a max. számot',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Időszűrő',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Nincsenek elérhető fájlok.',\r\n              file_cardTitle: 'Géppel kapcsolatos események',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Adat letöltése',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC nyomonkövetés fájlok',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Riasztás nem áll rendelkezésre',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC összehasonlító fájlok',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC adatfájlok',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Nincsenek elérhető fájlok.',\r\n              file_cardTitle: 'ToolMon-fájlok',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'ToolMon-adatok letöltése',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Kiváltó ok',\r\n              column_title_filename: 'Fájlnév',\r\n              column_title_creation_date: 'A létrehozás dátuma',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI működési adatokat tartalmazó fájlok',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  it: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Logout',\r\n        release: \"Il '%replaceValue1' fino alle '%replaceValue2' verranno eseguiti dei lavori di manutenzione alla piattaforma. Il questo arco di tempo, la piattaforma sarà parzialmente non disponibile.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Chiudere',\r\n        acceptLabel: 'Accetta',\r\n        userProfile: 'Profilo utente',\r\n        button: {\r\n          clear: 'Rimuovere il diagramma',\r\n          timeline: 'Adattamento valore limite',\r\n          separateCharts: 'Separare il diagramma',\r\n        },\r\n        declineLabel: 'Rifiuta',\r\n        backToDashboard: 'Torna alla dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/it/condizioni-generali-di-contratto-norme/',\r\n            title: 'Condizioni generali di vendita / Standard',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Contatti',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/it/impronta/',\r\n            title: 'impronta',\r\n          },\r\n          privacy: {\r\n            title: 'Area privata',\r\n            header: 'Norme sulla protezione dei dati',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'SW Homepage',\r\n          },\r\n        },\r\n        noInternetConnection: 'Non è presente una connessione a internet. Si prega di stabilire una connessione e di riprovare.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'da',\r\n          noData: 'Nessun dato',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'scaricato',\r\n          noDuration: 'nessuna durata disponibile',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'La Vostra macchina non è dotata di licenza.',\r\n          alarmPending: 'Allarme presente',\r\n          buttons: {\r\n            back: 'Indietro',\r\n            save: 'Salva',\r\n            view: 'Visualizzare',\r\n            cancel: 'Interrompi',\r\n            custom: 'Salva + imposta range personalizzato',\r\n            submit: 'Adotta',\r\n            export: {\r\n              limit: 'Limiti per il download',\r\n              alarms: 'Download allarmi',\r\n            },\r\n            import: {\r\n              limit: 'Avvio',\r\n              alarms: 'Avvio',\r\n            },\r\n            refreshReset: 'Resettare sul tempo standard',\r\n            selectAllCheckboxes: 'Seleziona tutto',\r\n            unselectAllCheckboxes: 'Annulla la selezione',\r\n          },\r\n          notAvailable: 'Non disponibile',\r\n          notConnected: 'Non ancora connesso',\r\n          download: {\r\n            file: 'Download file',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'Giorno',\r\n            days: 'Giorni',\r\n            hour: 'Ora',\r\n            year: 'Anno',\r\n            hours: 'Ore',\r\n            month: 'Mese',\r\n            years: 'Anni',\r\n            minute: 'Minuto',\r\n            months: 'Mesi',\r\n            second: 'Secondo',\r\n            minutes: 'Minuti',\r\n            seconds: 'Secondi',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Compreso',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'L’azione sarà irreversibile!',\r\n        },\r\n        error: {\r\n          upload: 'Caricamenti falliti',\r\n          download: 'Download falliti',\r\n          message: {\r\n            enrollment_code_409: 'Il dispositivo è già registrato in aws.',\r\n            limit_change_failed: 'Non è stato possibile modificare i valori limite. Si prega di provare nuovamente in un secondo momento oppure di inviare una e-mail a lifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Foto temporizzata',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Selezionare le variabili',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Data',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Accesso assistito sicuro',\r\n            directAccess: 'Accesso diretto',\r\n            new: {\r\n              fields: {\r\n                id: 'Immettere ID',\r\n                cOnePanel: 'con C|One',\r\n                sessionType: 'Tipo di sessione',\r\n              },\r\n              error_messages: {\r\n                id: 'Si prega di immettere un ID di sessione o un ID dispositivo',\r\n                sessionType: 'Prego selezionare un tipo di sessione',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: 'Macchine',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            fab_title: 'Aggiungere nuova linea',\r\n            grid: {\r\n              hall: 'Sala',\r\n              line: 'Linea',\r\n              type: 'Tipo',\r\n              contractEnd: 'Fine contratto [optional]',\r\n              cellPosition: 'Cella / Posizione [optional]',\r\n              operationStep: 'Fase di lavorazione',\r\n              machineIdentifierSw: 'Numero macchina (SW)',\r\n              machineIdentifierCustomer: 'Nome macchina',\r\n            },\r\n            success: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La linea è stata creata con successo.',\r\n            },\r\n            new_form_title: 'Nuova linea',\r\n            edit_form_title: 'Elabora linea',\r\n            new: {\r\n              fields: {\r\n                name: 'Nome linea',\r\n                name_short: 'Nome linea (in breve) [optional]',\r\n                description: 'Descrizione [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Si prega di immettere il nome della linea.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La linea è stata aggiornata con successo.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Aggiungere nuova sala',\r\n            grid: {\r\n              part: 'Tipo pezzi',\r\n              lineName: 'Linea',\r\n              typeOfLoading: 'Tipo di trattamento',\r\n              lineResponsible: 'Responsabile della linea',\r\n              plannedQuantity: 'Quantità programmata',\r\n              numberOfMachines: '# Macchine',\r\n            },\r\n            tabs: {\r\n              list: 'Linee',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            success: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La sala è stata creata con successo.',\r\n            },\r\n            new_form_title: 'Nuova sala',\r\n            shopfloor: {\r\n              edit: 'Modalità di lavorazione',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Salvare la configurazione',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Rigettare la configurazione',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Elabora sala',\r\n            new: {\r\n              fields: {\r\n                name: 'Nome sala',\r\n                name_short: 'Nome della sala (in breve) [optional]',\r\n                description: 'Descrizione [optional]',\r\n                description_external: 'Descrizione (esterna) [optional]',\r\n                description_internal: 'Descrizione (interna) [optional]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Si prega di immettere il nome della sala.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La sala è stata aggiornata con successo.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Descrizione [optional]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Creare un nuovo asset',\r\n            tabs: {\r\n              info: 'Serie storiche',\r\n              alarms: 'Allarme',\r\n              events: 'Eventi macchina',\r\n              gateway: 'Gateway',\r\n              service: 'Servizio',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Disponibilità linea',\r\n              'axis-test': 'Test assi',\r\n              collection: 'Collezioni',\r\n              technology: 'Tecnologia',\r\n              maintenance: 'Manutenzione',\r\n              performance: 'Performance',\r\n              spindledata: 'Dati mandrino',\r\n              remoteaccess: 'Accesso remoto',\r\n              enduranceTest: 'Test di fine linea',\r\n              administration: 'Amministrazione',\r\n              y_title: {\r\n                status: 'Stato',\r\n                status_table_one: 'Tavola 1',\r\n                status_table_two: 'Tavola 2',\r\n              },\r\n              energymonitoring: 'Monitoraggio energia',\r\n              technology_undefined: 'non definito',\r\n              technology_undefined_condition: 'Stato non definito!',\r\n            },\r\n            move: {\r\n              message: \"L'asset '%replaceValue' può essere spostato in una nuova azienda, sede, sala e/o linea.\",\r\n              select_hall_label: 'Selezionare una nuova sala',\r\n              select_line_label: 'Selezionare una nuova linea',\r\n              select_company_label: 'Selezionare nuova azienda',\r\n              select_location_label: 'Selezionare una nuova sede',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Numero macchina (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Fornitura [optional]',\r\n                shipping: 'Spedizione [optional]',\r\n                controller: 'Unità di comando',\r\n                machine_type: 'Tipo di macchina',\r\n                warranty_end: 'Termine della garanzia [optional]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Systems Manager',\r\n                warranty_start: 'Inizio della garanzia [optional]',\r\n                machine_swmp_api: 'Macchine SWMP API fine [optional]',\r\n                machine_swsp_trace: 'Macchine SWSP Trace fine [optional]',\r\n                machine_swcp_portal: 'Macchine SWCP Portal fine [optional]',\r\n                start_of_production: 'Inizio della produzione [optional]',\r\n                machine_swcp_support: 'Macchine SWCP Support fine [optional]',\r\n                machine_cell_position: 'Cella macchina / Posizione',\r\n                machine_swsp_line_mon: 'Macchine SWSP LineMon fine [optional]',\r\n                machine_identifier_customer: 'ID macchine (cliente)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Si prega si immettere un numero macchina SW valido (minimo 7 caratteri: A-Z, 0-9, -).',\r\n                controller_not_specified: \"Si prega di selezionare un'unità di comando.\",\r\n                machine_type_not_specified: 'Si prega di selezionare un tipo di macchina.',\r\n                machine_identifier_customer_not_specified: \"Si prega di immettere l'ID macchina.\",\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: \"L'asset è stato creato con successo.\",\r\n            },\r\n            new_form_title: 'Aggiungi asset',\r\n            edit_form_title: 'Elabora asset',\r\n            move_form_title: \"Spostare l'asset\",\r\n            editSuccess: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: \"L'asset è stato aggiornato con successo.\",\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Data di spedizione',\r\n                controller: 'Unità di comando',\r\n                contractEnd: 'Fine contratto',\r\n                machineType: 'Tipo di macchina',\r\n                startupDate: 'Data messa in funzione',\r\n                warrantyEnd: 'Fine garanzia',\r\n                cellPosition: 'Cella / Posizione',\r\n                warrantyStart: 'Inizio garanzia',\r\n                customerNumber: 'Numero cliente',\r\n                enrollmentConfig: 'Configurazione della registrazione',\r\n                startOfProduction: 'Inizio della produzione',\r\n                machineIdentifierSw: 'Numero macchina SW',\r\n                enrollmentConfigDownload: 'Scarica',\r\n                machineIdentifierCustomer: 'Nome macchina cliente',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Cambio',\r\n              g_mode: 'Funzione-G',\r\n              off_time: 'Tempo secondario',\r\n              no_change: 'Nessun cambio',\r\n              undefined: 'Non definito',\r\n              active_tool: 'Utensile attivo',\r\n              tool_change: 'Cambio utensile',\r\n              machining_time: 'Tempo principale',\r\n              tool_change_time: 'Tempo di cambio utensile',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Tempo di processo tavola 1',\r\n                  name_two: 'Tempo di processo tavola 2',\r\n                  name_one_undefined: 'Tempo di processo non definito tavola 1',\r\n                  name_two_undefined: 'Tempo di processo non definito tavola 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Asse Q e mandrino',\r\n              undefined_gmode_data: 'Nessun dato per funzione-G',\r\n              auxiliary_process_time: 'Tempo di processo aggiuntivo',\r\n              undefined_activetool_data: 'Nessun dato per l’utensile attivo',\r\n              undefined_tool_change_data: 'Nessun dato per cambio utensile',\r\n              undefined_machining_time_table_one: 'Stato non definito tavola 1',\r\n              undefined_machining_time_table_two: 'Stato non definito tavola 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Tempo principale, tempo cambio utensile e tempo secondario tavola 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Tempo principale, tempo cambio utensile e tempo secondario tavola 2',\r\n            },\r\n            add_line_to_dashboard: 'Aggiungi linea alla dashboard',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Unità',\r\n                value: 'Valore',\r\n                kpiUnit: 'Unità',\r\n                headline: 'Test assi',\r\n                kpiValue: 'Valore',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Caricare da memoria browser',\r\n                limitsSave: 'Salvare nella memoria browser',\r\n                selectAxis: 'Selezionare asse',\r\n                limitsExport: 'Esportare i valori limite nella memoria temporanea',\r\n                openAxistest: 'Aprire test assi',\r\n                axisTestPlural: 'Test assi',\r\n                adjustments: {\r\n                  add: 'aggiungere adattamento locale',\r\n                  range: 'Portata',\r\n                  header: 'Adattamento locale',\r\n                  remove: 'Rimuovi',\r\n                  position: 'Posizione',\r\n                  amplitude: 'Ampiezza',\r\n                  spreadMultiplier: 'Moltiplicatore limiti',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Posizione',\r\n                    y: 'Corrente',\r\n                    up: 'su',\r\n                    down: 'giù',\r\n                    limitsUp: 'limita la direzione positiva',\r\n                    limitsDown: 'limita la direzione negativa',\r\n                    sliderSlopeCenter: 'Origine incremento',\r\n                    sliderSlopeFactor: 'Fattore di incremento',\r\n                    sliderVerticalOffset: 'Traslazione Y',\r\n                    sliderVerticalSpread: 'Limitare ampiezza',\r\n                    sliderQuadraticCenter: 'Origine quadratica',\r\n                    sliderQuadraticFactor: 'Fattore quadratico',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Senso orario',\r\n                    limitsClockwise: 'Limiti in senso orario',\r\n                    counterClockwise: 'Senso antiorario',\r\n                    sliderSineOffset: 'Sfasamento onda',\r\n                    sliderSineAmplitude: 'Ampiezza onda',\r\n                    sliderSineFrequency: 'Frequenza onda',\r\n                    sliderVerticalOffset: 'Traslazione Y',\r\n                    sliderVerticalSpread: 'Limitare ampiezza',\r\n                    limitsCounterClockwise: 'Limiti in senso antiorario',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Velocità',\r\n                  pulseMaxRampUp: 'Rampa ->',\r\n                  pulseMaxRampDown: 'Rampa <-',\r\n                  pulseMaxStiffness: 'Rigidità massima',\r\n                  pulseMinStiffness: 'Rigidità minima',\r\n                  pulseMeanStiffness: 'Rigidità Ø',\r\n                  circularReversalRange: 'Errore di inversione circolare',\r\n                  pulseMaxUpPathCurrent: 'Corrente massima ->',\r\n                  pulseMinUpPathCurrent: 'Corrente minima ->',\r\n                  pulseMeanUpPathCurrent: 'Corrente Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Corrente massima <-',\r\n                  pulseMinDownPathCurrent: 'Corrente minima <-',\r\n                  pulseMeanDownPathCurrent: 'Corrente Ø <-',\r\n                  circularShapeDeviationClockwise: 'Scostamento dalla circolarità rotazione destra',\r\n                  pulseStiffnessStandardDeviation: 'Rigidità σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Corrente σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Corrente σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Scostamento dalla circolarità rotazione sinistra',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Test di circolarità',\r\n                  EQUABILITY: 'Test di sincronismo',\r\n                  CIRCULARITY: 'Test di circolarità',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Nessun test assi di questo tipo disponibile',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Gateway',\r\n                contact: 'In caso di errore prego rivolgersi a',\r\n                headline: 'Gateway',\r\n                netcfg: {\r\n                  cta: 'Vi preghiamo di metterci a disposizione i dati relativi al modulo Netcfg.',\r\n                  intro: 'Per potere procedere alla connessione della Vostra macchina, dobbiamo basarci sulle Vostre indicazioni relative alla configurazione di rete.',\r\n                  title: 'Configurazione di rete',\r\n                  goToNetconfig: 'Aprire la configurazione di rete',\r\n                },\r\n                device: {\r\n                  title: 'Dettagli dispositivo',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Se il IoT-Gateway appare come segue, eseguire i seguenti passi:',\r\n                  line1: 'Scaricare il file di registrazione cliccando sul pulsante posto sul margine inferiore del riquadro.',\r\n                  line2: 'Il download inizia automaticamente.',\r\n                  line3: 'Salvare il file .json nella cartella principale di una chiavetta USB. Assicurarsi che il file sia denominato:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Assicurarsi che i seguenti file si trovino nella cartella principale della chiavetta USB:',\r\n                  line6: 'Collegare la chiavetta USB alla corrispondete porta IoT Gateway.',\r\n                  line7: 'L’apprendimento si avvia automaticamente; la procedura in corso viene segnalata da un LED utente verde lampeggiante.',\r\n                  line8: 'Una volta effettuato con successo il login, il LED verde si accende fino a che la chiavetta USB viene rimossa.',\r\n                  title: 'Registrazione',\r\n                  button: 'File di registrazione',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Scaricare il file \"migrate-iot.zip\" ed estrarre il contenuto direttamente su una chiavetta USB vuota.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Scaricare anche la ',\r\n                  line4: ' e aggiungerla alla chiavetta USB. Assicurarsi che il file sia denominato come segue:',\r\n                  line5: 'Assicurarsi che i seguenti file si trovino nella cartella principale della chiavetta USB:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Migrazione di piattaforma',\r\n                  line10: 'Collegare la chiavetta USB alla corrispondete porta IoT Gateway.',\r\n                  line11: 'Il software si installa automaticamente; la procedura di installazione in corso viene segnalata da un LED giallo lampeggiante.',\r\n                  line12: 'Una volta effettuata con successo la migrazione, il LED verde si accende fino a che la chiavetta USB viene rimossa.',\r\n                  line13: 'Una volta effettuata con successo la migrazione, il LED verde si accende fino a che la chiavetta USB viene rimossa.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generare',\r\n                headline: 'Serie storiche',\r\n                noChartMessage: 'Per visualizzare i dati desiderati, selezionare una o più variabili e cliccare su \"generare\"',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Allarme',\r\n              },\r\n              service: {\r\n                contact: 'Si prega di contattare',\r\n                headline: 'Servizio',\r\n                update: {\r\n                  title: 'Aggiornare file',\r\n                },\r\n                upload: {\r\n                  title: 'Caricare il file',\r\n                  fields: {\r\n                    file: 'File',\r\n                    language: 'Lingua del file',\r\n                    file_name: 'Nome file',\r\n                    list_of_languages: {\r\n                      cz: 'Ceco',\r\n                      de: 'Tedesco',\r\n                      en: 'Inglese',\r\n                      es: 'Spagnolo',\r\n                      fr: 'Francese',\r\n                      hu: 'Ungherese',\r\n                      it: 'Italiano',\r\n                      ko: 'Coreano',\r\n                      pl: 'Polacco',\r\n                      tr: 'Turco',\r\n                      zh: 'Cinese',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Carica',\r\n                    cancel: 'Interrompi',\r\n                  },\r\n                  success: {\r\n                    title: 'Completato con successo',\r\n                    button: 'Torna al riepilogo dei servizi',\r\n                    message: 'Il file è stato caricato con successo',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Prego immettere un nome di file.',\r\n                    file_not_valid: 'Si prega di indicare un file / Si prega di selezionare un file di dimensioni minori.',\r\n                    language_not_specified: 'Si prega di immettere una lingua del file.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Manuali',\r\n                },\r\n                version: {\r\n                  title: 'versione file',\r\n                },\r\n                contracts: {\r\n                  title: 'Contratti',\r\n                },\r\n                components: {\r\n                  title: 'Componenti hardware e software',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Elenco pezzi di ricambio',\r\n                },\r\n                consumeables: {\r\n                  title: 'Fluidi operativi',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Aggiorna',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: \"Al fine di attivare una macchina per l'accesso remoto, è necessario che TeamViewer sia installato sulI’IoT-Gateway. \",\r\n                  line2: 'Qualora questa installazione non sia ancora stata effettuata, installare TeamViewer semplicemente cliccando su “Installa”.',\r\n                  title: 'Installare il supporto a distanza',\r\n                  status: 'Stato Deployment',\r\n                  copy: {\r\n                    button: 'Copiare il link',\r\n                  },\r\n                  install: {\r\n                    button: 'Installare Teamviewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Avviare la sessione',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Software IoT Gateway',\r\n                  values: {\r\n                    box_id: 'ID box',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'Sistema operativo',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Avete bisogno di aiuto con la Vostra macchina?',\r\n                  line2: 'Mettetevi in contatto con noi!',\r\n                  title: 'Messaggio a servizio assistenza SW',\r\n                  button: 'Contattare servizio di assistenza clienti',\r\n                  fields: {\r\n                    name: 'Numero macchina (SW)',\r\n                    type: 'Tipo di richiesta',\r\n                    email: 'E-mail',\r\n                    message: 'Messaggio',\r\n                    phone_no: 'Numero di telefono',\r\n                    last_name: 'Cognome',\r\n                    first_name: 'Nome',\r\n                    contact_person: 'Persona di riferimento (SW) [optional]',\r\n                    list_of_types: {\r\n                      request: 'Richiesta generica',\r\n                      service: 'Servizio',\r\n                      retrofit: 'Retrofit',\r\n                      expansion: 'Ampliamento',\r\n                      inspection: 'Ispezione',\r\n                    },\r\n                    machine_identifier_customer: 'ID macchina (cliente) [optional]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Invia richiesta',\r\n                    cancel: 'Interrompi',\r\n                  },\r\n                  success: {\r\n                    title: 'Completato con successo!',\r\n                    button: 'Torna al riepilogo dei servizi',\r\n                    message: 'La richiesta è stata trasmessa con successo al servizio di assistenza SW.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Si prega di immettere un indirizzo e-mail valido.',\r\n                    name_not_specified: 'Si prega si immettere un numero macchina SW valido (minimo 7 caratteri: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Si prega di immettere un numero di telefono valido.',\r\n                    message_not_specified: 'Si prega di immettere un messaggio.',\r\n                    last_name_not_specified: 'Si prega di immettere il cognome.',\r\n                    first_name_not_specified: 'Si prega di immettere il nome.',\r\n                    family_name_not_specified: 'Si prega di immettere il cognome.',\r\n                    contact_type_not_specified: 'Si prega di indicare il tipo di richiesta.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Software macchina',\r\n                  values: {\r\n                    nc_version: 'Versione NC',\r\n                    hmi_version: 'Versione HMI',\r\n                    plc_version: 'Versione PLC',\r\n                    compile_cycles: 'Cicli Compile',\r\n                    operating_system: 'Sistema operativo',\r\n                    pcu_base_version: 'Versione PCU-Base',\r\n                    plc_toolbox_version: 'Toolbox PLC',\r\n                    plc_user_program_version: 'Programma utente PLC',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Il nome del file è stato modificato correttamente',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Supporto remoto',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'L’assistente operativo potrà aiutarvi nella risoluzione dei problemi.',\r\n                  title: 'Assistente operativo',\r\n                  sub_title: 'Siete momentaneamente in difficoltà con uno dei Vostri asset?',\r\n                  open_assistant: 'Aprire l’assistente operativo',\r\n                  request_account: 'Richiedere un account',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Statistiche mandrino SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'On',\r\n                labelOffline: 'Off',\r\n              },\r\n              swimlane: {\r\n                headline: 'Disponibilità linea',\r\n              },\r\n              endurance: {\r\n                headline: 'Test di fine linea',\r\n                chartTitles: {\r\n                  runtime: 'Dati sul tempo di esercizio',\r\n                  endurance: 'Test di fine linea',\r\n                  operation: 'Modalità operativa',\r\n                  qaxis_180: 'Asse Q 180°',\r\n                  nc_program: 'Programma NC',\r\n                  stacklights: '3 spia di segnalazione',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Stato invio',\r\n                aborted: 'annullato',\r\n                sending: 'inviato',\r\n                undefined: 'non definito',\r\n                interrupted: 'interrotto',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Mappa degli allarmi',\r\n              },\r\n              collection: {\r\n                headline: 'Collezione',\r\n                noChartMessage: 'Si prega di selezionare una collezione dal lato sinistro.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Somma',\r\n                  header: 'Performance Kpi',\r\n                  target: 'Nominale',\r\n                },\r\n                alarms: {\r\n                  title: 'Allarme',\r\n                  category: [\r\n                    'Non classificato',\r\n                    'Messaggio di errore',\r\n                    'Messaggio di funzionamento',\r\n                    'Messaggio di stato',\r\n                    'Istruzioni per l’uso',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Tendenza',\r\n                    duration: 'Durata della presenza',\r\n                    flatlist: 'Elenco semplice',\r\n                    frequency: 'Frequenza di comparsa',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Tempo',\r\n                    trend: 'Tendenza',\r\n                    duration: 'Durata della presenza',\r\n                    leftTime: 'Allarme in corso',\r\n                    alarmCount: 'Numero',\r\n                    alarmNumber: 'N. allarme',\r\n                    description: 'Descrizione',\r\n                    alarmOccured: 'Si è verificato un allarme',\r\n                    alarmClassification: 'Classificazione allarme',\r\n                    alarmCountSecondRange: 'Numero T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'Crescente',\r\n                      down: 'Discendente',\r\n                      flat: 'Invariato',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Dettagli',\r\n                  ncProgram: 'Programma NC',\r\n                  lastModified: 'Ultima registrazione di valori',\r\n                  machineState: 'Stato della macchina',\r\n                  numberAlarms: 'Allarme presente',\r\n                  stopCondition: 'Condizioni di arresto',\r\n                  ncProgramState: 'Stato programma NC',\r\n                  protectionLevel: 'Livello di protezione',\r\n                  ncProgramStates: [\r\n                    'annullato',\r\n                    'sospeso',\r\n                    'in corso',\r\n                    'in attesa',\r\n                    'interrotto',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Sistema',\r\n                    'Produttore',\r\n                    'Servizio',\r\n                    'Utilizzatore',\r\n                    'Interruttore a chiave posizione 3',\r\n                    'Interruttore a chiave posizione 2',\r\n                    'Interruttore a chiave posizione 1',\r\n                    'Interruttore a chiave posizione 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Tempo di ciclo',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Tempo di ciclo in s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'Non OK',\r\n                  sum: 'Somma',\r\n                  title: 'Contatore pezzi',\r\n                  titleDayCounter: 'Contatore giorni',\r\n                  titleShiftCounter: 'Contatore turni',\r\n                  titleTotalCounter: 'Contatore complessivo',\r\n                  titleTotalCounterSmall: 'Complessivo',\r\n                },\r\n                availability: {\r\n                  title: 'Disponibilità',\r\n                  kpi: {\r\n                    title: 'Disponibilità KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG con errore',\r\n                    MDA_with_error: 'MDA con errore',\r\n                    JOG_without_error: 'JOG senza errore',\r\n                    MDA_without_error: 'MDA senza errore',\r\n                    not_defined_condition: 'Stato non definito',\r\n                    auto_no_program_active: 'AUTO Nessun programma attivo',\r\n                    auto_waiting_for_parts: 'AUTO Attesa dei pezzi',\r\n                    auto_with_error_program_stopped: 'AUTO con errore - programma arrestato',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO Attesa dei pezzi + errore di arresto',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Disponibilità aggregata',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Disponibilità',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Stato',\r\n                },\r\n                operationMode: {\r\n                  title: 'Stato di funzionamento',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Stato di funzionamento',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Monitor tempo di funzionamento',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Programma',\r\n                      labels: {\r\n                        on: 'on',\r\n                        off: 'off',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Override mandrino',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Override avanzamento',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Amministrazione',\r\n                headline: 'Amministrazione',\r\n                aws: {\r\n                  title: 'Link AWS',\r\n                },\r\n                groups: {\r\n                  title: 'Gruppi di oggetti',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Systems Manager',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Lista componenti',\r\n                },\r\n                component: {\r\n                  title: 'Componenti',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Manutenzione',\r\n              },\r\n              spindleData: {\r\n                headline: 'Dati mandrino',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Accesso remoto',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Tempo prima di allarme (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Tempo dopo allarme (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Monitoraggio energia',\r\n                chartTitles: {\r\n                  air: 'Consumo di aria compressa',\r\n                  current: 'Consumo di corrente',\r\n                  consumption: 'Consumo medio all’ora',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Monitoraggio dello stato',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Aggiungere nuova azienda',\r\n            grid: {\r\n              city: 'Luogo',\r\n              email: 'E-mail',\r\n              street: 'Indirizzo',\r\n              country: 'Paese',\r\n              website: 'Sito internet',\r\n              postalCode: 'CAP',\r\n              locationName: 'Sede',\r\n              locationCustomerNumber: 'Numero cliente',\r\n            },\r\n            tabs: {\r\n              list: 'Sedi',\r\n              worldmap: 'Cartina mondiale',\r\n            },\r\n            success: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: \"L'azienda è stata creata con successo.\",\r\n            },\r\n            toggle_switch: 'Creare una sede con gli stessi dati',\r\n            new_form_title: 'Nuova azienda',\r\n            edit_form_title: 'Elabora azienda',\r\n            new: {\r\n              fields: {\r\n                city: 'Città',\r\n                name: \"Nome dell'azienda\",\r\n                email: 'E-mail [optional]',\r\n                state: 'Stato federale [optional]',\r\n                street: 'Indirizzo',\r\n                country: 'Paese',\r\n                website: 'Sito internet [optional]',\r\n                zipcode: 'CAP',\r\n                legal_form: 'Forma giuridica [optional]',\r\n                name_short: \"Nome dell'azienda (in breve) [optional]\",\r\n                description: 'Descrizione [optional]',\r\n                company_logo: \"Logo dell'azienda (URL) [optional]\",\r\n                customer_number: 'Numero cliente',\r\n                industry_sector: 'Settore industriale',\r\n                description_external: 'Descrizione (esterna) [optional]',\r\n                description_internal: 'Descrizione (interna) [optional]',\r\n              },\r\n              error_messages: {\r\n                url: 'Si prega di immettere un URL valido.',\r\n                email: 'Si prega di immettere un indirizzo e-mail valido.',\r\n                city_not_specified: 'Si prega di immettere la città.',\r\n                name_not_specified: \"Si prega di immettere il nome dell'azienda.\",\r\n                street_not_specified: \"Si prega di immettere l'indirizzo.\",\r\n                country_not_specified: 'Si prega di immettere il paese.',\r\n                zipcode_not_specified: 'Si prega di immettere il CAP.',\r\n                customer_number_not_specified: 'Si prega di immettere un numero cliente.',\r\n                industry_sector_not_specified: 'Si prega di immettere un settore industriale.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: \"L'azienda è stata aggiornata con successo.\",\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Indirizzo',\r\n                country: 'Paese',\r\n                website: 'Sito internet',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'La SW CloudPlatform rappresenta l’azienda in oggetto su una cartina; a tal fine utilizza i gradi di longitudine e latitudine.',\r\n              intro_heading: 'Informazioni sul luogo',\r\n              location_name: 'Nome del luogo:',\r\n              label_latitude: 'Latitudine',\r\n              label_longitude: 'Longitudine',\r\n              text_fallback_info: 'In caso contrario, vengono utilizzate le coordinate standard.',\r\n              text_location_found: 'È stato trovato un luogo.',\r\n              text_location_entered: 'Il luogo è stato indicato.',\r\n              text_success_location: 'I seguenti dati sono stati impostati:',\r\n              button_define_coordinates: 'Immettere autonomamente le coordinate',\r\n              text_no_coordinates_found: 'Non è stata trovata alcuna coordinata corrispondente ai dati immessi.',\r\n              text_coordinates_success_set: 'Le coordinate sono impostate.',\r\n              button_set_custom_coordinates: 'Impostare le coordinate',\r\n              text_specify_coordinates_yourself: 'In alternativa è possibile immettere le coordinate autonomamente.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Aggiungere nuova sede',\r\n            tabs: {\r\n              list: 'Sale',\r\n              shopfloor: 'Shopfloor',\r\n            },\r\n            grid: {\r\n              hallName: 'Sala',\r\n            },\r\n            success: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La sede è stata creata con successo.',\r\n            },\r\n            new_form_title: 'Nuova sede',\r\n            edit_form_title: 'Elabora sede',\r\n            new: {\r\n              fields: {\r\n                city: 'Città',\r\n                name: 'Nome della sede',\r\n                email: 'E-mail [optional]',\r\n                state: 'Stato federale [optional]',\r\n                street: 'Indirizzo',\r\n                country: 'Paese',\r\n                website: 'Sito internet [optional]',\r\n                zipcode: 'CAP',\r\n                language: 'Lingua [optional]',\r\n                name_short: 'Nome della sede (in breve) [optional]',\r\n                description: 'Descrizione [optional]',\r\n                customer_number: 'Numero cliente [optional]',\r\n                description_internal: 'Descrizione (interna) [optional]',\r\n              },\r\n              error_messages: {\r\n                email: 'Si prega di immettere un indirizzo e-mail valido.',\r\n                city_not_specified: 'Si prega di immettere la città.',\r\n                name_not_specified: 'Si prega di immettere il nome della sede.',\r\n                street_not_specified: \"Si prega di immettere l'indirizzo.\",\r\n                country_not_specified: 'Si prega di immettere il paese.',\r\n                zipcode_not_specified: 'Si prega di immettere il CAP.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Completato con successo!',\r\n              button: 'Torna alla lista',\r\n              message: 'La sede è stata aggiornata con successo.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Indirizzo',\r\n                country: 'Paese',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Luogo',\r\n              email: 'E-mail',\r\n              street: 'Indirizzo',\r\n              country: 'Paese',\r\n              website: 'Sito internet',\r\n              postalCode: 'CAP',\r\n              companyName: 'Azienda',\r\n            },\r\n            tabs: {\r\n              list: 'Azienda',\r\n              worldmap: 'Cartina mondiale',\r\n            },\r\n            map: {\r\n              description_not_available: 'Nessuna descrizione presente',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Aggiungi',\r\n                back: 'Torna alla lista',\r\n                edit: 'Aggiorna',\r\n                save: 'Salva',\r\n                email: 'Invia immagine',\r\n                cancel: 'Interrompi',\r\n                addMultiple: 'Aggiungi + nuovo',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Edita amministrazione',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Assicurazione qualità',\r\n          users: 'Gestione utenti',\r\n          assets: 'Gestione impianti',\r\n          settings: 'Impostazioni',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profilo utente',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Gestione utenti',\r\n          assets: 'Gestione impianti',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profilo utente',\r\n        },\r\n        variables: {\r\n          bar: 'Barra',\r\n          plc: 'PLC',\r\n          area: 'Area',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Linea',\r\n          long: 'Lungo',\r\n          real: 'REAL',\r\n          true: 'Attivo',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Non attivo',\r\n          float: 'Decimale',\r\n          uword: 'UWORD',\r\n          double: 'Doppio',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Booleano',\r\n          integer: 'Intero',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Esterno',\r\n          internal: 'Interno',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Un anno',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Aggiungere nuova variabile',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Un mese',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Rettangolo',\r\n          tabs: {\r\n            list: 'Lista variabili',\r\n          },\r\n          ten_years: 'Dieci anni',\r\n          two_weeks: 'Due settimane',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Sei mesi',\r\n          categorical: 'Categorico',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Qualcosa non ha funzionato durante il tentativo di creazione di una variabile. Si prega di riprovare più tardi.',\r\n          },\r\n          new_form_title: 'Nuova variabile',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Editare variabile',\r\n          new: {\r\n            fields: {\r\n              hint: '(Le modifiche potrebbero danneggiare la macchina)',\r\n              showId: 'Mostra ID variabili Campo di immissione',\r\n              maxTime: 'Tempo massimo',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Tipo di dati',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Tipo di grafico',\r\n              namePrefix: 'Prefisso nome',\r\n              variableId: 'ID variabili',\r\n              collections: '',\r\n              displayName: 'Nome display',\r\n              showInitial: 'Mostra Iniziale',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Visibilità',\r\n            },\r\n            buttons: {\r\n              delete: 'Cancellare variabile',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Prego selezionare un tempo massimo',\r\n              dataType: 'Prego selezionare un tipo di dati',\r\n              chartType: 'Prego selezionare un tipo di grafico',\r\n              namePrefix: 'Prego specificare un nome prefisso valido. (caratteri validi: A-Z, _).',\r\n              variableId: 'Prego specificare un UUID valido',\r\n              displayName: 'Prego specificare un nome display',\r\n              showInitial: 'Prego selezionare un’iniziale',\r\n              namePrefixEdit: 'Prego specificare un nome prefisso valido. (caratteri validi: A-Z a-z, _).',\r\n              visibilityType: 'Prego selezionare un tipo di visibilità',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'La variabile è stata creata con successo',\r\n          },\r\n          editError: {\r\n            message: 'Qualcosa non ha funzionato durante il tentativo di aggiornamento di una variabile. Si prega di riprovare più tardi.',\r\n          },\r\n          editSuccess: {\r\n            message: 'La variabile è stata aggiornata con successo',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Caricamenti riusciti',\r\n          downloads: 'Download riusciti',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Si è verificato un errore inatteso. Provare a ricaricare la pagina.',\r\n            },\r\n            s_1: {\r\n              message: 'Le modifiche sono state salvate.',\r\n            },\r\n            s_930: {\r\n              message: \"L’asset '%replaceValue’ è stato cancellato con successo.\",\r\n            },\r\n            s_931: {\r\n              message: \"L’azienda '%replaceValue’ è stata cancellata con successo.\",\r\n            },\r\n            s_932: {\r\n              message: \"La linea '%replaceValue’ è stata cancellata con successo.\",\r\n            },\r\n            s_933: {\r\n              message: \"La sala '%replaceValue’ è stata cancellata con successo.\",\r\n            },\r\n            s_934: {\r\n              message: \"La location '%replaceValue’ è stata cancellata con successo.\",\r\n            },\r\n            s_935: {\r\n              message: \"Il file '%replaceValue' è stato cancellato correttamente.\",\r\n            },\r\n            s_936: {\r\n              message: \"La variabile '%replaceValue' è stata cancellata correttamente.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Le cartine doppie sono state cancellate!',\r\n            add_line_to_dashboard: 'La linea è stata aggiunta alla dashboard',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limiti',\r\n            type: 'Selezionare in base al tipo',\r\n            alarms: 'Allarmi',\r\n            machine: 'Selezionare in base all’ID della macchina',\r\n            variables: 'Variabili',\r\n            listImport: 'Importazione dei limiti',\r\n            listDownload: 'Download dei limiti',\r\n          },\r\n          text: {\r\n            text: 'I valori limite sono valori che l’utente stabilisce per le variabili di interesse rilevante. Se una variabile non rientra nel range stabilito tramite i valori limite appositamente definiti, l’utente riceverà un apposito messaggio. I valori limite vengono anche visualizzati in forma di diagrammi, che vengono generati nella scheda di registro “serie storiche”.',\r\n            title: 'Limiti',\r\n          },\r\n          export: {\r\n            text: 'I valori limite impostati e vigenti al momento attuale possono essere esportati in qualsiasi momento per tutte le variabili presenti nella piattaforma cloud. Questa lista può essere utilizzata come riferimento oppure può essere utilizzata per importate in una sola volta tutti i valori limite nella sezione “importare valori limite in formato CSV”',\r\n            title: 'Limiti di esportazione come CSV',\r\n          },\r\n          import: {\r\n            text: 'È possibile importare un file CSV precedentemente scaricato contenente le informazioni relative ai limiti e agli abbonati, al fine di aggiornare i valori attualmente salvati. Sarà possibile selezionare successivamente su quali tipi di impianto o quali tipi di macchina si desidera applicare i valori limite importati',\r\n            title: 'Importare valori limite da CSV',\r\n            machines: {\r\n              title: 'Selezionare le macchine oppure il tipo di macchina sulle quali si desidera applicare i valori limite.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Selezionare il file CSV che si desidera importare',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Passare alla linea desiderata nella gestione asset.',\r\n            two: 'Nella riga dei titoli si trova un menu contestuale.',\r\n            four: 'Il riquadro della linea viene aggiunto alla dashboard.',\r\n            three: 'Cliccare sul menu contestuale e selezionare \"Aggiungi alla dashboard\".',\r\n            header: 'Aggiungere riquadri della linea',\r\n          },\r\n          individual: {\r\n            one: 'Cliccare sul simbolo della \"rotella dentata\" posto sul lato sinistro.',\r\n            two: 'Selezionare il segno \"più\".',\r\n            four: 'Confermare con \"Salva\". Il singolo riquadro viene aggiunto alla dashboard.',\r\n            three: 'Denominare il riquadro e aggiungerlo alle macchine desiderate.',\r\n            header: 'Aggiungere riquadri individuali',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Creare un nuovo utente',\r\n          new: {\r\n            title: 'Crea utente',\r\n            status: 'Stato utente:',\r\n            buttons: {\r\n              add: 'Aggiungi',\r\n              back: 'Torna alla lista',\r\n              save: 'Salva',\r\n              cancel: 'Interrompi',\r\n              delete: 'Cancella utente',\r\n              sendMail: 'Inviare nuovamente la mail',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'Gruppo di utenti',\r\n              gender: 'Genere',\r\n              created: 'Creato',\r\n              lastName: 'Cognome',\r\n              firstName: 'Nome',\r\n              breadcrumb: 'Mostra navigazione',\r\n              main_group: 'Gruppo utenti',\r\n              phoneNumber: 'Numero di telefono [optional]',\r\n              customer_org: 'Organizzazione cliente',\r\n              last_modified: 'Ultimo elaborato',\r\n              email_validation: 'E-Mail (conferma)',\r\n            },\r\n            statusText: {\r\n              unknown: 'sconosciuto',\r\n              archived: 'archiviato',\r\n              confirmed: 'confermato',\r\n              compromised: 'compromesso',\r\n              unconfirmed: 'non confermato',\r\n              reset_required: 'È necessario effettuare un reset',\r\n              external_provider: 'lavoratore esterno',\r\n              force_change_password: 'In attesa del cambio della password',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'Gli indirizzi e-mail non corrispondono.',\r\n              email_not_valid: 'Si prega di immettere un indirizzo e-mail valido.',\r\n              phone_not_specified: 'Si prega di immettere un numero di telefono valido, che inizi con un + e che sia seguito dal prefisso internazionale!',\r\n              roles_not_specified: 'Si prega di selezionare un gruppo utenti.',\r\n              gender_not_specified: 'Prego immettere un genere.',\r\n              last_name_not_specified: 'Si prega di immettere il cognome.',\r\n              first_name_not_specified: 'Si prega di immettere il nome.',\r\n              main_group_not_specified: 'Si prega di selezionare un gruppo utenti.',\r\n              family_name_not_specified: 'Si prega di immettere il cognome.',\r\n              customer_organization_not_specified: \"Si prega di selezionare un'organizzazione cliente.\",\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Fallito!',\r\n          },\r\n          mail: {\r\n            success: \"Abbiamo inviato all'indirizzo di posta elettronica indicato una e-mail con una password generata automaticamente.\",\r\n          },\r\n          update: {\r\n            title: 'Aggiorna utente',\r\n          },\r\n          success: {\r\n            title: 'Completato con successo!',\r\n            button: 'Torna alla lista',\r\n            message: \"L'utente è stato creato con successo. Abbiamo inviato all'indirizzo di posta elettronica indicato una e-mail con una password generata automaticamente.\",\r\n            message_for_edit: \"L'utente è stato aggiornato con successo.\",\r\n            message_send_mail: \"Abbiamo inviato all'indirizzo di posta elettronica indicato una e-mail con una password generata automaticamente.\",\r\n            button_back_to_last_page: \"Torna all'ultima pagina\",\r\n          },\r\n          delete: {\r\n            success: 'Cancellazione utente riuscita.',\r\n            confirmation: {\r\n              title: 'Si desidera davvero cancellare questo utente?',\r\n              confirm: 'Si, cancella questo utente',\r\n              dismiss: 'No, interrompi',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Visitatore',\r\n            customer: 'Cliente',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Utente',\r\n              email: 'E-mail',\r\n              company: 'Azienda',\r\n              enabled: 'Stato',\r\n              lastName: 'Cognome',\r\n              sw_admin: 'Amministratore SW',\r\n              firstName: 'Nome',\r\n              userRights: 'Stato diritti',\r\n              phoneNumber: 'Numero di telefono',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'maschio',\r\n              female: 'femmina',\r\n              diverse: 'altro',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Allarmi',\r\n            type: 'Selezionare in base al tipo',\r\n            machine: 'Selezionare in base all’ID della macchina',\r\n            listImport: 'Importazione allarmi',\r\n            listDownload: 'Download file allarmi',\r\n          },\r\n          text: {\r\n            text: 'Le notifiche di allarme possono essere stabilite per i numeri di allarme di interesse rilevante per l’utente. Quando su una delle macchine prestabilite si verifica l’allarme impostato, l’utente riceverà una notifica tramite apposito messaggio.',\r\n            title: 'Notifiche di allarme',\r\n          },\r\n          export: {\r\n            text: 'Le notifiche di allarme di tutte le macchine impostate e vigenti al momento attuale possono essere esportate in qualsiasi momento nella piattaforma SW CloudPlatform. Questa lista può essere utilizzata come riferimento oppure può essere utilizzata per importare in una sola volta tutte le notifiche di allarme nella sezione “importare allarmi in formato CSV”.',\r\n            title: 'Esportazione degli allarmi in formato CSV',\r\n          },\r\n          import: {\r\n            text: 'È possibile importare un file CSV precedentemente scaricato contenente le informazioni relative agli allarmi e agli abbonati, al fine di aggiornare i valori attualmente salvati. Sarà possibile selezionare successivamente su quali tipi di impianto o quali tipi di macchina si desidera applicare le notifiche di allarme importate.',\r\n            title: 'Importare allarmi da CSV',\r\n            machines: {\r\n              title: 'Selezionare le macchine oppure il tipo di macchina sulle quali si desidera applicare le notifiche di allarme.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Selezionare il file CSV che si desidera importare',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Nessun risultato trovato',\r\n          results: {\r\n            of: 'da',\r\n            lines: 'Linee',\r\n            machines: 'Macchine',\r\n          },\r\n          callToAction: 'Ricerca macchine',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Fallito',\r\n            queued: 'In coda',\r\n            removed: 'Rimosso',\r\n            canceled: 'Annullato',\r\n            rejected: 'Rifiutato',\r\n            completed: 'Completato',\r\n            succeeded: 'Completato con successo',\r\n            timed_out: 'Superamento tempo',\r\n            in_progress: 'In corso',\r\n            not_installed: 'Non installato',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Avvio importazione',\r\n            dismiss: 'Interruzione',\r\n            download: 'Avvio download',\r\n          },\r\n          tabs: {\r\n            limits: 'Limiti',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Nome',\r\n              datatype: 'tipo di dati',\r\n              chartType: 'Tipo di grafico',\r\n              displayName: 'Nome display',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Cartina mondiale',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Shopfloor',\r\n          upload: {\r\n            text1: 'Inviare un’immagine del vostro layout di shopfloor a lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'Se le vostre macchine sono registrate e inserite nella SW CloudPlatform, appariranno sulla sinistra e invieranno dati in tempo reale.',\r\n            text3: 'A questo punto basta trascinare e rilasciare lo stato sulla vostra pianta presso la macchina corretta.',\r\n            mainText: 'In questa vista è possibile impostare i vostri layout di shopfloor personalizzati e vedere le vostre macchine in diversi livelli di informazioni. Basta seguire questi passi.',\r\n            tileTitle: 'Caricamento shopfloor',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset cancellato con successo.',\r\n            confirmation: {\r\n              title: \"Si desidera davvero cancellare '%replaceValue'?\",\r\n              confirm: 'cancella',\r\n              dismiss: 'annulla',\r\n              company: {\r\n                text: 'Quando si cancella l’azienda, vengono cancellati anche tutti gli utenti appartenenti all’azienda in questione.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancella asset',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Modifiche a NamePrefix o DataType potrebbero danneggiare la macchina. Sicuri di volere salvare?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Si desidera adottare i valori limite propri di questo nuovo tipo di macchina?',\r\n              title: 'È stata effettuata una modifica del tipo di macchina',\r\n              accept: 'Si, adottare nuovi valori limite',\r\n              decline: 'No, mantenere i valori limite attuali',\r\n              dismiss: 'Interrompi',\r\n              info_accept: 'Per sovrascrivere i valori limite attuali con i valori limite propri del nuovo tipo di macchina, selezionare ‘Si’.',\r\n              info_decline: 'Per mantenere i valori limite attuali, selezionare ‘No’.',\r\n              info_accept_warning: 'I valori limite attuali vengono sovrascritti oppure cancellati.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancellare file',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancella sala',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancella linea',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Stato',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Tempo macchina',\r\n          controller_time: 'Tempo controller',\r\n          iot_gateway_time: 'Tempo IoT Gateway',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Nessun dato presente',\r\n              loading: 'Caricamento dati...',\r\n              months: [\r\n                'Gennaio',\r\n                'Febbraio',\r\n                'Marzo',\r\n                'Aprile',\r\n                'Maggio',\r\n                'Giugno',\r\n                'Luglio',\r\n                'Agosto',\r\n                'Settembre',\r\n                'Ottobre',\r\n                'Novembre',\r\n                'Dicembre',\r\n              ],\r\n              resetZoom: 'Resettare zoom',\r\n              weekdays: [\r\n                'Domenica',\r\n                'Lunedì',\r\n                'Martedì',\r\n                'Mercoledì',\r\n                'Giovedì',\r\n                'Venerdì',\r\n                'Sabato',\r\n              ],\r\n              shortMonths: [\r\n                'Gen',\r\n                'Feb',\r\n                'Mar',\r\n                'Apr',\r\n                'Mag',\r\n                'Giu',\r\n                'Lug',\r\n                'Ago',\r\n                'Set',\r\n                'Ott',\r\n                'Nov',\r\n                'Dic',\r\n              ],\r\n              shortWeekdays: [\r\n                'Dom',\r\n                'Lun',\r\n                'Mar',\r\n                'Mer',\r\n                'Gio',\r\n                'Ven',\r\n                'Sab',\r\n              ],\r\n              increaseDateRange: 'almeno fino a',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Impostazioni di default',\r\n            rangeTo: 'Fino a',\r\n            selectDateRange: 'Prego selezionare un intervallo di tempo',\r\n            predefined: {\r\n              today: 'Oggi',\r\n              custom: 'Range personalizzato',\r\n              last7days: 'Ultimi 7 giorni',\r\n              yesterday: 'Ieri',\r\n              last24Hours: 'Ultime 24 ore',\r\n              last5Minutes: 'Ultimi 5 minuti',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Editare variabile',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancellare variabile',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Selezionare la lingua',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancella azienda',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Cancella posizione',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Stato',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Configurare dashboard',\r\n            hide: {\r\n              title: 'Nascondere',\r\n            },\r\n            show: {\r\n              title: 'Visualizzare',\r\n            },\r\n            delete: {\r\n              title: 'cancella',\r\n            },\r\n            add: {\r\n              fab_title: 'Aggiungere dei propri pannelli',\r\n            },\r\n            save: {\r\n              fab_title: 'Salvare la configurazione',\r\n            },\r\n            move_left: {\r\n              title: 'Spostare nella posizione precedente',\r\n            },\r\n            move_right: {\r\n              title: 'Spostare alla posizione successiva',\r\n            },\r\n            discard: {\r\n              fab_title: 'Rigettare la configurazione',\r\n            },\r\n            add_custom_card: {\r\n              save: 'salva',\r\n              input: 'Immettere il nome del pannello',\r\n              title: 'Aggiungere dei propri pannelli',\r\n              cancel: 'interrompi',\r\n              missingMachine: \"E' necessario selezionare almeno una macchina\",\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Si è verificato un errore inatteso. Provare a ricaricare la pagina.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Informational Error',\r\n            },\r\n            e_2xx: {\r\n              message: 'Successo',\r\n            },\r\n            e_3xx: {\r\n              message: 'Inoltro',\r\n            },\r\n            e_400: {\r\n              message: 'La richiesta risulta errata; non è stato possibile elaborarla.',\r\n            },\r\n            e_401: {\r\n              message: \"L'utente non è autenticato. Si prega di effettuare nuovamente il login.\",\r\n            },\r\n            e_403: {\r\n              message: 'Non si dispone di autorizzazioni sufficienti per accedere alla risorsa richiesta.',\r\n            },\r\n            e_404: {\r\n              message: 'La risorsa richiesta non è disponibile.',\r\n            },\r\n            e_405: {\r\n              message: 'Metodo non consentito.',\r\n            },\r\n            e_406: {\r\n              message: 'Metodo non accettabile',\r\n            },\r\n            e_409: {\r\n              message: 'La risorsa è già esistente.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Metodo contenuto non processabile',\r\n            },\r\n            e_4xx: {\r\n              message: 'Errore client',\r\n            },\r\n            e_500: {\r\n              message: 'Si è verificato un errore server interno.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Errore server',\r\n            },\r\n            e_900: {\r\n              message: 'Il tentativo di creare un asset è fallito. Si prega di riprovare più tardi.',\r\n            },\r\n            e_901: {\r\n              message: \"L'azione è stata interrotta. Non è stato creato un nuovo asset.\",\r\n            },\r\n            e_902: {\r\n              message: \"L'azione è stata interrotta. Non è stata inviata alcuna richiesta di servizio.\",\r\n            },\r\n            e_903: {\r\n              message: 'Nel tentativo di inviare la richiesta di servizio si è verificato un problema. Si prega di riprovare più tardi.',\r\n            },\r\n            e_904: {\r\n              message: \"L'asset '%replaceValue' è stato creato con successo. Ora è possibile aggiungere altri asset.\",\r\n            },\r\n            e_905: {\r\n              message: \"L'azione è stata interrotta. L'asset non è stato aggiornato.\",\r\n            },\r\n            e_906: {\r\n              message: \"L'asset '%replaceValue' è stato spostato con successo.\",\r\n            },\r\n            e_910: {\r\n              message: 'Il tentativo di creare un utente è fallito. Si prega di riprovare più tardi.',\r\n            },\r\n            e_911: {\r\n              message: \"L'azione è stata interrotta. Non è stato creato alcun nuovo utente.\",\r\n            },\r\n            e_912: {\r\n              message: 'Il tentativo di aggiornare un asset è fallito. Si prega di riprovare.',\r\n            },\r\n            e_920: {\r\n              message: \"L'azione è stata interrotta. Le modifiche non sono state salvate.\",\r\n            },\r\n            e_921: {\r\n              message: 'Si è verificato un errore inatteso. Si prega di riprovare.',\r\n            },\r\n            e_922: {\r\n              message: 'Il nome utente e/o la password non sono corretti. Si prega di riprovare.',\r\n            },\r\n            e_923: {\r\n              message: 'Si prega di immettere un nome utente e una password.',\r\n            },\r\n            e_924: {\r\n              message: 'La sessione è scaduta a causa di inattività prolungata. Si prega di effettuare nuovamente il login.',\r\n            },\r\n            e_925: {\r\n              message: 'Per potere utilizzare la SW Cloud Platform è necessario accettare la nostra dichiarazione sulla protezione dei dati.',\r\n            },\r\n            e_926: {\r\n              message: 'Il Vostro account è temporaneamente bloccato. Si prega di riprovare tra qualche minuto.',\r\n            },\r\n            e_927: {\r\n              message: 'La Vostra password è stata modificata con successo.',\r\n            },\r\n            e_928: {\r\n              message: \"L'azione è stata interrotta. Non è stato caricato alcun file.\",\r\n            },\r\n            e_929: {\r\n              message: 'Nel tentativo di caricare un file si è verificato un problema. Si prega di riprovare più tardi.',\r\n            },\r\n            e_930: {\r\n              message: 'Nel tentativo di cancellare un file si è verificato un problema. Si prega di riprovare più tardi.',\r\n            },\r\n            e_931: {\r\n              message: 'Il range personalizzato per la data è troppo grande. É impostato un default di 24H',\r\n            },\r\n            e_932: {\r\n              message: \"L'asset ha degli elementi subordinati. Cancellare prima gli elementi subordinati.\",\r\n            },\r\n            e_933: {\r\n              message: \"La variabile '%replaceValue' è stata creata correttamente. È ora possibile aggiungere un’altra variabile.\",\r\n            },\r\n            e_934: {\r\n              message: 'Qualcosa non ha funzionato durante il tentativo di cancellazione della variabile. Si prega di riprovare più tardi.',\r\n            },\r\n            e_10500: {\r\n              message: 'Sembra non sia presente alcuna connessione a internet. Assicurarsi che sia presente una connessione.',\r\n            },\r\n            e_10501: {\r\n              message: 'State utilizzando un browser non supportato. Si prega di utilizzare uno dei seguenti browser: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: \"L'asset (numero macchina SW %replaceValue) è già esistente.\",\r\n            },\r\n            e_410_asset: {\r\n              message: 'Questo nome file %replaceValue è già esistente',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Possono essere selezionati solo %s elementi contemporaneamente',\r\n              title: 'Numero massimo raggiunto',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Filtro tempo',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Nessun file disponibile.',\r\n              file_cardTitle: 'Eventi macchina',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Dati download',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'File di traccia NC',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Nessun allarme disponibile',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'File di confronto NC',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'File di dati NC',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Nessun file disponibile.',\r\n              file_cardTitle: 'File ToolMon',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Download dati ToolMon',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Grilletto',\r\n              column_title_filename: 'Nome del file',\r\n              column_title_creation_date: 'Data di creazione',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'File registratore di volo HMI',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  ko: {\r\n    translation: {\r\n      generic: {\r\n        logout: '로그아웃',\r\n        release: '%replaceValue1에서 %replaceValue2까지 플랫폼에서 유지보수 작업이 수행될 예정입니다. 이 기간 동안 플랫폼을 일부 이용할 수 없을 것입니다.',\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: '닫기',\r\n        acceptLabel: '동의',\r\n        userProfile: '사용자 프로필',\r\n        button: {\r\n          clear: '차트 제거',\r\n          timeline: '한계(값) 조정',\r\n          separateCharts: '차트 분리',\r\n        },\r\n        declineLabel: '거절',\r\n        backToDashboard: '대시보드로 돌아가기',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / 표준',\r\n          },\r\n          contact: {\r\n            url: '이메일 주소: lifedata@sw-machines.com',\r\n            title: '문의처',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: '임프린트',\r\n          },\r\n          privacy: {\r\n            title: '개인정보',\r\n            header: '개인정보 보호정책',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/en/',\r\n            title: 'SW 홈페이지',\r\n          },\r\n        },\r\n        noInternetConnection: '인터넷에 연결되어 있지 않은 것 같습니다. 인터넷에 연결되어 있는지 확인해 보십시오.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: '중',\r\n          noData: '데이터 없음',\r\n          dateFormat: '월/일/연도',\r\n          downloaded: '다운로드됨',\r\n          noDuration: '이용할 수 있는 기간 없음',\r\n          timeFormat: '시:분:초 오전/오후',\r\n          notLicensed: '기계에 라이선스가 없습니다.',\r\n          alarmPending: '대기 중인 알람',\r\n          buttons: {\r\n            back: '돌아가기',\r\n            save: '저장',\r\n            view: '보기',\r\n            cancel: '취소',\r\n            custom: '저장 + 사용자 지정 범위 설정',\r\n            submit: '제출하기',\r\n            export: {\r\n              limit: '한계(값) 다운로드하기',\r\n              alarms: '알람 다운로드하기',\r\n            },\r\n            import: {\r\n              limit: '시작',\r\n              alarms: '시작',\r\n            },\r\n            refreshReset: '기본 시간으로 재설정',\r\n            selectAllCheckboxes: '모든 체크박스 선택',\r\n            unselectAllCheckboxes: '모든 체크박스 선택 해제',\r\n          },\r\n          notAvailable: '이용 불가',\r\n          notConnected: '아직 연결되지 않음',\r\n          download: {\r\n            file: '파일 다운로드',\r\n          },\r\n          dateTimeFormat: '월/일/연도 시:분:초 오전/오후',\r\n          timeFormats: {\r\n            day: '일',\r\n            days: '일',\r\n            hour: '시',\r\n            year: '년',\r\n            hours: '시',\r\n            month: '월',\r\n            years: '년',\r\n            minute: '분',\r\n            months: '개월',\r\n            second: '초',\r\n            minutes: '분',\r\n            seconds: '초',\r\n          },\r\n          notAvailableShort: '해당 없음',\r\n          timeFormatDuration: '시:분:초',\r\n          timeFormatWithoutSeconds: '시:분 오전/오후',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: '이해했습니다',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: '이 작업은 되돌릴 수 없습니다!',\r\n        },\r\n        error: {\r\n          upload: '업로드 실패',\r\n          download: '다운로드 실패',\r\n          message: {\r\n            enrollment_code_409: '장치가 이미 AWS에 등록되어 있습니다.',\r\n            limit_change_failed: '한계(값)를 변경하는 중 오류가 발생했습니다. 다시 시도하거나 lifedata@sw-machines.com로 문의해 주십시오',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: '시간 기록',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: '변수 선택',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: '날짜',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: '안전한 동반 접속',\r\n            directAccess: '직접 접속',\r\n            new: {\r\n              fields: {\r\n                id: 'ID 입력',\r\n                cOnePanel: 'C|One 사용',\r\n                sessionType: '세션 유형',\r\n              },\r\n              error_messages: {\r\n                id: '세션 ID 또는 장치 ID를 입력해 주십시오',\r\n                sessionType: '세션 유형을 선택해 주십시오',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPI',\r\n              list: '기계',\r\n              shopfloor: '생산 현장',\r\n            },\r\n            fab_title: '새 생산 라인 추가',\r\n            grid: {\r\n              hall: '작업장',\r\n              line: '생산 라인',\r\n              type: '유형',\r\n              contractEnd: '계약 종료',\r\n              cellPosition: '셀 / 위치',\r\n              operationStep: '공정 단계',\r\n              machineIdentifierSw: '기계 번호(SW)',\r\n              machineIdentifierCustomer: '기계 이름',\r\n            },\r\n            success: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '생산 라인이 성공적으로 생성되었습니다.',\r\n            },\r\n            new_form_title: '생산 라인 추가',\r\n            edit_form_title: '생산 라인 편집',\r\n            new: {\r\n              fields: {\r\n                name: '생산 라인 이름',\r\n                name_short: '생산 라인 이름(약칭)[옵션]',\r\n                description: '설명[옵션]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '생산 라인 이름을 지정해 주십시오',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '생산 라인이 성공적으로 업데이트되었습니다.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: '새 작업장 추가',\r\n            grid: {\r\n              part: '부품',\r\n              lineName: '생산 라인',\r\n              typeOfLoading: '로딩 유형',\r\n              lineResponsible: '생산 라인 매니저',\r\n              plannedQuantity: '계획 수량',\r\n              numberOfMachines: '# 기계',\r\n            },\r\n            tabs: {\r\n              list: '생산 라인',\r\n              shopfloor: '생산 현장',\r\n            },\r\n            success: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '작업장이 성공적으로 생성되었습니다.',\r\n            },\r\n            new_form_title: '작업장 추가',\r\n            shopfloor: {\r\n              edit: '모드 편집',\r\n              configure: {\r\n                save: {\r\n                  fab_title: '구성 저장',\r\n                },\r\n                discard: {\r\n                  fab_title: '구성 버리기',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: '작업장 편집',\r\n            new: {\r\n              fields: {\r\n                name: '작업장 이름',\r\n                name_short: '작업장 이름(약칭)[옵션]',\r\n                description: '설명[옵션]',\r\n                description_external: '설명(외부l)[옵션]',\r\n                description_internal: '설명(내부)[옵션]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '작업장 이름을 지정해 주십시오',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '작업장이 성공적으로 업데이트되었습니다.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: '설명[옵션]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: '새 Asset 추가',\r\n            tabs: {\r\n              info: '시계열',\r\n              alarms: '알람',\r\n              events: '기계 이벤트',\r\n              gateway: '게이트웨이',\r\n              service: '서비스',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: '스윔레인',\r\n              'axis-test': '축 테스트',\r\n              collection: '컬렉션',\r\n              technology: '테크놀로지',\r\n              maintenance: '유지관리',\r\n              performance: '성능',\r\n              spindledata: '스핀들 데이터',\r\n              remoteaccess: '원격 접속',\r\n              enduranceTest: '생산 라인 최종 테스트',\r\n              administration: '관리',\r\n              y_title: {\r\n                status: '상태',\r\n                status_table_one: '테이블 1',\r\n                status_table_two: '테이블 2',\r\n              },\r\n              energymonitoring: '에너지 모니터링',\r\n              technology_undefined: '정의되지 않음',\r\n              technology_undefined_condition: '정의되지 않은 조건!',\r\n            },\r\n            move: {\r\n              message: \"Asset '%replaceValue'를 새 회사, 위치, 작업장 및/또는 생산 라인으로 지금 이동할 수 있습니다.\",\r\n              select_hall_label: '새 작업장 선택',\r\n              select_line_label: '새 생산 라인 선택',\r\n              select_company_label: '새 회사 선택',\r\n              select_location_label: '새 위치 선택',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: '기계 번호(SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: '기계 가동 시작일[옵션]',\r\n                shipping: '기계 선적일[옵션]',\r\n                controller: '컨트롤러',\r\n                machine_type: '기계 유형',\r\n                warranty_end: '기계 보증 만료[옵션]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: '시스템 관리자',\r\n                warranty_start: '기계 보증 시작[옵션]',\r\n                machine_swmp_api: '기계 SWMP api 만료[옵션]',\r\n                machine_swsp_trace: '기계 SWSP 추적 만료[옵션]',\r\n                machine_swcp_portal: '기계 SWCP 포털 만료[옵션]',\r\n                start_of_production: '기계 생산 시작[옵션]',\r\n                machine_swcp_support: '기계 SWCP 지원 만료[옵션]',\r\n                machine_cell_position: '기계 셀 / 위치[옵션]',\r\n                machine_swsp_line_mon: '기계 SWSP lineMon 만료[옵션]',\r\n                machine_identifier_customer: '기계 ID(고객사)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '유효한 SW 기계 번호를 지정해 주십시오(최소 7자리: A-Z, 0-9, -)',\r\n                controller_not_specified: '컨트롤러를 선택해 주십시오',\r\n                machine_type_not_specified: '기계 유형을 입력해 주십시오',\r\n                machine_identifier_customer_not_specified: '고객사 기계 ID를 입력해 주십시오',\r\n              },\r\n            },\r\n            success: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: 'Asset이 성공적으로 생성되었습니다.',\r\n            },\r\n            new_form_title: '새 Asset',\r\n            edit_form_title: 'Asset 편집',\r\n            move_form_title: 'Asset 이동',\r\n            editSuccess: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: 'Asset이 성공적으로 업데이트되었습니다.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP 추적',\r\n                portal: 'SWCP 포털',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP 지원',\r\n                shipping: '선적일',\r\n                controller: '컨트롤러',\r\n                contractEnd: '계약 종료일',\r\n                machineType: '기계 유형',\r\n                startupDate: '가동 시작',\r\n                warrantyEnd: '보증 만료',\r\n                cellPosition: '기계 셀 / 위치',\r\n                warrantyStart: '보증 시작',\r\n                customerNumber: '고객사 번호',\r\n                enrollmentConfig: '등록 구성',\r\n                startOfProduction: '생산 시작',\r\n                machineIdentifierSw: 'SW 기계 번호',\r\n                enrollmentConfigDownload: '다운로드',\r\n                machineIdentifierCustomer: '고객사 기계 이름',\r\n              },\r\n            },\r\n            technology: {\r\n              change: '변경',\r\n              g_mode: 'G 기능',\r\n              off_time: '보조 공정 시간',\r\n              no_change: '교환 없음',\r\n              undefined: '정의되지 않음',\r\n              active_tool: '활성 공구',\r\n              tool_change: '공구 교환',\r\n              machining_time: '가공 시간',\r\n              tool_change_time: '공구 교환 시간',\r\n              pie: {\r\n                chart: {\r\n                  name_one: '공정 시간 테이블 1',\r\n                  name_two: '공정 시간 테이블 2',\r\n                  name_one_undefined: '정의되지 않은 공정 시간 테이블 1',\r\n                  name_two_undefined: '정의되지 않은 공정 시간 테이블 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q 축 및 스핀들',\r\n              undefined_gmode_data: 'G 기능 데이터 정의되지 않음',\r\n              auxiliary_process_time: '보조 공정 시간',\r\n              undefined_activetool_data: '활성 공구 데이터 정의되지 않음',\r\n              undefined_tool_change_data: '공구 교환 데이터 정의되지 않음',\r\n              undefined_machining_time_table_one: '정의되지 않은 조건 테이블 1',\r\n              undefined_machining_time_table_two: '정의되지 않은 조건 테이블 2',\r\n              machining_auxiliary_tool_changing_table_one: {\r\n                aggregated: '누적 가공, 공구 교환 & 보조 공정 시간 테이블 1 ',\r\n              },\r\n              machining_auxiliary_tool_changing_table_two: {\r\n                aggregated: '누적 가공, 공구 교환 & 보조 공정 시간 테이블 2',\r\n              },\r\n            },\r\n            add_line_to_dashboard: '대시보드에 생산 라인 추가',\r\n            elements: {\r\n              gateway: {\r\n                title: '게이트웨이',\r\n                contact: '오류 발생 시 문의해 주십시오',\r\n                headline: '게이트웨이',\r\n                netcfg: {\r\n                  cta: 'Netcfg 양식을 통해 저희에게 데이터를 제공해 주십시오.',\r\n                  intro: '기계를 연결하려면 사용자의 네트워크 구성에 대한 정보가 필요합니다.',\r\n                  title: '네트워크 구성',\r\n                  goToNetconfig: '네트워크 구성 열기',\r\n                },\r\n                device: {\r\n                  title: '장치 세부 정보',\r\n                },\r\n                enrollment: {\r\n                  pic: 'IoT 게이트웨이가 다음과 같이 보이면 다음 단계를 수행해 주십시오:',\r\n                  line1: '타일 하단에 있는 버튼을 클릭하여 등록 파일을 다운로드합니다.',\r\n                  line2: '다운로드는 자동으로 시작됩니다.',\r\n                  line3: '.json 파일을 USB 스틱에 있는 루트 디렉토리로 옮겨 저장합니다. 파일 이름이 지정되었는지 확인합니다',\r\n                  line4: '.Json 등록',\r\n                  line5: 'USB 스틱의 루트에 다음과 같은 파일이 들어 있는지 확인합니다:',\r\n                  line6: 'USB 스틱을 해당 IoT 게이트웨이에 꽂습니다.',\r\n                  line7: '등록은 자동으로 시작되고, 사용자 LED가 녹색으로 깜빡임으로 이를 표시합니다.',\r\n                  line8: '등록이 성공하면 USB 스틱을 제거할 때까지 녹색 LED가 켜진 상태를 유지합니다.',\r\n                  title: '등록',\r\n                  button: '등록 파일',\r\n                },\r\n                deviceMigration: {\r\n                  line1: '파일을 다운로드한 후, 그 내용물을 비어 있는 USB 스틱에 바로 압축 해제합니다',\r\n                  line2: 'aws.json',\r\n                  line3: '을 다운로드하고',\r\n                  line4: ' 다운로드한 내용을 USB 스틱으로 바로 옮겨 저장합니다. 파일 이름이 지정되었는지 확인합니다',\r\n                  line5: 'USB 스틱의 루트에 다음과 같은 파일이 들어 있는지 확인합니다:',\r\n                  line6: 'install.json',\r\n                  line7: 'aws-migrate-iot.tar.gz',\r\n                  line8: 'aws-migrate-iot.tar.gz.sig',\r\n                  line9: 'aws.json',\r\n                  title: '플랫폼 마이그레이션 및 등록',\r\n                  line10: '해당 파일들은 2023년 10월 27일자로 수정되었습니다. 반드시 다시 다운로드하고 이전 버전을 사용하지 마시기 바랍니다.',\r\n                  line11: 'USB 스틱을 해당 IoT 게이트웨이에 꽂습니다.',\r\n                  line12: '소프트웨어가 자동으로 실행되며, 노란색 LED가 깜빡임으로 이를 표시합니다.',\r\n                  line13: '마이그레이션이 성공하면 USB 스틱을 제거할 때까지 녹색 LED가 켜진 상태를 유지합니다.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: '생성',\r\n                headline: '시계열',\r\n                noChartMessage: \"왼쪽에서 하나 이상의 변수를 선택하고 '생성'을 클릭하여 지표를 표시합니다\",\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              'axis-test': {\r\n                unit: '단위',\r\n                value: '값',\r\n                kpiUnit: '단위',\r\n                headline: '축 테스트',\r\n                kpiValue: '값',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: '브라우저 스토리지에서 불러오기',\r\n                limitsSave: '브라우저 스토리지에 저장하기',\r\n                selectAxis: '축 선택',\r\n                limitsExport: '클립보드로 한계(값) 내보내기',\r\n                openAxistest: '축 테스트 열기',\r\n                axisTestPlural: '축 테스트',\r\n                adjustments: {\r\n                  add: '로컬 조정 추가',\r\n                  range: '범위',\r\n                  header: '로컬 조정',\r\n                  remove: '제거',\r\n                  position: '위치',\r\n                  amplitude: '진폭',\r\n                  spreadMultiplier: '한계(값) 승수',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: '위치',\r\n                    y: '전류',\r\n                    up: '양의 방향',\r\n                    down: '음의 방향',\r\n                    limitsUp: '양의 방향 한계(값)',\r\n                    limitsDown: '음의 방향 한계(값)',\r\n                    sliderSlopeCenter: '경사 가공 원점',\r\n                    sliderSlopeFactor: '경사 보정 계수',\r\n                    sliderVerticalOffset: 'Y 오프셋',\r\n                    sliderVerticalSpread: '한계(값) 폭',\r\n                    sliderQuadraticCenter: '이차 원점',\r\n                    sliderQuadraticFactor: '이차 인수',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: '시계 방향',\r\n                    limitsClockwise: '시계 방향 한계(값)',\r\n                    counterClockwise: '시계 반대 방향',\r\n                    sliderSineOffset: '파동 오프셋',\r\n                    sliderSineAmplitude: '파동 진폭',\r\n                    sliderSineFrequency: '파동 주파수',\r\n                    sliderVerticalOffset: 'Y 오프셋',\r\n                    sliderVerticalSpread: '한계(값) 폭',\r\n                    limitsCounterClockwise: '시계 반대 방향 한계(값)',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: '속도',\r\n                  pulseMaxRampUp: '램프 ->',\r\n                  pulseMaxRampDown: '램프 <-',\r\n                  pulseMaxStiffness: '최대 강성',\r\n                  pulseMinStiffness: '최소 강성',\r\n                  pulseMeanStiffness: '강성 Ø',\r\n                  circularReversalRange: '원형 히스테리시스',\r\n                  pulseMaxUpPathCurrent: '최대 전류 ->',\r\n                  pulseMinUpPathCurrent: '최소 전류 ->',\r\n                  pulseMeanUpPathCurrent: '전류 Ø ->',\r\n                  pulseMaxDownPathCurrent: '최대 전류 <-',\r\n                  pulseMinDownPathCurrent: '최소 전류 <-',\r\n                  pulseMeanDownPathCurrent: '전류 Ø <-',\r\n                  circularShapeDeviationClockwise: '시계 방향 원형 편차',\r\n                  pulseStiffnessStandardDeviation: '강성 σ',\r\n                  pulseStandardDeviationUpPathCurrent: '전류 σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: '전류 σ <-',\r\n                  circularShapeDeviationCounterClockwise: '시계 반대 방향 원형 편차',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: '진원도',\r\n                  EQUABILITY: '균등성',\r\n                  CIRCULARITY: '진원도',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: '이용 가능한 축 테스트 없음',\r\n                },\r\n              },\r\n              alarms: {\r\n                headline: '알람 지도',\r\n              },\r\n              service: {\r\n                contact: '문의해 주십시오',\r\n                headline: '서비스',\r\n                update: {\r\n                  title: '업데이트 파일',\r\n                },\r\n                upload: {\r\n                  title: '파일 업로드',\r\n                  fields: {\r\n                    file: '파일',\r\n                    language: '파일 언어',\r\n                    file_name: '파일 이름',\r\n                    list_of_languages: {\r\n                      cz: '체코어',\r\n                      de: '독일어',\r\n                      en: '영어',\r\n                      es: '스페인어',\r\n                      fr: '프랑스어',\r\n                      hu: '헝가리어',\r\n                      it: '이탈리아어',\r\n                      ko: '한국어',\r\n                      pl: '폴란드어',\r\n                      tr: '튀르키예어',\r\n                      zh: '중국어',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: '업로드',\r\n                    cancel: '취소',\r\n                  },\r\n                  success: {\r\n                    title: '성공',\r\n                    button: '서비스 전체 보기로 돌아가기',\r\n                    message: '파일이 성공적으로 업로드되었습니다.',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: '파일명을 지정해 주십시오',\r\n                    file_not_valid: '파일을 지정해 주십시오 / 더 작은 파일을 선택해 주십시오.',\r\n                    language_not_specified: '파일 언어를 지정해 주십시오.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: '매뉴얼',\r\n                },\r\n                version: {\r\n                  title: '버전 파일',\r\n                },\r\n                contracts: {\r\n                  title: '계약',\r\n                },\r\n                components: {\r\n                  title: '하드웨어 및 소프트웨어 컴포넌트',\r\n                },\r\n                spare_parts: {\r\n                  title: '예비 부품',\r\n                },\r\n                consumeables: {\r\n                  title: '소모품',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: '업데이트',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: '기계를 원격 접속으로 활성화하려면 IoT 게이트웨이에 TeamViewer가 설치되어 있어야 합니다.',\r\n                  line2: '아직 설치되지 않은 경우라면 “설치”를 클릭하여 TeamViewer를 설치합니다.',\r\n                  title: '원격 지원 설치',\r\n                  status: '배포 상태',\r\n                  copy: {\r\n                    button: '링크 복사',\r\n                  },\r\n                  install: {\r\n                    button: 'TeamViewer 설치',\r\n                  },\r\n                  session: {\r\n                    button: '세션 시작',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: '소프트웨어 IoT-게이트웨이',\r\n                  values: {\r\n                    box_id: '박스 ID',\r\n                    machine_connect: '기계 연결',\r\n                    operating_system: '작동 시스템',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: '기계와 관련하여 도움이 필요하신가요?',\r\n                  line2: '저희에게 문의하십시오!',\r\n                  title: 'SW 서비스팀에 보내는 메시지',\r\n                  button: '서비스 문의',\r\n                  fields: {\r\n                    name: '기계 식별자(SW)',\r\n                    type: '유형',\r\n                    email: '이메일',\r\n                    message: '메시지',\r\n                    phone_no: '전화 번호',\r\n                    last_name: '성',\r\n                    first_name: '이름',\r\n                    contact_person: '담당자(SW)[옵션]',\r\n                    list_of_types: {\r\n                      request: '요청',\r\n                      service: '서비스',\r\n                      retrofit: '개조',\r\n                      expansion: '확장',\r\n                      inspection: '점검',\r\n                    },\r\n                    machine_identifier_customer: '기계 식별자(고객사)[옵션]',\r\n                  },\r\n                  buttons: {\r\n                    send: '요청 보내기',\r\n                    cancel: '취소',\r\n                  },\r\n                  success: {\r\n                    title: '성공',\r\n                    button: '서비스 전체 보기로 돌아가기',\r\n                    message: '요청이 성공적으로 SW 서비스 센터에 전송되었습니다.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: '유효한 이메일 주소를 지정해 주십시오',\r\n                    name_not_specified: '유효한 SW 기계 번호를 지정해 주십시오(최소 7자리: A-Z, 0-9, - _)',\r\n                    phone_not_specified: '전화 번호를 입력해 주십시오',\r\n                    message_not_specified: '메시지를 입력해 주십시오',\r\n                    last_name_not_specified: '성을 입력해 주십시오',\r\n                    first_name_not_specified: '이름을 입력해 주십시오',\r\n                    family_name_not_specified: '성을 입력해 주십시오',\r\n                    contact_type_not_specified: '요청 유형을 지정해 주십시오',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: '기계 소프트웨어',\r\n                  values: {\r\n                    nc_version: 'NC 버전',\r\n                    hmi_version: 'HMI 버전',\r\n                    plc_version: 'PLC 버전',\r\n                    compile_cycles: '컴파일 사이클',\r\n                    operating_system: '작동 시스템',\r\n                    pcu_base_version: 'PCU 기본 버전',\r\n                    plc_toolbox_version: 'PLC 툴박스 버전',\r\n                    plc_user_program_version: 'PLC 사용자 프로그램 버전',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: '파일 이름이 성공적으로 업데이트되었습니다.',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: '원격 지원',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: '서비스 어시스턴트 공간에서는 다양한 문제 해결 과정을 안내받을 수 있습니다.',\r\n                  title: '서비스 어시스턴트',\r\n                  sub_title: '현재 귀사의 Asset 중 하나에 문제가 있으신가요?',\r\n                  open_assistant: '서비스 어시스턴트 열기',\r\n                  request_account: '계정 요청',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: '스핀들 통계(SpiStat)',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT 게이트웨이',\r\n                labelOnline: '켜짐',\r\n                labelOffline: '꺼짐',\r\n              },\r\n              swimlane: {\r\n                headline: '스윔레인',\r\n              },\r\n              endurance: {\r\n                headline: '생산 라인 최종 테스트',\r\n                chartTitles: {\r\n                  runtime: '런타임 데이터',\r\n                  endurance: '생산 라인 최종 테스트',\r\n                  operation: '작동 모드',\r\n                  qaxis_180: 'Q 축 180°',\r\n                  nc_program: 'NC 프로그램',\r\n                  stacklights: '3색 스택라이트',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: '전송 상태',\r\n                aborted: '중단됨',\r\n                sending: '전송 중',\r\n                undefined: '정의되지 않음',\r\n                interrupted: '중단됨',\r\n              },\r\n              alarms_map: {\r\n                headline: '알람 지도',\r\n              },\r\n              collection: {\r\n                headline: '컬렉션',\r\n                noChartMessage: '왼쪽에서 컬렉션 중 하나를 선택해 주십시오.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: '합계',\r\n                  header: '성능 Kpi',\r\n                  target: '목표',\r\n                },\r\n                alarms: {\r\n                  title: '알람',\r\n                  category: [\r\n                    '분류되지 않음',\r\n                    '오류 메시지',\r\n                    '작동 메시지',\r\n                    '상태 메시지',\r\n                    '작동 지침',\r\n                  ],\r\n                  icons: {\r\n                    trend: '추세',\r\n                    duration: '기간',\r\n                    flatlist: '단일 목록',\r\n                    frequency: '빈도',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: '시간',\r\n                    trend: '추세',\r\n                    duration: '기간',\r\n                    leftTime: '남은 시간',\r\n                    alarmCount: '횟수',\r\n                    alarmNumber: '알람 번호',\r\n                    description: '설명',\r\n                    alarmOccured: '알람 발생함',\r\n                    alarmClassification: '알람 분류',\r\n                    alarmCountSecondRange: '직전 알람 횟수',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: '증가',\r\n                      down: '감소',\r\n                      flat: '변화 없음',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: '세부 정보',\r\n                  ncProgram: 'NC 프로그램',\r\n                  lastModified: '최근 수정일',\r\n                  machineState: '기계 상태',\r\n                  numberAlarms: '대기 중인 알람',\r\n                  stopCondition: '중지 조건',\r\n                  ncProgramState: 'NC 프로그램 상태',\r\n                  protectionLevel: '보호 수준',\r\n                  ncProgramStates: [\r\n                    '중단됨',\r\n                    '정지됨',\r\n                    '실행 중',\r\n                    '대기 중',\r\n                    '중단됨',\r\n                  ],\r\n                  protectionLevels: [\r\n                    '시스템',\r\n                    '제조업체',\r\n                    '서비스',\r\n                    '사용자',\r\n                    '키 스위치 위치 3',\r\n                    '키 스위치 위치 2',\r\n                    '키 스위치 위치 1',\r\n                    '키 스위치 위치 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: '사이클 시간',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '사이클 시간(초)',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: '양호',\r\n                  nok: '불량',\r\n                  sum: '합계',\r\n                  title: '부품 수량 카운터',\r\n                  titleDayCounter: '일일 카운터',\r\n                  titleShiftCounter: '시프트 카운터',\r\n                  titleTotalCounter: '총 카운터',\r\n                  titleTotalCounterSmall: '총계',\r\n                },\r\n                availability: {\r\n                  title: '가용성',\r\n                  kpi: {\r\n                    title: '가용성 KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: '자동',\r\n                    JOG_with_error: '오류 발생한 JOG',\r\n                    MDA_with_error: '오류 발생한 MDA',\r\n                    JOG_without_error: '오류 없는 JOG',\r\n                    MDA_without_error: '오류 없는 MDA',\r\n                    not_defined_condition: '상태 미정',\r\n                    auto_no_program_active: '자동: 활성 프로그램 없음',\r\n                    auto_waiting_for_parts: '자동: 부품 대기 중',\r\n                    auto_with_error_program_stopped: '자동: 오류 발생 - 프로그램 중지됨',\r\n                    auto_waiting_for_parts_stopping_error: '자동: 부품 대기 중 + 중지 오류',\r\n                  },\r\n                  aggregated: {\r\n                    title: '누적 가용성',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '가용성',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: '상태',\r\n                },\r\n                operationMode: {\r\n                  title: '작동 모드',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '작동 모드',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: '런타임 모니터',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '프로그램',\r\n                      labels: {\r\n                        on: '켜짐',\r\n                        off: '꺼짐',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: '스핀들 오버라이드',\r\n                },\r\n                feedrateOverride: {\r\n                  title: '이송 속도 오버라이드',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: '가동 시간 분포',\r\n                },\r\n              },\r\n              administration: {\r\n                title: '관리',\r\n                headline: '관리',\r\n                aws: {\r\n                  title: 'AWS 링크',\r\n                },\r\n                groups: {\r\n                  title: '사물 그룹',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: '시스템 관리자',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: '자재 명세서',\r\n                },\r\n                component: {\r\n                  title: '컴포넌트',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: '유지관리',\r\n              },\r\n              spindleData: {\r\n                headline: '스핀들 데이터',\r\n              },\r\n              remoteaccess: {\r\n                headline: '원격 접속',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: '알람 발생 전 시간(초)',\r\n                  },\r\n                  yAxis: {\r\n                    title: '알람 발생 후 시간(초)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: '에너지 모니터링',\r\n                chartTitles: {\r\n                  air: '압축 공기 소비량',\r\n                  current: '현재 소비량',\r\n                  consumption: '시간당 평균 소비량',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: '상태 모니터링',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: '새 회사 추가',\r\n            grid: {\r\n              city: '도시',\r\n              email: '이메일',\r\n              street: '도로명',\r\n              country: '국가',\r\n              website: '웹사이트',\r\n              postalCode: '우편번호',\r\n              locationName: '위치',\r\n              locationCustomerNumber: '고객사 번호',\r\n            },\r\n            tabs: {\r\n              list: '위치',\r\n              worldmap: '세계 지도',\r\n            },\r\n            success: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '회사가 성공적으로 생성되었습니다.',\r\n            },\r\n            toggle_switch: '동일한 데이터를 사용하여 회사 위치를 생성합니다',\r\n            new_form_title: '회사 추가',\r\n            edit_form_title: '회사 편집',\r\n            new: {\r\n              fields: {\r\n                city: '도시',\r\n                name: '회사 이름',\r\n                email: '이메일[옵션]',\r\n                state: '도[옵션]',\r\n                street: '도로명',\r\n                country: '국가',\r\n                website: '웹사이트[옵션]',\r\n                zipcode: '우편번호',\r\n                legal_form: '법적 형태[옵션]',\r\n                name_short: '회사 이름(약칭)[옵션]',\r\n                description: '설명[옵션]',\r\n                company_logo: '회사 로고(URL)[옵션]',\r\n                customer_number: '고객사 번호',\r\n                industry_sector: '산업 분야',\r\n                description_external: '설명(외부l)[옵션]',\r\n                description_internal: '설명[옵션]',\r\n              },\r\n              error_messages: {\r\n                url: '유효한 URL을 지정해 주십시오',\r\n                email: '유효한 이메일 주소를 입력해 주십시오',\r\n                city_not_specified: '도시를 지정해 주십시오',\r\n                name_not_specified: '회사 이름을 지정해 주십시오',\r\n                street_not_specified: '주소를 지정해 주십시오',\r\n                country_not_specified: '원산지를 선택해 주십시오',\r\n                zipcode_not_specified: '우편번호를 지정해 주십시오',\r\n                customer_number_not_specified: '고객사 번호를 입력해 주십시오',\r\n                industry_sector_not_specified: '산업 분야를 선택해 주십시오',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '회사가 성공적으로 업데이트되었습니다.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: '이메일',\r\n                address: '주소',\r\n                country: '국가',\r\n                website: '웹사이트',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'CloudPlatform은 위도와 경도를 사용하여 지도 상에 회사를 표시합니다.',\r\n              intro_heading: '위치 관련 정보',\r\n              location_name: '위치명:',\r\n              label_latitude: '위도',\r\n              label_longitude: '경도',\r\n              text_fallback_info: '좌표가 설정되지 않았으면 기본 좌표가 사용됩니다.',\r\n              text_location_found: '위치를 찾았습니다.',\r\n              text_location_entered: '위치가 입력되었습니다.',\r\n              text_success_location: '입력 내용을 바탕으로 다음과 같은 정보가 설정되었습니다:',\r\n              button_define_coordinates: '사용자가 좌표를 직접 정의합니다',\r\n              text_no_coordinates_found: '입력한 데이터에 대한 좌표를 찾을 수 없습니다.',\r\n              text_coordinates_success_set: '좌표가 성공적으로 설정되었습니다.',\r\n              button_set_custom_coordinates: '사용자 지정 좌표를 설정합니다',\r\n              text_specify_coordinates_yourself: '사용자가 좌표를 직접 구체적으로 지정할 수 있습니다.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: '새 위치 추가',\r\n            tabs: {\r\n              list: '작업장',\r\n              shopfloor: '생산 현장',\r\n            },\r\n            grid: {\r\n              hallName: '작업장',\r\n            },\r\n            success: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '위치가 성공적으로 생성되었습니다.',\r\n            },\r\n            new_form_title: '위치 추가',\r\n            edit_form_title: '위치 편집',\r\n            new: {\r\n              fields: {\r\n                city: '도시',\r\n                name: '위치 이름',\r\n                email: '이메일[옵션]',\r\n                state: '도[옵션]',\r\n                street: '도로명',\r\n                country: '국가',\r\n                website: '웹사이트[옵션]',\r\n                zipcode: '우편번호',\r\n                language: '사용 언어[옵션]',\r\n                name_short: '위치 이름(약칭)[옵션]',\r\n                description: '설명[옵션]',\r\n                customer_number: '고객사 번호[옵션]',\r\n                description_internal: '설명(내부)[옵션]',\r\n              },\r\n              error_messages: {\r\n                email: '유효한 이메일 주소를 입력해 주십시오',\r\n                city_not_specified: '도시를 지정해 주십시오',\r\n                name_not_specified: '위치 이름을 지정해 주십시오',\r\n                street_not_specified: '주소를 지정해 주십시오',\r\n                country_not_specified: '원산지를 선택해 주십시오',\r\n                zipcode_not_specified: '우편번호를 지정해 주십시오',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '성공!',\r\n              button: '목록으로 돌아가기',\r\n              message: '위치가 성공적으로 업데이트되었습니다.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: '주소',\r\n                country: '국가',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: '도시',\r\n              email: '이메일',\r\n              street: '도로명',\r\n              country: '국가',\r\n              website: '웹사이트',\r\n              postalCode: '우편번호',\r\n              companyName: '회사',\r\n            },\r\n            tabs: {\r\n              list: '회사',\r\n              worldmap: '세계 지도',\r\n            },\r\n            map: {\r\n              description_not_available: '설명 없음',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: '추가',\r\n                back: '목록으로 돌아가기',\r\n                edit: '업데이트',\r\n                save: '저장',\r\n                email: '이미지 보내기',\r\n                cancel: '취소',\r\n                addMultiple: '추가 + 새로 만들기',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: '관리 편집',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: '품질 보증',\r\n          users: '사용자 관리',\r\n          assets: 'Asset 관리',\r\n          settings: '설정',\r\n          dashboard: '대시보드',\r\n          userProfile: '사용자 프로필',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: '사용자 관리',\r\n          assets: 'Asset 관리',\r\n          dashboard: '대시보드',\r\n          userProfile: '사용자 프로필',\r\n        },\r\n        variables: {\r\n          bar: '막대',\r\n          plc: 'PLC',\r\n          area: '영역',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: '행',\r\n          long: '롱',\r\n          real: 'REAL',\r\n          true: '활성',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: '비활성',\r\n          float: '부동',\r\n          uword: 'UWORD',\r\n          double: '실수형',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: '불리언',\r\n          integer: '정수',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: '외부',\r\n          internal: '내부',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: '1년',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: '새 변수 추가',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: '1개월',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: '직사각형',\r\n          tabs: {\r\n            list: '변수 목록',\r\n          },\r\n          ten_years: '10년',\r\n          two_weeks: '2주',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: '6개월',\r\n          categorical: '범주형',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: '변수를 생성하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n          },\r\n          new_form_title: '새 변수',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: '변수 편집',\r\n          new: {\r\n            fields: {\r\n              hint: '(변경　시 기계에　문제가　발생할　수 있습니다)',\r\n              showId: '변수 ID 입력 필드 표시',\r\n              maxTime: '최대 시간',\r\n              nckArea: 'NCK Area',\r\n              dataType: '데이터 유형',\r\n              nckBlock: 'NCK Block',\r\n              chartType: '차트 유형',\r\n              namePrefix: '이름 프리픽스',\r\n              variableId: '변수 ID',\r\n              collections: '',\r\n              displayName: '표시　이름',\r\n              showInitial: '초기값 표시',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: '표시　여부',\r\n            },\r\n            buttons: {\r\n              delete: '변수 삭제',\r\n            },\r\n            error_messages: {\r\n              maxTime: '최대 시간을 선택해 주십시오',\r\n              dataType: '데이터 유형을 선택해 주십시오',\r\n              chartType: '차트 유형을 선택해 주십시오',\r\n              namePrefix: '유효한 프리릭스 이름을 입력해 주십시오. (유효한 자리수: A-Z, _).',\r\n              variableId: '유효한 UUID를 입력해 주십시오',\r\n              displayName: '표시 이름을 지정해 주십시오',\r\n              showInitial: '초기값을 선택해 주십시오',\r\n              namePrefixEdit: '유효한 프리릭스 이름을 입력해 주십시오. (유효한 자리수: A-Z a-z, _).',\r\n              visibilityType: '표시 상태를 선택해 주십시오',\r\n            },\r\n          },\r\n          success: {\r\n            message: '변수가 성공적으로 생성되었습니다',\r\n          },\r\n          editError: {\r\n            message: '변수를 업데이트하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n          },\r\n          editSuccess: {\r\n            message: '변수가 성공적으로 업데이트되었습니다',\r\n          },\r\n        },\r\n        success: {\r\n          upload: '업로드 성공',\r\n          downloads: '다운로드 성공',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: '예상치 못한 오류가 발생했습니다. 페이지를 다시 불러와 주십시오.',\r\n            },\r\n            s_1: {\r\n              message: '변경사항이 저장되었습니다.',\r\n            },\r\n            s_930: {\r\n              message: \"Asset '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_931: {\r\n              message: \"회사 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_932: {\r\n              message: \"생산 라인 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_933: {\r\n              message: \"작업장 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_934: {\r\n              message: \"위치 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_935: {\r\n              message: \"파일 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n            s_936: {\r\n              message: \"변수 '%replaceValue'가 성공적으로 삭제되었습니다.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: '중복 카드가 삭제되었습니다!',\r\n            add_line_to_dashboard: '대시보드에 생산 라인 추가',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: '한계(값)',\r\n            type: '유형으로 선택',\r\n            alarms: '알람',\r\n            machine: '기계 ID로 선택',\r\n            variables: '변수',\r\n            listImport: '한계(값) 가져오기',\r\n            listDownload: '한계(값) 다운로드',\r\n          },\r\n          text: {\r\n            text: '한계(값)은 사용자가 관심 있는 변수에 대해 설정하는 값입니다. 변수가 설정된 한계(값)를 벗어나면 알림을 받게 됩니다. 한계(값)는 시계열 탭에서 생성된 차트에도 표시됩니다.',\r\n            title: '한계(값)',\r\n          },\r\n          export: {\r\n            text: '클라우드 플랫폼에 있는 모든 변수에 대해 현재 설정된 한계(값)를 언제든지 내보낼 수 있습니다. 이 목록은 참조용으로 사용하거나 ‘CSV로 한계(값) 가져오기’ 섹션에서 한 번에 모든 한계(값)를 가져올 때 사용할 수 있습니다.',\r\n            title: 'CSV로 한계(값) 내보내기',\r\n          },\r\n          import: {\r\n            text: '이전에 다운로드한 한계(값) 및 구독자에 대한 정보가 들어　있는 CSV 파일을 가져와 현재 저장된 값을 업데이트할 수 있습니다. 가져온 한계(값)를 적용할 Asset 또는 기계 유형을 나중에 선택할 수 있습니다.',\r\n            title: 'CSV에서 한계(값) 가져오기',\r\n            machines: {\r\n              title: '한계(값)를 적용할 기계 또는 기계 유형을 선택합니다.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: '가져오려는 CSV 파일 선택',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Asset 관리에서 원하는 라인으로 이동합니다.',\r\n            two: '라인 헤더에서 컨텍스트 메뉴를 찾을 수 있습니다.',\r\n            four: '생산 라인의 타일이 대시보드에 추가되었습니다',\r\n            three: '컨텍스트 메뉴를 클릭한 후 “대시보드에 추가”를 선택합니다.',\r\n            header: '타일 추가하기',\r\n          },\r\n          individual: {\r\n            one: '왼쪽에 있는 설정 버튼을 선택합니다.',\r\n            two: '“플러스” 아이콘을 선택합니다.',\r\n            four: '“저장”을 눌러 확인합니다. 개별 타일이 대시보드에 추가되었습니다.',\r\n            three: '타일에 이름을 지정하고 원하는 기계를 추가합니다.',\r\n            header: '개별 타일 추가하기',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: '새 사용자 추가',\r\n          new: {\r\n            title: '사용자 생성',\r\n            status: '사용자 상태:',\r\n            buttons: {\r\n              add: '추가',\r\n              back: '목록으로 돌아가기',\r\n              save: '저장',\r\n              cancel: '취소',\r\n              delete: '사용자 삭제',\r\n              sendMail: '첫 메일 보내기',\r\n            },\r\n            fields: {\r\n              email: '이메일',\r\n              roles: '사용자 역할',\r\n              gender: '성별',\r\n              created: '생성됨',\r\n              lastName: '성',\r\n              firstName: '이름',\r\n              breadcrumb: '탐색 경로 표시',\r\n              main_group: '주요 그룹',\r\n              phoneNumber: '전화 번호[옵션]',\r\n              customer_org: '고객사 조직',\r\n              last_modified: '최근 수정일',\r\n              email_validation: '이메일(유효성 검사)',\r\n            },\r\n            statusText: {\r\n              unknown: '알 수 없음',\r\n              archived: '보관　처리됨',\r\n              confirmed: '확인됨',\r\n              compromised: '손상됨',\r\n              unconfirmed: '확인되지 않음',\r\n              reset_required: '재설정 필요',\r\n              external_provider: '외부 제공자',\r\n              force_change_password: '비밀번호 변경 강제',\r\n            },\r\n            error_messages: {\r\n              email_not_match: '이메일 주소가 일치하지 않습니다',\r\n              email_not_valid: '유효한 이메일 주소를 지정해 주십시오',\r\n              phone_not_specified: '국가 번호를 입력한 후 +로 시작하는 전화번호를 입력해 주십시오.',\r\n              roles_not_specified: '주요 그룹을 선택해 주십시오',\r\n              gender_not_specified: '성별을 지정해 주십시오',\r\n              last_name_not_specified: '성을 입력해 주십시오',\r\n              first_name_not_specified: '이름을 입력해 주십시오',\r\n              main_group_not_specified: '주요 그룹을 선택해 주십시오',\r\n              family_name_not_specified: '성을 입력해 주십시오',\r\n              customer_organization_not_specified: '고객사 조직을 선택해 주십시오',\r\n            },\r\n          },\r\n          failed: {\r\n            title: '실패했습니다!',\r\n          },\r\n          mail: {\r\n            success: '자동 생성된 비밀번호가 들어　있는 이메일이 입력된 이메일 주소로 전송되었습니다.',\r\n          },\r\n          update: {\r\n            title: '사용자 업데이트',\r\n          },\r\n          success: {\r\n            title: '성공!',\r\n            button: '목록으로 돌아가기',\r\n            message: '사용자가 성공적으로 생성되었습니다. 자동 생성된 비밀번호가 들어　있는 이메일이 입력된 이메일 주소로 전송되었습니다.',\r\n            message_for_edit: '사용자가 성공적으로 업데이트되었습니다.',\r\n            message_send_mail: '자동 생성된 비밀번호가 들어　있는 이메일이 입력된 이메일 주소로 전송되었습니다.',\r\n            button_back_to_last_page: '지난 페이지로 돌아가기',\r\n          },\r\n          delete: {\r\n            success: '사용자가 성공적으로 삭제되었습니다.',\r\n            confirmation: {\r\n              title: '이 사용자를 정말 삭제하시겠습니까?',\r\n              confirm: '예, 이 사용자를 삭제합니다',\r\n              dismiss: '아니요, 취소합니다',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: '방문객',\r\n            customer: '고객사',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: '사용자',\r\n              email: '이메일',\r\n              company: '회사',\r\n              enabled: '상태',\r\n              lastName: '성',\r\n              sw_admin: 'SW 관리자',\r\n              firstName: '이름',\r\n              userRights: '사용자 권한',\r\n              phoneNumber: '전화 번호',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: '남성',\r\n              female: '여성',\r\n              diverse: '기타',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: '알람',\r\n            type: '유형으로 선택',\r\n            machine: '기계 ID로 선택',\r\n            listImport: '알람 가져오기',\r\n            listDownload: '알람 다운로드',\r\n          },\r\n          text: {\r\n            text: '관심 있는 알람 코드에 대한 알람 알림을 설정할 수 있습니다. 설정된 알람이 정의된 기계에서 발생하면 알림을 수신하게 됩니다.',\r\n            title: '알람 알림',\r\n          },\r\n          export: {\r\n            text: '현재 설정된 모든 기계의 알람 알림을 언제든지 SW CloudPlatform으로 내보내기 할 수 있습니다. 이 목록은 참조용으로 사용할 수 있습니다. 그리고 “CSV로 알람 가져오기” 섹션에서 모든 알람 알림을 한꺼번에 가져오는 데 사용할 수 있습니다.',\r\n            title: '알람 CSV로 내보내기',\r\n          },\r\n          import: {\r\n            text: '이전에 다운로드한, 알람 및 구독자 정보가 담긴 CSV 파일을 가져와 현재 저장된 값을 업데이트할 수 있습니다. 가져온 알람 알림을 적용하려는 시스템 또는 기계 유형을 나중에 선택할 수 있습니다.',\r\n            title: 'CSV 파일에서 알람 가져오기',\r\n            machines: {\r\n              title: '알람을 적용하려는 기계 또는 기계 유형을 선택합니다.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: '가져오려는 CSV 파일 선택',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: '결과를 찾을 수 없음',\r\n          results: {\r\n            of: '중',\r\n            lines: '생산 라인',\r\n            machines: '기계',\r\n          },\r\n          callToAction: '기계 검색',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: '실패함',\r\n            queued: '대기 중',\r\n            removed: '제거됨',\r\n            canceled: '취소됨',\r\n            rejected: '거부됨',\r\n            completed: '완료됨',\r\n            succeeded: '완료됨',\r\n            timed_out: '시간 초과됨',\r\n            in_progress: '처리 중',\r\n            not_installed: '설치되지 않음',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: '확인',\r\n            import: '가져오기 시작',\r\n            dismiss: '취소',\r\n            download: '다운로드 시작',\r\n          },\r\n          tabs: {\r\n            limits: '한계(값)',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: '이름',\r\n              datatype: '데이터 유형',\r\n              chartType: '차트 유형',\r\n              displayName: '표시 이름',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: '세계 지도',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: '생산 현장',\r\n          upload: {\r\n            text1: '생산 현장 레이아웃 이미지를 lifedata@sw-machines.com(JPG, PNG, PDF)으로 보내십시오.',\r\n            text2: '기계가 SW CloudPlatform에 등록되어 있고 활성화되어 있으면, 왼쪽에 표시되고 실시간 데이터를 전송합니다.',\r\n            text3: '그런 다음 간단히　생산　현장　레이아웃　상에서 상태를　올바른 기계로 드래그 앤 드롭합니다.',\r\n            mainText: '이 보기에서 개별 생산 현장 레이아웃을 설정하고, 다양한 정보 레이어를 통해 기계들을 확인할 수 있습니다. 다음 단계를 따라 하십시오.',\r\n            tileTitle: '생산 현장 업로드',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset이 성공적으로 삭제되었습니다.',\r\n            confirmation: {\r\n              title: \"'%replaceValue'를 정말 삭제하시겠습니까?\",\r\n              confirm: '삭제',\r\n              dismiss: '취소',\r\n              company: {\r\n                text: '회사 삭제 시 해당 회사의 모든 사용자 계정도 함께 삭제됩니다.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Asset 삭제',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'NamePrefix 또는 DataType을 변경하면 기계를 손상시킬 수 있습니다. 정말 저장하시겠습니까?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: '해당 새 기계 유형의 한계(값)를 적용하시겠습니까?',\r\n              title: '기계 유형이 변경되었습니다.',\r\n              accept: '예, 새로운 한계(값)를 적용합니다',\r\n              decline: '아니요, 현재 한계(값)를 유지합니다',\r\n              dismiss: '취소',\r\n              info_accept: '현재 한계(값)를 새 기계 유형의 한계(값)로 대체하려면 ‘예’를 선택합니다.',\r\n              info_decline: '현재 한계(값)를 유지하려면 ‘아니요’를 선택합니다.',\r\n              info_accept_warning: '그렇게 하면 현재 설정된 모든 한계(값)를 덮어쓰거나 삭제하게 됩니다.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: '파일 삭제',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: '작업장 삭제',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: '생산 라인 삭제',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: '상태',\r\n        },\r\n        timeFilter: {\r\n          machine_time: '기계 시간',\r\n          controller_time: '컨트롤러 시간',\r\n          iot_gateway_time: 'IoT 게이트웨이 시간',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: '월/일/연도 시:분:초 오전/오후',\r\n          exporting: {\r\n            datetimeformat: '월/일/연도 시:분:초 오전/오후',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: '이용 가능한 데이터 없음',\r\n              loading: '데이터 로딩 중...',\r\n              months: [\r\n                '1월',\r\n                '2월',\r\n                '3월',\r\n                '4월',\r\n                '5월',\r\n                '6월',\r\n                '7월',\r\n                '8월',\r\n                '9월',\r\n                '10월',\r\n                '11월',\r\n                '12월',\r\n              ],\r\n              resetZoom: '줌 재설정',\r\n              weekdays: [\r\n                '일요일',\r\n                '월요일',\r\n                '화요일',\r\n                '수요일',\r\n                '목요일',\r\n                '금요일',\r\n                '토요일',\r\n              ],\r\n              shortMonths: [\r\n                '1월',\r\n                '2월',\r\n                '3월',\r\n                '4월',\r\n                '5월',\r\n                '6월',\r\n                '7월',\r\n                '8월',\r\n                '9월',\r\n                '10월',\r\n                '11월',\r\n                '12월',\r\n              ],\r\n              shortWeekdays: [\r\n                '일',\r\n                '월',\r\n                '화',\r\n                '수',\r\n                '목',\r\n                '금',\r\n                '토',\r\n              ],\r\n              increaseDateRange: '최소 기간',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: '사전 설정',\r\n            rangeTo: '종료일',\r\n            selectDateRange: '날짜 범위를 선택해 주십시오',\r\n            predefined: {\r\n              today: '오늘',\r\n              custom: '사용자 지정 범위',\r\n              last7days: '지난 7일',\r\n              yesterday: '어제',\r\n              last24Hours: '지난 24시간',\r\n              last5Minutes: '지난 5분',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: '변수 편집',\r\n          new: {\r\n            buttons: {\r\n              delete: '변수 삭제',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: '언어 선택',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: '회사 삭제',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: '위치 삭제',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: '상태',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: '대시보드 구성',\r\n            hide: {\r\n              title: '숨기기',\r\n            },\r\n            show: {\r\n              title: '표시',\r\n            },\r\n            delete: {\r\n              title: '삭제',\r\n            },\r\n            add: {\r\n              fab_title: '사용자 지정 타일 추가',\r\n            },\r\n            save: {\r\n              fab_title: '구성 저장',\r\n            },\r\n            move_left: {\r\n              title: '이전 위치로 이동',\r\n            },\r\n            move_right: {\r\n              title: '다음 위치로 이동',\r\n            },\r\n            discard: {\r\n              fab_title: '구성 버리기',\r\n            },\r\n            add_custom_card: {\r\n              save: '저장',\r\n              input: '타일 이름 입력',\r\n              title: '사용자 지정 타일 추가',\r\n              cancel: '취소',\r\n              missingMachine: '하나 이상의 기계를 선택해야 합니다',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: '예상치 못한 오류가 발생했습니다. 페이지를 다시 불러와 주십시오.',\r\n            },\r\n            e_1xx: {\r\n              message: '정보 제공 오류',\r\n            },\r\n            e_2xx: {\r\n              message: '성공',\r\n            },\r\n            e_3xx: {\r\n              message: '리디렉션',\r\n            },\r\n            e_400: {\r\n              message: '요청 형식이 올바르지 않아 처리할 수 없습니다.',\r\n            },\r\n            e_401: {\r\n              message: '인증되지 않았습니다. 다시 로그인해 주십시오.',\r\n            },\r\n            e_403: {\r\n              message: '요청한 리소스에 접근하기에는 권한이 충분하지 않습니다.',\r\n            },\r\n            e_404: {\r\n              message: '요청한 리소스를 이용할 수 없습니다.',\r\n            },\r\n            e_405: {\r\n              message: '허용되지 않는 요청 방식입니다.',\r\n            },\r\n            e_406: {\r\n              message: '허용할 수 없는 요청 방식입니다',\r\n            },\r\n            e_409: {\r\n              message: '추가하려는 리소스가 이미 존재합니다.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: '콘텐츠로 인해 요청 방식 처리 불가',\r\n            },\r\n            e_4xx: {\r\n              message: '클라이언트 오류',\r\n            },\r\n            e_500: {\r\n              message: '내부 서버 오류가 발생했습니다.',\r\n            },\r\n            e_5xx: {\r\n              message: '서버 오류',\r\n            },\r\n            e_900: {\r\n              message: 'Asset를 추가하려는 동안 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_901: {\r\n              message: '작업이 취소되었습니다. 새 Asset가 생성되지 않았습니다.',\r\n            },\r\n            e_902: {\r\n              message: '작업이 취소되었습니다. 서비스 요청이 전송되지 않았습니다.',\r\n            },\r\n            e_903: {\r\n              message: '서비스 요청을 전송하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_904: {\r\n              message: \"Asset '%replaceValue'가 성공적으로 생성되었습니다. 이제 다른 Asset을 추가할 수 있습니다.\",\r\n            },\r\n            e_905: {\r\n              message: '작업이 취소되었습니다. Asset이 업데이트되었습니다.',\r\n            },\r\n            e_906: {\r\n              message: \"Asset '%replaceValue'가 성공적으로 이동했습니다.\",\r\n            },\r\n            e_910: {\r\n              message: '사용자를 추가하려는 동안 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_911: {\r\n              message: '현재 작업을 취소했습니다. 사용자가 생성되지 않았습니다.',\r\n            },\r\n            e_912: {\r\n              message: 'Asset를 업데이트하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_920: {\r\n              message: '현재 작업을 취소했습니다. 변경사항이 저장되지 않았습니다.',\r\n            },\r\n            e_921: {\r\n              message: '알 수 없는 오류가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_922: {\r\n              message: '사용자 이름 및/또는 비빌번호가 올바르지 않습니다. 다시 시도해 주십시오.',\r\n            },\r\n            e_923: {\r\n              message: '이메일 및 비밀번호를 입력해 주십시오.',\r\n            },\r\n            e_924: {\r\n              message: '활동이 없어 세션이 만료되었습니다. 다시 로그인해 주십시오.',\r\n            },\r\n            e_925: {\r\n              message: '플랫폼을 사용하려면 개인정보 보호정책에 동의해야 합니다.',\r\n            },\r\n            e_926: {\r\n              message: '계정이 일시적으로 잠겼습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_927: {\r\n              message: '비밀번호 변경 요청이 성공적으로 기록되었습니다. 자세한 내용은 사용자의 이메일 계정에서 확인해 주십시오.',\r\n            },\r\n            e_928: {\r\n              message: '작업이 취소되었습니다. 파일이 업로드되지 않았습니다.',\r\n            },\r\n            e_929: {\r\n              message: '파일을 업로드하려는 중 오류가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_930: {\r\n              message: '해당 파일을 삭제하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_931: {\r\n              message: '사용자 지정 날짜 범위가 너무 큽니다. 기본값인 24시간으로 설정되었습니다. 최대 날짜 범위 %replaceValue일',\r\n            },\r\n            e_932: {\r\n              message: 'Asset에는 하위 항목이 있습니다. 먼저 하위 항목을 삭제합니다.',\r\n            },\r\n            e_933: {\r\n              message: \"변수 '%replaceValue'가 성공적으로 생성되었습니다. 이제 다른 변수를 추가할 수 있습니다.\",\r\n            },\r\n            e_934: {\r\n              message: '변수를 삭제하려는 중 문제가 발생했습니다. 나중에 다시 시도해 주십시오.',\r\n            },\r\n            e_10500: {\r\n              message: '인터넷에 연결되어 있지 않은 것 같습니다. 인터넷에 연결되어 있는지 확인해 보십시오.',\r\n            },\r\n            e_10501: {\r\n              message: '지원되지 않는 브라우저를 사용하고 있습니다. CloudPlatform은 다음 브라우저 중 하나가 필요합니다: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: '이 Asset(기계 식별자 %replaceValue)는 이미 존재합니다',\r\n            },\r\n            e_410_asset: {\r\n              message: '이 %replaceValue 파일은 이미 존재합니다',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: '한 번에 %s개의 항목만 선택할 수 있습니다',\r\n              title: '최대 수량　도달함',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: '시간 필터',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: '사용 가능한 파일이 없습니다.',\r\n              file_cardTitle: '기계 이벤트',\r\n              modules: {\r\n                assets: {\r\n                  download: '데이터 다운로드하기',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC 추적 파일',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: '이용 가능한 알람 없음',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC 비교 파일',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC 데이터 파일',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: '사용 가능한 파일이 없습니다.',\r\n              file_cardTitle: 'ToolMon 파일',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'ToolMon 데이터 다운로드',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: '트리거',\r\n              column_title_filename: '파일 이름',\r\n              column_title_creation_date: '생성 날짜',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI 플라이트 레코더 파일',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  pl: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Wyloguj się',\r\n        release: \"W dniu '%replaceValue1' do '%replaceValue2' prowadzone będą prace serwisowe na platformie. W tym czasie platforma będzie częściowo niedostępna.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Zamknąć',\r\n        acceptLabel: 'Zaakceptuj',\r\n        userProfile: 'Profil użytkownika',\r\n        button: {\r\n          clear: 'Usunąć wykres',\r\n          timeline: 'Dopasowanie wartości granicznej',\r\n          separateCharts: 'Odrębne wykresy',\r\n        },\r\n        declineLabel: 'Odrzuć',\r\n        backToDashboard: 'Powrót do dashboard',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/pl/gtc-normy/',\r\n            title: 'GTCT / standardy',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'Kontakt',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/pl/imprint/',\r\n            title: 'Nota prawna',\r\n          },\r\n          privacy: {\r\n            title: 'Sfera prywatna',\r\n            header: 'Przepisy o ochronie danych osobowych',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'Strona główna SW',\r\n          },\r\n        },\r\n        noInternetConnection: 'Wygląda na to, że nie masz połączenia z Internetem. Proszę połączyć się i spróbować ponownie.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: 'z',\r\n          noData: 'Brak danych',\r\n          dateFormat: 'DD.MM.YYYY',\r\n          downloaded: 'pobrany',\r\n          noDuration: 'brak czasu trwania',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: 'Twoja maszyna nie jest licencjonowana.',\r\n          alarmPending: 'Alarm obecny',\r\n          buttons: {\r\n            back: 'Wstecz',\r\n            save: 'Zapisz',\r\n            view: 'Wyświetl',\r\n            cancel: 'Anuluj',\r\n            custom: 'Zapis + nastawianie zakresu niestandardowego',\r\n            submit: 'Zastosuj',\r\n            export: {\r\n              limit: 'Pobieranie limitów',\r\n              alarms: 'Pobieranie alarmów',\r\n            },\r\n            import: {\r\n              limit: 'Start',\r\n              alarms: 'Start',\r\n            },\r\n            refreshReset: 'Zresetuj do czasu domyślnego',\r\n            selectAllCheckboxes: 'Wybierz wszystko',\r\n            unselectAllCheckboxes: 'Usuń wybór',\r\n          },\r\n          notAvailable: 'Brak dostępności',\r\n          notConnected: 'Jeszcze nie połączono',\r\n          download: {\r\n            file: 'Pobrania pliku',\r\n          },\r\n          dateTimeFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          timeFormats: {\r\n            day: 'dzień',\r\n            days: 'dni',\r\n            hour: 'godzina',\r\n            year: 'rok',\r\n            hours: 'godz.',\r\n            month: 'miesiąc',\r\n            years: 'lat(a)',\r\n            minute: 'minuta',\r\n            months: 'mies.',\r\n            second: 'sekunda',\r\n            minutes: 'min',\r\n            seconds: 'sek.',\r\n          },\r\n          notAvailableShort: 'nie dotyczy',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Rozumiem',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Tej czynności nie można cofnąć!',\r\n        },\r\n        error: {\r\n          upload: 'Nieudane przesyłanie danych',\r\n          download: 'Pobieranie zakończone niepowodzeniem',\r\n          message: {\r\n            enrollment_code_409: 'Urządzenie jest już zapisane w aws.',\r\n            limit_change_failed: 'Zmiana wartości granicznych nie powiodła się. Proszę spróbować później ponownie lub wysłać e-mail na adres lifedata@sw-machines.com.',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'Rejestracja czasu',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Wybierz zmienne',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Data',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Bezpieczny dostęp nadzorowany',\r\n            directAccess: 'Dostęp bezpośredni',\r\n            new: {\r\n              fields: {\r\n                id: 'Wprowadź ID',\r\n                cOnePanel: 'z C|One',\r\n                sessionType: 'Typ sesji',\r\n              },\r\n              error_messages: {\r\n                id: 'Wprowadź ID sesji lub ID urządzenia',\r\n                sessionType: 'Wybierz typ sesji',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPI',\r\n              list: 'Maszyny',\r\n              shopfloor: 'Przestrzeń produkcyjna',\r\n            },\r\n            fab_title: 'Dodaj nową linię',\r\n            grid: {\r\n              hall: 'Hala',\r\n              line: 'Linia',\r\n              type: 'Typ',\r\n              contractEnd: 'Koniec umowy [opcja]',\r\n              cellPosition: 'Komórka / pozycja [opcja]',\r\n              operationStep: 'Etap obróbki',\r\n              machineIdentifierSw: 'Nr maszyny (SW)',\r\n              machineIdentifierCustomer: 'Nazwa maszyny',\r\n            },\r\n            success: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Utworzenie linii przebiegło pomyślnie.',\r\n            },\r\n            new_form_title: 'Nowa linia',\r\n            edit_form_title: 'Edytuj linię',\r\n            new: {\r\n              fields: {\r\n                name: 'Nazwa linii',\r\n                name_short: 'Nazwa linii (forma skrócona) [opcjonalnie]',\r\n                description: 'Opis [opcjonalnie]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Proszę podać nazwę linii.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Aktualizacja linii przebiegła pomyślnie.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Dodaj nową halę',\r\n            grid: {\r\n              part: 'Typ części',\r\n              lineName: 'Linia',\r\n              typeOfLoading: 'Typ załadunku',\r\n              lineResponsible: 'Osoba odpowiedzialna za linię',\r\n              plannedQuantity: 'Planowana ilość',\r\n              numberOfMachines: '# Maszyny',\r\n            },\r\n            tabs: {\r\n              list: 'Linie',\r\n              shopfloor: 'Przestrzeń produkcyjna',\r\n            },\r\n            success: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Utworzenie hali przebiegło pomyślnie.',\r\n            },\r\n            new_form_title: 'Nowa hala',\r\n            shopfloor: {\r\n              edit: 'Tryb edycji',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Zapisz konfigurację',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Anuluj konfigurację',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Edytuj halę',\r\n            new: {\r\n              fields: {\r\n                name: 'Nazwa hali',\r\n                name_short: 'Nazwa hali (forma skrócona) [opcjonalnie]',\r\n                description: 'Opis [opcjonalnie]',\r\n                description_external: 'Opis (zewnętrzny) [opcjonalnie]',\r\n                description_internal: 'Opis (wewnętrzny) [opcjonalnie]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Proszę podać nazwę hali.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Aktualizacja hali przebiegła pomyślnie.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Opis [opcjonalnie]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Utwórz nowe aktywa',\r\n            tabs: {\r\n              info: 'Szeregi czasowe',\r\n              alarms: 'Alarmy',\r\n              events: 'Zdarzenia dotyczące maszyny',\r\n              gateway: 'Bramka',\r\n              service: 'Serwis',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Dostępność linii',\r\n              'axis-test': 'Testy osi',\r\n              collection: 'Kolekcje',\r\n              technology: 'Technologia',\r\n              maintenance: 'Konserwacja',\r\n              performance: 'Wydajność',\r\n              spindledata: 'Dane wrzeciona',\r\n              remoteaccess: 'Dostęp zdalny',\r\n              enduranceTest: 'Test na końcu linii produkcyjnej',\r\n              administration: 'Administracja',\r\n              y_title: {\r\n                status: 'Status',\r\n                status_table_one: 'Stół 1',\r\n                status_table_two: 'Stół 2',\r\n              },\r\n              energymonitoring: 'Monitoring energetyczny',\r\n              technology_undefined: 'niezdefiniowana',\r\n              technology_undefined_condition: 'Niezdefiniowany status',\r\n            },\r\n            move: {\r\n              message: \"Zasób '%replaceValue' może zostać przesunięty do nowego przedsiębiorstwa, nowej lokalizacji, hali i/lub linii.\",\r\n              select_hall_label: 'Wybierz nową halę',\r\n              select_line_label: 'Wybierz nową linię',\r\n              select_company_label: 'Wybierz nowe przedsiębiorstwo',\r\n              select_location_label: 'Wybierz nową lokalizację',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Numer maszyny (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: 'Dostawa [opcjonalnie]',\r\n                shipping: 'Wysyłka [opcjonalnie]',\r\n                controller: 'Sterownik',\r\n                machine_type: 'Typ maszyny',\r\n                warranty_end: 'Koniec gwarancji [opcjonalnie]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Menedżer systemów',\r\n                warranty_start: 'Rozpoczęcie gwarancji [opcjonalnie]',\r\n                machine_swmp_api: 'SWMP API maszyny, koniec [opcjonalnie]',\r\n                machine_swsp_trace: 'SWSP Trace maszyny, koniec [opcjonalnie]',\r\n                machine_swcp_portal: 'SWCP Portal maszyny, koniec [opcjonalnie]',\r\n                start_of_production: 'Rozpoczęcie produkcji [opcjonalnie]',\r\n                machine_swcp_support: 'SWCP Support maszyny, koniec [opcjonalnie]',\r\n                machine_cell_position: 'Komórka / pozycja maszyny',\r\n                machine_swsp_line_mon: 'SWSP LineMon maszyny, koniec [opcjonalnie]',\r\n                machine_identifier_customer: 'ID maszyny (klient)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Proszę podać ważny numer maszyny SW (co najmniej 7 znaków: A-Z, 0-9, -).',\r\n                controller_not_specified: 'Proszę wybrać sterownik.',\r\n                machine_type_not_specified: 'Proszę wybrać typ maszyny.',\r\n                machine_identifier_customer_not_specified: 'Proszę podać ID maszyny.',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Utworzenie aktywów przebiegło pomyślnie.',\r\n            },\r\n            new_form_title: 'Dodaj aktywa',\r\n            edit_form_title: 'Edytuj aktywa',\r\n            move_form_title: 'Przesuń zasób',\r\n            editSuccess: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Aktualizacja aktywów przebiegła pomyślnie.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: 'Data wysyłki',\r\n                controller: 'Sterownik',\r\n                contractEnd: 'Koniec umowy',\r\n                machineType: 'Typ maszyny',\r\n                startupDate: 'Data uruchomienia',\r\n                warrantyEnd: 'Koniec rękojmi',\r\n                cellPosition: 'Komórka/pozycja',\r\n                warrantyStart: 'Początek rękojmi',\r\n                customerNumber: 'Numer klienta',\r\n                enrollmentConfig: 'Konfiguracja rekrutacji',\r\n                startOfProduction: 'Rozpoczęcie produkcji',\r\n                machineIdentifierSw: 'Nr maszyny SW',\r\n                enrollmentConfigDownload: 'Pobierz',\r\n                machineIdentifierCustomer: 'Nazwa maszyny klienta',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Zmiana',\r\n              g_mode: 'Funkcja G',\r\n              off_time: 'Czas pomocniczy',\r\n              no_change: 'Brak wymiany',\r\n              undefined: 'Niezdefiniowany',\r\n              active_tool: 'Aktywne narzędzie',\r\n              tool_change: 'Wymiana narzędzia',\r\n              machining_time: 'Czas główny',\r\n              tool_change_time: 'Czas wymiany narzędzia',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'Czas trwania procesu stołu 1',\r\n                  name_two: 'Czas trwania procesu stołu 2',\r\n                  name_one_undefined: 'Niezdefiniowany czas trwania procesu stołu 1',\r\n                  name_two_undefined: 'Niezdefiniowany czas trwania procesu stołu 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Oś Q i wrzeciono',\r\n              undefined_gmode_data: 'Brak danych do funkcji G',\r\n              auxiliary_process_time: 'Dodatkowy czas trwania procesu',\r\n              undefined_activetool_data: 'Brak danych do aktywnego narzędzia',\r\n              undefined_tool_change_data: 'Brak danych do wymiany narzędzia',\r\n              undefined_machining_time_table_one: 'Niezdefiniowany stan stołu 1',\r\n              undefined_machining_time_table_two: 'Niezdefiniowany stan stołu 2',\r\n              machining_auxiliary_tool_changing_table_one: 'Czas główny, czas wymiany narzędzia i czas pomocniczy stołu 1',\r\n              machining_auxiliary_tool_changing_table_two: 'Czas główny, czas wymiany narzędzia i czas pomocniczy stołu 2',\r\n            },\r\n            add_line_to_dashboard: 'Dodaj linię do pulpitu',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: 'Jednostka',\r\n                value: 'Wartość',\r\n                kpiUnit: 'Jednostka',\r\n                headline: 'Testy osi',\r\n                kpiValue: 'Wartość',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Wczytaj z pamięci przeglądarki',\r\n                limitsSave: 'Zapisz w pamięci przeglądarki',\r\n                selectAxis: 'Wybierz oś',\r\n                limitsExport: 'Eksportuj wartości graniczne do schowka',\r\n                openAxistest: 'Otwórz test osi',\r\n                axisTestPlural: 'Testy osi',\r\n                adjustments: {\r\n                  add: 'Dodaj lokalne dostosowanie',\r\n                  range: 'Zasięg',\r\n                  header: 'Lokalne dostosowanie',\r\n                  remove: 'Usuń',\r\n                  position: 'Pozycja',\r\n                  amplitude: 'Amplituda',\r\n                  spreadMultiplier: 'Mnożnik limitów',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Pozycja',\r\n                    y: 'Prąd',\r\n                    up: 'w górę',\r\n                    down: 'w dół',\r\n                    limitsUp: 'ogranicza w kierunku dodatnim',\r\n                    limitsDown: 'ogranicza w kierunku ujemnym',\r\n                    sliderSlopeCenter: 'Początek skoku',\r\n                    sliderSlopeFactor: 'Współczynnik skoku',\r\n                    sliderVerticalOffset: 'Przesunięcie Y',\r\n                    sliderVerticalSpread: 'Ogranicz szerokość',\r\n                    sliderQuadraticCenter: 'Początek kwadratu',\r\n                    sliderQuadraticFactor: 'Współczynnik kwadratu',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'Zgodnie z ruchem wskazówek zegara',\r\n                    limitsClockwise: 'Granice w kierunku zgodnym z ruchem wskazówek zegara',\r\n                    counterClockwise: 'Przeciwnie do ruchu wskazówek zegara',\r\n                    sliderSineOffset: 'Przesunięcie fali',\r\n                    sliderSineAmplitude: 'Amplituda fali',\r\n                    sliderSineFrequency: 'Częstotliwość fali',\r\n                    sliderVerticalOffset: 'Przesunięcie Y',\r\n                    sliderVerticalSpread: 'Ogranicz szerokość',\r\n                    limitsCounterClockwise: 'Granice w kierunku odwrotnym do ruchu wskazówek zegara',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Prędkość',\r\n                  pulseMaxRampUp: 'Rampa ->',\r\n                  pulseMaxRampDown: 'Rampa <-',\r\n                  pulseMaxStiffness: 'Sztywność maksymalna',\r\n                  pulseMinStiffness: 'Sztywność minimalna',\r\n                  pulseMeanStiffness: 'Sztywność Ø',\r\n                  circularReversalRange: 'Histereza okręgu',\r\n                  pulseMaxUpPathCurrent: 'Prąd maksymalny ->',\r\n                  pulseMinUpPathCurrent: 'Prąd minimalny ->',\r\n                  pulseMeanUpPathCurrent: 'Prąd Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Prąd maksymalny <-',\r\n                  pulseMinDownPathCurrent: 'Prąd minimalny <-',\r\n                  pulseMeanDownPathCurrent: 'Prąd Ø <-',\r\n                  circularShapeDeviationClockwise: 'Odstępstwo od okręgu w prawo',\r\n                  pulseStiffnessStandardDeviation: 'Sztywność σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Prąd σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Prąd σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Odstępstwo od okręgu w lewo',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Badanie okrągłości',\r\n                  EQUABILITY: 'Badanie współbieżności',\r\n                  CIRCULARITY: 'Badanie okrągłości',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Niedostępne badanie osi tego typu',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: 'Bramka',\r\n                contact: 'W razie błędu zwróć się do',\r\n                headline: 'Bramka',\r\n                netcfg: {\r\n                  cta: 'Prosimy udostępnić nam dane przy użyciu formularza Netcfg.',\r\n                  intro: 'W celu podłączenia maszyny potrzebujemy informacji dotyczących konfiguracji sieci.',\r\n                  title: 'Konfiguracja sieci',\r\n                  goToNetconfig: 'Otwieranie konfiguratora sieci',\r\n                },\r\n                device: {\r\n                  title: 'Informacje szczegółowe o urządzeniu',\r\n                },\r\n                enrollment: {\r\n                  pic: 'Jeżeli bramka IoT wygląda tak, należy wykonać następujące kroki:',\r\n                  line1: 'Pobierz plik Enrollment, klikając przycisk na dolnej krawędzi kafelka.',\r\n                  line2: 'Pobieranie uruchamia się automatycznie.',\r\n                  line3: 'Zapisz plik .json w katalogu głównym na pamięci USB. Upewnij się, że plik ma nazwę:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'Upewnij się, że w katalogu głównym na pamięci USB znajdują się następujące pliki:',\r\n                  line6: 'Włóż pamięć USB do odpowiedniej bramki IoT.',\r\n                  line7: 'Przyuczanie uruchamia się automatycznie, co jest sygnalizowane przez migającą zieloną diodę LED użytkownika.',\r\n                  line8: 'Po zakończonej pomyślnie rejestracji zielona dioda LED świeci do momentu wyjęcia pamięci USB.',\r\n                  title: 'Enrollment',\r\n                  button: 'Plik Enrollment',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'Pobierz plik „migrate-iot.zip” i wypakuj jego zawartość bezpośrednio na pustą pamięć USB.',\r\n                  line2: 'aws.json',\r\n                  line3: 'Pobierz również ',\r\n                  line4: ' i dodaj na pamięć USB. Upewnij się, że plik ma następującą nazwę:',\r\n                  line5: 'Upewnij się, że w katalogu głównym na pamięci USB znajdują się następujące pliki:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: 'Migracja platformy',\r\n                  line10: 'Włóż pamięć USB do odpowiedniej bramki IoT.',\r\n                  line11: 'Oprogramowanie instaluje się automatycznie, co jest sygnalizowane przez migającą żółtą diodę LED.',\r\n                  line12: 'Po zakończonej pomyślnie migracji zielona dioda LED świeci do momentu wyjęcia pamięci USB.',\r\n                  line13: 'Po zakończonej pomyślnie migracji zielona dioda LED świeci do momentu wyjęcia pamięci USB.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Generuj',\r\n                headline: 'Szeregi czasowe',\r\n                noChartMessage: 'Aby wyświetlić potrzebne dane, wybierz jedną lub większą liczbę zmiennych i kliknij Generuj',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: 'Alarmy',\r\n              },\r\n              service: {\r\n                contact: 'Skontaktuj się z',\r\n                headline: 'Serwis',\r\n                update: {\r\n                  title: 'Zaktualizuj plik',\r\n                },\r\n                upload: {\r\n                  title: 'Wczytaj plik',\r\n                  fields: {\r\n                    file: 'Plik',\r\n                    language: 'Język pliku',\r\n                    file_name: 'Nazwa pliku',\r\n                    list_of_languages: {\r\n                      cz: 'Czeski',\r\n                      de: 'Niemiecki',\r\n                      en: 'Angielski',\r\n                      es: 'Hiszpański',\r\n                      fr: 'Francuski',\r\n                      hu: 'Węgierski',\r\n                      it: 'Włoski',\r\n                      ko: 'Koreański',\r\n                      pl: 'Polski',\r\n                      tr: 'Turecki',\r\n                      zh: 'Chiński',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Wczytaj',\r\n                    cancel: 'Anuluj',\r\n                  },\r\n                  success: {\r\n                    title: 'Powodzenie',\r\n                    button: 'Wstecz do zestawienia serwisowego',\r\n                    message: 'Plik został wczytany pomyślnie',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Wprowadź nazwę pliku.',\r\n                    file_not_valid: 'Podaj plik / Wybierz mniejszy plik.',\r\n                    language_not_specified: 'Podaj język pliku.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Podręczniki',\r\n                },\r\n                version: {\r\n                  title: 'pliki wersji',\r\n                },\r\n                contracts: {\r\n                  title: 'Umowy',\r\n                },\r\n                components: {\r\n                  title: 'Komponenty osprzętu i oprogramowania',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Lista części zamiennych',\r\n                },\r\n                consumeables: {\r\n                  title: 'Materiały eksploatacyjne',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Aktualizuj',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Aby aktywować maszynę do zdalnego dostępu, TeamViewer musi być zainstalowany na bramce IoT. ',\r\n                  line2: 'Jeśli Teamviewer nie jest jeszcze zainstalowany, zainstaluj go, klikając po prostu „Zainstaluj”.',\r\n                  title: 'Zeskanuj program do wsparcia zdalnego',\r\n                  status: 'Status deployment',\r\n                  copy: {\r\n                    button: 'Skopiuj link',\r\n                  },\r\n                  install: {\r\n                    button: 'Zainstaluj Teamviewer',\r\n                  },\r\n                  session: {\r\n                    button: 'Uruchom sesję',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Bramka oprogramowania IoT',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: 'Machine Connect',\r\n                    operating_system: 'System operacyjny',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Czy potrzebujesz pomocy w odniesieniu do Twojej maszyny?',\r\n                  line2: 'Skontaktuj się z nami!',\r\n                  title: 'Wiadomość do serwisu SW',\r\n                  button: 'Skontaktować się z serwisem',\r\n                  fields: {\r\n                    name: 'Numer maszyny (SW)',\r\n                    type: 'Typ zapytania',\r\n                    email: 'E-mail',\r\n                    message: 'Wiadomość',\r\n                    phone_no: 'Numer telefonu',\r\n                    last_name: 'Nazwisko',\r\n                    first_name: 'Imię',\r\n                    contact_person: 'Konsultant (SW) [opcjonalnie]',\r\n                    list_of_types: {\r\n                      request: 'Zapytanie ogólne',\r\n                      service: 'Serwis',\r\n                      retrofit: 'Doposażenie',\r\n                      expansion: 'Rozszerzenie',\r\n                      inspection: 'Inspekcja',\r\n                    },\r\n                    machine_identifier_customer: 'ID maszyny (klient) [opcjonalnie]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Wyślij zapytanie',\r\n                    cancel: 'Anuluj',\r\n                  },\r\n                  success: {\r\n                    title: 'Udało się!',\r\n                    button: 'Powrót do przeglądu serwisu',\r\n                    message: 'Zapytanie zostało pomyślnie przesłane serwisowi SW.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Proszę podać ważny adres e-mail.',\r\n                    name_not_specified: 'Proszę podać ważny numer maszyny SW (co najmniej 7 znaków: A-Z, 0-9, - _).',\r\n                    phone_not_specified: 'Proszę podać ważny numer telefonu.',\r\n                    message_not_specified: 'Proszę podać wiadomość.',\r\n                    last_name_not_specified: 'Proszę podać nazwisko.',\r\n                    first_name_not_specified: 'Proszę podać imię.',\r\n                    family_name_not_specified: 'Proszę podać nazwisko.',\r\n                    contact_type_not_specified: 'Proszę podać typ zapytania.',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Oprogramowanie maszyny',\r\n                  values: {\r\n                    nc_version: 'Wersja NC',\r\n                    hmi_version: 'Wersja HMI',\r\n                    plc_version: 'Wersja PLC',\r\n                    compile_cycles: 'Cykle kompilacji',\r\n                    operating_system: 'System operacyjny',\r\n                    pcu_base_version: 'Wersja podstawowa PCU',\r\n                    plc_toolbox_version: 'Zestaw narzędzi PLC',\r\n                    plc_user_program_version: 'Program użytkowy PLC',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Nazwa pliku została pomyślnie zmieniona',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Zdalne wsparcie',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'Asystent aktywności jest pomocny w rozwiązywaniu problemu.',\r\n                  title: 'Asystent aktywności',\r\n                  sub_title: 'Czy masz obecnie trudności ze swoimi aktywami?',\r\n                  open_assistant: 'Otwórz asystenta aktywności',\r\n                  request_account: 'Złóż wniosek o konto',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Statystyki wrzeciona SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Gateway',\r\n                labelOnline: 'Wł.',\r\n                labelOffline: 'Wył.',\r\n              },\r\n              swimlane: {\r\n                headline: 'Dostępność linii',\r\n              },\r\n              endurance: {\r\n                headline: 'Test na końcu linii produkcyjnej',\r\n                chartTitles: {\r\n                  runtime: 'Dane czasu pracy',\r\n                  endurance: 'Test na końcu linii produkcyjnej',\r\n                  operation: 'Tryb pracy',\r\n                  qaxis_180: 'Oś Q 180°',\r\n                  nc_program: 'Program NC',\r\n                  stacklights: '3 Lampka sygnalizująca wezwanie',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Status przesyłania',\r\n                aborted: 'anulowano',\r\n                sending: 'wysyła',\r\n                undefined: 'niezdefiniowana',\r\n                interrupted: 'przerwano',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Mapa alarmów',\r\n              },\r\n              collection: {\r\n                headline: 'Kolekcja',\r\n                noChartMessage: 'Proszę wybrać kolekcję po lewej stronie.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Suma',\r\n                  header: 'Wydajność KPI',\r\n                  target: 'Wartość zadana',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarmy',\r\n                  category: [\r\n                    'Niesklasyfikowane',\r\n                    'Komunikat o błędzie',\r\n                    'Komunikat o działaniu',\r\n                    'Komunikat o stanie',\r\n                    'Instrukcja obsługi',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Czas oczekiwania',\r\n                    flatlist: 'Lista niezhierarchizowana',\r\n                    frequency: 'Częstość występowania',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Czas',\r\n                    trend: 'Trend',\r\n                    duration: 'Czas oczekiwania',\r\n                    leftTime: 'Alarm przemija',\r\n                    alarmCount: 'Liczba',\r\n                    alarmNumber: 'Nr alarmu',\r\n                    description: 'Opis',\r\n                    alarmOccured: 'Włączył się alarm',\r\n                    alarmClassification: 'Klasyfikacja alarmów',\r\n                    alarmCountSecondRange: 'Liczba T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'rosnąca',\r\n                      down: 'malejąca',\r\n                      flat: 'stała',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Szczegóły',\r\n                  ncProgram: 'Program NC',\r\n                  lastModified: 'Ostatnia rejestracja wartości',\r\n                  machineState: 'Stan maszyny',\r\n                  numberAlarms: 'Alarmy w stanie oczekiwania',\r\n                  stopCondition: 'Warunki zatrzymania',\r\n                  ncProgramState: 'Status programu NC',\r\n                  protectionLevel: 'Poziom ochrony',\r\n                  ncProgramStates: [\r\n                    'anulowano',\r\n                    'zatrzymano',\r\n                    'trwa',\r\n                    'w stanie oczekiwania',\r\n                    'przerwano',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'System',\r\n                    'Producent',\r\n                    'Serwis',\r\n                    'Użytkownik',\r\n                    'Przełącznik kluczykowy w położeniu 3',\r\n                    'Przełącznik kluczykowy w położeniu 2',\r\n                    'Przełącznik kluczykowy w położeniu 1',\r\n                    'Przełącznik kluczykowy w położeniu 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Czas cyklu',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Czas cyklu w s',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'OK',\r\n                  nok: 'nie OK',\r\n                  sum: 'Suma',\r\n                  title: 'Licznik sztuk',\r\n                  titleDayCounter: 'Licznik dzienny',\r\n                  titleShiftCounter: 'Licznik zmianowy',\r\n                  titleTotalCounter: 'Licznik łączny',\r\n                  titleTotalCounterSmall: 'Łącznie',\r\n                },\r\n                availability: {\r\n                  title: 'Dostępność',\r\n                  kpi: {\r\n                    title: 'Dostępność KPI',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG z błędem',\r\n                    MDA_with_error: 'MDA z błędem',\r\n                    JOG_without_error: 'JOG bez błędu',\r\n                    MDA_without_error: 'MDA bez błędu',\r\n                    not_defined_condition: 'Niezdefiniowany stan',\r\n                    auto_no_program_active: 'AUTO Brak aktywnego programu',\r\n                    auto_waiting_for_parts: 'AUTO Czekam na części',\r\n                    auto_with_error_program_stopped: 'AUTO z błędem – program zatrzymany',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO Czekam na części + błąd zatrzymania',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Zagregowana dostępność',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Dostępność',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Status',\r\n                },\r\n                operationMode: {\r\n                  title: 'Stan pracy',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Stan pracy',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Monitor okresu eksploatacji',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'wł.',\r\n                        off: 'wył.',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Korekcja wrzeciona',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Korekcja posuwu',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Uptime Distribution',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Administracja',\r\n                headline: 'Administracja',\r\n                aws: {\r\n                  title: 'Łącza AWS',\r\n                },\r\n                groups: {\r\n                  title: 'Grupy obiektów',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: 'Menedżer systemów',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Lista części',\r\n                },\r\n                component: {\r\n                  title: 'Komponenty',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Konserwacja',\r\n              },\r\n              spindleData: {\r\n                headline: 'Dane wrzeciona',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Dostęp zdalny',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Czas przed alarmem (s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Czas po alarmie (s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Monitoring energii',\r\n                chartTitles: {\r\n                  air: 'Zużycie sprężonego powietrza',\r\n                  current: 'Zużycie prądu',\r\n                  consumption: 'Średni pobór na godzinę',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Monitorowanie stanu',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Dodać nowe przedsiębiorstwo',\r\n            grid: {\r\n              city: 'Miejscowość',\r\n              email: 'E-mail',\r\n              street: 'Adres',\r\n              country: 'Kraj',\r\n              website: 'Strona internetowa',\r\n              postalCode: 'Kod pocztowy',\r\n              locationName: 'Lokalizacja',\r\n              locationCustomerNumber: 'Numer klienta',\r\n            },\r\n            tabs: {\r\n              list: 'Lokalizacje',\r\n              worldmap: 'Mapa świata',\r\n            },\r\n            success: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Utworzenie przedsiębiorstwa przebiegło pomyślnie.',\r\n            },\r\n            toggle_switch: 'Utwórz lokalizację z tymi samymi danymi',\r\n            new_form_title: 'Nowe przedsiębiorstwo',\r\n            edit_form_title: 'Edytuj przedsiębiorstwo',\r\n            new: {\r\n              fields: {\r\n                city: 'Miasto',\r\n                name: 'Nazwa przedsiębiorstwa',\r\n                email: 'E-mail [opcjonalnie]',\r\n                state: 'Kraj związkowy [opcjonalnie]',\r\n                street: 'Adres',\r\n                country: 'Kraj',\r\n                website: 'Strona internetowa [opcjonalnie]',\r\n                zipcode: 'Kod pocztowy',\r\n                legal_form: 'Forma prawna [opcjonalnie]',\r\n                name_short: 'Nazwa przedsiębiorstwa (skrócona) [opcjonalnie]',\r\n                description: 'Opis [opcjonalnie]',\r\n                company_logo: 'Logo przedsiębiorstwa (URL) [opcjonalnie]',\r\n                customer_number: 'Numer klienta',\r\n                industry_sector: 'Sektor przemysłu',\r\n                description_external: 'Opis (zewnętrzny) [opcjonalnie]',\r\n                description_internal: 'Opis (wewnętrzny) [opcjonalnie]',\r\n              },\r\n              error_messages: {\r\n                url: 'Proszę podać ważny adres URL.',\r\n                email: 'Proszę podać ważny adres e-mail.',\r\n                city_not_specified: 'Proszę podać miasto.',\r\n                name_not_specified: 'Proszę podać nazwę przedsiębiorstwa.',\r\n                street_not_specified: 'Proszę podać adres.',\r\n                country_not_specified: 'Proszę podać kraj.',\r\n                zipcode_not_specified: 'Proszę podać kod pocztowy.',\r\n                customer_number_not_specified: 'Proszę podać numer klienta.',\r\n                industry_sector_not_specified: 'Proszę podać sektor przemysłu.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Aktualizacja przedsiębiorstwa przebiegła pomyślnie.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-mail',\r\n                address: 'Adres',\r\n                country: 'Kraj',\r\n                website: 'Strona internetowa',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'Platforma SW CloudPlatform pokazuje to przedsiębiorstwo na mapie i stosuje do tego celu stopnie długości i szerokości geograficznej.',\r\n              intro_heading: 'Informacje o miejscowości',\r\n              location_name: 'Nazwa miejscowości:',\r\n              label_latitude: 'Stopień szerokości geograficznej',\r\n              label_longitude: 'Stopień długości geograficznej',\r\n              text_fallback_info: 'Jeśli nie, stosowane są współrzędne standardowe.',\r\n              text_location_found: 'Znaleziono miejscowość.',\r\n              text_location_entered: 'Podano miejscowość.',\r\n              text_success_location: 'Ustawiono następujące dane:',\r\n              button_define_coordinates: 'Wprowadź współrzędne samodzielnie',\r\n              text_no_coordinates_found: 'Nie znaleziono współrzędnych dla wprowadzonych danych.',\r\n              text_coordinates_success_set: 'Współrzędne ustawione.',\r\n              button_set_custom_coordinates: 'Ustaw współrzędne',\r\n              text_specify_coordinates_yourself: 'Alternatywnie można wprowadzić współrzędne samodzielnie.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Dodaj nową lokalizację',\r\n            tabs: {\r\n              list: 'Hale',\r\n              shopfloor: 'Przestrzeń produkcyjna',\r\n            },\r\n            grid: {\r\n              hallName: 'Hala',\r\n            },\r\n            success: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Utworzenie lokalizacji przebiegło pomyślnie.',\r\n            },\r\n            new_form_title: 'Nowa lokalizacja',\r\n            edit_form_title: 'Edytuj lokalizację',\r\n            new: {\r\n              fields: {\r\n                city: 'Miasto',\r\n                name: 'Nazwa lokalizacji',\r\n                email: 'E-mail [opcjonalnie]',\r\n                state: 'Kraj związkowy [opcjonalnie]',\r\n                street: 'Adres',\r\n                country: 'Kraj',\r\n                website: 'Strona internetowa [opcjonalnie]',\r\n                zipcode: 'Kod pocztowy',\r\n                language: 'Język [opcjonalnie]',\r\n                name_short: 'Nazwa lokalizacji (forma skrócona) [opcjonalnie]',\r\n                description: 'Opis [opcjonalnie]',\r\n                customer_number: 'Numer klienta [opcjonalnie]',\r\n                description_internal: 'Opis (wewnętrzny) [opcjonalnie]',\r\n              },\r\n              error_messages: {\r\n                email: 'Proszę podać ważny adres e-mail.',\r\n                city_not_specified: 'Proszę podać miasto.',\r\n                name_not_specified: 'Proszę podać nazwę lokalizacji.',\r\n                street_not_specified: 'Proszę podać adres.',\r\n                country_not_specified: 'Proszę podać kraj.',\r\n                zipcode_not_specified: 'Proszę podać kod pocztowy.',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Udało się!',\r\n              button: 'Powrót do listy',\r\n              message: 'Aktualizacja lokalizacji przebiegła pomyślnie.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Adres',\r\n                country: 'Kraj',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Miejscowość',\r\n              email: 'E-mail',\r\n              street: 'Adres',\r\n              country: 'Kraj',\r\n              website: 'Strona internetowa',\r\n              postalCode: 'Kod pocztowy',\r\n              companyName: 'Przedsiębiorstwo',\r\n            },\r\n            tabs: {\r\n              list: 'Przedsiębiorstwo',\r\n              worldmap: 'Mapa świata',\r\n            },\r\n            map: {\r\n              description_not_available: 'Brak dostępnego opisu',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Dodaj',\r\n                back: 'Powrót do listy',\r\n                edit: 'Aktualizuj',\r\n                save: 'Zapisz',\r\n                email: 'Wyślij obraz',\r\n                cancel: 'Anuluj',\r\n                addMultiple: 'Dodaj + nowe',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Edytuj administrację',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Zapewnianie jakości',\r\n          users: 'Zarządzanie użytkownikami',\r\n          assets: 'Zarządzanie instalacjami',\r\n          settings: 'Ustawienia',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profil użytkownika',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Zarządzanie użytkownikami',\r\n          assets: 'Zarządzanie instalacjami',\r\n          dashboard: 'Dashboard',\r\n          userProfile: 'Profil użytkownika',\r\n        },\r\n        variables: {\r\n          bar: 'Słupkowa',\r\n          plc: 'PLC',\r\n          area: 'Obszarowa',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Liniowa',\r\n          long: 'Długa',\r\n          real: 'REAL',\r\n          true: 'Aktywna',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Nieaktywna',\r\n          float: 'Zmiennoprzecinkowa',\r\n          uword: 'UWORD',\r\n          double: 'Podwójna',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Logiczna',\r\n          integer: 'L. całkowita',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Zewnętrzna',\r\n          internal: 'Wewnętrzna',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Jeden rok',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Dodaj nową zmienną',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Jeden miesiąc',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Prostokąt',\r\n          tabs: {\r\n            list: 'Lista zmiennych',\r\n          },\r\n          ten_years: 'Dziesięć lat',\r\n          two_weeks: 'Dwa tygodnie',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Sześć miesięcy',\r\n          categorical: 'Z kategoriami',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Coś poszło nie tak podczas próby utworzenia zmiennej. Spróbuj ponownie później.',\r\n          },\r\n          new_form_title: 'Nowa zmienna',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Edytuj zmienną',\r\n          new: {\r\n            fields: {\r\n              hint: '(Zmiany mogą uszkodzić maszynę)',\r\n              showId: 'Pokaż pole wprowadzania identyfikatora zmiennej',\r\n              maxTime: 'Maks. czas',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Typ danych',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Typ wykresu',\r\n              namePrefix: 'Prefiks nazwy',\r\n              variableId: 'Identyfikator zmiennej',\r\n              collections: '',\r\n              displayName: 'Nazwa wyświetlana',\r\n              showInitial: 'Pokaż inicjał',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Widoczność',\r\n            },\r\n            buttons: {\r\n              delete: 'Usuń zmienną',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Wybierz maks. czas',\r\n              dataType: 'Wybierz typ danych',\r\n              chartType: 'Wybierz typ wykresu',\r\n              namePrefix: 'Wybierz prawidłową nazwę prefiksu. (dozwol. znaki: A-Z, _).',\r\n              variableId: 'Określ prawidłowy uniwersalny unikalny identyfikator (UUID)',\r\n              displayName: 'Określ nazwę wyświetlaną',\r\n              showInitial: 'Wybierz inicjał',\r\n              namePrefixEdit: 'Wybierz prawidłową nazwę prefiksu. (dozwol. znaki: A-Z a-z, _).',\r\n              visibilityType: 'Wybierz typ widoczności',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'Zmienne zostały utworzone prawidłowo',\r\n          },\r\n          editError: {\r\n            message: 'Coś poszło nie tak podczas próby aktualizacji zmiennej. Spróbuj ponownie później.',\r\n          },\r\n          editSuccess: {\r\n            message: 'Zmienna została zaktualizowana prawidłowo',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Udane przesyłanie danych',\r\n          downloads: 'Pobrania zakończone powodzeniem',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Wystąpił nieoczekiwany błąd. Spróbuj na nowo wczytać stronę.',\r\n            },\r\n            s_1: {\r\n              message: 'Zmiany zostały zapisane.',\r\n            },\r\n            s_930: {\r\n              message: \"Zasób '%replaceValue' został usunięty prawidłowo.\",\r\n            },\r\n            s_931: {\r\n              message: \"Firma '%replaceValue' została usunięta prawidłowo.\",\r\n            },\r\n            s_932: {\r\n              message: \"Linia '%replaceValue' została usunięta prawidłowo.\",\r\n            },\r\n            s_933: {\r\n              message: \"Hala '%replaceValue' została usunięta prawidłowo.\",\r\n            },\r\n            s_934: {\r\n              message: \"Lokalizacja '%replaceValue' została usunięta prawidłowo.\",\r\n            },\r\n            s_935: {\r\n              message: \"Plik '%replaceValue' został usunięty.\",\r\n            },\r\n            s_936: {\r\n              message: \"Zmienna '%replaceValue' została usunięta prawidłowo.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Podwójne mapy zostały usunięte!',\r\n            add_line_to_dashboard: 'Linia została dodana do pulpitu',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Limity',\r\n            type: 'Wybierz na podstawie typu',\r\n            alarms: 'Alarmy',\r\n            machine: 'Wybierz na podstawie ID urządzenia',\r\n            variables: 'Zmienne',\r\n            listImport: 'Limity importowania',\r\n            listDownload: 'Limity pobierania',\r\n          },\r\n          text: {\r\n            text: 'Wartości graniczne to wartości definiowane dla zmiennych w sferze zainteresowania. Jeżeli dana zmienna nie mieści się w zdefiniowanych wartościach granicznych, otrzymasz powiadomienie. Wartości graniczne są widoczne również na wykresach generowanych w zakładce „Szeregi czasowe”.',\r\n            title: 'Limity',\r\n          },\r\n          export: {\r\n            text: 'W każdej chwili można wyeksportować aktualnie ustawione wartości graniczne dla wszystkich zmiennych na platformie Cloud Platform. Niniejszej listy można użyć jako referencji albo do zaimportowania jednocześnie wszystkich wartości granicznych w sekcji „Importuj wartości graniczne jako CSV”',\r\n            title: 'Eksporty limity jako CSV',\r\n          },\r\n          import: {\r\n            text: 'Można zaimportować pobrany wcześniej plik CSV z informacjami dotyczącymi limitów i subskrybentów, aby zaktualizować aktualnie zapisane wartości. Później możesz wybrać, do którego typu urządzeń lub maszyn chcesz zastosować zaimportowane wartości graniczne',\r\n            title: 'Importowanie wartości granicznych z pliku CSV',\r\n            machines: {\r\n              title: 'Wybierz maszyny lub typ maszyny, do których chcesz zastosować wartości graniczne.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Wybierz plik CSV, który chcesz zaimportować',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Przejdź do wybranej linii w zarządzaniu aktywami.',\r\n            two: 'W wierszu nagłówka znajduje się menu kontekstowe.',\r\n            four: 'Kafelek linii zostanie dodany do pulpitu.',\r\n            three: 'Kliknij menu kontekstowe i wybierz „Dodaj do pulpitu”.',\r\n            header: 'Dodawanie kafelków linii',\r\n          },\r\n          individual: {\r\n            one: 'Kliknij symbol „Koło zębate” po lewej stronie.',\r\n            two: 'Wybierz symbol „Plus”.',\r\n            four: 'Potwierdź naciskając „Zapisz”. Pojedynczy kafelek zostanie dodany do pulpitu.',\r\n            three: 'Nazwij swój kafelek i dodaj wybrane przez siebie maszyny.',\r\n            header: 'Dodawanie indywidualnych kafelków',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Utwórz nowego użytkownika',\r\n          new: {\r\n            title: 'Utwórz użytkownika',\r\n            status: 'Status użytkownika:',\r\n            buttons: {\r\n              add: 'Dodaj',\r\n              back: 'Powrót do listy',\r\n              save: 'Zapisz',\r\n              cancel: 'Anuluj',\r\n              delete: 'Usuń użytkownika',\r\n              sendMail: 'Wyślij wiadomość e-mail ponownie',\r\n            },\r\n            fields: {\r\n              email: 'E-mail',\r\n              roles: 'Grupa użytkowników',\r\n              gender: 'Płeć',\r\n              created: 'Utworzył(a)',\r\n              lastName: 'Nazwisko',\r\n              firstName: 'Imię',\r\n              breadcrumb: 'Pokaż nawigację',\r\n              main_group: 'Grupa użytkowników',\r\n              phoneNumber: 'Numer telefonu [opcjonalnie]',\r\n              customer_org: 'Organizacja klienta',\r\n              last_modified: 'Ostatnia edycja',\r\n              email_validation: 'E-mail (walidacja)',\r\n            },\r\n            statusText: {\r\n              unknown: 'nieznany',\r\n              archived: 'zarchiwizowany',\r\n              confirmed: 'potwierdzony',\r\n              compromised: 'naruszył bezpieczeństwo',\r\n              unconfirmed: 'niepotwierdzony',\r\n              reset_required: 'Wymagany reset',\r\n              external_provider: 'dostawca zewnętrzny',\r\n              force_change_password: 'Zaległa zmiana hasła',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'Adresy e-mail nie są zgodne.',\r\n              email_not_valid: 'Proszę podać ważny adres e-mail.',\r\n              phone_not_specified: 'Wprowadź prawidłowy numer telefonu, który rozpoczyna się od znaku + oraz numeru kierunkowego kraju!',\r\n              roles_not_specified: 'Wybierz grupę użytkowników.',\r\n              gender_not_specified: 'Wprowadź płeć.',\r\n              last_name_not_specified: 'Wprowadź imię i nazwisko.',\r\n              first_name_not_specified: 'Proszę podać imię.',\r\n              main_group_not_specified: 'Wybierz grupę użytkowników.',\r\n              family_name_not_specified: 'Proszę podać nazwisko.',\r\n              customer_organization_not_specified: 'Proszę wybrać organizację klienta.',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Zakończone niepowodzeniem!',\r\n          },\r\n          mail: {\r\n            success: 'Wiadomość e-mail z automatycznie wygenerowanym hasłem została wysłana na podany adres e-mail.',\r\n          },\r\n          update: {\r\n            title: 'Zaktualizuj użytkownika',\r\n          },\r\n          success: {\r\n            title: 'Udało się!',\r\n            button: 'Powrót do listy',\r\n            message: 'Utworzenie użytkownika przebiegło pomyślnie. Wiadomość e-mail z automatycznie wygenerowanym hasłem została wysłana na podany adres e-mail.',\r\n            message_for_edit: 'Aktualizacja użytkownika przebiegła pomyślnie.',\r\n            message_send_mail: 'Wiadomość e-mail z automatycznie wygenerowanym hasłem została wysłana na podany adres e-mail.',\r\n            button_back_to_last_page: 'Powrót do ostatniej strony',\r\n          },\r\n          delete: {\r\n            success: 'Użytkownik usunięty pomyślnie.',\r\n            confirmation: {\r\n              title: 'Czy naprawdę chcesz usunąć tego użytkownika?',\r\n              confirm: 'Tak, usuń tego użytkownika',\r\n              dismiss: 'Nie, anuluj',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Gość',\r\n            customer: 'Klient',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Użytkownik',\r\n              email: 'E-mail',\r\n              company: 'Firma',\r\n              enabled: 'Status',\r\n              lastName: 'Nazwisko',\r\n              sw_admin: 'Administrator SW',\r\n              firstName: 'Imię',\r\n              userRights: 'Status praw',\r\n              phoneNumber: 'Numer telefonu',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'męska',\r\n              female: 'żeńska',\r\n              diverse: 'odmienna',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarmy',\r\n            type: 'Wybierz na podstawie typu',\r\n            machine: 'Wybierz na podstawie ID urządzenia',\r\n            listImport: 'Import alarmów',\r\n            listDownload: 'Pobieranie pliku alarmów',\r\n          },\r\n          text: {\r\n            text: 'Można ustalić powiadomienia alarmowe dla numerów alarmów, które Cię interesują. Jeżeli w zdefiniowanej maszynie wystąpi nastawiony alarm, otrzymasz powiadomienie.',\r\n            title: 'Powiadomienia alarmowe',\r\n          },\r\n          export: {\r\n            text: 'W każdej chwili można wyeksportować aktualnie nastawione powiadomienia alarmowe wszystkich maszyn w SW CloudPlatform. Niniejszej listy można użyć jako referencji lub do zaimportowania jednocześnie wszystkich powiadomień alarmowych w sekcji „Import alarmów w postaci pliku CSV”.',\r\n            title: 'Eksport alarmów w postaci pliku CSV',\r\n          },\r\n          import: {\r\n            text: 'Można zaimportować pobrany wcześniej plik CSV z informacjami dotyczącymi alarmów i abonentów, aby zaktualizować aktualnie zapisane wartości. Później można wybrać, do którego typu urządzeń lub maszyn mają zostać zastosowane zaimportowane powiadomienia alarmowe.',\r\n            title: 'Importuj alarmy z pliku CSV',\r\n            machines: {\r\n              title: 'Wybierz maszyny lub typ maszyn, do których chcesz zastosować powiadomienia alarmowe.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'Wybierz plik CSV, który chcesz zaimportować',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'Nie znaleziono żadnych wyników',\r\n          results: {\r\n            of: 'z',\r\n            lines: 'Linie',\r\n            machines: 'Maszyny',\r\n          },\r\n          callToAction: 'Wyszukaj maszyny',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Zakończone niepowodzeniem',\r\n            queued: 'W kolejce',\r\n            removed: 'Usunięte',\r\n            canceled: 'Odrzucone',\r\n            rejected: 'Odrzucone',\r\n            completed: 'Ukończone',\r\n            succeeded: 'Powodzenie',\r\n            timed_out: 'Przekroczenie czasu',\r\n            in_progress: 'W toku',\r\n            not_installed: 'Niezainstalowane',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: 'Rozpocznij import',\r\n            dismiss: 'Anuluj',\r\n            download: 'Rozpocznij pobieranie',\r\n          },\r\n          tabs: {\r\n            limits: 'Granice',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Nazwa',\r\n              datatype: 'typ danych',\r\n              chartType: 'Typ wykresu',\r\n              displayName: 'Nazwa wyświetlana',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Mapa świata',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Przestrzeń produkcyjna',\r\n          upload: {\r\n            text1: 'Wyślij obraz układu hali produkcyjnej na adres lifedata@sw-machines.com (JPG, PNG, PDF).',\r\n            text2: 'Jeżeli Twoje maszyny są zarejestrowane i zapisane w SW CloudPlatform, wyświetlą się po lewej stronie i zaczną wysyłać dane w czasie rzeczywistym.',\r\n            text3: 'Następnie wystarczy przeciągnąć i upuścić status na swój plan przy odpowiedniej maszynie.',\r\n            mainText: 'W tym widoku można skonfigurować własny układ hali produkcyjnej i przeglądać maszyny za pośrednictwem poszczególnych warstw informacyjnych. Wystarczy wykonać te czynności.',\r\n            tileTitle: 'Przesyłanie hali produkcyjnej',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Zasób usunięty prawidłowo.',\r\n            confirmation: {\r\n              title: \"Czy na pewno chcesz usunąć '%replaceValue'?\",\r\n              confirm: 'usuń',\r\n              dismiss: 'anuluj',\r\n              company: {\r\n                text: 'W przypadku usunięcia przedsiębiorstwa usunięci zostaną również powiązani użytkownicy.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń zasób',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: 'Zmiany w NamePrefix lub DataType mogą uszkodzić maszynę. Czy na pewno chcesz zapisać?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Czy chcesz zatwierdzić wartości graniczne nowego typu maszyny?',\r\n              title: 'Typ maszyny został zmieniony',\r\n              accept: 'Tak, przejmij nowe wartości graniczne',\r\n              decline: 'Nie, zachowaj aktualne wartości graniczne',\r\n              dismiss: 'Anuluj',\r\n              info_accept: 'Aby zastąpić aktualne wartości graniczne wartościami granicznymi nowego typu maszyny, wybierz „Tak”.',\r\n              info_decline: 'Aby zachować aktualne wartości graniczne, wybierz „Nie”.',\r\n              info_accept_warning: 'Wszystkie aktualne wartości graniczne zostaną zastąpione lub usunięte.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń plik',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń halę',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń linię',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'Status',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Czas maszyny',\r\n          controller_time: 'Czas sterownika',\r\n          iot_gateway_time: 'Czas bramki IoT',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'DD.MM.YYYY HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'DD.MM.YYYY HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Brak danych',\r\n              loading: 'Wczytaj dane...',\r\n              months: [\r\n                'Styczeń',\r\n                'Luty',\r\n                'Marzec',\r\n                'Kwiecień',\r\n                'Maj',\r\n                'Czerwiec',\r\n                'Lipiec',\r\n                'Sierpień',\r\n                'Wrzesień',\r\n                'Październik',\r\n                'Listopad',\r\n                'Grudzień',\r\n              ],\r\n              resetZoom: 'Zresetuj zoom',\r\n              weekdays: [\r\n                'Niedziela',\r\n                'Poniedziałek',\r\n                'Wtorek',\r\n                'Środa',\r\n                'Czwartek',\r\n                'Piątek',\r\n                'Sobota',\r\n              ],\r\n              shortMonths: [\r\n                'STY',\r\n                'LUT',\r\n                'MAR',\r\n                'KWI',\r\n                'MAJ',\r\n                'CZE',\r\n                'LIP',\r\n                'SIE',\r\n                'WRZ',\r\n                'PAŹ',\r\n                'LIS',\r\n                'GRU',\r\n              ],\r\n              shortWeekdays: [\r\n                'Niedz.',\r\n                'Pon.',\r\n                'Wt.',\r\n                'Śr.',\r\n                'Czw.',\r\n                'Pt.',\r\n                'Sob.',\r\n              ],\r\n              increaseDateRange: 'co najmniej do',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Ustawienia domyślne',\r\n            rangeTo: 'Do',\r\n            selectDateRange: 'Wybierz przedział czasu',\r\n            predefined: {\r\n              today: 'Dzisiaj',\r\n              custom: 'Zakres niestandardowy',\r\n              last7days: 'Ostatnie 7 dni',\r\n              yesterday: 'Wczoraj',\r\n              last24Hours: 'Ostatnie 24 godz.',\r\n              last5Minutes: 'Ostatnie 5 min.',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Edytuj zmienną',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń zmienną',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Wybrać język',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń firmę',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Usuń lokalizację',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'Status',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Konfiguruj pulpit',\r\n            hide: {\r\n              title: 'Ukryj',\r\n            },\r\n            show: {\r\n              title: 'Wyświetl',\r\n            },\r\n            delete: {\r\n              title: 'usuń',\r\n            },\r\n            add: {\r\n              fab_title: 'Dodaj własny kafelek',\r\n            },\r\n            save: {\r\n              fab_title: 'Zapisz konfigurację',\r\n            },\r\n            move_left: {\r\n              title: 'Przesuń do poprzedniej pozycji',\r\n            },\r\n            move_right: {\r\n              title: 'Przesuń do następnej pozycji',\r\n            },\r\n            discard: {\r\n              fab_title: 'Anuluj konfigurację',\r\n            },\r\n            add_custom_card: {\r\n              save: 'zapisz',\r\n              input: 'Podaj nazwę kafelka',\r\n              title: 'Dodaj własny kafelek',\r\n              cancel: 'anuluj',\r\n              missingMachine: 'Należy wybrać co najmniej jedną maszynę',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Wystąpił nieoczekiwany błąd. Spróbuj na nowo wczytać stronę.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Błąd informacyjny',\r\n            },\r\n            e_2xx: {\r\n              message: 'Sukces',\r\n            },\r\n            e_3xx: {\r\n              message: 'Przekierowanie',\r\n            },\r\n            e_400: {\r\n              message: 'Zapytanie było błędne i nie udało się go przetworzyć.',\r\n            },\r\n            e_401: {\r\n              message: 'Nie przeprowadzono uwierzytelnienia. Zaloguj się ponownie.',\r\n            },\r\n            e_403: {\r\n              message: 'Nie masz uprawnień umożliwiających otwarcie żądanego zasobu.',\r\n            },\r\n            e_404: {\r\n              message: 'Żądany zasób nie są dostępny.',\r\n            },\r\n            e_405: {\r\n              message: 'Metoda nie jest dozwolona.',\r\n            },\r\n            e_406: {\r\n              message: 'Metoda nieakceptowana',\r\n            },\r\n            e_409: {\r\n              message: 'Zasób już istnieje.',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: 'Treść metody niemożliwa do przetworzenia',\r\n            },\r\n            e_4xx: {\r\n              message: 'Błąd klienta',\r\n            },\r\n            e_500: {\r\n              message: 'Wystąpił błąd wewnętrzny serwera.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Błąd serwera',\r\n            },\r\n            e_900: {\r\n              message: 'Próba utworzenia aktywów nie powiodła się. Spróbuj ponownie później.',\r\n            },\r\n            e_901: {\r\n              message: 'Operacja została anulowana. Nie utworzono nowych aktywów.',\r\n            },\r\n            e_902: {\r\n              message: 'Operacja została anulowana. Nie wysłano zapytania serwisowego.',\r\n            },\r\n            e_903: {\r\n              message: 'Podczas próby wysłania zapytania serwisowego pojawił się problem. Spróbuj ponownie później.',\r\n            },\r\n            e_904: {\r\n              message: \"Aktywa '%replaceValue' utworzone pomyślnie. Możesz teraz dodać dalsze aktywa.\",\r\n            },\r\n            e_905: {\r\n              message: 'Operacja została anulowana. Aktywa nie zostały zaktualizowane.',\r\n            },\r\n            e_906: {\r\n              message: \"Zasób '%replaceValue' został przesunięty pomyślnie.\",\r\n            },\r\n            e_910: {\r\n              message: 'Próba utworzenia użytkownika nie powiodła się. Spróbuj ponownie później.',\r\n            },\r\n            e_911: {\r\n              message: 'Operacja została anulowana. Nie utworzono nowego użytkownika.',\r\n            },\r\n            e_912: {\r\n              message: 'Próba aktualizacji zasobu nie powiodła się. Spróbuj ponownie.',\r\n            },\r\n            e_920: {\r\n              message: 'Operacja została anulowana. Nie zapisano zmian.',\r\n            },\r\n            e_921: {\r\n              message: 'Wystąpił nieoczekiwany błąd. Spróbuj ponownie.',\r\n            },\r\n            e_922: {\r\n              message: 'Nazwa użytkownika i/lub hasło nie jest poprawne. Spróbuj ponownie.',\r\n            },\r\n            e_923: {\r\n              message: 'Podaj nazwę użytkownika i hasło.',\r\n            },\r\n            e_924: {\r\n              message: 'Twoja sesja wygasła na skutek nieaktywności. Zaloguj się ponownie.',\r\n            },\r\n            e_925: {\r\n              message: 'Korzystanie z platformy SW Cloud Platform wymaga zaakceptowania naszej polityki prywatności.',\r\n            },\r\n            e_926: {\r\n              message: 'Twoje konto jest tymczasowo zablokowane. Spróbuj ponownie za kilka minut.',\r\n            },\r\n            e_927: {\r\n              message: 'Twoje hasło zostało zmienione pomyślnie.',\r\n            },\r\n            e_928: {\r\n              message: 'Operacja została anulowana. Nie wczytano żadnego pliku.',\r\n            },\r\n            e_929: {\r\n              message: 'Podczas próby wczytania pliku wystąpił problem. Spróbuj ponownie później.',\r\n            },\r\n            e_930: {\r\n              message: 'Próba usunięcia pliku nie powiodła się. Spróbuj ponownie później.',\r\n            },\r\n            e_931: {\r\n              message: 'Niestandardowy zakres danych jest za duży. Domyślnie nastawiony jest 24h.',\r\n            },\r\n            e_932: {\r\n              message: 'Maszyna ma podrzędne elementy. Najpierw usuń podrzędne elementy.',\r\n            },\r\n            e_933: {\r\n              message: \"Zmienna '%replaceValue' została utworzona prawidłowo. Teraz możesz dodać kolejną zmienną.\",\r\n            },\r\n            e_934: {\r\n              message: 'Coś poszło nie tak podczas próby usunięcia zmiennej. Spróbuj ponownie później.',\r\n            },\r\n            e_10500: {\r\n              message: 'Wygląda na to, że nie masz połączenia z Internetem. Upewnij się, że masz połączenie.',\r\n            },\r\n            e_10501: {\r\n              message: 'Używasz nieobsługiwanej przeglądarki internetowej. Użyj jednej z poniższych przeglądarek: Google Chrome, Microsoft Edge, Apple Safari.',\r\n            },\r\n            e_409_asset: {\r\n              message: 'Zasób (numer maszyny SW %replaceValue) już istnieje.',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Istnieje już plik o nazwie %replaceValue',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Równocześnie można wybrać tylko %s elementy(-ów)',\r\n              title: 'Maks. liczba osiągnięta',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Filtr czasu',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Brak dostępnych plików.',\r\n              file_cardTitle: 'Zdarzenia dotyczące maszyny',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Pobierz dane',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'Pliki śledzące sterowania numerycznego',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Brak alarmów',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'Pliki porównawcze ster. numerycznego',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'Pliki danych sterowania numerycznego',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Brak dostępnych plików.',\r\n              file_cardTitle: 'Pliki ToolMon',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'Pobierz dane ToolMon',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Wyzwalacz',\r\n              column_title_filename: 'Nazwa pliku',\r\n              column_title_creation_date: 'Data utworzenia',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'Pliki HMI rejestratora parametrów lotu',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  tr: {\r\n    translation: {\r\n      generic: {\r\n        logout: 'Çıkış yap',\r\n        release: \"'%replaceValue1' ile '%replaceValue2' arasında platformda bakım çalışmaları yapılacaktır. Bu sürede platform kısmen kullanım dışı kalacaktır.\",\r\n        pageTitle: 'SW CloudPlatform',\r\n        closeLabel: 'Kapat',\r\n        acceptLabel: 'Kabul et',\r\n        userProfile: 'Kullanıcı profili',\r\n        button: {\r\n          clear: 'Grafiği kaldır',\r\n          timeline: 'Sınır ayarlaması',\r\n          separateCharts: 'Grafikleri ayır',\r\n        },\r\n        declineLabel: 'Reddet',\r\n        backToDashboard: 'Panoya geri dön',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / standartlar',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: 'İletişim bilgileri',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: 'Baskı',\r\n          },\r\n          privacy: {\r\n            title: 'Gizlilik',\r\n            header: 'Gizlilik Politikası',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/en/',\r\n            title: 'SW ana sayfası',\r\n          },\r\n        },\r\n        noInternetConnection: 'İnternete bağlı olmadığınız anlaşılıyor. Lütfen bağlı olduğunuzdan emin olun.',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: '/',\r\n          noData: 'Veri yok',\r\n          dateFormat: 'AA/GG/YYYY',\r\n          downloaded: 'indirildi',\r\n          noDuration: 'süre mevcut değil',\r\n          timeFormat: 'ss:dd:ss A',\r\n          notLicensed: 'Makineniz lisanslı değil.',\r\n          alarmPending: 'alarm bekleniyor',\r\n          buttons: {\r\n            back: 'Geri',\r\n            save: 'Kaydet',\r\n            view: 'Görüntüle',\r\n            cancel: 'İptal et',\r\n            custom: 'Kaydet + Özel aralığı ayarla',\r\n            submit: 'Gönder',\r\n            export: {\r\n              limit: 'Sınırları indir',\r\n              alarms: 'Alarmları indir',\r\n            },\r\n            import: {\r\n              limit: 'Başlat',\r\n              alarms: 'Başlat',\r\n            },\r\n            refreshReset: 'Varsayılan zamana sıfırla',\r\n            selectAllCheckboxes: 'Tüm onay kutularını seç',\r\n            unselectAllCheckboxes: 'Tüm onay kutularının işaretini kaldır',\r\n          },\r\n          notAvailable: 'Mevcut değil',\r\n          notConnected: 'Henüz bağlanmadı',\r\n          download: {\r\n            file: 'Dosya indirmeleri',\r\n          },\r\n          dateTimeFormat: 'AA/GG/YYYY ss:dd:ss A',\r\n          timeFormats: {\r\n            day: 'gün',\r\n            days: 'gün',\r\n            hour: 'saat',\r\n            year: 'yıl',\r\n            hours: 'saat',\r\n            month: 'ay',\r\n            years: 'yıl',\r\n            minute: 'dakika',\r\n            months: 'ay',\r\n            second: 'saniye',\r\n            minutes: 'dakika',\r\n            seconds: 'saniye',\r\n          },\r\n          notAvailableShort: 'yok',\r\n          timeFormatDuration: 'SS:dd:ss',\r\n          timeFormatWithoutSeconds: 'ss:dd A',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: 'Anlaşıldı',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: 'Bunu geri alamazsınız!',\r\n        },\r\n        error: {\r\n          upload: 'Başarısız yüklemeler',\r\n          download: 'Başarısız indirmeler',\r\n          message: {\r\n            enrollment_code_409: \"Cihaz zaten aws'ye kayıtlı.\",\r\n            limit_change_failed: 'Sınırlar değiştirilirken bir hata oluştu. Lütfen tekrar deneyin veya lifedata@sw-machines.com ile iletişime geçin',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: 'zaman kayıtları',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: 'Değişkenleri seçin',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: 'Tarih',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: 'Güvenli katılımlı erişim',\r\n            directAccess: 'Doğrudan erişim',\r\n            new: {\r\n              fields: {\r\n                id: 'Kimlik girin',\r\n                cOnePanel: 'C|One ile',\r\n                sessionType: 'Oturum tipi',\r\n              },\r\n              error_messages: {\r\n                id: 'Lütfen bir Oturum kimliği veya Cihaz kimliği girin',\r\n                sessionType: 'Lütfen bir Oturum türü seçin',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPI’lar',\r\n              list: 'Makineler',\r\n              shopfloor: 'Üretim bölümü',\r\n            },\r\n            fab_title: 'Yeni hat ekle',\r\n            grid: {\r\n              hall: 'Salon',\r\n              line: 'Hat',\r\n              type: 'Tür',\r\n              contractEnd: 'Sözleşme sonu',\r\n              cellPosition: 'Hücre / konum',\r\n              operationStep: 'Proses adımı',\r\n              machineIdentifierSw: 'Makine no. (SW)',\r\n              machineIdentifierCustomer: 'Makine adı',\r\n            },\r\n            success: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Hat başarıyla oluşturuldu.',\r\n            },\r\n            new_form_title: 'Hat ekle',\r\n            edit_form_title: 'Hattı düzenle',\r\n            new: {\r\n              fields: {\r\n                name: 'Hat adı',\r\n                name_short: 'Hat adı (kısa ad) [isteğe bağlı]',\r\n                description: 'Açıklama [isteğe bağlı]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Lütfen bir hat adı girin',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Hat başarıyla güncellendi.',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: 'Yeni salon ekle',\r\n            grid: {\r\n              part: 'Parça',\r\n              lineName: 'Hat',\r\n              typeOfLoading: 'Yükleme türü',\r\n              lineResponsible: 'Hat yöneticisi',\r\n              plannedQuantity: 'Planlanan miktar',\r\n              numberOfMachines: 'Makine sayısı',\r\n            },\r\n            tabs: {\r\n              list: 'Hatlar',\r\n              shopfloor: 'Üretim bölümü',\r\n            },\r\n            success: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Salon başarıyla oluşturuldu.',\r\n            },\r\n            new_form_title: 'Salon ekle',\r\n            shopfloor: {\r\n              edit: 'Modu düzenle',\r\n              configure: {\r\n                save: {\r\n                  fab_title: 'Yapılandırmayı kaydet',\r\n                },\r\n                discard: {\r\n                  fab_title: 'Yapılandırmayı iptal et',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: 'Solunu düzenle',\r\n            new: {\r\n              fields: {\r\n                name: 'Salon adı',\r\n                name_short: 'Salon adı (kısa ad) [isteğe bağlı]',\r\n                description: 'Açıklama [isteğe bağlı]',\r\n                description_external: 'Açıklama (harici) [isteğe bağlı]',\r\n                description_internal: 'Açıklama (dahili) [isteğe bağlı]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Lütfen bir salon adı girin',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Salon başarıyla güncellendi.',\r\n            },\r\n          },\r\n          grid: {\r\n            description: 'Açıklama [isteğe bağlı]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: 'Yeni asset ekle',\r\n            tabs: {\r\n              info: 'Zaman serisi',\r\n              alarms: 'Alarmlar',\r\n              events: 'Makine olayları',\r\n              gateway: 'Ağ geçidi',\r\n              service: 'Servis',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: 'Yüzme kulvarı',\r\n              'axis-test': 'Eksen testleri',\r\n              collection: 'Koleksiyonlar',\r\n              technology: 'Teknoloji',\r\n              maintenance: 'Bakım',\r\n              performance: 'Performans',\r\n              spindledata: 'Mil verileri',\r\n              remoteaccess: 'Uzaktan erişim',\r\n              enduranceTest: 'Hat sonu testi',\r\n              administration: 'Yönetim',\r\n              y_title: {\r\n                status: 'durum',\r\n                status_table_one: 'tablo 1',\r\n                status_table_two: 'tablo 2',\r\n              },\r\n              energymonitoring: 'Enerji izleme',\r\n              technology_undefined: 'tanımsız',\r\n              technology_undefined_condition: 'tanımsız koşul!',\r\n            },\r\n            move: {\r\n              message: \"'%replaceValue' asset’ini artık yeni bir şirkete, lokasyona, salona ve/veya hatta taşıyabilirsiniz.\",\r\n              select_hall_label: 'Yeni salon seç',\r\n              select_line_label: 'Yeni hat seç',\r\n              select_company_label: 'Yeni şirket seç',\r\n              select_location_label: 'Yeni lokasyon seç',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: 'Makine no. (SW)',\r\n                iotcore: 'IoT Çekirdek',\r\n                startup: 'Makinenin başlangıç ​​tarihi [isteğe bağlı]',\r\n                shipping: 'Makine sevkiyat tarihi [isteğe bağlı]',\r\n                controller: 'Kontrolör',\r\n                machine_type: 'Makine tipi',\r\n                warranty_end: 'Makine garanti sonu [isteğe bağlı]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: 'Sistem yöneticisi',\r\n                warranty_start: 'Makine garanti başlangıcı [isteğe bağlı]',\r\n                machine_swmp_api: 'Makine SWMP API sonu [isteğe bağlı]',\r\n                machine_swsp_trace: 'Makine SWSP izleme sonu [isteğe bağlı]',\r\n                machine_swcp_portal: 'Makine SWCP portal sonu [isteğe bağlı]',\r\n                start_of_production: 'Makine üretim başlangıcı [isteğe bağlı]',\r\n                machine_swcp_support: 'Makine SWCP desteği sonu [isteğe bağlı]',\r\n                machine_cell_position: 'Makine hücresi / konum [isteğe bağlı]',\r\n                machine_swsp_line_mon: 'Makine SWSP lineMon sonu [isteğe bağlı]',\r\n                machine_identifier_customer: 'Makine kimliği (müşteri)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: 'Lütfen geçerli bir SW makine numarası belirtin (en az 7 karakter: A-Z, 0-9, -)',\r\n                controller_not_specified: 'Lütfen bir kontrolör seçin',\r\n                machine_type_not_specified: 'Lütfen bir makine tipi belirtin',\r\n                machine_identifier_customer_not_specified: 'Lütfen bir müşteri makine kimliği belirtin',\r\n              },\r\n            },\r\n            success: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Asset başarıyla oluşturuldu.',\r\n            },\r\n            new_form_title: 'Yeni asset',\r\n            edit_form_title: 'Asset’i düzenle',\r\n            move_form_title: 'Asset’i taşı',\r\n            editSuccess: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Asset başarıyla güncellendi.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP İzleme',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Destek',\r\n                shipping: 'Gönderim tarihi',\r\n                controller: 'Kontrolör',\r\n                contractEnd: 'Sözleşme bitiş tarihi',\r\n                machineType: 'Makine tipi',\r\n                startupDate: 'Başlangıç ​​tarihi',\r\n                warrantyEnd: 'Garanti sonu',\r\n                cellPosition: 'Makine hücresi / konum',\r\n                warrantyStart: 'Garanti başlangıcı',\r\n                customerNumber: 'Müşteri numarası',\r\n                enrollmentConfig: 'Kayıt-Yapılandırma',\r\n                startOfProduction: 'Üretim başlangıcı',\r\n                machineIdentifierSw: 'Makine no. SW',\r\n                enrollmentConfigDownload: 'İndir',\r\n                machineIdentifierCustomer: 'Müşteri makine adı',\r\n              },\r\n            },\r\n            technology: {\r\n              change: 'Değiştir',\r\n              g_mode: 'G-Fonksiyonu',\r\n              off_time: 'Yardımcı proses süresi',\r\n              no_change: 'Değişiklik yok',\r\n              undefined: 'Tanımsız',\r\n              active_tool: 'Aktif Araç',\r\n              tool_change: 'Alet değişimi',\r\n              machining_time: 'İşleme süresi',\r\n              tool_change_time: 'Alet değiştirme zamanı',\r\n              pie: {\r\n                chart: {\r\n                  name_one: 'proses süresi tablo 1',\r\n                  name_two: 'proses süresi tablo 2',\r\n                  name_one_undefined: 'tanımsız proses süresi tablo 1',\r\n                  name_two_undefined: 'tanımsız proses süresi tablo 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q ekseni ve Mil',\r\n              undefined_gmode_data: 'g-fonksiyonu verisi tanımsız',\r\n              auxiliary_process_time: 'Yardımcı proses süresi',\r\n              undefined_activetool_data: 'etkin alet verileri tanımsız',\r\n              undefined_tool_change_data: 'alet değiştirme verileri tanımsız',\r\n              undefined_machining_time_table_one: 'tanımsız koşul tablo 1',\r\n              undefined_machining_time_table_two: 'tanımsız koşul tablo 2',\r\n              machining_auxiliary_tool_changing_table_one: {\r\n                aggregated: 'Toplu İşleme-, Alet değiştirme ve Yardımcı proses süresi Tablo 1 ',\r\n              },\r\n              machining_auxiliary_tool_changing_table_two: {\r\n                aggregated: 'Toplu İşleme-, Alet değiştirme ve Yardımcı proses süresi Tablo 2',\r\n              },\r\n            },\r\n            add_line_to_dashboard: 'Hattı panoya ekle',\r\n            elements: {\r\n              gateway: {\r\n                title: 'Ağ geçidi',\r\n                contact: 'Bir hata durumunda lütfen şurayla iletişime geçin',\r\n                headline: 'Ağ geçidi',\r\n                netcfg: {\r\n                  cta: 'Lütfen Netcfg formu aracılığıyla bize verileri iletin.',\r\n                  intro: 'Makinenizi bağlayabilmemiz için ağ yapılandırmanıza ilişkin bilgilere ihtiyacımız var.',\r\n                  title: 'Ağ yapılandırması',\r\n                  goToNetconfig: 'Ağ yapılandırmasını açın',\r\n                },\r\n                device: {\r\n                  title: 'Cihaz ayrıntıları',\r\n                },\r\n                enrollment: {\r\n                  pic: 'IoT Ağ Geçidi aşağıdaki gibi görünüyorsa lütfen aşağıdaki adımları uygulayın:',\r\n                  line1: 'Kayıt dosyasını kutucuğun alt kısmındaki düğmeye tıklayarak indirebilirsiniz.',\r\n                  line2: 'İndirme otomatik olarak başlayacaktır.',\r\n                  line3: '.json dosyasını USB çubuğunuzun kök dizinine koyun. Dosyanın adının şöyle olduğundan emin olun',\r\n                  line4: 'enrollment.json.',\r\n                  line5: 'USB çubuğun kök dizininde aşağıdaki dosyaların bulunduğundan emin olun:',\r\n                  line6: 'USB çubuğu ilgili IoT Ağ Geçidine takın.',\r\n                  line7: 'Kayıt işlemi otomatik olarak başlayacak ve bu durum yavaşça yanıp sönen yeşil bir LED ışıkla bildirilecektir.',\r\n                  line8: 'Başarılı kayıt işleminden sonra USB çubuk çıkarılana kadar yeşil LED sürekli yanar.',\r\n                  title: 'Kayıt',\r\n                  button: 'Kayıt dosyası',\r\n                },\r\n                deviceMigration: {\r\n                  line1: 'migrate-iot.zip dosyasını indirin ve içeriğini doğrudan boş bir USB çubuğa çıkarın.',\r\n                  line2: 'aws.json',\r\n                  line3: 'İndirin',\r\n                  line4: ' ve ayrıca doğrudan USB çubuğa da atabilirsiniz. Dosyanın adının şöyle olduğundan emin olun',\r\n                  line5: 'USB çubuğun kök dizininde aşağıdaki dosyaların bulunduğundan emin olun:',\r\n                  line6: 'install.json',\r\n                  line7: 'aws-migrate-iot.tar.gz',\r\n                  line8: 'aws-migrate-iot.tar.gz.sig',\r\n                  line9: 'aws.json',\r\n                  title: 'Platforma geçiş ve kayıt',\r\n                  line10: 'Dosyalar 27.10.2023 tarihi itibarıyla değiştirilmiştir. Lütfen tekrar indirin ve eski sürümü kullanmayın.',\r\n                  line11: 'USB çubuğu ilgili IoT Ağ Geçidine takın.',\r\n                  line12: \"Yazılım otomatik olarak çalışacak ve bu, sarı bir LED'in yanıp sönmesiyle bildirilecektir.\",\r\n                  line13: 'Başarılı bir geçişten sonra USB çubuk çıkarılana kadar yeşil LED yanar.',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: 'Oluştur',\r\n                headline: 'Zaman serisi',\r\n                noChartMessage: \"Lütfen soldaki değişkenlerden bir veya daha fazlasını seçin ve ölçümlerinizi görüntülemek için Oluştur'a tıklayın\",\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              'axis-test': {\r\n                unit: 'Birim',\r\n                value: 'Değer',\r\n                kpiUnit: 'Birim',\r\n                headline: 'Eksen testi',\r\n                kpiValue: 'Değer',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: 'Tarayıcı depolama alanından yükle',\r\n                limitsSave: 'Tarayıcı depolama alanına kaydet',\r\n                selectAxis: 'Ekseni seç',\r\n                limitsExport: 'Sınırları panoya dışa aktarır',\r\n                openAxistest: 'Eksen testini aç',\r\n                axisTestPlural: 'Eksen testleri',\r\n                adjustments: {\r\n                  add: 'Yerel ayarlama ekle',\r\n                  range: 'Aralık',\r\n                  header: 'Yerel ayarlama',\r\n                  remove: 'Kaldır',\r\n                  position: 'Konum',\r\n                  amplitude: 'Genlik',\r\n                  spreadMultiplier: 'Sınır çarpanı',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: 'Konum',\r\n                    y: 'Mevcut',\r\n                    up: 'pozitif yön',\r\n                    down: 'negatif yön',\r\n                    limitsUp: 'pozitif yönü sınırlar',\r\n                    limitsDown: 'negatif yönü sınırlar',\r\n                    sliderSlopeCenter: 'Eğim orijini',\r\n                    sliderSlopeFactor: 'Eğim faktörü',\r\n                    sliderVerticalOffset: 'Y ofseti',\r\n                    sliderVerticalSpread: 'Sınır genişliği',\r\n                    sliderQuadraticCenter: 'İkinci dereceden orijin',\r\n                    sliderQuadraticFactor: 'İkinci dereceden faktör',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: 'saat yönünde',\r\n                    limitsClockwise: 'saat yönünde sınırlar',\r\n                    counterClockwise: 'saat yönünün tersine',\r\n                    sliderSineOffset: 'Dalga ofseti',\r\n                    sliderSineAmplitude: 'Dalga genliği',\r\n                    sliderSineFrequency: 'Dalga frekansı',\r\n                    sliderVerticalOffset: 'Y ofseti',\r\n                    sliderVerticalSpread: 'Sınır genişliği',\r\n                    limitsCounterClockwise: 'saat yönünün tersine sınırlar',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: 'Hız',\r\n                  pulseMaxRampUp: 'Rampa ->',\r\n                  pulseMaxRampDown: 'Rampa <-',\r\n                  pulseMaxStiffness: 'Maksimum sertlik',\r\n                  pulseMinStiffness: 'Sertlik min.',\r\n                  pulseMeanStiffness: 'Sertlik Ø',\r\n                  circularReversalRange: 'Dairesel histerezis',\r\n                  pulseMaxUpPathCurrent: 'Mevcut maks. ->',\r\n                  pulseMinUpPathCurrent: 'Mevcut min. ->',\r\n                  pulseMeanUpPathCurrent: 'Mevcut Ø ->',\r\n                  pulseMaxDownPathCurrent: 'Mevcut maks. <-',\r\n                  pulseMinDownPathCurrent: 'Mevcut min. <-',\r\n                  pulseMeanDownPathCurrent: 'Mevcut Ø <-',\r\n                  circularShapeDeviationClockwise: 'Saat yönünde dairesel sapma',\r\n                  pulseStiffnessStandardDeviation: 'Sertlik σ',\r\n                  pulseStandardDeviationUpPathCurrent: 'Mevcut σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: 'Mevcut σ <-',\r\n                  circularShapeDeviationCounterClockwise: 'Saat yönünün tersinde dairesel sapma',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: 'Dairesellik',\r\n                  EQUABILITY: 'Eşitlik',\r\n                  CIRCULARITY: 'Dairesellik',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: 'Eksen testi mevcut değil',\r\n                },\r\n              },\r\n              alarms: {\r\n                headline: 'Alarm haritası',\r\n              },\r\n              service: {\r\n                contact: 'Lütfen iletişime geçin',\r\n                headline: 'Servis',\r\n                update: {\r\n                  title: 'Dosyayı güncelle',\r\n                },\r\n                upload: {\r\n                  title: 'Dosya yükle',\r\n                  fields: {\r\n                    file: 'Dosya',\r\n                    language: 'Dosya dili',\r\n                    file_name: 'Dosya adı',\r\n                    list_of_languages: {\r\n                      cz: 'Çek dili',\r\n                      de: 'Almanca',\r\n                      en: 'İngilizce',\r\n                      es: 'İspanyolca',\r\n                      fr: 'Fransızca',\r\n                      hu: 'Macarca',\r\n                      it: 'İtalyanca',\r\n                      ko: 'Korece',\r\n                      pl: 'Lehçe',\r\n                      tr: 'Türkçe',\r\n                      zh: 'Çince',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: 'Yükle',\r\n                    cancel: 'İptal et',\r\n                  },\r\n                  success: {\r\n                    title: 'Başarılı',\r\n                    button: 'Servis genel bakışına geri dön',\r\n                    message: 'Dosya başarıyla yüklendi.',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: 'Lütfen bir dosya adı belirtin',\r\n                    file_not_valid: 'Lütfen bir dosya belirtin / Lütfen daha küçük bir dosya seçin.',\r\n                    language_not_specified: 'Lütfen bir dosya dili belirtin.',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: 'Kılavuzlar',\r\n                },\r\n                version: {\r\n                  title: 'sürüm dosyaları',\r\n                },\r\n                contracts: {\r\n                  title: 'Sözleşmeler',\r\n                },\r\n                components: {\r\n                  title: 'Donanım ve yazılım bileşenleri',\r\n                },\r\n                spare_parts: {\r\n                  title: 'Yedek parçalar',\r\n                },\r\n                consumeables: {\r\n                  title: 'Sarf malzemeleri',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: 'Güncelle',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: 'Uzaktan erişim için bir makineyi aktif hale getirmek için IoT Ağ geçidi TeamViewer yüklenmiş olmalıdır.',\r\n                  line2: 'Eğer henüz böyle bir durum söz konusu değilse “yükle” düğmesine tıklayarak TeamViewer’ı yükleyebilirsiniz.',\r\n                  title: 'Uzaktan desteği kur',\r\n                  status: 'Dağıtım durumu',\r\n                  copy: {\r\n                    button: 'Bağlantıyı kopyala',\r\n                  },\r\n                  install: {\r\n                    button: \"TeamViewer'ı yükleyin\",\r\n                  },\r\n                  session: {\r\n                    button: 'Oturumu başlat',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: 'Yazılım IoT Ağ geçidi',\r\n                  values: {\r\n                    box_id: 'Kutu kimliği',\r\n                    machine_connect: 'makine bağlantısı',\r\n                    operating_system: 'işletim sistemi',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: 'Makinenizle ilgili yardıma mı ihtiyacınız var?',\r\n                  line2: 'Bize ulaşın!',\r\n                  title: 'SW Servisine mesaj',\r\n                  button: 'Servisle iletişime geçin',\r\n                  fields: {\r\n                    name: 'Makine tanımlayıcısı (SW)',\r\n                    type: 'Tür',\r\n                    email: 'E-posta',\r\n                    message: 'Mesaj',\r\n                    phone_no: 'Telefon no.',\r\n                    last_name: 'Soyadı',\r\n                    first_name: 'Adı',\r\n                    contact_person: 'İletişim kişisi (SW) [isteğe bağlı]',\r\n                    list_of_types: {\r\n                      request: 'Talep',\r\n                      service: 'Servis',\r\n                      retrofit: 'Tadilat',\r\n                      expansion: 'Genişletme',\r\n                      inspection: 'İnceleme',\r\n                    },\r\n                    machine_identifier_customer: 'Makine tanımlayıcı (müşteri) [isteğe bağlı]',\r\n                  },\r\n                  buttons: {\r\n                    send: 'Talep gönder',\r\n                    cancel: 'İptal et',\r\n                  },\r\n                  success: {\r\n                    title: 'Başarılı',\r\n                    button: 'Servis genel bakışına geri dön',\r\n                    message: 'Talep SW Servisine başarıyla gönderildi.',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: 'Lütfen geçerli bir e-posta adresi belirtin',\r\n                    name_not_specified: 'Lütfen geçerli bir SW makine numarası belirtin (en az 7 karakter: A-Z, 0-9, - _)',\r\n                    phone_not_specified: 'Lütfen bir telefon numarası belirtin',\r\n                    message_not_specified: 'Lütfen bir mesaj girin',\r\n                    last_name_not_specified: 'Lütfen soyadınızı belirtin',\r\n                    first_name_not_specified: 'Lütfen adınızı belirtin',\r\n                    family_name_not_specified: 'Lütfen soyadınızı belirtin',\r\n                    contact_type_not_specified: 'Lütfen bir talep türü belirtin',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: 'Makine yazılımı',\r\n                  values: {\r\n                    nc_version: 'NC sürümü',\r\n                    hmi_version: 'HMI sürümü',\r\n                    plc_version: 'PLC sürümü',\r\n                    compile_cycles: 'derleme döngüleri',\r\n                    operating_system: 'işletim sistemi',\r\n                    pcu_base_version: 'PCU temel sürümü',\r\n                    plc_toolbox_version: 'PLC araç kutusu sürümü',\r\n                    plc_user_program_version: 'PLC kullanıcı programı sürümü',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: 'Dosyanın adı başarıyla güncellendi.',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: 'Uzaktan destek',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: 'Servis asistanı alanında çeşitli sorun giderme süreçlerinde size rehberlik edilecektir.',\r\n                  title: 'Servis asistanı',\r\n                  sub_title: 'Şu anda asset’lerinizden biriyle ilgili bir sorun mu yaşıyorsunuz?',\r\n                  open_assistant: 'Servis asistanını aç',\r\n                  request_account: 'Talep eden hesap',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: 'Mil istatistikleri SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: 'IoT Ağ geçidi',\r\n                labelOnline: 'Açık',\r\n                labelOffline: 'Kapalı',\r\n              },\r\n              swimlane: {\r\n                headline: 'Yüzme kulvarı',\r\n              },\r\n              endurance: {\r\n                headline: 'Hat sonu testi',\r\n                chartTitles: {\r\n                  runtime: 'çalışma süresi verileri',\r\n                  endurance: 'Hat sonu testi',\r\n                  operation: 'çalışma modu',\r\n                  qaxis_180: 'Q ekseni 180°',\r\n                  nc_program: 'NC programı',\r\n                  stacklights: '3 yığın ışıkları',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: 'Gönderme durumu',\r\n                aborted: 'iptal edildi',\r\n                sending: 'gönderiliyor',\r\n                undefined: 'tanımsız',\r\n                interrupted: 'kesintiye uğradı',\r\n              },\r\n              alarms_map: {\r\n                headline: 'Alarm haritası',\r\n              },\r\n              collection: {\r\n                headline: 'Koleksiyon',\r\n                noChartMessage: 'Lütfen soldaki koleksiyonlardan birini seçin.',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: 'Toplam',\r\n                  header: \"Performans Kpi'ları\",\r\n                  target: 'Hedef',\r\n                },\r\n                alarms: {\r\n                  title: 'Alarmlar',\r\n                  category: [\r\n                    'Sınıflandırılmamış',\r\n                    'Hata mesajı',\r\n                    'Çalışma mesajı',\r\n                    'Durum mesajı',\r\n                    'Kullanım talimatı',\r\n                  ],\r\n                  icons: {\r\n                    trend: 'Trend',\r\n                    duration: 'Süre',\r\n                    flatlist: 'Düz liste',\r\n                    frequency: 'Sıklık',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: 'Zaman',\r\n                    trend: 'Trend',\r\n                    duration: 'Süre',\r\n                    leftTime: 'Kalan zaman',\r\n                    alarmCount: 'Sayı',\r\n                    alarmNumber: 'Alarm no.',\r\n                    description: 'Açıklama',\r\n                    alarmOccured: 'Alarm oluştu',\r\n                    alarmClassification: 'Alarm sınıflandırması',\r\n                    alarmCountSecondRange: 'Sayı T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: 'artan',\r\n                      down: 'azalan',\r\n                      flat: 'değişmemiş',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: 'Detaylar',\r\n                  ncProgram: 'NC programı',\r\n                  lastModified: 'Son değiştirilme tarihi',\r\n                  machineState: 'Makine durumu',\r\n                  numberAlarms: 'Bekleyen alarmlar',\r\n                  stopCondition: 'Durdurma koşulları',\r\n                  ncProgramState: 'NC program durumu',\r\n                  protectionLevel: 'Koruma seviyesi',\r\n                  ncProgramStates: [\r\n                    'iptal edildi',\r\n                    'durduruldu',\r\n                    'çalışıyor',\r\n                    'bekliyor',\r\n                    'kesintiye uğradı',\r\n                  ],\r\n                  protectionLevels: [\r\n                    'Sistem',\r\n                    'Üretici',\r\n                    'Servis',\r\n                    'Kullanıcı',\r\n                    'Anahtar şalteri konumu 3',\r\n                    'Anahtar şalteri konumu 2',\r\n                    'Anahtar şalteri konumu 1',\r\n                    'Anahtar şalteri konumu 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: 'Çevrim süresi',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Saniye cinsinden çevrim süresi',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: 'Tamam',\r\n                  nok: 'Tamam değil',\r\n                  sum: 'Toplam',\r\n                  title: 'Parça sayacı',\r\n                  titleDayCounter: 'Gün sayacı',\r\n                  titleShiftCounter: 'Vardiya sayacı',\r\n                  titleTotalCounter: 'Toplam sayaç',\r\n                  titleTotalCounterSmall: 'Toplam',\r\n                },\r\n                availability: {\r\n                  title: 'Kullanılabilirlik',\r\n                  kpi: {\r\n                    title: \"Kullanılabilirlik KPI'sı\",\r\n                  },\r\n                  legend: {\r\n                    auto: 'OTOMATİK',\r\n                    JOG_with_error: 'Hatalı JOG',\r\n                    MDA_with_error: 'Hatalı MDA',\r\n                    JOG_without_error: 'Hatasız JOG',\r\n                    MDA_without_error: 'Hatasız MDA',\r\n                    not_defined_condition: 'tanımlanmamış koşul',\r\n                    auto_no_program_active: 'OTOMATİK program etkin değil',\r\n                    auto_waiting_for_parts: 'OTOMATİK parça bekliyor',\r\n                    auto_with_error_program_stopped: 'OTOMATİK hatalı - program durdu',\r\n                    auto_waiting_for_parts_stopping_error: 'OTOMATİK parça bekliyor + durma hatası',\r\n                  },\r\n                  aggregated: {\r\n                    title: 'Toplu kullanılabilirlik',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Kullanılabilirlik',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: 'Durum',\r\n                },\r\n                operationMode: {\r\n                  title: 'Çalışma modu',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Çalışma modu',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: 'Çalışma zamanı izleyicisi',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: 'Program',\r\n                      labels: {\r\n                        on: 'açık',\r\n                        off: 'kapalı',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: 'Mil geçersiz kılma',\r\n                },\r\n                feedrateOverride: {\r\n                  title: 'Besleme hızı geçersiz kılma',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: 'Çalışma süresi dağılımı',\r\n                },\r\n              },\r\n              administration: {\r\n                title: 'Yönetim',\r\n                headline: 'Yönetim',\r\n                aws: {\r\n                  title: 'AWS bağlantıları',\r\n                },\r\n                groups: {\r\n                  title: 'Şey grupları',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Çekirdek',\r\n                    ssm: 'Sistem yöneticisi',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: 'Malzeme listesi',\r\n                },\r\n                component: {\r\n                  title: 'Bileşenler',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: 'Bakım',\r\n              },\r\n              spindleData: {\r\n                headline: 'Mil verileri',\r\n              },\r\n              remoteaccess: {\r\n                headline: 'Uzaktan erişim',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: 'Alarmdan önceki süre (sn.)',\r\n                  },\r\n                  yAxis: {\r\n                    title: 'Alarmdan sonraki süre (sn.)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: 'Enerji izleme',\r\n                chartTitles: {\r\n                  air: 'Basınçlı hava tüketimi',\r\n                  current: 'Mevcut tüketim',\r\n                  consumption: 'Saatlik ortalama tüketim',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: 'Koşul izleme',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: 'Yeni şirket ekle',\r\n            grid: {\r\n              city: 'Şehir',\r\n              email: 'E-posta',\r\n              street: 'Cadde/sokak',\r\n              country: 'Ülke',\r\n              website: 'Web sitesi',\r\n              postalCode: 'posta kodu',\r\n              locationName: 'Lokasyon',\r\n              locationCustomerNumber: 'Müşteri numarası',\r\n            },\r\n            tabs: {\r\n              list: 'Lokasyonlar',\r\n              worldmap: 'Dünya haritası',\r\n            },\r\n            success: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Şirket başarıyla oluşturuldu.',\r\n            },\r\n            toggle_switch: 'Aynı verilerle bir şirket lokasyonu oluştur',\r\n            new_form_title: 'Şirket ekle',\r\n            edit_form_title: 'Şirketi düzenle',\r\n            new: {\r\n              fields: {\r\n                city: 'Şehir',\r\n                name: 'Şirket adı',\r\n                email: 'E-posta [isteğe bağlı]',\r\n                state: 'Eyalet [isteğe bağlı]',\r\n                street: 'Cadde/sokak',\r\n                country: 'Ülke',\r\n                website: 'Web sitesi [isteğe bağlı]',\r\n                zipcode: 'Posta kodu',\r\n                legal_form: 'Hukuki şekli [isteğe bağlı]',\r\n                name_short: 'Şirket adı (kısa ad) [isteğe bağlı]',\r\n                description: 'Açıklama [isteğe bağlı]',\r\n                company_logo: 'Şirket logosu (URL) [isteğe bağlı]',\r\n                customer_number: 'Müşteri numarası',\r\n                industry_sector: 'Endüstri sektörü',\r\n                description_external: 'Açıklama (harici) [isteğe bağlı]',\r\n                description_internal: 'Açıklama [isteğe bağlı]',\r\n              },\r\n              error_messages: {\r\n                url: 'Lütfen geçerli bir URL girin',\r\n                email: 'Lütfen bir e-posta adresi girin',\r\n                city_not_specified: 'Lütfen bir şehir belirtin',\r\n                name_not_specified: 'Lütfen bir şirket adı girin',\r\n                street_not_specified: 'Lütfen bir cadde/sokak adı girin',\r\n                country_not_specified: 'Lütfen menşe ülkesini seçin',\r\n                zipcode_not_specified: 'Lütfen bir posta kodu girin',\r\n                customer_number_not_specified: 'Lütfen bir müşteri numarası girin',\r\n                industry_sector_not_specified: 'Lütfen bir endüstri sektörü seçin',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Şirket başarıyla güncellendi.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: 'E-posta',\r\n                address: 'Adres',\r\n                country: 'Ülke',\r\n                website: 'Web sitesi',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'CloudPlatform, şirketi enlem ve boylamı kullanarak haritada görüntüler.',\r\n              intro_heading: 'Lokasyona ilişkin bilgiler',\r\n              location_name: 'Lokasyonun adı:',\r\n              label_latitude: 'Enlem',\r\n              label_longitude: 'Boylam',\r\n              text_fallback_info: 'Aksi takdirde varsayılan koordinatlar kullanılacaktır.',\r\n              text_location_found: 'Bir lokasyon bulundu.',\r\n              text_location_entered: 'Lokasyon girildi.',\r\n              text_success_location: 'Girdiğiniz bilgilere dayanarak aşağıdaki bilgileri ayarladık:',\r\n              button_define_coordinates: 'Koordinatları kendiniz tanımlayın',\r\n              text_no_coordinates_found: 'Girdiğiniz verilere ait koordinat bulunamadı.',\r\n              text_coordinates_success_set: 'Koordinatlar başarıyla ayarlandı.',\r\n              button_set_custom_coordinates: 'Özel koordinatları ayarlayın',\r\n              text_specify_coordinates_yourself: 'Koordinatları kendiniz belirleyebilirsiniz.',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: 'Yeni lokasyon ekle',\r\n            tabs: {\r\n              list: 'Salonlar',\r\n              shopfloor: 'Üretim bölümü',\r\n            },\r\n            grid: {\r\n              hallName: 'Salon',\r\n            },\r\n            success: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Lokasyon başarıyla oluşturuldu.',\r\n            },\r\n            new_form_title: 'Lokasyon ekle',\r\n            edit_form_title: 'Lokasyonu düzenle',\r\n            new: {\r\n              fields: {\r\n                city: 'Şehir',\r\n                name: 'Lokasyon adı',\r\n                email: 'E-posta [isteğe bağlı]',\r\n                state: 'Eyalet [isteğe bağlı]',\r\n                street: 'Cadde/sokak',\r\n                country: 'Ülke',\r\n                website: 'Web sitesi [isteğe bağlı]',\r\n                zipcode: 'Posta kodu',\r\n                language: 'konuşulan dil [isteğe bağlı]',\r\n                name_short: 'Lokasyon adı (kısa ad) [isteğe bağlı]',\r\n                description: 'Açıklama [isteğe bağlı]',\r\n                customer_number: 'Müşteri numarası [isteğe bağlı]',\r\n                description_internal: 'Açıklama (dahili) [isteğe bağlı]',\r\n              },\r\n              error_messages: {\r\n                email: 'Lütfen bir e-posta adresi girin',\r\n                city_not_specified: 'Lütfen bir şehir belirtin',\r\n                name_not_specified: 'Lütfen bir lokasyon adı belirtin',\r\n                street_not_specified: 'Lütfen bir cadde/sokak adı girin',\r\n                country_not_specified: 'Lütfen menşe ülkesini seçin',\r\n                zipcode_not_specified: 'Lütfen bir posta kodu girin',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: 'Başarılı!',\r\n              button: 'Listeye geri dön',\r\n              message: 'Lokasyon başarıyla güncellendi.',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: 'Adres',\r\n                country: 'Ülke',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: 'Şehir',\r\n              email: 'E-posta',\r\n              street: 'Cadde/sokak',\r\n              country: 'Ülke',\r\n              website: 'Web sitesi',\r\n              postalCode: 'Posta kodu',\r\n              companyName: 'Şirket',\r\n            },\r\n            tabs: {\r\n              list: 'Şirketler',\r\n              worldmap: 'Dünya haritası',\r\n            },\r\n            map: {\r\n              description_not_available: 'Açıklama yok',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: 'Ekle',\r\n                back: 'Listeye geri dön',\r\n                edit: 'Güncelle',\r\n                save: 'Kaydet',\r\n                email: 'Görüntü yolla',\r\n                cancel: 'İptal et',\r\n                addMultiple: 'Ekle + yeni',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: 'Yönetimi düzenle',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: 'Kalite Güvencesi',\r\n          users: 'Kullanıcı yönetimi',\r\n          assets: 'Asset yönetimi',\r\n          settings: 'Ayarlar',\r\n          dashboard: 'Pano',\r\n          userProfile: 'Kullanıcı profili',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: 'Kullanıcı yönetimi',\r\n          assets: 'Asset yönetimi',\r\n          dashboard: 'Pano',\r\n          userProfile: 'Kullanıcı profili',\r\n        },\r\n        variables: {\r\n          bar: 'Çubuk',\r\n          plc: 'PLC',\r\n          area: 'Alan',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: 'Hat',\r\n          long: 'Uzun',\r\n          real: 'REAL',\r\n          true: 'Etkin',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: 'Etkin değil',\r\n          float: 'Ondalıklı sayı',\r\n          uword: 'UWORD',\r\n          double: 'Çift',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Boolean',\r\n          integer: 'Tam sayı',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: 'Harici',\r\n          internal: 'Dahili',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: 'Bir yıl',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: 'Yeni değişken ekle',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: 'Bir ay',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: 'Dikdörtgen',\r\n          tabs: {\r\n            list: 'Değişken listesi',\r\n          },\r\n          ten_years: 'On yıl',\r\n          two_weeks: 'İki hafta',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: 'Altı ay',\r\n          categorical: 'Kategorik',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: 'Değişken oluşturulurken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n          },\r\n          new_form_title: 'Yeni değişken',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: 'Değişkeni düzenle',\r\n          new: {\r\n            fields: {\r\n              hint: '(Değişiklikler makineyi bozabilir)',\r\n              showId: 'Değişken kimliği giriş alanını göster',\r\n              maxTime: 'Maks. zaman',\r\n              nckArea: 'NCK Area',\r\n              dataType: 'Veri tipi',\r\n              nckBlock: 'NCK Block',\r\n              chartType: 'Grafik tipi',\r\n              namePrefix: 'Ad öneki',\r\n              variableId: 'Değişken kimliği',\r\n              collections: '',\r\n              displayName: 'Görünen ad',\r\n              showInitial: 'İlk harfi göster',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: 'Görünürlük',\r\n            },\r\n            buttons: {\r\n              delete: 'Değişkeni sil',\r\n            },\r\n            error_messages: {\r\n              maxTime: 'Lütfen maksimum süre seçin',\r\n              dataType: 'Lütfen bir veri türü seçin',\r\n              chartType: 'Lütfen bir grafik türü seçin',\r\n              namePrefix: 'Lütfen geçerli bir önek adı seçin. (geçerli karakterler: A-Z, _).',\r\n              variableId: 'Lütfen geçerli bir UUID seçin',\r\n              displayName: 'Lütfen bir görünen ad seçin',\r\n              showInitial: 'Lütfen bir ilk harf seçin',\r\n              namePrefixEdit: 'Lütfen geçerli bir önek adı seçin. (geçerli karakterler: A-Z a-z, _).',\r\n              visibilityType: 'Lütfen bir görünürlük türü seçin',\r\n            },\r\n          },\r\n          success: {\r\n            message: 'Değişken başarıyla oluşturuldu',\r\n          },\r\n          editError: {\r\n            message: 'Bir değişkeni güncellemeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n          },\r\n          editSuccess: {\r\n            message: 'Değişken başarıyla güncellendi',\r\n          },\r\n        },\r\n        success: {\r\n          upload: 'Başarılı yüklemeler',\r\n          downloads: 'Başarılı indirmeler',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: 'Beklenmeyen bir hata oluştu. Lütfen sayfayı yeniden yüklemeyi deneyin.',\r\n            },\r\n            s_1: {\r\n              message: 'Değişiklikleriniz kaydedildi.',\r\n            },\r\n            s_930: {\r\n              message: \"'%replaceValue' asset’i başarıyla silindi.\",\r\n            },\r\n            s_931: {\r\n              message: \"'%replaceValue' şirketi başarıyla silindi.\",\r\n            },\r\n            s_932: {\r\n              message: \"'%replaceValue' hattı başarıyla silindi.\",\r\n            },\r\n            s_933: {\r\n              message: \"'%replaceValue' salonu başarıyla silindi.\",\r\n            },\r\n            s_934: {\r\n              message: \"'%replaceValue' lokasyonu başarıyla silindi.\",\r\n            },\r\n            s_935: {\r\n              message: \"'%replaceValue' dosyası başarıyla silindi.\",\r\n            },\r\n            s_936: {\r\n              message: \"'%replaceValue' değişkeni başarıyla silindi.\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: 'Çift kartlar silindi!',\r\n            add_line_to_dashboard: 'Hat Panoya eklendi',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: 'Sınır',\r\n            type: 'Türe göre seç',\r\n            alarms: 'Alarmlar',\r\n            machine: 'Makine kimliğine göre seç',\r\n            variables: 'Değişkenler',\r\n            listImport: 'Sınır içe aktarma',\r\n            listDownload: 'Sınır indirme',\r\n          },\r\n          text: {\r\n            text: 'Sınırlar, ilgilendiğiniz değişkenler için belirlediğiniz değerlerdir. Bir değişken tanımlı sınırlar dahilinde değilse bir bildirim alırsınız. Zaman Serisi sekmesinde oluşturulan grafiklerde de sınırlar görüntülenir.',\r\n            title: 'Sınırlar',\r\n          },\r\n          export: {\r\n            text: 'Cloud Platform\\'da bulunan tüm değişkenler için o anda ayarlı sınırları daima dışa aktarabilirsiniz. Bu listeyi referans olarak kullanabilir veya tüm sınırları tek bir seferde içe aktarmak için \"Sınırları CSV olarak içe aktar\" bölümünü kullanabilirsiniz',\r\n            title: 'Sınırları CSV olarak dışa aktar',\r\n          },\r\n          import: {\r\n            text: 'Daha önce indirdiğiniz sınır ve abone bilgilerini içeren CSV dosyasını içe aktararak, şu anda kaydedilmiş değerleri güncelleyebilirsiniz. Daha sonra, içe aktarılan sınırları hangi asset veya makine türlerine uygulamak istediğinizi seçebilirsiniz',\r\n            title: 'Sınırları CSV’den içe aktar',\r\n            machines: {\r\n              title: 'Sınırlamaları uygulamak istediğiniz makineleri veya makine tiplerini seçin.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'İçe aktarmak istediğiniz CSV dosyasını seçin',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: 'Asset yönetiminde istediğiniz hatta gidin.',\r\n            two: 'Hattın başlığında bir bağlam menüsü bulabilirsiniz.',\r\n            four: 'Hattın kutucuğu panoya eklenir',\r\n            three: 'Bağlam menüsüne tıklayın ve ardından \"panoya ekle\"yi seçin.',\r\n            header: 'Kutucuk ekleme',\r\n          },\r\n          individual: {\r\n            one: 'Soldaki ayarlar düğmesini seçin.',\r\n            two: '“Artı” simgesini seçin.',\r\n            four: '“Kaydet” ile onaylayın. Bireysel kutucuk panoya eklendi.',\r\n            three: 'Kutucuğunuza ad verin ve istediğiniz makineleri ekleyin.',\r\n            header: 'Bireysel kutucuklar ekleme',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: 'Yeni kullanıcı ekle',\r\n          new: {\r\n            title: 'Kullanıcı oluştur',\r\n            status: 'Kullanıcı durumu:',\r\n            buttons: {\r\n              add: 'Ekle',\r\n              back: 'Listeye geri dön',\r\n              save: 'Kaydet',\r\n              cancel: 'İptal et',\r\n              delete: 'Kullanıcıyı sil',\r\n              sendMail: 'İlk postayı gönder',\r\n            },\r\n            fields: {\r\n              email: 'E-posta',\r\n              roles: 'Kullanıcı rolü',\r\n              gender: 'Cinsiyet',\r\n              created: 'Oluşturuldu',\r\n              lastName: 'Soyadı',\r\n              firstName: 'Adı',\r\n              breadcrumb: 'İçerik haritasını görüntüle',\r\n              main_group: 'Ana grup',\r\n              phoneNumber: 'Telefon numarası [isteğe bağlı]',\r\n              customer_org: 'Müşteri kuruluşu',\r\n              last_modified: 'Son değiştirilme tarihi',\r\n              email_validation: 'E-posta (doğrulama)',\r\n            },\r\n            statusText: {\r\n              unknown: 'bilinmeyen',\r\n              archived: 'arşivlendi',\r\n              confirmed: 'Onaylandı',\r\n              compromised: 'ifşa olmuş',\r\n              unconfirmed: 'onaylanmamış',\r\n              reset_required: 'sıfırlama gerekli',\r\n              external_provider: 'harici sağlayıcı',\r\n              force_change_password: 'şifreyi değiştirmeye zorla',\r\n            },\r\n            error_messages: {\r\n              email_not_match: 'E-posta adresleri eşleşmiyor',\r\n              email_not_valid: 'Lütfen geçerli bir e-posta adresi belirtin',\r\n              phone_not_specified: 'Lütfen bir telefon numarası belirtin, başında + olmalı ve ardından ülke kodu gelmelidir!',\r\n              roles_not_specified: 'Lütfen ana grup seçin',\r\n              gender_not_specified: 'Lütfen bir cinsiyet seçin',\r\n              last_name_not_specified: 'Lütfen soyadınızı belirtin',\r\n              first_name_not_specified: 'Lütfen adınızı belirtin',\r\n              main_group_not_specified: 'Lütfen ana grup seçin',\r\n              family_name_not_specified: 'Lütfen soyadınızı belirtin',\r\n              customer_organization_not_specified: 'Lütfen bir müşteri kuruluşu seçin',\r\n            },\r\n          },\r\n          failed: {\r\n            title: 'Başarısız oldu!',\r\n          },\r\n          mail: {\r\n            success: 'Belirtilen e-posta adresine otomatik olarak oluşturulmuş bir şifreyi içeren e-posta gönderildi.',\r\n          },\r\n          update: {\r\n            title: 'Kullanıcıyı güncelle',\r\n          },\r\n          success: {\r\n            title: 'Başarılı!',\r\n            button: 'Listeye geri dön',\r\n            message: 'Kullanıcı başarıyla oluşturuldu. Belirtilen e-posta adresine otomatik olarak oluşturulmuş bir şifreyi içeren e-posta gönderildi.',\r\n            message_for_edit: 'Kullanıcı başarıyla güncellendi.',\r\n            message_send_mail: 'Belirtilen e-posta adresine otomatik olarak oluşturulmuş bir şifreyi içeren e-posta gönderildi.',\r\n            button_back_to_last_page: 'Son sayfaya geri dön',\r\n          },\r\n          delete: {\r\n            success: 'Kullanıcı başarıyla silindi.',\r\n            confirmation: {\r\n              title: 'Bu kullanıcıyı silmek istediğinizden emin misiniz?',\r\n              confirm: 'Evet, bu kullanıcıyı sil',\r\n              dismiss: 'Hayır, iptal et',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: 'Ziyaretçi',\r\n            customer: 'Müşteri',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: 'Kullanıcı',\r\n              email: 'E-posta',\r\n              company: 'Şirket',\r\n              enabled: 'Durum',\r\n              lastName: 'Soyadı',\r\n              sw_admin: 'SW Yöneticisi',\r\n              firstName: 'Adı',\r\n              userRights: 'Kullanıcı hakları',\r\n              phoneNumber: 'Telefon numarası',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: 'erkek',\r\n              female: 'kadın',\r\n              diverse: 'çeşitli',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: 'Alarmlar',\r\n            type: 'Türe göre seç',\r\n            machine: 'Makine kimliğine göre seç',\r\n            listImport: 'Alarmları içe aktar',\r\n            listDownload: 'Alarmları indir',\r\n          },\r\n          text: {\r\n            text: 'İlgilendiğiniz alarm numaraları için alarm bildirimleri ayarlanabilir. Ayarlanan alarm belirli bir makinede gerçekleşirse bildirim alırsınız.',\r\n            title: 'Alarm bildirimleri',\r\n          },\r\n          export: {\r\n            text: 'İstediğiniz zaman SW CloudPlatform\\'daki tüm makinelerin halihazırda ayarlanmış alarm bildirimlerini dışa aktarabilirsiniz. Bu listeyi referans olarak kullanabilir veya \"Alarmları CSV olarak içe aktar\" bölümünde tüm alarm bildirimlerini bir kerede içe aktarabilirsiniz.',\r\n            title: 'Alarmlar CSV olarak dışa aktarılıyor',\r\n          },\r\n          import: {\r\n            text: 'Önceden indirdiğiniz alarm ve abone bilgilerini içeren CSV dosyasını içe aktararak, şu anda kaydedilmiş değerleri güncelleyebilirsiniz. Daha sonra içe aktarılan alarm bildirimlerini hangi sistem veya makine tiplerine uygulamak istediğinizi seçebilirsiniz.',\r\n            title: \"CSV'den alarmları içe aktar\",\r\n            machines: {\r\n              title: 'Alarmları uygulamak istediğiniz makineleri veya makine tiplerini seçin.',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: 'İçe aktarmak istediğiniz CSV dosyasını seçin',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: 'sonuç bulunamadı',\r\n          results: {\r\n            of: '/',\r\n            lines: 'hatlar',\r\n            machines: 'Makineler',\r\n          },\r\n          callToAction: 'makine arama',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: 'Başarısız oldu',\r\n            queued: 'Sırada',\r\n            removed: 'Kaldırıldı',\r\n            canceled: 'İptal edildi',\r\n            rejected: 'Reddedildi',\r\n            completed: 'Tamamlandı',\r\n            succeeded: 'Başarılı oldu',\r\n            timed_out: 'Zaman aşımına uğradı',\r\n            in_progress: 'Devam ediyor',\r\n            not_installed: 'Kurulu değil',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'Tamam',\r\n            import: 'İçe aktarmayı başlat',\r\n            dismiss: 'iptal et',\r\n            download: 'İndirmeye başla',\r\n          },\r\n          tabs: {\r\n            limits: 'Sınırlar',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: 'Ad',\r\n              datatype: 'veri tipi',\r\n              chartType: 'Grafik tipi',\r\n              displayName: 'Görünen ad',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: 'Dünya haritası',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: 'Üretim bölümü',\r\n          upload: {\r\n            text1: 'Üretim bölümü düzeninizin bir görüntüsünü lifedata@sw-machines.com adresine gönderin (JPG, PNG, PDF).',\r\n            text2: \"Makineleriniz SW CloudPlatform'a kayıtlıysa sol tarafta görünecek ve gerçek zamanlı veri gönderecektir.\",\r\n            text3: 'Daha sonra planınızdaki durumu doğru makineye sürükleyip bırakmanız yeterlidir.',\r\n            mainText: 'Bu görünümde, bireysel üretim bölümü düzeninizi ayarlayabilir ve makinelerinizi farklı bilgi katmanları aracılığıyla görebilirsiniz. Sadece şu adımları uygulayın.',\r\n            tileTitle: 'Üretim bölümü yükleme',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: 'Asset başarıyla silindi.',\r\n            confirmation: {\r\n              title: \"'%replaceValue' öğesini silmek istediğinizden emin misiniz?\",\r\n              confirm: 'sil',\r\n              dismiss: 'iptal et',\r\n              company: {\r\n                text: 'Şirketi silerseniz, şirkete ait tüm kullanıcılar da silinecektir.',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: 'Asset’i sil',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: \"NamePrefix veya DataType'ta yapacağınız değişiklikler makineye zarar verebilir. Kaydetmek istediğinizden emin misiniz?\",\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: 'Bu yeni makine tipinin sınırlarını uygulamak ister misiniz?',\r\n              title: 'Makine tipini değiştirdiniz',\r\n              accept: 'Evet, yeni Sınırları uygula',\r\n              decline: 'Hayır, güncel Sınırları koru',\r\n              dismiss: 'İptal et',\r\n              info_accept: \"Mevcut sınırlarınızı yeni makine tipinin sınırlarıyla değiştirmek için Evet'i seçin.\",\r\n              info_decline: \"Mevcut sınırlarınızı korumak için Hayır'ı seçin.\",\r\n              info_accept_warning: 'Bu, mevcut tüm sınırlarınızın üzerine yazılacak veya onları silecektir.',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Dosyayı sil',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Salonu sil',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Hattı sil',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: 'durum',\r\n        },\r\n        timeFilter: {\r\n          machine_time: 'Makine zamanı',\r\n          controller_time: 'Kontrolör zamanı',\r\n          iot_gateway_time: 'IoT Ağ Geçidi zamanı',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'AA/GG/YYYY ss:dd:ss A',\r\n          exporting: {\r\n            datetimeformat: 'AA/GG/YYYY ss:dd:ss A',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: 'Veri mevcut değil',\r\n              loading: 'Veri yükleniyor...',\r\n              months: [\r\n                'Ocak',\r\n                'Şubat',\r\n                'Mart',\r\n                'Nisan',\r\n                'Mayıs',\r\n                'Haziran',\r\n                'Temmuz',\r\n                'Ağustos',\r\n                'Eylül',\r\n                'Ekim',\r\n                'Kasım',\r\n                'Aralık',\r\n              ],\r\n              resetZoom: 'Yakınlaştırmayı sıfırla',\r\n              weekdays: [\r\n                'Pazar',\r\n                'Pazartesi',\r\n                'Salı',\r\n                'Çarşamba',\r\n                'Perşembe',\r\n                'Cuma',\r\n                'Cumartesi',\r\n              ],\r\n              shortMonths: [\r\n                'Oca',\r\n                'Şub',\r\n                'Mar',\r\n                'Nis',\r\n                'May',\r\n                'Haz',\r\n                'Tem',\r\n                'Ağu',\r\n                'Eyl',\r\n                'Ekim',\r\n                'Kas',\r\n                'Ara',\r\n              ],\r\n              shortWeekdays: [\r\n                'Paz',\r\n                'Pzt',\r\n                'Sal',\r\n                'Çar',\r\n                'Per',\r\n                'Cum',\r\n                'Cmt',\r\n              ],\r\n              increaseDateRange: 'en azından şuna kadar',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: 'Ön ayarlar',\r\n            rangeTo: 'Bitiş',\r\n            selectDateRange: 'Lütfen bir tarih aralığı seçin',\r\n            predefined: {\r\n              today: 'Bugün',\r\n              custom: 'Özel aralık',\r\n              last7days: 'Son 7 gün',\r\n              yesterday: 'Dün',\r\n              last24Hours: 'Son 24 saat',\r\n              last5Minutes: 'Son 5 dakika',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: 'Değişkeni düzenle',\r\n          new: {\r\n            buttons: {\r\n              delete: 'Değişkeni sil',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: 'Dil seçin',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Şirketi sil',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: 'Lokasyonu sil',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: 'durum',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: 'Panoyu yapılandır',\r\n            hide: {\r\n              title: 'Gizle',\r\n            },\r\n            show: {\r\n              title: 'Göster',\r\n            },\r\n            delete: {\r\n              title: 'Sil',\r\n            },\r\n            add: {\r\n              fab_title: 'Özel kutucuk ekle',\r\n            },\r\n            save: {\r\n              fab_title: 'Yapılandırmayı kaydet',\r\n            },\r\n            move_left: {\r\n              title: 'Önceki konuma geç',\r\n            },\r\n            move_right: {\r\n              title: 'Sonraki konuma geç',\r\n            },\r\n            discard: {\r\n              fab_title: 'Yapılandırmayı iptal et',\r\n            },\r\n            add_custom_card: {\r\n              save: 'kaydet',\r\n              input: 'Kutucuk adı gir',\r\n              title: 'Özel kutucuk ekle',\r\n              cancel: 'iptal et',\r\n              missingMachine: 'En az bir makine seçmeniz gerekiyor',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: 'Beklenmeyen bir hata oluştu. Lütfen sayfayı yeniden yüklemeyi deneyin.',\r\n            },\r\n            e_1xx: {\r\n              message: 'Bilgi hatası',\r\n            },\r\n            e_2xx: {\r\n              message: 'Başarılı',\r\n            },\r\n            e_3xx: {\r\n              message: 'Yönlendirme',\r\n            },\r\n            e_400: {\r\n              message: 'Talep hatalı biçimlendirilmiş olduğundan işleme alınamadı.',\r\n            },\r\n            e_401: {\r\n              message: 'Kimliğiniz doğrulanmadı. Lütfen tekrar giriş yapın.',\r\n            },\r\n            e_403: {\r\n              message: 'Talep edilen kaynağa erişim için yeterli yetkiniz yok.',\r\n            },\r\n            e_404: {\r\n              message: 'İstenen kaynak mevcut değil.',\r\n            },\r\n            e_405: {\r\n              message: 'Yönteme İzin Verilmiyor.',\r\n            },\r\n            e_406: {\r\n              message: 'Yöntem kabul edilemez',\r\n            },\r\n            e_409: {\r\n              message: 'Eklemeye çalıştığınız kaynak zaten mevcut.',\r\n            },\r\n            e_418: {\r\n              message: 'Ben bir Çaydanlığım! Yaay!',\r\n            },\r\n            e_422: {\r\n              message: 'Yöntem İşlenemeyen İçerik',\r\n            },\r\n            e_4xx: {\r\n              message: 'İstemci hatası',\r\n            },\r\n            e_500: {\r\n              message: 'Dahili sunucu hatası oluştu.',\r\n            },\r\n            e_5xx: {\r\n              message: 'Sunucu hatası',\r\n            },\r\n            e_900: {\r\n              message: 'Asset eklemeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_901: {\r\n              message: 'Eylem iptal edildi. Yeni bir asset oluşturulmadı.',\r\n            },\r\n            e_902: {\r\n              message: 'Eylem iptal edildi. Herhangi bir servis talebi gönderilmedi.',\r\n            },\r\n            e_903: {\r\n              message: 'Servis talebi gönderilirken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_904: {\r\n              message: \"'%replaceValue' asset’i başarıyla oluşturuldu. Şimdi başka bir asset ekleyebilirsiniz.\",\r\n            },\r\n            e_905: {\r\n              message: 'Eylem iptal edildi. Asset güncellenmedi.',\r\n            },\r\n            e_906: {\r\n              message: \"'%replaceValue' asset’i başarıyla taşındı.\",\r\n            },\r\n            e_910: {\r\n              message: 'Kullanıcı eklemeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_911: {\r\n              message: 'Mevcut eylemi iptal ettiniz. Hiçbir kullanıcı oluşturulmadı.',\r\n            },\r\n            e_912: {\r\n              message: 'Asset güncellemeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_920: {\r\n              message: 'Mevcut eylemi iptal ettiniz. Hiçbir değişiklik kaydedilmedi.',\r\n            },\r\n            e_921: {\r\n              message: 'Belirtilmemiş bir hata oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_922: {\r\n              message: 'Kullanıcı adınız ve/veya şifreniz hatalı. Lütfen tekrar deneyin.',\r\n            },\r\n            e_923: {\r\n              message: 'Lütfen bir e-posta ve şifre girin.',\r\n            },\r\n            e_924: {\r\n              message: 'Oturumunuz etkin olmadığı için sona erdi. Lütfen tekrar giriş yapın.',\r\n            },\r\n            e_925: {\r\n              message: 'Platformu kullanabilmeniz için gizlilik politikamızı kabul etmeniz gerekmektedir.',\r\n            },\r\n            e_926: {\r\n              message: 'Hesabınız geçici olarak kilitlendi. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_927: {\r\n              message: 'Şifre değiştirme talebiniz başarıyla kaydedildi. Daha fazla bilgi için lütfen e-posta hesabınızı kontrol edin.',\r\n            },\r\n            e_928: {\r\n              message: 'Eylem iptal edildi. Hiçbir dosya yüklenmedi.',\r\n            },\r\n            e_929: {\r\n              message: 'Dosya yüklemeye çalışırken bir hata oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_930: {\r\n              message: 'Dosyayı silmeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_931: {\r\n              message: 'Özel tarih aralığı çok geniş. Varsayılan 24H ayarlanmıştır. Maksimum tarih aralığı %replaceValue gün',\r\n            },\r\n            e_932: {\r\n              message: 'Asset alt öğelere sahip. Önce alt öğeleri silin.',\r\n            },\r\n            e_933: {\r\n              message: \"'%replaceValue' değişkeni başarıyla oluşturuldu. Artık başka bir değişken ekleyebilirsiniz.\",\r\n            },\r\n            e_934: {\r\n              message: 'Değişkeni silmeye çalışırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.',\r\n            },\r\n            e_10500: {\r\n              message: 'İnternete bağlı olmadığınız anlaşılıyor. Lütfen bağlı olduğunuzdan emin olun.',\r\n            },\r\n            e_10501: {\r\n              message: \"Desteklenmeyen bir tarayıcı kullanıyorsunuz. CloudPlatform'un aşağıdaki tarayıcılarla iyi çalışır: Google Chrome, Microsoft Edge, Apple Safari.\",\r\n            },\r\n            e_409_asset: {\r\n              message: 'Bu asset (%replaceValue makine tanımlayıcısı) zaten mevcut',\r\n            },\r\n            e_410_asset: {\r\n              message: 'Bu dosya %replaceValue zaten mevcut',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: 'Aynı anda yalnızca %s öğe seçilebilir',\r\n              title: 'Maksimum miktara ulaşıldı',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: 'Zaman filtresi',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: 'Dosya bulunamadı.',\r\n              file_cardTitle: 'Makine olayları',\r\n              modules: {\r\n                assets: {\r\n                  download: 'Verileri indir',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC izleme dosyaları',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: 'Alarm yok',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC karşılaştırma dosyaları',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC veri dosyaları',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: 'Dosya bulunamadı.',\r\n              file_cardTitle: 'ToolMon dosyaları',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: 'ToolMon verilerini indir',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: 'Tetikleyici',\r\n              column_title_filename: 'Dosya adı',\r\n              column_title_creation_date: 'Oluşturulma tarihi',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI uçuş kayıt cihazı dosyaları',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n  zh: {\r\n    translation: {\r\n      generic: {\r\n        logout: '退出',\r\n        release: \"从 '%replaceValue1' 到 '%replaceValue2' 执行平台维护。在此时间段内，该平台将部分不可用。\",\r\n        pageTitle: 'SW 云平台',\r\n        closeLabel: '关闭',\r\n        acceptLabel: '接受',\r\n        userProfile: '用户数据',\r\n        button: {\r\n          clear: '移除图表',\r\n          timeline: '极限值调整',\r\n          separateCharts: '单独的图表',\r\n        },\r\n        declineLabel: '拒绝',\r\n        backToDashboard: '返回主菜单',\r\n        footerLinks: {\r\n          gtct: {\r\n            url: 'https://sw-machines.com/en/gtc/',\r\n            title: 'GTCT / 标准',\r\n          },\r\n          contact: {\r\n            url: 'mailto:lifedata@sw-machines.com',\r\n            title: '联系方式',\r\n          },\r\n          imprint: {\r\n            url: 'https://sw-machines.com/en/imprint/',\r\n            title: '版本说明',\r\n          },\r\n          privacy: {\r\n            title: '隐私',\r\n            header: '数据保护条例',\r\n          },\r\n          swHomepage: {\r\n            url: 'https://www.sw-machines.com/',\r\n            title: 'SW 网站',\r\n          },\r\n        },\r\n        noInternetConnection: '您似乎没有连接到互联网。请您连网并重新尝试。',\r\n      },\r\n      modules: {\r\n        generic: {\r\n          of: '由',\r\n          noData: '无数据',\r\n          dateFormat: 'YYYY-MM-DD',\r\n          downloaded: '已下载',\r\n          noDuration: '没有可用的持续时间',\r\n          timeFormat: 'HH:mm:ss',\r\n          notLicensed: '您的机器未获得许可证。',\r\n          alarmPending: '警报待定',\r\n          buttons: {\r\n            back: '返回',\r\n            save: '保存',\r\n            view: '显示',\r\n            cancel: '中断',\r\n            custom: '保存 + 设置自定义范围',\r\n            submit: '接收',\r\n            export: {\r\n              limit: '下载极限',\r\n              alarms: '下载警报',\r\n            },\r\n            import: {\r\n              limit: '开始',\r\n              alarms: '开始',\r\n            },\r\n            refreshReset: '重置为标准时间',\r\n            selectAllCheckboxes: '全选',\r\n            unselectAllCheckboxes: '取消选择',\r\n          },\r\n          notAvailable: '不可用',\r\n          notConnected: '还没连接',\r\n          download: {\r\n            file: '下载文件',\r\n          },\r\n          dateTimeFormat: 'YYYY-MM-DD HH:mm:ss',\r\n          timeFormats: {\r\n            day: '天',\r\n            days: '天(复数)',\r\n            hour: '小时',\r\n            year: '年',\r\n            hours: '小时(复数)',\r\n            month: '月',\r\n            years: '年(复数)',\r\n            minute: '分',\r\n            months: '月(复数)',\r\n            second: '秒',\r\n            minutes: '分(复数)',\r\n            seconds: '秒(复数)',\r\n          },\r\n          notAvailableShort: 'n/a',\r\n          timeFormatDuration: 'HH:mm:ss',\r\n          timeFormatWithoutSeconds: 'HH:mm',\r\n          sweetalert: {\r\n            buttons: {\r\n              understood: '明白',\r\n            },\r\n          },\r\n        },\r\n        delete: {\r\n          text: '您将无法恢复此状态!',\r\n        },\r\n        error: {\r\n          upload: '上传失败',\r\n          download: '下载失败',\r\n          message: {\r\n            enrollment_code_409: '设备已在 aws 中登记。',\r\n            limit_change_failed: '极限值无法更改。请稍后重试或发送电子邮件至 lifedata@sw-machines.com。',\r\n          },\r\n        },\r\n        qs: {\r\n          tabs: {\r\n            list: '时间记录',\r\n          },\r\n          list: {\r\n            report: {\r\n              headline: '选择变量',\r\n            },\r\n          },\r\n          grid: {\r\n            columns: {\r\n              datetime: '日期',\r\n            },\r\n          },\r\n        },\r\n        assets: {\r\n          tv: {\r\n            saa: '安全的监督访问',\r\n            directAccess: '直接访问',\r\n            new: {\r\n              fields: {\r\n                id: '输入 ID',\r\n                cOnePanel: '用 C|One',\r\n                sessionType: '会话类型',\r\n              },\r\n              error_messages: {\r\n                id: '请输入会话 ID 或设备 ID',\r\n                sessionType: '请选择一个会话类型',\r\n              },\r\n            },\r\n          },\r\n          line: {\r\n            tabs: {\r\n              kpi: 'KPIs',\r\n              list: '机器',\r\n              shopfloor: '生产现场',\r\n            },\r\n            fab_title: '添加新生产线',\r\n            grid: {\r\n              hall: '车间',\r\n              line: '生产线',\r\n              type: '型号',\r\n              contractEnd: '合同到期 [选项]',\r\n              cellPosition: '加工单元/位置 [选项]',\r\n              operationStep: '加工步骤',\r\n              machineIdentifierSw: '机器号(SW)',\r\n              machineIdentifierCustomer: '机器名称',\r\n            },\r\n            success: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该生产线已成功创建。',\r\n            },\r\n            new_form_title: '新生产线',\r\n            edit_form_title: '编辑流水线',\r\n            new: {\r\n              fields: {\r\n                name: '生产线名称',\r\n                name_short: '生产线名称 (缩写) [选项]',\r\n                description: '说明 [选项]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '请输入生产线名称。',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该流水线已成功更新。',\r\n            },\r\n          },\r\n          hall: {\r\n            fab_title: '添加新车间',\r\n            grid: {\r\n              part: '零件型号',\r\n              lineName: '生产线',\r\n              typeOfLoading: '上下料形式',\r\n              lineResponsible: '生产线负责人',\r\n              plannedQuantity: '计划的产量',\r\n              numberOfMachines: '# 机器',\r\n            },\r\n            tabs: {\r\n              list: '生产线',\r\n              shopfloor: '生产车间',\r\n            },\r\n            success: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该车间已成功创建。',\r\n            },\r\n            new_form_title: '新车间',\r\n            shopfloor: {\r\n              edit: '编辑模式',\r\n              configure: {\r\n                save: {\r\n                  fab_title: '保存配置',\r\n                },\r\n                discard: {\r\n                  fab_title: '放弃配置',\r\n                },\r\n              },\r\n            },\r\n            edit_form_title: '编辑车间',\r\n            new: {\r\n              fields: {\r\n                name: '车间名称',\r\n                name_short: '车间名称 (缩写) [选项]',\r\n                description: '描述 [选项]',\r\n                description_external: '说明 (外部) [选项]',\r\n                description_internal: '说明 (内部) [选项]',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '请输入车间名称。',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该车间已成功更新。',\r\n            },\r\n          },\r\n          grid: {\r\n            description: '描述 [选项]',\r\n          },\r\n          machine: {\r\n            g_mode: [\r\n              null,\r\n              'G0',\r\n              'G1',\r\n              'G2',\r\n              'G3',\r\n              'CIP',\r\n              'ASPLINE',\r\n              'BSPLINE',\r\n              'CSPLINE',\r\n              'POLY',\r\n              'G33',\r\n              'G331',\r\n              'G332',\r\n              'OEMIPO1',\r\n              'OEMIPO2',\r\n              'CT',\r\n              'G34',\r\n              'G35',\r\n              'INVCW',\r\n              'INVCCW',\r\n              'G335',\r\n              'G336',\r\n            ],\r\n            fab_title: '创建新资产',\r\n            tabs: {\r\n              info: '时间顺序',\r\n              alarms: '警报',\r\n              events: '机器事件',\r\n              gateway: '网关',\r\n              service: '客户服务',\r\n              spistat: 'SpiStat',\r\n              toolMon: 'ToolMon',\r\n              swimlane: '生产线可用性',\r\n              'axis-test': '轴测试',\r\n              collection: '选择',\r\n              technology: '技术',\r\n              maintenance: '维护',\r\n              performance: '性能',\r\n              spindledata: '主轴数据',\r\n              remoteaccess: '远程访问',\r\n              enduranceTest: '生产线终点测试',\r\n              administration: '管理',\r\n              y_title: {\r\n                status: '状态',\r\n                status_table_one: '工作台 1',\r\n                status_table_two: '工作台 2',\r\n              },\r\n              energymonitoring: '能耗监测',\r\n              technology_undefined: '未定义',\r\n              technology_undefined_condition: '未定义的状态!',\r\n            },\r\n            move: {\r\n              message: \"可以将资产 '%replaceValue' 移动到新的公司、生产基地、车间和/或流水线中。\",\r\n              select_hall_label: '请选择新的新车间',\r\n              select_line_label: '请选择新的流水线',\r\n              select_company_label: '请选择新的公司',\r\n              select_location_label: '请选择新的生产基地',\r\n            },\r\n            new: {\r\n              fields: {\r\n                s3: 'S3',\r\n                name: '机器号 (SW)',\r\n                iotcore: 'IoT Core',\r\n                startup: '交付 [选项]',\r\n                shipping: '发送 [选项]',\r\n                controller: '控制器',\r\n                machine_type: '机器型号',\r\n                warranty_end: '保修结束 [选项]',\r\n                iotgreengrass: 'IoT Greengrass',\r\n                systemsManager: '系统管理员',\r\n                warranty_start: '保修开始 [选项]',\r\n                machine_swmp_api: '机器 SWMP API 结束 [选项]',\r\n                machine_swsp_trace: '机器 SWSP Trace 结束 [选项]',\r\n                machine_swcp_portal: '机器 SWCP Portal 结束 [选项]',\r\n                start_of_production: '生产开始 [选项]',\r\n                machine_swcp_support: '机器 SWCP Support 结束 [选项]',\r\n                machine_cell_position: '加工单元/位置',\r\n                machine_swsp_line_mon: '机器 SWSP LineMon 结束 [选项]',\r\n                machine_identifier_customer: '机器确认号 (客户)',\r\n              },\r\n              error_messages: {\r\n                name_not_specified: '请输入有效的 SW 机器号（至少 7 个字符: A-Z, 0-9, -)。',\r\n                controller_not_specified: '请选择一个控制器。',\r\n                machine_type_not_specified: '请选择一个机器型号。',\r\n                machine_identifier_customer_not_specified: '请输入机器确认号。',\r\n              },\r\n            },\r\n            success: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该资产已成功创建。',\r\n            },\r\n            new_form_title: '添加资产',\r\n            edit_form_title: '编辑资产',\r\n            move_form_title: '移动资产',\r\n            editSuccess: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该资产已成功更新。',\r\n            },\r\n            header: {\r\n              labels: {\r\n                api: 'SWMP API',\r\n                trace: 'SWSP Trace',\r\n                portal: 'SWCP Portal',\r\n                lineMon: 'SWSP LineMon',\r\n                support: 'SWCP Support',\r\n                shipping: '发货日期',\r\n                controller: '数控系统',\r\n                contractEnd: '合同结束',\r\n                machineType: '机型',\r\n                startupDate: '调试日期',\r\n                warrantyEnd: '保修结束日',\r\n                cellPosition: '单元/位置',\r\n                warrantyStart: '保修起始日',\r\n                customerNumber: '客户号',\r\n                enrollmentConfig: '注册配置',\r\n                startOfProduction: '生产开始',\r\n                machineIdentifierSw: '机器号SW',\r\n                enrollmentConfigDownload: '下载',\r\n                machineIdentifierCustomer: '客户机器名称',\r\n              },\r\n            },\r\n            technology: {\r\n              change: '更换',\r\n              g_mode: 'G 功能',\r\n              off_time: '非生产时间',\r\n              no_change: '无更换',\r\n              undefined: '未定义',\r\n              active_tool: '激活的刀具',\r\n              tool_change: '换刀',\r\n              machining_time: '主要时间',\r\n              tool_change_time: '换刀时间',\r\n              pie: {\r\n                chart: {\r\n                  name_one: '流程时间，工作台 1',\r\n                  name_two: '流程时间，工作台 2',\r\n                  name_one_undefined: '未定义的流程时间，工作台 1',\r\n                  name_two_undefined: '未定义的流程时间，工作台 2',\r\n                },\r\n              },\r\n              q_axis_and_spindle: 'Q 轴和主轴',\r\n              undefined_gmode_data: '没有用于 G 功能的数据',\r\n              auxiliary_process_time: '附加的流程时间',\r\n              undefined_activetool_data: '没有用于激活的刀具的数据',\r\n              undefined_tool_change_data: '没有用于换刀的数据',\r\n              undefined_machining_time_table_one: '未定义的状态，工作台 1',\r\n              undefined_machining_time_table_two: '未定义的状态，工作台 2',\r\n              machining_auxiliary_tool_changing_table_one: '主要时间、换刀时间和非生产时间，工作台 1',\r\n              machining_auxiliary_tool_changing_table_two: '主要时间、换刀时间和非生产时间，工作台 2',\r\n            },\r\n            add_line_to_dashboard: '给主菜单添加生产线',\r\n            elements: {\r\n              'axis-test': {\r\n                kpi: 'KPI',\r\n                unit: '单元',\r\n                value: '值',\r\n                kpiUnit: '单元',\r\n                headline: '轴测试',\r\n                kpiValue: '值',\r\n                kpiHeader: 'KPI',\r\n                limitsLoad: '从浏览器存储器中加载',\r\n                limitsSave: '保存到浏览器存储器中',\r\n                selectAxis: '选择轴',\r\n                limitsExport: '将极限值导出到剪贴板',\r\n                openAxistest: '打开轴测试',\r\n                axisTestPlural: '轴测试',\r\n                adjustments: {\r\n                  add: '添加本地调整',\r\n                  range: '范围',\r\n                  header: '本地调整',\r\n                  remove: '去掉',\r\n                  position: '位置',\r\n                  amplitude: '振幅',\r\n                  spreadMultiplier: '极限值乘数',\r\n                },\r\n                chart: {\r\n                  Equability: {\r\n                    x: '位置',\r\n                    y: '电流',\r\n                    up: '上',\r\n                    down: '下',\r\n                    limitsUp: '限制正方向',\r\n                    limitsDown: '限制负方向',\r\n                    sliderSlopeCenter: '坡度原点',\r\n                    sliderSlopeFactor: '坡度系数',\r\n                    sliderVerticalOffset: 'Y 轴偏移',\r\n                    sliderVerticalSpread: '限制宽度',\r\n                    sliderQuadraticCenter: '方形原点',\r\n                    sliderQuadraticFactor: '方形系数',\r\n                  },\r\n                  Circularity: {\r\n                    clockwise: '顺时针',\r\n                    limitsClockwise: '顺时针限制',\r\n                    counterClockwise: '逆时针',\r\n                    sliderSineOffset: '波偏移',\r\n                    sliderSineAmplitude: '波幅',\r\n                    sliderSineFrequency: '波频率',\r\n                    sliderVerticalOffset: 'Y 轴偏移',\r\n                    sliderVerticalSpread: '限制宽度',\r\n                    limitsCounterClockwise: '逆时针限制',\r\n                  },\r\n                },\r\n                kpis: {\r\n                  pulseVelocity: '速度',\r\n                  pulseMaxRampUp: '斜坡 ->',\r\n                  pulseMaxRampDown: '斜坡 <-',\r\n                  pulseMaxStiffness: '最大刚度',\r\n                  pulseMinStiffness: '最小刚度',\r\n                  pulseMeanStiffness: '刚度 Ø',\r\n                  circularReversalRange: '圆形反装夹',\r\n                  pulseMaxUpPathCurrent: '最大电流 ->',\r\n                  pulseMinUpPathCurrent: '最小电流 ->',\r\n                  pulseMeanUpPathCurrent: '电流 Ø ->',\r\n                  pulseMaxDownPathCurrent: '最大电流 <-',\r\n                  pulseMinDownPathCurrent: '最小电流 <-',\r\n                  pulseMeanDownPathCurrent: '电流 Ø <-',\r\n                  circularShapeDeviationClockwise: '右转圆形偏差',\r\n                  pulseStiffnessStandardDeviation: '刚度 σ',\r\n                  pulseStandardDeviationUpPathCurrent: '电流 σ ->',\r\n                  pulseStandardDeviationDownPathCurrent: '电流 σ <-',\r\n                  circularShapeDeviationCounterClockwise: '左转圆形偏差',\r\n                },\r\n                axisTestTypes: {\r\n                  CIRCLE: '圆检验',\r\n                  EQUABILITY: '同步检验',\r\n                  CIRCULARITY: '圆检验',\r\n                },\r\n                listbox: {\r\n                  noAxisTestAvailable: '没有这种类型的轴检验可用',\r\n                },\r\n              },\r\n              gateway: {\r\n                title: '网关',\r\n                contact: '如有错误请使用',\r\n                headline: '网关',\r\n                netcfg: {\r\n                  cta: '请您通过 Netcfg 表格向我们提供数据供使用。',\r\n                  intro: '为了能够连接您的机器，我们需要您的网络配置信息。',\r\n                  title: '网络配置',\r\n                  goToNetconfig: '打开网络配置',\r\n                },\r\n                device: {\r\n                  title: '设备详情',\r\n                },\r\n                enrollment: {\r\n                  pic: '如果物联网网关是这样的，请按照以下步骤操作:',\r\n                  line1: '请您单击图案下边缘的按钮，以下载注册文件。',\r\n                  line2: '下载自动开始。',\r\n                  line3: '请您将 .json 文件放在 U 盘的根文件夹中。请您确保文件已命名为:',\r\n                  line4: 'enrollment.json.',\r\n                  line5: '请您确保以下文件位于 U 盘的根文件夹中:',\r\n                  line6: '请您将 U 盘插入相应的物联网网关。',\r\n                  line7: '示教自动开始，由闪烁的绿色用户 LED 给出信号。',\r\n                  line8: '注册成功后，绿色 LED 灯会亮起，直到 U 盘被拔出。',\r\n                  title: '注册',\r\n                  button: '注册文件',\r\n                },\r\n                deviceMigration: {\r\n                  line1: '请您下载“migrate-iot.zip”文件，并将其内容直接解压缩到空白 U 盘上。',\r\n                  line2: 'aws.json',\r\n                  line3: '请您也下载它 ',\r\n                  line4: ' 并将其添加到 U 盘上。请您确保文件命名如下:',\r\n                  line5: '请您确保以下文件位于 U 盘的根文件夹中:',\r\n                  line6: 'install.json',\r\n                  line7: 'migration.tar.gz',\r\n                  line8: 'migration.tar.gz.sig',\r\n                  line9: 'migration.json',\r\n                  title: '平台融合',\r\n                  line10: '请您将 U 盘插入相应的物联网网关。',\r\n                  line11: '该软件会自动安装，由闪烁的黄色 LED 指示。',\r\n                  line12: '成功融合后，绿色 LED 灯会亮起，直到 U 盘被拔出。',\r\n                  line13: '成功融合后，绿色 LED 灯会亮起，直到 U 盘被拔出。',\r\n                  device: {\r\n                    button: 'migrate-iot.zip',\r\n                  },\r\n                  generic: {\r\n                    button: 'aws.json',\r\n                  },\r\n                },\r\n              },\r\n              info: {\r\n                generate: '生成',\r\n                headline: '时间序列管理',\r\n                noChartMessage: '请选择一个或多个参数选项，然后单击“生成”',\r\n              },\r\n              toolmon: {\r\n                title: 'ToolMon',\r\n              },\r\n              alarms: {\r\n                headline: '警报',\r\n              },\r\n              service: {\r\n                contact: '请联系',\r\n                headline: '客户服务',\r\n                update: {\r\n                  title: '更新文件',\r\n                },\r\n                upload: {\r\n                  title: '上传文件',\r\n                  fields: {\r\n                    file: '文件',\r\n                    language: '文件语言',\r\n                    file_name: '文件名',\r\n                    list_of_languages: {\r\n                      cz: '捷克语',\r\n                      de: '德语',\r\n                      en: '英语',\r\n                      es: '西班牙语',\r\n                      fr: '法语',\r\n                      hu: '匈牙利',\r\n                      it: '意大利语',\r\n                      ko: '韩国',\r\n                      pl: '波兰语',\r\n                      tr: '土耳其',\r\n                      zh: '中文',\r\n                    },\r\n                  },\r\n                  buttons: {\r\n                    send: '上传',\r\n                    cancel: '中断',\r\n                  },\r\n                  success: {\r\n                    title: '成功',\r\n                    button: '返回服务总览',\r\n                    message: '该文件已成功上传',\r\n                  },\r\n                  error_messages: {\r\n                    file_name: '请您输入一个文件名。',\r\n                    file_not_valid: '请输入一个文件/请选择一个较小的文件。',\r\n                    language_not_specified: '请输入文件语言。',\r\n                  },\r\n                },\r\n                manuals: {\r\n                  title: '使用手册',\r\n                },\r\n                version: {\r\n                  title: '文件版本',\r\n                },\r\n                contracts: {\r\n                  title: '合同',\r\n                },\r\n                components: {\r\n                  title: '硬件部件和软件部件',\r\n                },\r\n                spare_parts: {\r\n                  title: '备件清单',\r\n                },\r\n                consumeables: {\r\n                  title: '工作耗材',\r\n                },\r\n                Update: {\r\n                  buttons: {\r\n                    send: '更新',\r\n                  },\r\n                },\r\n                remoteSupport: {\r\n                  line1: '要激活机器的远程访问，必须在物联网网关上安装 TeamViewer。 ',\r\n                  line2: '如果尚未安装，只需单击“安装”即可安装 TeamViewer。',\r\n                  title: '请您安装远程支持',\r\n                  status: 'Deployment 状态',\r\n                  copy: {\r\n                    button: '复制链接',\r\n                  },\r\n                  install: {\r\n                    button: '安装 Teamviewer',\r\n                  },\r\n                  session: {\r\n                    button: '开始会话',\r\n                  },\r\n                },\r\n                software_edge: {\r\n                  title: '物联网网关软件',\r\n                  values: {\r\n                    box_id: 'Box-ID',\r\n                    machine_connect: '机器连接',\r\n                    operating_system: '操作系统',\r\n                  },\r\n                },\r\n                contact_service: {\r\n                  line1: '您需要机器上的帮助吗?',\r\n                  line2: '请联系我们!',\r\n                  title: '给 SW 客户服务的信息',\r\n                  button: '联系客户服务',\r\n                  fields: {\r\n                    name: '机器号 (SW)',\r\n                    type: '请求类型',\r\n                    email: '电子邮件',\r\n                    message: '信息',\r\n                    phone_no: '电话',\r\n                    last_name: '姓',\r\n                    first_name: '名',\r\n                    contact_person: '联系人 (SW) [选项]',\r\n                    list_of_types: {\r\n                      request: '一般性请求',\r\n                      service: '客户服务',\r\n                      retrofit: '翻新',\r\n                      expansion: '扩展',\r\n                      inspection: '检查',\r\n                    },\r\n                    machine_identifier_customer: '机器确认号 (客户) [选项]',\r\n                  },\r\n                  buttons: {\r\n                    send: '发送请求',\r\n                    cancel: '中断',\r\n                  },\r\n                  success: {\r\n                    title: '成功！',\r\n                    button: '返回客户服务页面',\r\n                    message: '请求已成功发送至SW客户服务。',\r\n                  },\r\n                  error_messages: {\r\n                    email_not_valid: '请输入有效的电子邮件地址。',\r\n                    name_not_specified: '请输入有效的 SW 机器号（至少 7 个字符: A-Z, 0-9, - _)。',\r\n                    phone_not_specified: '请输入有效的电话号码。',\r\n                    message_not_specified: '请输入信息。',\r\n                    last_name_not_specified: '请输入姓。',\r\n                    first_name_not_specified: '请输入名。',\r\n                    family_name_not_specified: '请输入姓。',\r\n                    contact_type_not_specified: '请输入服务请求类型。',\r\n                  },\r\n                },\r\n                software_machine: {\r\n                  title: '机器软件',\r\n                  values: {\r\n                    nc_version: 'NC 版本',\r\n                    hmi_version: 'HMI 版本',\r\n                    plc_version: 'PLC 版本',\r\n                    compile_cycles: '编译周期',\r\n                    operating_system: '操作系统',\r\n                    pcu_base_version: 'PCU 基本版',\r\n                    plc_toolbox_version: 'PLC 工具箱',\r\n                    plc_user_program_version: 'PLC 用户程序',\r\n                  },\r\n                },\r\n                changed: {\r\n                  success: {\r\n                    message: '文件名已成功修改',\r\n                  },\r\n                },\r\n                remoteSupportInitiate: {\r\n                  title: '远程支持',\r\n                },\r\n                maintenance_assistance: {\r\n                  intro: '操作助手帮你解决问题。',\r\n                  title: '操作助手',\r\n                  sub_title: '您目前是否对您的一项资产有困难?',\r\n                  open_assistant: '打开操作助手',\r\n                  request_account: '申请账户',\r\n                },\r\n              },\r\n              spistat: {\r\n                headline: '主轴统计 SpiStat',\r\n              },\r\n              onlineState: {\r\n                title: '物联网连接',\r\n                labelOnline: '开',\r\n                labelOffline: '关',\r\n              },\r\n              swimlane: {\r\n                headline: '生产线可用性',\r\n              },\r\n              endurance: {\r\n                headline: '生产线终点测试',\r\n                chartTitles: {\r\n                  runtime: '运行时间数据',\r\n                  endurance: '生产线终点测试',\r\n                  operation: '运行模式',\r\n                  qaxis_180: 'Q 轴 180°',\r\n                  nc_program: 'NC 程序',\r\n                  stacklights: '3 呼叫灯',\r\n                },\r\n              },\r\n              sendingState: {\r\n                title: '发送状态',\r\n                aborted: '中断了',\r\n                sending: '发送',\r\n                undefined: '未定义',\r\n                interrupted: '中断了',\r\n              },\r\n              alarms_map: {\r\n                headline: '屏幕警报',\r\n              },\r\n              collection: {\r\n                headline: '时间 ',\r\n                noChartMessage: '请在左侧选择一个参数选项。',\r\n              },\r\n              performance: {\r\n                kpi: {\r\n                  sum: '合计',\r\n                  header: 'Kpi 性能',\r\n                  target: '给定',\r\n                },\r\n                alarms: {\r\n                  title: '警报',\r\n                  category: [\r\n                    '未分类',\r\n                    '故障报告',\r\n                    '工作报告',\r\n                    '状态报告',\r\n                    '操作指南',\r\n                  ],\r\n                  icons: {\r\n                    trend: '趋势',\r\n                    duration: '时长',\r\n                    flatlist: '平面列表',\r\n                    frequency: '出现的频率',\r\n                  },\r\n                  tableHeadlines: {\r\n                    time: '时间',\r\n                    trend: '趋势',\r\n                    duration: '时长',\r\n                    leftTime: '警报走了',\r\n                    alarmCount: '数量',\r\n                    alarmNumber: '警报号',\r\n                    description: '描述',\r\n                    alarmOccured: '出现了警报',\r\n                    alarmClassification: '警报分类',\r\n                    alarmCountSecondRange: '数量 T-1',\r\n                  },\r\n                  description: {\r\n                    trend: {\r\n                      up: '上升的',\r\n                      down: '下降的',\r\n                      flat: '不变的',\r\n                    },\r\n                  },\r\n                },\r\n                details: {\r\n                  title: '细节',\r\n                  ncProgram: 'NC 程序',\r\n                  lastModified: '上一次修改',\r\n                  machineState: '机器状态',\r\n                  numberAlarms: '警报待定',\r\n                  stopCondition: '中止条件',\r\n                  ncProgramState: 'NC 程序状态',\r\n                  protectionLevel: '保护级别',\r\n                  ncProgramStates: [\r\n                    '中断了',\r\n                    '中止了',\r\n                    '运行中',\r\n                    '等待中',\r\n                    '中断了',\r\n                  ],\r\n                  protectionLevels: [\r\n                    '系统',\r\n                    '制造商',\r\n                    '客户服务',\r\n                    '用户',\r\n                    '钥匙开关 位置 3',\r\n                    '钥匙开关 位置 2',\r\n                    '钥匙开关 位置 1',\r\n                    '钥匙开关 位置 0',\r\n                  ],\r\n                },\r\n                cycleTime: {\r\n                  title: '节拍',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '循环时间，单位：秒',\r\n                    },\r\n                  },\r\n                },\r\n                piececounter: {\r\n                  ok: '正常',\r\n                  nok: '不正常',\r\n                  sum: '合计',\r\n                  title: '件计数器',\r\n                  titleDayCounter: '日计数器',\r\n                  titleShiftCounter: '工班计数器',\r\n                  titleTotalCounter: '总计数器',\r\n                  titleTotalCounterSmall: '总体',\r\n                },\r\n                availability: {\r\n                  title: '可用性',\r\n                  kpi: {\r\n                    title: 'KPI 可用性',\r\n                  },\r\n                  legend: {\r\n                    auto: 'AUTO',\r\n                    JOG_with_error: 'JOG 带错误',\r\n                    MDA_with_error: 'MDA 带错误',\r\n                    JOG_without_error: 'JOG 无错误',\r\n                    MDA_without_error: 'MDA 无错误',\r\n                    not_defined_condition: '未定义的状态',\r\n                    auto_no_program_active: 'AUTO 没有程序被激活',\r\n                    auto_waiting_for_parts: 'AUTO 等待零件',\r\n                    auto_with_error_program_stopped: 'AUTO 带错误 - 程序停止',\r\n                    auto_waiting_for_parts_stopping_error: 'AUTO 等待零件 + 停止错误',\r\n                  },\r\n                  aggregated: {\r\n                    title: '汇聚的可用性',\r\n                  },\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '运行时间监视器',\r\n                    },\r\n                  },\r\n                },\r\n                inProduction: {\r\n                  title: '状态',\r\n                },\r\n                operationMode: {\r\n                  title: '工作模式',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '工作状态',\r\n                    },\r\n                  },\r\n                },\r\n                runtimeMonitor: {\r\n                  title: '运行时间监视器',\r\n                  chart: {\r\n                    yAxis: {\r\n                      title: '程序',\r\n                      labels: {\r\n                        on: '开',\r\n                        off: '关',\r\n                      },\r\n                    },\r\n                  },\r\n                },\r\n                spindleOverride: {\r\n                  title: '主轴承载',\r\n                },\r\n                feedrateOverride: {\r\n                  title: '进给承载',\r\n                },\r\n                uptimeDistribution: {\r\n                  title: '正常运行时间分配',\r\n                },\r\n              },\r\n              administration: {\r\n                title: '管理',\r\n                headline: '管理',\r\n                aws: {\r\n                  title: 'AWS 链接',\r\n                },\r\n                groups: {\r\n                  title: '事物组',\r\n                },\r\n                references: {\r\n                  values: {\r\n                    s3: 'S3',\r\n                    iot: 'IoT Core',\r\n                    ssm: '系统管理员',\r\n                    greengrass: 'IoT Greengrass',\r\n                  },\r\n                },\r\n              },\r\n              condition: {\r\n                bill: {\r\n                  title: '零件清单',\r\n                },\r\n                component: {\r\n                  title: '部件',\r\n                },\r\n              },\r\n              maintenance: {\r\n                headline: '维护',\r\n              },\r\n              spindleData: {\r\n                headline: '主轴数据',\r\n              },\r\n              remoteaccess: {\r\n                headline: '远程访问',\r\n              },\r\n              point8: {\r\n                chart: {\r\n                  xAxis: {\r\n                    title: '警报前时间(s)',\r\n                  },\r\n                  yAxis: {\r\n                    title: '警报后时间(s)',\r\n                  },\r\n                },\r\n              },\r\n              energymonitoring: {\r\n                headline: '能耗监测',\r\n                chartTitles: {\r\n                  air: '耗气量',\r\n                  current: '耗电量',\r\n                  consumption: '每小时平均消耗量',\r\n                },\r\n              },\r\n              conditionMonitoring: {\r\n                headline: '状态监控',\r\n              },\r\n            },\r\n          },\r\n          company: {\r\n            fab_title: '添加新公司',\r\n            grid: {\r\n              city: '城市',\r\n              email: '电子邮件',\r\n              street: '街道',\r\n              country: '国家',\r\n              website: '网站',\r\n              postalCode: '邮编',\r\n              locationName: '基地名称',\r\n              locationCustomerNumber: '客户号',\r\n            },\r\n            tabs: {\r\n              list: '清单',\r\n              worldmap: '世界地图',\r\n            },\r\n            success: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该公司已成功创建。',\r\n            },\r\n            toggle_switch: '创建一个具有相同数据的生产基地',\r\n            new_form_title: '新公司',\r\n            edit_form_title: '编辑公司',\r\n            new: {\r\n              fields: {\r\n                city: '城市',\r\n                name: '公司名称',\r\n                email: '电邮 [选项]',\r\n                state: '州/省 [选项]',\r\n                street: '街道',\r\n                country: '国家',\r\n                website: '网站 [选项]',\r\n                zipcode: '邮编',\r\n                legal_form: '公司类别[选项]',\r\n                name_short: '公司名称(缩写) [选项]',\r\n                description: '描述 [选项]',\r\n                company_logo: '公司商标 (URL) [选项]',\r\n                customer_number: '客户号',\r\n                industry_sector: '工业领域',\r\n                description_external: '说明 (外部) [选项]',\r\n                description_internal: '说明 (内部) [选项]',\r\n              },\r\n              error_messages: {\r\n                url: '请您输入一个有效的 URL。',\r\n                email: '请输入有效的电邮地址。',\r\n                city_not_specified: '请输入城市。',\r\n                name_not_specified: '请输入公司名称。',\r\n                street_not_specified: '请输入地址。',\r\n                country_not_specified: '请输入国家。',\r\n                zipcode_not_specified: '请输入邮编。',\r\n                customer_number_not_specified: '请您输入一个客户号。',\r\n                industry_sector_not_specified: '请输入工业领域。',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该公司已成功更新。',\r\n            },\r\n            header: {\r\n              labels: {\r\n                email: '电子邮件',\r\n                address: '地址',\r\n                country: '国家',\r\n                website: '网站',\r\n              },\r\n            },\r\n            coordinateselement: {\r\n              intro_text: 'SW CloudPlatform 在地图上使用经度和纬度显示该公司。',\r\n              intro_heading: '有关地点的信息',\r\n              location_name: '地名:',\r\n              label_latitude: '纬度',\r\n              label_longitude: '经度',\r\n              text_fallback_info: '如果未设定，则使用标准坐标。',\r\n              text_location_found: '已找到一个地点。',\r\n              text_location_entered: '地点已给出。',\r\n              text_success_location: '设置了以下数据:',\r\n              button_define_coordinates: '自己输入坐标',\r\n              text_no_coordinates_found: '没有找到相应于所输入数据的坐标。',\r\n              text_coordinates_success_set: '坐标已设定。',\r\n              button_set_custom_coordinates: '设定坐标',\r\n              text_specify_coordinates_yourself: '或者，您可以自己输入坐标。',\r\n            },\r\n          },\r\n          location: {\r\n            fab_title: '添加新生产基地',\r\n            tabs: {\r\n              list: '车间',\r\n              shopfloor: '生产车间',\r\n            },\r\n            grid: {\r\n              hallName: '车间',\r\n            },\r\n            success: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该生产基地已成功创建。',\r\n            },\r\n            new_form_title: '新生产基地',\r\n            edit_form_title: '编辑生产基地',\r\n            new: {\r\n              fields: {\r\n                city: '城市',\r\n                name: '生产基地名称',\r\n                email: '电子邮件 [选项]',\r\n                state: '州/省 [选项]',\r\n                street: '地址',\r\n                country: '国家',\r\n                website: '网站 [选项]',\r\n                zipcode: '邮编',\r\n                language: '语言 [选项]',\r\n                name_short: '生产基地名称 (缩写) [选项]',\r\n                description: '说明 [选项]',\r\n                customer_number: '客户号 [选项]',\r\n                description_internal: '说明 (内部) [选项]',\r\n              },\r\n              error_messages: {\r\n                email: '请输入有效的电邮地址。',\r\n                city_not_specified: '请输入城市。',\r\n                name_not_specified: '请输入生产基地名称。',\r\n                street_not_specified: '请输入地址。',\r\n                country_not_specified: '请输入国家。',\r\n                zipcode_not_specified: '请输入邮编。',\r\n              },\r\n            },\r\n            editSuccess: {\r\n              title: '成功！',\r\n              button: '返回列表',\r\n              message: '该生产基地已成功更新。',\r\n            },\r\n            header: {\r\n              labels: {\r\n                address: '地址',\r\n                country: '国家',\r\n              },\r\n            },\r\n          },\r\n          companies: {\r\n            grid: {\r\n              city: '城市',\r\n              email: '电子邮件',\r\n              street: '街道',\r\n              country: '国家',\r\n              website: '网站',\r\n              postalCode: '邮编',\r\n              companyName: '公司名称',\r\n            },\r\n            tabs: {\r\n              list: '清单',\r\n              worldmap: '世界地图',\r\n            },\r\n            map: {\r\n              description_not_available: '没有描述',\r\n            },\r\n          },\r\n          generic: {\r\n            new: {\r\n              buttons: {\r\n                add: '添加',\r\n                back: '返回列表',\r\n                edit: '更新',\r\n                save: '保存',\r\n                email: '发送图片',\r\n                cancel: '取消',\r\n                addMultiple: '添加 + 新建',\r\n              },\r\n            },\r\n          },\r\n          administration: {\r\n            edit_form_title: '编辑管理',\r\n          },\r\n        },\r\n        frameTitle: {\r\n          qs: '质量保证',\r\n          users: '用户管理',\r\n          assets: '设备管理',\r\n          settings: '多个设置',\r\n          dashboard: '主菜单',\r\n          userProfile: '用户数据',\r\n        },\r\n        kpi: {\r\n          tileTitle: 'KPI',\r\n        },\r\n        sidebar: {\r\n          users: '用户管理',\r\n          assets: '设备管理',\r\n          dashboard: '主菜单',\r\n          userProfile: '用户数据',\r\n        },\r\n        variables: {\r\n          bar: 'Bar',\r\n          plc: 'PLC',\r\n          area: '区域',\r\n          bool: 'BOOL',\r\n          byte: 'BYTE',\r\n          char: 'CHAR',\r\n          line: '线',\r\n          long: '长',\r\n          real: 'REAL',\r\n          true: '活跃的',\r\n          word: 'WORD',\r\n          dword: 'DWORD',\r\n          false: '不活跃',\r\n          float: '浮点数',\r\n          uword: 'UWORD',\r\n          double: '两倍',\r\n          plcint: 'PLC Int',\r\n          's7-300': 'S7-300',\r\n          boolean: 'Boolean',\r\n          integer: '整数',\r\n          nckbool: 'NCK Bool',\r\n          nckbyte: 'NCK Byte',\r\n          opcmode: 'opcmode',\r\n          plcbool: 'PLC Bool',\r\n          plcbyte: 'PLC Byte',\r\n          plcchar: 'PLC Char',\r\n          plcint8: 'PLC Int 8',\r\n          plcreal: 'PLC Real',\r\n          's7-1500': 'S7-1500',\r\n          external: '外部的',\r\n          internal: '内部的',\r\n          nc_block: 'NC-Block',\r\n          nckfloat: 'NCK Float',\r\n          nckint16: 'NCK Int16',\r\n          nckint32: 'NCK Int32',\r\n          nckubyte: 'NCK U Byte',\r\n          one_year: '一年',\r\n          plcchar8: 'PLC Char 8',\r\n          plcfloat: 'PLC Float',\r\n          plcint16: 'PLC Int 16',\r\n          plcint32: 'PLC Int 32',\r\n          plcint64: 'PLC Int 64',\r\n          plcubyte: 'PLC U Byte',\r\n          plcuint8: 'PLC U Int 8',\r\n          fab_title: '添加新变量',\r\n          nc_common: 'NC-Common',\r\n          nckdouble: 'NCK Double',\r\n          nckstring: 'NCK String',\r\n          nckuint16: 'NCK U Int16',\r\n          nckuint32: 'NCK U Int32',\r\n          one_month: '一个月',\r\n          plcchar16: 'PLC Char 16',\r\n          plcstring: 'PLC String',\r\n          plcuint16: 'PLC U Int 16',\r\n          plcuint32: 'PLC U Int 32',\r\n          plcuint64: 'PLC U Int 64',\r\n          rectangle: '长方形',\r\n          tabs: {\r\n            list: '变量列表',\r\n          },\r\n          ten_years: '十年',\r\n          two_weeks: '两周',\r\n          pclfloat64: 'PLC Float 64',\r\n          plcfloat32: 'PLC Float 32',\r\n          plcfloat64: 'PLC Float 64',\r\n          plcstring8: 'PLC String 8',\r\n          six_months: '六个月',\r\n          categorical: '分类',\r\n          plcstring16: 'PLC String 16',\r\n          signed_word: 'SIGNED WORD',\r\n          signed_dword: 'SIGNED DWORD',\r\n          sinumerikone: 'Sinumerik One',\r\n          error: {\r\n            message: '尝试创建变量时出现错误。请稍后重试。',\r\n          },\r\n          new_form_title: '新变量',\r\n          unsigned_dword: 'UNSIGNED DWORD',\r\n          edit_form_title: '编辑变量',\r\n          new: {\r\n            fields: {\r\n              hint: '(改变可能会损坏机器)',\r\n              showId: '显示变量 ID 输入栏',\r\n              maxTime: '最大时间',\r\n              nckArea: 'NCK Area',\r\n              dataType: '数据类型',\r\n              nckBlock: 'NCK Block',\r\n              chartType: '图表类型',\r\n              namePrefix: '名称前缀',\r\n              variableId: '变量 Id',\r\n              collections: '',\r\n              displayName: '显示名称',\r\n              showInitial: '显示首字母',\r\n              opcUaAddress: 'OPC UA Address',\r\n              visibilityType: '可见性',\r\n            },\r\n            buttons: {\r\n              delete: '删除变量',\r\n            },\r\n            error_messages: {\r\n              maxTime: '请选择最大时间',\r\n              dataType: '请选择数据类型',\r\n              chartType: '请选择图表类型',\r\n              namePrefix: '请指定有效的前缀名称。(有效字符: A-Z, _)。',\r\n              variableId: '请指定有效的 UUID',\r\n              displayName: '请指定显示名称',\r\n              showInitial: '请选择首字母',\r\n              namePrefixEdit: '请指定有效的前缀名称。(有效字符: A-Z a-z, _)。',\r\n              visibilityType: '请选择可见性类型',\r\n            },\r\n          },\r\n          success: {\r\n            message: '该变量已成功创建',\r\n          },\r\n          editError: {\r\n            message: '尝试更新变量时出现错误。请稍后重试。',\r\n          },\r\n          editSuccess: {\r\n            message: '该变量已成功更新',\r\n          },\r\n        },\r\n        success: {\r\n          upload: '上传成功',\r\n          downloads: '下载成功',\r\n          statusCodes: {\r\n            s_0: {\r\n              message: '出现了意外的错误。请您重试加载此网页。',\r\n            },\r\n            s_1: {\r\n              message: '修改已经保存。',\r\n            },\r\n            s_930: {\r\n              message: \"资产 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_931: {\r\n              message: \"公司 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_932: {\r\n              message: \"生产线 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_933: {\r\n              message: \"车间 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_934: {\r\n              message: \"位置 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_935: {\r\n              message: \"文件 '%replaceValue' 已成功删除。\",\r\n            },\r\n            s_936: {\r\n              message: \"变量 '%replaceValue' 已成功删除。\",\r\n            },\r\n          },\r\n          message: {\r\n            duplication_deleted: '重复的地图已被删除!',\r\n            add_line_to_dashboard: '生产线已添加到主菜单中',\r\n          },\r\n        },\r\n        limit: {\r\n          tabs: {\r\n            list: '极限值',\r\n            type: '请您按型号选择',\r\n            alarms: '警报',\r\n            machine: '请您按机器 ID 选择',\r\n            variables: '变量',\r\n            listImport: '导入极限值',\r\n            listDownload: '下载极限值',\r\n          },\r\n          text: {\r\n            text: '极限值是您要为您感兴趣的变量设定的值。如果一个变量不在定义的极限值内，您将收到通知。极限值还显示在“时间顺序”选项卡中生成的图表中。',\r\n            title: '极限值',\r\n          },\r\n          export: {\r\n            text: '您可以随时导出 Cloud Platform 中用于所有变量的当前所设置的极限值。您可以使用此列表作为参考，或使用它在“将极限值作为 CSV 导入”段落中一次性导入所有极限值',\r\n            title: '将极限值导出为 CSV',\r\n          },\r\n          import: {\r\n            text: '您可以导入之前下载的包含极限值和订户信息的 CSV 文件来更新当前保存的值。您可以以后再选择要将导入的极限值应用到哪些型号的设备或机器上',\r\n            title: '从 CSV 中导入极限值',\r\n            machines: {\r\n              title: '请您选择要应用极限值的机器或机器型号。',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: '选择您要导入的 CSV 文件',\r\n            },\r\n          },\r\n        },\r\n        manual: {\r\n          line: {\r\n            one: '请您转到资产管理中的所需生产线。',\r\n            two: '在标题行中，您会找到一个上下文菜单。',\r\n            four: '该生产线的图案将被添加到主菜单中。',\r\n            three: '请您单击上下文菜单，并选择“添加到主菜单”。',\r\n            header: '添加生产线图案',\r\n          },\r\n          individual: {\r\n            one: '请您单击左侧的“齿轮”符号。',\r\n            two: '请您选择“加号”符号。',\r\n            four: '请您用“保存”确认。单个图案添加到主菜单中。',\r\n            three: '请您命名您的图案，并将其添加到您想要的机器中。',\r\n            header: '添加个性化图案',\r\n          },\r\n        },\r\n        users: {\r\n          fab_title: '创建新用户',\r\n          new: {\r\n            title: '创建用户',\r\n            status: '用户状态:',\r\n            buttons: {\r\n              add: '添加',\r\n              back: '返回列表',\r\n              save: '保存',\r\n              cancel: '中断',\r\n              delete: '删除用户',\r\n              sendMail: '重新发送电子邮件',\r\n            },\r\n            fields: {\r\n              email: '电子邮件',\r\n              roles: '用户组',\r\n              gender: '性别',\r\n              created: '创建',\r\n              lastName: '姓',\r\n              firstName: '名',\r\n              breadcrumb: '显示导航',\r\n              main_group: '用户组',\r\n              phoneNumber: '电话号 [选项]',\r\n              customer_org: '客户组织',\r\n              last_modified: '最后编辑',\r\n              email_validation: '电邮 (验证)',\r\n            },\r\n            statusText: {\r\n              unknown: '未知',\r\n              archived: '已归档',\r\n              confirmed: '已确认',\r\n              compromised: '已被损害',\r\n              unconfirmed: '未确认',\r\n              reset_required: '要求重置',\r\n              external_provider: '外部提供商',\r\n              force_change_password: '密码更改待处理',\r\n            },\r\n            error_messages: {\r\n              email_not_match: '电子邮件地址不一致。',\r\n              email_not_valid: '请输入有效的电子邮件地址。',\r\n              phone_not_specified: '请您输入有效的电话号码，以 + 开头，后跟国家代码!',\r\n              roles_not_specified: '请您选择一个用户组。',\r\n              gender_not_specified: '请您输入性别。',\r\n              last_name_not_specified: '请输入姓。',\r\n              first_name_not_specified: '请输入名。',\r\n              main_group_not_specified: '请选择一个用户组。',\r\n              family_name_not_specified: '请输入姓。',\r\n              customer_organization_not_specified: '请选择一个客户组织。',\r\n            },\r\n          },\r\n          failed: {\r\n            title: '失败了!',\r\n          },\r\n          mail: {\r\n            success: '具有自动生成密码的电子邮件被发送到给出的电子邮件地址。',\r\n          },\r\n          update: {\r\n            title: '更新用户',\r\n          },\r\n          success: {\r\n            title: '成功！',\r\n            button: '返回列表',\r\n            message: '该用户已成功创建。系统将自动生成密码并发电子邮件至您所提供的邮箱地址。',\r\n            message_for_edit: '该用户已成功更新。',\r\n            message_send_mail: '具有自动生成密码的电子邮件被发送到给出的电子邮件地址。',\r\n            button_back_to_last_page: '返回到上一页',\r\n          },\r\n          delete: {\r\n            success: '用户已成功删除。',\r\n            confirmation: {\r\n              title: '您真的要删除该用户吗?',\r\n              confirm: '是，删除该用户',\r\n              dismiss: '否，中断',\r\n            },\r\n          },\r\n          groups: {\r\n            visitor: '访问者',\r\n            customer: '客户',\r\n          },\r\n          list: {\r\n            grid: {\r\n              user: '用户',\r\n              email: '电邮',\r\n              company: '公司',\r\n              enabled: '状态',\r\n              lastName: '姓',\r\n              sw_admin: 'SW 管理员',\r\n              firstName: '名',\r\n              userRights: '权限状态',\r\n              phoneNumber: '电话',\r\n            },\r\n          },\r\n          fields: {\r\n            gender: {\r\n              male: '男性',\r\n              female: '女性',\r\n              diverse: '各种各样的',\r\n            },\r\n          },\r\n        },\r\n        alarms: {\r\n          tabs: {\r\n            list: '警报',\r\n            type: '请您按型号选择',\r\n            machine: '请您按机器 ID 选择',\r\n            listImport: '导入警报',\r\n            listDownload: '下载报警文件',\r\n          },\r\n          text: {\r\n            text: '可以为您感兴趣的警报报告设置警报号。如果设置在定义的机器上的警报发生，您将收到报告。',\r\n            title: '警报报告',\r\n          },\r\n          export: {\r\n            text: '您可以随时导出 SW Cloud Platform 中所有机器当前设置的警报报告。您可以使用此列表作为参考，或使用它将所有警报报告在“警报作为 CSV 导入”段落中一次性导入所有警报报告。',\r\n            title: '将警报报告导出为 CSV',\r\n          },\r\n          import: {\r\n            text: '您可以导入之前下载的包含警报和订户信息的 CSV 文件来更新当前保存的值。您可以以后再选择要将导入的警报报告应用到哪些型号的设备或机器上。',\r\n            title: '从 CSV 中导入警报',\r\n            machines: {\r\n              title: '请您选择要应用这些警报报告的机器或机器型号。',\r\n            },\r\n          },\r\n          upload: {\r\n            fields: {\r\n              file: '选择您要导入的 CSV 文件',\r\n            },\r\n          },\r\n        },\r\n        search: {\r\n          noResults: '没有找到结果',\r\n          results: {\r\n            of: '由',\r\n            lines: '生产线',\r\n            machines: '机器',\r\n          },\r\n          callToAction: '搜索机器',\r\n        },\r\n        spistat: {\r\n          tileTitle: 'SpiStat',\r\n        },\r\n        tv: {\r\n          success: {\r\n            failed: '失败了',\r\n            queued: '正在排队等候',\r\n            removed: '已移除',\r\n            canceled: '已取消',\r\n            rejected: '已拒绝',\r\n            completed: '已全部完成',\r\n            succeeded: '成功',\r\n            timed_out: '超时',\r\n            in_progress: '进行中',\r\n            not_installed: '未安装',\r\n          },\r\n        },\r\n        settings: {\r\n          button: {\r\n            ok: 'OK',\r\n            import: '开始导入',\r\n            dismiss: '中断',\r\n            download: '开始下载',\r\n          },\r\n          tabs: {\r\n            limits: '限制',\r\n          },\r\n          variables: {\r\n            grid: {\r\n              name: '名称',\r\n              datatype: '数据类型',\r\n              chartType: '图表类型',\r\n              displayName: '显示名称',\r\n            },\r\n          },\r\n        },\r\n        worldmap: {\r\n          tileTitle: '世界地图',\r\n        },\r\n        shopfloor: {\r\n          tileTitle: '生产车间',\r\n          upload: {\r\n            text1: '将生产车间布局图像发送至 lifedata@sw-machines.com (JPG, PNG, PDF)。',\r\n            text2: '如果您的机器已在 SW CloudPlatform 中注册和登记，它们将显示在左侧并发送实时数据。',\r\n            text3: '然后只需将您的设计状态拖拽到正确的机器上即可。',\r\n            mainText: '在此视图中，您可以设置专属的生产车间布局，并通过不同的信息层查看您的机器。只需按照以下步骤操作即可。',\r\n            tileTitle: '上传生产车间',\r\n          },\r\n        },\r\n        asset: {\r\n          delete: {\r\n            success: '资产已成功删除。',\r\n            confirmation: {\r\n              title: \"您确定要删除 '%replaceValue’吗?\",\r\n              confirm: '删除',\r\n              dismiss: '取消',\r\n              company: {\r\n                text: '如果您删除公司，则所有其所属的用户也将一起被删除。',\r\n              },\r\n            },\r\n          },\r\n          new: {\r\n            buttons: {\r\n              delete: '删除资产',\r\n            },\r\n          },\r\n          changes: {\r\n            confirmation: {\r\n              title: '对 NamePrefix 或 DataType 的更改可能会损坏机器。您确定要保存吗?',\r\n            },\r\n          },\r\n          updateLimits: {\r\n            confirmation: {\r\n              intro: '您想接受这种新机器型号的极限值吗?',\r\n              title: '您已更改了机器型号',\r\n              accept: '是，接受新的极限值',\r\n              decline: '否，保持当前的极限值',\r\n              dismiss: '取消',\r\n              info_accept: '要使用新机器型号的极限值覆盖写当前的极限值，请选择“是”。',\r\n              info_decline: '要保留当前的极限值，请选择“否”。',\r\n              info_accept_warning: '所有当前的极限值均被覆盖写或删除。',\r\n            },\r\n          },\r\n        },\r\n        file: {\r\n          new: {\r\n            buttons: {\r\n              delete: '删除文件',\r\n            },\r\n          },\r\n        },\r\n        hall: {\r\n          new: {\r\n            buttons: {\r\n              delete: '删除车间',\r\n            },\r\n          },\r\n        },\r\n        line: {\r\n          new: {\r\n            buttons: {\r\n              delete: '删除生产线',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatus: {\r\n          tileTitle: '状态',\r\n        },\r\n        timeFilter: {\r\n          machine_time: '机器时间',\r\n          controller_time: '控制器时间',\r\n          iot_gateway_time: '物联网网关时间',\r\n        },\r\n        charts: {\r\n          tooltipDateFormat: 'YYYY-MM-DD HH:mm:ss',\r\n          exporting: {\r\n            datetimeformat: 'YYYY-MM-DD HH:mm:ss',\r\n          },\r\n          globalSettings: {\r\n            lang: {\r\n              noData: '无数据',\r\n              loading: '正在加载数据...',\r\n              months: [\r\n                '1月',\r\n                '2月',\r\n                '3月',\r\n                '4月',\r\n                '5月',\r\n                '6月',\r\n                '7月',\r\n                '8月',\r\n                '9月',\r\n                '10月',\r\n                '11月',\r\n                '12月',\r\n              ],\r\n              resetZoom: '缩放复原',\r\n              weekdays: [\r\n                '周日',\r\n                '周一',\r\n                '周二',\r\n                '周三',\r\n                '周四',\r\n                '周五',\r\n                '周六',\r\n              ],\r\n              shortMonths: [\r\n                '1月',\r\n                '2月',\r\n                '3月',\r\n                '4月',\r\n                '5月',\r\n                '6月',\r\n                '7月',\r\n                '8月',\r\n                '9月',\r\n                '10月',\r\n                '11月',\r\n                '12月',\r\n              ],\r\n              shortWeekdays: [\r\n                '周日',\r\n                '周一',\r\n                '周二',\r\n                '周三',\r\n                '周四',\r\n                '周五',\r\n                '周六',\r\n              ],\r\n              increaseDateRange: '至少至',\r\n            },\r\n          },\r\n        },\r\n        datepicker: {\r\n          presets: {\r\n            title: '预设',\r\n            rangeTo: '至',\r\n            selectDateRange: '请选择时间段',\r\n            predefined: {\r\n              today: '今天',\r\n              custom: '自定义范围',\r\n              last7days: '前7 天',\r\n              yesterday: '昨天',\r\n              last24Hours: '前24 小时',\r\n              last5Minutes: '前 5 分钟',\r\n            },\r\n          },\r\n        },\r\n        variable: {\r\n          edit_form_title: '编辑变量',\r\n          new: {\r\n            buttons: {\r\n              delete: '删除变量',\r\n            },\r\n          },\r\n        },\r\n        i18n: {\r\n          chooseLanguagePhrase: '语言选择',\r\n        },\r\n        company: {\r\n          new: {\r\n            buttons: {\r\n              delete: '删除公司',\r\n            },\r\n          },\r\n        },\r\n        location: {\r\n          new: {\r\n            buttons: {\r\n              delete: '删除位置',\r\n            },\r\n          },\r\n        },\r\n        runtimeStatusList: {\r\n          tileTitle: '状态',\r\n        },\r\n        dashboard: {\r\n          configure: {\r\n            fab_title: '配置主菜单',\r\n            hide: {\r\n              title: '隐藏',\r\n            },\r\n            show: {\r\n              title: '显示',\r\n            },\r\n            delete: {\r\n              title: '删除',\r\n            },\r\n            add: {\r\n              fab_title: '添加自己的图块',\r\n            },\r\n            save: {\r\n              fab_title: '保存配置',\r\n            },\r\n            move_left: {\r\n              title: '移到上一个位置',\r\n            },\r\n            move_right: {\r\n              title: '移到下一个位置',\r\n            },\r\n            discard: {\r\n              fab_title: '放弃配置',\r\n            },\r\n            add_custom_card: {\r\n              save: '保存',\r\n              input: '给出图块名',\r\n              title: '添加自己的图块',\r\n              cancel: '中断',\r\n              missingMachine: '您必须至少选择一台机器',\r\n            },\r\n          },\r\n        },\r\n        errors: {\r\n          statusCodes: {\r\n            e_0: {\r\n              message: '出现了意外的错误。请您重试加载此网页。',\r\n            },\r\n            e_1xx: {\r\n              message: '信息错误',\r\n            },\r\n            e_2xx: {\r\n              message: '成功',\r\n            },\r\n            e_3xx: {\r\n              message: '转发',\r\n            },\r\n            e_400: {\r\n              message: '请求有错误，无法处理。',\r\n            },\r\n            e_401: {\r\n              message: '您未通过身份验证。请您重新登录。',\r\n            },\r\n            e_403: {\r\n              message: '您没有有效的权限来访问要求的资源。',\r\n            },\r\n            e_404: {\r\n              message: '要求的资源不存在。',\r\n            },\r\n            e_405: {\r\n              message: '方法不允许。',\r\n            },\r\n            e_406: {\r\n              message: '方法不可接受',\r\n            },\r\n            e_409: {\r\n              message: '您正在添加的资源已存在。',\r\n            },\r\n            e_418: {\r\n              message: \"I'm a Teapot! Yaay!\",\r\n            },\r\n            e_422: {\r\n              message: '方法无法处理的内容',\r\n            },\r\n            e_4xx: {\r\n              message: '客户端错误',\r\n            },\r\n            e_500: {\r\n              message: '内部服务器错误。',\r\n            },\r\n            e_5xx: {\r\n              message: '服务器错误',\r\n            },\r\n            e_900: {\r\n              message: '创建资产的尝试失败了。请稍后再试。',\r\n            },\r\n            e_901: {\r\n              message: '该操作被取消了。没有创建新资产。',\r\n            },\r\n            e_902: {\r\n              message: '该操作被取消了。没有发送任何服务请求。',\r\n            },\r\n            e_903: {\r\n              message: '尝试发送服务请求时出错了。请稍后再试。',\r\n            },\r\n            e_904: {\r\n              message: \"资产'%replaceValue'已经成功创建。您现在可以继续添加资产。\",\r\n            },\r\n            e_905: {\r\n              message: '该操作被取消了。该资产还没有更新。',\r\n            },\r\n            e_906: {\r\n              message: \"资产 '%replaceValue' 已经成功创建。\",\r\n            },\r\n            e_910: {\r\n              message: '创建用户的尝试失败了。请稍后再试。',\r\n            },\r\n            e_911: {\r\n              message: '您取消了当前操作。没有创建新用户。',\r\n            },\r\n            e_912: {\r\n              message: '更新一个资产的尝试失败了。请重新尝试。',\r\n            },\r\n            e_920: {\r\n              message: '该操作被取消了。还没有保存修改。',\r\n            },\r\n            e_921: {\r\n              message: '出现了意外的错误。请再试一次。',\r\n            },\r\n            e_922: {\r\n              message: '用户名和/或密码不正确。请再试一次。',\r\n            },\r\n            e_923: {\r\n              message: '请输入用户名和密码。',\r\n            },\r\n            e_924: {\r\n              message: '由于不活动，您的访问已过期。请您重新登录。',\r\n            },\r\n            e_925: {\r\n              message: '为了能够使用 SW 云平台，您必须接受我们的隐私声明。',\r\n            },\r\n            e_926: {\r\n              message: '您的帐户已被暂停。请在几分钟后再试。',\r\n            },\r\n            e_927: {\r\n              message: '您的密码已成功更改。',\r\n            },\r\n            e_928: {\r\n              message: '该操作被取消了。没有上传文件。',\r\n            },\r\n            e_929: {\r\n              message: '尝试上传文件失败了。请稍后再试。',\r\n            },\r\n            e_930: {\r\n              message: '尝试删除文件时出现问题。请稍后再试。',\r\n            },\r\n            e_931: {\r\n              message: '自定义日期范围太大。默认设置为 24 小时',\r\n            },\r\n            e_932: {\r\n              message: '该资产具有子元素。请您首先删除子元素。',\r\n            },\r\n            e_933: {\r\n              message: \"变量 '%replaceValue' 已成功创建。您现在可以添加另一个变量。\",\r\n            },\r\n            e_934: {\r\n              message: '尝试删除变量时出现错误。请稍后重试。',\r\n            },\r\n            e_10500: {\r\n              message: '好像您没有连接到互联网。请确保您已连接。',\r\n            },\r\n            e_10501: {\r\n              message: '您使用的是不支持的浏览器。请使用以下浏览器之一：Google Chrome、Microsoft Edge、Apple Safari。',\r\n            },\r\n            e_409_asset: {\r\n              message: '资产 (SW 机器号 %replaceValue) 已存在。',\r\n            },\r\n            e_410_asset: {\r\n              message: '该文件名 %replaceValue 已存在',\r\n            },\r\n          },\r\n        },\r\n        list: {\r\n          sweetalert: {\r\n            maxAmountReached: {\r\n              html: '只能同时选择 %s 个元素',\r\n              title: '达到了最大数量',\r\n            },\r\n          },\r\n        },\r\n        qualityAnalysis: {\r\n          reporting: {\r\n            timeFilter: {\r\n              headline: '时间筛选器',\r\n            },\r\n          },\r\n        },\r\n      },\r\n      module: {\r\n        assets: {\r\n          machine: {\r\n            all: {\r\n              no_files_text: '没有可用的文件。',\r\n              file_cardTitle: '机器事件',\r\n              modules: {\r\n                assets: {\r\n                  download: '下载数据',\r\n                },\r\n              },\r\n            },\r\n            trace: {\r\n              file_cardTitle: 'NC 跟踪文件',\r\n            },\r\n            alarms: {\r\n              no_alarms_text: '没有可用的警报',\r\n            },\r\n            nc_comp: {\r\n              file_cardTitle: 'NC 比较文件',\r\n            },\r\n            nc_data: {\r\n              file_cardTitle: 'NC 数据文件',\r\n            },\r\n            tool_mon: {\r\n              no_files_text: '没有可用的文件。',\r\n              file_cardTitle: 'ToolMon 文件',\r\n              modules: {\r\n                assets: {\r\n                  nc_comparison_download: '下载 ToolMon 数据',\r\n                },\r\n              },\r\n            },\r\n            file: {\r\n              column_title_trigger: '触发器',\r\n              column_title_filename: '文件名',\r\n              column_title_creation_date: '创建日期',\r\n            },\r\n            flight_recorder: {\r\n              file_cardTitle: 'HMI飞行记录器文件',\r\n            },\r\n          },\r\n        },\r\n      },\r\n    },\r\n  },\r\n};","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css } from 'lit-element';\n\nexport const LdChartStyles = css`\n  :host {\n    display: block;\n    position: relative;\n  }\n  \n  .chart-wrapper {\n    position: relative;\n    width: 100%;\n    text-align: center;\n  }\n  \n  #chart-container {\n    width: 100%;\n    overflow: hidden;\n    z-index: 9;\n  }\n\n  #chart-container .hidden {\n    display: none;\n  }\n  \n  ld-loading-spinner-inline {\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 10;\n  }\n`;\n\nexport default LdChartStyles;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListCommunication = [\n  'chat',\n  'comment',\n  'email',\n  'message',\n  'phone',\n  'sms'\n];\n\nexport const LdIconsCommunication = html`\n  <iron-iconset-svg id=\"ld-com\" name=\"ld-com\" size=\"32\">\n    <svg>\n      <defs>\n      <g id=\"chat\"><path d=\"M.5 21.37V.5h23v15l-17-.09zm11.15-4.22v6.35h13l5 5v-17h-4.38\"/></g>\n      <g id=\"comment\"><path stroke-linejoin=\"round\" d=\"M15 28.5l-5.14-7H.5V.5h29v21h-9.36l-5.14 7zm-9.35-22h18.7m-18.7 4h13.09m-13.09 4h7.48\"/></g>\n      <g id=\"email\"><path stroke-linejoin=\"round\" d=\"M.5 6v15.5h29V6\"/><path stroke-linejoin=\"round\" d=\"M29.5 2.63L15 13.5.5 2.63V.5h29v2.13z\"/></g>\n      <g id=\"message\"><path stroke-linejoin=\"round\" d=\"M.5 27.17V.5h25v21.67\"/><path d=\"M2.5 28.08a2.5 2.5 0 1 0 5 0v-2.5h23v2.5a2.5 2.5 0 0 1-2.5 2.5H5\" transform=\"translate(-2 -.92)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M5 5.67h14m-14 5h16m-16 5h14\"/></g>\n      <g id=\"phone\"><path stroke-linejoin=\"round\" d=\"M1.62 14.44l-.18.09m14.12 13.85l-.09.18\"/><path d=\"M23.48 30.5a21.73 21.73 0 0 1-6.92-1.12A22 22 0 0 1 2.62 15.44a21.94 21.94 0 0 1 0-13.94H8l3.74 9.35L6 13.75A18.34 18.34 0 0 0 18.25 26l2.89-5.78L30.5 24v5.4a21.76 21.76 0 0 1-7.02 1.1z\" transform=\"translate(-1 -1)\" stroke-linejoin=\"round\"/></g>\n      <g id=\"sms\"><path stroke-linejoin=\"round\" d=\"M20.5 18v11.5H.5V.5h20V3\"/><path stroke-linejoin=\"round\" d=\"M12.5 4.5h17v11h-12l-5 5v-16zm-3 21h3v2h-3zm-8.5-2h20\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListDocument = [\n  'chart',\n  'document',\n  'document-code',\n  'document-csv',\n  'document-pdf',\n  'document-ppt',\n  'document-word',\n  'document-xls',\n  'document-xml',\n  'document-zip',\n  'image',\n  'note',\n  'table',\n  'website'\n];\n\nexport const LdIconsDocument = html`\n  <iron-iconset-svg id=\"ld-doc\" name=\"ld-doc\" size=\"16\">\n    <svg>\n      <defs>\n        <g id=\"chart\"><g><path stroke-linejoin=\"round\" d=\"M1.5 5.5h3v7h-3zm5 2h3v5h-3zm5-6h3v11h-3zM0 14.5h16\"/></g></g>\n        <g id=\"document\"><g><path stroke-linejoin=\"round\" d=\"M2.5.5v15h11v-12l-3-3h-8z\"/><path stroke-linejoin=\"round\" d=\"M9.5.5v4h4\"/></g></g>\n        <g id=\"document-code\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(1 13)\" font-size=\"9\" font-weight=\"700\" letter-spacing=\"0em\">&lt;/&gt;</text></g></g>\n        <g id=\"document-csv\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\".07em\">CSV</text></g></g>\n        <g id=\"document-pdf\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13.23)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\".06em\">PD<tspan x=\"9.83\" y=\"0\" letter-spacing=\".04em\">F</tspan></text></g></g>\n        <g id=\"document-ppt\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\".06em\">PPT</text></g></g>\n        <g id=\"document-word\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\"0em\">DOC</text></g></g>\n        <g id=\"document-xls\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13.23)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\".06em\">X<tspan x=\"4.7\" y=\"0\" letter-spacing=\".07em\">L</tspan><tspan x=\"8.78\" y=\"0\">S</tspan></text></g></g>\n        <g id=\"document-xml\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\"0em\">XML</text></g></g>\n        <g id=\"document-zip\"><g><path stroke-linejoin=\"round\" d=\"M3.5 14v1.5h12v-12l-3-3h-9V7\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(-.32 13)\" font-size=\"7\" font-weight=\"700\" letter-spacing=\".06em\">ZIP</text></g></g>\n        <g id=\"image\"><g><path stroke-linejoin=\"round\" d=\"M.5 1.5h15v13H.5z\"/><path d=\"M2.5 11.5c1.56-4.95 2.67-5.68 4-3.77 1 1.45 1.89.23 2.67-2.24s3.33-.27 4.33 6z\" stroke-linejoin=\"round\"/></g></g>\n        <g id=\"note\"><g><path stroke-linejoin=\"round\" d=\"M15.5 1.5H.5v13h12l3-3v-10z\"/><path stroke-linejoin=\"round\" d=\"M11.5 14.5v-4h4M3 4.5h10m-10 3h7m-7 3h4\"/></g></g>\n        <g id=\"table\"><path d=\"M.5 1.5h15v13H.5zm0 4h14.8M5 14.8v-9M.6 10.3h14.9\"/></g>\n        <g id=\"website\"><g><path stroke-linejoin=\"round\" d=\"M.5 1.5h15v13H.5zm0 3h15m-12 0v-3\"/></g></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListFeature = [\n  'administration',\n  'alerts',\n  'analysis',\n  'analytics',\n  'asset',\n  'asset-ingestion',\n  'attribute',\n  'bug',\n  'calendar',\n  'cases',\n  'catalog',\n  'dashboard',\n  'data-sources',\n  'deployments',\n  'dev-ops',\n  'digital-twin',\n  'home',\n  'key',\n  'log',\n  'microservice',\n  'orchestration',\n  'orders',\n  'pipeline',\n  'products',\n  'spaces',\n  'tag',\n  'tag-group',\n  'templates',\n  'time',\n  'users',\n  'versions'\n];\n\nexport const LdIconsFeature = html`\n  <iron-iconset-svg id=\"ld-feat\" name=\"ld-feat\" size=\"32\">\n    <svg>\n      <defs>\n        <g id=\"administration\"><path d=\"M21.65 25.48l3 2.36 1.57-1.57 1.58-1.58-2.36-3a11.21 11.21 0 0 0 1.26-2.99l3.8-.47v-4.46l-3.8-.47a11.21 11.21 0 0 0-1.23-2.95l2.36-3-1.57-1.59-1.58-1.58-3 2.36A11.21 11.21 0 0 0 18.7 5.3l-.47-3.8h-4.47l-.46 3.8a11.21 11.21 0 0 0-2.95 1.23l-3-2.36-1.59 1.57-1.58 1.58 2.36 3A11.21 11.21 0 0 0 5.3 13.3l-3.8.47v4.46l3.8.47a11.21 11.21 0 0 0 1.23 2.95l-2.36 3 1.57 1.57 1.58 1.58 3-2.36\" transform=\"translate(-1 -1)\" stroke-linejoin=\"round\"/><path d=\"M22.08 16a6.1 6.1 0 0 0-3.74-5.61v6.08h-4.68v-6.08a6.07 6.07 0 0 0-.94 10.73v9.38h6.55v-9.39A6.08 6.08 0 0 0 22.08 16z\" transform=\"translate(-1 -1)\" stroke-linejoin=\"round\"/></g>\n        <g id=\"alerts\"><path d=\"M14.27.69a1.5 1.5 0 0 1 2 .58l13 22.94A1.53 1.53 0 0 1 28 26.5H2a1.53 1.53 0 0 1-1.3-2.29l13-22.94a1.5 1.5 0 0 1 .57-.58zM15 17.5h1.56l.78-7.07h-4.68l.78 7.07zm-1.4 5.34h2.81v-3.42H13.6z\"/></g>\n        <g id=\"analysis\"><path stroke-linejoin=\"round\" d=\"M.5 0v27.49h27.43\"/><path stroke-linejoin=\"round\" d=\"M3.5 18.36l7-6.99 7 3 8-8\"/><path stroke-linejoin=\"round\" d=\"M25.5 11.6l-8 8-7-3-7 7h22v-12z\"/></g>\n        <g id=\"analytics\"><path stroke-linejoin=\"round\" d=\"M1.49 22.21h4v5.07h-4zm14-2.96h4v8.02h-4zm-7-4h4v12.03h-4zm14-6h4v18.03h-4z\"/><path d=\"M27.5 1.5c-4 7-7.79 12.22-14.67 8.75S3.5 14.5 2.5 19.5\" transform=\"translate(-2.01 -1.25)\" stroke-linejoin=\"round\"/></g>\n        <g id=\"asset\"><g><path d=\"M28.687 23.375v-14.5l-12.5-7.25-12.5 7.25v14.5l13 7.25 12-7.25z\"/><path d=\"M3.687 9.345l13 7.25 12-7.25m-12 21.18v-14\"/><path d=\"M9.857 9.115l6.33-3.68 6.3 3.66-6.36 3.65-6.27-3.63z\"/></g></g>\n        <g id=\"asset-ingestion\"><path d=\"M22.5 19.41v-8.34l-7-4.17-7 4.17v8.34l7 4.18 7-4.18z\"/><path d=\"M8.5 11.34l7 4.17 7-4.17m-7 3.66v8.59\"/><path d=\"M15.5 16v-.54l7-4.12v-.27l-7-4.17-7 4.17v.27l7 4.17 7-4.17\"/><circle cx=\"3\" cy=\"3\" r=\"2.5\"/><path d=\"M8.5 8.5L4.77 4.77\"/><circle cx=\"28\" cy=\"3\" r=\"2.5\"/><path d=\"M22.5 8.5l3.73-3.73\"/><circle cx=\"28\" cy=\"28\" r=\"2.5\"/><path d=\"M22.5 22.5l3.73 3.73\"/><circle cx=\"3\" cy=\"28\" r=\"2.5\"/><path d=\"M8.5 22.5l-3.73 3.73\"/></g>\n        <g id=\"attribute\"><g><path d=\"M28.062 30.813H4.5V9.135l11.941-7.54 11.621 7.54v21.678zM8.312 23.5h16m-14 3h12\"/><circle r=\"1.5\" cy=\"6.5\" cx=\"16.312\"/><text fill=\"currentcolor\" stroke=\"none\"  x=\"6\" y=\"19.97\" font-size=\"12\">123</text></g></g>\n        <g id=\"bug\"><path stroke-linejoin=\"round\" d=\"M6.17 17.85H0\"/><path d=\"M10.89 8.94a5.61 5.61 0 0 1 11.23 0M17 30c4.21 0 8-2.5 8-8.5a25.08 25.08 0 0 0-2.81-11h-11.3a25.08 25.08 0 0 0-2.81 11c0 6 3.74 8.5 8 8.5z\" transform=\"translate(-2 -1.65)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M10.76 3.08L8.89.28m9.36 2.8l1.87-2.8\"/><path d=\"M3.87 29.06a6.44 6.44 0 0 1 4.73-4.12m-4.73-14.2A6.13 6.13 0 0 0 9.06 15\" transform=\"translate(-2 -1.65)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M29 17.85h-6.16\"/><path d=\"M24.41 24.94a6.46 6.46 0 0 1 4.72 4.13M24 15a6.14 6.14 0 0 0 5.17-4.27\" transform=\"translate(-2 -1.65)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M14.5 12.42v15.93\"/></g>\n        <g id=\"calendar\"><path stroke-linejoin=\"round\" d=\"M.5 2.5h29v27H.5zm.48 7h28.04M.5 14.5h29m-29 5h29m-29 5h29m-11.6-15v20m5.8-20v20m-11.6-20v20m-5.8-20v20\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5.55.5v4m18.9-4v4\"/></g>\n        <g id=\"cases\"><path stroke-linejoin=\"round\" d=\"M.5 14.06v11.08h29V14.06\"/><path d=\"M18.34 18.71a30 30 0 0 0 12.16-3.65V7.58h-29v7.48a30.15 30.15 0 0 0 12.16 3.64\" transform=\"translate(-1 -3.34)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M12.66 13.6h4.68v3.74h-4.68zM8.92 4.24L11.73.5h6.54l2.69 3.74\"/></g>\n        <g id=\"catalog\"><path d=\"M15.16 24.85V7.19a3.78 3.78 0 0 0-3.73-3.83H1.16v23h11.06a3 3 0 0 1 2.94 2.94v.56\" stroke-miterlimit=\"10\"/><path d=\"M15.16 24.85V7.19a3.92 3.92 0 0 1 4-3.83h11v23H18.09a2.93 2.93 0 0 0-2.93 2.93v.57m-10-21.51h5v5h-5zm0 8h5v5h-5z\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M20.16 8.35h5v5h-5zm0 8h5v5h-5z\"/></g>\n        <g id=\"dashboard\"><path d=\"M25.71 28.5H6.29a1 1 0 0 1-.73-.31 14.5 14.5 0 1 1 20.88 0 1 1 0 0 1-.73.31z\" stroke-miterlimit=\"10\"/><path d=\"M5.5 18A10.55 10.55 0 0 1 16 7.43a10.4 10.4 0 0 1 6.73 2.46\" stroke-miterlimit=\"10\"/><circle cx=\"15\" cy=\"18\" r=\"2.5\" stroke-miterlimit=\"10\" transform=\"translate(1 3)\"/><path stroke-miterlimit=\"10\" transform=\"translate(1 3)\" d=\"M24.5 7.5l-7.86 8.61\"/></g>\n        <g id=\"data-sources\"><g><rect ry=\"1\" rx=\"1\" height=\"6\" width=\"22\" y=\"24.265\" x=\"5.187\"/><path d=\"M18.687 7.265h7.5a1 1 0 0 1 1 1v17m-22 0v-17a1 1 0 0 1 1-1h7.5\"/><circle r=\"1\" cy=\"27.265\" cx=\"9.187\"/><path d=\"M12.687 27.265h12m-8.5-12.14v-13.5m-4 3.5l4-4 4 4\"/></g></g>\n        <g id=\"deployments\"><path stroke-linejoin=\"round\" d=\"M9.95 15.11L7 12.16 3.61 14.2.5 11.08l2.71-2.72L15.2 6.63\"/><path d=\"M11.8 17l5 5a133 133 0 0 0 10.89-9.49 9 9 0 0 0 2-10.19 9 9 0 0 0-10.19 2A133 133 0 0 0 10 15.2l1.8 1.8\" transform=\"translate(-1 -1)\" stroke-linejoin=\"round\"/><circle cx=\"23.02\" cy=\"8.98\" r=\"2.81\" transform=\"rotate(-45 21.314 9.691)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M13.74 22.47l-6.21-6.21m15.37-1.38l-1.26 11.91-2.72 2.71-3.12-3.11L17.84 23l-1.99-1.99\"/><path d=\"M4.49 22.06a3.54 3.54 0 0 1 5 5c-1.79 1.8-6.44 1.44-6.44 1.44s-.35-4.65 1.44-6.44z\" transform=\"translate(-1 -1)\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"dev-ops\"><path stroke-linejoin=\"round\" d=\"M18.27 16.39V5.8L9.39.5.5 5.8v10.59l8.89 5.3 8.88-5.3zm-.5-13.64L21.55.5l7.95 4.74v9.48l-3.74 2.24\"/><path stroke-linejoin=\"round\" d=\"M20.14 12.36l3.75 2.24v9.47l-7.95 4.75-7.96-4.75\"/><path d=\"M12.67 18.79V15A4.24 4.24 0 0 0 12 7.56v4.24H8.76V7.56A4.24 4.24 0 0 0 8.1 15v3.74\" transform=\"translate(-1 -1.04)\" stroke-linejoin=\"round\"/></g>\n        <g id=\"digital-twin\"><path stroke-linejoin=\"round\" d=\"M12.61 8.46v-2.9l3.37-1.97m1.98-1.18L21.16.5l3.2 1.91m1.99 1.18l3.2 1.91v3.72m0 2.56v3.73l-3.2 1.9m-1.99 1.18l-3.2 1.91-1.4-.83m-2.26 4.32V13.85L9 8.79.5 13.85v10.14L9 29.05l8.5-5.06z\"/><circle cx=\"9\" cy=\"18.92\" r=\"2.81\" stroke-linejoin=\"round\"/></g>\n        <g id=\"home\"><path stroke-linejoin=\"round\" d=\"M5.5 16v14.5h21V16m-25-.79L16 2.1l14.5 13.11\"/><path stroke-linejoin=\"round\" d=\"M12.5 22.5h7v8h-7z\"/></g>\n        <g id=\"key\"><circle cx=\"7.6\" cy=\"7.6\" r=\"1.97\"/><path d=\"M17.57 13.39a8.84 8.84 0 1 0-4.18 4.18l.36.35 3.36 3.37v2.8h2.75l1.44 1.44v2.77h2.78l3 3h4.21v-4.21L17.92 13.75zm11.51 15.69L15.64 15.64\"/></g>\n        <g id=\"log\"><g><path d=\"M23.2 3.4h5.3v27h-25v-27h6.3\"/><path d=\"M11.4 1.5h10v4h-10zm1.6 11h10.3m-14.9 0h3v3h-3zm4.6 3h8.4m-8.4 5h10.3m-14.9 0h3v3h-3zm4.6 3h8.4\"/></g></g>\n        <g id=\"microservice\"><g><path stroke-linejoin=\"round\" d=\"M28.257 23.187v-14.5l-12.16-7.25-12.16 7.25v14.5l12.16 7.25 12.16-7.25z\"/><path stroke-linejoin=\"round\" d=\"M19.947 19.177l3.17-3.37-3.38-3.17m-7.38-.06l-3.28 3.28 3.28 3.27m1.87 2.81l3.74-12.16\"/></g></g>\n        <g id=\"orchestration\"><g><path d=\"M30.375 27.562h-29s0-14.28 6.21-22.43 3.11 18.35 9.29 15.29 13.5-18.36 13.5 7.14z\" stroke-linejoin=\"round\"/><path d=\"M1.375 27.562c6.21-11.22 12.43-22.43 15.5-16.32s3.11 11.22 7.25 8.16 6.25 3.06 6.25 8.16\" stroke-linejoin=\"round\"/></g></g>\n        <g id=\"orders\"><g><path stroke-miterlimit=\"10\" d=\"M29.062 7.125v23.75H5.312V1.425h18.05l5.7 5.7z\"/><path stroke-miterlimit=\"10\" d=\"M23.437 1.25v5.625h5.625m-20.5 14.688h13m-13-4h16m-16 8h16\"/><text fill=\"currentcolor\" stroke=\"none\"  x=\"9.282\" y=\"12.873\" font-weight=\"700\" font-size=\"12\">$</text></g></g>\n        <g id=\"pipeline\"><rect x=\".5\" y=\".5\" width=\"6\" height=\"6\" rx=\"3\" ry=\"3\" stroke-miterlimit=\"10\"/><rect x=\"21.5\" y=\".5\" width=\"6\" height=\"6\" rx=\"3\" ry=\"3\" stroke-miterlimit=\"10\"/><rect x=\".5\" y=\"19.5\" width=\"6\" height=\"6\" rx=\"3\" ry=\"3\" stroke-miterlimit=\"10\"/><rect x=\"21.5\" y=\"19.5\" width=\"6\" height=\"6\" rx=\"3\" ry=\"3\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M19 3.5H6.5m12.5 19H6.5m1-4l15-13\"/></g>\n        <g id=\"products\"><rect x=\".5\" y=\".5\" width=\"29.11\" height=\"21\" rx=\"2\" ry=\"2\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M19.44 23.5l3.17 5h-15l3.17-5m8.27-10.05l-3.19-3.18 2.67-1.97-8.84-2.47 2.48 8.84L14.13 12l3.18 3.19 1.74-1.74z\"/></g>\n        <g id=\"spaces\"><circle cx=\"8.5\" cy=\"8.5\" r=\"5\" stroke-miterlimit=\"10\"/><circle cx=\"8.5\" cy=\"23.5\" r=\"5\" stroke-miterlimit=\"10\"/><circle cx=\"23.5\" cy=\"23.5\" r=\"5\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M23.5 3v11M29 8.5H18\"/></g>\n        <g id=\"tag\"><path d=\"M12.78 27.69L.5 15.41 15.38.5h12.31v12.31zM21.99 4a2.19 2.19 0 0 0-2.19 2.19 2.19 2.19 0 0 0 2.19 2.19 2.19 2.19 0 0 0 2.19-2.19A2.19 2.19 0 0 0 21.99 4z\" stroke-linejoin=\"round\"/></g>\n        <g id=\"tag-group\"><path stroke-linejoin=\"round\" d=\"M26.23 4.52h3.27V14.8L16.68 27.63l-3.03-3.02\"/><path stroke-linejoin=\"round\" d=\"M11.06 23.89L.5 13.32 13.32.5h11.09v10.56L11.06 23.89z\"/><path d=\"M18.15 7A1.87 1.87 0 0 1 20 5.13 1.79 1.79 0 0 1 21.89 7 1.87 1.87 0 0 1 20 8.87 1.87 1.87 0 0 1 18.15 7z\" transform=\"translate(-1 -1.94)\" stroke-linejoin=\"round\"/></g>\n        <g id=\"templates\"><path stroke-linejoin=\"round\" d=\"M25.5 26v2.5H.5v-23h3.19\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5.5.5h24v23h-24zm0 5h24\"/><path stroke-linejoin=\"round\" d=\"M17 12.5h7m-7-3h9\"/><circle cx=\"11.5\" cy=\"11\" r=\"2\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M17 19.5h7m-7-3h9\"/><circle cx=\"11.5\" cy=\"18\" r=\"2\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M1 9.5h2.69\"/></g>\n        <g id=\"time\"><g><circle stroke-linejoin=\"round\" r=\"14.5\" cy=\"16.063\" cx=\"16.063\"/><path stroke-linejoin=\"round\" d=\"M15.092 8.332v9.66l6.83-3.92\"/></g></g>\n        <g id=\"users\"><path stroke-linejoin=\"round\" d=\"M14.4 14l4.1 4v5.5H.5V18l4.1-4\"/><rect x=\"5\" y=\"3.5\" width=\"9\" height=\"11\" rx=\"4.5\" ry=\"4.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M25.43 11l4.13 4v5.5H20.5\"/><rect x=\"16\" y=\".5\" width=\"9\" height=\"11\" rx=\"4.5\" ry=\"4.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"versions\"><path stroke-linejoin=\"round\" d=\"M15 24.5H.5V.5h27V13\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M.5 5.5h27\"/><circle cx=\"3\" cy=\"3\" r=\".5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><circle cx=\"6\" cy=\"3\" r=\".5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><circle cx=\"9\" cy=\"3\" r=\".5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M29.5 24.03V17.1l-6-3.46-6 3.46v6.93l6 3.47 6-3.47z\"/><path stroke-linejoin=\"round\" d=\"M23.5 24.22v-5.5H22\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListNavigation = [\n  'add-column-left',\n  'add-column-right',\n  'add-row-above',\n  'add-row-below',\n  'back',\n  'close',\n  'collapse',\n  'compare',\n  'confirmed',\n  'connection',\n  'data-resolution',\n  'database',\n  'delete-column',\n  'delete-row',\n  'down',\n  'expand',\n  'favorite',\n  'generic-user',\n  'grid-view',\n  'hamburger',\n  'hierarchy',\n  'home',\n  'inbox-view',\n  'instance',\n  'list-view',\n  'log-out',\n  'menu',\n  'more',\n  'new-window',\n  'next',\n  'notification',\n  'open-context',\n  'pause',\n  'play',\n  'product-switcher',\n  'reload',\n  'search',\n  'stop',\n  'summary',\n  'tile-view',\n  'timezone',\n  'tree',\n  'unconfirmed',\n  'up'\n];\n\nexport const LdIconsNavigation = html`\n  <iron-iconset-svg id=\"ld-nav\" name=\"ld-nav\" size=\"22\">\n    <svg>\n      <defs>\n        <g id=\"add-column-left\"><desc>Created with Sketch.</desc><path d=\"M4.4 7.1V2.3M2.8 3.8l1.7-1.7 1.7 1.7m6.3-2v16m4-16v16m-15-8.6h6v11h-6zm19-7.4v15.5H9.9\"/></g>\n        <g id=\"add-column-right\"><desc>Created with Sketch.</desc><path d=\"M17.6 2.3v4.8m1.6-3.3l-1.7-1.7-1.7 1.7m-6.3-2v16m-4-16v16m9-8.6h6v11h-6zm-13-7.4v15.5h10.6\"/></g>\n        <g id=\"add-row-above\"><desc>Created with Sketch.</desc><path d=\"M2.6 4.5h4.8M4.1 2.8L2.3 4.6l1.8 1.6M2 12.3h16m-16 4h16M9.5 1.5h11v6h-11zM2 20.3h15.5V9.7\"/></g>\n        <g id=\"add-row-below\"><desc>Created with Sketch.</desc><path d=\"M2 9.5h16m-16-4h16m-15.4 12h4.8m-3.3-1.7l-1.8 1.7 1.8 1.7m5.4-4.7h11v6h-11zM2 1.2h15.6v10.6\"/></g>\n        <g id=\"back\"><path stroke-linejoin=\"round\" d=\"M7 5l-5.5 5.5L7 16m-5-5.5h20\"/></g>\n        <g id=\"close\"><path stroke-miterlimit=\"10\" d=\"M3 19L19 3M3 3l16 16\"/></g>\n        <g id=\"collapse\"><path stroke-linejoin=\"round\" d=\"M22 20.5H1m6.5-8l4 4 4-4m-4 3.5V5\"/><path d=\"M1.5 17.5v-15a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v15\" stroke-linejoin=\"round\"/></g>\n        <g id=\"compare\"><g><path stroke-miterlimit=\"10\" d=\"M11.057.688v4.54\"/><path stroke-linejoin=\"round\" d=\"M5.227 4.607l3.61 8.37h-6.65l3.04-8.37 11.24 3.57-3 8.44h6.67l-3.67-8.44m-5.38-.22l-.02 12.72m-5.89-.45h11.81\"/></g></g>\n        <g id=\"confirmed\"><circle cx=\"11\" cy=\"11\" r=\"10\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M5.8 10.9l3.6 3.6 7.1-7.1\"/></g>\n        <g id=\"connection\"><circle cx=\"15.89\" cy=\"3.37\" r=\"2.87\" stroke-linejoin=\"round\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M13.5 5.77l-7.66 7.65\"/><circle cx=\"3.37\" cy=\"15.59\" r=\"2.87\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M14.94 11.22v6.7m3.35-3.35h-6.7\"/></g>\n        <g id=\"data-resolution\"><g><path stroke-miterlimit=\"10\" d=\"M1.812 20.752\"/><path stroke-miterlimit=\"10\" stroke-linecap=\"square\" d=\"M5.552 12.372l1.29-2.59\"/><path stroke-linejoin=\"round\" d=\"M8.612 9.102l3.88 3.26m1.5-1.53l.33-1.35m3.62.3l.87-2.58m-3.34 1.66l1.54 1.69\"/><path stroke-dasharray=\"1 1\" stroke-miterlimit=\"10\" d=\"M11.402 12.022v7.85m0-18.31v7.85\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"8.542\" cx=\"7.482\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"13.772\" cx=\"4.862\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"12.902\" cx=\"13.582\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"11.152\" cx=\"17.942\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"8.542\" cx=\"14.452\"/><circle stroke-miterlimit=\"10\" r=\"1.31\" cy=\"5.922\" cx=\"18.822\"/><path stroke-miterlimit=\"10\" d=\"M1.812 1.562v18.75h18.75\"/></g></g>\n        <g id=\"database\"><path d=\"M.51 5v2.6c0 3.22 17.76 3.22 17.76 0V5\" stroke-miterlimit=\"10\"/><path d=\"M.51 9.68v2.75c0 3 17.76 3 17.76 0V9.68\" stroke-miterlimit=\"10\"/><path d=\"M.51 14.36v2.94c0 2.8 17.76 2.8 17.76 0v-2.94\" stroke-miterlimit=\"10\"/><ellipse cx=\"9.39\" cy=\"2.84\" rx=\"8.89\" ry=\"2.34\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"delete-column\"><desc>Created with Sketch.</desc><path d=\"M2 1v4.5h4.5m1.5-4h6v11H8zM20 1v4.5h-4.5m-7 9.5l4.9 4.9m-4.9 0l4.9-4.9\"/></g>\n        <g id=\"delete-row\"><desc>Created with Sketch.</desc><path d=\"M1.5 20H6v-4.5M2.1 8h11v6h-11zm-.6-6H6v4.5m9.5 7l5-5m0 5l-5-5\"/></g>\n        <g id=\"down\"><path d=\"M6 15.5l5.5 5.5 5.5-5.5m-5.5 5V.5\"/></g>\n        <g id=\"expand\"><path stroke-linejoin=\"round\" d=\"M22 20.5H1m14.5-11l-4-4-4 4m4-3.5v11\"/><path d=\"M1.5 17.5v-15a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v15\" stroke-linejoin=\"round\"/></g>\n        <g id=\"favorite\"><path stroke-linejoin=\"round\" d=\"M11 1.5l2.27 7h7.37l-5.96 4.33 2.27 7L11 15.5l-5.96 4.33 2.28-7L1.36 8.5h7.37l2.27-7z\"/></g>\n        <g id=\"generic-user\"><path stroke-linejoin=\"round\" d=\"M16.17 12l4.33 3v6.5h-19V15l4.33-3\"/><rect x=\"6.5\" y=\".5\" width=\"9\" height=\"11\" rx=\"4.5\" ry=\"4.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"grid-view\"><path stroke-linejoin=\"round\" d=\"M1.5 1.5h8v8h-8zm11 0h8v8h-8zm-11 11h8v8h-8zm11 0h8v8h-8z\"/></g>\n        <g id=\"hamburger\"><path stroke-miterlimit=\"10\" d=\"M0 4.5h22m-22 6h22m-22 6h22\"/></g>\n        <g id=\"hierarchy\"><rect x=\"7.5\" y=\".5\" width=\"6\" height=\"6\" rx=\"3\" ry=\"3\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M10.5 11V6.5m-9 10h6v5h-6zm12 0h6v5h-6zm-9 0v-5h12v5\"/></g>\n        <g id=\"home\"><path stroke-linejoin=\"round\" d=\"M3.5 11v10.5h15V11m-18-.5L11 1l10.5 9.5\"/><path stroke-linejoin=\"round\" d=\"M8.5 15.5h5v6h-5z\"/></g>\n        <g id=\"inbox-view\"><path stroke-linejoin=\"round\" d=\"M.5 3.5h7v15h-7zm7 0h14v15h-14z\"/><path stroke-linejoin=\"round\" d=\"M.5 8.5h7v5h-7z\"/></g>\n        <g id=\"instance\"><path stroke-linejoin=\"round\" d=\"M12.5 17.16v-7.15l-6-3.58-6 3.58v7.15l6 3.58 6-3.58z\"/><path stroke-linejoin=\"round\" d=\"M14.5 15.35l2-1.19V7.01l-6-3.58-2.56 1.53\"/><path stroke-linejoin=\"round\" d=\"M18.5 12.35l2-1.19V4.01l-6-3.58-2.56 1.53M4.5 12.5l2-1v5\"/></g>\n        <g id=\"list-view\"><path stroke-linejoin=\"round\" d=\"M.5 2.5h4v4h-4zm6.5 2h15M.5 9.5h4v4h-4zm6.5 2h15m-21.5 5h4v4h-4zm6.5 2h15\"/></g>\n        <g id=\"log-out\"><path d=\"M14.36 4.37a9 9 0 1 1-7.71 0M10.5 0v12\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"menu\"><circle cx=\"11\" cy=\"3\" r=\"2.5\" stroke-miterlimit=\"10\"/><circle cx=\"11\" cy=\"11\" r=\"2.5\" stroke-miterlimit=\"10\"/><circle cx=\"11\" cy=\"19\" r=\"2.5\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"more\"><circle cx=\"3\" cy=\"11\" r=\"2.5\" stroke-miterlimit=\"10\"/><circle cx=\"11\" cy=\"11\" r=\"2.5\" stroke-miterlimit=\"10\"/><circle cx=\"19\" cy=\"11\" r=\"2.5\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"new-window\"><path d=\"M16.5 11.16v9.34a1 1 0 0 1-1 1h-14a1 1 0 0 1-1-1v-14a1 1 0 0 1 1-1h9.34m-2.34 8L21 1m-8-.5h8.5V9\" stroke-linejoin=\"round\"/></g>\n        <g id=\"next\"><path stroke-linejoin=\"round\" d=\"M15 16l5.5-5.5L15 5m5 5.5H1\"/></g>\n        <g id=\"notification\"><path d=\"M.5 16.5a3 3 0 0 0 3-3v-3.19A7.86 7.86 0 0 1 8.5 3a2.5 2.5 0 0 1 5 0 7.86 7.86 0 0 1 5 7.36v3.14a3 3 0 0 0 3 3\" stroke-linejoin=\"round\"/><path d=\"M7.5 18a3.5 3.5 0 0 0 7 0M0 16.5h22\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"open-context\"><circle cx=\"11\" cy=\"11\" r=\"10\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M7 15l8.17-8.17M9.94 6.5h5.56v5.56\"/></g>\n        <g id=\"pause\"><path stroke-linejoin=\"round\" d=\"M4.5 3.5h4v15h-4zm9 0h4v15h-4z\"/></g>\n        <g id=\"play\"><circle cx=\"11\" cy=\"11\" r=\"10\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M8.5 15.84V6.16L16 11l-7.5 4.84z\"/></g>\n        <g id=\"product-switcher\"><path stroke-linejoin=\"round\" d=\"M1.43 1.57h5v5h-5zM8.5 1.5h5v5h-5zm7 0h5v5h-5zM1.43 8.57h5v5h-5zM8.5 8.5h5v5h-5zm7 0h5v5h-5zM1.43 15.57h5v5h-5zm7.07-.07h5v5h-5zm7 0h5v5h-5z\"/></g>\n        <g id=\"reload\"><path stroke-linejoin=\"round\" d=\"M15 6.5h5.5V1M.5 11a10.5 10.5 0 0 1 19.82-4.84M7 15.5H1.5V21m20-10a10.5 10.5 0 0 1-19.82 4.84\"/></g>\n        <g id=\"search\"><circle cx=\"8.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M21 21l-6.84-6.84\"/></g>\n        <g id=\"stop\"><path stroke-linejoin=\"round\" d=\"M4.5 4.5h13v13h-13z\"/></g>\n        <g id=\"summary\"><g><path stroke-linejoin=\"round\" d=\"M15.535 2.12h3.22v18.13H3.375V2.12h3.04\"/><path stroke-linejoin=\"round\" d=\"M7.845 1.25h6.4v2.78h-6.4zm1.4 8.18h6.26m-8.96-.45h.85v.9h-.85zm2.66 4.93h6.3m-8.96-.44h.85v.9h-.85z\"/></g></g>\n        <g id=\"tile-view\"><path stroke-linejoin=\"round\" d=\"M.5 4.5h5v5h-5zm8 0h5v5h-5zm8 0h5v5h-5zm-16 8h5v5h-5zm8 0h5v5h-5zm8 0h5v5h-5z\"/></g>\n        <g id=\"timezone\"><path stroke-miterlimit=\"10\" d=\"M1.15 9.45V.72l6.39 2.4 5.49-2.4 6.43 2.45v13.42l-5.28-2.11M13.09.85v7.58M7.51 3.01v2.48\"/><circle cx=\"7.36\" cy=\"12.36\" r=\"6.86\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M7.48 8.83v4.45l3.23-1.88\"/></g>\n        <g id=\"tree\"><path stroke-linejoin=\"round\" d=\"M.5 1.5h4v4h-4z\"/><rect x=\"3.5\" y=\"8.5\" width=\"4\" height=\"4\" rx=\"1\" ry=\"1\" stroke-linejoin=\"round\"/><rect x=\"3.5\" y=\"15.5\" width=\"4\" height=\"4\" rx=\"1\" ry=\"1\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M6 3.5h13m-10 7h13m-13 7h13\"/></g>\n        <g id=\"unconfirmed\"><circle cx=\"11\" cy=\"11\" r=\"10\" stroke-linejoin=\"round\"/></g>\n        <g id=\"up\"><path stroke-linejoin=\"round\" d=\"M16.14 6.5L10.64 1l-5.5 5.5m5.5-5v20\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListObject = [\n  'airplane',\n  'airplane-engine',\n  'airport',\n  'automobile',\n  'boiler',\n  'cell-tower',\n  'class',\n  'condenser',\n  'controller',\n  'cooling-tower',\n  'database',\n  'desktop',\n  'edge-box',\n  'fleet',\n  'gas-turbine',\n  'gateway',\n  'hrsg',\n  'imaging-machine',\n  'light-bulb',\n  'line',\n  'line-og',\n  'locomotive',\n  'machine',\n  'manufacturing-line',\n  'plant',\n  'predix-box',\n  'product',\n  'rail-yard',\n  'routes',\n  'sensor',\n  'solar-panel',\n  'steam-turbine',\n  'train',\n  'truck',\n  'wind-turbine'\n];\n\nexport const LdIconsObject = html`\n  <iron-iconset-svg id=\"ld-obj\" name=\"ld-obj\" size=\"32\">\n    <svg>\n      <defs>\n        <g id=\"airplane\"><path stroke-linejoin=\"round\" d=\"M10.9 16L8.1 27h3.7l7.1-11m-8-4L8.1 5h3.7l5.6 7\"/><path d=\"M8.5 18H5.2a3.89 3.89 0 0 1-3.7-4V8h1.9l1.9 4h21.5a3.89 3.89 0 0 1 3.7 4v2H19.7\" stroke-linejoin=\"round\"/><path d=\"M30.4 15.1h-4.5a1.35 1.35 0 0 1-1.3-1.4v-1.9\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"airplane-engine\"><path d=\"M12.9 28H7.4a.68.68 0 0 1-.7-.7 48 48 0 0 1 0-22.6.68.68 0 0 1 .7-.7H13a47.6 47.6 0 0 0-.1 24zm1.1-6.8a44.05 44.05 0 0 1-.3-5.2 45.33 45.33 0 0 1 .3-5.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.4 28h1.7a.68.68 0 0 0 .7-.7 41 41 0 0 0 1.1-6.1\" stroke-miterlimit=\"10\"/><path d=\"M11.4 4h1.7a.68.68 0 0 1 .7.7 59.72 59.72 0 0 1 1.1 6.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path stroke-miterlimit=\"10\" d=\"M14.1 11l7.2-2m-7.2 12l7.2 2m-7.2-9h7.2m-7.2 4h7.2\"/><path stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M21.5 8v16m.1-3.1s2.3 2 5.3-1V12c-3-3-5.3-1-5.3-1\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M26.9 14l3.9 2-3.9 2m-21.7.8l-3-1.5a1.73 1.73 0 0 1-.5-2.2c.1-.2.3-.3.5-.5l3-1.5\"/></g>\n        <g id=\"airport\"><path stroke-linejoin=\"round\" d=\"M6.84 21.5h19.94l1.81 9H7.75m-4.53-18L.5 9.5h9.06l-2.72 3m-5.78-3v-5m7.98 5v-5m-8.99 0h9.97m-4.99 0V0m21.3 21.5h2.72\"/><path d=\"M16.61 16l-3.33-4.9 3.29.45 9.37-6.89a2.8 2.8 0 0 1 4.06.88v.09l-5.73 4.62 1 5.77-2 1.85-2-5.44z\" transform=\"translate(-1.45)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M20.95 7.28l-5.23-2.55-2.13 1.53 4.16 3.37M7.05 27.5v-15H3.08v15H1.41l-.91 3h9.06l-.9-3H7.05z\"/></g>\n        <g id=\"automobile\"><path stroke-linejoin=\"round\" d=\"M22.21 21.11H9.79m-4.98.29H2.33a.85.85 0 0 1-.83-.87v-4.61a.87.87 0 0 1 .52-.8l5.28-1.48 1.76-4a2.47 2.47 0 0 1 2.13-1.26h6.68a2.43 2.43 0 0 1 1.76.76l3.21 4.23a.82.82 0 0 0 .48.25L29.25 15a1.72 1.72 0 0 1 1.25 1.66v3.85a.85.85 0 0 1-.83.87h-2.48\"/><path d=\"M9.25 14.41l1.61-3.61a.76.76 0 0 1 .65-.39h6.12a.74.74 0 0 1 .54.23l2.68 3.77zm5.51-4.07v4.15m13.25.41v2.07h2.49\" stroke-linejoin=\"round\"/><circle cx=\"7.3\" cy=\"21.11\" r=\"2.49\" stroke-linejoin=\"round\"/><circle cx=\"24.7\" cy=\"21.11\" r=\"2.49\" stroke-linejoin=\"round\"/></g>\n        <g id=\"boiler\"><g><ellipse ry=\"3\" rx=\"10.5\" cy=\"4.437\" cx=\"15.375\"/><path d=\"M25.875 12.027v-7.59m0 21.59v1.5c0 1.66-4.7 3-10.5 3s-10.5-1.34-10.5-3V4.437\"/><circle r=\"3.5\" cy=\"13.937\" cx=\"15.375\"/><path d=\"M15.375 14.437l1.5-2m12.03 7.59a3.53 3.53 0 0 1-7.07 0c0-2.05 1.58-2.61 1.58-4.29a10.43 10.43 0 0 1 1.68 2.24 4.42 4.42 0 0 0 1.12-3.95 7.38 7.38 0 0 1 2.69 6z\"/></g></g>\n        <g id=\"cell-tower\"><circle cx=\"12.09\" cy=\"6.47\" r=\"1.5\" stroke-linejoin=\"round\"/><path d=\"M7.61 12.65a7.47 7.47 0 0 1 0-12m3.76 9.12a3.5 3.5 0 0 1 0-6.22M23.54.67a7.47 7.47 0 0 1 0 12m-3.79-9.12a3.5 3.5 0 0 1 0 6.22\" transform=\"translate(-3.39 -.25)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M12.1 8.02L.45 30.97M12.19 8.11l11.26 22.86m-20-6h17m-13-8h9m-4.3-8.5v23\"/></g>\n        <g id=\"class\"><path d=\"M21.5 14.81V5.27L13.5.5l-8 4.77v9.54l8 4.77zm-5 9v-9.54l-8-4.77-8 4.77v9.54l8 4.77zm10 0v-9.54l-8-4.77-8 4.77v9.54l8 4.77z\"/></g>\n        <g id=\"condenser\"><path d=\"M6.77 14.5v-2C6.77 10 9.41 7 9.41 3h18.45c0 4 2.64 7 2.64 9.5V25H20.39\" stroke-linejoin=\"round\"/><path d=\"M19.57 29h-4v-7.5c0-3 2.16-5.5 4.83-5.5h5.18v4h-4.3c-1.21 0-1.7 1.12-1.7 2.5z\" stroke-linejoin=\"round\"/><path d=\"M20.32 16h-7c-2.63 0-4.79 2.5-4.79 5.5V29h3.9v-6.5c0-1.36.57-2.47 1.76-2.5\" stroke-linejoin=\"round\"/><path d=\"M13.29 16h-7c-2.63 0-4.79 2.5-4.79 5.5V29h4v-6.5c0-1.36.5-2.5 1.66-2.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"controller\"><path d=\"M7.6 16.86V.47h13v2.3m0 3.19v23.5h-13v-9.5\"/><circle cx=\"13.9\" cy=\"11.47\" r=\"1.5\"/><circle cx=\"13.9\" cy=\"4.27\" r=\"1.5\"/><path d=\"M15.4 4.47h14.4\"/><circle cx=\"13.9\" cy=\"25.86\" r=\"1.5\"/><circle cx=\"13.9\" cy=\"18.47\" r=\"1.5\"/><path d=\"M12.4 18.47H0\"/></g>\n        <g id=\"cooling-tower\"><path d=\"M5.44 30.5h-4V16a5.5 5.5 0 0 1 5.5-5.5h5.5v4h-4.5a2.5 2.5 0 0 0-2.5 2.5z\" transform=\"translate(-.94 -1)\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M14.06 6.5l-2-6h12l-2 6h-8zM28.53 13V6.5h-20V10m.05 4v15.5h20V23\"/><path d=\"M31 15.5c-1.83 0-1.83 2-3.66 2s-1.83-2-3.67-2-1.83 2-3.67 2m11 2c-1.83 0-1.83 2-3.66 2s-1.83-2-3.67-2-1.83 2-3.67 2\" transform=\"translate(-.94 -1)\" stroke-linejoin=\"round\"/></g>\n        <g id=\"database\"><g data-name=\"Layer 2\"><path d=\"M28.35 8.74v3.59c0 2-5.62 3.6-12.55 3.6S3.25 14.31 3.25 12.34v-3.6\" stroke-linejoin=\"round\"/><ellipse cx=\"15.8\" cy=\"4.99\" rx=\"12.55\" ry=\"3.59\" stroke-linejoin=\"round\"/><path d=\"M28.35 23.42v3.51c0 1.94-5.62 3.51-12.55 3.51s-12.55-1.56-12.55-3.5v-3.52m25.1-7.49v3.75c0 2-5.62 3.67-12.55 3.67S3.25 21.66 3.25 19.67v-3.74\" stroke-linejoin=\"round\"/></g></g>\n        <g id=\"desktop\"><g data-name=\"Layer 2\"><path stroke-linejoin=\"round\" d=\"M1.45 1.41h29.07v19.14H1.45zm21.84 27.14c-2.29 0-3.86-3.88-3.86-7.89M8.79 28.55c2.29 0 3.69-3.88 3.69-7.89M7.1 28.55H25M1.93 14.45h28.12\"/></g></g>\n        <g id=\"edge-box\"><path d=\"M7.5 13.5h17v17h-17z\"/><circle cx=\"16.2\" cy=\"22\" r=\"3.5\"/><path d=\"M7.4 5.7C11.4.8 18.7.1 23.5 4.2c.6.5 1.1 1 1.5 1.5\"/><path d=\"M10.2 8.5c2.5-3.3 7.1-4 10.4-1.6.6.4 1.1 1 1.6 1.6m-9.1 2.9c.9-1.7 3-2.4 4.7-1.5.6.3 1.2.9 1.5 1.5\"/></g>\n        <g id=\"fleet\"><path stroke-linejoin=\"round\" d=\"M21.5 25.52v-8.35l-7-4.17-7 4.17v8.35l7 4.17 7-4.17z\"/><path stroke-linejoin=\"round\" d=\"M7.37 17.37l7.13 4.25 7.13-4.25M14.5 29.85v-8m7-4.66l7-4.17V4.67L21.5.5l-7 4.17\"/><path stroke-linejoin=\"round\" d=\"M14.37 4.87l7.13 4.25 7.13-4.25M21.5 17.35v-8\"/><path stroke-linejoin=\"round\" d=\"M14.5 4.67L7.5.5l-7 4.17v8.35l7 4.17\"/><path stroke-linejoin=\"round\" d=\"M.37 4.87L7.5 9.12l7.13-4.25M7.5 17.35v-8m7-4.5v8\"/></g>\n        <g id=\"gas-turbine\"><path d=\"M5.5 8.4l5 2.6m-5 14.5v-19m0 17.1l5-2.6m-5 0l-3 1.5c-1.3-4.2-1.3-8.8 0-13l3 1.5m4.1 0h5.9v10H9.6zm12.9 10.3l6 3.2c2.7-5.4 2.7-11.6 0-17-2.3 1.1-3.7 2.1-6 3.2v10.6zM15.5 8h3v4h-3zm3 1h4v2h-4zm-3 5h3v4h-3zm3 1h4v2h-4zm-3 5h3v4h-3zm3 1h4v2h-4z\"/></g>\n        <g id=\"gateway\"><path stroke-linejoin=\"round\" d=\"M24.14 9.42h4.36v10H.5v-10H22M4.56 19.2v3.74m4.88-3.74v3.74m5.03-3.74v3.74m5.05-3.74v3.74m5.04-3.74v3.74M24.5 0v9.42\"/><circle cx=\"6.51\" cy=\"14.42\" r=\"1.5\" stroke-linejoin=\"round\"/><circle cx=\"14.51\" cy=\"14.42\" r=\"1.5\" stroke-linejoin=\"round\"/><circle cx=\"22.54\" cy=\"14.42\" r=\"1.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"hrsg\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M22.5 7.64h7v22h-7z\"/><path stroke-linejoin=\"round\" d=\"M20.5 13.56h-11l-9 9.08v7h22\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M22.5 10.64h7\"/><path d=\"M17.42 1.4c0 5 9 2 9 6v-3s0-3-4-3z\" transform=\"translate(-.92 -.9)\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M19.92 19.55c-1.83 0-1.83 2-3.66 2s-1.83-2-3.67-2-1.83 2-3.67 2m11 2c-1.83 0-1.83 2-3.66 2s-1.83-2-3.67-2-1.83 2-3.67 2\" transform=\"translate(-.92 -.9)\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"imaging-machine\"><path d=\"M18 27.4c-2.4 0-10.4-1.6-10.4-1.6-3.2-.9-6.4-5.2-6.4-11.6S5 2.7 8.5 2.7L18 4.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M23.4 20.8c-1 3.9-3.2 6.6-5.7 6.6-3.5 0-6.4-5.2-6.4-11.6s2.8-11.6 6.4-11.6c3.2 0 5.9 4.4 6.3 10.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M19.8 20.8a2.63 2.63 0 0 1-2.2 1.4c-1.9 0-3.5-2.9-3.5-6.4s1.6-6.4 3.5-6.4c1.6 0 3 2 3.4 4.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M14.3 17.9l13.2 2 2.7-2.3L14.1 15m11.7 4.9v8.6\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M28.4 28.9l-5.2-.8\"/></g>\n        <g id=\"light-bulb\"><path d=\"M24.5 10c0-4.7-3.8-8.5-8.5-8.5S7.5 5.3 7.5 10c0 2.6 1.2 5.1 3.3 6.7 1.1.8 1.7 2 1.7 3.4v6.7c0 .4.3.7.7.7h5.6c.4 0 .7-.3.7-.7v-6.7c0-1.4.7-2.6 1.8-3.4 2-1.6 3.2-4.1 3.2-6.7zm-6 18c0 1.4-1.1 2.5-2.5 2.5s-2.5-1.1-2.5-2.5m-1-6.5h7m-7 3h7\"/></g>\n        <g id=\"line\"><path d=\"M2.5 9.2l6 2.8v8s-6 3-6 2.8V9.2zm12 0l-6 2.8v8s6 3 6 2.8V9.2zm8 4l-5-3.2v12c1.7-1 3.4-2.1 5-3.2l7 5.2V8s-7 5-7 5.2zm8 2.8h-1m-12 1h-3m3-2h-3m-12 1h-1m21 2.8v-5.6\"/></g>\n        <g id=\"line-og\"><g><path stroke-linejoin=\"round\" stroke-linecap=\"round\" d=\"M27.062 19.192a11 11 0 1 1-22 0c0-8.18 8.65-13 11-17.88 2.39 4.83 11 9.71 11 17.88z\"/><path stroke-linejoin=\"round\" stroke-linecap=\"round\" d=\"M22.112 24.202a6.05 6.05 0 1 1-12.1 0c0-3.55 2.7-4.52 2.7-7.42a18 18 0 0 1 2.87 3.87 7.7 7.7 0 0 0 1.91-6.77 12.8 12.8 0 0 1 4.62 10.32z\"/></g></g>\n        <g id=\"locomotive\"><path stroke-miterlimit=\"10\" d=\"M1 26h30\"/><path stroke-linejoin=\"round\" d=\"M4 17h23.5l3 6h-4l-1-3h-19l-1 3h-4V6h19l2 5h5v6\"/><path d=\"M12 20a2.5 2.5 0 1 1-4 0m10 0a2.5 2.5 0 1 1-4 0m10 0a2.5 2.5 0 1 1-4 0\" stroke-miterlimit=\"10\"/><path d=\"M21.44 8h-4.88L17 9.55A1.63 1.63 0 0 0 18.44 11h4.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"machine\"><g><path stroke-miterlimit=\"10\" d=\"M4.75 19.06c0-9.56 5.15-17.31 11.5-17.31s11.5 7.75 11.5 17.31\"/><path stroke-miterlimit=\"10\" d=\"M16.25 30.56a11.5 11.5 0 1 1 11.5-11.5 11.51 11.51 0 0 1-11.5 11.5zm-.41-13.99c-1.74-2.2-1.12-5.93-1.12-5.93m3 6.36c.32-2.79 3.4-5 3.4-5m-2.38 6.64c2.2-1.74 5.93-1.12 5.93-1.12m-6.37 3c2.79.32 5 3.4 5 3.4m-6.64-2.38c1.74 2.2 1.12 5.93 1.12 5.93m-3-6.36c-.32 2.79-3.4 5-3.4 5m2.38-6.64c-2.2 1.74-5.93 1.12-5.93 1.12m6.37-3c-2.79-.32-5-3.4-5-3.4\"/><circle stroke-miterlimit=\"10\" r=\"2.34\" cy=\"19.06\" cx=\"16.25\"/></g></g>\n        <g id=\"manufacturing-line\"><path d=\"M1 14h23.23a6.3 6.3 0 0 1 6.13 5c.86 4.22-2.14 8-5.94 8H1\" stroke-linejoin=\"round\"/><ellipse cx=\"23.48\" cy=\"20.5\" rx=\"2.34\" ry=\"2.5\" stroke-linejoin=\"round\"/><ellipse cx=\"15.04\" cy=\"20.5\" rx=\"2.34\" ry=\"2.5\" stroke-linejoin=\"round\"/><ellipse cx=\"6.6\" cy=\"20.5\" rx=\"2.34\" ry=\"2.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M3.48 5h8v9h-8z\"/><path stroke-linejoin=\"round\" d=\"M6.48 5h2v3h-2zm9 0h8v9h-8z\"/><path stroke-linejoin=\"round\" d=\"M18.48 5h2v3h-2z\"/></g>\n        <g id=\"plant\"><path d=\"M7.6 4.1l2.3 23.8H1.5L3.6 4.1\"/><path d=\"M9 27.9h21.5V9.1l-6 5.9V8.4l-7 6.3V8.6l-6.2 5.7M2.1 3.9L9 3.8\"/></g>\n        <g id=\"predix-box\"><path d=\"M7.5 1.5h17v29h-17z\"/><circle cx=\"12\" cy=\"27.5\" r=\".5\"/><path d=\"M17.5 9.5h7v4h-7zm-7.5-5h5m-5 4h5m-5 4h5m-5 4h5m-5 4h5m-5 4h5\"/></g>\n        <g id=\"product\"><g><path stroke-linejoin=\"round\" d=\"M28.6 22.83V9.65L15.68 1.81 2.75 9.65v13.18l12.93 7.83 12.92-7.83zm-22.09-4.7L11 20.89\"/><path stroke-linejoin=\"round\" d=\"M28.6 10.56v-.97L15.68 1.75 2.75 9.59v.5-.47\"/><path stroke-linejoin=\"round\" d=\"M2.67 10.12L15.68 18l13-7.88m-13 7.95v12.68\"/><path stroke-linejoin=\"round\" d=\"M21.21 14.64v3.9l2.77-1.79v-3.74M10.67 4.79l.04.02 13.18 8.2\"/><path stroke-linejoin=\"round\" d=\"M7.99 6.67l.04.02 13.18 8.2\"/></g></g>\n        <g id=\"rail-yard\"><path stroke-linejoin=\"round\" d=\"M.98 25.5h30m-.46-7H20.38l-2.32 3h-4.12l-2.01-3H1.48v-12h29.04v12z\"/><circle cx=\"3.98\" cy=\"21\" r=\"2.5\" stroke-linejoin=\"round\"/><path d=\"M12.11 18.77A2.5 2.5 0 1 0 13.48 21a1.34 1.34 0 0 0 0-.2m6.82-2.19a2.41 2.41 0 0 1 .7-.11 2.5 2.5 0 1 1-2.5 2.5v-.1\" stroke-linejoin=\"round\"/><circle cx=\"28.02\" cy=\"21\" r=\"2.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M7.48 10v5m11.04-5v5m-5.04-5v5m11.04-5v5\"/></g>\n        <g id=\"routes\"><path d=\"M24.92 7.31h-4a5 5 0 0 0-4.39 2.6L13 16.31H8.76\" stroke-linejoin=\"round\"/><circle cx=\"5.23\" cy=\"16.31\" r=\"4\" stroke-miterlimit=\"10\"/><path stroke-linejoin=\"round\" d=\"M21.97 3.81l3.5 3.5-3.5 3.5m5.3 2l3.5 3.5-3.5 3.5M13 16.31l3.51 6.42a5 5 0 0 0 4.39 2.6h4\"/><path stroke-linejoin=\"round\" d=\"M21.97 28.81l3.5-3.5-3.5-3.5m-9.21-5.5h17.29\"/></g>\n        <g id=\"sensor\"><path d=\"M26.93 19a12.84 12.84 0 0 1-12.43 9.43 13 13 0 0 1 0-26A12.79 12.79 0 0 1 27 11.88\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M22.53 12.89v-2.23l-8-4.77-8 4.77v9.54l8 4.77 8-4.77v-2.11\"/><path d=\"M16.73 15.43a2 2 0 0 1-2 2 2 2 0 0 1-2-2 2 2 0 0 1 2-2 2 2 0 0 1 2 2zm-.03 0h14.15\" stroke-linejoin=\"round\"/></g>\n        <g id=\"solar-panel\"><path stroke-linejoin=\"round\" d=\"M16 13.5h13.5v15h-18V16m6-2.5v15m6-15v15m-12-5h18m-18-5h18\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"4\" stroke-linejoin=\"round\"/><path stroke-miterlimit=\"10\" d=\"M8.5 0v3\"/><path stroke-linejoin=\"round\" d=\"M17 8.5h-3M8.5 17v-3M0 8.5h3m11.51-6.01l-2.12 2.12m2.12 9.9l-2.12-2.12m-9.9 2.12l2.12-2.12m-2.12-9.9l2.12 2.12\"/></g>\n        <g id=\"steam-turbine\"><path d=\"M1.5 10.24l6 1.76v8c-1.62.6-4.38 1.19-6 1.79zm24 .01L20.5 8v16c1.62-.75 3.38-1.5 5-2.25l5 2.25V8c-1.62.75-3.38 1.5-5 2.25zM17.5 23l-6-2.25v-9.5c1.62-.75 4.38-1.5 6-2.25zm-6-9h-4m4 4h-4m24-2h-1m-10 2h-3m3-4h-3m-16 2h-1m25 5.75v-11.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g>\n        <g id=\"train\"><path d=\"M1 23.5h30m-29.5-3h26.9c1.4 0 2.4-1.7 1.9-3.3l-.6-1.7c-1.4-4.2-4.8-7-8.5-7H1.5v12z\"/><path d=\"M28 12.5h-6.5l.6 2.1c.1 1 .9 1.8 1.9 1.9h6m-28.5-4h8v4h-8zm5 4.5v-4m6 8v-8.5h4V21\"/></g>\n        <g id=\"truck\"><path d=\"M11.1 25h-4m8.9 0h3.5V10h4.9l6.1 7v8H28\"/><path d=\"M21.6 16v-3h2.6l2.3 2.4c.1.1.1.4 0 .5-.1.1-.2.1-.3.1h-4.6zm2.4 9h-5\"/><circle cx=\"5.1\" cy=\"25.5\" r=\"2.5\"/><circle cx=\"13.1\" cy=\"25.5\" r=\"2.5\"/><circle cx=\"26\" cy=\"25.5\" r=\"2.5\"/><path d=\"M3.1 25H1.6V7H18m-.9-3h1c.8 0 1.5.6 1.5 1.5v5\"/></g>\n        <g id=\"wind-turbine\"><circle cx=\"15.9\" cy=\"14.1\" r=\"2.3\"/><path d=\"M14.5 18.8l-1.7 11.7m6.4 0l-1.8-11.7m-1.8-7l-1.4-1.9c-.4-.6-.5-1.3-.1-1.9l3.2-6.5h1.9l-1.9 10.8m.8 2.7l2.3-.2c.7-.1 1.4.3 1.7.8l4 6-.9 1.6-8.4-7m-2.7-.6l-1 2.1c-.3.6-1.2.7-1.9.7l-7 .8-.9-1.6 10.3-3.8M9 30.5h14\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListUtility = [\n  'add',\n  'alert',\n  'analysis',\n  'app-settings',\n  'asset',\n  'attribute',\n  'calculation',\n  'calendar',\n  'camera',\n  'caret-down',\n  'check',\n  'chevron',\n  'chevron-left',\n  'chevron-right',\n  'chevron-up',\n  'clock',\n  'close',\n  'confirmed',\n  'copy',\n  'delete',\n  'desktop-computer',\n  'download',\n  'edit',\n  'failure',\n  'filter',\n  'flag',\n  'folder-closed',\n  'folder-open',\n  'formula',\n  'help',\n  'information',\n  'link',\n  'location',\n  'locked',\n  'map',\n  'module-settings',\n  'overflow',\n  'phone',\n  'qr-code',\n  'remove',\n  'reply',\n  'save',\n  'search',\n  'share',\n  'swap',\n  'tablet',\n  'tag',\n  'tag-group',\n  'unlink',\n  'unlocked',\n  'upload',\n  'zoom'\n];\n\nexport const LdIconsUtil = html`\n  <iron-iconset-svg id=\"ld-utl\" name=\"ld-utl\" size=\"16\">\n    <svg>\n      <defs>\n        <g id=\"add\"><path stroke-linejoin=\"round\" d=\"M7.5 16V1m0 15V1M0 8.5h15\"/></g>\n        <g id=\"alert\"><path stroke-linejoin=\"round\" d=\"M13.5 6.32v6.18H9.17L7 15l-2.17-2.5H.5v-10h8.86M3 6.5h5m-5 2h8\"/><circle cx=\"12.5\" cy=\"3.5\" r=\"3\" stroke-linejoin=\"round\"/></g>\n        <g id=\"analysis\"><path d=\"M.5 0v13.32h13.32\"/><path d=\"M2.06 7.92L5.7 4.13l3.64 1.62 3.64-4.32M13.36 5L9.72 9.32 6.09 7.7l-3.64 3.78h10.91V5z\"/></g>\n        <g id=\"app-settings\"><path d=\"M7.74 5.3a2.4 2.4 0 1 1-2.41 2.41A2.4 2.4 0 0 1 7.74 5.3zm5.31 1.06a5.44 5.44 0 0 0-.6-1.47l1.17-1.5-.78-.78-.79-.79L10.53 3a5.44 5.44 0 0 0-1.46-.6L8.84.5H6.62l-.23 1.92a5.44 5.44 0 0 0-1.47.6l-1.5-1.2-.78.78-.79.79L3.03 4.9a5.44 5.44 0 0 0-.6 1.46L.5 6.59V8.8l1.92.23a5.44 5.44 0 0 0 .6 1.47l-1.16 1.51.78.78.79.79 1.51-1.17a5.44 5.44 0 0 0 1.47.6l.23 1.92h2.2l.23-1.92a5.44 5.44 0 0 0 1.47-.6l1.5 1.17.78-.78.79-.79-1.17-1.51a5.44 5.44 0 0 0 .6-1.47l1.92-.23V6.6z\"/></g>\n        <g id=\"asset\"><g><path d=\"M13.15 10.88V4.76l-5.43-3-5.32 3v6.12l4.99 3.17 5.76-3.17zM7.4 13.94V7.99\"/><path d=\"M2.4 4.93L7.41 8.1l5.74-3.34\"/></g></g>\n        <g id=\"attribute\"><path d=\"M6.44 4.93a.91.91 0 1 1-.91-.91.91.91 0 0 1 .91.91zm4.06-.85L5.5.6l-5 3.48v10h10.06zM1.87 8.61h7.32m-6.4 2.74h5.49\"/></g>\n        <g id=\"calculation\"><path stroke-linejoin=\"round\" d=\"M1.5.5h13v15h-13z\"/><path stroke-linejoin=\"round\" d=\"M4.5 8.5h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-6 3h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-7-9h9v3h-9z\"/></g>\n        <g id=\"calendar\"><path stroke-linejoin=\"round\" d=\"M.5 1.5h15v12H.5z\"/><path stroke-miterlimit=\"10\" d=\"M3.5 3V0m9 3V0M1 4.5h15m-15 3h15m-15 3h15m-12.5 3v-9m3 9.5V5m3 9V5m3 9V5\"/></g>\n        <g id=\"camera\"><path d=\"M15.5 12.5H.5v-9h3l2-3h5l2 3h3zM5.5 7A2.5 2.5 0 1 0 8 4.5 2.5 2.5 0 0 0 5.5 7z\"/></g>\n        <g id=\"caret-down\"><path d=\"M1.13 4.62l6.53 7.1 6.68-7.21-13.21.11z\"/></g>\n        <g id=\"check\"><path stroke-linejoin=\"round\" d=\"M2.04 9.74l3.67 3.66L13.5 2.5\"/></g>\n        <g id=\"chevron\"><path stroke-linejoin=\"round\" d=\"M2.4 6.2l5.5 5.5 5.5-5.5\"/></g>\n        <g id=\"chevron-left\"><path stroke-linejoin=\"round\" d=\"M10.6 2.2L5.1 7.7l5.5 5.5\"/></g>\n        <g id=\"chevron-right\"><path stroke-linejoin=\"round\" d=\"M6.2 13.2l5.4-5.5-5.5-5.5\"/></g>\n        <g id=\"chevron-up\"><path stroke-linejoin=\"round\" d=\"M13.4 10.4L7.9 4.9l-5.5 5.5\"/></g>\n        <g id=\"clock\"><circle cx=\"8\" cy=\"8\" r=\"7.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M7.5 4v5l3.53-2.03\"/></g>\n        <g id=\"close\"><path stroke-miterlimit=\"10\" d=\"M2.3 2.3l11.4 11.4m0-11.4L2.3 13.7\"/></g>\n        <g id=\"confirmed\"><circle cx=\"8\" cy=\"8\" r=\"7.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M4.25 7.9l2.6 2.6 5.09-5.08\"/></g>\n        <g id=\"copy\"><path d=\"M10.5 15.5H.5v-10h7l3 3z\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M6.5 5.5v4h4M5.5 4V.5h7l3 3v7H12\"/><path stroke-linejoin=\"round\" d=\"M11.5.5v4h4\"/></g>\n        <g id=\"delete\"><path d=\"M2.5 5v9.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V5M0 3.5h16M4.5 3.45L5.5.5h5l1.02 3.05M6.5 7v5m3-5v5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"desktop-computer\"><path stroke-linejoin=\"round\" d=\"M.5.5h15v10H.5zm11 14c-1.11 0-2-1.57-2-3.5v-.5m-5 4c1.11 0 2-1.57 2-3.5v-.5m-3 4h9m-12-7h15\"/></g>\n        <g id=\"download\"><path stroke-linejoin=\"round\" d=\"M.5 11v4.5h14V11m-7-11v10m-4-3.5l4 4 4-4\"/></g>\n        <g id=\"edit\"><path stroke-linejoin=\"round\" d=\"M.5 3.66l10.26 10.26 4.74 1.58-1.58-4.74L3.66.5.5 3.66zm2.37 2.37l3.16-3.16M5.5 5.5l6 6\"/></g>\n        <g id=\"failure\"><path d=\"M7.11 2.45L.63 13.12a1 1 0 0 0 .89 1.52h13a1 1 0 0 0 .89-1.52L8.89 2.45a1 1 0 0 0-1.78 0zm-1.36 5.3l4.5 4.5m0-4.5l-4.5 4.5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"filter\"><path stroke-linejoin=\"round\" d=\"M1.5 1.5l5 6V14l3 1.5v-8l5-6M0 1.5h16\"/></g>\n        <g id=\"flag\"><path stroke-linejoin=\"round\" d=\"M1.5 16V0m.08 2.15c4.59-2.6 6.46 3.74 13-.48V8c-6.58 4.23-8.4-2.11-13 .49\"/></g>\n        <g id=\"folder-closed\"><path stroke-linejoin=\"round\" d=\"M7.5 4.5l-2-3h-5v13h15v-10h-8zm0 0h-7\"/></g>\n        <g id=\"folder-open\"><path stroke-linejoin=\"round\" d=\"M13.5 7.5v-3h-6l-2-3h-5v14l3-8h12l-2 8H.5\"/></g>\n        <g id=\"formula\"><g><path stroke-linejoin=\"round\" d=\"M7.705 8.482h1.132l.755 3.018 1.886-6.036h3.772m-3.395 2.264l3.018 3.018m0-3.018l-3.018 3.018M4.688 8.482h2.263M4.688 9.991h2.263\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(.087 2.87) scale(.7584)\" font-size=\"8\" font-weight=\"700\" y=\"10.23\" x=\".367\">y</text></g></g>\n        <g id=\"help\"><circle cx=\"8.5\" cy=\"8.5\" r=\"7\" stroke-linejoin=\"round\"/><path d=\"M6.5 6.5a2 2 0 1 1 2.89 1.79 1.51 1.51 0 0 0-.89 1.34V10\" stroke-linejoin=\"round\"/><circle cx=\"8.5\" cy=\"12\" r=\".5\" stroke-linejoin=\"round\"/></g>\n        <g id=\"information\"><circle cx=\"7.5\" cy=\"8.5\" r=\"7\" stroke-linejoin=\"round\"/><circle cx=\"7.5\" cy=\"6\" r=\".5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M7.5 8v4\"/></g>\n        <g id=\"link\"><path d=\"M7.67 5.61a1 1 0 0 1 0-1.41l3.4-3.4a1 1 0 0 1 1.41 0l2.72 2.72a1 1 0 0 1 0 1.41l-3.4 3.4a1 1 0 0 1-1.41 0m-2.06 2.06a1 1 0 0 1 0 1.41l-3.4 3.4a1 1 0 0 1-1.41 0L.79 12.49a1 1 0 0 1 0-1.41l3.4-3.4a1 1 0 0 1 1.41 0m5.84-3.12l-6.88 6.88\" stroke-linejoin=\"round\"/></g>\n        <g id=\"location\"><path d=\"M11.5 6.11C11.5 10.7 6 15.5 6 15.5S.5 10.7.5 6.11A5.56 5.56 0 0 1 6 .5a5.56 5.56 0 0 1 5.5 5.61zM3.5 6A2.5 2.5 0 1 0 6 3.5 2.5 2.5 0 0 0 3.5 6z\" stroke-linejoin=\"round\"/></g>\n        <g id=\"locked\"><path stroke-linejoin=\"round\" d=\"M1.5 7.5h12v8h-12zm6-7a4 4 0 0 1 4 4v3h-8v-3a4 4 0 0 1 4-4zm0 12.5v-3\"/></g>\n        <g id=\"map\"><path stroke-linejoin=\"round\" d=\"M15.5 14.5l-5-2-5 2-5-2v-11l5 2 5-2 5 2v11zm-10-11v11m5-13v11\"/></g>\n        <g id=\"module-settings\"><path stroke-linejoin=\"round\" d=\"M16 4.5h-3.5m-4 0H0m16 7H7.5m-4 0H0\"/><rect x=\"8.5\" y=\"2.5\" width=\"4\" height=\"4\" rx=\"1\" ry=\"1\" stroke-linejoin=\"round\"/><rect x=\"3.5\" y=\"9.5\" width=\"4\" height=\"4\" rx=\"1\" ry=\"1\" stroke-linejoin=\"round\"/></g>\n        <g id=\"overflow\"><path d=\"M.35 14.35l7-7-7-7\"/><path d=\"M5.35 14.35l7-7-7-7\"/></g>\n        <g id=\"phone\"><path stroke-linejoin=\"round\" d=\"M3.5.5h9v15h-9zm3 13h3m-6-2h9\"/></g>\n        <g id=\"qr-code\"><path stroke-miterlimit=\"10\" d=\"M10.98 13.48h1m-1 1h2m2 0h1m-2-1h1m-1-4h1m-5 6h1m-1.5.5v-6.5h3.5m2.5-.5v4m-2.5-2.5h-3m3 1h-3m5 1h-3m0 3h4M.5.5h5.95v5.95H.5zm9 0h5.95v5.95H9.5zm-9 9h5.95v5.95H.5z\"/><path stroke-miterlimit=\"10\" d=\"M2.47 2.47h2.01v2.01H2.47zm0 9h2.01v2.01H2.47zm9-9h2.01v2.01h-2.01z\"/></g>\n        <g id=\"remove\"><path stroke-linejoin=\"round\" d=\"M0 8.5h15\"/></g>\n        <g id=\"reply\"><path d=\"M14.5 14.5V9.32A4.82 4.82 0 0 0 9.68 4.5H6.5v-3l-6 5 6 5v-3h3.1a4.9 4.9 0 0 1 4.9 4.9z\" stroke-linejoin=\"round\"/></g>\n        <g id=\"save\"><path d=\"M14.5 14.5h-13v-13h10l3 3z\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M4.5 8.5h7v6h-7zm1-7h5v4h-5z\"/></g>\n        <g id=\"search\"><circle cx=\"6\" cy=\"6\" r=\"5.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M15.5 15.5L10 10\"/></g>\n        <g id=\"share\"><path stroke-linejoin=\"round\" d=\"M5 6.5H2.5v9h10v-9H10M7.5 12V1m-3 2.75l3-3 3 3\"/></g>\n        <g id=\"swap\"><g><path stroke-miterlimit=\"10\" d=\"M14.287 11.947h-4.08l-5.23-7.97H.937\"/><path stroke-miterlimit=\"10\" d=\"M12.277 9.697l2.19 2.19-2.19 2.18m2.01-10.09h-4.08l-1.48 2.03\"/><path stroke-miterlimit=\"10\" d=\"M12.257 1.787l2.19 2.19-2.19 2.18m-5.99 3.6l-1.42 2.19H.937\"/></g></g>\n        <g id=\"tablet\"><path stroke-linejoin=\"round\" d=\"M1.5.5h13v15h-13zm5 13h3\"/><path stroke-linejoin=\"round\" d=\"M3.5 2.5h9v9h-9z\"/></g>\n        <g id=\"tag\"><path d=\"M6.52 13.84l-6-6L7.81.5h6v6zm3.76-10.67a.89.89 0 1 0 .89-.87.89.89 0 0 0-.89.87z\" stroke-linejoin=\"round\"/></g>\n        <g id=\"tag-group\"><path stroke-linejoin=\"round\" d=\"M13.1 1.55h1.4l-.02 6.53-4.68 4.67-1.17-1.16\"/><path stroke-linejoin=\"round\" d=\"M11.7 6.18L6.06 11.8.5 6.17 6.17.5h5.58l-.05 5.68z\"/><circle cx=\"8.94\" cy=\"3.37\" r=\".47\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"unlink\"><path d=\"M7.67 4.2l3.4-3.4a1 1 0 0 1 1.41 0l2.72 2.72a1 1 0 0 1 0 1.41l-3.4 3.4M8.33 11.8l-3.4 3.4a1 1 0 0 1-1.41 0L.79 12.49a1 1 0 0 1 0-1.41l3.4-3.4m9.31 5.82l-11-11\" stroke-linejoin=\"round\"/></g>\n        <g id=\"unlocked\"><path stroke-linejoin=\"round\" d=\"M1.5 7.5h12v8h-12zm2 0v-3a4 4 0 0 1 4-4 4 4 0 0 1 4 4m-5.5 7h3\"/></g>\n        <g id=\"upload\"><path stroke-linejoin=\"round\" d=\"M.5 12v3.5h14V12m-7 0V2m4 3.5l-4-4-4 4\"/></g>\n        <g id=\"zoom\"><circle cx=\"6\" cy=\"6\" r=\"5.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M15.5 15.5L10 10\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html } from 'lit-element';\n\nexport const LdIconsListVis = [\n  'add-brush',\n  'all-points-in-area',\n  'bring-to-front',\n  'brush',\n  'closest-point',\n  'closest-point-series',\n  'comment',\n  'crosshair',\n  'delta',\n  'draw-stripe',\n  'expand-radius',\n  'full-screen',\n  'hide',\n  'lasso',\n  'move-axis',\n  'pan',\n  'pin',\n  'refresh',\n  'remove-brush',\n  'remove-stripe',\n  'reset',\n  'reset-zoom',\n  'resize',\n  'show-tooltip',\n  'shrink-radius',\n  'trash-series',\n  'x-axis',\n  'xy-axis',\n  'y-axis',\n  'zoom-generic',\n  'zoom-in',\n  'zoom-out',\n  'zoom-out-one-level',\n  'zoom-toolbar'\n];\n\nexport const LdIconsVis = html`\n  <iron-iconset-svg id=\"ld-vis\" name=\"ld-vis\" size=\"22\">\n    <svg>\n      <defs>\n        <g id=\"add-brush\"><path stroke-linejoin=\"round\" d=\"M16.5 14v7m3.5-3.5h-7M10.5 21V0\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M9 17.5H4.5v-14h12V12\"/></g>\n        <g id=\"all-points-in-area\"><circle cx=\"10.5\" cy=\"10.5\" r=\"10\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M10.5 5v4M9 10.5H5m11 0h-4M10.5 12v4\"/></g>\n        <g id=\"bring-to-front\"><path stroke-miterlimit=\"10\" d=\"M15.5 15v.5\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"0.9 0.9\" d=\"M15.5 16.4v3.15\"/><path stroke-miterlimit=\"10\" d=\"M15.5 20v.5H15\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M14 20.5H2.5\"/><path stroke-miterlimit=\"10\" d=\"M2 20.5h-.5V20\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M1.5 19V7.5\"/><path stroke-miterlimit=\"10\" d=\"M1.5 7v-.5H2\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"0.9 0.9\" d=\"M2.9 6.5h3.15\"/><path stroke-miterlimit=\"10\" d=\"M6.5 6.5H7m-.5-5h14v14h-14z\"/></g>\n        <g id=\"brush\"><path stroke-linejoin=\"round\" d=\"M10.5 21V0\"/><path stroke-miterlimit=\"10\" d=\"M16.5 17v.5H16\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M15 17.5H5.5\"/><path stroke-miterlimit=\"10\" d=\"M5 17.5h-.5V17\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M4.5 16V4.5\"/><path stroke-miterlimit=\"10\" d=\"M4.5 4v-.5H5\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M6 3.5h9.5\"/><path stroke-miterlimit=\"10\" d=\"M16 3.5h.5V4\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M16.5 5v11.5\"/></g>\n        <g id=\"closest-point\"><path stroke-miterlimit=\"10\" d=\"M0 21.5h22M.5 22V0\"/><circle cx=\"11.34\" cy=\"8.01\" r=\"2.66\"/><circle cx=\"11.34\" cy=\"14.01\" r=\"2.66\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M11.5 0v21\"/></g>\n        <g id=\"closest-point-series\"><path stroke-miterlimit=\"10\" d=\"M0 21.5h22M.5 22V0\"/><circle cx=\"6.34\" cy=\"14.01\" r=\"2.66\"/><circle cx=\"6.34\" cy=\"8.01\" r=\"2.66\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M6.5 0v21\"/><path d=\"M16.34 4.35a2.65 2.65 0 0 1 .62.08A2.65 2.65 0 0 0 17 4a2.66 2.66 0 1 0-3.28 2.58 2.66 2.66 0 0 1 2.62-2.23z\" stroke-miterlimit=\"10\"/><circle cx=\"12.34\" cy=\"13.01\" r=\"2.66\" stroke-miterlimit=\"10\"/><circle cx=\"18.34\" cy=\"17.01\" r=\"2.66\" stroke-miterlimit=\"10\"/><circle cx=\"16.34\" cy=\"7.01\" r=\"2.66\" stroke-miterlimit=\"10\"/></g>\n        <g id=\"comment\"><path d=\"M10 17.66l-3.37-4.28H.5V.5h19v12.88h-6.13L10 17.66zM3.87 4.18h12.26M3.87 6.63h8.58M3.87 9.08h4.9\"/></g>\n        <g id=\"crosshair\"><path stroke-linejoin=\"round\" d=\"M10.5 0v8M8 10.5H0m21 0h-8M10.5 13v8\"/></g>\n        <g id=\"delta\"><path stroke-miterlimit=\"10\" d=\"M13.44 20.67H1.5L11 1.63l9.5 19.04h-4.22L11 9.38\"/></g>\n        <g id=\"draw-stripe\"><path stroke-linejoin=\"round\" d=\"M16.5 14v7m3.5-3.5h-7M1.56 15.91L6.5 9.5l7 4 6.52-7\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M17 19.5H6.5v-18h10V12\"/></g>\n        <g id=\"expand-radius\"><circle cx=\"11\" cy=\"11\" r=\"6.5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M4 .5H.5V4M.5.5l4 4M18 .5h3.5V4m0-3.5l-4 4M4 21.5H.5V18m0 3.5l4-4m13.5 4h3.5V18m0 3.5l-4-4\"/></g>\n        <g id=\"full-screen\"><rect x=\".5\" y=\".5\" width=\"21\" height=\"21\" rx=\"2\" ry=\"2\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M4 18L18 4m-8-.5h8.5V12M12 18.5H3.5V10\"/></g>\n        <g id=\"hide\"><path d=\"M7.11 9.32a3.3 3.3 0 1 0 3.3-3.3 3.3 3.3 0 0 0-3.3 3.3zm-6.6 0s4.43-6.3 9.9-6.3 9.9 6.3 9.9 6.3-4.43 6.3-9.9 6.3S.5 9.32.5 9.32zm.9-9l18 18\"/></g>\n        <g id=\"lasso\"><path d=\"M6.15 14.19c0 2.21-2.24 4-5 4\"/><circle cx=\"4.15\" cy=\"15.19\" r=\"1.5\"/><ellipse cx=\"10.13\" cy=\"7.65\" rx=\"9.63\" ry=\"7.15\"/></g>\n        <g id=\"move-axis\"><path stroke-linejoin=\"round\" d=\"M4.5 14.1L.9 10.5l3.6-3.6M9 10.5H1m15.4-3.6l3.6 3.6-3.6 3.6M12 10.5h8M10.5 0v21\"/></g>\n        <g id=\"pan\"><path stroke-linejoin=\"round\" d=\"M6.9 3.9L10.5.31l3.6 3.59m0 13l-3.6 3.6-3.6-3.6m9.6-10l3.6 3.6-3.6 3.6m-12 0L.9 10.5l3.6-3.6m6-5.9v19m9-9.5H1\"/></g>\n        <g id=\"pin\"><path stroke-linejoin=\"round\" d=\"M7.8 14.19L2 19.99m10-2.18a5.5 5.5 0 0 0-.26-7.33A5.3 5.3 0 0 0 4.18 10zm6.06-11.05L14 11.98M10 8l5.23-4.07M14 2l6 6\"/></g>\n        <g id=\"refresh\"><path stroke-linejoin=\"round\" d=\"M15 6.5h5.5V1m1 10a10.49 10.49 0 1 1-1-4.49\"/></g>\n        <g id=\"remove-brush\"><path stroke-linejoin=\"round\" d=\"M10.5 21V0M20 17.5h-7\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M11 17.5H4.5v-14h12V14\"/></g>\n        <g id=\"remove-stripe\"><path stroke-linejoin=\"round\" d=\"M1.56 15.91L6.5 9.5l7 4 6.52-7m-.02 11h-7\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M17 19.5H6.5v-18h10V16\"/></g>\n        <g id=\"reset\"><path d=\"M1.46 6.55c3.75-8.11 15.74-7.94 19.22.3C24.07 14.87 16.33 23.49 8 21A10.61 10.61 0 0 1 .51 11\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M6.88 6.44h-5.5V.94\"/></g>\n        <g id=\"reset-zoom\"><path stroke-linejoin=\"round\" d=\"M13 .5h8.5V9M9 21.5H.5V13m21 0v8.5H13M.5 9V.5H9\"/></g>\n        <g id=\"resize\"><path d=\"M.5 0v22m.4-.5h15.3m.8-2.3l2.1 2.1 2.1-2.1m-7.57-3.35l-3.6 3.6-3.6-3.6m3.6-4.5v8m-3.6-14.6l3.6-3.6 3.6 3.6m-3.6 4.4v-8\"/></g>\n        <g id=\"show-tooltip\"><circle cx=\"10.52\" cy=\"10.5\" r=\"10\" stroke-linejoin=\"round\"/><circle cx=\"10.52\" cy=\"6.93\" r=\".5\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M10.52 9.79v5.71\"/></g>\n        <g id=\"shrink-radius\"><circle cx=\"10.5\" cy=\"10.5\" r=\"3\" stroke-linejoin=\"round\"/><path stroke-linejoin=\"round\" d=\"M2 16.5h3.5V20m0-3.5L1 21m18-4.5h-3.5V20m0-3.5L20 21M2 5.5h3.5V2m0 3.5L1 1m18 4.5h-3.5V2m0 3.5L20 1\"/></g>\n        <g id=\"trash-series\"><path stroke-linejoin=\"round\" d=\"M10.5 6v11.91M6.5 6v11.91M14.5 6v11.91M20 3.5H1M17.5 5v14.5a1 1 0 0 1-1 1h-12a1 1 0 0 1-1-1V5m4-2V1.5h6V3\"/></g>\n        <g id=\"x-axis\"><path stroke-miterlimit=\"10\" d=\"M0 21.5h22\"/><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M.5 19.5V.5\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(5.84 16.38)\" font-size=\"22\" font-family=\"GEInspiraSans-Regular, GE Inspira Sans\">x</text></g>\n        <g id=\"xy-axis\"><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(3.71 15.38)\" font-size=\"18\" font-family=\"GEInspiraSans-Regular, GE Inspira Sans\" letter-spacing=\"0em\">x<tspan x=\"8.33\" y=\"0\" letter-spacing=\"-.02em\">y</tspan></text><path stroke-miterlimit=\"10\" d=\"M0 21.5h22M.5 22V0\"/></g>\n        <g id=\"y-axis\"><path stroke-miterlimit=\"10\" stroke-dasharray=\"1 1\" d=\"M0 21.5h21.5\"/><path stroke-miterlimit=\"10\" d=\"M.5 20V1\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(6.93 14.88)\" font-size=\"20\" font-family=\"GEInspiraSans-Regular, GE Inspira Sans\" letter-spacing=\"-.01em\">y</text></g>\n        <g id=\"zoom-generic\"><circle cx=\"13.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M1 21.06l6.84-6.84\"/></g>\n        <g id=\"zoom-in\"><circle cx=\"13.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M1 21l6.84-6.84\"/><path stroke-linejoin=\"round\" d=\"M13.5 4v9M18 8.5H9\"/></g>\n        <g id=\"zoom-out\"><circle cx=\"13.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M1 21l6.84-6.84\"/><path stroke-linejoin=\"round\" d=\"M18 8.5H9\"/></g>\n        <g id=\"zoom-out-one-level\"><circle cx=\"13.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M1.13 21l6.84-6.84\"/><text fill=\"currentcolor\" stroke=\"none\"  transform=\"translate(11.13 11.75)\" font-size=\"12\" font-family=\"GEInspiraSans-Regular, GE Inspira Sans\">1</text><path stroke-miterlimit=\"10\" d=\"M12 8.5H9\"/></g>\n        <g id=\"zoom-toolbar\"><circle cx=\"13.5\" cy=\"8.5\" r=\"8\" stroke-miterlimit=\"10\"/><path stroke-miterlimit=\"10\" d=\"M1 21l6.84-6.84m9.66 4.34l2 2 2-2\"/></g>\n      </defs>\n    </svg>\n  </iron-iconset-svg>\n`;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdIconStyles = css`\n  :host {\n    fill: none;\n    stroke: ${unsafeCSS(_THEME.colors.secondary_note_color)};\n    position: relative;\n    vertical-align: middle;\n    width: auto;\n    height: auto;\n    stroke-width: 1;\n  }\n\n  iron-icon {\n    color: inherit;\n    fill: inherit;\n    stroke: inherit;\n  }\n`;\n\nexport default LdIconStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\n\nimport '@polymer/iron-iconset-svg/iron-iconset-svg';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/iron-icon/iron-icon';\n\nimport { LdIconsCommunication } from './icons/ld-icons-communication';\nimport { LdIconsDocument } from './icons/ld-icons-document';\nimport { LdIconsFeature } from './icons/ld-icons-feature';\nimport { LdIconsNavigation } from './icons/ld-icons-navigation';\nimport { LdIconsObject } from './icons/ld-icons-object';\nimport { LdIconsUtil } from './icons/ld-icons-util';\nimport { LdIconsVis } from './icons/ld-icons-vis';\nimport { LdIconStyles } from './styles';\n\nclass LdIcon extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      icon: { type: String },\n      size: { type: Number }\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdIconStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      ${LdIconsCommunication}\n      ${LdIconsDocument}\n      ${LdIconsFeature}\n      ${LdIconsNavigation}\n      ${LdIconsObject}\n      ${LdIconsUtil}\n      ${LdIconsVis}\n\n      <iron-icon icon='${this.icon}' style='width:${this.size}px;height:${this.size}px;'></iron-icon>\n    `;\n  }\n\n}\n\ncustomElements.define('ld-icon', LdIcon);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n\n'use strict';\n\nimport { css } from 'lit-element';\nimport { centerAligned, centerAlignedContent, centerJustified, displayFlex, horizontal } from 'lit-flexbox-literals';\n\nexport const LdLoadingSpinnerInlineStyles = css`\n        :host,\n        :host(:not([loading=\"true\"])) {\n                display: none;\n        }\n\n  :host([loading]) {\n    display: flex;\n    align-self: center;\n    position: absolute;\n    top: 25%;\n          width: 100%;\n    background-color: rgba(255, 255, 255, 0.7);\n  }\n\n        .spinner-holder {\n                ${displayFlex}\n                ${horizontal}\n                ${centerAligned}\n                ${centerAlignedContent}\n                ${centerJustified}\n                width: 100%;\n                height: 100%;\n        }\n\n        paper-spinner {\n                ${horizontal}\n                ${centerAligned}\n                ${centerJustified}\n                width: var(--ld-loading-spinner-inline-spinner-width, 100px);\n                height: var(--ld-loading-spinner-inline-spinner-height, 100px);\n\n                --paper-spinner-stroke-width: var(--ld-loading-spinner-inline-spinner-stroke-width, 4px);\n                --paper-spinner-layer-1-color: #FFFFFF;\n                --paper-spinner-layer-2-color: #eb0028;\n                --paper-spinner-layer-3-color: #FFFFFF;\n                --paper-spinner-layer-4-color: #eb0028;\n        }\n\n`;\n\nexport default LdLoadingSpinnerInlineStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\n\nimport '@polymer/paper-spinner/paper-spinner-lite';\nimport { LdLoadingSpinnerInlineStyles } from './styles-inline';\n\nclass LdLoadingSpinnerInline extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      loading: { type: Boolean, hasChanged: () => true }\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdLoadingSpinnerInlineStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.loading = false;\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <div class='spinner-holder'>\n        <paper-spinner ?active='${this.loading}'></paper-spinner>\n      </div>\n    `;\n  }\n\n}\n\ncustomElements.define('ld-loading-spinner-inline', LdLoadingSpinnerInline);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint-disable import/prefer-default-export */\n\nimport { css } from 'lit-element';\n\nexport const LdDatepickerStyles = css`\n    :host {\n      display: block;\n      max-width: 100%;\n      margin: 0;\n      padding: 0;\n      overflow: hidden;\n    }\n\n`;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html, LitElement } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\nimport { LdDatepickerStyles } from './styles';\nimport '@lifedata/ld-datepicker';\nimport moment from 'moment';\nimport LdErrorHandler from '../../../js/LdErrorHandler';\n\n/**\n * @extends LitElement\n */\nclass LdDatepickerConfig extends LdI18NextMixin(LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      startDate: { type: Boolean, hasChanged: () => true },\n      addTitle: { type: String, hasChanged: () => true },\n      noTimeSelect: { type: Boolean, hasChanged: () => true },\n      singleDaySelect: { type: Boolean, hasChanged: () => true },\n      noPresets: { type: Boolean, hasChanged: () => true },\n      blockFutureDates: { type: Boolean, hasChanged: () => true },\n      date: { type: String, hasChanged: () => true },\n      maxSelectableDays: { type: Number, hasChanged: () => true },\n      _settings: { type: Object, hasChanged: () => true },\n      refreshDate: { type: String, hasChanged: () => true },\n      customDate: { type: Object, hasChanged: () => true },\n      numberOfCustomDays: { type: Number, hasChanged: () => true },\n      showedErrorMessage: { type: Number, hasChanged: () => true },\n      disabledCustomButton: { type: Boolean, hasChanged: () => true },\n      blockreload: { type: Boolean, hasChanged: () => true },\n      disabledMaxInformation: { type: Boolean, hasChanged: () => true },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdDatepickerStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.refreshDate = null;\n    this._settings = [\n      {\n        locale: {\n          month: this.LdGetArray('modules.charts.globalSettings.lang.months'),\n          monthsShort: this.LdGetArray('modules.charts.globalSettings.lang.shortMonths'),\n          weekdays: this.LdGetArray('modules.charts.globalSettings.lang.weekdays'),\n          weekdaysShort: this.LdGetArray('modules.charts.globalSettings.lang.shortWeekdays'),\n          language: this.LdGetLanguage(),\n          dateFormat: this.LdTranslate('modules.generic.dateFormat'),\n          timeFormatWithoutSeconds: this.LdTranslate('modules.generic.timeFormatWithoutSeconds'),\n          placeholderTitle: '',\n          placeholderTitleActiveColor: 'var(--paper-input-container-focus-color, var(--primary-color))',\n          placeholderTitleColor: 'var(--paper-input-container-color, var(--secondary-text-color))',\n          rangeTo: this.LdTranslate('modules.datepicker.presets.rangeTo'),\n          title: this.LdTranslate('modules.datepicker.presets.title'),\n          submit: this.LdTranslate('modules.generic.buttons.submit'),\n          cancel: this.LdTranslate('modules.generic.buttons.cancel'),\n          refreshTitle: this.LdTranslate('modules.generic.buttons.refreshReset'),\n        },\n      },\n    ];\n    this.blockFutureDates = false;\n    this.singleDaySelect = false;\n    this.disabledCustomButton = false;\n    this.noPresets = false;\n    this.noTimeSelect = false;\n    this.maxSelectableDays = 183;\n    this.date = null;\n    this.startDate = false;\n    this.showedErrorMessage = false;\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    setTimeout(() => {\n      this._settings = [\n        {\n          presets: [\n            {\n              title: this.LdTranslate('modules.datepicker.presets.predefined.last5Minutes'),\n              calc: {\n                startDay: 'moment().subtract(5, \"minutes\")',\n                endDay: 'moment()',\n                startTime: {\n                  hours: 'moment().hours()',\n                  minutes: 'moment().minutes().subtract(5, \"minutes\")',\n                },\n                endTime: {\n                  hours: 'moment().hours()',\n                  minutes: 'moment().minutes()',\n                },\n              },\n            },\n            {\n              title: this.LdTranslate('modules.datepicker.presets.predefined.last24Hours'),\n              calc: {\n                startDay: 'moment().subtract(24, \"hours\")',\n                endDay: 'moment()',\n                startTime: {\n                  hours: 'moment().subtract(24, \"hours\").hours()',\n                  minutes: 'moment().subtract(24, \"hours\").minutes()',\n                },\n                endTime: {\n                  hours: 'moment().hours()',\n                  minutes: 'moment().minutes()',\n                },\n              },\n            },\n            {\n              title: this.LdTranslate('modules.datepicker.presets.predefined.today'),\n              calc: {\n                startDay: 'moment().startOf(\"day\")',\n                endDay: 'moment()',\n                startTime: {\n                  hours: '00',\n                  minutes: '00',\n                },\n                endTime: {\n                  hours: 'moment().hours()',\n                  minutes: 'moment().minutes()',\n                },\n              },\n            },\n            {\n              title: this.LdTranslate('modules.datepicker.presets.predefined.yesterday'),\n              calc: {\n                startDay: 'moment().subtract(1, \"days\")',\n                endDay: 'moment().subtract(1, \"days\")',\n                startTime: {\n                  hours: 0,\n                  minutes: 0,\n                },\n                endTime: {\n                  hours: 23,\n                  minutes: 59,\n                },\n              },\n            },\n            {\n              title: this.LdTranslate('modules.datepicker.presets.predefined.last7days'),\n              calc: {\n                startDay: 'moment().subtract(7, \"days\")',\n                endDay: 'moment()',\n                startTime: {\n                  hours: 'moment().subtract(7, \"days\").hours()',\n                  minutes: 'moment().subtract(7, \"days\").minutes()',\n                },\n                endTime: {\n                  hours: 'moment().hours()',\n                  minutes: 'moment().minutes()',\n                },\n              },\n            },\n          ],\n          locale: {\n            month: this.LdGetArray('modules.charts.globalSettings.lang.months'),\n            monthsShort: this.LdGetArray('modules.charts.globalSettings.lang.shortMonths'),\n            weekdays: this.LdGetArray('modules.charts.globalSettings.lang.weekdays'),\n            weekdaysShort: this.LdGetArray('modules.charts.globalSettings.lang.shortWeekdays'),\n            language: this.LdGetLanguage(),\n            dateFormat: this.LdTranslate('modules.generic.dateFormat'),\n            timeFormatWithoutSeconds: this.LdTranslate('modules.generic.timeFormatWithoutSeconds'),\n            placeholderTitle: '',\n            placeholderTitleActiveColor: 'var(--paper-input-container-focus-color, var(--primary-color))',\n            placeholderTitleColor: 'var(--paper-input-container-color, var(--secondary-text-color))',\n            rangeTo: this.LdTranslate('modules.datepicker.presets.rangeTo'),\n            title: this.LdTranslate('modules.datepicker.presets.title'),\n            submit: this.LdTranslate('modules.generic.buttons.submit'),\n            cancel: this.LdTranslate('modules.generic.buttons.cancel'),\n            custom: this.LdTranslate('modules.generic.buttons.custom'),\n            refreshTitle: this.LdTranslate('modules.generic.buttons.refreshReset'),\n          },\n          refresh: {\n            startDay: this.refreshDate != null ? `${this.refreshDate}` : 'moment().subtract(24, \"hours\")',\n            endDay: 'moment()',\n            startTime: {\n              hours: 'moment().subtract(24, \"hours\").hours()',\n              minutes: 'moment().subtract(24, \"hours\").minutes()',\n            },\n            endTime: {\n              hours: 'moment().hours()',\n              minutes: 'moment().minutes()',\n            },\n          },\n        },\n      ];\n      this.setNewCustomValuesToDateSelection();\n    }, 1000);\n    if(!this.disabledMaxInformation) {\n      this.maxSelectableDaysInformation = this.LdTranslate('modules.maxSelectableDays').replace('%replaceValue', this.maxSelectableDays);\n    }\n  }\n\n  /**\n   * create an eventListener\n   */\n  // --------------------------------------------------------------------------------------\n  connectedCallback() {\n    super.connectedCallback();\n    addEventListener(\"changed\", (evt) => {\n      if (!this.blockreload) {\n        this._onEvent(evt)\n      }\n    });\n  }\n\n  /**\n   * to prevent memory leaks\n   */\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    removeEventListener(\"changed\", (evt) => {\n      this._onEvent(evt)\n    });\n  }\n  // --------------------------------------------------------------------------------------\n  render() {\n    if (this.addTitle != null) {\n      this._settings[0].locale.placeholderTitle = this.addTitle;\n    }\n    return html`\n      <ld-datepicker\n        date='${ifDefined(this.date)}'\n        maxSelectableDays='${this.maxSelectableDays}'\n        maxSelectableDaysInformation='${this.maxSelectableDaysInformation}'\n        @changed='${(evt) => this._onEvent(evt)}'\n        @preset='${(evt) => this._onPresetEvent(evt)}'\n        @changedCustomRange='${() => this.setNewCustomValuesToDateSelection()}'\n        .settings='${this._settings}'\n        ?noTimeSelect='${this.noTimeSelect}'\n        ?singleDaySelect='${this.singleDaySelect}'\n        ?noPresets='${this.noPresets}'\n        ?blockFutureDates='${this.blockFutureDates}'\n        ?startDate='${this.startDate}'\n        ?disabledCustomButton='${this.disabledCustomButton}'\n      ></ld-datepicker>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onEvent(evt) {\n    const clonedEvent = new evt.constructor(evt.type, evt);\n    this.dispatchEvent(clonedEvent);\n    this.setNewCustomValuesToDateSelection();\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onPresetEvent(evt) {\n    if (evt.detail.title === this.LdTranslate('modules.datepicker.presets.predefined.custom'))\n      if (!this.showedErrorMessage && (this.maxSelectableDays == null || this.maxSelectableDays < this.numberOfCustomDays)) {\n        LdErrorHandler._handleError(`custom_date_fail`, this.maxSelectableDays);\n        this.showedErrorMessage = true;\n      }\n  }\n  setCustomDateRange(getStartDate) {\n    if (this.maxSelectableDays != null && this.maxSelectableDays >= this.numberOfCustomDays) {\n      return getStartDate ? moment(`${this.customDate.start}`) : moment(`${this.customDate.end}`);\n    } else {\n      return getStartDate ? 'moment().subtract(24, \"hours\")' : 'moment()';\n    }\n  }\n\n  setCustomTimeRange(getStartTime) {\n    let time = { hours: '', minutes: '' };\n\n    if (this.maxSelectableDays != null && this.maxSelectableDays >= this.numberOfCustomDays) {\n      time.hours = getStartTime ? moment(`${this.customDate.start}`).hours() : moment(`${this.customDate.end}`).hours();\n      time.minutes = getStartTime ? moment(`${this.customDate.start}`).minutes() : moment(`${this.customDate.end}`).minutes();\n\n    } else {\n      time.hours = getStartTime ? 'moment().subtract(24, \"hours\").hours()' : 'moment().hours()';\n      time.minutes = getStartTime ? 'moment().subtract(24, \"hours\").minutes()' : 'moment().hours()';\n    }\n    return time;\n  }\n\n  setNewCustomValuesToDateSelection() {\n    this.customDate = window.localStorage.getItem('CustomDate');\n    if (this.customDate != null) {\n      this.customDate = JSON.parse(this.customDate);\n      this.numberOfCustomDays = moment(`${this.customDate.end}`).diff(moment(`${this.customDate.start}`), 'days');\n    }\n\n    let inList = false;\n    if (this._settings[0]?.presets != null) {\n      this._settings[0].presets.forEach((item, index) => {\n        if (item.title === this.LdTranslate('modules.datepicker.presets.predefined.custom')) {\n          this._settings[0].presets[index] = this.setCustomButton();\n          inList = true;\n        }\n      });\n      if (!inList) {\n        this._settings[0].presets.push(this.setCustomButton());\n      }\n    }\n  }\n\n  setCustomButton() {\n    const result = {\n      title: this.LdTranslate('modules.datepicker.presets.predefined.custom'),\n      calc: {\n        startDay: this.setCustomDateRange(true),\n        endDay: this.setCustomDateRange(false),\n        startTime: {\n          hours: this.setCustomTimeRange(true).hours,\n          minutes: this.setCustomTimeRange(true).minutes,\n        },\n        endTime: {\n          hours: this.setCustomTimeRange(false).hours,\n          minutes: this.setCustomTimeRange(false).minutes,\n        },\n      },\n    };\n    return result;\n  }\n}\n\ncustomElements.define('ld-datepicker-config', LdDatepickerConfig);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdFormStyles = css`\n  :host {\n    display: block;\n  }\n\n  /**\n   * -----------------------------------------------------------------------------------------------------------\n   * FORM STYLING\n   * -----------------------------------------------------------------------------------------------------------\n   **/\n\n  .outer-container {\n    background-color: var(--platform-form-empty-container, ${unsafeCSS(_THEME.colors.primary_background_color)});\n    padding: 25px;\n  }\n  .inner-container {\n      margin:0 auto;\n      width:28em;\n    }\n\n  paper-toggle-button.red {\n    --paper-toggle-button-checked-bar-color:  ${unsafeCSS(_THEME.colors.primary_color)};\n    --paper-toggle-button-checked-button-color:  ${unsafeCSS(_THEME.colors.primary_color)};\n    --paper-toggle-button-checked-ink-color: ${unsafeCSS(_THEME.colors.primary_color)};\n  }\n\n    .search {\n        margin-bottom: 20px;\n        margin-top: 30px;\n    }\n  @media only screen and (min-width: 600px ) {\n    .inner-container {\n      margin:0 auto;\n      width:28em;\n    }\n  }\n  @media only screen and (min-width: 1260px ) {\n    .inner-container {\n      margin:0 auto;\n      width:50em;\n    }\n  }\n\n  .align-center {\n    text-align:center;\n  }\n\n  paper-dropdown-menu {\n    width: 100%;\n  }\n\n  paper-listbox {\n    width: 100%;\n  }\n\n  paper-input, paper-dropdown-menu {\n    margin-bottom: 10px;\n  }\n\n  iron-icon {\n    color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n  }\n\n  .dropdown-content {\n    color: var(--platform-frame-dropdown-content-color, ${unsafeCSS(_THEME.colors.secondary_text_color)});\n    min-width: 400px !important;\n  }\n  \n  paper-item:hover {\n    background-color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n    cursor: pointer;\n  }\n \n    ld-datepicker-config {\n     width: 100%;\n    padding: 25px 0px 25px 0px;\n    color: black;\n  }\n\n`;\n\nexport default LdFormStyles;\n","/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {trendFormatter, _fallbackFormatter} from \"./TableCSVExporter/formatters\"\n\nexport class TableCSVExporter {\n\n  static cellFormatters = new Map([\n    [\"trend\", trendFormatter],\n    [\"_fallbackFormatter\", _fallbackFormatter]\n  ])\n\n  // --------------------------------------------------------------------------------------\n  constructor(rows, columns, filters = [], sorters = []) {\n    this.rows = rows;\n    this.columns = columns;\n    this.filters = filters;\n    this.sorters = sorters;\n  }\n\n  // --------------------------------------------------------------------------------------\n  convertToCSV() {\n    const lines = [];\n    const filteredRows = this.filterRows();\n    const sortedRows = this.sortRows(filteredRows);\n\n    lines.push(TableCSVExporter.parseHeader(this.columns));\n\n    for (const row of sortedRows) {\n      let line = '';\n\n      for (let i = 0; i < this.columns.length ; i++) {\n        line += TableCSVExporter.parseCell(row, this.columns[i]);\n        line += (i !== (this.columns.length - 1)) ? ';' : '';\n      }\n      lines.push(line);\n    }\n\n    return lines.join('\\n');\n  }\n\n  // ---------------------------------------------------------------------------\n  filterRows() {\n    if (!this.filters) return this.rows;\n\n    let filteredRows = this.rows;\n    \n    for (const filter of this.filters) {\n      filteredRows = filteredRows.filter((row) => {\n        const rowValue = row[filter.field];\n        const typeOfValue = this.getTypeOfValue(rowValue);\n        const parsedFilterValue = this.parseFilterValue(\n          filter.value, \n          typeOfValue\n        );\n        if (typeOfValue === \"number\") return rowValue === (parsedFilterValue)\n        else return rowValue.includes(parsedFilterValue);\n      })\n    }\n    return filteredRows;\n  }\n  \n  // ---------------------------------------------------------------------------\n  sortRows(rows) {\n    let sortedRows = rows;\n    if (this.sorters.length === 0) return sortedRows;\n\n    const sorter = this.sorters[0];\n\n    sortedRows.sort((aRow, bRow) => {\n      const aRowValue = aRow[sorter.field];\n      const bRowValue = bRow[sorter.field];\n\n      if (sorter.direction === \"asc\") return aRowValue-bRowValue\n      if (sorter.direction === \"desc\") return bRowValue-aRowValue\n\n    })\n    return sortedRows\n  }\n\n  // ---------------------------------------------------------------------------\n  parseFilterValue(value, type) {\n    if (type === \"number\") return parseInt(value);\n    if (type === \"string\") return value;\n    else return value;\n  }\n\n  // ---------------------------------------------------------------------------\n  getTypeOfValue(value) {\n    if (this.isNumber(value)) return \"number\";\n    else return \"string\"\n  }\n\n  // --------------------------------------------------------------------------------------\n  static parseCell(row, column) {\n    let parsedValue;\n    const columnId = column.id;\n    if ((column.id).indexOf('-') != -1) {\n      parsedValue = row[column.id];\n    } else {\n      parsedValue = eval(\"row.\" + column.id);\n    }\n\n    if(parsedValue === undefined || parsedValue == null) {\n      return this.formatCellContent(columnId, \"\")\n    }\n\n    return this.formatCellContent(columnId, parsedValue);\n  }\n\n  // --------------------------------------------------------------------------------------\n  static parseHeader(columns) {\n    let line = '';\n    for (let i = 0; i < columns.length ; i++) {\n      line += columns[i].title\n      line += (i !== (columns.length - 1)) ? ';' : '';\n    }\n\n    return line;\n  }\n\n  // --------------------------------------------------------------------------------------\n  static formatCellContent(columnId, parsedValue) {\n\n    let formatter;\n    formatter = TableCSVExporter.cellFormatters.get(columnId);\n    if (!formatter) formatter = TableCSVExporter.cellFormatters.get(\"_fallbackFormatter\")\n\n    const formattedValue = formatter(parsedValue);\n\n    return formattedValue;\n\n  }\n\n  // ---------------------------------------------------------------------------\n  isNumber(candidate) {\n    return typeof candidate === \"number\" && !Number.isNaN(candidate);\n  }\n\n}\n\n","export const trendFormatter = (value) => {\n  // value.values is an array and only the first element is interesting to us.\n  // this is lit value. So this might break in future versions.\n  const [trendDirectionValue,,] = value.values;\n  return `\"${trendDirectionValue}\"`;\n}\n\nexport const _fallbackFormatter = (value) => {\n  if (typeof value === 'string') {\n    // Replace all double quotes with two double quotes\n    value = value.replace(/\\n/g, '');\n    value = value.replace(/\"/g, `\"\"`);\n    value = value.trim();\n  }\n\n  // If value contains comma, new-line or double-quote, enclose in double quotes\n  value = /[\",\\n]/.test(value) ? `\"${value}\"` : value;\n  return value;\n}","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { animationFrame, microTask } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { ColumnBaseMixin } from './vaadin-grid-column.js';\nimport { updateColumnOrders } from './vaadin-grid-helpers.js';\n\n/**\n * A `<vaadin-grid-column-group>` is used to make groups of columns in `<vaadin-grid>` and\n * to configure additional headers and footers.\n *\n * Groups can be nested to create complex header and footer configurations.\n *\n * #### Example:\n * ```html\n * <vaadin-grid-column-group resizable id=\"columnGroup\">\n *   <vaadin-grid-column id=\"column1\"></vaadin-grid-column>\n *   <vaadin-grid-column id=\"column2\"></vaadin-grid-column>\n * </vaadin-grid-column-group>\n * ```\n *\n * ```js\n * const columnGroup = document.querySelector('#columnGroup');\n * columnGroup.headerRenderer = (root, columnGroup) => {\n *   root.textContent = 'header';\n * }\n *\n * const column1 = document.querySelector('#column1');\n * column1.headerRenderer = (root, column) => { ... };\n * column1.renderer = (root, column, model) => { ... };\n *\n * const column2 = document.querySelector('#column2');\n * column2.headerRenderer = (root, column) => { ... };\n * column2.renderer = (root, column, model) => { ... };\n * ```\n *\n * @extends HTMLElement\n * @mixes ColumnBaseMixin\n */\nclass GridColumnGroup extends ColumnBaseMixin(PolymerElement) {\n  static get is() {\n    return 'vaadin-grid-column-group';\n  }\n\n  static get properties() {\n    return {\n      /** @private */\n      _childColumns: {\n        value() {\n          return this._getChildColumns(this);\n        },\n      },\n\n      /**\n       * Flex grow ratio for the column group as the sum of the ratios of its child columns.\n       * @attr {number} flex-grow\n       */\n      flexGrow: {\n        type: Number,\n        readOnly: true,\n      },\n\n      /**\n       * Width of the column group as the sum of the widths of its child columns.\n       */\n      width: {\n        type: String,\n        readOnly: true,\n      },\n\n      /** @private */\n      _visibleChildColumns: Array,\n\n      /** @private */\n      _colSpan: Number,\n\n      /** @private */\n      _rootColumns: Array,\n    };\n  }\n\n  static get observers() {\n    return [\n      '_groupFrozenChanged(frozen, _rootColumns)',\n      '_groupFrozenToEndChanged(frozenToEnd, _rootColumns)',\n      '_groupHiddenChanged(hidden)',\n      '_colSpanChanged(_colSpan, _headerCell, _footerCell)',\n      '_groupOrderChanged(_order, _rootColumns)',\n      '_groupReorderStatusChanged(_reorderStatus, _rootColumns)',\n      '_groupResizableChanged(resizable, _rootColumns)',\n    ];\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n    this._addNodeObserver();\n    this._updateFlexAndWidth();\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    if (this._observer) {\n      this._observer.disconnect();\n    }\n  }\n\n  /**\n   * @param {string} path\n   * @param {unknown=} value\n   * @protected\n   */\n  _columnPropChanged(path, value) {\n    if (path === 'hidden') {\n      // Prevent synchronization of the hidden state to child columns.\n      // If the group is currently auto-hidden, and one column is made visible,\n      // we don't want the other columns to become visible as well.\n      this._preventHiddenSynchronization = true;\n      this._updateVisibleChildColumns(this._childColumns);\n      this._preventHiddenSynchronization = false;\n    }\n\n    if (/flexGrow|width|hidden|_childColumns/.test(path)) {\n      this._updateFlexAndWidth();\n    }\n\n    if (path === 'frozen') {\n      // Don’t unfreeze the frozen group because of a non-frozen child\n      this.frozen = this.frozen || value;\n    }\n\n    if (path === 'lastFrozen') {\n      // Don’t unfreeze the frozen group because of a non-frozen child\n      this._lastFrozen = this._lastFrozen || value;\n    }\n\n    if (path === 'frozenToEnd') {\n      // Don’t unfreeze the frozen group because of a non-frozen child\n      this.frozenToEnd = this.frozenToEnd || value;\n    }\n\n    if (path === 'firstFrozenToEnd') {\n      // Don’t unfreeze the frozen group because of a non-frozen child\n      this._firstFrozenToEnd = this._firstFrozenToEnd || value;\n    }\n  }\n\n  /** @private */\n  _groupOrderChanged(order, rootColumns) {\n    if (rootColumns) {\n      const _rootColumns = rootColumns.slice(0);\n\n      if (!order) {\n        _rootColumns.forEach((column) => {\n          column._order = 0;\n        });\n        return;\n      }\n      // The parent column order number cascades downwards to it's children\n      // so that the resulting order numbering constructs as follows:\n      // [             1000              ]\n      // [     1100    ] | [     1200    ]\n      // [1110] | [1120] | [1210] | [1220]\n\n      // Trailing zeros are counted so we know the level on which we're working on.\n      const trailingZeros = /(0+)$/.exec(order).pop().length;\n\n      // In an unlikely situation where a group has more than 9 child columns,\n      // the child scope must have 1 digit less...\n      // Log^a_b = Ln(a)/Ln(b)\n      // Number of digits of a number is equal to floor(Log(number)_10) + 1\n      const childCountDigits = ~~(Math.log(rootColumns.length) / Math.LN10) + 1;\n\n      // Final scope for the child columns needs to mind both factors.\n      const scope = 10 ** (trailingZeros - childCountDigits);\n\n      if (_rootColumns[0] && _rootColumns[0]._order) {\n        _rootColumns.sort((a, b) => a._order - b._order);\n      }\n      updateColumnOrders(_rootColumns, scope, order);\n    }\n  }\n\n  /** @private */\n  _groupReorderStatusChanged(reorderStatus, rootColumns) {\n    if (reorderStatus === undefined || rootColumns === undefined) {\n      return;\n    }\n\n    rootColumns.forEach((column) => {\n      column._reorderStatus = reorderStatus;\n    });\n  }\n\n  /** @private */\n  _groupResizableChanged(resizable, rootColumns) {\n    if (resizable === undefined || rootColumns === undefined) {\n      return;\n    }\n\n    rootColumns.forEach((column) => {\n      column.resizable = resizable;\n    });\n  }\n\n  /** @private */\n  _updateVisibleChildColumns(childColumns) {\n    this._visibleChildColumns = Array.prototype.filter.call(childColumns, (col) => !col.hidden);\n    this._colSpan = this._visibleChildColumns.length;\n    this._updateAutoHidden();\n  }\n\n  /** @protected */\n  _updateFlexAndWidth() {\n    if (!this._visibleChildColumns) {\n      return;\n    }\n\n    if (this._visibleChildColumns.length > 0) {\n      const width = this._visibleChildColumns\n        .reduce((prev, curr) => {\n          prev += ` + ${(curr.width || '0px').replace('calc', '')}`;\n          return prev;\n        }, '')\n        .substring(3);\n      this._setWidth(`calc(${width})`);\n    } else {\n      this._setWidth('0px');\n    }\n\n    this._setFlexGrow(Array.prototype.reduce.call(this._visibleChildColumns, (prev, curr) => prev + curr.flexGrow, 0));\n  }\n\n  /**\n   * This method is called before the group's frozen value is being propagated to the child columns.\n   * In case some of the child columns are frozen, while others are not, the non-frozen ones\n   * will get automatically frozen as well. As this may sometimes be unintended, this method\n   * shows a warning in the console in such cases.\n   * @private\n   */\n  __scheduleAutoFreezeWarning(columns, frozenProp) {\n    if (this._grid) {\n      // Derive the attribute name from the property name\n      const frozenAttr = frozenProp.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n      // Check if all the columns have the same frozen value\n      const firstColumnFrozen = columns[0][frozenProp] || columns[0].hasAttribute(frozenAttr);\n      const allSameFrozen = columns.every((column) => {\n        return (column[frozenProp] || column.hasAttribute(frozenAttr)) === firstColumnFrozen;\n      });\n\n      if (!allSameFrozen) {\n        // Some of the child columns are frozen, some are not. Show a warning.\n        this._grid.__autoFreezeWarningDebouncer = Debouncer.debounce(\n          this._grid.__autoFreezeWarningDebouncer,\n          animationFrame,\n          () => {\n            console.warn(\n              `WARNING: Joining ${frozenProp} and non-${frozenProp} Grid columns inside the same column group! ` +\n                `This will automatically freeze all the joined columns to avoid rendering issues. ` +\n                `If this was intentional, consider marking each joined column explicitly as ${frozenProp}. ` +\n                `Otherwise, exclude the ${frozenProp} columns from the joined group.`,\n            );\n          },\n        );\n      }\n    }\n  }\n\n  /** @private */\n  _groupFrozenChanged(frozen, rootColumns) {\n    if (rootColumns === undefined || frozen === undefined) {\n      return;\n    }\n\n    // Don’t propagate the default `false` value.\n    if (frozen !== false) {\n      this.__scheduleAutoFreezeWarning(rootColumns, 'frozen');\n\n      Array.from(rootColumns).forEach((col) => {\n        col.frozen = frozen;\n      });\n    }\n  }\n\n  /** @private */\n  _groupFrozenToEndChanged(frozenToEnd, rootColumns) {\n    if (rootColumns === undefined || frozenToEnd === undefined) {\n      return;\n    }\n\n    // Don’t propagate the default `false` value.\n    if (frozenToEnd !== false) {\n      this.__scheduleAutoFreezeWarning(rootColumns, 'frozenToEnd');\n\n      Array.from(rootColumns).forEach((col) => {\n        col.frozenToEnd = frozenToEnd;\n      });\n    }\n  }\n\n  /** @private */\n  _groupHiddenChanged(hidden) {\n    // When initializing the hidden property, only sync hidden state to columns\n    // if group is actually hidden. Otherwise, we could override a hidden column\n    // to be visible.\n    // We always want to run this though if the property is actually changed.\n    if (hidden || this.__groupHiddenInitialized) {\n      this._synchronizeHidden();\n    }\n    this.__groupHiddenInitialized = true;\n  }\n\n  /** @private */\n  _updateAutoHidden() {\n    const wasAutoHidden = this._autoHidden;\n    this._autoHidden = (this._visibleChildColumns || []).length === 0;\n    // Only modify hidden state if group was auto-hidden, or becomes auto-hidden\n    if (wasAutoHidden || this._autoHidden) {\n      this.hidden = this._autoHidden;\n    }\n  }\n\n  /** @private */\n  _synchronizeHidden() {\n    if (this._childColumns && !this._preventHiddenSynchronization) {\n      this._childColumns.forEach((column) => {\n        column.hidden = this.hidden;\n      });\n    }\n  }\n\n  /** @private */\n  _colSpanChanged(colSpan, headerCell, footerCell) {\n    if (headerCell) {\n      headerCell.setAttribute('colspan', colSpan);\n      if (this._grid) {\n        this._grid._a11yUpdateCellColspan(headerCell, colSpan);\n      }\n    }\n    if (footerCell) {\n      footerCell.setAttribute('colspan', colSpan);\n      if (this._grid) {\n        this._grid._a11yUpdateCellColspan(footerCell, colSpan);\n      }\n    }\n  }\n\n  /**\n   * @param {!GridColumnGroup} el\n   * @return {!Array<!GridColumn>}\n   * @protected\n   */\n  _getChildColumns(el) {\n    return FlattenedNodesObserver.getFlattenedNodes(el).filter(this._isColumnElement);\n  }\n\n  /** @private */\n  _addNodeObserver() {\n    this._observer = new FlattenedNodesObserver(this, (info) => {\n      if (\n        info.addedNodes.filter(this._isColumnElement).length > 0 ||\n        info.removedNodes.filter(this._isColumnElement).length > 0\n      ) {\n        // Prevent synchronization of the hidden state to child columns.\n        // If the group is currently auto-hidden, and a visible column is added,\n        // we don't want the other columns to become visible as well.\n        this._preventHiddenSynchronization = true;\n        this._rootColumns = this._getChildColumns(this);\n        this._childColumns = this._rootColumns;\n        this._updateVisibleChildColumns(this._childColumns);\n        this._preventHiddenSynchronization = false;\n\n        // Update the column tree with microtask timing to avoid shady style scope issues\n        microTask.run(() => {\n          if (this._grid && this._grid._updateColumnTree) {\n            this._grid._updateColumnTree();\n          }\n        });\n      }\n    });\n    this._observer.flush();\n  }\n\n  /**\n   * @param {!Node} node\n   * @return {boolean}\n   * @protected\n   */\n  _isColumnElement(node) {\n    return node.nodeType === Node.ELEMENT_NODE && /\\bcolumn\\b/.test(node.localName);\n  }\n}\n\ncustomElements.define(GridColumnGroup.is, GridColumnGroup);\n\nexport { GridColumnGroup };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/sizing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-input-container',\n  css`\n    :host {\n      border-radius: var(--lumo-border-radius-m);\n      background-color: var(--lumo-contrast-10pct);\n      padding: 0 calc(0.375em + var(--lumo-border-radius-m) / 4 - 1px);\n      font-weight: 500;\n      line-height: 1;\n      position: relative;\n      cursor: text;\n      box-sizing: border-box;\n    }\n\n    /* Used for hover and activation effects */\n    :host::after {\n      content: '';\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      border-radius: inherit;\n      pointer-events: none;\n      background-color: var(--lumo-contrast-50pct);\n      opacity: 0;\n      transition: transform 0.15s, opacity 0.2s;\n      transform-origin: 100% 0;\n    }\n\n    ::slotted(:not([slot$='fix'])) {\n      cursor: inherit;\n      min-height: var(--lumo-text-field-size, var(--lumo-size-m));\n      padding: 0 0.25em;\n      --_lumo-text-field-overflow-mask-image: linear-gradient(to left, transparent, #000 1.25em);\n      -webkit-mask-image: var(--_lumo-text-field-overflow-mask-image);\n      mask-image: var(--_lumo-text-field-overflow-mask-image);\n    }\n\n    /* Read-only */\n    :host([readonly]) {\n      color: var(--lumo-secondary-text-color);\n      background-color: transparent;\n      cursor: default;\n    }\n\n    :host([readonly])::after {\n      background-color: transparent;\n      opacity: 1;\n      border: 1px dashed var(--lumo-contrast-30pct);\n    }\n\n    /* Disabled */\n    :host([disabled]) {\n      background-color: var(--lumo-contrast-5pct);\n    }\n\n    :host([disabled]) ::slotted(*) {\n      color: var(--lumo-disabled-text-color);\n      -webkit-text-fill-color: var(--lumo-disabled-text-color);\n    }\n\n    /* Invalid */\n    :host([invalid]) {\n      background-color: var(--lumo-error-color-10pct);\n    }\n\n    :host([invalid])::after {\n      background-color: var(--lumo-error-color-50pct);\n    }\n\n    /* Slotted icons */\n    ::slotted(iron-icon),\n    ::slotted(vaadin-icon) {\n      color: var(--lumo-contrast-60pct);\n      width: var(--lumo-icon-size-m);\n      height: var(--lumo-icon-size-m);\n    }\n\n    /* Vaadin icons are based on a 16x16 grid (unlike Lumo and Material icons with 24x24), so they look too big by default */\n    ::slotted(iron-icon[icon^='vaadin:']),\n    ::slotted(vaadin-icon[icon^='vaadin:']) {\n      padding: 0.25em;\n      box-sizing: border-box !important;\n    }\n\n    /* Text align */\n    :host([dir='rtl']) ::slotted(:not([slot$='fix'])) {\n      --_lumo-text-field-overflow-mask-image: linear-gradient(to right, transparent, #000 1.25em);\n    }\n\n    @-moz-document url-prefix() {\n      :host([dir='rtl']) ::slotted(:not([slot$='fix'])) {\n        mask-image: var(--_lumo-text-field-overflow-mask-image);\n      }\n    }\n\n    :host([theme~='align-left']) ::slotted(:not([slot$='fix'])) {\n      text-align: start;\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    :host([theme~='align-center']) ::slotted(:not([slot$='fix'])) {\n      text-align: center;\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    :host([theme~='align-right']) ::slotted(:not([slot$='fix'])) {\n      text-align: end;\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    @-moz-document url-prefix() {\n      /* Firefox is smart enough to align overflowing text to right */\n      :host([theme~='align-right']) ::slotted(:not([slot$='fix'])) {\n        --_lumo-text-field-overflow-mask-image: linear-gradient(to right, transparent 0.25em, #000 1.5em);\n      }\n    }\n\n    @-moz-document url-prefix() {\n      /* Firefox is smart enough to align overflowing text to right */\n      :host([theme~='align-left']) ::slotted(:not([slot$='fix'])) {\n        --_lumo-text-field-overflow-mask-image: linear-gradient(to left, transparent 0.25em, #000 1.5em);\n      }\n    }\n\n    /* RTL specific styles */\n    :host([dir='rtl'])::after {\n      transform-origin: 0% 0;\n    }\n\n    :host([theme~='align-left'][dir='rtl']) ::slotted(:not([slot$='fix'])) {\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    :host([theme~='align-center'][dir='rtl']) ::slotted(:not([slot$='fix'])) {\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    :host([theme~='align-right'][dir='rtl']) ::slotted(:not([slot$='fix'])) {\n      --_lumo-text-field-overflow-mask-image: none;\n    }\n\n    @-moz-document url-prefix() {\n      /* Firefox is smart enough to align overflowing text to right */\n      :host([theme~='align-right'][dir='rtl']) ::slotted(:not([slot$='fix'])) {\n        --_lumo-text-field-overflow-mask-image: linear-gradient(to right, transparent 0.25em, #000 1.5em);\n      }\n    }\n\n    @-moz-document url-prefix() {\n      /* Firefox is smart enough to align overflowing text to right */\n      :host([theme~='align-left'][dir='rtl']) ::slotted(:not([slot$='fix'])) {\n        --_lumo-text-field-overflow-mask-image: linear-gradient(to left, transparent 0.25em, #000 1.5em);\n      }\n    }\n  `,\n  { moduleId: 'lumo-input-container' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nexport class InputContainer extends ThemableMixin(DirMixin(PolymerElement)) {\n  static get is() {\n    return 'vaadin-input-container';\n  }\n\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: flex;\n          align-items: center;\n          flex: 0 1 auto;\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n\n        /* Reset the native input styles */\n        ::slotted(input) {\n          -webkit-appearance: none;\n          -moz-appearance: none;\n          flex: auto;\n          white-space: nowrap;\n          overflow: hidden;\n          width: 100%;\n          height: 100%;\n          outline: none;\n          margin: 0;\n          padding: 0;\n          border: 0;\n          border-radius: 0;\n          min-width: 0;\n          font: inherit;\n          line-height: normal;\n          color: inherit;\n          background-color: transparent;\n          /* Disable default invalid style in Firefox */\n          box-shadow: none;\n        }\n\n        ::slotted(*) {\n          flex: none;\n        }\n\n        ::slotted(:is(input, textarea))::placeholder {\n          /* Use ::slotted(input:placeholder-shown) in themes to style the placeholder. */\n          /* because ::slotted(...)::placeholder does not work in Safari. */\n          font: inherit;\n          color: inherit;\n          /* Override default opacity in Firefox */\n          opacity: 1;\n        }\n      </style>\n      <slot name=\"prefix\"></slot>\n      <slot></slot>\n      <slot name=\"suffix\"></slot>\n    `;\n  }\n\n  static get properties() {\n    return {\n      /**\n       * If true, the user cannot interact with this element.\n       */\n      disabled: {\n        type: Boolean,\n        reflectToAttribute: true,\n      },\n\n      /**\n       * Set to true to make this element read-only.\n       */\n      readonly: {\n        type: Boolean,\n        reflectToAttribute: true,\n      },\n\n      /**\n       * Set to true when the element is invalid.\n       */\n      invalid: {\n        type: Boolean,\n        reflectToAttribute: true,\n      },\n    };\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.addEventListener('pointerdown', (event) => {\n      if (event.target === this) {\n        // Prevent direct clicks to the input container from blurring the input\n        event.preventDefault();\n      }\n    });\n\n    this.addEventListener('click', (event) => {\n      if (event.target === this) {\n        // The vaadin-input-container element was directly clicked,\n        // focus any focusable child element from the default slot\n        this.shadowRoot\n          .querySelector('slot:not([name])')\n          .assignedNodes({ flatten: true })\n          .forEach((node) => node.focus && node.focus());\n      }\n    });\n  }\n}\n\ncustomElements.define(InputContainer.is, InputContainer);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../color.js';\nimport '../font-icons.js';\nimport '../sizing.js';\nimport '../style.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst fieldButton = css`\n  [part$='button'] {\n    flex: none;\n    width: 1em;\n    height: 1em;\n    line-height: 1;\n    font-size: var(--lumo-icon-size-m);\n    text-align: center;\n    color: var(--lumo-contrast-60pct);\n    transition: 0.2s color;\n    cursor: var(--lumo-clickable-cursor);\n  }\n\n  [part$='button']:hover {\n    color: var(--lumo-contrast-90pct);\n  }\n\n  :host([disabled]) [part$='button'],\n  :host([readonly]) [part$='button'] {\n    color: var(--lumo-contrast-20pct);\n    cursor: default;\n  }\n\n  [part$='button']::before {\n    font-family: 'lumo-icons';\n    display: block;\n  }\n`;\nregisterStyles('', fieldButton, { moduleId: 'lumo-field-button' });\n\nexport { fieldButton };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../color.js';\nimport '../sizing.js';\nimport '../style.js';\nimport '../typography.js';\nimport { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nexport const helper = css`\n  :host([has-helper]) [part='helper-text']::before {\n    content: '';\n    display: block;\n    height: 0.4em;\n  }\n\n  [part='helper-text'] {\n    display: block;\n    color: var(--lumo-secondary-text-color);\n    font-size: var(--lumo-font-size-xs);\n    line-height: var(--lumo-line-height-xs);\n    margin-left: calc(var(--lumo-border-radius-m) / 4);\n    transition: color 0.2s;\n  }\n\n  :host(:hover:not([readonly])) [part='helper-text'] {\n    color: var(--lumo-body-text-color);\n  }\n\n  :host([disabled]) [part='helper-text'] {\n    color: var(--lumo-disabled-text-color);\n    -webkit-text-fill-color: var(--lumo-disabled-text-color);\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='helper-text']::before {\n    display: none;\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='helper-text']::after {\n    content: '';\n    display: block;\n    height: 0.4em;\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='label'] {\n    order: 0;\n    padding-bottom: 0.4em;\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='helper-text'] {\n    order: 1;\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='label'] + * {\n    order: 2;\n  }\n\n  :host([has-helper][theme~='helper-above-field']) [part='error-message'] {\n    order: 3;\n  }\n`;\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../color.js';\nimport '../spacing.js';\nimport '../style.js';\nimport '../typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst requiredField = css`\n  [part='label'] {\n    align-self: flex-start;\n    color: var(--lumo-secondary-text-color);\n    font-weight: 500;\n    font-size: var(--lumo-font-size-s);\n    margin-left: calc(var(--lumo-border-radius-m) / 4);\n    transition: color 0.2s;\n    line-height: 1;\n    padding-right: 1em;\n    padding-bottom: 0.5em;\n    /* As a workaround for diacritics being cut off, add a top padding and a \n    negative margin to compensate */\n    padding-top: 0.25em;\n    margin-top: -0.25em;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    position: relative;\n    max-width: 100%;\n    box-sizing: border-box;\n  }\n\n  :host([has-label])::before {\n    margin-top: calc(var(--lumo-font-size-s) * 1.5);\n  }\n\n  :host([has-label][theme~='small'])::before {\n    margin-top: calc(var(--lumo-font-size-xs) * 1.5);\n  }\n\n  :host([has-label]) {\n    padding-top: var(--lumo-space-m);\n  }\n\n  :host([has-label]) ::slotted([slot='tooltip']) {\n    --vaadin-tooltip-offset-bottom: calc((var(--lumo-space-m) - var(--lumo-space-xs)) * -1);\n  }\n\n  :host([required]) [part='required-indicator']::after {\n    content: var(--lumo-required-field-indicator, '•');\n    transition: opacity 0.2s;\n    color: var(--lumo-required-field-indicator-color, var(--lumo-primary-text-color));\n    position: absolute;\n    right: 0;\n    width: 1em;\n    text-align: center;\n  }\n\n  :host([invalid]) [part='required-indicator']::after {\n    color: var(--lumo-required-field-indicator-color, var(--lumo-error-text-color));\n  }\n\n  [part='error-message'] {\n    margin-left: calc(var(--lumo-border-radius-m) / 4);\n    font-size: var(--lumo-font-size-xs);\n    line-height: var(--lumo-line-height-xs);\n    color: var(--lumo-error-text-color);\n    will-change: max-height;\n    transition: 0.4s max-height;\n    max-height: 5em;\n  }\n\n  :host([has-error-message]) [part='error-message']::before,\n  :host([has-error-message]) [part='error-message']::after {\n    content: '';\n    display: block;\n    height: 0.4em;\n  }\n\n  :host(:not([invalid])) [part='error-message'] {\n    max-height: 0;\n    overflow: hidden;\n  }\n\n  /* RTL specific styles */\n\n  :host([dir='rtl']) [part='label'] {\n    margin-left: 0;\n    margin-right: calc(var(--lumo-border-radius-m) / 4);\n  }\n\n  :host([dir='rtl']) [part='label'] {\n    padding-left: 1em;\n    padding-right: 0;\n  }\n\n  :host([dir='rtl']) [part='required-indicator']::after {\n    right: auto;\n    left: 0;\n  }\n\n  :host([dir='rtl']) [part='error-message'] {\n    margin-left: 0;\n    margin-right: calc(var(--lumo-border-radius-m) / 4);\n  }\n`;\n\nregisterStyles('', requiredField, { moduleId: 'lumo-required-field' });\n\nexport { requiredField };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../color.js';\nimport '../font-icons.js';\nimport '../sizing.js';\nimport '../spacing.js';\nimport '../style.js';\nimport '../typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\nimport { fieldButton } from './field-button.js';\nimport { helper } from './helper.js';\nimport { requiredField } from './required-field.js';\n\nconst inputField = css`\n  :host {\n    --lumo-text-field-size: var(--lumo-size-m);\n    color: var(--lumo-body-text-color);\n    font-size: var(--lumo-font-size-m);\n    font-family: var(--lumo-font-family);\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-tap-highlight-color: transparent;\n    padding: var(--lumo-space-xs) 0;\n  }\n\n  :host::before {\n    height: var(--lumo-text-field-size);\n    box-sizing: border-box;\n    display: inline-flex;\n    align-items: center;\n  }\n\n  :host([focused]:not([readonly])) [part='label'] {\n    color: var(--lumo-primary-text-color);\n  }\n\n  :host([focused]) [part='input-field'] ::slotted(:is(input, textarea)) {\n    -webkit-mask-image: none;\n    mask-image: none;\n  }\n\n  ::slotted(:is(input, textarea):placeholder-shown) {\n    color: var(--lumo-secondary-text-color);\n  }\n\n  /* Hover */\n  :host(:hover:not([readonly]):not([focused])) [part='label'] {\n    color: var(--lumo-body-text-color);\n  }\n\n  :host(:hover:not([readonly]):not([focused])) [part='input-field']::after {\n    opacity: 0.1;\n  }\n\n  /* Touch device adjustment */\n  @media (pointer: coarse) {\n    :host(:hover:not([readonly]):not([focused])) [part='label'] {\n      color: var(--lumo-secondary-text-color);\n    }\n\n    :host(:hover:not([readonly]):not([focused])) [part='input-field']::after {\n      opacity: 0;\n    }\n\n    :host(:active:not([readonly]):not([focused])) [part='input-field']::after {\n      opacity: 0.2;\n    }\n  }\n\n  /* Trigger when not focusing using the keyboard */\n  :host([focused]:not([focus-ring]):not([readonly])) [part='input-field']::after {\n    transform: scaleX(0);\n    transition-duration: 0.15s, 1s;\n  }\n\n  /* Focus-ring */\n  :host([focus-ring]) [part='input-field'] {\n    box-shadow: 0 0 0 2px var(--lumo-primary-color-50pct);\n  }\n\n  /* Read-only and disabled */\n  :host(:is([readonly], [disabled])) ::slotted(:is(input, textarea):placeholder-shown) {\n    opacity: 0;\n  }\n\n  /* Disabled style */\n  :host([disabled]) {\n    pointer-events: none;\n  }\n\n  :host([disabled]) [part='label'],\n  :host([disabled]) [part='input-field'] ::slotted(*) {\n    color: var(--lumo-disabled-text-color);\n    -webkit-text-fill-color: var(--lumo-disabled-text-color);\n  }\n\n  /* Invalid style */\n  :host([invalid][focus-ring]) [part='input-field'] {\n    box-shadow: 0 0 0 2px var(--lumo-error-color-50pct);\n  }\n\n  :host([input-prevented]) [part='input-field'] {\n    animation: shake 0.15s infinite;\n  }\n\n  @keyframes shake {\n    25% {\n      transform: translateX(4px);\n    }\n    75% {\n      transform: translateX(-4px);\n    }\n  }\n\n  /* Small theme */\n  :host([theme~='small']) {\n    font-size: var(--lumo-font-size-s);\n    --lumo-text-field-size: var(--lumo-size-s);\n  }\n\n  :host([theme~='small']) [part='label'] {\n    font-size: var(--lumo-font-size-xs);\n  }\n\n  :host([theme~='small']) [part='error-message'] {\n    font-size: var(--lumo-font-size-xxs);\n  }\n\n  /* Slotted content */\n  [part='input-field'] ::slotted(:not(iron-icon):not(vaadin-icon):not(input):not(textarea)) {\n    color: var(--lumo-secondary-text-color);\n    font-weight: 400;\n  }\n\n  [part='clear-button']::before {\n    content: var(--lumo-icons-cross);\n  }\n`;\n\nconst inputFieldShared = [requiredField, fieldButton, helper, inputField];\n\nregisterStyles('', inputFieldShared, {\n  moduleId: 'lumo-input-field-shared-styles',\n});\n\nexport { inputField, inputFieldShared };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { inputFieldShared } from '@vaadin/vaadin-lumo-styles/mixins/input-field-shared.js';\nimport { registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles('vaadin-text-field', inputFieldShared, {\n  moduleId: 'lumo-text-field-styles',\n});\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { SlotController } from '@vaadin/component-base/src/slot-controller.js';\n\n/**\n * A controller that manages the error message node content.\n */\nexport class ErrorController extends SlotController {\n  constructor(host) {\n    super(\n      host,\n      'error-message',\n      () => document.createElement('div'),\n      (_host, node) => {\n        this.__updateErrorId(node);\n\n        this.__updateHasError();\n      },\n      true,\n    );\n  }\n\n  /**\n   * ID attribute value set on the error message element.\n   *\n   * @return {string}\n   */\n  get errorId() {\n    return this.node && this.node.id;\n  }\n\n  /**\n   * Set the error message element text content.\n   *\n   * @param {string} errorMessage\n   */\n  setErrorMessage(errorMessage) {\n    this.errorMessage = errorMessage;\n\n    this.__updateHasError();\n  }\n\n  /**\n   * Set invalid state for detecting whether to show error message.\n   *\n   * @param {boolean} invalid\n   */\n  setInvalid(invalid) {\n    this.invalid = invalid;\n\n    this.__updateHasError();\n  }\n\n  /**\n   * Override to initialize the newly added custom error message.\n   *\n   * @param {Node} errorNode\n   * @protected\n   * @override\n   */\n  initCustomNode(errorNode) {\n    this.__updateErrorId(errorNode);\n\n    // Save the custom error message content on the host.\n    if (errorNode.textContent && !this.errorMessage) {\n      this.errorMessage = errorNode.textContent.trim();\n    }\n\n    this.__updateHasError();\n  }\n\n  /**\n   * Override to cleanup error message node when it's removed.\n   *\n   * @param {Node} node\n   * @protected\n   * @override\n   */\n  teardownNode(node) {\n    let errorNode = this.getSlotChild();\n\n    // If custom error was removed, restore the default one.\n    if (!errorNode && node !== this.defaultNode) {\n      errorNode = this.attachDefaultNode();\n\n      // Run initializer to update default error message ID.\n      this.initNode(errorNode);\n    }\n\n    this.__updateHasError();\n  }\n\n  /**\n   * @param {string} error\n   * @private\n   */\n  __isNotEmpty(error) {\n    return Boolean(error && error.trim() !== '');\n  }\n\n  /** @private */\n  __updateHasError() {\n    const errorNode = this.node;\n    const hasError = Boolean(this.invalid && this.__isNotEmpty(this.errorMessage));\n\n    // Update both default and custom error message node.\n    if (errorNode) {\n      errorNode.textContent = hasError ? this.errorMessage : '';\n      errorNode.hidden = !hasError;\n\n      // Role alert will make the error message announce immediately\n      // as the field becomes invalid\n      if (hasError) {\n        errorNode.setAttribute('role', 'alert');\n      } else {\n        errorNode.removeAttribute('role');\n      }\n    }\n\n    this.host.toggleAttribute('has-error-message', hasError);\n  }\n\n  /**\n   * @param {HTMLElement} errorNode\n   * @private\n   */\n  __updateErrorId(errorNode) {\n    if (!errorNode.id) {\n      errorNode.id = this.defaultId;\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { addValueToAttribute, removeValueFromAttribute } from '@vaadin/component-base/src/dom-utils.js';\n\n/**\n * A controller for managing ARIA attributes for a field element:\n * either the component itself or slotted `<input>` element.\n */\nexport class FieldAriaController {\n  constructor(host) {\n    this.host = host;\n    this.__required = false;\n  }\n\n  /**\n   * Sets a target element to which ARIA attributes are added.\n   *\n   * @param {HTMLElement} target\n   */\n  setTarget(target) {\n    this.__target = target;\n    this.__setAriaRequiredAttribute(this.__required);\n    this.__setLabelIdToAriaAttribute(this.__labelId);\n    this.__setErrorIdToAriaAttribute(this.__errorId);\n    this.__setHelperIdToAriaAttribute(this.__helperId);\n  }\n\n  /**\n   * Toggles the `aria-required` attribute on the target element\n   * if the target is the host component (e.g. a field group).\n   * Otherwise, it does nothing.\n   *\n   * @param {boolean} required\n   */\n  setRequired(required) {\n    this.__setAriaRequiredAttribute(required);\n    this.__required = required;\n  }\n\n  /**\n   * Links the target element with a slotted label element\n   * via the target's attribute `aria-labelledby`.\n   *\n   * To unlink the previous slotted label element, pass `null` as `labelId`.\n   *\n   * @param {string | null} labelId\n   */\n  setLabelId(labelId) {\n    this.__setLabelIdToAriaAttribute(labelId, this.__labelId);\n    this.__labelId = labelId;\n  }\n\n  /**\n   * Links the target element with a slotted error element via the target's attribute:\n   * - `aria-labelledby` if the target is the host component (e.g a field group).\n   * - `aria-describedby` otherwise.\n   *\n   * To unlink the previous slotted error element, pass `null` as `errorId`.\n   *\n   * @param {string | null} errorId\n   */\n  setErrorId(errorId) {\n    this.__setErrorIdToAriaAttribute(errorId, this.__errorId);\n    this.__errorId = errorId;\n  }\n\n  /**\n   * Links the target element with a slotted helper element via the target's attribute:\n   * - `aria-labelledby` if the target is the host component (e.g a field group).\n   * - `aria-describedby` otherwise.\n   *\n   * To unlink the previous slotted helper element, pass `null` as `helperId`.\n   *\n   * @param {string | null} helperId\n   */\n  setHelperId(helperId) {\n    this.__setHelperIdToAriaAttribute(helperId, this.__helperId);\n    this.__helperId = helperId;\n  }\n\n  /**\n   * `true` if the target element is the host component itself, `false` otherwise.\n   *\n   * @return {boolean}\n   * @private\n   */\n  get __isGroupField() {\n    return this.__target === this.host;\n  }\n\n  /**\n   * @param {string | null | undefined} labelId\n   * @param {string | null | undefined} oldLabelId\n   * @private\n   */\n  __setLabelIdToAriaAttribute(labelId, oldLabelId) {\n    this.__setAriaAttributeId('aria-labelledby', labelId, oldLabelId);\n  }\n\n  /**\n   * @param {string | null | undefined} errorId\n   * @param {string | null | undefined} oldErrorId\n   * @private\n   */\n  __setErrorIdToAriaAttribute(errorId, oldErrorId) {\n    // For groups, add all IDs to aria-labelledby rather than aria-describedby -\n    // that should guarantee that it's announced when the group is entered.\n    if (this.__isGroupField) {\n      this.__setAriaAttributeId('aria-labelledby', errorId, oldErrorId);\n    } else {\n      this.__setAriaAttributeId('aria-describedby', errorId, oldErrorId);\n    }\n  }\n\n  /**\n   * @param {string | null | undefined} helperId\n   * @param {string | null | undefined} oldHelperId\n   * @private\n   */\n  __setHelperIdToAriaAttribute(helperId, oldHelperId) {\n    // For groups, add all IDs to aria-labelledby rather than aria-describedby -\n    // that should guarantee that it's announced when the group is entered.\n    if (this.__isGroupField) {\n      this.__setAriaAttributeId('aria-labelledby', helperId, oldHelperId);\n    } else {\n      this.__setAriaAttributeId('aria-describedby', helperId, oldHelperId);\n    }\n  }\n\n  /**\n   * @param {boolean} required\n   * @private\n   */\n  __setAriaRequiredAttribute(required) {\n    if (!this.__target) {\n      return;\n    }\n\n    if (['input', 'textarea'].includes(this.__target.localName)) {\n      // Native <input> or <textarea>, required is enough\n      return;\n    }\n\n    if (required) {\n      this.__target.setAttribute('aria-required', 'true');\n    } else {\n      this.__target.removeAttribute('aria-required');\n    }\n  }\n\n  /**\n   * @param {string | null | undefined} newId\n   * @param {string | null | undefined} oldId\n   * @private\n   */\n  __setAriaAttributeId(attr, newId, oldId) {\n    if (!this.__target) {\n      return;\n    }\n\n    if (oldId) {\n      removeValueFromAttribute(this.__target, attr, oldId);\n    }\n\n    if (newId) {\n      addValueToAttribute(this.__target, attr, newId);\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { SlotController } from '@vaadin/component-base/src/slot-controller.js';\n\n/**\n * A controller that manages the helper node content.\n */\nexport class HelperController extends SlotController {\n  constructor(host) {\n    // Do not provide slot factory, as only create helper lazily.\n    super(host, 'helper', null, null, true);\n  }\n\n  get helperId() {\n    return this.node && this.node.id;\n  }\n\n  /**\n   * Override to initialize the newly added custom helper.\n   *\n   * @param {Node} helperNode\n   * @protected\n   * @override\n   */\n  initCustomNode(helperNode) {\n    this.__updateHelperId(helperNode);\n\n    this.__observeHelper(helperNode);\n\n    const hasHelper = this.__hasHelper(helperNode);\n    this.__toggleHasHelper(hasHelper);\n  }\n\n  /**\n   * Override to cleanup helper node when it's removed.\n   *\n   * @param {Node} _node\n   * @protected\n   * @override\n   */\n  teardownNode(_node) {\n    // The observer does not exist when the default helper is removed.\n    if (this.__helperIdObserver) {\n      this.__helperIdObserver.disconnect();\n    }\n\n    const helperNode = this.getSlotChild();\n\n    // Custom node is added to helper slot\n    if (helperNode && helperNode !== this.defaultNode) {\n      const hasHelper = this.__hasHelper(helperNode);\n      this.__toggleHasHelper(hasHelper);\n    } else {\n      // Restore default helper if needed\n      this.__applyDefaultHelper(this.helperText, helperNode);\n    }\n  }\n\n  /**\n   * Set helper text based on corresponding host property.\n   * @param {string} helperText\n   */\n  setHelperText(helperText) {\n    this.helperText = helperText;\n\n    const helperNode = this.getSlotChild();\n    if (!helperNode || helperNode === this.defaultNode) {\n      this.__applyDefaultHelper(helperText, helperNode);\n    }\n  }\n\n  /**\n   * @param {HTMLElement} helperNode\n   * @return {boolean}\n   * @private\n   */\n  __hasHelper(helperNode) {\n    if (!helperNode) {\n      return false;\n    }\n\n    return (\n      helperNode.children.length > 0 ||\n      (helperNode.nodeType === Node.ELEMENT_NODE && customElements.get(helperNode.localName)) ||\n      this.__isNotEmpty(helperNode.textContent)\n    );\n  }\n\n  /**\n   * @param {string} helperText\n   * @private\n   */\n  __isNotEmpty(helperText) {\n    return helperText && helperText.trim() !== '';\n  }\n\n  /**\n   * @param {string} helperText\n   * @param {Node} helperNode\n   * @private\n   */\n  __applyDefaultHelper(helperText, helperNode) {\n    const hasHelperText = this.__isNotEmpty(helperText);\n\n    if (hasHelperText && !helperNode) {\n      // Set slot factory lazily to only create helper node when needed.\n      this.slotFactory = () => document.createElement('div');\n\n      helperNode = this.attachDefaultNode();\n\n      this.__updateHelperId(helperNode);\n      this.__observeHelper(helperNode);\n    }\n\n    if (helperNode) {\n      helperNode.textContent = helperText;\n    }\n\n    this.__toggleHasHelper(hasHelperText);\n  }\n\n  /**\n   * @param {HTMLElement} helperNode\n   * @private\n   */\n  __observeHelper(helperNode) {\n    this.__helperObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        const target = mutation.target;\n\n        // Ensure the mutation target is the currently connected helper\n        // to ignore async mutations dispatched for removed element.\n        const isHelperMutation = target === this.node;\n\n        if (mutation.type === 'attributes') {\n          // We use attributeFilter to only observe ID mutation,\n          // no need to check for attribute name separately.\n          if (isHelperMutation && target.id !== this.defaultId) {\n            this.__updateHelperId(target);\n          }\n        } else if (isHelperMutation || target.parentElement === this.node) {\n          // Update has-helper when textContent changes\n          const hasHelper = this.__hasHelper(this.node);\n          this.__toggleHasHelper(hasHelper);\n        }\n      });\n    });\n\n    // Observe changes to helper ID attribute, text content and children.\n    this.__helperObserver.observe(helperNode, {\n      attributes: true,\n      attributeFilter: ['id'],\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n  }\n\n  /**\n   * @param {boolean} hasHelper\n   * @private\n   */\n  __toggleHasHelper(hasHelper) {\n    this.host.toggleAttribute('has-helper', hasHelper);\n\n    // Make it possible for other mixins to observe change\n    this.dispatchEvent(\n      new CustomEvent('helper-changed', {\n        detail: {\n          hasHelper,\n          node: this.node,\n        },\n      }),\n    );\n  }\n\n  /**\n   * @param {HTMLElement} helperNode\n   * @private\n   */\n  __updateHelperId(helperNode) {\n    if (!helperNode.id) {\n      helperNode.id = this.defaultId;\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * A mixin to provide required state and validation logic.\n *\n * @polymerMixin\n */\nexport const ValidateMixin = dedupingMixin(\n  (superclass) =>\n    class ValidateMixinClass extends superclass {\n      static get properties() {\n        return {\n          /**\n           * Set to true when the field is invalid.\n           */\n          invalid: {\n            type: Boolean,\n            reflectToAttribute: true,\n            notify: true,\n            value: false,\n          },\n\n          /**\n           * Specifies that the user must fill in a value.\n           */\n          required: {\n            type: Boolean,\n            reflectToAttribute: true,\n          },\n        };\n      }\n\n      /**\n       * Validates the field and sets the `invalid` property based on the result.\n       *\n       * The method fires a `validated` event with the result of the validation.\n       *\n       * @return {boolean} True if the value is valid.\n       */\n      validate() {\n        const isValid = this.checkValidity();\n        this._setInvalid(!isValid);\n        this.dispatchEvent(new CustomEvent('validated', { detail: { valid: isValid } }));\n        return isValid;\n      }\n\n      /**\n       * Returns true if the field value satisfies all constraints (if any).\n       *\n       * @return {boolean}\n       */\n      checkValidity() {\n        return !this.required || !!this.value;\n      }\n\n      /**\n       * @param {boolean} invalid\n       * @protected\n       */\n      _setInvalid(invalid) {\n        if (this._shouldSetInvalid(invalid)) {\n          this.invalid = invalid;\n        }\n      }\n\n      /**\n       * Override this method to define whether the given `invalid` state should be set.\n       *\n       * @param {boolean} _invalid\n       * @return {boolean}\n       * @protected\n       */\n      _shouldSetInvalid(_invalid) {\n        return true;\n      }\n\n      /**\n       * Fired whenever the field is validated.\n       *\n       * @event validated\n       * @param {Object} detail\n       * @param {boolean} detail.valid the result of the validation.\n       */\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { ErrorController } from './error-controller.js';\nimport { FieldAriaController } from './field-aria-controller.js';\nimport { HelperController } from './helper-controller.js';\nimport { LabelMixin } from './label-mixin.js';\nimport { ValidateMixin } from './validate-mixin.js';\n\n/**\n * A mixin to provide common field logic: label, error message and helper text.\n *\n * @polymerMixin\n * @mixes ControllerMixin\n * @mixes LabelMixin\n * @mixes ValidateMixin\n */\nexport const FieldMixin = (superclass) =>\n  class FieldMixinClass extends ValidateMixin(LabelMixin(ControllerMixin(superclass))) {\n    static get properties() {\n      return {\n        /**\n         * A target element to which ARIA attributes are set.\n         * @protected\n         */\n        ariaTarget: {\n          type: Object,\n          observer: '_ariaTargetChanged',\n        },\n\n        /**\n         * Error to show when the field is invalid.\n         *\n         * @attr {string} error-message\n         */\n        errorMessage: {\n          type: String,\n          observer: '_errorMessageChanged',\n        },\n\n        /**\n         * String used for the helper text.\n         * @attr {string} helper-text\n         */\n        helperText: {\n          type: String,\n          observer: '_helperTextChanged',\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_invalidChanged(invalid)', '_requiredChanged(required)'];\n    }\n\n    /** @protected */\n    get _errorId() {\n      return this._errorController.errorId;\n    }\n\n    /**\n     * @protected\n     * @return {HTMLElement}\n     */\n    get _errorNode() {\n      return this._errorController.node;\n    }\n\n    /** @protected */\n    get _helperId() {\n      return this._helperController.helperId;\n    }\n\n    /**\n     * @protected\n     * @return {HTMLElement}\n     */\n    get _helperNode() {\n      return this._helperController.node;\n    }\n\n    constructor() {\n      super();\n\n      this._fieldAriaController = new FieldAriaController(this);\n      this._helperController = new HelperController(this);\n      this._errorController = new ErrorController(this);\n\n      this._labelController.addEventListener('label-changed', (event) => {\n        const { hasLabel, node } = event.detail;\n        this.__labelChanged(hasLabel, node);\n      });\n\n      this._helperController.addEventListener('helper-changed', (event) => {\n        const { hasHelper, node } = event.detail;\n        this.__helperChanged(hasHelper, node);\n      });\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      this.addController(this._fieldAriaController);\n      this.addController(this._helperController);\n      this.addController(this._errorController);\n    }\n\n    /** @private */\n    __helperChanged(hasHelper, helperNode) {\n      if (hasHelper) {\n        this._fieldAriaController.setHelperId(helperNode.id);\n      } else {\n        this._fieldAriaController.setHelperId(null);\n      }\n    }\n\n    /** @private */\n    __labelChanged(hasLabel, labelNode) {\n      // Label ID should be only added when the label content is present.\n      // Otherwise, it may conflict with an `aria-label` attribute possibly added by the user.\n      if (hasLabel) {\n        this._fieldAriaController.setLabelId(labelNode.id);\n      } else {\n        this._fieldAriaController.setLabelId(null);\n      }\n    }\n\n    /**\n     * @param {string | null | undefined} errorMessage\n     * @protected\n     */\n    _errorMessageChanged(errorMessage) {\n      this._errorController.setErrorMessage(errorMessage);\n    }\n\n    /**\n     * @param {string} helperText\n     * @protected\n     */\n    _helperTextChanged(helperText) {\n      this._helperController.setHelperText(helperText);\n    }\n\n    /**\n     * @param {HTMLElement | null | undefined} target\n     * @protected\n     */\n    _ariaTargetChanged(target) {\n      if (target) {\n        this._fieldAriaController.setTarget(target);\n      }\n    }\n\n    /**\n     * @param {boolean} required\n     * @protected\n     */\n    _requiredChanged(required) {\n      this._fieldAriaController.setRequired(required);\n    }\n\n    /**\n     * @param {boolean} invalid\n     * @protected\n     */\n    _invalidChanged(invalid) {\n      this._errorController.setInvalid(invalid);\n\n      // This timeout is needed to prevent NVDA from announcing the error message twice:\n      // 1. Once adding the `[role=alert]` attribute when updating `has-error-message` (OK).\n      // 2. Once linking the error ID with the ARIA target here (unwanted).\n      // Related issue: https://github.com/vaadin/web-components/issues/3061.\n      setTimeout(() => {\n        // Error message ID needs to be dynamically added / removed based on the validity\n        // Otherwise assistive technologies would announce the error, even if we hide it.\n        if (invalid) {\n          this._fieldAriaController.setErrorId(this._errorController.errorId);\n        } else {\n          this._fieldAriaController.setErrorId(null);\n        }\n      });\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\nimport { DelegateStateMixin } from './delegate-state-mixin.js';\nimport { InputMixin } from './input-mixin.js';\nimport { ValidateMixin } from './validate-mixin.js';\n\n/**\n * A mixin to combine multiple input validation constraints.\n *\n * @polymerMixin\n * @mixes DelegateStateMixin\n * @mixes InputMixin\n * @mixes ValidateMixin\n */\nexport const InputConstraintsMixin = dedupingMixin(\n  (superclass) =>\n    class InputConstraintsMixinClass extends DelegateStateMixin(ValidateMixin(InputMixin(superclass))) {\n      /**\n       * An array of attributes which participate in the input validation.\n       * Changing these attributes will cause the input to re-validate.\n       *\n       * IMPORTANT: The attributes should be properly delegated to the input element\n       * from the host using `delegateAttrs` getter (see `DelegateStateMixin`).\n       * The `required` attribute is already delegated.\n       */\n      static get constraints() {\n        return ['required'];\n      }\n\n      static get delegateAttrs() {\n        return [...super.delegateAttrs, 'required'];\n      }\n\n      /** @protected */\n      ready() {\n        super.ready();\n\n        this._createConstraintsObserver();\n      }\n\n      /**\n       * Returns true if the current input value satisfies all constraints (if any).\n       * @return {boolean}\n       */\n      checkValidity() {\n        if (this.inputElement && this._hasValidConstraints(this.constructor.constraints.map((c) => this[c]))) {\n          return this.inputElement.checkValidity();\n        }\n        return !this.invalid;\n      }\n\n      /**\n       * Returns true if some of the provided set of constraints are valid.\n       * @param {Array} constraints\n       * @return {boolean}\n       * @protected\n       */\n      _hasValidConstraints(constraints) {\n        return constraints.some((c) => this.__isValidConstraint(c));\n      }\n\n      /**\n       * Override this method to customize setting up constraints observer.\n       * @protected\n       */\n      _createConstraintsObserver() {\n        // This complex observer needs to be added dynamically instead of using `static get observers()`\n        // to make it possible to tweak this behavior in classes that apply this mixin.\n        this._createMethodObserver(`_constraintsChanged(stateTarget, ${this.constructor.constraints.join(', ')})`);\n      }\n\n      /**\n       * Override this method to implement custom validation constraints.\n       * @param {HTMLElement | undefined} stateTarget\n       * @param {unknown[]} constraints\n       * @protected\n       */\n      _constraintsChanged(stateTarget, ...constraints) {\n        // The input element's validity cannot be determined until\n        // all the necessary constraint attributes aren't set on it.\n        if (!stateTarget) {\n          return;\n        }\n\n        const hasConstraints = this._hasValidConstraints(constraints);\n        const isLastConstraintRemoved = this.__previousHasConstraints && !hasConstraints;\n\n        if ((this._hasValue || this.invalid) && hasConstraints) {\n          this.validate();\n        } else if (isLastConstraintRemoved) {\n          this._setInvalid(false);\n        }\n\n        this.__previousHasConstraints = hasConstraints;\n      }\n\n      /**\n       * Override an event listener inherited from `InputMixin`\n       * to capture native `change` event and make sure that\n       * a new one is dispatched after validation runs.\n       * @param {Event} event\n       * @protected\n       * @override\n       */\n      _onChange(event) {\n        event.stopPropagation();\n\n        this.validate();\n\n        this.dispatchEvent(\n          new CustomEvent('change', {\n            detail: {\n              sourceEvent: event,\n            },\n            bubbles: event.bubbles,\n            cancelable: event.cancelable,\n          }),\n        );\n      }\n\n      /** @private */\n      __isValidConstraint(constraint) {\n        // 0 is valid for `minlength` and `maxlength`\n        return Boolean(constraint) || constraint === 0;\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\nconst stylesMap = new WeakMap();\n\n/**\n * Get all the styles inserted into root.\n * @param {DocumentOrShadowRoot} root\n * @return {Set<string>}\n */\nfunction getRootStyles(root) {\n  if (!stylesMap.has(root)) {\n    stylesMap.set(root, new Set());\n  }\n\n  return stylesMap.get(root);\n}\n\n/**\n * Insert styles into the root.\n * @param {string} styles\n * @param {DocumentOrShadowRoot} root\n */\nfunction insertStyles(styles, root) {\n  const style = document.createElement('style');\n  style.textContent = styles;\n\n  if (root === document) {\n    document.head.appendChild(style);\n  } else {\n    root.insertBefore(style, root.firstChild);\n  }\n}\n\n/**\n * Mixin to insert styles into the outer scope to handle slotted components.\n * This is useful e.g. to hide native `<input type=\"number\">` controls.\n *\n * @polymerMixin\n */\nexport const SlotStylesMixin = dedupingMixin(\n  (superclass) =>\n    class SlotStylesMixinClass extends superclass {\n      /**\n       * List of styles to insert into root.\n       * @protected\n       */\n      get slotStyles() {\n        return {};\n      }\n\n      /** @protected */\n      connectedCallback() {\n        super.connectedCallback();\n\n        this.__applySlotStyles();\n      }\n\n      /** @private */\n      __applySlotStyles() {\n        const root = this.getRootNode();\n        const rootStyles = getRootStyles(root);\n\n        this.slotStyles.forEach((styles) => {\n          if (!rootStyles.has(styles)) {\n            insertStyles(styles, root);\n            rootStyles.add(styles);\n          }\n        });\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { isTouch } from '@vaadin/component-base/src/browser-utils.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { KeyboardMixin } from '@vaadin/component-base/src/keyboard-mixin.js';\nimport { DelegateFocusMixin } from './delegate-focus-mixin.js';\nimport { FieldMixin } from './field-mixin.js';\nimport { InputConstraintsMixin } from './input-constraints-mixin.js';\nimport { SlotStylesMixin } from './slot-styles-mixin.js';\n\n/**\n * A mixin to provide shared logic for the editable form input controls.\n *\n * @polymerMixin\n * @mixes DelegateFocusMixin\n * @mixes FieldMixin\n * @mixes InputConstraintsMixin\n * @mixes KeyboardMixin\n * @mixes SlotStylesMixin\n */\nexport const InputControlMixin = (superclass) =>\n  class InputControlMixinClass extends SlotStylesMixin(\n    DelegateFocusMixin(InputConstraintsMixin(FieldMixin(KeyboardMixin(superclass)))),\n  ) {\n    static get properties() {\n      return {\n        /**\n         * A pattern matched against individual characters the user inputs.\n         *\n         * When set, the field will prevent:\n         * - `keydown` events if the entered key doesn't match `/^allowedCharPattern$/`\n         * - `paste` events if the pasted text doesn't match `/^allowedCharPattern*$/`\n         * - `drop` events if the dropped text doesn't match `/^allowedCharPattern*$/`\n         *\n         * For example, to allow entering only numbers and minus signs, use:\n         * `allowedCharPattern = \"[\\\\d-]\"`\n         * @attr {string} allowed-char-pattern\n         */\n        allowedCharPattern: {\n          type: String,\n          observer: '_allowedCharPatternChanged',\n        },\n\n        /**\n         * If true, the input text gets fully selected when the field is focused using click or touch / tap.\n         */\n        autoselect: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * Set to true to display the clear icon which clears the input.\n         * @attr {boolean} clear-button-visible\n         */\n        clearButtonVisible: {\n          type: Boolean,\n          reflectToAttribute: true,\n          value: false,\n        },\n\n        /**\n         * The name of this field.\n         */\n        name: {\n          type: String,\n          reflectToAttribute: true,\n        },\n\n        /**\n         * A hint to the user of what can be entered in the field.\n         */\n        placeholder: {\n          type: String,\n          reflectToAttribute: true,\n        },\n\n        /**\n         * When present, it specifies that the field is read-only.\n         */\n        readonly: {\n          type: Boolean,\n          value: false,\n          reflectToAttribute: true,\n        },\n\n        /**\n         * The text usually displayed in a tooltip popup when the mouse is over the field.\n         */\n        title: {\n          type: String,\n          reflectToAttribute: true,\n        },\n      };\n    }\n\n    static get delegateAttrs() {\n      return [...super.delegateAttrs, 'name', 'type', 'placeholder', 'readonly', 'invalid', 'title'];\n    }\n\n    constructor() {\n      super();\n\n      this._boundOnPaste = this._onPaste.bind(this);\n      this._boundOnDrop = this._onDrop.bind(this);\n      this._boundOnBeforeInput = this._onBeforeInput.bind(this);\n    }\n\n    /**\n     * Any element extending this mixin is required to implement this getter.\n     * It returns the reference to the clear button element.\n     * @protected\n     * @return {Element | null | undefined}\n     */\n    get clearElement() {\n      console.warn(`Please implement the 'clearElement' property in <${this.localName}>`);\n      return null;\n    }\n\n    /** @protected */\n    get slotStyles() {\n      // Needed for Safari, where ::slotted(...)::placeholder does not work\n      return [\n        `\n          :is(input[slot='input'], textarea[slot='textarea'])::placeholder {\n            font: inherit;\n            color: inherit;\n          }\n        `,\n      ];\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      if (this.clearElement) {\n        this.clearElement.addEventListener('click', (e) => this._onClearButtonClick(e));\n        this.clearElement.addEventListener('mousedown', (e) => this._onClearButtonMouseDown(e));\n      }\n    }\n\n    /**\n     * @param {Event} event\n     * @protected\n     */\n    _onClearButtonClick(event) {\n      event.preventDefault();\n      this.__clear();\n    }\n\n    /**\n     * @param {Event} event\n     * @protected\n     */\n    _onClearButtonMouseDown(event) {\n      event.preventDefault();\n      if (!isTouch) {\n        this.inputElement.focus();\n      }\n    }\n\n    /**\n     * Override an event listener from `DelegateFocusMixin`.\n     * @param {FocusEvent} event\n     * @protected\n     * @override\n     */\n    _onFocus(event) {\n      super._onFocus(event);\n\n      if (this.autoselect && this.inputElement) {\n        this.inputElement.select();\n      }\n    }\n\n    /**\n     * Override an event listener inherited from `KeydownMixin` to clear on Esc.\n     * Components that extend this mixin can prevent this behavior by overriding\n     * this method without calling `super._onEscape` to provide custom logic.\n     * @param {KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onEscape(event) {\n      super._onEscape(event);\n\n      if (this.clearButtonVisible && !!this.value) {\n        event.stopPropagation();\n        this.__clear();\n      }\n    }\n\n    /**\n     * Override an event listener inherited from `InputMixin`\n     * to capture native `change` event and make sure that\n     * a new one is dispatched after validation runs.\n     * @param {Event} event\n     * @protected\n     * @override\n     */\n    _onChange(event) {\n      event.stopPropagation();\n\n      this.validate();\n\n      this.dispatchEvent(\n        new CustomEvent('change', {\n          detail: {\n            sourceEvent: event,\n          },\n          bubbles: event.bubbles,\n          cancelable: event.cancelable,\n        }),\n      );\n    }\n\n    /** @private */\n    __clear() {\n      this.clear();\n      this.inputElement.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n      this.inputElement.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n\n    /**\n     * Override a method from `InputMixin`.\n     * @param {!HTMLElement} input\n     * @protected\n     * @override\n     */\n    _addInputListeners(input) {\n      super._addInputListeners(input);\n\n      input.addEventListener('paste', this._boundOnPaste);\n      input.addEventListener('drop', this._boundOnDrop);\n      input.addEventListener('beforeinput', this._boundOnBeforeInput);\n    }\n\n    /**\n     * Override a method from `InputMixin`.\n     * @param {!HTMLElement} input\n     * @protected\n     * @override\n     */\n    _removeInputListeners(input) {\n      super._removeInputListeners(input);\n\n      input.removeEventListener('paste', this._boundOnPaste);\n      input.removeEventListener('drop', this._boundOnDrop);\n      input.removeEventListener('beforeinput', this._boundOnBeforeInput);\n    }\n\n    /**\n     * Override an event listener from `KeyboardMixin`.\n     * @param {!KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onKeyDown(event) {\n      super._onKeyDown(event);\n\n      if (this.allowedCharPattern && !this.__shouldAcceptKey(event)) {\n        event.preventDefault();\n        this._markInputPrevented();\n      }\n    }\n\n    /** @protected */\n    _markInputPrevented() {\n      // Add input-prevented attribute for 200ms\n      this.setAttribute('input-prevented', '');\n      this._preventInputDebouncer = Debouncer.debounce(this._preventInputDebouncer, timeOut.after(200), () => {\n        this.removeAttribute('input-prevented');\n      });\n    }\n\n    /** @private */\n    __shouldAcceptKey(event) {\n      return (\n        event.metaKey ||\n        event.ctrlKey ||\n        !event.key || // Allow typing anything if event.key is not supported\n        event.key.length !== 1 || // Allow \"Backspace\", \"ArrowLeft\" etc.\n        this.__allowedCharRegExp.test(event.key)\n      );\n    }\n\n    /** @private */\n    _onPaste(e) {\n      if (this.allowedCharPattern) {\n        const pastedText = e.clipboardData.getData('text');\n        if (!this.__allowedTextRegExp.test(pastedText)) {\n          e.preventDefault();\n          this._markInputPrevented();\n        }\n      }\n    }\n\n    /** @private */\n    _onDrop(e) {\n      if (this.allowedCharPattern) {\n        const draggedText = e.dataTransfer.getData('text');\n        if (!this.__allowedTextRegExp.test(draggedText)) {\n          e.preventDefault();\n          this._markInputPrevented();\n        }\n      }\n    }\n\n    /** @private */\n    _onBeforeInput(e) {\n      // The `beforeinput` event covers all the cases for `allowedCharPattern`: keyboard, pasting and dropping,\n      // but it is still experimental technology so we can't rely on it. It's used here just as an additional check,\n      // because it seems to be the only way to detect and prevent specific keys on mobile devices.\n      // See https://github.com/vaadin/vaadin-text-field/issues/429\n      if (this.allowedCharPattern && e.data && !this.__allowedTextRegExp.test(e.data)) {\n        e.preventDefault();\n        this._markInputPrevented();\n      }\n    }\n\n    /** @private */\n    _allowedCharPatternChanged(charPattern) {\n      if (charPattern) {\n        try {\n          this.__allowedCharRegExp = new RegExp(`^${charPattern}$`);\n          this.__allowedTextRegExp = new RegExp(`^${charPattern}*$`);\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n\n    /**\n     * Fired when the user commits a value change.\n     *\n     * @event change\n     */\n\n    /**\n     * Fired when the value is changed by the user: on every typing keystroke,\n     * and the value is cleared using the clear button.\n     *\n     * @event input\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { InputControlMixin } from './input-control-mixin.js';\n\n/**\n * A mixin to provide logic for vaadin-text-field and related components.\n *\n * @polymerMixin\n * @mixes InputControlMixin\n */\nexport const InputFieldMixin = (superclass) =>\n  class InputFieldMixinClass extends InputControlMixin(superclass) {\n    static get properties() {\n      return {\n        /**\n         * Whether the value of the control can be automatically completed by the browser.\n         * List of available options at:\n         * https://developer.mozilla.org/en/docs/Web/HTML/Element/input#attr-autocomplete\n         */\n        autocomplete: {\n          type: String,\n        },\n\n        /**\n         * This is a property supported by Safari that is used to control whether\n         * autocorrection should be enabled when the user is entering/editing the text.\n         * Possible values are:\n         * on: Enable autocorrection.\n         * off: Disable autocorrection.\n         */\n        autocorrect: {\n          type: String,\n        },\n\n        /**\n         * This is a property supported by Safari and Chrome that is used to control whether\n         * autocapitalization should be enabled when the user is entering/editing the text.\n         * Possible values are:\n         * characters: Characters capitalization.\n         * words: Words capitalization.\n         * sentences: Sentences capitalization.\n         * none: No capitalization.\n         */\n        autocapitalize: {\n          type: String,\n          reflectToAttribute: true,\n        },\n      };\n    }\n\n    static get delegateAttrs() {\n      return [...super.delegateAttrs, 'autocapitalize', 'autocomplete', 'autocorrect'];\n    }\n\n    /**\n     * @param {HTMLElement} input\n     * @protected\n     * @override\n     */\n    _inputElementChanged(input) {\n      super._inputElementChanged(input);\n\n      if (input) {\n        // Discard value set on the custom slotted input.\n        if (input.value && input.value !== this.value) {\n          console.warn(`Please define value on the <${this.localName}> component!`);\n          input.value = '';\n        }\n\n        if (this.value) {\n          input.value = this.value;\n        }\n      }\n    }\n\n    // Workaround for https://github.com/Polymer/polymer/issues/5259\n    get __data() {\n      return this.__dataValue || {};\n    }\n\n    set __data(value) {\n      this.__dataValue = value;\n    }\n\n    /**\n     * Override an event listener from `FocusMixin`.\n     * @param {boolean} focused\n     * @protected\n     * @override\n     */\n    _setFocused(focused) {\n      super._setFocused(focused);\n\n      if (!focused) {\n        this.validate();\n      }\n    }\n\n    /**\n     * Override an event listener from `InputMixin`\n     * to mark as valid after user started typing.\n     * @param {Event} event\n     * @protected\n     * @override\n     */\n    _onInput(event) {\n      super._onInput(event);\n\n      if (this.invalid) {\n        this.validate();\n      }\n    }\n\n    /**\n     * Override an observer from `InputMixin` to validate the field\n     * when a new value is set programmatically.\n     *\n     * @param {string | undefined} newValue\n     * @param {string | undefined} oldValue\n     * @protected\n     * @override\n     */\n    _valueChanged(newValue, oldValue) {\n      super._valueChanged(newValue, oldValue);\n\n      if (oldValue === undefined) {\n        return;\n      }\n\n      if (this.invalid) {\n        this.validate();\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { InputConstraintsMixin } from './input-constraints-mixin.js';\n\n/**\n * A mixin to provide `pattern` and `preventInvalidInput` properties.\n *\n * @polymerMixin\n * @mixes InputConstraintsMixin\n */\nexport const PatternMixin = (superclass) =>\n  class PatternMixinClass extends InputConstraintsMixin(superclass) {\n    static get properties() {\n      return {\n        /**\n         * A regular expression that the value is checked against.\n         * The pattern must match the entire value, not just some subset.\n         */\n        pattern: {\n          type: String,\n        },\n\n        /**\n         * When set to true, user is prevented from typing a value that\n         * conflicts with the given `pattern`.\n         * @attr {boolean} prevent-invalid-input\n         * @deprecated Please use `allowedCharPattern` instead.\n         */\n        preventInvalidInput: {\n          type: Boolean,\n          observer: '_preventInvalidInputChanged',\n        },\n      };\n    }\n\n    static get delegateAttrs() {\n      return [...super.delegateAttrs, 'pattern'];\n    }\n\n    static get constraints() {\n      return [...super.constraints, 'pattern'];\n    }\n\n    /** @private */\n    _checkInputValue() {\n      if (this.preventInvalidInput) {\n        const input = this.inputElement;\n        if (input && input.value.length > 0 && !this.checkValidity()) {\n          input.value = this.value || '';\n          // Add input-prevented attribute for 200ms\n          this.setAttribute('input-prevented', '');\n          this._inputDebouncer = Debouncer.debounce(this._inputDebouncer, timeOut.after(200), () => {\n            this.removeAttribute('input-prevented');\n          });\n        }\n      }\n    }\n\n    /**\n     * @param {Event} event\n     * @protected\n     * @override\n     */\n    _onInput(event) {\n      this._checkInputValue();\n\n      super._onInput(event);\n    }\n\n    /** @private */\n    _preventInvalidInputChanged(preventInvalidInput) {\n      if (preventInvalidInput) {\n        console.warn(\n          `WARNING: Since Vaadin 23.2, \"preventInvalidInput\" is deprecated. Please use \"allowedCharPattern\" instead.`,\n        );\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { css } from 'lit';\n\nexport const clearButton = css`\n  [part='clear-button'] {\n    display: none;\n    cursor: default;\n  }\n\n  [part='clear-button']::before {\n    content: '✕';\n  }\n\n  :host([clear-button-visible][has-value]:not([disabled]):not([readonly])) [part='clear-button'] {\n    display: block;\n  }\n`;\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { clearButton } from './clear-button-styles.js';\nimport { fieldShared } from './field-shared-styles.js';\nimport { inputFieldContainer } from './input-field-container-styles.js';\n\nexport const inputFieldShared = [fieldShared, inputFieldContainer, clearButton];\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { css } from 'lit';\n\nexport const fieldShared = css`\n  :host {\n    display: inline-flex;\n    outline: none;\n  }\n\n  :host::before {\n    content: '\\\\2003';\n    width: 0;\n    display: inline-block;\n    /* Size and position this element on the same vertical position as the input-field element\n          to make vertical align for the host element work as expected */\n  }\n\n  :host([hidden]) {\n    display: none !important;\n  }\n\n  :host(:not([has-label])) [part='label'] {\n    display: none;\n  }\n`;\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { css } from 'lit';\n\nexport const inputFieldContainer = css`\n  [class$='container'] {\n    display: flex;\n    flex-direction: column;\n    min-width: 100%;\n    max-width: 100%;\n    width: var(--vaadin-field-default-width, 12em);\n  }\n`;\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '@vaadin/input-container/src/vaadin-input-container.js';\nimport { html, PolymerElement } from '@polymer/polymer';\nimport { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';\nimport { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';\nimport { InputController } from '@vaadin/field-base/src/input-controller.js';\nimport { InputFieldMixin } from '@vaadin/field-base/src/input-field-mixin.js';\nimport { LabelledInputController } from '@vaadin/field-base/src/labelled-input-controller.js';\nimport { PatternMixin } from '@vaadin/field-base/src/pattern-mixin.js';\nimport { inputFieldShared } from '@vaadin/field-base/src/styles/input-field-shared-styles.js';\nimport { registerStyles, ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles('vaadin-text-field', inputFieldShared, { moduleId: 'vaadin-text-field-styles' });\n\n/**\n * `<vaadin-text-field>` is a web component that allows the user to input and edit text.\n *\n * ```html\n * <vaadin-text-field label=\"First Name\"></vaadin-text-field>\n * ```\n *\n * ### Prefixes and suffixes\n *\n * These are child elements of a `<vaadin-text-field>` that are displayed\n * inline with the input, before or after.\n * In order for an element to be considered as a prefix, it must have the slot\n * attribute set to `prefix` (and similarly for `suffix`).\n *\n * ```html\n * <vaadin-text-field label=\"Email address\">\n *   <div slot=\"prefix\">Sent to:</div>\n *   <div slot=\"suffix\">@vaadin.com</div>\n * </vaadin-text-field>\n * ```\n *\n * ### Styling\n *\n * The following custom properties are available for styling:\n *\n * Custom property                | Description                | Default\n * -------------------------------|----------------------------|---------\n * `--vaadin-field-default-width` | Default width of the field | `12em`\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name            | Description\n * ---------------------|----------------\n * `label`              | The label element\n * `input-field`        | The element that wraps prefix, value and suffix\n * `clear-button`       | The clear button\n * `error-message`      | The error message element\n * `helper-text`        | The helper text element wrapper\n * `required-indicator` | The `required` state indicator element\n *\n * The following state attributes are available for styling:\n *\n * Attribute           | Description | Part name\n * --------------------|-------------|------------\n * `disabled`          | Set to a disabled text field | :host\n * `has-value`         | Set when the element has a value | :host\n * `has-label`         | Set when the element has a label | :host\n * `has-helper`        | Set when the element has helper text or slot | :host\n * `has-error-message` | Set when the element has an error message | :host\n * `invalid`           | Set when the element is invalid | :host\n * `input-prevented`   | Temporarily set when invalid input is prevented | :host\n * `focused`           | Set when the element is focused | :host\n * `focus-ring`        | Set when the element is keyboard focused | :host\n * `readonly`          | Set to a readonly text field | :host\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @fires {Event} input - Fired when the value is changed by the user: on every typing keystroke, and the value is cleared using the clear button.\n * @fires {Event} change - Fired when the user commits a value change.\n * @fires {CustomEvent} invalid-changed - Fired when the `invalid` property changes.\n * @fires {CustomEvent} value-changed - Fired when the `value` property changes.\n * @fires {CustomEvent} validated - Fired whenever the field is validated.\n *\n * @extends HTMLElement\n * @mixes ElementMixin\n * @mixes ThemableMixin\n * @mixes PatternMixin\n * @mixes InputFieldMixin\n */\nexport class TextField extends PatternMixin(InputFieldMixin(ThemableMixin(ElementMixin(PolymerElement)))) {\n  static get is() {\n    return 'vaadin-text-field';\n  }\n\n  static get template() {\n    return html`\n      <style>\n        [part='input-field'] {\n          flex-grow: 0;\n        }\n      </style>\n\n      <div class=\"vaadin-field-container\">\n        <div part=\"label\">\n          <slot name=\"label\"></slot>\n          <span part=\"required-indicator\" aria-hidden=\"true\" on-click=\"focus\"></span>\n        </div>\n\n        <vaadin-input-container\n          part=\"input-field\"\n          readonly=\"[[readonly]]\"\n          disabled=\"[[disabled]]\"\n          invalid=\"[[invalid]]\"\n          theme$=\"[[_theme]]\"\n        >\n          <slot name=\"prefix\" slot=\"prefix\"></slot>\n          <slot name=\"input\"></slot>\n          <slot name=\"suffix\" slot=\"suffix\"></slot>\n          <div id=\"clearButton\" part=\"clear-button\" slot=\"suffix\" aria-hidden=\"true\"></div>\n        </vaadin-input-container>\n\n        <div part=\"helper-text\">\n          <slot name=\"helper\"></slot>\n        </div>\n\n        <div part=\"error-message\">\n          <slot name=\"error-message\"></slot>\n        </div>\n      </div>\n      <slot name=\"tooltip\"></slot>\n    `;\n  }\n\n  static get properties() {\n    return {\n      /**\n       * Maximum number of characters (in Unicode code points) that the user can enter.\n       */\n      maxlength: {\n        type: Number,\n      },\n\n      /**\n       * Minimum number of characters (in Unicode code points) that the user can enter.\n       */\n      minlength: {\n        type: Number,\n      },\n    };\n  }\n\n  static get delegateAttrs() {\n    return [...super.delegateAttrs, 'maxlength', 'minlength'];\n  }\n\n  static get constraints() {\n    return [...super.constraints, 'maxlength', 'minlength'];\n  }\n\n  constructor() {\n    super();\n    this._setType('text');\n  }\n\n  /** @protected */\n  get clearElement() {\n    return this.$.clearButton;\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.addController(\n      new InputController(this, (input) => {\n        this._setInputElement(input);\n        this._setFocusElement(input);\n        this.stateTarget = input;\n        this.ariaTarget = input;\n      }),\n    );\n    this.addController(new LabelledInputController(this.inputElement, this._labelController));\n\n    this._tooltipController = new TooltipController(this);\n    this._tooltipController.setPosition('top');\n    this.addController(this._tooltipController);\n  }\n}\n\ncustomElements.define(TextField.is, TextField);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '@vaadin/text-field/src/vaadin-text-field.js';\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\n\n/**\n * `<vaadin-grid-filter>` is a helper element for the `<vaadin-grid>` that provides out-of-the-box UI controls,\n * and handlers for filtering the grid data.\n *\n * #### Example:\n * ```html\n * <vaadin-grid-column id=\"column\"></vaadin-grid-column>\n * ```\n * ```js\n * const column = document.querySelector('#column');\n * column.headerRenderer = (root, column) => {\n *   let filter = root.firstElementChild;\n *   if (!filter) {\n *     filter = document.createElement('vaadin-grid-filter');\n *     root.appendChild(filter);\n *   }\n *   filter.path = 'name.first';\n * };\n * column.renderer = (root, column, model) => {\n *   root.textContent = model.item.name.first;\n * };\n * ```\n *\n * @fires {CustomEvent} value-changed - Fired when the `value` property changes.\n *\n * @extends HTMLElement\n */\nclass GridFilter extends class extends PolymerElement {} {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: inline-flex;\n          max-width: 100%;\n        }\n\n        #filter {\n          width: 100%;\n          box-sizing: border-box;\n        }\n      </style>\n      <slot name=\"filter\">\n        <vaadin-text-field id=\"filter\" value=\"{{value}}\"></vaadin-text-field>\n      </slot>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-grid-filter';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * JS Path of the property in the item used for filtering the data.\n       */\n      path: String,\n\n      /**\n       * Current filter value.\n       */\n      value: {\n        type: String,\n        notify: true,\n      },\n\n      /** @private */\n      _connected: Boolean,\n    };\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n    this._connected = true;\n  }\n\n  static get observers() {\n    return ['_filterChanged(path, value, _connected)'];\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    const child = this.firstElementChild;\n    if (child && child.getAttribute('slot') !== 'filter') {\n      console.warn('Make sure you have assigned slot=\"filter\" to the child elements of <vaadin-grid-filter>');\n      child.setAttribute('slot', 'filter');\n    }\n  }\n\n  /** @private */\n  _filterChanged(path, value, connected) {\n    if (path === undefined || value === undefined || !connected) {\n      return;\n    }\n    if (this._previousValue === undefined && value === '') {\n      return;\n    }\n    this._previousValue = value;\n\n    this._debouncerFilterChanged = Debouncer.debounce(this._debouncerFilterChanged, timeOut.after(200), () => {\n      this.dispatchEvent(new CustomEvent('filter-changed', { bubbles: true }));\n    });\n  }\n\n  focus() {\n    this.$.filter.focus();\n  }\n}\n\ncustomElements.define(GridFilter.is, GridFilter);\n\nexport { GridFilter };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './vaadin-grid-filter.js';\nimport { GridColumn } from './vaadin-grid-column.js';\n\n/**\n * `<vaadin-grid-filter-column>` is a helper element for the `<vaadin-grid>`\n * that provides default header renderer and functionality for filtering.\n *\n * #### Example:\n * ```html\n * <vaadin-grid items=\"[[items]]\">\n *  <vaadin-grid-filter-column path=\"name.first\"></vaadin-grid-filter-column>\n *\n *  <vaadin-grid-column>\n *    ...\n * ```\n */\nclass GridFilterColumn extends GridColumn {\n  static get is() {\n    return 'vaadin-grid-filter-column';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * JS Path of the property in the item used for filtering the data.\n       */\n      path: String,\n\n      /**\n       * Text to display as the label of the column filter text-field.\n       */\n      header: String,\n    };\n  }\n\n  static get observers() {\n    return ['_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header, _filterValue)'];\n  }\n\n  constructor() {\n    super();\n\n    this.__boundOnFilterValueChanged = this.__onFilterValueChanged.bind(this);\n  }\n\n  /**\n   * Renders the grid filter with the custom text field to the header cell.\n   *\n   * @override\n   */\n  _defaultHeaderRenderer(root, _column) {\n    let filter = root.firstElementChild;\n    let textField = filter ? filter.firstElementChild : undefined;\n\n    if (!filter) {\n      filter = document.createElement('vaadin-grid-filter');\n      textField = document.createElement('vaadin-text-field');\n      textField.setAttribute('slot', 'filter');\n      textField.setAttribute('theme', 'small');\n      textField.setAttribute('style', 'max-width: 100%;');\n      textField.setAttribute('focus-target', '');\n      textField.addEventListener('value-changed', this.__boundOnFilterValueChanged);\n      filter.appendChild(textField);\n      root.appendChild(filter);\n    }\n\n    filter.path = this.path;\n    filter.value = this._filterValue;\n\n    textField.__rendererValue = this._filterValue;\n    textField.value = this._filterValue;\n    textField.label = this.__getHeader(this.header, this.path);\n  }\n\n  /**\n   * The filter column doesn't allow to use a custom header renderer\n   * to override the header cell content.\n   * It always renders the grid filter to the header cell.\n   *\n   * @override\n   */\n  _computeHeaderRenderer() {\n    return this._defaultHeaderRenderer;\n  }\n\n  /**\n   * Updates the internal filter value once the filter text field is changed.\n   * The listener handles only user-fired events.\n   *\n   * @private\n   */\n  __onFilterValueChanged(e) {\n    // Skip if the value is changed by the renderer.\n    if (e.detail.value === e.target.__rendererValue) {\n      return;\n    }\n\n    this._filterValue = e.detail.value;\n  }\n\n  /** @private */\n  __getHeader(header, path) {\n    if (header) {\n      return header;\n    }\n\n    if (path) {\n      return this._generateHeader(path);\n    }\n  }\n}\n\ncustomElements.define(GridFilterColumn.is, GridFilterColumn);\n\nexport { GridFilterColumn };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { addListener } from '@vaadin/component-base/src/gestures.js';\n\n/**\n * A mixin that provides basic functionality for the\n * `<vaadin-grid-selection-column>`. This includes properties, cell rendering,\n * and overridable methods for handling changes to the selection state.\n *\n * **NOTE**: This mixin is re-used by the Flow component, and as such must not\n * implement any selection state updates for the column element or the grid.\n * Web component-specific selection state updates must be implemented in the\n * `<vaadin-grid-selection-column>` itself, by overriding the protected methods\n * provided by this mixin.\n *\n * @polymerMixin\n */\nexport const GridSelectionColumnBaseMixin = (superClass) =>\n  class GridSelectionColumnBaseMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * Width of the cells for this column.\n         */\n        width: {\n          type: String,\n          value: '58px',\n        },\n\n        /**\n         * Flex grow ratio for the cell widths. When set to 0, cell width is fixed.\n         * @attr {number} flex-grow\n         * @type {number}\n         */\n        flexGrow: {\n          type: Number,\n          value: 0,\n        },\n\n        /**\n         * When true, all the items are selected.\n         * @attr {boolean} select-all\n         * @type {boolean}\n         */\n        selectAll: {\n          type: Boolean,\n          value: false,\n          notify: true,\n        },\n\n        /**\n         * When true, the active gets automatically selected.\n         * @attr {boolean} auto-select\n         * @type {boolean}\n         */\n        autoSelect: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * When true, rows can be selected by dragging over the selection column.\n         * @attr {boolean} drag-select\n         * @type {boolean}\n         */\n        dragSelect: {\n          type: Boolean,\n          value: false,\n        },\n\n        /** @protected */\n        _indeterminate: Boolean,\n\n        /** @protected */\n        _selectAllHidden: Boolean,\n      };\n    }\n\n    static get observers() {\n      return [\n        '_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header, selectAll, _indeterminate, _selectAllHidden)',\n      ];\n    }\n\n    /**\n     * Renders the Select All checkbox to the header cell.\n     *\n     * @override\n     */\n    _defaultHeaderRenderer(root, _column) {\n      let checkbox = root.firstElementChild;\n      if (!checkbox) {\n        checkbox = document.createElement('vaadin-checkbox');\n        checkbox.setAttribute('aria-label', 'Select All');\n        checkbox.classList.add('vaadin-grid-select-all-checkbox');\n        root.appendChild(checkbox);\n        // Add listener after appending, so we can skip the initial change event\n        checkbox.addEventListener('checked-changed', this.__onSelectAllCheckedChanged.bind(this));\n      }\n\n      const checked = this.__isChecked(this.selectAll, this._indeterminate);\n      checkbox.__rendererChecked = checked;\n      checkbox.checked = checked;\n      checkbox.hidden = this._selectAllHidden;\n      checkbox.indeterminate = this._indeterminate;\n    }\n\n    /**\n     * Renders the Select Row checkbox to the body cell.\n     *\n     * @override\n     */\n    _defaultRenderer(root, _column, { item, selected }) {\n      let checkbox = root.firstElementChild;\n      if (!checkbox) {\n        checkbox = document.createElement('vaadin-checkbox');\n        checkbox.setAttribute('aria-label', 'Select Row');\n        root.appendChild(checkbox);\n        // Add listener after appending, so we can skip the initial change event\n        checkbox.addEventListener('checked-changed', this.__onSelectRowCheckedChanged.bind(this));\n        addListener(root, 'track', this.__onCellTrack.bind(this));\n        root.addEventListener('mousedown', this.__onCellMouseDown.bind(this));\n        root.addEventListener('click', this.__onCellClick.bind(this));\n      }\n\n      checkbox.__item = item;\n      checkbox.__rendererChecked = selected;\n      checkbox.checked = selected;\n    }\n\n    /**\n     * Updates the select all state when the Select All checkbox is switched.\n     * The listener handles only user-fired events.\n     *\n     * @private\n     */\n    __onSelectAllCheckedChanged(e) {\n      // Skip if the state is changed by the renderer.\n      if (e.target.checked === e.target.__rendererChecked) {\n        return;\n      }\n\n      if (this._indeterminate || e.target.checked) {\n        this._selectAll();\n      } else {\n        this._deselectAll();\n      }\n    }\n\n    /**\n     * Selects or deselects the row when the Select Row checkbox is switched.\n     * The listener handles only user-fired events.\n     *\n     * @private\n     */\n    __onSelectRowCheckedChanged(e) {\n      // Skip if the state is changed by the renderer.\n      if (e.target.checked === e.target.__rendererChecked) {\n        return;\n      }\n\n      if (e.target.checked) {\n        this._selectItem(e.target.__item);\n      } else {\n        this._deselectItem(e.target.__item);\n      }\n    }\n\n    /** @private */\n    __onCellTrack(event) {\n      if (!this.dragSelect) {\n        return;\n      }\n      this.__dragCurrentY = event.detail.y;\n      this.__dragDy = event.detail.dy;\n      if (event.detail.state === 'start') {\n        const renderedRows = this._grid._getVisibleRows();\n        // Get the row where the drag started\n        const dragStartRow = renderedRows.find((row) => row.contains(event.currentTarget.assignedSlot));\n        // Whether to select or deselect the items on drag\n        this.__dragSelect = !this._grid._isSelected(dragStartRow._item);\n        // Store the index of the row where the drag started\n        this.__dragStartIndex = dragStartRow.index;\n        // Store the item of the row where the drag started\n        this.__dragStartItem = dragStartRow._item;\n        // Start the auto scroller\n        this.__dragAutoScroller();\n      } else if (event.detail.state === 'end') {\n        // If drag start and end stays within the same item, then toggle its state\n        if (this.__dragStartItem) {\n          if (this.__dragSelect) {\n            this._selectItem(this.__dragStartItem);\n          } else {\n            this._deselectItem(this.__dragStartItem);\n          }\n        }\n        // Clear drag state after timeout, which allows preventing the\n        // subsequent click event if drag started and ended on the same item\n        setTimeout(() => {\n          this.__dragStartIndex = undefined;\n        });\n      }\n    }\n\n    /** @private */\n    __onCellMouseDown(e) {\n      if (this.dragSelect) {\n        // Prevent text selection when starting to drag\n        e.preventDefault();\n      }\n    }\n\n    /** @private */\n    __onCellClick(e) {\n      if (this.__dragStartIndex !== undefined) {\n        // Stop the click event if drag was enabled. This click event should\n        // only occur if drag started and stopped on the same item. In that case\n        // the selection state has already been toggled on drag end, and we\n        // don't  want to toggle it again from clicking the checkbox or changing\n        // the active item.\n        e.preventDefault();\n      }\n    }\n\n    /** @private */\n    __dragAutoScroller() {\n      if (this.__dragStartIndex === undefined) {\n        return;\n      }\n      // Get the row being hovered over\n      const renderedRows = this._grid._getVisibleRows();\n      const hoveredRow = renderedRows.find((row) => {\n        const rowRect = row.getBoundingClientRect();\n        return this.__dragCurrentY >= rowRect.top && this.__dragCurrentY <= rowRect.bottom;\n      });\n\n      // Get the index of the row being hovered over or the first/last\n      // visible row if hovering outside the grid\n      let hoveredIndex = hoveredRow ? hoveredRow.index : undefined;\n      const scrollableArea = this.__getScrollableArea();\n      if (this.__dragCurrentY < scrollableArea.top) {\n        hoveredIndex = this._grid._firstVisibleIndex;\n      } else if (this.__dragCurrentY > scrollableArea.bottom) {\n        hoveredIndex = this._grid._lastVisibleIndex;\n      }\n\n      if (hoveredIndex !== undefined) {\n        // Select all items between the start and the current row\n        renderedRows.forEach((row) => {\n          if (\n            (hoveredIndex > this.__dragStartIndex && row.index >= this.__dragStartIndex && row.index <= hoveredIndex) ||\n            (hoveredIndex < this.__dragStartIndex && row.index <= this.__dragStartIndex && row.index >= hoveredIndex)\n          ) {\n            if (this.__dragSelect) {\n              this._selectItem(row._item);\n            } else {\n              this._deselectItem(row._item);\n            }\n            this.__dragStartItem = undefined;\n          }\n        });\n      }\n\n      // Start scrolling in the top/bottom 15% of the scrollable area\n      const scrollTriggerArea = scrollableArea.height * 0.15;\n      // Maximum number of pixels to scroll per iteration\n      const maxScrollAmount = 10;\n\n      if (this.__dragDy < 0 && this.__dragCurrentY < scrollableArea.top + scrollTriggerArea) {\n        const dy = scrollableArea.top + scrollTriggerArea - this.__dragCurrentY;\n        const percentage = Math.min(1, dy / scrollTriggerArea);\n        this._grid.$.table.scrollTop -= percentage * maxScrollAmount;\n      }\n      if (this.__dragDy > 0 && this.__dragCurrentY > scrollableArea.bottom - scrollTriggerArea) {\n        const dy = this.__dragCurrentY - (scrollableArea.bottom - scrollTriggerArea);\n        const percentage = Math.min(1, dy / scrollTriggerArea);\n        this._grid.$.table.scrollTop += percentage * maxScrollAmount;\n      }\n\n      // Schedule the next auto scroll\n      setTimeout(() => this.__dragAutoScroller(), 10);\n    }\n\n    /**\n     * Gets the scrollable area of the grid as a bounding client rect. The\n     * scrollable area is the bounding rect of the grid minus the header and\n     * footer.\n     *\n     * @private\n     */\n    __getScrollableArea() {\n      const gridRect = this._grid.$.table.getBoundingClientRect();\n      const headerRect = this._grid.$.header.getBoundingClientRect();\n      const footerRect = this._grid.$.footer.getBoundingClientRect();\n\n      return {\n        top: gridRect.top + headerRect.height,\n        bottom: gridRect.bottom - footerRect.height,\n        left: gridRect.left,\n        right: gridRect.right,\n        height: gridRect.height - headerRect.height - footerRect.height,\n        width: gridRect.width,\n      };\n    }\n\n    /**\n     * Override to handle the user selecting all items.\n     * @protected\n     */\n    _selectAll() {}\n\n    /**\n     * Override to handle the user deselecting all items.\n     * @protected\n     */\n    _deselectAll() {}\n\n    /**\n     * Override to handle the user selecting an item.\n     * @param {Object} item the item to select\n     * @protected\n     */\n    _selectItem(_item) {}\n\n    /**\n     * Override to handle the user deselecting an item.\n     * @param {Object} item the item to deselect\n     * @protected\n     */\n    _deselectItem(_item) {}\n\n    /**\n     * IOS needs indeterminate + checked at the same time\n     * @private\n     */\n    __isChecked(selectAll, indeterminate) {\n      return indeterminate || selectAll;\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '@vaadin/checkbox/src/vaadin-checkbox.js';\nimport { GridColumn } from './vaadin-grid-column.js';\nimport { GridSelectionColumnBaseMixin } from './vaadin-grid-selection-column-base-mixin.js';\n\n/**\n * `<vaadin-grid-selection-column>` is a helper element for the `<vaadin-grid>`\n * that provides default renderers and functionality for item selection.\n *\n * #### Example:\n * ```html\n * <vaadin-grid items=\"[[items]]\">\n *  <vaadin-grid-selection-column frozen auto-select></vaadin-grid-selection-column>\n *\n *  <vaadin-grid-column>\n *    ...\n * ```\n *\n * By default the selection column displays `<vaadin-checkbox>` elements in the\n * column cells. The checkboxes in the body rows toggle selection of the corresponding row items.\n *\n * When the grid data is provided as an array of [`items`](#/elements/vaadin-grid#property-items),\n * the column header gets an additional checkbox that can be used for toggling\n * selection for all the items at once.\n *\n * __The default content can also be overridden__\n *\n * @mixes GridSelectionColumnBaseMixin\n * @fires {CustomEvent} select-all-changed - Fired when the `selectAll` property changes.\n */\nclass GridSelectionColumn extends GridSelectionColumnBaseMixin(GridColumn) {\n  static get is() {\n    return 'vaadin-grid-selection-column';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * The previous state of activeItem. When activeItem turns to `null`,\n       * previousActiveItem will have an Object with just unselected activeItem\n       * @private\n       */\n      __previousActiveItem: Object,\n    };\n  }\n\n  static get observers() {\n    return ['__onSelectAllChanged(selectAll)'];\n  }\n\n  constructor() {\n    super();\n\n    this.__boundOnActiveItemChanged = this.__onActiveItemChanged.bind(this);\n    this.__boundOnDataProviderChanged = this.__onDataProviderChanged.bind(this);\n    this.__boundOnSelectedItemsChanged = this.__onSelectedItemsChanged.bind(this);\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    this._grid.removeEventListener('active-item-changed', this.__boundOnActiveItemChanged);\n    this._grid.removeEventListener('data-provider-changed', this.__boundOnDataProviderChanged);\n    this._grid.removeEventListener('filter-changed', this.__boundOnSelectedItemsChanged);\n    this._grid.removeEventListener('selected-items-changed', this.__boundOnSelectedItemsChanged);\n\n    super.disconnectedCallback();\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n    if (this._grid) {\n      this._grid.addEventListener('active-item-changed', this.__boundOnActiveItemChanged);\n      this._grid.addEventListener('data-provider-changed', this.__boundOnDataProviderChanged);\n      this._grid.addEventListener('filter-changed', this.__boundOnSelectedItemsChanged);\n      this._grid.addEventListener('selected-items-changed', this.__boundOnSelectedItemsChanged);\n    }\n  }\n\n  /** @private */\n  __onSelectAllChanged(selectAll) {\n    if (selectAll === undefined || !this._grid) {\n      return;\n    }\n\n    if (!this.__selectAllInitialized) {\n      // The initial value for selectAll property was applied, avoid clearing pre-selected items\n      this.__selectAllInitialized = true;\n      return;\n    }\n\n    if (this._selectAllChangeLock) {\n      return;\n    }\n\n    if (selectAll && this.__hasArrayDataProvider()) {\n      this.__withFilteredItemsArray((items) => {\n        this._grid.selectedItems = items;\n      });\n    } else {\n      this._grid.selectedItems = [];\n    }\n  }\n\n  /**\n   * Return true if array `a` contains all the items in `b`\n   * We need this when sorting or to preserve selection after filtering.\n   * @private\n   */\n  __arrayContains(a, b) {\n    return Array.isArray(a) && Array.isArray(b) && b.every((i) => a.includes(i));\n  }\n\n  /**\n   * Override a method from `GridSelectionColumnBaseMixin` to handle the user\n   * selecting all items.\n   *\n   * @protected\n   * @override\n   */\n  _selectAll() {\n    this.selectAll = true;\n  }\n\n  /**\n   * Override a method from `GridSelectionColumnBaseMixin` to handle the user\n   * deselecting all items.\n   *\n   * @protected\n   * @override\n   */\n  _deselectAll() {\n    this.selectAll = false;\n  }\n\n  /**\n   * Override a method from `GridSelectionColumnBaseMixin` to handle the user\n   * selecting an item.\n   *\n   * @param {Object} item the item to select\n   * @protected\n   * @override\n   */\n  _selectItem(item) {\n    this._grid.selectItem(item);\n  }\n\n  /**\n   * Override a method from `GridSelectionColumnBaseMixin` to handle the user\n   * deselecting an item.\n   *\n   * @param {Object} item the item to deselect\n   * @protected\n   * @override\n   */\n  _deselectItem(item) {\n    this._grid.deselectItem(item);\n  }\n\n  /** @private */\n  __onActiveItemChanged(e) {\n    const activeItem = e.detail.value;\n    if (this.autoSelect) {\n      const item = activeItem || this.__previousActiveItem;\n      if (item) {\n        this._grid._toggleItem(item);\n      }\n    }\n    this.__previousActiveItem = activeItem;\n  }\n\n  /** @private */\n  __hasArrayDataProvider() {\n    return Array.isArray(this._grid.items) && !!this._grid.dataProvider;\n  }\n\n  /** @private */\n  __onSelectedItemsChanged() {\n    this._selectAllChangeLock = true;\n    if (this.__hasArrayDataProvider()) {\n      this.__withFilteredItemsArray((items) => {\n        if (!this._grid.selectedItems.length) {\n          this.selectAll = false;\n          this._indeterminate = false;\n        } else if (this.__arrayContains(this._grid.selectedItems, items)) {\n          this.selectAll = true;\n          this._indeterminate = false;\n        } else {\n          this.selectAll = false;\n          this._indeterminate = true;\n        }\n      });\n    }\n    this._selectAllChangeLock = false;\n  }\n\n  /** @private */\n  __onDataProviderChanged() {\n    this._selectAllHidden = !Array.isArray(this._grid.items);\n  }\n\n  /**\n   * Assuming the grid uses an items array data provider, fetches all the filtered items\n   * from the data provider and invokes the callback with the resulting array.\n   *\n   * @private\n   */\n  __withFilteredItemsArray(callback) {\n    const params = {\n      page: 0,\n      pageSize: Infinity,\n      sortOrders: [],\n      filters: this._grid._mapFilters(),\n    };\n    this._grid.dataProvider(params, (items) => callback(items));\n  }\n}\n\ncustomElements.define(GridSelectionColumn.is, GridSelectionColumn);\n\nexport { GridSelectionColumn };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-grid-sorter',\n  css`\n    :host {\n      justify-content: flex-start;\n      align-items: baseline;\n      -webkit-user-select: none;\n      -moz-user-select: none;\n      user-select: none;\n      cursor: var(--lumo-clickable-cursor);\n    }\n\n    [part='content'] {\n      display: inline-block;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    [part='indicators'] {\n      margin-left: var(--lumo-space-s);\n    }\n\n    [part='indicators']::before {\n      transform: scale(0.8);\n    }\n\n    :host(:not([direction]):not(:hover)) [part='indicators'] {\n      color: var(--lumo-tertiary-text-color);\n    }\n\n    :host([direction]) {\n      color: var(--lumo-primary-text-color);\n    }\n\n    [part='order'] {\n      font-size: var(--lumo-font-size-xxs);\n      line-height: 1;\n    }\n\n    /* RTL specific styles */\n\n    :host([dir='rtl']) [part='indicators'] {\n      margin-right: var(--lumo-space-s);\n      margin-left: 0;\n    }\n  `,\n  { moduleId: 'lumo-grid-sorter' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = `\n  <style>\n    @font-face {\n      font-family: 'vaadin-grid-sorter-icons';\n      src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAA0AAAAABuwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEFAAAABkAAAAcfep+mUdERUYAAAP4AAAAHAAAAB4AJwAOT1MvMgAAAZgAAAA/AAAAYA8TBPpjbWFwAAAB7AAAAFUAAAFeF1fZ4mdhc3AAAAPwAAAACAAAAAgAAAAQZ2x5ZgAAAlgAAABcAAAAnMvguMloZWFkAAABMAAAAC8AAAA2C5Ap72hoZWEAAAFgAAAAHQAAACQGbQPHaG10eAAAAdgAAAAUAAAAHAoAAABsb2NhAAACRAAAABIAAAASAIwAYG1heHAAAAGAAAAAFgAAACAACwAKbmFtZQAAArQAAAECAAACZxWCgKhwb3N0AAADuAAAADUAAABZCrApUXicY2BkYGAA4rDECVrx/DZfGbhZGEDgyqNPOxH0/wNMq5kPALkcDEwgUQBWRA0dAHicY2BkYGA+8P8AAwMLAwgwrWZgZEAFbABY4QM8AAAAeJxjYGRgYOAAQiYGEICQSAAAAi8AFgAAeJxjYGY6yziBgZWBgWkm0xkGBoZ+CM34msGYkZMBFTAKoAkwODAwvmRiPvD/AIMDMxCD1CDJKjAwAgBktQsXAHicY2GAAMZQCM0EwqshbAALxAEKeJxjYGBgZoBgGQZGBhCIAPIYwXwWBhsgzcXAwcAEhIwMCi+Z/v/9/x+sSuElA4T9/4k4K1gHFwMMMILMY2QDYmaoABOQYGJABUA7WBiGNwAAJd4NIQAAAAAAAAAACAAIABAAGAAmAEAATgAAeJyNjLENgDAMBP9tIURJwQCMQccSZgk2i5fIYBDAidJjycXr7x5EPwE2wY8si7jmyBNXGo/bNBerxJNrpxhbO3/fEFpx8ZICpV+ghxJ74fAMe+h7Ox14AbrsHB14nK2QQWrDMBRER4mTkhQK3ZRQKOgCNk7oGQqhhEIX2WSlWEI1BAlkJ5CDdNsj5Ey9Rncdi38ES+jzNJo/HwTgATcoDEthhY3wBHc4CE+pfwsX5F/hGe7Vo/AcK/UhvMSz+mGXKhZU6pww8ISz3oWn1BvhgnwTnuEJf8Jz1OpFeIlX9YULDLdFi4ASHolkSR0iuYdjLak1vAequBhj21D61Nqyi6l3qWybGPjySbPHGScGJl6dP58MYcQRI0bts7mjebBqrFENH7t3qWtj0OuqHnXcW7b0HOTZFnKryRGW2hFX1m0O2vEM3opNMfTau+CS6Z3Vx6veNnEXY6jwDxhsc2gAAHicY2BiwA84GBgYmRiYGJkZmBlZGFkZ2djScyoLMgzZS/MyDQwMwLSrpYEBlIbxjQDrzgsuAAAAAAEAAf//AA94nGNgZGBg4AFiMSBmYmAEQnYgZgHzGAAD6wA2eJxjYGBgZACCKyoz1cD0o087YTQATOcIewAAAA==) format('woff');\n      font-weight: normal;\n      font-style: normal;\n    }\n  </style>\n`;\n\ndocument.head.appendChild(template.content);\n\n/**\n * `<vaadin-grid-sorter>` is a helper element for the `<vaadin-grid>` that provides out-of-the-box UI controls,\n * visual feedback, and handlers for sorting the grid data.\n *\n * #### Example:\n * ```html\n * <vaadin-grid-column id=\"column\"></vaadin-grid-column>\n * ```\n * ```js\n * const column = document.querySelector('#column');\n * column.renderer = (root, column, model) => {\n *   let sorter = root.firstElementChild;\n *   if (!sorter) {\n *     sorter = document.createElement('vaadin-grid-sorter');\n *     root.appendChild(sorter);\n *   }\n *   sorter.path = 'name.first';\n * };\n * ```\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name | Description\n * ----------------|----------------\n * `content` | The slotted content wrapper\n * `indicators` | The internal sorter indicators.\n * `order` | The internal sorter order\n *\n * The following state attributes are available for styling:\n *\n * Attribute    | Description | Part name\n * -------------|-------------|------------\n * `direction` | Sort direction of a sorter | :host\n *\n * @fires {CustomEvent} direction-changed - Fired when the `direction` property changes.\n * @fires {CustomEvent} sorter-changed - Fired when the `path` or `direction` property changes.\n *\n * @extends HTMLElement\n */\nclass GridSorter extends ThemableMixin(DirMixin(PolymerElement)) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: inline-flex;\n          cursor: pointer;\n          max-width: 100%;\n        }\n\n        [part='content'] {\n          flex: 1 1 auto;\n        }\n\n        [part='indicators'] {\n          position: relative;\n          align-self: center;\n          flex: none;\n        }\n\n        [part='order'] {\n          display: inline;\n          vertical-align: super;\n        }\n\n        [part='indicators']::before {\n          font-family: 'vaadin-grid-sorter-icons';\n          display: inline-block;\n        }\n\n        :host(:not([direction])) [part='indicators']::before {\n          content: '\\\\e901';\n        }\n\n        :host([direction='asc']) [part='indicators']::before {\n          content: '\\\\e900';\n        }\n\n        :host([direction='desc']) [part='indicators']::before {\n          content: '\\\\e902';\n        }\n      </style>\n\n      <div part=\"content\">\n        <slot></slot>\n      </div>\n      <div part=\"indicators\">\n        <span part=\"order\">[[_getDisplayOrder(_order)]]</span>\n      </div>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-grid-sorter';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * JS Path of the property in the item used for sorting the data.\n       */\n      path: String,\n\n      /**\n       * How to sort the data.\n       * Possible values are `asc` to use an ascending algorithm, `desc` to sort the data in\n       * descending direction, or `null` for not sorting the data.\n       * @type {GridSorterDirection | undefined}\n       */\n      direction: {\n        type: String,\n        reflectToAttribute: true,\n        notify: true,\n        value: null,\n      },\n\n      /**\n       * @type {number | null}\n       * @protected\n       */\n      _order: {\n        type: Number,\n        value: null,\n      },\n\n      /** @private */\n      _isConnected: {\n        type: Boolean,\n        observer: '__isConnectedChanged',\n      },\n    };\n  }\n\n  static get observers() {\n    return ['_pathOrDirectionChanged(path, direction)'];\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n    this.addEventListener('click', this._onClick.bind(this));\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n    this._isConnected = true;\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._isConnected = false;\n\n    if (!this.parentNode && this._grid) {\n      this._grid.__removeSorters([this]);\n    }\n  }\n\n  /** @private */\n  _pathOrDirectionChanged() {\n    this.__dispatchSorterChangedEvenIfPossible();\n  }\n\n  /** @private */\n  __isConnectedChanged(newValue, oldValue) {\n    if (oldValue === false) {\n      return;\n    }\n\n    this.__dispatchSorterChangedEvenIfPossible();\n  }\n\n  /** @private */\n  __dispatchSorterChangedEvenIfPossible() {\n    if (this.path === undefined || this.direction === undefined || !this._isConnected) {\n      return;\n    }\n\n    this.dispatchEvent(\n      new CustomEvent('sorter-changed', {\n        detail: { shiftClick: Boolean(this._shiftClick), fromSorterClick: Boolean(this._fromSorterClick) },\n        bubbles: true,\n        composed: true,\n      }),\n    );\n    // Cleaning up as a programatically sorting can be done after some user interaction\n    this._fromSorterClick = false;\n    this._shiftClick = false;\n  }\n\n  /** @private */\n  _getDisplayOrder(order) {\n    return order === null ? '' : order + 1;\n  }\n\n  /** @private */\n  _onClick(e) {\n    if (e.defaultPrevented) {\n      // Something else has already handled the click event, do nothing.\n      return;\n    }\n\n    const activeElement = this.getRootNode().activeElement;\n    if (this !== activeElement && this.contains(activeElement)) {\n      // Some focusable content inside the sorter was clicked, do nothing.\n      return;\n    }\n\n    e.preventDefault();\n    this._shiftClick = e.shiftKey;\n    this._fromSorterClick = true;\n    if (this.direction === 'asc') {\n      this.direction = 'desc';\n    } else if (this.direction === 'desc') {\n      this.direction = null;\n    } else {\n      this.direction = 'asc';\n    }\n  }\n}\n\ncustomElements.define(GridSorter.is, GridSorter);\n\nexport { GridSorter };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './vaadin-grid-sorter.js';\nimport { GridColumn } from './vaadin-grid-column.js';\n\n/**\n * `<vaadin-grid-sort-column>` is a helper element for the `<vaadin-grid>`\n * that provides default header renderer and functionality for sorting.\n *\n * #### Example:\n * ```html\n * <vaadin-grid items=\"[[items]]\">\n *  <vaadin-grid-sort-column path=\"name.first\" direction=\"asc\"></vaadin-grid-sort-column>\n *\n *  <vaadin-grid-column>\n *    ...\n * ```\n *\n * @fires {CustomEvent} direction-changed - Fired when the `direction` property changes.\n */\nclass GridSortColumn extends GridColumn {\n  static get is() {\n    return 'vaadin-grid-sort-column';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * JS Path of the property in the item used for sorting the data.\n       */\n      path: String,\n\n      /**\n       * How to sort the data.\n       * Possible values are `asc` to use an ascending algorithm, `desc` to sort the data in\n       * descending direction, or `null` for not sorting the data.\n       * @type {GridSorterDirection | undefined}\n       */\n      direction: {\n        type: String,\n        notify: true,\n      },\n    };\n  }\n\n  static get observers() {\n    return ['_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header, direction)'];\n  }\n\n  constructor() {\n    super();\n\n    this.__boundOnDirectionChanged = this.__onDirectionChanged.bind(this);\n  }\n\n  /**\n   * Renders the grid sorter to the header cell.\n   *\n   * @override\n   */\n  _defaultHeaderRenderer(root, _column) {\n    let sorter = root.firstElementChild;\n    if (!sorter) {\n      sorter = document.createElement('vaadin-grid-sorter');\n      sorter.addEventListener('direction-changed', this.__boundOnDirectionChanged);\n      root.appendChild(sorter);\n    }\n\n    sorter.path = this.path;\n    sorter.__rendererDirection = this.direction;\n    sorter.direction = this.direction;\n    sorter.textContent = this.__getHeader(this.header, this.path);\n  }\n\n  /**\n   * The sort column doesn't allow to use a custom header renderer\n   * to override the header cell content.\n   * It always renders the grid sorter to the header cell.\n   *\n   * @override\n   */\n  _computeHeaderRenderer() {\n    return this._defaultHeaderRenderer;\n  }\n\n  /**\n   * Updates the sorting direction once the grid sorter's direction is changed.\n   * The listener handles only user-fired events.\n   *\n   * @private\n   */\n  __onDirectionChanged(e) {\n    // Skip if the direction is changed by the renderer.\n    if (e.detail.value === e.target.__rendererDirection) {\n      return;\n    }\n\n    this.direction = e.detail.value;\n  }\n\n  /** @private */\n  __getHeader(header, path) {\n    if (header) {\n      return header;\n    }\n\n    if (path) {\n      return this._generateHeader(path);\n    }\n  }\n}\n\ncustomElements.define(GridSortColumn.is, GridSortColumn);\n\nexport { GridSortColumn };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-grid-tree-toggle',\n  css`\n    :host {\n      --vaadin-grid-tree-toggle-level-offset: 2em;\n      align-items: center;\n      vertical-align: middle;\n      transform: translateX(calc(var(--lumo-space-s) * -1));\n      -webkit-tap-highlight-color: transparent;\n    }\n\n    :host(:not([leaf])) {\n      cursor: default;\n    }\n\n    [part='toggle'] {\n      display: inline-block;\n      font-size: 1.5em;\n      line-height: 1;\n      width: 1em;\n      height: 1em;\n      text-align: center;\n      color: var(--lumo-contrast-50pct);\n      cursor: var(--lumo-clickable-cursor);\n      /* Increase touch target area */\n      padding: calc(1em / 3);\n      margin: calc(1em / -3);\n    }\n\n    :host(:not([dir='rtl'])) [part='toggle'] {\n      margin-right: 0;\n    }\n\n    @media (hover: hover) {\n      :host(:hover) [part='toggle'] {\n        color: var(--lumo-contrast-80pct);\n      }\n    }\n\n    [part='toggle']::before {\n      font-family: 'lumo-icons';\n      display: inline-block;\n      height: 100%;\n    }\n\n    :host(:not([expanded])) [part='toggle']::before {\n      content: var(--lumo-icons-angle-right);\n    }\n\n    :host([expanded]) [part='toggle']::before {\n      content: var(--lumo-icons-angle-right);\n      transform: rotate(90deg);\n    }\n\n    /* Experimental support for hierarchy connectors, using an unsupported selector */\n    :host([theme~='connectors']) #level-spacer {\n      position: relative;\n      z-index: -1;\n      font-size: 1em;\n      height: 1.5em;\n    }\n\n    :host([theme~='connectors']) #level-spacer::before {\n      display: block;\n      content: '';\n      margin-top: calc(var(--lumo-space-m) * -1);\n      height: calc(var(--lumo-space-m) + 3em);\n      background-image: linear-gradient(\n        to right,\n        transparent calc(var(--vaadin-grid-tree-toggle-level-offset) - 1px),\n        var(--lumo-contrast-10pct) calc(var(--vaadin-grid-tree-toggle-level-offset) - 1px)\n      );\n      background-size: var(--vaadin-grid-tree-toggle-level-offset) var(--vaadin-grid-tree-toggle-level-offset);\n      background-position: calc(var(--vaadin-grid-tree-toggle-level-offset) / 2 - 2px) 0;\n    }\n\n    /* RTL specific styles */\n\n    :host([dir='rtl']) {\n      margin-left: 0;\n      margin-right: calc(var(--lumo-space-s) * -1);\n    }\n\n    :host([dir='rtl']) [part='toggle'] {\n      margin-left: 0;\n    }\n\n    :host([dir='rtl'][expanded]) [part='toggle']::before {\n      transform: rotate(-90deg);\n    }\n\n    :host([dir='rtl'][theme~='connectors']) #level-spacer::before {\n      background-image: linear-gradient(\n        to left,\n        transparent calc(var(--vaadin-grid-tree-toggle-level-offset) - 1px),\n        var(--lumo-contrast-10pct) calc(var(--vaadin-grid-tree-toggle-level-offset) - 1px)\n      );\n      background-position: calc(100% - (var(--vaadin-grid-tree-toggle-level-offset) / 2 - 2px)) 0;\n    }\n\n    :host([dir='rtl']:not([expanded])) [part='toggle']::before,\n    :host([dir='rtl'][expanded]) [part='toggle']::before {\n      content: var(--lumo-icons-angle-left);\n    }\n  `,\n  { moduleId: 'lumo-grid-tree-toggle' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\nimport { isFocusable } from './vaadin-grid-active-item-mixin.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = `\n  <style>\n    @font-face {\n      font-family: \"vaadin-grid-tree-icons\";\n      src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAQkAA0AAAAABrwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAECAAAABoAAAAcgHwa6EdERUYAAAPsAAAAHAAAAB4AJwAOT1MvMgAAAZQAAAA/AAAAYA8TBIJjbWFwAAAB8AAAAFUAAAFeGJvXWmdhc3AAAAPkAAAACAAAAAgAAAAQZ2x5ZgAAAlwAAABLAAAAhIrPOhFoZWFkAAABMAAAACsAAAA2DsJI02hoZWEAAAFcAAAAHQAAACQHAgPHaG10eAAAAdQAAAAZAAAAHAxVAgBsb2NhAAACSAAAABIAAAASAIAAVG1heHAAAAF8AAAAGAAAACAACgAFbmFtZQAAAqgAAAECAAACTwflzbdwb3N0AAADrAAAADYAAABZQ7Ajh3icY2BkYGAA4twv3Vfi+W2+MnCzMIDANSOmbGSa2YEZRHEwMIEoAAoiB6sAeJxjYGRgYD7w/wADAwsDCDA7MDAyoAI2AFEEAtIAAAB4nGNgZGBg4GBgZgDRDAxMDGgAAAGbABB4nGNgZp7JOIGBlYGBaSbTGQYGhn4IzfiawZiRkwEVMAqgCTA4MDA+38d84P8BBgdmIAapQZJVYGAEAGc/C54AeJxjYYAAxlAIzQTELAwMBxgZGB0ACy0BYwAAAHicY2BgYGaAYBkGRgYQiADyGMF8FgYbIM3FwMHABISMDArP9/3/+/8/WJXC8z0Q9v8nEp5gHVwMMMAIMo+RDYiZoQJMQIKJARUA7WBhGN4AACFKDtoAAAAAAAAAAAgACAAQABgAJgA0AEIAAHichYvBEYBADAKBVHBjBT4swl9KS2k05o0XHd/yW1hAfBFwCv9sIlJu3nZaNS3PXAaXXHI8Lge7DlzF7C1RgXc7xkK6+gvcD2URmQB4nK2RQWoCMRiFX3RUqtCli65yADModOMBLLgQSqHddRFnQghIAnEUvEA3vUUP0LP0Fj1G+yb8R5iEhO9/ef/7FwFwj28o9EthiVp4hBlehcfUP4Ur8o/wBAv8CU+xVFvhOR7UB7tUdUdlVRJ6HnHWTnhM/V24In8JT5j/KzzFSi2E53hUz7jCcrcIiDDwyKSW1JEct2HdIPH1DFytbUM0PofWdNk5E5oUqb/Q6HHBiVGZpfOXkyUMEj5IyBuNmYZQjBobfsuassvnkKLe1OuBBj0VQ8cRni2xjLWsHaM0jrjx3peYA0/vrdmUYqe9iy7bzrX6eNP7Jh1SijX+AaUVbB8AAHicY2BiwA84GBgYmRiYGJkZmBlZGFkZ2djScyoLMgzZS/MyDQwMwLSruZMzlHaB0q4A76kLlwAAAAEAAf//AA94nGNgZGBg4AFiMSBmYmAEQnYgZgHzGAAD6wA2eJxjYGBgZACCKxJigiD6mhFTNowGACmcA/8AAA==) format('woff');\n      font-weight: normal;\n      font-style: normal;\n    }\n  </style>\n`;\n\ndocument.head.appendChild(template.content);\n\n/**\n * `<vaadin-grid-tree-toggle>` is a helper element for the `<vaadin-grid>`\n * that provides toggle and level display functionality for the item tree.\n *\n * #### Example:\n * ```html\n * <vaadin-grid-column id=\"column\"></vaadin-grid-column>\n * ```\n * ```js\n * const column = document.querySelector('#column');\n * column.renderer = (root, column, model) => {\n *   let treeToggle = root.firstElementChild;\n *   if (!treeToggle) {\n *     treeToggle = document.createElement('vaadin-grid-tree-toggle');\n *     treeToggle.addEventListener('expanded-changed', () => { ... });\n *     root.appendChild(treeToggle);\n *   }\n *   treeToggle.leaf = !model.item.hasChildren;\n *   treeToggle.level = level;\n *   treeToggle.expanded = expanded;\n *   treeToggle.textContent = model.item.name;\n * };\n * ```\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name | Description\n * ---|---\n * `toggle` | The tree toggle icon\n *\n * The following state attributes are available for styling:\n *\n * Attribute    | Description | Part name\n * ---|---|---\n * `expanded` | When present, the toggle is expanded | :host\n * `leaf` | When present, the toggle is not expandable, i. e., the current item is a leaf | :host\n *\n * The following custom CSS properties are available on\n * the `<vaadin-grid-tree-toggle>` element:\n *\n * Custom CSS property | Description | Default\n * ---|---|---\n * `--vaadin-grid-tree-toggle-level-offset` | Visual offset step for each tree sublevel | `1em`\n *\n * @fires {CustomEvent} expanded-changed - Fired when the `expanded` property changes.\n *\n * @extends HTMLElement\n * @mixes ThemableMixin\n */\nclass GridTreeToggle extends ThemableMixin(DirMixin(PolymerElement)) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: inline-flex;\n          align-items: baseline;\n          max-width: 100%;\n\n          /* CSS API for :host */\n          --vaadin-grid-tree-toggle-level-offset: 1em;\n          --_collapsed-icon: '\\\\e7be\\\\00a0';\n        }\n\n        :host([dir='rtl']) {\n          --_collapsed-icon: '\\\\e7bd\\\\00a0';\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n\n        :host(:not([leaf])) {\n          cursor: pointer;\n        }\n\n        #level-spacer,\n        [part='toggle'] {\n          flex: none;\n        }\n\n        #level-spacer {\n          display: inline-block;\n          width: calc(var(---level, '0') * var(--vaadin-grid-tree-toggle-level-offset));\n        }\n\n        [part='toggle']::before {\n          font-family: 'vaadin-grid-tree-icons';\n          line-height: 1em; /* make icon font metrics not affect baseline */\n        }\n\n        :host(:not([expanded])) [part='toggle']::before {\n          content: var(--_collapsed-icon);\n        }\n\n        :host([expanded]) [part='toggle']::before {\n          content: '\\\\e7bc\\\\00a0'; /* icon glyph + single non-breaking space */\n        }\n\n        :host([leaf]) [part='toggle'] {\n          visibility: hidden;\n        }\n\n        slot {\n          display: block;\n          overflow: hidden;\n          text-overflow: ellipsis;\n        }\n      </style>\n\n      <span id=\"level-spacer\"></span>\n      <span part=\"toggle\"></span>\n      <slot></slot>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-grid-tree-toggle';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * Current level of the tree represented with a horizontal offset\n       * of the toggle button.\n       * @type {number}\n       */\n      level: {\n        type: Number,\n        value: 0,\n        observer: '_levelChanged',\n      },\n\n      /**\n       * Hides the toggle icon and disables toggling a tree sublevel.\n       * @type {boolean}\n       */\n      leaf: {\n        type: Boolean,\n        value: false,\n        reflectToAttribute: true,\n      },\n\n      /**\n       * Sublevel toggle state.\n       * @type {boolean}\n       */\n      expanded: {\n        type: Boolean,\n        value: false,\n        reflectToAttribute: true,\n        notify: true,\n      },\n    };\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.addEventListener('click', (e) => this._onClick(e));\n  }\n\n  /** @private */\n  _onClick(e) {\n    if (this.leaf) {\n      return;\n    }\n    if (isFocusable(e.target) || e.target instanceof HTMLLabelElement) {\n      return;\n    }\n\n    e.preventDefault();\n    this.expanded = !this.expanded;\n  }\n\n  /** @private */\n  _levelChanged(level) {\n    const value = Number(level).toString();\n    this.style.setProperty('---level', value);\n  }\n}\n\ncustomElements.define(GridTreeToggle.is, GridTreeToggle);\n\nexport { GridTreeToggle };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './vaadin-grid-tree-toggle.js';\nimport { GridColumn } from './vaadin-grid-column.js';\n\n/**\n * `<vaadin-grid-tree-column>` is a helper element for the `<vaadin-grid>`\n * that provides default renderer and functionality for toggling tree/hierarchical items.\n *\n * #### Example:\n * ```html\n * <vaadin-grid items=\"[[items]]\">\n *  <vaadin-grid-tree-column path=\"name.first\"></vaadin-grid-tree-column>\n *\n *  <vaadin-grid-column>\n *    ...\n * ```\n */\nclass GridTreeColumn extends GridColumn {\n  static get is() {\n    return 'vaadin-grid-tree-column';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * JS Path of the property in the item used as text content for the tree toggle.\n       */\n      path: String,\n\n      /**\n       * JS Path of the property in the item that indicates whether the item has child items.\n       * @attr {string} item-has-children-path\n       * @deprecated Use `grid.itemHasChildrenPath` instead.\n       */\n      itemHasChildrenPath: {\n        type: String,\n        observer: '_itemHasChildrenPathChanged',\n      },\n    };\n  }\n\n  static get observers() {\n    return ['_onRendererOrBindingChanged(_renderer, _cells, _cells.*, path, itemHasChildrenPath)'];\n  }\n\n  constructor() {\n    super();\n\n    this.__boundOnExpandedChanged = this.__onExpandedChanged.bind(this);\n  }\n\n  /**\n   * Renders the grid tree toggle to the body cell\n   *\n   * @private\n   */\n  __defaultRenderer(root, _column, { item, expanded, level }) {\n    let toggle = root.firstElementChild;\n    if (!toggle) {\n      toggle = document.createElement('vaadin-grid-tree-toggle');\n      toggle.addEventListener('expanded-changed', this.__boundOnExpandedChanged);\n      root.appendChild(toggle);\n    }\n\n    toggle.__item = item;\n    toggle.__rendererExpanded = expanded;\n    toggle.expanded = expanded;\n    toggle.leaf = this.__isLeafItem(item, this._grid.itemHasChildrenPath);\n    toggle.textContent = this.__getToggleContent(this.path, item);\n    toggle.level = level;\n  }\n\n  /**\n   * The tree column doesn't allow to use a custom renderer\n   * to override the content of body cells.\n   * It always renders the grid tree toggle to body cells.\n   *\n   * @override\n   */\n  _computeRenderer() {\n    return this.__defaultRenderer;\n  }\n\n  /** @private */\n  _itemHasChildrenPathChanged(itemHasChildrenPath) {\n    if (itemHasChildrenPath) {\n      console.warn(\n        `WARNING: Since Vaadin 23, itemHasChildrenPath on <vaadin-grid-tree-column> is deprecated. Please set this property on the <vaadin-grid> instead.`,\n      );\n\n      if (this._grid) {\n        this._grid.itemHasChildrenPath = itemHasChildrenPath;\n      }\n    }\n  }\n\n  /**\n   * Expands or collapses the row once the tree toggle is switched.\n   * The listener handles only user-fired events.\n   *\n   * @private\n   */\n  __onExpandedChanged(e) {\n    // Skip if the state is changed by the renderer.\n    if (e.detail.value === e.target.__rendererExpanded) {\n      return;\n    }\n\n    if (e.detail.value) {\n      this._grid.expandItem(e.target.__item);\n    } else {\n      this._grid.collapseItem(e.target.__item);\n    }\n  }\n\n  /** @private */\n  __isLeafItem(item, itemHasChildrenPath) {\n    return !item || !item[itemHasChildrenPath];\n  }\n\n  /** @private */\n  __getToggleContent(path, item) {\n    return path && this.get(path, item);\n  }\n}\n\ncustomElements.define(GridTreeColumn.is, GridTreeColumn);\n\nexport { GridTreeColumn };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * Dummy custom element used for collecting\n * development time usage statistics.\n *\n * @private\n */\nclass Material extends HTMLElement {\n  static get version() {\n    return '23.5.11';\n  }\n}\n\ncustomElements.define('vaadin-material-styles', Material);\n\nexport { Material };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst colorLight = css`\n  :host {\n    /* Text colors */\n    --material-body-text-color: var(--light-theme-text-color, rgba(0, 0, 0, 0.87));\n    --material-secondary-text-color: var(--light-theme-secondary-color, rgba(0, 0, 0, 0.54));\n    --material-disabled-text-color: var(--light-theme-disabled-color, rgba(0, 0, 0, 0.38));\n\n    /* Primary colors */\n    --material-primary-color: var(--primary-color, #6200ee);\n    --material-primary-contrast-color: var(--dark-theme-base-color, #fff);\n    --material-primary-text-color: var(--material-primary-color);\n\n    /* Error colors */\n    --material-error-color: var(--error-color, #b00020);\n    --material-error-text-color: var(--material-error-color);\n\n    /* Background colors */\n    --material-background-color: var(--light-theme-background-color, #fff);\n    --material-secondary-background-color: var(--light-theme-secondary-background-color, #f5f5f5);\n    --material-disabled-color: rgba(0, 0, 0, 0.26);\n\n    /* Divider colors */\n    --material-divider-color: rgba(0, 0, 0, 0.12);\n\n    /* Undocumented internal properties (prefixed with three dashes) */\n\n    /* Text field tweaks */\n    --_material-text-field-input-line-background-color: initial;\n    --_material-text-field-input-line-opacity: initial;\n    --_material-text-field-input-line-hover-opacity: initial;\n    --_material-text-field-focused-label-opacity: initial;\n\n    /* Button tweaks */\n    --_material-button-raised-background-color: initial;\n    --_material-button-outline-color: initial;\n\n    /* Grid tweaks */\n    --_material-grid-row-hover-background-color: initial;\n\n    /* Split layout tweaks */\n    --_material-split-layout-splitter-background-color: initial;\n\n    background-color: var(--material-background-color);\n    color: var(--material-body-text-color);\n  }\n\n  [theme~='dark'] {\n    /* Text colors */\n    --material-body-text-color: var(--dark-theme-text-color, rgba(255, 255, 255, 1));\n    --material-secondary-text-color: var(--dark-theme-secondary-color, rgba(255, 255, 255, 0.7));\n    --material-disabled-text-color: var(--dark-theme-disabled-color, rgba(255, 255, 255, 0.5));\n\n    /* Primary colors */\n    --material-primary-color: var(--light-primary-color, #7e3ff2);\n    --material-primary-text-color: #b794f6;\n\n    /* Error colors */\n    --material-error-color: var(--error-color, #de2839);\n    --material-error-text-color: var(--material-error-color);\n\n    /* Background colors */\n    --material-background-color: var(--dark-theme-background-color, #303030);\n    --material-secondary-background-color: var(--dark-theme-secondary-background-color, #3b3b3b);\n    --material-disabled-color: rgba(255, 255, 255, 0.3);\n\n    /* Divider colors */\n    --material-divider-color: rgba(255, 255, 255, 0.12);\n\n    /* Undocumented internal properties (prefixed with three dashes) */\n\n    /* Text field tweaks */\n    --_material-text-field-input-line-background-color: #fff;\n    --_material-text-field-input-line-opacity: 0.7;\n    --_material-text-field-input-line-hover-opacity: 1;\n    --_material-text-field-focused-label-opacity: 1;\n\n    /* Button tweaks */\n    --_material-button-raised-background-color: rgba(255, 255, 255, 0.08);\n    --_material-button-outline-color: rgba(255, 255, 255, 0.2);\n\n    /* Grid tweaks */\n    --_material-grid-row-hover-background-color: rgba(255, 255, 255, 0.08);\n    --_material-grid-row-selected-overlay-opacity: 0.16;\n\n    /* Split layout tweaks */\n    --_material-split-layout-splitter-background-color: rgba(255, 255, 255, 0.8);\n\n    background-color: var(--material-background-color);\n    color: var(--material-body-text-color);\n  }\n\n  a {\n    color: inherit;\n  }\n`;\n\nregisterStyles('', colorLight, { moduleId: 'material-color-light' });\n\nconst colorDark = css`\n  :host {\n    /* Text colors */\n    --material-body-text-color: var(--dark-theme-text-color, rgba(255, 255, 255, 1));\n    --material-secondary-text-color: var(--dark-theme-secondary-color, rgba(255, 255, 255, 0.7));\n    --material-disabled-text-color: var(--dark-theme-disabled-color, rgba(255, 255, 255, 0.5));\n\n    /* Primary colors */\n    --material-primary-color: var(--light-primary-color, #7e3ff2);\n    --material-primary-text-color: #b794f6;\n\n    /* Error colors */\n    --material-error-color: var(--error-color, #de2839);\n    --material-error-text-color: var(--material-error-color);\n\n    /* Background colors */\n    --material-background-color: var(--dark-theme-background-color, #303030);\n    --material-secondary-background-color: var(--dark-theme-secondary-background-color, #3b3b3b);\n    --material-disabled-color: rgba(255, 255, 255, 0.3);\n\n    /* Divider colors */\n    --material-divider-color: rgba(255, 255, 255, 0.12);\n\n    /* Undocumented internal properties (prefixed with three dashes) */\n\n    /* Text field tweaks */\n    --_material-text-field-input-line-background-color: #fff;\n    --_material-text-field-input-line-opacity: 0.7;\n    --_material-text-field-input-line-hover-opacity: 1;\n    --_material-text-field-focused-label-opacity: 1;\n\n    /* Button tweaks */\n    --_material-button-raised-background-color: rgba(255, 255, 255, 0.08);\n    --_material-button-outline-color: rgba(255, 255, 255, 0.2);\n\n    /* Grid tweaks */\n    --_material-grid-row-hover-background-color: rgba(255, 255, 255, 0.08);\n    --_material-grid-row-selected-overlay-opacity: 0.16;\n\n    /* Split layout tweaks */\n    --_material-split-layout-splitter-background-color: rgba(255, 255, 255, 0.8);\n\n    background-color: var(--material-background-color);\n    color: var(--material-body-text-color);\n  }\n`;\n\nregisterStyles('', colorDark, { moduleId: 'material-color-dark' });\n\nconst colorBase = css`\n  :host {\n    /* Text colors */\n    --material-body-text-color: var(--light-theme-text-color, rgba(0, 0, 0, 0.87));\n    --material-secondary-text-color: var(--light-theme-secondary-color, rgba(0, 0, 0, 0.54));\n    --material-disabled-text-color: var(--light-theme-disabled-color, rgba(0, 0, 0, 0.38));\n\n    /* Primary colors */\n    --material-primary-color: var(--primary-color, #6200ee);\n    --material-primary-contrast-color: var(--dark-theme-base-color, #fff);\n    --material-primary-text-color: var(--material-primary-color);\n\n    /* Error colors */\n    --material-error-color: var(--error-color, #b00020);\n    --material-error-text-color: var(--material-error-color);\n\n    /* Background colors */\n    --material-background-color: var(--light-theme-background-color, #fff);\n    --material-secondary-background-color: var(--light-theme-secondary-background-color, #f5f5f5);\n    --material-disabled-color: rgba(0, 0, 0, 0.26);\n\n    /* Divider colors */\n    --material-divider-color: rgba(0, 0, 0, 0.12);\n  }\n`;\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${colorBase.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { colorBase, colorDark, colorLight };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst font = css`\n  :host {\n    /* Font family */\n    --material-font-family: 'Roboto', sans-serif;\n\n    /* Font sizes */\n    --material-h1-font-size: 6rem;\n    --material-h2-font-size: 3.75rem;\n    --material-h3-font-size: 3rem;\n    --material-h4-font-size: 2.125rem;\n    --material-h5-font-size: 1.5rem;\n    --material-h6-font-size: 1.25rem;\n    --material-body-font-size: 1rem;\n    --material-small-font-size: 0.875rem;\n    --material-button-font-size: 0.875rem;\n    --material-caption-font-size: 0.75rem;\n\n    /* Icon size */\n    --material-icon-font-size: 20px;\n  }\n`;\n\nconst typography = css`\n  body,\n  :host {\n    font-family: var(--material-font-family);\n    font-size: var(--material-body-font-size);\n    line-height: 1.4;\n    -webkit-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    color: inherit;\n    line-height: 1.1;\n    margin-top: 1.5em;\n  }\n\n  h1 {\n    font-size: var(--material-h3-font-size);\n    font-weight: 300;\n    letter-spacing: -0.015em;\n    margin-bottom: 1em;\n    text-indent: -0.07em;\n  }\n\n  h2 {\n    font-size: var(--material-h4-font-size);\n    font-weight: 300;\n    letter-spacing: -0.01em;\n    margin-bottom: 0.75em;\n    text-indent: -0.07em;\n  }\n\n  h3 {\n    font-size: var(--material-h5-font-size);\n    font-weight: 400;\n    margin-bottom: 0.75em;\n    text-indent: -0.05em;\n  }\n\n  h4 {\n    font-size: var(--material-h6-font-size);\n    font-weight: 400;\n    letter-spacing: 0.01em;\n    margin-bottom: 0.75em;\n    text-indent: -0.05em;\n  }\n\n  h5 {\n    font-size: var(--material-body-font-size);\n    font-weight: 500;\n    margin-bottom: 0.5em;\n    text-indent: -0.025em;\n  }\n\n  h6 {\n    font-size: var(--material-small-font-size);\n    font-weight: 500;\n    letter-spacing: 0.01em;\n    margin-bottom: 0.25em;\n    text-indent: -0.025em;\n  }\n\n  a,\n  b,\n  strong {\n    font-weight: 500;\n  }\n`;\n\nregisterStyles('', typography, { moduleId: 'material-typography' });\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${font.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { font, typography };\n\n/* Import Roboto from Google Fonts */\nif (!window.polymerSkipLoadingFontRoboto) {\n  /* prettier-ignore */\n  const font = 'https://fonts.googleapis.com/css?family=Roboto+Mono:400,700|Roboto:400,300,300italic,400italic,500,500italic,700,700italic';\n  const link = document.createElement('link');\n  link.rel = 'stylesheet';\n  link.type = 'text/css';\n  link.crossOrigin = 'anonymous';\n  link.href = font;\n  document.head.appendChild(link);\n}\n","import '@vaadin/vaadin-material-styles/color.js';\nimport '@vaadin/vaadin-material-styles/typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-grid',\n  css`\n    :host {\n      background-color: var(--material-background-color);\n      font-family: var(--material-font-family);\n      font-size: var(--material-small-font-size);\n      line-height: 20px;\n      color: var(--material-body-text-color);\n    }\n\n    :host([disabled]) {\n      opacity: 0.7;\n    }\n\n    [part~='cell'] {\n      min-height: 48px;\n      -webkit-tap-highlight-color: transparent;\n    }\n\n    [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      padding: 8px 16px;\n    }\n\n    [part~='details-cell'] ::slotted(vaadin-grid-cell-content) {\n      padding: 14px 16px;\n    }\n\n    [part~='header-cell'],\n    [part~='footer-cell'] {\n      background-color: var(--material-background-color);\n      color: var(--material-secondary-text-color);\n      font-size: var(--material-caption-font-size);\n      font-weight: 500;\n    }\n\n    /* Header and footer divider between body rows */\n\n    [part~='body-cell'],\n    [part~='details-cell'],\n    [part~='row']:last-child > [part~='header-cell'] {\n      border-bottom: 1px solid var(--material-divider-color);\n    }\n\n    [part~='row']:first-child > [part~='footer-cell'] {\n      border-top: 1px solid var(--material-divider-color);\n    }\n\n    /* Body rows/cells */\n\n    [part~='body-cell'] {\n      background-color: var(--material-background-color);\n    }\n\n    [part~='row']:hover > [part~='body-cell'] {\n      background: linear-gradient(\n          var(--_material-grid-row-hover-background-color, rgba(0, 0, 0, 0.04)),\n          var(--_material-grid-row-hover-background-color, rgba(0, 0, 0, 0.04))\n        )\n        var(--material-background-color);\n    }\n\n    @media (hover: none) {\n      [part~='row']:hover > [part~='body-cell'] {\n        background: var(--material-background-color);\n      }\n    }\n\n    /* Selected row */\n\n    [part~='body-cell']::before {\n      content: '';\n      pointer-events: none;\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      background-color: var(--material-primary-color);\n      opacity: 0;\n      transition: opacity 0.1s cubic-bezier(0.4, 0, 0.2, 0.1);\n    }\n\n    :host(:not([reordering])) [part~='row'][selected] > [part~='body-cell']::before {\n      opacity: var(--_material-grid-row-selected-overlay-opacity, 0.08);\n    }\n\n    [part~='body-cell'] ::slotted(vaadin-grid-cell-content) {\n      /* NOTE(platosha): Raise cell content above background cell pseudo elements */\n      position: relative;\n    }\n\n    /* Column reordering */\n\n    :host([reordering]) [part~='cell'] {\n      background: var(--material-secondary-background-color);\n    }\n\n    :host([reordering]) [part~='cell'][reorder-status='allowed'] {\n      background: var(--material-background-color);\n    }\n\n    :host([reordering]) [part~='cell'][reorder-status='dragging'] {\n      background: var(--material-background-color);\n    }\n\n    /* Frozen columns */\n\n    [part~='cell'][last-frozen] {\n      border-right: 1px solid var(--material-divider-color);\n    }\n\n    [part~='cell'][first-frozen-to-end] {\n      border-left: 1px solid var(--material-divider-color);\n    }\n\n    /* Column resizing */\n\n    [part~='cell']:not([last-frozen]) [part='resize-handle'] {\n      border-right: 1px solid var(--material-divider-color);\n    }\n\n    /* Keyboard navigation */\n\n    [part~='row'] {\n      position: relative;\n    }\n\n    [part~='row']:focus,\n    [part~='focused-cell']:focus {\n      outline: none;\n    }\n\n    :host([navigating]) [part~='row']:focus::before,\n    :host([navigating]) [part~='focused-cell']:focus {\n      box-shadow: inset 0 0 0 2px var(--material-primary-color);\n    }\n\n    :host([navigating]) [part~='row']:focus::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      pointer-events: none;\n      transform: translateX(calc(-1 * var(--_grid-horizontal-scroll-position)));\n      z-index: 3;\n    }\n\n    /* Drag and Drop styles */\n    :host([dragover])::after {\n      content: '';\n      position: absolute;\n      z-index: 100;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      pointer-events: none;\n      box-shadow: inset 0 0 0 2px var(--material-primary-color);\n    }\n\n    [part~='row'][dragover] {\n      z-index: 100 !important;\n    }\n\n    [part~='row'][dragover] [part~='cell'] {\n      overflow: visible;\n    }\n\n    [part~='row'][dragover] [part~='cell']::after {\n      content: '';\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      height: 3px;\n      pointer-events: none;\n      background: var(--material-primary-color);\n    }\n\n    [part~='row'][dragover='below'] [part~='cell']::after {\n      top: 100%;\n      bottom: auto;\n      margin-top: -1px;\n    }\n\n    :host([all-rows-visible]) [part~='row'][last][dragover='below'] [part~='cell']::after {\n      height: 1px;\n    }\n\n    [part~='row'][dragover='above'] [part~='cell']::after {\n      top: auto;\n      bottom: 100%;\n      margin-bottom: -1px;\n    }\n\n    [part~='row'][details-opened][dragover='below'] [part~='cell']:not([part~='details-cell'])::after,\n    [part~='row'][details-opened][dragover='above'] [part~='details-cell']::after {\n      display: none;\n    }\n\n    [part~='row'][dragover][dragover='on-top'] [part~='cell']::after {\n      height: 100%;\n      opacity: 0.5;\n    }\n\n    [part~='row'][dragstart] {\n      z-index: 100 !important;\n      opacity: 0.9;\n    }\n\n    [part~='row'][dragstart] [part~='cell'] {\n      border: none !important;\n      box-shadow: none !important;\n    }\n\n    #scroller [part~='row'][dragstart]:not([dragstart=''])::after {\n      display: block;\n      position: absolute;\n      left: var(--_grid-drag-start-x);\n      top: var(--_grid-drag-start-y);\n      z-index: 100;\n      content: attr(dragstart);\n      align-items: center;\n      justify-content: center;\n      box-sizing: border-box;\n      padding: 4px;\n      color: var(--material-primary-contrast-color);\n      background-color: var(--material-error-color);\n      min-width: 24px;\n      border-radius: 2px;\n      font-size: var(--material-caption-font-size);\n      text-align: center;\n      line-height: 1;\n    }\n\n    /* RTL specific styles */\n\n    :host([dir='rtl']) [part~='cell'][last-frozen] {\n      border-right: none;\n      border-left: 1px solid var(--material-divider-color);\n    }\n\n    :host([dir='rtl']) [part~='cell'][first-frozen-to-end] {\n      border-left: none;\n      border-right: 1px solid var(--material-divider-color);\n    }\n\n    :host([dir='rtl']) [part~='cell']:not([last-frozen]) [part='resize-handle'] {\n      border-right: none;\n      border-left: 1px solid var(--material-divider-color);\n    }\n\n    :host([dir='rtl']) #scroller [part~='row'][dragstart]:not([dragstart=''])::after {\n      left: auto;\n      right: var(--_grid-drag-start-x);\n    }\n  `,\n  { moduleId: 'material-grid' },\n);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint import/no-extraneous-dependencies: \"off\" */\n/* eslint camelcase: \"off\" */\n\nimport '@vaadin/vaadin-material-styles/color';\nimport '@vaadin/vaadin-material-styles/typography';\nimport { html } from '@polymer/polymer/lib/utils/html-tag';\n\nconst $_documentContainer = html`<dom-module id=\"sw-grid\" theme-for=\"vaadin-grid\">\n  <template>\n    <style>\n      :host {\n        background-color: var(--material-background-color);\n        font-family: var(--material-font-family);\n        font-size: var(--material-small-font-size);\n        line-height: 20px;\n        color: var(--material-body-text-color);\n      }\n\n      [part~=\"cell\"] {\n        min-height: 38px;\n        -webkit-tap-highlight-color: transparent;\n      }\n\n      [part~=\"cell\"] ::slotted(vaadin-grid-cell-content) {\n        padding: 8px 16px;\n      }\n\n      [part~=\"details-cell\"] ::slotted(vaadin-grid-cell-content) {\n        padding: 14px 16px;\n      }\n      \n      #table{\n        height: auto;\n        max-height: var(--ld-grid-styles-table-max-height, 45em);\n      }\n\n      [part~=\"header-cell\"],\n      [part~=\"footer-cell\"] {\n        /*background-color: var(--material-background-color);*/\n        background-image: linear-gradient(to bottom,#fafafa 2%,#efefef 98%);\n        border-bottom: 1px solid #d4d4d4;\n        color: var(--material-secondary-text-color);\n        font-size: var(--material-caption-font-size);\n        font-weight: 700;\n      }\n\n      /* Header and footer divider between body rows */\n\n      [part~=\"body-cell\"],\n      [part~=\"details-cell\"],\n      [part~=\"row\"]:last-child > [part~=\"header-cell\"] {\n        border-bottom: 1px solid var(--material-divider-color);\n      }\n\n      [part~=\"row\"]:first-child > [part~=\"footer-cell\"] {\n        border-top: 1px solid var(--material-divider-color);\n      }\n\n      /* Body rows/cells */\n\n      [part~=\"body-cell\"] {\n        background-color: var(--material-background-color);\n      }\n\n      [part~=\"row\"]:hover > [part~=\"body-cell\"]{\n        background: #E4002B;\n      }\n\n      \n\n      /* Selected row */\n\n      [part~=\"body-cell\"]::before {\n        content: \"\";\n        pointer-events: none;\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        background-color: var(--material-primary-color);\n        opacity: 0;\n        transition: opacity .1s cubic-bezier(.4, 0, .2, .1);\n      }\n\n      [part~=\"row\"]:hover {\n        --anchor-color: #fff;\n        color: #fff;\n\n      }\n\n      :host(:not([reordering])) [part~=\"row\"][selected] > [part~=\"body-cell\"]::before {\n        background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n        color: #c8dbed;\n        text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n        border-right-color: #1d69b4;\n      }\n\n      [part~=\"body-cell\"] ::slotted(vaadin-grid-cell-content) {\n        /* NOTE(platosha): Raise cell content above background cell pseudo elements */\n        position: relative;\n      }\n\n      /* Column reordering */\n\n      :host([reordering]) [part~=\"cell\"] {\n        background: var(--material-secondary-background-color);\n      }\n\n      :host([reordering]) [part~=\"cell\"][reorder-status=\"allowed\"] {\n        background: var(--material-background-color);\n      }\n\n      :host([reordering]) [part~=\"cell\"][reorder-status=\"dragging\"] {\n        background: var(--material-background-color);\n      }\n\n      /* Frozen columns */\n\n      [part~=\"cell\"][last-frozen] {\n        border-right: 1px solid var(--material-divider-color);\n      }\n\n      /* Column resizing */\n\n      :host(:not([theme~=\"column-dividers\"])) [part~=\"cell\"]:not([last-frozen]) [part=\"resize-handle\"] {\n        border-right: 1px solid var(--material-divider-color);\n        right: -1px;\n      }\n\n      /* Row stripes */\n\n      :host([theme~=\"row-stripes\"]) [part~=\"row\"]:not([odd]) [part~=\"details-cell\"] {\n        background-image: linear-gradient(var(--lumo-contrast-5pct), var(--lumo-contrast-5pct));\n        background-repeat: repeat-x;\n        background: linear-gradient(var(--_material-grid-row-hover-background-color, rgba(0, 0, 0, 0.04)), var(--_material-grid-row-hover-background-color, rgba(0, 0, 0, 0.04))) var(--material-background-color);\n      }\n\n      /* Wrap cell contents */ \n\n      :host([theme~=\"wrap-cell-content\"]) [part~=\"cell\"] ::slotted(vaadin-grid-cell-content) {\n        white-space: nowrap;\n      }\n\n      /* Keyboard navigation */\n\n      [part~=\"cell\"]:focus {\n        outline: none;\n      }\n\n      :host([navigating]) [part~=\"cell\"]:focus {\n        box-shadow: inset 0 0 0 2px var(--material-primary-color);\n      }\n    </style>\n  </template>\n</dom-module>\n\n<dom-module id=\"custom-item-style\" theme-for=\"vaadin-item\">\n  <template>\n    <style>\n      :host(:hover[theme~=\"custom\"]) {\n        text-decoration: none;\n        color: #fff;\n        background-color: #E4002B !important;\n      }\n\n      :host(:hover[theme~=\"custom\"]) ::slotted(a) {\n        text-decoration: none;\n        color: #fff;\n      }\n\n      :host([theme~=\"custom\"]) ::slotted(a) {\n        text-decoration: none;\n        color: #000;\n      }\n    </style>\n  </template>\n</dom-module>`;\n\ndocument.head.appendChild($_documentContainer.content);\n","/**\n * @license\n * Copyright (c) 2021 - 2022 Vaadin Ltd.\n * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/\n */\nimport { PolymerElement } from '@polymer/polymer';\nimport { templatize } from '@polymer/polymer/lib/utils/templatize.js';\n\nexport class Templatizer extends PolymerElement {\n  static create(component, template) {\n    const templatizer = new this();\n    templatizer.__template = template;\n    templatizer.__component = component;\n    return templatizer;\n  }\n\n  static get is() {\n    return 'vaadin-template-renderer-templatizer';\n  }\n\n  constructor() {\n    super();\n\n    this.__template = null;\n    this.__component = null;\n    this.__TemplateClass = null;\n    this.__templateInstances = new Set();\n  }\n\n  /**\n   * If the template instance was created by this templatizer's instance and is still attached to DOM,\n   * it only re-renders the instance with the new properties.\n   * Otherwise, it disposes of the old template instance (if it exists),\n   * creates a new template instance with the given properties and renders the instance's root to the element.\n   */\n  render(element, properties = {}) {\n    let instance = element.__templateInstance;\n\n    if (this.__hasTemplateInstance(instance) && this.__isTemplateInstanceAttachedToDOM(instance)) {\n      this.__updateProperties(instance, properties);\n      return;\n    }\n\n    if (this.__hasTemplateInstance(instance)) {\n      this.__disposeOfTemplateInstance(instance);\n    }\n\n    instance = this.__createTemplateInstance(properties);\n    element.__templateInstance = instance;\n    element.innerHTML = '';\n    element.appendChild(instance.root);\n  }\n\n  /** @private */\n  __updateProperties(instance, properties) {\n    // The Polymer uses `===` to check whether a property is changed and should be re-rendered.\n    // This means, object properties won't be re-rendered when mutated inside.\n    // This workaround forces the `item` property to re-render even\n    // the new item is strictly equal to the old item.\n    if (instance.item === properties.item) {\n      instance._setPendingProperty('item');\n    }\n\n    instance.__properties = properties;\n    instance.setProperties(properties);\n  }\n\n  /** @private */\n  __createTemplateInstance(properties) {\n    this.__createTemplateClass(properties);\n\n    const instance = new this.__TemplateClass(properties);\n    instance.__properties = properties;\n\n    this.__templateInstances.add(instance);\n\n    return instance;\n  }\n\n  /** @private */\n  __disposeOfTemplateInstance(instance) {\n    this.__templateInstances.delete(instance);\n  }\n\n  /** @private */\n  __hasTemplateInstance(instance) {\n    return this.__templateInstances.has(instance);\n  }\n\n  /** @private */\n  __isTemplateInstanceAttachedToDOM(instance) {\n    // The edge-case case when the template is empty\n    if (instance.children.length === 0) {\n      return false;\n    }\n\n    return !!instance.children[0].parentElement;\n  }\n\n  /** @private */\n  __createTemplateClass(properties) {\n    if (this.__TemplateClass) {\n      return;\n    }\n\n    const instanceProps = Object.keys(properties).reduce((accum, key) => {\n      return { ...accum, [key]: true };\n    }, {});\n\n    this.__TemplateClass = templatize(this.__template, this, {\n      // Events handled by declarative event listeners\n      // (`on-event=\"handler\"`) will be decorated with a `model` property pointing\n      // to the template instance that stamped it.\n      parentModel: true,\n      // This property prevents the template instance properties\n      // from passing into the `forwardHostProp` callback\n      instanceProps,\n\n      // When changing a property of the data host component, this callback forwards\n      // the changed property to the template instances so that cause their re-rendering.\n      forwardHostProp(prop, value) {\n        this.__templateInstances.forEach((instance) => {\n          instance.forwardHostProp(prop, value);\n        });\n      },\n\n      notifyInstanceProp(instance, path, value) {\n        let rootProperty;\n\n        // Extracts the root property name from the path\n        rootProperty = path.split('.')[0];\n        // Capitalizes the property name\n        rootProperty = rootProperty[0].toUpperCase() + rootProperty.slice(1);\n\n        const callback = `_on${rootProperty}PropertyChanged`;\n\n        if (this[callback]) {\n          this[callback](instance, path, value);\n        }\n      },\n    });\n  }\n}\n\ncustomElements.define(Templatizer.is, Templatizer);\n","/**\n * @license\n * Copyright (c) 2021 - 2022 Vaadin Ltd.\n * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/\n */\nimport { Templatizer } from './template-renderer-templatizer.js';\n\nexport class GridTemplatizer extends Templatizer {\n  /**\n   * @override\n   */\n  static get is() {\n    return 'vaadin-template-renderer-grid-templatizer';\n  }\n\n  /**\n   * Updates the grid items once an item's nested property is changed.\n   *\n   * Note: The templatizer doesn't support 2-way binding for items provided by custom data provider.\n   * Note: The templatizer doesn't support 2-way binding for the whole item:\n   * <div>{{item}}</div> - not allowed.\n   * <div>{{item.title}}</div> - allowed.\n   *\n   * @protected\n   */\n  _onItemPropertyChanged(instance, path, value) {\n    // Supports 2-way binding only for nested `item` properties.\n    if (path === 'item') {\n      return;\n    }\n\n    // Supports 2-way binding only for items provided by the array data provider.\n    if (!Array.isArray(this.__grid.items)) {\n      return;\n    }\n\n    const index = this.__grid.items.indexOf(instance.item);\n\n    path = path.replace(/^item\\./, '');\n    path = `items.${index}.${path}`;\n\n    this.__grid.notifyPath(path, value);\n  }\n\n  /**\n   * Expands or collapses the item once the `expanded` property is changed.\n   * The listener handles only user-fired changes.\n   *\n   * @protected\n   */\n  _onExpandedPropertyChanged(instance, _path, value) {\n    // Skip if the value is changed by the templatizer.\n    if (instance.__properties.expanded === value) {\n      return;\n    }\n\n    if (value) {\n      this.__grid.expandItem(instance.item);\n    } else {\n      this.__grid.collapseItem(instance.item);\n    }\n  }\n\n  /**\n   * Selects or deselects the item once the `selected` property is changed.\n   * The listener handles only user-fired changes.\n   *\n   * @protected\n   */\n  _onSelectedPropertyChanged(instance, _path, value) {\n    // Skip if the value is changed by the templatizer.\n    if (instance.__properties.selected === value) {\n      return;\n    }\n\n    if (value) {\n      this.__grid.selectItem(instance.item);\n    } else {\n      this.__grid.deselectItem(instance.item);\n    }\n  }\n\n  /**\n   * Opens or closes the details for the item once the `detailsOpened` property is changed.\n   * The listener handles only user-fired changes.\n   *\n   * @protected\n   */\n  _onDetailsOpenedPropertyChanged(instance, _path, value) {\n    // Skip if the value is changed by the templatizer.\n    if (instance.__properties.detailsOpened === value) {\n      return;\n    }\n\n    if (value) {\n      this.__grid.openItemDetails(instance.item);\n    } else {\n      this.__grid.closeItemDetails(instance.item);\n    }\n  }\n\n  /**\n   * Returns a reference to the grid which the templatizer is connected to.\n   *\n   * @private\n   */\n  get __grid() {\n    if (this.__component.__gridElement) {\n      return this.__component;\n    }\n\n    return this.__component._grid;\n  }\n}\n\ncustomElements.define(GridTemplatizer.is, GridTemplatizer);\n","/**\n * @license\n * Copyright (c) 2021 - 2022 Vaadin Ltd.\n * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { GridTemplatizer } from './template-renderer-grid-templatizer.js';\nimport { Templatizer } from './template-renderer-templatizer.js';\n\nfunction createRenderer(component, template, TemplatizerClass = Templatizer) {\n  const templatizer = TemplatizerClass.create(component, template);\n\n  const renderer = (root, _owner, model) => {\n    templatizer.render(root, model);\n  };\n\n  template.__templatizer = templatizer;\n  renderer.__templatized = true;\n\n  return renderer;\n}\n\nfunction assignRenderer(component, rendererName, renderer) {\n  const oldRenderer = component[rendererName];\n\n  if (oldRenderer && !oldRenderer.__templatized) {\n    const tag = component.localName;\n\n    throw new Error(`Cannot use both a template and a renderer for <${tag} />.`);\n  }\n\n  component[rendererName] = renderer;\n}\n\nfunction showTemplateWarning(component) {\n  if (component.__suppressTemplateWarning) {\n    return;\n  }\n\n  if (component.hasAttribute('suppress-template-warning')) {\n    return;\n  }\n\n  console.warn(\n    `WARNING: <template> inside <${component.localName}> is deprecated. Use a renderer function instead (see https://vaad.in/template-renderer)`,\n  );\n\n  component.__suppressTemplateWarning = true;\n}\n\nfunction processGridTemplate(grid, template) {\n  if (template.matches('.row-details')) {\n    const renderer = createRenderer(grid, template, GridTemplatizer);\n    assignRenderer(grid, 'rowDetailsRenderer', renderer);\n  }\n}\n\nfunction processGridColumnTemplate(column, template) {\n  if (template.matches('.header')) {\n    const renderer = createRenderer(column, template);\n    assignRenderer(column, 'headerRenderer', renderer);\n    return;\n  }\n\n  if (template.matches('.footer')) {\n    const renderer = createRenderer(column, template);\n    assignRenderer(column, 'footerRenderer', renderer);\n    return;\n  }\n\n  if (template.matches('.editor')) {\n    const renderer = createRenderer(column, template, GridTemplatizer);\n    assignRenderer(column, 'editModeRenderer', renderer);\n    return;\n  }\n\n  const renderer = createRenderer(column, template, GridTemplatizer);\n  assignRenderer(column, 'renderer', renderer);\n}\n\nfunction processTemplate(component, template) {\n  showTemplateWarning(component);\n\n  if (component.__gridElement) {\n    processGridTemplate(component, template);\n    return;\n  }\n\n  if (component.__gridColumnElement) {\n    processGridColumnTemplate(component, template);\n    return;\n  }\n\n  const renderer = createRenderer(component, template);\n  assignRenderer(component, 'renderer', renderer);\n}\n\nfunction processTemplates(component) {\n  FlattenedNodesObserver.getFlattenedNodes(component)\n    .filter((child) => {\n      return child instanceof HTMLTemplateElement;\n    })\n    .forEach((template) => {\n      // Ignore templates which have been processed earlier\n      if (template.__templatizer) {\n        return;\n      }\n\n      processTemplate(component, template);\n    });\n}\n\nfunction observeTemplates(component) {\n  if (component.__templateObserver) {\n    return;\n  }\n\n  component.__templateObserver = new FlattenedNodesObserver(component, () => {\n    processTemplates(component);\n  });\n}\n\n/**\n * Public API\n */\nwindow.Vaadin = window.Vaadin || {};\nwindow.Vaadin.templateRendererCallback = (component) => {\n  processTemplates(component);\n  observeTemplates(component);\n};\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../color.js';\nimport '../spacing.js';\nimport '../style.js';\nimport '../typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst overlay = css`\n  :host {\n    top: var(--lumo-space-m);\n    right: var(--lumo-space-m);\n    bottom: var(--lumo-space-m);\n    left: var(--lumo-space-m);\n    /* Workaround for Edge issue (only on Surface), where an overflowing vaadin-list-box inside vaadin-select-overlay makes the overlay transparent */\n    /* stylelint-disable-next-line */\n    outline: 0px solid transparent;\n  }\n\n  [part='overlay'] {\n    background-color: var(--lumo-base-color);\n    background-image: linear-gradient(var(--lumo-tint-5pct), var(--lumo-tint-5pct));\n    border-radius: var(--lumo-border-radius-m);\n    box-shadow: 0 0 0 1px var(--lumo-shade-5pct), var(--lumo-box-shadow-m);\n    color: var(--lumo-body-text-color);\n    font-family: var(--lumo-font-family);\n    font-size: var(--lumo-font-size-m);\n    font-weight: 400;\n    line-height: var(--lumo-line-height-m);\n    letter-spacing: 0;\n    text-transform: none;\n    -webkit-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n  [part='content'] {\n    padding: var(--lumo-space-xs);\n  }\n\n  [part='backdrop'] {\n    background-color: var(--lumo-shade-20pct);\n    animation: 0.2s lumo-overlay-backdrop-enter both;\n    will-change: opacity;\n  }\n\n  @keyframes lumo-overlay-backdrop-enter {\n    0% {\n      opacity: 0;\n    }\n  }\n\n  :host([closing]) [part='backdrop'] {\n    animation: 0.2s lumo-overlay-backdrop-exit both;\n  }\n\n  @keyframes lumo-overlay-backdrop-exit {\n    100% {\n      opacity: 0;\n    }\n  }\n\n  @keyframes lumo-overlay-dummy-animation {\n    0% {\n      opacity: 1;\n    }\n\n    100% {\n      opacity: 1;\n    }\n  }\n`;\n\nregisterStyles('', overlay, { moduleId: 'lumo-overlay' });\n\nexport { overlay };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport '../spacing.js';\nimport '../style.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\nimport { overlay } from './overlay.js';\n\nconst menuOverlayCore = css`\n  :host([opening]),\n  :host([closing]) {\n    animation: 0.14s lumo-overlay-dummy-animation;\n  }\n\n  [part='overlay'] {\n    will-change: opacity, transform;\n  }\n\n  :host([opening]) [part='overlay'] {\n    animation: 0.1s lumo-menu-overlay-enter ease-out both;\n  }\n\n  @keyframes lumo-menu-overlay-enter {\n    0% {\n      opacity: 0;\n      transform: translateY(-4px);\n    }\n  }\n\n  :host([closing]) [part='overlay'] {\n    animation: 0.1s lumo-menu-overlay-exit both;\n  }\n\n  @keyframes lumo-menu-overlay-exit {\n    100% {\n      opacity: 0;\n    }\n  }\n`;\n\nregisterStyles('', menuOverlayCore, { moduleId: 'lumo-menu-overlay-core' });\n\nconst menuOverlayExt = css`\n  /* Small viewport (bottom sheet) styles */\n  /* Use direct media queries instead of the state attributes ([phone] and [fullscreen]) provided by the elements */\n  @media (max-width: 420px), (max-height: 420px) {\n    :host {\n      top: 0 !important;\n      right: 0 !important;\n      bottom: var(--vaadin-overlay-viewport-bottom, 0) !important;\n      left: 0 !important;\n      align-items: stretch !important;\n      justify-content: flex-end !important;\n    }\n\n    [part='overlay'] {\n      max-height: 50vh;\n      width: 100vw;\n      border-radius: 0;\n      box-shadow: var(--lumo-box-shadow-xl);\n    }\n\n    /* The content part scrolls instead of the overlay part, because of the gradient fade-out */\n    [part='content'] {\n      padding: 30px var(--lumo-space-m);\n      max-height: inherit;\n      box-sizing: border-box;\n      -webkit-overflow-scrolling: touch;\n      overflow: auto;\n      -webkit-mask-image: linear-gradient(transparent, #000 40px, #000 calc(100% - 40px), transparent);\n      mask-image: linear-gradient(transparent, #000 40px, #000 calc(100% - 40px), transparent);\n    }\n\n    [part='backdrop'] {\n      display: block;\n    }\n\n    /* Animations */\n\n    :host([opening]) [part='overlay'] {\n      animation: 0.2s lumo-mobile-menu-overlay-enter cubic-bezier(0.215, 0.61, 0.355, 1) both;\n    }\n\n    :host([closing]),\n    :host([closing]) [part='backdrop'] {\n      animation-delay: 0.14s;\n    }\n\n    :host([closing]) [part='overlay'] {\n      animation: 0.14s 0.14s lumo-mobile-menu-overlay-exit cubic-bezier(0.55, 0.055, 0.675, 0.19) both;\n    }\n  }\n\n  @keyframes lumo-mobile-menu-overlay-enter {\n    0% {\n      transform: translateY(150%);\n    }\n  }\n\n  @keyframes lumo-mobile-menu-overlay-exit {\n    100% {\n      transform: translateY(150%);\n    }\n  }\n`;\n\nconst menuOverlay = [overlay, menuOverlayCore, menuOverlayExt];\n\nregisterStyles('', menuOverlay, { moduleId: 'lumo-menu-overlay' });\n\nexport { menuOverlayCore, menuOverlay };\n","import '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/font-icons.js';\nimport '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/sizing.js';\nimport '@vaadin/vaadin-lumo-styles/typography.js';\nimport { menuOverlay } from '@vaadin/vaadin-lumo-styles/mixins/menu-overlay.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst contextMenuOverlay = css`\n  :host([phone]) {\n    top: 0 !important;\n    right: 0 !important;\n    bottom: var(--vaadin-overlay-viewport-bottom) !important;\n    left: 0 !important;\n    align-items: stretch;\n    justify-content: flex-end;\n  }\n\n  /* TODO These style overrides should not be needed.\n   We should instead offer a way to have non-selectable items inside the context menu. */\n\n  :host {\n    --_lumo-list-box-item-selected-icon-display: none;\n    --_lumo-list-box-item-padding-left: calc(var(--lumo-space-m) + var(--lumo-border-radius-m) / 4);\n  }\n\n  [part='overlay'] {\n    outline: none;\n  }\n`;\n\nregisterStyles('vaadin-context-menu-overlay', [menuOverlay, contextMenuOverlay], {\n  moduleId: 'lumo-context-menu-overlay',\n});\n\nregisterStyles(\n  'vaadin-context-menu-list-box',\n  css`\n    :host(.vaadin-menu-list-box) {\n      --_lumo-list-box-item-selected-icon-display: block;\n    }\n\n    /* Normal item */\n    [part='items'] ::slotted(.vaadin-menu-item) {\n      -webkit-tap-highlight-color: var(--lumo-primary-color-10pct);\n      cursor: default;\n    }\n\n    [part='items'] ::slotted(.vaadin-menu-item) {\n      outline: none;\n      border-radius: var(--lumo-border-radius-m);\n      padding-left: var(--_lumo-list-box-item-padding-left, calc(var(--lumo-border-radius-m) / 4));\n      padding-right: calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4);\n    }\n\n    :host(.vaadin-menu-list-box) [part='items'] ::slotted(.vaadin-menu-item) {\n      padding-left: calc(var(--lumo-border-radius-m) / 4);\n      padding-right: calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4);\n    }\n\n    /* Hovered item */\n    /* TODO a workaround until we have \"focus-follows-mouse\". After that, use the hover style for focus-ring as well */\n    [part='items'] ::slotted(.vaadin-menu-item:hover:not([disabled])),\n    [part='items'] ::slotted(.vaadin-menu-item[expanded]:not([disabled])) {\n      background-color: var(--lumo-primary-color-10pct);\n    }\n\n    /* RTL styles */\n    :host([dir='rtl'])[part='items'] ::slotted(.vaadin-menu-item) {\n      padding-left: calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4);\n      padding-right: var(--_lumo-list-box-item-padding-left, calc(var(--lumo-border-radius-m) / 4));\n    }\n\n    :host([dir='rtl'].vaadin-menu-list-box) [part='items'] ::slotted(.vaadin-menu-item) {\n      padding-left: calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4);\n      padding-right: calc(var(--lumo-border-radius-m) / 4);\n    }\n\n    /* Focused item */\n    @media (pointer: coarse) {\n      [part='items'] ::slotted(.vaadin-menu-item:hover:not([expanded]):not([disabled])) {\n        background-color: transparent;\n      }\n    }\n  `,\n  { moduleId: 'lumo-context-menu-list-box' },\n);\n\nregisterStyles(\n  'vaadin-context-menu-item',\n  css`\n    /* :hover needed to workaround https://github.com/vaadin/web-components/issues/3133 */\n    :host(:hover) {\n      user-select: none;\n      -ms-user-select: none;\n      -webkit-user-select: none;\n    }\n\n    :host(.vaadin-menu-item[menu-item-checked]) [part='checkmark']::before {\n      opacity: 1;\n    }\n\n    :host(.vaadin-menu-item.vaadin-context-menu-parent-item)::after {\n      font-family: lumo-icons;\n      font-size: var(--lumo-icon-size-xs);\n      content: var(--lumo-icons-angle-right);\n      color: var(--lumo-tertiary-text-color);\n    }\n\n    :host(:not([dir='rtl']).vaadin-menu-item.vaadin-context-menu-parent-item)::after {\n      margin-right: calc(var(--lumo-space-m) * -1);\n      padding-left: var(--lumo-space-m);\n    }\n\n    :host([expanded]) {\n      background-color: var(--lumo-primary-color-10pct);\n    }\n\n    /* RTL styles */\n    :host([dir='rtl'].vaadin-menu-item.vaadin-context-menu-parent-item)::after {\n      content: var(--lumo-icons-angle-left);\n      margin-left: calc(var(--lumo-space-m) * -1);\n      padding-right: var(--lumo-space-m);\n    }\n  `,\n  { moduleId: 'lumo-context-menu-item' },\n);\n","import '@vaadin/vaadin-lumo-styles/font-icons.js';\nimport '@vaadin/vaadin-lumo-styles/sizing.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst item = css`\n  :host {\n    display: flex;\n    align-items: center;\n    box-sizing: border-box;\n    font-family: var(--lumo-font-family);\n    font-size: var(--lumo-font-size-m);\n    line-height: var(--lumo-line-height-xs);\n    padding: 0.5em calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4) 0.5em\n      var(--_lumo-list-box-item-padding-left, calc(var(--lumo-border-radius-m) / 4));\n    min-height: var(--lumo-size-m);\n    outline: none;\n    border-radius: var(--lumo-border-radius-m);\n    cursor: var(--lumo-clickable-cursor);\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-tap-highlight-color: var(--lumo-primary-color-10pct);\n  }\n\n  /* Checkmark */\n  [part='checkmark']::before {\n    display: var(--_lumo-item-selected-icon-display, none);\n    content: var(--lumo-icons-checkmark);\n    font-family: lumo-icons;\n    font-size: var(--lumo-icon-size-m);\n    line-height: 1;\n    font-weight: normal;\n    width: 1em;\n    height: 1em;\n    margin: calc((1 - var(--lumo-line-height-xs)) * var(--lumo-font-size-m) / 2) 0;\n    color: var(--lumo-primary-text-color);\n    flex: none;\n    opacity: 0;\n    transition: transform 0.2s cubic-bezier(0.12, 0.32, 0.54, 2), opacity 0.1s;\n  }\n\n  :host([selected]) [part='checkmark']::before {\n    opacity: 1;\n  }\n\n  :host([active]:not([selected])) [part='checkmark']::before {\n    transform: scale(0.8);\n    opacity: 0;\n    transition-duration: 0s;\n  }\n\n  [part='content'] {\n    flex: auto;\n  }\n\n  /* Disabled */\n  :host([disabled]) {\n    color: var(--lumo-disabled-text-color);\n    cursor: default;\n    pointer-events: none;\n  }\n\n  /* TODO a workaround until we have \"focus-follows-mouse\". After that, use the hover style for focus-ring as well */\n  @media (any-hover: hover) {\n    :host(:hover:not([disabled])) {\n      background-color: var(--lumo-primary-color-10pct);\n    }\n\n    :host([focus-ring]:not([disabled])) {\n      box-shadow: inset 0 0 0 2px var(--lumo-primary-color-50pct);\n    }\n  }\n\n  /* RTL specific styles */\n  :host([dir='rtl']) {\n    padding-left: calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4);\n    padding-right: var(--_lumo-list-box-item-padding-left, calc(var(--lumo-border-radius-m) / 4));\n  }\n\n  /* Slotted icons */\n  :host ::slotted(vaadin-icon),\n  :host ::slotted(iron-icon) {\n    width: var(--lumo-icon-size-m);\n    height: var(--lumo-icon-size-m);\n  }\n`;\n\nregisterStyles('vaadin-item', item, { moduleId: 'lumo-item' });\n\nexport { item };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { ActiveMixin } from '@vaadin/component-base/src/active-mixin.js';\nimport { FocusMixin } from '@vaadin/component-base/src/focus-mixin.js';\n\n/**\n * A mixin providing `focused`, `focus-ring`, `active`, `disabled` and `selected`.\n *\n * `focused`, `active` and `focus-ring` are set as only as attributes.\n * @polymerMixin\n */\nexport const ItemMixin = (superClass) =>\n  class VaadinItemMixin extends ActiveMixin(FocusMixin(superClass)) {\n    static get properties() {\n      return {\n        /**\n         * Used for mixin detection because `instanceof` does not work with mixins.\n         * e.g. in VaadinListMixin it filters items by using the\n         * `element._hasVaadinItemMixin` condition.\n         * @type {boolean}\n         */\n        _hasVaadinItemMixin: {\n          value: true,\n        },\n\n        /**\n         * If true, the item is in selected state.\n         * @type {boolean}\n         */\n        selected: {\n          type: Boolean,\n          value: false,\n          reflectToAttribute: true,\n          observer: '_selectedChanged',\n        },\n\n        /** @private */\n        _value: String,\n      };\n    }\n\n    /**\n     * By default, `Space` is the only possible activation key for a focusable HTML element.\n     * Nonetheless, the item is an exception as it can be also activated by pressing `Enter`.\n     * See the \"Keyboard Support\" section in https://www.w3.org/TR/wai-aria-practices/examples/menubar/menubar-1/menubar-1.html.\n     *\n     * @protected\n     * @override\n     */\n    get _activeKeys() {\n      return ['Enter', ' '];\n    }\n\n    /**\n     * @return {string}\n     */\n    get value() {\n      return this._value !== undefined ? this._value : this.textContent.trim();\n    }\n\n    /**\n     * @param {string} value\n     */\n    set value(value) {\n      this._value = value;\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      const attrValue = this.getAttribute('value');\n      if (attrValue !== null) {\n        this.value = attrValue;\n      }\n    }\n\n    /**\n     * Override native `focus` to set focused attribute\n     * when focusing the item programmatically.\n     * @protected\n     * @override\n     */\n    focus() {\n      if (this.disabled) {\n        return;\n      }\n\n      super.focus();\n      this._setFocused(true);\n    }\n\n    /**\n     * @param {KeyboardEvent | MouseEvent} _event\n     * @protected\n     * @override\n     */\n    _shouldSetActive(event) {\n      return !this.disabled && !(event.type === 'keydown' && event.defaultPrevented);\n    }\n\n    /** @private */\n    _selectedChanged(selected) {\n      this.setAttribute('aria-selected', selected);\n    }\n\n    /**\n     * Override an observer from `DisabledMixin`.\n     * @protected\n     * @override\n     */\n    _disabledChanged(disabled) {\n      super._disabledChanged(disabled);\n\n      if (disabled) {\n        this.selected = false;\n        this.blur();\n      }\n    }\n\n    /**\n     * In order to be fully accessible from the keyboard, the item should\n     * manually fire the `click` event once an activation key is pressed.\n     *\n     * According to the UI Events specifications,\n     * the `click` event should be fired exactly on `keydown`:\n     * https://www.w3.org/TR/uievents/#event-type-keydown\n     *\n     * @param {KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onKeyDown(event) {\n      super._onKeyDown(event);\n\n      if (this._activeKeys.includes(event.key) && !event.defaultPrevented) {\n        event.preventDefault();\n\n        // `DisabledMixin` overrides the standard `click()` method\n        // so that it doesn't fire the `click` event when the element is disabled.\n        this.click();\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\nimport { ItemMixin } from './vaadin-item-mixin.js';\n\n/**\n * `<vaadin-item>` is a Web Component providing layout for items in tabs and menus.\n *\n * ```\n *   <vaadin-item>\n *     Item content\n *   </vaadin-item>\n * ```\n *\n * ### Selectable\n *\n * `<vaadin-item>` has the `selected` property and the corresponding state attribute.\n * Currently, the component sets the `selected` to false, when `disabled` property is set to true.\n * But other than that, the `<vaadin-item>` does not switch selection by itself.\n * In general, it is the wrapper component, like `<vaadin-list-box>`, which should update\n * the `selected` property on the items, e. g. on mousedown or when Enter / Spacebar is pressed.\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name    | Description\n * -------------|----------------\n * `checkmark`  | The graphical checkmark shown for a selected item\n * `content`    | The element that wraps the slot\n *\n * The following state attributes are available for styling:\n *\n * Attribute    | Description\n * -------------|-------------\n * `active`     | Set when the item is pressed down, either with mouse, touch or the keyboard.\n * `disabled`   | Set when the item is disabled.\n * `focus-ring` | Set when the item is focused using the keyboard.\n * `focused`    | Set when the item is focused.\n * `selected`   | Set when the item is selected\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @extends HTMLElement\n * @mixes ItemMixin\n * @mixes ThemableMixin\n * @mixes DirMixin\n */\nclass Item extends ItemMixin(ThemableMixin(DirMixin(PolymerElement))) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: inline-block;\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n      </style>\n      <span part=\"checkmark\" aria-hidden=\"true\"></span>\n      <div part=\"content\">\n        <slot></slot>\n      </div>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-item';\n  }\n\n  constructor() {\n    super();\n\n    /**\n     * Submittable string value. The default value is the trimmed text content of the element.\n     * @type {string}\n     */\n    this.value; // eslint-disable-line no-unused-expressions\n\n    /**\n     * String that can be set to visually represent the selected item in `vaadin-select`.\n     * @type {string}\n     */\n    this.label; // eslint-disable-line no-unused-expressions\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.setAttribute('role', 'option');\n  }\n}\n\ncustomElements.define(Item.is, Item);\n\nexport { Item };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-list-box',\n  css`\n    :host {\n      -webkit-tap-highlight-color: transparent;\n      --_lumo-item-selected-icon-display: var(--_lumo-list-box-item-selected-icon-display, block);\n    }\n\n    /* Dividers */\n    [part='items'] ::slotted(hr) {\n      height: 1px;\n      border: 0;\n      padding: 0;\n      margin: var(--lumo-space-s) var(--lumo-border-radius-m);\n      background-color: var(--lumo-contrast-10pct);\n    }\n  `,\n  { moduleId: 'lumo-list-box' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { isElementFocused, isElementHidden } from './focus-utils.js';\nimport { KeyboardMixin } from './keyboard-mixin.js';\n\n/**\n * A mixin for navigating items with keyboard.\n *\n * @polymerMixin\n * @mixes KeyboardMixin\n */\nexport const KeyboardDirectionMixin = (superclass) =>\n  class KeyboardDirectionMixinClass extends KeyboardMixin(superclass) {\n    /** @protected */\n    focus() {\n      const items = this._getItems();\n      if (Array.isArray(items)) {\n        const idx = this._getAvailableIndex(items, 0, null, (item) => !isElementHidden(item));\n        if (idx >= 0) {\n          items[idx].focus();\n        }\n      }\n    }\n\n    /**\n     * @return {Element | null}\n     * @protected\n     */\n    get focused() {\n      return (this._getItems() || []).find(isElementFocused);\n    }\n\n    /**\n     * @return {boolean}\n     * @protected\n     */\n    get _vertical() {\n      return true;\n    }\n\n    /**\n     * Get the list of items participating in keyboard navigation.\n     * By default, it treats all the light DOM children as items.\n     * Override this method to provide custom list of elements.\n     *\n     * @return {Element[]}\n     * @protected\n     */\n    _getItems() {\n      return Array.from(this.children);\n    }\n\n    /**\n     * Override an event listener from `KeyboardMixin`.\n     *\n     * @param {!KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onKeyDown(event) {\n      super._onKeyDown(event);\n\n      if (event.metaKey || event.ctrlKey) {\n        return;\n      }\n\n      const { key } = event;\n      const items = this._getItems() || [];\n      const currentIdx = items.indexOf(this.focused);\n\n      let idx;\n      let increment;\n\n      const isRTL = !this._vertical && this.getAttribute('dir') === 'rtl';\n      const dirIncrement = isRTL ? -1 : 1;\n\n      if (this.__isPrevKey(key)) {\n        increment = -dirIncrement;\n        idx = currentIdx - dirIncrement;\n      } else if (this.__isNextKey(key)) {\n        increment = dirIncrement;\n        idx = currentIdx + dirIncrement;\n      } else if (key === 'Home') {\n        increment = 1;\n        idx = 0;\n      } else if (key === 'End') {\n        increment = -1;\n        idx = items.length - 1;\n      }\n\n      idx = this._getAvailableIndex(items, idx, increment, (item) => !isElementHidden(item));\n\n      if (idx >= 0) {\n        event.preventDefault();\n        this._focus(idx, true);\n      }\n    }\n\n    /**\n     * @param {string} key\n     * @return {boolean}\n     * @private\n     */\n    __isPrevKey(key) {\n      return this._vertical ? key === 'ArrowUp' : key === 'ArrowLeft';\n    }\n\n    /**\n     * @param {string} key\n     * @return {boolean}\n     * @private\n     */\n    __isNextKey(key) {\n      return this._vertical ? key === 'ArrowDown' : key === 'ArrowRight';\n    }\n\n    /**\n     * Focus the item at given index. Override this method to add custom logic.\n     *\n     * @param {number} index\n     * @param {boolean} navigating\n     * @protected\n     */\n    _focus(index, navigating = false) {\n      const items = this._getItems();\n\n      this._focusItem(items[index], navigating);\n    }\n\n    /**\n     * Focus the given item. Override this method to add custom logic.\n     *\n     * @param {Element} item\n     * @param {boolean} navigating\n     * @protected\n     */\n    _focusItem(item) {\n      if (item) {\n        item.focus();\n\n        // Generally, the items are expected to implement `FocusMixin`\n        // that would set this attribute based on the `keydown` event.\n        // We set it manually to handle programmatic focus() calls.\n        item.setAttribute('focus-ring', '');\n      }\n    }\n\n    /**\n     * Returns index of the next item that satisfies the given condition,\n     * based on the index of the current item and a numeric increment.\n     *\n     * @param {Element[]} items - array of items to iterate over\n     * @param {number} index - index of the current item\n     * @param {number} increment - numeric increment, can be either 1 or -1\n     * @param {Function} condition - function used to check the item\n     * @return {number}\n     * @protected\n     */\n    _getAvailableIndex(items, index, increment, condition) {\n      const totalItems = items.length;\n      let idx = index;\n      for (let i = 0; typeof idx === 'number' && i < totalItems; i += 1, idx += increment || 1) {\n        if (idx < 0) {\n          idx = totalItems - 1;\n        } else if (idx >= totalItems) {\n          idx = 0;\n        }\n\n        const item = items[idx];\n\n        if (!item.hasAttribute('disabled') && this.__isMatchingItem(item, condition)) {\n          return idx;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Returns true if the item matches condition.\n     *\n     * @param {Element} item - item to check\n     * @param {Function} condition - function used to check the item\n     * @return {number}\n     * @private\n     */\n    __isMatchingItem(item, condition) {\n      return typeof condition === 'function' ? condition(item) : true;\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { DirHelper } from '@vaadin/component-base/src/dir-helper.js';\nimport { KeyboardDirectionMixin } from '@vaadin/component-base/src/keyboard-direction-mixin.js';\n\n/**\n * A mixin for `nav` elements, facilitating navigation and selection of childNodes.\n *\n * @polymerMixin\n * @mixes KeyboardDirectionMixin\n */\nexport const ListMixin = (superClass) =>\n  class ListMixinClass extends KeyboardDirectionMixin(superClass) {\n    static get properties() {\n      return {\n        /**\n         * Used for mixin detection because `instanceof` does not work with mixins.\n         * @type {boolean}\n         */\n        _hasVaadinListMixin: {\n          value: true,\n        },\n\n        /**\n         * The index of the item selected in the items array.\n         * Note: Not updated when used in `multiple` selection mode.\n         */\n        selected: {\n          type: Number,\n          reflectToAttribute: true,\n          notify: true,\n        },\n\n        /**\n         * Define how items are disposed in the dom.\n         * Possible values are: `horizontal|vertical`.\n         * It also changes navigation keys from left/right to up/down.\n         * @type {!ListOrientation}\n         */\n        orientation: {\n          type: String,\n          reflectToAttribute: true,\n          value: '',\n        },\n\n        /**\n         * The list of items from which a selection can be made.\n         * It is populated from the elements passed to the light DOM,\n         * and updated dynamically when adding or removing items.\n         *\n         * The item elements must implement `Vaadin.ItemMixin`.\n         *\n         * Note: unlike `<vaadin-combo-box>`, this property is read-only,\n         * so if you want to provide items by iterating array of data,\n         * you have to use `dom-repeat` and place it to the light DOM.\n         * @type {!Array<!Element> | undefined}\n         */\n        items: {\n          type: Array,\n          readOnly: true,\n          notify: true,\n        },\n\n        /**\n         * The search buffer for the keyboard selection feature.\n         * @private\n         */\n        _searchBuf: {\n          type: String,\n          value: '',\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_enhanceItems(items, orientation, selected, disabled)'];\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      this.addEventListener('click', (e) => this._onClick(e));\n\n      this._observer = new FlattenedNodesObserver(this, () => {\n        this._setItems(this._filterItems(FlattenedNodesObserver.getFlattenedNodes(this)));\n      });\n    }\n\n    /**\n     * Override method inherited from `KeyboardDirectionMixin`\n     * to use the stored list of item elements.\n     *\n     * @return {Element[]}\n     * @protected\n     * @override\n     */\n    _getItems() {\n      return this.items;\n    }\n\n    /** @private */\n    _enhanceItems(items, orientation, selected, disabled) {\n      if (!disabled) {\n        if (items) {\n          this.setAttribute('aria-orientation', orientation || 'vertical');\n          this.items.forEach((item) => {\n            if (orientation) {\n              item.setAttribute('orientation', orientation);\n            } else {\n              item.removeAttribute('orientation');\n            }\n          });\n\n          this._setFocusable(selected || 0);\n\n          const itemToSelect = items[selected];\n          items.forEach((item) => {\n            item.selected = item === itemToSelect;\n          });\n          if (itemToSelect && !itemToSelect.disabled) {\n            this._scrollToItem(selected);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {!Array<!Element>} array\n     * @return {!Array<!Element>}\n     * @protected\n     */\n    _filterItems(array) {\n      return array.filter((e) => e._hasVaadinItemMixin);\n    }\n\n    /**\n     * @param {!MouseEvent} event\n     * @protected\n     */\n    _onClick(event) {\n      if (event.metaKey || event.shiftKey || event.ctrlKey || event.defaultPrevented) {\n        return;\n      }\n\n      const item = this._filterItems(event.composedPath())[0];\n      let idx;\n      if (item && !item.disabled && (idx = this.items.indexOf(item)) >= 0) {\n        this.selected = idx;\n      }\n    }\n\n    /**\n     * @param {number} currentIdx\n     * @param {string} key\n     * @return {number}\n     * @protected\n     */\n    _searchKey(currentIdx, key) {\n      this._searchReset = Debouncer.debounce(this._searchReset, timeOut.after(500), () => {\n        this._searchBuf = '';\n      });\n      this._searchBuf += key.toLowerCase();\n\n      if (!this.items.some((item) => this.__isMatchingKey(item))) {\n        this._searchBuf = key.toLowerCase();\n      }\n\n      const idx = this._searchBuf.length === 1 ? currentIdx + 1 : currentIdx;\n      return this._getAvailableIndex(\n        this.items,\n        idx,\n        1,\n        (item) => this.__isMatchingKey(item) && getComputedStyle(item).display !== 'none',\n      );\n    }\n\n    /** @private */\n    __isMatchingKey(item) {\n      return item.textContent\n        .replace(/[^\\p{L}\\p{Nd}]/gu, '')\n        .toLowerCase()\n        .startsWith(this._searchBuf);\n    }\n\n    /**\n     * @return {boolean}\n     * @protected\n     */\n    get _isRTL() {\n      return !this._vertical && this.getAttribute('dir') === 'rtl';\n    }\n\n    /**\n     * Override an event listener from `KeyboardMixin`\n     * to search items by key.\n     *\n     * @param {!KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onKeyDown(event) {\n      if (event.metaKey || event.ctrlKey) {\n        return;\n      }\n\n      const key = event.key;\n\n      const currentIdx = this.items.indexOf(this.focused);\n      if (/[\\p{L}\\p{Nd}]/u.test(key) && key.length === 1) {\n        const idx = this._searchKey(currentIdx, key);\n        if (idx >= 0) {\n          this._focus(idx);\n        }\n        return;\n      }\n\n      super._onKeyDown(event);\n    }\n\n    /**\n     * @param {!Element} item\n     * @return {boolean}\n     * @protected\n     */\n    _isItemHidden(item) {\n      return getComputedStyle(item).display === 'none';\n    }\n\n    /**\n     * @param {number} idx\n     * @protected\n     */\n    _setFocusable(idx) {\n      idx = this._getAvailableIndex(this.items, idx, 1);\n      const item = this.items[idx];\n      this.items.forEach((e) => {\n        e.tabIndex = e === item ? 0 : -1;\n      });\n    }\n\n    /**\n     * @param {number} idx\n     * @protected\n     */\n    _focus(idx) {\n      this.items.forEach((e, index) => {\n        e.focused = index === idx;\n      });\n      this._setFocusable(idx);\n      this._scrollToItem(idx);\n      super._focus(idx);\n    }\n\n    focus() {\n      // In initialization (e.g vaadin-select) observer might not been run yet.\n      if (this._observer) {\n        this._observer.flush();\n      }\n      const firstItem = this.querySelector('[tabindex=\"0\"]') || (this.items ? this.items[0] : null);\n      this._focusItem(firstItem);\n    }\n\n    /**\n     * @return {!HTMLElement}\n     * @protected\n     */\n    get _scrollerElement() {\n      // Returning scroller element of the component\n      console.warn(`Please implement the '_scrollerElement' property in <${this.localName}>`);\n      return this;\n    }\n\n    /**\n     * Scroll the container to have the next item by the edge of the viewport.\n     * @param {number} idx\n     * @protected\n     */\n    _scrollToItem(idx) {\n      const item = this.items[idx];\n      if (!item) {\n        return;\n      }\n\n      const props = this._vertical ? ['top', 'bottom'] : this._isRTL ? ['right', 'left'] : ['left', 'right'];\n\n      const scrollerRect = this._scrollerElement.getBoundingClientRect();\n      const nextItemRect = (this.items[idx + 1] || item).getBoundingClientRect();\n      const prevItemRect = (this.items[idx - 1] || item).getBoundingClientRect();\n\n      let scrollDistance = 0;\n      if (\n        (!this._isRTL && nextItemRect[props[1]] >= scrollerRect[props[1]]) ||\n        (this._isRTL && nextItemRect[props[1]] <= scrollerRect[props[1]])\n      ) {\n        scrollDistance = nextItemRect[props[1]] - scrollerRect[props[1]];\n      } else if (\n        (!this._isRTL && prevItemRect[props[0]] <= scrollerRect[props[0]]) ||\n        (this._isRTL && prevItemRect[props[0]] >= scrollerRect[props[0]])\n      ) {\n        scrollDistance = prevItemRect[props[0]] - scrollerRect[props[0]];\n      }\n\n      this._scroll(scrollDistance);\n    }\n\n    /**\n     * @return {boolean}\n     * @protected\n     */\n    get _vertical() {\n      return this.orientation !== 'horizontal';\n    }\n\n    /**\n     * @param {number} pixels\n     * @protected\n     */\n    _scroll(pixels) {\n      if (this._vertical) {\n        this._scrollerElement.scrollTop += pixels;\n      } else {\n        const dir = this.getAttribute('dir') || 'ltr';\n        const scrollType = DirHelper.detectScrollType();\n        const scrollLeft = DirHelper.getNormalizedScrollLeft(scrollType, dir, this._scrollerElement) + pixels;\n        DirHelper.setNormalizedScrollLeft(scrollType, dir, this._scrollerElement, scrollLeft);\n      }\n    }\n\n    /**\n     * Fired when the selection is changed.\n     * Not fired when used in `multiple` selection mode.\n     *\n     * @event selected-changed\n     * @param {Object} detail\n     * @param {Object} detail.value the index of the item selected in the items array.\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { ListMixin } from './vaadin-list-mixin.js';\n\n/**\n * A mixin for `nav` elements, facilitating multiple selection of childNodes.\n *\n * @polymerMixin\n * @mixes ListMixin\n */\nexport const MultiSelectListMixin = (superClass) =>\n  class VaadinMultiSelectListMixin extends ListMixin(superClass) {\n    static get properties() {\n      return {\n        /**\n         * Specifies that multiple options can be selected at once.\n         */\n        multiple: {\n          type: Boolean,\n          value: false,\n          reflectToAttribute: true,\n          observer: '_multipleChanged',\n        },\n\n        /**\n         * Array of indexes of the items selected in the items array\n         * Note: Not updated when used in single selection mode.\n         * @type {number[] | null | undefined}\n         */\n        selectedValues: {\n          type: Array,\n          notify: true,\n          value: () => [],\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_enhanceMultipleItems(items, multiple, selected, disabled, selectedValues, selectedValues.*)'];\n    }\n\n    /** @protected */\n    ready() {\n      // Should be attached before click listener in list-mixin\n      this.addEventListener('click', (e) => this._onMultipleClick(e));\n\n      super.ready();\n    }\n\n    /** @private */\n    _enhanceMultipleItems(items, multiple, selected, disabled, selectedValues) {\n      if (!items || !multiple) {\n        return;\n      }\n\n      if (selectedValues) {\n        const selectedItems = selectedValues.map((selectedId) => items[selectedId]);\n        items.forEach((item) => {\n          item.selected = selectedItems.includes(item);\n        });\n      }\n\n      this._scrollToLastSelectedItem();\n    }\n\n    /** @private */\n    _scrollToLastSelectedItem() {\n      const lastSelectedItem = this.selectedValues.slice(-1)[0];\n      if (lastSelectedItem && !lastSelectedItem.disabled) {\n        this._scrollToItem(lastSelectedItem);\n      }\n    }\n\n    /**\n     * @param {!MouseEvent} event\n     * @protected\n     */\n    _onMultipleClick(event) {\n      const item = this._filterItems(event.composedPath())[0];\n      const idx = item && !item.disabled ? this.items.indexOf(item) : -1;\n      if (idx < 0 || !this.multiple) {\n        return;\n      }\n\n      event.preventDefault();\n      if (this.selectedValues.includes(idx)) {\n        this.selectedValues = this.selectedValues.filter((v) => v !== idx);\n      } else {\n        this.selectedValues = this.selectedValues.concat(idx);\n      }\n    }\n\n    /** @private */\n    _multipleChanged(value, oldValue) {\n      // Changing from multiple to single selection, clear selection.\n      if (!value && oldValue) {\n        this.selectedValues = [];\n        this.items.forEach((item) => {\n          item.selected = false;\n        });\n\n        this.removeAttribute('aria-multiselectable');\n      }\n\n      // Changing from single to multiple selection, add selected to selectedValues.\n      if (value && !oldValue) {\n        this.setAttribute('aria-multiselectable', 'true');\n\n        if (this.selected !== undefined) {\n          this.selectedValues = [...this.selectedValues, this.selected];\n          this.selected = undefined;\n        }\n      }\n    }\n\n    /**\n     * Fired when the selection is changed.\n     * Not fired in single selection mode.\n     *\n     * @event selected-values-changed\n     * @param {Object} detail\n     * @param {Object} detail.value the array of indexes of the items selected in the items array.\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';\nimport { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';\nimport { MultiSelectListMixin } from '@vaadin/vaadin-list-mixin/vaadin-multi-select-list-mixin.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\n/**\n * `<vaadin-list-box>` is a Web Component for creating menus.\n *\n * ```\n *   <vaadin-list-box selected=\"2\">\n *     <vaadin-item>Item 1</vaadin-item>\n *     <vaadin-item>Item 2</vaadin-item>\n *     <vaadin-item>Item 3</vaadin-item>\n *     <vaadin-item>Item 4</vaadin-item>\n *   </vaadin-list-box>\n * ```\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name         | Description\n * ------------------|------------------------\n * `items`           | The items container\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @fires {CustomEvent} items-changed - Fired when the `items` property changes.\n * @fires {CustomEvent} selected-changed - Fired when the `selected` property changes.\n * @fires {CustomEvent} selected-values-changed - Fired when the `selectedValues` property changes.\n *\n * @extends HTMLElement\n * @mixes MultiSelectListMixin\n * @mixes ThemableMixin\n * @mixes ElementMixin\n * @mixes ControllerMixin\n */\nclass ListBox extends ElementMixin(MultiSelectListMixin(ThemableMixin(ControllerMixin(PolymerElement)))) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: flex;\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n\n        [part='items'] {\n          height: 100%;\n          width: 100%;\n          overflow-y: auto;\n          -webkit-overflow-scrolling: touch;\n        }\n      </style>\n      <div part=\"items\">\n        <slot></slot>\n      </div>\n\n      <slot name=\"tooltip\"></slot>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-list-box';\n  }\n\n  static get properties() {\n    return {\n      // We don't need to define this property since super default is vertical,\n      // but we don't want it to be modified, or be shown in the API docs.\n      /** @private */\n      orientation: {\n        readOnly: true,\n      },\n    };\n  }\n\n  constructor() {\n    super();\n\n    /**\n     * @type {Element | null}\n     * @protected\n     */\n    // eslint-disable-next-line no-unused-expressions\n    this.focused;\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.setAttribute('role', 'listbox');\n\n    setTimeout(this._checkImport.bind(this), 2000);\n\n    this._tooltipController = new TooltipController(this);\n    this.addController(this._tooltipController);\n  }\n\n  /**\n   * @return {!HTMLElement}\n   * @protected\n   */\n  get _scrollerElement() {\n    return this.shadowRoot.querySelector('[part=\"items\"]');\n  }\n\n  /** @private */\n  _checkImport() {\n    const item = this.querySelector('vaadin-item');\n    if (item && !(item instanceof PolymerElement)) {\n      console.warn(`Make sure you have imported the vaadin-item element.`);\n    }\n  }\n}\n\ncustomElements.define(ListBox.is, ListBox);\n\nexport { ListBox };\n","import { overlay } from '@vaadin/vaadin-lumo-styles/mixins/overlay.js';\nimport { registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles('vaadin-overlay', overlay, { moduleId: 'lumo-vaadin-overlay' });\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { getFocusableElements, isElementFocused } from './focus-utils.js';\n\nconst instances = [];\n\n/**\n * A controller for trapping focus within a DOM node.\n */\nexport class FocusTrapController {\n  /**\n   * @param {HTMLElement} host\n   */\n  constructor(host) {\n    /**\n     * The controller host element.\n     *\n     * @type {HTMLElement}\n     */\n    this.host = host;\n\n    /**\n     * A node for trapping focus in.\n     *\n     * @type {HTMLElement | null}\n     * @private\n     */\n    this.__trapNode = null;\n\n    this.__onKeyDown = this.__onKeyDown.bind(this);\n  }\n\n  hostConnected() {\n    document.addEventListener('keydown', this.__onKeyDown);\n  }\n\n  hostDisconnected() {\n    document.removeEventListener('keydown', this.__onKeyDown);\n  }\n\n  /**\n   * Activates a focus trap for a DOM node that will prevent focus from escaping the node.\n   * The trap can be deactivated with the `.releaseFocus()` method.\n   *\n   * If focus is initially outside the trap, the method will move focus inside,\n   * on the first focusable element of the trap in the tab order.\n   * The first focusable element can be the trap node itself if it is focusable\n   * and comes first in the tab order.\n   *\n   * If there are no focusable elements, the method will throw an exception\n   * and the trap will not be set.\n   *\n   * @param {HTMLElement} trapNode\n   */\n  trapFocus(trapNode) {\n    this.__trapNode = trapNode;\n\n    if (this.__focusableElements.length === 0) {\n      this.__trapNode = null;\n      throw new Error('The trap node should have at least one focusable descendant or be focusable itself.');\n    }\n\n    instances.push(this);\n\n    if (this.__focusedElementIndex === -1) {\n      this.__focusableElements[0].focus();\n    }\n  }\n\n  /**\n   * Deactivates the focus trap set with the `.trapFocus()` method\n   * so that it becomes possible to tab outside the trap node.\n   */\n  releaseFocus() {\n    this.__trapNode = null;\n\n    instances.pop();\n  }\n\n  /**\n   * A `keydown` event handler that manages tabbing navigation when the trap is enabled.\n   *\n   * - Moves focus to the next focusable element of the trap on `Tab` press.\n   * When no next element to focus, the method moves focus to the first focusable element.\n   * - Moves focus to the prev focusable element of the trap on `Shift+Tab` press.\n   * When no prev element to focus, the method moves focus to the last focusable element.\n   *\n   * @param {KeyboardEvent} event\n   * @private\n   */\n  __onKeyDown(event) {\n    if (!this.__trapNode) {\n      return;\n    }\n\n    // Only handle events for the last instance\n    if (this !== Array.from(instances).pop()) {\n      return;\n    }\n\n    if (event.key === 'Tab') {\n      event.preventDefault();\n\n      const backward = event.shiftKey;\n      this.__focusNextElement(backward);\n    }\n  }\n\n  /**\n   * - Moves focus to the next focusable element if `backward === false`.\n   * When no next element to focus, the method moves focus to the first focusable element.\n   * - Moves focus to the prev focusable element if `backward === true`.\n   * When no prev element to focus the method moves focus to the last focusable element.\n   *\n   * If no focusable elements, the method returns immediately.\n   *\n   * @param {boolean} backward\n   * @private\n   */\n  __focusNextElement(backward = false) {\n    const focusableElements = this.__focusableElements;\n    const step = backward ? -1 : 1;\n    const currentIndex = this.__focusedElementIndex;\n    const nextIndex = (focusableElements.length + currentIndex + step) % focusableElements.length;\n    const element = focusableElements[nextIndex];\n    element.focus();\n    if (element.localName === 'input') {\n      element.select();\n    }\n  }\n\n  /**\n   * An array of tab-ordered focusable elements inside the trap node.\n   *\n   * @return {HTMLElement[]}\n   * @private\n   */\n  get __focusableElements() {\n    return getFocusableElements(this.__trapNode);\n  }\n\n  /**\n   * The index of the element inside the trap node that currently has focus.\n   *\n   * @return {HTMLElement | undefined}\n   * @private\n   */\n  get __focusedElementIndex() {\n    const focusableElements = this.__focusableElements;\n    return focusableElements.indexOf(focusableElements.filter(isElementFocused).pop());\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { afterNextRender } from '@polymer/polymer/lib/utils/render-status.js';\nimport { templatize } from '@polymer/polymer/lib/utils/templatize.js';\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { isIOS } from '@vaadin/component-base/src/browser-utils.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { FocusTrapController } from '@vaadin/component-base/src/focus-trap-controller.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\n/**\n *\n * `<vaadin-overlay>` is a Web Component for creating overlays. The content of the overlay\n * can be populated in two ways: imperatively by using renderer callback function and\n * declaratively by using Polymer's Templates.\n *\n * ### Rendering\n *\n * By default, the overlay uses the content provided by using the renderer callback function.\n *\n * The renderer function provides `root`, `owner`, `model` arguments when applicable.\n * Generate DOM content by using `model` object properties if needed, append it to the `root`\n * element and control the state of the host element by accessing `owner`. Before generating new\n * content, users are able to check if there is already content in `root` for reusing it.\n *\n * ```html\n * <vaadin-overlay id=\"overlay\"></vaadin-overlay>\n * ```\n * ```js\n * const overlay = document.querySelector('#overlay');\n * overlay.renderer = function(root) {\n *  root.textContent = \"Overlay content\";\n * };\n * ```\n *\n * Renderer is called on the opening of the overlay and each time the related model is updated.\n * DOM generated during the renderer call can be reused\n * in the next renderer call and will be provided with the `root` argument.\n * On first call it will be empty.\n *\n * **NOTE:** when the renderer property is defined, the `<template>` content is not used.\n *\n * ### Templating\n *\n * Alternatively, the content can be provided with Polymer Template.\n * Overlay finds the first child template and uses that in case renderer callback function\n * is not provided. You can also set a custom template using the `template` property.\n *\n * After the content from the template is stamped, the `content` property\n * points to the content container.\n *\n * The overlay provides `forwardHostProp` when calling\n * `Polymer.Templatize.templatize` for the template, so that the bindings\n * from the parent scope propagate to the content.\n *\n * ### Styling\n *\n * To style the overlay content, use styles in the parent scope:\n *\n * - If the overlay is used in a component, then the component styles\n *   apply the overlay content.\n * - If the overlay is used in the global DOM scope, then global styles\n *   apply to the overlay content.\n *\n * See examples for styling the overlay content in the live demos.\n *\n * The following Shadow DOM parts are available for styling the overlay component itself:\n *\n * Part name  | Description\n * -----------|---------------------------------------------------------|\n * `backdrop` | Backdrop of the overlay\n * `overlay`  | Container for position/sizing/alignment of the content\n * `content`  | Content of the overlay\n *\n * The following state attributes are available for styling:\n *\n * Attribute | Description | Part\n * ---|---|---\n * `opening` | Applied just after the overlay is attached to the DOM. You can apply a CSS @keyframe animation for this state. | `:host`\n * `closing` | Applied just before the overlay is detached from the DOM. You can apply a CSS @keyframe animation for this state. | `:host`\n *\n * The following custom CSS properties are available for styling:\n *\n * Custom CSS property | Description | Default value\n * ---|---|---\n * `--vaadin-overlay-viewport-bottom` | Bottom offset of the visible viewport area | `0` or detected offset\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.\n * @fires {CustomEvent} vaadin-overlay-open - Fired after the overlay is opened.\n * @fires {CustomEvent} vaadin-overlay-close - Fired before the overlay will be closed. If canceled the closing of the overlay is canceled as well.\n * @fires {CustomEvent} vaadin-overlay-closing - Fired when the overlay will be closed.\n * @fires {CustomEvent} vaadin-overlay-outside-click - Fired before the overlay will be closed on outside click. If canceled the closing of the overlay is canceled as well.\n * @fires {CustomEvent} vaadin-overlay-escape-press - Fired before the overlay will be closed on ESC button press. If canceled the closing of the overlay is canceled as well.\n *\n * @extends HTMLElement\n * @mixes ThemableMixin\n * @mixes DirMixin\n * @mixes ControllerMixin\n */\nclass Overlay extends ThemableMixin(DirMixin(ControllerMixin(PolymerElement))) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          z-index: 200;\n          position: fixed;\n\n          /* Despite of what the names say, <vaadin-overlay> is just a container\n          for position/sizing/alignment. The actual overlay is the overlay part. */\n\n          /* Default position constraints: the entire viewport. Note: themes can\n          override this to introduce gaps between the overlay and the viewport. */\n          top: 0;\n          right: 0;\n          bottom: var(--vaadin-overlay-viewport-bottom);\n          left: 0;\n\n          /* Use flexbox alignment for the overlay part. */\n          display: flex;\n          flex-direction: column; /* makes dropdowns sizing easier */\n          /* Align to center by default. */\n          align-items: center;\n          justify-content: center;\n\n          /* Allow centering when max-width/max-height applies. */\n          margin: auto;\n\n          /* The host is not clickable, only the overlay part is. */\n          pointer-events: none;\n\n          /* Remove tap highlight on touch devices. */\n          -webkit-tap-highlight-color: transparent;\n\n          /* CSS API for host */\n          --vaadin-overlay-viewport-bottom: 0;\n        }\n\n        :host([hidden]),\n        :host(:not([opened]):not([closing])),\n        :host(:not([opened]):not([closing])) [part='overlay'] {\n          display: none !important;\n        }\n\n        [part='overlay'] {\n          -webkit-overflow-scrolling: touch;\n          overflow: auto;\n          pointer-events: auto;\n\n          /* Prevent overflowing the host in MSIE 11 */\n          max-width: 100%;\n          box-sizing: border-box;\n\n          -webkit-tap-highlight-color: initial; /* reenable tap highlight inside */\n        }\n\n        [part='backdrop'] {\n          z-index: -1;\n          content: '';\n          background: rgba(0, 0, 0, 0.5);\n          position: fixed;\n          top: 0;\n          left: 0;\n          bottom: 0;\n          right: 0;\n          pointer-events: auto;\n        }\n      </style>\n\n      <div id=\"backdrop\" part=\"backdrop\" hidden$=\"[[!withBackdrop]]\"></div>\n      <div part=\"overlay\" id=\"overlay\" tabindex=\"0\">\n        <div part=\"content\" id=\"content\">\n          <slot></slot>\n        </div>\n      </div>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-overlay';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * When true, the overlay is visible and attached to body.\n       */\n      opened: {\n        type: Boolean,\n        notify: true,\n        observer: '_openedChanged',\n        reflectToAttribute: true,\n      },\n\n      /**\n       * Owner element passed with renderer function\n       * @type {HTMLElement}\n       */\n      owner: Element,\n\n      /**\n       * Custom function for rendering the content of the overlay.\n       * Receives three arguments:\n       *\n       * - `root` The root container DOM element. Append your content to it.\n       * - `owner` The host element of the renderer function.\n       * - `model` The object with the properties related with rendering.\n       * @type {OverlayRenderer | null | undefined}\n       */\n      renderer: Function,\n\n      /**\n       * The template of the overlay content.\n       * @type {HTMLTemplateElement | null | undefined}\n       */\n      template: {\n        type: Object,\n        notify: true,\n      },\n\n      /**\n       * References the content container after the template is stamped.\n       * @type {!HTMLElement | undefined}\n       */\n      content: {\n        type: Object,\n        notify: true,\n      },\n\n      /**\n       * When true the overlay has backdrop on top of content when opened.\n       * @type {boolean}\n       */\n      withBackdrop: {\n        type: Boolean,\n        value: false,\n        reflectToAttribute: true,\n      },\n\n      /**\n       * Object with properties that is passed to `renderer` function\n       */\n      model: Object,\n\n      /**\n       * When true the overlay won't disable the main content, showing\n       * it doesn’t change the functionality of the user interface.\n       * @type {boolean}\n       */\n      modeless: {\n        type: Boolean,\n        value: false,\n        reflectToAttribute: true,\n        observer: '_modelessChanged',\n      },\n\n      /**\n       * When set to true, the overlay is hidden. This also closes the overlay\n       * immediately in case there is a closing animation in progress.\n       * @type {boolean}\n       */\n      hidden: {\n        type: Boolean,\n        reflectToAttribute: true,\n        observer: '_hiddenChanged',\n      },\n\n      /**\n       * When true move focus to the first focusable element in the overlay,\n       * or to the overlay if there are no focusable elements.\n       * @type {boolean}\n       */\n      focusTrap: {\n        type: Boolean,\n        value: false,\n      },\n\n      /**\n       * Set to true to enable restoring of focus when overlay is closed.\n       * @type {boolean}\n       */\n      restoreFocusOnClose: {\n        type: Boolean,\n        value: false,\n      },\n\n      /**\n       * Set to specify the element which should be focused on overlay close,\n       * if `restoreFocusOnClose` is set to true.\n       * @type {HTMLElement}\n       */\n      restoreFocusNode: {\n        type: HTMLElement,\n      },\n\n      /** @private */\n      _mouseDownInside: {\n        type: Boolean,\n      },\n\n      /** @private */\n      _mouseUpInside: {\n        type: Boolean,\n      },\n\n      /** @private */\n      _instance: {\n        type: Object,\n      },\n\n      /** @private */\n      _originalContentPart: Object,\n\n      /** @private */\n      _contentNodes: Array,\n\n      /** @private */\n      _oldOwner: Element,\n\n      /** @private */\n      _oldModel: Object,\n\n      /** @private */\n      _oldTemplate: Object,\n\n      /** @private */\n      _oldRenderer: Object,\n\n      /** @private */\n      _oldOpened: Boolean,\n    };\n  }\n\n  static get observers() {\n    return ['_templateOrRendererChanged(template, renderer, owner, model, opened)'];\n  }\n\n  constructor() {\n    super();\n    this._boundMouseDownListener = this._mouseDownListener.bind(this);\n    this._boundMouseUpListener = this._mouseUpListener.bind(this);\n    this._boundOutsideClickListener = this._outsideClickListener.bind(this);\n    this._boundKeydownListener = this._keydownListener.bind(this);\n\n    this._observer = new FlattenedNodesObserver(this, (info) => {\n      this._setTemplateFromNodes(info.addedNodes);\n    });\n\n    // Listener for preventing closing of the paper-dialog and all components extending `iron-overlay-behavior`.\n    this._boundIronOverlayCanceledListener = this._ironOverlayCanceled.bind(this);\n\n    /* c8 ignore next 3 */\n    if (isIOS) {\n      this._boundIosResizeListener = () => this._detectIosNavbar();\n    }\n\n    this.__focusTrapController = new FocusTrapController(this);\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this._observer.flush();\n\n    // Need to add dummy click listeners to this and the backdrop or else\n    // the document click event listener (_outsideClickListener) may never\n    // get invoked on iOS Safari (reproducible in <vaadin-dialog>\n    // and <vaadin-context-menu>).\n    this.addEventListener('click', () => {});\n    this.$.backdrop.addEventListener('click', () => {});\n\n    this.addEventListener('mouseup', () => {\n      // In Chrome, focus moves to body on overlay content mousedown\n      // See https://github.com/vaadin/flow-components/issues/5507\n      if (document.activeElement === document.body && this.$.overlay.getAttribute('tabindex') === '0') {\n        this.$.overlay.focus();\n      }\n    });\n\n    this.addController(this.__focusTrapController);\n  }\n\n  /** @private */\n  _detectIosNavbar() {\n    /* c8 ignore next 15 */\n    if (!this.opened) {\n      return;\n    }\n\n    const innerHeight = window.innerHeight;\n    const innerWidth = window.innerWidth;\n\n    const landscape = innerWidth > innerHeight;\n\n    const clientHeight = document.documentElement.clientHeight;\n\n    if (landscape && clientHeight > innerHeight) {\n      this.style.setProperty('--vaadin-overlay-viewport-bottom', `${clientHeight - innerHeight}px`);\n    } else {\n      this.style.setProperty('--vaadin-overlay-viewport-bottom', '0');\n    }\n  }\n\n  /**\n   * @param {!Array<!Element>} nodes\n   * @protected\n   */\n  _setTemplateFromNodes(nodes) {\n    this.template = nodes.find((node) => node.localName && node.localName === 'template') || this.template;\n  }\n\n  /**\n   * @param {Event=} sourceEvent\n   * @event vaadin-overlay-close\n   * fired before the `vaadin-overlay` will be closed. If canceled the closing of the overlay is canceled as well.\n   */\n  close(sourceEvent) {\n    const evt = new CustomEvent('vaadin-overlay-close', {\n      bubbles: true,\n      cancelable: true,\n      detail: { sourceEvent },\n    });\n    this.dispatchEvent(evt);\n    if (!evt.defaultPrevented) {\n      this.opened = false;\n    }\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n\n    /* c8 ignore next 3 */\n    if (this._boundIosResizeListener) {\n      this._detectIosNavbar();\n      window.addEventListener('resize', this._boundIosResizeListener);\n    }\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    /* c8 ignore next 3 */\n    if (this._boundIosResizeListener) {\n      window.removeEventListener('resize', this._boundIosResizeListener);\n    }\n  }\n\n  /**\n   * Requests an update for the content of the overlay.\n   * While performing the update, it invokes the renderer passed in the `renderer` property.\n   *\n   * It is not guaranteed that the update happens immediately (synchronously) after it is requested.\n   */\n  requestContentUpdate() {\n    if (this.renderer) {\n      this.renderer.call(this.owner, this.content, this.owner, this.model);\n    }\n  }\n\n  /** @private */\n  _ironOverlayCanceled(event) {\n    event.preventDefault();\n  }\n\n  /** @private */\n  _mouseDownListener(event) {\n    this._mouseDownInside = event.composedPath().indexOf(this.$.overlay) >= 0;\n  }\n\n  /** @private */\n  _mouseUpListener(event) {\n    this._mouseUpInside = event.composedPath().indexOf(this.$.overlay) >= 0;\n  }\n\n  /**\n   * We need to listen on 'click' / 'tap' event and capture it and close the overlay before\n   * propagating the event to the listener in the button. Otherwise, if the clicked button would call\n   * open(), this would happen: https://www.youtube.com/watch?v=Z86V_ICUCD4\n   *\n   * @event vaadin-overlay-outside-click\n   * fired before the `vaadin-overlay` will be closed on outside click. If canceled the closing of the overlay is canceled as well.\n   *\n   * @private\n   */\n  _outsideClickListener(event) {\n    if (event.composedPath().includes(this.$.overlay) || this._mouseDownInside || this._mouseUpInside) {\n      this._mouseDownInside = false;\n      this._mouseUpInside = false;\n      return;\n    }\n    if (!this._last) {\n      return;\n    }\n\n    const evt = new CustomEvent('vaadin-overlay-outside-click', {\n      bubbles: true,\n      cancelable: true,\n      detail: { sourceEvent: event },\n    });\n    this.dispatchEvent(evt);\n\n    if (this.opened && !evt.defaultPrevented) {\n      this.close(event);\n    }\n  }\n\n  /**\n   * @event vaadin-overlay-escape-press\n   * fired before the `vaadin-overlay` will be closed on ESC button press. If canceled the closing of the overlay is canceled as well.\n   *\n   * @private\n   */\n  _keydownListener(event) {\n    if (!this._last) {\n      return;\n    }\n\n    // Only close modeless overlay on Esc press when it contains focus\n    if (this.modeless && !event.composedPath().includes(this.$.overlay)) {\n      return;\n    }\n\n    if (event.key === 'Escape') {\n      const evt = new CustomEvent('vaadin-overlay-escape-press', {\n        bubbles: true,\n        cancelable: true,\n        detail: { sourceEvent: event },\n      });\n      this.dispatchEvent(evt);\n\n      if (this.opened && !evt.defaultPrevented) {\n        this.close(event);\n      }\n    }\n  }\n\n  /** @protected */\n  _ensureTemplatized() {\n    this._setTemplateFromNodes(Array.from(this.children));\n  }\n\n  /**\n   * @event vaadin-overlay-open\n   * fired after the `vaadin-overlay` is opened.\n   *\n   * @private\n   */\n  _openedChanged(opened, wasOpened) {\n    if (!this._instance) {\n      this._ensureTemplatized();\n    }\n\n    if (opened) {\n      // Store focused node.\n      this.__restoreFocusNode = this._getActiveElement();\n      this._animatedOpening();\n\n      afterNextRender(this, () => {\n        if (this.focusTrap) {\n          this.__focusTrapController.trapFocus(this.$.overlay);\n        }\n\n        const evt = new CustomEvent('vaadin-overlay-open', { bubbles: true });\n        this.dispatchEvent(evt);\n      });\n\n      document.addEventListener('keydown', this._boundKeydownListener);\n\n      if (!this.modeless) {\n        this._addGlobalListeners();\n      }\n    } else if (wasOpened) {\n      if (this.focusTrap) {\n        this.__focusTrapController.releaseFocus();\n      }\n\n      this._animatedClosing();\n\n      document.removeEventListener('keydown', this._boundKeydownListener);\n\n      if (!this.modeless) {\n        this._removeGlobalListeners();\n      }\n    }\n  }\n\n  /** @private */\n  _hiddenChanged(hidden) {\n    if (hidden && this.hasAttribute('closing')) {\n      this._flushAnimation('closing');\n    }\n  }\n\n  /**\n   * @return {boolean}\n   * @protected\n   */\n  _shouldAnimate() {\n    const name = getComputedStyle(this).getPropertyValue('animation-name');\n    const hidden = getComputedStyle(this).getPropertyValue('display') === 'none';\n    return !hidden && name && name !== 'none';\n  }\n\n  /**\n   * @param {string} type\n   * @param {Function} callback\n   * @protected\n   */\n  _enqueueAnimation(type, callback) {\n    const handler = `__${type}Handler`;\n    const listener = (event) => {\n      if (event && event.target !== this) {\n        return;\n      }\n      callback();\n      this.removeEventListener('animationend', listener);\n      delete this[handler];\n    };\n    this[handler] = listener;\n    this.addEventListener('animationend', listener);\n  }\n\n  /**\n   * @param {string} type\n   * @protected\n   */\n  _flushAnimation(type) {\n    const handler = `__${type}Handler`;\n    if (typeof this[handler] === 'function') {\n      this[handler]();\n    }\n  }\n\n  /** @protected */\n  _animatedOpening() {\n    if (this.parentNode === document.body && this.hasAttribute('closing')) {\n      this._flushAnimation('closing');\n    }\n    this._attachOverlay();\n    if (!this.modeless) {\n      this._enterModalState();\n    }\n    this.setAttribute('opening', '');\n\n    if (this._shouldAnimate()) {\n      this._enqueueAnimation('opening', () => {\n        this._finishOpening();\n      });\n    } else {\n      this._finishOpening();\n    }\n  }\n\n  /** @protected */\n  _attachOverlay() {\n    this._placeholder = document.createComment('vaadin-overlay-placeholder');\n    this.parentNode.insertBefore(this._placeholder, this);\n    document.body.appendChild(this);\n    this.bringToFront();\n  }\n\n  /** @protected */\n  _finishOpening() {\n    document.addEventListener('iron-overlay-canceled', this._boundIronOverlayCanceledListener);\n    this.removeAttribute('opening');\n  }\n\n  /** @protected */\n  _finishClosing() {\n    document.removeEventListener('iron-overlay-canceled', this._boundIronOverlayCanceledListener);\n    this._detachOverlay();\n    this.$.overlay.style.removeProperty('pointer-events');\n    this.removeAttribute('closing');\n  }\n\n  /**\n   * @event vaadin-overlay-closing\n   * Fired when the overlay will be closed.\n   *\n   * @protected\n   */\n  _animatedClosing() {\n    if (this.hasAttribute('opening')) {\n      this._flushAnimation('opening');\n    }\n    if (this._placeholder) {\n      this._exitModalState();\n\n      // Use this.restoreFocusNode if specified, otherwise fallback to the node\n      // which was focused before opening the overlay.\n      const restoreFocusNode = this.restoreFocusNode || this.__restoreFocusNode;\n\n      if (this.restoreFocusOnClose && restoreFocusNode) {\n        // If the activeElement is `<body>` or inside the overlay,\n        // we are allowed to restore the focus. In all the other\n        // cases focus might have been moved elsewhere by another\n        // component or by the user interaction (e.g. click on a\n        // button outside the overlay).\n        const activeElement = this._getActiveElement();\n\n        if (activeElement === document.body || this._deepContains(activeElement)) {\n          // Focusing the restoreFocusNode doesn't always work synchronously on Firefox and Safari\n          // (e.g. combo-box overlay close on outside click).\n          setTimeout(() => restoreFocusNode.focus());\n        }\n        this.__restoreFocusNode = null;\n      }\n\n      this.setAttribute('closing', '');\n      this.dispatchEvent(new CustomEvent('vaadin-overlay-closing'));\n\n      if (this._shouldAnimate()) {\n        this._enqueueAnimation('closing', () => {\n          this._finishClosing();\n        });\n      } else {\n        this._finishClosing();\n      }\n    }\n  }\n\n  /** @protected */\n  _detachOverlay() {\n    this._placeholder.parentNode.insertBefore(this, this._placeholder);\n    this._placeholder.parentNode.removeChild(this._placeholder);\n  }\n\n  /**\n   * Returns all attached overlays in visual stacking order.\n   * @private\n   */\n  static get __attachedInstances() {\n    return Array.from(document.body.children)\n      .filter((el) => el instanceof Overlay && !el.hasAttribute('closing'))\n      .sort((a, b) => a.__zIndex - b.__zIndex || 0);\n  }\n\n  /**\n   * Returns true if this is the last one in the opened overlays stack\n   * @return {boolean}\n   * @protected\n   */\n  get _last() {\n    return this === Overlay.__attachedInstances.pop();\n  }\n\n  /** @private */\n  _modelessChanged(modeless) {\n    if (!modeless) {\n      if (this.opened) {\n        this._addGlobalListeners();\n        this._enterModalState();\n      }\n    } else {\n      this._removeGlobalListeners();\n      this._exitModalState();\n    }\n  }\n\n  /** @protected */\n  _addGlobalListeners() {\n    document.addEventListener('mousedown', this._boundMouseDownListener);\n    document.addEventListener('mouseup', this._boundMouseUpListener);\n    // Firefox leaks click to document on contextmenu even if prevented\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=990614\n    document.documentElement.addEventListener('click', this._boundOutsideClickListener, true);\n  }\n\n  /** @protected */\n  _enterModalState() {\n    if (document.body.style.pointerEvents !== 'none') {\n      // Set body pointer-events to 'none' to disable mouse interactions with\n      // other document nodes.\n      this._previousDocumentPointerEvents = document.body.style.pointerEvents;\n      document.body.style.pointerEvents = 'none';\n    }\n\n    // Disable pointer events in other attached overlays\n    Overlay.__attachedInstances.forEach((el) => {\n      if (el !== this) {\n        el.shadowRoot.querySelector('[part=\"overlay\"]').style.pointerEvents = 'none';\n      }\n    });\n  }\n\n  /** @protected */\n  _removeGlobalListeners() {\n    document.removeEventListener('mousedown', this._boundMouseDownListener);\n    document.removeEventListener('mouseup', this._boundMouseUpListener);\n    document.documentElement.removeEventListener('click', this._boundOutsideClickListener, true);\n  }\n\n  /** @protected */\n  _exitModalState() {\n    if (this._previousDocumentPointerEvents !== undefined) {\n      // Restore body pointer-events\n      document.body.style.pointerEvents = this._previousDocumentPointerEvents;\n      delete this._previousDocumentPointerEvents;\n    }\n\n    // Restore pointer events in the previous overlay(s)\n    const instances = Overlay.__attachedInstances;\n    let el;\n    // Use instances.pop() to ensure the reverse order\n    while ((el = instances.pop())) {\n      if (el === this) {\n        // Skip the current instance\n        continue;\n      }\n      el.shadowRoot.querySelector('[part=\"overlay\"]').style.removeProperty('pointer-events');\n      if (!el.modeless) {\n        // Stop after the last modal\n        break;\n      }\n    }\n  }\n\n  /** @protected */\n  _removeOldContent() {\n    if (!this.content || !this._contentNodes) {\n      return;\n    }\n\n    this._observer.disconnect();\n\n    this._contentNodes.forEach((node) => {\n      if (node.parentNode === this.content) {\n        this.content.removeChild(node);\n      }\n    });\n\n    if (this._originalContentPart) {\n      // Restore the original <div part=\"content\">\n      this.$.content.parentNode.replaceChild(this._originalContentPart, this.$.content);\n      this.$.content = this._originalContentPart;\n      this._originalContentPart = undefined;\n    }\n\n    this._observer.connect();\n\n    this._contentNodes = undefined;\n    this.content = undefined;\n  }\n\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @protected\n   */\n  _stampOverlayTemplate(template) {\n    this._removeOldContent();\n\n    if (!template._Templatizer) {\n      template._Templatizer = templatize(template, this, {\n        forwardHostProp(prop, value) {\n          if (this._instance) {\n            this._instance.forwardHostProp(prop, value);\n          }\n        },\n      });\n    }\n\n    this._instance = new template._Templatizer({});\n    this._contentNodes = Array.from(this._instance.root.childNodes);\n\n    const templateRoot = template._templateRoot || (template._templateRoot = template.getRootNode());\n\n    if (templateRoot !== document) {\n      if (!this.$.content.shadowRoot) {\n        this.$.content.attachShadow({ mode: 'open' });\n      }\n\n      let scopeCssText = Array.from(templateRoot.querySelectorAll('style')).reduce(\n        (result, style) => result + style.textContent,\n        '',\n      );\n\n      // The overlay root’s :host styles should not apply inside the overlay\n      scopeCssText = scopeCssText.replace(/:host/g, ':host-nomatch');\n\n      if (scopeCssText) {\n        // Append a style to the content shadowRoot\n        const style = document.createElement('style');\n        style.textContent = scopeCssText;\n        this.$.content.shadowRoot.appendChild(style);\n        this._contentNodes.unshift(style);\n      }\n\n      this.$.content.shadowRoot.appendChild(this._instance.root);\n      this.content = this.$.content.shadowRoot;\n    } else {\n      this.appendChild(this._instance.root);\n      this.content = this;\n    }\n  }\n\n  /** @private */\n  _removeNewRendererOrTemplate(template, oldTemplate, renderer, oldRenderer) {\n    if (template !== oldTemplate) {\n      this.template = undefined;\n    } else if (renderer !== oldRenderer) {\n      this.renderer = undefined;\n    }\n  }\n\n  /** @private */\n  // eslint-disable-next-line max-params\n  _templateOrRendererChanged(template, renderer, owner, model, opened) {\n    if (template && renderer) {\n      this._removeNewRendererOrTemplate(template, this._oldTemplate, renderer, this._oldRenderer);\n      throw new Error('You should only use either a renderer or a template for overlay content');\n    }\n\n    const ownerOrModelChanged = this._oldOwner !== owner || this._oldModel !== model;\n    this._oldModel = model;\n    this._oldOwner = owner;\n\n    const templateChanged = this._oldTemplate !== template;\n    this._oldTemplate = template;\n\n    const rendererChanged = this._oldRenderer !== renderer;\n    this._oldRenderer = renderer;\n\n    const openedChanged = this._oldOpened !== opened;\n    this._oldOpened = opened;\n\n    if (rendererChanged) {\n      this.content = this;\n      this.content.innerHTML = '';\n      // Whenever a Lit-based renderer is used, it assigns a Lit part to the node it was rendered into.\n      // When clearing the rendered content, this part needs to be manually disposed of.\n      // Otherwise, using a Lit-based renderer on the same node will throw an exception or render nothing afterward.\n      delete this.content._$litPart$;\n    }\n\n    if (template && templateChanged) {\n      this._stampOverlayTemplate(template);\n    } else if (renderer && (rendererChanged || openedChanged || ownerOrModelChanged)) {\n      if (opened) {\n        this.requestContentUpdate();\n      }\n    }\n  }\n\n  /**\n   * @return {!Element}\n   * @protected\n   */\n  _getActiveElement() {\n    // Document.activeElement can be null\n    // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement\n    let active = document.activeElement || document.body;\n    while (active.shadowRoot && active.shadowRoot.activeElement) {\n      active = active.shadowRoot.activeElement;\n    }\n    return active;\n  }\n\n  /**\n   * @param {!Node} node\n   * @return {boolean}\n   * @protected\n   */\n  _deepContains(node) {\n    if (this.contains(node)) {\n      return true;\n    }\n    let n = node;\n    const doc = node.ownerDocument;\n    // Walk from node to `this` or `document`\n    while (n && n !== doc && n !== this) {\n      n = n.parentNode || n.host;\n    }\n    return n === this;\n  }\n\n  /**\n   * Brings the overlay as visually the frontmost one\n   */\n  bringToFront() {\n    let zIndex = '';\n    const frontmost = Overlay.__attachedInstances.filter((o) => o !== this).pop();\n    if (frontmost) {\n      const frontmostZIndex = frontmost.__zIndex;\n      zIndex = frontmostZIndex + 1;\n    }\n    this.style.zIndex = zIndex;\n    this.__zIndex = zIndex || parseFloat(getComputedStyle(this).zIndex);\n  }\n}\n\ncustomElements.define(Overlay.is, Overlay);\n\nexport { Overlay };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { isIOS } from '@vaadin/component-base/src/browser-utils.js';\nimport { prevent, register } from '@vaadin/component-base/src/gestures.js';\n\nregister({\n  name: 'vaadin-contextmenu',\n  deps: ['touchstart', 'touchmove', 'touchend', 'contextmenu'],\n  flow: {\n    start: ['touchstart', 'contextmenu'],\n    end: ['contextmenu'],\n  },\n\n  emits: ['vaadin-contextmenu'],\n\n  info: {\n    sourceEvent: null,\n  },\n\n  reset() {\n    this.info.sourceEvent = null;\n    this._cancelTimer();\n    this.info.touchJob = null;\n    this.info.touchStartCoords = null;\n  },\n\n  _cancelTimer() {\n    if (this._timerId) {\n      clearTimeout(this._timerId);\n      delete this._fired;\n    }\n  },\n\n  _setSourceEvent(e) {\n    this.info.sourceEvent = e;\n\n    const path = e.composedPath();\n\n    // Calling `sourceEvent.composedPath()` after a timeout would return an empty array.\n    // This is especially problematic on iOS where we configure the timer on touchstart.\n    // Store the composed path to be used by `grid.getEventContext(event)` so it works.\n    this.info.sourceEvent.__composedPath = path;\n  },\n\n  touchstart(e) {\n    this._setSourceEvent(e);\n\n    this.info.touchStartCoords = {\n      x: e.changedTouches[0].clientX,\n      y: e.changedTouches[0].clientY,\n    };\n\n    // After timeout event is already retargeted to the parent element in case there is one.\n    // So we are assigning the target synchronously on event dispatched.\n    const t = e.composedPath()[0] || e.target;\n\n    this._timerId = setTimeout(() => {\n      const ct = e.changedTouches[0];\n      if (!e.shiftKey) {\n        if (isIOS) {\n          this._fired = true;\n          this.fire(t, ct.clientX, ct.clientY);\n        }\n\n        // Needed to prevent any 'tap' gesture events from firing\n        // which could potentially cancel/close the overlay.\n        prevent('tap');\n      }\n    }, 500); // Default setting for Android and iOS.\n  },\n\n  touchmove(e) {\n    const moveThreshold = 15;\n    const touchStartCoords = this.info.touchStartCoords;\n    if (\n      Math.abs(touchStartCoords.x - e.changedTouches[0].clientX) > moveThreshold ||\n      Math.abs(touchStartCoords.y - e.changedTouches[0].clientY) > moveThreshold\n    ) {\n      this._cancelTimer();\n    }\n  },\n\n  touchend(e) {\n    if (this._fired) {\n      e.preventDefault();\n    }\n    this._cancelTimer();\n  },\n\n  contextmenu(e) {\n    if (!e.shiftKey) {\n      this._setSourceEvent(e);\n      this.fire(e.target, e.clientX, e.clientY);\n      prevent('tap');\n    }\n  },\n\n  fire(target, x, y) {\n    // NOTE(web-padawan): the code below is copied from `Polymer.Gestures._fire`,\n    // which is not exported from `gestures.js` module for Polymer 3.\n    const sourceEvent = this.info.sourceEvent;\n    const ev = new Event('vaadin-contextmenu', { bubbles: true, cancelable: true, composed: true });\n    ev.detail = { x, y, sourceEvent };\n    target.dispatchEvent(ev);\n    // Forward `preventDefault` in a clean way\n    if (ev.defaultPrevented && sourceEvent && sourceEvent.preventDefault) {\n      sourceEvent.preventDefault();\n    }\n  },\n});\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { getAncestorRootNodes } from '@vaadin/component-base/src/dom-utils.js';\n\nconst PROP_NAMES_VERTICAL = {\n  start: 'top',\n  end: 'bottom',\n};\n\nconst PROP_NAMES_HORIZONTAL = {\n  start: 'left',\n  end: 'right',\n};\n\nconst targetResizeObserver = new ResizeObserver((entries) => {\n  setTimeout(() => {\n    entries.forEach((entry) => {\n      if (entry.target.__overlay) {\n        entry.target.__overlay._updatePosition();\n      }\n    });\n  });\n});\n\n/**\n * @polymerMixin\n */\nexport const PositionMixin = (superClass) =>\n  class PositionMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * The element next to which this overlay should be aligned.\n         * The position of the overlay relative to the positionTarget can be adjusted\n         * with properties `horizontalAlign`, `verticalAlign`, `noHorizontalOverlap`\n         * and `noVerticalOverlap`.\n         */\n        positionTarget: {\n          type: Object,\n          value: null,\n        },\n\n        /**\n         * When `positionTarget` is set, this property defines whether to align the overlay's\n         * left or right side to the target element by default.\n         * Possible values are `start` and `end`.\n         * RTL is taken into account when interpreting the value.\n         * The overlay is automatically flipped to the opposite side when it doesn't fit into\n         * the default side defined by this property.\n         *\n         * @attr {start|end} horizontal-align\n         */\n        horizontalAlign: {\n          type: String,\n          value: 'start',\n        },\n\n        /**\n         * When `positionTarget` is set, this property defines whether to align the overlay's\n         * top or bottom side to the target element by default.\n         * Possible values are `top` and `bottom`.\n         * The overlay is automatically flipped to the opposite side when it doesn't fit into\n         * the default side defined by this property.\n         *\n         * @attr {top|bottom} vertical-align\n         */\n        verticalAlign: {\n          type: String,\n          value: 'top',\n        },\n\n        /**\n         * When `positionTarget` is set, this property defines whether the overlay should overlap\n         * the target element in the x-axis, or be positioned right next to it.\n         *\n         * @attr {boolean} no-horizontal-overlap\n         */\n        noHorizontalOverlap: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * When `positionTarget` is set, this property defines whether the overlay should overlap\n         * the target element in the y-axis, or be positioned right above/below it.\n         *\n         * @attr {boolean} no-vertical-overlap\n         */\n        noVerticalOverlap: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * If the overlay content has no intrinsic height, this property can be used to set\n         * the minimum vertical space (in pixels) required by the overlay. Setting a value to\n         * the property effectively disables the content measurement in favor of using this\n         * fixed value for determining the open direction.\n         *\n         * @attr {number} required-vertical-space\n         */\n        requiredVerticalSpace: {\n          type: Number,\n          value: 0,\n        },\n      };\n    }\n\n    static get observers() {\n      return [\n        '__positionSettingsChanged(horizontalAlign, verticalAlign, noHorizontalOverlap, noVerticalOverlap, requiredVerticalSpace)',\n        '__overlayOpenedChanged(opened, positionTarget)',\n      ];\n    }\n\n    constructor() {\n      super();\n\n      this.__onScroll = this.__onScroll.bind(this);\n      this._updatePosition = this._updatePosition.bind(this);\n    }\n\n    /** @protected */\n    connectedCallback() {\n      super.connectedCallback();\n\n      if (this.opened) {\n        this.__addUpdatePositionEventListeners();\n      }\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n      this.__removeUpdatePositionEventListeners();\n    }\n\n    /** @private */\n    __addUpdatePositionEventListeners() {\n      window.addEventListener('resize', this._updatePosition);\n\n      this.__positionTargetAncestorRootNodes = getAncestorRootNodes(this.positionTarget);\n      this.__positionTargetAncestorRootNodes.forEach((node) => {\n        node.addEventListener('scroll', this.__onScroll, true);\n      });\n    }\n\n    /** @private */\n    __removeUpdatePositionEventListeners() {\n      window.removeEventListener('resize', this._updatePosition);\n\n      if (this.__positionTargetAncestorRootNodes) {\n        this.__positionTargetAncestorRootNodes.forEach((node) => {\n          node.removeEventListener('scroll', this.__onScroll, true);\n        });\n        this.__positionTargetAncestorRootNodes = null;\n      }\n    }\n\n    /** @private */\n    __overlayOpenedChanged(opened, positionTarget) {\n      this.__removeUpdatePositionEventListeners();\n\n      if (positionTarget) {\n        positionTarget.__overlay = null;\n        targetResizeObserver.unobserve(positionTarget);\n\n        if (opened) {\n          this.__addUpdatePositionEventListeners();\n          positionTarget.__overlay = this;\n          targetResizeObserver.observe(positionTarget);\n        }\n      }\n\n      if (opened) {\n        const computedStyle = getComputedStyle(this);\n        if (!this.__margins) {\n          this.__margins = {};\n          ['top', 'bottom', 'left', 'right'].forEach((propName) => {\n            this.__margins[propName] = parseInt(computedStyle[propName], 10);\n          });\n        }\n        this.setAttribute('dir', computedStyle.direction);\n\n        this._updatePosition();\n        // Schedule another position update (to cover virtual keyboard opening for example)\n        requestAnimationFrame(() => this._updatePosition());\n      }\n    }\n\n    get __isRTL() {\n      return this.getAttribute('dir') === 'rtl';\n    }\n\n    __positionSettingsChanged() {\n      this._updatePosition();\n    }\n\n    /** @private */\n    __onScroll(e) {\n      // If the scroll event occurred inside the overlay, ignore it.\n      if (!this.contains(e.target)) {\n        this._updatePosition();\n      }\n    }\n\n    _updatePosition() {\n      if (!this.positionTarget || !this.opened) {\n        return;\n      }\n\n      const targetRect = this.positionTarget.getBoundingClientRect();\n\n      if (targetRect.width === 0 && targetRect.height === 0 && this.opened) {\n        this.opened = false;\n        return;\n      }\n\n      // Detect the desired alignment and update the layout accordingly\n      const shouldAlignStartVertically = this.__shouldAlignStartVertically(targetRect);\n      this.style.justifyContent = shouldAlignStartVertically ? 'flex-start' : 'flex-end';\n\n      const shouldAlignStartHorizontally = this.__shouldAlignStartHorizontally(targetRect, this.__isRTL);\n      const flexStart =\n        (!this.__isRTL && shouldAlignStartHorizontally) || (this.__isRTL && !shouldAlignStartHorizontally);\n      this.style.alignItems = flexStart ? 'flex-start' : 'flex-end';\n\n      // Get the overlay rect after possible overlay alignment changes\n      const overlayRect = this.getBoundingClientRect();\n\n      // Obtain vertical positioning properties\n      const verticalProps = this.__calculatePositionInOneDimension(\n        targetRect,\n        overlayRect,\n        this.noVerticalOverlap,\n        PROP_NAMES_VERTICAL,\n        this,\n        shouldAlignStartVertically,\n      );\n\n      // Obtain horizontal positioning properties\n      const horizontalProps = this.__calculatePositionInOneDimension(\n        targetRect,\n        overlayRect,\n        this.noHorizontalOverlap,\n        PROP_NAMES_HORIZONTAL,\n        this,\n        shouldAlignStartHorizontally,\n      );\n\n      // Apply the positioning properties to the overlay\n      Object.assign(this.style, verticalProps, horizontalProps);\n\n      this.toggleAttribute('bottom-aligned', !shouldAlignStartVertically);\n      this.toggleAttribute('top-aligned', shouldAlignStartVertically);\n\n      this.toggleAttribute('end-aligned', !flexStart);\n      this.toggleAttribute('start-aligned', flexStart);\n    }\n\n    __shouldAlignStartHorizontally(targetRect, rtl) {\n      // Using previous size to fix a case where window resize may cause the overlay to be squeezed\n      // smaller than its current space before the fit-calculations.\n      const contentWidth = Math.max(this.__oldContentWidth || 0, this.$.overlay.offsetWidth);\n      this.__oldContentWidth = this.$.overlay.offsetWidth;\n\n      const viewportWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);\n      const defaultAlignLeft = (!rtl && this.horizontalAlign === 'start') || (rtl && this.horizontalAlign === 'end');\n\n      return this.__shouldAlignStart(\n        targetRect,\n        contentWidth,\n        viewportWidth,\n        this.__margins,\n        defaultAlignLeft,\n        this.noHorizontalOverlap,\n        PROP_NAMES_HORIZONTAL,\n      );\n    }\n\n    __shouldAlignStartVertically(targetRect) {\n      // Using previous size to fix a case where window resize may cause the overlay to be squeezed\n      // smaller than its current space before the fit-calculations.\n      const contentHeight =\n        this.requiredVerticalSpace || Math.max(this.__oldContentHeight || 0, this.$.overlay.offsetHeight);\n      this.__oldContentHeight = this.$.overlay.offsetHeight;\n\n      const viewportHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);\n      const defaultAlignTop = this.verticalAlign === 'top';\n\n      return this.__shouldAlignStart(\n        targetRect,\n        contentHeight,\n        viewportHeight,\n        this.__margins,\n        defaultAlignTop,\n        this.noVerticalOverlap,\n        PROP_NAMES_VERTICAL,\n      );\n    }\n\n    // eslint-disable-next-line max-params\n    __shouldAlignStart(targetRect, contentSize, viewportSize, margins, defaultAlignStart, noOverlap, propNames) {\n      const spaceForStartAlignment =\n        viewportSize - targetRect[noOverlap ? propNames.end : propNames.start] - margins[propNames.end];\n      const spaceForEndAlignment = targetRect[noOverlap ? propNames.start : propNames.end] - margins[propNames.start];\n\n      const spaceForDefaultAlignment = defaultAlignStart ? spaceForStartAlignment : spaceForEndAlignment;\n      const spaceForOtherAlignment = defaultAlignStart ? spaceForEndAlignment : spaceForStartAlignment;\n\n      const shouldGoToDefaultSide =\n        spaceForDefaultAlignment > spaceForOtherAlignment || spaceForDefaultAlignment > contentSize;\n\n      return defaultAlignStart === shouldGoToDefaultSide;\n    }\n\n    /**\n     * Returns an adjusted value after resizing the browser window,\n     * to avoid wrong calculations when e.g. previously set `bottom`\n     * CSS property value is larger than the updated viewport height.\n     * See https://github.com/vaadin/web-components/issues/4604\n     */\n    __adjustBottomProperty(cssPropNameToSet, propNames, currentValue) {\n      let adjustedProp;\n\n      if (cssPropNameToSet === propNames.end) {\n        // Adjust horizontally\n        if (propNames.end === PROP_NAMES_VERTICAL.end) {\n          const viewportHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);\n\n          if (currentValue > viewportHeight && this.__oldViewportHeight) {\n            const heightDiff = this.__oldViewportHeight - viewportHeight;\n            adjustedProp = currentValue - heightDiff;\n          }\n\n          this.__oldViewportHeight = viewportHeight;\n        }\n\n        // Adjust vertically\n        if (propNames.end === PROP_NAMES_HORIZONTAL.end) {\n          const viewportWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);\n\n          if (currentValue > viewportWidth && this.__oldViewportWidth) {\n            const widthDiff = this.__oldViewportWidth - viewportWidth;\n            adjustedProp = currentValue - widthDiff;\n          }\n\n          this.__oldViewportWidth = viewportWidth;\n        }\n      }\n\n      return adjustedProp;\n    }\n\n    /**\n     * Returns an object with CSS position properties to set,\n     * e.g. { top: \"100px\" }\n     */\n    // eslint-disable-next-line max-params\n    __calculatePositionInOneDimension(targetRect, overlayRect, noOverlap, propNames, overlay, shouldAlignStart) {\n      const cssPropNameToSet = shouldAlignStart ? propNames.start : propNames.end;\n      const cssPropNameToClear = shouldAlignStart ? propNames.end : propNames.start;\n\n      const currentValue = parseFloat(overlay.style[cssPropNameToSet] || getComputedStyle(overlay)[cssPropNameToSet]);\n      const adjustedValue = this.__adjustBottomProperty(cssPropNameToSet, propNames, currentValue);\n\n      const diff =\n        overlayRect[shouldAlignStart ? propNames.start : propNames.end] -\n        targetRect[noOverlap === shouldAlignStart ? propNames.end : propNames.start];\n\n      const valueToSet = adjustedValue\n        ? `${adjustedValue}px`\n        : `${currentValue + diff * (shouldAlignStart ? -1 : 1)}px`;\n\n      return {\n        [cssPropNameToSet]: valueToSet,\n        [cssPropNameToClear]: '',\n      };\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { Overlay } from '@vaadin/overlay/src/vaadin-overlay.js';\nimport { PositionMixin } from '@vaadin/overlay/src/vaadin-overlay-position-mixin.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-context-menu-overlay',\n  css`\n    :host {\n      align-items: flex-start;\n      justify-content: flex-start;\n    }\n\n    :host([right-aligned]),\n    :host([end-aligned]) {\n      align-items: flex-end;\n    }\n\n    :host([bottom-aligned]) {\n      justify-content: flex-end;\n    }\n\n    [part='overlay'] {\n      background-color: #fff;\n    }\n  `,\n  { moduleId: 'vaadin-context-menu-overlay-styles' },\n);\n\n/**\n * An element used internally by `<vaadin-context-menu>`. Not intended to be used separately.\n *\n * @extends Overlay\n * @protected\n */\nclass ContextMenuOverlay extends PositionMixin(Overlay) {\n  static get is() {\n    return 'vaadin-context-menu-overlay';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * @protected\n       */\n      parentOverlay: {\n        type: Object,\n        readOnly: true,\n      },\n    };\n  }\n\n  static get observers() {\n    return ['_themeChanged(_theme)'];\n  }\n\n  ready() {\n    super.ready();\n\n    this.addEventListener('keydown', (e) => {\n      if (!e.defaultPrevented && e.composedPath()[0] === this.$.overlay && [38, 40].indexOf(e.keyCode) > -1) {\n        const child = this.getFirstChild();\n        if (child && Array.isArray(child.items) && child.items.length) {\n          e.preventDefault();\n          if (e.keyCode === 38) {\n            child.items[child.items.length - 1].focus();\n          } else {\n            child.focus();\n          }\n        }\n      }\n    });\n  }\n\n  getFirstChild() {\n    return this.content.querySelector(':not(style):not(slot)');\n  }\n\n  _themeChanged() {\n    this.close();\n  }\n\n  getBoundaries() {\n    // Measure actual overlay and content sizes\n    const overlayRect = this.getBoundingClientRect();\n    const contentRect = this.$.overlay.getBoundingClientRect();\n\n    // Maximum x and y values are imposed by content size and overlay limits.\n    let yMax = overlayRect.bottom - contentRect.height;\n\n    // Adjust constraints to ensure bottom-aligned applies to sub-menu.\n    const parent = this.parentOverlay;\n    if (parent && parent.hasAttribute('bottom-aligned')) {\n      const parentStyle = getComputedStyle(parent);\n      yMax = yMax - parseFloat(parentStyle.bottom) - parseFloat(parentStyle.height);\n    }\n\n    return {\n      xMax: overlayRect.right - contentRect.width,\n      xMin: overlayRect.left + contentRect.width,\n      yMax,\n    };\n  }\n\n  _updatePosition() {\n    super._updatePosition();\n\n    if (this.positionTarget && this.parentOverlay) {\n      // This overlay is positioned by a parent menu item,\n      // adjust the position by the overlay content paddings\n      const content = this.$.content;\n      const style = getComputedStyle(content);\n\n      // Horizontal adjustment\n      const isLeftAligned = !!this.style.left;\n      if (isLeftAligned) {\n        this.style.left = `${parseFloat(this.style.left) + parseFloat(style.paddingLeft)}px`;\n      } else {\n        this.style.right = `${parseFloat(this.style.right) + parseFloat(style.paddingRight)}px`;\n      }\n\n      // Vertical adjustment\n      const isBottomAligned = !!this.style.bottom;\n      if (isBottomAligned) {\n        this.style.bottom = `${parseFloat(this.style.bottom) - parseFloat(style.paddingBottom)}px`;\n      } else {\n        this.style.top = `${parseFloat(this.style.top) - parseFloat(style.paddingTop)}px`;\n      }\n    }\n  }\n}\n\ncustomElements.define(ContextMenuOverlay.is, ContextMenuOverlay);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * A controller for listening on media query changes.\n */\nexport class MediaQueryController {\n  constructor(query, callback) {\n    /**\n     * The CSS media query to evaluate.\n     *\n     * @type {string}\n     * @protected\n     */\n    this.query = query;\n\n    /**\n     * Function to call when media query changes.\n     *\n     * @type {Function}\n     * @protected\n     */\n    this.callback = callback;\n\n    this._boundQueryHandler = this._queryHandler.bind(this);\n  }\n\n  hostConnected() {\n    this._removeListener();\n\n    this._mediaQuery = window.matchMedia(this.query);\n\n    this._addListener();\n\n    this._queryHandler(this._mediaQuery);\n  }\n\n  hostDisconnected() {\n    this._removeListener();\n  }\n\n  /** @private */\n  _addListener() {\n    if (this._mediaQuery) {\n      this._mediaQuery.addListener(this._boundQueryHandler);\n    }\n  }\n\n  /** @private */\n  _removeListener() {\n    if (this._mediaQuery) {\n      this._mediaQuery.removeListener(this._boundQueryHandler);\n    }\n\n    this._mediaQuery = null;\n  }\n\n  /** @private */\n  _queryHandler(mediaQuery) {\n    if (typeof this.callback === 'function') {\n      this.callback(mediaQuery.matches);\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { isTouch } from '@vaadin/component-base/src/browser-utils.js';\nimport { Item } from '@vaadin/item/src/vaadin-item.js';\nimport { ListBox } from '@vaadin/list-box/src/vaadin-list-box.js';\n\n/**\n * An element used internally by `<vaadin-context-menu>`. Not intended to be used separately.\n *\n * @extends Item\n * @protected\n */\nclass ContextMenuItemElement extends Item {\n  static get is() {\n    return 'vaadin-context-menu-item';\n  }\n}\n\ncustomElements.define(ContextMenuItemElement.is, ContextMenuItemElement);\n\n/**\n * An element used internally by `<vaadin-context-menu>`. Not intended to be used separately.\n *\n * @extends ListBox\n * @protected\n */\nclass ContextMenuListBox extends ListBox {\n  static get is() {\n    return 'vaadin-context-menu-list-box';\n  }\n}\n\ncustomElements.define(ContextMenuListBox.is, ContextMenuListBox);\n\n/**\n * @polymerMixin\n */\nexport const ItemsMixin = (superClass) =>\n  class ItemsMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * @typedef ContextMenuItem\n         * @type {object}\n         * @property {string} text - Text to be set as the menu item component's textContent\n         * @property {union: string | object} component - The component to represent the item.\n         * Either a tagName or an element instance. Defaults to \"vaadin-context-menu-item\".\n         * @property {boolean} disabled - If true, the item is disabled and cannot be selected\n         * @property {boolean} checked - If true, the item shows a checkmark next to it\n         * @property {union: string | string[]} theme - If set, sets the given theme(s) as an attribute to the menu item component, overriding any theme set on the context menu.\n         * @property {MenuItem[]} children - Array of child menu items\n         */\n\n        /**\n         * Defines a (hierarchical) menu structure for the component.\n         * If a menu item has a non-empty `children` set, a sub-menu with the child items is opened\n         * next to the parent menu on mouseover, tap or a right arrow keypress.\n         *\n         * The items API can't be used together with a renderer!\n         *\n         * #### Example\n         *\n         * ```javascript\n         * contextMenu.items = [\n         *   {text: 'Menu Item 1', theme: 'primary', children:\n         *     [\n         *       {text: 'Menu Item 1-1', checked: true},\n         *       {text: 'Menu Item 1-2'}\n         *     ]\n         *   },\n         *   {component: 'hr'},\n         *   {text: 'Menu Item 2', children:\n         *     [\n         *       {text: 'Menu Item 2-1'},\n         *       {text: 'Menu Item 2-2', disabled: true}\n         *     ]\n         *   },\n         *   {text: 'Menu Item 3', disabled: true}\n         * ];\n         * ```\n         *\n         * @type {!Array<!ContextMenuItem> | undefined}\n         *\n         *\n         * ### Styling\n         *\n         * The `<vaadin-context-menu-item>` sub-menu elements have the following additional state attributes on top of\n         * the built-in `<vaadin-item>` state attributes (see `<vaadin-item>` documentation for full listing).\n         *\n         * Part name | Attribute | Description\n         * ----------------|----------------|----------------\n         * `:host` | expanded | Expanded parent item\n         */\n        items: Array,\n      };\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      // Overlay's outside click listener doesn't work with modeless\n      // overlays (submenus) so we need additional logic for it\n      this.__itemsOutsideClickListener = (e) => {\n        if (!e.composedPath().some((el) => el.localName === 'vaadin-context-menu-overlay')) {\n          this.dispatchEvent(new CustomEvent('items-outside-click'));\n        }\n      };\n      this.addEventListener('items-outside-click', () => this.items && this.close());\n    }\n\n    /** @protected */\n    connectedCallback() {\n      super.connectedCallback();\n      // Firefox leaks click to document on contextmenu even if prevented\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=990614\n      document.documentElement.addEventListener('click', this.__itemsOutsideClickListener);\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n      document.documentElement.removeEventListener('click', this.__itemsOutsideClickListener);\n    }\n\n    /**\n     * @return {boolean}\n     * @protected\n     */\n    get __isRTL() {\n      return this.getAttribute('dir') === 'rtl';\n    }\n\n    /** @protected */\n    __forwardFocus() {\n      const overlay = this.$.overlay;\n      const child = overlay.getFirstChild();\n      // If parent item is not focused, do not focus submenu\n      if (overlay.parentOverlay) {\n        const parent = overlay.parentOverlay.querySelector('[expanded]');\n        if (parent && parent.hasAttribute('focused') && child) {\n          child.focus();\n        } else {\n          overlay.$.overlay.focus();\n        }\n      } else if (child) {\n        child.focus();\n      }\n    }\n\n    /** @private */\n    __openSubMenu(subMenu, itemElement) {\n      subMenu.items = itemElement._item.children;\n      subMenu.listenOn = itemElement;\n\n      const parent = this.$.overlay;\n\n      const subMenuOverlay = subMenu.$.overlay;\n      subMenuOverlay.positionTarget = itemElement;\n      subMenuOverlay.noHorizontalOverlap = true;\n      // Store the reference parent overlay\n      subMenuOverlay._setParentOverlay(parent);\n\n      // Set theme attribute from parent element\n      if (parent.hasAttribute('theme')) {\n        subMenu.setAttribute('theme', parent.getAttribute('theme'));\n      } else {\n        subMenu.removeAttribute('theme');\n      }\n\n      const content = subMenu.$.overlay.$.content;\n      content.style.minWidth = '';\n\n      itemElement.dispatchEvent(\n        new CustomEvent('opensubmenu', {\n          detail: {\n            children: itemElement._item.children,\n          },\n        }),\n      );\n    }\n\n    /**\n     * @param {!HTMLElement} root\n     * @param {!ContextMenu} menu\n     * @param {!ContextMenuRendererContext} context\n     * @protected\n     */\n    __itemsRenderer(root, menu, context) {\n      this.__initMenu(root, menu);\n\n      const subMenu = root.querySelector(this.constructor.is);\n      subMenu.closeOn = menu.closeOn;\n\n      const listBox = root.querySelector('vaadin-context-menu-list-box');\n\n      listBox.innerHTML = '';\n\n      const items = Array.from(context.detail.children || menu.items);\n\n      items.forEach((item) => {\n        let component;\n        if (item.component instanceof HTMLElement) {\n          component = item.component;\n        } else {\n          component = document.createElement(item.component || 'vaadin-context-menu-item');\n        }\n\n        if (component instanceof Item) {\n          component.setAttribute('role', 'menuitem');\n          component.tabIndex = -1;\n          component.classList.add('vaadin-menu-item');\n        } else if (component.localName === 'hr') {\n          component.setAttribute('role', 'separator');\n        }\n\n        this._setMenuItemTheme(component, item, this._theme);\n\n        component._item = item;\n\n        if (item.text) {\n          component.textContent = item.text;\n        }\n\n        this.__toggleMenuComponentAttribute(component, 'menu-item-checked', item.checked);\n        this.__toggleMenuComponentAttribute(component, 'disabled', item.disabled);\n\n        component.setAttribute('aria-haspopup', 'false');\n        component.classList.remove('vaadin-context-menu-parent-item');\n        if (item.children && item.children.length) {\n          component.classList.add('vaadin-context-menu-parent-item');\n          component.setAttribute('aria-haspopup', 'true');\n          component.setAttribute('aria-expanded', 'false');\n          component.removeAttribute('expanded');\n        }\n\n        listBox.appendChild(component);\n      });\n    }\n\n    /** @protected */\n    _setMenuItemTheme(component, item, hostTheme) {\n      // Use existing component theme when it is provided\n      let theme = component.getAttribute('theme') || hostTheme;\n\n      // Item theme takes precedence over host theme / component theme\n      // even if it's empty, as long as it's not undefined or null\n      if (item.theme != null) {\n        theme = Array.isArray(item.theme) ? item.theme.join(' ') : item.theme;\n      }\n\n      if (theme) {\n        component.setAttribute('theme', theme);\n      } else {\n        component.removeAttribute('theme');\n      }\n    }\n\n    /** @private */\n    __toggleMenuComponentAttribute(component, attribute, on) {\n      if (on) {\n        component.setAttribute(attribute, '');\n        component[`__has-${attribute}`] = true;\n      } else if (component[`__has-${attribute}`]) {\n        component.removeAttribute(attribute);\n        component[`__has-${attribute}`] = false;\n      }\n    }\n\n    /** @private */\n    __initMenu(root, menu) {\n      if (!root.firstElementChild) {\n        const listBox = document.createElement('vaadin-context-menu-list-box');\n        root.appendChild(listBox);\n\n        if (this._theme) {\n          listBox.setAttribute('theme', this._theme);\n        }\n        listBox.classList.add('vaadin-menu-list-box');\n        requestAnimationFrame(() => listBox.setAttribute('role', 'menu'));\n\n        const subMenu = document.createElement(this.constructor.is);\n        subMenu.setAttribute('hidden', '');\n        root.appendChild(subMenu);\n        subMenu.$.overlay.modeless = true;\n        subMenu.openOn = 'opensubmenu';\n\n        menu.addEventListener('opened-changed', (e) => !e.detail.value && subMenu.close());\n        subMenu.addEventListener('opened-changed', (e) => {\n          if (!e.detail.value) {\n            const expandedItem = listBox.querySelector('[expanded]');\n            if (expandedItem) {\n              expandedItem.setAttribute('aria-expanded', 'false');\n              expandedItem.removeAttribute('expanded');\n            }\n          }\n        });\n\n        listBox.addEventListener('selected-changed', (e) => {\n          if (typeof e.detail.value === 'number') {\n            const item = e.target.items[e.detail.value]._item;\n            if (!item.children) {\n              const detail = { value: item };\n              menu.dispatchEvent(new CustomEvent('item-selected', { detail }));\n            }\n            listBox.selected = null;\n          }\n        });\n\n        subMenu.addEventListener('item-selected', (e) => {\n          menu.dispatchEvent(new CustomEvent('item-selected', { detail: e.detail }));\n        });\n\n        subMenu.addEventListener('close-all-menus', () => {\n          menu.dispatchEvent(new CustomEvent('close-all-menus'));\n        });\n        menu.addEventListener('close-all-menus', menu.close);\n        menu.addEventListener('item-selected', menu.close);\n        menu.$.overlay.$.backdrop.addEventListener('click', () => menu.close());\n\n        menu.$.overlay.addEventListener('keydown', (e) => {\n          const isRTL = this.__isRTL;\n          if ((!isRTL && e.keyCode === 37) || (isRTL && e.keyCode === 39)) {\n            menu.close();\n            menu.listenOn.focus();\n          } else if (e.key === 'Escape' || e.key === 'Tab') {\n            menu.dispatchEvent(new CustomEvent('close-all-menus'));\n          }\n        });\n\n        requestAnimationFrame(() => {\n          this.__openListenerActive = true;\n        });\n        const openSubMenu = (\n          e,\n          itemElement = e.composedPath().find((e) => e.localName === 'vaadin-context-menu-item'),\n        ) => {\n          // Delay enabling the mouseover listener to avoid it from triggering on parent menu open\n          if (!this.__openListenerActive) {\n            return;\n          }\n\n          // Don't open sub-menus while the menu is still opening\n          if (menu.$.overlay.hasAttribute('opening')) {\n            requestAnimationFrame(() => openSubMenu(e, itemElement));\n            return;\n          }\n\n          if (itemElement) {\n            if (subMenu.items !== itemElement._item.children) {\n              subMenu.close();\n            }\n            if (!menu.opened) {\n              return;\n            }\n            if (itemElement._item.children && itemElement._item.children.length) {\n              itemElement.setAttribute('aria-expanded', 'true');\n              itemElement.setAttribute('expanded', '');\n              this.__openSubMenu(subMenu, itemElement);\n            } else {\n              subMenu.listenOn.focus();\n            }\n          }\n        };\n\n        // Open a submenu on click event when a touch device is used.\n        // On desktop, a submenu opens on hover.\n        menu.$.overlay.addEventListener(isTouch ? 'click' : 'mouseover', openSubMenu);\n\n        menu.$.overlay.addEventListener('keydown', (e) => {\n          const isRTL = this.__isRTL;\n          const shouldOpenSubMenu =\n            (!isRTL && e.keyCode === 39) || (isRTL && e.keyCode === 37) || e.keyCode === 13 || e.keyCode === 32;\n\n          if (shouldOpenSubMenu) {\n            openSubMenu(e);\n          }\n        });\n      } else {\n        const listBox = root.querySelector('vaadin-context-menu-list-box');\n        if (this._theme) {\n          listBox.setAttribute('theme', this._theme);\n        } else {\n          listBox.removeAttribute('theme');\n        }\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './vaadin-contextmenu-event.js';\nimport './vaadin-context-menu-overlay.js';\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { isTouch } from '@vaadin/component-base/src/browser-utils.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';\nimport { addListener, gestures, removeListener } from '@vaadin/component-base/src/gestures.js';\nimport { MediaQueryController } from '@vaadin/component-base/src/media-query-controller.js';\nimport { processTemplates } from '@vaadin/component-base/src/templates.js';\nimport { ThemePropertyMixin } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js';\nimport { ItemsMixin } from './vaadin-contextmenu-items-mixin.js';\n\n/**\n * `<vaadin-context-menu>` is a Web Component for creating context menus.\n *\n * ### Items\n *\n * Items is a higher level convenience API for defining a (hierarchical) menu structure for the component.\n * If a menu item has a non-empty `children` set, a sub-menu with the child items is opened\n * next to the parent menu on mouseover, tap or a right arrow keypress.\n *\n * When an item is selected, `<vaadin-context-menu>` dispatches an \"item-selected\" event\n * with the selected item as `event.detail.value` property.\n *\n * ```javascript\n * contextMenu.items = [\n *   {text: 'Menu Item 1', theme: 'primary', children:\n *     [\n *       {text: 'Menu Item 1-1', checked: true},\n *       {text: 'Menu Item 1-2'}\n *     ]\n *   },\n *   {component: 'hr'},\n *   {text: 'Menu Item 2', children:\n *     [\n *       {text: 'Menu Item 2-1'},\n *       {text: 'Menu Item 2-2', disabled: true}\n *     ]\n *   },\n *   {text: 'Menu Item 3', disabled: true}\n * ];\n *\n * contextMenu.addEventListener('item-selected', e => {\n *   const item = e.detail.value;\n *   console.log(`${item.text} selected`);\n * });\n * ```\n *\n * **NOTE:** when the `items` array is defined, the renderer cannot be used.\n *\n * ### Rendering\n *\n * The content of the menu can be populated by using the renderer callback function.\n *\n * The renderer function provides `root`, `contextMenu`, `model` arguments when applicable.\n * Generate DOM content by using `model` object properties if needed, append it to the `root`\n * element and control the state of the host element by accessing `contextMenu`. Before generating\n * new content, the renderer function should check if there is already content in `root` for reusing it.\n *\n * ```html\n * <vaadin-context-menu id=\"contextMenu\">\n *  <p>This paragraph has a context menu.</p>\n * </vaadin-context-menu>\n * ```\n * ```js\n * const contextMenu = document.querySelector('#contextMenu');\n * contextMenu.renderer = (root, contextMenu, context) => {\n *   let listBox = root.firstElementChild;\n *   if (!listBox) {\n *     listBox = document.createElement('vaadin-list-box');\n *     root.appendChild(listBox);\n *   }\n *\n *   let item = listBox.querySelector('vaadin-item');\n *   if (!item) {\n *     item = document.createElement('vaadin-item');\n *     listBox.appendChild(item);\n *   }\n *   item.textContent = 'Content of the selector: ' + context.target.textContent;\n * };\n * ```\n *\n * You can access the menu context inside the renderer using\n * `context.target` and `context.detail`.\n *\n * Renderer is called on the opening of the context-menu and each time the related context is updated.\n * DOM generated during the renderer call can be reused\n * in the next renderer call and will be provided with the `root` argument.\n * On first call it will be empty.\n *\n * ### “vaadin-contextmenu” Gesture Event\n *\n * `vaadin-contextmenu` is a gesture event (a custom event),\n * which is dispatched after either `contextmenu` or long touch events.\n * This enables support for both mouse and touch environments in a uniform way.\n *\n * `<vaadin-context-menu>` opens the menu overlay on the `vaadin-contextmenu`\n * event by default.\n *\n * ### Menu Listener\n *\n * By default, the `<vaadin-context-menu>` element listens for the menu opening\n * event on itself. In case if you do not want to wrap the target, you can listen for\n * events on an element outside the `<vaadin-context-menu>` by setting the\n * `listenOn` property:\n *\n * ```html\n * <vaadin-context-menu id=\"contextMenu\"></vaadin-context-menu>\n *\n * <div id=\"menuListener\">The element that listens for the contextmenu event.</div>\n * ```\n * ```javascript\n * const contextMenu = document.querySelector('#contextMenu');\n * contextMenu.listenOn = document.querySelector('#menuListener');\n * ```\n *\n * ### Filtering Menu Targets\n *\n * By default, the listener element and all its descendants open the context\n * menu. You can filter the menu targets to a smaller set of elements inside\n * the listener element by setting the `selector` property.\n *\n * In the following example, only the elements matching `.has-menu` will open the context menu:\n *\n * ```html\n * <vaadin-context-menu selector=\".has-menu\">\n *   <p class=\"has-menu\">This paragraph opens the context menu</p>\n *   <p>This paragraph does not open the context menu</p>\n * </vaadin-context-menu>\n * ```\n *\n * ### Menu Context\n *\n * The following properties are available in the `context` argument:\n *\n * - `target` is the menu opening event target, which is the element that\n * the user has called the context menu for\n * - `detail` is the menu opening event detail\n *\n * In the following example, the menu item text is composed with the contents\n * of the element that opened the menu:\n *\n * ```html\n * <vaadin-context-menu selector=\"li\" id=\"contextMenu\">\n *   <ul>\n *     <li>Foo</li>\n *     <li>Bar</li>\n *     <li>Baz</li>\n *   </ul>\n * </vaadin-context-menu>\n * ```\n * ```js\n * const contextMenu = document.querySelector('#contextMenu');\n * contextMenu.renderer = (root, contextMenu, context) => {\n *   let listBox = root.firstElementChild;\n *   if (!listBox) {\n *     listBox = document.createElement('vaadin-list-box');\n *     root.appendChild(listBox);\n *   }\n *\n *   let item = listBox.querySelector('vaadin-item');\n *   if (!item) {\n *     item = document.createElement('vaadin-item');\n *     listBox.appendChild(item);\n *   }\n *   item.textContent = 'The menu target: ' + context.target.textContent;\n * };\n * ```\n *\n * ### Styling\n *\n * `<vaadin-context-menu>` uses `<vaadin-context-menu-overlay>` internal\n * themable component as the actual visible context menu overlay.\n *\n * See [`<vaadin-overlay>`](#/elements/vaadin-overlay)\n * documentation for `<vaadin-context-menu-overlay>` stylable parts.\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * ### Internal components\n *\n * When using `items` API, in addition `<vaadin-context-menu-overlay>`, the following\n * internal components are themable:\n *\n * - `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](#/elements/vaadin-item).\n * - `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](#/elements/vaadin-list-box).\n *\n * Note: the `theme` attribute value set on `<vaadin-context-menu>` is\n * propagated to the internal components listed above.\n *\n * @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.\n * @fires {CustomEvent} item-selected - Fired when an item is selected when the context menu is populated using the `items` API.\n *\n * @extends HTMLElement\n * @mixes ElementMixin\n * @mixes ControllerMixin\n * @mixes ThemePropertyMixin\n * @mixes ItemsMixin\n */\nclass ContextMenu extends ControllerMixin(ElementMixin(ThemePropertyMixin(ItemsMixin(PolymerElement)))) {\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: block;\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n      </style>\n\n      <slot id=\"slot\"></slot>\n\n      <vaadin-context-menu-overlay\n        id=\"overlay\"\n        on-opened-changed=\"_onOverlayOpened\"\n        on-vaadin-overlay-open=\"_onVaadinOverlayOpen\"\n        with-backdrop=\"[[_phone]]\"\n        phone$=\"[[_phone]]\"\n        model=\"[[_context]]\"\n        theme$=\"[[_theme]]\"\n      >\n      </vaadin-context-menu-overlay>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-context-menu';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * CSS selector that can be used to target any child element\n       * of the context menu to listen for `openOn` events.\n       */\n      selector: {\n        type: String,\n      },\n\n      /**\n       * True if the overlay is currently displayed.\n       * @type {boolean}\n       */\n      opened: {\n        type: Boolean,\n        value: false,\n        notify: true,\n        readOnly: true,\n      },\n\n      /**\n       * Event name to listen for opening the context menu.\n       * @attr {string} open-on\n       * @type {string}\n       */\n      openOn: {\n        type: String,\n        value: 'vaadin-contextmenu',\n      },\n\n      /**\n       * The target element that's listened to for context menu opening events.\n       * By default the vaadin-context-menu listens to the target's `vaadin-contextmenu`\n       * events.\n       * @type {!HTMLElement}\n       * @default self\n       */\n      listenOn: {\n        type: Object,\n        value() {\n          return this;\n        },\n      },\n\n      /**\n       * Event name to listen for closing the context menu.\n       * @attr {string} close-on\n       * @type {string}\n       */\n      closeOn: {\n        type: String,\n        value: 'click',\n        observer: '_closeOnChanged',\n      },\n\n      /**\n       * Custom function for rendering the content of the menu overlay.\n       * Receives three arguments:\n       *\n       * - `root` The root container DOM element. Append your content to it.\n       * - `contextMenu` The reference to the `<vaadin-context-menu>` element.\n       * - `context` The object with the menu context, contains:\n       *   - `context.target`  the target of the menu opening event,\n       *   - `context.detail` the menu opening event detail.\n       * @type {ContextMenuRenderer | undefined}\n       */\n      renderer: {\n        type: Function,\n      },\n\n      /** @private */\n      _context: Object,\n\n      /** @private */\n      _boundClose: Object,\n\n      /** @private */\n      _boundOpen: Object,\n\n      /** @private */\n      _phone: {\n        type: Boolean,\n      },\n\n      /** @private */\n      _touch: {\n        type: Boolean,\n        value: isTouch,\n      },\n\n      /** @private */\n      _wide: {\n        type: Boolean,\n      },\n\n      /** @private */\n      _wideMediaQuery: {\n        type: String,\n        value: '(min-device-width: 750px)',\n      },\n    };\n  }\n\n  static get observers() {\n    return [\n      '_openedChanged(opened)',\n      '_targetOrOpenOnChanged(listenOn, openOn)',\n      '_rendererChanged(renderer, items)',\n      '_touchOrWideChanged(_touch, _wide)',\n    ];\n  }\n\n  constructor() {\n    super();\n    this._boundOpen = this.open.bind(this);\n    this._boundClose = this.close.bind(this);\n    this._boundOnGlobalContextMenu = this._onGlobalContextMenu.bind(this);\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n\n    this.__boundOnScroll = this.__onScroll.bind(this);\n    window.addEventListener('scroll', this.__boundOnScroll, true);\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    window.removeEventListener('scroll', this.__boundOnScroll, true);\n    this.close();\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this._overlayElement = this.$.overlay;\n\n    this.addController(\n      new MediaQueryController(this._wideMediaQuery, (matches) => {\n        this._wide = matches;\n      }),\n    );\n\n    processTemplates(this);\n  }\n\n  /**\n   * Runs before overlay is fully rendered\n   * @private\n   */\n  _onOverlayOpened(e) {\n    this._setOpened(e.detail.value);\n    this.__alignOverlayPosition();\n  }\n\n  /**\n   * Runs after overlay is fully rendered\n   * @private\n   */\n  _onVaadinOverlayOpen() {\n    this.__alignOverlayPosition();\n    this.$.overlay.style.opacity = '';\n    this.__forwardFocus();\n  }\n\n  /** @private */\n  _targetOrOpenOnChanged(listenOn, openOn) {\n    if (this._oldListenOn && this._oldOpenOn) {\n      this._unlisten(this._oldListenOn, this._oldOpenOn, this._boundOpen);\n\n      this._oldListenOn.style.webkitTouchCallout = '';\n      this._oldListenOn.style.webkitUserSelect = '';\n      this._oldListenOn.style.userSelect = '';\n\n      this._oldListenOn = null;\n      this._oldOpenOn = null;\n    }\n\n    if (listenOn && openOn) {\n      this._listen(listenOn, openOn, this._boundOpen);\n\n      this._oldListenOn = listenOn;\n      this._oldOpenOn = openOn;\n    }\n  }\n\n  /** @private */\n  _touchOrWideChanged(touch, wide) {\n    this._phone = !wide && touch;\n  }\n\n  /** @private */\n  _setListenOnUserSelect(value) {\n    // Note: these styles don't seem to work in Firefox on iOS.\n    this.listenOn.style.webkitTouchCallout = value;\n    this.listenOn.style.webkitUserSelect = value; // Chrome, Safari, Firefox\n    this.listenOn.style.userSelect = value;\n\n    // Note: because user-selection is disabled on the overlay\n    // before opening the menu the text could be already selected\n    // so we need to clear that selection\n    document.getSelection().removeAllRanges();\n  }\n\n  /** @private */\n  _closeOnChanged(closeOn, oldCloseOn) {\n    // Listen on this.$.overlay.root to workaround issue on\n    //  ShadyDOM polyfill: https://github.com/webcomponents/shadydom/issues/159\n\n    // Outside click event from overlay\n    const evtOverlay = 'vaadin-overlay-outside-click';\n\n    if (oldCloseOn) {\n      this._unlisten(this.$.overlay, oldCloseOn, this._boundClose);\n      this._unlisten(this.$.overlay.root, oldCloseOn, this._boundClose);\n    }\n    if (closeOn) {\n      this._listen(this.$.overlay, closeOn, this._boundClose);\n      this._listen(this.$.overlay.root, closeOn, this._boundClose);\n      this._unlisten(this.$.overlay, evtOverlay, this._preventDefault);\n    } else {\n      this._listen(this.$.overlay, evtOverlay, this._preventDefault);\n    }\n  }\n\n  /** @private */\n  _preventDefault(e) {\n    e.preventDefault();\n  }\n\n  /** @private */\n  _openedChanged(opened) {\n    if (opened) {\n      document.documentElement.addEventListener('contextmenu', this._boundOnGlobalContextMenu, true);\n      this._setListenOnUserSelect('none');\n    } else {\n      document.documentElement.removeEventListener('contextmenu', this._boundOnGlobalContextMenu, true);\n      this._setListenOnUserSelect('');\n    }\n\n    // Has to be set after instance has been created\n    this.$.overlay.opened = opened;\n  }\n\n  /**\n   * Requests an update for the content of the menu overlay.\n   * While performing the update, it invokes the renderer passed in the `renderer` property.\n   *\n   * It is not guaranteed that the update happens immediately (synchronously) after it is requested.\n   */\n  requestContentUpdate() {\n    if (!this._overlayElement || !this.renderer) {\n      return;\n    }\n\n    this._overlayElement.requestContentUpdate();\n  }\n\n  /** @private */\n  _rendererChanged(renderer, items) {\n    if (items) {\n      if (renderer) {\n        throw new Error('The items API cannot be used together with a renderer');\n      }\n\n      if (this.closeOn === 'click') {\n        this.closeOn = '';\n      }\n\n      renderer = this.__itemsRenderer;\n    }\n\n    this.$.overlay.setProperties({ owner: this, renderer });\n  }\n\n  /**\n   * Closes the overlay.\n   */\n  close() {\n    this._setOpened(false);\n  }\n\n  /** @private */\n  _contextTarget(e) {\n    if (this.selector) {\n      const targets = this.listenOn.querySelectorAll(this.selector);\n\n      return Array.prototype.filter.call(targets, (el) => {\n        return e.composedPath().indexOf(el) > -1;\n      })[0];\n    }\n    return e.target;\n  }\n\n  /**\n   * Opens the overlay.\n   * @param {!Event | undefined} e used as the context for the menu. Overlay coordinates are taken from this event.\n   */\n  open(e) {\n    if (e && !this.opened) {\n      this._context = {\n        detail: e.detail,\n        target: this._contextTarget(e),\n      };\n\n      if (this._context.target) {\n        this._preventDefault(e);\n        e.stopPropagation();\n\n        // Used in alignment which is delayed until overlay is rendered\n        this.__x = this._getEventCoordinate(e, 'x');\n        this.__pageXOffset = window.pageXOffset;\n\n        this.__y = this._getEventCoordinate(e, 'y');\n        this.__pageYOffset = window.pageYOffset;\n\n        this.$.overlay.style.opacity = '0';\n        this._setOpened(true);\n      }\n    }\n  }\n\n  /** @private */\n  __onScroll() {\n    if (!this.opened) {\n      return;\n    }\n\n    const yDiff = window.pageYOffset - this.__pageYOffset;\n    const xDiff = window.pageXOffset - this.__pageXOffset;\n\n    this.__adjustPosition('left', -xDiff);\n    this.__adjustPosition('right', xDiff);\n\n    this.__adjustPosition('top', -yDiff);\n    this.__adjustPosition('bottom', yDiff);\n\n    this.__pageYOffset += yDiff;\n    this.__pageXOffset += xDiff;\n  }\n\n  /** @private */\n  __adjustPosition(coord, diff) {\n    const overlay = this.$.overlay;\n    const style = overlay.style;\n\n    style[coord] = `${(parseInt(style[coord]) || 0) + diff}px`;\n  }\n\n  /** @private */\n  __alignOverlayPosition() {\n    const overlay = this.$.overlay;\n\n    if (overlay.positionTarget) {\n      // The overlay is positioned relative to another node, for example, a\n      // menu item in a nested submenu structure where this overlay lists\n      // the items for another submenu.\n      // It means that the overlay positioning is controlled by\n      // vaadin-overlay-position-mixin so no manual alignment is needed.\n      return;\n    }\n\n    const style = overlay.style;\n\n    // Reset all properties before measuring\n    ['top', 'right', 'bottom', 'left'].forEach((prop) => style.removeProperty(prop));\n    ['right-aligned', 'end-aligned', 'bottom-aligned'].forEach((attr) => overlay.removeAttribute(attr));\n\n    // Maximum x and y values are imposed by content size and overlay limits.\n    const { xMax, xMin, yMax } = overlay.getBoundaries();\n    // Reuse saved x and y event values, in order to this method be used async\n    // in the `vaadin-overlay-change` which guarantees that overlay is ready.\n    // The valus represent an anchor position on the page where the contextmenu\n    // event took place.\n    const x = this.__x;\n    const y = this.__y;\n\n    // Select one overlay corner and move to the event x/y position.\n    // Then set styling attrs for flex-aligning the content appropriately.\n    const wdthVport = document.documentElement.clientWidth;\n    const hghtVport = document.documentElement.clientHeight;\n\n    if (!this.__isRTL) {\n      if (x < wdthVport / 2 || x < xMax) {\n        // Menu is displayed in the right side of the anchor\n        style.left = `${x}px`;\n      } else {\n        // Menu is displayed in the left side of the anchor\n        style.right = `${Math.max(0, wdthVport - x)}px`;\n        this._setEndAligned(overlay);\n      }\n    } else if (x > wdthVport / 2 || x > xMin) {\n      // Menu is displayed in the right side of the anchor\n      style.right = `${Math.max(0, wdthVport - x)}px`;\n    } else {\n      // Menu is displayed in the left side of the anchor\n      style.left = `${x}px`;\n      this._setEndAligned(overlay);\n    }\n\n    if (y < hghtVport / 2 || y < yMax) {\n      style.top = `${y}px`;\n    } else {\n      style.bottom = `${Math.max(0, hghtVport - y)}px`;\n      overlay.setAttribute('bottom-aligned', '');\n    }\n  }\n\n  /** @private */\n  _setEndAligned(element) {\n    element.setAttribute('end-aligned', '');\n    if (!this.__isRTL) {\n      element.setAttribute('right-aligned', '');\n    }\n  }\n\n  /** @private */\n  _getEventCoordinate(event, coord) {\n    if (event.detail instanceof Object) {\n      if (event.detail[coord]) {\n        // Polymer gesture events, get coordinate from detail\n        return event.detail[coord];\n      } else if (event.detail.sourceEvent) {\n        // Unwrap detailed event\n        return this._getEventCoordinate(event.detail.sourceEvent, coord);\n      }\n    } else {\n      const prop = `client${coord.toUpperCase()}`;\n      const position = event.changedTouches ? event.changedTouches[0][prop] : event[prop];\n\n      if (position === 0) {\n        // Native keyboard event\n        const rect = event.target.getBoundingClientRect();\n        return coord === 'x' ? rect.left : rect.top + rect.height;\n      }\n      // Native mouse or touch event\n      return position;\n    }\n  }\n\n  /** @private */\n  _listen(node, evType, handler) {\n    if (gestures[evType]) {\n      addListener(node, evType, handler);\n    } else {\n      node.addEventListener(evType, handler);\n    }\n  }\n\n  /** @private */\n  _unlisten(node, evType, handler) {\n    if (gestures[evType]) {\n      removeListener(node, evType, handler);\n    } else {\n      node.removeEventListener(evType, handler);\n    }\n  }\n\n  /** @private */\n  _onGlobalContextMenu(e) {\n    if (!e.shiftKey) {\n      e.preventDefault();\n      this.close();\n    }\n  }\n\n  /**\n   * Fired when an item is selected when the context menu is populated using the `items` API.\n   *\n   * @event item-selected\n   * @param {Object} detail\n   * @param {Object} detail.value the selected menu item\n   */\n}\n\ncustomElements.define(ContextMenu.is, ContextMenu);\nexport { ContextMenu };\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\nimport _THEME from '../../../themes/styles';\n\nexport const LdGridStyles = css`\n  \n  :host {\n    display: flex;\n    flex-direction: row;\n    flex: auto;\n  }\n\n  a[disabled] {\n    opacity: 0.5;\n    pointer-events: none;\n  }\n\n  .longNames {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n  \n  vaadin-grid {\n    height: 100%;\n  }\n  \n  vaadin-text-field {\n    max-width: 100%;\n  }\n\n  vaadin-text-field[has-value] {\n    color: var(--lumo-secondary-text-color);\n  }\n\n  vaadin-text-field.current-filter::part(input-field) {\n    box-shadow: 0 0 2px #fff, \n    0 0 4px lightblue,\n    0 0 6px dodgerblue;\n    color: #000;\n  }\n\n  vaadin-grid-filter {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    padding: 5px;\n    max-width: 70%;\n  }\n\n  .header {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    padding: 20px;\n    max-width: 70%;\n  }\n\n  vaadin-grid-sorter {\n    text-align: right;\n    display: flex;\n  }\n  \n  vaadin-grid.csv-export-table {\n    width: auto;\n  }\n  \n  a {\n    color: var(--anchor-color, #000);\n    text-decoration: none;\n  }\n\n  .circle {\n    padding: 0;\n    display: inline-block;\n    border-width: 2px;\n    border-style: solid;\n    width: 15px;\n    height: 15px;\n    -webkit-border-radius: 10px;\n    -moz-border-radius: 10px;\n    border-radius: 15px;\n    vertical-align: middle;\n    margin-top: -5px;\n  }\n\n  .green {\n    background-color: var(--trafficlight-green, var(--sw-status-light-green, #8ab230));\n    border-color: var(--trafficlight-green, var(--sw-status-light-green, #8ab230));\n  }\n\n  .red {\n    background-color: var(--trafficlight-red, var(--sw-status-light-red, #c41c24));\n    border-color: var(--trafficlight-red, var(--sw-status-light-red, #c41c24));\n  }\n\n  .yellow {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_yellow)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_yellow)};\n  }\n\n  .gray {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_gray)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_gray)};\n  }\n\n  .suffix {\n    display: inline-block;\n    font-weight: normal;\n    margin-left:5px;\n    vertical-align: middle;\n  }\n  \n  .left {\n    margin-left: 20px;\n  }\n  \n  paper-fab.fab-item-right {\n    --paper-fab-background: ${unsafeCSS(_THEME.colors.fab_background)};\n    margin-right: 0px;\n    left: 101%;\n    position: absolute;\n  }\n\n  .grid-container {\n      flex: auto;\n  }\n\n  .user-enabled-status {\n    display: inline-block;\n    border-radius: 20px;\n    padding: 5px 10px;\n    text-transform: uppercase;\n    letter-spacing: 0.01rem;\n    font-size: 0.7rem;\n    text-align: center;\n    width: 58px;\n  }\n\n  .user-enabled-status[data-user-enabled=true] {\n    background: hsla(51, 27%, 80%, 100%);\n    color: hsla(58, 50%, 20%, 100%);\n  }\n\n  .user-enabled-status[data-user-enabled=false] {\n    background: hsla(12, 30%, 80%, 100%); ;\n    color: hsla(0, 56%, 20%, 100%);\n  }\n\n  .download-icon-button {\n    background: none;\n    border: none;\n    padding: 0;\n    color: black;\n    height: 24px;\n    width: 24px;\n    cursor: pointer;\n  }\n\n  .dropdown-value-wrapper {\n    max-height: 60px;\n    overflow-y: auto;\n  }\n\n  .dropdown-filter-title {\n    cursor: pointer;\n  }\n\n  .clamp-lines-to-1 {\n    -webkit-line-clamp: 1;\n    -webkit-box-orient: vertical;  \n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n    .clamp-lines-to-2 {\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        line-height: 24px;\n    }\n    \n    @supports (-ms-ime-align:auto) {\n\n    .grid-container {\n      width: calc(100%-50px);\n      height:80%;\n      margin-right:50px;\n    }\n  }\n`;\n\nexport default LdGridStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, html, LitElement } from 'lit-element';\n\nimport { connect } from 'pwa-helpers/connect-mixin';\nimport { LdI18NextMixin } from '../../../../../ld-application/i18n/ld-i18next';\nimport { store } from '../../../../../ld-redux/ld-redux-store';\nimport { createChartId } from '../../../../../../js/LdGlobal';\n\nimport '../../../../../ld-loading-spinner/ld-loading-spinner-inline';\nimport '../../../../../ld-application/ld-chart';\nimport '../../../../../ld-application/ld-icon';\nimport '../../../../ld-datepicker-config';\nimport { LdChartStyles } from '../styles-charts';\nimport { _THEME } from '../../../../../../themes/styles';\nimport { createSetZoomToDatepickerButton } from '../../../../../ld-application/ld-chart/custom-ui';\n\nclass LdAvailabilitySwimlaneChart extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      machineId: { type: String, hasChanged: () => true },\n      dateRange: { type: Object, hasChanged: () => true },\n      chartValue: { type: Object, hasChanged: () => true },\n      chartSize: { type: Object, hasChanged: () => true },\n      chartContainerSize: { type: Object, hasChanged: () => true },\n      _chartConfig: { type: Object, hasChanged: () => true },\n      _chartData: { type: Object, hasChanged: () => true },\n      _chartId: { type: String },\n      _extremes: { type: Object },\n      _loading: { type: Boolean },\n      __chartFetchData: { type: Object },\n      __onlyInitialTimestamp: { type: String },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdChartStyles, css`\n      :host {\n      }\n\n      ld-loading-spinner-inline {\n        --ld-loading-spinner-inline-spinner-height: 50px;\n        --ld-loading-spinner-inline-spinner-width: 50px;\n      }\n      #spinner-container[loading] {\n        display: flex;\n      }\n\n      #spinner-container paper-spinner-lite {\n        width: var(--chart-item-spinner-width, 100px);\n        height: var(--chart-item-spinner-height, 100px);\n\n        --paper-spinner-stroke-width: 4px;\n        --paper-spinner-color: var(--login-button-text-color, var(--sw-primary-highlight-color, #eb0028));\n      }\n    `];\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n\n    this._loading = true;\n    this.chartSize = {\n      width: '200',\n      height: '50',\n    };\n    this.chartContainerSize = {\n      width: 200,\n      height: 50,\n    };\n    this._chartConfig = {};\n    this._chartData = null;\n    this._chartId = createChartId();\n    this.__multiTimelineData = null;\n    this.__chartFetchData = null;\n    this.__onlyInitialTimestamp = null;\n\n    this.dateRange = {\n      from: null,\n      to: null,\n    };\n    this._updateXAxisExtremes();\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    this._createChartConfiguration();\n  }\n\n  // --------------------------------------------------------------------------------------\n  updated(changedProperties) {\n    if (changedProperties.has('machineId')) {\n      this._chartData = [];\n      this._updateChartData(this.chartValue[0].timeseries[1]);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n\n      <ld-chart\n        ?loading='${this._loading}'\n        .chartConfig='${this._chartConfig}'\n        .chartSize='${this.chartContainerSize}'\n        .extremes='${this._extremes}'\n        .data='${this._chartData}'\n        lightConfig\n        dontSynctooltip\n\n      ></ld-chart>\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _createChartConfiguration() {\n    const that = this;\n    this._chartConfig = {\n      chart: {\n        animation: false,\n        margin: [0, -10, 0, 0],\n        backgroundColor: 'transparent',\n        height: 50,\n        panning: false,\n      },\n      exporting: {\n        enabled: false,\n      },\n      title: {\n        text: null,\n      },\n      credits: {\n        enabled: false,\n      },\n      yAxis: {\n        min: 0,\n        max: 3,\n        startOnTick: false,\n        endOnTick: false,\n        showLastLabel: false,\n        showFirstLabel: false,\n        gridLineWidth: 0,\n        title: {\n          text: null,\n        },\n      },\n      xAxis: {\n        type: 'datetime',\n        title: {\n          text: null,\n        },\n        dateTimeLabelFormats: {\n          second: '%e. %b<br />%H:%M:%S',\n          minute: '%e. %b<br />%H:%M',\n          hour: '%e. %b<br />%H:%M',\n        },\n        gridLineWidth: 0,\n        minRange: 1000,\n        minTickInterval: 1000,\n      },\n      plotOptions: {\n        columnrange: {\n          grouping: false,\n          borderWidth: 0,\n        },\n        series: {\n          pointPlacement: 'on',\n          marker: {\n            enabled: false,\n            radius: 0,\n          },\n          turboThreshold: 1000,\n          events: {\n            legendItemClick(event) {\n              event.preventDefault();\n            },\n          },\n        },\n        polygon: {\n          lineWidth: 0,\n        },\n      },\n      legend: {\n        enabled: false,\n      },\n      tooltip: {\n        shape: 'square',\n        positioner: function() {\n          return {\n            x:  10,\n            y:  -40,\n          };\n        },\n        outside: true,\n        useHTML: true,\n        animation: false,\n        followPointer: false,\n        formatter() {\n          let message = '';\n          let indexX;\n          if (this.point.series.data.length > 4) {\n            this.point.series.data.forEach((item, index) => {\n              if (item.x === this.point.x && item.y === this.point.y) {\n                const indexY = index + 1;\n                if (indexY >= this.point.series.data.length) {\n                  indexX = index - 2;\n                } else {\n                  if (this.point.series.data[indexY].y === 1 && this.point.y === 1) {\n                    indexX = index - 2;\n                  } else if (this.point.series.data[indexY].y === 2 && this.point.y === 1) {\n                    indexX = index + 2;\n                  } else if (this.point.series.data[indexY].y === 2 && this.point.y === 2) {\n                    indexX = index + 1;\n                  } else if (this.point.series.data[indexY].y === 1 && this.point.y === 2) {\n                    indexX = index - 1;\n                  }\n                }\n              }\n            });\n          } else {\n            this.point.series.data.forEach((item, index) => {\n              if (item.x !== this.point.x && item.y !== this.point.y) {\n                indexX = index;\n              }\n            });\n          }\n          if (this.point.series.data[indexX].x !== 'undefined') {\n            if (this.point.series.data[indexX].x < this.point.x) {\n              message += `${moment(this.point.series.data[indexX].x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              message += ' - ';\n\n              if (this.__onlyInitialTimestamp === this.point.x || this.point.series.xAxis.dataMax === this.point.x) {\n                message += `${that.LdTranslate('modules.charts.globalSettings.lang.increaseDateRange')} ${moment(this.point.x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              } else {\n                message += `${moment(this.point.x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              }\n            } else {\n              message += `${moment(this.point.x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              message += ' - ';\n\n              if (this.__onlyInitialTimestamp === this.point.series.data[indexX].x || this.point.series.xAxis.dataMax === this.point.series.data[indexX].x) {\n                message += `${that.LdTranslate('modules.charts.globalSettings.lang.increaseDateRange')} ${moment(this.point.series.data[indexX].x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              } else {\n                message += `${moment(this.point.series.data[indexX].x).format(that.LdTranslate('modules.charts.tooltipDateFormat'))}`;\n              }\n            }\n          }\n          message += `<br /><b>${this.series.name}</b>`;\n\n          return message;\n        },\n      },\n      customUi: [\n        createSetZoomToDatepickerButton(this)\n      ]\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  _updateChartData(timeseriesData) {\n    if (this.__chartFetchData === null || this.__chartFetchData !== timeseriesData) {\n\n      this.__chartFetchData = timeseriesData;\n\n      const _advancedSeries = [];\n      const _initial = timeseriesData.initial;\n      const _values = timeseriesData.values;\n      let _turboThreshold = 100000;\n      const _conditions = [\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.auto')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.auto,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.auto_waiting_for_parts')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.auto_waiting_for_parts,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.auto_waiting_for_parts_stopping_error')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.auto_waiting_for_parts_stopping_error,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.auto_with_error_program_stopped')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.auto_with_error_program_stopped,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.auto_no_program_active')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.auto_no_program_active,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.JOG_with_error')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.jog_with_error,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.JOG_without_error')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.jog_without_error,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.MDA_without_error')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.mda_without_error,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.MDA_with_error')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.mda_with_error,\n          data: [],\n        },\n        {\n          name: `${this.LdTranslate('modules.assets.machine.elements.performance.availability.legend.not_defined_condition')}`,\n          type: 'polygon',\n          color: _THEME.colors.availability_chart_colors.not_defined_condition,\n          data: [],\n        },\n      ];\n\n      if (_initial != null && _initial[1] != null) {\n        const _initialValue = _initial[1];\n        if (typeof _values !== 'undefined' && _values.length > 0) {\n          if (_initial[0] < Number(this.dateRange.from)) {\n            _initial[0] = Number(this.dateRange.from);\n          }\n          _conditions[_initialValue].data.push([Number(_initial[0]), 1]);\n          _conditions[_initialValue].data.push([Number(_initial[0]), 2]);\n          _conditions[_initialValue].data.push([Number(_values[0][0]), 2]);\n          _conditions[_initialValue].data.push([Number(_values[0][0]), 1]);\n        } else {\n          this.__onlyInitialTimestamp = this.dateRange.to;\n          _conditions[_initialValue].data.push([Number(_initial[0]), 1]);\n          _conditions[_initialValue].data.push([Number(_initial[0]), 2]);\n          _conditions[_initialValue].data.push([Number(this.__onlyInitialTimestamp), 2]);\n          _conditions[_initialValue].data.push([Number(this.__onlyInitialTimestamp), 1]);\n        }\n      }\n\n      if (typeof _values !== 'undefined' && _values.length > 0) {\n        const _valuesLength = _values.length;\n        _turboThreshold = _valuesLength > 1000 ? _valuesLength : _turboThreshold;\n        for (let i = 0; i < _valuesLength; i++) {\n          const _nextIndex = i + 1;\n          const _nextTimestamp = _nextIndex >= _valuesLength ? this.dateRange.to : _values[_nextIndex][0];\n          const _newElement = [\n            _values[i][0],\n            _nextTimestamp,\n            _values[i][1],\n            _values[i][2],\n          ];\n\n          _advancedSeries.push(_newElement);\n        }\n        for (let j = 0; j < _advancedSeries.length; j++) {\n          const _advancedSeriesValue = _advancedSeries[j][2];\n          _conditions[_advancedSeriesValue].data.push([Number(_advancedSeries[j][0]), 1], [Number(_advancedSeries[j][0]), 2], [Number(_advancedSeries[j][1]), 2], [Number(_advancedSeries[j][1]), 1]);\n        }\n      }\n      this._updateXAxisExtremes();\n      this._chartData = _conditions;\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _updateXAxisExtremes() {\n    this._extremes = {\n      min: Number(this.dateRange.from),\n      max: Number(this.dateRange.to),\n      redraw: true,\n      animation: false,\n    };\n  }\n\n}\n\ncustomElements.define('ld-availability-swimlane-chart', LdAvailabilitySwimlaneChart);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint class-methods-use-this: 'off' */\n/* eslint no-return-assign: 'off' */\n\nimport { html, LitElement } from 'lit-element';\nimport { render } from 'lit-html';\n\nimport '@vaadin/grid';\nimport '@vaadin/grid/vaadin-grid-column';\nimport '@vaadin/grid/vaadin-grid-column-group.js';\nimport '@vaadin/grid/vaadin-grid-filter-column.js';\nimport '@vaadin/grid/vaadin-grid-selection-column.js';\nimport '@vaadin/grid/vaadin-grid-sort-column.js';\nimport '@vaadin/grid/vaadin-grid-tree-column.js';\n\nimport '@vaadin/grid/theme/lumo/vaadin-grid.js';\nimport '@vaadin/grid/theme/material/vaadin-grid.js';\nimport './theme/vaadin-grid';\n\nimport '@vaadin/polymer-legacy-adapter/template-renderer.js';\n\nimport '@vaadin/context-menu';\nimport { createGridOutput } from '../../../js/LdGlobal';\nimport { LdGridStyles } from './styles';\n\nimport '../modules/assets/assets-charts/availability/swimlane';\n\nimport '@polymer/paper-button/paper-button';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-fab/paper-fab';\n\nimport { TableCSVExporter } from './TableCSVExporter';\n\nimport { store } from '../../ld-redux/ld-redux-store';\n\nimport { saveUserSetting } from '../../ld-redux/actions/ld-users-actions';\n\n/**\n * Displays a &lt;vaadin-grid&gt; element with given items\n * @extends LitElement\n */\nexport class LdGrid extends LitElement {\n\n  /*\n  Holds the created data-provider. It can not be recreated or it will not fetch data lazily.\n   */\n  _dataProvider = null;\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      gridItems: { type: Object, hasChanged: () => true },\n      gridTitle: { type: String, hasChanged: () => true },\n      gridColumns: { type: Object, hasChanged: () => true },\n      chartValue: { type: Object, hasChanged: () => true },\n      multiSort: { type: Boolean, value: false, hasChanged: () => true },\n      saveGridSorting: { type: Boolean, value: false, hasChanged: () => true },\n      gridId: { type: String, hasChanged: () => true },\n      loading: { type: Boolean, value: false, hasChanged: () => true },\n      userInformation: { type: Object, hasChanged: () => true },\n      exportCsv: { type: Boolean, value: false, hasChanged: () => true },\n      exportCsvStyle: { type: String, value: '', hasChanged: () => true },\n      _height: { type: String, hasChanged: () => true },\n      _addGridEventListener: { type: Boolean, value: false, hasChanged: () => true },\n      dataProvider: {type: Function, value: null},\n      paginationToken: {type: String},\n      maxEntries: {type: Number},\n      pageSize: {type: Number},\n      _currentFilter: {type: String}\n    };\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdGridStyles];\n  }\n\n  /**\n   * to prevent memory leaks\n   * @returns void\n   */\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    const grid = this.shadowRoot?.querySelector('vaadin-grid');\n    grid?.removeEventListener('sorter-changed', () => {});\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n\n    this._addGridEventListener = false;\n    this.gridId = null;\n    this.paginationToken = null;\n    this.maxEntries = 0;\n    this.pageSize = 25;\n\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated(_changedProperties) {\n    super.firstUpdated(_changedProperties);\n  }\n\n  // --------------------------------------------------------------------------------------\n  updated(changedProperties) {\n\n    if (this.saveGridSorting) {\n      const grid = this.shadowRoot?.querySelector('vaadin-grid');\n      if (this.gridId != null && grid && !this._addGridEventListener) {\n        this._addGridEventListener = true;\n        setTimeout(() => {\n          grid?.addEventListener('sorter-changed', (event) => {\n            this._onSorterClick(event.target, this.gridId);\n          });\n        }, 1500);\n      }\n    }\n    this.__searchAndFilterHeaderRenderer;\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    const gridColumns = [];\n\n    this.gridColumns.forEach(item => {\n      if (!item.hidden) {\n        let _contextMenuOptions = '';\n        let _contextMenuPrefix = '';\n        let _contextMenuField = '';\n        let _contextMenuSuffix = '';\n        const _column = {};\n        let _contextMenuOptionsLength;\n        let _contextMenuLinksLength;\n        if (item.icon) {\n          _column.style = typeof item.icon.style !== 'undefined' ? item.icon.style : '';\n          _column.src = typeof item.icon.src !== 'undefined' ? item.icon.src : '';\n          _column.title = typeof item.icon.title !== 'undefined' ? item.icon.title : '';\n\n        }\n\n        if (item.link) {\n          _column.link = {};\n          _column.link.prefix = typeof item.link.prefix !== 'undefined' ? item.link.prefix : '';\n          _column.link.suffix = typeof item.link.suffix !== 'undefined' ? item.link.suffix : '';\n          _column.link.field = typeof item.link.field !== 'undefined' ? item.link.field : '';\n        }\n        const event = item.event != null ? item.event : null;\n\n\n        _column.subkey = typeof item.subKey !== 'undefined' ? item.subKey : '';\n        _column.chart = typeof item.charts !== 'undefined' ? item.charts : '';\n        _column.assetId = typeof item.assetId !== 'undefined' ? item.assetId : '';\n        _column.dateRange = typeof item.timestamp !== 'undefined' ? item.timestamp : '';\n\n        if (!item.visible_for_user_group) {\n          item.visible_for_user_group = getUserRoles(this.userInformation);\n        }\n\n\n        const _columnWidth = (typeof item.column_width !== 'undefined') ? item.column_width : '100px';\n        const _disableTitle = typeof item.disable_title !== 'undefined' && item.disable_title;\n\n        const _linkPrefix = (typeof _column.link !== 'undefined' && typeof _column.link.prefix !== 'undefined') ? _column.link.prefix : null;\n        const _linkField = (typeof _column.link !== 'undefined' && typeof _column.link.field !== 'undefined') ? _column.link.field : null;\n        const _linkSuffix = (typeof _column.link !== 'undefined' && typeof _column.link.suffix !== 'undefined') ? _column.link.suffix : null;\n        const _iotOnlineTime = (typeof item.iot !== 'undefined' && typeof item.iot.onlineTime !== 'undefined') ? item.iot.onlineTime : null;\n        const _iotColor = (typeof item.iot !== 'undefined' && typeof item.iot.color !== 'undefined') ? item.iot.color : null;\n        const _visible_for_id = item.visible_for_id ?? null;\n\n        if (item.contextMenuOptions) {\n          item.contextMenuOptions.inputOptions.forEach((option, index) => {\n            _contextMenuOptions += (typeof option !== 'undefined') ? `${option},` : '';\n          });\n          item.contextMenuOptions.link.forEach((option, index) => {\n            _contextMenuPrefix += (typeof option.prefix !== 'undefined') ? `${option.prefix},` : '';\n            _contextMenuField += (typeof option.field !== 'undefined') ? `${option.field},` : '';\n            _contextMenuSuffix += (typeof option.suffix !== 'undefined') ? `${option.suffix},` : '';\n          });\n          _contextMenuLinksLength = item.contextMenuOptions.link.length;\n        }\n\n        if (userIsAllowedToSeeItem(item, this.userInformation)) {\n\n          gridColumns.push(html`\n            <vaadin-grid-column\n              path='${item.id}'\n              subKey='${_column.subkey}'\n              initialSort='${item.initialSort}'\n              header='${item.title}'\n              event='${event}'\n              sort='${item.sort}'\n              sortPath='${item.sortPath}'\n              filter='${item.filter}'\n              iconSrc='${_column.src}'\n              iconTitle='${_column.title}'\n              iconStyle='${_column.style}'\n              linkPrefix='${_linkPrefix}'\n              linkField='${_linkField}'\n              linkSuffix='${_linkSuffix}'\n              iotColor='${_iotColor}'\n              visibleForId='${_visible_for_id}'\n              iotOnlineTime='${_iotOnlineTime}'\n              chart='${_column.chart}'\n              assetId='${_column.assetId}'\n              dateRange='${_column.dateRange}'\n              contextMenuPrefix='${_contextMenuPrefix}'\n              contextMenuField='${_contextMenuField}'\n              contextMenuSuffix='${_contextMenuSuffix}'\n              contextMenuOptionsLength='${_contextMenuOptionsLength}'\n              contextMenuLinksLength='${_contextMenuLinksLength}'\n              contextMenuOptions='${_contextMenuOptions}'\n              width='${_columnWidth}'\n              columnAlign='${item.column_align}'\n              disableTitle='${_disableTitle}'\n              chartValue='${JSON.stringify(this.chartValue)}'\n              loading='${this.loading}'\n              .headerRenderer='${this.__searchAndFilterHeaderRenderer}'\n              .renderer='${this.__columnRenderer}'\n            >\n            </vaadin-grid-column>`);\n        }\n      }\n    });\n    if (this.exportCsv) {\n      return html`\n        <div class='grid-container'>\n          <vaadin-grid id=\"${this.gridId}\" class='csv-export-table' visible-rows='1'\n                       theme='row-stripes wrap-cell-content no-border' ?loading='${this.loading}'\n                       aria-label='${this.gridTitle}' .pageSize=\"${this.pageSize}\" .items='${this.gridItems}' .dataProvider='${this.getDataProvider()}' ?multi-sort='${this.multiSort}'>\n            ${gridColumns}\n            </vaadin-grid>\n          </div>\n          <paper-fab class='fab-item-right'\n                     style='${this.exportCsvStyle}'\n                   @click='${e => this._onDownloadCsvClick(e)}'\n                   icon='file-download'\n                   title='Export to CSV'></paper-fab>\n        `;\n    }\n    return html`\n      <vaadin-grid \n        id=\"${this.gridId}\"  \n        theme='row-stripes wrap-cell-content no-border' \n        .pageSize=\"${this.pageSize}\"\n        .dataProvider='${this.getDataProvider()}'\n        ?loading='${this.loading}' \n        aria-label='${this.gridTitle}' \n        .items='${this.gridItems}' \n        ?multi-sort='${this.multiSort}'>\n        ${gridColumns}\n      </vaadin-grid>\n    `;\n  }\n\n  filterValuesChanged(path, filterName, filterType) {\n    let values;\n    if (filterType === 'dropdown') {\n      values = Array.from(this.shadowRoot.querySelectorAll(`*[name='${filterName}']:checked`)).map((el) => el.value);\n    }\n    this.dispatchEvent(new CustomEvent('ld-grid-filter-changed', {\n      detail: {\n        values,\n        path,\n        filterName,\n        filterType,\n      },\n      bubbles: true,\n      composed: true,\n    }));\n  }\n\n  __searchAndFilterHeaderRenderer = this._searchAndFilterHeaderRenderer.bind(this);\n  // --------------------------------------------------------------------------------------\n  _searchAndFilterHeaderRenderer(root, column) {\n    const _path = column.getAttribute('path');\n    const _title = column.getAttribute('header');\n    const _initialSort = column.getAttribute('initialSort');\n    const _filter = toBoolean(column.getAttribute('filter'));\n    const _sort = toBoolean(column.getAttribute('sort'));\n    const _sortPath = toString(column.getAttribute('sortPath'));\n    const _disableTitle = toBoolean(column.getAttribute('disableTitle'));\n    if (_disableTitle) {\n      render(html``, root);\n    }\n\n    const gridColumn = (this.gridColumns.find((el) => el.id === _path));\n    const filterDefinition = gridColumn.filterDefinition;\n    let filterData;\n    if (filterDefinition) {\n      filterData = gridColumn.filterDefinition.data(this.gridItems);\n    }\n    let _vaadinGridSorter;\n    let _vaadinGridFilter;\n\n    if (_sort) {\n      if (_initialSort !== 'undefined') {\n        _vaadinGridSorter = html`\n          <vaadin-grid-sorter \n            id='sorter_${_path}' \n            path='${_sortPath ? _sortPath : _path}'\n            direction='${_initialSort}'>\n          </vaadin-grid-sorter>\n        `;\n      } else {\n        _vaadinGridSorter = html`\n          <vaadin-grid-sorter \n            id='sorter_${_path}'\n            path='${_sortPath ? _sortPath : _path}'>\n          </vaadin-grid-sorter>`;\n      }\n    }\n\n    if (_filter !== 'undefined' && _filter) {\n      const filterId = `filter_${_path}`;\n      if (filterDefinition) {\n        if (filterDefinition.type === 'dropdown') {\n          _vaadinGridFilter = html`\n            <details>\n              <summary class='dropdown-filter-title' data-testid='dropdown_title_${_path}'>${_title}</summary>\n              <div data-testid='dropdown_inputs_${_path}' class='dropdown-value-wrapper'>\n                ${gridColumn.filterDefinition.data(this.gridItems).map((el) => html`\n                  <div class='label-input-group'>\n                    <input\n                      @change='${() => this.filterValuesChanged(_path, `dropdown-filter_${_path}`, filterDefinition.type)}'\n                      name='dropdown-filter_${_path}' type='checkbox' value='${el}' id='${_path}_${el}'>\n                    <label for='${_path}_${el}'>${el}</label>\n                  </div>\n                `)}\n              </div>\n            </details>\n          `;\n        }\n      } else {\n        _vaadinGridFilter = html`\n          <vaadin-grid-filter path='${_path}'>\n            <vaadin-text-field\n              id='${filterId}'\n              slot='filter'\n              focus-target\n              theme='small'\n              placeholder='${_title}'\n              title='${_title}'\n              @focus='${(e) => this.handleCurrentFilterUpdate(e, filterId, _path)}'\n              @blur='${(e) => this.handleCurrentFilterBlur(e, filterId, _path)}'\n              @value-changed='${e => e.target.parentNode.value = e.detail.value}'></vaadin-text-field>\n          </vaadin-grid-filter>`;\n      }\n    } else {\n      _vaadinGridFilter = html`\n        <vaadin-grid-column\n          path='${_path}'\n          class='header'>${_title}\n        </vaadin-grid-column>\n      `;\n    }\n\n    render(html`\n      ${_vaadinGridSorter}\n      ${_vaadinGridFilter}\n    `, root);\n  }\n\n  _undoFilterHighlight = null;\n\n  handleCurrentFilterBlur(e, id, path) {\n    if (e.target.value === \"\") {\n      if (this._undoFilterHighlight) this._undoFilterHighlight();\n    }\n  }\n\n  _lastSelectedFilter = undefined;\n  handleCurrentFilterUpdate(e, id, path) {\n    if (this._undoFilterHighlight) this._undoFilterHighlight();\n\n    const setHiglightClass = (target) => {\n      target.classList.add(\"current-filter\");\n      return () => target.classList.remove(\"current-filter\");\n    }\n\n    this._undoFilterHighlight = setHiglightClass(e.target);\n    this._currentFilter = path;\n\n    // reload the data for the previously set filter\n    if (id !== this._lastSelectedFilter) {\n      this._lastSelectedFilter = id;\n      if (e.target.value !== \"\" ) this.vaadinGrid.clearCache();\n    }\n  }\n\n  get vaadinGrid() {\n    return this.shadowRoot.querySelector(\"vaadin-grid\");\n  }\n\n  __columnRenderer = this._columnRenderer.bind(this);\n  // --------------------------------------------------------------------------------------\n  _columnRenderer(root, column, rowData) {\n\n    const _path = column.getAttribute('path');\n    const _subKey = column.getAttribute('subKey');\n    const _iconSrc = column.getAttribute('iconSrc');\n    const _iconTitle = column.getAttribute('iconTitle');\n    const _linkPrefix = column.getAttribute('linkPrefix');\n    const _linkField = column.getAttribute('linkField');\n    const _linkSuffix = column.getAttribute('linkSuffix');\n    const _chart = column.getAttribute('chart');\n    const _assetId = column.getAttribute('assetId');\n    const _dateRange = column.getAttribute('dateRange');\n    const _iotColor = column.getAttribute('iotColor');\n    let _contextMenuPrefix = column.getAttribute('contextMenuPrefix');\n    let _contextMenuField = column.getAttribute('contextMenuField');\n    let _contextMenuSuffix = column.getAttribute('contextMenuSuffix');\n    const _contextMenuLinksLength = column.getAttribute('contextMenuLinksLength');\n    let _contextMenuOptions = column.getAttribute('contextMenuOptions');\n    const _iotOnlineTime = column.getAttribute('iotOnlineTime');\n    const _columnAlign = column.getAttribute('columnAlign');\n    const _loading = column.getAttribute('loading');\n    const _event = column.getAttribute('event');\n    const visibleForId = column.getAttribute('visibleForId')\n    let _link = null;\n    let _inputOptions = null;\n    const _vaadinItem = [];\n    let _output = createGridOutput(_path, rowData);\n    const _title = createGridOutput(_path, rowData);\n    if (_subKey !== '') {\n      _output = html`<b>${_output}</b><br/>${rowData.item[_subKey]}`;\n    }\n\n    if (_linkField !== 'null') {\n      _link = `${_linkPrefix}${rowData.item[_linkField]}${_linkSuffix}`;\n    }\n\n    let _vaadinGrid;\n    const rowIndexAttribute = rowData.index;\n    let cssClasses = [];\n    const columnDefinition = (this.gridColumns.find((col) => col.id === _path));\n\n    const defaultRenderOptions = {\n      clampLinesTo: 1\n    }\n    let mergedRenderOptions = {...defaultRenderOptions}\n    if (columnDefinition.renderOptions) {\n      mergedRenderOptions = {...mergedRenderOptions, ...columnDefinition.renderOptions};\n    }\n    if (mergedRenderOptions.clampLinesTo) {\n      if (mergedRenderOptions.clampLinesTo === 1) cssClasses.push(\"clamp-lines-to-1\")\n      if (mergedRenderOptions.clampLinesTo === 2) cssClasses.push(\"clamp-lines-to-2\")\n\n    }\n    root.setAttribute(\"data-ldgrid-row-index\", rowIndexAttribute);\n\n    /**\n     * Create Icon and/or Link\n     */\n\n    if (_contextMenuField !== '' && _contextMenuOptions !== '') {\n\n      for (let i = 0; i < Number(_contextMenuLinksLength); i++) {\n        // get the string from Prefix Field / Suffix until ,\n        _link = `${_contextMenuPrefix.substr(0, _contextMenuPrefix.indexOf(','))}${_contextMenuField.substr(0, _contextMenuField.indexOf(','))}/${rowData.item[_contextMenuSuffix.substr(0, _contextMenuSuffix.indexOf(','))]}`;\n\n        // get the string for the label until ,\n        _inputOptions = _contextMenuOptions.substr(0, _contextMenuOptions.indexOf(','));\n        // create the vaadin-item\n        _vaadinItem.push(html`\n          <vaadin-item theme='custom'>\n            <a href='${_link}'>${_inputOptions}</a>\n          </vaadin-item>\n        `);\n\n        // delete the used string\n        _contextMenuPrefix = _contextMenuPrefix.substr(_contextMenuPrefix.indexOf(',') + 1);\n        _contextMenuSuffix = _contextMenuSuffix.substr(_contextMenuSuffix.indexOf(',') + 1);\n        _contextMenuField = _contextMenuField.substr(_contextMenuField.indexOf(',') + 1);\n        _contextMenuOptions = _contextMenuOptions.substr(_contextMenuOptions.indexOf(',') + 1);\n\n      }\n      _vaadinGrid = html`\n        <vaadin-context-menu open-on='click'>\n          <div style='text-align:${_columnAlign}'>\n            <iron-icon icon='${_iconSrc}' style='cursor: pointer;'></iron-icon>\n          </div>\n          <template>\n            <vaadin-list-box>\n              ${_vaadinItem}\n            </vaadin-list-box>\n          </template>\n        </vaadin-context-menu>\n      `;\n    } else if (_path === 'icon' && _link !== null && isAllowedToSeeItem(visibleForId, rowData)) {\n      _vaadinGrid = html`\n        <a ?disabled=\"${rowData.item[\"disableInteraction\"]}\" title='${_iconTitle}' id='${_title}' class='title' href='${rowData.item[\"disableEdit\"] ? \"\" : _link}'>\n          <div style='text-align:${_columnAlign}'>\n            <iron-icon icon='${_iconSrc}'></iron-icon>\n          </div>\n        </a>`;\n    } else if (_path === 'icon' && _event !== 'null') {\n      _vaadinGrid = html`\n        <div title='${_iconTitle}'\n             id='${_title}'\n             style='text-align:${_columnAlign}'\n             @click='${() => this.handleBtnClick(rowData.item[_iconSrc] != null ? rowData.item[_event] : _event, rowData.item['id'], rowData)}'>\n          <iron-icon icon='${_iconSrc}' style='cursor: pointer;'>\n          </iron-icon>\n        </div>`;\n    } else if (_path === 'icon' && _link === null) {\n      _vaadinGrid = html`\n        <div title='${_iconTitle}' id='${_title}' style='text-align:${_columnAlign}'>\n          <iron-icon icon='${_iconSrc}' style='cursor: pointer;'>\n          </iron-icon>\n        </div>`;\n    } else if (_link !== null) {\n      _vaadinGrid = html`\n        <a title='${_title}' id='${_title}' href='${_link}'>${_output}</a>`;\n    } else if (_path === 'iotLabel' || _path === 'sendingLabel') {\n      _vaadinGrid = html`\n        <span title='${rowData.item[_iotOnlineTime]}' id='${rowData.item[_iotOnlineTime]}'\n              class='circle ${rowData.item[_iotColor]}'></span>\n        <span class='suffix'>${_output}</span>`;\n    } else if (_path === 'trend') {\n      _vaadinGrid = html`\n        <span>${_output}</span>`;\n    } else if (_path === \"role\") {\n      _vaadinGrid = html`\n        <span title='${_title}' id='${_title}'>${rowData.item[\"role\"]}</span>`;\n    } else if (_path === \"enabled\") {\n      _vaadinGrid = html`\n        <span\n          class='user-enabled-status'\n          data-user-enabled='${rowData.item['enabled']}'\n          title='${_title}'\n          id='${_title}'>\n            ${rowData.item[\"enabled\"] ? \"enabled\" : \"disabled\"}\n          </span>`;\n\n    } else {\n      _vaadinGrid = html`\n        <span title='${_title}' id='${_title}'>${_output}</span>`;\n    }\n    /**\n     * create charts in an grid\n     */\n    if (_chart !== '') {\n      // dot at machineId is needed in edge. Without machineId is null\n      _vaadinGrid = html`\n        <ld-availability-swimlane-chart ?_loading='${_loading}'\n                                        .machineId='${rowData.item[_assetId]}'\n                                        .dateRange='${rowData.item[_dateRange]}'\n                                        .chartValue='${rowData.item['valueList']}'\n        ></ld-availability-swimlane-chart>`;\n    }\n\n    render(html`\n      <div class=\"${cssClasses.join(\" \")}\">${_vaadinGrid}</div>\n    `, root);\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onDownloadCsvClick(e) {\n    const filters = this.getVaadinGridFilters();\n    const sorters = this.getVaadinGridSorters();\n    const exporter = new TableCSVExporter(\n      this.__gridItems,\n      this.__gridColumns,\n      filters,\n      sorters\n    );\n    const universalBOM = '\\uFEFF';\n    const csvOutput = exporter.convertToCSV();\n    const csvBlob = new Blob([universalBOM, csvOutput], { type: 'text/csv;charset=UTF-8' });\n    const blobUrl = URL.createObjectURL(csvBlob);\n    const anchorElement = document.createElement('a');\n\n    anchorElement.href = blobUrl;\n    anchorElement.download = 'table-export.csv';\n    anchorElement.click();\n  }\n\n  /**\n   * Retrieves the filters set on vaadin-grid.\n   * @returns An array of filter elements\n   */\n  // ---------------------------------------------------------------------------\n  getVaadinGridFilters() {\n    const shadowRoot = this.shadowRoot;\n    if (!shadowRoot) return [];\n\n    const vaadinGrid = shadowRoot.querySelector(\"vaadin-grid\");\n    if (!vaadinGrid) return [];\n\n    const filtersRaw = vaadinGrid._filters;\n    if (!filtersRaw) return [];\n\n    const filters = filtersRaw.map((filter) => {\n      return {\n        field: filter.path,\n        value: filter.shadowRoot.querySelector(\"vaadin-text-field\").value\n      };\n    }).filter((filter) => filter.value !== \"\");\n    return filters;\n  }\n  // ---------------------------------------------------------------------------\n  getVaadinGridSorters() {\n    const shadowRoot = this.shadowRoot;\n    if (!shadowRoot) return [];\n\n    const vaadinGrid = shadowRoot.querySelector(\"vaadin-grid\");\n    if (!vaadinGrid) return [];\n\n    const sortersRaw = vaadinGrid._sorters;\n    if (!sortersRaw) return [];\n\n    const sorters = sortersRaw.map((sorter) => {\n      return {\n        field: sorter.path,\n        direction: sorter.getAttribute(\"direction\")\n      };\n    });\n    return sorters;\n  }\n\n  /**\n   * @protected\n   * @param {SortEvent} - event that is fired as the user clicked on the sort item\n   */\n  // --------------------------------------------------------------------------------------\n  _onSorterClick(evt, id) {\n    const order = {\n      id: evt.id,\n      direction: evt.direction,\n    };\n\n    if(evt.direction != null && evt.id != null){\n      store.dispatch(saveUserSetting(`sortPath${id}`, order));\n    }\n\n    this.dispatchEvent(new CustomEvent('sort-changed', {\n      detail: evt,\n      id: id,\n    }));\n  }\n\n  /**\n   *\n   * @param {string} btn\n   * @param {string} value\n   * @return void\n   */\n  // --------------------------------------------------------------------------------------\n  handleBtnClick(btn, value, allValues) {\n    if (btn) {\n      const vaadinGridTextField = this.shadowRoot.querySelectorAll(`vaadin-text-field`);\n\n      const vaadinGridNumberField = this.shadowRoot.querySelector(`vaadin-number-field[id='number_${value}']`);\n      const vaadinGridIntegerField = this.shadowRoot.querySelector(`vaadin-integer-field[id='integer_${value}']`);\n\n      this.dispatchEvent(new CustomEvent(btn, {\n        detail: {\n          name: btn,\n          id: value,\n          textField: vaadinGridTextField,\n          numberField: vaadinGridNumberField,\n          integerField: vaadinGridIntegerField,\n          allValues: allValues\n        },\n      }));\n    }\n  }\n  /*\n   Creates a data provider for vaadin grid and returns the created instance on subsequent calls.\n   */\n  getDataProvider() {\n    if (this._dataProvider) return this._dataProvider;\n\n    this._dataProvider = this.dataProvider ? this.dataProvider(this) : null;\n    return this._dataProvider;\n  }\n\n}\n\n// helpers\n\nconst getUserRoles = (userInformation) => {\n  return !userInformation ? [] : userInformation.role;\n}\n\nconst userIsAllowedToSeeItem = (item, userInformation) => {\n  if (!userInformation) return false;\n  // legacy\n  if (userInformation.main_group) return item.visible_for_user_group[0].match(userInformation.main_group);\n  // new model\n  return !item.visible_for_user_group[0] || item.visible_for_user_group.includes(userInformation.role)\n}\n\nconst isAllowedToSeeItem = (visibleForId, rowData) => {\n  if (visibleForId === 'null') return true;\n  return rowData.item[visibleForId]\n}\n\ncustomElements.define('ld-grid', LdGrid);\n\nfunction toBoolean(value) {\n  if (value === \"true\") return true;\n  if (value === \"false\") return false;\n  if (value === true) return true;\n  if (value === false) return false;\n  return null;\n}\n\nfunction toString(value) {\n  return value === \"undefined\" ? undefined : value;\n}\n\nexport const createColumn = (id, title, options) => {\n  return {\n      id,\n      title,\n      ...options\n    }\n}\n\nexport const descriptionRenderOptions = {\n  clampLinesTo: 1\n}\n\nexport const descriptionRenderOptionsTwoLines = {\n  clampLinesTo: 2\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css } from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdOnlinestateAssetsStyles = css`\n  :host {\n    display: inline;\n    font-size:16px;\n    text-transform: none;\n    margin-left: 50px;\n    vertical-align: middle;\n  }\n \n`;\n\nexport default LdOnlinestateAssetsStyles;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html, LitElement, property } from 'lit-element';\nimport { connect } from 'pwa-helpers/connect-mixin';\nimport moment from 'moment';\nimport { store } from '../../ld-redux/ld-redux-store';\nimport { emptyMultiCurrentValue, loadMultiCurrentValue } from '../../ld-redux/actions/ld-timeseries-actions';\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\nimport { LdOnlinestateAssetsStyles } from './styles';\nimport { createChartId, getMachineOnlinestate, rewriteTimeseriesVariableToId } from '../../../js/LdGlobal';\n\nimport '@polymer/paper-fab/paper-fab';\nimport '@polymer/iron-icons/iron-icons';\nimport { baseConfig } from '../../../auto-generated/config';\nimport '../ld-state-indicator';\n\n/**\n * @extends LitElement\n */\nclass LdAssetsOnlinestate extends connect(store)(LdI18NextMixin(LitElement)) {\n\n    // --------------------------------------------------------------------------------------\n    static get properties() {\n        return {\n            assetId: { type: String, hasChanged: () => true },\n            hidePrefix: { type: Boolean },\n            hideSuffix: { type: Boolean },\n            chartId: { type: String, hasChanged: () => true },\n            _machineState: { type: Number, hasChanged: () => true },\n            _machineTimeOut: { type: Number },\n            _machineIds: { type: Object, hasChanged: () => true },\n            _sendRequest: { type: Number, hasChanged: () => true },\n            _interval: { type: Number, hasChanged: () => true },\n            _loading: { type: Boolean},\n            userInformation: { type: Object, reflect: true },\n\n        };\n    }\n\n    // ---------------------------------------------------------------------------------------\n    static get styles() {\n        return [LdOnlinestateAssetsStyles];\n    }\n\n\n    // --------------------------------------------------------------------------------------\n    updated(changedProperties) {\n        if (changedProperties.has('assetId') && changedProperties.get('assetId') !== this.assetId) {\n            this._machineIds = [];\n            this._machineIds.push(this.assetId);\n            store.dispatch(loadMultiCurrentValue(this._machineIds, [rewriteTimeseriesVariableToId('CONNECTION_STATE_BOX')], this.chartId, this.userInformation.role));\n            this._updateData();\n        }\n    }\n\n    // --------------------------------------------------------------------------------------\n    connectedCallback() {\n        super.connectedCallback();\n\n        this.addEventListener('blur', () => {\n            clearInterval(this._interval);\n            this._interval = null;\n        });\n\n        this.addEventListener('focus', () => {\n            this._updateData();\n        });\n    }\n\n    // --------------------------------------------------------------------------------------\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        clearInterval(this._interval);\n        store.dispatch(emptyMultiCurrentValue(this.chartId));\n\n        this.removeEventListener('blur', () => {\n            clearInterval(this._interval);\n            this._interval = null;\n        });\n\n        this.removeEventListener('focus', () => {\n            this._updateData();\n        });\n    }\n\n    // --------------------------------------------------------------------------------------\n    constructor() {\n        super();\n        this.hidePrefix = false;\n        this.hideSuffix = false;\n        this._machineState = 0;\n        this._machineIds = [];\n        this._intervalInMs = baseConfig.interval.shortTime;\n        this._interval = null;\n        this.chartId = createChartId();\n        this._loading = null;\n    }\n\n    // --------------------------------------------------------------------------------------\n    render() {\n        return html`\n      <ld-state-indicator\n        title='${this._machineTimeOut}'\n        id='IoT'\n        prefixText='${!this.hidePrefix ? this.LdTranslate('modules.assets.machine.elements.onlineState.title') : ''}'\n        color='${getMachineOnlinestate(this._machineState, 'color')}'\n        suffixText='${!this.hideSuffix ? getMachineOnlinestate(this._machineState, 'label') : ''}'>\n      </ld-state-indicator>\n      `;\n    }\n\n    /**\n     * @protected\n     * @param {JSON} - updated state handled by the redux implementation\n     */\n    // --------------------------------------------------------------------------------------\n    stateChanged(state) {\n        let _machineTimeOutValue;\n        const { multiCurrentValueList, isMultiCurrentValueLoading } = state.LdTimeseriesReducer;\n\n        if (isMultiCurrentValueLoading != null && isMultiCurrentValueLoading.length > 0) {\n            const _loading = isMultiCurrentValueLoading.filter(obj => obj.chartId === this.chartId);\n            if (_loading.length > 0) {\n                this._loading = _loading[0].loading;\n            }\n        }\n\n        if (!this._loading && multiCurrentValueList != null && multiCurrentValueList.length > 0) {\n            let _multiCurrentValueList = multiCurrentValueList.filter(obj => obj.chartId === this.chartId);\n\n            if (_multiCurrentValueList != null && _multiCurrentValueList.length !== 0 && _multiCurrentValueList[0].multiCurrentValueList) {\n                _multiCurrentValueList = _multiCurrentValueList[0].multiCurrentValueList;\n                if (this._sendRequest !== 0\n                  && _multiCurrentValueList[this.assetId] != null\n                  && _multiCurrentValueList[this.assetId][0] != null\n                  && _multiCurrentValueList[this.assetId][0].variable != null) {\n                    if (_multiCurrentValueList[this.assetId][0].variable === rewriteTimeseriesVariableToId('CONNECTION_STATE_BOX')) {\n                        const statusValues = _multiCurrentValueList[this.assetId][0].value;\n                        // eslint-disable-next-line prefer-destructuring\n                        this._machineState = statusValues[1];\n                        // eslint-disable-next-line prefer-destructuring\n                        _machineTimeOutValue = statusValues[0];\n                    }\n                }\n            }\n            this._machineTimeOut = moment(_machineTimeOutValue).format(this.LdTranslate('modules.charts.tooltipDateFormat')) === 'Invalid date' || _machineTimeOutValue == null ? this.LdTranslate('modules.generic.notConnected') : moment(_machineTimeOutValue).format(this.LdTranslate('modules.charts.tooltipDateFormat'));\n        }\n    }\n\n    /**\n     * update the interval for the machine state every 5 sek\n     */\n    // --------------------------------------------------------------------------------------\n    _updateData() {\n        if (this._interval === null) {\n            this._interval = setInterval(() => {\n                store.dispatch(loadMultiCurrentValue(this._machineIds, [rewriteTimeseriesVariableToId('CONNECTION_STATE_BOX')], this.chartId, this.userInformation.role));\n            }, this._intervalInMs);\n        }\n    }\n}\n\ncustomElements.define('ld-assets-onlinestate-view', LdAssetsOnlinestate);\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default debounce;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdSearchStyles = css`\n  #search-input {\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 50px;\n    padding-right: 16px;\n    line-height: 50px;\n    height: 50px;\n    border: none;\n    border-radius: 4px;\n    margin: 0;\n    margin-bottom: 1px;\n    background-color: ${unsafeCSS(_THEME.colors.search_field_background_color)};\n    font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n    font-size: 16px;\n    color: ${unsafeCSS(_THEME.colors.search_field_text_color)};\n    -webkit-appearance: none; /* Safari support */\n  }\n\n  #search-input:focus {\n    background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n  }\n\n  #search-input::-webkit-input-placeholder {\n    font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n    font-size: 16px;\n    color: ${unsafeCSS(_THEME.colors.search_field_text_color)};\n  }\n\n  #search-input::-moz-placeholder {\n    font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n    font-size: 16px;\n    color: ${unsafeCSS(_THEME.colors.search_field_text_color)};\n  }\n\n  #search-input:-ms-input-placeholder {\n    font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n    font-size: 16px;\n    color: ${unsafeCSS(_THEME.colors.search_field_text_color)};\n  }\n\n  #search-icon {\n    position: absolute;\n    width: 32px;\n    height: 32px;\n    padding: 10px;\n    color: ${unsafeCSS(_THEME.colors.icon_button_color)};\n  }\n\n  #clear-icon {\n    display: inline-block;\n    width: 32px;\n    height: 32px;\n    position: absolute;\n    color: ${unsafeCSS(_THEME.colors.icon_button_color)};\n    top: 15px;\n    left: 30%;\n    cursor: pointer;\n  }\n\n  paper-progress {\n    width: 100%;\n    margin-top: -4px;\n    --paper-progress-active-color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n    --paper-progress-container-color: transparent;\n    --paper-progress-indeterminate-cycle-duration: 2s;\n    --paper-progress-transition-transition-delay: 250ms;\n    border: none;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px;\n  }\n  \n  div.header {\n    color: ${unsafeCSS(_THEME.colors.search_field_text_color)};\n    padding: 18px 16px 8px 22px;\n    font-size: 16px;\n  }\n\n  div.header:last-of-type {\n    margin-bottom: 5px;\n  }\n\n  hr {\n    border-style: solid;\n    border-width: .5px;\n    border-color: ${unsafeCSS(_THEME.colors.default_borders_color)};\n    margin-block-start: 1em;\n    margin-block-end: 0.3em;\n  }\n\n  hr:last-of-type {\n    display: none;\n  }\n  \n  iron-icon {\n    width: 36px;\n    height: 36px;\n    padding-left: 6px;\n    padding-right: 15px;\n  }\n\n  .paper-item-link {\n    color: inherit;\n    text-decoration: none;\n  }\n\n  paper-icon-item:hover,\n  paper-icon-item:focus {\n    background-color: ${unsafeCSS(_THEME.colors.search_field_item_background_color)};\n    padding-left: 11px;\n    border-left: 5px ${unsafeCSS(_THEME.colors.primary_highlight_color)} solid\n  }\n\n  @media only screen and (min-width: 600px ) {\n    #search-input:focus {\n      background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n      position: absolute;\n      width: 50%;\n    }\n  }\n  \n\n  @media only screen and (min-width: 1260px ) {\n\n    #search-input:focus {\n      background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n      position: inherit;\n      width: 100%;\n\n    }\n  }\n`;\n\nexport default LdSearchStyles;\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\nimport '@polymer/paper-styles/typography.js';\nimport './paper-item-shared-styles.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperItemBehavior} from './paper-item-behavior.js';\n\n/*\n`<paper-icon-item>` is a convenience element to make an item with icon. It is an\ninteractive list item with a fixed-width icon area, according to Material\nDesign. This is useful if the icons are of varying widths, but you want the item\nbodies to line up. Use this like a `<paper-item>`. The child node with the slot\nname `item-icon` is placed in the icon area.\n\n    <paper-icon-item>\n      <iron-icon icon=\"favorite\" slot=\"item-icon\"></iron-icon>\n      Favorite\n    </paper-icon-item>\n    <paper-icon-item>\n      <div class=\"avatar\" slot=\"item-icon\"></div>\n      Avatar\n    </paper-icon-item>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-item-icon-width` | Width of the icon area | `56px`\n`--paper-item-icon` | Mixin applied to the icon area | `{}`\n`--paper-icon-item` | Mixin applied to the item | `{}`\n`--paper-item-selected-weight` | The font weight of a selected item | `bold`\n`--paper-item-selected` | Mixin applied to selected paper-items | `{}`\n`--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color`\n`--paper-item-disabled` | Mixin applied to disabled paper-items | `{}`\n`--paper-item-focused` | Mixin applied to focused paper-items | `{}`\n`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`\n\n*/\nPolymer({\n  _template: html`\n    <style include=\"paper-item-shared-styles\"></style>\n    <style>\n      :host {\n        @apply --layout-horizontal;\n        @apply --layout-center;\n        @apply --paper-font-subhead;\n\n        @apply --paper-item;\n        @apply --paper-icon-item;\n      }\n\n      .content-icon {\n        @apply --layout-horizontal;\n        @apply --layout-center;\n\n        width: var(--paper-item-icon-width, 56px);\n        @apply --paper-item-icon;\n      }\n    </style>\n\n    <div id=\"contentIcon\" class=\"content-icon\">\n      <slot name=\"item-icon\"></slot>\n    </div>\n    <slot></slot>\n`,\n\n  is: 'paper-icon-item',\n  behaviors: [PaperItemBehavior]\n});\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html, css } from 'lit-element';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-item/paper-item';\nimport '@polymer/paper-item/paper-icon-item';\nimport '@polymer/paper-item/paper-item-body';\nimport '@polymer/paper-icon-button/paper-icon-button';\n\nimport { LdSearchStyles } from '../styles';\nimport { LdI18NextMixin } from '../../../ld-application/i18n/ld-i18next';\n\n/**\n * Class for displaying a &lt;ld-sidebar-item&gt; element.\n * @extends LitElement\n */\nclass LdSearchResultGenericTemplate extends LdI18NextMixin(LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      link: { type: String },\n      image: { type: String },\n      firstLine: { type: String },\n      secondLine: { type: String },\n      data: { type: Object }\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdSearchStyles, css`\n      :host {\n        display: block;\n  \n        --paper-item-body-two-line-min-height: 60px;\n        --paper-item-icon-width: 5px;\n      }\n    `];\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <a class='paper-item-link' href='${this.link}' tabindex='-1' @click=\"${this._click}\">\n        <paper-icon-item>\n          <iron-icon src='${this.image}' item-icon></iron-icon>\n          <paper-item-body two-line>\n            <div>${this.firstLine}</div>\n            <div secondary>${this.secondLine}</div>\n          </paper-item-body>\n        </paper-icon-item>\n      </a>\n    `;\n  }\n\n  _click(event) {\n    this.dispatchEvent(new CustomEvent('result-selected', {\n      detail: {\n        data: this.data,\n        preventNavigation: () => event.preventDefault(),\n      },\n      composed: true,\n    }));\n  }\n\n}\n\ncustomElements.define('ld-search-generic-result-template', LdSearchResultGenericTemplate);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html, LitElement } from 'lit-element';\nimport './ld-search-generic-result-template';\nimport { getUUID } from '../../../../js/LdGlobal';\n\nclass LdSearchResultMachine extends LitElement {\n\n  static get properties() {\n    return {\n      data: { type: Object, notify: true },\n    };\n  }\n\n  constructor() {\n    super();\n    this.data = {};\n  }\n\n  render() {\n    if (this.data.uri != null) {\n      return html`\n        <ld-search-generic-result-template\n          link='/assets/machine/view/${getUUID(this.data)}/performance'\n          image='/images/dashboard/machine.svg'\n          firstLine='${this.data.machine_identifier_customer}'\n          secondLine='${this.data.name} ${this.data.machine_type}'\n          .data='${this.data}'\n        ></ld-search-generic-result-template>\n      `;\n    }\n  }\n\n}\n\ncustomElements.define('ld-search-result-machine', LdSearchResultMachine);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, html, LitElement } from 'lit-element';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-tooltip/paper-tooltip';\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\n\nimport './result-templates/ld-search-result-machine';\n\n/**\n * Class for displaying a &lt;ld-sidebar-item&gt; element.\n * @extends LitElement\n */\nclass LdSearchResultTemplateSelector extends LdI18NextMixin(LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      data: { type: Object, notify: true },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [css`\n      :host {\n        display: block;\n      }\n    `];\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n\n    return html`\n      <ld-search-result-machine .data='${this.data}'>\n        <ld-search-result-machine>\n    `;\n  }\n\n}\n\ncustomElements.define('ld-search-result-template-selector', LdSearchResultTemplateSelector);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, html, LitElement, unsafeCSS } from 'lit-element';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-tooltip/paper-tooltip';\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\n\nimport './ld-search-result-template-selector';\nimport { LdSearchStyles } from './styles';\nimport { _THEME } from '../../../themes/styles';\n\n/**\n * Class for displaying a &lt;ld-sidebar-item&gt; element.\n * @extends LitElement\n */\nclass LdSearchResults extends LdI18NextMixin(LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      opened: { type: Boolean, notify: true, reflectToAttribute: true },\n      results: { type: Object, notify: true },\n      found: { type: Number },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [css`\n      :host {\n        display: none;\n        background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n        box-shadow: 0 13px 30px rgba(0, 0, 0, 0.4), 0 6px 14px rgba(0, 0, 0, 0.3);\n        max-height: 450px;\n        overflow: auto;\n      }\n\n      :host([opened='true']) {\n        display: block;\n        position: absolute;\n        z-index: 100;\n      }\n    `, LdSearchStyles];\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    const output = [];\n    if (typeof this.results === 'undefined' || Object.keys(this.results).length === 0) {\n      return html`\n        <div class='header paper-font-headline'>${this.LdTranslate('modules.search.noResults')}</div>`;\n    } else {\n      const resultsArray = this._computeResultArray(this.results);\n\n      output.push(\n        html`\n          <div class='header paper-font-headline'>\n            ${resultsArray.length} ${this.LdTranslate('modules.search.results.of').toLowerCase()} ${this.found}\n            ${this.LdTranslate('modules.search.results.machines')}\n          </div>\n        `,\n      );\n      resultsArray.forEach(child => {\n        output.push(\n          html`\n            <ld-search-result-template-selector .data='${child.value.fields}'></ld-search-result-template-selector>\n          `,\n        );\n      });\n      output.push(html`\n        <hr>`);\n      return html`${output}`;\n    }\n  }\n\n  /**\n   * @param  {} obj\n   */\n  // --------------------------------------------------------------------------------------\n  _computeResultArray(obj) {\n    return Object.keys(obj).map(key => ({\n      name: key,\n      value: obj[key],\n    }));\n  }\n}\n\ncustomElements.define('ld-search-results', LdSearchResults);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { CONFIG } from '../LdGlobal';\nimport LdFetch from '../LdFetch';\n\nconst getUrl = () => {\n  const { base_url, search_all } = CONFIG.backend.services.search;\n  return `${base_url}${search_all}`;\n};\n\nfunction searchAll(searchInput) {\n  const abortController = new AbortController()\n  const signal = abortController.signal;\n  const requestPromise = new Promise((resolve, reject) => {\n    LdFetch.get(`${getUrl()}${searchInput}`, resolve, reject, { signal });\n  });\n  requestPromise.abort = () => abortController.abort();\n  return requestPromise;\n}\n\nexport default {\n  searchAll,\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\n\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/paper-tooltip/paper-tooltip';\nimport '@polymer/paper-progress/paper-progress';\n\nimport { LdSearchStyles } from './styles';\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\nimport debounce from './debounce';\n\nimport './ld-search-results';\nimport searchService from '../../../js/services/searchService';\nimport { forward } from '../../../js/LdGlobal';\n\n/**\n * Class for displaying a &lt;ld-sidebar-item&gt; element.\n * @extends LitElement\n */\nclass LdSearchInput extends LdI18NextMixin(LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      searchInput: { type: String, hasChanged: () => true },\n      minChars: { type: Number, notify: true, },\n      resultsOpened: { type: Boolean },\n      loading: { type: Boolean, notify: true },\n      results: { type: Object },\n      resultsFound: { type: Number },\n      _searchFieldTimeout: { type: Number },\n      _pendingRequest: { type: Promise },\n      returnDataMode: { type: Boolean, notify: true },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdSearchStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    this.addEventListener('blur', this._blurListener);\n    this.addEventListener('focus', this._focusListener);\n    this.addEventListener('keydown', this._resultKeydownListener);\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n\n    this.searchInput = '';\n    this.minChars = 3;\n    this.resultsOpened = false;\n    this.loading = false;\n    this._searchFieldTimeout = 1000;\n    this.results = {};\n    this._debouncedExecuteSearch = debounce(this._executeSearch, 1000, {\n      leading: true,\n      trailing: true,\n    });\n    this.returnDataMode = false;\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    const inputReference = this.shadowRoot.querySelector('#search-input')\n    const resultWidth = inputReference && inputReference.clientWidth || 150;\n\n    return html`\n    <iron-icon id='search-icon' icon='icons:search'></iron-icon>\n    <form>\n      <input\n        type='search'\n        value='${this.searchInput}' \n        id='search-input'\n        autocomplete='off'\n        @input='${this._searchInputChanged}'\n        placeholder='${this.LdTranslate('modules.search.callToAction')}'\n      >\n    </form>\n    <paper-progress indeterminate ?disabled='${!this.loading}'></paper-progress>\n    <ld-search-results\n      id='results'\n      opened='${this.resultsOpened}' \n      .results='${this.results}' \n      found='${this.resultsFound}'\n      @result-selected='${this._resultSelected}'\n      style=\"width: ${resultWidth}px\"\n    ></ld-search-results>\n    `;\n\n  }\n\n  _focusListener() {\n    if (Object.keys(this.results).length > 0) {\n      this.resultsOpened = true;\n    }\n  }\n\n  _blurListener() {\n    this.resultsOpened = false;\n  }\n\n  _resultKeydownListener(event) {\n    if (event.keyCode === 27) { // ESC key\n      this.searchInput = '';\n      this.resultsOpened = false;;\n      this.results = {};\n    } else if (event.keyCode === 13) { // Enter key\n      event.preventDefault();\n      this.resultsOpened = false;\n      this.searchInput = '';\n    } else if (event.keyCode === 40) { // arrow-key down\n      const paperItems = this._getResultEntries();\n      const selectedItemIndex = paperItems.findIndex(paperItem => paperItem.getAttribute('focused') === '');\n\n      if(selectedItemIndex === -1) {\n        paperItems[0].focus();\n      } else if(selectedItemIndex === paperItems.length -1) {\n\n      } else {\n        paperItems[selectedItemIndex + 1].focus();\n      }\n    } else if (event.keyCode === 38) { // arrow-key up\n      const paperItems = this._getResultEntries();\n      const selectedItemIndex = paperItems.findIndex(paperItem => paperItem.getAttribute('focused') === '');\n\n      if(selectedItemIndex === -1) {\n        paperItems[0].focus();\n      } else if(selectedItemIndex === 0) {\n\n      } else {\n        paperItems[selectedItemIndex - 1].focus();\n      }\n    }\n  }\n\n  _searchInputChanged() {\n    this.searchInput = this.shadowRoot.getElementById('search-input').value;\n    if (this.searchInput.trim().length >= this.minChars) {\n      this._debouncedExecuteSearch(this.searchInput);\n    }\n    if (this.searchInput === '') {\n      this.resultsOpened = false;\n      this.results = {};\n    }\n  }\n\n  _executeSearch(searchInput) {\n    if(this._pendingRequest) {\n      this._pendingRequest.abort();\n    }\n    searchInput = searchInput.replaceAll(' ', '*');\n    this._pendingRequest = searchService.searchAll(searchInput);\n    this.loading = true;\n    this._pendingRequest\n      .then((response) => {\n        this.loading = false;\n        this._pendingRequest = null;\n        this.results = response.hits.hit;\n        this.resultsFound = response.hits.found;\n        this.resultsOpened = true;\n      })\n      .catch((error) => {\n        this.loading = false;\n      });\n  }\n\n  _getResultEntries() {\n    const searchResult = this.shadowRoot.querySelector('ld-search-results');\n    const searchResultTemplates = searchResult.shadowRoot.querySelectorAll('ld-search-result-template-selector');\n    const paperItems = [].map.call(searchResultTemplates, (searchResultTemplate) => {\n      const searchResultSpecific = searchResultTemplate.shadowRoot.children[0];\n      const searchResultGeneric = searchResultSpecific.shadowRoot.children[0];\n      const iconItem = searchResultGeneric.shadowRoot.querySelector('paper-icon-item');\n      return iconItem;\n    });\n    return paperItems;\n  }\n\n  _resultSelected(event) {\n    event.stopPropagation();\n    const { detail } = event;\n    this.searchInput = '';\n    this.resultsOpened = false;\n    if(this.returnDataMode) {\n      detail.preventNavigation();\n      this.dispatchEvent(new CustomEvent('result-selected', {\n        detail,\n        composed: true,\n      }));\n    }\n  }\n\n}\n\ncustomElements.define('ld-search-input', LdSearchInput);\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\nimport _THEME from '../../../themes/styles';\n\nexport const LdTabStyles = css`\n  \n      /**\n       * -----------------------------------------------------------------------------------------------------------\n       * TAB STYLING\n       * -----------------------------------------------------------------------------------------------------------\n       **/\n\n      paper-tabs {\n        text-transform: uppercase;\n        /* background-color: var(--platform-frame-tabs-background-color, var(--sw-background-color, #000f26)); */\n        background-color: transparent;\n        color: var(--platform-frame-tabs-text-color, var(--sw-primary-background-color, #fff));\n        --paper-tabs-selection-bar-color: var(--platform-frame-tabs-border-color, var(--sw-primary-highlight-color, #eb0028));\n        --paper-tabs-selection-bar: {\n          z-index: 10;\n        };\n      }\n\n      paper-tab {\n        flex: none;\n        padding: 0 12px;\n        position: static;\n        overflow: hidden;\n        cursor: pointer;\n        vertical-align: middle;\n        font-family: Roboto, Noto, sans-serif;\n        -webkit-font-smoothing: antialiased;\n      }\n\n      paper-tab.iron-selected {\n        background-color: var(--platform-frame-tabs-active-background-color, var(--sw-secondary-background-color, #737171));\n      }\n  paper-tab.innerPaperTab.iron-selected{\n    background-color: var(--platform-frame-tabs-active-background-color, var(--sw-secondary-background-color, #bab8b8)) !important;\n  }\n\n  paper-tab.innerPaperTab {\n    background-color: var(--platform-frame-tabs-active-background-color, var(--sw-secondary-background-color, #e8e8e8)) !important;\n  }\n\n  .innerTab{\n    color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n  }\n  \n      paper-tab[link] a {\n      /* These mixins (from iron-flex-layout) center the link text. */\n      color: #fff;\n      text-decoration: none;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n      ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -ms-flex-direction: row;\n      -webkit-flex-direction: row;\n      flex-direction: row;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n    }\n\n\n\n    @media only screen and (min-width: 600px ) {\n      paper-tabs {\n        --paper-icon-button: {\n        display: inline;\n        }\n      }\n    }\n\n    @media only screen and (min-width: 1024px ) {\n      paper-tabs {\n        --paper-icon-button: {\n          display: none;\n        }\n      }\n      paper-tabs{\n        margin-left:-56px;\n      }\n\n      @supports (-ms-ime-align:auto) {\n        paper-tabs{\n          margin-left:0px;\n        }\n     }\n    }\n\n`;\n\nexport default LdTabStyles;\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\nimport '@polymer/paper-tabs/paper-tabs';\nimport '@polymer/paper-tabs/paper-tab';\n\nimport { LdTabStyles } from './styles';\n\n/**\n * @extends LitElement\n */\nclass LdTabs extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      tabs: { type: Object, hasChanged: () => true },\n      fallbackSelection: { type: String, hasChanged: () => true },\n      routeData: { type: Object, hasChanged: () => true },\n      selected: { type: String, hasChanged: () => true },\n      innerTab: { type: Boolean, hasChanged: () => true }\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    this.addEventListener('iron-items-changed', e => {\n      const _tabElement = this.shadowRoot.querySelector('paper-tabs');\n      _tabElement.select(_tabElement.getAttribute('selected'));\n    });\n  }\n\n  static get styles() {\n    return [LdTabStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    const allTabs = [];\n\n    this.tabs.forEach(item => {\n        allTabs.push(html`\n          <paper-tab class=\"${this.innerTab ? 'innerPaperTab' : ''}\" .name='${item.key}' link ?disabled='${item.disabled === true}' ?active='${this.selected === item.key}'>\n            <a class=\"${this.innerTab ? 'innerTab' : ''}\" href='${item.link}' class='link'>${item.title}</a>\n          </paper-tab>\n        `);\n    });\n\n    return html`\n      <paper-tabs selected='${this.selected}' attr-for-selected='name' noink fallback-selection='${this._getFirstTabItem(this.tabs)}' scrollable>\n        ${allTabs}\n      </paper-tabs>\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _getFirstTabItem(tabs) {\n    return (this.fallbackSelection != null) ? this.fallbackSelection : tabs[Object.keys(tabs)[0]].link;\n  }\n\n}\n\ncustomElements.define('ld-tabs', LdTabs);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, unsafeCSS } from 'lit-element';\nimport { displayFlex, endAligned, endJustified, horizontal, justified } from 'lit-flexbox-literals';\nimport { _THEME } from '../../../../../themes/styles';\n\nexport const LdChartStyles = css`\n  :host {\n    display: block;\n    position: relative;\n  }\n\n  .chart-item-headline {\n    ${displayFlex}\n    ${justified}\n    display: flex;\n  }\n\n  .chart-item-title h3 {\n    text-transform: uppercase;\n    font-size: 18px;\n    margin: 10px 15px 0px 10px;\n  }\n\n  .chart-item-title h3::before {\n    content: \"/ \";\n    font-weight: 800;\n    color: ${unsafeCSS(_THEME.colors.primary_color)};\n  }\n\n  .chart-item-title {\n    height: auto;\n    padding: 0px 5px;\n  }\n\n  .chart-item-date-picker {\n    ${displayFlex}\n    ${endJustified}\n    padding-top: 5px;\n  }\n\n  .chart-item-date-picker.no-title {\n    padding-top: 0;\n  }\n\n  ld-datepicker-config {\n    ${horizontal}\n    width: 500px !important;\n    max-width: 500px !important;\n    margin: 0 !important;\n\n    --ld-datepicker-show-component-border-bottom: none;\n  }\n\n  ld-icon {\n    ${horizontal}\n    ${endAligned}\n    cursor: pointer;\n    margin: 5px 10px 0 5px;\n  }\n\n  div.spacer {\n    ${horizontal}\n    ${endAligned}\n    width: 1px;\n    margin: 5px 10px 0 5px;\n  }\n\n  .limits {\n    ${displayFlex}\n    ${endJustified}\n    display: flex;\n  }\n\n  .limits span {\n    position: absolute;\n    margin-right: 5px;\n  }\n\n  .limits ld-icon {\n    margin-top: 15px;\n  }\n\n  @media only screen and (min-width: 600px ) {\n    .chart-item-title {\n      display: none;\n    }\n\n    .chart-item-date-picker ld-datepicker-config {\n      display: block;\n      width: 600px !important;\n      max-width: 600px !important;\n      margin: 0 !important;\n      margin-right: -25px !important;\n    }\n\n    .chart-item-headline {\n      ${displayFlex}\n      ${justified}\n      display: flex;\n    }\n  }\n\n  @media only screen and (min-width: 1024px ) {\n    .chart-item-title {\n      display: flex;\n    }\n\n    .chart-item-date-picker ld-datepicker-config {\n      display: block;\n      width: 600px !important;\n      max-width: 600px !important;\n      margin: 0 !important;\n      margin-right: -25px !important;\n    }\n\n    .chart-item-headline {\n      ${displayFlex}\n      ${justified}\n      display: flex;\n    }\n  }\n\n  @media only screen and (min-width: 1260px ) {\n    .chart-item-title {\n      display: flex;\n    }\n\n    .chart-item-date-picker ld-datepicker-config {\n      display: block;\n      width: 600px !important;\n      max-width: 600px !important;\n      margin: 0 !important;\n    }\n\n    .chart-item-headline {\n      ${displayFlex}\n      ${justified}\n      display: flex;\n\n    }\n  }\n`;\n\nexport default LdChartStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html, LitElement } from 'lit-element';\nimport { Layouts } from 'lit-flexbox-literals';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport { LdI18NextMixin } from '../../../../ld-application/i18n/ld-i18next';\nimport { forward, getUUID } from '../../../../../js/LdGlobal';\nimport { LdAssetsHeaderStyles } from './styles';\nimport '../../../ld-onlinestate';\nimport { connect } from 'pwa-helpers/connect-mixin';\nimport { store } from '../../../../ld-redux/ld-redux-store';\nimport { saveUserSetting } from '../../../../ld-redux/actions/ld-users-actions';\nimport { emptyAssets, loadCards } from '../../../../ld-redux/actions/ld-assets-actions';\nimport LdErrorHandler from '../../../../../js/LdErrorHandler';\n\nfunction transformMachine(machineFromSearchApi) {\n  const machineFromLineApi = {\n    id: getUUID(machineFromSearchApi),\n    machine_identifier_customer: machineFromSearchApi.machine_identifier_customer,\n    name: machineFromSearchApi.name,\n    machine_type: {\n      name: machineFromSearchApi.machine_type,\n    },\n  };\n  return machineFromLineApi;\n}\n\nclass LdAssetsHeader extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  // --------------------------------------------------------------------------------------\n  static MAX_MACHINES_ON_DASHBOARD = 5;\n  static get properties() {\n    return {\n      headline: { type: String, hasChanged: () => true },\n      arrowDisabled: { type: Boolean },\n      menuEnabled: { type: Boolean },\n      menuEnabledLine: { type: Boolean },\n      assetId: { type: String },\n      userInformation: { type: Array, hasChanged: () => true },\n      renderedCards: { type: Array, hasChanged: () => true },\n      lineList: { type: Object },\n      machineList: { type: Object },\n      _opened: { type: Boolean, reflectToAttribute: true },\n      _openedMenu: { type: Boolean, hasChanged: () => true },\n      _closeMenu: { type: Boolean, hasChanged: () => true },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [Layouts, LdAssetsHeaderStyles];\n  }\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    store.dispatch(emptyAssets());\n    this.menuEnabled = false;\n    this.menuEnabledLine = false;\n    this._openedMenu = false;\n    this._closeMenu = false;\n    this.renderedCards = [];\n  }\n\n  /**\n   * create an eventListener\n   */\n  // --------------------------------------------------------------------------------------\n  connectedCallback() {\n    super.connectedCallback();\n    window.addEventListener('mouseup', () => this._closeDetailMenu());\n  }\n\n  /**\n   * to prevent memory leaks\n   */\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    window.removeEventListener('mouseup', () => this._closeDetailMenu());\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    const onlineState = [];\n    const icons = [];\n    const menus = [];\n\n    onlineState.push(html`\n      <slot name='online'></slot>`);\n\n    if (!this.arrowDisabled) {\n      if (this._opened) {\n        icons.push(html`\n          <iron-icon @click='${e => this._toggleDetailView(e)}' icon='expand-less'></iron-icon>\n        `);\n      } else {\n        icons.push(html`\n          <iron-icon @click='${e => this._toggleDetailView(e)}' icon='expand-more'></iron-icon>\n        `);\n      }\n    }\n\n    if (this.menuEnabled || this.menuEnabledLine) {\n      icons.push(html`\n        <iron-icon @click='${() => this._toggleDetailMenu()}' class='menu-icon-color' icon='menu'></iron-icon>\n      `);\n    }\n\n    if (this.menuEnabled) {\n      menus.push(html`\n        <div class='menu-item' @click='${() => this._onMenuItemClick('edit')}'>\n          ${this.LdTranslate('modules.assets.machine.edit_form_title')}\n        </div>\n        <div class='menu-item' @click='${() => this._onMenuItemClick('move')}'>\n          ${this.LdTranslate('modules.assets.machine.move_form_title')}\n        </div>\n      `);\n    }\n\n    if (this.menuEnabledLine) {\n      menus.push(html`\n        <div class='menu-item' @click='${() => this._loadDashboard()}'>\n          ${this.LdTranslate('modules.assets.machine.add_line_to_dashboard')}\n        </div>\n      `);\n    }\n    return html`\n      <div class='detail-container layout vertical wrap'>\n\n        <div class='detail-header-container'>\n          <div class='detail-header'>\n            <h2 title='${this.headline}'>\n              ${this.headline}\n            </h2>\n            <div class=\"lights\">\n              ${onlineState}\n            </div>\n          </div>\n\n          <div class='detail-header-collapse'>\n            ${icons}\n          </div>\n          <div class='menu-body'>\n            <div class='contextmenu'>\n              <div class='menu-border'>\n                ${menus}\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class='detail-body'>\n          <slot></slot>\n        </div>\n      </div>\n    `;\n  }\n\n  /**\n   * @param  {} e\n   * opened/closed the Header\n   */\n  // --------------------------------------------------------------------------------------\n  _toggleDetailView(e) {\n    this._opened = !this._opened;\n    this.shadowRoot.querySelector('.detail-body').classList.toggle('show');\n  }\n\n  /**\n   * @param  {} e\n   * opened/closed the Menu\n   */\n  // --------------------------------------------------------------------------------------\n  _toggleDetailMenu() {\n    if (this._openedMenu !== this._closeMenu) {\n      this._openedMenu = this._closeMenu;\n    } else {\n      this._openedMenu = !this._openedMenu;\n      this.shadowRoot.querySelector('.menu-icon-color').classList.toggle('menu-icon');\n      this.shadowRoot.querySelector('.menu-body').classList.toggle('show');\n    }\n  }\n\n  /**\n   * @param  {} e\n   * opened/closed the Menu\n   */\n  // --------------------------------------------------------------------------------------\n  _closeDetailMenu() {\n    if (this._openedMenu) {\n      this._closeMenu = false;\n      this.shadowRoot.querySelector('.menu-icon-color').classList.remove('menu-icon');\n      this.shadowRoot.querySelector('.menu-body').classList.remove('show');\n      setTimeout(() => {\n        this._openedMenu = false;\n      }, 500);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onMenuItemClick(type) {\n    forward(`/assets/machine/${type}/${this.assetId}`);\n  }\n\n  /**\n   * @param {JSON} state - updated state handled by the redux implementation\n   */\n  // --------------------------------------------------------------------------------------\n  stateChanged(state) {\n    const { dashboardCards, dashboardLinesLoading } = state.LdAssetsReducer;\n    const setting = state.LdUsersReducer;\n\n\n    if (dashboardLinesLoading) {\n      window.dispatchEvent(new CustomEvent('LdOpenLoadingSpinner'));\n    }\n    if (dashboardCards && dashboardCards !== this.renderedCards) {\n      this.renderedCards = dashboardCards;\n      window.dispatchEvent(new CustomEvent('LdOpenLoadingSpinner'));\n      this._confirmDashboard(this.lineList, this.machineList);\n    }\n\n    if (setting != null && setting.savedSettings != null && setting.savedSettings === 'dashboardConfig' && this.menuEnabledLine) {\n      LdErrorHandler._handleError('add_line_to_dashboard');\n      setting.savedSettings = null;\n      window.dispatchEvent(new CustomEvent('LdCloseLoadingSpinner'));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _loadDashboard(){\n    if (this.menuEnabledLine) {\n      store.dispatch(loadCards(this.userInformation));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _confirmDashboard(lineList, machineList) {\n    if (machineList != null) {\n      machineList = machineList.slice(0, LdAssetsHeader.MAX_MACHINES_ON_DASHBOARD);\n      machineList = machineList.slice(0, 5);\n      this.renderedCards = [\n        {\n          type: 'line',\n          id: getUUID(lineList),\n          hidden: false,\n          data: {\n            line: {\n              line_id: getUUID(lineList),\n              line_name: lineList.name,\n              machines: machineList.map(transformMachine),\n            },\n          },\n        },\n        ...this.renderedCards,\n      ];\n      store.dispatch({ type: 'FINISH_DASHBOARD_LINES', cards: this.renderedCards });\n      store.dispatch(saveUserSetting('dashboardConfig', this.renderedCards));\n    }\n  }\n}\n\ncustomElements.define('ld-assets-header', LdAssetsHeader);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit-element';\nimport { displayFlex, horizontal, vertical, wrap } from 'lit-flexbox-literals';\nimport { _THEME } from '../../../../../themes/styles';\n\nexport const LdAssetsHeaderStyles = css`\n    :host {\n        display: block;\n    }\n\n    .detail-container {\n        width: 100%;\n        height: auto;\n        padding: 0;\n        background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n    }\n\n    .detail-header-container {\n        height: auto;\n        width: 100%;\n        ${displayFlex}\n        ${horizontal}\n        ${wrap}\n    }\n\n    .detail-header {\n        width: 90%;\n        max-width: 115em;\n        display: flex;\n    }\n\n    .lights {\n        margin-top: 20px;\n        width: 50%;\n        color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n    }\n\n    .detail-header h2 {\n        margin-left: 25px;\n        max-width: 50%;\n        text-transform: uppercase;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n    }\n\n    .detail-header h2::before {\n        content: \"/ \";\n        color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n    }\n\n    .detail-header-collapse {\n        margin: auto;\n        text-align: center;\n        width: 10%\n    }\n\n    .detail-body {\n        width: 100%;\n        height: auto;\n        color: #000;\n    }\n\n    .detail-body-inner {\n        width: 100%;\n        height: auto;\n        ${displayFlex}\n        ${horizontal}\n    }\n\n    .detail-body {\n        display: none;\n    }\n\n    .menu-body {\n        display: none;\n    }\n\n    .show {\n        display: inline;\n    }\n\n    .detail-element-container {\n        padding: 0 30px;\n        margin-bottom: 25px;\n        width: 100%;\n        border-right-width: 2px;\n        border-right-style: solid;\n        border-right-color: ${unsafeCSS(_THEME.colors.default_borders_color)};\n        overflow: hidden;\n        word-wrap: break-word;\n    }\n\n    .detail-element-container:last-of-type {\n        border-right: none;\n    }\n\n    .download {\n        cursor: pointer;\n        font-weight: bold;\n    }\n\n    .download:hover {\n        background-color: rgba(231, 47, 54, 0.2);\n    }\n\n    .detail-image-container {\n        height: inherit;\n        text-align: center;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n\n    .detail-image {\n        max-height: 200px;\n    }\n\n    .detail-description-container {\n        color: ${unsafeCSS(_THEME.colors.default_accent_color)};\n        width: 100%;\n        word-wrap: break-word;\n    }\n\n    .detail-table-container {\n        ${vertical}\n    }\n\n    .detail-table-row {\n        padding: 10px 0 10px 0;\n        height: 30px;\n        border-bottom-width: 2px;\n        border-bottom-style: solid;\n        border-bottom-color: ${unsafeCSS(_THEME.colors.default_borders_color)};\n        ${displayFlex}\n        ${horizontal}\n    }\n\n    .detail-table-row:last-of-type {\n        border-bottom: none;\n    }\n\n    .detail-table-key {\n        padding-right: 10px;\n        width: 100%;\n        align-self: center;\n        font-weight: bold;\n    }\n\n    .detail-table-value {\n        width: 100%;\n        align-self: center;\n        color: ${unsafeCSS(_THEME.colors.default_accent_color)};\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        ${wrap}\n    }\n\n    iron-icon {\n        fill: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n        left: 0em;\n\n    }\n\n    :host iron-icon {\n        cursor: pointer;\n    }\n\n    .menu-icon {\n        background-color: ${unsafeCSS(_THEME.colors.selected_burger_menu)};\n    }\n\n    .menu-icon-color {\n        margin-left: 0px;\n        fill: ${unsafeCSS(_THEME.colors.default_accent_color)};\n        stroke: ${unsafeCSS(_THEME.colors.default_accent_color)};\n        stroke-width: 1;\n        left: 0em;\n\n    }\n\n    .menu-icon-color:hover {\n        background-color: ${unsafeCSS(_THEME.colors.selected_burger_menu)};\n    }\n\n    .menu-item {\n        cursor: pointer;\n        padding: 0.5em 1em;\n        color: ${unsafeCSS(_THEME.colors.icons_active_color)};\n        background: none;\n        font-size: 11px;\n        transition: background 250ms ease 0s, color 250ms ease 0s;\n    }\n\n    .menu-item:hover {\n        cursor: pointer;\n        padding: 0.5em 1em;\n        color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n        background: ${unsafeCSS(_THEME.colors.fab_background)};\n        font-size: 11px;\n        transition: background 250ms ease 0s, color 250ms ease 0s;\n    }\n\n    .menu-border {\n        box-shadow: #888888 0px 0px 3px;\n        border: 1px solid ${unsafeCSS(_THEME.colors.secondary_note_color)};\n        background: ${unsafeCSS(_THEME.colors.primary_background_color)};\n        padding: 5px 0px;\n    }\n\n    .contextmenu {\n        font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n        position: absolute;\n        z-index: 1000;\n        pointer-events: auto;\n        display: block;\n        right: 85px;\n        top: 15.5em;\n    }\n\n    @media only screen and (min-width: 600px ) {\n        .disabledOnPad {\n            display: none;\n        }\n\n        .contextmenu {\n            right: 50px;\n            top: 15.5em;\n        }\n    }\n\n    @media only screen and (min-width: 1024px ) {\n        .disabledOnPad {\n            display: inline;\n        }\n\n        .contextmenu {\n            right: 72px;\n            top: 15.5em;\n        }\n    }\n\n    @media only screen and (min-width: 1260px ) {\n        .disabledOnPad {\n            display: inline;\n        }\n\n        .contextmenu {\n            right: 110px;\n            top: 15.5em;\n        }\n    }\n\n\n\n`;\n\nexport default LdAssetsHeaderStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\nimport { connect } from 'pwa-helpers/connect-mixin';\nimport {\n  map, tileLayer, marker, Icon, featureGroup\n} from 'leaflet/dist/leaflet-src.esm';\nimport { store } from '../../../../ld-redux/ld-redux-store';\nimport { LdI18NextMixin } from '../../../../ld-application/i18n/ld-i18next';\nimport { LdPlatformModulesLeafletStyles } from './styles';\n\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\nimport { getUUID, remapList } from '../../../../../js/LdGlobal';\n\n\nclass assetsMap extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      _userInformation: { type: Object, hasChanged: () => true },\n      _locations: { type: Object, hasChanged: () => true },\n      _map: { type: Object, hasChanged: () => true },\n      layerGroupName: { type: String, hasChanged: () => true },\n      items: { type: Object, hasChanged: () => true },\n      urlBase: { type: String, hasChanged: () => true },\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdPlatformModulesLeafletStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    if (typeof this._map !== 'undefined') {\n      tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n        id: 'mapbox.streets',\n        attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n      }).addTo(this._map);\n      const markers = [];\n      this.items.forEach(item => {\n        if (item.address.coordinates !== null && item.address.coordinates.latitude != null && item.address.coordinates.longitude != null) {\n          markers.push(marker([item.address.coordinates.latitude, item.address.coordinates.longitude]).bindPopup(`<a href=\"${this.urlBase}${getUUID(item)}\">${item.name}</a> <br> ${item.description}`));\n        }\n      });\n      const group = featureGroup(markers).addTo(this._map);\n      this._map.fitBounds(group.getBounds());\n    }\n    return html`\n      <div id='map' style='height: 740px;'></div>\n    `;\n  }\n\n  firstUpdated() {\n    this._map = map(this.shadowRoot.querySelector('#map'), {\n      center: [48.26015, 8.48824],\n      zoom: 15,\n      flexToSize: true,\n      fitToMarkers: true,\n      fitToMarkersPadding: 1,\n      fitToMarkersZoom: 'max'\n    });\n    Icon.Default.imagePath = '/images/dashboard/worldmap/';\n  }\n\n}\n\ncustomElements.define('ld-assets-map', assetsMap);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css } from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\n\nexport const LdPlatformModulesLeafletStyles = css`\n      .leaflet-pane,\n      .leaflet-tile,\n      .leaflet-marker-icon,\n      .leaflet-marker-shadow,\n      .leaflet-tile-container,\n      .leaflet-pane > svg,\n      .leaflet-pane > canvas,\n      .leaflet-zoom-box,\n      .leaflet-image-layer,\n      .leaflet-layer {\n        position: absolute;\n        left: 0;\n        top: 0;\n        }\n      .leaflet-container {\n        overflow: hidden;\n        }\n      .leaflet-tile,\n      .leaflet-marker-icon,\n      .leaflet-marker-shadow {\n        -webkit-user-select: none;\n          -moz-user-select: none;\n                user-select: none;\n          -webkit-user-drag: none;\n        }\n      /* Safari renders non-retina tile on retina better with this, but Chrome is worse */\n      .leaflet-safari .leaflet-tile {\n        image-rendering: -webkit-optimize-contrast;\n        }\n      /* hack that prevents hw layers \"stretching\" when loading new tiles */\n      .leaflet-safari .leaflet-tile-container {\n        width: 1600px;\n        height: 1600px;\n        -webkit-transform-origin: 0 0;\n        }\n      .leaflet-marker-icon,\n      .leaflet-marker-shadow {\n        display: block;\n        }\n      /* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */\n      /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */\n      .leaflet-container .leaflet-overlay-pane svg,\n      .leaflet-container .leaflet-marker-pane img,\n      .leaflet-container .leaflet-shadow-pane img,\n      .leaflet-container .leaflet-tile-pane img,\n      .leaflet-container img.leaflet-image-layer,\n      .leaflet-container .leaflet-tile {\n        max-width: none !important;\n        max-height: none !important;\n        }\n\n      .leaflet-container.leaflet-touch-zoom {\n        -ms-touch-action: pan-x pan-y;\n        touch-action: pan-x pan-y;\n        }\n      .leaflet-container.leaflet-touch-drag {\n        -ms-touch-action: pinch-zoom;\n        /* Fallback for FF which doesn't support pinch-zoom */\n        touch-action: none;\n        touch-action: pinch-zoom;\n      }\n      .leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {\n        -ms-touch-action: none;\n        touch-action: none;\n      }\n      .leaflet-container {\n        -webkit-tap-highlight-color: transparent;\n      }\n      .leaflet-container a {\n        -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);\n      }\n      .leaflet-tile {\n        filter: inherit;\n        visibility: hidden;\n        }\n      .leaflet-tile-loaded {\n        visibility: inherit;\n        }\n      .leaflet-zoom-box {\n        width: 0;\n        height: 0;\n        -moz-box-sizing: border-box;\n            box-sizing: border-box;\n        z-index: 80;\n        }\n      /* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\n      .leaflet-overlay-pane svg {\n        -moz-user-select: none;\n        }\n\n      .leaflet-pane         { z-index: 40; }\n\n      .leaflet-tile-pane    { z-index: 20; }\n      .leaflet-overlay-pane { z-index: 40; }\n      .leaflet-shadow-pane  { z-index: 50; }\n      .leaflet-marker-pane  { z-index: 60; }\n      .leaflet-tooltip-pane   { z-index: 65; }\n      .leaflet-popup-pane   { z-index: 70; }\n\n      .leaflet-map-pane canvas { z-index: 10; }\n      .leaflet-map-pane svg    { z-index: 20; }\n\n      .leaflet-vml-shape {\n        width: 1px;\n        height: 1px;\n        }\n      .lvml {\n        behavior: url(#default#VML);\n        display: inline-block;\n        position: absolute;\n        }\n\n\n      /* control positioning */\n\n      .leaflet-control {\n        position: relative;\n        z-index: 80;\n        pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\n        pointer-events: auto;\n        }\n      .leaflet-top,\n      .leaflet-bottom {\n        position: absolute;\n        z-index: 100;\n        pointer-events: none;\n        }\n      .leaflet-top {\n        top: 0;\n        }\n      .leaflet-right {\n        right: 0;\n        }\n      .leaflet-bottom {\n        bottom: 0;\n        }\n      .leaflet-left {\n        left: 0;\n        }\n      .leaflet-control {\n        float: left;\n        clear: both;\n        }\n      .leaflet-right .leaflet-control {\n        float: right;\n        }\n      .leaflet-top .leaflet-control {\n        margin-top: 10px;\n        }\n      .leaflet-bottom .leaflet-control {\n        margin-bottom: 10px;\n        }\n      .leaflet-left .leaflet-control {\n        margin-left: 10px;\n        }\n      .leaflet-right .leaflet-control {\n        margin-right: 10px;\n        }\n\n\n      /* zoom and fade animations */\n\n      .leaflet-fade-anim .leaflet-tile {\n        will-change: opacity;\n        }\n      .leaflet-fade-anim .leaflet-popup {\n        opacity: 0;\n        -webkit-transition: opacity 0.2s linear;\n          -moz-transition: opacity 0.2s linear;\n                transition: opacity 0.2s linear;\n        }\n      .leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\n        opacity: 1;\n        }\n      .leaflet-zoom-animated {\n        -webkit-transform-origin: 0 0;\n            -ms-transform-origin: 0 0;\n                transform-origin: 0 0;\n        }\n      .leaflet-zoom-anim .leaflet-zoom-animated {\n        will-change: transform;\n        }\n      .leaflet-zoom-anim .leaflet-zoom-animated {\n        -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\n          -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\n                transition:         transform 0.25s cubic-bezier(0,0,0.25,1);\n        }\n      .leaflet-zoom-anim .leaflet-tile,\n      .leaflet-pan-anim .leaflet-tile {\n        -webkit-transition: none;\n          -moz-transition: none;\n                transition: none;\n        }\n\n      .leaflet-zoom-anim .leaflet-zoom-hide {\n        visibility: hidden;\n        }\n\n\n      /* cursors */\n\n      .leaflet-interactive {\n        cursor: pointer;\n        }\n      .leaflet-grab {\n        cursor: -webkit-grab;\n        cursor:    -moz-grab;\n        cursor:         grab;\n        }\n      .leaflet-crosshair,\n      .leaflet-crosshair .leaflet-interactive {\n        cursor: crosshair;\n        }\n      .leaflet-popup-pane,\n      .leaflet-control {\n        cursor: auto;\n        }\n      .leaflet-dragging .leaflet-grab,\n      .leaflet-dragging .leaflet-grab .leaflet-interactive,\n      .leaflet-dragging .leaflet-marker-draggable {\n        cursor: move;\n        cursor: -webkit-grabbing;\n        cursor:    -moz-grabbing;\n        cursor:         grabbing;\n        }\n\n      /* marker & overlays interactivity */\n      .leaflet-marker-icon,\n      .leaflet-marker-shadow,\n      .leaflet-image-layer,\n      .leaflet-pane > svg path,\n      .leaflet-tile-container {\n        pointer-events: none;\n        }\n\n      .leaflet-marker-icon.leaflet-interactive,\n      .leaflet-image-layer.leaflet-interactive,\n      .leaflet-pane > svg path.leaflet-interactive {\n        pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\n        pointer-events: auto;\n        }\n\n      /* visual tweaks */\n\n      .leaflet-container {\n        background: #ddd;\n        outline: 0;\n        }\n      .leaflet-container a {\n        color: #0078A8;\n        }\n      .leaflet-container a.leaflet-active {\n        outline: 2px solid orange;\n        }\n      .leaflet-zoom-box {\n        border: 2px dotted #38f;\n        background: rgba(255,255,255,0.5);\n        }\n\n\n      /* general typography */\n      .leaflet-container {\n        font: 12px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n        }\n\n\n      /* general toolbar styles */\n\n      .leaflet-bar {\n        box-shadow: 0 1px 5px rgba(0,0,0,0.65);\n        border-radius: 4px;\n        }\n      .leaflet-bar a,\n      .leaflet-bar a:hover {\n        background-color: #fff;\n        border-bottom: 1px solid #ccc;\n        width: 26px;\n        height: 26px;\n        line-height: 26px;\n        display: block;\n        text-align: center;\n        text-decoration: none;\n        color: black;\n        }\n      .leaflet-bar a,\n      .leaflet-control-layers-toggle {\n        background-position: 50% 50%;\n        background-repeat: no-repeat;\n        display: block;\n        }\n      .leaflet-bar a:hover {\n        background-color: #f4f4f4;\n        }\n      .leaflet-bar a:first-child {\n        border-top-left-radius: 4px;\n        border-top-right-radius: 4px;\n        }\n      .leaflet-bar a:last-child {\n        border-bottom-left-radius: 4px;\n        border-bottom-right-radius: 4px;\n        border-bottom: none;\n        }\n      .leaflet-bar a.leaflet-disabled {\n        cursor: default;\n        background-color: #f4f4f4;\n        color: #bbb;\n        }\n\n      .leaflet-touch .leaflet-bar a {\n        width: 30px;\n        height: 30px;\n        line-height: 30px;\n        }\n      .leaflet-touch .leaflet-bar a:first-child {\n        border-top-left-radius: 2px;\n        border-top-right-radius: 2px;\n        }\n      .leaflet-touch .leaflet-bar a:last-child {\n        border-bottom-left-radius: 2px;\n        border-bottom-right-radius: 2px;\n        }\n\n      /* zoom control */\n\n      .leaflet-control-zoom-in,\n      .leaflet-control-zoom-out {\n        font: bold 18px 'Lucida Console', Monaco, monospace;\n        text-indent: 1px;\n        }\n\n      .leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {\n        font-size: 22px;\n        }\n\n\n      /* layers control */\n\n      .leaflet-control-layers {\n        box-shadow: 0 1px 5px rgba(0,0,0,0.4);\n        background: #fff;\n        border-radius: 5px;\n        }\n      .leaflet-control-layers-toggle {\n        background-image: url(images/layers.png);\n        width: 36px;\n        height: 36px;\n        }\n      .leaflet-retina .leaflet-control-layers-toggle {\n        background-image: url(images/layers-2x.png);\n        background-size: 26px 26px;\n        }\n      .leaflet-touch .leaflet-control-layers-toggle {\n        width: 44px;\n        height: 44px;\n        }\n      .leaflet-control-layers .leaflet-control-layers-list,\n      .leaflet-control-layers-expanded .leaflet-control-layers-toggle {\n        display: none;\n        }\n      .leaflet-control-layers-expanded .leaflet-control-layers-list {\n        display: block;\n        position: relative;\n        }\n      .leaflet-control-layers-expanded {\n        padding: 6px 10px 6px 6px;\n        color: #333;\n        background: #fff;\n        }\n      .leaflet-control-layers-scrollbar {\n        overflow-y: scroll;\n        overflow-x: hidden;\n        padding-right: 5px;\n        }\n      .leaflet-control-layers-selector {\n        margin-top: 2px;\n        position: relative;\n        top: 1px;\n        }\n      .leaflet-control-layers label {\n        display: block;\n        }\n      .leaflet-control-layers-separator {\n        height: 0;\n        border-top: 1px solid #ddd;\n        margin: 5px -10px 5px -6px;\n        }\n\n      /* Default icon URLs */\n      .leaflet-default-icon-path {\n        background-image: url(images/marker-icon.png);\n        }\n\n\n      /* attribution and scale controls */\n\n      .leaflet-container .leaflet-control-attribution {\n        background: #fff;\n        background: rgba(255, 255, 255, 0.7);\n        margin: 0;\n        }\n      .leaflet-control-attribution,\n      .leaflet-control-scale-line {\n        padding: 0 5px;\n        color: #333;\n        }\n      .leaflet-control-attribution a {\n        text-decoration: none;\n        }\n      .leaflet-control-attribution a:hover {\n        text-decoration: underline;\n        }\n      .leaflet-container .leaflet-control-attribution,\n      .leaflet-container .leaflet-control-scale {\n        font-size: 11px;\n        }\n      .leaflet-left .leaflet-control-scale {\n        margin-left: 5px;\n        }\n      .leaflet-bottom .leaflet-control-scale {\n        margin-bottom: 5px;\n        }\n      .leaflet-control-scale-line {\n        border: 2px solid #777;\n        border-top: none;\n        line-height: 1.1;\n        padding: 2px 5px 1px;\n        font-size: 11px;\n        white-space: nowrap;\n        overflow: hidden;\n        -moz-box-sizing: border-box;\n            box-sizing: border-box;\n\n        background: #fff;\n        background: rgba(255, 255, 255, 0.5);\n        }\n      .leaflet-control-scale-line:not(:first-child) {\n        border-top: 2px solid #777;\n        border-bottom: none;\n        margin-top: -2px;\n        }\n      .leaflet-control-scale-line:not(:first-child):not(:last-child) {\n        border-bottom: 2px solid #777;\n        }\n\n      .leaflet-touch .leaflet-control-attribution,\n      .leaflet-touch .leaflet-control-layers,\n      .leaflet-touch .leaflet-bar {\n        box-shadow: none;\n        }\n      .leaflet-touch .leaflet-control-layers,\n      .leaflet-touch .leaflet-bar {\n        border: 2px solid rgba(0,0,0,0.2);\n        background-clip: padding-box;\n        }\n\n\n      /* popup */\n\n      .leaflet-popup {\n        position: absolute;\n        text-align: center;\n        margin-bottom: 20px;\n        }\n      .leaflet-popup-content-wrapper {\n        padding: 1px;\n        text-align: left;\n        border-radius: 12px;\n        }\n      .leaflet-popup-content {\n        margin: 13px 19px;\n        line-height: 1.4;\n        }\n      .leaflet-popup-content p {\n        margin: 18px 0;\n        }\n      .leaflet-popup-tip-container {\n        width: 40px;\n        height: 20px;\n        position: absolute;\n        left: 50%;\n        margin-left: -20px;\n        overflow: hidden;\n        pointer-events: none;\n        }\n      .leaflet-popup-tip {\n        width: 17px;\n        height: 17px;\n        padding: 1px;\n\n        margin: -10px auto 0;\n\n        -webkit-transform: rotate(45deg);\n          -moz-transform: rotate(45deg);\n            -ms-transform: rotate(45deg);\n                transform: rotate(45deg);\n        }\n      .leaflet-popup-content-wrapper,\n      .leaflet-popup-tip {\n        background: white;\n        color: #333;\n        box-shadow: 0 3px 14px rgba(0,0,0,0.4);\n        }\n      .leaflet-container a.leaflet-popup-close-button {\n        position: absolute;\n        top: 0;\n        right: 0;\n        padding: 4px 4px 0 0;\n        border: none;\n        text-align: center;\n        width: 18px;\n        height: 14px;\n        font: 16px/14px Tahoma, Verdana, sans-serif;\n        color: #c3c3c3;\n        text-decoration: none;\n        font-weight: bold;\n        background: transparent;\n        }\n      .leaflet-container a.leaflet-popup-close-button:hover {\n        color: #999;\n        }\n      .leaflet-popup-scrolled {\n        overflow: auto;\n        border-bottom: 1px solid #ddd;\n        border-top: 1px solid #ddd;\n        }\n\n      .leaflet-oldie .leaflet-popup-content-wrapper {\n        zoom: 1;\n        }\n      .leaflet-oldie .leaflet-popup-tip {\n        width: 24px;\n        margin: 0 auto;\n\n        -ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\";\n        filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\n        }\n      .leaflet-oldie .leaflet-popup-tip-container {\n        margin-top: -1px;\n        }\n\n      .leaflet-oldie .leaflet-control-zoom,\n      .leaflet-oldie .leaflet-control-layers,\n      .leaflet-oldie .leaflet-popup-content-wrapper,\n      .leaflet-oldie .leaflet-popup-tip {\n        border: 1px solid #999;\n        }\n\n\n      /* div icon */\n\n      .leaflet-div-icon {\n        background: #fff;\n        border: 1px solid #666;\n        }\n\n\n      /* Tooltip */\n      /* Base styles for the element that has a tooltip */\n      .leaflet-tooltip {\n        position: absolute;\n        padding: 6px;\n        background-color: #fff;\n        border: 1px solid #fff;\n        border-radius: 3px;\n        color: #222;\n        white-space: nowrap;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n        pointer-events: none;\n        box-shadow: 0 1px 3px rgba(0,0,0,0.4);\n        }\n      .leaflet-tooltip.leaflet-clickable {\n        cursor: pointer;\n        pointer-events: auto;\n        }\n      .leaflet-tooltip-top:before,\n      .leaflet-tooltip-bottom:before,\n      .leaflet-tooltip-left:before,\n      .leaflet-tooltip-right:before {\n        position: absolute;\n        pointer-events: none;\n        border: 6px solid transparent;\n        background: transparent;\n        content: \"\";\n        }\n\n      /* Directions */\n\n      .leaflet-tooltip-bottom {\n        margin-top: 6px;\n      }\n      .leaflet-tooltip-top {\n        margin-top: -6px;\n      }\n      .leaflet-tooltip-bottom:before,\n      .leaflet-tooltip-top:before {\n        left: 50%;\n        margin-left: -6px;\n        }\n      .leaflet-tooltip-top:before {\n        bottom: 0;\n        margin-bottom: -12px;\n        border-top-color: #fff;\n        }\n      .leaflet-tooltip-bottom:before {\n        top: 0;\n        margin-top: -12px;\n        margin-left: -6px;\n        border-bottom-color: #fff;\n        }\n      .leaflet-tooltip-left {\n        margin-left: -6px;\n      }\n      .leaflet-tooltip-right {\n        margin-left: 6px;\n      }\n      .leaflet-tooltip-left:before,\n      .leaflet-tooltip-right:before {\n        top: 50%;\n        margin-top: -6px;\n        }\n      .leaflet-tooltip-left:before {\n        right: 0;\n        margin-right: -12px;\n        border-left-color: #fff;\n        }\n      .leaflet-tooltip-right:before {\n        left: 0;\n        margin-left: -12px;\n        border-right-color: #fff;\n        }\n`;\nexport default LdPlatformModulesLeafletStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit-element';\nimport { css as css_lit, unsafeCSS as unsafeCSS_lit } from 'lit';\nimport { _THEME } from '../../../../themes/styles';\n\nconst makeStyles = (cssImpl, unsafeCSSImpl) => cssImpl`\n  :host {\n    display: flex;\n    flex-direction: row;\n    flex: auto;\n  }\n\n  ::part(ld-part-checkbox) {\n    margin-left: 10px;\n  }\n\n  ld-performance-display-counter {\n    height: 100%;\n    display: block;\n    margin-top: -45px;\n    margin-left: -163px;\n    z-index: 1000;\n    position: fixed;\n    width: 100%;\n    background-color: white;\n  }\n\n  paper-fab.fab-item-left {\n    margin: 0 28px 0 -28px;\n    --paper-fab-background: ${unsafeCSSImpl(_THEME.colors.fab_background)};\n    margin-left: -80px;\n\n  }\n\n  div.fab-container {\n    position: absolute;\n    top: 164px;\n    left: 86px;\n    --paper-fab-background: ${unsafeCSSImpl(_THEME.colors.fab_background)};\n    z-index: 100;\n  }\n\n  div.fab-container > paper-fab {\n    margin-bottom: 8px;\n  }\n\n  div.fab-container > paper-fab.discard {\n    --paper-fab-background: ${unsafeCSSImpl(_THEME.colors.fab_secondary_background)};\n  }\n\n  dialog {\n    --fade-in-duration: 0.2s;\n\n    border: none;\n    padding: 25px;\n    box-shadow: 0px 2.8px 2.2px rgba(0, 0, 0, 0.02),\n    0px 6.7px 5.3px rgba(0, 0, 0, 0.028),\n    0px 12.5px 10px rgba(0, 0, 0, 0.035),\n    0px 22.3px 17.9px rgba(0, 0, 0, 0.042),\n    0px 41.8px 33.4px rgba(0, 0, 0, 0.05),\n    0px 100px 80px rgba(0, 0, 0, 0.07);\n\n    -webkit-animation: fadein var(--fade-in-duration); /* Safari, Chrome and Opera > 12.1 */\n    -moz-animation: fadein var(--fade-in-duration); /* Firefox < 16 */\n    -ms-animation: fadein var(--fade-in-duration); /* Internet Explorer */\n    -o-animation: fadein var(--fade-in-duration); /* Opera < 12.1 */\n    animation: fadein var(--fade-in-duration);\n  }\n\n  dialog::backdrop {\n    background: rgba(0, 0, 0, 0.7);\n  }\n\n  dialog .loader {\n    display: none;\n  }\n\n  dialog.busy .loader {\n    display: initial;\n  }\n  \n  .biggerDialog {\n    width:40%; height:90%;\n  }\n\n  .modal-title {\n    color: ${unsafeCSSImpl(_THEME.colors.secondary_text_color)};\n    font-weight: bold;\n    font-size: 16px;\n    line-height: 22px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n  }\n\n  .form-actions {\n    display: flex;\n    flex-direction: row;\n    margin-block-start: 25px;\n    min-height: 60px;\n  }\n\n  .button-alignment {\n    justify-content: flex-end;\n    display: flex;\n  }\n\n  paper-button.primary-action {\n    text-transform: uppercase;\n  }\n\n  paper-button.secondary-action {\n    text-transform: uppercase;\n  }\n\n  paper-button + paper-button {\n    margin-inline-start: 6px;\n  }\n\n  .primary-and-secondary-form-actions {\n    flex: 1 1 auto;\n    display: flex;\n    justify-content: flex-end;\n  }\n\n  .detail-container {\n    width: calc(100% - 50px);\n    height: auto;\n    padding: 0;\n    margin: 20px 0 20px 50px;\n    background-color: var(--platform-assets-detail-view-background-color, var(--sw-primary-background-color, #f1f1f1));\n    color: #000;\n  @apply --layout-vertical;\n  @apply --layout-wrap;\n  }\n\n  .detail-header-container {\n    height: 60px;\n  @apply --layout-horizontal;\n  @apply --layout-wrap;\n  }\n\n  .detail-header {\n    width: 90%;\n    max-width: 800px;\n  }\n\n  .detail-header h2 {\n    margin-left: 25px;\n    width: 100%;\n    text-transform: uppercase;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    max-width: 100%;\n    color: #142231;\n  }\n\n  .detail-header h2::before {\n    content: \"/ \";\n    color: var(--platform-frame-assets-highlight-color, var(--sw-primary-highlight-color, #eb0028));\n  }\n\n  h2 {\n    max-width: 100%;\n    font-size: 15px;\n  }\n\n  .detail-header-collapse {\n    margin: auto;\n    text-align: center;\n    width: 10%\n  }\n\n  .align-center {\n    text-align: center;\n  }\n\n  paper-button {\n    margin: 12px 0px;\n    background-color: ${unsafeCSSImpl(_THEME.colors.button_background_color)};\n    color: ${unsafeCSSImpl(_THEME.colors.primary_color)};\n    font-weight: bold;\n    padding-inline: 20px;\n  }\n\n  paper-input, paper-dropdown-menu {\n    margin-bottom: 10px;\n  }\n\n  .grid-container {\n    width: calc(100% - 0px);\n    display: flex;\n    flex-direction: column;\n    flex: auto;\n  }\n\n  @supports (-ms-ime-align:auto) {\n\n    .grid-container {\n      width: calc(100% - 0px);\n      height: 80%;\n      margin-left: 50px;\n    }\n  }\n\n  .container {\n    width: calc(100% - 50px);\n  }\n\n  .headline {\n    background-color: #fff;\n    height: auto;\n    padding: 2px 5px;\n  }\n\n  .headline h3 {\n    text-transform: uppercase;\n    font-size: 18px;\n    margin-left: 15px;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    color: #142231;\n  }\n\n  .headline h3::before {\n    content: \"/ \";\n    font-weight: 800;\n    color: var(--platform-frame-assets-highlight-color, var(--sw-primary-highlight-color, #eb0028));\n  }\n\n  .headline + .ld-css-grid {\n    margin: 5px 0 0 0;\n  }\n\n  .ld-css-grid > div > h3 {\n    color: #142231;\n  }\n\n  ::slotted(h3) {\n    background-color: #fff;\n    height: auto;\n    padding: 2px 5px;\n    text-transform: uppercase;\n    font-size: 18px;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    color: #000;\n  }\n\n  ::slotted(h3)::before {\n    content: \"/ \";\n    font-weight: 800;\n    color: var(--platform-frame-assets-highlight-color, var(--sw-primary-highlight-color, #eb0028));\n  }\n  @media only screen and (min-width: 600px ) {\n    .inner-container {\n      margin: 0 auto;\n      width: 28em;\n    }\n\n    .outer-container {\n      background-color: #fff;\n      width: calc(100% - 100px);\n      margin-left: 0px;\n      padding: 25px;\n    }\n\n    .detail-container {\n      width: calc(100% - 50px);\n      height: auto;\n      padding: 0;\n      margin: 20px 0 20px 0px;\n      background-color: var(--platform-assets-detail-view-background-color, var(--sw-primary-background-color, #f1f1f1));\n      color: #000;\n    @apply --layout-vertical;\n    @apply --layout-wrap;\n    }\n  }\n  @media only screen and (min-width: 1260px ) {\n    .inner-container {\n      margin: 0 auto;\n      width: 50em;\n    }\n\n    .outer-container {\n      background-color: #fff;\n      width: calc(100% - 100px);\n      margin-left: 0px;\n      padding: 25px;\n    }\n\n    .detail-container {\n      width: calc(100% - 50px);\n      height: auto;\n      padding: 0;\n      margin: 20px 0 20px 0px;\n      background-color: var(--platform-assets-detail-view-background-color, var(--sw-primary-background-color, #f1f1f1));\n      color: #000;\n    @apply --layout-vertical;\n    @apply --layout-wrap;\n    }\n  }\n\n  paper-toggle-button.red {\n    --paper-toggle-button-checked-bar-color: ${unsafeCSSImpl(_THEME.colors.primary_highlight_color)};\n    --paper-toggle-button-checked-button-color: ${unsafeCSSImpl(_THEME.colors.primary_highlight_color)};\n    --paper-toggle-button-checked-ink-color: ${unsafeCSSImpl(_THEME.colors.primary_highlight_color)};\n  }\n\n`\n\nexport const LdPlatformModulesAssetsStyles = makeStyles(css, unsafeCSS);\nexport const LdPlatformModulesAssetsStyles_lit = makeStyles(css_lit, unsafeCSS_lit);\n\nexport default LdPlatformModulesAssetsStyles;\n","/* eslint-disable import/no-cycle */\n/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\nimport LdFetch from '../../../js/LdFetch';\nimport {baseConfig} from '../../../auto-generated/config';\nimport '../../ld-login-application';\n\nexport const UPDATE_LOCATION = 'UPDATE_LOCATION';\nexport const START_LOADING_SUBMIT = 'START_LOADING_SUBMIT';\nexport const FINISH_LOADING_SUBMIT = 'FINISH_LOADING_SUBMIT';\nexport const ERROR_LOADING_SUBMIT = 'ERROR_LOADING_SUBMIT';\nexport const CLEAR_SUBMIT = 'CLEAR_SUBMIT';\nexport const START_LOADING_MANUALS = 'START_LOADING_MANUALS';\nexport const FINISH_LOADING_MANUALS = 'FINISH_LOADING_MANUALS';\nexport const ERROR_LOADING_MANUALS = 'ERROR_LOADING_MANUALS';\nexport const START_DOWNLOAD_LOADING_FILES = 'START_DOWNLOAD_LOADING_FILES';\nexport const FINISH_DOWNLOAD_LOADING_FILES = 'FINISH_DOWNLOAD_LOADING_FILES';\nexport const ERROR_DOWNLOAD_LOADING_FILES = 'ERROR_DOWNLOAD_LOADING_FILES';\nexport const CLEAR_DOWNLOAD_LOADING_MANUALS = 'CLEAR_DOWNLOAD_LOADING_MANUALS';\nexport const START_UPLOAD = 'START_UPLOAD';\nexport const FINISH_UPLOAD = 'FINISH_UPLOAD';\nexport const ERROR_UPLOAD = 'ERROR_UPLOAD';\nexport const ERROR_LOADING_VERSIONS = 'ERROR_LOADING_VERSIONS';\nexport const FINISH_LOADING_VERSIONS = 'FINISH_LOADING_VERSIONS';\nexport const START_LOADING_VERSIONS = 'START_LOADING_VERSIONS';\nexport const FINISH_LOADING_RELEASE_INFO = 'FINISH_LOADING_RELEASE_INFO';\nexport const ERROR_LOADING_RELEASE_INFO = 'ERROR_LOADING_RELEASE_INFO';\nexport const START_LOADING_RELEASE_INFO = 'START_LOADING_RELEASE_INFO';\nexport const FINISH_FILES_DELETE = 'FINISH_FILES_DELETE';\nexport const START_FILES_DELETE = 'START_FILES_DELETE';\nexport const ERROR_FILES_DELETE = 'ERROR_FILES_DELETE';\nexport const START_LOADING_SUBMIT_NAME = 'START_LOADING_SUBMIT_NAME';\nexport const FINISH_LOADING_SUBMIT_NAME = 'FINISH_LOADING_SUBMIT_NAME';\nexport const ERROR_LOADING_SUBMIT_NAME = 'ERROR_LOADING_SUBMIT_NAME';\nexport const FINISH_LOADING_UPLOAD = 'FINISH_LOADING_UPLOAD';\nexport const START_LOADING_UPLOAD = 'START_LOADING_UPLOAD';\nexport const ERROR_LOADING_UPLOAD = 'ERROR_LOADING_UPLOAD';\nexport const FINISH_LOADING_NCSTATE = 'FINISH_LOADING_NCSTATE';\nexport const START_LOADING_NCSTATE = 'START_LOADING_NCSTATE';\nexport const ERROR_LOADING_NCSTATE = 'ERROR_LOADING_NCSTATE';\nexport const FINISH_LOADING_TVGROUPS = 'FINISH_LOADING_TVGROUPS';\nexport const START_LOADING_TVGROUPS = 'START_LOADING_TVGROUPS';\nexport const ERROR_LOADING_TVGROUPS = 'ERROR_LOADING_TVGROUPS';\nexport const FINISH_POST_TV = 'FINISH_POST_TV';\nexport const START_POST_TV = 'START_POST_TV';\nexport const ERROR_POST_TV = 'ERROR_POST_TV';\nexport const FINISH_LOADING_TVDEPLOYMENT = 'FINISH_LOADING_TVDEPLOYMENT';\nexport const START_LOADING_TVDEPLOYMENT = 'START_LOADING_TVDEPLOYMENT';\nexport const ERROR_LOADING_TVDEPLOYMENT = 'ERROR_LOADING_TVDEPLOYMENT';\nexport const FINISH_LOADING_TVLINKS = 'FINISH_LOADING_TVLINKS';\nexport const START_LOADING_TVLINKS = 'START_LOADING_TVLINKS';\nexport const ERROR_LOADING_TVLINKS = 'ERROR_LOADING_TVLINKS';\nexport const START_LOADING_GROUPS = 'START_LOADING_GROUPS';\nexport const FINISH_LOADING_GROUPS = 'FINISH_LOADING_GROUPS';\nexport const ERROR_LOADING_GROUPS = 'ERROR_LOADING_GROUPS';\nexport const START_ADD = 'START_ADD';\nexport const FINISH_ADD = 'FINISH_ADD';\nexport const ERROR_ADD = 'ERROR_ADD';\nexport const START_EDIT = 'START_EDIT';\nexport const FINISH_EDIT = 'FINISH_EDIT';\nexport const ERROR_EDIT = 'ERROR_EDIT';\nexport const START_DELETE = 'START_DELETE';\nexport const FINISH_DELETE = 'FINISH_DELETE';\nexport const ERROR_DELETE = 'ERROR_DELETE';\n\nexport const FINISH_LOADING_LINKS = 'FINISH_LOADING_LINKS';\nexport const START_LOADING_LINKS = 'START_LOADING_LINKS';\nexport const ERROR_LOADING_LINKS = 'ERROR_LOADING_LINKS';\n\nexport const updateLocation = location => async (dispatch, getState) => {\n    const _decodedPathname = window.decodeURIComponent(location.pathname);\n    let path = _decodedPathname;\n    if (_decodedPathname === '/') {\n        window.history.replaceState('object or string', 'Title', '/dashboard'); // replaceState() instead of pushState() as we don't want the user to have '/' in history\n        path = '/dashboard';\n    }\n\n    const splitPath = (path || '').slice(1).split('/');\n    let pageModule = splitPath[0];\n    const subModules = splitPath;\n\n    /**\n     * TODO: this should be removed before going live!\n     * For development reasons!\n     */\n\n    switch (pageModule) {\n        case 'assets':\n            await import('../../ld-platform/modules/assets/module.js');\n            break;\n        case 'users':\n            await import('../../ld-platform/modules/users/module');\n            break;\n        case 'dashboard':\n            await import('../../ld-platform/modules/dashboard/module.js');\n            break;\n        case 'qs':\n            await import('../../ld-platform/modules/qs/module.js');\n            break;\n        case 'settings':\n            await import('../../ld-platform/modules/settings/module');\n            break;\n        case 'login':\n            await import('../../../views/login/login-view');\n            break;\n        case 'forgot-password':\n            await import('../../../views/forgot-password/forgot-password-view');\n            break;\n        case 'new-password':\n            await import('../../../views/forgot-password/create-new-password-view');\n            break;\n        case 'change-password':\n            await import('../../../views/change-password/change-password-view');\n            break;\n        case 'netcfg':\n            await import('../../../../node_modules/@lifedata/ui-netcfg/dist/application/index');\n            break;\n        default:\n            pageModule = '404';\n            await import('../../ld-platform/modules/ld-404.js');\n            break;\n    }\n\n    dispatch({\n        type: UPDATE_LOCATION,\n        pageModule,\n        subModules,\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveSubmit = successSubmit => ({\n    type: FINISH_LOADING_SUBMIT,\n    successSubmit,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingSubmit = error => ({\n    type: ERROR_LOADING_SUBMIT,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const submitForm = (url, payload) => dispatch => {\n    dispatch({type: START_LOADING_SUBMIT});\n    return LdFetch.put(`${url}`, payload, successSubmit => {\n        dispatch(receiveSubmit(successSubmit));\n    }, error => {\n        dispatch(errorReceivingSubmit(error));\n    });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveFileUpload = (successUpload, id) => ({\n    type: FINISH_LOADING_UPLOAD,\n    successUpload,\n    id,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorFileUpload = (error, id) => ({\n    type: ERROR_LOADING_UPLOAD,\n    error,\n    id,\n});\n\n// --------------------------------------------------------------------------------------\nexport const fileUpload = (url, payload, id) => dispatch => {\n    dispatch({type: START_LOADING_UPLOAD});\n    return LdFetch.putFile(`${url}`, payload, successUpload => {\n        dispatch(receiveFileUpload(successUpload, id));\n    }, error => {\n        dispatch(errorFileUpload(error, id));\n    });\n};\n\n// --------------------------------------------------------------------------------------\nexport const submitFileForm = (url, payload) => dispatch => {\n    dispatch({type: START_LOADING_SUBMIT});\n    window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    return LdFetch.post(`${url}`, payload, successSubmit => {\n        dispatch(receiveSubmit(successSubmit));\n    }, error => {\n        dispatch(errorReceivingSubmit(error));\n    }, {});\n};\n\nexport const submitPUTFileForm = (url, payload) => (dispatch, getState) => {\n    return new Promise((resolve, reject) => {\n        dispatch({type: START_LOADING_SUBMIT});\n        window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n        LdFetch.put(`${url}`, payload, successSubmit => {\n            dispatch(receiveSubmit(successSubmit));\n            return resolve(getState().LdApplicationReducer.successSubmit)\n        }, error => {\n            dispatch(errorReceivingSubmit(error));\n            return reject(error)\n        }, {});\n    })\n};\n// --------------------------------------------------------------------------------------\nexport const clearSubmitRequest = () => dispatch => {\n    dispatch({type: CLEAR_SUBMIT});\n};\n\n// --------------------------------------------------------------------------------------\nexport const clearManuals = () => ({type: CLEAR_DOWNLOAD_LOADING_MANUALS});\n\n// --------------------------------------------------------------------------------------\nconst receiveServiceManuals = serviceManuals => ({\n    type: FINISH_LOADING_MANUALS,\n    serviceManuals,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingServiceManuals = error => ({\n    type: ERROR_LOADING_MANUALS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadServiceManuals = machineId => dispatch => {\n    dispatch({type: START_LOADING_MANUALS});\n    return LdFetch.get(`${baseConfig.backend.services.manuals.base_url}${baseConfig.backend.services.manuals.endpoints.manuals}/${machineId}/manuals`, serviceManuals => {\n        dispatch(receiveServiceManuals(serviceManuals));\n    }, error => {\n        dispatch(errorReceivingServiceManuals(error));\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nexport const loadFiles = (machineId, name) => dispatch => {\n    dispatch({type: START_LOADING_MANUALS});\n    return LdFetch.get(`${baseConfig.backend.services.manuals.base_url}${baseConfig.backend.services.manuals.endpoints.manuals}/${machineId}/${name}`, serviceManuals => {\n        dispatch(receiveServiceManuals(serviceManuals));\n    }, error => {\n        dispatch(errorReceivingServiceManuals(error));\n    });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveDownloadServiceFiles = (downloadServiceFile, fileId) => ({\n    type: FINISH_DOWNLOAD_LOADING_FILES,\n    downloadServiceFile,\n    fileId,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingDownloadServiceFiles = error => ({\n    type: ERROR_DOWNLOAD_LOADING_FILES,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const downloadServiceFiles = (acceptHeader, machineId, version, id, fileId) => dispatch => {\n    dispatch({type: START_DOWNLOAD_LOADING_FILES});\n    return LdFetch.downloadFile(acceptHeader, `${baseConfig.backend.services.manuals.base_url}${baseConfig.backend.services.manuals.endpoints.manuals}/${machineId}/${version}/${id}`, downloadServiceFile => {\n        dispatch(receiveDownloadServiceFiles(downloadServiceFile, fileId));\n    }, error => {\n        dispatch(errorReceivingDownloadServiceFiles(error));\n    });\n};\n\n// -------------------------------------------------------------------------------------\nconst receiveUploadFiles = upload => ({\n    type: FINISH_UPLOAD,\n    upload,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingUploadFiles = error => ({\n    type: ERROR_UPLOAD,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const uploadFiles = (endpoint, _postBody) => dispatch => {\n    dispatch({type: START_UPLOAD});\n    return LdFetch.postFileForm(`${endpoint}`, _postBody, upload => {\n        dispatch(receiveUploadFiles(upload));\n    }, error => {\n        dispatch(errorReceivingUploadFiles(error));\n    });\n};\n\n\nexport const uploadNetcfg = (endpoint, _postBody) => (dispatch, getState) => {\n    return new Promise((resolve, reject) => {\n        dispatch({type: START_UPLOAD});\n        window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n        LdFetch.postFileForm(`${endpoint}`, _postBody, upload => {\n            dispatch(receiveUploadFiles(upload));\n            return resolve(getState().LdApplicationReducer.upload)\n        }, error => {\n            dispatch(errorReceivingUploadFiles(error));\n            return reject(error)\n        }, {});\n    })\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveServiceVersions = serviceVersion => ({\n    type: FINISH_LOADING_VERSIONS,\n    serviceVersion,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingServiceVersions = error => ({\n    type: ERROR_LOADING_VERSIONS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadServiceVersions = machineId => dispatch => {\n    dispatch({type: START_LOADING_VERSIONS});\n    return LdFetch.get(`${baseConfig.backend.services.manuals.base_url}${baseConfig.backend.services.manuals.endpoints.manuals}/${machineId}/versions`, serviceVersion => {\n        dispatch(receiveServiceVersions(serviceVersion));\n    }, error => {\n        dispatch(errorReceivingServiceVersions(error));\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveReleaseInfo = releaseInfo => ({\n    type: FINISH_LOADING_RELEASE_INFO,\n    releaseInfo,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReleaseInfo = error => ({\n    type: ERROR_LOADING_RELEASE_INFO,\n    error,\n});\nexport const checkRelease = () => dispatch => {\n    dispatch({type: START_LOADING_RELEASE_INFO});\n    return LdFetch.get(`${baseConfig.backend.services.release.base_url}${baseConfig.backend.services.release.endpoints.activeRelease}`, releaseInfo => {\n        dispatch(receiveReleaseInfo(releaseInfo));\n    }, error => {\n        dispatch(errorReleaseInfo(error));\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveServiceNcState = (serviceNC, ncFileType) => ({\n    type: FINISH_LOADING_NCSTATE,\n    serviceNC,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingServiceNcState = error => ({\n    type: ERROR_LOADING_NCSTATE,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadServiceNcState = (uri) => dispatch => {\n    dispatch({type: START_LOADING_NCSTATE});\n    return LdFetch.get(uri, serviceNC => {\n        dispatch(receiveServiceNcState(serviceNC));\n    }, error => {\n        dispatch(errorReceivingServiceNcState(error));\n    });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveFilesDelete = filesDelete => ({\n    type: FINISH_FILES_DELETE,\n    filesDelete,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingFilesDelete = (error) => ({\n    type: ERROR_FILES_DELETE,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const deleteFiles = (endpoint) => dispatch => {\n    dispatch({type: START_FILES_DELETE});\n    return LdFetch.delete(`${endpoint}`, filesDelete => {\n        dispatch(receiveFilesDelete(filesDelete));\n    }, error => {\n        dispatch(errorReceivingFilesDelete(error));\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveSubmitName = successSubmitName => ({\n    type: FINISH_LOADING_SUBMIT_NAME,\n    successSubmitName,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingSubmitName = error => ({\n    type: ERROR_LOADING_SUBMIT_NAME,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const submitFileName = (url, payload) => dispatch => {\n    dispatch({type: START_LOADING_SUBMIT_NAME});\n    window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    return LdFetch.patch(`${url}`, payload, successSubmitName => {\n        dispatch(receiveSubmitName(successSubmitName));\n    }, error => {\n        dispatch(errorReceivingSubmitName(error));\n    }, {});\n};\n\n\nconst receiveTVGroups = TvInstallInformation => ({\n    type: FINISH_LOADING_TVGROUPS,\n    TvInstallInformation,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingTVGroups = error => ({\n    type: ERROR_LOADING_TVGROUPS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadTVGroups = (machineId, groupName = 'teamviewer') => dispatch => {\n    dispatch({type: START_LOADING_TVGROUPS});\n    return LdFetch.get(`${baseConfig.backend.services.device.base_url}${baseConfig.backend.services.device.endpoints.teamviewer_install}/${groupName}${baseConfig.backend.services.device.endpoints.enrollment}/${machineId}`, TvInstallInformation => {\n        dispatch(receiveTVGroups(TvInstallInformation));\n    }, error => {\n        dispatch(errorReceivingTVGroups(error));\n    });\n};\n\n\nconst receiveTvDeployment = TvDeploymentInformation => ({\n    type: FINISH_LOADING_TVDEPLOYMENT,\n    TvDeploymentInformation,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingTvDeployment = error => ({\n    type: ERROR_LOADING_TVDEPLOYMENT,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadTvDeployment = (machineId) => dispatch => {\n    dispatch({type: START_LOADING_TVDEPLOYMENT});\n    return LdFetch.get(`${baseConfig.backend.services.device.base_url}${baseConfig.backend.services.device.endpoints.iot}${baseConfig.backend.services.device.endpoints.enrollment}/${machineId}${baseConfig.backend.services.device.endpoints.teamviewer_deployment}`, TvDeploymentInformation => {\n        dispatch(receiveTvDeployment(TvDeploymentInformation));\n    }, error => {\n        dispatch(errorReceivingTvDeployment(error));\n    });\n};\n\n\nconst receiveGroups = groupInformation => ({\n    type: FINISH_LOADING_GROUPS,\n    groupInformation,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingGroups = error => ({\n    type: ERROR_LOADING_GROUPS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadGroups = (machineId) => dispatch => {\n    dispatch({type: START_LOADING_GROUPS});\n    return LdFetch.get(`${baseConfig.backend.services.device.base_url}${baseConfig.backend.services.device.endpoints.iot}${baseConfig.backend.services.device.endpoints.enrollment}/${machineId}${baseConfig.backend.services.device.endpoints.groups}`, groupInformation => {\n        dispatch(receiveGroups(groupInformation));\n    }, error => {\n        dispatch(errorReceivingGroups(error));\n    });\n};\n\n// --------------------------------------------------------------------------------------\nconst receivePostTVGroups = (postTvInstallInformation) => ({\n    type: FINISH_POST_TV,\n    postTvInstallInformation,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorPostTVGroups = (error) => ({\n    type: ERROR_POST_TV,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const postTVGroups = (payload, groupName = 'teamviewer', callback = () => {\n}, errorCallback = callback) => dispatch => {\n    dispatch({type: START_POST_TV});\n    return LdFetch.post(`${baseConfig.backend.services.device.base_url}${baseConfig.backend.services.device.endpoints.teamviewer_install}/${groupName}${baseConfig.backend.services.device.endpoints.enrollment}`, payload, postTvInstallInformation => {\n        dispatch(receivePostTVGroups(postTvInstallInformation));\n        callback();\n    }, error => {\n        dispatch(errorPostTVGroups(error));\n        errorCallback();\n    });\n};\n\n\nconst receiveTVLinks = tvLinks => ({\n    type: FINISH_LOADING_TVLINKS,\n    tvLinks,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingTVLinks = error => ({\n    type: ERROR_LOADING_TVLINKS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadTVLinks = (url) => dispatch => {\n    dispatch({type: START_LOADING_TVLINKS});\n    return LdFetch.get(url, tvLinks => {\n        dispatch(receiveTVLinks(tvLinks));\n    }, error => {\n        dispatch(errorReceivingTVLinks(error));\n    });\n};\n\n\nconst receiveLinks = releaseNotes => ({\n    type: FINISH_LOADING_LINKS,\n    releaseNotes,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingLinks = error => ({\n    type: ERROR_LOADING_LINKS,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadLinks = (url) => dispatch => {\n    dispatch({type: START_LOADING_LINKS});\n    return LdFetch.get(url, releaseNotes => {\n        dispatch(receiveLinks(releaseNotes));\n    }, error => {\n        dispatch(errorReceivingLinks(error));\n    });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveEdit = (valueType, editValue) => ({\n    type: FINISH_EDIT,\n    editValue,\n    valueType,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorEdit = (valueType, error) => ({\n    type: ERROR_EDIT,\n    error,\n    valueType,\n});\n\n// --------------------------------------------------------------------------------------\nconst receiveAdd = (valueType, addValue) => ({\n    type: FINISH_ADD,\n    addValue,\n    valueType,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorAdd = (valueType, error) => ({\n    type: ERROR_ADD,\n    error,\n    valueType,\n});\n\n\n// --------------------------------------------------------------------------------------\nconst executeEdit = (endpoint, payload, valueType, callback, errorCallback) => dispatch => {\n    dispatch({ type: START_EDIT, valueType: valueType });\n\n    return LdFetch.put(endpoint, payload, editValue => {\n        dispatch(receiveEdit(valueType, editValue));\n        callback();\n    }, error => {\n        dispatch(errorEdit(valueType, error));\n        errorCallback();\n    });\n};\n\nexport const editItem = (endpoint, payload, valueType, callback = () => {}, errorCallback = callback) =>\n    executeEdit(endpoint, payload, valueType, callback, errorCallback);\n\nconst executeAdd = (endpoint, payload, valueType, callback, errorCallback) => dispatch => {\n    dispatch({ type: START_ADD, valueType: valueType });\n\n    return LdFetch.post(endpoint, payload, addValue => {\n        dispatch(receiveAdd(valueType, addValue));\n        callback();\n    }, error => {\n        dispatch(errorAdd(valueType, error));\n        errorCallback();\n    });\n};\n\nexport const newItem = (endpoint, payload, valueType, callback = () => {}, errorCallback = callback) =>\n    executeAdd(endpoint, payload, valueType, callback, errorCallback);\n\n\n// --------------------------------------------------------------------------------------\nconst receiveDelete = (itemDelete, valueType) => ({\n    type: FINISH_DELETE,\n    itemDelete,\n    valueType\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingDelete = (error, valueType) => ({\n    type: ERROR_DELETE,\n    error,\n    valueType\n});\n\n// --------------------------------------------------------------------------------------\n\nexport const deleteItem = (endpoint, valueType = 'delete') => dispatch => {\n    dispatch({type: START_DELETE});\n    return LdFetch.delete(`${baseConfig.backend.services.timeseries.base_url}${endpoint}`, itemDelete => {\n        dispatch(receiveDelete(itemDelete, valueType));\n    }, error => {\n        dispatch(errorReceivingDelete(error, valueType));\n    });\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { baseConfig } from '../../auto-generated/config';\nimport LdFetch from '../LdFetch';\n\nconst getUrl = () => {\n  const { base_url, endpoints } = baseConfig.backend.services.assets;\n  return `${base_url}${endpoints.companies}`;\n};\n\nfunction loadLines(companyId) {\n  return new Promise((resolve, reject) => {\n    LdFetch.get(`${getUrl()}/${companyId}`, resolve, reject);\n  });\n}\n\nexport default {\n  loadLines,\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { baseConfig } from '../../auto-generated/config';\nimport LdFetch from '../LdFetch';\n\nconst getUrl = () => {\n  const { base_url, endpoints } = baseConfig.backend.services.save_user_settings;\n  return `${base_url}${endpoints.settings}`;\n};\n\nfunction saveSetting(key, settingsObj) {\n  return new Promise((resolve, reject) => {\n    LdFetch.post(`${getUrl()}/${key}`, settingsObj, resolve, reject);\n  });\n}\n\nfunction loadSetting(key) {\n  return new Promise((resolve, reject) => {\n    LdFetch.get(`${getUrl()}/${key}`, resolve, reject);\n  });\n}\n\nexport default {\n  saveSetting,\n  loadSetting,\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport LdFetch from '../../../js/LdFetch';\n// eslint-disable-next-line import/no-cycle\nimport { baseConfig as CONFIG } from '../../../auto-generated/config';\n// eslint-disable-next-line import/no-cycle\nimport dashboardService from '../../../js/services/dashboardService';\nimport userService from '../../../js/services/userService';\nimport LdErrorHandler from '../../../js/LdErrorHandler';\n\nexport const START_LOADING_ASSETS = 'START_LOADING_ASSETS ';\nexport const FINISH_LOADING_ASSETS = 'FINISH_LOADING_ASSETS';\nexport const ERROR_LOADING_ASSETS = 'ERROR_LOADING_ASSETS';\nexport const START_DASHBOARD_LINES = 'START_DASHBOARD_LINES';\nexport const FINISH_DASHBOARD_LINES = 'FINISH_DASHBOARD_LINES';\nexport const ERROR_DASHBOARD_LINES = 'ERROR_DASHBOARD_LINES';\nexport const START_COORDINATES_BY_ADDRESS = 'START_COORDINATES_BY_ADDRESS';\nexport const FINISH_COORDINATES_BY_ADDRESS = 'FINISH_COORDINATES_BY_ADDRESS';\nexport const ERROR_COORDINATES_BY_ADDRESS = 'ERROR_COORDINATES_BY_ADDRESS';\nexport const START_ADD_ASSET = 'START_ADD_ASSET';\nexport const FINISH_ADD_ASSET = 'FINISH_ADD_ASSET';\nexport const ERROR_ADD_ASSET = 'ERROR_ADD_ASSET';\nexport const START_EDIT_ASSET = 'START_EDIT_ASSET';\nexport const FINISH_EDIT_ASSET = 'FINISH_EDIT_ASSET';\nexport const ERROR_EDIT_ASSET = 'ERROR_EDIT_ASSET';\nexport const CLEAR_EDIT_ASSET = 'CLEAR_EDIT_ASSET';\nexport const CLEAR_ADD_ASSET = 'CLEAR_ADD_ASSET';\nexport const CLEAR_DELETE_ASSET = 'CLEAR_DELETE_ASSET';\nexport const START_LOADING_MACHINES_BY_MACHINETYPE = 'START_LOADING_MACHINES_BY_MACHINETYPE';\nexport const FINISH_LOADING_MACHINES_BY_MACHINETYPE = 'FINISH_LOADING_MACHINES_BY_MACHINETYPE';\nexport const ERROR_LOADING_MACHINES_BY_MACHINETYPE = 'ERROR_LOADING_MACHINES_BY_MACHINETYPE';\n\nexport const EMPTY_ASSETS = 'EMPTY_ASSETS';\nexport const START_SHOPFLOOR_LIST = 'START_SHOPFLOOR_LIST';\nexport const FINISH_SHOPFLOOR_LIST = 'FINISH_SHOPFLOOR_LIST';\nexport const ERROR_SHOPFLOOR_LIST = 'ERROR_SHOPFLOOR_LIST';\nexport const START_SHOPFLOOR_DELETE = 'START_SHOPFLOOR_DELETE';\nexport const FINISH_SHOPFLOOR_DELETE = 'FINISH_SHOPFLOOR_DELETE';\nexport const ERROR_SHOPFLOOR_DELETE = 'ERROR_SHOPFLOOR_DELETE';\nexport const START_SHOPFLOOR_LINK = 'START_SHOPFLOOR_LINK';\nexport const FINISH_SHOPFLOOR_LINK = 'FINISH_SHOPFLOOR_LINK';\nexport const ERROR_SHOPFLOOR_LINK = 'ERROR_SHOPFLOOR_LINK';\nexport const START_READ_CUSTOMER_NUMBER = 'START_READ_CUSTOMER_NUMBER';\nexport const FINISH_READ_CUSTOMER_NUMBER = 'FINISH_READ_CUSTOMER_NUMBER';\nexport const ERROR_READ_CUSTOMER_NUMBER = 'ERROR_READ_CUSTOMER_NUMBER';\nexport const START_ASSET_DELETE = 'START_ASSET_DELETE';\nexport const FINISH_ASSET_DELETE = 'FINISH_ASSET_DELETE';\nexport const ERROR_ASSET_DELETE = 'ERROR_ASSET_DELETE';\nexport const RESET_COORDINATES = 'RESET_COORDINATES';\n\n\nconst SEARCH_BACKEND = CONFIG.backend.services.search;\n\n\n// --------------------------------------------------------------------------------------\nconst receiveAssetsList = (assetType, assetsList) => ({\n  type: FINISH_LOADING_ASSETS,\n  assetsList,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingAssetsList = (assetType, error) => ({\n  type: ERROR_LOADING_ASSETS,\n  error,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadAssets = (url, type, callback = () => {}) => dispatch => {\n\n  dispatch({ type: START_LOADING_ASSETS, assetType: type });\n  let handler;\n  const successCallback = assetsList => {\n\n    if (!assetsList) assetsList = [];\n    dispatch(receiveAssetsList(type, assetsList));\n    callback();\n  };\n  const errorCallback = error => {\n    dispatch(errorReceivingAssetsList(type, error));\n    callback();\n  };\n\n  if (type === 'industrySectors') {\n    const industrySectors = [\n      'automotive first-tier',\n      'automotive second-tier',\n      'automotive third-tier',\n      'automotive oem',\n      'Machine tool builder',\n      'miscellaneous',\n    ];\n    handler = () => successCallback(industrySectors);\n  } else if (type === 'controllers') {\n    const controllers = [\n      'Siemens 840D SL', 'Siemens 840D PL', 'Siemens S7-1500', 'FANUC CNC Series 30i', 'Rexroth MTX', 'Siemens S7-300',\n      'Scada Server', 'SINUMERIK ONE', 'other'\n    ];\n    handler = () => successCallback(controllers);\n  } else if (type === 'posLink' ) {\n    handler = () => LdFetch.getWithoutAuthorization(\n      `${url}`,\n      successCallback,\n      errorCallback,\n    );\n  } else if (type === 'shopfloorPosLink' || type === 'imageShopfloorCard'){\n    handler = () => LdFetch.get(\n      `${url}`,\n      successCallback,\n      errorCallback,\n    );\n  } else {\n    handler = () => LdFetch.get(\n      `${CONFIG.backend.services.assets.base_url}${url}`,\n      successCallback,\n      errorCallback,\n    );\n  }\n\n  return handler();\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveMachinesListByMachineType = (machinesList) => ({\n  type: FINISH_LOADING_MACHINES_BY_MACHINETYPE,\n  machinesList,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingMachinesListByMachineType = (error) => ({\n  type: ERROR_LOADING_MACHINES_BY_MACHINETYPE,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadMachinesByMachineType = (machineTypeId) => dispatch => {\n  dispatch({ type: START_LOADING_MACHINES_BY_MACHINETYPE });\n  return LdFetch.get(`${CONFIG.backend.services.search.base_url}${CONFIG.backend.services.search.base_endpoint}${machineTypeId}&size=1000`, machinesList => {\n    dispatch(receiveMachinesListByMachineType(machinesList));\n  }, error => {\n    dispatch(errorReceivingMachinesListByMachineType(error));\n  });\n};\n\nfunction limitMachines(line, limit) {\n  return {\n    ...line.data.line,\n    machines: line.data.line.machines.slice(0, limit),\n  };\n}\n\nfunction lineToCard(line) {\n  return {\n    type: 'line',\n    id: line.data.line.line_id,\n    hidden: false,\n    data: {\n      line: limitMachines(line, 5),\n    },\n  };\n}\n\nfunction getWorldmap(userInformation) {\n  return {\n    type: 'worldmap',\n    id: 'worldmap',\n    hidden: false,\n    data: {\n      userInformation,\n    },\n  };\n}\n\nfunction getManualCard() {\n  return {\n    type: 'manual-list',\n    id: 'manual',\n    hidden: false,\n    data: {},\n  };\n}\n\nfunction getCardsFromLines(lines) {\n  lines = lines.filter(lines => lines.type === 'line');\n  if (!lines) return [];\n  return lines.map(lineToCard);\n}\n\nfunction getCustomListCards(dashboardCards) {\n  return dashboardCards.filter(dashboardCard => dashboardCard.type === 'custom-list');\n}\n\nfunction getPossibleCards(dashboardCards, userInformation) {\n  return [\n    ...getCustomListCards(dashboardCards),\n    getWorldmap(userInformation),\n    getManualCard(),\n    ...getCardsFromLines(dashboardCards),\n  ];\n}\n\nfunction isSameCard(a, b) {\n  if (a.id === b.id)\n    return a.id === b.id;\n}\n\nfunction destructureError(promise) {\n  return promise\n    .then(data => [undefined, Array.isArray(data) ? data : null ])\n    .catch(error => [error, undefined]);\n}\n\n// --------------------------------------------------------------------------------------\nexport const loadCards = userInformation => async (dispatch, getState) => {\n\n  // show localStorage data until all ressources are loaded\n  const cardsInCache = getState().LdAssetsReducer.dashboardCards;\n  if (!cardsInCache) dispatch({ type: START_DASHBOARD_LINES });\n\n  // load all required resources to determine dashboard changes\n  const pendingRessources = [\n    userService.loadSetting('dashboardConfig'),\n    dashboardService.loadLines(userInformation.company),\n  ];\n\n  const [error, data] = await destructureError(Promise.all(pendingRessources));\n  if (error) {\n    return dispatch({ type: ERROR_DASHBOARD_LINES, error });\n  }\n\n  let [dashboardCards] = data;\n  if (!Array.isArray(dashboardCards)) {\n    dashboardCards = [];\n  }\n  const possibleCards = getPossibleCards(dashboardCards, userInformation);\n  const oldState = JSON.stringify(dashboardCards);\n\n  // add new cards\n  possibleCards.forEach(possibleCard => {\n    const matchingCard = dashboardCards.find(dashboardCard => isSameCard(dashboardCard, possibleCard));\n    if (!matchingCard) {\n      // adding new card\n      dashboardCards.push(possibleCard);\n    } else {\n\n      // update data\n      matchingCard.data = possibleCard.data;\n    }\n  });\n\n  // remove old cards\n  const saveOldLength = dashboardCards.length;\n\n  dashboardCards = dashboardCards.filter(dashboardCard => possibleCards.some(possibleCard => isSameCard(possibleCard, dashboardCard)));\n\n\n  //remove duplications\n  const uniqueIds = new Set();\n\n  dashboardCards = dashboardCards.filter(dashboardCard => {\n    const isDuplicate = uniqueIds.has(dashboardCard.id);\n\n    uniqueIds.add(dashboardCard.id);\n    if (!isDuplicate) {\n      return true;\n    }\n\n    return false;\n  });\n\n  if (dashboardCards.length != saveOldLength) {\n    LdErrorHandler._handleError('duplication_deleted');\n  }\n\n  const userId = userInformation.id;\n  const main_group = userInformation.role;\n  // sort hidden cards to the end\n  dashboardCards.sort((a, b) => a.hidden - b.hidden);\n  const newState = JSON.stringify(dashboardCards, userId, main_group);\n\n  if (newState !== oldState) {\n    // userService.saveSetting('dashboardConfig', dashboardCards); // DEAKTIVIERT - wird in assets-header._confirmDashboard() via saveUserSetting() gespeichert\n  }\n  dispatch({ type: FINISH_DASHBOARD_LINES, cards: dashboardCards });\n\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveCoordinatesByAddress = res => ({\n  type: FINISH_COORDINATES_BY_ADDRESS,\n  res,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingCoordinatesByAddress = error => ({\n  type: ERROR_COORDINATES_BY_ADDRESS,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const getCoordinatesByAddress = (address, zipcode, city) => dispatch => {\n  const _addressFormatted = `${address},${zipcode} ${city}`.split(' ').join('+');\n  const _url = CONFIG.generic.geo_reference_url.replace('%query', _addressFormatted);\n  dispatch({ type: START_COORDINATES_BY_ADDRESS });\n  return LdFetch.getCoordinates(_url, res => {\n    dispatch(receiveCoordinatesByAddress(res));\n  }, error => {\n    dispatch(errorReceivingCoordinatesByAddress(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nexport const resetCoordinates = () => ({\n  type: RESET_COORDINATES,\n});\n\n// --------------------------------------------------------------------------------------\nconst receiveAddAsset = (assetType, addAssetValue) => ({\n  type: FINISH_ADD_ASSET,\n  addAssetValue,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorAddAsset = (assetType, error) => ({\n  type: ERROR_ADD_ASSET,\n  error,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nexport const newAsset = (endpoint, payload, type, callback = ()=>{}) => dispatch => {\n  dispatch({ type: START_ADD_ASSET, assetType: type });\n  return LdFetch.post(endpoint, payload, addAssetValue => {\n    dispatch(receiveAddAsset(type, addAssetValue));\n    callback();\n  }, error => {\n    dispatch(errorAddAsset(type, error));\n    callback();\n  });\n};\n\nexport const START_CHANGING_LIMITS = \"START_CHANGING_LIMITS\";\nexport const FINISH_CHANGING_LIMITS = \"FINISH_CHANGING_LIMITS\";\nexport const ERROR_CHANGING_LIMITS = \"ERROR_CHANGING_LIMITS\";\nexport const ACK_ERROR_CHANGING_LIMITS = \"ACK_ERROR_CHANGING_LIMITS\";\nexport const changeLimits = (endpoint, payload, callbackSuccess = ()=>{},  callbackError = ()=>{}) => dispatch => {\n  dispatch({ type: START_CHANGING_LIMITS });\n  return LdFetch.put(endpoint, payload, () => {\n    dispatch({type: FINISH_CHANGING_LIMITS});\n    callbackSuccess();\n  }, error => {\n    dispatch({type: ERROR_CHANGING_LIMITS, error});\n    callbackError();\n  });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveEditAsset = (assetType, editAssetValue) => ({\n  type: FINISH_EDIT_ASSET,\n  editAssetValue,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorEditAsset = (assetType, error) => ({\n  type: ERROR_EDIT_ASSET,\n  error,\n  assetType,\n});\n\n// --------------------------------------------------------------------------------------\nexport const editAsset = (endpoint, payload, type, callback = () => {}, errorCallback = callback) => dispatch => {\n  dispatch({ type: START_EDIT_ASSET, assetType: type });\n  return LdFetch.put(endpoint, payload, editAssetValue => {\n    dispatch(receiveEditAsset(type, editAssetValue));\n    callback();\n  }, error => {\n    dispatch(errorEditAsset(type, error));\n    errorCallback();\n  });\n\n};\n\n// --------------------------------------------------------------------------------------\nexport const readCustomerNumber = machineId => dispatch => {\n  dispatch({ type: START_READ_CUSTOMER_NUMBER, machineId });\n  return LdFetch.get(`${CONFIG.backend.services.assets.base_url}${CONFIG.backend.services.assets.endpoints.customer_number}?machineId=${machineId}`, customerNumber => {\n    dispatch({ type: FINISH_READ_CUSTOMER_NUMBER, machineId, customerNumber });\n  }, error => {\n    dispatch({ type: ERROR_READ_CUSTOMER_NUMBER, machineId, error });\n  });\n};\n\n// --------------------------------------------------------------------------------------\nexport const clearAssetRequest = (result = null) => dispatch => {\n  dispatch({ type: CLEAR_ADD_ASSET });\n  dispatch({ type: CLEAR_EDIT_ASSET });\n  dispatch({ type: CLEAR_DELETE_ASSET });\n  window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n  if(result != null) {\n    LdErrorHandler._handleError(`${!result.status}`);\n  }\n};\n\n// --------------------------------------------------------------------------------------\nexport const emptyAssets = () => dispatch => {\n  dispatch({ type: EMPTY_ASSETS });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveShopfloorList = shopfloorList => ({\n  type: FINISH_SHOPFLOOR_LIST,\n  shopfloorList,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingShopfloorList = error => ({\n  type: ERROR_SHOPFLOOR_LIST,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const setShopfloor = (endpoint, _postBody) => dispatch => {\n  dispatch({ type: START_SHOPFLOOR_LIST });\n  return LdFetch.putShopfloor(`${endpoint}`, _postBody, shopfloorList => {\n    dispatch(receiveShopfloorList(shopfloorList));\n  }, error => {\n    dispatch(errorReceivingShopfloorList(error));\n  });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveShopfloorLink = shopfloorLink => ({\n  type: FINISH_SHOPFLOOR_LINK,\n  shopfloorLink,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingShopfloorLink = error => ({\n  type: ERROR_SHOPFLOOR_LINK,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const setShopfloorLink = (endpoint, _putBody) => dispatch => {\n  dispatch({ type: START_SHOPFLOOR_LINK });\n  return LdFetch.put(`${endpoint}`, _putBody, shopfloorLink => {\n    dispatch(receiveShopfloorLink(shopfloorLink));\n  }, error => {\n    dispatch(errorReceivingShopfloorLink(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveShopfloorDelete = shopfloorDelete => ({\n  type: FINISH_SHOPFLOOR_DELETE,\n  shopfloorDelete,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingShopfloorDelete = error => ({\n  type: ERROR_SHOPFLOOR_DELETE,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const deleteShopfloor = (assetId, endpoint) => dispatch => {\n  dispatch({ type: START_SHOPFLOOR_DELETE });\n  return LdFetch.delete(`${CONFIG.backend.services.assets.base_url}${endpoint}/${assetId}`, shopfloorDelete => {\n    dispatch(receiveShopfloorDelete(shopfloorDelete));\n  }, error => {\n    dispatch(errorReceivingShopfloorDelete(error));\n  });\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveAssetDelete = (assetDelete, valueType) => ({\n  type: FINISH_ASSET_DELETE,\n  assetDelete,\n  valueType\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingAssetDelete = (error, valueType) => ({\n  type: ERROR_ASSET_DELETE,\n  error,\n  valueType\n});\n\n// --------------------------------------------------------------------------------------\nexport const deleteAsset = (endpoint, valueType = 'delete') => dispatch => {\n  dispatch({ type: START_ASSET_DELETE, valueType });\n  return LdFetch.delete(`${CONFIG.backend.services.assets.base_url}${endpoint}`, assetDelete => {\n    dispatch(receiveAssetDelete(assetDelete, valueType));\n  }, error => {\n    dispatch(errorReceivingAssetDelete(error, valueType));\n  });\n};\n\nexport const deleteVariable = (endpoint) => dispatch => {\n  dispatch({ type: START_ASSET_DELETE });\n  return LdFetch.delete(`${CONFIG.backend.services.timeseries.base_url}${endpoint}`, assetDelete => {\n    dispatch(receiveAssetDelete(assetDelete));\n  }, error => {\n    dispatch(errorReceivingAssetDelete(error));\n  });\n};\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\nimport { baseConfig as CONFIG } from '../../../auto-generated/config';\nimport LdErrorHandler from '../../../js/LdErrorHandler';\nimport { createRandomId } from '../../../js/LdGlobal';\nimport store from \"../ld-redux-store\";\nimport LdI18Next from \"../../ld-application/i18n/ld-i18next\";\n\nexport const START_LOADING_ASSETS = 'START_LOADING_ASSETS ';\n\n// --------------------------------------------------------------------------------------\nexport const viewFile = url => dispatch => {\n  dispatch({ type: START_LOADING_ASSETS, assetType: 'serviceManual' });\n  return new Promise((resolve) => {\n    window.open(url, '_blank');\n    return resolve();\n  });\n};\n\n// --------------------------------------------------------------------------------------\nexport const downloadFile = url => dispatch => {\n  dispatch({ type: START_LOADING_ASSETS, assetType: 'serviceManual' });\n  return new Promise((resolve) => {\n    window.open(url, '_blank');\n    return resolve();\n  });\n};\n\n\n// --------------------------------------------------------------------------------------\nexport const downloadEnrollmentConfiguration = (url, body, filename, acceptHeader) => () => {\n  const existingToken = JSON.parse(localStorage.getItem(CONFIG.localstorage.token_key));\n  const authType = 'Bearer';\n  const token = `${authType} ${existingToken.idToken.jwtToken}`;\n  const request = new XMLHttpRequest();\n  request.open('POST', url);\n  request.responseType = 'blob';\n  request.setRequestHeader('Authorization', token);\n  if (acceptHeader != null) {\n    request.setRequestHeader('Accept', acceptHeader);\n    request.setRequestHeader('Content-Type', 'application/json');\n\n  }\n  request.send(JSON.stringify(body));\n  request.onload = function () {\n    if (this.status === 200) {\n      // Create a new Blob object using the response data of the onload object\n      var blob = new Blob([this.response], { type: 'image/pdf' });\n      //Create a link element, hide it, direct it towards the blob, and then 'click' it programatically\n      let a = document.createElement('a');\n      a.style = 'display: none';\n      document.body.appendChild(a);\n      //Create a DOMString representing the blob and point the link element towards it\n      let url = window.URL.createObjectURL(blob);\n      a.href = url;\n      if (filename === '') {\n        const disposition = request.getResponseHeader('Content-Disposition');\n        if (disposition && disposition.indexOf('attachment') !== -1) {\n          const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n          const matches = filenameRegex.exec(disposition);\n          if (matches != null && matches[1]) {\n            a.download = matches[1].replace(/['\"]/g, '');\n          }\n        }\n      } else {\n        a.download = filename;\n      }\n      //programatically click the link to trigger the download\n      a.click();\n      //release the reference to the file by revoking the Object URL\n      window.URL.revokeObjectURL(url);\n    } else if (this.status === 409) {\n      LdErrorHandler._handleError('enrollment_code_409', null);\n    } else if (this.status === 400) {\n      LdErrorHandler._handleError('400', null);\n    } else if (this.status === 500) {\n      LdErrorHandler._handleError('500', null);\n    } else if (this.status === 502) {\n      LdErrorHandler._handleError('502', null);\n    } else if (this.status === 504) {\n      LdErrorHandler._handleError('504', null);\n    } else {\n      LdErrorHandler._handleError(this.status, null);\n    }\n  };\n\n};\n\n// --------------------------------------------------------------------------------------\nexport const downloadCSV = (url, name = null, acceptHeader = 'text/csv', id = createRandomId(), content = null) => dispatch => {\n  const existingToken = JSON.parse(localStorage.getItem(CONFIG.localstorage.token_key));\n  const authType = 'Bearer';\n  const token = `${authType} ${existingToken.idToken.jwtToken}`;\n  const request = new XMLHttpRequest();\n  request.open('GET', url);\n  request.responseType = 'blob';\n  request.setRequestHeader('Authorization', token);\n  request.setRequestHeader('Accept', acceptHeader);\n  request.setRequestHeader('x-user-language', LdI18Next.language);\n\n  if (name != null) {\n    request.setRequestHeader('Machine-Name', name);\n  }\n  if (content != null) {\n    request.setRequestHeader('X-Response-Content-Disposition', content);\n  }\n\n\n  const handler = function (onSuccess, error) {\n    let requestStatus;\n    let response;\n    if (error) {\n      requestStatus = 500;\n      response = '';\n    } else {\n      requestStatus = onSuccess.status;\n      response = onSuccess.response;\n    }\n    const locationHeader = request.getResponseHeader('Location');\n    if (requestStatus === 200 && !locationHeader) {\n\n      // Create a new Blob object using the response data of the onload object\n      const csvBlob = new Blob([response], { type: acceptHeader });\n\n      //Create a link element, hide it, direct it towards the blob, and then 'click' it programatically\n      const blobUrl = URL.createObjectURL(csvBlob);\n      const anchorElement = document.createElement('a');\n      anchorElement.href = blobUrl;\n\n      // get filename from headers\n      const disposition = request.getResponseHeader('Content-Disposition');\n      if (disposition && disposition.indexOf('attachment') !== -1) {\n        const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n        const matches = filenameRegex.exec(disposition);\n        if (matches != null && matches[1]) {\n          anchorElement.download = matches[1].replace(/['\"]/g, '');\n        }\n      }\n\n      //release the reference to the file by revoking the Object URL\n      anchorElement.click();\n      dispatch({ type: 'DOWNLOAD-FINISHED', downloadId: id });\n    } else if (requestStatus === 200 && locationHeader) {\n      store.dispatch(viewFile(locationHeader));\n\n    } else if (requestStatus === 409) {\n      dispatch({ type: 'DOWNLOAD-ERROR', downloadId: id });\n      LdErrorHandler._handleError('enrollment_code_409', null);\n    } else if (requestStatus === 400) {\n      dispatch({ type: 'DOWNLOAD-ERROR', downloadId: id });\n      LdErrorHandler._handleError('400', null);\n    } else if (requestStatus === 500) {\n      dispatch({ type: 'DOWNLOAD-ERROR', downloadId: id });\n      LdErrorHandler._handleError('500', null);\n    } else if (requestStatus === 502) {\n      dispatch({ type: 'DOWNLOAD-ERROR', downloadId: id });\n      LdErrorHandler._handleError('500', null);\n    } else if (requestStatus === 504) {\n      dispatch({ type: 'DOWNLOAD-ERROR', downloadId: id });\n      LdErrorHandler._handleError('504', null);\n    } else {\n      LdErrorHandler._handleError(requestStatus, null);\n    }\n\n  };\n  request.onerror = function (e) {\n    handler(this, e);\n  };\n  request.onload = function () {\n    handler(this);\n  };\n\n  request.send();\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport LdFetch from '../../../js/LdFetch';\n// eslint-disable-next-line import/no-cycle\nimport {getUTCTime, newSendRequestCheckup, sendRequest} from '../../../js/LdGlobal';\nimport {baseConfig as CONFIG} from '../../../auto-generated/config';\n// eslint-disable-next-line import/no-cycle\nimport store from '../ld-redux-store';\nimport {VisibilityType} from '../../../js/interfaces';\nimport LdErrorHandler from \"../../../js/LdErrorHandler\";\nimport {downloadCSV} from \"./ld-files-actions\";\n\nexport const START_LOADING_CURRENT = 'START_LOADING_CURRENT ';\nexport const FINISH_LOADING_CURRENT = 'FINISH_LOADING_CURRENT';\nexport const ERROR_LOADING_CURRENT = 'ERROR_LOADING_CURRENT';\n\nexport const START_LOADING_MULTI_CURRENT = 'START_LOADING_MULTI_CURRENT ';\nexport const FINISH_LOADING_MULTI_CURRENT = 'FINISH_LOADING_MULTI_CURRENT';\nexport const ERROR_LOADING_MULTI_CURRENT = 'ERROR_LOADING_MULTI_CURRENT';\n\nexport const EMPTY_MULTI_CURRENT = 'EMPTY_MULTI_CURRENT';\n\nexport const START_LOADING_AVAILABILITY_KPI_IOT = 'START_LOADING_AVAILABILITY_KPI_IOT ';\nexport const FINISH_LOADING_AVAILABILITY_KPI_IOT = 'FINISH_LOADING_AVAILABILITY_KPI_IOT';\nexport const ERROR_LOADING_AVAILABILITY_KPI_IOT = 'ERROR_LOADING_AVAILABILITY_KPI_IOT';\n\nexport const START_LOADING_MULTI_TIMELINE = 'START_LOADING_MULTI_TIMELINE';\nexport const FINISH_LOADING_MULTI_TIMELINE = 'FINISH_LOADING_MULTI_TIMELINE';\nexport const ERROR_LOADING_MULTI_TIMELINE = 'ERROR_LOADING_MULTI_TIMELINE';\nexport const REMOVE_ENTRY_MULTI_TIMELINE = 'REMOVE_ENTRY_MULTI_TIMELINE';\n\nexport const START_LOADING_CHART = 'START_LOADING_CHART';\nexport const FINISH_LOADING_CHART = 'FINISH_LOADING_CHART';\nexport const ERROR_LOADING_CHART = 'ERROR_LOADING_CHART';\n\nexport const START_LOADING_WORKPIECE_COUNTER = 'START_LOADING_WORKPIECE_COUNTER';\nexport const FINISH_LOADING_WORKPIECE_COUNTER = 'FINISH_LOADING_WORKPIECE_COUNTER';\nexport const ERROR_LOADING_WORKPIECE_COUNTER = 'ERROR_LOADING_WORKPIECE_COUNTER';\n\nexport const START_LOADING_DETAILS = 'START_LOADING_DETAILS';\nexport const FINISH_LOADING_DETAILS = 'FINISH_LOADING_DETAILS';\nexport const ERROR_LOADING_DETAILS = 'ERROR_LOADING_DETAILS';\n\nexport const START_LOADING_ALARMS = 'START_LOADING_ALARMS';\nexport const FINISH_LOADING_ALARMS = 'FINISH_LOADING_ALARMS';\nexport const ERROR_LOADING_ALARMS = 'ERROR_LOADING_ALARMS';\nexport const CLEAR_ALARMS = 'CLEAR_ALARMS';\n\nexport const START_LOADING_OVERRIDE = 'START_LOADING_OVERRIDE';\nexport const FINISH_LOADING_OVERRIDE = 'FINISH_LOADING_OVERRIDE';\nexport const ERROR_LOADING_OVERRIDE = 'ERROR_LOADING_OVERRIDE';\n\nexport const START_SINGLE_VARIABLE = 'START_SINGLE_VARIABLE';\nexport const FINISH_SINGLE_VARIABLE = 'FINISH_SINGLE_VARIABLE';\nexport const ERROR_SINGLE_VARIABLE = 'ERROR_SINGLE_VARIABLE';\n\nexport const START_VARIABLES_LIST = 'START_VARIABLES_LIST';\nexport const FINISH_VARIABLES_LIST = 'FINISH_VARIABLES_LIST';\nexport const ERROR_VARIABLES_LIST = 'ERROR_VARIABLES_LIST';\n\nexport const START_COLLECTIONS_LIST = 'START_COLLECTIONS_LIST';\nexport const FINISH_COLLECTIONS_LIST = 'FINISH_COLLECTIONS_LIST';\nexport const ERROR_COLLECTIONS_LIST = 'ERROR_COLLECTIONS_LIST';\n\nexport const START_SINGLE_COLLECTION = 'START_SINGLE_COLLECTION';\nexport const FINISH_SINGLE_COLLECTION = 'FINISH_SINGLE_COLLECTION';\nexport const ERROR_SINGLE_COLLECTION = 'ERROR_SINGLE_COLLECTION';\n\nexport const START_VARIABLES_WITH_LIMITS_LIST = 'START_VARIABLES_WITH_LIMITS_LIST';\nexport const FINISH_VARIABLES_WITH_LIMITS_LIST = 'FINISH_VARIABLES_WITH_LIMITS_LIST';\nexport const ERROR_VARIABLES_WITH_LIMITS_LIST = 'ERROR_VARIABLES_WITH_LIMITS_LIST';\nexport const CLEAR = 'CLEAR';\n\nexport const EMPTY_ITEM = 'EMPTY_ITEM';\nexport const EMPTY_ACTIVE_VARIABLE = 'EMPTY_ACTIVE_VARIABLE';\nexport const EMPTY_ACTIVE_COLLECTION = 'EMPTY_ACTIVE_COLLECTION';\nexport const CLEAR_AVAILABILITY_KPI_IOT = 'CLEAR_AVAILABILITY_KPI_IOT';\nconst TIMESERIES_BACKEND = CONFIG.backend.services.timeseries;\nconst ALARM_BACKEND = CONFIG.backend.services.alarm;\nconst emptyObject = null;\n\n\nexport const emptyItem = () => dispatch => {\n    dispatch({type: EMPTY_ITEM});\n}\n\nexport const emptyActiveVariable = () => dispatch => {\n    dispatch({type: EMPTY_ACTIVE_VARIABLE});\n}\n\nexport const emptyActiveCollection = () => dispatch => {\n    dispatch({type: EMPTY_ACTIVE_COLLECTION});\n}\n\nexport const clearRequest = (result = null) => dispatch => {\n    dispatch({type: CLEAR});\n    dispatchEvent(new Event('LdCloseLoadingSpinner'));\n    if (result != null) {\n        LdErrorHandler._handleError(`${!result.status}`);\n    }\n};\nexport const loadMultiCurrentValue = (machineIds, variables, chartId, role) => dispatch => {\n    dispatch({type: START_LOADING_MULTI_CURRENT, chartId});\n    const _postBody = {\n        machineIds, variables,\n    };\n    if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n        return LdFetch.post(`${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.current}`, _postBody, multiCurrentValueResult => {\n            dispatch(receiveMultiCurrentValue(multiCurrentValueResult, chartId));\n        }, error => {\n            dispatch(errorMultiCurrentValue(error));\n        });\n    } else {\n        return dispatch(receiveMultiCurrentValue(emptyObject, chartId));\n    }\n\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveMultiCurrentValue = (multiCurrentValueList, chartId) => ({\n    type: FINISH_LOADING_MULTI_CURRENT, multiCurrentValueList, chartId,\n});\n\nconst errorMultiCurrentValue = (error) => ({\n    type: ERROR_LOADING_MULTI_CURRENT,\n    error,\n});\n\n// --------------------------------------------------------------------------------------\nconst receiveAvailabilityKpiIoTValue = (iotValueList, kpiValueList, machineId) => ({\n\n  type: FINISH_LOADING_AVAILABILITY_KPI_IOT,\n  iotValueList,\n  kpiValueList,\n  machineId,\n});\n\nconst errorAvailabilityKpiIoTValue = error => ({\n  type: ERROR_LOADING_AVAILABILITY_KPI_IOT,\n  error,\n});\n\nexport const loadAvailabilityKpiIoT = (endpointIoT, endpointKpi, machineIds, startTime, endTime, variables, role = null) => dispatch => {\n    const _postBody = {\n        machineIds, variables,\n    };\n    dispatch({type: START_LOADING_AVAILABILITY_KPI_IOT});\n    if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n        return LdFetch.post(`${TIMESERIES_BACKEND.base_url}${endpointIoT}`, _postBody, iotValueList => machineIds.forEach(machine => {\n            LdFetch.get(`${TIMESERIES_BACKEND.base_url}${endpointKpi}?machine_id=${machine}&start=${startTime}&end=${endTime}`, kpiValueList => {\n                dispatch(receiveAvailabilityKpiIoTValue(iotValueList, kpiValueList, machine));\n            }, error => {\n                dispatch(errorAvailabilityKpiIoTValue(error));\n            });\n        }), error => {\n            dispatch(errorAvailabilityKpiIoTValue(error));\n        });\n    } else {\n        return dispatch(receiveAvailabilityKpiIoTValue(emptyObject, emptyObject, emptyObject));\n    }\n};\n\nexport const clearAvailabilityKpiIoT = () => dispatch => {\n  dispatch({ type: CLEAR_AVAILABILITY_KPI_IOT });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveMultiTimeline = (result, machineId, chartId) => ({\n  type: FINISH_LOADING_MULTI_TIMELINE,\n  result,\n  machineId,\n  chartId,\n});\n\nconst errorMultiTimeline = (error, chartId) => ({\n  type: ERROR_LOADING_MULTI_TIMELINE,\n  error,\n  chartId,\n});\n/**\n *\n * @param {*} machineId\n * @param {*} dateRange\n * @param {*} variables\n * @param {*} chartId\n * @param {string | null} role\n * @returns {(function(*): (*))|*}\n */\nexport const loadMultiTimeline = (machineId, dateRange, variables, chartId, role = null) => dispatch => {\n  dispatch({ type: START_LOADING_MULTI_TIMELINE, chartId });\n  const _postBody = {\n    machineIds: machineId,\n    variables,\n  };\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    return LdFetch.post(`${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.timeline}?start=${dateRange.from}&end=${dateRange.to}`, _postBody, multiTimelineResult => {\n      dispatch(receiveMultiTimeline(multiTimelineResult, machineId, chartId));\n    }, error => {\n      dispatch(errorMultiTimeline(error, chartId));\n    });\n  } else {\n    return dispatch(receiveMultiTimeline(emptyObject, machineId, chartId));\n  }\n\n};\n\n\nexport const removeEntryFromMultiTimeline = chartId => dispatch => {\n  dispatch({ type: REMOVE_ENTRY_MULTI_TIMELINE, chartId });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveChartValue = (chartType, result, machineId, chartId) => ({\n  type: FINISH_LOADING_CHART,\n  result,\n  machineId,\n  chartId,\n  chartType,\n});\n\nconst errorChartValue = (chartType, error, chartId) => ({\n  type: ERROR_LOADING_CHART,\n  error,\n  chartId,\n  chartType,\n});\nexport const loadChartValue = (endpointChart, machineId, startTime, endTime, chartType, chartId, role = null) => dispatch => {\n  dispatch({ type: START_LOADING_CHART, chartType, chartId });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    return LdFetch.get(`${TIMESERIES_BACKEND.base_url}${endpointChart}?machine_id=${machineId}&start=${startTime}&end=${endTime}`, chartValue => {\n      dispatch(receiveChartValue(chartType, chartValue, machineId, chartId));\n    }, error => {\n      dispatch(errorChartValue(chartType, error, chartId));\n    });\n  } else {\n    return dispatch(receiveChartValue(chartType, emptyObject, machineId, chartId), 'emptyObj');\n  }\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveWorkpieceCounterData = (machineId, workpieceData) => ({\n  type: FINISH_LOADING_WORKPIECE_COUNTER,\n  workpieceData,\n  machineId,\n});\n\nconst errorWorkpieceCounterData = (machineId, error) => ({\n  type: ERROR_LOADING_WORKPIECE_COUNTER,\n  error,\n  machineId,\n});\n\nexport const loadWorkpieceCounter = machineId => dispatch => {\n  dispatch({ type: START_LOADING_WORKPIECE_COUNTER, machineId });\n  if (sendRequest(store.getState())) {\n    return LdFetch.get(`${TIMESERIES_BACKEND.base_url}${TIMESERIES_BACKEND.endpoints.workpiece_counter}?machine_id=${machineId}`, workpieceData => {\n      dispatch(receiveWorkpieceCounterData(machineId, workpieceData));\n    }, error => {\n      dispatch(errorWorkpieceCounterData(machineId, error));\n    });\n  }\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveDetailsData = (machineId, detailData) => ({\n  type: FINISH_LOADING_DETAILS,\n  detailData,\n  machineId,\n});\n\nconst errorDetailsData = (machineId, error) => ({\n  type: ERROR_LOADING_DETAILS,\n  error,\n  machineId,\n});\n\nexport const loadDetails = machineId => dispatch => {\n  dispatch({ type: START_LOADING_DETAILS, machineId });\n  if (sendRequest(store.getState())) {\n    return LdFetch.get(`${TIMESERIES_BACKEND.base_url}${TIMESERIES_BACKEND.endpoints.tiles.detail_tile}?machine_id=${machineId}`, detailsData => {\n      dispatch(receiveDetailsData(machineId, detailsData));\n    }, error => {\n      dispatch(errorDetailsData(machineId, error));\n    });\n  } else {\n    return dispatch(receiveDetailsData(machineId, emptyObject));\n  }\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveAlarmsValue = (alarmsType, result, machineId, alarmsId) => ({\n  type: FINISH_LOADING_ALARMS,\n  result,\n  machineId,\n  alarmsId,\n  alarmsType,\n});\n\nconst errorAlarmsValue = (alarmsType, error, alarmsId) => ({\n  type: ERROR_LOADING_ALARMS,\n  error,\n  alarmsId,\n  alarmsType,\n});\n\nexport const clearAlarmsValue = (alarmsType, alarmsId) => dispatch => {\n  dispatch({ type: CLEAR_ALARMS, alarmsType, alarmsId });\n};\n\nexport const loadAlarmsValue = (endpointAlarms, machineId, startTime, endTime, alarmsType, alarmsId, role = null) => dispatch => {\n  dispatch({ type: START_LOADING_ALARMS, alarmsType, alarmsId });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    let url = `${ALARM_BACKEND.base_url}${endpointAlarms}?machine_id=${machineId}&start=${startTime}&end=${endTime}`;\n    return LdFetch.get(url, alarmsValue => {\n      dispatch(receiveAlarmsValue(alarmsType, alarmsValue, machineId, alarmsId));\n    }, error => {\n      dispatch(errorAlarmsValue(alarmsType, error, alarmsId));\n    });\n  } else {\n    return dispatch(receiveAlarmsValue(alarmsType, emptyObject, machineId, alarmsId));\n  }\n};\n\n/**\n *\n * @param {*} endpointAlarms\n * @param {*} machineId\n * @param {*} date\n * @param {*} alarmsType\n * @param {*} alarmsId\n * @param {string | null} role\n * @param {*} selectedTimeFilter\n * @returns\n */\nexport const loadAlarmsWithTime = (endpointAlarms, machineId, date, alarmsType, alarmsId, role = null, selectedTimeFilter = 'box_time') => dispatch => {\n  dispatch({ type: START_LOADING_ALARMS, alarmsType, alarmsId });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    date = getUTCTime(selectedTimeFilter, date);\n\n    let url = `${ALARM_BACKEND.base_url}/${machineId}${endpointAlarms}?start=${Number(date.from)}&end=${Number(date.to)}&sortTime=${selectedTimeFilter}&times=${selectedTimeFilter}`;\n    return LdFetch.get(url, alarmsValue => {\n      dispatch(receiveAlarmsValue(alarmsType, alarmsValue, machineId, alarmsId));\n    }, error => {\n      dispatch(errorAlarmsValue(alarmsType, error, alarmsId));\n    });\n  } else {\n    return dispatch(receiveAlarmsValue(alarmsType, emptyObject, machineId, alarmsId));\n  }\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveCurrentData = (currentValue, machineId, chartId, variables) => ({\n  type: FINISH_LOADING_CURRENT,\n  currentValue,\n  chartId,\n  machineId,\n  variables,\n});\n\nconst errorCurrentData = (error, chartId, machineId) => ({\n  type: ERROR_LOADING_CURRENT,\n  error,\n  chartId,\n  machineId,\n});\n\nexport const loadCurrentData = (endpoint, machineId, chartId, variables) => dispatch => {\n  dispatch({ type: START_LOADING_CURRENT, chartId });\n  const _postBody = {\n    machineIds: [machineId],\n    variables: variables,\n  };\n  if (sendRequest(store.getState())) {\n    return LdFetch.post(`${TIMESERIES_BACKEND.base_url}${endpoint}`, _postBody, multiTimelineResult => {\n      dispatch(receiveCurrentData(multiTimelineResult, machineId, chartId, variables));\n    }, error => {\n      dispatch(errorCurrentData(error, chartId, machineId));\n    });\n  } else {\n    return dispatch(receiveCurrentData(emptyObject, chartId));\n  }\n};\n\n// --------------------------------------------------------------------------------------\nexport const emptyMultiCurrentValue = chartId => dispatch => {\n  dispatch({ type: EMPTY_MULTI_CURRENT, chartId });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveVariablesList = variablesList => ({\n  type: FINISH_VARIABLES_LIST,\n  variablesList,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingVariablesList = error => ({\n  type: ERROR_VARIABLES_LIST,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadVariables = (machineId, role, attribute = 'machineId') => dispatch => {\n  if (machineId !== '') {\n    attribute = `${attribute}=${machineId}`\n  }\n  dispatch({ type: START_VARIABLES_LIST });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    return LdFetch.get(`${TIMESERIES_BACKEND.base_url}${TIMESERIES_BACKEND.endpoints.multi_timeline.variables}?${attribute}`, variablesList => {\n      dispatch(receiveVariablesList(variablesList));\n    }, error => {\n      dispatch(errorReceivingVariablesList(error));\n    });\n  } else {\n    return dispatch(receiveVariablesList(emptyObject));\n  }\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveVariableWithId = variable => ({\n    type: FINISH_SINGLE_VARIABLE, variable\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingVariableWithId = error => ({\n    type: ERROR_SINGLE_VARIABLE, error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadVariableWithId = (url, role) => dispatch => {\n    dispatch({type: START_SINGLE_VARIABLE});\n    if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n        return LdFetch.get(url, variable => {\n            dispatch(receiveVariableWithId(variable));\n        }, error => {\n            dispatch(errorReceivingVariableWithId(error));\n        });\n    } else {\n        return dispatch(receiveVariableWithId(emptyObject));\n    }\n};\n// --------------------------------------------------------------------------------------\nexport const exportDatawarehouseData = (exportType) => (dispatch) => {\n    const url = `${CONFIG.backend.services.datawarehouse.base_url}${CONFIG.backend.services.datawarehouse.endpoints.assets}`;\n\n    if (exportType === \"CSV\") {\n        return dispatch(downloadCSV(url, null, 'text/csv'));\n    } else if (exportType === \"JSON\") {\n        return dispatch(downloadCSV(url, null, 'application/json'));\n    } else if (exportType === \"EXCEL\") {\n        return dispatch(downloadCSV(url, null, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'));\n    } else {\n        throw new Error(\"Unsupported Export-Type.\")\n    }\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveVariablesWithLimitsList = variablesWithLimitsList => ({\n  type: FINISH_VARIABLES_WITH_LIMITS_LIST,\n  variablesWithLimitsList,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingVariablesWithLimitsList = error => ({\n  type: ERROR_VARIABLES_WITH_LIMITS_LIST,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadVariablesWithLimits = (machineId, role = null) => dispatch => {\n  dispatch({ type: START_VARIABLES_WITH_LIMITS_LIST });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    return LdFetch.get(`${CONFIG.backend.services.limits.base_url}${CONFIG.backend.services.limits.endpoints.machines}/${machineId}${CONFIG.backend.services.limits.endpoints.limits}`, variablesWithLimitsList => {\n      dispatch(receiveVariablesWithLimitsList(variablesWithLimitsList));\n    }, error => {\n      dispatch(errorReceivingVariablesList(error));\n    });\n  } else {\n    return dispatch(errorReceivingVariablesWithLimitsList(emptyObject));\n  }\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveCollectionsList = (collectionsList, requestId = null) => ({\n  type: FINISH_COLLECTIONS_LIST,\n  collectionsList,\n  requestId,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingCollectionsList = (error, requestId = null) => ({\n  type: ERROR_COLLECTIONS_LIST,\n  error,\n  requestId,\n});\n\n// BE needs visibilityType, Available values : ALL, EXTERNAL, INTERNAL\n// Default value : EXTERNAL\n// --------------------------------------------------------------------------------------\nexport const loadCollections = (role, visibilityType = VisibilityType.External, requestId = null) => dispatch => {\n  dispatch({ type: START_COLLECTIONS_LIST });\n  if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n    return LdFetch.get(`${TIMESERIES_BACKEND.base_url}${TIMESERIES_BACKEND.endpoints.multi_timeline.collections}?visibilityType=${visibilityType}`, collectionsList => {\n      dispatch(receiveCollectionsList(collectionsList, requestId));\n    }, error => {\n      dispatch(errorReceivingCollectionsList(error, requestId));\n    });\n  } else {\n    return dispatch(receiveCollectionsList(emptyObject));\n  }\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveSingleCollection = collection => ({\n    type: FINISH_SINGLE_COLLECTION, collection,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorReceivingSingleCollection = error => ({\n    type: ERROR_SINGLE_COLLECTION, error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const loadCollectionWithId = (url, role) => dispatch => {\n    dispatch({type: START_SINGLE_COLLECTION});\n    if (role != null ? newSendRequestCheckup(role) : sendRequest(store.getState())) {\n        return LdFetch.get(url, collection => {\n            dispatch(receiveSingleCollection(collection));\n        }, error => {\n            dispatch(errorReceivingSingleCollection(error));\n        });\n    } else {\n        return dispatch(receiveSingleCollection(emptyObject));\n    }\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport LdFetch from '../../../js/LdFetch';\nimport { baseConfig as CONFIG } from '../../../auto-generated/config';\nimport { extractUuidFromURI } from '../../../js/LdGlobal';\n\nexport const START_LOADING_USER_LIST = 'START_LOADING_USER_LIST';\nexport const FINISH_LOADING_USER_LIST = 'FINISH_LOADING_USER_LIST';\nexport const ERROR_LOADING_USER_LIST = 'ERROR_LOADING_USER_LIST';\n\nexport const START_ADD_USER = 'START_ADD_USER';\nexport const FINISH_ADD_USER = 'FINISH_ADD_USER';\nexport const ERROR_ADD_USER = 'ERROR_ADD_USER';\nexport const CLEAR_ADD_USER = 'CLEAR_ADD_USER';\n\nexport const START_EDIT_USER = 'START_EDIT_USER';\nexport const FINISH_EDIT_USER = 'FINISH_EDIT_USER';\nexport const ERROR_EDIT_USER = 'ERROR_EDIT_USER';\nexport const CLEAR_EDIT_USER = 'CLEAR_EDIT_USER';\n\nexport const START_DELETE_USER = 'START_DELETE_USER';\nexport const ERROR_DELETE_USER = 'ERROR_DELETE_USER';\nexport const FINISH_DELETE_USER = 'FINISH_DELETE_USER';\nexport const CLEAR_DELETE_USER = 'CLEAR_DELETE_USER';\n\nexport const START_LOADING_USER_COMPANY_INFO = 'START_LOADING_USER_COMPANY_INFO';\nexport const FINISH_LOADING_USER_COMPANY_INFO = 'FINISH_LOADING_USER_COMPANY_INFO';\nexport const ERROR_LOADING_USER_COMPANY_INFO = 'ERROR_LOADING_USER_COMPANY_INFO';\nexport const CLEAR_USER_COMPANY_INFO = 'CLEAR_USER_COMPANY_INFO';\n\nexport const START_LOADING_USER_INFORMATION_OVER_ID = 'START_LOADING_USER_INFORMATION_OVER_ID';\nexport const FINISH_LOADING_USER_INFORMATION_OVER_ID = 'FINISH_LOADING_USER_INFORMATION_OVER_ID';\nexport const ERROR_LOADING_USER_INFORMATION_OVER_ID = 'ERROR_LOADING_USER_INFORMATION_OVER_ID';\n\nexport const START_LOADING_USER_INFORMATION = 'START_LOADING_USER_INFORMATION';\nexport const FINISH_LOADING_USER_INFORMATION = 'FINISH_LOADING_USER_INFORMATION';\nexport const ERROR_LOADING_USER_INFORMATION = 'ERROR_LOADING_USER_INFORMATION';\n\nexport const START_WRITE_USER_SETTINGS = 'START_WRITE_USER_SETTINGS';\nexport const FINISH_WRITE_USER_SETTINGS = 'FINISH_WRITE_USER_SETTINGS';\nexport const ERROR_WRITE_USER_SETTINGS = 'ERROR_WRITE_USER_SETTINGS';\n\nexport const FINISH_UPDATE_OWN_USER = \"FINISH_UPDATE_OWN_USER\";\nexport const ERROR_UPDATE_OWN_USER = \"ERROR_UPDATE_OWN_USER\";\nexport const START_UPDATE_OWN_USER = \"START_UPDATE_OWN_USER\";\nexport const START_MAIL_USER = 'START_MAIL_USER';\nexport const FINISH_MAIL_USER = 'FINISH_MAIL_USER';\nexport const ERROR_MAIL_USER = 'ERROR_MAIL_USER';\nexport const CLEAR_MAIL_USER = 'CLEAR_MAIL_USER';\n\nconst USERS_BACKEND = CONFIG.backend.services.users;\n\n// --------------------------------------------------------------------------------------\nconst receiveLoadUserCompanyInfo = companyInfo => ({\n  type: FINISH_LOADING_USER_COMPANY_INFO,\n  companyInfo\n});\n\nconst errorReceivingLoadUserCompanyInfo = error => ({\n  type: ERROR_LOADING_USER_COMPANY_INFO,\n  error\n});\n\n\n\nexport const loadUserCompanyInfo = companyId => dispatch => {\n  dispatch({ type: START_LOADING_USER_COMPANY_INFO });\n\n\n  return LdFetch.get(`${CONFIG.backend.services.assets.base_url}${CONFIG.backend.services.assets.endpoints.companies}/${companyId}`, companyInfo => {\n    dispatch(receiveLoadUserCompanyInfo(companyInfo));\n  }, error => {\n    dispatch(errorReceivingLoadUserCompanyInfo(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveUserList = userList => ({\n  type: FINISH_LOADING_USER_LIST,\n  userList\n});\n\nconst errorReceivingUserList = error => ({\n  type: ERROR_LOADING_USER_LIST,\n  error\n});\n\nexport const loadAllUsersList = () => dispatch => {\n  dispatch({ type: START_LOADING_USER_LIST });\n  return LdFetch.get(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.userlist}`, userList => {\n    dispatch(receiveUserList(userList));\n  }, error => {\n    dispatch(errorReceivingUserList(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveAddUser = user => ({\n  type: FINISH_ADD_USER,\n  user\n});\n\nconst errorAddUser = error => ({\n  type: ERROR_ADD_USER,\n  error\n});\n\nexport const addUser = payload => dispatch => {\n  dispatch({ type: START_ADD_USER });\n  return LdFetch.post(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.new}`, payload, user => {\n    addAuthToUser(extractUuidFromURI(user), payload.company, (res) => {\n      dispatch(receiveAddUser(user));\n    }, (error) => dispatch(errorAddUser(error)))\n  }, error => {\n    dispatch(errorAddUser(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nconst receiveEditUser = userEdit => ({\n  type: FINISH_EDIT_USER,\n  userEdit\n});\n\nconst errorEditUser = error => ({\n  type: ERROR_EDIT_USER,\n  error\n});\n\nexport const editUser = (payload, id) => dispatch => {\n  dispatch({ type: START_EDIT_USER });\n  return LdFetch.patch(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.user_edit}/${id}`, payload, userEdit => {\n    addAuthToUser(userEdit.id, userEdit.company, (res) => {\n      dispatch(receiveEditUser(userEdit));\n    }, (error) => dispatch(errorEditUser(error)))\n  }, error => {\n    dispatch(errorEditUser(error));\n  });\n};\n\nconst addAuthToUser = async (userUuid, userCompany, callback, errorCallback) => {\n  const url = CONFIG.backend.services.auth.base_url;\n  const requestUrl = url + \"/add\" + \"?type=children\";\n  const payload = {\n      asset_id: \"/companies/\" + userCompany,\n      user_id: userUuid\n  };\n\n  LdFetch.post(requestUrl, payload, (result) => {\n    callback(result);\n  }, (error) => {\n    errorCallback(error);\n  })\n}\n\nconst receiveDeleteUser = deletedUser => ({\n  type: FINISH_DELETE_USER,\n  deletedUser\n});\n\nexport const deleteUser = (id) => dispatch => {\n  dispatch({ type: START_DELETE_USER });\n  return LdFetch.delete(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.user_delete}/${id}`, (response) => {\n    dispatch(receiveDeleteUser(response));\n  }, error => {\n    dispatch(errorDeleteUser(error));\n  });\n};\n\nconst errorDeleteUser = error => ({\n  type: ERROR_DELETE_USER,\n  error\n});\n\n// --------------------------------------------------------------------------------------\nexport const clearUserRequest = () => dispatch => {\n  dispatch({ type: CLEAR_ADD_USER });\n  dispatch({ type: CLEAR_EDIT_USER });\n  dispatch({ type: CLEAR_DELETE_USER });\n  dispatch({ type: CLEAR_MAIL_USER });\n\n};\n\nexport const clearCompanyInfo = () => ({\n  type: CLEAR_USER_COMPANY_INFO\n})\n\n// --------------------------------------------------------------------------------------\nconst receiveLoadUserInformationOverId = userInfoId => ({\n  type: FINISH_LOADING_USER_INFORMATION_OVER_ID,\n  userInfoId\n});\n\nconst errorReceivingLoadUserInformationOverId = error => ({\n  type: ERROR_LOADING_USER_INFORMATION_OVER_ID,\n  error\n});\n\nexport const loadUserInformationOverId = id => dispatch => {\n  const link = id != null ? `${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.accountinfo}/${id}` : `${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.userinfo}`;\n  dispatch({ type: START_LOADING_USER_INFORMATION_OVER_ID });\n  return LdFetch.get(link, userInfoId => {\n    dispatch(receiveLoadUserInformationOverId(userInfoId));\n    dispatch(loadUserCompanyInfo(userInfoId.company));\n  }, error => {\n    dispatch(errorReceivingLoadUserInformationOverId(error));\n  });\n};\n\n\n\n// --------------------------------------------------------------------------------------\nconst receiveLoadWriteUserSettings = (settingsKey, settingsObject) => ({\n  type: FINISH_WRITE_USER_SETTINGS,\n  settingsKey,\n  settingsObject\n});\n\nconst errorReceivingWriteUserSettings = error => ({\n  type: ERROR_WRITE_USER_SETTINGS,\n  error\n});\n\nexport const writeUserSettings = (url, settingsKey, settingsObj) => dispatch => {\n  dispatch({ type: START_WRITE_USER_SETTINGS });\n  return LdFetch.put(`${url}/${settingsKey}`, settingsObj, UserSettings => {\n    dispatch(receiveLoadWriteUserSettings(UserSettings, settingsObj));\n  }, error => {\n    dispatch(errorReceivingWriteUserSettings(error));\n  });\n};\n\nconst receiveUpdateOwnUser = (settingsKey, settingsObject) => ({\n  type: FINISH_UPDATE_OWN_USER,\n  settingsKey,\n  settingsObject\n});\n\nconst errorUpdateOwnUser = error => ({\n  type: ERROR_UPDATE_OWN_USER,\n  error\n});\n\nexport const updateOwnUser = (url, dataToUpdate) => dispatch => {\n  dispatch({ type: START_UPDATE_OWN_USER });\n  return LdFetch.patch(`${url}`, dataToUpdate, userSetting => {\n    dispatch(receiveUpdateOwnUser(userSetting, dataToUpdate));\n  }, error => {\n    dispatch(errorUpdateOwnUser(error));\n  });\n};\n\nconst receiveMailUser = userMail => ({\n  type: FINISH_MAIL_USER,\n  userMail,\n});\n\nconst errorMailUser = error => ({\n  type: ERROR_MAIL_USER,\n  error,\n});\n\nexport const mailUser = (payload, id) => dispatch => {\n  dispatch({ type: START_MAIL_USER });\n  return LdFetch.patch(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.user_edit}/${id}/reset`, payload, userMail => {\n    dispatch(receiveMailUser(userMail));\n  }, error => {\n    dispatch(errorMailUser(error));\n  });\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport LdFetch from '../../../js/LdFetch';\n// eslint-disable-next-line import/no-cycle\nimport { baseConfig as CONFIG } from '../../../auto-generated/config';\nimport { logoutUser, redirectLogin } from '../../../js/LdGlobal';\nimport { checkUserState } from '../ld-localstorage';\n\nexport const START_LOADING_USER_INFORMATION = 'START_LOADING_USER_INFORMATION';\nexport const FINISH_LOADING_USER_INFORMATION = 'FINISH_LOADING_USER_INFORMATION';\nexport const ERROR_LOADING_USER_INFORMATION = 'ERROR_LOADING_USER_INFORMATION';\n\nexport const START_LOADING_USER_SETTINGS = 'START_LOADING_USER_SETTINGS';\nexport const FINISH_LOADING_USER_SETTINGS = 'FINISH_LOADING_USER_SETTINGS';\nexport const ERROR_LOADING_USER_SETTINGS = 'ERROR_LOADING_USER_SETTINGS';\n\nexport const START_LOADING_SAVED_USER_SETTINGS = 'START_LOADING_SAVED_USER_SETTINGS';\nexport const FINISH_LOADING_SAVED_USER_SETTINGS = 'FINISH_LOADING_SAVED_USER_SETTINGS';\nexport const ERROR_LOADING_SAVED_USER_SETTINGS = 'ERROR_LOADING_SAVED_USER_SETTINGS';\nexport const LOGOUT_STATUS = 'LOGOUT_STATUS';\n\nconst USERS_BACKEND = CONFIG.backend.services.users;\nconst AUTH_BACKEND = CONFIG.backend.services.auth;\n\n// --------------------------------------------------------------------------------------\nexport const logout = (message = null) => () => {\n  logoutUser(message);\n};\n\n\n// --------------------------------------------------------------------------------------\nconst receiveUserSettings = (setting, userSettings) => ({\n  type: FINISH_LOADING_USER_SETTINGS,\n  setting,\n  userSettings\n});\n\nconst errorReceivingUserSettings = (setting, error) => ({\n  type: ERROR_LOADING_USER_SETTINGS,\n  setting,\n  error\n});\n\n// --------------------------------------------------------------------------------------\nconst receiveUserInformation = userInfo => ({\n  type: FINISH_LOADING_USER_INFORMATION,\n  userInfo\n});\n\nconst errorReceivingUserInformation = error => ({\n  type: ERROR_LOADING_USER_INFORMATION,\n  error\n});\n\nexport const loadUserInformation = () => dispatch => {\n  dispatch({ type: START_LOADING_USER_INFORMATION });\n  return LdFetch.get(`${USERS_BACKEND.base_url}${USERS_BACKEND.endpoints.userinfo}`, userInfo => {\n    if (!userInfo) {\n      console.error(\"No user info was set.\");\n      return;\n    }\n    checkUserState(userInfo);\n    dispatch(receiveUserInformation(userInfo));\n  }, error => {\n    dispatch(errorReceivingUserInformation(error));\n  });\n};\n\n// --------------------------------------------------------------------------------------\nexport const checkUserToken = isInitialRequest => dispatch => {\n  LdFetch.post(`${AUTH_BACKEND.base_url}${AUTH_BACKEND.endpoints.refresh}`, {}, refreshSuccess => {\n    return true;\n  }, refreshError => {\n    if (!isInitialRequest) {\n      redirectLogin('session_timeout');\n    }\n  });\n};\n\nexport const acceptPrivacyPolicy = hasAccepted => dispatch => {\n  if (!hasAccepted) return dispatch(logout('policy_not_accepted'));\n  return true;\n};\n\n// --------------------------------------------------------------------------------------\nexport const getFromLocalStorage = key => {\n  const prefix = CONFIG.localstorage.storage_key;\n  return localStorage.getItem(prefix + \"_\" +key);\n}\n\n// --------------------------------------------------------------------------------------\nexport const saveToLocalStorage = (key, value) => {\n  const prefix = CONFIG.localstorage.storage_key;\n  localStorage.setItem(prefix + \"_\" +key, value);\n}\n\n// --------------------------------------------------------------------------------------\nconst receiveSavedUserSettings = (setting, savedUserSettings) => ({\n  type: FINISH_LOADING_SAVED_USER_SETTINGS,\n  setting,\n  savedUserSettings\n});\n\nconst errorReceivingSavedUserSettings = (setting, error) => ({\n  type: ERROR_LOADING_SAVED_USER_SETTINGS,\n  setting,\n  error\n});\n\nexport const loadUserSetting = key => dispatch => {\n  dispatch({ type: START_LOADING_USER_SETTINGS });\n  return LdFetch.get(`${CONFIG.backend.services.save_user_settings.base_url}${CONFIG.backend.services.save_user_settings.endpoints.settings}/${key}`, setting => {\n    dispatch(receiveUserSettings(key, setting));\n  }, error => {\n    dispatch(errorReceivingUserSettings(key, error));\n  });\n};\n\nexport const saveUserSetting = (key, setting) => dispatch => {\n  dispatch({ type: START_LOADING_SAVED_USER_SETTINGS });\n  return LdFetch.post(`${CONFIG.backend.services.save_user_settings.base_url}${CONFIG.backend.services.save_user_settings.endpoints.settings}/${key}`, setting, userSettings => {\n    dispatch(receiveSavedUserSettings(key, userSettings));\n  }, error => {\n    dispatch(errorReceivingSavedUserSettings(key, error));\n  });\n};\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint-disable import/no-cycle */\n\nimport { baseConfig } from '../../auto-generated/config';\n\nconst STORAGE = baseConfig.localstorage.storage_key;\n\n// --------------------------------------------------------------------------------------\nexport const checkUserState = userInfo => {\n  const _userId = userInfo.user_id;\n\n  const json = localStorage.getItem(STORAGE) || '{}';\n  const _savedData = JSON.parse(json);\n\n  const { userId } = _savedData;\n  window.SWCP.__loaded = true;\n  if (userId !== _userId) {\n    clearState(_userId);\n  }\n};\n\n// --------------------------------------------------------------------------------------\nexport const getUserState = _userId => {\n  const json = localStorage.getItem(STORAGE) || '{}';\n  const _savedData = JSON.parse(json);\n\n  const { userId } = _savedData;\n  return userId === _userId;\n};\n\n// --------------------------------------------------------------------------------------\nexport const clearState = userId => {\n  const LdAssetsReducer = {};\n  LdAssetsReducer.dashboardLines = [];\n  const stringifiedNewState = JSON.stringify({ LdAssetsReducer, userId });\n  window.SWCP.__shouldInvalidate = true;\n  localStorage.setItem(STORAGE, stringifiedNewState);\n};\n\n// --------------------------------------------------------------------------------------\nexport const saveState = state => {\n\n  if (state.LdUsersReducer.info != null) {\n    checkUserState(state.LdUsersReducer.info, state);\n\n    if (window.SWCP.__shouldInvalidate) {\n      state.LdAssetsReducer = {};\n      window.SWCP.__shouldInvalidate = false;\n    }\n\n    const json = localStorage.getItem(STORAGE) || '{}';\n    const _savedData = JSON.parse(json);\n\n    const LdAssetsReducer = {};\n    if (window.SWCP.__loaded && state.LdAssetsReducer != null && state.LdAssetsReducer.dashboardCards != null) {\n      LdAssetsReducer.dashboardCards = state.LdAssetsReducer.dashboardCards;\n    }\n\n    let { userId } = _savedData;\n    let { main_group } = _savedData;\n\n    if (state.LdUsersReducer.info != null && state.LdUsersReducer.info.id) {\n      if (_savedData.userId && _savedData.userId !== state.LdUsersReducer.info.id) {\n        clearState(state.LdUsersReducer.info.id);\n        return;\n      }\n      userId = state.LdUsersReducer.info.id;\n      main_group = state.LdUsersReducer.info.role;\n    }\n\n    const stringifiedNewState = JSON.stringify({ LdAssetsReducer, userId, main_group });\n    if (stringifiedNewState !== json && stringifiedNewState !== '{}' && state.LdUsersReducer.info != null && getUserState(state.LdUsersReducer.info.id)) {\n      localStorage.setItem(STORAGE, stringifiedNewState);\n    }\n\n  }\n};\n\n\n// --------------------------------------------------------------------------------------\nexport const loadState = () => {\n\n  const json = localStorage.getItem(STORAGE) || '{}';\n\n  const state = JSON.parse(json);\n\n  return state || undefined;\n};\n","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function (r) {\n      return Object.getOwnPropertyDescriptor(e, r).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n      defineProperty(e, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n      Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return e;\n}\nexport { _objectSpread2 as default };","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n  return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n  return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n  return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n  INIT: \"@@redux/INIT\" + randomString(),\n  REPLACE: \"@@redux/REPLACE\" + randomString(),\n  PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n    return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n  }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n  if (typeof obj !== 'object' || obj === null) return false;\n  var proto = obj;\n\n  while (Object.getPrototypeOf(proto) !== null) {\n    proto = Object.getPrototypeOf(proto);\n  }\n\n  return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n  if (val === void 0) return 'undefined';\n  if (val === null) return 'null';\n  var type = typeof val;\n\n  switch (type) {\n    case 'boolean':\n    case 'string':\n    case 'number':\n    case 'symbol':\n    case 'function':\n      {\n        return type;\n      }\n  }\n\n  if (Array.isArray(val)) return 'array';\n  if (isDate(val)) return 'date';\n  if (isError(val)) return 'error';\n  var constructorName = ctorName(val);\n\n  switch (constructorName) {\n    case 'Symbol':\n    case 'Promise':\n    case 'WeakMap':\n    case 'WeakSet':\n    case 'Map':\n    case 'Set':\n      return constructorName;\n  } // other\n\n\n  return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n  return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n  return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n  if (val instanceof Date) return true;\n  return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n  var typeOfVal = typeof val;\n\n  if (process.env.NODE_ENV !== 'production') {\n    typeOfVal = miniKindOf(val);\n  }\n\n  return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n  var _ref2;\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n  }\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n    enhancer = preloadedState;\n    preloadedState = undefined;\n  }\n\n  if (typeof enhancer !== 'undefined') {\n    if (typeof enhancer !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n    }\n\n    return enhancer(createStore)(reducer, preloadedState);\n  }\n\n  if (typeof reducer !== 'function') {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n  }\n\n  var currentReducer = reducer;\n  var currentState = preloadedState;\n  var currentListeners = [];\n  var nextListeners = currentListeners;\n  var isDispatching = false;\n  /**\n   * This makes a shallow copy of currentListeners so we can use\n   * nextListeners as a temporary list while dispatching.\n   *\n   * This prevents any bugs around consumers calling\n   * subscribe/unsubscribe in the middle of a dispatch.\n   */\n\n  function ensureCanMutateNextListeners() {\n    if (nextListeners === currentListeners) {\n      nextListeners = currentListeners.slice();\n    }\n  }\n  /**\n   * Reads the state tree managed by the store.\n   *\n   * @returns {any} The current state tree of your application.\n   */\n\n\n  function getState() {\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n    }\n\n    return currentState;\n  }\n  /**\n   * Adds a change listener. It will be called any time an action is dispatched,\n   * and some part of the state tree may potentially have changed. You may then\n   * call `getState()` to read the current state tree inside the callback.\n   *\n   * You may call `dispatch()` from a change listener, with the following\n   * caveats:\n   *\n   * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n   * If you subscribe or unsubscribe while the listeners are being invoked, this\n   * will not have any effect on the `dispatch()` that is currently in progress.\n   * However, the next `dispatch()` call, whether nested or not, will use a more\n   * recent snapshot of the subscription list.\n   *\n   * 2. The listener should not expect to see all state changes, as the state\n   * might have been updated multiple times during a nested `dispatch()` before\n   * the listener is called. It is, however, guaranteed that all subscribers\n   * registered before the `dispatch()` started will be called with the latest\n   * state by the time it exits.\n   *\n   * @param {Function} listener A callback to be invoked on every dispatch.\n   * @returns {Function} A function to remove this change listener.\n   */\n\n\n  function subscribe(listener) {\n    if (typeof listener !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n    }\n\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n    }\n\n    var isSubscribed = true;\n    ensureCanMutateNextListeners();\n    nextListeners.push(listener);\n    return function unsubscribe() {\n      if (!isSubscribed) {\n        return;\n      }\n\n      if (isDispatching) {\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n      }\n\n      isSubscribed = false;\n      ensureCanMutateNextListeners();\n      var index = nextListeners.indexOf(listener);\n      nextListeners.splice(index, 1);\n      currentListeners = null;\n    };\n  }\n  /**\n   * Dispatches an action. It is the only way to trigger a state change.\n   *\n   * The `reducer` function, used to create the store, will be called with the\n   * current state tree and the given `action`. Its return value will\n   * be considered the **next** state of the tree, and the change listeners\n   * will be notified.\n   *\n   * The base implementation only supports plain object actions. If you want to\n   * dispatch a Promise, an Observable, a thunk, or something else, you need to\n   * wrap your store creating function into the corresponding middleware. For\n   * example, see the documentation for the `redux-thunk` package. Even the\n   * middleware will eventually dispatch plain object actions using this method.\n   *\n   * @param {Object} action A plain object representing “what changed”. It is\n   * a good idea to keep actions serializable so you can record and replay user\n   * sessions, or use the time travelling `redux-devtools`. An action must have\n   * a `type` property which may not be `undefined`. It is a good idea to use\n   * string constants for action types.\n   *\n   * @returns {Object} For convenience, the same action object you dispatched.\n   *\n   * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n   * return something else (for example, a Promise you can await).\n   */\n\n\n  function dispatch(action) {\n    if (!isPlainObject(action)) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n    }\n\n    if (typeof action.type === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n    }\n\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n    }\n\n    try {\n      isDispatching = true;\n      currentState = currentReducer(currentState, action);\n    } finally {\n      isDispatching = false;\n    }\n\n    var listeners = currentListeners = nextListeners;\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      listener();\n    }\n\n    return action;\n  }\n  /**\n   * Replaces the reducer currently used by the store to calculate the state.\n   *\n   * You might need this if your app implements code splitting and you want to\n   * load some of the reducers dynamically. You might also need this if you\n   * implement a hot reloading mechanism for Redux.\n   *\n   * @param {Function} nextReducer The reducer for the store to use instead.\n   * @returns {void}\n   */\n\n\n  function replaceReducer(nextReducer) {\n    if (typeof nextReducer !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n    }\n\n    currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n    // Any reducers that existed in both the new and old rootReducer\n    // will receive the previous state. This effectively populates\n    // the new state tree with any relevant data from the old one.\n\n    dispatch({\n      type: ActionTypes.REPLACE\n    });\n  }\n  /**\n   * Interoperability point for observable/reactive libraries.\n   * @returns {observable} A minimal observable of state changes.\n   * For more information, see the observable proposal:\n   * https://github.com/tc39/proposal-observable\n   */\n\n\n  function observable() {\n    var _ref;\n\n    var outerSubscribe = subscribe;\n    return _ref = {\n      /**\n       * The minimal observable subscription method.\n       * @param {Object} observer Any object that can be used as an observer.\n       * The observer object should have a `next` method.\n       * @returns {subscription} An object with an `unsubscribe` method that can\n       * be used to unsubscribe the observable from the store, and prevent further\n       * emission of values from the observable.\n       */\n      subscribe: function subscribe(observer) {\n        if (typeof observer !== 'object' || observer === null) {\n          throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n        }\n\n        function observeState() {\n          if (observer.next) {\n            observer.next(getState());\n          }\n        }\n\n        observeState();\n        var unsubscribe = outerSubscribe(observeState);\n        return {\n          unsubscribe: unsubscribe\n        };\n      }\n    }, _ref[$$observable] = function () {\n      return this;\n    }, _ref;\n  } // When a store is created, an \"INIT\" action is dispatched so that every\n  // reducer returns their initial state. This effectively populates\n  // the initial state tree.\n\n\n  dispatch({\n    type: ActionTypes.INIT\n  });\n  return _ref2 = {\n    dispatch: dispatch,\n    subscribe: subscribe,\n    getState: getState,\n    replaceReducer: replaceReducer\n  }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n  /* eslint-disable no-console */\n  if (typeof console !== 'undefined' && typeof console.error === 'function') {\n    console.error(message);\n  }\n  /* eslint-enable no-console */\n\n\n  try {\n    // This error was thrown as a convenience so that if you enable\n    // \"break on all exceptions\" in your console,\n    // it would pause the execution at this line.\n    throw new Error(message);\n  } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n  var reducerKeys = Object.keys(reducers);\n  var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n  if (reducerKeys.length === 0) {\n    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n  }\n\n  if (!isPlainObject(inputState)) {\n    return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n  }\n\n  var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n    return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n  });\n  unexpectedKeys.forEach(function (key) {\n    unexpectedKeyCache[key] = true;\n  });\n  if (action && action.type === ActionTypes.REPLACE) return;\n\n  if (unexpectedKeys.length > 0) {\n    return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n  }\n}\n\nfunction assertReducerShape(reducers) {\n  Object.keys(reducers).forEach(function (key) {\n    var reducer = reducers[key];\n    var initialState = reducer(undefined, {\n      type: ActionTypes.INIT\n    });\n\n    if (typeof initialState === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n    }\n\n    if (typeof reducer(undefined, {\n      type: ActionTypes.PROBE_UNKNOWN_ACTION()\n    }) === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n    }\n  });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n  var reducerKeys = Object.keys(reducers);\n  var finalReducers = {};\n\n  for (var i = 0; i < reducerKeys.length; i++) {\n    var key = reducerKeys[i];\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (typeof reducers[key] === 'undefined') {\n        warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n      }\n    }\n\n    if (typeof reducers[key] === 'function') {\n      finalReducers[key] = reducers[key];\n    }\n  }\n\n  var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n  // keys multiple times.\n\n  var unexpectedKeyCache;\n\n  if (process.env.NODE_ENV !== 'production') {\n    unexpectedKeyCache = {};\n  }\n\n  var shapeAssertionError;\n\n  try {\n    assertReducerShape(finalReducers);\n  } catch (e) {\n    shapeAssertionError = e;\n  }\n\n  return function combination(state, action) {\n    if (state === void 0) {\n      state = {};\n    }\n\n    if (shapeAssertionError) {\n      throw shapeAssertionError;\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n      if (warningMessage) {\n        warning(warningMessage);\n      }\n    }\n\n    var hasChanged = false;\n    var nextState = {};\n\n    for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n      var _key = finalReducerKeys[_i];\n      var reducer = finalReducers[_key];\n      var previousStateForKey = state[_key];\n      var nextStateForKey = reducer(previousStateForKey, action);\n\n      if (typeof nextStateForKey === 'undefined') {\n        var actionType = action && action.type;\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n      }\n\n      nextState[_key] = nextStateForKey;\n      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n    }\n\n    hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n    return hasChanged ? nextState : state;\n  };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n  return function () {\n    return dispatch(actionCreator.apply(this, arguments));\n  };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n  if (typeof actionCreators === 'function') {\n    return bindActionCreator(actionCreators, dispatch);\n  }\n\n  if (typeof actionCreators !== 'object' || actionCreators === null) {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n  }\n\n  var boundActionCreators = {};\n\n  for (var key in actionCreators) {\n    var actionCreator = actionCreators[key];\n\n    if (typeof actionCreator === 'function') {\n      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n    }\n  }\n\n  return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  if (funcs.length === 0) {\n    return function (arg) {\n      return arg;\n    };\n  }\n\n  if (funcs.length === 1) {\n    return funcs[0];\n  }\n\n  return funcs.reduce(function (a, b) {\n    return function () {\n      return a(b.apply(void 0, arguments));\n    };\n  });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n  for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n    middlewares[_key] = arguments[_key];\n  }\n\n  return function (createStore) {\n    return function () {\n      var store = createStore.apply(void 0, arguments);\n\n      var _dispatch = function dispatch() {\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n      };\n\n      var middlewareAPI = {\n        getState: store.getState,\n        dispatch: function dispatch() {\n          return _dispatch.apply(void 0, arguments);\n        }\n      };\n      var chain = middlewares.map(function (middleware) {\n        return middleware(middlewareAPI);\n      });\n      _dispatch = compose.apply(void 0, chain)(store.dispatch);\n      return _objectSpread(_objectSpread({}, store), {}, {\n        dispatch: _dispatch\n      });\n    };\n  };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","/** A function that accepts a potential \"extra argument\" value to be injected later,\r\n * and returns an instance of the thunk middleware that uses that value\r\n */\nfunction createThunkMiddleware(extraArgument) {\n  // Standard Redux middleware definition pattern:\n  // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware\n  var middleware = function middleware(_ref) {\n    var dispatch = _ref.dispatch,\n        getState = _ref.getState;\n    return function (next) {\n      return function (action) {\n        // The thunk middleware looks for any functions that were passed to `store.dispatch`.\n        // If this \"action\" is really a function, call it and return the result.\n        if (typeof action === 'function') {\n          // Inject the store's `dispatch` and `getState` methods, as well as any \"extra arg\"\n          return action(dispatch, getState, extraArgument);\n        } // Otherwise, pass the action down the middleware chain as usual\n\n\n        return next(action);\n      };\n    };\n  };\n\n  return middleware;\n}\n\nvar thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version\n// with whatever \"extra arg\" they want to inject into their thunks\n\nthunk.withExtraArgument = createThunkMiddleware;\nexport default thunk;","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n// eslint-disable-next-line import/no-cycle\nimport {\n    CLEAR,\n    CLEAR_ALARMS,\n    CLEAR_AVAILABILITY_KPI_IOT,\n    EMPTY_ACTIVE_COLLECTION,\n    EMPTY_ACTIVE_VARIABLE, EMPTY_ITEM,\n    EMPTY_MULTI_CURRENT,\n    ERROR_COLLECTIONS_LIST,\n    ERROR_LOADING_ALARMS,\n    ERROR_LOADING_AVAILABILITY_KPI_IOT,\n    ERROR_LOADING_CHART,\n    ERROR_LOADING_CURRENT,\n    ERROR_LOADING_DETAILS,\n    ERROR_LOADING_MULTI_CURRENT,\n    ERROR_LOADING_MULTI_TIMELINE,\n    ERROR_LOADING_OVERRIDE,\n    ERROR_LOADING_WORKPIECE_COUNTER,\n    ERROR_SINGLE_COLLECTION,\n    ERROR_SINGLE_VARIABLE,\n    ERROR_VARIABLES_LIST,\n    ERROR_VARIABLES_WITH_LIMITS_LIST,\n    FINISH_COLLECTIONS_LIST,\n    FINISH_LOADING_ALARMS,\n    FINISH_LOADING_AVAILABILITY_KPI_IOT,\n    FINISH_LOADING_CHART,\n    FINISH_LOADING_CURRENT,\n    FINISH_LOADING_DETAILS,\n    FINISH_LOADING_MULTI_CURRENT,\n    FINISH_LOADING_MULTI_TIMELINE,\n    FINISH_LOADING_OVERRIDE,\n    FINISH_LOADING_WORKPIECE_COUNTER,\n    FINISH_SINGLE_COLLECTION,\n    FINISH_SINGLE_VARIABLE,\n    FINISH_VARIABLES_LIST,\n    FINISH_VARIABLES_WITH_LIMITS_LIST,\n    REMOVE_ENTRY_MULTI_TIMELINE,\n    START_COLLECTIONS_LIST,\n    START_LOADING_ALARMS,\n    START_LOADING_AVAILABILITY_KPI_IOT,\n    START_LOADING_CHART,\n    START_LOADING_CURRENT,\n    START_LOADING_DETAILS,\n    START_LOADING_MULTI_CURRENT,\n    START_LOADING_MULTI_TIMELINE,\n    START_LOADING_OVERRIDE,\n    START_LOADING_WORKPIECE_COUNTER,\n    START_SINGLE_COLLECTION,\n    START_SINGLE_VARIABLE,\n    START_VARIABLES_LIST,\n    START_VARIABLES_WITH_LIMITS_LIST\n} from '../actions/ld-timeseries-actions';\n\nconst LdTimeseriesReducer = (state = {}, action) => {\n    switch (action.type) {\n        case 'RESET_STATE':\n            return {};\n        case 'DUMMY_STATE':\n            return {...state, isDummy: true};\n\n        case 'RESET_STATE':\n            return {};\n\n        case CLEAR:\n            return {\n                ...state,\n                result: null,\n            };\n        case EMPTY_ACTIVE_COLLECTION:\n            return {\n                ...state,\n                activeCollection: null,\n                isSingleCollectionLoading: false\n            };\n\n        case EMPTY_ACTIVE_VARIABLE:\n            return {\n                ...state,\n                activeVariable: null,\n                isSingleVariableLoading: false\n            };\n        case EMPTY_ITEM:\n            return {\n                ...state,\n                variablesList: null,\n                isVariablesListLoading: false,\n                collectionsList: null,\n                isCollectionsListLoading: false,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_MULTI_CURRENT:\n            if (state.multiCurrentValueList == null) {\n                state.multiCurrentValueList = [];\n            }\n            if (state.isMultiCurrentValueLoading == null) {\n                state.isMultiCurrentValueLoading = [];\n            }\n            state.isMultiCurrentValueLoading = state.isMultiCurrentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.isMultiCurrentValueLoading.push({chartId: action.chartId, loading: true});\n            return {\n                ...state,\n                isMultiCurrentValueLoading: state.isMultiCurrentValueLoading,\n                multiCurrentValueList: state.multiCurrentValueList,\n            };\n        case FINISH_LOADING_MULTI_CURRENT:\n\n            state.isMultiCurrentValueLoading = state.isMultiCurrentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.isMultiCurrentValueLoading.push({chartId: action.chartId, loading: false});\n\n            state.multiCurrentValueList = state.multiCurrentValueList.filter(obj => obj.chartId !== action.chartId);\n            state.multiCurrentValueList.push({\n                chartId: action.chartId,\n                multiCurrentValueList: action.multiCurrentValueList\n            });\n            return {\n                ...state,\n                isMultiCurrentValueLoading: state.isMultiCurrentValueLoading,\n                multiCurrentValueList: state.multiCurrentValueList,\n            };\n        case ERROR_LOADING_MULTI_CURRENT:\n            state.isMultiCurrentValueLoading = state.isMultiCurrentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.isMultiCurrentValueLoading.push({chartId: action.chartId, loading: false});\n\n            return {\n                ...state,\n                result: action.error,\n                isMultiCurrentValueLoading: state.isMultiCurrentValueLoading,\n            };\n        case EMPTY_MULTI_CURRENT:\n\n            state.result = null;\n            if (state.multiCurrentValueList == null) {\n                state.multiCurrentValueList = [];\n            }\n            if (state.isMultiCurrentValueLoading == null) {\n                state.isMultiCurrentValueLoading = [];\n            }\n            state.multiCurrentValueList = state.multiCurrentValueList.filter(obj => obj.chartId !== action.chartId);\n            return {\n                ...state,\n                multiCurrentValueList: state.multiCurrentValueList,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_AVAILABILITY_KPI_IOT:\n            return {\n                ...state,\n                isIotKpiValueLoading: true,\n            };\n        case FINISH_LOADING_AVAILABILITY_KPI_IOT:\n\n            return {\n                ...state,\n                iotValueList: action.iotValueList,\n                kpiValueList: [action.kpiValueList, action.machineId],\n                isIotKpiValueLoading: false,\n            };\n        case ERROR_LOADING_AVAILABILITY_KPI_IOT:\n            return {\n                ...state,\n                result: action.error,\n                isIotKpiValueLoading: false,\n            };\n        case CLEAR_AVAILABILITY_KPI_IOT:\n            return {\n                ...state,\n                iotValueList: null,\n                kpiValueList: null,\n                isIotKpiValueLoading: false,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_MULTI_TIMELINE:\n            if (typeof state.multiTimeline === 'undefined') {\n                state.multiTimeline = [];\n            }\n            if (typeof state.multiTimelineLoading === 'undefined') {\n                state.multiTimelineLoading = [];\n            }\n            state.multiTimelineLoading = state.multiTimelineLoading.filter(obj => obj.chartId !== action.chartId);\n            state.multiTimelineLoading.push({chartId: action.chartId, loading: true});\n            return {\n                ...state,\n                multiTimelineLoading: state.multiTimelineLoading,\n                multiTimeline: state.multiTimeline,\n            };\n        case FINISH_LOADING_MULTI_TIMELINE:\n            state.multiTimelineLoading = state.multiTimelineLoading.filter(obj => obj.chartId !== action.chartId);\n            state.multiTimelineLoading.push({chartId: action.chartId, loading: false});\n            let machineId = action.machineId;\n            state.multiTimeline = state.multiTimeline.filter(obj => obj.chartId !== action.chartId);\n            state.multiTimeline.push({chartId: action.chartId, timelineData: action.result[machineId]});\n            return {\n                ...state,\n                multiTimelineLoading: state.multiTimelineLoading,\n                multiTimeline: state.multiTimeline,\n            };\n\n        case ERROR_LOADING_MULTI_TIMELINE:\n            state.multiTimelineLoading = state.multiTimelineLoading.filter(obj => obj.chartId !== action.chartId);\n            state.multiTimelineLoading.push({chartId: action.chartId, loading: false});\n            return {\n                ...state,\n                multiTimelineLoading: state.multiTimelineLoading,\n                result: action.error,\n            };\n        case REMOVE_ENTRY_MULTI_TIMELINE:\n            state.multiTimelineLoading = state.multiTimelineLoading.filter(obj => obj.chartId !== action.chartId);\n            state.multiTimeline = state.multiTimeline.filter(obj => obj.chartId !== action.chartId);\n            return {\n                ...state,\n                multiTimelineLoading: state.multiTimelineLoading,\n                multiTimeline: state.multiTimeline,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_CHART:\n            switch (action.chartType) {\n                case 'uptimeDistribution':\n                case 'runtimeMonitor':\n                case 'operationMode':\n                case 'cycleTime':\n                case 'availability':\n                case 'axisTest':\n                case 'combinedAvailability':\n                case 'processTime':\n                case 'gFunctionAndActiveTool':\n                case 'toolChange':\n                    if (typeof state.chartValue === 'undefined') {\n                        state.chartValue = [];\n                    }\n                    if (typeof state.chartValueLoading === 'undefined') {\n                        state.chartValueLoading = [];\n                    }\n                    state.chartValueLoading = state.chartValueLoading.filter(obj => obj.chartId !== action.chartId);\n                    state.chartValueLoading.push({chartId: action.chartId, loading: true});\n                    return {\n                        ...state,\n                        chartValueLoading: state.chartValueLoading,\n                        chartValue: state.chartValue,\n                    };\n                default:\n                    return state;\n            }\n\n        case FINISH_LOADING_CHART:\n            switch (action.chartType) {\n                case 'uptimeDistribution':\n                case 'runtimeMonitor':\n                case 'operationMode':\n                case 'cycleTime':\n                case 'axisTest':\n                case 'availability':\n                case 'combinedAvailability':\n                case 'processTime':\n                case 'gFunctionAndActiveTool':\n                case 'toolChange':\n                    state.chartValueLoading = state.chartValueLoading.filter(obj => obj.chartId !== action.chartId);\n                    state.chartValueLoading.push({chartId: action.chartId, loading: false});\n                    state.chartValue = state.chartValue.filter(obj => obj.chartId !== action.chartId);\n                    state.chartValue.push({chartId: action.chartId, timelineData: action.result});\n                    return {\n                        ...state,\n                        chartValueLoading: state.chartValueLoading,\n                        chartValue: state.chartValue,\n                    };\n                default:\n                    return state;\n            }\n\n        case ERROR_LOADING_CHART:\n            switch (action.chartType) {\n                case 'uptimeDistribution':\n                case 'runtimeMonitor':\n                case 'operationMode':\n                case 'cycleTime':\n                case 'availability':\n                case 'axisTest':\n                case 'combinedAvailability':\n                case 'processTime':\n                case 'gFunctionAndActiveTool':\n                case 'toolChange':\n                    state.chartValueLoading = state.chartValueLoading.filter(obj => obj.chartId !== action.chartId);\n                    state.chartValueLoading.push({chartId: action.chartId, loading: false});\n                    return {\n                        ...state,\n                        chartValueLoading: state.chartValueLoading,\n                        result: action.error,\n                    };\n                default:\n                    return state;\n            }\n\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_WORKPIECE_COUNTER:\n\n            if (typeof state.workpieceCounterData === 'undefined') {\n                state.workpieceCounterData = [];\n            }\n            if (typeof state.workpieceCounterLoading === 'undefined') {\n                state.workpieceCounterLoading = [];\n            }\n            state.workpieceCounterLoading = state.workpieceCounterLoading.filter(obj => obj.machineId !== action.machineId);\n            state.workpieceCounterLoading.push({machineId: action.machineId, loading: true});\n            return {\n                ...state,\n                workpieceCounterLoading: state.workpieceCounterLoading,\n                workpieceCounterData: state.workpieceCounterData,\n            };\n        case FINISH_LOADING_WORKPIECE_COUNTER:\n            state.workpieceCounterLoading = state.workpieceCounterLoading.filter(obj => obj.machineId !== action.machineId);\n            state.workpieceCounterLoading.push({machineId: action.machineId, loading: false});\n            state.workpieceCounterData = state.workpieceCounterData.filter(obj => obj.machineId !== action.machineId);\n            state.workpieceCounterData.push({machineId: action.machineId, workpieceCounterData: action.workpieceData});\n            return {\n                ...state,\n                workpieceCounterLoading: state.workpieceCounterLoading,\n                workpieceCounterData: state.workpieceCounterData,\n            };\n        case ERROR_LOADING_WORKPIECE_COUNTER:\n            state.workpieceCounterLoading = state.workpieceCounterLoading.filter(obj => obj.machineId !== action.machineId);\n            state.workpieceCounterLoading.push({machineId: action.machineId, loading: false});\n            return {\n                ...state,\n                workpieceCounterLoading: state.workpieceCounterLoading,\n                result: action.error,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_DETAILS:\n\n            if (typeof state.detailData === 'undefined') {\n                state.detailData = [];\n            }\n            if (typeof state.detailDataLoading === 'undefined') {\n                state.detailDataLoading = [];\n            }\n            state.detailDataLoading = state.detailDataLoading.filter(obj => obj.machineId !== action.machineId);\n            state.detailDataLoading.push({machineId: action.machineId, loading: true});\n            return {\n                ...state,\n                detailDataLoading: state.detailDataLoading,\n                detailData: state.detailData,\n            };\n        case FINISH_LOADING_DETAILS:\n            state.detailDataLoading = state.detailDataLoading.filter(obj => obj.machineId !== action.machineId);\n            state.detailDataLoading.push({machineId: action.machineId, loading: false});\n            state.detailData = state.detailData.filter(obj => obj.machineId !== action.machineId);\n            state.detailData.push({machineId: action.machineId, detailData: action.detailData});\n            return {\n                ...state,\n                detailDataLoading: state.detailDataLoading,\n                detailData: state.detailData,\n            };\n        case ERROR_LOADING_DETAILS:\n            state.detailDataLoading = state.detailDataLoading.filter(obj => obj.machineId !== action.machineId);\n            state.detailDataLoading.push({machineId: action.machineId, loading: false});\n            return {\n                ...state,\n                detailDataLoading: state.detailDataLoading,\n                result: action.error,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_ALARMS:\n            switch (action.alarmsType) {\n                case 'alarmTop':\n                    if (typeof state.alarmsTopValue === 'undefined') {\n                        state.alarmsTopValue = [];\n                    }\n                    if (typeof state.alarmsValueLoading === 'undefined') {\n                        state.alarmsValueLoading = [];\n                    }\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: true});\n                    return {\n                        ...state,\n                        alarmsTopValueLoading: state.alarmsValueLoading,\n                        alarmsTopValue: state.alarmsTopValue,\n                    };\n                case 'alarmList':\n                    if (typeof state.alarmsListValue === 'undefined') {\n                        state.alarmsListValue = [];\n                    }\n                    if (typeof state.alarmsValueLoading === 'undefined') {\n                        state.alarmsValueLoading = [];\n                    }\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: true});\n                    return {\n                        ...state,\n                        alarmsListValueLoading: state.alarmsValueLoading,\n                        alarmsListValue: state.alarmsListValue,\n                    };\n                default:\n                    return state;\n            }\n\n        case CLEAR_ALARMS:\n            switch (action.alarmsType) {\n                case 'alarmTop':\n                    return {\n                        ...state,\n                        alarmsTopValue: [],\n                    };\n                case 'alarmList':\n                    return {\n                        ...state,\n                        alarmsListValue: [],\n                    };\n                default:\n                    return state;\n            }\n\n        case FINISH_LOADING_ALARMS:\n            switch (action.alarmsType) {\n                case 'alarmTop':\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: false});\n                    state.alarmsTopValue = state.alarmsTopValue.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsTopValue.push({alarmsId: action.alarmsId, timelineData: action.result});\n                    return {\n                        ...state,\n                        alarmsTopValueLoading: state.alarmsValueLoading,\n                        alarmsTopValue: state.alarmsTopValue,\n                    };\n                case 'alarmList':\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: false});\n                    state.alarmsListValue = state.alarmsListValue.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsListValue.push({alarmsId: action.alarmsId, timelineData: action.result});\n                    return {\n                        ...state,\n                        alarmsListValueLoading: state.alarmsValueLoading,\n                        alarmsListValue: state.alarmsListValue,\n                    };\n                default:\n                    return state;\n            }\n\n        case ERROR_LOADING_ALARMS:\n            switch (action.alarmsType) {\n                case 'alarmTop':\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: false});\n                    return {\n                        ...state,\n                        alarmsTopValueLoading: state.alarmsValueLoading,\n                        result: action.error,\n                    };\n                case 'alarmList':\n                    state.alarmsValueLoading = state.alarmsValueLoading.filter(obj => obj.alarmsId !== action.alarmsId);\n                    state.alarmsValueLoading.push({alarmsId: action.alarmsId, loading: false});\n                    return {\n                        ...state,\n                        alarmsListValueLoading: state.alarmsValueLoading,\n                        result: action.error,\n                    };\n                default:\n                    return state;\n            }\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_OVERRIDE:\n            if (typeof state.overrideValue === 'undefined') {\n                state.overrideValue = [];\n            }\n            if (typeof state.overrideValueLoading === 'undefined') {\n                state.overrideValueLoading = [];\n            }\n            state.overrideValueLoading = state.overrideValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.overrideValueLoading.push({chartId: action.chartId, loading: true});\n            return {\n                ...state,\n                overrideValueLoading: state.overrideValueLoading,\n                overrideValue: state.overrideValue,\n            };\n\n        case FINISH_LOADING_OVERRIDE:\n            state.overrideValueLoading = state.overrideValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.overrideValueLoading.push({chartId: action.chartId, loading: false});\n            state.overrideValue = state.overrideValue.filter(obj => obj.chartId !== action.chartId);\n            state.overrideValue.push({chartId: action.chartId, overrideValue: action.overrideValue});\n            return {\n                ...state,\n                overrideValueLoading: state.overrideValueLoading,\n                overrideValue: state.overrideValue,\n            };\n\n        case ERROR_LOADING_OVERRIDE:\n            state.overrideValueLoading = state.overrideValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.overrideValueLoading.push({chartId: action.chartId, loading: false});\n            return {\n                ...state,\n                overrideValueLoading: state.overrideValueLoading,\n                result: action.error,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_LOADING_CURRENT:\n            if (typeof state.currentValue === 'undefined') {\n                state.currentValue = [];\n            }\n            if (typeof state.currentValueLoading === 'undefined') {\n                state.currentValueLoading = [];\n            }\n            state.currentValueLoading = state.currentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.currentValueLoading.push({chartId: action.chartId, loading: true});\n            return {\n                ...state,\n                currentValueLoading: state.currentValueLoading,\n                currentValue: state.currentValue,\n            };\n\n        case FINISH_LOADING_CURRENT:\n            state.currentValueLoading = state.currentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.currentValueLoading.push({chartId: action.chartId, loading: false});\n            state.currentValue = state.currentValue.filter(obj => obj.chartId !== action.chartId);\n            state.currentValue.push({\n                chartId: action.chartId,\n                currentValue: action.currentValue == null ? '' : action.currentValue[action.machineId]\n            });\n            return {\n                ...state,\n                currentValueLoading: state.currentValueLoading,\n                currentValue: state.currentValue,\n            };\n\n        case ERROR_LOADING_CURRENT:\n            state.currentValueLoading = state.currentValueLoading.filter(obj => obj.chartId !== action.chartId);\n            state.currentValueLoading.push({chartId: action.chartId, loading: false});\n            return {\n                ...state,\n                currentValueLoading: state.currentValueLoading,\n                result: action.error,\n            };\n        //--------------------------------------------------------------------------------\n        case START_SINGLE_VARIABLE:\n            return {\n                ...state,\n                isSingleVariableLoading: true\n            };\n        case FINISH_SINGLE_VARIABLE:\n            return {\n                ...state,\n                isSingleVariableLoading: false,\n                activeVariable: action.variable\n            };\n        case ERROR_SINGLE_VARIABLE:\n            return {\n                ...state,\n                isSingleVariableLoading: false,\n                activeVariable: null,\n                singleVariableError: action.error\n            };\n        //--------------------------------------------------------------------------------\n        case START_SINGLE_COLLECTION:\n            return {\n                ...state,\n                isSingleCollectionLoading: true\n            };\n        case FINISH_SINGLE_COLLECTION:\n            return {\n                ...state,\n                isSingleCollectionLoading: false,\n                activeCollection: action.collection\n            };\n        case ERROR_SINGLE_COLLECTION:\n            return {\n                ...state,\n                isSingleCollectionLoading: false,\n                activeCollection: null,\n                singleCollectionError: action.error\n            };\n\n\n        //--------------------------------------------------------------------------------\n        case START_VARIABLES_LIST:\n            return {\n                ...state,\n                isVariablesListLoading: true,\n            };\n        case FINISH_VARIABLES_LIST:\n            return {\n                ...state,\n                variablesList: action.variablesList,\n                isVariablesListLoading: false,\n            };\n        case ERROR_VARIABLES_LIST:\n            return {\n                ...state,\n                variablesList: null,\n                variablesListError: action.error,\n                isVariablesListLoading: false,\n            };\n\n        //--------------------------------------------------------------------------------\n        case START_VARIABLES_WITH_LIMITS_LIST:\n            return {\n                ...state,\n                isVariablesWithLimitsListLoading: true,\n            };\n        case FINISH_VARIABLES_WITH_LIMITS_LIST:\n            return {\n                ...state,\n                variablesWithLimitsList: action.variablesWithLimitsList,\n                isVariablesWithLimitsListLoading: false,\n            };\n        case ERROR_VARIABLES_WITH_LIMITS_LIST:\n            return {\n                ...state,\n                variablesWithLimitsList: null,\n                variablesWithLimitsListError: action.error,\n                isVariablesWithLimitsListLoading: false,\n            };\n        //--------------------------------------------------------------------------------\n        case START_COLLECTIONS_LIST:\n            return {\n                ...state,\n                isCollectionsListLoading: true,\n            };\n        case FINISH_COLLECTIONS_LIST:\n            return {\n                ...state,\n                collectionsList: action.collectionsList,\n                requestId: action.requestId,\n                isCollectionsListLoading: false,\n            };\n        case ERROR_COLLECTIONS_LIST:\n            return {\n                ...state,\n                collectionsList: null,\n                requestId: action.requestId,\n                collectionsListError: action.error,\n                isCollectionsListLoading: false,\n            };\n\n        //--------------------------------------------------------------------------------\n        default:\n            return state;\n    }\n};\n\nexport default LdTimeseriesReducer;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nconst initalState = {\n  trackedMachines: new Set(),\n};\n\nconst filter = (mySet, elementToRemove) => {\n  const newSet = new Set(mySet);\n  newSet.delete(elementToRemove);\n  return newSet;\n};\n\nconst LdDashboardReducer = (state = initalState, action) => {\n  switch (action.type) {\n    case 'RESET_STATE':\n      return {};\n    case 'DUMMY_STATE':\n      return {...state, isDummy: true};\n    case 'ADD_TRACKED_MACHINE':\n      return {\n        ...state,\n        trackedMachines: new Set([...state.trackedMachines, action.machineId]),\n      };\n    case 'REMOVE_TRACKED_MACHINE':\n      return {\n        ...state,\n        trackedMachines: filter(state.trackedMachines, action.machineId),\n      };\n    default:\n      return state;\n  }\n\n};\n\nexport default LdDashboardReducer;\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {\n  BREADCRUMB_CONFIG,\n  CLEAR_SUBMIT_BREADCRUMB,\n  ERROR_LOADING_BREADCRUMB_CONFIG,\n  FINISH_LOADING_BREADCRUMB_CONFIG,\n  START_LOADING_BREADCRUMB_CONFIG,\n} from '../actions/breadcrumb-actions';\n\n// @ts-ignore\nconst BreadCrumbReducer = (state = {}, action: any) => {\n\n  switch (action.type) {\n    case 'RESET_STATE':\n      return {};\n    case 'DUMMY_STATE':\n      return {...state, isDummy: true};\n    case BREADCRUMB_CONFIG:\n      return {\n        ...state,\n        breadCrumbConfig: action.breadCrumbConfig,\n      };\n    case CLEAR_SUBMIT_BREADCRUMB:\n      return {\n        ...state,\n        breadCrumb: null,\n        breadCrumbConfig: null,\n      };\n    case START_LOADING_BREADCRUMB_CONFIG:\n      return {\n        ...state,\n        loadingBreadCrumb: true,\n      };\n    case FINISH_LOADING_BREADCRUMB_CONFIG:\n      return {\n        ...state,\n        loadingBreadCrumb: false,\n        breadCrumb: action.breadcrumbList,\n      };\n    case ERROR_LOADING_BREADCRUMB_CONFIG:\n      return {\n        ...state,\n        result: action.error,\n        loadingBreadCrumb: false,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default BreadCrumbReducer;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n/* eslint-disable import/no-cycle */\n\nimport {\n    createStore,\n    applyMiddleware,\n    compose as origCompose,\n    combineReducers\n} from 'redux';\nimport thunk from 'redux-thunk';\nimport {lazyReducerEnhancer} from 'pwa-helpers/lazy-reducer-enhancer';\nimport {loadState, saveState} from './ld-localstorage';\n\nimport LdApplicationReducer from './reducers/ld-application-reducer';\nimport LdAssetsReducer from './reducers/ld-assets-reducer';\nimport LdTimeseriesReducer from './reducers/ld-timeseries-reducer';\nimport LdDashboardReducer from './reducers/ld-dashboard-reducer';\nimport LdUserManagementReducer from './reducers/ld-user-management-reducer';\nimport LdUsersReducer from './reducers/ld-users-reducer';\nimport BreadCrumbReducer from './reducers/breadcrumb-reducers';\n\nconst reducers = {\n    LdApplicationReducer,\n    LdAssetsReducer,\n    LdTimeseriesReducer,\n    LdTimeseriesCollectionsReducer: LdTimeseriesReducer,\n    LdUserManagementReducer,\n    LdDashboardReducer,\n    LdUsersReducer,\n    BreadCrumbReducer\n};\n\nwindow.SWCP = {};\nwindow.SWCP.__loaded = false;\nwindow.SWCP.__shouldInvalidate = false;\nconst compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({serialize: true}) : origCompose;\nconst savedState = loadState();\n\nconst purgedState = Object.keys(savedState)\n    .filter(key => key in reducers)\n    .reduce((obj, key) => {\n        obj[key] = savedState[key];\n        return obj;\n    }, {});\n\nexport const store = createStore(\n    (state, action) => state,\n    purgedState,\n    compose(lazyReducerEnhancer(combineReducers), applyMiddleware(thunk))\n);\n\nexport default store;\n\nstore.addReducers(reducers);\n\nstore.subscribe(() => {\n\n    saveState(store.getState());\n});\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {\n    CLEAR_DOWNLOAD_LOADING_MANUALS,\n    CLEAR_SUBMIT,\n    ERROR_ADD,\n    ERROR_DELETE,\n    ERROR_DOWNLOAD_LOADING_FILES,\n    ERROR_EDIT,\n    ERROR_FILES_DELETE,\n    ERROR_LOADING_GROUPS,\n    ERROR_LOADING_LINKS,\n    ERROR_LOADING_MANUALS,\n    ERROR_LOADING_NCSTATE,\n    ERROR_LOADING_RELEASE_INFO,\n    ERROR_LOADING_SUBMIT,\n    ERROR_LOADING_SUBMIT_NAME,\n    ERROR_LOADING_TVDEPLOYMENT,\n    ERROR_LOADING_TVGROUPS,\n    ERROR_LOADING_TVLINKS,\n    ERROR_LOADING_UPLOAD,\n    ERROR_LOADING_VERSIONS,\n    ERROR_POST_TV,\n    ERROR_UPLOAD,\n    FINISH_ADD,\n    FINISH_DELETE,\n    FINISH_DOWNLOAD_LOADING_FILES,\n    FINISH_EDIT,\n    FINISH_FILES_DELETE,\n    FINISH_LOADING_GROUPS,\n    FINISH_LOADING_LINKS,\n    FINISH_LOADING_MANUALS,\n    FINISH_LOADING_NCSTATE,\n    FINISH_LOADING_RELEASE_INFO,\n    FINISH_LOADING_SUBMIT,\n    FINISH_LOADING_SUBMIT_NAME,\n    FINISH_LOADING_TVDEPLOYMENT,\n    FINISH_LOADING_TVGROUPS,\n    FINISH_LOADING_TVLINKS,\n    FINISH_LOADING_UPLOAD,\n    FINISH_LOADING_VERSIONS,\n    FINISH_POST_TV,\n    FINISH_UPLOAD,\n    START_ADD,\n    START_DELETE,\n    START_DOWNLOAD_LOADING_FILES,\n    START_EDIT,\n    START_FILES_DELETE,\n    START_LOADING_GROUPS,\n    START_LOADING_LINKS,\n    START_LOADING_MANUALS,\n    START_LOADING_NCSTATE,\n    START_LOADING_RELEASE_INFO,\n    START_LOADING_SUBMIT,\n    START_LOADING_SUBMIT_NAME,\n    START_LOADING_TVDEPLOYMENT,\n    START_LOADING_TVGROUPS,\n    START_LOADING_TVLINKS,\n    START_LOADING_UPLOAD,\n    START_LOADING_VERSIONS,\n    START_POST_TV,\n    START_UPLOAD,\n    UPDATE_LOCATION\n} from '../actions/ld-application-actions';\n\nconst LdApplicationReducer = (state = {}, action) => {\n    switch (action.type) {\n        case 'RESET_STATE':\n            return {};\n        case 'DUMMY_STATE':\n            return {...state, isDummy: true};\n        case UPDATE_LOCATION:\n            return {\n                ...state,\n                pageModule: action.pageModule,\n                subModules: action.subModules,\n            };\n        case START_LOADING_SUBMIT:\n            return {\n                ...state,\n                loadingSubmit: true,\n            };\n        case FINISH_LOADING_SUBMIT:\n            return {\n                ...state,\n                loadingSubmit: false,\n                successSubmit: action.successSubmit,\n                successSubmitMail: true,\n\n            };\n        case ERROR_LOADING_SUBMIT:\n            return {\n                ...state,\n                result: action.error,\n                loadingSubmit: false,\n                successSubmit: null,\n            };\n        case CLEAR_SUBMIT:\n            return {\n                ...state,\n                successSubmit: null,\n                successSubmitMail: null,\n                upload: false,\n                successSubmitName: false,\n                loadingSubmitName: false,\n                loadingSubmit: false,\n                filesDelete: null,\n                result: null,\n                successUpload: null,\n                resultError: null,\n                loadingUpload: false,\n                serviceManuals: null,\n                isFilesDeleteLoading: false,\n                loadingPostTvInstallInformation: false,\n                postTvInstallInformation: null,\n                loadingTvInstallInformation: false,\n                TvInstallInformation: null,\n                itemDelete: null,\n                isEditLoading: false,\n                isDeleteLoading: false,\n                isNewLoading: false,\n                addValue: null,\n                editValue: null,\n                tvLinks: null,\n                loadingTvLinks: false\n\n            };\n        case START_LOADING_MANUALS:\n            return {\n                ...state,\n                loadingManuals: true,\n            };\n        case FINISH_LOADING_MANUALS:\n            return {\n                ...state,\n                loadingManuals: false,\n                serviceManuals: action.serviceManuals,\n            };\n        case ERROR_LOADING_MANUALS:\n            return {\n                ...state,\n                result: action.error,\n                loadingManuals: false,\n            };\n        case START_LOADING_TVGROUPS:\n            return {\n                ...state,\n                loadingTvInstallInformation: true,\n            };\n        case FINISH_LOADING_TVGROUPS:\n            return {\n                ...state,\n                loadingTvInstallInformation: false,\n                TvInstallInformation: action.TvInstallInformation,\n            };\n        case ERROR_LOADING_TVGROUPS:\n            return {\n                ...state,\n                result: action.error,\n                loadingTvInstallInformation: false,\n            };\n        case START_LOADING_TVDEPLOYMENT:\n            return {\n                ...state,\n                loadingTvDeploymentInformation: true,\n            };\n        case FINISH_LOADING_TVDEPLOYMENT:\n            return {\n                ...state,\n                loadingTvDeploymentInformation: false,\n                TvDeploymentInformation: action.TvDeploymentInformation,\n            };\n        case ERROR_LOADING_TVDEPLOYMENT:\n            return {\n                ...state,\n                result: action.error,\n                loadingTvDeploymentInformation: false,\n            };\n        case START_POST_TV:\n            return {\n                ...state,\n                loadingPostTvInstallInformation: true,\n            };\n        case FINISH_POST_TV:\n            return {\n                ...state,\n                loadingPostTvInstallInformation: false,\n                postTvInstallInformation: action.postTvInstallInformation,\n            };\n        case ERROR_POST_TV:\n            return {\n                ...state,\n                result: action.error,\n                loadingPostTvInstallInformation: false,\n            };\n        case START_LOADING_UPLOAD:\n            return {\n                ...state,\n                loadingUpload: true,\n            };\n        case FINISH_LOADING_UPLOAD:\n            return {\n                ...state,\n                loadingUpload: false,\n                successUpload: true,\n                successId: action.id,\n            };\n        case ERROR_LOADING_UPLOAD:\n            return {\n                ...state,\n                resultError: action.error,\n                errorId: action.id,\n                loadingUpload: false,\n            };\n        case START_LOADING_VERSIONS:\n            return {\n                ...state,\n                loadingVersion: true,\n            };\n        case FINISH_LOADING_VERSIONS:\n            return {\n                ...state,\n                loadingVersion: false,\n                versions: action.serviceVersion,\n            };\n        case ERROR_LOADING_VERSIONS:\n            return {\n                ...state,\n                result: action.error,\n                loadingVersion: false,\n            };\n        case START_DOWNLOAD_LOADING_FILES:\n            return {\n                ...state,\n                loadingManuals: true,\n            };\n        case FINISH_DOWNLOAD_LOADING_FILES:\n            return {\n                ...state,\n                loadingManuals: false,\n                fileId: action.fileId,\n                downloadServiceFiles: action.downloadServiceFile,\n            };\n        case CLEAR_DOWNLOAD_LOADING_MANUALS:\n            return {\n                ...state,\n                loadingManuals: false,\n                downloadServiceFile: null,\n                versions: null,\n                serviceManuals: null,\n            };\n        case ERROR_DOWNLOAD_LOADING_FILES:\n            return {\n                ...state,\n                result: action.error,\n                loadingManuals: false,\n            };\n        case START_UPLOAD:\n            return {\n                ...state,\n                loadingUpload: true,\n            };\n        case FINISH_UPLOAD:\n            return {\n                ...state,\n                loadingUpload: false,\n                upload: true,\n            };\n        case ERROR_UPLOAD:\n            return {\n                ...state,\n                result: action.error,\n                loadingUpload: false,\n            };\n        case START_LOADING_NCSTATE:\n            return {\n                ...state,\n                loadingNC: true,\n            };\n        case FINISH_LOADING_NCSTATE:\n            return {\n                ...state,\n                loadingNC: false,\n                serviceNC: action.serviceNC,\n            };\n        case ERROR_LOADING_NCSTATE:\n            return {\n                ...state,\n                result: action.error,\n                loadingNC: false,\n            };\n\n        case START_LOADING_TVLINKS:\n            return {\n                ...state,\n                loadingTvLinks: true,\n            };\n        case FINISH_LOADING_TVLINKS:\n            return {\n                ...state,\n                loadingTvLinks: false,\n                tvLinks: action.tvLinks,\n            };\n        case ERROR_LOADING_TVLINKS:\n            return {\n                ...state,\n                result: action.error,\n                loadingTvLinks: false,\n            };\n        //--------------------------------------------------------------------------------\n        case START_FILES_DELETE:\n            return {\n                ...state,\n                isFilesDeleteLoading: true,\n            };\n        case FINISH_FILES_DELETE:\n            return {\n                ...state,\n                filesDelete: action.filesDelete,\n                isFilesDeleteLoading: false,\n            };\n        case ERROR_FILES_DELETE:\n            return {\n                ...state,\n                result: action,\n                isFilesDeleteLoading: false,\n            };\n        case START_LOADING_SUBMIT_NAME:\n            return {\n                ...state,\n                loadingSubmitName: true,\n            };\n        case FINISH_LOADING_SUBMIT_NAME:\n            return {\n                ...state,\n                loadingSubmitName: false,\n                successSubmitName: true,\n\n            };\n        case ERROR_LOADING_SUBMIT_NAME:\n\n            return {\n                ...state,\n                result: action.error,\n                loadingSubmitName: false,\n                successSubmitName: false,\n            };\n        case START_LOADING_RELEASE_INFO:\n            return {\n                ...state,\n                loadingReleaseInfo: true,\n            };\n        case FINISH_LOADING_RELEASE_INFO:\n            return {\n                ...state,\n                loadingReleaseInfo: false,\n                releaseInfo: action.releaseInfo,\n            };\n        case ERROR_LOADING_RELEASE_INFO:\n            return {\n                ...state,\n                result: action.error,\n                loadingReleaseInfo: false,\n            };\n        //--------------------------------------------------------------------------------\n        case START_LOADING_GROUPS:\n            return {\n                ...state,\n                loadingGroupsInfo: true,\n                groupInformation: null,\n            }\n        case FINISH_LOADING_GROUPS:\n            return {\n                ...state,\n                loadingGroupsInfo: false,\n                groupInformation: action.groupInformation,\n\n            }\n        case ERROR_LOADING_GROUPS:\n            return {\n                ...state,\n                result: action.error,\n                loadingGroupsInfo: false,\n            }\n        //--------------------------------------------------------------------------------\n        case START_LOADING_LINKS:\n            return {\n                ...state,\n                loadingReleaseNotes: true,\n            };\n        case FINISH_LOADING_LINKS:\n            return {\n                ...state,\n                loadingReleaseNotes: false,\n                releaseNotes: action.releaseNotes,\n            };\n        case ERROR_LOADING_LINKS:\n            return {\n                ...state,\n                result: action.error,\n                loadingReleaseNotes: false,\n            };\n        //-------------------------------------------------------------------------------\n        case START_ADD:\n            return {\n                ...state,\n                isNewLoading: true,\n            };\n\n        case FINISH_ADD:\n            return {\n                ...state,\n                isNewLoading: false,\n                addValue: action.addValue,\n            };\n        case ERROR_ADD:\n            return {\n                ...state,\n                isNewLoading: false,\n                result: action.error,\n                valueType: action.valueType\n            };\n\n        case START_EDIT:\n            return {\n                ...state,\n                isEditLoading: true,\n                isSavingChangedData: true\n            };\n\n        case FINISH_EDIT:\n            return {\n                ...state,\n                isEditLoading: false,\n                isSavingChangedData: false,\n                editValue: action.editValue,\n\n            };\n\n        case ERROR_EDIT:\n            return {\n                ...state,\n                isEditLoading: false,\n                isSavingChangedData: false,\n                result: action.error,\n                valueType: action.valueType\n            };\n        //--------------------------------------------------------------------------------\n        case START_DELETE:\n            return {\n                ...state,\n                isDeleteLoading: true,\n            };\n        case FINISH_DELETE:\n            return {\n                ...state,\n                itemDelete: action.itemDelete,\n                valueType: action.valueType,\n                isDeleteLoading: false\n            };\n        case ERROR_DELETE:\n            return {\n                ...state,\n                result: action.error,\n                isDeleteLoading: false,\n                valueType: action.valueType\n\n            };\n        default:\n            return state;\n\n\n    }\n};\n\nexport default LdApplicationReducer;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n// eslint-disable-next-line import/no-cycle\nimport {\n  ACK_ERROR_CHANGING_LIMITS,\n  CLEAR_ADD_ASSET,\n  CLEAR_DELETE_ASSET,\n  CLEAR_EDIT_ASSET,\n  EMPTY_ASSETS,\n  ERROR_ADD_ASSET,\n  ERROR_ASSET_DELETE,\n  ERROR_CHANGING_LIMITS,\n  ERROR_COORDINATES_BY_ADDRESS,\n  ERROR_DASHBOARD_LINES,\n  ERROR_EDIT_ASSET,\n  ERROR_LOADING_ASSETS,\n  ERROR_LOADING_MACHINES_BY_MACHINETYPE,\n  ERROR_READ_CUSTOMER_NUMBER,\n  ERROR_SHOPFLOOR_DELETE,\n  ERROR_SHOPFLOOR_LINK,\n  ERROR_SHOPFLOOR_LIST,\n  FINISH_ADD_ASSET,\n  FINISH_ASSET_DELETE,\n  FINISH_CHANGING_LIMITS,\n  FINISH_COORDINATES_BY_ADDRESS,\n  FINISH_DASHBOARD_LINES,\n  FINISH_EDIT_ASSET,\n  FINISH_LOADING_ASSETS,\n  FINISH_LOADING_MACHINES_BY_MACHINETYPE,\n  FINISH_READ_CUSTOMER_NUMBER,\n  FINISH_SHOPFLOOR_DELETE,\n  FINISH_SHOPFLOOR_LINK,\n  FINISH_SHOPFLOOR_LIST,\n  RESET_COORDINATES,\n  START_ADD_ASSET,\n  START_ASSET_DELETE,\n  START_CHANGING_LIMITS,\n  START_COORDINATES_BY_ADDRESS,\n  START_DASHBOARD_LINES,\n  START_EDIT_ASSET,\n  START_LOADING_ASSETS,\n  START_LOADING_MACHINES_BY_MACHINETYPE,\n  START_READ_CUSTOMER_NUMBER,\n  START_SHOPFLOOR_DELETE,\n  START_SHOPFLOOR_LINK,\n  START_SHOPFLOOR_LIST,\n} from '../actions/ld-assets-actions';\n\nconst LdAssetsReducer = (state = {}, action) => {\n  switch (action.type) {\n    case 'RESET_STATE':\n      return {};\n    case 'DUMMY_STATE':\n      return {...state, isDummy: true};\n    case EMPTY_ASSETS:\n      return {\n        ...state,\n        companies: null,\n        company: null,\n        locations: null,\n        location: null,\n        halls: null,\n        hall: null,\n        lines: null,\n        line: null,\n        machines: null,\n        machine: null,\n        shopfloor: null,\n        shopfloorCardObject: null,\n        shopfloorList: null,\n        shopfloorPosLink: null,\n        shopfloorDelete: null,\n        dashboardCards: null,\n        finishedDownloads: null,\n        errorDownloads: null,\n      };\n    case START_LOADING_ASSETS:\n\n      switch (action.assetType) {\n        case 'companies':\n          return {\n            ...state,\n            loadingCompanies: true,\n          };\n        case 'company':\n          return {\n            ...state,\n            loadingCompany: true,\n          };\n        case 'locations':\n          return {\n            ...state,\n            loadingLocations: true,\n          };\n        case 'location':\n          return {\n            ...state,\n            loadingLocation: true,\n          };\n        case 'halls':\n          return {\n            ...state,\n            loadingHalls: true,\n          };\n        case 'hall':\n          return {\n            ...state,\n            loadingHall: true,\n          };\n        case 'lines':\n          return {\n            ...state,\n            loadingLines: true,\n          };\n        case 'line':\n          return {\n            ...state,\n            loadingLine: true,\n          };\n        case 'machines':\n          return {\n            ...state,\n            loadingMachines: true,\n          };\n        case 'machine':\n          return {\n            ...state,\n            loadingMachine: true,\n          };\n        case 'machineTypes':\n          return {\n            ...state,\n            loadingMachineTypes: true,\n          };\n        case 'controllers':\n          return {\n            ...state,\n            loadingControllers: true,\n          };\n        case 'variables':\n          return {\n            ...state,\n            loadingVariables: true,\n          };\n        case 'collections':\n          return {\n            ...state,\n            loadingCollections: true,\n          };\n        case 'countries':\n          return {\n            ...state,\n            loadingCountries: true,\n          };\n        case 'industrySectors':\n          return {\n            ...state,\n            loadingIndustrySectors: true,\n          };\n        case 'dashboardShopfloorCard':\n          return {\n            ...state,\n            loadingShopfloorCard: true,\n          };\n        case 'dashboardSpistatCard':\n          return {\n            ...state,\n            loadingSpistatCard: true,\n          };\n        case 'dashboardKpiCard':\n          return {\n            ...state,\n            loadingKpiCard: true,\n          };\n        case 'dashboardInProductionCard':\n          return {\n            ...state,\n            loadingInProductionCard: true,\n          };\n        case 'dashboardWorldmapCard':\n          return {\n            ...state,\n            loadingDashboardWorldmap: true,\n          };\n        case 'shopfloorPosLink':\n          return {\n            ...state,\n            loadingShopfloorPosLink: true,\n          };\n        case 'posLink':\n          return {\n            ...state,\n            loadingShopfloor: true,\n          };\n        case 'imageShopfloorCard':\n          return {\n            ...state,\n            loadingShopfloorCard: true,\n          };\n        case 'serviceManual':\n          return  {\n            ... state,\n            loadingManual: true\n          }\n        default:\n          return state;\n      }\n\n    case FINISH_LOADING_ASSETS:\n      switch (action.assetType) {\n        case 'companies':\n          const sortCompaniesAlphabetically = (companies) => {\n            return [...companies].sort((a, b) => a.name.localeCompare(b.name));\n          };\n          return {\n            ...state,\n            loadingCompanies: false,\n            companies: sortCompaniesAlphabetically(action.assetsList),\n          };\n        case 'company':\n          return {\n            ...state,\n            loadingCompany: false,\n            company: action.assetsList,\n          };\n        case 'locations':\n          return {\n            ...state,\n            loadingLocations: false,\n            locations: action.assetsList,\n          };\n        case 'location':\n          return {\n            ...state,\n            loadingLocation: false,\n            location: action.assetsList,\n          };\n        case 'halls':\n          return {\n            ...state,\n            loadingHalls: false,\n            halls: action.assetsList,\n          };\n        case 'hall':\n          return {\n            ...state,\n            loadingHall: false,\n            hall: action.assetsList,\n          };\n        case 'lines':\n          return {\n            ...state,\n            loadingLines: false,\n            lines: action.assetsList,\n          };\n        case 'line':\n          return {\n            ...state,\n            loadingLine: false,\n            line: action.assetsList,\n          };\n        case 'machines':\n          return {\n            ...state,\n            loadingMachines: false,\n            machines: action.assetsList,\n          };\n        case 'machine':\n          return {\n            ...state,\n            loadingMachine: false,\n            machine: action.assetsList,\n          };\n        case 'machineTypes':\n          return {\n            ...state,\n            loadingMachineTypes: false,\n            machineTypes: action.assetsList,\n          };\n        case 'controllers':\n          return {\n            ...state,\n            loadingControllers: false,\n            controllers: action.assetsList,\n          };\n        case 'variables':\n          return {\n            ...state,\n            loadingVariables: false,\n            variables: action.assetsList,\n          };\n        case 'collections':\n          return {\n            ...state,\n            loadingCollections: false,\n            collections: action.assetsList,\n          };\n        case 'countries':\n          return {\n            ...state,\n            loadingCountries: false,\n            countries: action.assetsList,\n          };\n        case 'industrySectors':\n          return {\n            ...state,\n            loadingIndustrySectors: false,\n            industrySectors: action.assetsList,\n          };\n        case 'dashboardShopfloorCard':\n          return {\n            ...state,\n            loadingShopfloorCard: false,\n            shopfloorCardObject: action.assetsList,\n          };\n        case 'dashboardSpistatCard':\n          return {\n            ...state,\n            loadingSpistatCard: false,\n            spistatCardObject: action.assetsList,\n          };\n        case 'dashboardKpiCard':\n          return {\n            ...state,\n            loadingKpiCard: false,\n            kpiCardObject: action.assetsList,\n          };\n        case 'dashboardInProductionCard':\n          return {\n            ...state,\n            loadingInProductionCard: false,\n            inProductionCardObject: action.assetsList,\n          };\n        case 'dashboardWorldmapCard':\n          return {\n            ...state,\n            loadingDashboardWorldmap: false,\n            dashboardWorldmapLocations: action.assetsList,\n          };\n        case 'shopfloorPosLink':\n          return {\n            ...state,\n            loadingShopfloorPosLink: false,\n            shopfloorPosLink: action.assetsList,\n          };\n        case 'posLink':\n          return {\n            ...state,\n            loadingShopfloor: false,\n            shopfloor: action.assetsList,\n          };\n        case 'imageShopfloorCard':\n          return {\n            ...state,\n            loadingShopfloorCard: false,\n            shopfloorCardObject: action.assetsList,\n          };\n        case 'serviceManual':\n          return  {\n            ... state,\n            loadingManual: false,\n            manual: true\n          }\n        default:\n          return state;\n      }\n\n    case ERROR_LOADING_ASSETS:\n      switch (action.assetType) {\n        case 'companies':\n          return {\n            ...state,\n            result: action.error,\n            loadingCompanies: false,\n          };\n        case 'company':\n          return {\n            ...state,\n            result: action.error,\n            loadingCompany: false,\n          };\n        case 'locations':\n          return {\n            ...state,\n            result: action.error,\n            loadingLocations: false,\n          };\n        case 'location':\n          return {\n            ...state,\n            result: action.error,\n            loadingLocation: false,\n          };\n        case 'halls':\n          return {\n            ...state,\n            result: action.error,\n            loadingHalls: false,\n          };\n        case 'hall':\n          return {\n            ...state,\n            result: action.error,\n            loadingHall: false,\n          };\n        case 'lines':\n          return {\n            ...state,\n            result: action.error,\n            loadingLines: false,\n          };\n        case 'line':\n          return {\n            ...state,\n            result: action.error,\n            loadingLine: false,\n          };\n        case 'machines':\n          return {\n            ...state,\n            result: action.error,\n            loadingMachines: false,\n          };\n        case 'machine':\n          return {\n            ...state,\n            result: action.error,\n            loadingMachine: false,\n          };\n        case 'machineTypes':\n          return {\n            ...state,\n            result: action.error,\n            loadingMachineTypes: false,\n          };\n        case 'controllers':\n          return {\n            ...state,\n            result: action.error,\n            loadingControllers: false,\n          };\n        case 'countries':\n          return {\n            ...state,\n            result: action.error,\n            loadingCountries: false,\n          };\n        case 'industrySectors':\n          return {\n            ...state,\n            result: action.error,\n            loadingIndustrySectors: false,\n          };\n        case 'variables':\n          return {\n            ...state,\n            result: action.error,\n            loadingVariables: false,\n          };\n        case 'collections':\n          return {\n            ...state,\n            result: action.error,\n            loadingCollections: false,\n          };\n        case 'dashboardShopfloorCard':\n          return {\n            ...state,\n            result: action.error,\n            loadingShopfloorCard: false,\n          };\n        case 'dashboardSpistatCard':\n          return {\n            ...state,\n            loadingSpistatCard: false,\n          };\n        case 'dashboardKpiCard':\n          return {\n            ...state,\n            result: action.error,\n            loadingKpiCard: false,\n          };\n        case 'dashboardInProductionCard':\n          return {\n            ...state,\n            result: action.error,\n            loadingInProductionCard: false,\n          };\n        case 'dashboardWorldmapCard':\n          return {\n            ...state,\n            result: action.error,\n            loadingDashboardWorldmap: false,\n          };\n        case 'shopfloorPosLink':\n          return {\n            ...state,\n            loadingShopfloorPosLink: false,\n            result: action.error,\n          };\n        case 'posLink':\n          return {\n            ...state,\n            result: action.error,\n            loadingShopfloor: false,\n          };\n        case 'imageShopfloorCard':\n          return {\n            ...state,\n            loadingShopfloorCard: false,\n            result: action.error,\n          };\n        case 'serviceManual':\n          return  {\n            ... state,\n            loadingManual: false,\n            result: action.error,\n\n          }\n        default:\n          return state;\n      }\n\n    //--------------------------------------------------------------------------------\n    case START_LOADING_MACHINES_BY_MACHINETYPE:\n      return {\n        ...state,\n        machinesListLoading: true,\n      };\n    case FINISH_LOADING_MACHINES_BY_MACHINETYPE:\n      return {\n        ...state,\n        machinesList: action.machinesList,\n        machinesListLoading: false,\n      };\n    case ERROR_LOADING_MACHINES_BY_MACHINETYPE:\n      return {\n        ...state,\n        result: action.error,\n        machinesListLoading: false,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_DASHBOARD_LINES:\n      return {\n        ...state,\n        dashboardLinesLoading: true,\n      };\n    case FINISH_DASHBOARD_LINES:\n      return {\n        ...state,\n        dashboardCards: action.cards,\n        dashboardLinesLoading: false,\n      };\n    case ERROR_DASHBOARD_LINES:\n      return {\n        ...state,\n        result: action.error,\n        dashboardLinesLoading: false,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_COORDINATES_BY_ADDRESS:\n      return {\n        ...state,\n        isAssetsCoordinatesByAddressLoading: true,\n      };\n    case FINISH_COORDINATES_BY_ADDRESS:\n      return {\n        ...state,\n        coordinates: action.res,\n        isAssetsCoordinatesByAddressLoading: false,\n      };\n    case ERROR_COORDINATES_BY_ADDRESS:\n      return {\n        ...state,\n        result: action.error,\n        isAssetsCoordinatesByAddressLoading: false,\n      };\n\n    //-------------------------------------------------------------------------------\n    case START_ADD_ASSET:\n      switch (action.assetType) {\n        case 'new':\n          return {\n            ...state,\n            isAssetsNewLoading: true,\n          };\n        default:\n          return state;\n      }\n    case FINISH_ADD_ASSET:\n      switch (action.assetType) {\n        case 'new':\n          return {\n            ...state,\n            isAssetsNewLoading: false,\n            addAssetValue: action.addAssetValue,\n          };\n        default:\n          return state;\n      }\n    case ERROR_ADD_ASSET:\n      switch (action.assetType) {\n        case 'new':\n          return {\n            ...state,\n            isAssetsNewLoading: false,\n            result: action.error,\n          };\n        default:\n          return state;\n      }\n    case CLEAR_ADD_ASSET:\n      return {\n        ...state,\n        addAssetValue: null,\n        result: null,\n      };\n    case CLEAR_DELETE_ASSET:\n      return {\n        ...state,\n        assetDelete: null,\n        result: null,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_EDIT_ASSET:\n      switch (action.assetType) {\n        case 'edit':\n          return {\n            ...state,\n            isAssetsEditLoading: true,\n            isSavingChangedData: true\n          };\n        default:\n          return state;\n      }\n    case FINISH_EDIT_ASSET:\n      switch (action.assetType) {\n        case 'edit':\n          return {\n            ...state,\n            isAssetsEditLoading: false,\n            isSavingChangedData: false,\n            editAssetValue: action.editAssetValue,\n          };\n        default:\n          return state;\n      }\n    case ERROR_EDIT_ASSET:\n      switch (action.assetType) {\n        case 'edit':\n          return {\n            ...state,\n            isAssetsEditLoading: false,\n            isSavingChangedData: false,\n            result: action.error,\n          };\n        default:\n          return state;\n      }\n    case CLEAR_EDIT_ASSET:\n      return {\n        ...state,\n        isAssetsEditLoading: false,\n        editAssetValue: null,\n        result: null,\n        limitChangeState: null,\n        isSavingChangedData: null\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_READ_CUSTOMER_NUMBER:\n      return {\n        ...state,\n        machineId: action.machineId,\n        isCustomerNumberLoading: true,\n      };\n    case FINISH_READ_CUSTOMER_NUMBER:\n      return {\n        ...state,\n        machineId: action.machineId,\n        isCustomerNumberLoading: false,\n        customerNumber: action.customerNumber,\n      };\n    case ERROR_READ_CUSTOMER_NUMBER:\n      return {\n        ...state,\n        machineId: action.machineId,\n        isCustomerNumberLoading: false,\n        result: action.error,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_SHOPFLOOR_LIST:\n      return {\n        ...state,\n        isShopfloorLoading: true,\n      };\n    case FINISH_SHOPFLOOR_LIST:\n      return {\n        ...state,\n        shopfloorList: action.shopfloorList,\n        isShopfloorLoading: false,\n      };\n    case ERROR_SHOPFLOOR_LIST:\n      return {\n        ...state,\n        result: action.error,\n        isShopfloorLoading: false,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_SHOPFLOOR_LINK:\n      return {\n        ...state,\n        isShopfloorLinkLoading: true,\n      };\n    case FINISH_SHOPFLOOR_LINK:\n      return {\n        ...state,\n        shopfloorLink: action.shopfloorLink,\n        isShopfloorLinkLoading: false,\n      };\n    case ERROR_SHOPFLOOR_LINK:\n      return {\n        ...state,\n        result: action.error,\n        isShopfloorLinkLoading: false,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_SHOPFLOOR_DELETE:\n      return {\n        ...state,\n        isShopfloorDeleteLoading: true,\n      };\n    case FINISH_SHOPFLOOR_DELETE:\n      return {\n        ...state,\n        shopfloorDelete: action.shopfloorDelete,\n        isShopfloorDeleteLoading: false,\n      };\n    case ERROR_SHOPFLOOR_DELETE:\n      return {\n        ...state,\n        result: action.error,\n        isShopfloorDeleteLoading: false,\n      };\n\n    //--------------------------------------------------------------------------------\n    case START_ASSET_DELETE:\n      return {\n        ...state,\n        isAssetDeleteLoading: true,\n      };\n    case FINISH_ASSET_DELETE:\n      return {\n        ...state,\n        assetDelete: action.assetDelete,\n        isAssetDeleteLoading: false,\n        valueType: action.valueType\n\n      };\n    case ERROR_ASSET_DELETE:\n      return {\n        ...state,\n        result: action.error,\n        isAssetDeleteLoading: false,\n        valueType: action.valueType\n\n      };\n    case RESET_COORDINATES:\n      return {\n        ...state,\n        coordinates: undefined,\n      };\n    case START_CHANGING_LIMITS:\n      return {\n        ...state,\n        limitChangeState: \"changing\",\n      };\n    case FINISH_CHANGING_LIMITS:\n      return {\n        ...state,\n        limitChangeState: \"changed\",\n      };\n    case ERROR_CHANGING_LIMITS:\n      return {\n        ...state,\n        limitChangeState: \"failed\",\n      };\n    case ACK_ERROR_CHANGING_LIMITS:\n      return {\n        ...state,\n        limitChangeState: undefined,\n      };\n\n    case \"DOWNLOAD-FINISHED\":\n      const alreadyFinished = state.finishedDownloads ? [...state.finishedDownloads] : []\n      return {\n        ...state,\n        finishedDownloads: [...alreadyFinished, action.downloadId],\n      };\n    case 'DOWNLOAD-ERROR':\n      const error = state.errorDownloads ? [...state.errorDownloads] : [];\n      return {\n        ...state,\n        errorDownloads: [...error, action.downloadId],\n      };\n    default:\n      return state;\n  }\n};\n\nexport default LdAssetsReducer;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {\n  CLEAR_ADD_USER,\n  CLEAR_DELETE_USER,\n  CLEAR_EDIT_USER,\n  CLEAR_MAIL_USER,\n  CLEAR_USER_COMPANY_INFO,\n  ERROR_ADD_USER,\n  ERROR_DELETE_USER,\n  ERROR_EDIT_USER,\n  ERROR_LOADING_USER_COMPANY_INFO,\n  ERROR_LOADING_USER_INFORMATION_OVER_ID,\n  ERROR_LOADING_USER_LIST,\n  ERROR_MAIL_USER,\n  ERROR_UPDATE_OWN_USER,\n  ERROR_WRITE_USER_SETTINGS,\n  FINISH_ADD_USER,\n  FINISH_DELETE_USER,\n  FINISH_EDIT_USER,\n  FINISH_LOADING_USER_COMPANY_INFO,\n  FINISH_LOADING_USER_INFORMATION_OVER_ID,\n  FINISH_LOADING_USER_LIST,\n  FINISH_MAIL_USER,\n  FINISH_UPDATE_OWN_USER,\n  FINISH_WRITE_USER_SETTINGS,\n  START_ADD_USER,\n  START_DELETE_USER,\n  START_EDIT_USER,\n  START_LOADING_USER_COMPANY_INFO,\n  START_LOADING_USER_INFORMATION_OVER_ID,\n  START_LOADING_USER_LIST,\n  START_MAIL_USER,\n  START_UPDATE_OWN_USER,\n  START_WRITE_USER_SETTINGS,\n} from '../actions/ld-user-management-actions';\n\nconst LdUserManagementReducer = (state = {}, action) => {\n  switch (action.type) {\n    case 'RESET_STATE':\n      return {};\n    case 'DUMMY_STATE':\n      return { ...state, isDummy: true };\n    case START_LOADING_USER_LIST:\n      return {\n        ...state,\n        isUserListLoading: true,\n      };\n    case FINISH_LOADING_USER_LIST:\n      return {\n        ...state,\n        userList: action.userList.users,\n        isUserListLoading: false,\n      };\n    case ERROR_LOADING_USER_LIST:\n      return {\n        ...state,\n        result: action.error,\n        isUserListLoading: false,\n      };\n    // --------------------------------------------------------------------------------------\n    case START_ADD_USER:\n    case START_EDIT_USER:\n    case START_DELETE_USER:\n    case START_MAIL_USER:\n      return {\n        ...state,\n        isUserRequestLoading: true,\n      };\n    case FINISH_ADD_USER:\n      return {\n        ...state,\n        user: action.user,\n        userRequestResult: true,\n        userRequestType: 'new',\n        isUserRequestLoading: false,\n      };\n    case ERROR_ADD_USER:\n      return {\n        ...state,\n        result: action.error,\n        userRequestResult: false,\n        userRequestType: 'new',\n        isUserRequestLoading: false,\n      };\n    case CLEAR_ADD_USER:\n      return {\n        ...state,\n        userRequestResult: null,\n        userRequestType: 'new',\n        result: null,\n      };\n\n    // --------------------------------------------------------------------------------------\n\n    case FINISH_EDIT_USER:\n      return {\n        ...state,\n        userEdit: action.userEdit,\n        isUserRequestLoading: false,\n        userRequestResult: true,\n        userRequestType: 'edit',\n      };\n    case ERROR_EDIT_USER:\n      return {\n        ...state,\n        isUserRequestLoading: false,\n        result: action.error,\n        userRequestType: 'edit',\n      };\n    case CLEAR_EDIT_USER:\n      return {\n        ...state,\n        userRequestResult: null,\n        userRequestType: 'edit',\n        result: null,\n      };\n\n    // --------------------------------------------------------------------------------------\n    case FINISH_DELETE_USER:\n      return {\n        ...state,\n        deletedUser: action.deletedUser,\n        isUserRequestLoading: false,\n        userRequestResult: true,\n        userRequestType: 'delete',\n      };\n    case ERROR_DELETE_USER:\n      return {\n        ...state,\n        isUserRequestLoading: false,\n        result: action.error,\n        deletedUser: action.error,\n        userRequestType: 'delete',\n      };\n    case CLEAR_DELETE_USER:\n      return {\n        ...state,\n        userRequestResult: null,\n        userRequestType: 'delete',\n        deletedUser: null,\n        result: null,\n      };\n\n\n    // --------------------------------------------------------------------------------------\n    case FINISH_MAIL_USER:\n      return {\n        ...state,\n        userMail: action.userMail,\n        isUserRequestLoading: false,\n        userRequestResult: true,\n        userRequestType: 'sendMail',\n      };\n    case ERROR_MAIL_USER:\n      return {\n        ...state,\n        isUserRequestLoading: false,\n        result: action.error,\n        userMail: action.error,\n        userRequestType: 'sendMail',\n      };\n    case CLEAR_MAIL_USER:\n      return {\n        ...state,\n        userRequestResult: null,\n        userRequestType: 'sendMail',\n        userMail: null,\n        result: null,\n      };\n\n    // --------------------------------------------------------------------------------------\n    case START_LOADING_USER_COMPANY_INFO:\n      return {\n        ...state,\n        isUserCompanyInfoLoading: true,\n      };\n    case FINISH_LOADING_USER_COMPANY_INFO:\n      return {\n        ...state,\n        companyInfo: action.companyInfo,\n        isUserCompanyInfoLoading: false,\n      };\n    case CLEAR_USER_COMPANY_INFO:\n      return {\n        ...state,\n        companyInfo: false,\n        isUserCompanyInfoLoading: false,\n        result: null,\n        updatedUser: false,\n        isUpdatedUser: false,\n      };\n    case ERROR_LOADING_USER_COMPANY_INFO:\n      return {\n        ...state,\n        result: action.error,\n        isUserCompanyInfoLoading: false,\n      };\n\n    // --------------------------------------------------------------------------------------\n    case START_LOADING_USER_INFORMATION_OVER_ID:\n      return {\n        ...state,\n        isUserInfoIdLoading: true,\n      };\n    case FINISH_LOADING_USER_INFORMATION_OVER_ID:\n      return {\n        ...state,\n        userInfoId: action.userInfoId,\n        isUserInfoIdLoading: false,\n      };\n    case ERROR_LOADING_USER_INFORMATION_OVER_ID:\n      return {\n        ...state,\n        result: action.error,\n        isUserInfoIdLoading: false,\n      };\n\n    // --------------------------------------------------------------------------------------\n    case START_WRITE_USER_SETTINGS:\n      return {\n        ...state,\n        isWriteUserSettings: true,\n      };\n    case FINISH_WRITE_USER_SETTINGS:\n      return {\n        ...state,\n        UserSettings: action.UserSettings,\n        isWriteUserSettings: false,\n      };\n    case ERROR_WRITE_USER_SETTINGS:\n      return {\n        ...state,\n        result: action.error,\n        isWriteUserSettings: false,\n      };\n    // --------------------------------------------------------------------------------------\n    case START_UPDATE_OWN_USER:\n      return {\n        ...state,\n        isUpdatedUser: true,\n      };\n    case FINISH_UPDATE_OWN_USER:\n      return {\n        ...state,\n        updatedUser: true,\n        isUpdatedUser: false,\n      };\n    case ERROR_UPDATE_OWN_USER:\n      return {\n        ...state,\n        result: action.error,\n        isUpdatedUser: false,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default LdUserManagementReducer;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n// eslint-disable-next-line import/no-cycle\nimport {\n  ERROR_LOADING_SAVED_USER_SETTINGS,\n  ERROR_LOADING_USER_INFORMATION,\n  ERROR_LOADING_USER_SETTINGS,\n  FINISH_LOADING_SAVED_USER_SETTINGS,\n  FINISH_LOADING_USER_INFORMATION,\n  FINISH_LOADING_USER_SETTINGS,\n  LOGOUT_STATUS,\n  START_LOADING_SAVED_USER_SETTINGS,\n  START_LOADING_USER_INFORMATION,\n  START_LOADING_USER_SETTINGS,\n} from '../actions/ld-users-actions';\n\nconst LdUsersReducer = (state = {}, action) => {\n  switch (action.type) {\n    case 'RESET_STATE':\n      return {};\n    case 'DUMMY_STATE':\n      return {...state, isDummy: true};\n    case START_LOADING_USER_INFORMATION:\n      return {\n        ...state,\n        isUserInfoLoading: true\n      };\n    case FINISH_LOADING_USER_INFORMATION:\n      return {\n        ...state,\n        info: action.userInfo,\n        isUserInfoLoading: false\n      };\n    case ERROR_LOADING_USER_INFORMATION:\n      return {\n        ...state,\n        result: action.error,\n        isUserInfoLoading: false\n      };\n\n    // --------------------------------------------------------------------------------------\n    case START_LOADING_USER_SETTINGS:\n      return {\n        ...state,\n        isUserSettingsLoading: true\n      };\n    case FINISH_LOADING_USER_SETTINGS:\n      return {\n        ...state,\n        settings: Object.assign({}, state.userSettings, { [action.setting]: action.userSettings }),\n        isUserSettingsLoading: false\n      };\n    case ERROR_LOADING_USER_SETTINGS:\n      return {\n        ...state,\n        result: action.error,\n        isUserSettingsLoading: false\n      };\n\n      // --------------------------------------------------------------------------------------\n    case START_LOADING_SAVED_USER_SETTINGS:\n      return {\n        ...state,\n        isSavedUserSettingsLoading: true\n      };\n    case FINISH_LOADING_SAVED_USER_SETTINGS:\n      if(action.setting === 'dashboardConfig'){\n        return {\n          ...state,\n          savedSettings: action.setting,\n          isSavedUserSettingsLoading: false\n        };\n      } else {\n        return {\n          ...state,\n          savedSettings: action.savedUserSettings,\n          isSavedUserSettingsLoading: false\n        };\n      }\n    case ERROR_LOADING_SAVED_USER_SETTINGS:\n      return {\n        ...state,\n        result: action.error,\n        isSavedUserSettingsLoading: false\n      };\n\n    // --------------------------------------------------------------------------------------\n    case LOGOUT_STATUS:\n      return {\n        ...state,\n        userLogoutStatus: action.status\n      };\n    default:\n      return state;\n  }\n};\n\nexport default LdUsersReducer;\n","/**\n@license\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport { ReducersMapObject, StoreEnhancer } from 'redux'\n\nexport interface LazyStore {\n  addReducers: (newReducers: ReducersMapObject) => void\n}\n\n/**\n  A Redux store enhancer that lets you lazy-install reducers after the store\n  has booted up. Use this if your application lazy-loads routes that are connected\n  to a Redux store.\n\n  Example:\n\n      import { combineReducers } from 'redux';\n      import { lazyReducerEnhancer } from 'pwa-helpers/lazy-reducer-enhancer.js';\n      import someReducer from './reducers/someReducer.js';\n\n      export const store = createStore(\n        (state, action) => state,\n        compose(lazyReducerEnhancer(combineReducers))\n      );\n\n  Then, in your page/element, you can lazy load a specific reducer with:\n\n      store.addReducers({\n        someReducer\n      });\n*/\nexport const lazyReducerEnhancer =\n  (combineReducers: typeof import('redux').combineReducers) => {\n    const enhancer: StoreEnhancer<LazyStore> = (nextCreator) => {\n      return (origReducer, preloadedState) => {\n        let lazyReducers = {};\n        const nextStore = nextCreator(origReducer, preloadedState);\n        return {\n          ...nextStore,\n          addReducers(newReducers) {\n            const combinedReducerMap: ReducersMapObject = {\n              ...lazyReducers,\n              ...newReducers\n            };\n\n            this.replaceReducer(combineReducers(lazyReducers = combinedReducerMap));\n          }\n        }\n      }\n    }\n\n    return enhancer;\n  };\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LdMessages } from '../components/ld-application/ld-messages/ld-error-messages';\nimport { baseConfig } from '../auto-generated/config';\nimport { clearToken } from '../js/tokenHandling';\nimport { ToastNotificationHandler } from './services/Notifications';\n\nclass LdErrorHandler {\n  notificationHandler = new ToastNotificationHandler();\n\n  /**\n   * Catches any error message and displays the error in a toast message\n   *\n   *\n   * @param {String} message - The message returned by any method that throws the error\n   * @param  {String} replaceValue\n   */\n  // --------------------------------------------------------------------------------------\n  _handleError(message, replaceValue = null) {\n    const parent = window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') != null ? window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') : window.document.querySelector('ld-platform');\n    if (!parent) {\n      console.warn(\"Could not find ld-platform to get notification element. Maybe we are in a test. Tried to display message: \", message);\n      return;\n    }\n    const _toastElement = parent.shadowRoot.querySelector('paper-toast#ld-toast');\n    if (message !== null && typeof LdMessages[message] !== 'undefined' && LdMessages[message] !== null) {\n      const _error = LdMessages[message];\n      if(_error.error){\n        _toastElement.removeAttribute(\"data-notification-type\");\n      } else {\n        _toastElement.setAttribute(\"data-notification-type\", 'success');\n      }\n      if (replaceValue != null) {\n        _error.message = _error.message.replace('%replaceValue', replaceValue);\n      }\n      const _toastMessageElement = _toastElement.querySelector('.ld-toast-message');\n\n      if (_error.highlight_input) {\n        this._formFieldsInvalid = true;\n      }\n\n      if (_error.disable_input) {\n        this._formFieldsDisabled = true;\n      }\n\n      _toastMessageElement.innerHTML = `${_error.message} (${_error.http_status_code === null ? _error.internal_status_code : _error.http_status_code})`;\n      if (_error.toast_duration !== 0) {\n        _toastElement.duration = _error.toast_duration;\n      }\n      _toastElement.open();\n      _error.message = _error.message.replace(replaceValue, '%replaceValue');\n    } else {\n      _toastElement.close();\n    }\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  handleFetchError(statusCode) {\n    if (statusCode === 401) {\n      clearToken();\n      window.location.href = `${baseConfig.frontend.applications.login.base_url}?redirect=${encodeURIComponent(window.location.href)}&message=session_timeout`;\n    } else {\n      this.notificationHandler.notify('error', `${LdMessages[statusCode]?.message} (${LdMessages[statusCode].http_status_code === null ? LdMessages[statusCode].internal_status_code : LdMessages[statusCode].http_status_code})`, 0);\n    }\n  }\n\n  /**\n   * Handles the click event on the close button inside the toast\n   *\n   *\n   */\n  // --------------------------------------------------------------------------------------\n  _onToastCloseClick() {\n    const parent = window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') != null ? window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') : window.document.querySelector('ld-platform');\n    const _toastElement = parent.shadowRoot.querySelector('paper-toast#ld-toast');\n\n    _toastElement.close();\n  }\n\n}\n\nconst LdError = new LdErrorHandler();\n\nexport default LdError;\n","export class HttpRequest {\n    method;\n    protocol;\n    hostname;\n    port;\n    path;\n    query;\n    headers;\n    username;\n    password;\n    fragment;\n    body;\n    constructor(options) {\n        this.method = options.method || \"GET\";\n        this.hostname = options.hostname || \"localhost\";\n        this.port = options.port;\n        this.query = options.query || {};\n        this.headers = options.headers || {};\n        this.body = options.body;\n        this.protocol = options.protocol\n            ? options.protocol.slice(-1) !== \":\"\n                ? `${options.protocol}:`\n                : options.protocol\n            : \"https:\";\n        this.path = options.path ? (options.path.charAt(0) !== \"/\" ? `/${options.path}` : options.path) : \"/\";\n        this.username = options.username;\n        this.password = options.password;\n        this.fragment = options.fragment;\n    }\n    static clone(request) {\n        const cloned = new HttpRequest({\n            ...request,\n            headers: { ...request.headers },\n        });\n        if (cloned.query) {\n            cloned.query = cloneQuery(cloned.query);\n        }\n        return cloned;\n    }\n    static isInstance(request) {\n        if (!request) {\n            return false;\n        }\n        const req = request;\n        return (\"method\" in req &&\n            \"protocol\" in req &&\n            \"hostname\" in req &&\n            \"path\" in req &&\n            typeof req[\"query\"] === \"object\" &&\n            typeof req[\"headers\"] === \"object\");\n    }\n    clone() {\n        return HttpRequest.clone(this);\n    }\n}\nfunction cloneQuery(query) {\n    return Object.keys(query).reduce((carry, paramName) => {\n        const param = query[paramName];\n        return {\n            ...carry,\n            [paramName]: Array.isArray(param) ? [...param] : param,\n        };\n    }, {});\n}\n","import { HttpRequest } from \"@smithy/protocol-http\";\nexport function resolveHostHeaderConfig(input) {\n    return input;\n}\nexport const hostHeaderMiddleware = (options) => (next) => async (args) => {\n    if (!HttpRequest.isInstance(args.request))\n        return next(args);\n    const { request } = args;\n    const { handlerProtocol = \"\" } = options.requestHandler.metadata || {};\n    if (handlerProtocol.indexOf(\"h2\") >= 0 && !request.headers[\":authority\"]) {\n        delete request.headers[\"host\"];\n        request.headers[\":authority\"] = request.hostname + (request.port ? \":\" + request.port : \"\");\n    }\n    else if (!request.headers[\"host\"]) {\n        let host = request.hostname;\n        if (request.port != null)\n            host += `:${request.port}`;\n        request.headers[\"host\"] = host;\n    }\n    return next(args);\n};\nexport const hostHeaderMiddlewareOptions = {\n    name: \"hostHeaderMiddleware\",\n    step: \"build\",\n    priority: \"low\",\n    tags: [\"HOST\"],\n    override: true,\n};\nexport const getHostHeaderPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(hostHeaderMiddleware(options), hostHeaderMiddlewareOptions);\n    },\n});\n","export const loggerMiddleware = () => (next, context) => async (args) => {\n    try {\n        const response = await next(args);\n        const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n        const { overrideInputFilterSensitiveLog, overrideOutputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n        const inputFilterSensitiveLog = overrideInputFilterSensitiveLog ?? context.inputFilterSensitiveLog;\n        const outputFilterSensitiveLog = overrideOutputFilterSensitiveLog ?? context.outputFilterSensitiveLog;\n        const { $metadata, ...outputWithoutMetadata } = response.output;\n        logger?.info?.({\n            clientName,\n            commandName,\n            input: inputFilterSensitiveLog(args.input),\n            output: outputFilterSensitiveLog(outputWithoutMetadata),\n            metadata: $metadata,\n        });\n        return response;\n    }\n    catch (error) {\n        const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n        const { overrideInputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n        const inputFilterSensitiveLog = overrideInputFilterSensitiveLog ?? context.inputFilterSensitiveLog;\n        logger?.error?.({\n            clientName,\n            commandName,\n            input: inputFilterSensitiveLog(args.input),\n            error,\n            metadata: error.$metadata,\n        });\n        throw error;\n    }\n};\nexport const loggerMiddlewareOptions = {\n    name: \"loggerMiddleware\",\n    tags: [\"LOGGER\"],\n    step: \"initialize\",\n    override: true,\n};\nexport const getLoggerPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(loggerMiddleware(), loggerMiddlewareOptions);\n    },\n});\n","export const recursionDetectionMiddlewareOptions = {\n    step: \"build\",\n    tags: [\"RECURSION_DETECTION\"],\n    name: \"recursionDetectionMiddleware\",\n    override: true,\n    priority: \"low\",\n};\n","export const normalizeProvider = (input) => {\n    if (typeof input === \"function\")\n        return input;\n    const promisified = Promise.resolve(input);\n    return () => promisified;\n};\n","export const customEndpointFunctions = {};\n","const VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`);\nexport const isValidHostLabel = (value, allowSubDomains = false) => {\n    if (!allowSubDomains) {\n        return VALID_HOST_LABEL_REGEX.test(value);\n    }\n    const labels = value.split(\".\");\n    for (const label of labels) {\n        if (!isValidHostLabel(label)) {\n            return false;\n        }\n    }\n    return true;\n};\n","const IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}$`);\nexport const isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith(\"[\") && value.endsWith(\"]\"));\n","import { isValidHostLabel } from \"@smithy/util-endpoints\";\nimport { isIpAddress } from \"../isIpAddress\";\nexport const isVirtualHostableS3Bucket = (value, allowSubDomains = false) => {\n    if (allowSubDomains) {\n        for (const label of value.split(\".\")) {\n            if (!isVirtualHostableS3Bucket(label)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    if (!isValidHostLabel(value)) {\n        return false;\n    }\n    if (value.length < 3 || value.length > 63) {\n        return false;\n    }\n    if (value !== value.toLowerCase()) {\n        return false;\n    }\n    if (isIpAddress(value)) {\n        return false;\n    }\n    return true;\n};\n","import partitionsInfo from \"./partitions.json\";\nlet selectedPartitionsInfo = partitionsInfo;\nlet selectedUserAgentPrefix = \"\";\nexport const partition = (value) => {\n    const { partitions } = selectedPartitionsInfo;\n    for (const partition of partitions) {\n        const { regions, outputs } = partition;\n        for (const [region, regionData] of Object.entries(regions)) {\n            if (region === value) {\n                return {\n                    ...outputs,\n                    ...regionData,\n                };\n            }\n        }\n    }\n    for (const partition of partitions) {\n        const { regionRegex, outputs } = partition;\n        if (new RegExp(regionRegex).test(value)) {\n            return {\n                ...outputs,\n            };\n        }\n    }\n    const DEFAULT_PARTITION = partitions.find((partition) => partition.id === \"aws\");\n    if (!DEFAULT_PARTITION) {\n        throw new Error(\"Provided region was not found in the partition array or regex,\" +\n            \" and default partition with id 'aws' doesn't exist.\");\n    }\n    return {\n        ...DEFAULT_PARTITION.outputs,\n    };\n};\nexport const setPartitionInfo = (partitionsInfo, userAgentPrefix = \"\") => {\n    selectedPartitionsInfo = partitionsInfo;\n    selectedUserAgentPrefix = userAgentPrefix;\n};\nexport const useDefaultPartitionInfo = () => {\n    setPartitionInfo(partitionsInfo, \"\");\n};\nexport const getUserAgentPrefix = () => selectedUserAgentPrefix;\n","import { customEndpointFunctions } from \"@smithy/util-endpoints\";\nimport { isVirtualHostableS3Bucket } from \"./lib/aws/isVirtualHostableS3Bucket\";\nimport { parseArn } from \"./lib/aws/parseArn\";\nimport { partition } from \"./lib/aws/partition\";\nexport const awsEndpointFunctions = {\n    isVirtualHostableS3Bucket: isVirtualHostableS3Bucket,\n    parseArn: parseArn,\n    partition: partition,\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n","const ARN_DELIMITER = \":\";\nconst RESOURCE_DELIMITER = \"/\";\nexport const parseArn = (value) => {\n    const segments = value.split(ARN_DELIMITER);\n    if (segments.length < 6)\n        return null;\n    const [arn, partition, service, region, accountId, ...resourcePath] = segments;\n    if (arn !== \"arn\" || partition === \"\" || service === \"\" || resourcePath.join(ARN_DELIMITER) === \"\")\n        return null;\n    const resourceId = resourcePath.map((resource) => resource.split(RESOURCE_DELIMITER)).flat();\n    return {\n        partition,\n        service,\n        region,\n        accountId,\n        resourceId,\n    };\n};\n","export function setFeature(context, feature, value) {\n    if (!context.__aws_sdk_context) {\n        context.__aws_sdk_context = {\n            features: {},\n        };\n    }\n    else if (!context.__aws_sdk_context.features) {\n        context.__aws_sdk_context.features = {};\n    }\n    context.__aws_sdk_context.features[feature] = value;\n}\n","import { setFeature } from \"@aws-sdk/core\";\nconst ACCOUNT_ID_ENDPOINT_REGEX = /\\d{12}\\.ddb/;\nexport async function checkFeatures(context, config, args) {\n    const request = args.request;\n    if (request?.headers?.[\"smithy-protocol\"] === \"rpc-v2-cbor\") {\n        setFeature(context, \"PROTOCOL_RPC_V2_CBOR\", \"M\");\n    }\n    if (typeof config.retryStrategy === \"function\") {\n        const retryStrategy = await config.retryStrategy();\n        if (typeof retryStrategy.acquireInitialRetryToken === \"function\") {\n            if (retryStrategy.constructor?.name?.includes(\"Adaptive\")) {\n                setFeature(context, \"RETRY_MODE_ADAPTIVE\", \"F\");\n            }\n            else {\n                setFeature(context, \"RETRY_MODE_STANDARD\", \"E\");\n            }\n        }\n        else {\n            setFeature(context, \"RETRY_MODE_LEGACY\", \"D\");\n        }\n    }\n    if (typeof config.accountIdEndpointMode === \"function\") {\n        const endpointV2 = context.endpointV2;\n        if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) {\n            setFeature(context, \"ACCOUNT_ID_ENDPOINT\", \"O\");\n        }\n        switch (await config.accountIdEndpointMode?.()) {\n            case \"disabled\":\n                setFeature(context, \"ACCOUNT_ID_MODE_DISABLED\", \"Q\");\n                break;\n            case \"preferred\":\n                setFeature(context, \"ACCOUNT_ID_MODE_PREFERRED\", \"P\");\n                break;\n            case \"required\":\n                setFeature(context, \"ACCOUNT_ID_MODE_REQUIRED\", \"R\");\n                break;\n        }\n    }\n    const identity = context.__smithy_context?.selectedHttpAuthScheme?.identity;\n    if (identity?.$source) {\n        const credentials = identity;\n        if (credentials.accountId) {\n            setFeature(context, \"RESOLVED_ACCOUNT_ID\", \"T\");\n        }\n        for (const [key, value] of Object.entries(credentials.$source ?? {})) {\n            setFeature(context, key, value);\n        }\n    }\n}\n","export const USER_AGENT = \"user-agent\";\nexport const X_AMZ_USER_AGENT = \"x-amz-user-agent\";\nexport const SPACE = \" \";\nexport const UA_NAME_SEPARATOR = \"/\";\nexport const UA_NAME_ESCAPE_REGEX = /[^!$%&'*+\\-.^_`|~\\w]/g;\nexport const UA_VALUE_ESCAPE_REGEX = /[^!$%&'*+\\-.^_`|~\\w#]/g;\nexport const UA_ESCAPE_CHAR = \"-\";\n","import { getUserAgentPrefix } from \"@aws-sdk/util-endpoints\";\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { checkFeatures } from \"./check-features\";\nimport { SPACE, UA_ESCAPE_CHAR, UA_NAME_ESCAPE_REGEX, UA_NAME_SEPARATOR, UA_VALUE_ESCAPE_REGEX, USER_AGENT, X_AMZ_USER_AGENT, } from \"./constants\";\nimport { encodeFeatures } from \"./encode-features\";\nexport const userAgentMiddleware = (options) => (next, context) => async (args) => {\n    const { request } = args;\n    if (!HttpRequest.isInstance(request)) {\n        return next(args);\n    }\n    const { headers } = request;\n    const userAgent = context?.userAgent?.map(escapeUserAgent) || [];\n    const defaultUserAgent = (await options.defaultUserAgentProvider()).map(escapeUserAgent);\n    await checkFeatures(context, options, args);\n    const awsContext = context;\n    defaultUserAgent.push(`m/${encodeFeatures(Object.assign({}, context.__smithy_context?.features, awsContext.__aws_sdk_context?.features))}`);\n    const customUserAgent = options?.customUserAgent?.map(escapeUserAgent) || [];\n    const appId = await options.userAgentAppId();\n    if (appId) {\n        defaultUserAgent.push(escapeUserAgent([`app`, `${appId}`]));\n    }\n    const prefix = getUserAgentPrefix();\n    const sdkUserAgentValue = (prefix ? [prefix] : [])\n        .concat([...defaultUserAgent, ...userAgent, ...customUserAgent])\n        .join(SPACE);\n    const normalUAValue = [\n        ...defaultUserAgent.filter((section) => section.startsWith(\"aws-sdk-\")),\n        ...customUserAgent,\n    ].join(SPACE);\n    if (options.runtime !== \"browser\") {\n        if (normalUAValue) {\n            headers[X_AMZ_USER_AGENT] = headers[X_AMZ_USER_AGENT]\n                ? `${headers[USER_AGENT]} ${normalUAValue}`\n                : normalUAValue;\n        }\n        headers[USER_AGENT] = sdkUserAgentValue;\n    }\n    else {\n        headers[X_AMZ_USER_AGENT] = sdkUserAgentValue;\n    }\n    return next({\n        ...args,\n        request,\n    });\n};\nconst escapeUserAgent = (userAgentPair) => {\n    const name = userAgentPair[0]\n        .split(UA_NAME_SEPARATOR)\n        .map((part) => part.replace(UA_NAME_ESCAPE_REGEX, UA_ESCAPE_CHAR))\n        .join(UA_NAME_SEPARATOR);\n    const version = userAgentPair[1]?.replace(UA_VALUE_ESCAPE_REGEX, UA_ESCAPE_CHAR);\n    const prefixSeparatorIndex = name.indexOf(UA_NAME_SEPARATOR);\n    const prefix = name.substring(0, prefixSeparatorIndex);\n    let uaName = name.substring(prefixSeparatorIndex + 1);\n    if (prefix === \"api\") {\n        uaName = uaName.toLowerCase();\n    }\n    return [prefix, uaName, version]\n        .filter((item) => item && item.length > 0)\n        .reduce((acc, item, index) => {\n        switch (index) {\n            case 0:\n                return item;\n            case 1:\n                return `${acc}/${item}`;\n            default:\n                return `${acc}#${item}`;\n        }\n    }, \"\");\n};\nexport const getUserAgentMiddlewareOptions = {\n    name: \"getUserAgentMiddleware\",\n    step: \"build\",\n    priority: \"low\",\n    tags: [\"SET_USER_AGENT\", \"USER_AGENT\"],\n    override: true,\n};\nexport const getUserAgentPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(userAgentMiddleware(config), getUserAgentMiddlewareOptions);\n    },\n});\n","import { isValidHostLabel } from \"@smithy/util-endpoints\";\nconst validRegions = new Set();\nexport const checkRegion = (region, check = isValidHostLabel) => {\n    if (!validRegions.has(region) && !check(region)) {\n        if (region === \"*\") {\n            console.warn(`@smithy/config-resolver WARN - Please use the caller region instead of \"*\". See \"sigv4a\" in https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/CLIENTS.md.`);\n        }\n        else {\n            throw new Error(`Region not accepted: region=\"${region}\" is not a valid hostname component.`);\n        }\n    }\n    else {\n        validRegions.add(region);\n    }\n};\n","export const isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\n","export const SMITHY_CONTEXT_KEY = \"__smithy_context\";\n","import { SMITHY_CONTEXT_KEY } from \"@smithy/types\";\nexport const getSmithyContext = (context) => context[SMITHY_CONTEXT_KEY] || (context[SMITHY_CONTEXT_KEY] = {});\n","import { httpAuthSchemeMiddleware } from \"./httpAuthSchemeMiddleware\";\nexport const httpAuthSchemeEndpointRuleSetMiddlewareOptions = {\n    step: \"serialize\",\n    tags: [\"HTTP_AUTH_SCHEME\"],\n    name: \"httpAuthSchemeMiddleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: \"endpointV2Middleware\",\n};\nexport const getHttpAuthSchemeEndpointRuleSetPlugin = (config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(httpAuthSchemeMiddleware(config, {\n            httpAuthSchemeParametersProvider,\n            identityProviderConfigProvider,\n        }), httpAuthSchemeEndpointRuleSetMiddlewareOptions);\n    },\n});\n","export class DefaultIdentityProviderConfig {\n    authSchemes = new Map();\n    constructor(config) {\n        for (const [key, value] of Object.entries(config)) {\n            if (value !== undefined) {\n                this.authSchemes.set(key, value);\n            }\n        }\n    }\n    getIdentityProvider(schemeId) {\n        return this.authSchemes.get(schemeId);\n    }\n}\n","import { HttpRequest } from \"@smithy/protocol-http\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nconst defaultErrorHandler = (signingProperties) => (error) => {\n    throw error;\n};\nconst defaultSuccessHandler = (httpResponse, signingProperties) => { };\nexport const httpSigningMiddleware = (config) => (next, context) => async (args) => {\n    if (!HttpRequest.isInstance(args.request)) {\n        return next(args);\n    }\n    const smithyContext = getSmithyContext(context);\n    const scheme = smithyContext.selectedHttpAuthScheme;\n    if (!scheme) {\n        throw new Error(`No HttpAuthScheme was selected: unable to sign request`);\n    }\n    const { httpAuthOption: { signingProperties = {} }, identity, signer, } = scheme;\n    const output = await next({\n        ...args,\n        request: await signer.sign(args.request, identity, signingProperties),\n    }).catch((signer.errorHandler || defaultErrorHandler)(signingProperties));\n    (signer.successHandler || defaultSuccessHandler)(output.response, signingProperties);\n    return output;\n};\n","import { httpSigningMiddleware } from \"./httpSigningMiddleware\";\nexport const httpSigningMiddlewareOptions = {\n    step: \"finalizeRequest\",\n    tags: [\"HTTP_SIGNING\"],\n    name: \"httpSigningMiddleware\",\n    aliases: [\"apiKeyMiddleware\", \"tokenMiddleware\", \"awsAuthMiddleware\"],\n    override: true,\n    relation: \"after\",\n    toMiddleware: \"retryMiddleware\",\n};\nexport const getHttpSigningPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(httpSigningMiddleware(config), httpSigningMiddlewareOptions);\n    },\n});\n","export class HttpResponse {\n    statusCode;\n    reason;\n    headers;\n    body;\n    constructor(options) {\n        this.statusCode = options.statusCode;\n        this.reason = options.reason;\n        this.headers = options.headers || {};\n        this.body = options.body;\n    }\n    static isInstance(response) {\n        if (!response)\n            return false;\n        const resp = response;\n        return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n    }\n}\n","export const operation = (namespace, name, traits, input, output) => ({\n    name,\n    namespace,\n    traits,\n    input,\n    output,\n});\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nimport { operation } from \"../schemas/operation\";\nexport const schemaDeserializationMiddleware = (config) => (next, context) => async (args) => {\n    const { response } = await next(args);\n    const { operationSchema } = getSmithyContext(context);\n    const [, ns, n, t, i, o] = operationSchema ?? [];\n    try {\n        const parsed = await config.protocol.deserializeResponse(operation(ns, n, t, i, o), {\n            ...config,\n            ...context,\n        }, response);\n        return {\n            response,\n            output: parsed,\n        };\n    }\n    catch (error) {\n        Object.defineProperty(error, \"$response\", {\n            value: response,\n            enumerable: false,\n            writable: false,\n            configurable: false,\n        });\n        if (!(\"$metadata\" in error)) {\n            const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;\n            try {\n                error.message += \"\\n  \" + hint;\n            }\n            catch (e) {\n                if (!context.logger || context.logger?.constructor?.name === \"NoOpLogger\") {\n                    console.warn(hint);\n                }\n                else {\n                    context.logger?.warn?.(hint);\n                }\n            }\n            if (typeof error.$responseBodyText !== \"undefined\") {\n                if (error.$response) {\n                    error.$response.body = error.$responseBodyText;\n                }\n            }\n            try {\n                if (HttpResponse.isInstance(response)) {\n                    const { headers = {} } = response;\n                    const headerEntries = Object.entries(headers);\n                    error.$metadata = {\n                        httpStatusCode: response.statusCode,\n                        requestId: findHeader(/^x-[\\w-]+-request-?id$/, headerEntries),\n                        extendedRequestId: findHeader(/^x-[\\w-]+-id-2$/, headerEntries),\n                        cfId: findHeader(/^x-[\\w-]+-cf-id$/, headerEntries),\n                    };\n                }\n            }\n            catch (e) {\n            }\n        }\n        throw error;\n    }\n};\nconst findHeader = (pattern, headers) => {\n    return (headers.find(([k]) => {\n        return k.match(pattern);\n    }) || [void 0, void 1])[1];\n};\n","import { schemaDeserializationMiddleware } from \"./schemaDeserializationMiddleware\";\nimport { schemaSerializationMiddleware } from \"./schemaSerializationMiddleware\";\nexport const deserializerMiddlewareOption = {\n    name: \"deserializerMiddleware\",\n    step: \"deserialize\",\n    tags: [\"DESERIALIZER\"],\n    override: true,\n};\nexport const serializerMiddlewareOption = {\n    name: \"serializerMiddleware\",\n    step: \"serialize\",\n    tags: [\"SERIALIZER\"],\n    override: true,\n};\nexport function getSchemaSerdePlugin(config) {\n    return {\n        applyToStack: (commandStack) => {\n            commandStack.add(schemaSerializationMiddleware(config), serializerMiddlewareOption);\n            commandStack.add(schemaDeserializationMiddleware(config), deserializerMiddlewareOption);\n            config.protocol.setSerdeContext(config);\n        },\n    };\n}\n","import { HttpRequest } from \"@smithy/protocol-http\";\nconst CONTENT_LENGTH_HEADER = \"content-length\";\nexport function contentLengthMiddleware(bodyLengthChecker) {\n    return (next) => async (args) => {\n        const request = args.request;\n        if (HttpRequest.isInstance(request)) {\n            const { body, headers } = request;\n            if (body &&\n                Object.keys(headers)\n                    .map((str) => str.toLowerCase())\n                    .indexOf(CONTENT_LENGTH_HEADER) === -1) {\n                try {\n                    const length = bodyLengthChecker(body);\n                    request.headers = {\n                        ...request.headers,\n                        [CONTENT_LENGTH_HEADER]: String(length),\n                    };\n                }\n                catch (error) {\n                }\n            }\n        }\n        return next({\n            ...args,\n            request,\n        });\n    };\n}\nexport const contentLengthMiddlewareOptions = {\n    step: \"build\",\n    tags: [\"SET_CONTENT_LENGTH\", \"CONTENT_LENGTH\"],\n    name: \"contentLengthMiddleware\",\n    override: true,\n};\nexport const getContentLengthPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), contentLengthMiddlewareOptions);\n    },\n});\n","export const normalizeProvider = (input) => {\n    if (typeof input === \"function\")\n        return input;\n    const promisified = Promise.resolve(input);\n    return () => promisified;\n};\n","export const getEndpointFromConfig = async (serviceId) => undefined;\n","import { parseQueryString } from \"@smithy/querystring-parser\";\nexport const parseUrl = (url) => {\n    if (typeof url === \"string\") {\n        return parseUrl(new URL(url));\n    }\n    const { hostname, pathname, port, protocol, search } = url;\n    let query;\n    if (search) {\n        query = parseQueryString(search);\n    }\n    return {\n        hostname,\n        port: port ? parseInt(port) : undefined,\n        protocol,\n        path: pathname,\n        query,\n    };\n};\n","export function parseQueryString(querystring) {\n    const query = {};\n    querystring = querystring.replace(/^\\?/, \"\");\n    if (querystring) {\n        for (const pair of querystring.split(\"&\")) {\n            let [key, value = null] = pair.split(\"=\");\n            key = decodeURIComponent(key);\n            if (value) {\n                value = decodeURIComponent(value);\n            }\n            if (!(key in query)) {\n                query[key] = value;\n            }\n            else if (Array.isArray(query[key])) {\n                query[key].push(value);\n            }\n            else {\n                query[key] = [query[key], value];\n            }\n        }\n    }\n    return query;\n}\n","import { parseUrl } from \"@smithy/url-parser\";\nexport const toEndpointV1 = (endpoint) => {\n    if (typeof endpoint === \"object\") {\n        if (\"url\" in endpoint) {\n            return parseUrl(endpoint.url);\n        }\n        return endpoint;\n    }\n    return parseUrl(endpoint);\n};\n","export var RETRY_MODES;\n(function (RETRY_MODES) {\n    RETRY_MODES[\"STANDARD\"] = \"standard\";\n    RETRY_MODES[\"ADAPTIVE\"] = \"adaptive\";\n})(RETRY_MODES || (RETRY_MODES = {}));\nexport const DEFAULT_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_MODE = RETRY_MODES.STANDARD;\n","export const CLOCK_SKEW_ERROR_CODES = [\n    \"AuthFailure\",\n    \"InvalidSignatureException\",\n    \"RequestExpired\",\n    \"RequestInTheFuture\",\n    \"RequestTimeTooSkewed\",\n    \"SignatureDoesNotMatch\",\n];\nexport const THROTTLING_ERROR_CODES = [\n    \"BandwidthLimitExceeded\",\n    \"EC2ThrottledException\",\n    \"LimitExceededException\",\n    \"PriorRequestNotComplete\",\n    \"ProvisionedThroughputExceededException\",\n    \"RequestLimitExceeded\",\n    \"RequestThrottled\",\n    \"RequestThrottledException\",\n    \"SlowDown\",\n    \"ThrottledException\",\n    \"Throttling\",\n    \"ThrottlingException\",\n    \"TooManyRequestsException\",\n    \"TransactionInProgressException\",\n];\nexport const TRANSIENT_ERROR_CODES = [\"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nexport const TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\nexport const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"ECONNREFUSED\", \"EPIPE\", \"ETIMEDOUT\"];\nexport const NODEJS_NETWORK_ERROR_CODES = [\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENOTFOUND\"];\n","import { CLOCK_SKEW_ERROR_CODES, NODEJS_NETWORK_ERROR_CODES, NODEJS_TIMEOUT_ERROR_CODES, THROTTLING_ERROR_CODES, TRANSIENT_ERROR_CODES, TRANSIENT_ERROR_STATUS_CODES, } from \"./constants\";\nexport const isRetryableByTrait = (error) => error?.$retryable !== undefined;\nexport const isClockSkewError = (error) => CLOCK_SKEW_ERROR_CODES.includes(error.name);\nexport const isClockSkewCorrectedError = (error) => error.$metadata?.clockSkewCorrected;\nexport const isBrowserNetworkError = (error) => {\n    const errorMessages = new Set([\n        \"Failed to fetch\",\n        \"NetworkError when attempting to fetch resource\",\n        \"The Internet connection appears to be offline\",\n        \"Load failed\",\n        \"Network request failed\",\n    ]);\n    const isValid = error && error instanceof TypeError;\n    if (!isValid) {\n        return false;\n    }\n    return errorMessages.has(error.message);\n};\nexport const isThrottlingError = (error) => error.$metadata?.httpStatusCode === 429 ||\n    THROTTLING_ERROR_CODES.includes(error.name) ||\n    error.$retryable?.throttling == true;\nexport const isTransientError = (error, depth = 0) => isRetryableByTrait(error) ||\n    isClockSkewCorrectedError(error) ||\n    TRANSIENT_ERROR_CODES.includes(error.name) ||\n    NODEJS_TIMEOUT_ERROR_CODES.includes(error?.code || \"\") ||\n    NODEJS_NETWORK_ERROR_CODES.includes(error?.code || \"\") ||\n    TRANSIENT_ERROR_STATUS_CODES.includes(error.$metadata?.httpStatusCode || 0) ||\n    isBrowserNetworkError(error) ||\n    (error.cause !== undefined && depth <= 10 && isTransientError(error.cause, depth + 1));\nexport const isServerError = (error) => {\n    if (error.$metadata?.httpStatusCode !== undefined) {\n        const statusCode = error.$metadata.httpStatusCode;\n        if (500 <= statusCode && statusCode <= 599 && !isTransientError(error)) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n};\n","import { isThrottlingError } from \"@smithy/service-error-classification\";\nexport class DefaultRateLimiter {\n    static setTimeoutFn = setTimeout;\n    beta;\n    minCapacity;\n    minFillRate;\n    scaleConstant;\n    smooth;\n    currentCapacity = 0;\n    enabled = false;\n    lastMaxRate = 0;\n    measuredTxRate = 0;\n    requestCount = 0;\n    fillRate;\n    lastThrottleTime;\n    lastTimestamp = 0;\n    lastTxRateBucket;\n    maxCapacity;\n    timeWindow = 0;\n    constructor(options) {\n        this.beta = options?.beta ?? 0.7;\n        this.minCapacity = options?.minCapacity ?? 1;\n        this.minFillRate = options?.minFillRate ?? 0.5;\n        this.scaleConstant = options?.scaleConstant ?? 0.4;\n        this.smooth = options?.smooth ?? 0.8;\n        const currentTimeInSeconds = this.getCurrentTimeInSeconds();\n        this.lastThrottleTime = currentTimeInSeconds;\n        this.lastTxRateBucket = Math.floor(this.getCurrentTimeInSeconds());\n        this.fillRate = this.minFillRate;\n        this.maxCapacity = this.minCapacity;\n    }\n    getCurrentTimeInSeconds() {\n        return Date.now() / 1000;\n    }\n    async getSendToken() {\n        return this.acquireTokenBucket(1);\n    }\n    async acquireTokenBucket(amount) {\n        if (!this.enabled) {\n            return;\n        }\n        this.refillTokenBucket();\n        if (amount > this.currentCapacity) {\n            const delay = ((amount - this.currentCapacity) / this.fillRate) * 1000;\n            await new Promise((resolve) => DefaultRateLimiter.setTimeoutFn(resolve, delay));\n        }\n        this.currentCapacity = this.currentCapacity - amount;\n    }\n    refillTokenBucket() {\n        const timestamp = this.getCurrentTimeInSeconds();\n        if (!this.lastTimestamp) {\n            this.lastTimestamp = timestamp;\n            return;\n        }\n        const fillAmount = (timestamp - this.lastTimestamp) * this.fillRate;\n        this.currentCapacity = Math.min(this.maxCapacity, this.currentCapacity + fillAmount);\n        this.lastTimestamp = timestamp;\n    }\n    updateClientSendingRate(response) {\n        let calculatedRate;\n        this.updateMeasuredRate();\n        if (isThrottlingError(response)) {\n            const rateToUse = !this.enabled ? this.measuredTxRate : Math.min(this.measuredTxRate, this.fillRate);\n            this.lastMaxRate = rateToUse;\n            this.calculateTimeWindow();\n            this.lastThrottleTime = this.getCurrentTimeInSeconds();\n            calculatedRate = this.cubicThrottle(rateToUse);\n            this.enableTokenBucket();\n        }\n        else {\n            this.calculateTimeWindow();\n            calculatedRate = this.cubicSuccess(this.getCurrentTimeInSeconds());\n        }\n        const newRate = Math.min(calculatedRate, 2 * this.measuredTxRate);\n        this.updateTokenBucketRate(newRate);\n    }\n    calculateTimeWindow() {\n        this.timeWindow = this.getPrecise(Math.pow((this.lastMaxRate * (1 - this.beta)) / this.scaleConstant, 1 / 3));\n    }\n    cubicThrottle(rateToUse) {\n        return this.getPrecise(rateToUse * this.beta);\n    }\n    cubicSuccess(timestamp) {\n        return this.getPrecise(this.scaleConstant * Math.pow(timestamp - this.lastThrottleTime - this.timeWindow, 3) + this.lastMaxRate);\n    }\n    enableTokenBucket() {\n        this.enabled = true;\n    }\n    updateTokenBucketRate(newRate) {\n        this.refillTokenBucket();\n        this.fillRate = Math.max(newRate, this.minFillRate);\n        this.maxCapacity = Math.max(newRate, this.minCapacity);\n        this.currentCapacity = Math.min(this.currentCapacity, this.maxCapacity);\n    }\n    updateMeasuredRate() {\n        const t = this.getCurrentTimeInSeconds();\n        const timeBucket = Math.floor(t * 2) / 2;\n        this.requestCount++;\n        if (timeBucket > this.lastTxRateBucket) {\n            const currentRate = this.requestCount / (timeBucket - this.lastTxRateBucket);\n            this.measuredTxRate = this.getPrecise(currentRate * this.smooth + this.measuredTxRate * (1 - this.smooth));\n            this.requestCount = 0;\n            this.lastTxRateBucket = timeBucket;\n        }\n    }\n    getPrecise(num) {\n        return parseFloat(num.toFixed(8));\n    }\n}\n","export const DEFAULT_RETRY_DELAY_BASE = 100;\nexport const MAXIMUM_RETRY_DELAY = 20 * 1000;\nexport const THROTTLING_RETRY_DELAY_BASE = 500;\nexport const INITIAL_RETRY_TOKENS = 500;\nexport const RETRY_COST = 5;\nexport const TIMEOUT_RETRY_COST = 10;\nexport const NO_RETRY_INCREMENT = 1;\nexport const INVOCATION_ID_HEADER = \"amz-sdk-invocation-id\";\nexport const REQUEST_HEADER = \"amz-sdk-request\";\n","import { MAXIMUM_RETRY_DELAY } from \"./constants\";\nexport const createDefaultRetryToken = ({ retryDelay, retryCount, retryCost, }) => {\n    const getRetryCount = () => retryCount;\n    const getRetryDelay = () => Math.min(MAXIMUM_RETRY_DELAY, retryDelay);\n    const getRetryCost = () => retryCost;\n    return {\n        getRetryCount,\n        getRetryDelay,\n        getRetryCost,\n    };\n};\n","import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from \"./config\";\nimport { DEFAULT_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, NO_RETRY_INCREMENT, RETRY_COST, THROTTLING_RETRY_DELAY_BASE, TIMEOUT_RETRY_COST, } from \"./constants\";\nimport { getDefaultRetryBackoffStrategy } from \"./defaultRetryBackoffStrategy\";\nimport { createDefaultRetryToken } from \"./defaultRetryToken\";\nexport class StandardRetryStrategy {\n    maxAttempts;\n    mode = RETRY_MODES.STANDARD;\n    capacity = INITIAL_RETRY_TOKENS;\n    retryBackoffStrategy = getDefaultRetryBackoffStrategy();\n    maxAttemptsProvider;\n    constructor(maxAttempts) {\n        this.maxAttempts = maxAttempts;\n        this.maxAttemptsProvider = typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts;\n    }\n    async acquireInitialRetryToken(retryTokenScope) {\n        return createDefaultRetryToken({\n            retryDelay: DEFAULT_RETRY_DELAY_BASE,\n            retryCount: 0,\n        });\n    }\n    async refreshRetryTokenForRetry(token, errorInfo) {\n        const maxAttempts = await this.getMaxAttempts();\n        if (this.shouldRetry(token, errorInfo, maxAttempts)) {\n            const errorType = errorInfo.errorType;\n            this.retryBackoffStrategy.setDelayBase(errorType === \"THROTTLING\" ? THROTTLING_RETRY_DELAY_BASE : DEFAULT_RETRY_DELAY_BASE);\n            const delayFromErrorType = this.retryBackoffStrategy.computeNextBackoffDelay(token.getRetryCount());\n            const retryDelay = errorInfo.retryAfterHint\n                ? Math.max(errorInfo.retryAfterHint.getTime() - Date.now() || 0, delayFromErrorType)\n                : delayFromErrorType;\n            const capacityCost = this.getCapacityCost(errorType);\n            this.capacity -= capacityCost;\n            return createDefaultRetryToken({\n                retryDelay,\n                retryCount: token.getRetryCount() + 1,\n                retryCost: capacityCost,\n            });\n        }\n        throw new Error(\"No retry token available\");\n    }\n    recordSuccess(token) {\n        this.capacity = Math.max(INITIAL_RETRY_TOKENS, this.capacity + (token.getRetryCost() ?? NO_RETRY_INCREMENT));\n    }\n    getCapacity() {\n        return this.capacity;\n    }\n    async getMaxAttempts() {\n        try {\n            return await this.maxAttemptsProvider();\n        }\n        catch (error) {\n            console.warn(`Max attempts provider could not resolve. Using default of ${DEFAULT_MAX_ATTEMPTS}`);\n            return DEFAULT_MAX_ATTEMPTS;\n        }\n    }\n    shouldRetry(tokenToRenew, errorInfo, maxAttempts) {\n        const attempts = tokenToRenew.getRetryCount() + 1;\n        return (attempts < maxAttempts &&\n            this.capacity >= this.getCapacityCost(errorInfo.errorType) &&\n            this.isRetryableError(errorInfo.errorType));\n    }\n    getCapacityCost(errorType) {\n        return errorType === \"TRANSIENT\" ? TIMEOUT_RETRY_COST : RETRY_COST;\n    }\n    isRetryableError(errorType) {\n        return errorType === \"THROTTLING\" || errorType === \"TRANSIENT\";\n    }\n}\n","import { DEFAULT_RETRY_DELAY_BASE, MAXIMUM_RETRY_DELAY } from \"./constants\";\nexport const getDefaultRetryBackoffStrategy = () => {\n    let delayBase = DEFAULT_RETRY_DELAY_BASE;\n    const computeNextBackoffDelay = (attempts) => {\n        return Math.floor(Math.min(MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\n    };\n    const setDelayBase = (delay) => {\n        delayBase = delay;\n    };\n    return {\n        computeNextBackoffDelay,\n        setDelayBase,\n    };\n};\n","import { RETRY_MODES } from \"./config\";\nimport { DefaultRateLimiter } from \"./DefaultRateLimiter\";\nimport { StandardRetryStrategy } from \"./StandardRetryStrategy\";\nexport class AdaptiveRetryStrategy {\n    maxAttemptsProvider;\n    rateLimiter;\n    standardRetryStrategy;\n    mode = RETRY_MODES.ADAPTIVE;\n    constructor(maxAttemptsProvider, options) {\n        this.maxAttemptsProvider = maxAttemptsProvider;\n        const { rateLimiter } = options ?? {};\n        this.rateLimiter = rateLimiter ?? new DefaultRateLimiter();\n        this.standardRetryStrategy = new StandardRetryStrategy(maxAttemptsProvider);\n    }\n    async acquireInitialRetryToken(retryTokenScope) {\n        await this.rateLimiter.getSendToken();\n        return this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope);\n    }\n    async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n        this.rateLimiter.updateClientSendingRate(errorInfo);\n        return this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n    }\n    recordSuccess(token) {\n        this.rateLimiter.updateClientSendingRate({});\n        this.standardRetryStrategy.recordSuccess(token);\n    }\n}\n","export class NoOpLogger {\n    trace() { }\n    debug() { }\n    info() { }\n    warn() { }\n    error() { }\n}\n","export const randomUUID = typeof crypto !== \"undefined\" && crypto.randomUUID && crypto.randomUUID.bind(crypto);\n","import { randomUUID } from \"./randomUUID\";\nconst decimalToHex = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\nexport const v4 = () => {\n    if (randomUUID) {\n        return randomUUID();\n    }\n    const rnds = new Uint8Array(16);\n    crypto.getRandomValues(rnds);\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    return (decimalToHex[rnds[0]] +\n        decimalToHex[rnds[1]] +\n        decimalToHex[rnds[2]] +\n        decimalToHex[rnds[3]] +\n        \"-\" +\n        decimalToHex[rnds[4]] +\n        decimalToHex[rnds[5]] +\n        \"-\" +\n        decimalToHex[rnds[6]] +\n        decimalToHex[rnds[7]] +\n        \"-\" +\n        decimalToHex[rnds[8]] +\n        decimalToHex[rnds[9]] +\n        \"-\" +\n        decimalToHex[rnds[10]] +\n        decimalToHex[rnds[11]] +\n        decimalToHex[rnds[12]] +\n        decimalToHex[rnds[13]] +\n        decimalToHex[rnds[14]] +\n        decimalToHex[rnds[15]]);\n};\n","export const isStreamingPayload = (request) => request?.body instanceof ReadableStream;\n","import { HttpRequest, HttpResponse } from \"@smithy/protocol-http\";\nimport { isServerError, isThrottlingError, isTransientError } from \"@smithy/service-error-classification\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { INVOCATION_ID_HEADER, REQUEST_HEADER } from \"@smithy/util-retry\";\nimport { v4 } from \"@smithy/uuid\";\nimport { isStreamingPayload } from \"./isStreamingPayload/isStreamingPayload\";\nimport { asSdkError } from \"./util\";\nexport const retryMiddleware = (options) => (next, context) => async (args) => {\n    let retryStrategy = await options.retryStrategy();\n    const maxAttempts = await options.maxAttempts();\n    if (isRetryStrategyV2(retryStrategy)) {\n        retryStrategy = retryStrategy;\n        let retryToken = await retryStrategy.acquireInitialRetryToken(context[\"partition_id\"]);\n        let lastError = new Error();\n        let attempts = 0;\n        let totalRetryDelay = 0;\n        const { request } = args;\n        const isRequest = HttpRequest.isInstance(request);\n        if (isRequest) {\n            request.headers[INVOCATION_ID_HEADER] = v4();\n        }\n        while (true) {\n            try {\n                if (isRequest) {\n                    request.headers[REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n                }\n                const { response, output } = await next(args);\n                retryStrategy.recordSuccess(retryToken);\n                output.$metadata.attempts = attempts + 1;\n                output.$metadata.totalRetryDelay = totalRetryDelay;\n                return { response, output };\n            }\n            catch (e) {\n                const retryErrorInfo = getRetryErrorInfo(e);\n                lastError = asSdkError(e);\n                if (isRequest && isStreamingPayload(request)) {\n                    (context.logger instanceof NoOpLogger ? console : context.logger)?.warn(\"An error was encountered in a non-retryable streaming request.\");\n                    throw lastError;\n                }\n                try {\n                    retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);\n                }\n                catch (refreshError) {\n                    if (!lastError.$metadata) {\n                        lastError.$metadata = {};\n                    }\n                    lastError.$metadata.attempts = attempts + 1;\n                    lastError.$metadata.totalRetryDelay = totalRetryDelay;\n                    throw lastError;\n                }\n                attempts = retryToken.getRetryCount();\n                const delay = retryToken.getRetryDelay();\n                totalRetryDelay += delay;\n                await new Promise((resolve) => setTimeout(resolve, delay));\n            }\n        }\n    }\n    else {\n        retryStrategy = retryStrategy;\n        if (retryStrategy?.mode)\n            context.userAgent = [...(context.userAgent || []), [\"cfg/retry-mode\", retryStrategy.mode]];\n        return retryStrategy.retry(next, args);\n    }\n};\nconst isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== \"undefined\" &&\n    typeof retryStrategy.refreshRetryTokenForRetry !== \"undefined\" &&\n    typeof retryStrategy.recordSuccess !== \"undefined\";\nconst getRetryErrorInfo = (error) => {\n    const errorInfo = {\n        error,\n        errorType: getRetryErrorType(error),\n    };\n    const retryAfterHint = getRetryAfterHint(error.$response);\n    if (retryAfterHint) {\n        errorInfo.retryAfterHint = retryAfterHint;\n    }\n    return errorInfo;\n};\nconst getRetryErrorType = (error) => {\n    if (isThrottlingError(error))\n        return \"THROTTLING\";\n    if (isTransientError(error))\n        return \"TRANSIENT\";\n    if (isServerError(error))\n        return \"SERVER_ERROR\";\n    return \"CLIENT_ERROR\";\n};\nexport const retryMiddlewareOptions = {\n    name: \"retryMiddleware\",\n    tags: [\"RETRY\"],\n    step: \"finalizeRequest\",\n    priority: \"high\",\n    override: true,\n};\nexport const getRetryPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(retryMiddleware(options), retryMiddlewareOptions);\n    },\n});\nexport const getRetryAfterHint = (response) => {\n    if (!HttpResponse.isInstance(response))\n        return;\n    const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n    if (!retryAfterHeaderName)\n        return;\n    const retryAfter = response.headers[retryAfterHeaderName];\n    const retryAfterSeconds = Number(retryAfter);\n    if (!Number.isNaN(retryAfterSeconds))\n        return new Date(retryAfterSeconds * 1000);\n    const retryAfterDate = new Date(retryAfter);\n    return retryAfterDate;\n};\n","const getAllAliases = (name, aliases) => {\n    const _aliases = [];\n    if (name) {\n        _aliases.push(name);\n    }\n    if (aliases) {\n        for (const alias of aliases) {\n            _aliases.push(alias);\n        }\n    }\n    return _aliases;\n};\nconst getMiddlewareNameWithAliases = (name, aliases) => {\n    return `${name || \"anonymous\"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(\",\")})` : \"\"}`;\n};\nexport const constructStack = () => {\n    let absoluteEntries = [];\n    let relativeEntries = [];\n    let identifyOnResolve = false;\n    const entriesNameSet = new Set();\n    const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] ||\n        priorityWeights[b.priority || \"normal\"] - priorityWeights[a.priority || \"normal\"]);\n    const removeByName = (toRemove) => {\n        let isRemoved = false;\n        const filterCb = (entry) => {\n            const aliases = getAllAliases(entry.name, entry.aliases);\n            if (aliases.includes(toRemove)) {\n                isRemoved = true;\n                for (const alias of aliases) {\n                    entriesNameSet.delete(alias);\n                }\n                return false;\n            }\n            return true;\n        };\n        absoluteEntries = absoluteEntries.filter(filterCb);\n        relativeEntries = relativeEntries.filter(filterCb);\n        return isRemoved;\n    };\n    const removeByReference = (toRemove) => {\n        let isRemoved = false;\n        const filterCb = (entry) => {\n            if (entry.middleware === toRemove) {\n                isRemoved = true;\n                for (const alias of getAllAliases(entry.name, entry.aliases)) {\n                    entriesNameSet.delete(alias);\n                }\n                return false;\n            }\n            return true;\n        };\n        absoluteEntries = absoluteEntries.filter(filterCb);\n        relativeEntries = relativeEntries.filter(filterCb);\n        return isRemoved;\n    };\n    const cloneTo = (toStack) => {\n        absoluteEntries.forEach((entry) => {\n            toStack.add(entry.middleware, { ...entry });\n        });\n        relativeEntries.forEach((entry) => {\n            toStack.addRelativeTo(entry.middleware, { ...entry });\n        });\n        toStack.identifyOnResolve?.(stack.identifyOnResolve());\n        return toStack;\n    };\n    const expandRelativeMiddlewareList = (from) => {\n        const expandedMiddlewareList = [];\n        from.before.forEach((entry) => {\n            if (entry.before.length === 0 && entry.after.length === 0) {\n                expandedMiddlewareList.push(entry);\n            }\n            else {\n                expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n            }\n        });\n        expandedMiddlewareList.push(from);\n        from.after.reverse().forEach((entry) => {\n            if (entry.before.length === 0 && entry.after.length === 0) {\n                expandedMiddlewareList.push(entry);\n            }\n            else {\n                expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n            }\n        });\n        return expandedMiddlewareList;\n    };\n    const getMiddlewareList = (debug = false) => {\n        const normalizedAbsoluteEntries = [];\n        const normalizedRelativeEntries = [];\n        const normalizedEntriesNameMap = {};\n        absoluteEntries.forEach((entry) => {\n            const normalizedEntry = {\n                ...entry,\n                before: [],\n                after: [],\n            };\n            for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n                normalizedEntriesNameMap[alias] = normalizedEntry;\n            }\n            normalizedAbsoluteEntries.push(normalizedEntry);\n        });\n        relativeEntries.forEach((entry) => {\n            const normalizedEntry = {\n                ...entry,\n                before: [],\n                after: [],\n            };\n            for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n                normalizedEntriesNameMap[alias] = normalizedEntry;\n            }\n            normalizedRelativeEntries.push(normalizedEntry);\n        });\n        normalizedRelativeEntries.forEach((entry) => {\n            if (entry.toMiddleware) {\n                const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware];\n                if (toMiddleware === undefined) {\n                    if (debug) {\n                        return;\n                    }\n                    throw new Error(`${entry.toMiddleware} is not found when adding ` +\n                        `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` +\n                        `middleware ${entry.relation} ${entry.toMiddleware}`);\n                }\n                if (entry.relation === \"after\") {\n                    toMiddleware.after.push(entry);\n                }\n                if (entry.relation === \"before\") {\n                    toMiddleware.before.push(entry);\n                }\n            }\n        });\n        const mainChain = sort(normalizedAbsoluteEntries)\n            .map(expandRelativeMiddlewareList)\n            .reduce((wholeList, expandedMiddlewareList) => {\n            wholeList.push(...expandedMiddlewareList);\n            return wholeList;\n        }, []);\n        return mainChain;\n    };\n    const stack = {\n        add: (middleware, options = {}) => {\n            const { name, override, aliases: _aliases } = options;\n            const entry = {\n                step: \"initialize\",\n                priority: \"normal\",\n                middleware,\n                ...options,\n            };\n            const aliases = getAllAliases(name, _aliases);\n            if (aliases.length > 0) {\n                if (aliases.some((alias) => entriesNameSet.has(alias))) {\n                    if (!override)\n                        throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n                    for (const alias of aliases) {\n                        const toOverrideIndex = absoluteEntries.findIndex((entry) => entry.name === alias || entry.aliases?.some((a) => a === alias));\n                        if (toOverrideIndex === -1) {\n                            continue;\n                        }\n                        const toOverride = absoluteEntries[toOverrideIndex];\n                        if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) {\n                            throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware with ` +\n                                `${toOverride.priority} priority in ${toOverride.step} step cannot ` +\n                                `be overridden by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware with ` +\n                                `${entry.priority} priority in ${entry.step} step.`);\n                        }\n                        absoluteEntries.splice(toOverrideIndex, 1);\n                    }\n                }\n                for (const alias of aliases) {\n                    entriesNameSet.add(alias);\n                }\n            }\n            absoluteEntries.push(entry);\n        },\n        addRelativeTo: (middleware, options) => {\n            const { name, override, aliases: _aliases } = options;\n            const entry = {\n                middleware,\n                ...options,\n            };\n            const aliases = getAllAliases(name, _aliases);\n            if (aliases.length > 0) {\n                if (aliases.some((alias) => entriesNameSet.has(alias))) {\n                    if (!override)\n                        throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n                    for (const alias of aliases) {\n                        const toOverrideIndex = relativeEntries.findIndex((entry) => entry.name === alias || entry.aliases?.some((a) => a === alias));\n                        if (toOverrideIndex === -1) {\n                            continue;\n                        }\n                        const toOverride = relativeEntries[toOverrideIndex];\n                        if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) {\n                            throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware ` +\n                                `${toOverride.relation} \"${toOverride.toMiddleware}\" middleware cannot be overridden ` +\n                                `by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware ${entry.relation} ` +\n                                `\"${entry.toMiddleware}\" middleware.`);\n                        }\n                        relativeEntries.splice(toOverrideIndex, 1);\n                    }\n                }\n                for (const alias of aliases) {\n                    entriesNameSet.add(alias);\n                }\n            }\n            relativeEntries.push(entry);\n        },\n        clone: () => cloneTo(constructStack()),\n        use: (plugin) => {\n            plugin.applyToStack(stack);\n        },\n        remove: (toRemove) => {\n            if (typeof toRemove === \"string\")\n                return removeByName(toRemove);\n            else\n                return removeByReference(toRemove);\n        },\n        removeByTag: (toRemove) => {\n            let isRemoved = false;\n            const filterCb = (entry) => {\n                const { tags, name, aliases: _aliases } = entry;\n                if (tags && tags.includes(toRemove)) {\n                    const aliases = getAllAliases(name, _aliases);\n                    for (const alias of aliases) {\n                        entriesNameSet.delete(alias);\n                    }\n                    isRemoved = true;\n                    return false;\n                }\n                return true;\n            };\n            absoluteEntries = absoluteEntries.filter(filterCb);\n            relativeEntries = relativeEntries.filter(filterCb);\n            return isRemoved;\n        },\n        concat: (from) => {\n            const cloned = cloneTo(constructStack());\n            cloned.use(from);\n            cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || (from.identifyOnResolve?.() ?? false));\n            return cloned;\n        },\n        applyToStack: cloneTo,\n        identify: () => {\n            return getMiddlewareList(true).map((mw) => {\n                const step = mw.step ??\n                    mw.relation +\n                        \" \" +\n                        mw.toMiddleware;\n                return getMiddlewareNameWithAliases(mw.name, mw.aliases) + \" - \" + step;\n            });\n        },\n        identifyOnResolve(toggle) {\n            if (typeof toggle === \"boolean\")\n                identifyOnResolve = toggle;\n            return identifyOnResolve;\n        },\n        resolve: (handler, context) => {\n            for (const middleware of getMiddlewareList()\n                .map((entry) => entry.middleware)\n                .reverse()) {\n                handler = middleware(handler, context);\n            }\n            if (identifyOnResolve) {\n                console.log(stack.identify());\n            }\n            return handler;\n        },\n    };\n    return stack;\n};\nconst stepWeights = {\n    initialize: 5,\n    serialize: 4,\n    build: 3,\n    finalizeRequest: 2,\n    deserialize: 1,\n};\nconst priorityWeights = {\n    high: 3,\n    normal: 2,\n    low: 1,\n};\n","import { constructStack } from \"@smithy/middleware-stack\";\nexport class Client {\n    config;\n    middlewareStack = constructStack();\n    initConfig;\n    handlers;\n    constructor(config) {\n        this.config = config;\n        const { protocol, protocolSettings } = config;\n        if (protocolSettings) {\n            if (typeof protocol === \"function\") {\n                config.protocol = new protocol(protocolSettings);\n            }\n        }\n    }\n    send(command, optionsOrCb, cb) {\n        const options = typeof optionsOrCb !== \"function\" ? optionsOrCb : undefined;\n        const callback = typeof optionsOrCb === \"function\" ? optionsOrCb : cb;\n        const useHandlerCache = options === undefined && this.config.cacheMiddleware === true;\n        let handler;\n        if (useHandlerCache) {\n            if (!this.handlers) {\n                this.handlers = new WeakMap();\n            }\n            const handlers = this.handlers;\n            if (handlers.has(command.constructor)) {\n                handler = handlers.get(command.constructor);\n            }\n            else {\n                handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n                handlers.set(command.constructor, handler);\n            }\n        }\n        else {\n            delete this.handlers;\n            handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n        }\n        if (callback) {\n            handler(command)\n                .then((result) => callback(null, result.output), (err) => callback(err))\n                .catch(() => { });\n        }\n        else {\n            return handler(command).then((result) => result.output);\n        }\n    }\n    destroy() {\n        this.config?.requestHandler?.destroy?.();\n        delete this.handlers;\n    }\n}\n","export const createIsIdentityExpiredFunction = (expirationMs) => function isIdentityExpired(identity) {\n    return doesIdentityRequireRefresh(identity) && identity.expiration.getTime() - Date.now() < expirationMs;\n};\nexport const EXPIRATION_MS = 300_000;\nexport const isIdentityExpired = createIsIdentityExpiredFunction(EXPIRATION_MS);\nexport const doesIdentityRequireRefresh = (identity) => identity.expiration !== undefined;\nexport const memoizeIdentityProvider = (provider, isExpired, requiresRefresh) => {\n    if (provider === undefined) {\n        return undefined;\n    }\n    const normalizedProvider = typeof provider !== \"function\" ? async () => Promise.resolve(provider) : provider;\n    let resolved;\n    let pending;\n    let hasResult;\n    let isConstant = false;\n    const coalesceProvider = async (options) => {\n        if (!pending) {\n            pending = normalizedProvider(options);\n        }\n        try {\n            resolved = await pending;\n            hasResult = true;\n            isConstant = false;\n        }\n        finally {\n            pending = undefined;\n        }\n        return resolved;\n    };\n    if (isExpired === undefined) {\n        return async (options) => {\n            if (!hasResult || options?.forceRefresh) {\n                resolved = await coalesceProvider(options);\n            }\n            return resolved;\n        };\n    }\n    return async (options) => {\n        if (!hasResult || options?.forceRefresh) {\n            resolved = await coalesceProvider(options);\n        }\n        if (isConstant) {\n            return resolved;\n        }\n        if (!requiresRefresh(resolved)) {\n            isConstant = true;\n            return resolved;\n        }\n        if (isExpired(resolved)) {\n            await coalesceProvider(options);\n            return resolved;\n        }\n        return resolved;\n    };\n};\n","const SHORT_TO_HEX = {};\nconst HEX_TO_SHORT = {};\nfor (let i = 0; i < 256; i++) {\n    let encodedByte = i.toString(16).toLowerCase();\n    if (encodedByte.length === 1) {\n        encodedByte = `0${encodedByte}`;\n    }\n    SHORT_TO_HEX[i] = encodedByte;\n    HEX_TO_SHORT[encodedByte] = i;\n}\nexport function fromHex(encoded) {\n    if (encoded.length % 2 !== 0) {\n        throw new Error(\"Hex encoded strings must have an even number length\");\n    }\n    const out = new Uint8Array(encoded.length / 2);\n    for (let i = 0; i < encoded.length; i += 2) {\n        const encodedByte = encoded.slice(i, i + 2).toLowerCase();\n        if (encodedByte in HEX_TO_SHORT) {\n            out[i / 2] = HEX_TO_SHORT[encodedByte];\n        }\n        else {\n            throw new Error(`Cannot decode unrecognized sequence ${encodedByte} as hexadecimal`);\n        }\n    }\n    return out;\n}\nexport function toHex(bytes) {\n    let out = \"\";\n    for (let i = 0; i < bytes.byteLength; i++) {\n        out += SHORT_TO_HEX[bytes[i]];\n    }\n    return out;\n}\n","import { fromUtf8 } from \"./fromUtf8\";\nexport const toUint8Array = (data) => {\n    if (typeof data === \"string\") {\n        return fromUtf8(data);\n    }\n    if (ArrayBuffer.isView(data)) {\n        return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n    }\n    return new Uint8Array(data);\n};\n","export const ALGORITHM_QUERY_PARAM = \"X-Amz-Algorithm\";\nexport const CREDENTIAL_QUERY_PARAM = \"X-Amz-Credential\";\nexport const AMZ_DATE_QUERY_PARAM = \"X-Amz-Date\";\nexport const SIGNED_HEADERS_QUERY_PARAM = \"X-Amz-SignedHeaders\";\nexport const EXPIRES_QUERY_PARAM = \"X-Amz-Expires\";\nexport const SIGNATURE_QUERY_PARAM = \"X-Amz-Signature\";\nexport const TOKEN_QUERY_PARAM = \"X-Amz-Security-Token\";\nexport const REGION_SET_PARAM = \"X-Amz-Region-Set\";\nexport const AUTH_HEADER = \"authorization\";\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase();\nexport const DATE_HEADER = \"date\";\nexport const GENERATED_HEADERS = [AUTH_HEADER, AMZ_DATE_HEADER, DATE_HEADER];\nexport const SIGNATURE_HEADER = SIGNATURE_QUERY_PARAM.toLowerCase();\nexport const SHA256_HEADER = \"x-amz-content-sha256\";\nexport const TOKEN_HEADER = TOKEN_QUERY_PARAM.toLowerCase();\nexport const HOST_HEADER = \"host\";\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n    authorization: true,\n    \"cache-control\": true,\n    connection: true,\n    expect: true,\n    from: true,\n    \"keep-alive\": true,\n    \"max-forwards\": true,\n    pragma: true,\n    referer: true,\n    te: true,\n    trailer: true,\n    \"transfer-encoding\": true,\n    upgrade: true,\n    \"user-agent\": true,\n    \"x-amzn-trace-id\": true,\n};\nexport const PROXY_HEADER_PATTERN = /^proxy-/;\nexport const SEC_HEADER_PATTERN = /^sec-/;\nexport const UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i];\nexport const ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256\";\nexport const ALGORITHM_IDENTIFIER_V4A = \"AWS4-ECDSA-P256-SHA256\";\nexport const EVENT_ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256-PAYLOAD\";\nexport const UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\nexport const MAX_CACHE_SIZE = 50;\nexport const KEY_TYPE_IDENTIFIER = \"aws4_request\";\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7;\n","import { toHex } from \"@smithy/util-hex-encoding\";\nimport { toUint8Array } from \"@smithy/util-utf8\";\nimport { KEY_TYPE_IDENTIFIER, MAX_CACHE_SIZE } from \"./constants\";\nconst signingKeyCache = {};\nconst cacheQueue = [];\nexport const createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${KEY_TYPE_IDENTIFIER}`;\nexport const getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => {\n    const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId);\n    const cacheKey = `${shortDate}:${region}:${service}:${toHex(credsHash)}:${credentials.sessionToken}`;\n    if (cacheKey in signingKeyCache) {\n        return signingKeyCache[cacheKey];\n    }\n    cacheQueue.push(cacheKey);\n    while (cacheQueue.length > MAX_CACHE_SIZE) {\n        delete signingKeyCache[cacheQueue.shift()];\n    }\n    let key = `AWS4${credentials.secretAccessKey}`;\n    for (const signable of [shortDate, region, service, KEY_TYPE_IDENTIFIER]) {\n        key = await hmac(sha256Constructor, key, signable);\n    }\n    return (signingKeyCache[cacheKey] = key);\n};\nexport const clearCredentialCache = () => {\n    cacheQueue.length = 0;\n    Object.keys(signingKeyCache).forEach((cacheKey) => {\n        delete signingKeyCache[cacheKey];\n    });\n};\nconst hmac = (ctor, secret, data) => {\n    const hash = new ctor(secret);\n    hash.update(toUint8Array(data));\n    return hash.digest();\n};\n","import { ALWAYS_UNSIGNABLE_HEADERS, PROXY_HEADER_PATTERN, SEC_HEADER_PATTERN } from \"./constants\";\nexport const getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => {\n    const canonical = {};\n    for (const headerName of Object.keys(headers).sort()) {\n        if (headers[headerName] == undefined) {\n            continue;\n        }\n        const canonicalHeaderName = headerName.toLowerCase();\n        if (canonicalHeaderName in ALWAYS_UNSIGNABLE_HEADERS ||\n            unsignableHeaders?.has(canonicalHeaderName) ||\n            PROXY_HEADER_PATTERN.test(canonicalHeaderName) ||\n            SEC_HEADER_PATTERN.test(canonicalHeaderName)) {\n            if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) {\n                continue;\n            }\n        }\n        canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, \" \");\n    }\n    return canonical;\n};\n","import { isArrayBuffer } from \"@smithy/is-array-buffer\";\nimport { toHex } from \"@smithy/util-hex-encoding\";\nimport { toUint8Array } from \"@smithy/util-utf8\";\nimport { SHA256_HEADER, UNSIGNED_PAYLOAD } from \"./constants\";\nexport const getPayloadHash = async ({ headers, body }, hashConstructor) => {\n    for (const headerName of Object.keys(headers)) {\n        if (headerName.toLowerCase() === SHA256_HEADER) {\n            return headers[headerName];\n        }\n    }\n    if (body == undefined) {\n        return \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n    }\n    else if (typeof body === \"string\" || ArrayBuffer.isView(body) || isArrayBuffer(body)) {\n        const hashCtor = new hashConstructor();\n        hashCtor.update(toUint8Array(body));\n        return toHex(await hashCtor.digest());\n    }\n    return UNSIGNED_PAYLOAD;\n};\n","export const isArrayBuffer = (arg) => (typeof ArrayBuffer === \"function\" && arg instanceof ArrayBuffer) ||\n    Object.prototype.toString.call(arg) === \"[object ArrayBuffer]\";\n","import { fromHex, toHex } from \"@smithy/util-hex-encoding\";\nimport { fromUtf8 } from \"@smithy/util-utf8\";\nexport class HeaderFormatter {\n    format(headers) {\n        const chunks = [];\n        for (const headerName of Object.keys(headers)) {\n            const bytes = fromUtf8(headerName);\n            chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName]));\n        }\n        const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0));\n        let position = 0;\n        for (const chunk of chunks) {\n            out.set(chunk, position);\n            position += chunk.byteLength;\n        }\n        return out;\n    }\n    formatHeaderValue(header) {\n        switch (header.type) {\n            case \"boolean\":\n                return Uint8Array.from([header.value ? 0 : 1]);\n            case \"byte\":\n                return Uint8Array.from([2, header.value]);\n            case \"short\":\n                const shortView = new DataView(new ArrayBuffer(3));\n                shortView.setUint8(0, 3);\n                shortView.setInt16(1, header.value, false);\n                return new Uint8Array(shortView.buffer);\n            case \"integer\":\n                const intView = new DataView(new ArrayBuffer(5));\n                intView.setUint8(0, 4);\n                intView.setInt32(1, header.value, false);\n                return new Uint8Array(intView.buffer);\n            case \"long\":\n                const longBytes = new Uint8Array(9);\n                longBytes[0] = 5;\n                longBytes.set(header.value.bytes, 1);\n                return longBytes;\n            case \"binary\":\n                const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength));\n                binView.setUint8(0, 6);\n                binView.setUint16(1, header.value.byteLength, false);\n                const binBytes = new Uint8Array(binView.buffer);\n                binBytes.set(header.value, 3);\n                return binBytes;\n            case \"string\":\n                const utf8Bytes = fromUtf8(header.value);\n                const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength));\n                strView.setUint8(0, 7);\n                strView.setUint16(1, utf8Bytes.byteLength, false);\n                const strBytes = new Uint8Array(strView.buffer);\n                strBytes.set(utf8Bytes, 3);\n                return strBytes;\n            case \"timestamp\":\n                const tsBytes = new Uint8Array(9);\n                tsBytes[0] = 8;\n                tsBytes.set(Int64.fromNumber(header.value.valueOf()).bytes, 1);\n                return tsBytes;\n            case \"uuid\":\n                if (!UUID_PATTERN.test(header.value)) {\n                    throw new Error(`Invalid UUID received: ${header.value}`);\n                }\n                const uuidBytes = new Uint8Array(17);\n                uuidBytes[0] = 9;\n                uuidBytes.set(fromHex(header.value.replace(/\\-/g, \"\")), 1);\n                return uuidBytes;\n        }\n    }\n}\nvar HEADER_VALUE_TYPE;\n(function (HEADER_VALUE_TYPE) {\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolTrue\"] = 0] = \"boolTrue\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolFalse\"] = 1] = \"boolFalse\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byte\"] = 2] = \"byte\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"short\"] = 3] = \"short\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"integer\"] = 4] = \"integer\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"long\"] = 5] = \"long\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byteArray\"] = 6] = \"byteArray\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"string\"] = 7] = \"string\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"timestamp\"] = 8] = \"timestamp\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"uuid\"] = 9] = \"uuid\";\n})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {}));\nconst UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;\nexport class Int64 {\n    bytes;\n    constructor(bytes) {\n        this.bytes = bytes;\n        if (bytes.byteLength !== 8) {\n            throw new Error(\"Int64 buffers must be exactly 8 bytes\");\n        }\n    }\n    static fromNumber(number) {\n        if (number > 9_223_372_036_854_775_807 || number < -9_223_372_036_854_775_808) {\n            throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`);\n        }\n        const bytes = new Uint8Array(8);\n        for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) {\n            bytes[i] = remaining;\n        }\n        if (number < 0) {\n            negate(bytes);\n        }\n        return new Int64(bytes);\n    }\n    valueOf() {\n        const bytes = this.bytes.slice(0);\n        const negative = bytes[0] & 0b10000000;\n        if (negative) {\n            negate(bytes);\n        }\n        return parseInt(toHex(bytes), 16) * (negative ? -1 : 1);\n    }\n    toString() {\n        return String(this.valueOf());\n    }\n}\nfunction negate(bytes) {\n    for (let i = 0; i < 8; i++) {\n        bytes[i] ^= 0xff;\n    }\n    for (let i = 7; i > -1; i--) {\n        bytes[i]++;\n        if (bytes[i] !== 0)\n            break;\n    }\n}\n","export const hasHeader = (soughtHeader, headers) => {\n    soughtHeader = soughtHeader.toLowerCase();\n    for (const headerName of Object.keys(headers)) {\n        if (soughtHeader === headerName.toLowerCase()) {\n            return true;\n        }\n    }\n    return false;\n};\nexport const getHeaderValue = (soughtHeader, headers) => {\n    soughtHeader = soughtHeader.toLowerCase();\n    for (const headerName of Object.keys(headers)) {\n        if (soughtHeader === headerName.toLowerCase()) {\n            return headers[headerName];\n        }\n    }\n    return undefined;\n};\nexport const deleteHeader = (soughtHeader, headers) => {\n    soughtHeader = soughtHeader.toLowerCase();\n    for (const headerName of Object.keys(headers)) {\n        if (soughtHeader === headerName.toLowerCase()) {\n            delete headers[headerName];\n        }\n    }\n};\n","import { HttpRequest } from \"@smithy/protocol-http\";\nimport { GENERATED_HEADERS } from \"./constants\";\nexport const prepareRequest = (request) => {\n    request = HttpRequest.clone(request);\n    for (const headerName of Object.keys(request.headers)) {\n        if (GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n            delete request.headers[headerName];\n        }\n    }\n    return request;\n};\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { toHex } from \"@smithy/util-hex-encoding\";\nimport { normalizeProvider } from \"@smithy/util-middleware\";\nimport { escapeUri } from \"@smithy/util-uri-escape\";\nimport { toUint8Array } from \"@smithy/util-utf8\";\nimport { getCanonicalQuery } from \"./getCanonicalQuery\";\nimport { iso8601 } from \"./utilDate\";\nexport class SignatureV4Base {\n    service;\n    regionProvider;\n    credentialProvider;\n    sha256;\n    uriEscapePath;\n    applyChecksum;\n    constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n        this.service = service;\n        this.sha256 = sha256;\n        this.uriEscapePath = uriEscapePath;\n        this.applyChecksum = typeof applyChecksum === \"boolean\" ? applyChecksum : true;\n        this.regionProvider = normalizeProvider(region);\n        this.credentialProvider = normalizeProvider(credentials);\n    }\n    createCanonicalRequest(request, canonicalHeaders, payloadHash) {\n        const sortedHeaders = Object.keys(canonicalHeaders).sort();\n        return `${request.method}\n${this.getCanonicalPath(request)}\n${getCanonicalQuery(request)}\n${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join(\"\\n\")}\n\n${sortedHeaders.join(\";\")}\n${payloadHash}`;\n    }\n    async createStringToSign(longDate, credentialScope, canonicalRequest, algorithmIdentifier) {\n        const hash = new this.sha256();\n        hash.update(toUint8Array(canonicalRequest));\n        const hashedRequest = await hash.digest();\n        return `${algorithmIdentifier}\n${longDate}\n${credentialScope}\n${toHex(hashedRequest)}`;\n    }\n    getCanonicalPath({ path }) {\n        if (this.uriEscapePath) {\n            const normalizedPathSegments = [];\n            for (const pathSegment of path.split(\"/\")) {\n                if (pathSegment?.length === 0)\n                    continue;\n                if (pathSegment === \".\")\n                    continue;\n                if (pathSegment === \"..\") {\n                    normalizedPathSegments.pop();\n                }\n                else {\n                    normalizedPathSegments.push(pathSegment);\n                }\n            }\n            const normalizedPath = `${path?.startsWith(\"/\") ? \"/\" : \"\"}${normalizedPathSegments.join(\"/\")}${normalizedPathSegments.length > 0 && path?.endsWith(\"/\") ? \"/\" : \"\"}`;\n            const doubleEncoded = escapeUri(normalizedPath);\n            return doubleEncoded.replace(/%2F/g, \"/\");\n        }\n        return path;\n    }\n    validateResolvedCredentials(credentials) {\n        if (typeof credentials !== \"object\" ||\n            typeof credentials.accessKeyId !== \"string\" ||\n            typeof credentials.secretAccessKey !== \"string\") {\n            throw new Error(\"Resolved credential object is not valid\");\n        }\n    }\n    formatDate(now) {\n        const longDate = iso8601(now).replace(/[\\-:]/g, \"\");\n        return {\n            longDate,\n            shortDate: longDate.slice(0, 8),\n        };\n    }\n    getCanonicalHeaderList(headers) {\n        return Object.keys(headers).sort().join(\";\");\n    }\n}\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nimport { SIGNATURE_HEADER } from \"./constants\";\nexport const getCanonicalQuery = ({ query = {} }) => {\n    const keys = [];\n    const serialized = {};\n    for (const key of Object.keys(query)) {\n        if (key.toLowerCase() === SIGNATURE_HEADER) {\n            continue;\n        }\n        const encodedKey = escapeUri(key);\n        keys.push(encodedKey);\n        const value = query[key];\n        if (typeof value === \"string\") {\n            serialized[encodedKey] = `${encodedKey}=${escapeUri(value)}`;\n        }\n        else if (Array.isArray(value)) {\n            serialized[encodedKey] = value\n                .slice(0)\n                .reduce((encoded, value) => encoded.concat([`${encodedKey}=${escapeUri(value)}`]), [])\n                .sort()\n                .join(\"&\");\n        }\n    }\n    return keys\n        .sort()\n        .map((key) => serialized[key])\n        .filter((serialized) => serialized)\n        .join(\"&\");\n};\n","export const iso8601 = (time) => toDate(time)\n    .toISOString()\n    .replace(/\\.\\d{3}Z$/, \"Z\");\nexport const toDate = (time) => {\n    if (typeof time === \"number\") {\n        return new Date(time * 1000);\n    }\n    if (typeof time === \"string\") {\n        if (Number(time)) {\n            return new Date(Number(time) * 1000);\n        }\n        return new Date(time);\n    }\n    return time;\n};\n","import { toHex } from \"@smithy/util-hex-encoding\";\nimport { toUint8Array } from \"@smithy/util-utf8\";\nimport { ALGORITHM_IDENTIFIER, ALGORITHM_QUERY_PARAM, AMZ_DATE_HEADER, AMZ_DATE_QUERY_PARAM, AUTH_HEADER, CREDENTIAL_QUERY_PARAM, EVENT_ALGORITHM_IDENTIFIER, EXPIRES_QUERY_PARAM, MAX_PRESIGNED_TTL, SHA256_HEADER, SIGNATURE_QUERY_PARAM, SIGNED_HEADERS_QUERY_PARAM, TOKEN_HEADER, TOKEN_QUERY_PARAM, } from \"./constants\";\nimport { createScope, getSigningKey } from \"./credentialDerivation\";\nimport { getCanonicalHeaders } from \"./getCanonicalHeaders\";\nimport { getPayloadHash } from \"./getPayloadHash\";\nimport { HeaderFormatter } from \"./HeaderFormatter\";\nimport { hasHeader } from \"./headerUtil\";\nimport { moveHeadersToQuery } from \"./moveHeadersToQuery\";\nimport { prepareRequest } from \"./prepareRequest\";\nimport { SignatureV4Base } from \"./SignatureV4Base\";\nexport class SignatureV4 extends SignatureV4Base {\n    headerFormatter = new HeaderFormatter();\n    constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n        super({\n            applyChecksum,\n            credentials,\n            region,\n            service,\n            sha256,\n            uriEscapePath,\n        });\n    }\n    async presign(originalRequest, options = {}) {\n        const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, hoistableHeaders, signingRegion, signingService, } = options;\n        const credentials = await this.credentialProvider();\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const { longDate, shortDate } = this.formatDate(signingDate);\n        if (expiresIn > MAX_PRESIGNED_TTL) {\n            return Promise.reject(\"Signature version 4 presigned URLs\" + \" must have an expiration date less than one week in\" + \" the future\");\n        }\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        const request = moveHeadersToQuery(prepareRequest(originalRequest), { unhoistableHeaders, hoistableHeaders });\n        if (credentials.sessionToken) {\n            request.query[TOKEN_QUERY_PARAM] = credentials.sessionToken;\n        }\n        request.query[ALGORITHM_QUERY_PARAM] = ALGORITHM_IDENTIFIER;\n        request.query[CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`;\n        request.query[AMZ_DATE_QUERY_PARAM] = longDate;\n        request.query[EXPIRES_QUERY_PARAM] = expiresIn.toString(10);\n        const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n        request.query[SIGNED_HEADERS_QUERY_PARAM] = this.getCanonicalHeaderList(canonicalHeaders);\n        request.query[SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await getPayloadHash(originalRequest, this.sha256)));\n        return request;\n    }\n    async sign(toSign, options) {\n        if (typeof toSign === \"string\") {\n            return this.signString(toSign, options);\n        }\n        else if (toSign.headers && toSign.payload) {\n            return this.signEvent(toSign, options);\n        }\n        else if (toSign.message) {\n            return this.signMessage(toSign, options);\n        }\n        else {\n            return this.signRequest(toSign, options);\n        }\n    }\n    async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService }) {\n        const region = signingRegion ?? (await this.regionProvider());\n        const { shortDate, longDate } = this.formatDate(signingDate);\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        const hashedPayload = await getPayloadHash({ headers: {}, body: payload }, this.sha256);\n        const hash = new this.sha256();\n        hash.update(headers);\n        const hashedHeaders = toHex(await hash.digest());\n        const stringToSign = [\n            EVENT_ALGORITHM_IDENTIFIER,\n            longDate,\n            scope,\n            priorSignature,\n            hashedHeaders,\n            hashedPayload,\n        ].join(\"\\n\");\n        return this.signString(stringToSign, { signingDate, signingRegion: region, signingService });\n    }\n    async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService }) {\n        const promise = this.signEvent({\n            headers: this.headerFormatter.format(signableMessage.message.headers),\n            payload: signableMessage.message.body,\n        }, {\n            signingDate,\n            signingRegion,\n            signingService,\n            priorSignature: signableMessage.priorSignature,\n        });\n        return promise.then((signature) => {\n            return { message: signableMessage.message, signature };\n        });\n    }\n    async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService } = {}) {\n        const credentials = await this.credentialProvider();\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const { shortDate } = this.formatDate(signingDate);\n        const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService));\n        hash.update(toUint8Array(stringToSign));\n        return toHex(await hash.digest());\n    }\n    async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) {\n        const credentials = await this.credentialProvider();\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const request = prepareRequest(requestToSign);\n        const { longDate, shortDate } = this.formatDate(signingDate);\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        request.headers[AMZ_DATE_HEADER] = longDate;\n        if (credentials.sessionToken) {\n            request.headers[TOKEN_HEADER] = credentials.sessionToken;\n        }\n        const payloadHash = await getPayloadHash(request, this.sha256);\n        if (!hasHeader(SHA256_HEADER, request.headers) && this.applyChecksum) {\n            request.headers[SHA256_HEADER] = payloadHash;\n        }\n        const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n        const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash));\n        request.headers[AUTH_HEADER] =\n            `${ALGORITHM_IDENTIFIER} ` +\n                `Credential=${credentials.accessKeyId}/${scope}, ` +\n                `SignedHeaders=${this.getCanonicalHeaderList(canonicalHeaders)}, ` +\n                `Signature=${signature}`;\n        return request;\n    }\n    async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) {\n        const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest, ALGORITHM_IDENTIFIER);\n        const hash = new this.sha256(await keyPromise);\n        hash.update(toUint8Array(stringToSign));\n        return toHex(await hash.digest());\n    }\n    getSigningKey(credentials, region, shortDate, service) {\n        return getSigningKey(this.sha256, credentials, shortDate, region, service || this.service);\n    }\n}\n","import { HttpRequest } from \"@smithy/protocol-http\";\nexport const moveHeadersToQuery = (request, options = {}) => {\n    const { headers, query = {} } = HttpRequest.clone(request);\n    for (const name of Object.keys(headers)) {\n        const lname = name.toLowerCase();\n        if ((lname.slice(0, 6) === \"x-amz-\" && !options.unhoistableHeaders?.has(lname)) ||\n            options.hoistableHeaders?.has(lname)) {\n            query[name] = headers[name];\n            delete headers[name];\n        }\n    }\n    return {\n        ...request,\n        headers,\n        query,\n    };\n};\n","import { setCredentialFeature } from \"@aws-sdk/core/client\";\nimport { doesIdentityRequireRefresh, isIdentityExpired, memoizeIdentityProvider, normalizeProvider, } from \"@smithy/core\";\nimport { SignatureV4 } from \"@smithy/signature-v4\";\nexport const resolveAwsSdkSigV4Config = (config) => {\n    let inputCredentials = config.credentials;\n    let isUserSupplied = !!config.credentials;\n    let resolvedCredentials = undefined;\n    Object.defineProperty(config, \"credentials\", {\n        set(credentials) {\n            if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) {\n                isUserSupplied = true;\n            }\n            inputCredentials = credentials;\n            const memoizedProvider = normalizeCredentialProvider(config, {\n                credentials: inputCredentials,\n                credentialDefaultProvider: config.credentialDefaultProvider,\n            });\n            const boundProvider = bindCallerConfig(config, memoizedProvider);\n            if (isUserSupplied && !boundProvider.attributed) {\n                const isCredentialObject = typeof inputCredentials === \"object\" && inputCredentials !== null;\n                resolvedCredentials = async (options) => {\n                    const creds = await boundProvider(options);\n                    const attributedCreds = creds;\n                    if (isCredentialObject && (!attributedCreds.$source || Object.keys(attributedCreds.$source).length === 0)) {\n                        return setCredentialFeature(attributedCreds, \"CREDENTIALS_CODE\", \"e\");\n                    }\n                    return attributedCreds;\n                };\n                resolvedCredentials.memoized = boundProvider.memoized;\n                resolvedCredentials.configBound = boundProvider.configBound;\n                resolvedCredentials.attributed = true;\n            }\n            else {\n                resolvedCredentials = boundProvider;\n            }\n        },\n        get() {\n            return resolvedCredentials;\n        },\n        enumerable: true,\n        configurable: true,\n    });\n    config.credentials = inputCredentials;\n    const { signingEscapePath = true, systemClockOffset = config.systemClockOffset || 0, sha256, } = config;\n    let signer;\n    if (config.signer) {\n        signer = normalizeProvider(config.signer);\n    }\n    else if (config.regionInfoProvider) {\n        signer = () => normalizeProvider(config.region)()\n            .then(async (region) => [\n            (await config.regionInfoProvider(region, {\n                useFipsEndpoint: await config.useFipsEndpoint(),\n                useDualstackEndpoint: await config.useDualstackEndpoint(),\n            })) || {},\n            region,\n        ])\n            .then(([regionInfo, region]) => {\n            const { signingRegion, signingService } = regionInfo;\n            config.signingRegion = config.signingRegion || signingRegion || region;\n            config.signingName = config.signingName || signingService || config.serviceId;\n            const params = {\n                ...config,\n                credentials: config.credentials,\n                region: config.signingRegion,\n                service: config.signingName,\n                sha256,\n                uriEscapePath: signingEscapePath,\n            };\n            const SignerCtor = config.signerConstructor || SignatureV4;\n            return new SignerCtor(params);\n        });\n    }\n    else {\n        signer = async (authScheme) => {\n            authScheme = Object.assign({}, {\n                name: \"sigv4\",\n                signingName: config.signingName || config.defaultSigningName,\n                signingRegion: await normalizeProvider(config.region)(),\n                properties: {},\n            }, authScheme);\n            const signingRegion = authScheme.signingRegion;\n            const signingService = authScheme.signingName;\n            config.signingRegion = config.signingRegion || signingRegion;\n            config.signingName = config.signingName || signingService || config.serviceId;\n            const params = {\n                ...config,\n                credentials: config.credentials,\n                region: config.signingRegion,\n                service: config.signingName,\n                sha256,\n                uriEscapePath: signingEscapePath,\n            };\n            const SignerCtor = config.signerConstructor || SignatureV4;\n            return new SignerCtor(params);\n        };\n    }\n    const resolvedConfig = Object.assign(config, {\n        systemClockOffset,\n        signingEscapePath,\n        signer,\n    });\n    return resolvedConfig;\n};\nexport const resolveAWSSDKSigV4Config = resolveAwsSdkSigV4Config;\nfunction normalizeCredentialProvider(config, { credentials, credentialDefaultProvider, }) {\n    let credentialsProvider;\n    if (credentials) {\n        if (!credentials?.memoized) {\n            credentialsProvider = memoizeIdentityProvider(credentials, isIdentityExpired, doesIdentityRequireRefresh);\n        }\n        else {\n            credentialsProvider = credentials;\n        }\n    }\n    else {\n        if (credentialDefaultProvider) {\n            credentialsProvider = normalizeProvider(credentialDefaultProvider(Object.assign({}, config, {\n                parentClientConfig: config,\n            })));\n        }\n        else {\n            credentialsProvider = async () => {\n                throw new Error(\"@aws-sdk/core::resolveAwsSdkSigV4Config - `credentials` not provided and no credentialDefaultProvider was configured.\");\n            };\n        }\n    }\n    credentialsProvider.memoized = true;\n    return credentialsProvider;\n}\nfunction bindCallerConfig(config, credentialsProvider) {\n    if (credentialsProvider.configBound) {\n        return credentialsProvider;\n    }\n    const fn = async (options) => credentialsProvider({ ...options, callerClientConfig: config });\n    fn.memoized = credentialsProvider.memoized;\n    fn.configBound = true;\n    return fn;\n}\n","import { resolveAwsSdkSigV4Config, } from \"@aws-sdk/core\";\nimport { getSmithyContext, normalizeProvider } from \"@smithy/util-middleware\";\nexport const defaultCognitoIdentityProviderHttpAuthSchemeParametersProvider = async (config, context, input) => {\n    return {\n        operation: getSmithyContext(context).operation,\n        region: await normalizeProvider(config.region)() || (() => {\n            throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");\n        })(),\n    };\n};\nfunction createAwsAuthSigv4HttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4\",\n        signingProperties: {\n            name: \"cognito-idp\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createSmithyApiNoAuthHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"smithy.api#noAuth\",\n    };\n}\nexport const defaultCognitoIdentityProviderHttpAuthSchemeProvider = (authParameters) => {\n    const options = [];\n    switch (authParameters.operation) {\n        case \"AssociateSoftwareToken\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ChangePassword\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"CompleteWebAuthnRegistration\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ConfirmDevice\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ConfirmForgotPassword\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ConfirmSignUp\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"DeleteUser\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"DeleteUserAttributes\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"DeleteWebAuthnCredential\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ForgetDevice\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ForgotPassword\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GetDevice\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GetTokensFromRefreshToken\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GetUser\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GetUserAttributeVerificationCode\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GetUserAuthFactors\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"GlobalSignOut\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"InitiateAuth\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ListDevices\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ListWebAuthnCredentials\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"ResendConfirmationCode\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"RespondToAuthChallenge\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"RevokeToken\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"SetUserMFAPreference\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"SetUserSettings\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"SignUp\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"StartWebAuthnRegistration\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"UpdateAuthEventFeedback\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"UpdateDeviceStatus\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"UpdateUserAttributes\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"VerifySoftwareToken\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        case \"VerifyUserAttribute\":\n            {\n                options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n                break;\n            }\n            ;\n        default: {\n            options.push(createAwsAuthSigv4HttpAuthOption(authParameters));\n        }\n    }\n    return options;\n};\nexport const resolveHttpAuthSchemeConfig = (config) => {\n    const config_0 = resolveAwsSdkSigV4Config(config);\n    return Object.assign(config_0, {\n        authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),\n    });\n};\n","export const resolveClientEndpointParameters = (options) => {\n    return Object.assign(options, {\n        useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n        useFipsEndpoint: options.useFipsEndpoint ?? false,\n        defaultSigningName: \"cognito-idp\",\n    });\n};\nexport const commonParams = {\n    UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n    Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n    Region: { type: \"builtInParams\", name: \"region\" },\n    UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n};\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SourceData } from \"@aws-sdk/types\";\nimport { fromUtf8 as fromUtf8Browser } from \"@smithy/util-utf8\";\n\n// Quick polyfill\nconst fromUtf8 =\n  typeof Buffer !== \"undefined\" && Buffer.from\n    ? (input: string) => Buffer.from(input, \"utf8\")\n    : fromUtf8Browser;\n\nexport function convertToBuffer(data: SourceData): Uint8Array {\n  // Already a Uint8, do nothing\n  if (data instanceof Uint8Array) return data;\n\n  if (typeof data === \"string\") {\n    return fromUtf8(data);\n  }\n\n  if (ArrayBuffer.isView(data)) {\n    return new Uint8Array(\n      data.buffer,\n      data.byteOffset,\n      data.byteLength / Uint8Array.BYTES_PER_ELEMENT\n    );\n  }\n\n  return new Uint8Array(data);\n}\n","export const fromUtf8 = (input) => new TextEncoder().encode(input);\n","// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SourceData } from \"@aws-sdk/types\";\n\nexport function isEmptyData(data: SourceData): boolean {\n  if (typeof data === \"string\") {\n    return data.length === 0;\n  }\n\n  return data.byteLength === 0;\n}\n","export const SHA_256_HASH: { name: \"SHA-256\" } = { name: \"SHA-256\" };\n\nexport const SHA_256_HMAC_ALGO: { name: \"HMAC\"; hash: { name: \"SHA-256\" } } = {\n  name: \"HMAC\",\n  hash: SHA_256_HASH\n};\n\nexport const EMPTY_DATA_SHA_256 = new Uint8Array([\n  227,\n  176,\n  196,\n  66,\n  152,\n  252,\n  28,\n  20,\n  154,\n  251,\n  244,\n  200,\n  153,\n  111,\n  185,\n  36,\n  39,\n  174,\n  65,\n  228,\n  100,\n  155,\n  147,\n  76,\n  164,\n  149,\n  153,\n  27,\n  120,\n  82,\n  184,\n  85\n]);\n","const fallbackWindow = {};\nexport function locateWindow() {\n    if (typeof window !== \"undefined\") {\n        return window;\n    }\n    else if (typeof self !== \"undefined\") {\n        return self;\n    }\n    return fallbackWindow;\n}\n","import { Checksum, SourceData } from \"@aws-sdk/types\";\nimport { isEmptyData, convertToBuffer } from \"@aws-crypto/util\";\nimport {\n  EMPTY_DATA_SHA_256,\n  SHA_256_HASH,\n  SHA_256_HMAC_ALGO,\n} from \"./constants\";\nimport { locateWindow } from \"@aws-sdk/util-locate-window\";\n\nexport class Sha256 implements Checksum {\n  private readonly secret?: SourceData;\n  private key: Promise<CryptoKey> | undefined;\n  private toHash: Uint8Array = new Uint8Array(0);\n\n  constructor(secret?: SourceData) {\n    this.secret = secret;\n    this.reset();\n  }\n\n  update(data: SourceData): void {\n    if (isEmptyData(data)) {\n      return;\n    }\n\n    const update = convertToBuffer(data);\n    const typedArray = new Uint8Array(\n      this.toHash.byteLength + update.byteLength\n    );\n    typedArray.set(this.toHash, 0);\n    typedArray.set(update, this.toHash.byteLength);\n    this.toHash = typedArray;\n  }\n\n  digest(): Promise<Uint8Array> {\n    if (this.key) {\n      return this.key.then((key) =>\n        locateWindow()\n          .crypto.subtle.sign(SHA_256_HMAC_ALGO, key, this.toHash)\n          .then((data) => new Uint8Array(data))\n      );\n    }\n\n    if (isEmptyData(this.toHash)) {\n      return Promise.resolve(EMPTY_DATA_SHA_256);\n    }\n\n    return Promise.resolve()\n      .then(() =>\n        locateWindow().crypto.subtle.digest(SHA_256_HASH, this.toHash)\n      )\n      .then((data) => Promise.resolve(new Uint8Array(data)));\n  }\n\n  reset(): void {\n    this.toHash = new Uint8Array(0);\n    if (this.secret && this.secret !== void 0) {\n      this.key = new Promise((resolve, reject) => {\n        locateWindow()\n            .crypto.subtle.importKey(\n            \"raw\",\n            convertToBuffer(this.secret as SourceData),\n            SHA_256_HMAC_ALGO,\n            false,\n            [\"sign\"]\n        )\n            .then(resolve, reject);\n      });\n      this.key.catch(() => {});\n    }\n  }\n}\n","/**\n * @internal\n */\nexport const BLOCK_SIZE: number = 64;\n\n/**\n * @internal\n */\nexport const DIGEST_LENGTH: number = 32;\n\n/**\n * @internal\n */\nexport const KEY = new Uint32Array([\n  0x428a2f98,\n  0x71374491,\n  0xb5c0fbcf,\n  0xe9b5dba5,\n  0x3956c25b,\n  0x59f111f1,\n  0x923f82a4,\n  0xab1c5ed5,\n  0xd807aa98,\n  0x12835b01,\n  0x243185be,\n  0x550c7dc3,\n  0x72be5d74,\n  0x80deb1fe,\n  0x9bdc06a7,\n  0xc19bf174,\n  0xe49b69c1,\n  0xefbe4786,\n  0x0fc19dc6,\n  0x240ca1cc,\n  0x2de92c6f,\n  0x4a7484aa,\n  0x5cb0a9dc,\n  0x76f988da,\n  0x983e5152,\n  0xa831c66d,\n  0xb00327c8,\n  0xbf597fc7,\n  0xc6e00bf3,\n  0xd5a79147,\n  0x06ca6351,\n  0x14292967,\n  0x27b70a85,\n  0x2e1b2138,\n  0x4d2c6dfc,\n  0x53380d13,\n  0x650a7354,\n  0x766a0abb,\n  0x81c2c92e,\n  0x92722c85,\n  0xa2bfe8a1,\n  0xa81a664b,\n  0xc24b8b70,\n  0xc76c51a3,\n  0xd192e819,\n  0xd6990624,\n  0xf40e3585,\n  0x106aa070,\n  0x19a4c116,\n  0x1e376c08,\n  0x2748774c,\n  0x34b0bcb5,\n  0x391c0cb3,\n  0x4ed8aa4a,\n  0x5b9cca4f,\n  0x682e6ff3,\n  0x748f82ee,\n  0x78a5636f,\n  0x84c87814,\n  0x8cc70208,\n  0x90befffa,\n  0xa4506ceb,\n  0xbef9a3f7,\n  0xc67178f2\n]);\n\n/**\n * @internal\n */\nexport const INIT = [\n  0x6a09e667,\n  0xbb67ae85,\n  0x3c6ef372,\n  0xa54ff53a,\n  0x510e527f,\n  0x9b05688c,\n  0x1f83d9ab,\n  0x5be0cd19\n];\n\n/**\n * @internal\n */\nexport const MAX_HASHABLE_LENGTH = 2 ** 53 - 1;\n","import {\n  BLOCK_SIZE,\n  DIGEST_LENGTH,\n  INIT,\n  KEY,\n  MAX_HASHABLE_LENGTH\n} from \"./constants\";\n\n/**\n * @internal\n */\nexport class RawSha256 {\n  private state: Int32Array = Int32Array.from(INIT);\n  private temp: Int32Array = new Int32Array(64);\n  private buffer: Uint8Array = new Uint8Array(64);\n  private bufferLength: number = 0;\n  private bytesHashed: number = 0;\n\n  /**\n   * @internal\n   */\n  finished: boolean = false;\n\n  update(data: Uint8Array): void {\n    if (this.finished) {\n      throw new Error(\"Attempted to update an already finished hash.\");\n    }\n\n    let position = 0;\n    let { byteLength } = data;\n    this.bytesHashed += byteLength;\n\n    if (this.bytesHashed * 8 > MAX_HASHABLE_LENGTH) {\n      throw new Error(\"Cannot hash more than 2^53 - 1 bits\");\n    }\n\n    while (byteLength > 0) {\n      this.buffer[this.bufferLength++] = data[position++];\n      byteLength--;\n\n      if (this.bufferLength === BLOCK_SIZE) {\n        this.hashBuffer();\n        this.bufferLength = 0;\n      }\n    }\n  }\n\n  digest(): Uint8Array {\n    if (!this.finished) {\n      const bitsHashed = this.bytesHashed * 8;\n      const bufferView = new DataView(\n        this.buffer.buffer,\n        this.buffer.byteOffset,\n        this.buffer.byteLength\n      );\n\n      const undecoratedLength = this.bufferLength;\n      bufferView.setUint8(this.bufferLength++, 0x80);\n\n      // Ensure the final block has enough room for the hashed length\n      if (undecoratedLength % BLOCK_SIZE >= BLOCK_SIZE - 8) {\n        for (let i = this.bufferLength; i < BLOCK_SIZE; i++) {\n          bufferView.setUint8(i, 0);\n        }\n        this.hashBuffer();\n        this.bufferLength = 0;\n      }\n\n      for (let i = this.bufferLength; i < BLOCK_SIZE - 8; i++) {\n        bufferView.setUint8(i, 0);\n      }\n      bufferView.setUint32(\n        BLOCK_SIZE - 8,\n        Math.floor(bitsHashed / 0x100000000),\n        true\n      );\n      bufferView.setUint32(BLOCK_SIZE - 4, bitsHashed);\n\n      this.hashBuffer();\n\n      this.finished = true;\n    }\n\n    // The value in state is little-endian rather than big-endian, so flip\n    // each word into a new Uint8Array\n    const out = new Uint8Array(DIGEST_LENGTH);\n    for (let i = 0; i < 8; i++) {\n      out[i * 4] = (this.state[i] >>> 24) & 0xff;\n      out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n      out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n      out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n    }\n\n    return out;\n  }\n\n  private hashBuffer(): void {\n    const { buffer, state } = this;\n\n    let state0 = state[0],\n      state1 = state[1],\n      state2 = state[2],\n      state3 = state[3],\n      state4 = state[4],\n      state5 = state[5],\n      state6 = state[6],\n      state7 = state[7];\n\n    for (let i = 0; i < BLOCK_SIZE; i++) {\n      if (i < 16) {\n        this.temp[i] =\n          ((buffer[i * 4] & 0xff) << 24) |\n          ((buffer[i * 4 + 1] & 0xff) << 16) |\n          ((buffer[i * 4 + 2] & 0xff) << 8) |\n          (buffer[i * 4 + 3] & 0xff);\n      } else {\n        let u = this.temp[i - 2];\n        const t1 =\n          ((u >>> 17) | (u << 15)) ^ ((u >>> 19) | (u << 13)) ^ (u >>> 10);\n\n        u = this.temp[i - 15];\n        const t2 =\n          ((u >>> 7) | (u << 25)) ^ ((u >>> 18) | (u << 14)) ^ (u >>> 3);\n\n        this.temp[i] =\n          ((t1 + this.temp[i - 7]) | 0) + ((t2 + this.temp[i - 16]) | 0);\n      }\n\n      const t1 =\n        ((((((state4 >>> 6) | (state4 << 26)) ^\n          ((state4 >>> 11) | (state4 << 21)) ^\n          ((state4 >>> 25) | (state4 << 7))) +\n          ((state4 & state5) ^ (~state4 & state6))) |\n          0) +\n          ((state7 + ((KEY[i] + this.temp[i]) | 0)) | 0)) |\n        0;\n\n      const t2 =\n        ((((state0 >>> 2) | (state0 << 30)) ^\n          ((state0 >>> 13) | (state0 << 19)) ^\n          ((state0 >>> 22) | (state0 << 10))) +\n          ((state0 & state1) ^ (state0 & state2) ^ (state1 & state2))) |\n        0;\n\n      state7 = state6;\n      state6 = state5;\n      state5 = state4;\n      state4 = (state3 + t1) | 0;\n      state3 = state2;\n      state2 = state1;\n      state1 = state0;\n      state0 = (t1 + t2) | 0;\n    }\n\n    state[0] += state0;\n    state[1] += state1;\n    state[2] += state2;\n    state[3] += state3;\n    state[4] += state4;\n    state[5] += state5;\n    state[6] += state6;\n    state[7] += state7;\n  }\n}\n","import { BLOCK_SIZE } from \"./constants\";\nimport { RawSha256 } from \"./RawSha256\";\nimport { Checksum, SourceData } from \"@aws-sdk/types\";\nimport { isEmptyData, convertToBuffer } from \"@aws-crypto/util\";\n\nexport class Sha256 implements Checksum {\n  private readonly secret?: SourceData;\n  private hash: RawSha256;\n  private outer?: RawSha256;\n  private error: any;\n\n  constructor(secret?: SourceData) {\n    this.secret = secret;\n    this.hash = new RawSha256();\n    this.reset();\n  }\n\n  update(toHash: SourceData): void {\n    if (isEmptyData(toHash) || this.error) {\n      return;\n    }\n\n    try {\n      this.hash.update(convertToBuffer(toHash));\n    } catch (e) {\n      this.error = e;\n    }\n  }\n\n  /* This synchronous method keeps compatibility\n   * with the v2 aws-sdk.\n   */\n  digestSync(): Uint8Array {\n    if (this.error) {\n      throw this.error;\n    }\n\n    if (this.outer) {\n      if (!this.outer.finished) {\n        this.outer.update(this.hash.digest());\n      }\n\n      return this.outer.digest();\n    }\n\n    return this.hash.digest();\n  }\n\n  /* The underlying digest method here is synchronous.\n   * To keep the same interface with the other hash functions\n   * the default is to expose this as an async method.\n   * However, it can sometimes be useful to have a sync method.\n   */\n  async digest(): Promise<Uint8Array> {\n    return this.digestSync();\n  }\n\n  reset(): void {\n    this.hash = new RawSha256();\n    if (this.secret) {\n      this.outer = new RawSha256();\n      const inner = bufferFromSecret(this.secret);\n      const outer = new Uint8Array(BLOCK_SIZE);\n      outer.set(inner);\n\n      for (let i = 0; i < BLOCK_SIZE; i++) {\n        inner[i] ^= 0x36;\n        outer[i] ^= 0x5c;\n      }\n\n      this.hash.update(inner);\n      this.outer.update(outer);\n\n      // overwrite the copied key in memory\n      for (let i = 0; i < inner.byteLength; i++) {\n        inner[i] = 0;\n      }\n    }\n  }\n}\n\nfunction bufferFromSecret(secret: SourceData): Uint8Array {\n  let input = convertToBuffer(secret);\n\n  if (input.byteLength > BLOCK_SIZE) {\n    const bufferHash = new RawSha256();\n    bufferHash.update(input);\n    input = bufferHash.digest();\n  }\n\n  const buffer = new Uint8Array(BLOCK_SIZE);\n  buffer.set(input);\n  return buffer;\n}\n","type SubtleCryptoMethod =\n  | \"decrypt\"\n  | \"digest\"\n  | \"encrypt\"\n  | \"exportKey\"\n  | \"generateKey\"\n  | \"importKey\"\n  | \"sign\"\n  | \"verify\";\n\nconst subtleCryptoMethods: Array<SubtleCryptoMethod> = [\n  \"decrypt\",\n  \"digest\",\n  \"encrypt\",\n  \"exportKey\",\n  \"generateKey\",\n  \"importKey\",\n  \"sign\",\n  \"verify\"\n];\n\nexport function supportsWebCrypto(window: Window): boolean {\n  if (\n    supportsSecureRandom(window) &&\n    typeof window.crypto.subtle === \"object\"\n  ) {\n    const { subtle } = window.crypto;\n\n    return supportsSubtleCrypto(subtle);\n  }\n\n  return false;\n}\n\nexport function supportsSecureRandom(window: Window): boolean {\n  if (typeof window === \"object\" && typeof window.crypto === \"object\") {\n    const { getRandomValues } = window.crypto;\n\n    return typeof getRandomValues === \"function\";\n  }\n\n  return false;\n}\n\nexport function supportsSubtleCrypto(subtle: SubtleCrypto) {\n  return (\n    subtle &&\n    subtleCryptoMethods.every(\n      methodName => typeof subtle[methodName] === \"function\"\n    )\n  );\n}\n\nexport async function supportsZeroByteGCM(subtle: SubtleCrypto) {\n  if (!supportsSubtleCrypto(subtle)) return false;\n  try {\n    const key = await subtle.generateKey(\n      { name: \"AES-GCM\", length: 128 },\n      false,\n      [\"encrypt\"]\n    );\n    const zeroByteAuthTag = await subtle.encrypt(\n      {\n        name: \"AES-GCM\",\n        iv: new Uint8Array(Array(12)),\n        additionalData: new Uint8Array(Array(16)),\n        tagLength: 128\n      },\n      key,\n      new Uint8Array(0)\n    );\n    return zeroByteAuthTag.byteLength === 16;\n  } catch {\n    return false;\n  }\n}\n","import { Sha256 as WebCryptoSha256 } from \"./webCryptoSha256\";\nimport { Sha256 as JsSha256 } from \"@aws-crypto/sha256-js\";\nimport { Checksum, SourceData } from \"@aws-sdk/types\";\nimport { supportsWebCrypto } from \"@aws-crypto/supports-web-crypto\";\nimport { locateWindow } from \"@aws-sdk/util-locate-window\";\nimport { convertToBuffer } from \"@aws-crypto/util\";\n\nexport class Sha256 implements Checksum {\n  private hash: Checksum;\n\n  constructor(secret?: SourceData) {\n    if (supportsWebCrypto(locateWindow())) {\n      this.hash = new WebCryptoSha256(secret);\n    } else {\n      this.hash = new JsSha256(secret);\n    }\n  }\n\n  update(data: SourceData, encoding?: \"utf8\" | \"ascii\" | \"latin1\"): void {\n    this.hash.update(convertToBuffer(data));\n  }\n\n  digest(): Promise<Uint8Array> {\n    return this.hash.digest();\n  }\n\n  reset(): void {\n    this.hash.reset();\n  }\n}\n","export { createUserAgentStringParsingProvider } from \"./createUserAgentStringParsingProvider\";\nexport const createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => async (config) => {\n    const navigator = typeof window !== \"undefined\" ? window.navigator : undefined;\n    const uaString = navigator?.userAgent ?? \"\";\n    const osName = navigator?.userAgentData?.platform ?? fallback.os(uaString) ?? \"other\";\n    const osVersion = undefined;\n    const brands = navigator?.userAgentData?.brands ?? [];\n    const brand = brands[brands.length - 1];\n    const browserName = brand?.brand ?? fallback.browser(uaString) ?? \"unknown\";\n    const browserVersion = brand?.version ?? \"unknown\";\n    const sections = [\n        [\"aws-sdk-js\", clientVersion],\n        [\"ua\", \"2.1\"],\n        [`os/${osName}`, osVersion],\n        [\"lang/js\"],\n        [\"md/browser\", `${browserName}_${browserVersion}`],\n    ];\n    if (serviceId) {\n        sections.push([`api/${serviceId}`, clientVersion]);\n    }\n    const appId = await config?.userAgentAppId?.();\n    if (appId) {\n        sections.push([`app/${appId}`]);\n    }\n    return sections;\n};\nexport const fallback = {\n    os(ua) {\n        if (/iPhone|iPad|iPod/.test(ua))\n            return \"iOS\";\n        if (/Macintosh|Mac OS X/.test(ua))\n            return \"macOS\";\n        if (/Windows NT/.test(ua))\n            return \"Windows\";\n        if (/Android/.test(ua))\n            return \"Android\";\n        if (/Linux/.test(ua))\n            return \"Linux\";\n        return undefined;\n    },\n    browser(ua) {\n        if (/EdgiOS|EdgA|Edg\\//.test(ua))\n            return \"Microsoft Edge\";\n        if (/Firefox\\//.test(ua))\n            return \"Firefox\";\n        if (/Chrome\\//.test(ua))\n            return \"Chrome\";\n        if (/Safari\\//.test(ua))\n            return \"Safari\";\n        return undefined;\n    },\n};\nexport const defaultUserAgent = createDefaultUserAgentProvider;\n","export var SelectorType;\n(function (SelectorType) {\n    SelectorType[\"ENV\"] = \"env\";\n    SelectorType[\"CONFIG\"] = \"shared config entry\";\n})(SelectorType || (SelectorType = {}));\n","export function createRequest(url, requestOptions) {\n    return new Request(url, requestOptions);\n}\n","export function requestTimeout(timeoutInMs = 0) {\n    return new Promise((resolve, reject) => {\n        if (timeoutInMs) {\n            setTimeout(() => {\n                const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`);\n                timeoutError.name = \"TimeoutError\";\n                reject(timeoutError);\n            }, timeoutInMs);\n        }\n    });\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { createRequest } from \"./create-request\";\nimport { requestTimeout as requestTimeoutFn } from \"./request-timeout\";\nexport const keepAliveSupport = {\n    supported: undefined,\n};\nexport class FetchHttpHandler {\n    config;\n    configProvider;\n    static create(instanceOrOptions) {\n        if (typeof instanceOrOptions?.handle === \"function\") {\n            return instanceOrOptions;\n        }\n        return new FetchHttpHandler(instanceOrOptions);\n    }\n    constructor(options) {\n        if (typeof options === \"function\") {\n            this.configProvider = options().then((opts) => opts || {});\n        }\n        else {\n            this.config = options ?? {};\n            this.configProvider = Promise.resolve(this.config);\n        }\n        if (keepAliveSupport.supported === undefined) {\n            keepAliveSupport.supported = Boolean(typeof Request !== \"undefined\" && \"keepalive\" in createRequest(\"https://[::1]\"));\n        }\n    }\n    destroy() {\n    }\n    async handle(request, { abortSignal, requestTimeout } = {}) {\n        if (!this.config) {\n            this.config = await this.configProvider;\n        }\n        const requestTimeoutInMs = requestTimeout ?? this.config.requestTimeout;\n        const keepAlive = this.config.keepAlive === true;\n        const credentials = this.config.credentials;\n        if (abortSignal?.aborted) {\n            const abortError = new Error(\"Request aborted\");\n            abortError.name = \"AbortError\";\n            return Promise.reject(abortError);\n        }\n        let path = request.path;\n        const queryString = buildQueryString(request.query || {});\n        if (queryString) {\n            path += `?${queryString}`;\n        }\n        if (request.fragment) {\n            path += `#${request.fragment}`;\n        }\n        let auth = \"\";\n        if (request.username != null || request.password != null) {\n            const username = request.username ?? \"\";\n            const password = request.password ?? \"\";\n            auth = `${username}:${password}@`;\n        }\n        const { port, method } = request;\n        const url = `${request.protocol}//${auth}${request.hostname}${port ? `:${port}` : \"\"}${path}`;\n        const body = method === \"GET\" || method === \"HEAD\" ? undefined : request.body;\n        const requestOptions = {\n            body,\n            headers: new Headers(request.headers),\n            method: method,\n            credentials,\n        };\n        if (this.config?.cache) {\n            requestOptions.cache = this.config.cache;\n        }\n        if (body) {\n            requestOptions.duplex = \"half\";\n        }\n        if (typeof AbortController !== \"undefined\") {\n            requestOptions.signal = abortSignal;\n        }\n        if (keepAliveSupport.supported) {\n            requestOptions.keepalive = keepAlive;\n        }\n        if (typeof this.config.requestInit === \"function\") {\n            Object.assign(requestOptions, this.config.requestInit(request));\n        }\n        let removeSignalEventListener = () => { };\n        const fetchRequest = createRequest(url, requestOptions);\n        const raceOfPromises = [\n            fetch(fetchRequest).then((response) => {\n                const fetchHeaders = response.headers;\n                const transformedHeaders = {};\n                for (const pair of fetchHeaders.entries()) {\n                    transformedHeaders[pair[0]] = pair[1];\n                }\n                const hasReadableStream = response.body != undefined;\n                if (!hasReadableStream) {\n                    return response.blob().then((body) => ({\n                        response: new HttpResponse({\n                            headers: transformedHeaders,\n                            reason: response.statusText,\n                            statusCode: response.status,\n                            body,\n                        }),\n                    }));\n                }\n                return {\n                    response: new HttpResponse({\n                        headers: transformedHeaders,\n                        reason: response.statusText,\n                        statusCode: response.status,\n                        body: response.body,\n                    }),\n                };\n            }),\n            requestTimeoutFn(requestTimeoutInMs),\n        ];\n        if (abortSignal) {\n            raceOfPromises.push(new Promise((resolve, reject) => {\n                const onAbort = () => {\n                    const abortError = new Error(\"Request aborted\");\n                    abortError.name = \"AbortError\";\n                    reject(abortError);\n                };\n                if (typeof abortSignal.addEventListener === \"function\") {\n                    const signal = abortSignal;\n                    signal.addEventListener(\"abort\", onAbort, { once: true });\n                    removeSignalEventListener = () => signal.removeEventListener(\"abort\", onAbort);\n                }\n                else {\n                    abortSignal.onabort = onAbort;\n                }\n            }));\n        }\n        return Promise.race(raceOfPromises).finally(removeSignalEventListener);\n    }\n    updateHttpClientConfig(key, value) {\n        this.config = undefined;\n        this.configProvider = this.configProvider.then((config) => {\n            config[key] = value;\n            return config;\n        });\n    }\n    httpHandlerConfigs() {\n        return this.config ?? {};\n    }\n}\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n    const parts = [];\n    for (let key of Object.keys(query).sort()) {\n        const value = query[key];\n        key = escapeUri(key);\n        if (Array.isArray(value)) {\n            for (let i = 0, iLen = value.length; i < iLen; i++) {\n                parts.push(`${key}=${escapeUri(value[i])}`);\n            }\n        }\n        else {\n            let qsEntry = key;\n            if (value || typeof value === \"string\") {\n                qsEntry += `=${escapeUri(value)}`;\n            }\n            parts.push(qsEntry);\n        }\n    }\n    return parts.join(\"&\");\n}\n","const chars = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;\nexport const alphabetByEncoding = Object.entries(chars).reduce((acc, [i, c]) => {\n    acc[c] = Number(i);\n    return acc;\n}, {});\nexport const alphabetByValue = chars.split(\"\");\nexport const bitsPerLetter = 6;\nexport const bitsPerByte = 8;\nexport const maxLetterValue = 0b111111;\n","import { alphabetByEncoding, bitsPerByte, bitsPerLetter } from \"./constants.browser\";\nexport const fromBase64 = (input) => {\n    let totalByteLength = (input.length / 4) * 3;\n    if (input.slice(-2) === \"==\") {\n        totalByteLength -= 2;\n    }\n    else if (input.slice(-1) === \"=\") {\n        totalByteLength--;\n    }\n    const out = new ArrayBuffer(totalByteLength);\n    const dataView = new DataView(out);\n    for (let i = 0; i < input.length; i += 4) {\n        let bits = 0;\n        let bitLength = 0;\n        for (let j = i, limit = i + 3; j <= limit; j++) {\n            if (input[j] !== \"=\") {\n                if (!(input[j] in alphabetByEncoding)) {\n                    throw new TypeError(`Invalid character ${input[j]} in base64 string.`);\n                }\n                bits |= alphabetByEncoding[input[j]] << ((limit - j) * bitsPerLetter);\n                bitLength += bitsPerLetter;\n            }\n            else {\n                bits >>= bitsPerLetter;\n            }\n        }\n        const chunkOffset = (i / 4) * 3;\n        bits >>= bitLength % bitsPerByte;\n        const byteLength = Math.floor(bitLength / bitsPerByte);\n        for (let k = 0; k < byteLength; k++) {\n            const offset = (byteLength - k - 1) * bitsPerByte;\n            dataView.setUint8(chunkOffset + k, (bits & (255 << offset)) >> offset);\n        }\n    }\n    return new Uint8Array(out);\n};\n","import { fromBase64 } from \"@smithy/util-base64\";\nexport const streamCollector = async (stream) => {\n    if ((typeof Blob === \"function\" && stream instanceof Blob) || stream.constructor?.name === \"Blob\") {\n        if (Blob.prototype.arrayBuffer !== undefined) {\n            return new Uint8Array(await stream.arrayBuffer());\n        }\n        return collectBlob(stream);\n    }\n    return collectStream(stream);\n};\nasync function collectBlob(blob) {\n    const base64 = await readToBase64(blob);\n    const arrayBuffer = fromBase64(base64);\n    return new Uint8Array(arrayBuffer);\n}\nasync function collectStream(stream) {\n    const chunks = [];\n    const reader = stream.getReader();\n    let isDone = false;\n    let length = 0;\n    while (!isDone) {\n        const { done, value } = await reader.read();\n        if (value) {\n            chunks.push(value);\n            length += value.length;\n        }\n        isDone = done;\n    }\n    const collected = new Uint8Array(length);\n    let offset = 0;\n    for (const chunk of chunks) {\n        collected.set(chunk, offset);\n        offset += chunk.length;\n    }\n    return collected;\n}\nfunction readToBase64(blob) {\n    return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onloadend = () => {\n            if (reader.readyState !== 2) {\n                return reject(new Error(\"Reader aborted too early\"));\n            }\n            const result = (reader.result ?? \"\");\n            const commaIndex = result.indexOf(\",\");\n            const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length;\n            resolve(result.substring(dataOffset));\n        };\n        reader.onabort = () => reject(new Error(\"Read aborted\"));\n        reader.onerror = () => reject(reader.error);\n        reader.readAsDataURL(blob);\n    });\n}\n","export const loadConfigsForDefaultMode = (mode) => {\n    switch (mode) {\n        case \"standard\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 3100,\n            };\n        case \"in-region\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 1100,\n            };\n        case \"cross-region\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 3100,\n            };\n        case \"mobile\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 30000,\n            };\n        default:\n            return {};\n    }\n};\n","const TEXT_ENCODER = typeof TextEncoder == \"function\" ? new TextEncoder() : null;\nexport const calculateBodyLength = (body) => {\n    if (typeof body === \"string\") {\n        if (TEXT_ENCODER) {\n            return TEXT_ENCODER.encode(body).byteLength;\n        }\n        let len = body.length;\n        for (let i = len - 1; i >= 0; i--) {\n            const code = body.charCodeAt(i);\n            if (code > 0x7f && code <= 0x7ff)\n                len++;\n            else if (code > 0x7ff && code <= 0xffff)\n                len += 2;\n            if (code >= 0xdc00 && code <= 0xdfff)\n                i--;\n        }\n        return len;\n    }\n    else if (typeof body.byteLength === \"number\") {\n        return body.byteLength;\n    }\n    else if (typeof body.size === \"number\") {\n        return body.size;\n    }\n    throw new Error(`Body Length computation failed for ${body}`);\n};\n","export const DEFAULTS_MODE_OPTIONS = [\"in-region\", \"cross-region\", \"mobile\", \"standard\", \"legacy\"];\n","export const getSkewCorrectedDate = (systemClockOffset) => new Date(Date.now() + systemClockOffset);\n","import { HttpResponse } from \"@smithy/protocol-http\";\nexport const getDateHeader = (response) => HttpResponse.isInstance(response) ? response.headers?.date ?? response.headers?.Date : undefined;\n","import { isClockSkewed } from \"./isClockSkewed\";\nexport const getUpdatedSystemClockOffset = (clockTime, currentSystemClockOffset) => {\n    const clockTimeInMs = Date.parse(clockTime);\n    if (isClockSkewed(clockTimeInMs, currentSystemClockOffset)) {\n        return clockTimeInMs - Date.now();\n    }\n    return currentSystemClockOffset;\n};\n","import { getSkewCorrectedDate } from \"./getSkewCorrectedDate\";\nexport const isClockSkewed = (clockTime, systemClockOffset) => Math.abs(getSkewCorrectedDate(systemClockOffset).getTime() - clockTime) >= 300000;\n","import { HttpRequest } from \"@smithy/protocol-http\";\nimport { getDateHeader, getSkewCorrectedDate, getUpdatedSystemClockOffset } from \"../utils\";\nconst throwSigningPropertyError = (name, property) => {\n    if (!property) {\n        throw new Error(`Property \\`${name}\\` is not resolved for AWS SDK SigV4Auth`);\n    }\n    return property;\n};\nexport const validateSigningProperties = async (signingProperties) => {\n    const context = throwSigningPropertyError(\"context\", signingProperties.context);\n    const config = throwSigningPropertyError(\"config\", signingProperties.config);\n    const authScheme = context.endpointV2?.properties?.authSchemes?.[0];\n    const signerFunction = throwSigningPropertyError(\"signer\", config.signer);\n    const signer = await signerFunction(authScheme);\n    const signingRegion = signingProperties?.signingRegion;\n    const signingRegionSet = signingProperties?.signingRegionSet;\n    const signingName = signingProperties?.signingName;\n    return {\n        config,\n        signer,\n        signingRegion,\n        signingRegionSet,\n        signingName,\n    };\n};\nexport class AwsSdkSigV4Signer {\n    async sign(httpRequest, identity, signingProperties) {\n        if (!HttpRequest.isInstance(httpRequest)) {\n            throw new Error(\"The request is not an instance of `HttpRequest` and cannot be signed\");\n        }\n        const validatedProps = await validateSigningProperties(signingProperties);\n        const { config, signer } = validatedProps;\n        let { signingRegion, signingName } = validatedProps;\n        const handlerExecutionContext = signingProperties.context;\n        if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) {\n            const [first, second] = handlerExecutionContext.authSchemes;\n            if (first?.name === \"sigv4a\" && second?.name === \"sigv4\") {\n                signingRegion = second?.signingRegion ?? signingRegion;\n                signingName = second?.signingName ?? signingName;\n            }\n        }\n        const signedRequest = await signer.sign(httpRequest, {\n            signingDate: getSkewCorrectedDate(config.systemClockOffset),\n            signingRegion: signingRegion,\n            signingService: signingName,\n        });\n        return signedRequest;\n    }\n    errorHandler(signingProperties) {\n        return (error) => {\n            const serverTime = error.ServerTime ?? getDateHeader(error.$response);\n            if (serverTime) {\n                const config = throwSigningPropertyError(\"config\", signingProperties.config);\n                const initialSystemClockOffset = config.systemClockOffset;\n                config.systemClockOffset = getUpdatedSystemClockOffset(serverTime, config.systemClockOffset);\n                const clockSkewCorrected = config.systemClockOffset !== initialSystemClockOffset;\n                if (clockSkewCorrected && error.$metadata) {\n                    error.$metadata.clockSkewCorrected = true;\n                }\n            }\n            throw error;\n        };\n    }\n    successHandler(httpResponse, signingProperties) {\n        const dateHeader = getDateHeader(httpResponse);\n        if (dateHeader) {\n            const config = throwSigningPropertyError(\"config\", signingProperties.config);\n            config.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config.systemClockOffset);\n        }\n    }\n}\nexport const AWSSDKSigV4Signer = AwsSdkSigV4Signer;\n","export const deref = (schemaRef) => {\n    if (typeof schemaRef === \"function\") {\n        return schemaRef();\n    }\n    return schemaRef;\n};\n","export function translateTraits(indicator) {\n    if (typeof indicator === \"object\") {\n        return indicator;\n    }\n    indicator = indicator | 0;\n    const traits = {};\n    let i = 0;\n    for (const trait of [\n        \"httpLabel\",\n        \"idempotent\",\n        \"idempotencyToken\",\n        \"sensitive\",\n        \"httpPayload\",\n        \"httpResponseCode\",\n        \"httpQueryParams\",\n    ]) {\n        if (((indicator >> i++) & 1) === 1) {\n            traits[trait] = 1;\n        }\n    }\n    return traits;\n}\n","import { deref } from \"../deref\";\nimport { translateTraits } from \"./translateTraits\";\nconst anno = {\n    it: Symbol.for(\"@smithy/nor-struct-it\"),\n};\nexport class NormalizedSchema {\n    ref;\n    memberName;\n    static symbol = Symbol.for(\"@smithy/nor\");\n    symbol = NormalizedSchema.symbol;\n    name;\n    schema;\n    _isMemberSchema;\n    traits;\n    memberTraits;\n    normalizedTraits;\n    constructor(ref, memberName) {\n        this.ref = ref;\n        this.memberName = memberName;\n        const traitStack = [];\n        let _ref = ref;\n        let schema = ref;\n        this._isMemberSchema = false;\n        while (isMemberSchema(_ref)) {\n            traitStack.push(_ref[1]);\n            _ref = _ref[0];\n            schema = deref(_ref);\n            this._isMemberSchema = true;\n        }\n        if (traitStack.length > 0) {\n            this.memberTraits = {};\n            for (let i = traitStack.length - 1; i >= 0; --i) {\n                const traitSet = traitStack[i];\n                Object.assign(this.memberTraits, translateTraits(traitSet));\n            }\n        }\n        else {\n            this.memberTraits = 0;\n        }\n        if (schema instanceof NormalizedSchema) {\n            const computedMemberTraits = this.memberTraits;\n            Object.assign(this, schema);\n            this.memberTraits = Object.assign({}, computedMemberTraits, schema.getMemberTraits(), this.getMemberTraits());\n            this.normalizedTraits = void 0;\n            this.memberName = memberName ?? schema.memberName;\n            return;\n        }\n        this.schema = deref(schema);\n        if (isStaticSchema(this.schema)) {\n            this.name = `${this.schema[1]}#${this.schema[2]}`;\n            this.traits = this.schema[3];\n        }\n        else {\n            this.name = this.memberName ?? String(schema);\n            this.traits = 0;\n        }\n        if (this._isMemberSchema && !memberName) {\n            throw new Error(`@smithy/core/schema - NormalizedSchema member init ${this.getName(true)} missing member name.`);\n        }\n    }\n    static [Symbol.hasInstance](lhs) {\n        const isPrototype = this.prototype.isPrototypeOf(lhs);\n        if (!isPrototype && typeof lhs === \"object\" && lhs !== null) {\n            const ns = lhs;\n            return ns.symbol === this.symbol;\n        }\n        return isPrototype;\n    }\n    static of(ref) {\n        const sc = deref(ref);\n        if (sc instanceof NormalizedSchema) {\n            return sc;\n        }\n        if (isMemberSchema(sc)) {\n            const [ns, traits] = sc;\n            if (ns instanceof NormalizedSchema) {\n                Object.assign(ns.getMergedTraits(), translateTraits(traits));\n                return ns;\n            }\n            throw new Error(`@smithy/core/schema - may not init unwrapped member schema=${JSON.stringify(ref, null, 2)}.`);\n        }\n        return new NormalizedSchema(sc);\n    }\n    getSchema() {\n        const sc = this.schema;\n        if (Array.isArray(sc) && sc[0] === 0) {\n            return sc[4];\n        }\n        return sc;\n    }\n    getName(withNamespace = false) {\n        const { name } = this;\n        const short = !withNamespace && name && name.includes(\"#\");\n        return short ? name.split(\"#\")[1] : name || undefined;\n    }\n    getMemberName() {\n        return this.memberName;\n    }\n    isMemberSchema() {\n        return this._isMemberSchema;\n    }\n    isListSchema() {\n        const sc = this.getSchema();\n        return typeof sc === \"number\"\n            ? sc >= 64 && sc < 128\n            : sc[0] === 1;\n    }\n    isMapSchema() {\n        const sc = this.getSchema();\n        return typeof sc === \"number\"\n            ? sc >= 128 && sc <= 0b1111_1111\n            : sc[0] === 2;\n    }\n    isStructSchema() {\n        const sc = this.getSchema();\n        if (typeof sc !== \"object\") {\n            return false;\n        }\n        const id = sc[0];\n        return (id === 3 ||\n            id === -3 ||\n            id === 4);\n    }\n    isUnionSchema() {\n        const sc = this.getSchema();\n        if (typeof sc !== \"object\") {\n            return false;\n        }\n        return sc[0] === 4;\n    }\n    isBlobSchema() {\n        const sc = this.getSchema();\n        return sc === 21 || sc === 42;\n    }\n    isTimestampSchema() {\n        const sc = this.getSchema();\n        return (typeof sc === \"number\" &&\n            sc >= 4 &&\n            sc <= 7);\n    }\n    isUnitSchema() {\n        return this.getSchema() === \"unit\";\n    }\n    isDocumentSchema() {\n        return this.getSchema() === 15;\n    }\n    isStringSchema() {\n        return this.getSchema() === 0;\n    }\n    isBooleanSchema() {\n        return this.getSchema() === 2;\n    }\n    isNumericSchema() {\n        return this.getSchema() === 1;\n    }\n    isBigIntegerSchema() {\n        return this.getSchema() === 17;\n    }\n    isBigDecimalSchema() {\n        return this.getSchema() === 19;\n    }\n    isStreaming() {\n        const { streaming } = this.getMergedTraits();\n        return !!streaming || this.getSchema() === 42;\n    }\n    isIdempotencyToken() {\n        return !!this.getMergedTraits().idempotencyToken;\n    }\n    getMergedTraits() {\n        return (this.normalizedTraits ??\n            (this.normalizedTraits = {\n                ...this.getOwnTraits(),\n                ...this.getMemberTraits(),\n            }));\n    }\n    getMemberTraits() {\n        return translateTraits(this.memberTraits);\n    }\n    getOwnTraits() {\n        return translateTraits(this.traits);\n    }\n    getKeySchema() {\n        const [isDoc, isMap] = [this.isDocumentSchema(), this.isMapSchema()];\n        if (!isDoc && !isMap) {\n            throw new Error(`@smithy/core/schema - cannot get key for non-map: ${this.getName(true)}`);\n        }\n        const schema = this.getSchema();\n        const memberSchema = isDoc\n            ? 15\n            : schema[4] ?? 0;\n        return member([memberSchema, 0], \"key\");\n    }\n    getValueSchema() {\n        const sc = this.getSchema();\n        const [isDoc, isMap, isList] = [this.isDocumentSchema(), this.isMapSchema(), this.isListSchema()];\n        const memberSchema = typeof sc === \"number\"\n            ? 0b0011_1111 & sc\n            : sc && typeof sc === \"object\" && (isMap || isList)\n                ? sc[3 + sc[0]]\n                : isDoc\n                    ? 15\n                    : void 0;\n        if (memberSchema != null) {\n            return member([memberSchema, 0], isMap ? \"value\" : \"member\");\n        }\n        throw new Error(`@smithy/core/schema - ${this.getName(true)} has no value member.`);\n    }\n    getMemberSchema(memberName) {\n        const struct = this.getSchema();\n        if (this.isStructSchema() && struct[4].includes(memberName)) {\n            const i = struct[4].indexOf(memberName);\n            const memberSchema = struct[5][i];\n            return member(isMemberSchema(memberSchema) ? memberSchema : [memberSchema, 0], memberName);\n        }\n        if (this.isDocumentSchema()) {\n            return member([15, 0], memberName);\n        }\n        throw new Error(`@smithy/core/schema - ${this.getName(true)} has no no member=${memberName}.`);\n    }\n    getMemberSchemas() {\n        const buffer = {};\n        try {\n            for (const [k, v] of this.structIterator()) {\n                buffer[k] = v;\n            }\n        }\n        catch (ignored) { }\n        return buffer;\n    }\n    getEventStreamMember() {\n        if (this.isStructSchema()) {\n            for (const [memberName, memberSchema] of this.structIterator()) {\n                if (memberSchema.isStreaming() && memberSchema.isStructSchema()) {\n                    return memberName;\n                }\n            }\n        }\n        return \"\";\n    }\n    *structIterator() {\n        if (this.isUnitSchema()) {\n            return;\n        }\n        if (!this.isStructSchema()) {\n            throw new Error(\"@smithy/core/schema - cannot iterate non-struct schema.\");\n        }\n        const struct = this.getSchema();\n        const z = struct[4].length;\n        let it = struct[anno.it];\n        if (it && z === it.length) {\n            yield* it;\n            return;\n        }\n        it = Array(z);\n        for (let i = 0; i < z; ++i) {\n            const k = struct[4][i];\n            const v = member([struct[5][i], 0], k);\n            yield (it[i] = [k, v]);\n        }\n        struct[anno.it] = it;\n    }\n}\nfunction member(memberSchema, memberName) {\n    if (memberSchema instanceof NormalizedSchema) {\n        return Object.assign(memberSchema, {\n            memberName,\n            _isMemberSchema: true,\n        });\n    }\n    const internalCtorAccess = NormalizedSchema;\n    return new internalCtorAccess(memberSchema, memberName);\n}\nconst isMemberSchema = (sc) => Array.isArray(sc) && sc.length === 2;\nexport const isStaticSchema = (sc) => Array.isArray(sc) && sc.length >= 5;\n","import { fromUtf8 } from \"@smithy/util-utf8\";\nimport { alphabetByValue, bitsPerByte, bitsPerLetter, maxLetterValue } from \"./constants.browser\";\nexport function toBase64(_input) {\n    let input;\n    if (typeof _input === \"string\") {\n        input = fromUtf8(_input);\n    }\n    else {\n        input = _input;\n    }\n    const isArrayLike = typeof input === \"object\" && typeof input.length === \"number\";\n    const isUint8Array = typeof input === \"object\" &&\n        typeof input.byteOffset === \"number\" &&\n        typeof input.byteLength === \"number\";\n    if (!isArrayLike && !isUint8Array) {\n        throw new Error(\"@smithy/util-base64: toBase64 encoder function only accepts string | Uint8Array.\");\n    }\n    let str = \"\";\n    for (let i = 0; i < input.length; i += 3) {\n        let bits = 0;\n        let bitLength = 0;\n        for (let j = i, limit = Math.min(i + 3, input.length); j < limit; j++) {\n            bits |= input[j] << ((limit - j - 1) * bitsPerByte);\n            bitLength += bitsPerByte;\n        }\n        const bitClusterCount = Math.ceil(bitLength / bitsPerLetter);\n        bits <<= bitClusterCount * bitsPerLetter - bitLength;\n        for (let k = 1; k <= bitClusterCount; k++) {\n            const offset = (bitClusterCount - k) * bitsPerLetter;\n            str += alphabetByValue[(bits & (maxLetterValue << offset)) >> offset];\n        }\n        str += \"==\".slice(0, 4 - bitClusterCount);\n    }\n    return str;\n}\n","import { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nexport class Uint8ArrayBlobAdapter extends Uint8Array {\n    static fromString(source, encoding = \"utf-8\") {\n        if (typeof source === \"string\") {\n            if (encoding === \"base64\") {\n                return Uint8ArrayBlobAdapter.mutate(fromBase64(source));\n            }\n            return Uint8ArrayBlobAdapter.mutate(fromUtf8(source));\n        }\n        throw new Error(`Unsupported conversion from ${typeof source} to Uint8ArrayBlobAdapter.`);\n    }\n    static mutate(source) {\n        Object.setPrototypeOf(source, Uint8ArrayBlobAdapter.prototype);\n        return source;\n    }\n    transformToString(encoding = \"utf-8\") {\n        if (encoding === \"base64\") {\n            return toBase64(this);\n        }\n        return toUtf8(this);\n    }\n}\n","import { Uint8ArrayBlobAdapter } from \"@smithy/util-stream\";\nexport const collectBody = async (streamBody = new Uint8Array(), context) => {\n    if (streamBody instanceof Uint8Array) {\n        return Uint8ArrayBlobAdapter.mutate(streamBody);\n    }\n    if (!streamBody) {\n        return Uint8ArrayBlobAdapter.mutate(new Uint8Array());\n    }\n    const fromContext = context.streamCollector(streamBody);\n    return Uint8ArrayBlobAdapter.mutate(await fromContext);\n};\n","export class TypeRegistry {\n    namespace;\n    schemas;\n    exceptions;\n    static registries = new Map();\n    constructor(namespace, schemas = new Map(), exceptions = new Map()) {\n        this.namespace = namespace;\n        this.schemas = schemas;\n        this.exceptions = exceptions;\n    }\n    static for(namespace) {\n        if (!TypeRegistry.registries.has(namespace)) {\n            TypeRegistry.registries.set(namespace, new TypeRegistry(namespace));\n        }\n        return TypeRegistry.registries.get(namespace);\n    }\n    copyFrom(other) {\n        const { schemas, exceptions } = this;\n        for (const [k, v] of other.schemas) {\n            if (!schemas.has(k)) {\n                schemas.set(k, v);\n            }\n        }\n        for (const [k, v] of other.exceptions) {\n            if (!exceptions.has(k)) {\n                exceptions.set(k, v);\n            }\n        }\n    }\n    register(shapeId, schema) {\n        const qualifiedName = this.normalizeShapeId(shapeId);\n        for (const r of [this, TypeRegistry.for(qualifiedName.split(\"#\")[0])]) {\n            r.schemas.set(qualifiedName, schema);\n        }\n    }\n    getSchema(shapeId) {\n        const id = this.normalizeShapeId(shapeId);\n        if (!this.schemas.has(id)) {\n            throw new Error(`@smithy/core/schema - schema not found for ${id}`);\n        }\n        return this.schemas.get(id);\n    }\n    registerError(es, ctor) {\n        const $error = es;\n        const ns = $error[1];\n        for (const r of [this, TypeRegistry.for(ns)]) {\n            r.schemas.set(ns + \"#\" + $error[2], $error);\n            r.exceptions.set($error, ctor);\n        }\n    }\n    getErrorCtor(es) {\n        const $error = es;\n        if (this.exceptions.has($error)) {\n            return this.exceptions.get($error);\n        }\n        const registry = TypeRegistry.for($error[1]);\n        return registry.exceptions.get($error);\n    }\n    getBaseException() {\n        for (const exceptionKey of this.exceptions.keys()) {\n            if (Array.isArray(exceptionKey)) {\n                const [, ns, name] = exceptionKey;\n                const id = ns + \"#\" + name;\n                if (id.startsWith(\"smithy.ts.sdk.synthetic.\") && id.endsWith(\"ServiceException\")) {\n                    return exceptionKey;\n                }\n            }\n        }\n        return undefined;\n    }\n    find(predicate) {\n        return [...this.schemas.values()].find(predicate);\n    }\n    clear() {\n        this.schemas.clear();\n        this.exceptions.clear();\n    }\n    normalizeShapeId(shapeId) {\n        if (shapeId.includes(\"#\")) {\n            return shapeId;\n        }\n        return this.namespace + \"#\" + shapeId;\n    }\n}\n","export class SerdeContext {\n    serdeContext;\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n    }\n}\n","import { NormalizedSchema, translateTraits, TypeRegistry } from \"@smithy/core/schema\";\nimport { HttpRequest, HttpResponse } from \"@smithy/protocol-http\";\nimport { SerdeContext } from \"./SerdeContext\";\nexport class HttpProtocol extends SerdeContext {\n    options;\n    compositeErrorRegistry;\n    constructor(options) {\n        super();\n        this.options = options;\n        this.compositeErrorRegistry = TypeRegistry.for(options.defaultNamespace);\n        for (const etr of options.errorTypeRegistries ?? []) {\n            this.compositeErrorRegistry.copyFrom(etr);\n        }\n    }\n    getRequestType() {\n        return HttpRequest;\n    }\n    getResponseType() {\n        return HttpResponse;\n    }\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n        this.serializer.setSerdeContext(serdeContext);\n        this.deserializer.setSerdeContext(serdeContext);\n        if (this.getPayloadCodec()) {\n            this.getPayloadCodec().setSerdeContext(serdeContext);\n        }\n    }\n    updateServiceEndpoint(request, endpoint) {\n        if (\"url\" in endpoint) {\n            request.protocol = endpoint.url.protocol;\n            request.hostname = endpoint.url.hostname;\n            request.port = endpoint.url.port ? Number(endpoint.url.port) : undefined;\n            request.path = endpoint.url.pathname;\n            request.fragment = endpoint.url.hash || void 0;\n            request.username = endpoint.url.username || void 0;\n            request.password = endpoint.url.password || void 0;\n            if (!request.query) {\n                request.query = {};\n            }\n            for (const [k, v] of endpoint.url.searchParams.entries()) {\n                request.query[k] = v;\n            }\n            return request;\n        }\n        else {\n            request.protocol = endpoint.protocol;\n            request.hostname = endpoint.hostname;\n            request.port = endpoint.port ? Number(endpoint.port) : undefined;\n            request.path = endpoint.path;\n            request.query = {\n                ...endpoint.query,\n            };\n            return request;\n        }\n    }\n    setHostPrefix(request, operationSchema, input) {\n        if (this.serdeContext?.disableHostPrefix) {\n            return;\n        }\n        const inputNs = NormalizedSchema.of(operationSchema.input);\n        const opTraits = translateTraits(operationSchema.traits ?? {});\n        if (opTraits.endpoint) {\n            let hostPrefix = opTraits.endpoint?.[0];\n            if (typeof hostPrefix === \"string\") {\n                const hostLabelInputs = [...inputNs.structIterator()].filter(([, member]) => member.getMergedTraits().hostLabel);\n                for (const [name] of hostLabelInputs) {\n                    const replacement = input[name];\n                    if (typeof replacement !== \"string\") {\n                        throw new Error(`@smithy/core/schema - ${name} in input must be a string as hostLabel.`);\n                    }\n                    hostPrefix = hostPrefix.replace(`{${name}}`, replacement);\n                }\n                request.hostname = hostPrefix + request.hostname;\n            }\n        }\n    }\n    deserializeMetadata(output) {\n        return {\n            httpStatusCode: output.statusCode,\n            requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n            extendedRequestId: output.headers[\"x-amz-id-2\"],\n            cfId: output.headers[\"x-amz-cf-id\"],\n        };\n    }\n    async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n        const eventStreamSerde = await this.loadEventStreamCapability();\n        return eventStreamSerde.serializeEventStream({\n            eventStream,\n            requestSchema,\n            initialRequest,\n        });\n    }\n    async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n        const eventStreamSerde = await this.loadEventStreamCapability();\n        return eventStreamSerde.deserializeEventStream({\n            response,\n            responseSchema,\n            initialResponseContainer,\n        });\n    }\n    async loadEventStreamCapability() {\n        const { EventStreamSerde } = await import(\"@smithy/core/event-streams\");\n        return new EventStreamSerde({\n            marshaller: this.getEventStreamMarshaller(),\n            serializer: this.serializer,\n            deserializer: this.deserializer,\n            serdeContext: this.serdeContext,\n            defaultContentType: this.getDefaultContentType(),\n        });\n    }\n    getDefaultContentType() {\n        throw new Error(`@smithy/core/protocols - ${this.constructor.name} getDefaultContentType() implementation missing.`);\n    }\n    async deserializeHttpMessage(schema, context, response, arg4, arg5) {\n        void schema;\n        void context;\n        void response;\n        void arg4;\n        void arg5;\n        return [];\n    }\n    getEventStreamMarshaller() {\n        const context = this.serdeContext;\n        if (!context.eventStreamMarshaller) {\n            throw new Error(\"@smithy/core - HttpProtocol: eventStreamMarshaller missing in serdeContext.\");\n        }\n        return context.eventStreamMarshaller;\n    }\n}\n","import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { collectBody } from \"./collect-stream-body\";\nimport { HttpProtocol } from \"./HttpProtocol\";\nexport class RpcProtocol extends HttpProtocol {\n    async serializeRequest(operationSchema, input, context) {\n        const serializer = this.serializer;\n        const query = {};\n        const headers = {};\n        const endpoint = await context.endpoint();\n        const ns = NormalizedSchema.of(operationSchema?.input);\n        const schema = ns.getSchema();\n        let payload;\n        const request = new HttpRequest({\n            protocol: \"\",\n            hostname: \"\",\n            port: undefined,\n            path: \"/\",\n            fragment: undefined,\n            query: query,\n            headers: headers,\n            body: undefined,\n        });\n        if (endpoint) {\n            this.updateServiceEndpoint(request, endpoint);\n            this.setHostPrefix(request, operationSchema, input);\n        }\n        const _input = {\n            ...input,\n        };\n        if (input) {\n            const eventStreamMember = ns.getEventStreamMember();\n            if (eventStreamMember) {\n                if (_input[eventStreamMember]) {\n                    const initialRequest = {};\n                    for (const [memberName, memberSchema] of ns.structIterator()) {\n                        if (memberName !== eventStreamMember && _input[memberName]) {\n                            serializer.write(memberSchema, _input[memberName]);\n                            initialRequest[memberName] = serializer.flush();\n                        }\n                    }\n                    payload = await this.serializeEventStream({\n                        eventStream: _input[eventStreamMember],\n                        requestSchema: ns,\n                        initialRequest,\n                    });\n                }\n            }\n            else {\n                serializer.write(schema, _input);\n                payload = serializer.flush();\n            }\n        }\n        request.headers = headers;\n        request.query = query;\n        request.body = payload;\n        request.method = \"POST\";\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        const deserializer = this.deserializer;\n        const ns = NormalizedSchema.of(operationSchema.output);\n        const dataObject = {};\n        if (response.statusCode >= 300) {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(15, bytes));\n            }\n            await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));\n            throw new Error(\"@smithy/core/protocols - RPC Protocol error handler failed to throw.\");\n        }\n        for (const header in response.headers) {\n            const value = response.headers[header];\n            delete response.headers[header];\n            response.headers[header.toLowerCase()] = value;\n        }\n        const eventStreamMember = ns.getEventStreamMember();\n        if (eventStreamMember) {\n            dataObject[eventStreamMember] = await this.deserializeEventStream({\n                response,\n                responseSchema: ns,\n                initialResponseContainer: dataObject,\n            });\n        }\n        else {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(ns, bytes));\n            }\n        }\n        dataObject.$metadata = this.deserializeMetadata(response);\n        return dataObject;\n    }\n}\n","export class ServiceException extends Error {\n    $fault;\n    $response;\n    $retryable;\n    $metadata;\n    constructor(options) {\n        super(options.message);\n        Object.setPrototypeOf(this, Object.getPrototypeOf(this).constructor.prototype);\n        this.name = options.name;\n        this.$fault = options.$fault;\n        this.$metadata = options.$metadata;\n    }\n    static isInstance(value) {\n        if (!value)\n            return false;\n        const candidate = value;\n        return (ServiceException.prototype.isPrototypeOf(candidate) ||\n            (Boolean(candidate.$fault) &&\n                Boolean(candidate.$metadata) &&\n                (candidate.$fault === \"client\" || candidate.$fault === \"server\")));\n    }\n    static [Symbol.hasInstance](instance) {\n        if (!instance)\n            return false;\n        const candidate = instance;\n        if (this === ServiceException) {\n            return ServiceException.isInstance(instance);\n        }\n        if (ServiceException.isInstance(instance)) {\n            if (candidate.name && this.name) {\n                return this.prototype.isPrototypeOf(instance) || candidate.name === this.name;\n            }\n            return this.prototype.isPrototypeOf(instance);\n        }\n        return false;\n    }\n}\nexport const decorateServiceException = (exception, additions = {}) => {\n    Object.entries(additions)\n        .filter(([, v]) => v !== undefined)\n        .forEach(([k, v]) => {\n        if (exception[k] == undefined || exception[k] === \"\") {\n            exception[k] = v;\n        }\n    });\n    const message = exception.message || exception.Message || \"UnknownError\";\n    exception.message = message;\n    delete exception.Message;\n    return exception;\n};\n","import { NormalizedSchema, TypeRegistry } from \"@smithy/core/schema\";\nimport { decorateServiceException } from \"@smithy/smithy-client\";\nexport class ProtocolLib {\n    queryCompat;\n    constructor(queryCompat = false) {\n        this.queryCompat = queryCompat;\n    }\n    resolveRestContentType(defaultContentType, inputSchema) {\n        const members = inputSchema.getMemberSchemas();\n        const httpPayloadMember = Object.values(members).find((m) => {\n            return !!m.getMergedTraits().httpPayload;\n        });\n        if (httpPayloadMember) {\n            const mediaType = httpPayloadMember.getMergedTraits().mediaType;\n            if (mediaType) {\n                return mediaType;\n            }\n            else if (httpPayloadMember.isStringSchema()) {\n                return \"text/plain\";\n            }\n            else if (httpPayloadMember.isBlobSchema()) {\n                return \"application/octet-stream\";\n            }\n            else {\n                return defaultContentType;\n            }\n        }\n        else if (!inputSchema.isUnitSchema()) {\n            const hasBody = Object.values(members).find((m) => {\n                const { httpQuery, httpQueryParams, httpHeader, httpLabel, httpPrefixHeaders } = m.getMergedTraits();\n                const noPrefixHeaders = httpPrefixHeaders === void 0;\n                return !httpQuery && !httpQueryParams && !httpHeader && !httpLabel && noPrefixHeaders;\n            });\n            if (hasBody) {\n                return defaultContentType;\n            }\n        }\n    }\n    async getErrorSchemaOrThrowBaseException(errorIdentifier, defaultNamespace, response, dataObject, metadata, getErrorSchema) {\n        let namespace = defaultNamespace;\n        let errorName = errorIdentifier;\n        if (errorIdentifier.includes(\"#\")) {\n            [namespace, errorName] = errorIdentifier.split(\"#\");\n        }\n        const errorMetadata = {\n            $metadata: metadata,\n            $fault: response.statusCode < 500 ? \"client\" : \"server\",\n        };\n        const registry = TypeRegistry.for(namespace);\n        try {\n            const errorSchema = getErrorSchema?.(registry, errorName) ?? registry.getSchema(errorIdentifier);\n            return { errorSchema, errorMetadata };\n        }\n        catch (e) {\n            dataObject.message = dataObject.message ?? dataObject.Message ?? \"UnknownError\";\n            const synthetic = TypeRegistry.for(\"smithy.ts.sdk.synthetic.\" + namespace);\n            const baseExceptionSchema = synthetic.getBaseException();\n            if (baseExceptionSchema) {\n                const ErrorCtor = synthetic.getErrorCtor(baseExceptionSchema) ?? Error;\n                throw this.decorateServiceException(Object.assign(new ErrorCtor({ name: errorName }), errorMetadata), dataObject);\n            }\n            throw this.decorateServiceException(Object.assign(new Error(errorName), errorMetadata), dataObject);\n        }\n    }\n    decorateServiceException(exception, additions = {}) {\n        if (this.queryCompat) {\n            const msg = exception.Message ?? additions.Message;\n            const error = decorateServiceException(exception, additions);\n            if (msg) {\n                error.message = msg;\n            }\n            error.Error = {\n                ...error.Error,\n                Type: error.Error?.Type,\n                Code: error.Error?.Code,\n                Message: error.Error?.message ?? error.Error?.Message ?? msg,\n            };\n            const reqId = error.$metadata.requestId;\n            if (reqId) {\n                error.RequestId = reqId;\n            }\n            return error;\n        }\n        return decorateServiceException(exception, additions);\n    }\n    setQueryCompatError(output, response) {\n        const queryErrorHeader = response.headers?.[\"x-amzn-query-error\"];\n        if (output !== undefined && queryErrorHeader != null) {\n            const [Code, Type] = queryErrorHeader.split(\";\");\n            const entries = Object.entries(output);\n            const Error = {\n                Code,\n                Type,\n            };\n            Object.assign(output, Error);\n            for (const [k, v] of entries) {\n                Error[k === \"message\" ? \"Message\" : k] = v;\n            }\n            delete Error.__type;\n            output.Error = Error;\n        }\n    }\n    queryCompatOutput(queryCompatErrorData, errorData) {\n        if (queryCompatErrorData.Error) {\n            errorData.Error = queryCompatErrorData.Error;\n        }\n        if (queryCompatErrorData.Type) {\n            errorData.Type = queryCompatErrorData.Type;\n        }\n        if (queryCompatErrorData.Code) {\n            errorData.Code = queryCompatErrorData.Code;\n        }\n    }\n    findQueryCompatibleError(registry, errorName) {\n        try {\n            return registry.getSchema(errorName);\n        }\n        catch (e) {\n            return registry.find((schema) => NormalizedSchema.of(schema).getMergedTraits().awsQueryError?.[0] === errorName);\n        }\n    }\n}\n","export class SerdeContextConfig {\n    serdeContext;\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n    }\n}\n","export function determineTimestampFormat(ns, settings) {\n    if (settings.timestampFormat.useTrait) {\n        if (ns.isTimestampSchema() &&\n            (ns.getSchema() === 5 ||\n                ns.getSchema() === 6 ||\n                ns.getSchema() === 7)) {\n            return ns.getSchema();\n        }\n    }\n    const { httpLabel, httpPrefixHeaders, httpHeader, httpQuery } = ns.getMergedTraits();\n    const bindingFormat = settings.httpBindings\n        ? typeof httpPrefixHeaders === \"string\" || Boolean(httpHeader)\n            ? 6\n            : Boolean(httpQuery) || Boolean(httpLabel)\n                ? 5\n                : undefined\n        : undefined;\n    return bindingFormat ?? settings.timestampFormat.default;\n}\n","export const LazyJsonString = function LazyJsonString(val) {\n    const str = Object.assign(new String(val), {\n        deserializeJSON() {\n            return JSON.parse(String(val));\n        },\n        toString() {\n            return String(val);\n        },\n        toJSON() {\n            return String(val);\n        },\n    });\n    return str;\n};\nLazyJsonString.from = (object) => {\n    if (object && typeof object === \"object\" && (object instanceof LazyJsonString || \"deserializeJSON\" in object)) {\n        return object;\n    }\n    else if (typeof object === \"string\" || Object.getPrototypeOf(object) === String.prototype) {\n        return LazyJsonString(String(object));\n    }\n    return LazyJsonString(JSON.stringify(object));\n};\nLazyJsonString.fromObject = LazyJsonString.from;\n","export const parseBoolean = (value) => {\n    switch (value) {\n        case \"true\":\n            return true;\n        case \"false\":\n            return false;\n        default:\n            throw new Error(`Unable to parse boolean value \"${value}\"`);\n    }\n};\nexport const expectBoolean = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"number\") {\n        if (value === 0 || value === 1) {\n            logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n        }\n        if (value === 0) {\n            return false;\n        }\n        if (value === 1) {\n            return true;\n        }\n    }\n    if (typeof value === \"string\") {\n        const lower = value.toLowerCase();\n        if (lower === \"false\" || lower === \"true\") {\n            logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n        }\n        if (lower === \"false\") {\n            return false;\n        }\n        if (lower === \"true\") {\n            return true;\n        }\n    }\n    if (typeof value === \"boolean\") {\n        return value;\n    }\n    throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`);\n};\nexport const expectNumber = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"string\") {\n        const parsed = parseFloat(value);\n        if (!Number.isNaN(parsed)) {\n            if (String(parsed) !== String(value)) {\n                logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`));\n            }\n            return parsed;\n        }\n    }\n    if (typeof value === \"number\") {\n        return value;\n    }\n    throw new TypeError(`Expected number, got ${typeof value}: ${value}`);\n};\nconst MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23));\nexport const expectFloat32 = (value) => {\n    const expected = expectNumber(value);\n    if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) {\n        if (Math.abs(expected) > MAX_FLOAT) {\n            throw new TypeError(`Expected 32-bit float, got ${value}`);\n        }\n    }\n    return expected;\n};\nexport const expectLong = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (Number.isInteger(value) && !Number.isNaN(value)) {\n        return value;\n    }\n    throw new TypeError(`Expected integer, got ${typeof value}: ${value}`);\n};\nexport const expectInt = expectLong;\nexport const expectInt32 = (value) => expectSizedInt(value, 32);\nexport const expectShort = (value) => expectSizedInt(value, 16);\nexport const expectByte = (value) => expectSizedInt(value, 8);\nconst expectSizedInt = (value, size) => {\n    const expected = expectLong(value);\n    if (expected !== undefined && castInt(expected, size) !== expected) {\n        throw new TypeError(`Expected ${size}-bit integer, got ${value}`);\n    }\n    return expected;\n};\nconst castInt = (value, size) => {\n    switch (size) {\n        case 32:\n            return Int32Array.of(value)[0];\n        case 16:\n            return Int16Array.of(value)[0];\n        case 8:\n            return Int8Array.of(value)[0];\n    }\n};\nexport const expectNonNull = (value, location) => {\n    if (value === null || value === undefined) {\n        if (location) {\n            throw new TypeError(`Expected a non-null value for ${location}`);\n        }\n        throw new TypeError(\"Expected a non-null value\");\n    }\n    return value;\n};\nexport const expectObject = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"object\" && !Array.isArray(value)) {\n        return value;\n    }\n    const receivedType = Array.isArray(value) ? \"array\" : typeof value;\n    throw new TypeError(`Expected object, got ${receivedType}: ${value}`);\n};\nexport const expectString = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"string\") {\n        return value;\n    }\n    if ([\"boolean\", \"number\", \"bigint\"].includes(typeof value)) {\n        logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`));\n        return String(value);\n    }\n    throw new TypeError(`Expected string, got ${typeof value}: ${value}`);\n};\nexport const expectUnion = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    const asObject = expectObject(value);\n    const setKeys = Object.entries(asObject)\n        .filter(([, v]) => v != null)\n        .map(([k]) => k);\n    if (setKeys.length === 0) {\n        throw new TypeError(`Unions must have exactly one non-null member. None were found.`);\n    }\n    if (setKeys.length > 1) {\n        throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`);\n    }\n    return asObject;\n};\nexport const strictParseDouble = (value) => {\n    if (typeof value == \"string\") {\n        return expectNumber(parseNumber(value));\n    }\n    return expectNumber(value);\n};\nexport const strictParseFloat = strictParseDouble;\nexport const strictParseFloat32 = (value) => {\n    if (typeof value == \"string\") {\n        return expectFloat32(parseNumber(value));\n    }\n    return expectFloat32(value);\n};\nconst NUMBER_REGEX = /(-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(-?Infinity)|(NaN)/g;\nconst parseNumber = (value) => {\n    const matches = value.match(NUMBER_REGEX);\n    if (matches === null || matches[0].length !== value.length) {\n        throw new TypeError(`Expected real number, got implicit NaN`);\n    }\n    return parseFloat(value);\n};\nexport const limitedParseDouble = (value) => {\n    if (typeof value == \"string\") {\n        return parseFloatString(value);\n    }\n    return expectNumber(value);\n};\nexport const handleFloat = limitedParseDouble;\nexport const limitedParseFloat = limitedParseDouble;\nexport const limitedParseFloat32 = (value) => {\n    if (typeof value == \"string\") {\n        return parseFloatString(value);\n    }\n    return expectFloat32(value);\n};\nconst parseFloatString = (value) => {\n    switch (value) {\n        case \"NaN\":\n            return NaN;\n        case \"Infinity\":\n            return Infinity;\n        case \"-Infinity\":\n            return -Infinity;\n        default:\n            throw new Error(`Unable to parse float value: ${value}`);\n    }\n};\nexport const strictParseLong = (value) => {\n    if (typeof value === \"string\") {\n        return expectLong(parseNumber(value));\n    }\n    return expectLong(value);\n};\nexport const strictParseInt = strictParseLong;\nexport const strictParseInt32 = (value) => {\n    if (typeof value === \"string\") {\n        return expectInt32(parseNumber(value));\n    }\n    return expectInt32(value);\n};\nexport const strictParseShort = (value) => {\n    if (typeof value === \"string\") {\n        return expectShort(parseNumber(value));\n    }\n    return expectShort(value);\n};\nexport const strictParseByte = (value) => {\n    if (typeof value === \"string\") {\n        return expectByte(parseNumber(value));\n    }\n    return expectByte(value);\n};\nconst stackTraceWarning = (message) => {\n    return String(new TypeError(message).stack || message)\n        .split(\"\\n\")\n        .slice(0, 5)\n        .filter((s) => !s.includes(\"stackTraceWarning\"))\n        .join(\"\\n\");\n};\nexport const logger = {\n    warn: console.warn,\n};\n","import { strictParseByte, strictParseDouble, strictParseFloat32, strictParseShort } from \"./parse-utils\";\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nexport function dateToUtcString(date) {\n    const year = date.getUTCFullYear();\n    const month = date.getUTCMonth();\n    const dayOfWeek = date.getUTCDay();\n    const dayOfMonthInt = date.getUTCDate();\n    const hoursInt = date.getUTCHours();\n    const minutesInt = date.getUTCMinutes();\n    const secondsInt = date.getUTCSeconds();\n    const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`;\n    const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`;\n    const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`;\n    const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`;\n    return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`;\n}\nconst RFC3339 = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?[zZ]$/);\nexport const parseRfc3339DateTime = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n    }\n    const match = RFC3339.exec(value);\n    if (!match) {\n        throw new TypeError(\"Invalid RFC-3339 date-time value\");\n    }\n    const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n    const year = strictParseShort(stripLeadingZeroes(yearStr));\n    const month = parseDateValue(monthStr, \"month\", 1, 12);\n    const day = parseDateValue(dayStr, \"day\", 1, 31);\n    return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n};\nconst RFC3339_WITH_OFFSET = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?(([-+]\\d{2}\\:\\d{2})|[zZ])$/);\nexport const parseRfc3339DateTimeWithOffset = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n    }\n    const match = RFC3339_WITH_OFFSET.exec(value);\n    if (!match) {\n        throw new TypeError(\"Invalid RFC-3339 date-time value\");\n    }\n    const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match;\n    const year = strictParseShort(stripLeadingZeroes(yearStr));\n    const month = parseDateValue(monthStr, \"month\", 1, 12);\n    const day = parseDateValue(dayStr, \"day\", 1, 31);\n    const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n    if (offsetStr.toUpperCase() != \"Z\") {\n        date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr));\n    }\n    return date;\n};\nconst IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? (\\d{4})$/);\nexport const parseRfc7231DateTime = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-7231 date-times must be expressed as strings\");\n    }\n    let match = IMF_FIXDATE.exec(value);\n    if (match) {\n        const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n        return buildDate(strictParseShort(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n    }\n    match = RFC_850_DATE.exec(value);\n    if (match) {\n        const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n        return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), {\n            hours,\n            minutes,\n            seconds,\n            fractionalMilliseconds,\n        }));\n    }\n    match = ASC_TIME.exec(value);\n    if (match) {\n        const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match;\n        return buildDate(strictParseShort(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n    }\n    throw new TypeError(\"Invalid RFC-7231 date-time value\");\n};\nexport const parseEpochTimestamp = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    let valueAsDouble;\n    if (typeof value === \"number\") {\n        valueAsDouble = value;\n    }\n    else if (typeof value === \"string\") {\n        valueAsDouble = strictParseDouble(value);\n    }\n    else if (typeof value === \"object\" && value.tag === 1) {\n        valueAsDouble = value.value;\n    }\n    else {\n        throw new TypeError(\"Epoch timestamps must be expressed as floating point numbers or their string representation\");\n    }\n    if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) {\n        throw new TypeError(\"Epoch timestamps must be valid, non-Infinite, non-NaN numerics\");\n    }\n    return new Date(Math.round(valueAsDouble * 1000));\n};\nconst buildDate = (year, month, day, time) => {\n    const adjustedMonth = month - 1;\n    validateDayOfMonth(year, adjustedMonth, day);\n    return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, \"hour\", 0, 23), parseDateValue(time.minutes, \"minute\", 0, 59), parseDateValue(time.seconds, \"seconds\", 0, 60), parseMilliseconds(time.fractionalMilliseconds)));\n};\nconst parseTwoDigitYear = (value) => {\n    const thisYear = new Date().getUTCFullYear();\n    const valueInThisCentury = Math.floor(thisYear / 100) * 100 + strictParseShort(stripLeadingZeroes(value));\n    if (valueInThisCentury < thisYear) {\n        return valueInThisCentury + 100;\n    }\n    return valueInThisCentury;\n};\nconst FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000;\nconst adjustRfc850Year = (input) => {\n    if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) {\n        return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds()));\n    }\n    return input;\n};\nconst parseMonthByShortName = (value) => {\n    const monthIdx = MONTHS.indexOf(value);\n    if (monthIdx < 0) {\n        throw new TypeError(`Invalid month: ${value}`);\n    }\n    return monthIdx + 1;\n};\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst validateDayOfMonth = (year, month, day) => {\n    let maxDays = DAYS_IN_MONTH[month];\n    if (month === 1 && isLeapYear(year)) {\n        maxDays = 29;\n    }\n    if (day > maxDays) {\n        throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`);\n    }\n};\nconst isLeapYear = (year) => {\n    return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n};\nconst parseDateValue = (value, type, lower, upper) => {\n    const dateVal = strictParseByte(stripLeadingZeroes(value));\n    if (dateVal < lower || dateVal > upper) {\n        throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`);\n    }\n    return dateVal;\n};\nconst parseMilliseconds = (value) => {\n    if (value === null || value === undefined) {\n        return 0;\n    }\n    return strictParseFloat32(\"0.\" + value) * 1000;\n};\nconst parseOffsetToMilliseconds = (value) => {\n    const directionStr = value[0];\n    let direction = 1;\n    if (directionStr == \"+\") {\n        direction = 1;\n    }\n    else if (directionStr == \"-\") {\n        direction = -1;\n    }\n    else {\n        throw new TypeError(`Offset direction, ${directionStr}, must be \"+\" or \"-\"`);\n    }\n    const hour = Number(value.substring(1, 3));\n    const minute = Number(value.substring(4, 6));\n    return direction * (hour * 60 + minute) * 60 * 1000;\n};\nconst stripLeadingZeroes = (value) => {\n    let idx = 0;\n    while (idx < value.length - 1 && value.charAt(idx) === \"0\") {\n        idx++;\n    }\n    if (idx === 0) {\n        return value;\n    }\n    return value.slice(idx);\n};\n","const format = /^-?\\d*(\\.\\d+)?$/;\nexport class NumericValue {\n    string;\n    type;\n    constructor(string, type) {\n        this.string = string;\n        this.type = type;\n        if (!format.test(string)) {\n            throw new Error(`@smithy/core/serde - NumericValue must only contain [0-9], at most one decimal point \".\", and an optional negation prefix \"-\".`);\n        }\n    }\n    toString() {\n        return this.string;\n    }\n    static [Symbol.hasInstance](object) {\n        if (!object || typeof object !== \"object\") {\n            return false;\n        }\n        const _nv = object;\n        return NumericValue.prototype.isPrototypeOf(object) || (_nv.type === \"bigDecimal\" && format.test(_nv.string));\n    }\n}\nexport function nv(input) {\n    return new NumericValue(String(input), \"bigDecimal\");\n}\n","export class UnionSerde {\n    from;\n    to;\n    keys;\n    constructor(from, to) {\n        this.from = from;\n        this.to = to;\n        this.keys = new Set(Object.keys(this.from).filter((k) => k !== \"__type\"));\n    }\n    mark(key) {\n        this.keys.delete(key);\n    }\n    hasUnknown() {\n        return this.keys.size === 1 && Object.keys(this.to).length === 0;\n    }\n    writeUnknown() {\n        if (this.hasUnknown()) {\n            const k = this.keys.values().next().value;\n            const v = this.from[k];\n            this.to.$unknown = [k, v];\n        }\n    }\n}\n","import { NumericValue } from \"@smithy/core/serde\";\nexport function jsonReviver(key, value, context) {\n    if (context?.source) {\n        const numericString = context.source;\n        if (typeof value === \"number\") {\n            if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER || numericString !== String(value)) {\n                const isFractional = numericString.includes(\".\");\n                if (isFractional) {\n                    return new NumericValue(numericString, \"bigDecimal\");\n                }\n                else {\n                    return BigInt(numericString);\n                }\n            }\n        }\n    }\n    return value;\n}\n","import { determineTimestampFormat } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { LazyJsonString, NumericValue, parseEpochTimestamp, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, } from \"@smithy/core/serde\";\nimport { fromBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { UnionSerde } from \"../UnionSerde\";\nimport { jsonReviver } from \"./jsonReviver\";\nimport { parseJsonBody } from \"./parseJsonBody\";\nexport class JsonShapeDeserializer extends SerdeContextConfig {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    async read(schema, data) {\n        return this._read(schema, typeof data === \"string\" ? JSON.parse(data, jsonReviver) : await parseJsonBody(data, this.serdeContext));\n    }\n    readObject(schema, data) {\n        return this._read(schema, data);\n    }\n    _read(schema, value) {\n        const isObject = value !== null && typeof value === \"object\";\n        const ns = NormalizedSchema.of(schema);\n        if (isObject) {\n            if (ns.isStructSchema()) {\n                const record = value;\n                const union = ns.isUnionSchema();\n                const out = {};\n                let nameMap = void 0;\n                const { jsonName } = this.settings;\n                if (jsonName) {\n                    nameMap = {};\n                }\n                let unionSerde;\n                if (union) {\n                    unionSerde = new UnionSerde(record, out);\n                }\n                for (const [memberName, memberSchema] of ns.structIterator()) {\n                    let fromKey = memberName;\n                    if (jsonName) {\n                        fromKey = memberSchema.getMergedTraits().jsonName ?? fromKey;\n                        nameMap[fromKey] = memberName;\n                    }\n                    if (union) {\n                        unionSerde.mark(fromKey);\n                    }\n                    if (record[fromKey] != null) {\n                        out[memberName] = this._read(memberSchema, record[fromKey]);\n                    }\n                }\n                if (union) {\n                    unionSerde.writeUnknown();\n                }\n                else if (typeof record.__type === \"string\") {\n                    for (const [k, v] of Object.entries(record)) {\n                        const t = jsonName ? nameMap[k] ?? k : k;\n                        if (!(t in out)) {\n                            out[t] = v;\n                        }\n                    }\n                }\n                return out;\n            }\n            if (Array.isArray(value) && ns.isListSchema()) {\n                const listMember = ns.getValueSchema();\n                const out = [];\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const item of value) {\n                    if (sparse || item != null) {\n                        out.push(this._read(listMember, item));\n                    }\n                }\n                return out;\n            }\n            if (ns.isMapSchema()) {\n                const mapMember = ns.getValueSchema();\n                const out = {};\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const [_k, _v] of Object.entries(value)) {\n                    if (sparse || _v != null) {\n                        out[_k] = this._read(mapMember, _v);\n                    }\n                }\n                return out;\n            }\n        }\n        if (ns.isBlobSchema() && typeof value === \"string\") {\n            return fromBase64(value);\n        }\n        const mediaType = ns.getMergedTraits().mediaType;\n        if (ns.isStringSchema() && typeof value === \"string\" && mediaType) {\n            const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n            if (isJson) {\n                return LazyJsonString.from(value);\n            }\n            return value;\n        }\n        if (ns.isTimestampSchema() && value != null) {\n            const format = determineTimestampFormat(ns, this.settings);\n            switch (format) {\n                case 5:\n                    return parseRfc3339DateTimeWithOffset(value);\n                case 6:\n                    return parseRfc7231DateTime(value);\n                case 7:\n                    return parseEpochTimestamp(value);\n                default:\n                    console.warn(\"Missing timestamp format, parsing value with Date constructor:\", value);\n                    return new Date(value);\n            }\n        }\n        if (ns.isBigIntegerSchema() && (typeof value === \"number\" || typeof value === \"string\")) {\n            return BigInt(value);\n        }\n        if (ns.isBigDecimalSchema() && value != undefined) {\n            if (value instanceof NumericValue) {\n                return value;\n            }\n            const untyped = value;\n            if (untyped.type === \"bigDecimal\" && \"string\" in untyped) {\n                return new NumericValue(untyped.string, untyped.type);\n            }\n            return new NumericValue(String(value), \"bigDecimal\");\n        }\n        if (ns.isNumericSchema() && typeof value === \"string\") {\n            switch (value) {\n                case \"Infinity\":\n                    return Infinity;\n                case \"-Infinity\":\n                    return -Infinity;\n                case \"NaN\":\n                    return NaN;\n            }\n            return value;\n        }\n        if (ns.isDocumentSchema()) {\n            if (isObject) {\n                const out = Array.isArray(value) ? [] : {};\n                for (const [k, v] of Object.entries(value)) {\n                    if (v instanceof NumericValue) {\n                        out[k] = v;\n                    }\n                    else {\n                        out[k] = this._read(ns, v);\n                    }\n                }\n                return out;\n            }\n            else {\n                return structuredClone(value);\n            }\n        }\n        return value;\n    }\n}\n","import { collectBodyString } from \"../common\";\nexport const parseJsonBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n    if (encoded.length) {\n        try {\n            return JSON.parse(encoded);\n        }\n        catch (e) {\n            if (e?.name === \"SyntaxError\") {\n                Object.defineProperty(e, \"$responseBodyText\", {\n                    value: encoded,\n                });\n            }\n            throw e;\n        }\n    }\n    return {};\n});\nexport const parseJsonErrorBody = async (errorBody, context) => {\n    const value = await parseJsonBody(errorBody, context);\n    value.message = value.message ?? value.Message;\n    return value;\n};\nexport const loadRestJsonErrorCode = (output, data) => {\n    const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\n    const sanitizeErrorCode = (rawValue) => {\n        let cleanValue = rawValue;\n        if (typeof cleanValue === \"number\") {\n            cleanValue = cleanValue.toString();\n        }\n        if (cleanValue.indexOf(\",\") >= 0) {\n            cleanValue = cleanValue.split(\",\")[0];\n        }\n        if (cleanValue.indexOf(\":\") >= 0) {\n            cleanValue = cleanValue.split(\":\")[0];\n        }\n        if (cleanValue.indexOf(\"#\") >= 0) {\n            cleanValue = cleanValue.split(\"#\")[1];\n        }\n        return cleanValue;\n    };\n    const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n    if (headerKey !== undefined) {\n        return sanitizeErrorCode(output.headers[headerKey]);\n    }\n    if (data && typeof data === \"object\") {\n        const codeKey = findKey(data, \"code\");\n        if (codeKey && data[codeKey] !== undefined) {\n            return sanitizeErrorCode(data[codeKey]);\n        }\n        if (data[\"__type\"] !== undefined) {\n            return sanitizeErrorCode(data[\"__type\"]);\n        }\n    }\n};\n","import { collectBody } from \"@smithy/smithy-client\";\nimport { toUtf8 } from \"@smithy/util-utf8\";\nexport const collectBodyString = (streamBody, context) => collectBody(streamBody, context).then((body) => (context?.utf8Encoder ?? toUtf8)(body));\n","import { NumericValue } from \"@smithy/core/serde\";\nconst NUMERIC_CONTROL_CHAR = String.fromCharCode(925);\nexport class JsonReplacer {\n    values = new Map();\n    counter = 0;\n    stage = 0;\n    createReplacer() {\n        if (this.stage === 1) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer already created.\");\n        }\n        if (this.stage === 2) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer exhausted.\");\n        }\n        this.stage = 1;\n        return (key, value) => {\n            if (value instanceof NumericValue) {\n                const v = `${NUMERIC_CONTROL_CHAR + \"nv\" + this.counter++}_` + value.string;\n                this.values.set(`\"${v}\"`, value.string);\n                return v;\n            }\n            if (typeof value === \"bigint\") {\n                const s = value.toString();\n                const v = `${NUMERIC_CONTROL_CHAR + \"b\" + this.counter++}_` + s;\n                this.values.set(`\"${v}\"`, s);\n                return v;\n            }\n            return value;\n        };\n    }\n    replaceInJson(json) {\n        if (this.stage === 0) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer not created yet.\");\n        }\n        if (this.stage === 2) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer exhausted.\");\n        }\n        this.stage = 2;\n        if (this.counter === 0) {\n            return json;\n        }\n        for (const [key, value] of this.values) {\n            json = json.replace(key, value);\n        }\n        return json;\n    }\n}\n","import { determineTimestampFormat } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { dateToUtcString, generateIdempotencyToken, LazyJsonString, NumericValue } from \"@smithy/core/serde\";\nimport { toBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { JsonReplacer } from \"./jsonReplacer\";\nexport class JsonShapeSerializer extends SerdeContextConfig {\n    settings;\n    buffer;\n    useReplacer = false;\n    rootSchema;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    write(schema, value) {\n        this.rootSchema = NormalizedSchema.of(schema);\n        this.buffer = this._write(this.rootSchema, value);\n    }\n    writeDiscriminatedDocument(schema, value) {\n        this.write(schema, value);\n        if (typeof this.buffer === \"object\") {\n            this.buffer.__type = NormalizedSchema.of(schema).getName(true);\n        }\n    }\n    flush() {\n        const { rootSchema, useReplacer } = this;\n        this.rootSchema = undefined;\n        this.useReplacer = false;\n        if (rootSchema?.isStructSchema() || rootSchema?.isDocumentSchema()) {\n            if (!useReplacer) {\n                return JSON.stringify(this.buffer);\n            }\n            const replacer = new JsonReplacer();\n            return replacer.replaceInJson(JSON.stringify(this.buffer, replacer.createReplacer(), 0));\n        }\n        return this.buffer;\n    }\n    _write(schema, value, container) {\n        const isObject = value !== null && typeof value === \"object\";\n        const ns = NormalizedSchema.of(schema);\n        if (isObject) {\n            if (ns.isStructSchema()) {\n                const record = value;\n                const out = {};\n                const { jsonName } = this.settings;\n                let nameMap = void 0;\n                if (jsonName) {\n                    nameMap = {};\n                }\n                for (const [memberName, memberSchema] of ns.structIterator()) {\n                    const serializableValue = this._write(memberSchema, record[memberName], ns);\n                    if (serializableValue !== undefined) {\n                        let targetKey = memberName;\n                        if (jsonName) {\n                            targetKey = memberSchema.getMergedTraits().jsonName ?? memberName;\n                            nameMap[memberName] = targetKey;\n                        }\n                        out[targetKey] = serializableValue;\n                    }\n                }\n                if (ns.isUnionSchema() && Object.keys(out).length === 0) {\n                    const { $unknown } = record;\n                    if (Array.isArray($unknown)) {\n                        const [k, v] = $unknown;\n                        out[k] = this._write(15, v);\n                    }\n                }\n                else if (typeof record.__type === \"string\") {\n                    for (const [k, v] of Object.entries(record)) {\n                        const targetKey = jsonName ? nameMap[k] ?? k : k;\n                        if (!(targetKey in out)) {\n                            out[targetKey] = this._write(15, v);\n                        }\n                    }\n                }\n                return out;\n            }\n            if (Array.isArray(value) && ns.isListSchema()) {\n                const listMember = ns.getValueSchema();\n                const out = [];\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const item of value) {\n                    if (sparse || item != null) {\n                        out.push(this._write(listMember, item));\n                    }\n                }\n                return out;\n            }\n            if (ns.isMapSchema()) {\n                const mapMember = ns.getValueSchema();\n                const out = {};\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const [_k, _v] of Object.entries(value)) {\n                    if (sparse || _v != null) {\n                        out[_k] = this._write(mapMember, _v);\n                    }\n                }\n                return out;\n            }\n            if (value instanceof Uint8Array && (ns.isBlobSchema() || ns.isDocumentSchema())) {\n                if (ns === this.rootSchema) {\n                    return value;\n                }\n                return (this.serdeContext?.base64Encoder ?? toBase64)(value);\n            }\n            if (value instanceof Date && (ns.isTimestampSchema() || ns.isDocumentSchema())) {\n                const format = determineTimestampFormat(ns, this.settings);\n                switch (format) {\n                    case 5:\n                        return value.toISOString().replace(\".000Z\", \"Z\");\n                    case 6:\n                        return dateToUtcString(value);\n                    case 7:\n                        return value.getTime() / 1000;\n                    default:\n                        console.warn(\"Missing timestamp format, using epoch seconds\", value);\n                        return value.getTime() / 1000;\n                }\n            }\n            if (value instanceof NumericValue) {\n                this.useReplacer = true;\n            }\n        }\n        if (value === null && container?.isStructSchema()) {\n            return void 0;\n        }\n        if (ns.isStringSchema()) {\n            if (typeof value === \"undefined\" && ns.isIdempotencyToken()) {\n                return generateIdempotencyToken();\n            }\n            const mediaType = ns.getMergedTraits().mediaType;\n            if (value != null && mediaType) {\n                const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n                if (isJson) {\n                    return LazyJsonString.from(value);\n                }\n            }\n            return value;\n        }\n        if (typeof value === \"number\" && ns.isNumericSchema()) {\n            if (Math.abs(value) === Infinity || isNaN(value)) {\n                return String(value);\n            }\n            return value;\n        }\n        if (typeof value === \"string\" && ns.isBlobSchema()) {\n            if (ns === this.rootSchema) {\n                return value;\n            }\n            return (this.serdeContext?.base64Encoder ?? toBase64)(value);\n        }\n        if (typeof value === \"bigint\") {\n            this.useReplacer = true;\n        }\n        if (ns.isDocumentSchema()) {\n            if (isObject) {\n                const out = Array.isArray(value) ? [] : {};\n                for (const [k, v] of Object.entries(value)) {\n                    if (v instanceof NumericValue) {\n                        this.useReplacer = true;\n                        out[k] = v;\n                    }\n                    else {\n                        out[k] = this._write(ns, v);\n                    }\n                }\n                return out;\n            }\n            else {\n                return structuredClone(value);\n            }\n        }\n        return value;\n    }\n}\n","import { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { JsonShapeDeserializer } from \"./JsonShapeDeserializer\";\nimport { JsonShapeSerializer } from \"./JsonShapeSerializer\";\nexport class JsonCodec extends SerdeContextConfig {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    createSerializer() {\n        const serializer = new JsonShapeSerializer(this.settings);\n        serializer.setSerdeContext(this.serdeContext);\n        return serializer;\n    }\n    createDeserializer() {\n        const deserializer = new JsonShapeDeserializer(this.settings);\n        deserializer.setSerdeContext(this.serdeContext);\n        return deserializer;\n    }\n}\n","import { RpcProtocol } from \"@smithy/core/protocols\";\nimport { deref, NormalizedSchema, TypeRegistry } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nimport { JsonCodec } from \"./JsonCodec\";\nimport { loadRestJsonErrorCode } from \"./parseJsonBody\";\nexport class AwsJsonRpcProtocol extends RpcProtocol {\n    serializer;\n    deserializer;\n    serviceTarget;\n    codec;\n    mixin;\n    awsQueryCompatible;\n    constructor({ defaultNamespace, serviceTarget, awsQueryCompatible, jsonCodec, }) {\n        super({\n            defaultNamespace,\n        });\n        this.serviceTarget = serviceTarget;\n        this.codec =\n            jsonCodec ??\n                new JsonCodec({\n                    timestampFormat: {\n                        useTrait: true,\n                        default: 7,\n                    },\n                    jsonName: false,\n                });\n        this.serializer = this.codec.createSerializer();\n        this.deserializer = this.codec.createDeserializer();\n        this.awsQueryCompatible = !!awsQueryCompatible;\n        this.mixin = new ProtocolLib(this.awsQueryCompatible);\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        if (!request.path.endsWith(\"/\")) {\n            request.path += \"/\";\n        }\n        Object.assign(request.headers, {\n            \"content-type\": `application/x-amz-json-${this.getJsonRpcVersion()}`,\n            \"x-amz-target\": `${this.serviceTarget}.${operationSchema.name}`,\n        });\n        if (this.awsQueryCompatible) {\n            request.headers[\"x-amzn-query-mode\"] = \"true\";\n        }\n        if (deref(operationSchema.input) === \"unit\" || !request.body) {\n            request.body = \"{}\";\n        }\n        return request;\n    }\n    getPayloadCodec() {\n        return this.codec;\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        if (this.awsQueryCompatible) {\n            this.mixin.setQueryCompatError(dataObject, response);\n        }\n        const errorIdentifier = loadRestJsonErrorCode(response, dataObject) ?? \"Unknown\";\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata, this.awsQueryCompatible ? this.mixin.findQueryCompatibleError : undefined);\n        const ns = NormalizedSchema.of(errorSchema);\n        const message = dataObject.message ?? dataObject.Message ?? \"Unknown\";\n        const ErrorCtor = TypeRegistry.for(errorSchema[1]).getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        const output = {};\n        for (const [name, member] of ns.structIterator()) {\n            if (dataObject[name] != null) {\n                output[name] = this.codec.createDeserializer().readObject(member, dataObject[name]);\n            }\n        }\n        if (this.awsQueryCompatible) {\n            this.mixin.queryCompatOutput(dataObject, output);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n}\n","import { AwsJsonRpcProtocol } from \"./AwsJsonRpcProtocol\";\nexport class AwsJson1_1Protocol extends AwsJsonRpcProtocol {\n    constructor({ defaultNamespace, serviceTarget, awsQueryCompatible, jsonCodec, }) {\n        super({\n            defaultNamespace,\n            serviceTarget,\n            awsQueryCompatible,\n            jsonCodec,\n        });\n    }\n    getShapeId() {\n        return \"aws.protocols#awsJson1_1\";\n    }\n    getJsonRpcVersion() {\n        return \"1.1\";\n    }\n    getDefaultContentType() {\n        return \"application/x-amz-json-1.1\";\n    }\n}\n","export class NoAuthSigner {\n    async sign(httpRequest, identity, signingProperties) {\n        return httpRequest;\n    }\n}\n","export const debugId = \"endpoints\";\n","export function toDebugString(input) {\n    if (typeof input !== \"object\" || input == null) {\n        return input;\n    }\n    if (\"ref\" in input) {\n        return `$${toDebugString(input.ref)}`;\n    }\n    if (\"fn\" in input) {\n        return `${input.fn}(${(input.argv || []).map(toDebugString).join(\", \")})`;\n    }\n    return JSON.stringify(input, null, 2);\n}\n","export class EndpointError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"EndpointError\";\n    }\n}\n","export const booleanEquals = (value1, value2) => value1 === value2;\n","import { EndpointError } from \"../types\";\nimport { getAttrPathList } from \"./getAttrPathList\";\nexport const getAttr = (value, path) => getAttrPathList(path).reduce((acc, index) => {\n    if (typeof acc !== \"object\") {\n        throw new EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`);\n    }\n    else if (Array.isArray(acc)) {\n        return acc[parseInt(index)];\n    }\n    return acc[index];\n}, value);\n","import { EndpointError } from \"../types\";\nexport const getAttrPathList = (path) => {\n    const parts = path.split(\".\");\n    const pathList = [];\n    for (const part of parts) {\n        const squareBracketIndex = part.indexOf(\"[\");\n        if (squareBracketIndex !== -1) {\n            if (part.indexOf(\"]\") !== part.length - 1) {\n                throw new EndpointError(`Path: '${path}' does not end with ']'`);\n            }\n            const arrayIndex = part.slice(squareBracketIndex + 1, -1);\n            if (Number.isNaN(parseInt(arrayIndex))) {\n                throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`);\n            }\n            if (squareBracketIndex !== 0) {\n                pathList.push(part.slice(0, squareBracketIndex));\n            }\n            pathList.push(arrayIndex);\n        }\n        else {\n            pathList.push(part);\n        }\n    }\n    return pathList;\n};\n","export var EndpointURLScheme;\n(function (EndpointURLScheme) {\n    EndpointURLScheme[\"HTTP\"] = \"http\";\n    EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme || (EndpointURLScheme = {}));\n","import { EndpointURLScheme } from \"@smithy/types\";\nimport { isIpAddress } from \"./isIpAddress\";\nconst DEFAULT_PORTS = {\n    [EndpointURLScheme.HTTP]: 80,\n    [EndpointURLScheme.HTTPS]: 443,\n};\nexport const parseURL = (value) => {\n    const whatwgURL = (() => {\n        try {\n            if (value instanceof URL) {\n                return value;\n            }\n            if (typeof value === \"object\" && \"hostname\" in value) {\n                const { hostname, port, protocol = \"\", path = \"\", query = {} } = value;\n                const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : \"\"}${path}`);\n                url.search = Object.entries(query)\n                    .map(([k, v]) => `${k}=${v}`)\n                    .join(\"&\");\n                return url;\n            }\n            return new URL(value);\n        }\n        catch (error) {\n            return null;\n        }\n    })();\n    if (!whatwgURL) {\n        console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`);\n        return null;\n    }\n    const urlString = whatwgURL.href;\n    const { host, hostname, pathname, protocol, search } = whatwgURL;\n    if (search) {\n        return null;\n    }\n    const scheme = protocol.slice(0, -1);\n    if (!Object.values(EndpointURLScheme).includes(scheme)) {\n        return null;\n    }\n    const isIp = isIpAddress(hostname);\n    const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) ||\n        (typeof value === \"string\" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`));\n    const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`;\n    return {\n        scheme,\n        authority,\n        path: pathname,\n        normalizedPath: pathname.endsWith(\"/\") ? pathname : `${pathname}/`,\n        isIp,\n    };\n};\n","import { booleanEquals, getAttr, isSet, isValidHostLabel, not, parseURL, stringEquals, substring, uriEncode, } from \"../lib\";\nexport const endpointFunctions = {\n    booleanEquals,\n    getAttr,\n    isSet,\n    isValidHostLabel,\n    not,\n    parseURL,\n    stringEquals,\n    substring,\n    uriEncode,\n};\n","export const isSet = (value) => value != null;\n","export const not = (value) => !value;\n","export const stringEquals = (value1, value2) => value1 === value2;\n","export const substring = (input, start, stop, reverse) => {\n    if (start >= stop || input.length < stop || /[^\\u0000-\\u007f]/.test(input)) {\n        return null;\n    }\n    if (!reverse) {\n        return input.substring(start, stop);\n    }\n    return input.substring(input.length - stop, input.length - start);\n};\n","export const uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\n","import { getAttr } from \"../lib\";\nexport const evaluateTemplate = (template, options) => {\n    const evaluatedTemplateArr = [];\n    const templateContext = {\n        ...options.endpointParams,\n        ...options.referenceRecord,\n    };\n    let currentIndex = 0;\n    while (currentIndex < template.length) {\n        const openingBraceIndex = template.indexOf(\"{\", currentIndex);\n        if (openingBraceIndex === -1) {\n            evaluatedTemplateArr.push(template.slice(currentIndex));\n            break;\n        }\n        evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex));\n        const closingBraceIndex = template.indexOf(\"}\", openingBraceIndex);\n        if (closingBraceIndex === -1) {\n            evaluatedTemplateArr.push(template.slice(openingBraceIndex));\n            break;\n        }\n        if (template[openingBraceIndex + 1] === \"{\" && template[closingBraceIndex + 1] === \"}\") {\n            evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex));\n            currentIndex = closingBraceIndex + 2;\n        }\n        const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex);\n        if (parameterName.includes(\"#\")) {\n            const [refName, attrName] = parameterName.split(\"#\");\n            evaluatedTemplateArr.push(getAttr(templateContext[refName], attrName));\n        }\n        else {\n            evaluatedTemplateArr.push(templateContext[parameterName]);\n        }\n        currentIndex = closingBraceIndex + 1;\n    }\n    return evaluatedTemplateArr.join(\"\");\n};\n","import { EndpointError } from \"../types\";\nimport { customEndpointFunctions } from \"./customEndpointFunctions\";\nimport { endpointFunctions } from \"./endpointFunctions\";\nimport { evaluateTemplate } from \"./evaluateTemplate\";\nimport { getReferenceValue } from \"./getReferenceValue\";\nexport const evaluateExpression = (obj, keyName, options) => {\n    if (typeof obj === \"string\") {\n        return evaluateTemplate(obj, options);\n    }\n    else if (obj[\"fn\"]) {\n        return group.callFunction(obj, options);\n    }\n    else if (obj[\"ref\"]) {\n        return getReferenceValue(obj, options);\n    }\n    throw new EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`);\n};\nexport const callFunction = ({ fn, argv }, options) => {\n    const evaluatedArgs = argv.map((arg) => [\"boolean\", \"number\"].includes(typeof arg) ? arg : group.evaluateExpression(arg, \"arg\", options));\n    const fnSegments = fn.split(\".\");\n    if (fnSegments[0] in customEndpointFunctions && fnSegments[1] != null) {\n        return customEndpointFunctions[fnSegments[0]][fnSegments[1]](...evaluatedArgs);\n    }\n    return endpointFunctions[fn](...evaluatedArgs);\n};\nexport const group = {\n    evaluateExpression,\n    callFunction,\n};\n","export const getReferenceValue = ({ ref }, options) => {\n    const referenceRecord = {\n        ...options.endpointParams,\n        ...options.referenceRecord,\n    };\n    return referenceRecord[ref];\n};\n","import { debugId, toDebugString } from \"../debug\";\nimport { EndpointError } from \"../types\";\nimport { callFunction } from \"./callFunction\";\nexport const evaluateCondition = ({ assign, ...fnArgs }, options) => {\n    if (assign && assign in options.referenceRecord) {\n        throw new EndpointError(`'${assign}' is already defined in Reference Record.`);\n    }\n    const value = callFunction(fnArgs, options);\n    options.logger?.debug?.(`${debugId} evaluateCondition: ${toDebugString(fnArgs)} = ${toDebugString(value)}`);\n    return {\n        result: value === \"\" ? true : !!value,\n        ...(assign != null && { toAssign: { name: assign, value } }),\n    };\n};\n","import { debugId, toDebugString } from \"../debug\";\nimport { evaluateCondition } from \"./evaluateCondition\";\nexport const evaluateConditions = (conditions = [], options) => {\n    const conditionsReferenceRecord = {};\n    for (const condition of conditions) {\n        const { result, toAssign } = evaluateCondition(condition, {\n            ...options,\n            referenceRecord: {\n                ...options.referenceRecord,\n                ...conditionsReferenceRecord,\n            },\n        });\n        if (!result) {\n            return { result };\n        }\n        if (toAssign) {\n            conditionsReferenceRecord[toAssign.name] = toAssign.value;\n            options.logger?.debug?.(`${debugId} assign: ${toAssign.name} := ${toDebugString(toAssign.value)}`);\n        }\n    }\n    return { result: true, referenceRecord: conditionsReferenceRecord };\n};\n","import { EndpointError } from \"../types\";\nimport { evaluateExpression } from \"./evaluateExpression\";\nexport const getEndpointHeaders = (headers, options) => Object.entries(headers).reduce((acc, [headerKey, headerVal]) => ({\n    ...acc,\n    [headerKey]: headerVal.map((headerValEntry) => {\n        const processedExpr = evaluateExpression(headerValEntry, \"Header value entry\", options);\n        if (typeof processedExpr !== \"string\") {\n            throw new EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`);\n        }\n        return processedExpr;\n    }),\n}), {});\n","import { EndpointError } from \"../types\";\nimport { evaluateTemplate } from \"./evaluateTemplate\";\nexport const getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => ({\n    ...acc,\n    [propertyKey]: group.getEndpointProperty(propertyVal, options),\n}), {});\nexport const getEndpointProperty = (property, options) => {\n    if (Array.isArray(property)) {\n        return property.map((propertyEntry) => getEndpointProperty(propertyEntry, options));\n    }\n    switch (typeof property) {\n        case \"string\":\n            return evaluateTemplate(property, options);\n        case \"object\":\n            if (property === null) {\n                throw new EndpointError(`Unexpected endpoint property: ${property}`);\n            }\n            return group.getEndpointProperties(property, options);\n        case \"boolean\":\n            return property;\n        default:\n            throw new EndpointError(`Unexpected endpoint property type: ${typeof property}`);\n    }\n};\nexport const group = {\n    getEndpointProperty,\n    getEndpointProperties,\n};\n","import { EndpointError } from \"../types\";\nimport { evaluateExpression } from \"./evaluateExpression\";\nexport const getEndpointUrl = (endpointUrl, options) => {\n    const expression = evaluateExpression(endpointUrl, \"Endpoint URL\", options);\n    if (typeof expression === \"string\") {\n        try {\n            return new URL(expression);\n        }\n        catch (error) {\n            console.error(`Failed to construct URL with ${expression}`, error);\n            throw error;\n        }\n    }\n    throw new EndpointError(`Endpoint URL must be a string, got ${typeof expression}`);\n};\n","import { debugId, toDebugString } from \"../debug\";\nimport { evaluateConditions } from \"./evaluateConditions\";\nimport { getEndpointHeaders } from \"./getEndpointHeaders\";\nimport { getEndpointProperties } from \"./getEndpointProperties\";\nimport { getEndpointUrl } from \"./getEndpointUrl\";\nexport const evaluateEndpointRule = (endpointRule, options) => {\n    const { conditions, endpoint } = endpointRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    const endpointRuleOptions = {\n        ...options,\n        referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n    };\n    const { url, properties, headers } = endpoint;\n    options.logger?.debug?.(`${debugId} Resolving endpoint from template: ${toDebugString(endpoint)}`);\n    return {\n        ...(headers != undefined && {\n            headers: getEndpointHeaders(headers, endpointRuleOptions),\n        }),\n        ...(properties != undefined && {\n            properties: getEndpointProperties(properties, endpointRuleOptions),\n        }),\n        url: getEndpointUrl(url, endpointRuleOptions),\n    };\n};\n","import { EndpointError } from \"../types\";\nimport { evaluateConditions } from \"./evaluateConditions\";\nimport { evaluateExpression } from \"./evaluateExpression\";\nexport const evaluateErrorRule = (errorRule, options) => {\n    const { conditions, error } = errorRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    throw new EndpointError(evaluateExpression(error, \"Error\", {\n        ...options,\n        referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n    }));\n};\n","import { EndpointError } from \"../types\";\nimport { evaluateConditions } from \"./evaluateConditions\";\nimport { evaluateEndpointRule } from \"./evaluateEndpointRule\";\nimport { evaluateErrorRule } from \"./evaluateErrorRule\";\nexport const evaluateRules = (rules, options) => {\n    for (const rule of rules) {\n        if (rule.type === \"endpoint\") {\n            const endpointOrUndefined = evaluateEndpointRule(rule, options);\n            if (endpointOrUndefined) {\n                return endpointOrUndefined;\n            }\n        }\n        else if (rule.type === \"error\") {\n            evaluateErrorRule(rule, options);\n        }\n        else if (rule.type === \"tree\") {\n            const endpointOrUndefined = group.evaluateTreeRule(rule, options);\n            if (endpointOrUndefined) {\n                return endpointOrUndefined;\n            }\n        }\n        else {\n            throw new EndpointError(`Unknown endpoint rule: ${rule}`);\n        }\n    }\n    throw new EndpointError(`Rules evaluation failed`);\n};\nexport const evaluateTreeRule = (treeRule, options) => {\n    const { conditions, rules } = treeRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    return group.evaluateRules(rules, {\n        ...options,\n        referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n    });\n};\nexport const group = {\n    evaluateRules,\n    evaluateTreeRule,\n};\n","const w = \"required\", x = \"fn\", y = \"argv\", z = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = \"getAttr\", i = \"stringEquals\", j = { [w]: false, \"type\": \"string\" }, k = { [w]: true, \"default\": false, \"type\": \"boolean\" }, l = { [z]: \"Endpoint\" }, m = { [x]: c, [y]: [{ [z]: \"UseFIPS\" }, true] }, n = { [x]: c, [y]: [{ [z]: \"UseDualStack\" }, true] }, o = {}, p = { [z]: \"Region\" }, q = { [x]: h, [y]: [{ [z]: g }, \"supportsFIPS\"] }, r = { [z]: g }, s = { [x]: c, [y]: [true, { [x]: h, [y]: [r, \"supportsDualStack\"] }] }, t = [m], u = [n], v = [p];\nconst _data = { version: \"1.0\", parameters: { Region: j, UseDualStack: k, UseFIPS: k, Endpoint: j }, rules: [{ conditions: [{ [x]: b, [y]: [l] }], rules: [{ conditions: t, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: u, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: l, properties: o, headers: o }, type: e }], type: f }, { conditions: [{ [x]: b, [y]: v }], rules: [{ conditions: [{ [x]: \"aws.partition\", [y]: v, assign: g }], rules: [{ conditions: [m, n], rules: [{ conditions: [{ [x]: c, [y]: [a, q] }, s], rules: [{ conditions: [{ [x]: i, [y]: [p, \"us-east-1\"] }], endpoint: { url: \"https://cognito-idp-fips.us-east-1.amazonaws.com\", properties: o, headers: o }, type: e }, { conditions: [{ [x]: i, [y]: [p, \"us-east-2\"] }], endpoint: { url: \"https://cognito-idp-fips.us-east-2.amazonaws.com\", properties: o, headers: o }, type: e }, { conditions: [{ [x]: i, [y]: [p, \"us-west-1\"] }], endpoint: { url: \"https://cognito-idp-fips.us-west-1.amazonaws.com\", properties: o, headers: o }, type: e }, { conditions: [{ [x]: i, [y]: [p, \"us-west-2\"] }], endpoint: { url: \"https://cognito-idp-fips.us-west-2.amazonaws.com\", properties: o, headers: o }, type: e }, { endpoint: { url: \"https://cognito-idp-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: o, headers: o }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: t, rules: [{ conditions: [{ [x]: c, [y]: [q, a] }], rules: [{ endpoint: { url: \"https://cognito-idp-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: o, headers: o }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: u, rules: [{ conditions: [s], rules: [{ conditions: [{ [x]: i, [y]: [\"aws\", { [x]: h, [y]: [r, \"name\"] }] }], endpoint: { url: \"https://cognito-idp.{Region}.amazonaws.com\", properties: o, headers: o }, type: e }, { endpoint: { url: \"https://cognito-idp.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: o, headers: o }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://cognito-idp.{Region}.{PartitionResult#dnsSuffix}\", properties: o, headers: o }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexport const ruleSet = _data;\n","import { awsEndpointFunctions } from \"@aws-sdk/util-endpoints\";\nimport { customEndpointFunctions, EndpointCache, resolveEndpoint } from \"@smithy/util-endpoints\";\nimport { ruleSet } from \"./ruleset\";\nconst cache = new EndpointCache({\n    size: 50,\n    params: [\"Endpoint\", \"Region\", \"UseDualStack\", \"UseFIPS\"],\n});\nexport const defaultEndpointResolver = (endpointParams, context = {}) => {\n    return cache.get(endpointParams, () => resolveEndpoint(ruleSet, {\n        endpointParams: endpointParams,\n        logger: context.logger,\n    }));\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n","export class EndpointCache {\n    capacity;\n    data = new Map();\n    parameters = [];\n    constructor({ size, params }) {\n        this.capacity = size ?? 50;\n        if (params) {\n            this.parameters = params;\n        }\n    }\n    get(endpointParams, resolver) {\n        const key = this.hash(endpointParams);\n        if (key === false) {\n            return resolver();\n        }\n        if (!this.data.has(key)) {\n            if (this.data.size > this.capacity + 10) {\n                const keys = this.data.keys();\n                let i = 0;\n                while (true) {\n                    const { value, done } = keys.next();\n                    this.data.delete(value);\n                    if (done || ++i > 10) {\n                        break;\n                    }\n                }\n            }\n            this.data.set(key, resolver());\n        }\n        return this.data.get(key);\n    }\n    size() {\n        return this.data.size;\n    }\n    hash(endpointParams) {\n        let buffer = \"\";\n        const { parameters } = this;\n        if (parameters.length === 0) {\n            return false;\n        }\n        for (const param of parameters) {\n            const val = String(endpointParams[param] ?? \"\");\n            if (val.includes(\"|;\")) {\n                return false;\n            }\n            buffer += val + \"|;\";\n        }\n        return buffer;\n    }\n}\n","import { debugId, toDebugString } from \"./debug\";\nimport { EndpointError } from \"./types\";\nimport { evaluateRules } from \"./utils\";\nexport const resolveEndpoint = (ruleSetObject, options) => {\n    const { endpointParams, logger } = options;\n    const { parameters, rules } = ruleSetObject;\n    options.logger?.debug?.(`${debugId} Initial EndpointParams: ${toDebugString(endpointParams)}`);\n    const paramsWithDefault = Object.entries(parameters)\n        .filter(([, v]) => v.default != null)\n        .map(([k, v]) => [k, v.default]);\n    if (paramsWithDefault.length > 0) {\n        for (const [paramKey, paramDefaultValue] of paramsWithDefault) {\n            endpointParams[paramKey] = endpointParams[paramKey] ?? paramDefaultValue;\n        }\n    }\n    const requiredParams = Object.entries(parameters)\n        .filter(([, v]) => v.required)\n        .map(([k]) => k);\n    for (const requiredParam of requiredParams) {\n        if (endpointParams[requiredParam] == null) {\n            throw new EndpointError(`Missing required parameter: '${requiredParam}'`);\n        }\n    }\n    const endpoint = evaluateRules(rules, { endpointParams, logger, referenceRecord: {} });\n    options.logger?.debug?.(`${debugId} Resolved endpoint: ${toDebugString(endpoint)}`);\n    return endpoint;\n};\n","import { ServiceException as __ServiceException, } from \"@smithy/smithy-client\";\nexport { __ServiceException };\nexport class CognitoIdentityProviderServiceException extends __ServiceException {\n    constructor(options) {\n        super(options);\n        Object.setPrototypeOf(this, CognitoIdentityProviderServiceException.prototype);\n    }\n}\n","import { CognitoIdentityProviderServiceException as __BaseException } from \"./CognitoIdentityProviderServiceException\";\nexport class InternalErrorException extends __BaseException {\n    name = \"InternalErrorException\";\n    $fault = \"server\";\n    constructor(opts) {\n        super({\n            name: \"InternalErrorException\",\n            $fault: \"server\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InternalErrorException.prototype);\n    }\n}\nexport class InvalidParameterException extends __BaseException {\n    name = \"InvalidParameterException\";\n    $fault = \"client\";\n    reasonCode;\n    constructor(opts) {\n        super({\n            name: \"InvalidParameterException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidParameterException.prototype);\n        this.reasonCode = opts.reasonCode;\n    }\n}\nexport class NotAuthorizedException extends __BaseException {\n    name = \"NotAuthorizedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"NotAuthorizedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, NotAuthorizedException.prototype);\n    }\n}\nexport class ResourceNotFoundException extends __BaseException {\n    name = \"ResourceNotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ResourceNotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n    }\n}\nexport class TooManyRequestsException extends __BaseException {\n    name = \"TooManyRequestsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"TooManyRequestsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n    }\n}\nexport class UserImportInProgressException extends __BaseException {\n    name = \"UserImportInProgressException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserImportInProgressException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserImportInProgressException.prototype);\n    }\n}\nexport class UserNotFoundException extends __BaseException {\n    name = \"UserNotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserNotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserNotFoundException.prototype);\n    }\n}\nexport class InvalidLambdaResponseException extends __BaseException {\n    name = \"InvalidLambdaResponseException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidLambdaResponseException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidLambdaResponseException.prototype);\n    }\n}\nexport class LimitExceededException extends __BaseException {\n    name = \"LimitExceededException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"LimitExceededException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, LimitExceededException.prototype);\n    }\n}\nexport class TooManyFailedAttemptsException extends __BaseException {\n    name = \"TooManyFailedAttemptsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"TooManyFailedAttemptsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TooManyFailedAttemptsException.prototype);\n    }\n}\nexport class UnexpectedLambdaException extends __BaseException {\n    name = \"UnexpectedLambdaException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnexpectedLambdaException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnexpectedLambdaException.prototype);\n    }\n}\nexport class UserLambdaValidationException extends __BaseException {\n    name = \"UserLambdaValidationException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserLambdaValidationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserLambdaValidationException.prototype);\n    }\n}\nexport class CodeDeliveryFailureException extends __BaseException {\n    name = \"CodeDeliveryFailureException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"CodeDeliveryFailureException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, CodeDeliveryFailureException.prototype);\n    }\n}\nexport class InvalidPasswordException extends __BaseException {\n    name = \"InvalidPasswordException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidPasswordException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidPasswordException.prototype);\n    }\n}\nexport class InvalidSmsRoleAccessPolicyException extends __BaseException {\n    name = \"InvalidSmsRoleAccessPolicyException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidSmsRoleAccessPolicyException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidSmsRoleAccessPolicyException.prototype);\n    }\n}\nexport class InvalidSmsRoleTrustRelationshipException extends __BaseException {\n    name = \"InvalidSmsRoleTrustRelationshipException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidSmsRoleTrustRelationshipException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidSmsRoleTrustRelationshipException.prototype);\n    }\n}\nexport class PreconditionNotMetException extends __BaseException {\n    name = \"PreconditionNotMetException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"PreconditionNotMetException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, PreconditionNotMetException.prototype);\n    }\n}\nexport class UnsupportedUserStateException extends __BaseException {\n    name = \"UnsupportedUserStateException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnsupportedUserStateException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnsupportedUserStateException.prototype);\n    }\n}\nexport class UsernameExistsException extends __BaseException {\n    name = \"UsernameExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UsernameExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UsernameExistsException.prototype);\n    }\n}\nexport class AliasExistsException extends __BaseException {\n    name = \"AliasExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"AliasExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, AliasExistsException.prototype);\n    }\n}\nexport class InvalidUserPoolConfigurationException extends __BaseException {\n    name = \"InvalidUserPoolConfigurationException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidUserPoolConfigurationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidUserPoolConfigurationException.prototype);\n    }\n}\nexport class InvalidEmailRoleAccessPolicyException extends __BaseException {\n    name = \"InvalidEmailRoleAccessPolicyException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidEmailRoleAccessPolicyException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidEmailRoleAccessPolicyException.prototype);\n    }\n}\nexport class MFAMethodNotFoundException extends __BaseException {\n    name = \"MFAMethodNotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"MFAMethodNotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, MFAMethodNotFoundException.prototype);\n    }\n}\nexport class PasswordResetRequiredException extends __BaseException {\n    name = \"PasswordResetRequiredException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"PasswordResetRequiredException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, PasswordResetRequiredException.prototype);\n    }\n}\nexport class UnsupportedOperationException extends __BaseException {\n    name = \"UnsupportedOperationException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnsupportedOperationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnsupportedOperationException.prototype);\n    }\n}\nexport class UserNotConfirmedException extends __BaseException {\n    name = \"UserNotConfirmedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserNotConfirmedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserNotConfirmedException.prototype);\n    }\n}\nexport class UserPoolAddOnNotEnabledException extends __BaseException {\n    name = \"UserPoolAddOnNotEnabledException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserPoolAddOnNotEnabledException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserPoolAddOnNotEnabledException.prototype);\n    }\n}\nexport class CodeMismatchException extends __BaseException {\n    name = \"CodeMismatchException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"CodeMismatchException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, CodeMismatchException.prototype);\n    }\n}\nexport class ExpiredCodeException extends __BaseException {\n    name = \"ExpiredCodeException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ExpiredCodeException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ExpiredCodeException.prototype);\n    }\n}\nexport class PasswordHistoryPolicyViolationException extends __BaseException {\n    name = \"PasswordHistoryPolicyViolationException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"PasswordHistoryPolicyViolationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, PasswordHistoryPolicyViolationException.prototype);\n    }\n}\nexport class SoftwareTokenMFANotFoundException extends __BaseException {\n    name = \"SoftwareTokenMFANotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"SoftwareTokenMFANotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, SoftwareTokenMFANotFoundException.prototype);\n    }\n}\nexport class ConcurrentModificationException extends __BaseException {\n    name = \"ConcurrentModificationException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ConcurrentModificationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ConcurrentModificationException.prototype);\n    }\n}\nexport class ForbiddenException extends __BaseException {\n    name = \"ForbiddenException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ForbiddenException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ForbiddenException.prototype);\n    }\n}\nexport class WebAuthnChallengeNotFoundException extends __BaseException {\n    name = \"WebAuthnChallengeNotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnChallengeNotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnChallengeNotFoundException.prototype);\n    }\n}\nexport class WebAuthnClientMismatchException extends __BaseException {\n    name = \"WebAuthnClientMismatchException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnClientMismatchException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnClientMismatchException.prototype);\n    }\n}\nexport class WebAuthnCredentialNotSupportedException extends __BaseException {\n    name = \"WebAuthnCredentialNotSupportedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnCredentialNotSupportedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnCredentialNotSupportedException.prototype);\n    }\n}\nexport class WebAuthnNotEnabledException extends __BaseException {\n    name = \"WebAuthnNotEnabledException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnNotEnabledException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnNotEnabledException.prototype);\n    }\n}\nexport class WebAuthnOriginNotAllowedException extends __BaseException {\n    name = \"WebAuthnOriginNotAllowedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnOriginNotAllowedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnOriginNotAllowedException.prototype);\n    }\n}\nexport class WebAuthnRelyingPartyMismatchException extends __BaseException {\n    name = \"WebAuthnRelyingPartyMismatchException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnRelyingPartyMismatchException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnRelyingPartyMismatchException.prototype);\n    }\n}\nexport class DeviceKeyExistsException extends __BaseException {\n    name = \"DeviceKeyExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"DeviceKeyExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, DeviceKeyExistsException.prototype);\n    }\n}\nexport class GroupExistsException extends __BaseException {\n    name = \"GroupExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"GroupExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, GroupExistsException.prototype);\n    }\n}\nexport class DuplicateProviderException extends __BaseException {\n    name = \"DuplicateProviderException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"DuplicateProviderException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, DuplicateProviderException.prototype);\n    }\n}\nexport class ManagedLoginBrandingExistsException extends __BaseException {\n    name = \"ManagedLoginBrandingExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ManagedLoginBrandingExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ManagedLoginBrandingExistsException.prototype);\n    }\n}\nexport class TermsExistsException extends __BaseException {\n    name = \"TermsExistsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"TermsExistsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TermsExistsException.prototype);\n    }\n}\nexport class FeatureUnavailableInTierException extends __BaseException {\n    name = \"FeatureUnavailableInTierException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"FeatureUnavailableInTierException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, FeatureUnavailableInTierException.prototype);\n    }\n}\nexport class TierChangeNotAllowedException extends __BaseException {\n    name = \"TierChangeNotAllowedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"TierChangeNotAllowedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TierChangeNotAllowedException.prototype);\n    }\n}\nexport class UserPoolTaggingException extends __BaseException {\n    name = \"UserPoolTaggingException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UserPoolTaggingException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UserPoolTaggingException.prototype);\n    }\n}\nexport class InvalidOAuthFlowException extends __BaseException {\n    name = \"InvalidOAuthFlowException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidOAuthFlowException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidOAuthFlowException.prototype);\n    }\n}\nexport class ScopeDoesNotExistException extends __BaseException {\n    name = \"ScopeDoesNotExistException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ScopeDoesNotExistException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ScopeDoesNotExistException.prototype);\n    }\n}\nexport class UnsupportedIdentityProviderException extends __BaseException {\n    name = \"UnsupportedIdentityProviderException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnsupportedIdentityProviderException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnsupportedIdentityProviderException.prototype);\n    }\n}\nexport class RefreshTokenReuseException extends __BaseException {\n    name = \"RefreshTokenReuseException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"RefreshTokenReuseException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, RefreshTokenReuseException.prototype);\n    }\n}\nexport class UnauthorizedException extends __BaseException {\n    name = \"UnauthorizedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnauthorizedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnauthorizedException.prototype);\n    }\n}\nexport class UnsupportedTokenTypeException extends __BaseException {\n    name = \"UnsupportedTokenTypeException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnsupportedTokenTypeException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnsupportedTokenTypeException.prototype);\n    }\n}\nexport class WebAuthnConfigurationMissingException extends __BaseException {\n    name = \"WebAuthnConfigurationMissingException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"WebAuthnConfigurationMissingException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, WebAuthnConfigurationMissingException.prototype);\n    }\n}\nexport class EnableSoftwareTokenMFAException extends __BaseException {\n    name = \"EnableSoftwareTokenMFAException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"EnableSoftwareTokenMFAException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, EnableSoftwareTokenMFAException.prototype);\n    }\n}\n","const _A = \"Actions\";\nconst _AA = \"ApplicationArn\";\nconst _AACUO = \"AllowAdminCreateUserOnly\";\nconst _AAUTG = \"AdminAddUserToGroup\";\nconst _AAUTGR = \"AdminAddUserToGroupRequest\";\nconst _AAl = \"AliasAttributes\";\nconst _AAu = \"AuthenticatorAttachment\";\nconst _AC = \"AvailableChallenges\";\nconst _ACA = \"AddCustomAttributes\";\nconst _ACAR = \"AddCustomAttributesRequest\";\nconst _ACARd = \"AddCustomAttributesResponse\";\nconst _ACSU = \"AdminConfirmSignUp\";\nconst _ACSUR = \"AdminConfirmSignUpRequest\";\nconst _ACSURd = \"AdminConfirmSignUpResponse\";\nconst _ACT = \"AnalyticsConfigurationType\";\nconst _ACU = \"AdminCreateUser\";\nconst _ACUC = \"AdminCreateUserConfig\";\nconst _ACUCT = \"AdminCreateUserConfigType\";\nconst _ACUR = \"AdminCreateUserRequest\";\nconst _ACURd = \"AdminCreateUserResponse\";\nconst _ACn = \"AnalyticsConfiguration\";\nconst _ADPFU = \"AdminDisableProviderForUser\";\nconst _ADPFUR = \"AdminDisableProviderForUserRequest\";\nconst _ADPFURd = \"AdminDisableProviderForUserResponse\";\nconst _ADT = \"AttributeDataType\";\nconst _ADU = \"AdminDeleteUser\";\nconst _ADUA = \"AdminDeleteUserAttributes\";\nconst _ADUAR = \"AdminDeleteUserAttributesRequest\";\nconst _ADUARd = \"AdminDeleteUserAttributesResponse\";\nconst _ADUR = \"AdminDeleteUserRequest\";\nconst _ADURd = \"AdminDisableUserRequest\";\nconst _ADURdm = \"AdminDisableUserResponse\";\nconst _ADUd = \"AdminDisableUser\";\nconst _AE = \"AuthEvents\";\nconst _AEE = \"AliasExistsException\";\nconst _AEI = \"AnalyticsEndpointId\";\nconst _AET = \"AuthEventType\";\nconst _AETu = \"AuthEventsType\";\nconst _AEU = \"AdminEnableUser\";\nconst _AEUR = \"AdminEnableUserRequest\";\nconst _AEURd = \"AdminEnableUserResponse\";\nconst _AF = \"AuthFlow\";\nconst _AFAF = \"AllowedFirstAuthFactors\";\nconst _AFD = \"AdminForgetDevice\";\nconst _AFDR = \"AdminForgetDeviceRequest\";\nconst _AGD = \"AdminGetDevice\";\nconst _AGDR = \"AdminGetDeviceRequest\";\nconst _AGDRd = \"AdminGetDeviceResponse\";\nconst _AGU = \"AdminGetUser\";\nconst _AGUR = \"AdminGetUserRequest\";\nconst _AGURd = \"AdminGetUserResponse\";\nconst _AI = \"ApplicationId\";\nconst _AIA = \"AdminInitiateAuth\";\nconst _AIAR = \"AdminInitiateAuthRequest\";\nconst _AIARd = \"AdminInitiateAuthResponse\";\nconst _ALD = \"AdminListDevices\";\nconst _ALDR = \"AdminListDevicesRequest\";\nconst _ALDRd = \"AdminListDevicesResponse\";\nconst _ALGFU = \"AdminListGroupsForUser\";\nconst _ALGFUR = \"AdminListGroupsForUserRequest\";\nconst _ALGFURd = \"AdminListGroupsForUserResponse\";\nconst _ALPFU = \"AdminLinkProviderForUser\";\nconst _ALPFUR = \"AdminLinkProviderForUserRequest\";\nconst _ALPFURd = \"AdminLinkProviderForUserResponse\";\nconst _ALT = \"AssetListType\";\nconst _ALTt = \"AttributeListType\";\nconst _ALUAE = \"AdminListUserAuthEvents\";\nconst _ALUAER = \"AdminListUserAuthEventsRequest\";\nconst _ALUAERd = \"AdminListUserAuthEventsResponse\";\nconst _AM = \"AnalyticsMetadata\";\nconst _AMT = \"AnalyticsMetadataType\";\nconst _AMt = \"AttributeMapping\";\nconst _AN = \"AttributeName\";\nconst _AOAF = \"AllowedOAuthFlows\";\nconst _AOAFUPC = \"AllowedOAuthFlowsUserPoolClient\";\nconst _AOAS = \"AllowedOAuthScopes\";\nconst _AP = \"AuthParameters\";\nconst _APT = \"AuthParametersType\";\nconst _AR = \"AuthenticationResult\";\nconst _ARS = \"AccountRecoverySetting\";\nconst _ARST = \"AccountRecoverySettingType\";\nconst _ART = \"AuthenticationResultType\";\nconst _ARTAC = \"AdminRespondToAuthChallenge\";\nconst _ARTACR = \"AdminRespondToAuthChallengeRequest\";\nconst _ARTACRd = \"AdminRespondToAuthChallengeResponse\";\nconst _ARUFG = \"AdminRemoveUserFromGroup\";\nconst _ARUFGR = \"AdminRemoveUserFromGroupRequest\";\nconst _ARUP = \"AdminResetUserPassword\";\nconst _ARUPR = \"AdminResetUserPasswordRequest\";\nconst _ARUPRd = \"AdminResetUserPasswordResponse\";\nconst _ARVBU = \"AttributesRequireVerificationBeforeUpdate\";\nconst _ASAF = \"AdvancedSecurityAdditionalFlows\";\nconst _ASAFT = \"AdvancedSecurityAdditionalFlowsType\";\nconst _ASM = \"AdvancedSecurityMode\";\nconst _AST = \"AssociateSoftwareToken\";\nconst _ASTR = \"AssociateSoftwareTokenRequest\";\nconst _ASTRs = \"AssociateSoftwareTokenResponse\";\nconst _ASUMFAP = \"AdminSetUserMFAPreference\";\nconst _ASUMFAPR = \"AdminSetUserMFAPreferenceRequest\";\nconst _ASUMFAPRd = \"AdminSetUserMFAPreferenceResponse\";\nconst _ASUP = \"AdminSetUserPassword\";\nconst _ASUPR = \"AdminSetUserPasswordRequest\";\nconst _ASUPRd = \"AdminSetUserPasswordResponse\";\nconst _ASUS = \"AdminSetUserSettings\";\nconst _ASUSR = \"AdminSetUserSettingsRequest\";\nconst _ASUSRd = \"AdminSetUserSettingsResponse\";\nconst _ASV = \"AuthSessionValidity\";\nconst _AT = \"AssetType\";\nconst _ATAT = \"AccountTakeoverActionsType\";\nconst _ATATc = \"AccountTakeoverActionType\";\nconst _ATG = \"AttributesToGet\";\nconst _ATRC = \"AccountTakeoverRiskConfiguration\";\nconst _ATRCT = \"AccountTakeoverRiskConfigurationType\";\nconst _ATV = \"AccessTokenValidity\";\nconst _ATc = \"AccessToken\";\nconst _ATt = \"AttributeType\";\nconst _ATu = \"AuthenticatorTransports\";\nconst _AUAEF = \"AdminUpdateAuthEventFeedback\";\nconst _AUAEFR = \"AdminUpdateAuthEventFeedbackRequest\";\nconst _AUAEFRd = \"AdminUpdateAuthEventFeedbackResponse\";\nconst _AUDS = \"AdminUpdateDeviceStatus\";\nconst _AUDSR = \"AdminUpdateDeviceStatusRequest\";\nconst _AUDSRd = \"AdminUpdateDeviceStatusResponse\";\nconst _AUGSO = \"AdminUserGlobalSignOut\";\nconst _AUGSOR = \"AdminUserGlobalSignOutRequest\";\nconst _AUGSORd = \"AdminUserGlobalSignOutResponse\";\nconst _AUUA = \"AdminUpdateUserAttributes\";\nconst _AUUAR = \"AdminUpdateUserAttributesRequest\";\nconst _AUUARd = \"AdminUpdateUserAttributesResponse\";\nconst _AVA = \"AutoVerifiedAttributes\";\nconst _AVT = \"AttributeValueType\";\nconst _AWSAI = \"AWSAccountId\";\nconst _Ar = \"Arn\";\nconst _As = \"Assets\";\nconst _At = \"Attributes\";\nconst _B = \"Bytes\";\nconst _BA = \"BucketArn\";\nconst _BE = \"BlockEmail\";\nconst _BIPRL = \"BlockedIPRangeList\";\nconst _C = \"Category\";\nconst _CA = \"CustomAttributes\";\nconst _CAC = \"CreateAuthChallenge\";\nconst _CALT = \"CustomAttributesListType\";\nconst _CAM = \"CustomAuthMode\";\nconst _CAe = \"CertificateArn\";\nconst _CAr = \"CreatedAt\";\nconst _CC = \"ConfirmationCode\";\nconst _CCAT = \"CompromisedCredentialsActionsType\";\nconst _CCD = \"CompromisedCredentialsDetected\";\nconst _CCO = \"CredentialCreationOptions\";\nconst _CCRC = \"CompromisedCredentialsRiskConfiguration\";\nconst _CCRCT = \"CompromisedCredentialsRiskConfigurationType\";\nconst _CD = \"ContextData\";\nconst _CDC = \"CustomDomainConfig\";\nconst _CDCT = \"CustomDomainConfigType\";\nconst _CDD = \"CodeDeliveryDetails\";\nconst _CDDL = \"CodeDeliveryDetailsList\";\nconst _CDDLT = \"CodeDeliveryDetailsListType\";\nconst _CDDT = \"CodeDeliveryDetailsType\";\nconst _CDFE = \"CodeDeliveryFailureException\";\nconst _CDR = \"ConfirmDeviceRequest\";\nconst _CDRo = \"ConfirmDeviceResponse\";\nconst _CDT = \"ContextDataType\";\nconst _CDo = \"CompletionDate\";\nconst _CDon = \"ConfirmDevice\";\nconst _CDr = \"CreationDate\";\nconst _CDu = \"CustomDomain\";\nconst _CELVCT = \"CustomEmailLambdaVersionConfigType\";\nconst _CES = \"CustomEmailSender\";\nconst _CFD = \"CloudFrontDomain\";\nconst _CFDl = \"CloudFrontDistribution\";\nconst _CFP = \"ConfirmForgotPassword\";\nconst _CFPR = \"ConfirmForgotPasswordRequest\";\nconst _CFPRo = \"ConfirmForgotPasswordResponse\";\nconst _CG = \"CreateGroup\";\nconst _CGR = \"CreateGroupRequest\";\nconst _CGRr = \"CreateGroupResponse\";\nconst _CI = \"ClientId\";\nconst _CIP = \"CreateIdentityProvider\";\nconst _CIPR = \"CreateIdentityProviderRequest\";\nconst _CIPRr = \"CreateIdentityProviderResponse\";\nconst _CIT = \"ClientIdType\";\nconst _CIr = \"CredentialId\";\nconst _CM = \"ClientMetadata\";\nconst _CME = \"CodeMismatchException\";\nconst _CMEo = \"ConcurrentModificationException\";\nconst _CMLB = \"CreateManagedLoginBranding\";\nconst _CMLBR = \"CreateManagedLoginBrandingRequest\";\nconst _CMLBRr = \"CreateManagedLoginBrandingResponse\";\nconst _CMo = \"ColorMode\";\nconst _CMom = \"CompletionMessage\";\nconst _CMu = \"CustomMessage\";\nconst _CN = \"ChallengeName\";\nconst _CNl = \"ClientName\";\nconst _CP = \"ChallengeParameters\";\nconst _CPR = \"ChangePasswordRequest\";\nconst _CPRh = \"ChangePasswordResponse\";\nconst _CPh = \"ChangePassword\";\nconst _CR = \"ChallengeResponses\";\nconst _CRLT = \"ChallengeResponseListType\";\nconst _CROND = \"ChallengeRequiredOnNewDevice\";\nconst _CRS = \"CreateResourceServer\";\nconst _CRSR = \"CreateResourceServerRequest\";\nconst _CRSRr = \"CreateResourceServerResponse\";\nconst _CRT = \"ChallengeResponseType\";\nconst _CRTh = \"ChallengeResponsesType\";\nconst _CRh = \"ChallengeResponse\";\nconst _CS = \"ConfigurationSet\";\nconst _CSMSLVCT = \"CustomSMSLambdaVersionConfigType\";\nconst _CSMSS = \"CustomSMSSender\";\nconst _CSS = \"CSS\";\nconst _CSSV = \"CSSVersion\";\nconst _CST = \"ClientSecretType\";\nconst _CSU = \"ConfirmSignUp\";\nconst _CSUR = \"ConfirmSignUpRequest\";\nconst _CSURo = \"ConfirmSignUpResponse\";\nconst _CSVH = \"CSVHeader\";\nconst _CSa = \"CaseSensitive\";\nconst _CSl = \"ClientSecret\";\nconst _CT = \"CreateTerms\";\nconst _CTR = \"CreateTermsRequest\";\nconst _CTRr = \"CreateTermsResponse\";\nconst _CUAF = \"ConfiguredUserAuthFactors\";\nconst _CUIJ = \"CreateUserImportJob\";\nconst _CUIJR = \"CreateUserImportJobRequest\";\nconst _CUIJRr = \"CreateUserImportJobResponse\";\nconst _CUP = \"CreateUserPool\";\nconst _CUPC = \"CreateUserPoolClient\";\nconst _CUPCR = \"CreateUserPoolClientRequest\";\nconst _CUPCRr = \"CreateUserPoolClientResponse\";\nconst _CUPD = \"CreateUserPoolDomain\";\nconst _CUPDR = \"CreateUserPoolDomainRequest\";\nconst _CUPDRr = \"CreateUserPoolDomainResponse\";\nconst _CUPR = \"CreateUserPoolRequest\";\nconst _CUPRr = \"CreateUserPoolResponse\";\nconst _CURL = \"CallbackURLs\";\nconst _CWAR = \"CompleteWebAuthnRegistration\";\nconst _CWARR = \"CompleteWebAuthnRegistrationRequest\";\nconst _CWARRo = \"CompleteWebAuthnRegistrationResponse\";\nconst _CWLC = \"CloudWatchLogsConfiguration\";\nconst _CWLCT = \"CloudWatchLogsConfigurationType\";\nconst _CWLRA = \"CloudWatchLogsRoleArn\";\nconst _Ce = \"Certificate\";\nconst _Ci = \"City\";\nconst _Co = \"Country\";\nconst _Cod = \"Code\";\nconst _Cr = \"Credential\";\nconst _Cre = \"Credentials\";\nconst _D = \"Device\";\nconst _DA = \"DeviceAttributes\";\nconst _DAC = \"DefineAuthChallenge\";\nconst _DC = \"DeviceConfiguration\";\nconst _DCD = \"DeviceCreateDate\";\nconst _DCT = \"DeviceConfigurationType\";\nconst _DD = \"DomainDescription\";\nconst _DDM = \"DesiredDeliveryMediums\";\nconst _DDT = \"DomainDescriptionType\";\nconst _DEO = \"DefaultEmailOption\";\nconst _DG = \"DeleteGroup\";\nconst _DGK = \"DeviceGroupKey\";\nconst _DGR = \"DeleteGroupRequest\";\nconst _DIP = \"DeleteIdentityProvider\";\nconst _DIPR = \"DeleteIdentityProviderRequest\";\nconst _DIPRe = \"DescribeIdentityProviderRequest\";\nconst _DIPRes = \"DescribeIdentityProviderResponse\";\nconst _DIPe = \"DescribeIdentityProvider\";\nconst _DK = \"DeviceKey\";\nconst _DKEE = \"DeviceKeyExistsException\";\nconst _DLAD = \"DeviceLastAuthenticatedDate\";\nconst _DLMD = \"DeviceLastModifiedDate\";\nconst _DLT = \"DeviceListType\";\nconst _DM = \"DeliveryMedium\";\nconst _DMLB = \"DeleteManagedLoginBranding\";\nconst _DMLBBC = \"DescribeManagedLoginBrandingByClient\";\nconst _DMLBBCR = \"DescribeManagedLoginBrandingByClientRequest\";\nconst _DMLBBCRe = \"DescribeManagedLoginBrandingByClientResponse\";\nconst _DMLBR = \"DeleteManagedLoginBrandingRequest\";\nconst _DMLBRe = \"DescribeManagedLoginBrandingRequest\";\nconst _DMLBRes = \"DescribeManagedLoginBrandingResponse\";\nconst _DMLBe = \"DescribeManagedLoginBranding\";\nconst _DN = \"DeviceName\";\nconst _DOA = \"DeveloperOnlyAttribute\";\nconst _DOROUP = \"DeviceOnlyRememberedOnUserPrompt\";\nconst _DP = \"DeletionProtection\";\nconst _DPE = \"DuplicateProviderException\";\nconst _DRC = \"DescribeRiskConfiguration\";\nconst _DRCR = \"DescribeRiskConfigurationRequest\";\nconst _DRCRe = \"DescribeRiskConfigurationResponse\";\nconst _DRS = \"DeviceRememberedStatus\";\nconst _DRSR = \"DeleteResourceServerRequest\";\nconst _DRSRe = \"DescribeResourceServerRequest\";\nconst _DRSRes = \"DescribeResourceServerResponse\";\nconst _DRSe = \"DeleteResourceServer\";\nconst _DRSes = \"DescribeResourceServer\";\nconst _DRURI = \"DefaultRedirectURI\";\nconst _DSVC = \"DeviceSecretVerifierConfig\";\nconst _DSVCT = \"DeviceSecretVerifierConfigType\";\nconst _DT = \"DeviceType\";\nconst _DTR = \"DeleteTermsRequest\";\nconst _DTRe = \"DescribeTermsRequest\";\nconst _DTRes = \"DescribeTermsResponse\";\nconst _DTe = \"DeleteTerms\";\nconst _DTes = \"DescribeTerms\";\nconst _DU = \"DestinationUser\";\nconst _DUA = \"DeleteUserAttributes\";\nconst _DUAR = \"DeleteUserAttributesRequest\";\nconst _DUARe = \"DeleteUserAttributesResponse\";\nconst _DUIJ = \"DescribeUserImportJob\";\nconst _DUIJR = \"DescribeUserImportJobRequest\";\nconst _DUIJRe = \"DescribeUserImportJobResponse\";\nconst _DUP = \"DeleteUserPool\";\nconst _DUPC = \"DeleteUserPoolClient\";\nconst _DUPCR = \"DeleteUserPoolClientRequest\";\nconst _DUPCRe = \"DescribeUserPoolClientRequest\";\nconst _DUPCRes = \"DescribeUserPoolClientResponse\";\nconst _DUPCe = \"DescribeUserPoolClient\";\nconst _DUPD = \"DeleteUserPoolDomain\";\nconst _DUPDR = \"DeleteUserPoolDomainRequest\";\nconst _DUPDRe = \"DeleteUserPoolDomainResponse\";\nconst _DUPDRes = \"DescribeUserPoolDomainRequest\";\nconst _DUPDResc = \"DescribeUserPoolDomainResponse\";\nconst _DUPDe = \"DescribeUserPoolDomain\";\nconst _DUPR = \"DeleteUserPoolRequest\";\nconst _DUPRe = \"DescribeUserPoolRequest\";\nconst _DUPRes = \"DescribeUserPoolResponse\";\nconst _DUPe = \"DescribeUserPool\";\nconst _DUR = \"DeleteUserRequest\";\nconst _DUe = \"DeleteUser\";\nconst _DWAC = \"DeleteWebAuthnCredential\";\nconst _DWACR = \"DeleteWebAuthnCredentialRequest\";\nconst _DWACRe = \"DeleteWebAuthnCredentialResponse\";\nconst _De = \"Devices\";\nconst _Des = \"Destination\";\nconst _Desc = \"Description\";\nconst _Do = \"Domain\";\nconst _E = \"Enabled\";\nconst _EA = \"EventAction\";\nconst _EAF = \"ExplicitAuthFlows\";\nconst _EC = \"EmailConfiguration\";\nconst _ECD = \"EventContextData\";\nconst _ECDT = \"EventContextDataType\";\nconst _ECE = \"ExpiredCodeException\";\nconst _ECF = \"EmailConfigurationFailure\";\nconst _ECT = \"EmailConfigurationType\";\nconst _ED = \"EncodedData\";\nconst _EF = \"EventFeedback\";\nconst _EFT = \"EventFeedbackType\";\nconst _EFv = \"EventFilter\";\nconst _EI = \"EventId\";\nconst _EIx = \"ExternalId\";\nconst _EIxp = \"ExpiresIn\";\nconst _EM = \"EmailMessage\";\nconst _EMBL = \"EmailMessageByLink\";\nconst _EMC = \"EmailMfaConfiguration\";\nconst _EMCT = \"EmailMfaConfigType\";\nconst _EMS = \"EmailMfaSettings\";\nconst _EMST = \"EmailMfaSettingsType\";\nconst _ENOU = \"EstimatedNumberOfUsers\";\nconst _EPAUCD = \"EnablePropagateAdditionalUserContextData\";\nconst _ER = \"EventResponse\";\nconst _ERT = \"EventRiskType\";\nconst _ERv = \"EventRisk\";\nconst _ES = \"EventSource\";\nconst _ESA = \"EmailSendingAccount\";\nconst _ESBL = \"EmailSubjectByLink\";\nconst _ESTMFAE = \"EnableSoftwareTokenMFAException\";\nconst _ESm = \"EmailSubject\";\nconst _ET = \"EventType\";\nconst _ETR = \"EnableTokenRevocation\";\nconst _EVM = \"EmailVerificationMessage\";\nconst _EVS = \"EmailVerificationSubject\";\nconst _En = \"Enforcement\";\nconst _Ex = \"Extension\";\nconst _F = \"From\";\nconst _FAC = \"ForceAliasCreation\";\nconst _FC = \"FirehoseConfiguration\";\nconst _FCN = \"FriendlyCredentialName\";\nconst _FCT = \"FirehoseConfigurationType\";\nconst _FD = \"FeedbackDate\";\nconst _FDN = \"FriendlyDeviceName\";\nconst _FDR = \"ForgetDeviceRequest\";\nconst _FDo = \"ForgetDevice\";\nconst _FE = \"ForbiddenException\";\nconst _FP = \"ForgotPassword\";\nconst _FPR = \"ForgotPasswordRequest\";\nconst _FPRo = \"ForgotPasswordResponse\";\nconst _FT = \"FeedbackToken\";\nconst _FU = \"FailedUsers\";\nconst _FUITE = \"FeatureUnavailableInTierException\";\nconst _FV = \"FeedbackValue\";\nconst _Fe = \"Feature\";\nconst _Fi = \"Filter\";\nconst _G = \"Groups\";\nconst _GCSVH = \"GetCSVHeader\";\nconst _GCSVHR = \"GetCSVHeaderRequest\";\nconst _GCSVHRe = \"GetCSVHeaderResponse\";\nconst _GD = \"GetDevice\";\nconst _GDR = \"GetDeviceRequest\";\nconst _GDRe = \"GetDeviceResponse\";\nconst _GEE = \"GroupExistsException\";\nconst _GG = \"GetGroup\";\nconst _GGR = \"GetGroupRequest\";\nconst _GGRe = \"GetGroupResponse\";\nconst _GIPBI = \"GetIdentityProviderByIdentifier\";\nconst _GIPBIR = \"GetIdentityProviderByIdentifierRequest\";\nconst _GIPBIRe = \"GetIdentityProviderByIdentifierResponse\";\nconst _GLDC = \"GetLogDeliveryConfiguration\";\nconst _GLDCR = \"GetLogDeliveryConfigurationRequest\";\nconst _GLDCRe = \"GetLogDeliveryConfigurationResponse\";\nconst _GLT = \"GroupListType\";\nconst _GN = \"GroupName\";\nconst _GS = \"GenerateSecret\";\nconst _GSC = \"GetSigningCertificate\";\nconst _GSCR = \"GetSigningCertificateRequest\";\nconst _GSCRe = \"GetSigningCertificateResponse\";\nconst _GSO = \"GlobalSignOut\";\nconst _GSOR = \"GlobalSignOutRequest\";\nconst _GSORl = \"GlobalSignOutResponse\";\nconst _GT = \"GroupType\";\nconst _GTFRT = \"GetTokensFromRefreshToken\";\nconst _GTFRTR = \"GetTokensFromRefreshTokenRequest\";\nconst _GTFRTRe = \"GetTokensFromRefreshTokenResponse\";\nconst _GU = \"GetUser\";\nconst _GUAF = \"GetUserAuthFactors\";\nconst _GUAFR = \"GetUserAuthFactorsRequest\";\nconst _GUAFRe = \"GetUserAuthFactorsResponse\";\nconst _GUAVC = \"GetUserAttributeVerificationCode\";\nconst _GUAVCR = \"GetUserAttributeVerificationCodeRequest\";\nconst _GUAVCRe = \"GetUserAttributeVerificationCodeResponse\";\nconst _GUIC = \"GetUICustomization\";\nconst _GUICR = \"GetUICustomizationRequest\";\nconst _GUICRe = \"GetUICustomizationResponse\";\nconst _GUPMC = \"GetUserPoolMfaConfig\";\nconst _GUPMCR = \"GetUserPoolMfaConfigRequest\";\nconst _GUPMCRe = \"GetUserPoolMfaConfigResponse\";\nconst _GUR = \"GetUserRequest\";\nconst _GURe = \"GetUserResponse\";\nconst _Gr = \"Group\";\nconst _HA = \"HighAction\";\nconst _HB = \"HtmlBody\";\nconst _HH = \"HttpHeaders\";\nconst _HHL = \"HttpHeaderList\";\nconst _HHt = \"HttpHeader\";\nconst _I = \"Identifier\";\nconst _IA = \"IpAddress\";\nconst _IAR = \"InitiateAuthRequest\";\nconst _IARn = \"InitiateAuthResponse\";\nconst _IAn = \"InitiateAuth\";\nconst _IEE = \"InternalErrorException\";\nconst _IERAPE = \"InvalidEmailRoleAccessPolicyException\";\nconst _IF = \"InboundFederation\";\nconst _IFLT = \"InboundFederationLambdaType\";\nconst _IFm = \"ImageFile\";\nconst _II = \"IdpIdentifiers\";\nconst _IId = \"IdpIdentifier\";\nconst _ILRE = \"InvalidLambdaResponseException\";\nconst _IMT = \"InviteMessageTemplate\";\nconst _IOAFE = \"InvalidOAuthFlowException\";\nconst _IP = \"IdentityProvider\";\nconst _IPE = \"InvalidParameterException\";\nconst _IPEn = \"InvalidPasswordException\";\nconst _IPT = \"IdentityProviderType\";\nconst _ISRAPE = \"InvalidSmsRoleAccessPolicyException\";\nconst _ISRTRE = \"InvalidSmsRoleTrustRelationshipException\";\nconst _IT = \"IdToken\";\nconst _ITV = \"IdTokenValidity\";\nconst _IU = \"ImageUrl\";\nconst _IUPCE = \"InvalidUserPoolConfigurationException\";\nconst _IUm = \"ImportedUsers\";\nconst _Id = \"Id\";\nconst _JI = \"JobId\";\nconst _JN = \"JobName\";\nconst _KMSKID = \"KMSKeyID\";\nconst _L = \"Limit\";\nconst _LA = \"LowAction\";\nconst _LAa = \"LambdaArn\";\nconst _LC = \"LambdaConfig\";\nconst _LCLT = \"LogConfigurationListType\";\nconst _LCT = \"LambdaConfigType\";\nconst _LCTo = \"LogConfigurationType\";\nconst _LCo = \"LogConfigurations\";\nconst _LD = \"ListDevices\";\nconst _LDC = \"LogDeliveryConfiguration\";\nconst _LDCT = \"LogDeliveryConfigurationType\";\nconst _LDR = \"ListDevicesRequest\";\nconst _LDRi = \"ListDevicesResponse\";\nconst _LEE = \"LimitExceededException\";\nconst _LG = \"ListGroups\";\nconst _LGA = \"LogGroupArn\";\nconst _LGR = \"ListGroupsRequest\";\nconst _LGRi = \"ListGroupsResponse\";\nconst _LIP = \"ListIdentityProviders\";\nconst _LIPR = \"ListIdentityProvidersRequest\";\nconst _LIPRi = \"ListIdentityProvidersResponse\";\nconst _LL = \"LogLevel\";\nconst _LMD = \"LastModifiedDate\";\nconst _LRS = \"ListResourceServers\";\nconst _LRSR = \"ListResourceServersRequest\";\nconst _LRSRi = \"ListResourceServersResponse\";\nconst _LT = \"ListTerms\";\nconst _LTFR = \"ListTagsForResource\";\nconst _LTFRR = \"ListTagsForResourceRequest\";\nconst _LTFRRi = \"ListTagsForResourceResponse\";\nconst _LTR = \"ListTermsRequest\";\nconst _LTRi = \"ListTermsResponse\";\nconst _LU = \"ListUsers\";\nconst _LUIG = \"ListUsersInGroup\";\nconst _LUIGR = \"ListUsersInGroupRequest\";\nconst _LUIGRi = \"ListUsersInGroupResponse\";\nconst _LUIJ = \"ListUserImportJobs\";\nconst _LUIJR = \"ListUserImportJobsRequest\";\nconst _LUIJRi = \"ListUserImportJobsResponse\";\nconst _LUP = \"ListUserPools\";\nconst _LUPC = \"ListUserPoolClients\";\nconst _LUPCR = \"ListUserPoolClientsRequest\";\nconst _LUPCRi = \"ListUserPoolClientsResponse\";\nconst _LUPR = \"ListUserPoolsRequest\";\nconst _LUPRi = \"ListUserPoolsResponse\";\nconst _LUR = \"ListUsersRequest\";\nconst _LURL = \"LogoutURLs\";\nconst _LURi = \"ListUsersResponse\";\nconst _LV = \"LambdaVersion\";\nconst _LWAC = \"ListWebAuthnCredentials\";\nconst _LWACR = \"ListWebAuthnCredentialsRequest\";\nconst _LWACRi = \"ListWebAuthnCredentialsResponse\";\nconst _Li = \"Links\";\nconst _M = \"Message\";\nconst _MA = \"MediumAction\";\nconst _MAe = \"MessageAction\";\nconst _MC = \"MfaConfiguration\";\nconst _ME = \"MfaEmail\";\nconst _MFAMNFE = \"MFAMethodNotFoundException\";\nconst _MFAO = \"MFAOptions\";\nconst _MFAOLT = \"MFAOptionListType\";\nconst _MFAOT = \"MFAOptionType\";\nconst _ML = \"MinimumLength\";\nconst _MLB = \"ManagedLoginBranding\";\nconst _MLBEE = \"ManagedLoginBrandingExistsException\";\nconst _MLBI = \"ManagedLoginBrandingId\";\nconst _MLBT = \"ManagedLoginBrandingType\";\nconst _MLV = \"ManagedLoginVersion\";\nconst _MLa = \"MaxLength\";\nconst _MLi = \"MinLength\";\nconst _MR = \"MaxResults\";\nconst _MTT = \"MessageTemplateType\";\nconst _MV = \"MinValue\";\nconst _MVa = \"MaxValue\";\nconst _Mu = \"Mutable\";\nconst _N = \"Notify\";\nconst _NAC = \"NumberAttributeConstraints\";\nconst _NACT = \"NumberAttributeConstraintsType\";\nconst _NAE = \"NotAuthorizedException\";\nconst _NAEo = \"NoActionEmail\";\nconst _NC = \"NotifyConfiguration\";\nconst _NCT = \"NotifyConfigurationType\";\nconst _NDM = \"NewDeviceMetadata\";\nconst _NDMT = \"NewDeviceMetadataType\";\nconst _NET = \"NotifyEmailType\";\nconst _NT = \"NextToken\";\nconst _Na = \"Name\";\nconst _P = \"Password\";\nconst _PA = \"PreAuthentication\";\nconst _PAN = \"ProviderAttributeName\";\nconst _PAV = \"ProviderAttributeValue\";\nconst _PAo = \"PostAuthentication\";\nconst _PC = \"PostConfirmation\";\nconst _PD = \"ProviderDetails\";\nconst _PDr = \"ProviderDescription\";\nconst _PHPVE = \"PasswordHistoryPolicyViolationException\";\nconst _PHS = \"PasswordHistorySize\";\nconst _PLT = \"ProvidersListType\";\nconst _PM = \"PreferredMfa\";\nconst _PMS = \"PreferredMfaSetting\";\nconst _PN = \"ProviderName\";\nconst _PNME = \"PreconditionNotMetException\";\nconst _PNo = \"PoolName\";\nconst _PP = \"ProposedPassword\";\nconst _PPT = \"PasswordPolicyType\";\nconst _PPa = \"PasswordPolicy\";\nconst _PPr = \"PreviousPassword\";\nconst _PRRE = \"PasswordResetRequiredException\";\nconst _PSU = \"PreSignUp\";\nconst _PSUr = \"PreSignedUrl\";\nconst _PT = \"PasswordType\";\nconst _PTG = \"PreTokenGeneration\";\nconst _PTGC = \"PreTokenGenerationConfig\";\nconst _PTGVCT = \"PreTokenGenerationVersionConfigType\";\nconst _PTa = \"PaginationToken\";\nconst _PTr = \"ProviderType\";\nconst _PUEE = \"PreventUserExistenceErrors\";\nconst _PUIT = \"ProviderUserIdentifierType\";\nconst _PV = \"PasswordVerifier\";\nconst _Pe = \"Permanent\";\nconst _Po = \"Policies\";\nconst _Pr = \"Precedence\";\nconst _Pri = \"Priority\";\nconst _Pro = \"Provider\";\nconst _Prov = \"Providers\";\nconst _R = \"Required\";\nconst _RA = \"RoleArn\";\nconst _RAe = \"ReadAttributes\";\nconst _RAes = \"ResourceArn\";\nconst _RC = \"RiskConfiguration\";\nconst _RCC = \"ResendConfirmationCode\";\nconst _RCCR = \"ResendConfirmationCodeRequest\";\nconst _RCCRe = \"ResendConfirmationCodeResponse\";\nconst _RCT = \"RiskConfigurationType\";\nconst _RD = \"RiskDecision\";\nconst _REC = \"RiskExceptionConfiguration\";\nconst _RECT = \"RiskExceptionConfigurationType\";\nconst _RGPS = \"RetryGracePeriodSeconds\";\nconst _RI = \"ResourceId\";\nconst _RL = \"RiskLevel\";\nconst _RLe = \"RequireLowercase\";\nconst _RM = \"RecoveryMechanisms\";\nconst _RMR = \"ReturnMergedResources\";\nconst _RMT = \"RecoveryMechanismsType\";\nconst _RN = \"RequireNumbers\";\nconst _RNFE = \"ResourceNotFoundException\";\nconst _ROT = \"RecoveryOptionType\";\nconst _RPI = \"RelyingPartyId\";\nconst _RS = \"ResourceServer\";\nconst _RSLT = \"ResourceServersListType\";\nconst _RSSLT = \"ResourceServerScopeListType\";\nconst _RSST = \"ResourceServerScopeType\";\nconst _RST = \"ResourceServerType\";\nconst _RSe = \"ResourceServers\";\nconst _RSeq = \"RequireSymbols\";\nconst _RT = \"RefreshToken\";\nconst _RTAC = \"RespondToAuthChallenge\";\nconst _RTACR = \"RespondToAuthChallengeRequest\";\nconst _RTACRe = \"RespondToAuthChallengeResponse\";\nconst _RTEA = \"ReplyToEmailAddress\";\nconst _RTR = \"RefreshTokenRotation\";\nconst _RTRE = \"RefreshTokenReuseException\";\nconst _RTRT = \"RefreshTokenRotationType\";\nconst _RTRe = \"RevokeTokenRequest\";\nconst _RTRev = \"RevokeTokenResponse\";\nconst _RTV = \"RefreshTokenValidity\";\nconst _RTe = \"ReplyTo\";\nconst _RTev = \"RevokeToken\";\nconst _RU = \"RequireUppercase\";\nconst _S = \"Session\";\nconst _SA = \"SourceArn\";\nconst _SAC = \"StringAttributeConstraints\";\nconst _SACT = \"StringAttributeConstraintsType\";\nconst _SALT = \"SchemaAttributesListType\";\nconst _SAM = \"SmsAuthenticationMessage\";\nconst _SAT = \"SchemaAttributeType\";\nconst _SAc = \"SchemaAttributes\";\nconst _SAt = \"StreamArn\";\nconst _SB = \"S3Bucket\";\nconst _SC = \"SecretCode\";\nconst _SCA = \"SnsCallerArn\";\nconst _SCF = \"SmsConfigurationFailure\";\nconst _SCT = \"SecretCodeType\";\nconst _SCTm = \"SmsConfigurationType\";\nconst _SCTo = \"S3ConfigurationType\";\nconst _SCm = \"SmsConfiguration\";\nconst _SCo = \"S3Configuration\";\nconst _SD = \"ScopeDescription\";\nconst _SDNEE = \"ScopeDoesNotExistException\";\nconst _SDt = \"StartDate\";\nconst _SH = \"SecretHash\";\nconst _SHT = \"SecretHashType\";\nconst _SIP = \"SupportedIdentityProviders\";\nconst _SIPRL = \"SkippedIPRangeList\";\nconst _SIPT = \"SignInPolicyType\";\nconst _SIPi = \"SignInPolicy\";\nconst _SLDC = \"SetLogDeliveryConfiguration\";\nconst _SLDCR = \"SetLogDeliveryConfigurationRequest\";\nconst _SLDCRe = \"SetLogDeliveryConfigurationResponse\";\nconst _SM = \"SmsMessage\";\nconst _SMC = \"SmsMfaConfiguration\";\nconst _SMCT = \"SmsMfaConfigType\";\nconst _SMSM = \"SMSMessage\";\nconst _SMSMS = \"SMSMfaSettings\";\nconst _SMSMST = \"SMSMfaSettingsType\";\nconst _SN = \"ServerName\";\nconst _SNc = \"ScopeName\";\nconst _SP = \"ServerPath\";\nconst _SR = \"SnsRegion\";\nconst _SRC = \"SetRiskConfiguration\";\nconst _SRCR = \"SetRiskConfigurationRequest\";\nconst _SRCRe = \"SetRiskConfigurationResponse\";\nconst _ST = \"SessionType\";\nconst _STMC = \"SoftwareTokenMfaConfiguration\";\nconst _STMCT = \"SoftwareTokenMfaConfigType\";\nconst _STMFANFE = \"SoftwareTokenMFANotFoundException\";\nconst _STMFAUCT = \"SoftwareTokenMFAUserCodeType\";\nconst _STMS = \"SoftwareTokenMfaSettings\";\nconst _STMST = \"SoftwareTokenMfaSettingsType\";\nconst _SU = \"SourceUser\";\nconst _SUIC = \"SetUICustomization\";\nconst _SUICR = \"SetUICustomizationRequest\";\nconst _SUICRe = \"SetUICustomizationResponse\";\nconst _SUIJ = \"StartUserImportJob\";\nconst _SUIJR = \"StartUserImportJobRequest\";\nconst _SUIJRt = \"StartUserImportJobResponse\";\nconst _SUIJRto = \"StopUserImportJobRequest\";\nconst _SUIJRtop = \"StopUserImportJobResponse\";\nconst _SUIJt = \"StopUserImportJob\";\nconst _SUMFAP = \"SetUserMFAPreference\";\nconst _SUMFAPR = \"SetUserMFAPreferenceRequest\";\nconst _SUMFAPRe = \"SetUserMFAPreferenceResponse\";\nconst _SUPMC = \"SetUserPoolMfaConfig\";\nconst _SUPMCR = \"SetUserPoolMfaConfigRequest\";\nconst _SUPMCRe = \"SetUserPoolMfaConfigResponse\";\nconst _SUR = \"SignUpRequest\";\nconst _SURi = \"SignUpResponse\";\nconst _SUS = \"SetUserSettings\";\nconst _SUSR = \"SetUserSettingsRequest\";\nconst _SUSRe = \"SetUserSettingsResponse\";\nconst _SUi = \"SignUp\";\nconst _SUk = \"SkippedUsers\";\nconst _SVM = \"SmsVerificationMessage\";\nconst _SWAR = \"StartWebAuthnRegistration\";\nconst _SWARR = \"StartWebAuthnRegistrationRequest\";\nconst _SWARRt = \"StartWebAuthnRegistrationResponse\";\nconst _Sa = \"Salt\";\nconst _Sc = \"Scopes\";\nconst _Sch = \"Schema\";\nconst _Se = \"Settings\";\nconst _St = \"Status\";\nconst _Su = \"Subject\";\nconst _T = \"Terms\";\nconst _TB = \"TextBody\";\nconst _TCNAE = \"TierChangeNotAllowedException\";\nconst _TDLT = \"TermsDescriptionListType\";\nconst _TDT = \"TermsDescriptionType\";\nconst _TEE = \"TermsExistsException\";\nconst _TI = \"TermsId\";\nconst _TK = \"TagKeys\";\nconst _TMFAE = \"TooManyFailedAttemptsException\";\nconst _TMRE = \"TooManyRequestsException\";\nconst _TMT = \"TokenModelType\";\nconst _TN = \"TermsName\";\nconst _TP = \"TemporaryPassword\";\nconst _TPVD = \"TemporaryPasswordValidityDays\";\nconst _TR = \"TagResource\";\nconst _TRR = \"TagResourceRequest\";\nconst _TRRa = \"TagResourceResponse\";\nconst _TS = \"TermsSource\";\nconst _TT = \"TokenType\";\nconst _TTe = \"TermsType\";\nconst _TVU = \"TokenValidityUnits\";\nconst _TVUT = \"TokenValidityUnitsType\";\nconst _Ta = \"Tags\";\nconst _Ti = \"Timezone\";\nconst _To = \"Token\";\nconst _U = \"Username\";\nconst _UA = \"UserAttributes\";\nconst _UAEF = \"UpdateAuthEventFeedback\";\nconst _UAEFR = \"UpdateAuthEventFeedbackRequest\";\nconst _UAEFRp = \"UpdateAuthEventFeedbackResponse\";\nconst _UAN = \"UserAttributeNames\";\nconst _UAUS = \"UserAttributeUpdateSettings\";\nconst _UAUST = \"UserAttributeUpdateSettingsType\";\nconst _UAVD = \"UnusedAccountValidityDays\";\nconst _UAs = \"UsernameAttributes\";\nconst _UC = \"UsernameConfiguration\";\nconst _UCD = \"UserCreateDate\";\nconst _UCDT = \"UserContextDataType\";\nconst _UCDs = \"UserContextData\";\nconst _UCN = \"UserConfirmationNecessary\";\nconst _UCPV = \"UseCognitoProvidedValues\";\nconst _UCT = \"UsernameConfigurationType\";\nconst _UCs = \"UserConfirmed\";\nconst _UCse = \"UserCode\";\nconst _UDS = \"UserDataShared\";\nconst _UDSR = \"UpdateDeviceStatusRequest\";\nconst _UDSRp = \"UpdateDeviceStatusResponse\";\nconst _UDSp = \"UpdateDeviceStatus\";\nconst _UE = \"UnauthorizedException\";\nconst _UEE = \"UsernameExistsException\";\nconst _UG = \"UpdateGroup\";\nconst _UGR = \"UpdateGroupRequest\";\nconst _UGRp = \"UpdateGroupResponse\";\nconst _UIC = \"UICustomization\";\nconst _UICT = \"UICustomizationType\";\nconst _UIIPE = \"UserImportInProgressException\";\nconst _UIJ = \"UserImportJob\";\nconst _UIJLT = \"UserImportJobsListType\";\nconst _UIJT = \"UserImportJobType\";\nconst _UIJs = \"UserImportJobs\";\nconst _UIP = \"UpdateIdentityProvider\";\nconst _UIPE = \"UnsupportedIdentityProviderException\";\nconst _UIPR = \"UpdateIdentityProviderRequest\";\nconst _UIPRp = \"UpdateIdentityProviderResponse\";\nconst _ULE = \"UnexpectedLambdaException\";\nconst _ULMD = \"UserLastModifiedDate\";\nconst _ULT = \"UsersListType\";\nconst _ULVE = \"UserLambdaValidationException\";\nconst _UM = \"UserMigration\";\nconst _UMFASL = \"UserMFASettingList\";\nconst _UMLB = \"UpdateManagedLoginBranding\";\nconst _UMLBR = \"UpdateManagedLoginBrandingRequest\";\nconst _UMLBRp = \"UpdateManagedLoginBrandingResponse\";\nconst _UNCE = \"UserNotConfirmedException\";\nconst _UNFE = \"UserNotFoundException\";\nconst _UOE = \"UnsupportedOperationException\";\nconst _UP = \"UserPool\";\nconst _UPAO = \"UserPoolAddOns\";\nconst _UPAONEE = \"UserPoolAddOnNotEnabledException\";\nconst _UPAOT = \"UserPoolAddOnsType\";\nconst _UPC = \"UserPoolClient\";\nconst _UPCD = \"UserPoolClientDescription\";\nconst _UPCLT = \"UserPoolClientListType\";\nconst _UPCT = \"UserPoolClientType\";\nconst _UPCs = \"UserPoolClients\";\nconst _UPDT = \"UserPoolDescriptionType\";\nconst _UPI = \"UserPoolId\";\nconst _UPLT = \"UserPoolListType\";\nconst _UPPT = \"UserPoolPolicyType\";\nconst _UPT = \"UserPoolTags\";\nconst _UPTE = \"UserPoolTaggingException\";\nconst _UPTs = \"UserPoolTier\";\nconst _UPTse = \"UserPoolType\";\nconst _UPs = \"UserPools\";\nconst _UR = \"UntagResource\";\nconst _URR = \"UntagResourceRequest\";\nconst _URRn = \"UntagResourceResponse\";\nconst _URS = \"UpdateResourceServer\";\nconst _URSR = \"UpdateResourceServerRequest\";\nconst _URSRp = \"UpdateResourceServerResponse\";\nconst _US = \"UserStatus\";\nconst _USs = \"UserSub\";\nconst _UT = \"UsernameType\";\nconst _UTR = \"UpdateTermsRequest\";\nconst _UTRp = \"UpdateTermsResponse\";\nconst _UTTE = \"UnsupportedTokenTypeException\";\nconst _UTp = \"UpdateTerms\";\nconst _UTs = \"UserType\";\nconst _UUA = \"UpdateUserAttributes\";\nconst _UUAR = \"UpdateUserAttributesRequest\";\nconst _UUARp = \"UpdateUserAttributesResponse\";\nconst _UUP = \"UpdateUserPool\";\nconst _UUPC = \"UpdateUserPoolClient\";\nconst _UUPCR = \"UpdateUserPoolClientRequest\";\nconst _UUPCRp = \"UpdateUserPoolClientResponse\";\nconst _UUPD = \"UpdateUserPoolDomain\";\nconst _UUPDR = \"UpdateUserPoolDomainRequest\";\nconst _UUPDRp = \"UpdateUserPoolDomainResponse\";\nconst _UUPR = \"UpdateUserPoolRequest\";\nconst _UUPRp = \"UpdateUserPoolResponse\";\nconst _UUSE = \"UnsupportedUserStateException\";\nconst _UV = \"UserVerification\";\nconst _Us = \"User\";\nconst _Use = \"Users\";\nconst _V = \"Value\";\nconst _VACR = \"VerifyAuthChallengeResponse\";\nconst _VD = \"ValidationData\";\nconst _VMT = \"VerificationMessageTemplate\";\nconst _VMTT = \"VerificationMessageTemplateType\";\nconst _VST = \"VerifySoftwareToken\";\nconst _VSTR = \"VerifySoftwareTokenRequest\";\nconst _VSTRe = \"VerifySoftwareTokenResponse\";\nconst _VUA = \"VerifyUserAttribute\";\nconst _VUAR = \"VerifyUserAttributeRequest\";\nconst _VUARe = \"VerifyUserAttributeResponse\";\nconst _Ve = \"Version\";\nconst _WA = \"WriteAttributes\";\nconst _WAC = \"WebAuthnConfiguration\";\nconst _WACD = \"WebAuthnCredentialDescription\";\nconst _WACDLT = \"WebAuthnCredentialDescriptionListType\";\nconst _WACME = \"WebAuthnClientMismatchException\";\nconst _WACMEe = \"WebAuthnConfigurationMissingException\";\nconst _WACNFE = \"WebAuthnChallengeNotFoundException\";\nconst _WACNSE = \"WebAuthnCredentialNotSupportedException\";\nconst _WACT = \"WebAuthnConfigurationType\";\nconst _WANEE = \"WebAuthnNotEnabledException\";\nconst _WAONAE = \"WebAuthnOriginNotAllowedException\";\nconst _WARPME = \"WebAuthnRelyingPartyMismatchException\";\nconst _c = \"client\";\nconst _e = \"error\";\nconst _hE = \"httpError\";\nconst _hN = \"headerName\";\nconst _hV = \"headerValue\";\nconst _m = \"message\";\nconst _rC = \"reasonCode\";\nconst _s = \"smithy.ts.sdk.synthetic.com.amazonaws.cognitoidentityprovider\";\nconst _se = \"server\";\nconst n0 = \"com.amazonaws.cognitoidentityprovider\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { CognitoIdentityProviderServiceException } from \"../models/CognitoIdentityProviderServiceException\";\nimport { AliasExistsException, CodeDeliveryFailureException, CodeMismatchException, ConcurrentModificationException, DeviceKeyExistsException, DuplicateProviderException, EnableSoftwareTokenMFAException, ExpiredCodeException, FeatureUnavailableInTierException, ForbiddenException, GroupExistsException, InternalErrorException, InvalidEmailRoleAccessPolicyException, InvalidLambdaResponseException, InvalidOAuthFlowException, InvalidParameterException, InvalidPasswordException, InvalidSmsRoleAccessPolicyException, InvalidSmsRoleTrustRelationshipException, InvalidUserPoolConfigurationException, LimitExceededException, ManagedLoginBrandingExistsException, MFAMethodNotFoundException, NotAuthorizedException, PasswordHistoryPolicyViolationException, PasswordResetRequiredException, PreconditionNotMetException, RefreshTokenReuseException, ResourceNotFoundException, ScopeDoesNotExistException, SoftwareTokenMFANotFoundException, TermsExistsException, TierChangeNotAllowedException, TooManyFailedAttemptsException, TooManyRequestsException, UnauthorizedException, UnexpectedLambdaException, UnsupportedIdentityProviderException, UnsupportedOperationException, UnsupportedTokenTypeException, UnsupportedUserStateException, UserImportInProgressException, UserLambdaValidationException, UsernameExistsException, UserNotConfirmedException, UserNotFoundException, UserPoolAddOnNotEnabledException, UserPoolTaggingException, WebAuthnChallengeNotFoundException, WebAuthnClientMismatchException, WebAuthnConfigurationMissingException, WebAuthnCredentialNotSupportedException, WebAuthnNotEnabledException, WebAuthnOriginNotAllowedException, WebAuthnRelyingPartyMismatchException, } from \"../models/errors\";\nconst _s_registry = TypeRegistry.for(_s);\nexport var CognitoIdentityProviderServiceException$ = [-3, _s, \"CognitoIdentityProviderServiceException\", 0, [], []];\n_s_registry.registerError(CognitoIdentityProviderServiceException$, CognitoIdentityProviderServiceException);\nconst n0_registry = TypeRegistry.for(n0);\nexport var AliasExistsException$ = [-3, n0, _AEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(AliasExistsException$, AliasExistsException);\nexport var CodeDeliveryFailureException$ = [-3, n0, _CDFE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(CodeDeliveryFailureException$, CodeDeliveryFailureException);\nexport var CodeMismatchException$ = [-3, n0, _CME,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(CodeMismatchException$, CodeMismatchException);\nexport var ConcurrentModificationException$ = [-3, n0, _CMEo,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ConcurrentModificationException$, ConcurrentModificationException);\nexport var DeviceKeyExistsException$ = [-3, n0, _DKEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(DeviceKeyExistsException$, DeviceKeyExistsException);\nexport var DuplicateProviderException$ = [-3, n0, _DPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(DuplicateProviderException$, DuplicateProviderException);\nexport var EnableSoftwareTokenMFAException$ = [-3, n0, _ESTMFAE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(EnableSoftwareTokenMFAException$, EnableSoftwareTokenMFAException);\nexport var ExpiredCodeException$ = [-3, n0, _ECE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ExpiredCodeException$, ExpiredCodeException);\nexport var FeatureUnavailableInTierException$ = [-3, n0, _FUITE,\n    { [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(FeatureUnavailableInTierException$, FeatureUnavailableInTierException);\nexport var ForbiddenException$ = [-3, n0, _FE,\n    { [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ForbiddenException$, ForbiddenException);\nexport var GroupExistsException$ = [-3, n0, _GEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(GroupExistsException$, GroupExistsException);\nexport var InternalErrorException$ = [-3, n0, _IEE,\n    { [_e]: _se },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InternalErrorException$, InternalErrorException);\nexport var InvalidEmailRoleAccessPolicyException$ = [-3, n0, _IERAPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidEmailRoleAccessPolicyException$, InvalidEmailRoleAccessPolicyException);\nexport var InvalidLambdaResponseException$ = [-3, n0, _ILRE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidLambdaResponseException$, InvalidLambdaResponseException);\nexport var InvalidOAuthFlowException$ = [-3, n0, _IOAFE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidOAuthFlowException$, InvalidOAuthFlowException);\nexport var InvalidParameterException$ = [-3, n0, _IPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m, _rC],\n    [0, 0]\n];\nn0_registry.registerError(InvalidParameterException$, InvalidParameterException);\nexport var InvalidPasswordException$ = [-3, n0, _IPEn,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidPasswordException$, InvalidPasswordException);\nexport var InvalidSmsRoleAccessPolicyException$ = [-3, n0, _ISRAPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidSmsRoleAccessPolicyException$, InvalidSmsRoleAccessPolicyException);\nexport var InvalidSmsRoleTrustRelationshipException$ = [-3, n0, _ISRTRE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidSmsRoleTrustRelationshipException$, InvalidSmsRoleTrustRelationshipException);\nexport var InvalidUserPoolConfigurationException$ = [-3, n0, _IUPCE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(InvalidUserPoolConfigurationException$, InvalidUserPoolConfigurationException);\nexport var LimitExceededException$ = [-3, n0, _LEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(LimitExceededException$, LimitExceededException);\nexport var ManagedLoginBrandingExistsException$ = [-3, n0, _MLBEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ManagedLoginBrandingExistsException$, ManagedLoginBrandingExistsException);\nexport var MFAMethodNotFoundException$ = [-3, n0, _MFAMNFE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(MFAMethodNotFoundException$, MFAMethodNotFoundException);\nexport var NotAuthorizedException$ = [-3, n0, _NAE,\n    { [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(NotAuthorizedException$, NotAuthorizedException);\nexport var PasswordHistoryPolicyViolationException$ = [-3, n0, _PHPVE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(PasswordHistoryPolicyViolationException$, PasswordHistoryPolicyViolationException);\nexport var PasswordResetRequiredException$ = [-3, n0, _PRRE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(PasswordResetRequiredException$, PasswordResetRequiredException);\nexport var PreconditionNotMetException$ = [-3, n0, _PNME,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(PreconditionNotMetException$, PreconditionNotMetException);\nexport var RefreshTokenReuseException$ = [-3, n0, _RTRE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(RefreshTokenReuseException$, RefreshTokenReuseException);\nexport var ResourceNotFoundException$ = [-3, n0, _RNFE,\n    { [_e]: _c, [_hE]: 404 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ResourceNotFoundException$, ResourceNotFoundException);\nexport var ScopeDoesNotExistException$ = [-3, n0, _SDNEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(ScopeDoesNotExistException$, ScopeDoesNotExistException);\nexport var SoftwareTokenMFANotFoundException$ = [-3, n0, _STMFANFE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(SoftwareTokenMFANotFoundException$, SoftwareTokenMFANotFoundException);\nexport var TermsExistsException$ = [-3, n0, _TEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(TermsExistsException$, TermsExistsException);\nexport var TierChangeNotAllowedException$ = [-3, n0, _TCNAE,\n    { [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(TierChangeNotAllowedException$, TierChangeNotAllowedException);\nexport var TooManyFailedAttemptsException$ = [-3, n0, _TMFAE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(TooManyFailedAttemptsException$, TooManyFailedAttemptsException);\nexport var TooManyRequestsException$ = [-3, n0, _TMRE,\n    { [_e]: _c, [_hE]: 429 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(TooManyRequestsException$, TooManyRequestsException);\nexport var UnauthorizedException$ = [-3, n0, _UE,\n    { [_e]: _c, [_hE]: 401 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnauthorizedException$, UnauthorizedException);\nexport var UnexpectedLambdaException$ = [-3, n0, _ULE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnexpectedLambdaException$, UnexpectedLambdaException);\nexport var UnsupportedIdentityProviderException$ = [-3, n0, _UIPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnsupportedIdentityProviderException$, UnsupportedIdentityProviderException);\nexport var UnsupportedOperationException$ = [-3, n0, _UOE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnsupportedOperationException$, UnsupportedOperationException);\nexport var UnsupportedTokenTypeException$ = [-3, n0, _UTTE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnsupportedTokenTypeException$, UnsupportedTokenTypeException);\nexport var UnsupportedUserStateException$ = [-3, n0, _UUSE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UnsupportedUserStateException$, UnsupportedUserStateException);\nexport var UserImportInProgressException$ = [-3, n0, _UIIPE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserImportInProgressException$, UserImportInProgressException);\nexport var UserLambdaValidationException$ = [-3, n0, _ULVE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserLambdaValidationException$, UserLambdaValidationException);\nexport var UsernameExistsException$ = [-3, n0, _UEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UsernameExistsException$, UsernameExistsException);\nexport var UserNotConfirmedException$ = [-3, n0, _UNCE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserNotConfirmedException$, UserNotConfirmedException);\nexport var UserNotFoundException$ = [-3, n0, _UNFE,\n    { [_e]: _c, [_hE]: 404 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserNotFoundException$, UserNotFoundException);\nexport var UserPoolAddOnNotEnabledException$ = [-3, n0, _UPAONEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserPoolAddOnNotEnabledException$, UserPoolAddOnNotEnabledException);\nexport var UserPoolTaggingException$ = [-3, n0, _UPTE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(UserPoolTaggingException$, UserPoolTaggingException);\nexport var WebAuthnChallengeNotFoundException$ = [-3, n0, _WACNFE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnChallengeNotFoundException$, WebAuthnChallengeNotFoundException);\nexport var WebAuthnClientMismatchException$ = [-3, n0, _WACME,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnClientMismatchException$, WebAuthnClientMismatchException);\nexport var WebAuthnConfigurationMissingException$ = [-3, n0, _WACMEe,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnConfigurationMissingException$, WebAuthnConfigurationMissingException);\nexport var WebAuthnCredentialNotSupportedException$ = [-3, n0, _WACNSE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnCredentialNotSupportedException$, WebAuthnCredentialNotSupportedException);\nexport var WebAuthnNotEnabledException$ = [-3, n0, _WANEE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnNotEnabledException$, WebAuthnNotEnabledException);\nexport var WebAuthnOriginNotAllowedException$ = [-3, n0, _WAONAE,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnOriginNotAllowedException$, WebAuthnOriginNotAllowedException);\nexport var WebAuthnRelyingPartyMismatchException$ = [-3, n0, _WARPME,\n    { [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0]\n];\nn0_registry.registerError(WebAuthnRelyingPartyMismatchException$, WebAuthnRelyingPartyMismatchException);\nexport const errorTypeRegistries = [\n    _s_registry,\n    n0_registry,\n];\nvar AttributeValueType = [0, n0, _AVT, 8, 0];\nvar ClientIdType = [0, n0, _CIT, 8, 0];\nvar ClientSecretType = [0, n0, _CST, 8, 0];\nvar PasswordType = [0, n0, _PT, 8, 0];\nvar SecretCodeType = [0, n0, _SCT, 8, 0];\nvar SecretHashType = [0, n0, _SHT, 8, 0];\nvar SessionType = [0, n0, _ST, 8, 0];\nvar SoftwareTokenMFAUserCodeType = [0, n0, _STMFAUCT, 8, 0];\nvar TokenModelType = [0, n0, _TMT, 8, 0];\nvar UsernameType = [0, n0, _UT, 8, 0];\nexport var AccountRecoverySettingType$ = [3, n0, _ARST,\n    0,\n    [_RM],\n    [() => RecoveryMechanismsType]\n];\nexport var AccountTakeoverActionsType$ = [3, n0, _ATAT,\n    0,\n    [_LA, _MA, _HA],\n    [() => AccountTakeoverActionType$, () => AccountTakeoverActionType$, () => AccountTakeoverActionType$]\n];\nexport var AccountTakeoverActionType$ = [3, n0, _ATATc,\n    0,\n    [_N, _EA],\n    [2, 0], 2\n];\nexport var AccountTakeoverRiskConfigurationType$ = [3, n0, _ATRCT,\n    0,\n    [_A, _NC],\n    [() => AccountTakeoverActionsType$, () => NotifyConfigurationType$], 1\n];\nexport var AddCustomAttributesRequest$ = [3, n0, _ACAR,\n    0,\n    [_UPI, _CA],\n    [0, () => CustomAttributesListType], 2\n];\nexport var AddCustomAttributesResponse$ = [3, n0, _ACARd,\n    0,\n    [],\n    []\n];\nexport var AdminAddUserToGroupRequest$ = [3, n0, _AAUTGR,\n    0,\n    [_UPI, _U, _GN],\n    [0, [() => UsernameType, 0], 0], 3\n];\nexport var AdminConfirmSignUpRequest$ = [3, n0, _ACSUR,\n    0,\n    [_UPI, _U, _CM],\n    [0, [() => UsernameType, 0], 128 | 0], 2\n];\nexport var AdminConfirmSignUpResponse$ = [3, n0, _ACSURd,\n    0,\n    [],\n    []\n];\nexport var AdminCreateUserConfigType$ = [3, n0, _ACUCT,\n    0,\n    [_AACUO, _UAVD, _IMT],\n    [2, 1, () => MessageTemplateType$]\n];\nexport var AdminCreateUserRequest$ = [3, n0, _ACUR,\n    0,\n    [_UPI, _U, _UA, _VD, _TP, _FAC, _MAe, _DDM, _CM],\n    [0, [() => UsernameType, 0], [() => AttributeListType, 0], [() => AttributeListType, 0], [() => PasswordType, 0], 2, 0, 64 | 0, 128 | 0], 2\n];\nexport var AdminCreateUserResponse$ = [3, n0, _ACURd,\n    0,\n    [_Us],\n    [[() => UserType$, 0]]\n];\nexport var AdminDeleteUserAttributesRequest$ = [3, n0, _ADUAR,\n    0,\n    [_UPI, _U, _UAN],\n    [0, [() => UsernameType, 0], 64 | 0], 3\n];\nexport var AdminDeleteUserAttributesResponse$ = [3, n0, _ADUARd,\n    0,\n    [],\n    []\n];\nexport var AdminDeleteUserRequest$ = [3, n0, _ADUR,\n    0,\n    [_UPI, _U],\n    [0, [() => UsernameType, 0]], 2\n];\nexport var AdminDisableProviderForUserRequest$ = [3, n0, _ADPFUR,\n    0,\n    [_UPI, _Us],\n    [0, () => ProviderUserIdentifierType$], 2\n];\nexport var AdminDisableProviderForUserResponse$ = [3, n0, _ADPFURd,\n    0,\n    [],\n    []\n];\nexport var AdminDisableUserRequest$ = [3, n0, _ADURd,\n    0,\n    [_UPI, _U],\n    [0, [() => UsernameType, 0]], 2\n];\nexport var AdminDisableUserResponse$ = [3, n0, _ADURdm,\n    0,\n    [],\n    []\n];\nexport var AdminEnableUserRequest$ = [3, n0, _AEUR,\n    0,\n    [_UPI, _U],\n    [0, [() => UsernameType, 0]], 2\n];\nexport var AdminEnableUserResponse$ = [3, n0, _AEURd,\n    0,\n    [],\n    []\n];\nexport var AdminForgetDeviceRequest$ = [3, n0, _AFDR,\n    0,\n    [_UPI, _U, _DK],\n    [0, [() => UsernameType, 0], 0], 3\n];\nexport var AdminGetDeviceRequest$ = [3, n0, _AGDR,\n    0,\n    [_DK, _UPI, _U],\n    [0, 0, [() => UsernameType, 0]], 3\n];\nexport var AdminGetDeviceResponse$ = [3, n0, _AGDRd,\n    0,\n    [_D],\n    [[() => DeviceType$, 0]], 1\n];\nexport var AdminGetUserRequest$ = [3, n0, _AGUR,\n    0,\n    [_UPI, _U],\n    [0, [() => UsernameType, 0]], 2\n];\nexport var AdminGetUserResponse$ = [3, n0, _AGURd,\n    0,\n    [_U, _UA, _UCD, _ULMD, _E, _US, _MFAO, _PMS, _UMFASL],\n    [[() => UsernameType, 0], [() => AttributeListType, 0], 4, 4, 2, 0, () => MFAOptionListType, 0, 64 | 0], 1\n];\nexport var AdminInitiateAuthRequest$ = [3, n0, _AIAR,\n    0,\n    [_UPI, _CI, _AF, _AP, _CM, _AM, _CD, _S],\n    [0, [() => ClientIdType, 0], 0, [() => AuthParametersType, 0], 128 | 0, () => AnalyticsMetadataType$, () => ContextDataType$, [() => SessionType, 0]], 3\n];\nexport var AdminInitiateAuthResponse$ = [3, n0, _AIARd,\n    0,\n    [_CN, _S, _CP, _AR, _AC],\n    [0, [() => SessionType, 0], 128 | 0, [() => AuthenticationResultType$, 0], 64 | 0]\n];\nexport var AdminLinkProviderForUserRequest$ = [3, n0, _ALPFUR,\n    0,\n    [_UPI, _DU, _SU],\n    [0, () => ProviderUserIdentifierType$, () => ProviderUserIdentifierType$], 3\n];\nexport var AdminLinkProviderForUserResponse$ = [3, n0, _ALPFURd,\n    0,\n    [],\n    []\n];\nexport var AdminListDevicesRequest$ = [3, n0, _ALDR,\n    0,\n    [_UPI, _U, _L, _PTa],\n    [0, [() => UsernameType, 0], 1, 0], 2\n];\nexport var AdminListDevicesResponse$ = [3, n0, _ALDRd,\n    0,\n    [_De, _PTa],\n    [[() => DeviceListType, 0], 0]\n];\nexport var AdminListGroupsForUserRequest$ = [3, n0, _ALGFUR,\n    0,\n    [_U, _UPI, _L, _NT],\n    [[() => UsernameType, 0], 0, 1, 0], 2\n];\nexport var AdminListGroupsForUserResponse$ = [3, n0, _ALGFURd,\n    0,\n    [_G, _NT],\n    [() => GroupListType, 0]\n];\nexport var AdminListUserAuthEventsRequest$ = [3, n0, _ALUAER,\n    0,\n    [_UPI, _U, _MR, _NT],\n    [0, [() => UsernameType, 0], 1, 0], 2\n];\nexport var AdminListUserAuthEventsResponse$ = [3, n0, _ALUAERd,\n    0,\n    [_AE, _NT],\n    [() => AuthEventsType, 0]\n];\nexport var AdminRemoveUserFromGroupRequest$ = [3, n0, _ARUFGR,\n    0,\n    [_UPI, _U, _GN],\n    [0, [() => UsernameType, 0], 0], 3\n];\nexport var AdminResetUserPasswordRequest$ = [3, n0, _ARUPR,\n    0,\n    [_UPI, _U, _CM],\n    [0, [() => UsernameType, 0], 128 | 0], 2\n];\nexport var AdminResetUserPasswordResponse$ = [3, n0, _ARUPRd,\n    0,\n    [],\n    []\n];\nexport var AdminRespondToAuthChallengeRequest$ = [3, n0, _ARTACR,\n    0,\n    [_UPI, _CI, _CN, _CR, _S, _AM, _CD, _CM],\n    [0, [() => ClientIdType, 0], 0, [() => ChallengeResponsesType, 0], [() => SessionType, 0], () => AnalyticsMetadataType$, () => ContextDataType$, 128 | 0], 3\n];\nexport var AdminRespondToAuthChallengeResponse$ = [3, n0, _ARTACRd,\n    0,\n    [_CN, _S, _CP, _AR],\n    [0, [() => SessionType, 0], 128 | 0, [() => AuthenticationResultType$, 0]]\n];\nexport var AdminSetUserMFAPreferenceRequest$ = [3, n0, _ASUMFAPR,\n    0,\n    [_U, _UPI, _SMSMS, _STMS, _EMS],\n    [[() => UsernameType, 0], 0, () => SMSMfaSettingsType$, () => SoftwareTokenMfaSettingsType$, () => EmailMfaSettingsType$], 2\n];\nexport var AdminSetUserMFAPreferenceResponse$ = [3, n0, _ASUMFAPRd,\n    0,\n    [],\n    []\n];\nexport var AdminSetUserPasswordRequest$ = [3, n0, _ASUPR,\n    0,\n    [_UPI, _U, _P, _Pe],\n    [0, [() => UsernameType, 0], [() => PasswordType, 0], 2], 3\n];\nexport var AdminSetUserPasswordResponse$ = [3, n0, _ASUPRd,\n    0,\n    [],\n    []\n];\nexport var AdminSetUserSettingsRequest$ = [3, n0, _ASUSR,\n    0,\n    [_UPI, _U, _MFAO],\n    [0, [() => UsernameType, 0], () => MFAOptionListType], 3\n];\nexport var AdminSetUserSettingsResponse$ = [3, n0, _ASUSRd,\n    0,\n    [],\n    []\n];\nexport var AdminUpdateAuthEventFeedbackRequest$ = [3, n0, _AUAEFR,\n    0,\n    [_UPI, _U, _EI, _FV],\n    [0, [() => UsernameType, 0], 0, 0], 4\n];\nexport var AdminUpdateAuthEventFeedbackResponse$ = [3, n0, _AUAEFRd,\n    0,\n    [],\n    []\n];\nexport var AdminUpdateDeviceStatusRequest$ = [3, n0, _AUDSR,\n    0,\n    [_UPI, _U, _DK, _DRS],\n    [0, [() => UsernameType, 0], 0, 0], 3\n];\nexport var AdminUpdateDeviceStatusResponse$ = [3, n0, _AUDSRd,\n    0,\n    [],\n    []\n];\nexport var AdminUpdateUserAttributesRequest$ = [3, n0, _AUUAR,\n    0,\n    [_UPI, _U, _UA, _CM],\n    [0, [() => UsernameType, 0], [() => AttributeListType, 0], 128 | 0], 3\n];\nexport var AdminUpdateUserAttributesResponse$ = [3, n0, _AUUARd,\n    0,\n    [],\n    []\n];\nexport var AdminUserGlobalSignOutRequest$ = [3, n0, _AUGSOR,\n    0,\n    [_UPI, _U],\n    [0, [() => UsernameType, 0]], 2\n];\nexport var AdminUserGlobalSignOutResponse$ = [3, n0, _AUGSORd,\n    0,\n    [],\n    []\n];\nexport var AdvancedSecurityAdditionalFlowsType$ = [3, n0, _ASAFT,\n    0,\n    [_CAM],\n    [0]\n];\nexport var AnalyticsConfigurationType$ = [3, n0, _ACT,\n    0,\n    [_AI, _AA, _RA, _EIx, _UDS],\n    [0, 0, 0, 0, 2]\n];\nexport var AnalyticsMetadataType$ = [3, n0, _AMT,\n    0,\n    [_AEI],\n    [0]\n];\nexport var AssetType$ = [3, n0, _AT,\n    0,\n    [_C, _CMo, _Ex, _B, _RI],\n    [0, 0, 0, 21, 0], 3\n];\nexport var AssociateSoftwareTokenRequest$ = [3, n0, _ASTR,\n    0,\n    [_ATc, _S],\n    [[() => TokenModelType, 0], [() => SessionType, 0]]\n];\nexport var AssociateSoftwareTokenResponse$ = [3, n0, _ASTRs,\n    0,\n    [_SC, _S],\n    [[() => SecretCodeType, 0], [() => SessionType, 0]]\n];\nexport var AttributeType$ = [3, n0, _ATt,\n    0,\n    [_Na, _V],\n    [0, [() => AttributeValueType, 0]], 1\n];\nexport var AuthenticationResultType$ = [3, n0, _ART,\n    0,\n    [_ATc, _EIxp, _TT, _RT, _IT, _NDM],\n    [[() => TokenModelType, 0], 1, 0, [() => TokenModelType, 0], [() => TokenModelType, 0], () => NewDeviceMetadataType$]\n];\nexport var AuthEventType$ = [3, n0, _AET,\n    0,\n    [_EI, _ET, _CDr, _ER, _ERv, _CR, _ECD, _EF],\n    [0, 0, 4, 0, () => EventRiskType$, () => ChallengeResponseListType, () => EventContextDataType$, () => EventFeedbackType$]\n];\nexport var ChallengeResponseType$ = [3, n0, _CRT,\n    0,\n    [_CN, _CRh],\n    [0, 0]\n];\nexport var ChangePasswordRequest$ = [3, n0, _CPR,\n    0,\n    [_PP, _ATc, _PPr],\n    [[() => PasswordType, 0], [() => TokenModelType, 0], [() => PasswordType, 0]], 2\n];\nexport var ChangePasswordResponse$ = [3, n0, _CPRh,\n    0,\n    [],\n    []\n];\nexport var CloudWatchLogsConfigurationType$ = [3, n0, _CWLCT,\n    0,\n    [_LGA],\n    [0]\n];\nexport var CodeDeliveryDetailsType$ = [3, n0, _CDDT,\n    0,\n    [_Des, _DM, _AN],\n    [0, 0, 0]\n];\nexport var CompleteWebAuthnRegistrationRequest$ = [3, n0, _CWARR,\n    0,\n    [_ATc, _Cr],\n    [[() => TokenModelType, 0], 15], 2\n];\nexport var CompleteWebAuthnRegistrationResponse$ = [3, n0, _CWARRo,\n    0,\n    [],\n    []\n];\nexport var CompromisedCredentialsActionsType$ = [3, n0, _CCAT,\n    0,\n    [_EA],\n    [0], 1\n];\nexport var CompromisedCredentialsRiskConfigurationType$ = [3, n0, _CCRCT,\n    0,\n    [_A, _EFv],\n    [() => CompromisedCredentialsActionsType$, 64 | 0], 1\n];\nexport var ConfirmDeviceRequest$ = [3, n0, _CDR,\n    0,\n    [_ATc, _DK, _DSVC, _DN],\n    [[() => TokenModelType, 0], 0, () => DeviceSecretVerifierConfigType$, 0], 2\n];\nexport var ConfirmDeviceResponse$ = [3, n0, _CDRo,\n    0,\n    [_UCN],\n    [2]\n];\nexport var ConfirmForgotPasswordRequest$ = [3, n0, _CFPR,\n    0,\n    [_CI, _U, _CC, _P, _SH, _AM, _UCDs, _CM],\n    [[() => ClientIdType, 0], [() => UsernameType, 0], 0, [() => PasswordType, 0], [() => SecretHashType, 0], () => AnalyticsMetadataType$, [() => UserContextDataType$, 0], 128 | 0], 4\n];\nexport var ConfirmForgotPasswordResponse$ = [3, n0, _CFPRo,\n    0,\n    [],\n    []\n];\nexport var ConfirmSignUpRequest$ = [3, n0, _CSUR,\n    0,\n    [_CI, _U, _CC, _SH, _FAC, _AM, _UCDs, _CM, _S],\n    [[() => ClientIdType, 0], [() => UsernameType, 0], 0, [() => SecretHashType, 0], 2, () => AnalyticsMetadataType$, [() => UserContextDataType$, 0], 128 | 0, [() => SessionType, 0]], 3\n];\nexport var ConfirmSignUpResponse$ = [3, n0, _CSURo,\n    0,\n    [_S],\n    [[() => SessionType, 0]]\n];\nexport var ContextDataType$ = [3, n0, _CDT,\n    0,\n    [_IA, _SN, _SP, _HH, _ED],\n    [0, 0, 0, () => HttpHeaderList, 0], 4\n];\nexport var CreateGroupRequest$ = [3, n0, _CGR,\n    0,\n    [_GN, _UPI, _Desc, _RA, _Pr],\n    [0, 0, 0, 0, 1], 2\n];\nexport var CreateGroupResponse$ = [3, n0, _CGRr,\n    0,\n    [_Gr],\n    [() => GroupType$]\n];\nexport var CreateIdentityProviderRequest$ = [3, n0, _CIPR,\n    0,\n    [_UPI, _PN, _PTr, _PD, _AMt, _II],\n    [0, 0, 0, 128 | 0, 128 | 0, 64 | 0], 4\n];\nexport var CreateIdentityProviderResponse$ = [3, n0, _CIPRr,\n    0,\n    [_IP],\n    [() => IdentityProviderType$], 1\n];\nexport var CreateManagedLoginBrandingRequest$ = [3, n0, _CMLBR,\n    0,\n    [_UPI, _CI, _UCPV, _Se, _As],\n    [0, [() => ClientIdType, 0], 2, 15, () => AssetListType], 2\n];\nexport var CreateManagedLoginBrandingResponse$ = [3, n0, _CMLBRr,\n    0,\n    [_MLB],\n    [() => ManagedLoginBrandingType$]\n];\nexport var CreateResourceServerRequest$ = [3, n0, _CRSR,\n    0,\n    [_UPI, _I, _Na, _Sc],\n    [0, 0, 0, () => ResourceServerScopeListType], 3\n];\nexport var CreateResourceServerResponse$ = [3, n0, _CRSRr,\n    0,\n    [_RS],\n    [() => ResourceServerType$], 1\n];\nexport var CreateTermsRequest$ = [3, n0, _CTR,\n    0,\n    [_UPI, _CI, _TN, _TS, _En, _Li],\n    [0, [() => ClientIdType, 0], 0, 0, 0, 128 | 0], 5\n];\nexport var CreateTermsResponse$ = [3, n0, _CTRr,\n    0,\n    [_T],\n    [[() => TermsType$, 0]]\n];\nexport var CreateUserImportJobRequest$ = [3, n0, _CUIJR,\n    0,\n    [_JN, _UPI, _CWLRA],\n    [0, 0, 0], 3\n];\nexport var CreateUserImportJobResponse$ = [3, n0, _CUIJRr,\n    0,\n    [_UIJ],\n    [() => UserImportJobType$]\n];\nexport var CreateUserPoolClientRequest$ = [3, n0, _CUPCR,\n    0,\n    [_UPI, _CNl, _GS, _RTV, _ATV, _ITV, _TVU, _RAe, _WA, _EAF, _SIP, _CURL, _LURL, _DRURI, _AOAF, _AOAS, _AOAFUPC, _ACn, _PUEE, _ETR, _EPAUCD, _ASV, _RTR],\n    [0, 0, 2, 1, 1, 1, () => TokenValidityUnitsType$, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 0, 64 | 0, 64 | 0, 2, () => AnalyticsConfigurationType$, 0, 2, 2, 1, () => RefreshTokenRotationType$], 2\n];\nexport var CreateUserPoolClientResponse$ = [3, n0, _CUPCRr,\n    0,\n    [_UPC],\n    [[() => UserPoolClientType$, 0]]\n];\nexport var CreateUserPoolDomainRequest$ = [3, n0, _CUPDR,\n    0,\n    [_Do, _UPI, _MLV, _CDC],\n    [0, 0, 1, () => CustomDomainConfigType$], 2\n];\nexport var CreateUserPoolDomainResponse$ = [3, n0, _CUPDRr,\n    0,\n    [_MLV, _CFD],\n    [1, 0]\n];\nexport var CreateUserPoolRequest$ = [3, n0, _CUPR,\n    0,\n    [_PNo, _Po, _DP, _LC, _AVA, _AAl, _UAs, _SVM, _EVM, _EVS, _VMT, _SAM, _MC, _UAUS, _DC, _EC, _SCm, _UPT, _ACUC, _Sch, _UPAO, _UC, _ARS, _UPTs],\n    [0, () => UserPoolPolicyType$, 0, () => LambdaConfigType$, 64 | 0, 64 | 0, 64 | 0, 0, 0, 0, () => VerificationMessageTemplateType$, 0, 0, () => UserAttributeUpdateSettingsType$, () => DeviceConfigurationType$, () => EmailConfigurationType$, () => SmsConfigurationType$, 128 | 0, () => AdminCreateUserConfigType$, () => SchemaAttributesListType, () => UserPoolAddOnsType$, () => UsernameConfigurationType$, () => AccountRecoverySettingType$, 0], 1\n];\nexport var CreateUserPoolResponse$ = [3, n0, _CUPRr,\n    0,\n    [_UP],\n    [() => UserPoolType$]\n];\nexport var CustomDomainConfigType$ = [3, n0, _CDCT,\n    0,\n    [_CAe],\n    [0], 1\n];\nexport var CustomEmailLambdaVersionConfigType$ = [3, n0, _CELVCT,\n    0,\n    [_LV, _LAa],\n    [0, 0], 2\n];\nexport var CustomSMSLambdaVersionConfigType$ = [3, n0, _CSMSLVCT,\n    0,\n    [_LV, _LAa],\n    [0, 0], 2\n];\nexport var DeleteGroupRequest$ = [3, n0, _DGR,\n    0,\n    [_GN, _UPI],\n    [0, 0], 2\n];\nexport var DeleteIdentityProviderRequest$ = [3, n0, _DIPR,\n    0,\n    [_UPI, _PN],\n    [0, 0], 2\n];\nexport var DeleteManagedLoginBrandingRequest$ = [3, n0, _DMLBR,\n    0,\n    [_MLBI, _UPI],\n    [0, 0], 2\n];\nexport var DeleteResourceServerRequest$ = [3, n0, _DRSR,\n    0,\n    [_UPI, _I],\n    [0, 0], 2\n];\nexport var DeleteTermsRequest$ = [3, n0, _DTR,\n    0,\n    [_TI, _UPI],\n    [0, 0], 2\n];\nexport var DeleteUserAttributesRequest$ = [3, n0, _DUAR,\n    0,\n    [_UAN, _ATc],\n    [64 | 0, [() => TokenModelType, 0]], 2\n];\nexport var DeleteUserAttributesResponse$ = [3, n0, _DUARe,\n    0,\n    [],\n    []\n];\nexport var DeleteUserPoolClientRequest$ = [3, n0, _DUPCR,\n    0,\n    [_UPI, _CI],\n    [0, [() => ClientIdType, 0]], 2\n];\nexport var DeleteUserPoolDomainRequest$ = [3, n0, _DUPDR,\n    0,\n    [_Do, _UPI],\n    [0, 0], 2\n];\nexport var DeleteUserPoolDomainResponse$ = [3, n0, _DUPDRe,\n    0,\n    [],\n    []\n];\nexport var DeleteUserPoolRequest$ = [3, n0, _DUPR,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var DeleteUserRequest$ = [3, n0, _DUR,\n    0,\n    [_ATc],\n    [[() => TokenModelType, 0]], 1\n];\nexport var DeleteWebAuthnCredentialRequest$ = [3, n0, _DWACR,\n    0,\n    [_ATc, _CIr],\n    [[() => TokenModelType, 0], 0], 2\n];\nexport var DeleteWebAuthnCredentialResponse$ = [3, n0, _DWACRe,\n    0,\n    [],\n    []\n];\nexport var DescribeIdentityProviderRequest$ = [3, n0, _DIPRe,\n    0,\n    [_UPI, _PN],\n    [0, 0], 2\n];\nexport var DescribeIdentityProviderResponse$ = [3, n0, _DIPRes,\n    0,\n    [_IP],\n    [() => IdentityProviderType$], 1\n];\nexport var DescribeManagedLoginBrandingByClientRequest$ = [3, n0, _DMLBBCR,\n    0,\n    [_UPI, _CI, _RMR],\n    [0, [() => ClientIdType, 0], 2], 2\n];\nexport var DescribeManagedLoginBrandingByClientResponse$ = [3, n0, _DMLBBCRe,\n    0,\n    [_MLB],\n    [() => ManagedLoginBrandingType$]\n];\nexport var DescribeManagedLoginBrandingRequest$ = [3, n0, _DMLBRe,\n    0,\n    [_UPI, _MLBI, _RMR],\n    [0, 0, 2], 2\n];\nexport var DescribeManagedLoginBrandingResponse$ = [3, n0, _DMLBRes,\n    0,\n    [_MLB],\n    [() => ManagedLoginBrandingType$]\n];\nexport var DescribeResourceServerRequest$ = [3, n0, _DRSRe,\n    0,\n    [_UPI, _I],\n    [0, 0], 2\n];\nexport var DescribeResourceServerResponse$ = [3, n0, _DRSRes,\n    0,\n    [_RS],\n    [() => ResourceServerType$], 1\n];\nexport var DescribeRiskConfigurationRequest$ = [3, n0, _DRCR,\n    0,\n    [_UPI, _CI],\n    [0, [() => ClientIdType, 0]], 1\n];\nexport var DescribeRiskConfigurationResponse$ = [3, n0, _DRCRe,\n    0,\n    [_RC],\n    [[() => RiskConfigurationType$, 0]], 1\n];\nexport var DescribeTermsRequest$ = [3, n0, _DTRe,\n    0,\n    [_TI, _UPI],\n    [0, 0], 2\n];\nexport var DescribeTermsResponse$ = [3, n0, _DTRes,\n    0,\n    [_T],\n    [[() => TermsType$, 0]]\n];\nexport var DescribeUserImportJobRequest$ = [3, n0, _DUIJR,\n    0,\n    [_UPI, _JI],\n    [0, 0], 2\n];\nexport var DescribeUserImportJobResponse$ = [3, n0, _DUIJRe,\n    0,\n    [_UIJ],\n    [() => UserImportJobType$]\n];\nexport var DescribeUserPoolClientRequest$ = [3, n0, _DUPCRe,\n    0,\n    [_UPI, _CI],\n    [0, [() => ClientIdType, 0]], 2\n];\nexport var DescribeUserPoolClientResponse$ = [3, n0, _DUPCRes,\n    0,\n    [_UPC],\n    [[() => UserPoolClientType$, 0]]\n];\nexport var DescribeUserPoolDomainRequest$ = [3, n0, _DUPDRes,\n    0,\n    [_Do],\n    [0], 1\n];\nexport var DescribeUserPoolDomainResponse$ = [3, n0, _DUPDResc,\n    0,\n    [_DD],\n    [() => DomainDescriptionType$]\n];\nexport var DescribeUserPoolRequest$ = [3, n0, _DUPRe,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var DescribeUserPoolResponse$ = [3, n0, _DUPRes,\n    0,\n    [_UP],\n    [() => UserPoolType$]\n];\nexport var DeviceConfigurationType$ = [3, n0, _DCT,\n    0,\n    [_CROND, _DOROUP],\n    [2, 2]\n];\nexport var DeviceSecretVerifierConfigType$ = [3, n0, _DSVCT,\n    0,\n    [_PV, _Sa],\n    [0, 0]\n];\nexport var DeviceType$ = [3, n0, _DT,\n    0,\n    [_DK, _DA, _DCD, _DLMD, _DLAD],\n    [0, [() => AttributeListType, 0], 4, 4, 4]\n];\nexport var DomainDescriptionType$ = [3, n0, _DDT,\n    0,\n    [_UPI, _AWSAI, _Do, _SB, _CFDl, _Ve, _St, _CDC, _MLV],\n    [0, 0, 0, 0, 0, 0, 0, () => CustomDomainConfigType$, 1]\n];\nexport var EmailConfigurationType$ = [3, n0, _ECT,\n    0,\n    [_SA, _RTEA, _ESA, _F, _CS],\n    [0, 0, 0, 0, 0]\n];\nexport var EmailMfaConfigType$ = [3, n0, _EMCT,\n    0,\n    [_M, _Su],\n    [0, 0]\n];\nexport var EmailMfaSettingsType$ = [3, n0, _EMST,\n    0,\n    [_E, _PM],\n    [2, 2]\n];\nexport var EventContextDataType$ = [3, n0, _ECDT,\n    0,\n    [_IA, _DN, _Ti, _Ci, _Co],\n    [0, 0, 0, 0, 0]\n];\nexport var EventFeedbackType$ = [3, n0, _EFT,\n    0,\n    [_FV, _Pro, _FD],\n    [0, 0, 4], 2\n];\nexport var EventRiskType$ = [3, n0, _ERT,\n    0,\n    [_RD, _RL, _CCD],\n    [0, 0, 2]\n];\nexport var FirehoseConfigurationType$ = [3, n0, _FCT,\n    0,\n    [_SAt],\n    [0]\n];\nexport var ForgetDeviceRequest$ = [3, n0, _FDR,\n    0,\n    [_DK, _ATc],\n    [0, [() => TokenModelType, 0]], 1\n];\nexport var ForgotPasswordRequest$ = [3, n0, _FPR,\n    0,\n    [_CI, _U, _SH, _UCDs, _AM, _CM],\n    [[() => ClientIdType, 0], [() => UsernameType, 0], [() => SecretHashType, 0], [() => UserContextDataType$, 0], () => AnalyticsMetadataType$, 128 | 0], 2\n];\nexport var ForgotPasswordResponse$ = [3, n0, _FPRo,\n    0,\n    [_CDD],\n    [() => CodeDeliveryDetailsType$]\n];\nexport var GetCSVHeaderRequest$ = [3, n0, _GCSVHR,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var GetCSVHeaderResponse$ = [3, n0, _GCSVHRe,\n    0,\n    [_UPI, _CSVH],\n    [0, 64 | 0]\n];\nexport var GetDeviceRequest$ = [3, n0, _GDR,\n    0,\n    [_DK, _ATc],\n    [0, [() => TokenModelType, 0]], 1\n];\nexport var GetDeviceResponse$ = [3, n0, _GDRe,\n    0,\n    [_D],\n    [[() => DeviceType$, 0]], 1\n];\nexport var GetGroupRequest$ = [3, n0, _GGR,\n    0,\n    [_GN, _UPI],\n    [0, 0], 2\n];\nexport var GetGroupResponse$ = [3, n0, _GGRe,\n    0,\n    [_Gr],\n    [() => GroupType$]\n];\nexport var GetIdentityProviderByIdentifierRequest$ = [3, n0, _GIPBIR,\n    0,\n    [_UPI, _IId],\n    [0, 0], 2\n];\nexport var GetIdentityProviderByIdentifierResponse$ = [3, n0, _GIPBIRe,\n    0,\n    [_IP],\n    [() => IdentityProviderType$], 1\n];\nexport var GetLogDeliveryConfigurationRequest$ = [3, n0, _GLDCR,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var GetLogDeliveryConfigurationResponse$ = [3, n0, _GLDCRe,\n    0,\n    [_LDC],\n    [() => LogDeliveryConfigurationType$]\n];\nexport var GetSigningCertificateRequest$ = [3, n0, _GSCR,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var GetSigningCertificateResponse$ = [3, n0, _GSCRe,\n    0,\n    [_Ce],\n    [0]\n];\nexport var GetTokensFromRefreshTokenRequest$ = [3, n0, _GTFRTR,\n    0,\n    [_RT, _CI, _CSl, _DK, _CM],\n    [[() => TokenModelType, 0], [() => ClientIdType, 0], [() => ClientSecretType, 0], 0, 128 | 0], 2\n];\nexport var GetTokensFromRefreshTokenResponse$ = [3, n0, _GTFRTRe,\n    0,\n    [_AR],\n    [[() => AuthenticationResultType$, 0]]\n];\nexport var GetUICustomizationRequest$ = [3, n0, _GUICR,\n    0,\n    [_UPI, _CI],\n    [0, [() => ClientIdType, 0]], 1\n];\nexport var GetUICustomizationResponse$ = [3, n0, _GUICRe,\n    0,\n    [_UIC],\n    [[() => UICustomizationType$, 0]], 1\n];\nexport var GetUserAttributeVerificationCodeRequest$ = [3, n0, _GUAVCR,\n    0,\n    [_ATc, _AN, _CM],\n    [[() => TokenModelType, 0], 0, 128 | 0], 2\n];\nexport var GetUserAttributeVerificationCodeResponse$ = [3, n0, _GUAVCRe,\n    0,\n    [_CDD],\n    [() => CodeDeliveryDetailsType$]\n];\nexport var GetUserAuthFactorsRequest$ = [3, n0, _GUAFR,\n    0,\n    [_ATc],\n    [[() => TokenModelType, 0]], 1\n];\nexport var GetUserAuthFactorsResponse$ = [3, n0, _GUAFRe,\n    0,\n    [_U, _PMS, _UMFASL, _CUAF],\n    [[() => UsernameType, 0], 0, 64 | 0, 64 | 0], 1\n];\nexport var GetUserPoolMfaConfigRequest$ = [3, n0, _GUPMCR,\n    0,\n    [_UPI],\n    [0], 1\n];\nexport var GetUserPoolMfaConfigResponse$ = [3, n0, _GUPMCRe,\n    0,\n    [_SMC, _STMC, _EMC, _MC, _WAC],\n    [() => SmsMfaConfigType$, () => SoftwareTokenMfaConfigType$, () => EmailMfaConfigType$, 0, () => WebAuthnConfigurationType$]\n];\nexport var GetUserRequest$ = [3, n0, _GUR,\n    0,\n    [_ATc],\n    [[() => TokenModelType, 0]], 1\n];\nexport var GetUserResponse$ = [3, n0, _GURe,\n    0,\n    [_U, _UA, _MFAO, _PMS, _UMFASL],\n    [[() => UsernameType, 0], [() => AttributeListType, 0], () => MFAOptionListType, 0, 64 | 0], 2\n];\nexport var GlobalSignOutRequest$ = [3, n0, _GSOR,\n    0,\n    [_ATc],\n    [[() => TokenModelType, 0]], 1\n];\nexport var GlobalSignOutResponse$ = [3, n0, _GSORl,\n    0,\n    [],\n    []\n];\nexport var GroupType$ = [3, n0, _GT,\n    0,\n    [_GN, _UPI, _Desc, _RA, _Pr, _LMD, _CDr],\n    [0, 0, 0, 0, 1, 4, 4]\n];\nexport var HttpHeader$ = [3, n0, _HHt,\n    0,\n    [_hN, _hV],\n    [0, 0]\n];\nexport var IdentityProviderType$ = [3, n0, _IPT,\n    0,\n    [_UPI, _PN, _PTr, _PD, _AMt, _II, _LMD, _CDr],\n    [0, 0, 0, 128 | 0, 128 | 0, 64 | 0, 4, 4]\n];\nexport var InboundFederationLambdaType$ = [3, n0, _IFLT,\n    0,\n    [_LV, _LAa],\n    [0, 0], 2\n];\nexport var InitiateAuthRequest$ = [3, n0, _IAR,\n    0,\n    [_AF, _CI, _AP, _CM, _AM, _UCDs, _S],\n    [0, [() => ClientIdType, 0], [() => AuthParametersType, 0], 128 | 0, () => AnalyticsMetadataType$, [() => UserContextDataType$, 0], [() => SessionType, 0]], 2\n];\nexport var InitiateAuthResponse$ = [3, n0, _IARn,\n    0,\n    [_CN, _S, _CP, _AR, _AC],\n    [0, [() => SessionType, 0], 128 | 0, [() => AuthenticationResultType$, 0], 64 | 0]\n];\nexport var LambdaConfigType$ = [3, n0, _LCT,\n    0,\n    [_PSU, _CMu, _PC, _PA, _PAo, _DAC, _CAC, _VACR, _PTG, _UM, _PTGC, _CSMSS, _CES, _KMSKID, _IF],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, () => PreTokenGenerationVersionConfigType$, () => CustomSMSLambdaVersionConfigType$, () => CustomEmailLambdaVersionConfigType$, 0, () => InboundFederationLambdaType$]\n];\nexport var ListDevicesRequest$ = [3, n0, _LDR,\n    0,\n    [_ATc, _L, _PTa],\n    [[() => TokenModelType, 0], 1, 0], 1\n];\nexport var ListDevicesResponse$ = [3, n0, _LDRi,\n    0,\n    [_De, _PTa],\n    [[() => DeviceListType, 0], 0]\n];\nexport var ListGroupsRequest$ = [3, n0, _LGR,\n    0,\n    [_UPI, _L, _NT],\n    [0, 1, 0], 1\n];\nexport var ListGroupsResponse$ = [3, n0, _LGRi,\n    0,\n    [_G, _NT],\n    [() => GroupListType, 0]\n];\nexport var ListIdentityProvidersRequest$ = [3, n0, _LIPR,\n    0,\n    [_UPI, _MR, _NT],\n    [0, 1, 0], 1\n];\nexport var ListIdentityProvidersResponse$ = [3, n0, _LIPRi,\n    0,\n    [_Prov, _NT],\n    [() => ProvidersListType, 0], 1\n];\nexport var ListResourceServersRequest$ = [3, n0, _LRSR,\n    0,\n    [_UPI, _MR, _NT],\n    [0, 1, 0], 1\n];\nexport var ListResourceServersResponse$ = [3, n0, _LRSRi,\n    0,\n    [_RSe, _NT],\n    [() => ResourceServersListType, 0], 1\n];\nexport var ListTagsForResourceRequest$ = [3, n0, _LTFRR,\n    0,\n    [_RAes],\n    [0], 1\n];\nexport var ListTagsForResourceResponse$ = [3, n0, _LTFRRi,\n    0,\n    [_Ta],\n    [128 | 0]\n];\nexport var ListTermsRequest$ = [3, n0, _LTR,\n    0,\n    [_UPI, _MR, _NT],\n    [0, 1, 0], 1\n];\nexport var ListTermsResponse$ = [3, n0, _LTRi,\n    0,\n    [_T, _NT],\n    [() => TermsDescriptionListType, 0], 1\n];\nexport var ListUserImportJobsRequest$ = [3, n0, _LUIJR,\n    0,\n    [_UPI, _MR, _PTa],\n    [0, 1, 0], 2\n];\nexport var ListUserImportJobsResponse$ = [3, n0, _LUIJRi,\n    0,\n    [_UIJs, _PTa],\n    [() => UserImportJobsListType, 0]\n];\nexport var ListUserPoolClientsRequest$ = [3, n0, _LUPCR,\n    0,\n    [_UPI, _MR, _NT],\n    [0, 1, 0], 1\n];\nexport var ListUserPoolClientsResponse$ = [3, n0, _LUPCRi,\n    0,\n    [_UPCs, _NT],\n    [[() => UserPoolClientListType, 0], 0]\n];\nexport var ListUserPoolsRequest$ = [3, n0, _LUPR,\n    0,\n    [_MR, _NT],\n    [1, 0], 1\n];\nexport var ListUserPoolsResponse$ = [3, n0, _LUPRi,\n    0,\n    [_UPs, _NT],\n    [() => UserPoolListType, 0]\n];\nexport var ListUsersInGroupRequest$ = [3, n0, _LUIGR,\n    0,\n    [_UPI, _GN, _L, _NT],\n    [0, 0, 1, 0], 2\n];\nexport var ListUsersInGroupResponse$ = [3, n0, _LUIGRi,\n    0,\n    [_Use, _NT],\n    [[() => UsersListType, 0], 0]\n];\nexport var ListUsersRequest$ = [3, n0, _LUR,\n    0,\n    [_UPI, _ATG, _L, _PTa, _Fi],\n    [0, 64 | 0, 1, 0, 0], 1\n];\nexport var ListUsersResponse$ = [3, n0, _LURi,\n    0,\n    [_Use, _PTa],\n    [[() => UsersListType, 0], 0]\n];\nexport var ListWebAuthnCredentialsRequest$ = [3, n0, _LWACR,\n    0,\n    [_ATc, _NT, _MR],\n    [[() => TokenModelType, 0], 0, 1], 1\n];\nexport var ListWebAuthnCredentialsResponse$ = [3, n0, _LWACRi,\n    0,\n    [_Cre, _NT],\n    [() => WebAuthnCredentialDescriptionListType, 0], 1\n];\nexport var LogConfigurationType$ = [3, n0, _LCTo,\n    0,\n    [_LL, _ES, _CWLC, _SCo, _FC],\n    [0, 0, () => CloudWatchLogsConfigurationType$, () => S3ConfigurationType$, () => FirehoseConfigurationType$], 2\n];\nexport var LogDeliveryConfigurationType$ = [3, n0, _LDCT,\n    0,\n    [_UPI, _LCo],\n    [0, () => LogConfigurationListType], 2\n];\nexport var ManagedLoginBrandingType$ = [3, n0, _MLBT,\n    0,\n    [_MLBI, _UPI, _UCPV, _Se, _As, _CDr, _LMD],\n    [0, 0, 2, 15, () => AssetListType, 4, 4]\n];\nexport var MessageTemplateType$ = [3, n0, _MTT,\n    0,\n    [_SMSM, _EM, _ESm],\n    [0, 0, 0]\n];\nexport var MFAOptionType$ = [3, n0, _MFAOT,\n    0,\n    [_DM, _AN],\n    [0, 0]\n];\nexport var NewDeviceMetadataType$ = [3, n0, _NDMT,\n    0,\n    [_DK, _DGK],\n    [0, 0]\n];\nexport var NotifyConfigurationType$ = [3, n0, _NCT,\n    0,\n    [_SA, _F, _RTe, _BE, _NAEo, _ME],\n    [0, 0, 0, () => NotifyEmailType$, () => NotifyEmailType$, () => NotifyEmailType$], 1\n];\nexport var NotifyEmailType$ = [3, n0, _NET,\n    0,\n    [_Su, _HB, _TB],\n    [0, 0, 0], 1\n];\nexport var NumberAttributeConstraintsType$ = [3, n0, _NACT,\n    0,\n    [_MV, _MVa],\n    [0, 0]\n];\nexport var PasswordPolicyType$ = [3, n0, _PPT,\n    0,\n    [_ML, _RU, _RLe, _RN, _RSeq, _PHS, _TPVD],\n    [1, 2, 2, 2, 2, 1, 1]\n];\nexport var PreTokenGenerationVersionConfigType$ = [3, n0, _PTGVCT,\n    0,\n    [_LV, _LAa],\n    [0, 0], 2\n];\nexport var ProviderDescription$ = [3, n0, _PDr,\n    0,\n    [_PN, _PTr, _LMD, _CDr],\n    [0, 0, 4, 4]\n];\nexport var ProviderUserIdentifierType$ = [3, n0, _PUIT,\n    0,\n    [_PN, _PAN, _PAV],\n    [0, 0, 0]\n];\nexport var RecoveryOptionType$ = [3, n0, _ROT,\n    0,\n    [_Pri, _Na],\n    [1, 0], 2\n];\nexport var RefreshTokenRotationType$ = [3, n0, _RTRT,\n    0,\n    [_Fe, _RGPS],\n    [0, 1], 1\n];\nexport var ResendConfirmationCodeRequest$ = [3, n0, _RCCR,\n    0,\n    [_CI, _U, _SH, _UCDs, _AM, _CM],\n    [[() => ClientIdType, 0], [() => UsernameType, 0], [() => SecretHashType, 0], [() => UserContextDataType$, 0], () => AnalyticsMetadataType$, 128 | 0], 2\n];\nexport var ResendConfirmationCodeResponse$ = [3, n0, _RCCRe,\n    0,\n    [_CDD],\n    [() => CodeDeliveryDetailsType$]\n];\nexport var ResourceServerScopeType$ = [3, n0, _RSST,\n    0,\n    [_SNc, _SD],\n    [0, 0], 2\n];\nexport var ResourceServerType$ = [3, n0, _RST,\n    0,\n    [_UPI, _I, _Na, _Sc],\n    [0, 0, 0, () => ResourceServerScopeListType]\n];\nexport var RespondToAuthChallengeRequest$ = [3, n0, _RTACR,\n    0,\n    [_CI, _CN, _S, _CR, _AM, _UCDs, _CM],\n    [[() => ClientIdType, 0], 0, [() => SessionType, 0], [() => ChallengeResponsesType, 0], () => AnalyticsMetadataType$, [() => UserContextDataType$, 0], 128 | 0], 2\n];\nexport var RespondToAuthChallengeResponse$ = [3, n0, _RTACRe,\n    0,\n    [_CN, _S, _CP, _AR],\n    [0, [() => SessionType, 0], 128 | 0, [() => AuthenticationResultType$, 0]]\n];\nexport var RevokeTokenRequest$ = [3, n0, _RTRe,\n    0,\n    [_To, _CI, _CSl],\n    [[() => TokenModelType, 0], [() => ClientIdType, 0], [() => ClientSecretType, 0]], 2\n];\nexport var RevokeTokenResponse$ = [3, n0, _RTRev,\n    0,\n    [],\n    []\n];\nexport var RiskConfigurationType$ = [3, n0, _RCT,\n    0,\n    [_UPI, _CI, _CCRC, _ATRC, _REC, _LMD],\n    [0, [() => ClientIdType, 0], () => CompromisedCredentialsRiskConfigurationType$, () => AccountTakeoverRiskConfigurationType$, () => RiskExceptionConfigurationType$, 4]\n];\nexport var RiskExceptionConfigurationType$ = [3, n0, _RECT,\n    0,\n    [_BIPRL, _SIPRL],\n    [64 | 0, 64 | 0]\n];\nexport var S3ConfigurationType$ = [3, n0, _SCTo,\n    0,\n    [_BA],\n    [0]\n];\nexport var SchemaAttributeType$ = [3, n0, _SAT,\n    0,\n    [_Na, _ADT, _DOA, _Mu, _R, _NAC, _SAC],\n    [0, 0, 2, 2, 2, () => NumberAttributeConstraintsType$, () => StringAttributeConstraintsType$]\n];\nexport var SetLogDeliveryConfigurationRequest$ = [3, n0, _SLDCR,\n    0,\n    [_UPI, _LCo],\n    [0, () => LogConfigurationListType], 2\n];\nexport var SetLogDeliveryConfigurationResponse$ = [3, n0, _SLDCRe,\n    0,\n    [_LDC],\n    [() => LogDeliveryConfigurationType$]\n];\nexport var SetRiskConfigurationRequest$ = [3, n0, _SRCR,\n    0,\n    [_UPI, _CI, _CCRC, _ATRC, _REC],\n    [0, [() => ClientIdType, 0], () => CompromisedCredentialsRiskConfigurationType$, () => AccountTakeoverRiskConfigurationType$, () => RiskExceptionConfigurationType$], 1\n];\nexport var SetRiskConfigurationResponse$ = [3, n0, _SRCRe,\n    0,\n    [_RC],\n    [[() => RiskConfigurationType$, 0]], 1\n];\nexport var SetUICustomizationRequest$ = [3, n0, _SUICR,\n    0,\n    [_UPI, _CI, _CSS, _IFm],\n    [0, [() => ClientIdType, 0], 0, 21], 1\n];\nexport var SetUICustomizationResponse$ = [3, n0, _SUICRe,\n    0,\n    [_UIC],\n    [[() => UICustomizationType$, 0]], 1\n];\nexport var SetUserMFAPreferenceRequest$ = [3, n0, _SUMFAPR,\n    0,\n    [_ATc, _SMSMS, _STMS, _EMS],\n    [[() => TokenModelType, 0], () => SMSMfaSettingsType$, () => SoftwareTokenMfaSettingsType$, () => EmailMfaSettingsType$], 1\n];\nexport var SetUserMFAPreferenceResponse$ = [3, n0, _SUMFAPRe,\n    0,\n    [],\n    []\n];\nexport var SetUserPoolMfaConfigRequest$ = [3, n0, _SUPMCR,\n    0,\n    [_UPI, _SMC, _STMC, _EMC, _MC, _WAC],\n    [0, () => SmsMfaConfigType$, () => SoftwareTokenMfaConfigType$, () => EmailMfaConfigType$, 0, () => WebAuthnConfigurationType$], 1\n];\nexport var SetUserPoolMfaConfigResponse$ = [3, n0, _SUPMCRe,\n    0,\n    [_SMC, _STMC, _EMC, _MC, _WAC],\n    [() => SmsMfaConfigType$, () => SoftwareTokenMfaConfigType$, () => EmailMfaConfigType$, 0, () => WebAuthnConfigurationType$]\n];\nexport var SetUserSettingsRequest$ = [3, n0, _SUSR,\n    0,\n    [_ATc, _MFAO],\n    [[() => TokenModelType, 0], () => MFAOptionListType], 2\n];\nexport var SetUserSettingsResponse$ = [3, n0, _SUSRe,\n    0,\n    [],\n    []\n];\nexport var SignInPolicyType$ = [3, n0, _SIPT,\n    0,\n    [_AFAF],\n    [64 | 0]\n];\nexport var SignUpRequest$ = [3, n0, _SUR,\n    0,\n    [_CI, _U, _SH, _P, _UA, _VD, _AM, _UCDs, _CM],\n    [[() => ClientIdType, 0], [() => UsernameType, 0], [() => SecretHashType, 0], [() => PasswordType, 0], [() => AttributeListType, 0], [() => AttributeListType, 0], () => AnalyticsMetadataType$, [() => UserContextDataType$, 0], 128 | 0], 2\n];\nexport var SignUpResponse$ = [3, n0, _SURi,\n    0,\n    [_UCs, _USs, _CDD, _S],\n    [2, 0, () => CodeDeliveryDetailsType$, [() => SessionType, 0]], 2\n];\nexport var SmsConfigurationType$ = [3, n0, _SCTm,\n    0,\n    [_SCA, _EIx, _SR],\n    [0, 0, 0], 1\n];\nexport var SmsMfaConfigType$ = [3, n0, _SMCT,\n    0,\n    [_SAM, _SCm],\n    [0, () => SmsConfigurationType$]\n];\nexport var SMSMfaSettingsType$ = [3, n0, _SMSMST,\n    0,\n    [_E, _PM],\n    [2, 2]\n];\nexport var SoftwareTokenMfaConfigType$ = [3, n0, _STMCT,\n    0,\n    [_E],\n    [2]\n];\nexport var SoftwareTokenMfaSettingsType$ = [3, n0, _STMST,\n    0,\n    [_E, _PM],\n    [2, 2]\n];\nexport var StartUserImportJobRequest$ = [3, n0, _SUIJR,\n    0,\n    [_UPI, _JI],\n    [0, 0], 2\n];\nexport var StartUserImportJobResponse$ = [3, n0, _SUIJRt,\n    0,\n    [_UIJ],\n    [() => UserImportJobType$]\n];\nexport var StartWebAuthnRegistrationRequest$ = [3, n0, _SWARR,\n    0,\n    [_ATc],\n    [[() => TokenModelType, 0]], 1\n];\nexport var StartWebAuthnRegistrationResponse$ = [3, n0, _SWARRt,\n    0,\n    [_CCO],\n    [15], 1\n];\nexport var StopUserImportJobRequest$ = [3, n0, _SUIJRto,\n    0,\n    [_UPI, _JI],\n    [0, 0], 2\n];\nexport var StopUserImportJobResponse$ = [3, n0, _SUIJRtop,\n    0,\n    [_UIJ],\n    [() => UserImportJobType$]\n];\nexport var StringAttributeConstraintsType$ = [3, n0, _SACT,\n    0,\n    [_MLi, _MLa],\n    [0, 0]\n];\nexport var TagResourceRequest$ = [3, n0, _TRR,\n    0,\n    [_RAes, _Ta],\n    [0, 128 | 0], 2\n];\nexport var TagResourceResponse$ = [3, n0, _TRRa,\n    0,\n    [],\n    []\n];\nexport var TermsDescriptionType$ = [3, n0, _TDT,\n    0,\n    [_TI, _TN, _En, _CDr, _LMD],\n    [0, 0, 0, 4, 4], 5\n];\nexport var TermsType$ = [3, n0, _TTe,\n    0,\n    [_TI, _UPI, _CI, _TN, _TS, _En, _Li, _CDr, _LMD],\n    [0, 0, [() => ClientIdType, 0], 0, 0, 0, 128 | 0, 4, 4], 9\n];\nexport var TokenValidityUnitsType$ = [3, n0, _TVUT,\n    0,\n    [_ATc, _IT, _RT],\n    [0, 0, 0]\n];\nexport var UICustomizationType$ = [3, n0, _UICT,\n    0,\n    [_UPI, _CI, _IU, _CSS, _CSSV, _LMD, _CDr],\n    [0, [() => ClientIdType, 0], 0, 0, 0, 4, 4]\n];\nexport var UntagResourceRequest$ = [3, n0, _URR,\n    0,\n    [_RAes, _TK],\n    [0, 64 | 0], 2\n];\nexport var UntagResourceResponse$ = [3, n0, _URRn,\n    0,\n    [],\n    []\n];\nexport var UpdateAuthEventFeedbackRequest$ = [3, n0, _UAEFR,\n    0,\n    [_UPI, _U, _EI, _FT, _FV],\n    [0, [() => UsernameType, 0], 0, [() => TokenModelType, 0], 0], 5\n];\nexport var UpdateAuthEventFeedbackResponse$ = [3, n0, _UAEFRp,\n    0,\n    [],\n    []\n];\nexport var UpdateDeviceStatusRequest$ = [3, n0, _UDSR,\n    0,\n    [_ATc, _DK, _DRS],\n    [[() => TokenModelType, 0], 0, 0], 2\n];\nexport var UpdateDeviceStatusResponse$ = [3, n0, _UDSRp,\n    0,\n    [],\n    []\n];\nexport var UpdateGroupRequest$ = [3, n0, _UGR,\n    0,\n    [_GN, _UPI, _Desc, _RA, _Pr],\n    [0, 0, 0, 0, 1], 2\n];\nexport var UpdateGroupResponse$ = [3, n0, _UGRp,\n    0,\n    [_Gr],\n    [() => GroupType$]\n];\nexport var UpdateIdentityProviderRequest$ = [3, n0, _UIPR,\n    0,\n    [_UPI, _PN, _PD, _AMt, _II],\n    [0, 0, 128 | 0, 128 | 0, 64 | 0], 2\n];\nexport var UpdateIdentityProviderResponse$ = [3, n0, _UIPRp,\n    0,\n    [_IP],\n    [() => IdentityProviderType$], 1\n];\nexport var UpdateManagedLoginBrandingRequest$ = [3, n0, _UMLBR,\n    0,\n    [_UPI, _MLBI, _UCPV, _Se, _As],\n    [0, 0, 2, 15, () => AssetListType]\n];\nexport var UpdateManagedLoginBrandingResponse$ = [3, n0, _UMLBRp,\n    0,\n    [_MLB],\n    [() => ManagedLoginBrandingType$]\n];\nexport var UpdateResourceServerRequest$ = [3, n0, _URSR,\n    0,\n    [_UPI, _I, _Na, _Sc],\n    [0, 0, 0, () => ResourceServerScopeListType], 3\n];\nexport var UpdateResourceServerResponse$ = [3, n0, _URSRp,\n    0,\n    [_RS],\n    [() => ResourceServerType$], 1\n];\nexport var UpdateTermsRequest$ = [3, n0, _UTR,\n    0,\n    [_TI, _UPI, _TN, _TS, _En, _Li],\n    [0, 0, 0, 0, 0, 128 | 0], 2\n];\nexport var UpdateTermsResponse$ = [3, n0, _UTRp,\n    0,\n    [_T],\n    [[() => TermsType$, 0]]\n];\nexport var UpdateUserAttributesRequest$ = [3, n0, _UUAR,\n    0,\n    [_UA, _ATc, _CM],\n    [[() => AttributeListType, 0], [() => TokenModelType, 0], 128 | 0], 2\n];\nexport var UpdateUserAttributesResponse$ = [3, n0, _UUARp,\n    0,\n    [_CDDL],\n    [() => CodeDeliveryDetailsListType]\n];\nexport var UpdateUserPoolClientRequest$ = [3, n0, _UUPCR,\n    0,\n    [_UPI, _CI, _CNl, _RTV, _ATV, _ITV, _TVU, _RAe, _WA, _EAF, _SIP, _CURL, _LURL, _DRURI, _AOAF, _AOAS, _AOAFUPC, _ACn, _PUEE, _ETR, _EPAUCD, _ASV, _RTR],\n    [0, [() => ClientIdType, 0], 0, 1, 1, 1, () => TokenValidityUnitsType$, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 0, 64 | 0, 64 | 0, 2, () => AnalyticsConfigurationType$, 0, 2, 2, 1, () => RefreshTokenRotationType$], 2\n];\nexport var UpdateUserPoolClientResponse$ = [3, n0, _UUPCRp,\n    0,\n    [_UPC],\n    [[() => UserPoolClientType$, 0]]\n];\nexport var UpdateUserPoolDomainRequest$ = [3, n0, _UUPDR,\n    0,\n    [_Do, _UPI, _MLV, _CDC],\n    [0, 0, 1, () => CustomDomainConfigType$], 2\n];\nexport var UpdateUserPoolDomainResponse$ = [3, n0, _UUPDRp,\n    0,\n    [_MLV, _CFD],\n    [1, 0]\n];\nexport var UpdateUserPoolRequest$ = [3, n0, _UUPR,\n    0,\n    [_UPI, _Po, _DP, _LC, _AVA, _SVM, _EVM, _EVS, _VMT, _SAM, _UAUS, _MC, _DC, _EC, _SCm, _UPT, _ACUC, _UPAO, _ARS, _PNo, _UPTs],\n    [0, () => UserPoolPolicyType$, 0, () => LambdaConfigType$, 64 | 0, 0, 0, 0, () => VerificationMessageTemplateType$, 0, () => UserAttributeUpdateSettingsType$, 0, () => DeviceConfigurationType$, () => EmailConfigurationType$, () => SmsConfigurationType$, 128 | 0, () => AdminCreateUserConfigType$, () => UserPoolAddOnsType$, () => AccountRecoverySettingType$, 0, 0], 1\n];\nexport var UpdateUserPoolResponse$ = [3, n0, _UUPRp,\n    0,\n    [],\n    []\n];\nexport var UserAttributeUpdateSettingsType$ = [3, n0, _UAUST,\n    0,\n    [_ARVBU],\n    [64 | 0]\n];\nexport var UserContextDataType$ = [3, n0, _UCDT,\n    8,\n    [_IA, _ED],\n    [0, 0]\n];\nexport var UserImportJobType$ = [3, n0, _UIJT,\n    0,\n    [_JN, _JI, _UPI, _PSUr, _CDr, _SDt, _CDo, _St, _CWLRA, _IUm, _SUk, _FU, _CMom],\n    [0, 0, 0, 0, 4, 4, 4, 0, 0, 1, 1, 1, 0]\n];\nexport var UsernameConfigurationType$ = [3, n0, _UCT,\n    0,\n    [_CSa],\n    [2], 1\n];\nexport var UserPoolAddOnsType$ = [3, n0, _UPAOT,\n    0,\n    [_ASM, _ASAF],\n    [0, () => AdvancedSecurityAdditionalFlowsType$], 1\n];\nexport var UserPoolClientDescription$ = [3, n0, _UPCD,\n    0,\n    [_CI, _UPI, _CNl],\n    [[() => ClientIdType, 0], 0, 0]\n];\nexport var UserPoolClientType$ = [3, n0, _UPCT,\n    0,\n    [_UPI, _CNl, _CI, _CSl, _LMD, _CDr, _RTV, _ATV, _ITV, _TVU, _RAe, _WA, _EAF, _SIP, _CURL, _LURL, _DRURI, _AOAF, _AOAS, _AOAFUPC, _ACn, _PUEE, _ETR, _EPAUCD, _ASV, _RTR],\n    [0, 0, [() => ClientIdType, 0], [() => ClientSecretType, 0], 4, 4, 1, 1, 1, () => TokenValidityUnitsType$, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 64 | 0, 0, 64 | 0, 64 | 0, 2, () => AnalyticsConfigurationType$, 0, 2, 2, 1, () => RefreshTokenRotationType$]\n];\nexport var UserPoolDescriptionType$ = [3, n0, _UPDT,\n    0,\n    [_Id, _Na, _LC, _St, _LMD, _CDr],\n    [0, 0, () => LambdaConfigType$, 0, 4, 4]\n];\nexport var UserPoolPolicyType$ = [3, n0, _UPPT,\n    0,\n    [_PPa, _SIPi],\n    [() => PasswordPolicyType$, () => SignInPolicyType$]\n];\nexport var UserPoolType$ = [3, n0, _UPTse,\n    0,\n    [_Id, _Na, _Po, _DP, _LC, _St, _LMD, _CDr, _SAc, _AVA, _AAl, _UAs, _SVM, _EVM, _EVS, _VMT, _SAM, _UAUS, _MC, _DC, _ENOU, _EC, _SCm, _UPT, _SCF, _ECF, _Do, _CDu, _ACUC, _UPAO, _UC, _Ar, _ARS, _UPTs],\n    [0, 0, () => UserPoolPolicyType$, 0, () => LambdaConfigType$, 0, 4, 4, () => SchemaAttributesListType, 64 | 0, 64 | 0, 64 | 0, 0, 0, 0, () => VerificationMessageTemplateType$, 0, () => UserAttributeUpdateSettingsType$, 0, () => DeviceConfigurationType$, 1, () => EmailConfigurationType$, () => SmsConfigurationType$, 128 | 0, 0, 0, 0, 0, () => AdminCreateUserConfigType$, () => UserPoolAddOnsType$, () => UsernameConfigurationType$, 0, () => AccountRecoverySettingType$, 0]\n];\nexport var UserType$ = [3, n0, _UTs,\n    0,\n    [_U, _At, _UCD, _ULMD, _E, _US, _MFAO],\n    [[() => UsernameType, 0], [() => AttributeListType, 0], 4, 4, 2, 0, () => MFAOptionListType]\n];\nexport var VerificationMessageTemplateType$ = [3, n0, _VMTT,\n    0,\n    [_SM, _EM, _ESm, _EMBL, _ESBL, _DEO],\n    [0, 0, 0, 0, 0, 0]\n];\nexport var VerifySoftwareTokenRequest$ = [3, n0, _VSTR,\n    0,\n    [_UCse, _ATc, _S, _FDN],\n    [[() => SoftwareTokenMFAUserCodeType, 0], [() => TokenModelType, 0], [() => SessionType, 0], 0], 1\n];\nexport var VerifySoftwareTokenResponse$ = [3, n0, _VSTRe,\n    0,\n    [_St, _S],\n    [0, [() => SessionType, 0]]\n];\nexport var VerifyUserAttributeRequest$ = [3, n0, _VUAR,\n    0,\n    [_ATc, _AN, _Cod],\n    [[() => TokenModelType, 0], 0, 0], 3\n];\nexport var VerifyUserAttributeResponse$ = [3, n0, _VUARe,\n    0,\n    [],\n    []\n];\nexport var WebAuthnConfigurationType$ = [3, n0, _WACT,\n    0,\n    [_RPI, _UV],\n    [0, 0]\n];\nexport var WebAuthnCredentialDescription$ = [3, n0, _WACD,\n    0,\n    [_CIr, _FCN, _RPI, _ATu, _CAr, _AAu],\n    [0, 0, 0, 64 | 0, 4, 0], 5\n];\nvar __Unit = \"unit\";\nvar AliasAttributesListType = 64 | 0;\nvar AllowedFirstAuthFactorsListType = 64 | 0;\nvar AssetListType = [1, n0, _ALT,\n    0, () => AssetType$\n];\nvar AttributeListType = [1, n0, _ALTt,\n    0, [() => AttributeType$,\n        0]\n];\nvar AttributeNameListType = 64 | 0;\nvar AttributesRequireVerificationBeforeUpdateType = 64 | 0;\nvar AuthEventsType = [1, n0, _AETu,\n    0, () => AuthEventType$\n];\nvar AvailableChallengeListType = 64 | 0;\nvar BlockedIPRangeListType = 64 | 0;\nvar CallbackURLsListType = 64 | 0;\nvar ChallengeResponseListType = [1, n0, _CRLT,\n    0, () => ChallengeResponseType$\n];\nvar ClientPermissionListType = 64 | 0;\nvar CodeDeliveryDetailsListType = [1, n0, _CDDLT,\n    0, () => CodeDeliveryDetailsType$\n];\nvar ConfiguredUserAuthFactorsListType = 64 | 0;\nvar CustomAttributesListType = [1, n0, _CALT,\n    0, () => SchemaAttributeType$\n];\nvar DeliveryMediumListType = 64 | 0;\nvar DeviceListType = [1, n0, _DLT,\n    0, [() => DeviceType$,\n        0]\n];\nvar EventFiltersType = 64 | 0;\nvar ExplicitAuthFlowsListType = 64 | 0;\nvar GroupListType = [1, n0, _GLT,\n    0, () => GroupType$\n];\nvar HttpHeaderList = [1, n0, _HHL,\n    0, () => HttpHeader$\n];\nvar IdpIdentifiersListType = 64 | 0;\nvar ListOfStringTypes = 64 | 0;\nvar LogConfigurationListType = [1, n0, _LCLT,\n    0, () => LogConfigurationType$\n];\nvar LogoutURLsListType = 64 | 0;\nvar MFAOptionListType = [1, n0, _MFAOLT,\n    0, () => MFAOptionType$\n];\nvar OAuthFlowsType = 64 | 0;\nvar ProvidersListType = [1, n0, _PLT,\n    0, () => ProviderDescription$\n];\nvar RecoveryMechanismsType = [1, n0, _RMT,\n    0, () => RecoveryOptionType$\n];\nvar ResourceServerScopeListType = [1, n0, _RSSLT,\n    0, () => ResourceServerScopeType$\n];\nvar ResourceServersListType = [1, n0, _RSLT,\n    0, () => ResourceServerType$\n];\nvar SchemaAttributesListType = [1, n0, _SALT,\n    0, () => SchemaAttributeType$\n];\nvar ScopeListType = 64 | 0;\nvar SearchedAttributeNamesListType = 64 | 0;\nvar SkippedIPRangeListType = 64 | 0;\nvar SupportedIdentityProvidersListType = 64 | 0;\nvar TermsDescriptionListType = [1, n0, _TDLT,\n    0, () => TermsDescriptionType$\n];\nvar UserImportJobsListType = [1, n0, _UIJLT,\n    0, () => UserImportJobType$\n];\nvar UserMFASettingListType = 64 | 0;\nvar UsernameAttributesListType = 64 | 0;\nvar UserPoolClientListType = [1, n0, _UPCLT,\n    0, [() => UserPoolClientDescription$,\n        0]\n];\nvar UserPoolListType = [1, n0, _UPLT,\n    0, () => UserPoolDescriptionType$\n];\nvar UserPoolTagsListType = 64 | 0;\nvar UsersListType = [1, n0, _ULT,\n    0, [() => UserType$,\n        0]\n];\nvar VerifiedAttributesListType = 64 | 0;\nvar WebAuthnAuthenticatorTransportsList = 64 | 0;\nvar WebAuthnCredentialDescriptionListType = [1, n0, _WACDLT,\n    0, () => WebAuthnCredentialDescription$\n];\nvar AttributeMappingType = 128 | 0;\nvar AuthParametersType = [2, n0, _APT,\n    8, 0, 0\n];\nvar ChallengeParametersType = 128 | 0;\nvar ChallengeResponsesType = [2, n0, _CRTh,\n    8, 0, 0\n];\nvar ClientMetadataType = 128 | 0;\nvar LinksType = 128 | 0;\nvar ProviderDetailsType = 128 | 0;\nvar UserPoolTagsType = 128 | 0;\nexport var AddCustomAttributes$ = [9, n0, _ACA,\n    0, () => AddCustomAttributesRequest$, () => AddCustomAttributesResponse$\n];\nexport var AdminAddUserToGroup$ = [9, n0, _AAUTG,\n    0, () => AdminAddUserToGroupRequest$, () => __Unit\n];\nexport var AdminConfirmSignUp$ = [9, n0, _ACSU,\n    0, () => AdminConfirmSignUpRequest$, () => AdminConfirmSignUpResponse$\n];\nexport var AdminCreateUser$ = [9, n0, _ACU,\n    0, () => AdminCreateUserRequest$, () => AdminCreateUserResponse$\n];\nexport var AdminDeleteUser$ = [9, n0, _ADU,\n    0, () => AdminDeleteUserRequest$, () => __Unit\n];\nexport var AdminDeleteUserAttributes$ = [9, n0, _ADUA,\n    0, () => AdminDeleteUserAttributesRequest$, () => AdminDeleteUserAttributesResponse$\n];\nexport var AdminDisableProviderForUser$ = [9, n0, _ADPFU,\n    0, () => AdminDisableProviderForUserRequest$, () => AdminDisableProviderForUserResponse$\n];\nexport var AdminDisableUser$ = [9, n0, _ADUd,\n    0, () => AdminDisableUserRequest$, () => AdminDisableUserResponse$\n];\nexport var AdminEnableUser$ = [9, n0, _AEU,\n    0, () => AdminEnableUserRequest$, () => AdminEnableUserResponse$\n];\nexport var AdminForgetDevice$ = [9, n0, _AFD,\n    0, () => AdminForgetDeviceRequest$, () => __Unit\n];\nexport var AdminGetDevice$ = [9, n0, _AGD,\n    0, () => AdminGetDeviceRequest$, () => AdminGetDeviceResponse$\n];\nexport var AdminGetUser$ = [9, n0, _AGU,\n    0, () => AdminGetUserRequest$, () => AdminGetUserResponse$\n];\nexport var AdminInitiateAuth$ = [9, n0, _AIA,\n    0, () => AdminInitiateAuthRequest$, () => AdminInitiateAuthResponse$\n];\nexport var AdminLinkProviderForUser$ = [9, n0, _ALPFU,\n    0, () => AdminLinkProviderForUserRequest$, () => AdminLinkProviderForUserResponse$\n];\nexport var AdminListDevices$ = [9, n0, _ALD,\n    0, () => AdminListDevicesRequest$, () => AdminListDevicesResponse$\n];\nexport var AdminListGroupsForUser$ = [9, n0, _ALGFU,\n    0, () => AdminListGroupsForUserRequest$, () => AdminListGroupsForUserResponse$\n];\nexport var AdminListUserAuthEvents$ = [9, n0, _ALUAE,\n    0, () => AdminListUserAuthEventsRequest$, () => AdminListUserAuthEventsResponse$\n];\nexport var AdminRemoveUserFromGroup$ = [9, n0, _ARUFG,\n    0, () => AdminRemoveUserFromGroupRequest$, () => __Unit\n];\nexport var AdminResetUserPassword$ = [9, n0, _ARUP,\n    0, () => AdminResetUserPasswordRequest$, () => AdminResetUserPasswordResponse$\n];\nexport var AdminRespondToAuthChallenge$ = [9, n0, _ARTAC,\n    0, () => AdminRespondToAuthChallengeRequest$, () => AdminRespondToAuthChallengeResponse$\n];\nexport var AdminSetUserMFAPreference$ = [9, n0, _ASUMFAP,\n    0, () => AdminSetUserMFAPreferenceRequest$, () => AdminSetUserMFAPreferenceResponse$\n];\nexport var AdminSetUserPassword$ = [9, n0, _ASUP,\n    0, () => AdminSetUserPasswordRequest$, () => AdminSetUserPasswordResponse$\n];\nexport var AdminSetUserSettings$ = [9, n0, _ASUS,\n    0, () => AdminSetUserSettingsRequest$, () => AdminSetUserSettingsResponse$\n];\nexport var AdminUpdateAuthEventFeedback$ = [9, n0, _AUAEF,\n    0, () => AdminUpdateAuthEventFeedbackRequest$, () => AdminUpdateAuthEventFeedbackResponse$\n];\nexport var AdminUpdateDeviceStatus$ = [9, n0, _AUDS,\n    0, () => AdminUpdateDeviceStatusRequest$, () => AdminUpdateDeviceStatusResponse$\n];\nexport var AdminUpdateUserAttributes$ = [9, n0, _AUUA,\n    0, () => AdminUpdateUserAttributesRequest$, () => AdminUpdateUserAttributesResponse$\n];\nexport var AdminUserGlobalSignOut$ = [9, n0, _AUGSO,\n    0, () => AdminUserGlobalSignOutRequest$, () => AdminUserGlobalSignOutResponse$\n];\nexport var AssociateSoftwareToken$ = [9, n0, _AST,\n    0, () => AssociateSoftwareTokenRequest$, () => AssociateSoftwareTokenResponse$\n];\nexport var ChangePassword$ = [9, n0, _CPh,\n    0, () => ChangePasswordRequest$, () => ChangePasswordResponse$\n];\nexport var CompleteWebAuthnRegistration$ = [9, n0, _CWAR,\n    0, () => CompleteWebAuthnRegistrationRequest$, () => CompleteWebAuthnRegistrationResponse$\n];\nexport var ConfirmDevice$ = [9, n0, _CDon,\n    0, () => ConfirmDeviceRequest$, () => ConfirmDeviceResponse$\n];\nexport var ConfirmForgotPassword$ = [9, n0, _CFP,\n    0, () => ConfirmForgotPasswordRequest$, () => ConfirmForgotPasswordResponse$\n];\nexport var ConfirmSignUp$ = [9, n0, _CSU,\n    0, () => ConfirmSignUpRequest$, () => ConfirmSignUpResponse$\n];\nexport var CreateGroup$ = [9, n0, _CG,\n    0, () => CreateGroupRequest$, () => CreateGroupResponse$\n];\nexport var CreateIdentityProvider$ = [9, n0, _CIP,\n    0, () => CreateIdentityProviderRequest$, () => CreateIdentityProviderResponse$\n];\nexport var CreateManagedLoginBranding$ = [9, n0, _CMLB,\n    0, () => CreateManagedLoginBrandingRequest$, () => CreateManagedLoginBrandingResponse$\n];\nexport var CreateResourceServer$ = [9, n0, _CRS,\n    0, () => CreateResourceServerRequest$, () => CreateResourceServerResponse$\n];\nexport var CreateTerms$ = [9, n0, _CT,\n    0, () => CreateTermsRequest$, () => CreateTermsResponse$\n];\nexport var CreateUserImportJob$ = [9, n0, _CUIJ,\n    0, () => CreateUserImportJobRequest$, () => CreateUserImportJobResponse$\n];\nexport var CreateUserPool$ = [9, n0, _CUP,\n    0, () => CreateUserPoolRequest$, () => CreateUserPoolResponse$\n];\nexport var CreateUserPoolClient$ = [9, n0, _CUPC,\n    0, () => CreateUserPoolClientRequest$, () => CreateUserPoolClientResponse$\n];\nexport var CreateUserPoolDomain$ = [9, n0, _CUPD,\n    0, () => CreateUserPoolDomainRequest$, () => CreateUserPoolDomainResponse$\n];\nexport var DeleteGroup$ = [9, n0, _DG,\n    0, () => DeleteGroupRequest$, () => __Unit\n];\nexport var DeleteIdentityProvider$ = [9, n0, _DIP,\n    0, () => DeleteIdentityProviderRequest$, () => __Unit\n];\nexport var DeleteManagedLoginBranding$ = [9, n0, _DMLB,\n    0, () => DeleteManagedLoginBrandingRequest$, () => __Unit\n];\nexport var DeleteResourceServer$ = [9, n0, _DRSe,\n    0, () => DeleteResourceServerRequest$, () => __Unit\n];\nexport var DeleteTerms$ = [9, n0, _DTe,\n    0, () => DeleteTermsRequest$, () => __Unit\n];\nexport var DeleteUser$ = [9, n0, _DUe,\n    0, () => DeleteUserRequest$, () => __Unit\n];\nexport var DeleteUserAttributes$ = [9, n0, _DUA,\n    0, () => DeleteUserAttributesRequest$, () => DeleteUserAttributesResponse$\n];\nexport var DeleteUserPool$ = [9, n0, _DUP,\n    0, () => DeleteUserPoolRequest$, () => __Unit\n];\nexport var DeleteUserPoolClient$ = [9, n0, _DUPC,\n    0, () => DeleteUserPoolClientRequest$, () => __Unit\n];\nexport var DeleteUserPoolDomain$ = [9, n0, _DUPD,\n    0, () => DeleteUserPoolDomainRequest$, () => DeleteUserPoolDomainResponse$\n];\nexport var DeleteWebAuthnCredential$ = [9, n0, _DWAC,\n    0, () => DeleteWebAuthnCredentialRequest$, () => DeleteWebAuthnCredentialResponse$\n];\nexport var DescribeIdentityProvider$ = [9, n0, _DIPe,\n    0, () => DescribeIdentityProviderRequest$, () => DescribeIdentityProviderResponse$\n];\nexport var DescribeManagedLoginBranding$ = [9, n0, _DMLBe,\n    0, () => DescribeManagedLoginBrandingRequest$, () => DescribeManagedLoginBrandingResponse$\n];\nexport var DescribeManagedLoginBrandingByClient$ = [9, n0, _DMLBBC,\n    0, () => DescribeManagedLoginBrandingByClientRequest$, () => DescribeManagedLoginBrandingByClientResponse$\n];\nexport var DescribeResourceServer$ = [9, n0, _DRSes,\n    0, () => DescribeResourceServerRequest$, () => DescribeResourceServerResponse$\n];\nexport var DescribeRiskConfiguration$ = [9, n0, _DRC,\n    0, () => DescribeRiskConfigurationRequest$, () => DescribeRiskConfigurationResponse$\n];\nexport var DescribeTerms$ = [9, n0, _DTes,\n    0, () => DescribeTermsRequest$, () => DescribeTermsResponse$\n];\nexport var DescribeUserImportJob$ = [9, n0, _DUIJ,\n    0, () => DescribeUserImportJobRequest$, () => DescribeUserImportJobResponse$\n];\nexport var DescribeUserPool$ = [9, n0, _DUPe,\n    0, () => DescribeUserPoolRequest$, () => DescribeUserPoolResponse$\n];\nexport var DescribeUserPoolClient$ = [9, n0, _DUPCe,\n    0, () => DescribeUserPoolClientRequest$, () => DescribeUserPoolClientResponse$\n];\nexport var DescribeUserPoolDomain$ = [9, n0, _DUPDe,\n    0, () => DescribeUserPoolDomainRequest$, () => DescribeUserPoolDomainResponse$\n];\nexport var ForgetDevice$ = [9, n0, _FDo,\n    0, () => ForgetDeviceRequest$, () => __Unit\n];\nexport var ForgotPassword$ = [9, n0, _FP,\n    0, () => ForgotPasswordRequest$, () => ForgotPasswordResponse$\n];\nexport var GetCSVHeader$ = [9, n0, _GCSVH,\n    0, () => GetCSVHeaderRequest$, () => GetCSVHeaderResponse$\n];\nexport var GetDevice$ = [9, n0, _GD,\n    0, () => GetDeviceRequest$, () => GetDeviceResponse$\n];\nexport var GetGroup$ = [9, n0, _GG,\n    0, () => GetGroupRequest$, () => GetGroupResponse$\n];\nexport var GetIdentityProviderByIdentifier$ = [9, n0, _GIPBI,\n    0, () => GetIdentityProviderByIdentifierRequest$, () => GetIdentityProviderByIdentifierResponse$\n];\nexport var GetLogDeliveryConfiguration$ = [9, n0, _GLDC,\n    0, () => GetLogDeliveryConfigurationRequest$, () => GetLogDeliveryConfigurationResponse$\n];\nexport var GetSigningCertificate$ = [9, n0, _GSC,\n    0, () => GetSigningCertificateRequest$, () => GetSigningCertificateResponse$\n];\nexport var GetTokensFromRefreshToken$ = [9, n0, _GTFRT,\n    0, () => GetTokensFromRefreshTokenRequest$, () => GetTokensFromRefreshTokenResponse$\n];\nexport var GetUICustomization$ = [9, n0, _GUIC,\n    0, () => GetUICustomizationRequest$, () => GetUICustomizationResponse$\n];\nexport var GetUser$ = [9, n0, _GU,\n    0, () => GetUserRequest$, () => GetUserResponse$\n];\nexport var GetUserAttributeVerificationCode$ = [9, n0, _GUAVC,\n    0, () => GetUserAttributeVerificationCodeRequest$, () => GetUserAttributeVerificationCodeResponse$\n];\nexport var GetUserAuthFactors$ = [9, n0, _GUAF,\n    0, () => GetUserAuthFactorsRequest$, () => GetUserAuthFactorsResponse$\n];\nexport var GetUserPoolMfaConfig$ = [9, n0, _GUPMC,\n    0, () => GetUserPoolMfaConfigRequest$, () => GetUserPoolMfaConfigResponse$\n];\nexport var GlobalSignOut$ = [9, n0, _GSO,\n    0, () => GlobalSignOutRequest$, () => GlobalSignOutResponse$\n];\nexport var InitiateAuth$ = [9, n0, _IAn,\n    0, () => InitiateAuthRequest$, () => InitiateAuthResponse$\n];\nexport var ListDevices$ = [9, n0, _LD,\n    0, () => ListDevicesRequest$, () => ListDevicesResponse$\n];\nexport var ListGroups$ = [9, n0, _LG,\n    0, () => ListGroupsRequest$, () => ListGroupsResponse$\n];\nexport var ListIdentityProviders$ = [9, n0, _LIP,\n    0, () => ListIdentityProvidersRequest$, () => ListIdentityProvidersResponse$\n];\nexport var ListResourceServers$ = [9, n0, _LRS,\n    0, () => ListResourceServersRequest$, () => ListResourceServersResponse$\n];\nexport var ListTagsForResource$ = [9, n0, _LTFR,\n    0, () => ListTagsForResourceRequest$, () => ListTagsForResourceResponse$\n];\nexport var ListTerms$ = [9, n0, _LT,\n    0, () => ListTermsRequest$, () => ListTermsResponse$\n];\nexport var ListUserImportJobs$ = [9, n0, _LUIJ,\n    0, () => ListUserImportJobsRequest$, () => ListUserImportJobsResponse$\n];\nexport var ListUserPoolClients$ = [9, n0, _LUPC,\n    0, () => ListUserPoolClientsRequest$, () => ListUserPoolClientsResponse$\n];\nexport var ListUserPools$ = [9, n0, _LUP,\n    0, () => ListUserPoolsRequest$, () => ListUserPoolsResponse$\n];\nexport var ListUsers$ = [9, n0, _LU,\n    0, () => ListUsersRequest$, () => ListUsersResponse$\n];\nexport var ListUsersInGroup$ = [9, n0, _LUIG,\n    0, () => ListUsersInGroupRequest$, () => ListUsersInGroupResponse$\n];\nexport var ListWebAuthnCredentials$ = [9, n0, _LWAC,\n    0, () => ListWebAuthnCredentialsRequest$, () => ListWebAuthnCredentialsResponse$\n];\nexport var ResendConfirmationCode$ = [9, n0, _RCC,\n    0, () => ResendConfirmationCodeRequest$, () => ResendConfirmationCodeResponse$\n];\nexport var RespondToAuthChallenge$ = [9, n0, _RTAC,\n    0, () => RespondToAuthChallengeRequest$, () => RespondToAuthChallengeResponse$\n];\nexport var RevokeToken$ = [9, n0, _RTev,\n    0, () => RevokeTokenRequest$, () => RevokeTokenResponse$\n];\nexport var SetLogDeliveryConfiguration$ = [9, n0, _SLDC,\n    0, () => SetLogDeliveryConfigurationRequest$, () => SetLogDeliveryConfigurationResponse$\n];\nexport var SetRiskConfiguration$ = [9, n0, _SRC,\n    0, () => SetRiskConfigurationRequest$, () => SetRiskConfigurationResponse$\n];\nexport var SetUICustomization$ = [9, n0, _SUIC,\n    0, () => SetUICustomizationRequest$, () => SetUICustomizationResponse$\n];\nexport var SetUserMFAPreference$ = [9, n0, _SUMFAP,\n    0, () => SetUserMFAPreferenceRequest$, () => SetUserMFAPreferenceResponse$\n];\nexport var SetUserPoolMfaConfig$ = [9, n0, _SUPMC,\n    0, () => SetUserPoolMfaConfigRequest$, () => SetUserPoolMfaConfigResponse$\n];\nexport var SetUserSettings$ = [9, n0, _SUS,\n    0, () => SetUserSettingsRequest$, () => SetUserSettingsResponse$\n];\nexport var SignUp$ = [9, n0, _SUi,\n    0, () => SignUpRequest$, () => SignUpResponse$\n];\nexport var StartUserImportJob$ = [9, n0, _SUIJ,\n    0, () => StartUserImportJobRequest$, () => StartUserImportJobResponse$\n];\nexport var StartWebAuthnRegistration$ = [9, n0, _SWAR,\n    0, () => StartWebAuthnRegistrationRequest$, () => StartWebAuthnRegistrationResponse$\n];\nexport var StopUserImportJob$ = [9, n0, _SUIJt,\n    0, () => StopUserImportJobRequest$, () => StopUserImportJobResponse$\n];\nexport var TagResource$ = [9, n0, _TR,\n    0, () => TagResourceRequest$, () => TagResourceResponse$\n];\nexport var UntagResource$ = [9, n0, _UR,\n    0, () => UntagResourceRequest$, () => UntagResourceResponse$\n];\nexport var UpdateAuthEventFeedback$ = [9, n0, _UAEF,\n    0, () => UpdateAuthEventFeedbackRequest$, () => UpdateAuthEventFeedbackResponse$\n];\nexport var UpdateDeviceStatus$ = [9, n0, _UDSp,\n    0, () => UpdateDeviceStatusRequest$, () => UpdateDeviceStatusResponse$\n];\nexport var UpdateGroup$ = [9, n0, _UG,\n    0, () => UpdateGroupRequest$, () => UpdateGroupResponse$\n];\nexport var UpdateIdentityProvider$ = [9, n0, _UIP,\n    0, () => UpdateIdentityProviderRequest$, () => UpdateIdentityProviderResponse$\n];\nexport var UpdateManagedLoginBranding$ = [9, n0, _UMLB,\n    0, () => UpdateManagedLoginBrandingRequest$, () => UpdateManagedLoginBrandingResponse$\n];\nexport var UpdateResourceServer$ = [9, n0, _URS,\n    0, () => UpdateResourceServerRequest$, () => UpdateResourceServerResponse$\n];\nexport var UpdateTerms$ = [9, n0, _UTp,\n    0, () => UpdateTermsRequest$, () => UpdateTermsResponse$\n];\nexport var UpdateUserAttributes$ = [9, n0, _UUA,\n    0, () => UpdateUserAttributesRequest$, () => UpdateUserAttributesResponse$\n];\nexport var UpdateUserPool$ = [9, n0, _UUP,\n    0, () => UpdateUserPoolRequest$, () => UpdateUserPoolResponse$\n];\nexport var UpdateUserPoolClient$ = [9, n0, _UUPC,\n    0, () => UpdateUserPoolClientRequest$, () => UpdateUserPoolClientResponse$\n];\nexport var UpdateUserPoolDomain$ = [9, n0, _UUPD,\n    0, () => UpdateUserPoolDomainRequest$, () => UpdateUserPoolDomainResponse$\n];\nexport var VerifySoftwareToken$ = [9, n0, _VST,\n    0, () => VerifySoftwareTokenRequest$, () => VerifySoftwareTokenResponse$\n];\nexport var VerifyUserAttribute$ = [9, n0, _VUA,\n    0, () => VerifyUserAttributeRequest$, () => VerifyUserAttributeResponse$\n];\n","import { AwsSdkSigV4Signer } from \"@aws-sdk/core\";\nimport { AwsJson1_1Protocol } from \"@aws-sdk/core/protocols\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { parseUrl } from \"@smithy/url-parser\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { defaultCognitoIdentityProviderHttpAuthSchemeProvider } from \"./auth/httpAuthSchemeProvider\";\nimport { defaultEndpointResolver } from \"./endpoint/endpointResolver\";\nimport { errorTypeRegistries } from \"./schemas/schemas_0\";\nexport const getRuntimeConfig = (config) => {\n    return {\n        apiVersion: \"2016-04-18\",\n        base64Decoder: config?.base64Decoder ?? fromBase64,\n        base64Encoder: config?.base64Encoder ?? toBase64,\n        disableHostPrefix: config?.disableHostPrefix ?? false,\n        endpointProvider: config?.endpointProvider ?? defaultEndpointResolver,\n        extensions: config?.extensions ?? [],\n        httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultCognitoIdentityProviderHttpAuthSchemeProvider,\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\"),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        logger: config?.logger ?? new NoOpLogger(),\n        protocol: config?.protocol ?? AwsJson1_1Protocol,\n        protocolSettings: config?.protocolSettings ?? {\n            defaultNamespace: \"com.amazonaws.cognitoidentityprovider\",\n            errorTypeRegistries,\n            xmlNamespace: \"http://cognito-idp.amazonaws.com/doc/2016-04-18/\",\n            version: \"2016-04-18\",\n            serviceTarget: \"AWSCognitoIdentityProviderService\",\n        },\n        serviceId: config?.serviceId ?? \"Cognito Identity Provider\",\n        urlParser: config?.urlParser ?? parseUrl,\n        utf8Decoder: config?.utf8Decoder ?? fromUtf8,\n        utf8Encoder: config?.utf8Encoder ?? toUtf8,\n    };\n};\n","import packageInfo from \"../package.json\";\nimport { Sha256 } from \"@aws-crypto/sha256-browser\";\nimport { createDefaultUserAgentProvider } from \"@aws-sdk/util-user-agent-browser\";\nimport { DEFAULT_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT } from \"@smithy/config-resolver\";\nimport { FetchHttpHandler as RequestHandler, streamCollector } from \"@smithy/fetch-http-handler\";\nimport { invalidProvider } from \"@smithy/invalid-dependency\";\nimport { loadConfigsForDefaultMode } from \"@smithy/smithy-client\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-browser\";\nimport { resolveDefaultsModeConfig } from \"@smithy/util-defaults-mode-browser\";\nimport { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from \"@smithy/util-retry\";\nimport { getRuntimeConfig as getSharedRuntimeConfig } from \"./runtimeConfig.shared\";\nexport const getRuntimeConfig = (config) => {\n    const defaultsMode = resolveDefaultsModeConfig(config);\n    const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode);\n    const clientSharedValues = getSharedRuntimeConfig(config);\n    return {\n        ...clientSharedValues,\n        ...config,\n        runtime: \"browser\",\n        defaultsMode,\n        bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,\n        credentialDefaultProvider: config?.credentialDefaultProvider ?? ((_) => () => Promise.reject(new Error(\"Credential is missing\"))),\n        defaultUserAgentProvider: config?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),\n        maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,\n        region: config?.region ?? invalidProvider(\"Region is missing\"),\n        requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider),\n        retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE),\n        sha256: config?.sha256 ?? Sha256,\n        streamCollector: config?.streamCollector ?? streamCollector,\n        useDualstackEndpoint: config?.useDualstackEndpoint ?? (() => Promise.resolve(DEFAULT_USE_DUALSTACK_ENDPOINT)),\n        useFipsEndpoint: config?.useFipsEndpoint ?? (() => Promise.resolve(DEFAULT_USE_FIPS_ENDPOINT)),\n    };\n};\n","import { memoize } from \"@smithy/property-provider\";\nimport { DEFAULTS_MODE_OPTIONS } from \"./constants\";\nexport const resolveDefaultsModeConfig = ({ defaultsMode, } = {}) => memoize(async () => {\n    const mode = typeof defaultsMode === \"function\" ? await defaultsMode() : defaultsMode;\n    switch (mode?.toLowerCase()) {\n        case \"auto\":\n            return Promise.resolve(useMobileConfiguration() ? \"mobile\" : \"standard\");\n        case \"mobile\":\n        case \"in-region\":\n        case \"cross-region\":\n        case \"standard\":\n        case \"legacy\":\n            return Promise.resolve(mode?.toLocaleLowerCase());\n        case undefined:\n            return Promise.resolve(\"legacy\");\n        default:\n            throw new Error(`Invalid parameter for \"defaultsMode\", expect ${DEFAULTS_MODE_OPTIONS.join(\", \")}, got ${mode}`);\n    }\n});\nconst useMobileConfiguration = () => {\n    const navigator = window?.navigator;\n    if (navigator?.connection) {\n        const { effectiveType, rtt, downlink } = navigator?.connection;\n        const slow = (typeof effectiveType === \"string\" && effectiveType !== \"4g\") || Number(rtt) > 100 || Number(downlink) < 10;\n        if (slow) {\n            return true;\n        }\n    }\n    return (navigator?.userAgentData?.mobile || (typeof navigator?.maxTouchPoints === \"number\" && navigator?.maxTouchPoints > 1));\n};\n","export const memoize = (provider, isExpired, requiresRefresh) => {\n    let resolved;\n    let pending;\n    let hasResult;\n    let isConstant = false;\n    const coalesceProvider = async () => {\n        if (!pending) {\n            pending = provider();\n        }\n        try {\n            resolved = await pending;\n            hasResult = true;\n            isConstant = false;\n        }\n        finally {\n            pending = undefined;\n        }\n        return resolved;\n    };\n    if (isExpired === undefined) {\n        return async (options) => {\n            if (!hasResult || options?.forceRefresh) {\n                resolved = await coalesceProvider();\n            }\n            return resolved;\n        };\n    }\n    return async (options) => {\n        if (!hasResult || options?.forceRefresh) {\n            resolved = await coalesceProvider();\n        }\n        if (isConstant) {\n            return resolved;\n        }\n        if (requiresRefresh && !requiresRefresh(resolved)) {\n            isConstant = true;\n            return resolved;\n        }\n        if (isExpired(resolved)) {\n            await coalesceProvider();\n            return resolved;\n        }\n        return resolved;\n    };\n};\n","export const invalidProvider = (message) => () => Promise.reject(message);\n","import { booleanSelector, SelectorType } from \"@smithy/util-config-provider\";\nexport const ENV_USE_DUALSTACK_ENDPOINT = \"AWS_USE_DUALSTACK_ENDPOINT\";\nexport const CONFIG_USE_DUALSTACK_ENDPOINT = \"use_dualstack_endpoint\";\nexport const DEFAULT_USE_DUALSTACK_ENDPOINT = false;\nexport const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, SelectorType.ENV),\n    configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG),\n    default: false,\n};\n","import { booleanSelector, SelectorType } from \"@smithy/util-config-provider\";\nexport const ENV_USE_FIPS_ENDPOINT = \"AWS_USE_FIPS_ENDPOINT\";\nexport const CONFIG_USE_FIPS_ENDPOINT = \"use_fips_endpoint\";\nexport const DEFAULT_USE_FIPS_ENDPOINT = false;\nexport const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => booleanSelector(env, ENV_USE_FIPS_ENDPOINT, SelectorType.ENV),\n    configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG),\n    default: false,\n};\n","export var AlgorithmId;\n(function (AlgorithmId) {\n    AlgorithmId[\"MD5\"] = \"md5\";\n    AlgorithmId[\"CRC32\"] = \"crc32\";\n    AlgorithmId[\"CRC32C\"] = \"crc32c\";\n    AlgorithmId[\"SHA1\"] = \"sha1\";\n    AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId || (AlgorithmId = {}));\nexport const getChecksumConfiguration = (runtimeConfig) => {\n    const checksumAlgorithms = [];\n    if (runtimeConfig.sha256 !== undefined) {\n        checksumAlgorithms.push({\n            algorithmId: () => AlgorithmId.SHA256,\n            checksumConstructor: () => runtimeConfig.sha256,\n        });\n    }\n    if (runtimeConfig.md5 != undefined) {\n        checksumAlgorithms.push({\n            algorithmId: () => AlgorithmId.MD5,\n            checksumConstructor: () => runtimeConfig.md5,\n        });\n    }\n    return {\n        addChecksumAlgorithm(algo) {\n            checksumAlgorithms.push(algo);\n        },\n        checksumAlgorithms() {\n            return checksumAlgorithms;\n        },\n    };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n    const runtimeConfig = {};\n    clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n        runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n    });\n    return runtimeConfig;\n};\n","import { AlgorithmId } from \"@smithy/types\";\nexport { AlgorithmId };\nconst knownAlgorithms = Object.values(AlgorithmId);\nexport const getChecksumConfiguration = (runtimeConfig) => {\n    const checksumAlgorithms = [];\n    for (const id in AlgorithmId) {\n        const algorithmId = AlgorithmId[id];\n        if (runtimeConfig[algorithmId] === undefined) {\n            continue;\n        }\n        checksumAlgorithms.push({\n            algorithmId: () => algorithmId,\n            checksumConstructor: () => runtimeConfig[algorithmId],\n        });\n    }\n    for (const [id, ChecksumCtor] of Object.entries(runtimeConfig.checksumAlgorithms ?? {})) {\n        checksumAlgorithms.push({\n            algorithmId: () => id,\n            checksumConstructor: () => ChecksumCtor,\n        });\n    }\n    return {\n        addChecksumAlgorithm(algo) {\n            runtimeConfig.checksumAlgorithms = runtimeConfig.checksumAlgorithms ?? {};\n            const id = algo.algorithmId();\n            const ctor = algo.checksumConstructor();\n            if (knownAlgorithms.includes(id)) {\n                runtimeConfig.checksumAlgorithms[id.toUpperCase()] = ctor;\n            }\n            else {\n                runtimeConfig.checksumAlgorithms[id] = ctor;\n            }\n            checksumAlgorithms.push(algo);\n        },\n        checksumAlgorithms() {\n            return checksumAlgorithms;\n        },\n    };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n    const runtimeConfig = {};\n    clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n        const id = checksumAlgorithm.algorithmId();\n        if (knownAlgorithms.includes(id)) {\n            runtimeConfig[id] = checksumAlgorithm.checksumConstructor();\n        }\n    });\n    return runtimeConfig;\n};\n","import { getHostHeaderPlugin, resolveHostHeaderConfig, } from \"@aws-sdk/middleware-host-header\";\nimport { getLoggerPlugin } from \"@aws-sdk/middleware-logger\";\nimport { getRecursionDetectionPlugin } from \"@aws-sdk/middleware-recursion-detection\";\nimport { getUserAgentPlugin, resolveUserAgentConfig, } from \"@aws-sdk/middleware-user-agent\";\nimport { resolveRegionConfig } from \"@smithy/config-resolver\";\nimport { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from \"@smithy/core\";\nimport { getSchemaSerdePlugin } from \"@smithy/core/schema\";\nimport { getContentLengthPlugin } from \"@smithy/middleware-content-length\";\nimport { resolveEndpointConfig, } from \"@smithy/middleware-endpoint\";\nimport { getRetryPlugin, resolveRetryConfig, } from \"@smithy/middleware-retry\";\nimport { Client as __Client, } from \"@smithy/smithy-client\";\nimport { defaultCognitoIdentityProviderHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from \"./auth/httpAuthSchemeProvider\";\nimport { resolveClientEndpointParameters, } from \"./endpoint/EndpointParameters\";\nimport { getRuntimeConfig as __getRuntimeConfig } from \"./runtimeConfig\";\nimport { resolveRuntimeExtensions } from \"./runtimeExtensions\";\nexport { __Client };\nexport class CognitoIdentityProviderClient extends __Client {\n    config;\n    constructor(...[configuration]) {\n        const _config_0 = __getRuntimeConfig(configuration || {});\n        super(_config_0);\n        this.initConfig = _config_0;\n        const _config_1 = resolveClientEndpointParameters(_config_0);\n        const _config_2 = resolveUserAgentConfig(_config_1);\n        const _config_3 = resolveRetryConfig(_config_2);\n        const _config_4 = resolveRegionConfig(_config_3);\n        const _config_5 = resolveHostHeaderConfig(_config_4);\n        const _config_6 = resolveEndpointConfig(_config_5);\n        const _config_7 = resolveHttpAuthSchemeConfig(_config_6);\n        const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);\n        this.config = _config_8;\n        this.middlewareStack.use(getSchemaSerdePlugin(this.config));\n        this.middlewareStack.use(getUserAgentPlugin(this.config));\n        this.middlewareStack.use(getRetryPlugin(this.config));\n        this.middlewareStack.use(getContentLengthPlugin(this.config));\n        this.middlewareStack.use(getHostHeaderPlugin(this.config));\n        this.middlewareStack.use(getLoggerPlugin(this.config));\n        this.middlewareStack.use(getRecursionDetectionPlugin(this.config));\n        this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {\n            httpAuthSchemeParametersProvider: defaultCognitoIdentityProviderHttpAuthSchemeParametersProvider,\n            identityProviderConfigProvider: async (config) => new DefaultIdentityProviderConfig({\n                \"aws.auth#sigv4\": config.credentials,\n            }),\n        }));\n        this.middlewareStack.use(getHttpSigningPlugin(this.config));\n    }\n    destroy() {\n        super.destroy();\n    }\n}\n","import { normalizeProvider } from \"@smithy/core\";\nexport const DEFAULT_UA_APP_ID = undefined;\nfunction isValidUserAgentAppId(appId) {\n    if (appId === undefined) {\n        return true;\n    }\n    return typeof appId === \"string\" && appId.length <= 50;\n}\nexport function resolveUserAgentConfig(input) {\n    const normalizedAppIdProvider = normalizeProvider(input.userAgentAppId ?? DEFAULT_UA_APP_ID);\n    const { customUserAgent } = input;\n    return Object.assign(input, {\n        customUserAgent: typeof customUserAgent === \"string\" ? [[customUserAgent]] : customUserAgent,\n        userAgentAppId: async () => {\n            const appId = await normalizedAppIdProvider();\n            if (!isValidUserAgentAppId(appId)) {\n                const logger = input.logger?.constructor?.name === \"NoOpLogger\" || !input.logger ? console : input.logger;\n                if (typeof appId !== \"string\") {\n                    logger?.warn(\"userAgentAppId must be a string or undefined.\");\n                }\n                else if (appId.length > 50) {\n                    logger?.warn(\"The provided userAgentAppId exceeds the maximum length of 50 characters.\");\n                }\n            }\n            return appId;\n        },\n    });\n}\n","export function setCredentialFeature(credentials, feature, value) {\n    if (!credentials.$source) {\n        credentials.$source = {};\n    }\n    credentials.$source[feature] = value;\n    return credentials;\n}\n","import { normalizeProvider } from \"@smithy/util-middleware\";\nimport { getEndpointFromConfig } from \"./adaptors/getEndpointFromConfig\";\nimport { toEndpointV1 } from \"./adaptors/toEndpointV1\";\nexport const resolveEndpointConfig = (input) => {\n    const tls = input.tls ?? true;\n    const { endpoint, useDualstackEndpoint, useFipsEndpoint } = input;\n    const customEndpointProvider = endpoint != null ? async () => toEndpointV1(await normalizeProvider(endpoint)()) : undefined;\n    const isCustomEndpoint = !!endpoint;\n    const resolvedConfig = Object.assign(input, {\n        endpoint: customEndpointProvider,\n        tls,\n        isCustomEndpoint,\n        useDualstackEndpoint: normalizeProvider(useDualstackEndpoint ?? false),\n        useFipsEndpoint: normalizeProvider(useFipsEndpoint ?? false),\n    });\n    let configuredEndpointPromise = undefined;\n    resolvedConfig.serviceConfiguredEndpoint = async () => {\n        if (input.serviceId && !configuredEndpointPromise) {\n            configuredEndpointPromise = getEndpointFromConfig(input.serviceId);\n        }\n        return configuredEndpointPromise;\n    };\n    return resolvedConfig;\n};\n","import { checkRegion } from \"./checkRegion\";\nimport { getRealRegion } from \"./getRealRegion\";\nimport { isFipsRegion } from \"./isFipsRegion\";\nexport const resolveRegionConfig = (input) => {\n    const { region, useFipsEndpoint } = input;\n    if (!region) {\n        throw new Error(\"Region is missing\");\n    }\n    return Object.assign(input, {\n        region: async () => {\n            const providedRegion = typeof region === \"function\" ? await region() : region;\n            const realRegion = getRealRegion(providedRegion);\n            checkRegion(realRegion);\n            return realRegion;\n        },\n        useFipsEndpoint: async () => {\n            const providedRegion = typeof region === \"string\" ? region : await region();\n            if (isFipsRegion(providedRegion)) {\n                return true;\n            }\n            return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n        },\n    });\n};\n","import { isFipsRegion } from \"./isFipsRegion\";\nexport const getRealRegion = (region) => isFipsRegion(region)\n    ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n        ? \"us-east-1\"\n        : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n    : region;\n","import { normalizeProvider } from \"@smithy/util-middleware\";\nimport { AdaptiveRetryStrategy, DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE, RETRY_MODES, StandardRetryStrategy, } from \"@smithy/util-retry\";\nexport const ENV_MAX_ATTEMPTS = \"AWS_MAX_ATTEMPTS\";\nexport const CONFIG_MAX_ATTEMPTS = \"max_attempts\";\nexport const NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => {\n        const value = env[ENV_MAX_ATTEMPTS];\n        if (!value)\n            return undefined;\n        const maxAttempt = parseInt(value);\n        if (Number.isNaN(maxAttempt)) {\n            throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n        }\n        return maxAttempt;\n    },\n    configFileSelector: (profile) => {\n        const value = profile[CONFIG_MAX_ATTEMPTS];\n        if (!value)\n            return undefined;\n        const maxAttempt = parseInt(value);\n        if (Number.isNaN(maxAttempt)) {\n            throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n        }\n        return maxAttempt;\n    },\n    default: DEFAULT_MAX_ATTEMPTS,\n};\nexport const resolveRetryConfig = (input) => {\n    const { retryStrategy, retryMode: _retryMode, maxAttempts: _maxAttempts } = input;\n    const maxAttempts = normalizeProvider(_maxAttempts ?? DEFAULT_MAX_ATTEMPTS);\n    return Object.assign(input, {\n        maxAttempts,\n        retryStrategy: async () => {\n            if (retryStrategy) {\n                return retryStrategy;\n            }\n            const retryMode = await normalizeProvider(_retryMode)();\n            if (retryMode === RETRY_MODES.ADAPTIVE) {\n                return new AdaptiveRetryStrategy(maxAttempts);\n            }\n            return new StandardRetryStrategy(maxAttempts);\n        },\n    });\n};\nexport const ENV_RETRY_MODE = \"AWS_RETRY_MODE\";\nexport const CONFIG_RETRY_MODE = \"retry_mode\";\nexport const NODE_RETRY_MODE_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[ENV_RETRY_MODE],\n    configFileSelector: (profile) => profile[CONFIG_RETRY_MODE],\n    default: DEFAULT_RETRY_MODE,\n};\n","import { getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, } from \"@aws-sdk/region-config-resolver\";\nimport { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from \"@smithy/protocol-http\";\nimport { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from \"@smithy/smithy-client\";\nimport { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from \"./auth/httpAuthExtensionConfiguration\";\nexport const resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n    const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));\n    extensions.forEach((extension) => extension.configure(extensionConfiguration));\n    return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));\n};\n","export const getAwsRegionExtensionConfiguration = (runtimeConfig) => {\n    return {\n        setRegion(region) {\n            runtimeConfig.region = region;\n        },\n        region() {\n            return runtimeConfig.region;\n        },\n    };\n};\nexport const resolveAwsRegionExtensionConfiguration = (awsRegionExtensionConfiguration) => {\n    return {\n        region: awsRegionExtensionConfiguration.region(),\n    };\n};\n","import { getChecksumConfiguration, resolveChecksumRuntimeConfig } from \"./checksum\";\nimport { getRetryConfiguration, resolveRetryRuntimeConfig } from \"./retry\";\nexport const getDefaultExtensionConfiguration = (runtimeConfig) => {\n    return Object.assign(getChecksumConfiguration(runtimeConfig), getRetryConfiguration(runtimeConfig));\n};\nexport const getDefaultClientConfiguration = getDefaultExtensionConfiguration;\nexport const resolveDefaultRuntimeConfig = (config) => {\n    return Object.assign(resolveChecksumRuntimeConfig(config), resolveRetryRuntimeConfig(config));\n};\n","export const getRetryConfiguration = (runtimeConfig) => {\n    return {\n        setRetryStrategy(retryStrategy) {\n            runtimeConfig.retryStrategy = retryStrategy;\n        },\n        retryStrategy() {\n            return runtimeConfig.retryStrategy;\n        },\n    };\n};\nexport const resolveRetryRuntimeConfig = (retryStrategyConfiguration) => {\n    const runtimeConfig = {};\n    runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy();\n    return runtimeConfig;\n};\n","export const getHttpHandlerExtensionConfiguration = (runtimeConfig) => {\n    return {\n        setHttpHandler(handler) {\n            runtimeConfig.httpHandler = handler;\n        },\n        httpHandler() {\n            return runtimeConfig.httpHandler;\n        },\n        updateHttpClientConfig(key, value) {\n            runtimeConfig.httpHandler?.updateHttpClientConfig(key, value);\n        },\n        httpHandlerConfigs() {\n            return runtimeConfig.httpHandler.httpHandlerConfigs();\n        },\n    };\n};\nexport const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {\n    return {\n        httpHandler: httpHandlerExtensionConfiguration.httpHandler(),\n    };\n};\n","export const getHttpAuthExtensionConfiguration = (runtimeConfig) => {\n    const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;\n    let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;\n    let _credentials = runtimeConfig.credentials;\n    return {\n        setHttpAuthScheme(httpAuthScheme) {\n            const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);\n            if (index === -1) {\n                _httpAuthSchemes.push(httpAuthScheme);\n            }\n            else {\n                _httpAuthSchemes.splice(index, 1, httpAuthScheme);\n            }\n        },\n        httpAuthSchemes() {\n            return _httpAuthSchemes;\n        },\n        setHttpAuthSchemeProvider(httpAuthSchemeProvider) {\n            _httpAuthSchemeProvider = httpAuthSchemeProvider;\n        },\n        httpAuthSchemeProvider() {\n            return _httpAuthSchemeProvider;\n        },\n        setCredentials(credentials) {\n            _credentials = credentials;\n        },\n        credentials() {\n            return _credentials;\n        },\n    };\n};\nexport const resolveHttpAuthRuntimeConfig = (config) => {\n    return {\n        httpAuthSchemes: config.httpAuthSchemes(),\n        httpAuthSchemeProvider: config.httpAuthSchemeProvider(),\n        credentials: config.credentials(),\n    };\n};\n","import { getSmithyContext } from \"@smithy/util-middleware\";\nimport { operation } from \"../schemas/operation\";\nexport const schemaSerializationMiddleware = (config) => (next, context) => async (args) => {\n    const { operationSchema } = getSmithyContext(context);\n    const [, ns, n, t, i, o] = operationSchema ?? [];\n    const endpoint = context.endpointV2?.url && config.urlParser\n        ? async () => config.urlParser(context.endpointV2.url)\n        : config.endpoint;\n    const request = await config.protocol.serializeRequest(operation(ns, n, t, i, o), args.input, {\n        ...config,\n        ...context,\n        endpoint,\n    });\n    return next({\n        ...args,\n        request,\n    });\n};\n","const BYTE_LIMIT = 1024;\nexport function encodeFeatures(features) {\n    let buffer = \"\";\n    for (const key in features) {\n        const val = features[key];\n        if (buffer.length + val.length + 1 <= BYTE_LIMIT) {\n            if (buffer.length) {\n                buffer += \",\" + val;\n            }\n            else {\n                buffer += val;\n            }\n            continue;\n        }\n        break;\n    }\n    return buffer;\n}\n","export const asSdkError = (error) => {\n    if (error instanceof Error)\n        return error;\n    if (error instanceof Object)\n        return Object.assign(new Error(), error);\n    if (typeof error === \"string\")\n        return new Error(error);\n    return new Error(`AWS SDK error wrapper for ${error}`);\n};\n","import { recursionDetectionMiddlewareOptions } from \"./configuration\";\nimport { recursionDetectionMiddleware } from \"./recursionDetectionMiddleware\";\nexport const getRecursionDetectionPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(recursionDetectionMiddleware(), recursionDetectionMiddlewareOptions);\n    },\n});\n","export const recursionDetectionMiddleware = () => (next) => async (args) => next(args);\n","import { getSmithyContext } from \"@smithy/util-middleware\";\nimport { resolveAuthOptions } from \"./resolveAuthOptions\";\nfunction convertHttpAuthSchemesToMap(httpAuthSchemes) {\n    const map = new Map();\n    for (const scheme of httpAuthSchemes) {\n        map.set(scheme.schemeId, scheme);\n    }\n    return map;\n}\nexport const httpAuthSchemeMiddleware = (config, mwOptions) => (next, context) => async (args) => {\n    const options = config.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config, context, args.input));\n    const authSchemePreference = config.authSchemePreference ? await config.authSchemePreference() : [];\n    const resolvedOptions = resolveAuthOptions(options, authSchemePreference);\n    const authSchemes = convertHttpAuthSchemesToMap(config.httpAuthSchemes);\n    const smithyContext = getSmithyContext(context);\n    const failureReasons = [];\n    for (const option of resolvedOptions) {\n        const scheme = authSchemes.get(option.schemeId);\n        if (!scheme) {\n            failureReasons.push(`HttpAuthScheme \\`${option.schemeId}\\` was not enabled for this service.`);\n            continue;\n        }\n        const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config));\n        if (!identityProvider) {\n            failureReasons.push(`HttpAuthScheme \\`${option.schemeId}\\` did not have an IdentityProvider configured.`);\n            continue;\n        }\n        const { identityProperties = {}, signingProperties = {} } = option.propertiesExtractor?.(config, context) || {};\n        option.identityProperties = Object.assign(option.identityProperties || {}, identityProperties);\n        option.signingProperties = Object.assign(option.signingProperties || {}, signingProperties);\n        smithyContext.selectedHttpAuthScheme = {\n            httpAuthOption: option,\n            identity: await identityProvider(option.identityProperties),\n            signer: scheme.signer,\n        };\n        break;\n    }\n    if (!smithyContext.selectedHttpAuthScheme) {\n        throw new Error(failureReasons.join(\"\\n\"));\n    }\n    return next(args);\n};\n","export const resolveAuthOptions = (candidateAuthOptions, authSchemePreference) => {\n    if (!authSchemePreference || authSchemePreference.length === 0) {\n        return candidateAuthOptions;\n    }\n    const preferredAuthOptions = [];\n    for (const preferredSchemeName of authSchemePreference) {\n        for (const candidateAuthOption of candidateAuthOptions) {\n            const candidateAuthSchemeName = candidateAuthOption.schemeId.split(\"#\")[1];\n            if (candidateAuthSchemeName === preferredSchemeName) {\n                preferredAuthOptions.push(candidateAuthOption);\n            }\n        }\n    }\n    for (const candidateAuthOption of candidateAuthOptions) {\n        if (!preferredAuthOptions.find(({ schemeId }) => schemeId === candidateAuthOption.schemeId)) {\n            preferredAuthOptions.push(candidateAuthOption);\n        }\n    }\n    return preferredAuthOptions;\n};\n","import { deserializerMiddleware } from \"./deserializerMiddleware\";\nimport { serializerMiddleware } from \"./serializerMiddleware\";\nexport const deserializerMiddlewareOption = {\n    name: \"deserializerMiddleware\",\n    step: \"deserialize\",\n    tags: [\"DESERIALIZER\"],\n    override: true,\n};\nexport const serializerMiddlewareOption = {\n    name: \"serializerMiddleware\",\n    step: \"serialize\",\n    tags: [\"SERIALIZER\"],\n    override: true,\n};\nexport function getSerdePlugin(config, serializer, deserializer) {\n    return {\n        applyToStack: (commandStack) => {\n            commandStack.add(deserializerMiddleware(config, deserializer), deserializerMiddlewareOption);\n            commandStack.add(serializerMiddleware(config, serializer), serializerMiddlewareOption);\n        },\n    };\n}\n","export const resolveParamsForS3 = async (endpointParams) => {\n    const bucket = endpointParams?.Bucket || \"\";\n    if (typeof endpointParams.Bucket === \"string\") {\n        endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent(\"#\")).replace(/\\?/g, encodeURIComponent(\"?\"));\n    }\n    if (isArnBucketName(bucket)) {\n        if (endpointParams.ForcePathStyle === true) {\n            throw new Error(\"Path-style addressing cannot be used with ARN buckets\");\n        }\n    }\n    else if (!isDnsCompatibleBucketName(bucket) ||\n        (bucket.indexOf(\".\") !== -1 && !String(endpointParams.Endpoint).startsWith(\"http:\")) ||\n        bucket.toLowerCase() !== bucket ||\n        bucket.length < 3) {\n        endpointParams.ForcePathStyle = true;\n    }\n    if (endpointParams.DisableMultiRegionAccessPoints) {\n        endpointParams.disableMultiRegionAccessPoints = true;\n        endpointParams.DisableMRAP = true;\n    }\n    return endpointParams;\n};\nconst DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$/;\nconst IP_ADDRESS_PATTERN = /(\\d+\\.){3}\\d+/;\nconst DOTS_PATTERN = /\\.\\./;\nexport const DOT_PATTERN = /\\./;\nexport const S3_HOSTNAME_PATTERN = /^(.+\\.)?s3(-fips)?(\\.dualstack)?[.-]([a-z0-9-]+)\\./;\nexport const isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);\nexport const isArnBucketName = (bucketName) => {\n    const [arn, partition, service, , , bucket] = bucketName.split(\":\");\n    const isArn = arn === \"arn\" && bucketName.split(\":\").length >= 6;\n    const isValidArn = Boolean(isArn && partition && service && bucket);\n    if (isArn && !isValidArn) {\n        throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`);\n    }\n    return isValidArn;\n};\n","export const createConfigValueProvider = (configKey, canonicalEndpointParamKey, config, isClientContextParam = false) => {\n    const configProvider = async () => {\n        let configValue;\n        if (isClientContextParam) {\n            const clientContextParams = config.clientContextParams;\n            const nestedValue = clientContextParams?.[configKey];\n            configValue = nestedValue ?? config[configKey] ?? config[canonicalEndpointParamKey];\n        }\n        else {\n            configValue = config[configKey] ?? config[canonicalEndpointParamKey];\n        }\n        if (typeof configValue === \"function\") {\n            return configValue();\n        }\n        return configValue;\n    };\n    if (configKey === \"credentialScope\" || canonicalEndpointParamKey === \"CredentialScope\") {\n        return async () => {\n            const credentials = typeof config.credentials === \"function\" ? await config.credentials() : config.credentials;\n            const configValue = credentials?.credentialScope ?? credentials?.CredentialScope;\n            return configValue;\n        };\n    }\n    if (configKey === \"accountId\" || canonicalEndpointParamKey === \"AccountId\") {\n        return async () => {\n            const credentials = typeof config.credentials === \"function\" ? await config.credentials() : config.credentials;\n            const configValue = credentials?.accountId ?? credentials?.AccountId;\n            return configValue;\n        };\n    }\n    if (configKey === \"endpoint\" || canonicalEndpointParamKey === \"endpoint\") {\n        return async () => {\n            if (config.isCustomEndpoint === false) {\n                return undefined;\n            }\n            const endpoint = await configProvider();\n            if (endpoint && typeof endpoint === \"object\") {\n                if (\"url\" in endpoint) {\n                    return endpoint.url.href;\n                }\n                if (\"hostname\" in endpoint) {\n                    const { protocol, hostname, port, path } = endpoint;\n                    return `${protocol}//${hostname}${port ? \":\" + port : \"\"}${path}`;\n                }\n            }\n            return endpoint;\n        };\n    }\n    return configProvider;\n};\n","import { resolveParamsForS3 } from \"../service-customizations\";\nimport { createConfigValueProvider } from \"./createConfigValueProvider\";\nimport { getEndpointFromConfig } from \"./getEndpointFromConfig\";\nimport { toEndpointV1 } from \"./toEndpointV1\";\nexport const getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => {\n    if (!clientConfig.isCustomEndpoint) {\n        let endpointFromConfig;\n        if (clientConfig.serviceConfiguredEndpoint) {\n            endpointFromConfig = await clientConfig.serviceConfiguredEndpoint();\n        }\n        else {\n            endpointFromConfig = await getEndpointFromConfig(clientConfig.serviceId);\n        }\n        if (endpointFromConfig) {\n            clientConfig.endpoint = () => Promise.resolve(toEndpointV1(endpointFromConfig));\n            clientConfig.isCustomEndpoint = true;\n        }\n    }\n    const endpointParams = await resolveParams(commandInput, instructionsSupplier, clientConfig);\n    if (typeof clientConfig.endpointProvider !== \"function\") {\n        throw new Error(\"config.endpointProvider is not set.\");\n    }\n    const endpoint = clientConfig.endpointProvider(endpointParams, context);\n    return endpoint;\n};\nexport const resolveParams = async (commandInput, instructionsSupplier, clientConfig) => {\n    const endpointParams = {};\n    const instructions = instructionsSupplier?.getEndpointParameterInstructions?.() || {};\n    for (const [name, instruction] of Object.entries(instructions)) {\n        switch (instruction.type) {\n            case \"staticContextParams\":\n                endpointParams[name] = instruction.value;\n                break;\n            case \"contextParams\":\n                endpointParams[name] = commandInput[instruction.name];\n                break;\n            case \"clientContextParams\":\n            case \"builtInParams\":\n                endpointParams[name] = await createConfigValueProvider(instruction.name, name, clientConfig, instruction.type !== \"builtInParams\")();\n                break;\n            case \"operationContextParams\":\n                endpointParams[name] = instruction.get(commandInput);\n                break;\n            default:\n                throw new Error(\"Unrecognized endpoint parameter instruction: \" + JSON.stringify(instruction));\n        }\n    }\n    if (Object.keys(instructions).length === 0) {\n        Object.assign(endpointParams, clientConfig);\n    }\n    if (String(clientConfig.serviceId).toLowerCase() === \"s3\") {\n        await resolveParamsForS3(endpointParams);\n    }\n    return endpointParams;\n};\n","import { serializerMiddlewareOption } from \"@smithy/middleware-serde\";\nimport { endpointMiddleware } from \"./endpointMiddleware\";\nexport const endpointMiddlewareOptions = {\n    step: \"serialize\",\n    tags: [\"ENDPOINT_PARAMETERS\", \"ENDPOINT_V2\", \"ENDPOINT\"],\n    name: \"endpointV2Middleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: serializerMiddlewareOption.name,\n};\nexport const getEndpointPlugin = (config, instructions) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(endpointMiddleware({\n            config,\n            instructions,\n        }), endpointMiddlewareOptions);\n    },\n});\n","import { setFeature } from \"@smithy/core\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nimport { getEndpointFromInstructions } from \"./adaptors/getEndpointFromInstructions\";\nexport const endpointMiddleware = ({ config, instructions, }) => {\n    return (next, context) => async (args) => {\n        if (config.isCustomEndpoint) {\n            setFeature(context, \"ENDPOINT_OVERRIDE\", \"N\");\n        }\n        const endpoint = await getEndpointFromInstructions(args.input, {\n            getEndpointParameterInstructions() {\n                return instructions;\n            },\n        }, { ...config }, context);\n        context.endpointV2 = endpoint;\n        context.authSchemes = endpoint.properties?.authSchemes;\n        const authScheme = context.authSchemes?.[0];\n        if (authScheme) {\n            context[\"signing_region\"] = authScheme.signingRegion;\n            context[\"signing_service\"] = authScheme.signingName;\n            const smithyContext = getSmithyContext(context);\n            const httpAuthOption = smithyContext?.selectedHttpAuthScheme?.httpAuthOption;\n            if (httpAuthOption) {\n                httpAuthOption.signingProperties = Object.assign(httpAuthOption.signingProperties || {}, {\n                    signing_region: authScheme.signingRegion,\n                    signingRegion: authScheme.signingRegion,\n                    signing_service: authScheme.signingName,\n                    signingName: authScheme.signingName,\n                    signingRegionSet: authScheme.signingRegionSet,\n                }, authScheme.properties);\n            }\n        }\n        return next({\n            ...args,\n        });\n    };\n};\n","export function setFeature(context, feature, value) {\n    if (!context.__smithy_context) {\n        context.__smithy_context = {\n            features: {},\n        };\n    }\n    else if (!context.__smithy_context.features) {\n        context.__smithy_context.features = {};\n    }\n    context.__smithy_context.features[feature] = value;\n}\n","import { NormalizedSchema } from \"@smithy/core/schema\";\nconst SENSITIVE_STRING = \"***SensitiveInformation***\";\nexport function schemaLogFilter(schema, data) {\n    if (data == null) {\n        return data;\n    }\n    const ns = NormalizedSchema.of(schema);\n    if (ns.getMergedTraits().sensitive) {\n        return SENSITIVE_STRING;\n    }\n    if (ns.isListSchema()) {\n        const isSensitive = !!ns.getValueSchema().getMergedTraits().sensitive;\n        if (isSensitive) {\n            return SENSITIVE_STRING;\n        }\n    }\n    else if (ns.isMapSchema()) {\n        const isSensitive = !!ns.getKeySchema().getMergedTraits().sensitive || !!ns.getValueSchema().getMergedTraits().sensitive;\n        if (isSensitive) {\n            return SENSITIVE_STRING;\n        }\n    }\n    else if (ns.isStructSchema() && typeof data === \"object\") {\n        const object = data;\n        const newObject = {};\n        for (const [member, memberNs] of ns.structIterator()) {\n            if (object[member] != null) {\n                newObject[member] = schemaLogFilter(memberNs, object[member]);\n            }\n        }\n        return newObject;\n    }\n    return data;\n}\n","import { constructStack } from \"@smithy/middleware-stack\";\nimport { SMITHY_CONTEXT_KEY } from \"@smithy/types\";\nimport { schemaLogFilter } from \"./schemaLogFilter\";\nexport class Command {\n    middlewareStack = constructStack();\n    schema;\n    static classBuilder() {\n        return new ClassBuilder();\n    }\n    resolveMiddlewareWithContext(clientStack, configuration, options, { middlewareFn, clientName, commandName, inputFilterSensitiveLog, outputFilterSensitiveLog, smithyContext, additionalContext, CommandCtor, }) {\n        for (const mw of middlewareFn.bind(this)(CommandCtor, clientStack, configuration, options)) {\n            this.middlewareStack.use(mw);\n        }\n        const stack = clientStack.concat(this.middlewareStack);\n        const { logger } = configuration;\n        const handlerExecutionContext = {\n            logger,\n            clientName,\n            commandName,\n            inputFilterSensitiveLog,\n            outputFilterSensitiveLog,\n            [SMITHY_CONTEXT_KEY]: {\n                commandInstance: this,\n                ...smithyContext,\n            },\n            ...additionalContext,\n        };\n        const { requestHandler } = configuration;\n        return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n    }\n}\nclass ClassBuilder {\n    _init = () => { };\n    _ep = {};\n    _middlewareFn = () => [];\n    _commandName = \"\";\n    _clientName = \"\";\n    _additionalContext = {};\n    _smithyContext = {};\n    _inputFilterSensitiveLog = undefined;\n    _outputFilterSensitiveLog = undefined;\n    _serializer = null;\n    _deserializer = null;\n    _operationSchema;\n    init(cb) {\n        this._init = cb;\n    }\n    ep(endpointParameterInstructions) {\n        this._ep = endpointParameterInstructions;\n        return this;\n    }\n    m(middlewareSupplier) {\n        this._middlewareFn = middlewareSupplier;\n        return this;\n    }\n    s(service, operation, smithyContext = {}) {\n        this._smithyContext = {\n            service,\n            operation,\n            ...smithyContext,\n        };\n        return this;\n    }\n    c(additionalContext = {}) {\n        this._additionalContext = additionalContext;\n        return this;\n    }\n    n(clientName, commandName) {\n        this._clientName = clientName;\n        this._commandName = commandName;\n        return this;\n    }\n    f(inputFilter = (_) => _, outputFilter = (_) => _) {\n        this._inputFilterSensitiveLog = inputFilter;\n        this._outputFilterSensitiveLog = outputFilter;\n        return this;\n    }\n    ser(serializer) {\n        this._serializer = serializer;\n        return this;\n    }\n    de(deserializer) {\n        this._deserializer = deserializer;\n        return this;\n    }\n    sc(operation) {\n        this._operationSchema = operation;\n        this._smithyContext.operationSchema = operation;\n        return this;\n    }\n    build() {\n        const closure = this;\n        let CommandRef;\n        return (CommandRef = class extends Command {\n            input;\n            static getEndpointParameterInstructions() {\n                return closure._ep;\n            }\n            constructor(...[input]) {\n                super();\n                this.input = input ?? {};\n                closure._init(this);\n                this.schema = closure._operationSchema;\n            }\n            resolveMiddleware(stack, configuration, options) {\n                const op = closure._operationSchema;\n                const input = op?.[4] ?? op?.input;\n                const output = op?.[5] ?? op?.output;\n                return this.resolveMiddlewareWithContext(stack, configuration, options, {\n                    CommandCtor: CommandRef,\n                    middlewareFn: closure._middlewareFn,\n                    clientName: closure._clientName,\n                    commandName: closure._commandName,\n                    inputFilterSensitiveLog: closure._inputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, input) : (_) => _),\n                    outputFilterSensitiveLog: closure._outputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, output) : (_) => _),\n                    smithyContext: closure._smithyContext,\n                    additionalContext: closure._additionalContext,\n                });\n            }\n            serialize = closure._serializer;\n            deserialize = closure._deserializer;\n        });\n    }\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AddCustomAttributes$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AddCustomAttributesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AddCustomAttributes\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AddCustomAttributesCommand\")\n    .sc(AddCustomAttributes$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminAddUserToGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminAddUserToGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminAddUserToGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminAddUserToGroupCommand\")\n    .sc(AdminAddUserToGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminConfirmSignUp$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminConfirmSignUpCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminConfirmSignUp\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminConfirmSignUpCommand\")\n    .sc(AdminConfirmSignUp$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminCreateUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminCreateUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminCreateUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminCreateUserCommand\")\n    .sc(AdminCreateUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminDeleteUserAttributes$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminDeleteUserAttributesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminDeleteUserAttributes\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminDeleteUserAttributesCommand\")\n    .sc(AdminDeleteUserAttributes$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminDeleteUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminDeleteUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminDeleteUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminDeleteUserCommand\")\n    .sc(AdminDeleteUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminDisableProviderForUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminDisableProviderForUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminDisableProviderForUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminDisableProviderForUserCommand\")\n    .sc(AdminDisableProviderForUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminDisableUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminDisableUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminDisableUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminDisableUserCommand\")\n    .sc(AdminDisableUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminEnableUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminEnableUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminEnableUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminEnableUserCommand\")\n    .sc(AdminEnableUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminForgetDevice$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminForgetDeviceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminForgetDevice\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminForgetDeviceCommand\")\n    .sc(AdminForgetDevice$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminGetDevice$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminGetDeviceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminGetDevice\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminGetDeviceCommand\")\n    .sc(AdminGetDevice$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminGetUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminGetUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminGetUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminGetUserCommand\")\n    .sc(AdminGetUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminInitiateAuth$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminInitiateAuthCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminInitiateAuth\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminInitiateAuthCommand\")\n    .sc(AdminInitiateAuth$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminLinkProviderForUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminLinkProviderForUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminLinkProviderForUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminLinkProviderForUserCommand\")\n    .sc(AdminLinkProviderForUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminListDevices$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminListDevicesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminListDevices\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminListDevicesCommand\")\n    .sc(AdminListDevices$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminListGroupsForUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminListGroupsForUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminListGroupsForUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminListGroupsForUserCommand\")\n    .sc(AdminListGroupsForUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminListUserAuthEvents$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminListUserAuthEventsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminListUserAuthEvents\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminListUserAuthEventsCommand\")\n    .sc(AdminListUserAuthEvents$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminRemoveUserFromGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminRemoveUserFromGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminRemoveUserFromGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminRemoveUserFromGroupCommand\")\n    .sc(AdminRemoveUserFromGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminResetUserPassword$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminResetUserPasswordCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminResetUserPassword\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminResetUserPasswordCommand\")\n    .sc(AdminResetUserPassword$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminRespondToAuthChallenge$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminRespondToAuthChallengeCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminRespondToAuthChallenge\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminRespondToAuthChallengeCommand\")\n    .sc(AdminRespondToAuthChallenge$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminSetUserMFAPreference$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminSetUserMFAPreferenceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminSetUserMFAPreference\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminSetUserMFAPreferenceCommand\")\n    .sc(AdminSetUserMFAPreference$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminSetUserPassword$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminSetUserPasswordCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminSetUserPassword\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminSetUserPasswordCommand\")\n    .sc(AdminSetUserPassword$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminSetUserSettings$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminSetUserSettingsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminSetUserSettings\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminSetUserSettingsCommand\")\n    .sc(AdminSetUserSettings$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminUpdateAuthEventFeedback$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminUpdateAuthEventFeedbackCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminUpdateAuthEventFeedback\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminUpdateAuthEventFeedbackCommand\")\n    .sc(AdminUpdateAuthEventFeedback$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminUpdateDeviceStatus$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminUpdateDeviceStatusCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminUpdateDeviceStatus\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminUpdateDeviceStatusCommand\")\n    .sc(AdminUpdateDeviceStatus$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminUpdateUserAttributes$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminUpdateUserAttributesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminUpdateUserAttributes\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminUpdateUserAttributesCommand\")\n    .sc(AdminUpdateUserAttributes$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AdminUserGlobalSignOut$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AdminUserGlobalSignOutCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AdminUserGlobalSignOut\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AdminUserGlobalSignOutCommand\")\n    .sc(AdminUserGlobalSignOut$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AssociateSoftwareToken$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AssociateSoftwareTokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"AssociateSoftwareToken\", {})\n    .n(\"CognitoIdentityProviderClient\", \"AssociateSoftwareTokenCommand\")\n    .sc(AssociateSoftwareToken$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ChangePassword$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ChangePasswordCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ChangePassword\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ChangePasswordCommand\")\n    .sc(ChangePassword$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CompleteWebAuthnRegistration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CompleteWebAuthnRegistrationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CompleteWebAuthnRegistration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CompleteWebAuthnRegistrationCommand\")\n    .sc(CompleteWebAuthnRegistration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ConfirmDevice$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ConfirmDeviceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ConfirmDevice\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ConfirmDeviceCommand\")\n    .sc(ConfirmDevice$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ConfirmForgotPassword$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ConfirmForgotPasswordCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ConfirmForgotPassword\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ConfirmForgotPasswordCommand\")\n    .sc(ConfirmForgotPassword$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ConfirmSignUp$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ConfirmSignUpCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ConfirmSignUp\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ConfirmSignUpCommand\")\n    .sc(ConfirmSignUp$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateGroupCommand\")\n    .sc(CreateGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateIdentityProvider$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateIdentityProviderCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateIdentityProvider\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateIdentityProviderCommand\")\n    .sc(CreateIdentityProvider$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateManagedLoginBranding$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateManagedLoginBrandingCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateManagedLoginBranding\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateManagedLoginBrandingCommand\")\n    .sc(CreateManagedLoginBranding$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateResourceServer$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateResourceServerCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateResourceServer\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateResourceServerCommand\")\n    .sc(CreateResourceServer$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateTerms$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateTermsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateTerms\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateTermsCommand\")\n    .sc(CreateTerms$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateUserImportJob$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateUserImportJobCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateUserImportJob\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateUserImportJobCommand\")\n    .sc(CreateUserImportJob$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateUserPoolClient$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateUserPoolClientCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateUserPoolClient\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateUserPoolClientCommand\")\n    .sc(CreateUserPoolClient$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateUserPool$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateUserPoolCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateUserPool\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateUserPoolCommand\")\n    .sc(CreateUserPool$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateUserPoolDomain$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateUserPoolDomainCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"CreateUserPoolDomain\", {})\n    .n(\"CognitoIdentityProviderClient\", \"CreateUserPoolDomainCommand\")\n    .sc(CreateUserPoolDomain$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteGroupCommand\")\n    .sc(DeleteGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteIdentityProvider$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteIdentityProviderCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteIdentityProvider\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteIdentityProviderCommand\")\n    .sc(DeleteIdentityProvider$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteManagedLoginBranding$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteManagedLoginBrandingCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteManagedLoginBranding\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteManagedLoginBrandingCommand\")\n    .sc(DeleteManagedLoginBranding$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteResourceServer$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteResourceServerCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteResourceServer\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteResourceServerCommand\")\n    .sc(DeleteResourceServer$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteTerms$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteTermsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteTerms\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteTermsCommand\")\n    .sc(DeleteTerms$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteUserAttributes$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteUserAttributesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteUserAttributes\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteUserAttributesCommand\")\n    .sc(DeleteUserAttributes$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteUserCommand\")\n    .sc(DeleteUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteUserPoolClient$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteUserPoolClientCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteUserPoolClient\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteUserPoolClientCommand\")\n    .sc(DeleteUserPoolClient$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteUserPool$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteUserPoolCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteUserPool\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteUserPoolCommand\")\n    .sc(DeleteUserPool$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteUserPoolDomain$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteUserPoolDomainCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteUserPoolDomain\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteUserPoolDomainCommand\")\n    .sc(DeleteUserPoolDomain$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DeleteWebAuthnCredential$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DeleteWebAuthnCredentialCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DeleteWebAuthnCredential\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DeleteWebAuthnCredentialCommand\")\n    .sc(DeleteWebAuthnCredential$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeIdentityProvider$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeIdentityProviderCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeIdentityProvider\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeIdentityProviderCommand\")\n    .sc(DescribeIdentityProvider$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeManagedLoginBrandingByClient$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeManagedLoginBrandingByClientCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeManagedLoginBrandingByClient\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeManagedLoginBrandingByClientCommand\")\n    .sc(DescribeManagedLoginBrandingByClient$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeManagedLoginBranding$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeManagedLoginBrandingCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeManagedLoginBranding\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeManagedLoginBrandingCommand\")\n    .sc(DescribeManagedLoginBranding$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeResourceServer$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeResourceServerCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeResourceServer\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeResourceServerCommand\")\n    .sc(DescribeResourceServer$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeRiskConfiguration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeRiskConfigurationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeRiskConfiguration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeRiskConfigurationCommand\")\n    .sc(DescribeRiskConfiguration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeTerms$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeTermsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeTerms\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeTermsCommand\")\n    .sc(DescribeTerms$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeUserImportJob$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeUserImportJobCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeUserImportJob\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeUserImportJobCommand\")\n    .sc(DescribeUserImportJob$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeUserPoolClient$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeUserPoolClientCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeUserPoolClient\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeUserPoolClientCommand\")\n    .sc(DescribeUserPoolClient$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeUserPool$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeUserPoolCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeUserPool\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeUserPoolCommand\")\n    .sc(DescribeUserPool$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { DescribeUserPoolDomain$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class DescribeUserPoolDomainCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"DescribeUserPoolDomain\", {})\n    .n(\"CognitoIdentityProviderClient\", \"DescribeUserPoolDomainCommand\")\n    .sc(DescribeUserPoolDomain$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ForgetDevice$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ForgetDeviceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ForgetDevice\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ForgetDeviceCommand\")\n    .sc(ForgetDevice$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ForgotPassword$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ForgotPasswordCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ForgotPassword\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ForgotPasswordCommand\")\n    .sc(ForgotPassword$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetCSVHeader$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetCSVHeaderCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetCSVHeader\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetCSVHeaderCommand\")\n    .sc(GetCSVHeader$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetDevice$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetDeviceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetDevice\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetDeviceCommand\")\n    .sc(GetDevice$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetGroupCommand\")\n    .sc(GetGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetIdentityProviderByIdentifier$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetIdentityProviderByIdentifierCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetIdentityProviderByIdentifier\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetIdentityProviderByIdentifierCommand\")\n    .sc(GetIdentityProviderByIdentifier$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetLogDeliveryConfiguration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetLogDeliveryConfigurationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetLogDeliveryConfiguration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetLogDeliveryConfigurationCommand\")\n    .sc(GetLogDeliveryConfiguration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetSigningCertificate$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetSigningCertificateCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetSigningCertificate\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetSigningCertificateCommand\")\n    .sc(GetSigningCertificate$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetTokensFromRefreshToken$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetTokensFromRefreshTokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetTokensFromRefreshToken\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetTokensFromRefreshTokenCommand\")\n    .sc(GetTokensFromRefreshToken$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetUICustomization$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetUICustomizationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetUICustomization\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetUICustomizationCommand\")\n    .sc(GetUICustomization$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetUserAttributeVerificationCode$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetUserAttributeVerificationCodeCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetUserAttributeVerificationCode\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetUserAttributeVerificationCodeCommand\")\n    .sc(GetUserAttributeVerificationCode$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetUserAuthFactors$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetUserAuthFactorsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetUserAuthFactors\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetUserAuthFactorsCommand\")\n    .sc(GetUserAuthFactors$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetUser$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetUserCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetUser\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetUserCommand\")\n    .sc(GetUser$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetUserPoolMfaConfig$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetUserPoolMfaConfigCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GetUserPoolMfaConfig\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GetUserPoolMfaConfigCommand\")\n    .sc(GetUserPoolMfaConfig$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GlobalSignOut$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GlobalSignOutCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"GlobalSignOut\", {})\n    .n(\"CognitoIdentityProviderClient\", \"GlobalSignOutCommand\")\n    .sc(GlobalSignOut$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { InitiateAuth$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class InitiateAuthCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"InitiateAuth\", {})\n    .n(\"CognitoIdentityProviderClient\", \"InitiateAuthCommand\")\n    .sc(InitiateAuth$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListDevices$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListDevicesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListDevices\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListDevicesCommand\")\n    .sc(ListDevices$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListGroups$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListGroupsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListGroups\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListGroupsCommand\")\n    .sc(ListGroups$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListIdentityProviders$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListIdentityProvidersCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListIdentityProviders\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListIdentityProvidersCommand\")\n    .sc(ListIdentityProviders$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListResourceServers$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListResourceServersCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListResourceServers\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListResourceServersCommand\")\n    .sc(ListResourceServers$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListTagsForResource$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListTagsForResourceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListTagsForResource\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListTagsForResourceCommand\")\n    .sc(ListTagsForResource$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListTerms$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListTermsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListTerms\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListTermsCommand\")\n    .sc(ListTerms$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListUserImportJobs$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListUserImportJobsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListUserImportJobs\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListUserImportJobsCommand\")\n    .sc(ListUserImportJobs$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListUserPoolClients$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListUserPoolClientsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListUserPoolClients\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListUserPoolClientsCommand\")\n    .sc(ListUserPoolClients$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListUserPools$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListUserPoolsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListUserPools\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListUserPoolsCommand\")\n    .sc(ListUserPools$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListUsers$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListUsersCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListUsers\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListUsersCommand\")\n    .sc(ListUsers$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListUsersInGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListUsersInGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListUsersInGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListUsersInGroupCommand\")\n    .sc(ListUsersInGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ListWebAuthnCredentials$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ListWebAuthnCredentialsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ListWebAuthnCredentials\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ListWebAuthnCredentialsCommand\")\n    .sc(ListWebAuthnCredentials$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { ResendConfirmationCode$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class ResendConfirmationCodeCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"ResendConfirmationCode\", {})\n    .n(\"CognitoIdentityProviderClient\", \"ResendConfirmationCodeCommand\")\n    .sc(ResendConfirmationCode$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { RespondToAuthChallenge$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class RespondToAuthChallengeCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"RespondToAuthChallenge\", {})\n    .n(\"CognitoIdentityProviderClient\", \"RespondToAuthChallengeCommand\")\n    .sc(RespondToAuthChallenge$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { RevokeToken$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class RevokeTokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"RevokeToken\", {})\n    .n(\"CognitoIdentityProviderClient\", \"RevokeTokenCommand\")\n    .sc(RevokeToken$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetLogDeliveryConfiguration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetLogDeliveryConfigurationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetLogDeliveryConfiguration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetLogDeliveryConfigurationCommand\")\n    .sc(SetLogDeliveryConfiguration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetRiskConfiguration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetRiskConfigurationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetRiskConfiguration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetRiskConfigurationCommand\")\n    .sc(SetRiskConfiguration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetUICustomization$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetUICustomizationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetUICustomization\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetUICustomizationCommand\")\n    .sc(SetUICustomization$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetUserMFAPreference$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetUserMFAPreferenceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetUserMFAPreference\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetUserMFAPreferenceCommand\")\n    .sc(SetUserMFAPreference$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetUserPoolMfaConfig$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetUserPoolMfaConfigCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetUserPoolMfaConfig\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetUserPoolMfaConfigCommand\")\n    .sc(SetUserPoolMfaConfig$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SetUserSettings$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SetUserSettingsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SetUserSettings\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SetUserSettingsCommand\")\n    .sc(SetUserSettings$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { SignUp$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class SignUpCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"SignUp\", {})\n    .n(\"CognitoIdentityProviderClient\", \"SignUpCommand\")\n    .sc(SignUp$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { StartUserImportJob$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class StartUserImportJobCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"StartUserImportJob\", {})\n    .n(\"CognitoIdentityProviderClient\", \"StartUserImportJobCommand\")\n    .sc(StartUserImportJob$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { StartWebAuthnRegistration$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class StartWebAuthnRegistrationCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"StartWebAuthnRegistration\", {})\n    .n(\"CognitoIdentityProviderClient\", \"StartWebAuthnRegistrationCommand\")\n    .sc(StartWebAuthnRegistration$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { StopUserImportJob$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class StopUserImportJobCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"StopUserImportJob\", {})\n    .n(\"CognitoIdentityProviderClient\", \"StopUserImportJobCommand\")\n    .sc(StopUserImportJob$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { TagResource$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class TagResourceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"TagResource\", {})\n    .n(\"CognitoIdentityProviderClient\", \"TagResourceCommand\")\n    .sc(TagResource$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UntagResource$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UntagResourceCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UntagResource\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UntagResourceCommand\")\n    .sc(UntagResource$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateAuthEventFeedback$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateAuthEventFeedbackCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateAuthEventFeedback\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateAuthEventFeedbackCommand\")\n    .sc(UpdateAuthEventFeedback$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateDeviceStatus$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateDeviceStatusCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateDeviceStatus\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateDeviceStatusCommand\")\n    .sc(UpdateDeviceStatus$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateGroup$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateGroupCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateGroup\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateGroupCommand\")\n    .sc(UpdateGroup$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateIdentityProvider$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateIdentityProviderCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateIdentityProvider\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateIdentityProviderCommand\")\n    .sc(UpdateIdentityProvider$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateManagedLoginBranding$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateManagedLoginBrandingCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateManagedLoginBranding\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateManagedLoginBrandingCommand\")\n    .sc(UpdateManagedLoginBranding$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateResourceServer$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateResourceServerCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateResourceServer\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateResourceServerCommand\")\n    .sc(UpdateResourceServer$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateTerms$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateTermsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateTerms\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateTermsCommand\")\n    .sc(UpdateTerms$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateUserAttributes$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateUserAttributesCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateUserAttributes\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateUserAttributesCommand\")\n    .sc(UpdateUserAttributes$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateUserPoolClient$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateUserPoolClientCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateUserPoolClient\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateUserPoolClientCommand\")\n    .sc(UpdateUserPoolClient$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateUserPool$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateUserPoolCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateUserPool\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateUserPoolCommand\")\n    .sc(UpdateUserPool$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { UpdateUserPoolDomain$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class UpdateUserPoolDomainCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"UpdateUserPoolDomain\", {})\n    .n(\"CognitoIdentityProviderClient\", \"UpdateUserPoolDomainCommand\")\n    .sc(UpdateUserPoolDomain$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { VerifySoftwareToken$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class VerifySoftwareTokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"VerifySoftwareToken\", {})\n    .n(\"CognitoIdentityProviderClient\", \"VerifySoftwareTokenCommand\")\n    .sc(VerifySoftwareToken$)\n    .build() {\n}\n","import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { VerifyUserAttribute$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class VerifyUserAttributeCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSCognitoIdentityProviderService\", \"VerifyUserAttribute\", {})\n    .n(\"CognitoIdentityProviderClient\", \"VerifyUserAttributeCommand\")\n    .sc(VerifyUserAttribute$)\n    .build() {\n}\n","const makePagedClientRequest = async (CommandCtor, client, input, withCommand = (_) => _, ...args) => {\n    let command = new CommandCtor(input);\n    command = withCommand(command) ?? command;\n    return await client.send(command, ...args);\n};\nexport function createPaginator(ClientCtor, CommandCtor, inputTokenName, outputTokenName, pageSizeTokenName) {\n    return async function* paginateOperation(config, input, ...additionalArguments) {\n        const _input = input;\n        let token = config.startingToken ?? _input[inputTokenName];\n        let hasNext = true;\n        let page;\n        while (hasNext) {\n            _input[inputTokenName] = token;\n            if (pageSizeTokenName) {\n                _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config.pageSize;\n            }\n            if (config.client instanceof ClientCtor) {\n                page = await makePagedClientRequest(CommandCtor, config.client, input, config.withCommand, ...additionalArguments);\n            }\n            else {\n                throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`);\n            }\n            yield page;\n            const prevToken = token;\n            token = get(page, outputTokenName);\n            hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n        }\n        return undefined;\n    };\n}\nconst get = (fromObject, path) => {\n    let cursor = fromObject;\n    const pathComponents = path.split(\".\");\n    for (const step of pathComponents) {\n        if (!cursor || typeof cursor !== \"object\") {\n            return undefined;\n        }\n        cursor = cursor[step];\n    }\n    return cursor;\n};\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { AdminListGroupsForUserCommand, } from \"../commands/AdminListGroupsForUserCommand\";\nexport const paginateAdminListGroupsForUser = createPaginator(CognitoIdentityProviderClient, AdminListGroupsForUserCommand, \"NextToken\", \"NextToken\", \"Limit\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { AdminListUserAuthEventsCommand, } from \"../commands/AdminListUserAuthEventsCommand\";\nexport const paginateAdminListUserAuthEvents = createPaginator(CognitoIdentityProviderClient, AdminListUserAuthEventsCommand, \"NextToken\", \"NextToken\", \"MaxResults\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListGroupsCommand } from \"../commands/ListGroupsCommand\";\nexport const paginateListGroups = createPaginator(CognitoIdentityProviderClient, ListGroupsCommand, \"NextToken\", \"NextToken\", \"Limit\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListIdentityProvidersCommand, } from \"../commands/ListIdentityProvidersCommand\";\nexport const paginateListIdentityProviders = createPaginator(CognitoIdentityProviderClient, ListIdentityProvidersCommand, \"NextToken\", \"NextToken\", \"MaxResults\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListResourceServersCommand, } from \"../commands/ListResourceServersCommand\";\nexport const paginateListResourceServers = createPaginator(CognitoIdentityProviderClient, ListResourceServersCommand, \"NextToken\", \"NextToken\", \"MaxResults\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListUserPoolClientsCommand, } from \"../commands/ListUserPoolClientsCommand\";\nexport const paginateListUserPoolClients = createPaginator(CognitoIdentityProviderClient, ListUserPoolClientsCommand, \"NextToken\", \"NextToken\", \"MaxResults\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListUserPoolsCommand, } from \"../commands/ListUserPoolsCommand\";\nexport const paginateListUserPools = createPaginator(CognitoIdentityProviderClient, ListUserPoolsCommand, \"NextToken\", \"NextToken\", \"MaxResults\");\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListUsersInGroupCommand, } from \"../commands/ListUsersInGroupCommand\";\nexport const paginateListUsersInGroup = createPaginator(CognitoIdentityProviderClient, ListUsersInGroupCommand, \"NextToken\", \"NextToken\", \"Limit\");\n","import { createAggregatedClient } from \"@smithy/smithy-client\";\nimport { CognitoIdentityProviderClient } from \"./CognitoIdentityProviderClient\";\nimport { AddCustomAttributesCommand, } from \"./commands/AddCustomAttributesCommand\";\nimport { AdminAddUserToGroupCommand, } from \"./commands/AdminAddUserToGroupCommand\";\nimport { AdminConfirmSignUpCommand, } from \"./commands/AdminConfirmSignUpCommand\";\nimport { AdminCreateUserCommand, } from \"./commands/AdminCreateUserCommand\";\nimport { AdminDeleteUserAttributesCommand, } from \"./commands/AdminDeleteUserAttributesCommand\";\nimport { AdminDeleteUserCommand, } from \"./commands/AdminDeleteUserCommand\";\nimport { AdminDisableProviderForUserCommand, } from \"./commands/AdminDisableProviderForUserCommand\";\nimport { AdminDisableUserCommand, } from \"./commands/AdminDisableUserCommand\";\nimport { AdminEnableUserCommand, } from \"./commands/AdminEnableUserCommand\";\nimport { AdminForgetDeviceCommand, } from \"./commands/AdminForgetDeviceCommand\";\nimport { AdminGetDeviceCommand, } from \"./commands/AdminGetDeviceCommand\";\nimport { AdminGetUserCommand, } from \"./commands/AdminGetUserCommand\";\nimport { AdminInitiateAuthCommand, } from \"./commands/AdminInitiateAuthCommand\";\nimport { AdminLinkProviderForUserCommand, } from \"./commands/AdminLinkProviderForUserCommand\";\nimport { AdminListDevicesCommand, } from \"./commands/AdminListDevicesCommand\";\nimport { AdminListGroupsForUserCommand, } from \"./commands/AdminListGroupsForUserCommand\";\nimport { AdminListUserAuthEventsCommand, } from \"./commands/AdminListUserAuthEventsCommand\";\nimport { AdminRemoveUserFromGroupCommand, } from \"./commands/AdminRemoveUserFromGroupCommand\";\nimport { AdminResetUserPasswordCommand, } from \"./commands/AdminResetUserPasswordCommand\";\nimport { AdminRespondToAuthChallengeCommand, } from \"./commands/AdminRespondToAuthChallengeCommand\";\nimport { AdminSetUserMFAPreferenceCommand, } from \"./commands/AdminSetUserMFAPreferenceCommand\";\nimport { AdminSetUserPasswordCommand, } from \"./commands/AdminSetUserPasswordCommand\";\nimport { AdminSetUserSettingsCommand, } from \"./commands/AdminSetUserSettingsCommand\";\nimport { AdminUpdateAuthEventFeedbackCommand, } from \"./commands/AdminUpdateAuthEventFeedbackCommand\";\nimport { AdminUpdateDeviceStatusCommand, } from \"./commands/AdminUpdateDeviceStatusCommand\";\nimport { AdminUpdateUserAttributesCommand, } from \"./commands/AdminUpdateUserAttributesCommand\";\nimport { AdminUserGlobalSignOutCommand, } from \"./commands/AdminUserGlobalSignOutCommand\";\nimport { AssociateSoftwareTokenCommand, } from \"./commands/AssociateSoftwareTokenCommand\";\nimport { ChangePasswordCommand, } from \"./commands/ChangePasswordCommand\";\nimport { CompleteWebAuthnRegistrationCommand, } from \"./commands/CompleteWebAuthnRegistrationCommand\";\nimport { ConfirmDeviceCommand, } from \"./commands/ConfirmDeviceCommand\";\nimport { ConfirmForgotPasswordCommand, } from \"./commands/ConfirmForgotPasswordCommand\";\nimport { ConfirmSignUpCommand, } from \"./commands/ConfirmSignUpCommand\";\nimport { CreateGroupCommand } from \"./commands/CreateGroupCommand\";\nimport { CreateIdentityProviderCommand, } from \"./commands/CreateIdentityProviderCommand\";\nimport { CreateManagedLoginBrandingCommand, } from \"./commands/CreateManagedLoginBrandingCommand\";\nimport { CreateResourceServerCommand, } from \"./commands/CreateResourceServerCommand\";\nimport { CreateTermsCommand } from \"./commands/CreateTermsCommand\";\nimport { CreateUserImportJobCommand, } from \"./commands/CreateUserImportJobCommand\";\nimport { CreateUserPoolClientCommand, } from \"./commands/CreateUserPoolClientCommand\";\nimport { CreateUserPoolCommand, } from \"./commands/CreateUserPoolCommand\";\nimport { CreateUserPoolDomainCommand, } from \"./commands/CreateUserPoolDomainCommand\";\nimport { DeleteGroupCommand } from \"./commands/DeleteGroupCommand\";\nimport { DeleteIdentityProviderCommand, } from \"./commands/DeleteIdentityProviderCommand\";\nimport { DeleteManagedLoginBrandingCommand, } from \"./commands/DeleteManagedLoginBrandingCommand\";\nimport { DeleteResourceServerCommand, } from \"./commands/DeleteResourceServerCommand\";\nimport { DeleteTermsCommand } from \"./commands/DeleteTermsCommand\";\nimport { DeleteUserAttributesCommand, } from \"./commands/DeleteUserAttributesCommand\";\nimport { DeleteUserCommand } from \"./commands/DeleteUserCommand\";\nimport { DeleteUserPoolClientCommand, } from \"./commands/DeleteUserPoolClientCommand\";\nimport { DeleteUserPoolCommand, } from \"./commands/DeleteUserPoolCommand\";\nimport { DeleteUserPoolDomainCommand, } from \"./commands/DeleteUserPoolDomainCommand\";\nimport { DeleteWebAuthnCredentialCommand, } from \"./commands/DeleteWebAuthnCredentialCommand\";\nimport { DescribeIdentityProviderCommand, } from \"./commands/DescribeIdentityProviderCommand\";\nimport { DescribeManagedLoginBrandingByClientCommand, } from \"./commands/DescribeManagedLoginBrandingByClientCommand\";\nimport { DescribeManagedLoginBrandingCommand, } from \"./commands/DescribeManagedLoginBrandingCommand\";\nimport { DescribeResourceServerCommand, } from \"./commands/DescribeResourceServerCommand\";\nimport { DescribeRiskConfigurationCommand, } from \"./commands/DescribeRiskConfigurationCommand\";\nimport { DescribeTermsCommand, } from \"./commands/DescribeTermsCommand\";\nimport { DescribeUserImportJobCommand, } from \"./commands/DescribeUserImportJobCommand\";\nimport { DescribeUserPoolClientCommand, } from \"./commands/DescribeUserPoolClientCommand\";\nimport { DescribeUserPoolCommand, } from \"./commands/DescribeUserPoolCommand\";\nimport { DescribeUserPoolDomainCommand, } from \"./commands/DescribeUserPoolDomainCommand\";\nimport { ForgetDeviceCommand, } from \"./commands/ForgetDeviceCommand\";\nimport { ForgotPasswordCommand, } from \"./commands/ForgotPasswordCommand\";\nimport { GetCSVHeaderCommand, } from \"./commands/GetCSVHeaderCommand\";\nimport { GetDeviceCommand } from \"./commands/GetDeviceCommand\";\nimport { GetGroupCommand } from \"./commands/GetGroupCommand\";\nimport { GetIdentityProviderByIdentifierCommand, } from \"./commands/GetIdentityProviderByIdentifierCommand\";\nimport { GetLogDeliveryConfigurationCommand, } from \"./commands/GetLogDeliveryConfigurationCommand\";\nimport { GetSigningCertificateCommand, } from \"./commands/GetSigningCertificateCommand\";\nimport { GetTokensFromRefreshTokenCommand, } from \"./commands/GetTokensFromRefreshTokenCommand\";\nimport { GetUICustomizationCommand, } from \"./commands/GetUICustomizationCommand\";\nimport { GetUserAttributeVerificationCodeCommand, } from \"./commands/GetUserAttributeVerificationCodeCommand\";\nimport { GetUserAuthFactorsCommand, } from \"./commands/GetUserAuthFactorsCommand\";\nimport { GetUserCommand } from \"./commands/GetUserCommand\";\nimport { GetUserPoolMfaConfigCommand, } from \"./commands/GetUserPoolMfaConfigCommand\";\nimport { GlobalSignOutCommand, } from \"./commands/GlobalSignOutCommand\";\nimport { InitiateAuthCommand, } from \"./commands/InitiateAuthCommand\";\nimport { ListDevicesCommand } from \"./commands/ListDevicesCommand\";\nimport { ListGroupsCommand } from \"./commands/ListGroupsCommand\";\nimport { ListIdentityProvidersCommand, } from \"./commands/ListIdentityProvidersCommand\";\nimport { ListResourceServersCommand, } from \"./commands/ListResourceServersCommand\";\nimport { ListTagsForResourceCommand, } from \"./commands/ListTagsForResourceCommand\";\nimport { ListTermsCommand } from \"./commands/ListTermsCommand\";\nimport { ListUserImportJobsCommand, } from \"./commands/ListUserImportJobsCommand\";\nimport { ListUserPoolClientsCommand, } from \"./commands/ListUserPoolClientsCommand\";\nimport { ListUserPoolsCommand, } from \"./commands/ListUserPoolsCommand\";\nimport { ListUsersCommand } from \"./commands/ListUsersCommand\";\nimport { ListUsersInGroupCommand, } from \"./commands/ListUsersInGroupCommand\";\nimport { ListWebAuthnCredentialsCommand, } from \"./commands/ListWebAuthnCredentialsCommand\";\nimport { ResendConfirmationCodeCommand, } from \"./commands/ResendConfirmationCodeCommand\";\nimport { RespondToAuthChallengeCommand, } from \"./commands/RespondToAuthChallengeCommand\";\nimport { RevokeTokenCommand } from \"./commands/RevokeTokenCommand\";\nimport { SetLogDeliveryConfigurationCommand, } from \"./commands/SetLogDeliveryConfigurationCommand\";\nimport { SetRiskConfigurationCommand, } from \"./commands/SetRiskConfigurationCommand\";\nimport { SetUICustomizationCommand, } from \"./commands/SetUICustomizationCommand\";\nimport { SetUserMFAPreferenceCommand, } from \"./commands/SetUserMFAPreferenceCommand\";\nimport { SetUserPoolMfaConfigCommand, } from \"./commands/SetUserPoolMfaConfigCommand\";\nimport { SetUserSettingsCommand, } from \"./commands/SetUserSettingsCommand\";\nimport { SignUpCommand } from \"./commands/SignUpCommand\";\nimport { StartUserImportJobCommand, } from \"./commands/StartUserImportJobCommand\";\nimport { StartWebAuthnRegistrationCommand, } from \"./commands/StartWebAuthnRegistrationCommand\";\nimport { StopUserImportJobCommand, } from \"./commands/StopUserImportJobCommand\";\nimport { TagResourceCommand } from \"./commands/TagResourceCommand\";\nimport { UntagResourceCommand, } from \"./commands/UntagResourceCommand\";\nimport { UpdateAuthEventFeedbackCommand, } from \"./commands/UpdateAuthEventFeedbackCommand\";\nimport { UpdateDeviceStatusCommand, } from \"./commands/UpdateDeviceStatusCommand\";\nimport { UpdateGroupCommand } from \"./commands/UpdateGroupCommand\";\nimport { UpdateIdentityProviderCommand, } from \"./commands/UpdateIdentityProviderCommand\";\nimport { UpdateManagedLoginBrandingCommand, } from \"./commands/UpdateManagedLoginBrandingCommand\";\nimport { UpdateResourceServerCommand, } from \"./commands/UpdateResourceServerCommand\";\nimport { UpdateTermsCommand } from \"./commands/UpdateTermsCommand\";\nimport { UpdateUserAttributesCommand, } from \"./commands/UpdateUserAttributesCommand\";\nimport { UpdateUserPoolClientCommand, } from \"./commands/UpdateUserPoolClientCommand\";\nimport { UpdateUserPoolCommand, } from \"./commands/UpdateUserPoolCommand\";\nimport { UpdateUserPoolDomainCommand, } from \"./commands/UpdateUserPoolDomainCommand\";\nimport { VerifySoftwareTokenCommand, } from \"./commands/VerifySoftwareTokenCommand\";\nimport { VerifyUserAttributeCommand, } from \"./commands/VerifyUserAttributeCommand\";\nimport { paginateAdminListGroupsForUser } from \"./pagination/AdminListGroupsForUserPaginator\";\nimport { paginateAdminListUserAuthEvents } from \"./pagination/AdminListUserAuthEventsPaginator\";\nimport { paginateListGroups } from \"./pagination/ListGroupsPaginator\";\nimport { paginateListIdentityProviders } from \"./pagination/ListIdentityProvidersPaginator\";\nimport { paginateListResourceServers } from \"./pagination/ListResourceServersPaginator\";\nimport { paginateListUserPoolClients } from \"./pagination/ListUserPoolClientsPaginator\";\nimport { paginateListUserPools } from \"./pagination/ListUserPoolsPaginator\";\nimport { paginateListUsersInGroup } from \"./pagination/ListUsersInGroupPaginator\";\nimport { paginateListUsers } from \"./pagination/ListUsersPaginator\";\nconst commands = {\n    AddCustomAttributesCommand,\n    AdminAddUserToGroupCommand,\n    AdminConfirmSignUpCommand,\n    AdminCreateUserCommand,\n    AdminDeleteUserCommand,\n    AdminDeleteUserAttributesCommand,\n    AdminDisableProviderForUserCommand,\n    AdminDisableUserCommand,\n    AdminEnableUserCommand,\n    AdminForgetDeviceCommand,\n    AdminGetDeviceCommand,\n    AdminGetUserCommand,\n    AdminInitiateAuthCommand,\n    AdminLinkProviderForUserCommand,\n    AdminListDevicesCommand,\n    AdminListGroupsForUserCommand,\n    AdminListUserAuthEventsCommand,\n    AdminRemoveUserFromGroupCommand,\n    AdminResetUserPasswordCommand,\n    AdminRespondToAuthChallengeCommand,\n    AdminSetUserMFAPreferenceCommand,\n    AdminSetUserPasswordCommand,\n    AdminSetUserSettingsCommand,\n    AdminUpdateAuthEventFeedbackCommand,\n    AdminUpdateDeviceStatusCommand,\n    AdminUpdateUserAttributesCommand,\n    AdminUserGlobalSignOutCommand,\n    AssociateSoftwareTokenCommand,\n    ChangePasswordCommand,\n    CompleteWebAuthnRegistrationCommand,\n    ConfirmDeviceCommand,\n    ConfirmForgotPasswordCommand,\n    ConfirmSignUpCommand,\n    CreateGroupCommand,\n    CreateIdentityProviderCommand,\n    CreateManagedLoginBrandingCommand,\n    CreateResourceServerCommand,\n    CreateTermsCommand,\n    CreateUserImportJobCommand,\n    CreateUserPoolCommand,\n    CreateUserPoolClientCommand,\n    CreateUserPoolDomainCommand,\n    DeleteGroupCommand,\n    DeleteIdentityProviderCommand,\n    DeleteManagedLoginBrandingCommand,\n    DeleteResourceServerCommand,\n    DeleteTermsCommand,\n    DeleteUserCommand,\n    DeleteUserAttributesCommand,\n    DeleteUserPoolCommand,\n    DeleteUserPoolClientCommand,\n    DeleteUserPoolDomainCommand,\n    DeleteWebAuthnCredentialCommand,\n    DescribeIdentityProviderCommand,\n    DescribeManagedLoginBrandingCommand,\n    DescribeManagedLoginBrandingByClientCommand,\n    DescribeResourceServerCommand,\n    DescribeRiskConfigurationCommand,\n    DescribeTermsCommand,\n    DescribeUserImportJobCommand,\n    DescribeUserPoolCommand,\n    DescribeUserPoolClientCommand,\n    DescribeUserPoolDomainCommand,\n    ForgetDeviceCommand,\n    ForgotPasswordCommand,\n    GetCSVHeaderCommand,\n    GetDeviceCommand,\n    GetGroupCommand,\n    GetIdentityProviderByIdentifierCommand,\n    GetLogDeliveryConfigurationCommand,\n    GetSigningCertificateCommand,\n    GetTokensFromRefreshTokenCommand,\n    GetUICustomizationCommand,\n    GetUserCommand,\n    GetUserAttributeVerificationCodeCommand,\n    GetUserAuthFactorsCommand,\n    GetUserPoolMfaConfigCommand,\n    GlobalSignOutCommand,\n    InitiateAuthCommand,\n    ListDevicesCommand,\n    ListGroupsCommand,\n    ListIdentityProvidersCommand,\n    ListResourceServersCommand,\n    ListTagsForResourceCommand,\n    ListTermsCommand,\n    ListUserImportJobsCommand,\n    ListUserPoolClientsCommand,\n    ListUserPoolsCommand,\n    ListUsersCommand,\n    ListUsersInGroupCommand,\n    ListWebAuthnCredentialsCommand,\n    ResendConfirmationCodeCommand,\n    RespondToAuthChallengeCommand,\n    RevokeTokenCommand,\n    SetLogDeliveryConfigurationCommand,\n    SetRiskConfigurationCommand,\n    SetUICustomizationCommand,\n    SetUserMFAPreferenceCommand,\n    SetUserPoolMfaConfigCommand,\n    SetUserSettingsCommand,\n    SignUpCommand,\n    StartUserImportJobCommand,\n    StartWebAuthnRegistrationCommand,\n    StopUserImportJobCommand,\n    TagResourceCommand,\n    UntagResourceCommand,\n    UpdateAuthEventFeedbackCommand,\n    UpdateDeviceStatusCommand,\n    UpdateGroupCommand,\n    UpdateIdentityProviderCommand,\n    UpdateManagedLoginBrandingCommand,\n    UpdateResourceServerCommand,\n    UpdateTermsCommand,\n    UpdateUserAttributesCommand,\n    UpdateUserPoolCommand,\n    UpdateUserPoolClientCommand,\n    UpdateUserPoolDomainCommand,\n    VerifySoftwareTokenCommand,\n    VerifyUserAttributeCommand,\n};\nconst paginators = {\n    paginateAdminListGroupsForUser,\n    paginateAdminListUserAuthEvents,\n    paginateListGroups,\n    paginateListIdentityProviders,\n    paginateListResourceServers,\n    paginateListUserPoolClients,\n    paginateListUserPools,\n    paginateListUsers,\n    paginateListUsersInGroup,\n};\nexport class CognitoIdentityProvider extends CognitoIdentityProviderClient {\n}\ncreateAggregatedClient(commands, CognitoIdentityProvider, { paginators });\n","import { createPaginator } from \"@smithy/core\";\nimport { CognitoIdentityProviderClient } from \"../CognitoIdentityProviderClient\";\nimport { ListUsersCommand } from \"../commands/ListUsersCommand\";\nexport const paginateListUsers = createPaginator(CognitoIdentityProviderClient, ListUsersCommand, \"PaginationToken\", \"PaginationToken\", \"Limit\");\n","export const createAggregatedClient = (commands, Client, options) => {\n    for (const [command, CommandCtor] of Object.entries(commands)) {\n        const methodImpl = async function (args, optionsOrCb, cb) {\n            const command = new CommandCtor(args);\n            if (typeof optionsOrCb === \"function\") {\n                this.send(command, optionsOrCb);\n            }\n            else if (typeof cb === \"function\") {\n                if (typeof optionsOrCb !== \"object\")\n                    throw new Error(`Expected http options but got ${typeof optionsOrCb}`);\n                this.send(command, optionsOrCb || {}, cb);\n            }\n            else {\n                return this.send(command, optionsOrCb);\n            }\n        };\n        const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, \"\");\n        Client.prototype[methodName] = methodImpl;\n    }\n    const { paginators = {}, waiters = {} } = options ?? {};\n    for (const [paginatorName, paginatorFn] of Object.entries(paginators)) {\n        if (Client.prototype[paginatorName] === void 0) {\n            Client.prototype[paginatorName] = function (commandInput = {}, paginationConfiguration, ...rest) {\n                return paginatorFn({\n                    ...paginationConfiguration,\n                    client: this,\n                }, commandInput, ...rest);\n            };\n        }\n    }\n    for (const [waiterName, waiterFn] of Object.entries(waiters)) {\n        if (Client.prototype[waiterName] === void 0) {\n            Client.prototype[waiterName] = async function (commandInput = {}, waiterConfiguration, ...rest) {\n                let config = waiterConfiguration;\n                if (typeof waiterConfiguration === \"number\") {\n                    config = {\n                        maxWaitTime: waiterConfiguration,\n                    };\n                }\n                return waiterFn({\n                    ...config,\n                    client: this,\n                }, commandInput, ...rest);\n            };\n        }\n    }\n};\n","/* eslint-disable no-const-assign */\n/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport LdI18Next from '../components/ld-application/i18n/ld-i18next';\nimport LdError from './LdErrorHandler';\nimport { baseConfig as CONFIG } from '../auto-generated/config';\nimport { CognitoIdentityProvider } from '@aws-sdk/client-cognito-identity-provider';\nimport moment from 'moment';\nimport { ToastNotificationHandler } from './services/Notifications';\n\n\nclass HTTPError extends Error {\n  notificationHandler = new ToastNotificationHandler();\n\n  constructor(text, response, cbOnError) {\n    super(response.statusText);\n    this.name = 'HTTPError';\n    this.response = response;\n    LdError.handleFetchError(response.status);\n    cbOnError(response);\n  }\n\n}\n\nclass NetworkError extends Error {\n  constructor(error, cbOnError) {\n    super(error.name);\n    this.name = 'NetworkError';\n    LdError.handleFetchError(\"no_connection\");\n    cbOnError(error);\n  }\n}\n\nclass LdFetchComponent extends EventTarget {\n\n  // ------------------------------------------------------\n  /**\n   *\n   * @param checkTokenExpiration A function that returns a jwt-token\n   */\n  constructor(checkTokenExpiration) {\n    super();\n    this.METHOD_GET = 'GET';\n    this.METHOD_POST = 'POST';\n    this.METHOD_PUT = 'PUT';\n    this.METHOD_PATCH = 'PATCH';\n    this.METHOD_DELETE = 'DELETE';\n    this.tokenProvider = checkTokenExpiration;\n  }\n\n  setTokenProvider(tokenProvider) {\n    this.tokenProvider = tokenProvider;\n  }\n\n  getTokenProvider() {\n    return this.tokenProvider;\n  }\n\n  // ------------------------------------------------------\n  async _fetch(url, cbOnSuccess, cbOnError, options, acceptHeader = null, authorization = true, createHeader) {\n\n    const headers = new Headers();\n    let token;\n\n    if (!options.noJSON) {\n      if (options.method === this.METHOD_PUT || options.method === this.METHOD_POST) {\n        headers.set('Content-Type', 'application/json; charset=UTF-8');\n      } else {\n        headers.set('Content-Type', 'application/json');\n      }\n    }\n\n    headers.set('x-user-language', LdI18Next.language);\n    try {\n      token = await this.tokenProvider().then(function(result) {\n        return result;\n      });\n    } catch (err) {\n      console.error(err);\n      cbOnError(err);\n    }\n\n    if (acceptHeader != null) {\n      headers.set('X-Response-Content-Disposition', acceptHeader);\n    }\n\n    if (options && options.headers) {\n      Object.keys(options.headers).forEach(header => {\n        headers.set(header, options.headers[header]);\n\n      });\n    }\n\n\n    if (createHeader) {\n      headers.set('Content-Type','text/csv;  charset=UTF-8');\n    }\n    if (authorization) {\n      headers.set('Authorization', token);\n    }\n\n    let _options = {\n      credentials: 'include',\n      cache: 'no-store',\n      mode: 'cors',\n      redirect: 'follow',\n      referrer: 'no-referrer',\n      headers,\n      ...options,\n    };\n\n    fetch(url, _options).then(async (response) => {\n      if (!response.ok) {\n        if (response.status === 401 || response.status === 403) {\n          this.dispatch40xEvents(response, url);\n          return;\n        } else {\n          // server error\n          new HTTPError('Fetch error:', response, cbOnError);\n          return;\n        }\n      }\n\n\n      let result = null;\n\n      // 401 is also returned when an expired token is sent\n      if (response.status === 401) {\n        this.dispatch40xEvents(response, url);\n      } else if (response.status !== 201 && !response.url.includes('image/') && response.headers.get('Location') == null && response.status !== 204) {\n        result = responseHasBody(response) ? await response.json() : null;\n      } else if (response.url.includes('shopfloor/image/')) {\n        const buffer = await response.arrayBuffer();\n        const base64Flag = 'data:image/jpeg;base64,';\n        const imageStr = this.arrayBufferToBase64(buffer);\n        result = base64Flag + imageStr;\n      } else if (response.status === 201) {\n        if (response.url === '' || response.url.includes('/companies') || response.url.includes('/machines')) {\n          result = responseHasBody(response) ? await response.json() : null;\n        } else{\n          result = await response.headers.get('Location') != null ? response.headers.get('Location') : true;\n        }\n      } else if (response.status === 204) {\n        result = { response, requestOptions: _options };\n      } else if (response.headers.get('Location') != null) {\n          result = response.headers.get('Location');\n      }\n      return cbOnSuccess(result);\n    })\n      .catch((error) => {\n        // request and network errors\n        switch (error.name) {\n          case 'AbortError':\n            // manual abort\n            break;\n          case 'TypeError':\n            // network and cors errors\n            new NetworkError(error, cbOnError);\n            break;\n          default:\n            // unknown error;\n            throw error;\n        }\n      });\n  }\n\n  dispatch40xEvents(response, url) {\n    this.dispatchEvent(new CustomEvent(response.status.toString(), {\n      detail: {\n        statusCode: response.status,\n        url\n      }\n    }));\n  }\n\n  // ------------------------------------------------------\n  get(url, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_GET,\n      ...options,\n    });\n  }\n\n\n// ------------------------------------------------------\n  getWithoutAuthorization(url, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_GET,\n      ...options,\n    }, null, false);\n  }\n\n  // ------------------------------------------------------\n  post(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_POST,\n      body: JSON.stringify(body),\n      ...options,\n    });\n  }\n\n  // ------------------------------------------------------\n  put(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_PUT,\n      body: JSON.stringify(body),\n      ...options,\n    });\n  }\n\n  // ------------------------------------------------------\n  putFile(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_PUT,\n      body: body,\n      ...options,\n    },null,true, true );\n  }\n\n  // ------------------------------------------------------\n  putShopfloor(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_PUT,\n      body: JSON.stringify(body),\n      ...options,\n    }, null, false);\n  }\n\n  // ------------------------------------------------------\n  postFileForm(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_POST,\n      body,\n      noJSON: true,\n      ...options,\n    }, null, false);\n  }\n\n  // ------------------------------------------------------\n  downloadFile(acceptHeader, url, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_GET,\n      noJSON: true,\n      ...options,\n    }, acceptHeader);\n  }\n\n  // ------------------------------------------------------\n  patch(url, body, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_PATCH,\n      body: JSON.stringify(body),\n      ...options,\n    });\n  }\n\n  // ------------------------------------------------------\n  delete(url, cbOnSuccess, cbOnError, options) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_DELETE,\n      ...options,\n    });\n  }\n\n  // ------------------------------------------------------\n  getCoordinates(url, cbOnSuccess, cbOnError) {\n    this._fetch(url, cbOnSuccess, cbOnError, {\n      method: this.METHOD_GET,\n      credentials: 'same-origin',\n    });\n  }\n\n  // ------------------------------------------------------\n  arrayBufferToBase64(buffer) {\n    let binary = '';\n    const bytes = [].slice.call(new Uint8Array(buffer));\n\n    bytes.forEach(b => {\n      binary += String.fromCharCode(b);\n    });\n\n    return window.btoa(binary);\n  }\n\n  isJsonString(str) {\n    try {\n      JSON.parse(str);\n    } catch (e) {\n      return false;\n    }\n    return true;\n  }\n}\n\nexport const createCheckTokenExpiration = () => {\n\n  return async () => {\n    const tokenKey = 'TokenExp';\n    const refreshTokenKey = 'RefreshToken';\n    const tokenExp = localStorage.getItem(tokenKey);\n    const refreshToken = localStorage.getItem(refreshTokenKey);\n    const authType = 'Bearer';\n    const existingTokenRaw = localStorage.getItem(CONFIG.localstorage.token_key);\n    if (!existingTokenRaw) {\n      throw new MissingTokenError('Token missing');\n    }\n    const existingToken = JSON.parse(existingTokenRaw);\n    const client = new CognitoIdentityProvider({ region: CONFIG.aws.cognito.userPool.userPoolId });\n    const secondsToIncludeAuthorizerCheck = 15;\n    if (tokenExp <= moment().format('X') + secondsToIncludeAuthorizerCheck) {\n      let token = await client.initiateAuth({\n        AuthFlow: 'REFRESH_TOKEN_AUTH',\n        ClientId: CONFIG.aws.cognito.userPool.clientId,\n        AuthParameters: {\n          REFRESH_TOKEN: refreshToken,\n        },\n      });\n\n      existingToken.idToken.jwtToken = token.AuthenticationResult?.IdToken;\n      existingToken.accessToken.jwtToken = token.AuthenticationResult?.AccessToken;\n      token = JSON.parse(atob(token.AuthenticationResult?.IdToken.split('.')[1]));\n      existingToken.idToken.payload = token;\n\n      localStorage.setItem(CONFIG.localstorage.token_key, JSON.stringify(existingToken));\n      localStorage.setItem(tokenKey, token.exp);\n    }\n\n\n    if (!existingToken.idToken || !existingToken.idToken.jwtToken) {\n      throw new MalformedTokenError('Token malformed');\n    }\n\n    return `${authType} ${existingToken.idToken.jwtToken}`;\n  };\n};\n\nclass MissingTokenError extends Error {\n}\n\nclass MalformedTokenError extends Error {\n}\n\nexport default new LdFetchComponent(createCheckTokenExpiration());\nexport {\n  LdFetchComponent,\n};\n\n/*\nBlocks all URLs from performing a request, unless they are in `urlWhitelist`.\nUsed for disabling requests to the backend during migration.\n */\nconst responseHasBody = (response) => {\n  if (response.url.includes('amazonaws') && response.headers.get('Content-Length') === '0') {\n    try {\n      JSON.parse(response);\n    } catch (e) {\n      return false;\n    }\n    return true;\n  }\n  return true;\n};\n\n\n","/* eslint-disable import/no-cycle */\n/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { baseConfig } from '../auto-generated/config';\nimport { store } from '../components/ld-redux/ld-redux-store';\nimport { updateLocation } from '../components/ld-redux/actions/ld-application-actions';\nimport LdI18Next, { LdTranslate } from '../components/ld-application/i18n/ld-i18next';\nimport { clearToken } from '../js/tokenHandling';\nimport moment from 'moment';\nimport { html } from 'lit-element';\nimport { displayNotification, showToast } from '../js/LdNotificationHandler';\nimport {\n  defaultLocationValue\n} from \"../components/ld-platform/modules/assets/company/form/custom-form-elements/location-selection-element\";\nimport {LdMessages} from \"../components/ld-application/ld-messages/ld-error-messages\";\n\nexport const CONFIG = baseConfig;\n\nexport const rolesThatCanManageUsers = [\n  'OEM_USER_MANAGER',\n];\n\nexport const rolesThatCanManageDocs = [\n  'OEM_DOCS',\n];\n\nexport const rolesThatCanManageTechnician = [\n  'OEM_TECHNICIAN',\n];\n\nexport const rolesThatHaveSwStatus = [\n  'DEVELOPER',\n  'SUPERUSER',\n];\n\nexport const rolesThatCanManageOEM = [\n  'OEM',\n  'OEM_QA',\n  'OEM_DOCS',\n  'OEM_TECHNICIAN',\n  'OEM_USER_MANAGER',\n];\n\nexport const rolesThatCanManageOEM_QA = [\n  'OEM_QA',\n];\n\nexport const rolesThatCanManageUSER = [\n  'USER',\n];\n\nexport const rolesThatCanManageVISITOR = [\n  'VISITOR',\n];\n/**\n * @param  {Object} userInfo - The info about the user.\n *\n * @return {Boolean} Returns true if user is an SW employee\n */\nexport const isUserSwEmployee = userInfo => {\n  if (!userInfo) return false;\n  return rolesThatHaveSwStatus.includes(userInfo.role);\n};\n\nexport const isUserUserManager = userInfo => {\n  if (isUserSwEmployee(userInfo)) return true;\n  return rolesThatCanManageUsers.includes(userInfo.role);\n};\n\nexport const isDocsManager = userInfo => {\n  if (isUserSwEmployee(userInfo)) return true;\n  return rolesThatCanManageDocs.includes(userInfo.role);\n};\n\nexport const isUserUserTechnician = userInfo => {\n  if (isUserSwEmployee(userInfo)) return true;\n  return rolesThatCanManageTechnician.includes(userInfo.role);\n};\n\nexport const isUserUserOEM = userInfo => {\n  if (isUserSwEmployee(userInfo)) return true;\n  return rolesThatCanManageOEM.includes(userInfo.role);\n};\n\nexport const isUserUserOEM_QA = userInfo => {\n  if (isUserSwEmployee(userInfo)) return true;\n  return rolesThatCanManageOEM_QA.includes(userInfo.role);\n};\n\nexport const isUserUSER = userInfo => {\n  return rolesThatCanManageUSER.includes(userInfo.role);\n};\nexport const isUserVISITOR = userInfo => {\n  return rolesThatCanManageVISITOR.includes(userInfo.role);\n};\nexport const checkUserHasAMatchingRole = (isAllowed, callback = () => forward('/dashboard')) => {\n  if (typeof isAllowed !== 'boolean' || !isAllowed) return callback();\n  return true;\n};\n\nexport const machineIsLicensed = (date) => {\n  return (date != null && moment(date).format('X') !== 'Invalid date' && moment(date).format('X') > moment().format('X'));\n\n};\n\n// --------------------------------------------------------------------------------------\nexport const linkForward = (uri, callback = (value) => forward(value)) => {\n  let buildLink = '';\n  switch (uri.split('/')[1]) {\n    case 'companies':\n      buildLink = `/assets/locations/list/${uri.split('/')[2]}`;\n      break;\n    case 'locations':\n      buildLink = `/assets/halls/list/${uri.split('/')[2]}`;\n      break;\n    case 'halls':\n      buildLink = `/assets/lines/list/${uri.split('/')[2]}`;\n      break;\n    case 'lines':\n      buildLink = `/assets/machines/list/${uri.split('/')[2]}`;\n      break;\n    case 'machines':\n      buildLink = `/assets/machine/list/${uri.split('/')[2]}`;\n      break;\n    default:\n      buildLink = uri;\n      break;\n  }\n  return callback(buildLink);\n};\n\n/**\n * handles manual URL manipulation (instead of &lt;a href&gt; or location.href)\n *\n * @param {String} target - The targeted URI\n */\nexport const forward = (target, options = {}) => {\n  const { replaceLastStateWithCurrent = false } = options;\n  window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n  if (replaceLastStateWithCurrent) {\n    window.history.replaceState({ path: target }, '', target);\n  } else {\n    window.history.pushState({}, '', target);\n  }\n  store.dispatch(updateLocation(window.location));\n};\n\n/**\n * Handles manual URL manipulation (instead of &lt;a href&gt; or location.href),\n * but instead of `forward` does not trigger a loading spinner.\n *\n * @param {String} target - The targeted URI\n */\nexport const goToUrl = {\n  assign(target) {\n    window.location.assign(target);\n  },\n};\n\n/**\n * handles manual URL manipulation (instead of &lt;a href&gt; or location.href)\n *\n * @param {String} target - The targeted URI\n */\nexport const back = () => {\n  window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n\n  setTimeout(() => {\n    window.history.back();\n  }, 200);\n};\n\nexport const replaceAnchor = appendix => {\n  window.location.hash = `#${appendix}`;\n};\n\nexport const createGridOutput = (_path, rowData) => {\n  let _output;\n  const _split = _path.split('.');\n\n  _output = rowData.item[_split[0]];\n  for (let i = 1; i < _split.length; i++) {\n    _output = _output[_split[i]];\n  }\n  return _output;\n};\n/**\n *\n * @return {Boolean}\n */\nexport const loading = (...args) => Array.from(args).indexOf(true) >= 0;\n\nexport const isValidDateRangeHash = hash => {\n  return hash.length === 27 && hash.search('-') !== -1;\n};\n\nexport const createChartId = () => Math.random().toString(36).substr(2, 9);\n\nexport const createRandomId = () => createChartId();\nexport const redirectLogin = (message, callback = (value) => goToUrl.assign(value)) => {\n  const url = new URL(window.location.href);\n  if (!url.pathname.includes('login')) {\n    const _message = (message) ? `&message=${message}` : '';\n    callback(`${baseConfig.frontend.applications.login.base_url}?redirect=${encodeURIComponent(window.location.href)}${_message}`);\n  }\n};\n\nexport const logoutUser = (message = null, callback = (value) => goToUrl.assign(value)) => {\n  const _message = (message) ? `?wc-ce&wc-shadydom&wc-shimcssproperties&message=${message}&logout` : '?wc-ce&wc-shadydom&wc-shimcssproperties&logout';\n  clearToken();\n  callback(`${baseConfig.frontend.applications.login.base_url}${_message}`);\n\n};\n\nexport const decimalNumberFormat = number => new Intl.NumberFormat(LdI18Next.language, {\n  style: 'decimal',\n  maximumFractionDigits: 2,\n}).format(number);\n\nexport const rewriteTimeseriesVariableToId = variableName => {\n  if (baseConfig.backend.services.timeseries.variable_ids && baseConfig.backend.services.timeseries.variable_ids[variableName] != null) {\n    return baseConfig.backend.services.timeseries.variable_ids[variableName];\n  }\n  return null;\n};\n\nexport const isBrowserSafari = () => {\n  const browser = navigator.userAgent.toLowerCase();\n  let isSafari;\n  if (browser.indexOf('chrome') > -1) {\n    isSafari = false;\n  } else if (browser.indexOf('safari') > -1) {\n    isSafari = true;\n  } else {\n    isSafari = false;\n  }\n  return isSafari;\n};\n\n\nexport const sendRequest = (state) => {\n\n  let group = state.LdUsersReducer.info;\n  if (group == null) {\n    group = { role: 'VISITOR' };\n  }\n  let value;\n  value = group.role !== 'VISITOR';\n  return value;\n};\n\nexport const newSendRequestCheckup = (role) => {\n  let value;\n  value = role !== 'VISITOR';\n  return value;\n};\n\nexport const csvToJson = (csv, stripHeaderRow = true) => {\n  const lines = csv.split('\\n');\n  const result = [];\n\n  if (stripHeaderRow) {\n    lines.shift();\n  }\n\n  for (let i = 0; i < lines.length; i++) {\n    const _currentLine = lines[i].split(',');\n    const _line = [];\n\n    for (let j = 0; j < _currentLine.length; j++) {\n      const _column = _currentLine[j].replace('\\\\\"', '');\n\n      if (validator.isNumeric(_column)) {\n        _line.push(Number(_column));\n      } else {\n        _line.push(_column);\n      }\n    }\n\n    result.push(_line);\n\n\n  }\n\n  return JSON.stringify(result);\n\n};\n\n// --------------------------------------------------------------------------------------\n/**\n *\n * @param {Array} values An array of objects from the backend\n * @returns A new array with a new property called id, constructed from the URI\n */\nexport const remapList = (values) => {\n  if (!values) return;\n\n  return values.map((item) => ({ ...item, id: item.uri.split('/')[2] }));\n};\n\nexport const mapCountryCodeToName = (values, lang) => {\n  if (!values) return;\n  const country = new Intl.DisplayNames([lang], { type: 'region' });\n  for (const code of values) {\n    if (code.address.country.length <= 2) {\n      let name = country.of(code.address.country);\n      code.address.country = name;\n    }\n  }\n  return values;\n};\n// --------------------------------------------------------------------------------------\nexport const getUUID = (machineFromSearchApi) => {\n  if (!machineFromSearchApi) return;\n  return machineFromSearchApi.uri.split('/')[2];\n};\n\n// --------------------------------------------------------------------------------------\n/**\n * Splits a URI with the format /sth/UUID and returns only the UUID\n * @param {string} uri\n * @returns The UUID\n */\nexport const extractUuidFromURI = (uri) => {\n  return uri.split('/')[2];\n};\n\n// --------------------------------------------------------------------------------------\nconst formatter = new Intl.DateTimeFormat(undefined, {\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit',\n  hour: '2-digit',\n  minute: '2-digit',\n  second: '2-digit',\n});\n\nexport const formatDate = (date) => {\n  return formatter.format(date);\n};\n\n/**\n * Checks if the values in an array have a property called name\n * @param value\n * @returns\n */\nexport const valuesHaveNameProperty = function (value) {\n  if (!Array.isArray(value)) return false;\n  return value.every((singleValue) => (singleValue).name);\n};\n\n/**\n * Attempts to sort an array of objects by the property `name`.\n * Supposed to be used in `Array.prototype.sort`\n * @param {*} anObject\n * @param {*} anotherObject\n * @returns\n */\nexport const sortByName = (anObject, anotherObject) => {\n\n  let fa = anObject.name.toLowerCase(),\n    fb = anotherObject.name.toLowerCase();\n\n  if (fa < fb) {\n    return -1;\n  }\n  if (fa > fb) {\n    return 1;\n  }\n  return 0;\n};\n\nexport const isValidDate = (dates, dateKey) => {\n  if (!dates) return false;\n  if (!dates[dateKey]) return false;\n  if (dates[dateKey] === 'Invalid date') return false;\n  if (dates[dateKey] === '') return false;\n  if (dates[dateKey] === 0) return false;\n\n  return moment(dates[dateKey]).isValid();\n};\n\nexport const lerp = (x, y, a) => x * (1 - a) + y * a;\nexport const invlerp = (a, b, c) => (c - a) / (b - a);\n\n\nexport const renderEmptyState = (message) => {\n  return html`\n    <div class='scrolling'>\n      <div class='empty-state-container'>\n            <span class='message' data-testid='empty-state-message'>\n             ${message}\n            </span>\n      </div>\n    </div>\n  `;\n\n};\n\n\n// --------------------------------------------------------------------------------------\nexport const isAllowedBrowser = () => {\n  const _browser = browser();\n\n  if (baseConfig.allowedBrowsers.indexOf(_browser.name) === -1) {\n    showToast('not_supported_browser');\n    return false;\n  }\n\n  return true;\n};\n\n// --------------------------------------------------------------------------------------\nexport const storeLoginCredentials = async (credentials) => {\n  try {\n    Promise.resolve(window.localStorage.setItem(baseConfig.localstorage.token_key, JSON.stringify(credentials)),\n      localStorage.setItem('TokenExp', credentials.idToken.payload.exp),\n      localStorage.setItem('RefreshToken', credentials.refreshToken.token));\n  } catch (error) {\n    console.error('Error writing to localStorage:', error);\n  }\n};\n\nexport const redirectTo = (url) => goToUrl.assign(url);\n\n\n/**\n * Helper to request the URL params from a parent element listening for the event.\n * @param target\n * @returns\n */\n// --------------------------------------------------------------------------------------\nexport const requestUrlParams = (target) => {\n  const event = new CustomEvent('event', {\n    bubbles: true,\n    composed: true,\n    detail: {\n      eventType: 'request-url-params',\n      value: new Map(),\n    },\n  });\n  target.dispatchEvent(event);\n\n  return event.detail.value;\n};\n\n/**\n * Checks if the provided email is valid\n * @param emailAddressCandidate\n */\nexport const isValidEmailAddress = (emailAddressCandidate) => {\n  const emailCheckRegex = /^[-!#$%&'*+\\/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/;\n  return emailCheckRegex.test(emailAddressCandidate);\n};\n\n\n/**\n * @param  {} state\n * @param  {} type='color'\n * get the state of the selected machine\n * @param machine\n * @param userInformation\n */\n// --------------------------------------------------------------------------------------\nexport const getSendingState = (state, type = 'color', date, userInformation) => {\n  let value;\n  if (type === 'color') {\n    value = getSendingStateColor(state, date, userInformation);\n  }\n  if (type === 'label') {\n    value = getSendingStateLabel(state, date, userInformation);\n  }\n  return value;\n};\n\nexport const getSendingStateColor = (state, date, userInformation) => {\n  let value = 'gray';\n  if (machineIsLicensed(date) || isUserUserOEM(userInformation)) {\n    switch (state) {\n      case 3:\n        value = 'red';\n        break;\n      case 2:\n        value = 'yellow';\n        break;\n      case 1:\n        value = 'green';\n        break;\n      default:\n        value = 'gray';\n        break;\n    }\n  }\n  return value;\n};\n\nexport const getSendingStateLabel = (state, date, userInformation) => {\n  let value = LdTranslate('modules.generic.notLicensed');\n  if (machineIsLicensed(date) || isUserUserOEM(userInformation)) {\n\n    switch (state) {\n      case 3:\n        value = LdTranslate(`modules.assets.machine.elements.sendingState.aborted`);\n        break;\n      case 2:\n        value = LdTranslate(`modules.assets.machine.elements.sendingState.interrupted`);\n        break;\n      case 1:\n        value = LdTranslate(`modules.assets.machine.elements.sendingState.sending`);\n        break;\n      default:\n        value = LdTranslate(`modules.generic.notConnected`);\n        break;\n    }\n  }\n  return value;\n};\n/*\n* @param  {} state\n* @param  {} type='color'\n* get the state of the selected machine\n*/\n\n// --------------------------------------------------------------------------------------\nexport const getMachineOnlinestate = (state, type = 'color') => {\n  let value;\n  if (type === 'color') {\n    value = (state === 1) ? 'green' : 'red';\n  } else if (type === 'label') {\n    const _translationKey = (state === 1) ? 'labelOnline' : 'labelOffline';\n    value = LdTranslate(`modules.assets.machine.elements.onlineState.${_translationKey}`);\n  } else if (type === 'colorGrey') {\n    value = 'gray';\n  }\n  return value;\n};\n\nexport const getUTCTime = (selectedTimeFilter, date) => {\n\n  if (selectedTimeFilter === 'controller_time') {\n    const dateInComputerTimezone = new Date(Number(date.from));\n    const utcOffsetInHours = dateInComputerTimezone.getTimezoneOffset() / 60;\n    date = {\n      from: Number(date.from) - (utcOffsetInHours * 3600000),\n      to: Number(date.to) - (utcOffsetInHours * 3600000),\n    };\n  }\n  return date;\n};\n\n\nexport const getCountries = (locale) => {\n  // validCodes from https://www.bafa.de/SharedDocs/Downloads/DE/Aussenwirtschaft/sds_laenderliste.html\n  const validCodes = ['AF', 'EG', 'AL', 'DZ', 'AD', 'AO', 'AG', 'GQ', 'AR', 'AM', 'AZ', 'ET', 'AU', 'BS', 'BH', 'BD', 'BB', 'BE', 'BZ', 'BJ', 'BT', 'BO', 'BA', 'BW', 'BR', 'BN', 'BG', 'BF', 'BI', 'CL', 'CN', 'CK', 'CR', 'CI', 'DK', 'DE', 'DM', 'DO', 'DJ', 'EC', 'SV', 'ER', 'EE', 'FJ', 'FI', 'FR', 'GA', 'GM', 'GE', 'GH', 'GD', 'GR', 'GT', 'GN', 'GW', 'GY', 'HT', 'HN', 'IN', 'ID', 'IQ', 'IR', 'IE', 'IS', 'IL', 'IT', 'JM', 'JP', 'YE', 'JO', 'KH', 'CM', 'CA', 'CV', 'KZ', 'QA', 'KE', 'KG', 'KI', 'CO', 'KM', 'CG', 'CD', 'KP', 'KR', 'HR', 'CU', 'KW', 'LA', 'LS', 'LV', 'LB', 'LR', 'LY', 'LI', 'LT', 'LU', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MA', 'MH', 'MR', 'MU', 'MK', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NZ', 'NI', 'NL', 'NE', 'NG', 'NU', 'NO', 'OM', 'AT', 'PK', 'PW', 'PA', 'PG', 'PY', 'PE', 'PH', 'PL', 'PT', 'RW', 'RO', 'RU', 'SB', 'ZM', 'WS', 'SM', 'ST', 'SA', 'SE', 'CH', 'SN', 'RS', 'SC', 'SL', 'ZW', 'SG', 'SK', 'SI', 'SO', 'ES', 'LK', 'KN', 'LC', 'VC', 'ZA', 'SD', 'SR', 'SZ', 'SY', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TO', 'TT', 'TD', 'CZ', 'TN', 'TR', 'TM', 'TV', 'UG', 'UA', 'HU', 'UY', 'UZ', 'VU', 'VA', 'VE', 'AE', 'US', 'GB', 'VN', 'BY', 'CF', 'CY'];\n  const lang = locale || \"en\";\n  const newValue = [];\n\n  const countryName = new Intl.DisplayNames([lang], { type: 'region' });\n\n  for (const code of validCodes) {\n    let name = countryName.of(code);\n    if (code !== name) {\n      newValue.push({\n        id: code,\n        name: name\n      });\n    }\n  }\n\n  return newValue;\n}\n\nexport const handleAssetDeleteError = (object, status) => {\n  let config = LdMessages[`assets_${status}`] ?? LdMessages[status]\n  displayNotification('error', config?.message ?? '');\n  object.closeDeleteModal();\n}\n\nexport const getLocationSelectionElementData = (state, coordinates, editForm) => {\n  let value;\n  let coordinatesSet = false;\n  let userSetCoordinates = false;\n  let shown = false;\n  let locationData;\n\n  const apiLocationFromState = state.LdAssetsReducer?.coordinates;\n  const coordinatesFromBackend = coordinates;\n  if (editForm) {\n    shown = true;\n    value = {\n      location: {\n        coordinates: {\n          latitude: coordinatesFromBackend?.latitude,\n          longitude: coordinatesFromBackend?.longitude,\n        },\n        displayName: '-',\n      },\n      default: coordinatesFromBackend?.default,\n    };\n    coordinatesSet = true;\n    userSetCoordinates = true;\n  } else {\n    value = defaultLocationValue;\n  }\n\n  if (apiLocationFromState) {\n    locationData = {\n      type: 'osm',\n      location: apiLocationFromState,\n    };\n  }\n\n  return {\n    shown,\n    value,\n    coordinatesSet,\n    userSetCoordinates,\n    locationData,\n  };\n}\n\n/**\n * @param jsonData\n * @param fileName\n */\n// --------------------------------------------------------------------------------------\nexport const writeJsonToFile = (jsonData, fileName = 'netcfg.json') => {\n  const fileContent = jsonData;\n  const blob = new Blob([fileContent], { type: 'application/json' });\n  return new File([blob], fileName, { type: 'application/json' });\n}\n\nexport const toCamelCaseWithUnderscores = (str) => {\n  return str\n    .split('_')\n    .map((word, index) => {\n      if (index === 0) {\n        return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n      } else {\n        return `_${word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()}`;\n      }\n    })\n    .join('');\n}\n","/**\n * Runtime backend service URL overrides for dev environments.\n */\n\nimport { baseConfig } from '../auto-generated/config';\n\nconst STORAGE_KEY = 'swcp-dev-backend-service-url-overrides';\nexport const BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT = 'swcp-dev-backend-service-url-overrides-changed';\n\nconst isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value);\n\nconst getServiceUrlFieldNames = (serviceConfig) => {\n  if (!isObject(serviceConfig)) return [];\n  return Object.keys(serviceConfig).filter((key) => key.startsWith('base_url') && typeof serviceConfig[key] === 'string');\n};\n\nconst createDefaultSnapshot = () => {\n  const snapshot = {};\n  const services = baseConfig?.backend?.services || {};\n\n  Object.keys(services).forEach((serviceName) => {\n    const serviceConfig = services[serviceName];\n    const urlFields = getServiceUrlFieldNames(serviceConfig);\n    if (urlFields.length === 0) return;\n\n    snapshot[serviceName] = {};\n    urlFields.forEach((fieldName) => {\n      snapshot[serviceName][fieldName] = serviceConfig[fieldName];\n    });\n  });\n\n  return snapshot;\n};\n\nconst defaultServiceUrlSnapshot = createDefaultSnapshot();\n\nexport const isDevServiceUrlOverridesEnabled = () => {\n  return baseConfig?.localstorage?.storage_key === '__SWCP_DEV__';\n};\n\nconst readStoredOverrides = () => {\n  if (!isDevServiceUrlOverridesEnabled()) return {};\n\n  try {\n    const rawValue = window.localStorage.getItem(STORAGE_KEY);\n    if (!rawValue) return {};\n    const parsedValue = JSON.parse(rawValue);\n    return isObject(parsedValue) ? parsedValue : {};\n  } catch (_error) {\n    return {};\n  }\n};\n\nconst sanitizeOverrides = (overrides) => {\n  if (!isObject(overrides)) return {};\n\n  const sanitized = {};\n\n  Object.keys(defaultServiceUrlSnapshot).forEach((serviceName) => {\n    const overrideService = overrides[serviceName];\n    if (!isObject(overrideService)) return;\n\n    Object.keys(defaultServiceUrlSnapshot[serviceName]).forEach((fieldName) => {\n      const value = overrideService[fieldName];\n      if (typeof value !== 'string') return;\n\n      const trimmedValue = value.trim();\n      if (!trimmedValue) return;\n\n      if (!sanitized[serviceName]) {\n        sanitized[serviceName] = {};\n      }\n      sanitized[serviceName][fieldName] = trimmedValue;\n    });\n  });\n\n  return sanitized;\n};\n\nconst hasChangedValuesComparedToConfig = (overrides) => {\n  if (!isObject(overrides)) return false;\n\n  return Object.keys(overrides).some((serviceName) => {\n    const overrideService = overrides[serviceName];\n    if (!isObject(overrideService) || !isObject(defaultServiceUrlSnapshot[serviceName])) return false;\n\n    return Object.keys(overrideService).some((fieldName) => {\n      if (typeof overrideService[fieldName] !== 'string') return false;\n      if (typeof defaultServiceUrlSnapshot[serviceName][fieldName] !== 'string') return false;\n      return overrideService[fieldName] !== defaultServiceUrlSnapshot[serviceName][fieldName];\n    });\n  });\n};\n\nconst applyOverridesToRuntimeConfig = (overrides) => {\n  const services = baseConfig?.backend?.services || {};\n\n  Object.keys(defaultServiceUrlSnapshot).forEach((serviceName) => {\n    if (!isObject(services[serviceName])) return;\n\n    Object.keys(defaultServiceUrlSnapshot[serviceName]).forEach((fieldName) => {\n      services[serviceName][fieldName] = defaultServiceUrlSnapshot[serviceName][fieldName];\n    });\n\n    if (!isObject(overrides[serviceName])) return;\n\n    Object.keys(overrides[serviceName]).forEach((fieldName) => {\n      services[serviceName][fieldName] = overrides[serviceName][fieldName];\n    });\n  });\n};\n\nexport const applyBackendServiceUrlOverridesForDev = () => {\n  if (!isDevServiceUrlOverridesEnabled()) return;\n  applyOverridesToRuntimeConfig(readStoredOverrides());\n};\n\nexport const getConfiguredBackendServiceUrls = () => {\n  return JSON.parse(JSON.stringify(defaultServiceUrlSnapshot));\n};\n\nexport const getEffectiveBackendServiceUrls = () => {\n  const configured = getConfiguredBackendServiceUrls();\n  const stored = readStoredOverrides();\n\n  Object.keys(stored).forEach((serviceName) => {\n    if (!configured[serviceName]) return;\n    configured[serviceName] = {\n      ...configured[serviceName],\n      ...stored[serviceName],\n    };\n  });\n\n  return configured;\n};\n\nexport const hasActiveBackendServiceUrlOverrides = () => {\n  if (!isDevServiceUrlOverridesEnabled()) return false;\n  return hasChangedValuesComparedToConfig(readStoredOverrides());\n};\n\nconst dispatchOverridesChangedEvent = () => {\n  if (typeof window === 'undefined') return;\n\n  window.dispatchEvent(new CustomEvent(BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT, {\n    detail: {\n      hasActiveOverrides: hasActiveBackendServiceUrlOverrides(),\n    },\n  }));\n};\n\nexport const saveBackendServiceUrlOverrides = (overrides) => {\n  if (!isDevServiceUrlOverridesEnabled()) return;\n\n  const sanitized = sanitizeOverrides(overrides);\n  window.localStorage.setItem(STORAGE_KEY, JSON.stringify(sanitized));\n  applyOverridesToRuntimeConfig(sanitized);\n  dispatchOverridesChangedEvent();\n};\n\nexport const clearBackendServiceUrlOverrides = () => {\n  if (!isDevServiceUrlOverridesEnabled()) return;\n\n  window.localStorage.removeItem(STORAGE_KEY);\n  applyOverridesToRuntimeConfig({});\n  dispatchOverridesChangedEvent();\n};\n\napplyBackendServiceUrlOverridesForDev();\n\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nexport const themeColors = {\n  primary_color: '#E81C3D',\n  primary_creme: '#ECECE9',\n  primary_gray_one: '#f2f2f2',\n  primary_gray_two: '#828282',\n  primary_gray_three: '#323232',\n  primary_background_color: '#FFFFFF',\n  primary_text_color: '#FFFFFF',\n  primary_highlight_color: '#E4002B',\n  primary_header_background_color: '#FFFFFF',\n  primary_header_color: '#000000',\n  primary_loading_background_color: '#808080',\n  primary_loading_spinner_color: '#FFFFFF',\n  secondary_color: '#263448',\n  secondary_background_color: '#737272',\n  secondary_text_color: '#000000',\n  secondary_note_color: '#949494',\n  secondary_highlight_color: 'rgba(231, 47, 54, 0.2);',\n  default_background_color: '#000F26',\n  default_borders_color: '#CECECE',\n  default_accent_color: '#666666',\n  button_background_color: '#FAFAFA',\n  button_secondBackground_color: '#206FB5',\n  button_thirdBackground_color: '#E4002B',\n  button_fourthBackground_color: '#001524',\n  button_fifthBackground_color: '#8ab230',\n  button_sixthBackground_color: '#8AB230',\n  button_seventhBackground_color: '#821E29',\n  main_text_color: '#000000',\n  fab_background: '#E4002B',\n  fab_secondary_background: 'grey',\n  icon_button_color: '#727272',\n  paper_item_pressed: '#D5D5D5',\n  paper_item_active_border_color: '#E72F36',\n  app_header_color: 'rgba(51, 51, 51, 1)',\n  app_header_background_color: 'rgba(255, 255, 255, 1)',\n  app_drawer_background_color: 'rgba(36, 58, 79, 1)',\n  app_drawer_scrim_background_color: 'rgba(36, 58, 79, 1)',\n  app_drawer_sidebar_background_color: '#677583',\n  datepicker_border_color: '#D3D3D3',\n  datepicker_color: '#808080',\n  search_field_background_color: '#F1F1F1',\n  search_field_text_color: '#607D8B',\n  search_field_item_background_color: '#E4E4E4',\n  grid_background_color: '#F1F1F1',\n  grid_border_color: '#E6E6E6',\n  icons_color: '#98A3AD',\n  icons_hover_background_color: '#F2F2F2',\n  icons_active_color: '#333333',\n  selected_burger_menu: '#e6e6e6',\n  selected_menu_item: '#335CAD',\n  breadcrumb_main_color: '#98a3ad',\n  secondary_green_100: '#DAD6BF',\n  secondary_green_200: '#BBB487',\n  secondary_green_300: '#3f8000',\n  secondary_green_400: '#7E761A',\n  secondary_green_500: '#676223',\n  secondary_green_600: '#4D4B1A',\n  dark_blue_001: '#031035',\n  dark_blue_002: '#243a4f',\n  dark_blue_003: '#677583',\n  dark_blue_004: '#98a3ad',\n  trafficlight_green: '#8ab230',\n  trafficlight_red: '#E4002B',\n  trafficlight_gray: '#737071',\n  trafficlight_yellow: '#ffe400',\n  availability_chart_colors: {\n    auto: '#8ab230',\n    auto_waiting_for_parts: '#CFB968',\n    auto_waiting_for_parts_stopping_error: '#E4002B',\n    auto_with_error_program_stopped: '#821E29',\n    auto_no_program_active: '#ffe400',\n    jog_with_error: '#9B504C',\n    jog_without_error: '#ea8a00',\n    mda_with_error: '#B7867D',\n    mda_without_error: '#b7720e',\n    not_defined_condition: '#737071'\n  },\n  undefined: '#737071',\n  tool_change_time: '#D88736',\n  machining_time: '#7C933D',\n  auxiliary_process_time: '#EEBA3D',\n  release_banner: '#EEBA3D',\n  limit_colors: {\n    critical: '#E4002B',\n    prewarning: '#ffe400',\n  },\n  axistest: {\n    limit_area_first_series: '#5757ED22',\n    limit_area_second_series: '#34893422',\n    first_series: '#5757ED',\n    second_series: '#348934',\n    circularity_custom_y_axis: '#E6E6E6',\n    warning_limit: '#FFA500',\n    critical_limit: '#FF0000',\n    kpi_table_border: '#E6E6E6',\n    kpi_table_background_accent: '#F3F3F3',\n  }\n};\n\nexport default themeColors;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nexport const themeFonts = {\n  main_font: 'Calibri, Roboto, Helvetica, sans-serif;',\n  main_font_size: '13px',\n};\n\nexport default themeFonts;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\n/* Import the active theme */\nimport { themeColors, themeFonts } from './lifedata';\n\nexport const _THEME = {\n  colors: themeColors,\n  fonts: themeFonts\n};\n\nexport default _THEME;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n","module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n","module.exports = {};\n","module.exports = false;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: require('./_library') ? 'pure' : 'global',\n  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Fx from './Fx.js';\nimport U from '../Utilities.js';\nconst { defined, getStyle, isArray, isNumber, isObject, merge, objectEach, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Set the global animation to either a given value, or fall back to the given\n * chart's animation option.\n *\n * @function Highcharts.setAnimation\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>|undefined} animation\n *        The animation object.\n *\n * @param {Highcharts.Chart} chart\n *        The chart instance.\n *\n * @todo\n * This function always relates to a chart, and sets a property on the renderer,\n * so it should be moved to the SVGRenderer.\n */\nfunction setAnimation(animation, chart) {\n    chart.renderer.globalAnimation = pick(animation, chart.options.chart.animation, true);\n}\n/**\n * Get the animation in object form, where a disabled animation is always\n * returned as `{ duration: 0 }`.\n *\n * @function Highcharts.animObject\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} [animation=0]\n *        An animation setting. Can be an object with duration, complete and\n *        easing properties, or a boolean to enable or disable.\n *\n * @return {Highcharts.AnimationOptionsObject}\n *         An object with at least a duration property.\n */\nfunction animObject(animation) {\n    return isObject(animation) ?\n        merge({ duration: 500, defer: 0 }, animation) :\n        { duration: animation ? 500 : 0, defer: 0 };\n}\n/**\n * Get the defer as a number value from series animation options.\n *\n * @function Highcharts.getDeferredAnimation\n *\n * @param {Highcharts.Chart} chart\n *        The chart instance.\n *\n * @param {boolean|Highcharts.AnimationOptionsObject} animation\n *        An animation setting. Can be an object with duration, complete and\n *        easing properties, or a boolean to enable or disable.\n *\n * @param {Highcharts.Series} [series]\n *        Series to defer animation.\n *\n * @return {number}\n *        The numeric value.\n */\nfunction getDeferredAnimation(chart, animation, series) {\n    const labelAnimation = animObject(animation), s = series ? [series] : chart.series;\n    let defer = 0, duration = 0;\n    s.forEach((series) => {\n        const seriesAnim = animObject(series.options.animation);\n        defer = isObject(animation) && defined(animation.defer) ?\n            labelAnimation.defer :\n            Math.max(defer, seriesAnim.duration + seriesAnim.defer);\n        duration = Math.min(labelAnimation.duration, seriesAnim.duration);\n    });\n    // Disable defer for exporting\n    if (chart.renderer.forExport) {\n        defer = 0;\n    }\n    const anim = {\n        defer: Math.max(0, defer - duration),\n        duration: Math.min(defer, duration)\n    };\n    return anim;\n}\n/**\n * The global animate method, which uses Fx to create individual animators.\n *\n * @function Highcharts.animate\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} el\n *        The element to animate.\n *\n * @param {Highcharts.CSSObject|Highcharts.SVGAttributes} params\n *        An object containing key-value pairs of the properties to animate.\n *        Supports numeric as pixel-based CSS properties for HTML objects and\n *        attributes for SVGElements.\n *\n * @param {Partial<Highcharts.AnimationOptionsObject>} [opt]\n *        Animation options.\n *\n * @return {void}\n */\nfunction animate(el, params, opt) {\n    let start, unit = '', end, fx, args;\n    if (!isObject(opt)) { // Number or undefined/null\n        args = arguments;\n        opt = {\n            duration: args[2],\n            easing: args[3],\n            complete: args[4]\n        };\n    }\n    if (!isNumber(opt.duration)) {\n        opt.duration = 400;\n    }\n    opt.easing = typeof opt.easing === 'function' ?\n        opt.easing :\n        (Math[opt.easing] || Math.easeInOutSine);\n    opt.curAnim = merge(params);\n    objectEach(params, function (val, prop) {\n        // Stop current running animation of this property\n        stop(el, prop);\n        fx = new Fx(el, opt, prop);\n        end = void 0;\n        if (prop === 'd' && isArray(params.d)) {\n            fx.paths = fx.initPath(el, el.pathArray, params.d);\n            fx.toD = params.d;\n            start = 0;\n            end = 1;\n        }\n        else if (el.attr) {\n            start = el.attr(prop);\n        }\n        else {\n            start = parseFloat(getStyle(el, prop)) || 0;\n            if (prop !== 'opacity') {\n                unit = 'px';\n            }\n        }\n        if (!end) {\n            end = val;\n        }\n        if (typeof end === 'string' && end.match('px')) {\n            end = end.replace(/px/g, ''); // #4351\n        }\n        fx.run(start, end, unit);\n    });\n}\n/**\n * Stop running animation.\n *\n * @function Highcharts.stop\n *\n * @param {Highcharts.SVGElement} el\n *        The SVGElement to stop animation on.\n *\n * @param {string} [prop]\n *        The property to stop animating. If given, the stop method will stop a\n *        single property from animating, while others continue.\n *\n * @return {void}\n *\n * @todo\n * A possible extension to this would be to stop a single property, when\n * we want to continue animating others. Then assign the prop to the timer\n * in the Fx.run method, and check for the prop here. This would be an\n * improvement in all cases where we stop the animation from .attr. Instead of\n * stopping everything, we can just stop the actual attributes we're setting.\n */\nfunction stop(el, prop) {\n    let i = Fx.timers.length;\n    // Remove timers related to this element (#4519)\n    while (i--) {\n        if (Fx.timers[i].elem === el && (!prop || prop === Fx.timers[i].prop)) {\n            Fx.timers[i].stopped = true; // #4667\n        }\n    }\n}\nconst animationExports = {\n    animate,\n    animObject,\n    getDeferredAnimation,\n    setAnimation,\n    stop\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default animationExports;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Color from '../Color/Color.js';\nconst { parse: color } = Color;\nimport H from '../Globals.js';\nconst { win } = H;\nimport U from '../Utilities.js';\nconst { isNumber, objectEach } = U;\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n *  Class\n *\n * */\n/**\n * An animator object used internally. One instance applies to one property\n * (attribute or style prop) on one element. Animation is always initiated\n * through {@link SVGElement#animate}.\n *\n * @example\n * let rect = renderer.rect(0, 0, 10, 10).add();\n * rect.animate({ width: 100 });\n *\n * @private\n * @class\n * @name Highcharts.Fx\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} elem\n * The element to animate.\n *\n * @param {Partial<Highcharts.AnimationOptionsObject>} options\n * Animation options.\n *\n * @param {string} prop\n * The single attribute or CSS property to animate.\n */\nclass Fx {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(elem, options, prop) {\n        this.pos = NaN;\n        this.options = options;\n        this.elem = elem;\n        this.prop = prop;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Set the current step of a path definition on SVGElement.\n     *\n     * @function Highcharts.Fx#dSetter\n     *\n     */\n    dSetter() {\n        const paths = this.paths, start = paths && paths[0], end = paths && paths[1], now = this.now || 0;\n        let path = [];\n        // Land on the final path without adjustment points appended in the ends\n        if (now === 1 || !start || !end) {\n            path = this.toD || [];\n        }\n        else if (start.length === end.length && now < 1) {\n            for (let i = 0; i < end.length; i++) {\n                // Tween between the start segment and the end segment. Start\n                // with a copy of the end segment and tween the appropriate\n                // numerics\n                const startSeg = start[i];\n                const endSeg = end[i];\n                const tweenSeg = [];\n                for (let j = 0; j < endSeg.length; j++) {\n                    const startItem = startSeg[j];\n                    const endItem = endSeg[j];\n                    // Tween numbers\n                    if (isNumber(startItem) &&\n                        isNumber(endItem) &&\n                        // Arc boolean flags\n                        !(endSeg[0] === 'A' && (j === 4 || j === 5))) {\n                        tweenSeg[j] = startItem + now * (endItem - startItem);\n                        // Strings, take directly from the end segment\n                    }\n                    else {\n                        tweenSeg[j] = endItem;\n                    }\n                }\n                path.push(tweenSeg);\n            }\n            // If animation is finished or length not matching, land on right value\n        }\n        else {\n            path = end;\n        }\n        this.elem.attr('d', path, void 0, true);\n    }\n    /**\n     * Update the element with the current animation step.\n     *\n     * @function Highcharts.Fx#update\n     *\n     */\n    update() {\n        const elem = this.elem, prop = this.prop, // If destroyed, it is null\n        now = this.now, step = this.options.step;\n        // Animation setter defined from outside\n        if (this[prop + 'Setter']) {\n            this[prop + 'Setter']();\n            // Other animations on SVGElement\n        }\n        else if (elem.attr) {\n            if (elem.element) {\n                elem.attr(prop, now, null, true);\n            }\n            // HTML styles, raw HTML content like container size\n        }\n        else {\n            elem.style[prop] = now + this.unit;\n        }\n        if (step) {\n            step.call(elem, now, this);\n        }\n    }\n    /**\n     * Run an animation.\n     *\n     * @function Highcharts.Fx#run\n     *\n     * @param {number} from\n     *        The current value, value to start from.\n     *\n     * @param {number} to\n     *        The end value, value to land on.\n     *\n     * @param {string} unit\n     *        The property unit, for example `px`.\n     *\n     */\n    run(from, to, unit) {\n        const self = this, options = self.options, timer = function (gotoEnd) {\n            return timer.stopped ? false : self.step(gotoEnd);\n        }, requestAnimationFrame = win.requestAnimationFrame ||\n            function (step) {\n                setTimeout(step, 13);\n            }, step = function () {\n            for (let i = 0; i < Fx.timers.length; i++) {\n                if (!Fx.timers[i]()) {\n                    Fx.timers.splice(i--, 1);\n                }\n            }\n            if (Fx.timers.length) {\n                requestAnimationFrame(step);\n            }\n        };\n        if (from === to && !this.elem['forceAnimate:' + this.prop]) {\n            delete options.curAnim[this.prop];\n            if (options.complete &&\n                Object.keys(options.curAnim).length === 0) {\n                options.complete.call(this.elem);\n            }\n        }\n        else { // #7166\n            this.startTime = +new Date();\n            this.start = from;\n            this.end = to;\n            this.unit = unit;\n            this.now = this.start;\n            this.pos = 0;\n            timer.elem = this.elem;\n            timer.prop = this.prop;\n            if (timer() && Fx.timers.push(timer) === 1) {\n                requestAnimationFrame(step);\n            }\n        }\n    }\n    /**\n     * Run a single step in the animation.\n     *\n     * @function Highcharts.Fx#step\n     *\n     * @param {boolean} [gotoEnd]\n     *        Whether to go to the endpoint of the animation after abort.\n     *\n     * @return {boolean}\n     *         Returns `true` if animation continues.\n     */\n    step(gotoEnd) {\n        const t = +new Date(), options = this.options, elem = this.elem, complete = options.complete, duration = options.duration, curAnim = options.curAnim;\n        let ret, done;\n        if (!!elem.attr && !elem.element) { // #2616, element is destroyed\n            ret = false;\n        }\n        else if (gotoEnd || t >= duration + this.startTime) {\n            this.now = this.end;\n            this.pos = 1;\n            this.update();\n            curAnim[this.prop] = true;\n            done = true;\n            objectEach(curAnim, function (val) {\n                if (val !== true) {\n                    done = false;\n                }\n            });\n            if (done && complete) {\n                complete.call(elem);\n            }\n            ret = false;\n        }\n        else {\n            this.pos = options.easing((t - this.startTime) / duration);\n            this.now = this.start + ((this.end -\n                this.start) * this.pos);\n            this.update();\n            ret = true;\n        }\n        return ret;\n    }\n    /**\n     * Prepare start and end values so that the path can be animated one to one.\n     *\n     * @function Highcharts.Fx#initPath\n     *\n     * @param {Highcharts.SVGElement} elem\n     *        The SVGElement item.\n     *\n     * @param {Highcharts.SVGPathArray|undefined} fromD\n     *        Starting path definition.\n     *\n     * @param {Highcharts.SVGPathArray} toD\n     *        Ending path definition.\n     *\n     * @return {Array<Highcharts.SVGPathArray,Highcharts.SVGPathArray>}\n     *         An array containing start and end paths in array form so that\n     *         they can be animated in parallel.\n     */\n    initPath(elem, fromD, toD) {\n        const startX = elem.startX, endX = elem.endX, end = toD.slice(), // Copy\n        isArea = elem.isArea, positionFactor = isArea ? 2 : 1, disableAnimation = fromD &&\n            toD.length > fromD.length &&\n            toD.hasStackedCliffs; // #16925\n        let shift, fullLength, i, reverse, start = fromD && fromD.slice(); // Copy\n        if (!start || disableAnimation) {\n            return [end, end];\n        }\n        /**\n         * If shifting points, prepend a dummy point to the end path.\n         * @private\n         */\n        function prepend(arr, other) {\n            while (arr.length < fullLength) {\n                // Move to, line to or curve to?\n                const moveSegment = arr[0], otherSegment = other[fullLength - arr.length];\n                if (otherSegment && moveSegment[0] === 'M') {\n                    if (otherSegment[0] === 'C') {\n                        arr[0] = [\n                            'C',\n                            moveSegment[1],\n                            moveSegment[2],\n                            moveSegment[1],\n                            moveSegment[2],\n                            moveSegment[1],\n                            moveSegment[2]\n                        ];\n                    }\n                    else {\n                        arr[0] = ['L', moveSegment[1], moveSegment[2]];\n                    }\n                }\n                // Prepend a copy of the first point\n                arr.unshift(moveSegment);\n                // For areas, the bottom path goes back again to the left, so we\n                // need to append a copy of the last point.\n                if (isArea) {\n                    const z = arr.pop();\n                    arr.push(arr[arr.length - 1], z); // Append point and the Z\n                }\n            }\n        }\n        /**\n         * Copy and append last point until the length matches the end length.\n         * @private\n         */\n        function append(arr) {\n            while (arr.length < fullLength) {\n                // Pull out the slice that is going to be appended or inserted.\n                // In a line graph, the positionFactor is 1, and the last point\n                // is sliced out. In an area graph, the positionFactor is 2,\n                // causing the middle two points to be sliced out, since an area\n                // path starts at left, follows the upper path then turns and\n                // follows the bottom back.\n                const segmentToAdd = arr[Math.floor(arr.length / positionFactor) - 1].slice();\n                // Disable the first control point of curve segments\n                if (segmentToAdd[0] === 'C') {\n                    segmentToAdd[1] = segmentToAdd[5];\n                    segmentToAdd[2] = segmentToAdd[6];\n                }\n                if (!isArea) {\n                    arr.push(segmentToAdd);\n                }\n                else {\n                    const lowerSegmentToAdd = arr[Math.floor(arr.length / positionFactor)].slice();\n                    arr.splice(arr.length / 2, 0, segmentToAdd, lowerSegmentToAdd);\n                }\n            }\n        }\n        // For sideways animation, find out how much we need to shift to get the\n        // start path Xs to match the end path Xs.\n        if (startX && endX && endX.length) {\n            for (i = 0; i < startX.length; i++) {\n                // Moving left, new points coming in on right\n                if (startX[i] === endX[0]) {\n                    shift = i;\n                    break;\n                    // Moving right\n                }\n                else if (startX[0] ===\n                    endX[endX.length - startX.length + i]) {\n                    shift = i;\n                    reverse = true;\n                    break;\n                    // Fixed from the right side, \"scaling\" left\n                }\n                else if (startX[startX.length - 1] ===\n                    endX[endX.length - startX.length + i]) {\n                    shift = startX.length - i;\n                    break;\n                }\n            }\n            if (typeof shift === 'undefined') {\n                start = [];\n            }\n        }\n        if (start.length && isNumber(shift)) {\n            // The common target length for the start and end array, where both\n            // arrays are padded in opposite ends\n            fullLength = end.length + shift * positionFactor;\n            if (!reverse) {\n                prepend(end, start);\n                append(start);\n            }\n            else {\n                prepend(start, end);\n                append(end);\n            }\n        }\n        return [start, end];\n    }\n    /**\n     * Handle animation of the color attributes directly.\n     *\n     * @function Highcharts.Fx#fillSetter\n     *\n     */\n    fillSetter() {\n        Fx.prototype.strokeSetter.apply(this, arguments);\n    }\n    /**\n     * Handle animation of the color attributes directly.\n     *\n     * @function Highcharts.Fx#strokeSetter\n     *\n     */\n    strokeSetter() {\n        this.elem.attr(this.prop, color(this.start).tweenTo(color(this.end), this.pos), void 0, true);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nFx.timers = [];\n/* *\n *\n *  Default Export\n *\n * */\nexport default Fx;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Namespace\n *\n * */\nvar AxisDefaults;\n(function (AxisDefaults) {\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    /**\n     * The X axis or category axis. Normally this is the horizontal axis,\n     * though if the chart is inverted this is the vertical axis. In case of\n     * multiple axes, the xAxis node is an array of configuration objects.\n     *\n     * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n     * access to the axis.\n     *\n     * @productdesc {highmaps}\n     * In Highmaps, the axis is hidden, but it is used behind the scenes to\n     * control features like zooming and panning. Zooming is in effect the same\n     * as setting the extremes of one of the exes.\n     *\n     * @type         {*|Array<*>}\n     * @optionparent xAxis\n     */\n    AxisDefaults.xAxis = {\n        /**\n         * When using multiple axis, the ticks of two or more opposite axes\n         * will automatically be aligned by adding ticks to the axis or axes\n         * with the least ticks, as if `tickAmount` were specified.\n         *\n         * This can be prevented by setting `alignTicks` to false. If the grid\n         * lines look messy, it's a good idea to hide them for the secondary\n         * axis by setting `gridLineWidth` to 0.\n         *\n         * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n         * then the `alignTicks ` will be disabled for the Axis.\n         *\n         * Disabled for logarithmic axes.\n         *\n         * @product   highcharts highstock gantt\n         */\n        alignTicks: true,\n        /**\n         * Whether to allow decimals in this axis' ticks. When counting\n         * integers, like persons or hits on a web page, decimals should\n         * be avoided in the labels. By default, decimals are allowed on small\n         * scale axes.\n         *\n         * @see [minTickInterval](#xAxis.minTickInterval)\n         *\n         * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-true/\n         *         True by default\n         * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-false/\n         *         False\n         *\n         * @type      {boolean|undefined}\n         * @default   undefined\n         * @since     2.0\n         */\n        allowDecimals: void 0,\n        /**\n         * When using an alternate grid color, a band is painted across the\n         * plot area between every other grid line.\n         *\n         * @sample {highcharts} highcharts/yaxis/alternategridcolor/\n         *         Alternate grid color on the Y axis\n         * @sample {highstock} stock/xaxis/alternategridcolor/\n         *         Alternate grid color on the Y axis\n         *\n         * @type      {Highcharts.ColorType}\n         * @apioption xAxis.alternateGridColor\n         */\n        /**\n         * An array defining breaks in the axis, the sections defined will be\n         * left out and all the points shifted closer to each other.\n         *\n         * @productdesc {highcharts}\n         * Requires that the broken-axis.js module is loaded.\n         *\n         * @sample {highcharts} highcharts/axisbreak/break-simple/\n         *         Simple break\n         * @sample {highcharts|highstock} highcharts/axisbreak/break-visualized/\n         *         Advanced with callback\n         * @sample {highstock} stock/demo/intraday-breaks/\n         *         Break on nights and weekends\n         *\n         * @type      {Array<*>}\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.breaks\n         */\n        /**\n         * A number indicating how much space should be left between the start\n         * and the end of the break. The break size is given in axis units,\n         * so for instance on a `datetime` axis, a break size of 3600000 would\n         * indicate the equivalent of an hour.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.breaks.breakSize\n         */\n        /**\n         * The point where the break starts.\n         *\n         * @type      {number}\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.breaks.from\n         */\n        /**\n         * Defines an interval after which the break appears again. By default\n         * the breaks do not repeat.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.breaks.repeat\n         */\n        /**\n         * The point where the break ends.\n         *\n         * @type      {number}\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.breaks.to\n         */\n        /**\n         * If categories are present for the xAxis, names are used instead of\n         * numbers for that axis.\n         *\n         * Since Highcharts 3.0, categories can also\n         * be extracted by giving each point a [name](#series.data) and setting\n         * axis [type](#xAxis.type) to `category`. However, if you have multiple\n         * series, best practice remains defining the `categories` array.\n         *\n         * Example: `categories: ['Apples', 'Bananas', 'Oranges']`\n         *\n         * @sample {highcharts} highcharts/demo/line-labels/\n         *         With\n         * @sample {highcharts} highcharts/xaxis/categories/\n         *         Without\n         *\n         * @type      {Array<string>}\n         * @product   highcharts gantt\n         * @apioption xAxis.categories\n         */\n        /**\n         * The highest allowed value for automatically computed axis extremes.\n         *\n         * @see [floor](#xAxis.floor)\n         *\n         * @sample {highcharts|highstock} highcharts/yaxis/floor-ceiling/\n         *         Floor and ceiling\n         *\n         * @type       {number}\n         * @since      4.0\n         * @product    highcharts highstock gantt\n         * @apioption  xAxis.ceiling\n         */\n        /**\n         * A class name that opens for styling the axis by CSS, especially in\n         * Highcharts styled mode. The class name is applied to group elements\n         * for the grid, axis elements and labels.\n         *\n         * @sample {highcharts|highstock|highmaps} highcharts/css/axis/\n         *         Multiple axes with separate styling\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @apioption xAxis.className\n         */\n        /**\n         * Configure a crosshair that follows either the mouse pointer or the\n         * hovered point.\n         *\n         * In styled mode, the crosshairs are styled in the\n         * `.highcharts-crosshair`, `.highcharts-crosshair-thin` or\n         * `.highcharts-xaxis-category` classes.\n         *\n         * @productdesc {highstock}\n         * In Highcharts stock, by default, the crosshair is enabled on the\n         * X axis and disabled on the Y axis.\n         *\n         * @sample {highcharts} highcharts/xaxis/crosshair-both/\n         *         Crosshair on both axes\n         * @sample {highstock} stock/xaxis/crosshairs-xy/\n         *         Crosshair on both axes, with y axis label\n         * @sample {highmaps} highcharts/xaxis/crosshair-both/\n         *         Crosshair on both axes\n         *\n         * @declare   Highcharts.AxisCrosshairOptions\n         * @type      {boolean|*}\n         * @default   false\n         * @since     4.1\n         * @apioption xAxis.crosshair\n         */\n        /**\n         * The value on a perpendicular axis where this axis should cross. This\n         * is typically used on mathematical plots where the axes cross at 0.\n         * When `crossing` is set, space will not be reserved at the sides of\n         * the chart for axis labels and title, so those may be clipped. In this\n         * case it is better to place the axes without the `crossing` option.\n         *\n         * @type      {number}\n         * @sample    highcharts/xaxis/crossing\n         *            Function plot with axes crossing at 0\n         * @since 11.0.1\n         * @apioption xAxis.crossing\n         */\n        /**\n         * A class name for the crosshair, especially as a hook for styling.\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @apioption xAxis.crosshair.className\n         */\n        /**\n         * The color of the crosshair. Defaults to `#cccccc` for numeric and\n         * datetime axes, and `rgba(204,214,235,0.25)` for category axes, where\n         * the crosshair by default highlights the whole category.\n         *\n         * @sample {highcharts|highstock|highmaps} highcharts/xaxis/crosshair-customized/\n         *         Customized crosshairs\n         *\n         * @type      {Highcharts.ColorType}\n         * @default   #cccccc\n         * @since     4.1\n         * @apioption xAxis.crosshair.color\n         */\n        /**\n         * The dash style for the crosshair. See\n         * [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n         * for possible values.\n         *\n         * @sample {highcharts|highmaps} highcharts/xaxis/crosshair-dotted/\n         *         Dotted crosshair\n         * @sample {highstock} stock/xaxis/crosshair-dashed/\n         *         Dashed X axis crosshair\n         *\n         * @type      {Highcharts.DashStyleValue}\n         * @default   Solid\n         * @since     4.1\n         * @apioption xAxis.crosshair.dashStyle\n         */\n        /**\n         * A label on the axis next to the crosshair.\n         *\n         * In styled mode, the label is styled with the\n         * `.highcharts-crosshair-label` class.\n         *\n         * @sample {highstock} stock/xaxis/crosshair-label/\n         *         Crosshair labels\n         * @sample {highstock} highcharts/css/crosshair-label/\n         *         Style mode\n         *\n         * @declare   Highcharts.AxisCrosshairLabelOptions\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label\n         */\n        /**\n         * Alignment of the label compared to the axis. Defaults to `\"left\"` for\n         * right-side axes, `\"right\"` for left-side axes and `\"center\"` for\n         * horizontal axes.\n         *\n         * @type      {Highcharts.AlignValue}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.align\n         */\n        /**\n         * The background color for the label. Defaults to the related series\n         * color, or `#666666` if that is not available.\n         *\n         * @type      {Highcharts.ColorType}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.backgroundColor\n         */\n        /**\n         * The border color for the crosshair label\n         *\n         * @type      {Highcharts.ColorType}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.borderColor\n         */\n        /**\n         * The border corner radius of the crosshair label.\n         *\n         * @type      {number}\n         * @default   3\n         * @since     2.1.10\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.borderRadius\n         */\n        /**\n         * The border width for the crosshair label.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.borderWidth\n         */\n        /**\n         * Flag to enable crosshair's label.\n         *\n         * @sample {highstock} stock/xaxis/crosshairs-xy/\n         *         Enabled label for yAxis' crosshair\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.enabled\n         */\n        /**\n         * A format string for the crosshair label. Defaults to `{value}` for\n         * numeric axes and `{value:%b %d, %Y}` for datetime axes.\n         *\n         * @type      {string}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.format\n         */\n        /**\n         * Formatter function for the label text.\n         *\n         * @type      {Highcharts.XAxisCrosshairLabelFormatterCallbackFunction}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.formatter\n         */\n        /**\n         * Padding inside the crosshair label.\n         *\n         * @type      {number}\n         * @default   8\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.padding\n         */\n        /**\n         * The shape to use for the label box.\n         *\n         * @type      {string}\n         * @default   callout\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.shape\n         */\n        /**\n         * Text styles for the crosshair label.\n         *\n         * @type      {Highcharts.CSSObject}\n         * @default   {\"color\": \"white\", \"fontWeight\": \"normal\", \"fontSize\": \"11px\", \"textAlign\": \"center\"}\n         * @since     2.1\n         * @product   highstock\n         * @apioption xAxis.crosshair.label.style\n         */\n        /**\n         * Whether the crosshair should snap to the point or follow the pointer\n         * independent of points.\n         *\n         * @sample {highcharts|highstock} highcharts/xaxis/crosshair-snap-false/\n         *         True by default\n         * @sample {highmaps} maps/demo/latlon-advanced/\n         *         Snap is false\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     4.1\n         * @apioption xAxis.crosshair.snap\n         */\n        /**\n         * The pixel width of the crosshair. Defaults to 1 for numeric or\n         * datetime axes, and for one category width for category axes.\n         *\n         * @sample {highcharts} highcharts/xaxis/crosshair-customized/\n         *         Customized crosshairs\n         * @sample {highstock} highcharts/xaxis/crosshair-customized/\n         *         Customized crosshairs\n         * @sample {highmaps} highcharts/xaxis/crosshair-customized/\n         *         Customized crosshairs\n         *\n         * @type      {number}\n         * @default   1\n         * @since     4.1\n         * @apioption xAxis.crosshair.width\n         */\n        /**\n         * The Z index of the crosshair. Higher Z indices allow drawing the\n         * crosshair on top of the series or behind the grid lines.\n         *\n         * @type      {number}\n         * @default   2\n         * @since     4.1\n         * @apioption xAxis.crosshair.zIndex\n         */\n        /**\n         * Whether to pan axis. If `chart.panning` is enabled, the option\n         * allows to disable panning on an individual axis.\n         */\n        panningEnabled: true,\n        /**\n         * The Z index for the axis group.\n         *\n         * @see [axis.gridZIndex](#xAxis.gridZIndex)\n         * @see [axis.labels.zIndex](#xAxis.labels.zIndex)\n         */\n        zIndex: 2,\n        /**\n         * Whether to zoom axis. If `chart.zoomType` is set, the option allows\n         * to disable zooming on an individual axis.\n         *\n         * @sample {highcharts} highcharts/xaxis/zoomenabled/\n         *         Zoom enabled is false\n         */\n        zoomEnabled: true,\n        /**\n         * For a datetime axis, the scale will automatically adjust to the\n         * appropriate unit. This member gives the default string\n         * representations used for each unit. For intermediate values,\n         * different units may be used, for example the `day` unit can be used\n         * on midnight and `hour` unit be used for intermediate values on the\n         * same axis.\n         *\n         * For an overview of the replacement codes, see\n         * [dateFormat](/class-reference/Highcharts.Time#dateFormat).\n         *\n         * Defaults to:\n         * ```js\n         * {\n         *     millisecond: '%H:%M:%S.%L',\n         *     second: '%H:%M:%S',\n         *     minute: '%H:%M',\n         *     hour: '%H:%M',\n         *     day: '%e. %b',\n         *     week: '%e. %b',\n         *     month: '%b \\'%y',\n         *     year: '%Y'\n         * }\n         * ```\n         *\n         * @sample {highcharts} highcharts/xaxis/datetimelabelformats/\n         *         Different day format on X axis\n         * @sample {highstock} stock/xaxis/datetimelabelformats/\n         *         More information in x axis labels\n         *\n         * @declare Highcharts.AxisDateTimeLabelFormatsOptions\n         * @product highcharts highstock gantt\n         */\n        dateTimeLabelFormats: {\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            millisecond: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.millisecond.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.millisecond.main\n                 */\n                main: '%H:%M:%S.%L',\n                range: false\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            second: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.second.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.second.main\n                 */\n                main: '%H:%M:%S',\n                range: false\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            minute: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.minute.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.minute.main\n                 */\n                main: '%H:%M',\n                range: false\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            hour: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.hour.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.hour.main\n                 */\n                main: '%H:%M',\n                range: false\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            day: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.day.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.day.main\n                 */\n                main: '%e %b'\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            week: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.week.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.week.main\n                 */\n                main: '%e %b'\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            month: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.month.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.month.main\n                 */\n                main: '%b \\'%y'\n            },\n            /**\n             * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n             * @type {string|*}\n             */\n            year: {\n                /**\n                 * @type {Array<string>}\n                 * @default undefined\n                 * @apioption xAxis.dateTimeLabelFormats.year.list\n                 */\n                /**\n                 * @apioption xAxis.dateTimeLabelFormats.year.main\n                 */\n                main: '%Y'\n            }\n        },\n        /**\n         * Whether to force the axis to end on a tick. Use this option with\n         * the `maxPadding` option to control the axis end.\n         *\n         * @productdesc {highstock}\n         * In Highcharts Stock, `endOnTick` is always `false` when the navigator\n         * is enabled, to prevent jumpy scrolling. With disabled navigator\n         * enabling `endOnTick` may lead to extending the xAxis to show the last\n         * tick, therefore range selector buttons may not have an active state\n         * if the axis gets extended.\n         *\n         * @sample {highcharts} highcharts/yaxis/endontick/\n         *         True by default\n         * @sample {highcharts} highcharts/yaxis/endontick-false/\n         *         False\n         * @sample {highstock} stock/demo/basic-line/\n         *         True by default\n         * @sample {highstock} stock/xaxis/endontick/\n         *         False\n         *\n         * @since 1.2.0\n         */\n        endOnTick: false,\n        /**\n         * Event handlers for the axis.\n         *\n         * @type      {*}\n         * @apioption xAxis.events\n         */\n        /**\n         * An event fired after the breaks have rendered.\n         *\n         * @see [breaks](#xAxis.breaks)\n         *\n         * @sample {highcharts} highcharts/axisbreak/break-event/\n         *         AfterBreak Event\n         *\n         * @type      {Highcharts.AxisEventCallbackFunction}\n         * @since     4.1.0\n         * @product   highcharts gantt\n         * @apioption xAxis.events.afterBreaks\n         */\n        /**\n         * As opposed to the `setExtremes` event, this event fires after the\n         * final min and max values are computed and corrected for `minRange`.\n         *\n         * Fires when the minimum and maximum is set for the axis, either by\n         * calling the `.setExtremes()` method or by selecting an area in the\n         * chart. One parameter, `event`, is passed to the function, containing\n         * common event information.\n         *\n         * The new user set minimum and maximum values can be found by\n         * `event.min` and `event.max`. These reflect the axis minimum and\n         * maximum in axis values. The actual data extremes are found in\n         * `event.dataMin` and `event.dataMax`.\n         *\n         * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n         * @since     2.3\n         * @context   Highcharts.Axis\n         * @apioption xAxis.events.afterSetExtremes\n         */\n        /**\n         * An event fired when a break from this axis occurs on a point.\n         *\n         * @see [breaks](#xAxis.breaks)\n         *\n         * @sample {highcharts} highcharts/axisbreak/break-visualized/\n         *         Visualization of a Break\n         *\n         * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n         * @since     4.1.0\n         * @product   highcharts gantt\n         * @context   Highcharts.Axis\n         * @apioption xAxis.events.pointBreak\n         */\n        /**\n         * An event fired when a point falls inside a break from this axis.\n         *\n         * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n         * @product   highcharts highstock gantt\n         * @context   Highcharts.Axis\n         * @apioption xAxis.events.pointInBreak\n         */\n        /**\n         * An event fired when a point is outside a break after zoom.\n         *\n         * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n         * @product   highcharts highstock gantt\n         * @context   Highcharts.Axis\n         * @apioption xAxis.events.pointBreakOut\n         */\n        /**\n         * Fires when the minimum and maximum is set for the axis, either by\n         * calling the `.setExtremes()` method or by selecting an area in the\n         * chart. One parameter, `event`, is passed to the function,\n         * containing common event information.\n         *\n         * The new user set minimum and maximum values can be found by\n         * `event.min` and `event.max`. These reflect the axis minimum and\n         * maximum in data values. When an axis is zoomed all the way out from\n         * the \"Reset zoom\" button, `event.min` and `event.max` are null, and\n         * the new extremes are set based on `this.dataMin` and `this.dataMax`.\n         *\n         * @sample {highstock} stock/xaxis/events-setextremes/\n         *         Log new extremes on x axis\n         *\n         * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n         * @since     1.2.0\n         * @context   Highcharts.Axis\n         * @apioption xAxis.events.setExtremes\n         */\n        /**\n         * The lowest allowed value for automatically computed axis extremes.\n         *\n         * @see [ceiling](#yAxis.ceiling)\n         *\n         * @sample {highcharts} highcharts/yaxis/floor-ceiling/\n         *         Floor and ceiling\n         * @sample {highstock} stock/demo/lazy-loading/\n         *         Prevent negative stock price on Y axis\n         *\n         * @type      {number}\n         * @since     4.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.floor\n         */\n        /**\n         * The dash or dot style of the grid lines. For possible values, see\n         * [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n         *\n         * @sample {highcharts} highcharts/yaxis/gridlinedashstyle/\n         *         Long dashes\n         * @sample {highstock} stock/xaxis/gridlinedashstyle/\n         *         Long dashes\n         *\n         * @type      {Highcharts.DashStyleValue}\n         * @since     1.2\n         */\n        gridLineDashStyle: 'Solid',\n        /**\n         * The Z index of the grid lines.\n         *\n         * @sample {highcharts|highstock} highcharts/xaxis/gridzindex/\n         *         A Z index of 4 renders the grid above the graph\n         *\n         * @product   highcharts highstock gantt\n         *\n         * @see [axis.zIndex](#xAxis.zIndex)\n         * @see [axis.labels.zIndex](#xAxis.labels.zIndex)\n         */\n        gridZIndex: 1,\n        /**\n         * An id for the axis. This can be used after render time to get\n         * a pointer to the axis object through `chart.get()`.\n         *\n         * @sample {highcharts} highcharts/xaxis/id/\n         *         Get the object\n         * @sample {highstock} stock/xaxis/id/\n         *         Get the object\n         *\n         * @type      {string}\n         * @since     1.2.0\n         * @apioption xAxis.id\n         */\n        /**\n         * The axis labels show the number or category for each tick.\n         *\n         * Since v8.0.0: Labels are animated in categorized x-axis with\n         * updating data if `tickInterval` and `step` is set to 1.\n         *\n         * @productdesc {highmaps}\n         * X and Y axis labels are by default disabled in Highmaps, but the\n         * functionality is inherited from Highcharts and used on `colorAxis`,\n         * and can be enabled on X and Y axes too.\n         */\n        labels: {\n            /**\n             * What part of the string the given position is anchored to.\n             * If `left`, the left side of the string is at the axis position.\n             * Can be one of `\"left\"`, `\"center\"` or `\"right\"`. Defaults to\n             * an intelligent guess based on which side of the chart the axis\n             * is on and the rotation of the label.\n             *\n             * @see [reserveSpace](#xAxis.labels.reserveSpace)\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-align-left/\n             *         Left\n             * @sample {highcharts} highcharts/xaxis/labels-align-right/\n             *         Right\n             * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n             *         Left-aligned labels on a vertical category axis\n             *\n             * @type      {Highcharts.AlignValue}\n             * @apioption xAxis.labels.align\n             */\n            /**\n             * Whether to allow the axis labels to overlap. When false,\n             * overlapping labels are hidden.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-allowoverlap-true/\n             *         X axis labels overlap enabled\n             *\n             * @type      {boolean}\n             * @default   false\n             * @apioption xAxis.labels.allowOverlap\n             */\n            /**\n             * For horizontal axes, the allowed degrees of label rotation\n             * to prevent overlapping labels. If there is enough space,\n             * labels are not rotated. As the chart gets narrower, it\n             * will start rotating the labels -45 degrees, then remove\n             * every second label and try again with rotations 0 and -45 etc.\n             * Set it to `undefined` to disable rotation, which will\n             * cause the labels to word-wrap if possible. Defaults to `[-45]``\n             * on bottom and top axes, `undefined` on left and right axes.\n             *\n             * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-default/\n             *         Default auto rotation of 0 or -45\n             * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-0-90/\n             *         Custom graded auto rotation\n             *\n             * @type      {Array<number>}\n             * @default   undefined\n             * @since     4.1.0\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.labels.autoRotation\n             */\n            /**\n             * When each category width is more than this many pixels, we don't\n             * apply auto rotation. Instead, we lay out the axis label with word\n             * wrap. A lower limit makes sense when the label contains multiple\n             * short words that don't extend the available horizontal space for\n             * each label.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-autorotationlimit/\n             *         Lower limit\n             *\n             * @since     4.1.5\n             * @product   highcharts gantt\n             */\n            autoRotationLimit: 80,\n            /**\n             * The label's pixel distance from the perimeter of the plot area.\n             * On cartesian charts, this is overridden if the `labels.y` setting\n             * is set.\n             *\n             * @sample {highcharts} highcharts/yaxis/labels-distance/\n             *         Polar chart, labels centered under the arc\n             *\n             * @type      {number}\n             * @product   highcharts gantt\n             */\n            distance: 15,\n            /**\n             * Enable or disable the axis labels.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-enabled/\n             *         X axis labels disabled\n             * @sample {highstock} stock/xaxis/labels-enabled/\n             *         X axis labels disabled\n             *\n             */\n            enabled: true,\n            /**\n             * A format string for the axis label. The context is available as\n             * format string variables. For example, you can use `{text}` to\n             * insert the default formatted text. The recommended way of adding\n             * units for the label is using `text`, for example `{text} km`.\n             *\n             * To add custom numeric or datetime formatting, use `{value}` with\n             * formatting, for example `{value:.1f}` or `{value:%Y-%m-%d}`.\n             *\n             * See\n             * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n             * for more examples of formatting.\n             *\n             * The default value is not specified due to the dynamic\n             * nature of the default implementation.\n             *\n             * @sample {highcharts|highstock} highcharts/yaxis/labels-format/\n             *         Add units to Y axis label\n             * @sample {highcharts} highcharts/xaxis/labels-format-linked/\n             *         Linked category names\n             * @sample {highcharts} highcharts/xaxis/labels-format-custom/\n             *         Custom number format\n             *\n             * @type      {string}\n             * @since     3.0\n             * @apioption xAxis.labels.format\n             */\n            /**\n             * Callback JavaScript function to format the label. The value\n             * is given by `this.value`. Additional properties for `this` are\n             * `axis`, `chart`, `isFirst`, `isLast` and `text` which holds the\n             * value of the default formatter.\n             *\n             * Defaults to a built in function returning a formatted string\n             * depending on whether the axis is `category`, `datetime`,\n             * `numeric` or other.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-formatter-linked/\n             *         Linked category names\n             * @sample {highcharts} highcharts/xaxis/labels-formatter-extended/\n             *         Modified numeric labels\n             * @sample {highstock} stock/xaxis/labels-formatter/\n             *         Added units on Y axis\n             *\n             * @type      {Highcharts.AxisLabelsFormatterCallbackFunction}\n             * @apioption xAxis.labels.formatter\n             */\n            /**\n             * The number of pixels to indent the labels per level in a treegrid\n             * axis.\n             *\n             * @sample gantt/treegrid-axis/demo\n             *         Indentation 10px by default.\n             * @sample gantt/treegrid-axis/indentation-0px\n             *         Indentation set to 0px.\n             *\n             * @product gantt\n             */\n            indentation: 10,\n            /**\n             * Horizontal axis only. When `staggerLines` is not set,\n             * `maxStaggerLines` defines how many lines the axis is allowed to\n             * add to automatically avoid overlapping X labels. Set to `1` to\n             * disable overlap detection.\n             *\n             * @deprecated\n             * @type      {number}\n             * @default   5\n             * @since     1.3.3\n             * @apioption xAxis.labels.maxStaggerLines\n             */\n            /**\n             * How to handle overflowing labels on horizontal axis. If set to\n             * `\"allow\"`, it will not be aligned at all. By default it\n             * `\"justify\"` labels inside the chart area. If there is room to\n             * move it, it will be aligned to the edge, else it will be removed.\n             *\n             * @since      2.2.5\n             * @validvalue [\"allow\", \"justify\"]\n             */\n            overflow: 'justify',\n            /**\n             * The pixel padding for axis labels, to ensure white space between\n             * them. Defaults to 4 for horizontal axes, 1 for vertical.\n             *\n             * @type      {number}\n             * @default   undefined\n             * @product   highcharts gantt\n             * @apioption xAxis.labels.padding\n             */\n            /**\n             * Whether to reserve space for the labels. By default, space is\n             * reserved for the labels in these cases:\n             *\n             * * On all horizontal axes.\n             * * On vertical axes if `label.align` is `right` on a left-side\n             * axis or `left` on a right-side axis.\n             * * On vertical axes if `label.align` is `center`.\n             *\n             * This can be turned off when for example the labels are rendered\n             * inside the plot area instead of outside.\n             *\n             * @see [labels.align](#xAxis.labels.align)\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-reservespace/\n             *         No reserved space, labels inside plot\n             * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n             *         Left-aligned labels on a vertical category axis\n             *\n             * @type      {boolean}\n             * @since     4.1.10\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.labels.reserveSpace\n             */\n            reserveSpace: void 0,\n            /**\n             * Rotation of the labels in degrees. When `undefined`, the\n             * `autoRotation` option takes precedence.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-rotation/\n             *         X axis labels rotated 90°\n             *\n             * @type      {number}\n             * @default   0\n             * @apioption xAxis.labels.rotation\n             */\n            rotation: void 0,\n            /**\n             * Horizontal axes only. The number of lines to spread the labels\n             * over to make room or tighter labels. 0 disables staggering.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-staggerlines/\n             *         Show labels over two lines\n             * @sample {highstock} stock/xaxis/labels-staggerlines/\n             *         Show labels over two lines\n             *\n             * @since     2.1\n             */\n            staggerLines: 0,\n            /**\n             * To show only every _n_'th label on the axis, set the step to _n_.\n             * Setting the step to 2 shows every other label.\n             *\n             * By default, when 0, the step is calculated automatically to avoid\n             * overlap. To prevent this, set it to 1\\. This usually only\n             * happens on a category axis, and is often a sign that you have\n             * chosen the wrong axis type.\n             *\n             * Read more at\n             * [Axis docs](https://www.highcharts.com/docs/chart-concepts/axes)\n             * => What axis should I use?\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-step/\n             *         Showing only every other axis label on a categorized\n             *         x-axis\n             * @sample {highcharts} highcharts/xaxis/labels-step-auto/\n             *         Auto steps on a category axis\n             *\n             * @since     2.1\n             */\n            step: 0,\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the labels.\n             */\n            useHTML: false,\n            /**\n             * The x position offset of all labels relative to the tick\n             * positions on the axis. Overrides the `labels.distance` option.\n             *\n             * @type      {number}\n             * @apioption xAxis.labels.x\n             */\n            /**\n             * The y position offset of all labels relative to the tick\n             * positions on the axis. Overrides the `labels.distance` option.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-x/\n             *         X axis labels placed on grid lines\n             *\n             * @type      {number}\n             * @apioption xAxis.labels.y\n             */\n            /**\n             * The Z index for the axis labels.\n             *\n             * @see [axis.zIndex](#xAxis.zIndex)\n             * @see [axis.gridZIndex](#xAxis.gridZIndex)\n             */\n            zIndex: 7,\n            /**\n             * CSS styles for the label. Use `whiteSpace: 'nowrap'` to prevent\n             * wrapping of category labels. Use `textOverflow: 'none'` to\n             * prevent ellipsis (dots).\n             *\n             * In styled mode, the labels are styled with the\n             * `.highcharts-axis-labels` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-style/\n             *         Red X axis labels\n             *\n             * @type      {Highcharts.CSSObject}\n             */\n            style: {\n                /** @internal */\n                color: \"#333333\" /* Palette.neutralColor80 */,\n                /** @internal */\n                cursor: 'default',\n                /** @internal */\n                fontSize: '0.8em'\n            }\n        },\n        /**\n         * The left position as the horizontal axis. If it's a number, it is\n         * interpreted as pixel position relative to the chart.\n         *\n         * Since Highcharts v5.0.13: If it's a percentage string, it is\n         * interpreted as percentages of the plot width, offset from plot area\n         * left.\n         *\n         * @sample {highcharts} highcharts/xaxis/axis-position-properties\n         *         Different axis position properties\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption xAxis.left\n         */\n        /**\n         * The top position as the vertical axis. If it's a number, it is\n         * interpreted as pixel position relative to the chart.\n         *\n         * Since Highcharts 2: If it's a percentage string, it is interpreted\n         * as percentages of the plot height, offset from plot area top.\n         *\n         * @sample {highcharts} highcharts/xaxis/axis-position-properties\n         *         Different axis position properties\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption xAxis.top\n         */\n        /**\n         * Index of another axis that this axis is linked to. When an axis is\n         * linked to a master axis, it will take the same extremes as\n         * the master, but as assigned by min or max or by setExtremes.\n         * It can be used to show additional info, or to ease reading the\n         * chart by duplicating the scales.\n         *\n         * @sample {highcharts} highcharts/xaxis/linkedto/\n         *         Different string formats of the same date\n         * @sample {highcharts} highcharts/yaxis/linkedto/\n         *         Y values on both sides\n         *\n         * @type      {number}\n         * @since     2.0.2\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.linkedTo\n         */\n        /**\n         * The maximum value of the axis. If `null`, the max value is\n         * automatically calculated.\n         *\n         * If the [endOnTick](#yAxis.endOnTick) option is true, the `max` value\n         * might be rounded up.\n         *\n         * If a [tickAmount](#yAxis.tickAmount) is set, the axis may be extended\n         * beyond the set max in order to reach the given number of ticks. The\n         * same may happen in a chart with multiple axes, determined by [chart.\n         * alignTicks](#chart), where a `tickAmount` is applied internally.\n         *\n         * @sample {highcharts} highcharts/yaxis/max-200/\n         *         Y axis max of 200\n         * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n         *         Y axis max on logarithmic axis\n         * @sample {highstock} stock/xaxis/min-max/\n         *         Fixed min and max on X axis\n         *\n         * @type      {number|null}\n         * @apioption xAxis.max\n         */\n        /**\n         * Padding of the max value relative to the length of the axis. A\n         * padding of 0.05 will make a 100px axis 5px longer. This is useful\n         * when you don't want the highest data value to appear on the edge\n         * of the plot area. When the axis' `max` option is set or a max extreme\n         * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n         *\n         * @productdesc {highstock}\n         * For an [ordinal](#xAxis.ordinal) axis, `minPadding` and `maxPadding`\n         * are ignored. Use [overscroll](#xAxis.overscroll) instead.\n         *\n         * @sample {highcharts} highcharts/yaxis/maxpadding/\n         *         Max padding of 0.25 on y axis\n         * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n         *         Greater min- and maxPadding\n         * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n         *         Add some padding\n         *\n         * @default   {highcharts} 0.01\n         * @default   {highstock|highmaps} 0\n         * @since     1.2.0\n         */\n        maxPadding: 0.01,\n        /**\n         * Deprecated. Use `minRange` instead.\n         *\n         * @deprecated\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption xAxis.maxZoom\n         */\n        /**\n         * The minimum value of the axis. If `null` the min value is\n         * automatically calculated.\n         *\n         * If the [startOnTick](#yAxis.startOnTick) option is true (default),\n         * the `min` value might be rounded down.\n         *\n         * The automatically calculated minimum value is also affected by\n         * [floor](#yAxis.floor), [softMin](#yAxis.softMin),\n         * [minPadding](#yAxis.minPadding), [minRange](#yAxis.minRange)\n         * as well as [series.threshold](#plotOptions.series.threshold)\n         * and [series.softThreshold](#plotOptions.series.softThreshold).\n         *\n         * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n         *         -50 with startOnTick to false\n         * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n         *         -50 with startOnTick true by default\n         * @sample {highstock} stock/xaxis/min-max/\n         *         Set min and max on X axis\n         *\n         * @type      {number|null}\n         * @apioption xAxis.min\n         */\n        /**\n         * The dash or dot style of the minor grid lines. For possible values,\n         * see [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n         *\n         * @sample {highcharts} highcharts/yaxis/minorgridlinedashstyle/\n         *         Long dashes on minor grid lines\n         * @sample {highstock} stock/xaxis/minorgridlinedashstyle/\n         *         Long dashes on minor grid lines\n         *\n         * @type      {Highcharts.DashStyleValue}\n         * @since     1.2\n         */\n        minorGridLineDashStyle: 'Solid',\n        /**\n         * Specific tick interval in axis units for the minor ticks. On a linear\n         * axis, if `\"auto\"`, the minor tick interval is calculated as a fifth\n         * of the tickInterval. If `undefined`, minor ticks are not shown.\n         *\n         * On logarithmic axes, the unit is the power of the value. For example,\n         * setting the minorTickInterval to 1 puts one tick on each of 0.1, 1,\n         * 10, 100 etc. Setting the minorTickInterval to 0.1 produces 9 ticks\n         * between 1 and 10, 10 and 100 etc.\n         *\n         * If user settings dictate minor ticks to become too dense, they don't\n         * make sense, and will be ignored to prevent performance problems.\n         *\n         * @sample {highcharts} highcharts/yaxis/minortickinterval-null/\n         *         Undefined by default\n         * @sample {highcharts} highcharts/yaxis/minortickinterval-5/ 5 units\n         * @sample {highcharts} highcharts/yaxis/minortickinterval-log-auto/\n         *         \"auto\"\n         * @sample {highcharts} highcharts/yaxis/minortickinterval-log/ 0.1\n         * @sample {highstock} stock/demo/basic-line/ Null by default\n         * @sample {highstock} stock/xaxis/minortickinterval-auto/ \"auto\"\n         *\n         * @type      {number|'auto'}\n         * @apioption xAxis.minorTickInterval\n         */\n        /**\n         * The pixel length of the minor tick marks.\n         *\n         * @sample {highcharts} highcharts/yaxis/minorticklength/\n         *         10px on Y axis\n         * @sample {highstock} stock/xaxis/minorticks/\n         *         10px on Y axis\n         */\n        minorTickLength: 2,\n        /**\n         * The position of the minor tick marks relative to the axis line.\n         *  Can be one of `inside` and `outside`.\n         *\n         * @sample {highcharts} highcharts/yaxis/minortickposition-outside/\n         *         Outside by default\n         * @sample {highcharts} highcharts/yaxis/minortickposition-inside/\n         *         Inside\n         * @sample {highstock} stock/xaxis/minorticks/\n         *         Inside\n         *\n         * @validvalue [\"inside\", \"outside\"]\n         */\n        minorTickPosition: 'outside',\n        /**\n         * Enable or disable minor ticks. The interval between the minor ticks\n         * can be controlled either by the\n         * [minorTicksPerMajor](#xAxis.minorTicksPerMajor) setting, or as an\n         * absolute [minorTickInterval](#xAxis.minorTickInterval) value.\n         *\n         * On a logarithmic axis, minor ticks are laid out based on a best\n         * guess, attempting to enter an approximate number of minor ticks\n         * between each major tick based on\n         * [minorTicksPerMajor](#xAxis.minorTicksPerMajor).\n         *\n         * Prior to v6.0.0, ticks were enabled in auto layout by setting\n         * `minorTickInterval` to `\"auto\"`.\n         *\n         * @productdesc {highcharts} On axes using\n         * [categories](#xAxis.categories), minor ticks are not supported.\n         *\n         * @sample {highcharts} highcharts/yaxis/minorticks-true/ Enabled on\n         *         linear Y axis\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     6.0.0\n         * @apioption xAxis.minorTicks\n         */\n        /**\n         * The number of minor ticks per major tick. Works for `linear`,\n         * `logarithmic` and `datetime` axes.\n         *\n         * @sample {highcharts} highcharts/yaxis/minortickspermajor/\n         *         2 minor ticks per major tick on Y axis\n         *\n         * @since  11.0.0\n         *\n         * @type {number}\n         */\n        minorTicksPerMajor: 5,\n        /**\n         * The pixel width of the minor tick mark.\n         *\n         * @sample {highcharts} highcharts/yaxis/minortickwidth/\n         *         3px width\n         * @sample {highstock} stock/xaxis/minorticks/\n         *         1px width\n         *\n         * @type      {number}\n         * @default   0\n         * @apioption xAxis.minorTickWidth\n         */\n        /**\n         * Padding of the min value relative to the length of the axis. A\n         * padding of 0.05 will make a 100px axis 5px longer. This is useful\n         * when you don't want the lowest data value to appear on the edge\n         * of the plot area. When the axis' `min` option is set or a min extreme\n         * is set using `axis.setExtremes()`, the minPadding will be ignored.\n         *\n         * @productdesc {highstock}\n         * For an [ordinal](#xAxis.ordinal) axis, `minPadding` and `maxPadding`\n         * are ignored. Use [overscroll](#xAxis.overscroll) instead.\n         *\n         * @sample {highcharts} highcharts/yaxis/minpadding/\n         *         Min padding of 0.2\n         * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n         *         Greater min- and maxPadding\n         * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n         *         Add some padding\n         *\n         * @default    {highcharts} 0.01\n         * @default    {highstock|highmaps} 0\n         * @since      1.2.0\n         * @product    highcharts highstock gantt\n         */\n        minPadding: 0.01,\n        /**\n         * The minimum range to display on this axis. The entire axis will not\n         * be allowed to span over a smaller interval than this. For example,\n         * for a datetime axis the main unit is milliseconds. If minRange is\n         * set to 3600000, you can't zoom in more than to one hour.\n         *\n         * The default minRange for the x axis is five times the smallest\n         * interval between any of the data points.\n         *\n         * On a logarithmic axis, the unit for the minimum range is the power.\n         * So a minRange of 1 means that the axis can be zoomed to 10-100,\n         * 100-1000, 1000-10000 etc.\n         *\n         * **Note**: The `minPadding`, `maxPadding`, `startOnTick` and\n         * `endOnTick` settings also affect how the extremes of the axis\n         * are computed.\n         *\n         * @sample {highcharts} highcharts/xaxis/minrange/\n         *         Minimum range of 5\n         * @sample {highstock} stock/xaxis/minrange/\n         *         Max zoom of 6 months overrides user selections\n         *\n         * @type      {number}\n         * @apioption xAxis.minRange\n         */\n        /**\n         * The minimum tick interval allowed in axis values. For example on\n         * zooming in on an axis with daily data, this can be used to prevent\n         * the axis from showing hours. Defaults to the closest distance between\n         * two points on the axis.\n         *\n         * @type      {number}\n         * @since     2.3.0\n         * @apioption xAxis.minTickInterval\n         */\n        /**\n         * The distance in pixels from the plot area to the axis line.\n         * A positive offset moves the axis with it's line, labels and ticks\n         * away from the plot area. This is typically used when two or more\n         * axes are displayed on the same side of the plot. With multiple\n         * axes the offset is dynamically adjusted to avoid collision, this\n         * can be overridden by setting offset explicitly.\n         *\n         * @sample {highcharts} highcharts/yaxis/offset/\n         *         Y axis offset of 70\n         * @sample {highcharts} highcharts/yaxis/offset-centered/\n         *         Axes positioned in the center of the plot\n         * @sample {highstock} stock/xaxis/offset/\n         *         Y axis offset by 70 px\n         *\n         * @type {number}\n         */\n        offset: void 0,\n        /**\n         * Whether to display the axis on the opposite side of the normal. The\n         * normal is on the left side for vertical axes and bottom for\n         * horizontal, so the opposite sides will be right and top respectively.\n         * This is typically used with dual or multiple axes.\n         *\n         * @sample {highcharts} highcharts/yaxis/opposite/\n         *         Secondary Y axis opposite\n         * @sample {highstock} stock/xaxis/opposite/\n         *         Y axis on left side\n         *\n         * @default   {highcharts|highstock|highmaps} false\n         * @default   {gantt} true\n         * @type      Boolean\n         * @apioption xAxis.opposite\n         */\n        /**\n         * In an ordinal axis, the points are equally spaced in the chart\n         * regardless of the actual time or x distance between them. This means\n         * that missing data periods (e.g. nights or weekends for a stock chart)\n         * will not take up space in the chart.\n         * Having `ordinal: false` will show any gaps created by the `gapSize`\n         * setting proportionate to their duration.\n         *\n         * In stock charts the X axis is ordinal by default, unless\n         * the boost module is used and at least one of the series' data length\n         * exceeds the [boostThreshold](#series.line.boostThreshold).\n         *\n         * For an ordinal axis, `minPadding` and `maxPadding` are ignored. Use\n         * [overscroll](#xAxis.overscroll) instead.\n         *\n         * @sample {highstock} stock/xaxis/ordinal-true/\n         *         True by default\n         * @sample {highstock} stock/xaxis/ordinal-false/\n         *         False\n         *\n         * @see [overscroll](#xAxis.overscroll)\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     1.1\n         * @product   highstock\n         * @apioption xAxis.ordinal\n         */\n        /**\n         * Additional range on the right side of the xAxis. Works similar to\n         * `xAxis.maxPadding`, but the value is set in terms of axis values,\n         * percentage or pixels.\n         *\n         * If it's a number, it is interpreted as axis values, which in a\n         * datetime axis equals milliseconds.\n         *\n         * If it's a percentage string, is interpreted as percentages of axis\n         * length. An overscroll of 50% will make a 100px axis 50px longer.\n         *\n         * If it's a pixel string, it is interpreted as a fixed pixel value, but\n         * limited to 90% of the axis length.\n         *\n         * @sample {highstock} stock/xaxis/overscroll/ One minute overscroll\n         *         with live data\n         * @sample {highstock} stock/xaxis/overscroll-percent/ Overscroll set in\n         *         percentage\n         * @sample {highstock} stock/xaxis/overscroll-pixel/ Overscroll set in\n         *         pixels\n         *\n         * @type      {number | string}\n         * @default   0\n         * @since     6.0.0\n         * @product   highstock\n         * @apioption xAxis.overscroll\n         */\n        /**\n         * Refers to the index in the [panes](#panes) array. Used for circular\n         * gauges and polar charts. When the option is not set then first pane\n         * will be used.\n         *\n         * @sample highcharts/demo/gauge-vu-meter\n         *         Two gauges with different center\n         *\n         * @type      {number}\n         * @product   highcharts\n         * @apioption xAxis.pane\n         */\n        /**\n         * The zoomed range to display when only defining one or none of `min`\n         * or `max`. For example, to show the latest month, a range of one month\n         * can be set.\n         *\n         * @sample {highstock} stock/xaxis/range/\n         *         Setting a zoomed range when the rangeSelector is disabled\n         *\n         * @type      {number}\n         * @product   highstock\n         * @apioption xAxis.range\n         */\n        /**\n         * Whether to reverse the axis so that the highest number is closest\n         * to the origin. If the chart is inverted, the x axis is reversed by\n         * default.\n         *\n         * @sample {highcharts} highcharts/yaxis/reversed/\n         *         Reversed Y axis\n         * @sample {highstock} stock/xaxis/reversed/\n         *         Reversed Y axis\n         *\n         * @type      {boolean}\n         * @default   undefined\n         * @apioption xAxis.reversed\n         */\n        reversed: void 0,\n        /**\n         * This option determines how stacks should be ordered within a group.\n         * For example reversed xAxis also reverses stacks, so first series\n         * comes last in a group. To keep order like for non-reversed xAxis\n         * enable this option.\n         *\n         * @sample {highcharts} highcharts/xaxis/reversedstacks/\n         *         Reversed stacks comparison\n         * @sample {highstock} highcharts/xaxis/reversedstacks/\n         *         Reversed stacks comparison\n         *\n         * @since     6.1.1\n         * @product   highcharts highstock\n         */\n        reversedStacks: false,\n        /**\n         * An optional scrollbar to display on the X axis in response to\n         * limiting the minimum and maximum of the axis values.\n         *\n         * In styled mode, all the presentational options for the scrollbar are\n         * replaced by the classes `.highcharts-scrollbar-thumb`,\n         * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n         * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n         *\n         * @sample {highstock} stock/yaxis/heatmap-scrollbars/\n         *         Heatmap with both scrollbars\n         *\n         * @extends   scrollbar\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption xAxis.scrollbar\n         */\n        /**\n         * Whether to show the axis line and title when the axis has no data.\n         *\n         * @sample {highcharts} highcharts/yaxis/showempty/\n         *         When clicking the legend to hide series, one axis preserves\n         *         line and title, the other doesn't\n         * @sample {highstock} highcharts/yaxis/showempty/\n         *         When clicking the legend to hide series, one axis preserves\n         *         line and title, the other doesn't\n         *\n         * @since     1.1\n         */\n        showEmpty: true,\n        /**\n         * Whether to show the first tick label.\n         *\n         * @sample {highcharts} highcharts/xaxis/showfirstlabel-false/\n         *         Set to false on X axis\n         * @sample {highstock} stock/xaxis/showfirstlabel/\n         *         Labels below plot lines on Y axis\n         */\n        showFirstLabel: true,\n        /**\n         * Whether to show the last tick label. Defaults to `true` on cartesian\n         * charts, and `false` on polar charts.\n         *\n         * @sample {highcharts} highcharts/xaxis/showlastlabel-true/\n         *         Set to true on X axis\n         * @sample {highstock} stock/xaxis/showfirstlabel/\n         *         Labels below plot lines on Y axis\n         *\n         * @type    {boolean}\n         * @default undefined\n         * @product highcharts highstock gantt\n         */\n        showLastLabel: true,\n        /**\n         * A soft maximum for the axis. If the series data maximum is less than\n         * this, the axis will stay at this maximum, but if the series data\n         * maximum is higher, the axis will flex to show all data.\n         *\n         * @sample highcharts/yaxis/softmin-softmax/\n         *         Soft min and max\n         *\n         * @type      {number}\n         * @since     5.0.1\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.softMax\n         */\n        /**\n         * A soft minimum for the axis. If the series data minimum is greater\n         * than this, the axis will stay at this minimum, but if the series\n         * data minimum is lower, the axis will flex to show all data.\n         *\n         * @sample highcharts/yaxis/softmin-softmax/\n         *         Soft min and max\n         *\n         * @type      {number}\n         * @since     5.0.1\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.softMin\n         */\n        /**\n         * For datetime axes, this decides where to put the tick between weeks.\n         *  0 = Sunday, 1 = Monday.\n         *\n         * @sample {highcharts} highcharts/xaxis/startofweek-monday/\n         *         Monday by default\n         * @sample {highcharts} highcharts/xaxis/startofweek-sunday/\n         *         Sunday\n         * @sample {highstock} stock/xaxis/startofweek-1\n         *         Monday by default\n         * @sample {highstock} stock/xaxis/startofweek-0\n         *         Sunday\n         *\n         * @product highcharts highstock gantt\n         */\n        startOfWeek: 1,\n        /**\n         * Whether to force the axis to start on a tick. Use this option with\n         * the `minPadding` option to control the axis start.\n         *\n         * @productdesc {highstock}\n         * In Highcharts Stock, `startOnTick` is always `false` when\n         * the navigator is enabled, to prevent jumpy scrolling.\n         *\n         * @sample {highcharts} highcharts/xaxis/startontick-false/\n         *         False by default\n         * @sample {highcharts} highcharts/xaxis/startontick-true/\n         *         True\n         *\n         * @since 1.2.0\n         */\n        startOnTick: false,\n        /**\n         * The amount of ticks to draw on the axis. This opens up for aligning\n         * the ticks of multiple charts or panes within a chart. This option\n         * overrides the `tickPixelInterval` option.\n         *\n         * This option only has an effect on linear axes. Datetime, logarithmic\n         * or category axes are not affected.\n         *\n         * @sample {highcharts} highcharts/yaxis/tickamount/\n         *         8 ticks on Y axis\n         * @sample {highstock} highcharts/yaxis/tickamount/\n         *         8 ticks on Y axis\n         *\n         * @type      {number}\n         * @since     4.1.0\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.tickAmount\n         */\n        /**\n         * The interval of the tick marks in axis units. When `undefined`, the\n         * tick interval is computed to approximately follow the\n         * [tickPixelInterval](#xAxis.tickPixelInterval) on linear and datetime\n         * axes. On categorized axes, a `undefined` tickInterval will default to\n         * 1, one category. Note that datetime axes are based on milliseconds,\n         * so for example an interval of one day is expressed as\n         * `24 * 3600 * 1000`.\n         *\n         * On logarithmic axes, the tickInterval is based on powers, so a\n         * tickInterval of 1 means one tick on each of 0.1, 1, 10, 100 etc. A\n         * tickInterval of 2 means a tick of 0.1, 10, 1000 etc. A tickInterval\n         * of 0.2 puts a tick on 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10, 20,\n         * 40 etc.\n         *\n         *\n         * If the tickInterval is too dense for labels to be drawn, Highcharts\n         * may remove ticks.\n         *\n         * If the chart has multiple axes, the [alignTicks](#chart.alignTicks)\n         * option may interfere with the `tickInterval` setting.\n         *\n         * @see [tickPixelInterval](#xAxis.tickPixelInterval)\n         * @see [tickPositions](#xAxis.tickPositions)\n         * @see [tickPositioner](#xAxis.tickPositioner)\n         *\n         * @sample {highcharts} highcharts/xaxis/tickinterval-5/\n         *         Tick interval of 5 on a linear axis\n         * @sample {highstock} stock/xaxis/tickinterval/\n         *         Tick interval of 0.01 on Y axis\n         *\n         * @type      {number}\n         * @apioption xAxis.tickInterval\n         */\n        /**\n         * The pixel length of the main tick marks.\n         *\n         * @sample {highcharts} highcharts/xaxis/ticklength/\n         *         20 px tick length on the X axis\n         * @sample {highstock} stock/xaxis/ticks/\n         *         Formatted ticks on X axis\n         */\n        tickLength: 10,\n        /**\n         * If tickInterval is `null` this option sets the approximate pixel\n         * interval of the tick marks. Not applicable to categorized axis.\n         *\n         * The tick interval is also influenced by the [minTickInterval](\n         * #xAxis.minTickInterval) option, that, by default prevents ticks from\n         * being denser than the data points.\n         *\n         * @see [tickInterval](#xAxis.tickInterval)\n         * @see [tickPositioner](#xAxis.tickPositioner)\n         * @see [tickPositions](#xAxis.tickPositions)\n         *\n         * @sample {highcharts} highcharts/xaxis/tickpixelinterval-50/\n         *         50 px on X axis\n         * @sample {highstock} stock/xaxis/tickpixelinterval/\n         *         200 px on X axis\n         */\n        tickPixelInterval: 100,\n        /**\n         * For categorized axes only. If `on` the tick mark is placed in the\n         * center of the category, if `between` the tick mark is placed between\n         * categories. The default is `between` if the `tickInterval` is 1, else\n         * `on`. In order to render tick marks on a category axis it is necessary\n         * to provide a [tickWidth](#xAxis.tickWidth).\n         *\n         * @sample {highcharts} highcharts/xaxis/tickmarkplacement-between/\n         *         \"between\" by default\n         * @sample {highcharts} highcharts/xaxis/tickmarkplacement-on/\n         *         \"on\"\n         *\n         * @product    highcharts gantt\n         * @validvalue [\"on\", \"between\"]\n         */\n        tickmarkPlacement: 'between',\n        /**\n         * The position of the major tick marks relative to the axis line.\n         * Can be one of `inside` and `outside`.\n         *\n         * @sample {highcharts} highcharts/xaxis/tickposition-outside/\n         *         \"outside\" by default\n         * @sample {highcharts} highcharts/xaxis/tickposition-inside/\n         *         \"inside\"\n         * @sample {highstock} stock/xaxis/ticks/\n         *         Formatted ticks on X axis\n         *\n         * @validvalue [\"inside\", \"outside\"]\n         */\n        tickPosition: 'outside',\n        /**\n         * A callback function returning array defining where the ticks are\n         * laid out on the axis. This overrides the default behaviour of\n         * [tickPixelInterval](#xAxis.tickPixelInterval) and [tickInterval](\n         * #xAxis.tickInterval). The automatic tick positions are accessible\n         * through `this.tickPositions` and can be modified by the callback.\n         *\n         * @see [tickPositions](#xAxis.tickPositions)\n         *\n         * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n         *         Demo of tickPositions and tickPositioner\n         * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n         *         Demo of tickPositions and tickPositioner\n         *\n         * @type      {Highcharts.AxisTickPositionerCallbackFunction}\n         * @apioption xAxis.tickPositioner\n         */\n        /**\n         * An array defining where the ticks are laid out on the axis. This\n         * overrides the default behaviour of [tickPixelInterval](\n         * #xAxis.tickPixelInterval) and [tickInterval](#xAxis.tickInterval).\n         *\n         * @see [tickPositioner](#xAxis.tickPositioner)\n         *\n         * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n         *         Demo of tickPositions and tickPositioner\n         * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n         *         Demo of tickPositions and tickPositioner\n         *\n         * @type      {Array<number>}\n         * @apioption xAxis.tickPositions\n         */\n        /**\n         * The pixel width of the major tick marks. Defaults to 0 on category\n         * axes, otherwise 1.\n         *\n         * In styled mode, the stroke width is given in the `.highcharts-tick`\n         * class, but in order for the element to be generated on category axes,\n         * the option must be explicitly set to 1.\n         *\n         * @sample {highcharts} highcharts/xaxis/tickwidth/\n         *         10 px width\n         * @sample {highcharts} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/ticks/\n         *         Formatted ticks on X axis\n         * @sample {highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         *\n         * @type      {undefined|number}\n         * @default   {highstock} 1\n         * @default   {highmaps} 0\n         * @apioption xAxis.tickWidth\n         */\n        /**\n         * The axis title, showing next to the axis line.\n         *\n         * @productdesc {highmaps}\n         * In Highmaps, the axis is hidden by default, but adding an axis title\n         * is still possible. X axis and Y axis titles will appear at the bottom\n         * and left by default.\n         */\n        title: {\n            /**\n             * Alignment of the title relative to the axis values. Possible\n             * values are \"low\", \"middle\" or \"high\".\n             *\n             * @sample {highcharts} highcharts/xaxis/title-align-low/\n             *         \"low\"\n             * @sample {highcharts} highcharts/xaxis/title-align-center/\n             *         \"middle\" by default\n             * @sample {highcharts} highcharts/xaxis/title-align-high/\n             *         \"high\"\n             * @sample {highcharts} highcharts/yaxis/title-offset/\n             *         Place the Y axis title on top of the axis\n             * @sample {highstock} stock/xaxis/title-align/\n             *         Aligned to \"high\" value\n             *\n             * @type {Highcharts.AxisTitleAlignValue}\n             */\n            align: 'middle',\n            /**\n             * Deprecated. Set the `text` to `undefined` to disable the title.\n             *\n             * @deprecated\n             * @type      {boolean}\n             * @product   highcharts\n             * @apioption xAxis.title.enabled\n             */\n            /**\n             * The pixel distance between the axis labels or line and the title.\n             * Defaults to 0 for horizontal axes, 10 for vertical\n             *\n             * @sample {highcharts} highcharts/xaxis/title-margin/\n             *         Y axis title margin of 60\n             *\n             * @type      {number}\n             * @apioption xAxis.title.margin\n             */\n            /**\n             * The distance of the axis title from the axis line. By default,\n             * this distance is computed from the offset width of the labels,\n             * the labels' distance from the axis and the title's margin.\n             * However when the offset option is set, it overrides all this.\n             *\n             * @sample {highcharts} highcharts/yaxis/title-offset/\n             *         Place the axis title on top of the axis\n             * @sample {highstock} highcharts/yaxis/title-offset/\n             *         Place the axis title on top of the Y axis\n             *\n             * @type      {number}\n             * @since     2.2.0\n             * @apioption xAxis.title.offset\n             */\n            /**\n             * Whether to reserve space for the title when laying out the axis.\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     5.0.11\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.title.reserveSpace\n             */\n            /**\n             * The rotation of the text in degrees. 0 is horizontal, 270 is\n             * vertical reading from bottom to top. Defaults to 0 for horizontal\n             * axes, 270 for left-side axes and 90 for right-side axes.\n             *\n             * @sample    {highcharts} highcharts/yaxis/title-offset/\n             *            Horizontal\n             *\n             * @type      {number}\n             * @default   undefined\n             * @apioption xAxis.title.rotation\n             */\n            /**\n             * The actual text of the axis title. It can contain basic HTML tags\n             * like `b`, `i` and `span` with style.\n             *\n             * @sample {highcharts} highcharts/xaxis/title-text/\n             *         Custom HTML\n             * @sample {highstock} stock/xaxis/title-text/\n             *         Titles for both axes\n             *\n             * @type      {string|null}\n             * @apioption xAxis.title.text\n             */\n            /**\n             * Alignment of the text, can be `\"left\"`, `\"right\"` or `\"center\"`.\n             * Default alignment depends on the\n             * [title.align](xAxis.title.align):\n             *\n             * Horizontal axes:\n             * - for `align` = `\"low\"`, `textAlign` is set to `left`\n             * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n             * - for `align` = `\"high\"`, `textAlign` is set to `right`\n             *\n             * Vertical axes:\n             * - for `align` = `\"low\"` and `opposite` = `true`, `textAlign` is\n             *   set to `right`\n             * - for `align` = `\"low\"` and `opposite` = `false`, `textAlign` is\n             *   set to `left`\n             * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n             * - for `align` = `\"high\"` and `opposite` = `true` `textAlign` is\n             *   set to `left`\n             * - for `align` = `\"high\"` and `opposite` = `false` `textAlign` is\n             *   set to `right`\n             *\n             * @type      {Highcharts.AlignValue}\n             * @apioption xAxis.title.textAlign\n             */\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the axis title.\n             *\n             * @product   highcharts highstock gantt\n             */\n            useHTML: false,\n            /**\n             * Horizontal pixel offset of the title position.\n             *\n             * @since     4.1.6\n             * @product   highcharts highstock gantt\n             */\n            x: 0,\n            /**\n             * Vertical pixel offset of the title position.\n             *\n             * @product   highcharts highstock gantt\n             */\n            y: 0,\n            /**\n             * CSS styles for the title. If the title text is longer than the\n             * axis length, it will wrap to multiple lines by default. This can\n             * be customized by setting `textOverflow: 'ellipsis'`, by\n             * setting a specific `width` or by setting `whiteSpace: 'nowrap'`.\n             *\n             * In styled mode, the stroke width is given in the\n             * `.highcharts-axis-title` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/title-style/\n             *         Red\n             * @sample {highcharts} highcharts/css/axis/\n             *         Styled mode\n             *\n             * @type    {Highcharts.CSSObject}\n             */\n            style: {\n                /** @internal */\n                color: \"#666666\" /* Palette.neutralColor60 */,\n                /** @internal */\n                fontSize: '0.8em'\n            }\n        },\n        /**\n         * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`\n         * or `category`. In a datetime axis, the numbers are given in\n         * milliseconds, and tick marks are placed on appropriate values like\n         * full hours or days. In a category axis, the\n         * [point names](#series.line.data.name) of the chart's series are used\n         * for categories, if not a [categories](#xAxis.categories) array is\n         * defined.\n         *\n         * @sample {highcharts} highcharts/xaxis/type-linear/\n         *         Linear\n         * @sample {highcharts} highcharts/yaxis/type-log/\n         *         Logarithmic\n         * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n         *         Logarithmic with minor grid lines\n         * @sample {highcharts} highcharts/xaxis/type-log-both/\n         *         Logarithmic on two axes\n         * @sample {highcharts} highcharts/yaxis/type-log-negative/\n         *         Logarithmic with extension to emulate negative values\n         *\n         * @type    {Highcharts.AxisTypeValue}\n         * @default linear\n         * @product highcharts gantt\n         * @apioption xAxis.type\n         */\n        /**\n         * If there are multiple axes on the same side of the chart, the pixel\n         * margin between the axes. Defaults to 0 on vertical axes, 15 on\n         * horizontal axes.\n         *\n         * @type      {number}\n         * @since     7.0.3\n         * @apioption xAxis.margin\n         */\n        /**\n         * Applies only when the axis `type` is `category`. When `uniqueNames`\n         * is true, points are placed on the X axis according to their names.\n         * If the same point name is repeated in the same or another series,\n         * the point is placed on the same X position as other points of the\n         * same name. When `uniqueNames` is false, the points are laid out in\n         * increasing X positions regardless of their names, and the X axis\n         * category will take the name of the last point in each position.\n         *\n         * @sample {highcharts} highcharts/xaxis/uniquenames-true/\n         *         True by default\n         * @sample {highcharts} highcharts/xaxis/uniquenames-false/\n         *         False\n         *\n         * @since     4.2.7\n         * @product   highcharts gantt\n         * @type      {boolean}\n         * @default   true\n         */\n        /**\n         * Datetime axis only. An array determining what time intervals the\n         * ticks are allowed to fall on. Each array item is an array where the\n         * first value is the time unit and the second value another array of\n         * allowed multiples.\n         *\n         * Defaults to:\n         * ```js\n         * units: [[\n         *     'millisecond', // unit name\n         *     [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n         * ], [\n         *     'second',\n         *     [1, 2, 5, 10, 15, 30]\n         * ], [\n         *     'minute',\n         *     [1, 2, 5, 10, 15, 30]\n         * ], [\n         *     'hour',\n         *     [1, 2, 3, 4, 6, 8, 12]\n         * ], [\n         *     'day',\n         *     [1, 2]\n         * ], [\n         *     'week',\n         *     [1, 2]\n         * ], [\n         *     'month',\n         *     [1, 2, 3, 4, 6]\n         * ], [\n         *     'year',\n         *     null\n         * ]]\n         * ```\n         *\n         * @sample {highcharts} highcharts/xaxis/units/\n         *         Axis units demonstrated\n         *\n         * @type      {Array<Array<string,(Array<number>|null)>>}\n         * @product   highcharts highstock gantt\n         * @apioption xAxis.units\n         */\n        /**\n         * Whether axis, including axis title, line, ticks and labels, should\n         * be visible.\n         *\n         * @since     4.1.9\n         * @product   highcharts highstock gantt\n         */\n        visible: true,\n        /**\n         * Color of the minor, secondary grid lines.\n         *\n         * In styled mode, the stroke width is given in the\n         * `.highcharts-minor-grid-line` class.\n         *\n         * @sample {highcharts} highcharts/yaxis/minorgridlinecolor/\n         *         Bright grey lines from Y axis\n         * @sample {highcharts|highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/minorgridlinecolor/\n         *         Bright grey lines from Y axis\n         *\n         * @type    {Highcharts.ColorType}\n         * @default #f2f2f2\n         */\n        minorGridLineColor: \"#f2f2f2\" /* Palette.neutralColor5 */,\n        /**\n         * Width of the minor, secondary grid lines.\n         *\n         * In styled mode, the stroke width is given in the\n         * `.highcharts-grid-line` class.\n         *\n         * @sample {highcharts} highcharts/yaxis/minorgridlinewidth/\n         *         2px lines from Y axis\n         * @sample {highcharts|highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/minorgridlinewidth/\n         *         2px lines from Y axis\n         */\n        minorGridLineWidth: 1,\n        /**\n         * Color for the minor tick marks.\n         *\n         * @sample {highcharts} highcharts/yaxis/minortickcolor/\n         *         Black tick marks on Y axis\n         * @sample {highstock} stock/xaxis/minorticks/\n         *         Black tick marks on Y axis\n         *\n         * @type    {Highcharts.ColorType}\n         * @default #999999\n         */\n        minorTickColor: \"#999999\" /* Palette.neutralColor40 */,\n        /**\n         * The color of the line marking the axis itself.\n         *\n         * In styled mode, the line stroke is given in the\n         * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n         *\n         * @sample {highcharts} highcharts/yaxis/linecolor/\n         *         A red line on Y axis\n         * @sample {highcharts|highstock} highcharts/css/axis/\n         *         Axes in styled mode\n         * @sample {highstock} stock/xaxis/linecolor/\n         *         A red line on X axis\n         *\n         * @type    {Highcharts.ColorType}\n         */\n        lineColor: \"#333333\" /* Palette.neutralColor80 */,\n        /**\n         * The width of the line marking the axis itself.\n         *\n         * In styled mode, the stroke width is given in the\n         * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n         *\n         * @sample {highcharts} highcharts/yaxis/linecolor/\n         *         A 1px line on Y axis\n         * @sample {highcharts|highstock} highcharts/css/axis/\n         *         Axes in styled mode\n         * @sample {highstock} stock/xaxis/linewidth/\n         *         A 2px line on X axis\n         *\n         * @default {highcharts|highstock} 1\n         * @default {highmaps} 0\n         */\n        lineWidth: 1,\n        /**\n         * Color of the grid lines extending the ticks across the plot area.\n         *\n         * In styled mode, the stroke is given in the `.highcharts-grid-line`\n         * class.\n         *\n         * @productdesc {highmaps}\n         * In Highmaps, the grid lines are hidden by default.\n         *\n         * @sample {highcharts} highcharts/yaxis/gridlinecolor/\n         *         Green lines\n         * @sample {highcharts|highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/gridlinecolor/\n         *         Green lines\n         *\n         * @type    {Highcharts.ColorType}\n         * @default #e6e6e6\n         */\n        gridLineColor: \"#e6e6e6\" /* Palette.neutralColor10 */,\n        /**\n         * The width of the grid lines extending the ticks across the plot area.\n         * Defaults to 1 on the Y axis and 0 on the X axis, except for 3d\n         * charts.\n         *\n         * In styled mode, the stroke width is given in the\n         * `.highcharts-grid-line` class.\n         *\n         * @sample {highcharts} highcharts/yaxis/gridlinewidth/\n         *         2px lines\n         * @sample {highcharts|highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/gridlinewidth/\n         *         2px lines\n         *\n         * @type      {number}\n         * @apioption xAxis.gridLineWidth\n         */\n        gridLineWidth: void 0,\n        /**\n         * The height as the vertical axis. If it's a number, it is\n         * interpreted as pixels.\n         *\n         * Since Highcharts 2: If it's a percentage string, it is interpreted\n         * as percentages of the total plot height.\n         *\n         * @sample {highcharts} highcharts/xaxis/axis-position-properties\n         *         Different axis position properties\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption xAxis.height\n         */\n        /**\n         * The width as the horizontal axis. If it's a number, it is interpreted\n         * as pixels.\n         *\n         * Since Highcharts v5.0.13: If it's a percentage string, it is\n         * interpreted as percentages of the total plot width.\n         *\n         * @sample {highcharts} highcharts/xaxis/axis-position-properties\n         *         Different axis position properties\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption xAxis.width\n         */\n        /**\n         * Color for the main tick marks.\n         *\n         * In styled mode, the stroke is given in the `.highcharts-tick`\n         * class.\n         *\n         * @sample {highcharts} highcharts/xaxis/tickcolor/\n         *         Red ticks on X axis\n         * @sample {highcharts|highstock} highcharts/css/axis-grid/\n         *         Styled mode\n         * @sample {highstock} stock/xaxis/ticks/\n         *         Formatted ticks on X axis\n         *\n         * @type    {Highcharts.ColorType}\n         */\n        tickColor: \"#333333\" /* Palette.neutralColor80 */\n        // `tickWidth: 1`\n    };\n    /**\n     * The Z axis or depth axis for 3D plots.\n     *\n     * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n     * access to the axis.\n     *\n     * @sample {highcharts} highcharts/3d/scatter-zaxis-categories/\n     *         Z-Axis with Categories\n     * @sample {highcharts} highcharts/3d/scatter-zaxis-grid/\n     *         Z-Axis with styling\n     *\n     * @type      {*|Array<*>}\n     * @extends   xAxis\n     * @since     5.0.0\n     * @product   highcharts\n     * @excluding breaks, crosshair, height, left, lineColor, lineWidth,\n     *            nameToX, showEmpty, top, width\n     * @apioption zAxis\n     */\n    /**\n     * The Y axis or value axis. Normally this is the vertical axis,\n     * though if the chart is inverted this is the horizontal axis.\n     * In case of multiple axes, the yAxis node is an array of\n     * configuration objects.\n     *\n     * See [the Axis object](/class-reference/Highcharts.Axis) for programmatic\n     * access to the axis.\n     *\n     * @type         {*|Array<*>}\n     * @extends      xAxis\n     * @excluding    currentDateIndicator,ordinal,overscroll\n     * @optionparent yAxis\n     */\n    AxisDefaults.yAxis = {\n        /**\n         * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`,\n         * `category` or `treegrid`. Defaults to `treegrid` for Gantt charts,\n         * `linear` for other chart types.\n         *\n         * In a datetime axis, the numbers are given in milliseconds, and tick\n         * marks are placed on appropriate values, like full hours or days. In a\n         * category or treegrid axis, the [point names](#series.line.data.name)\n         * of the chart's series are used for categories, if a\n         * [categories](#xAxis.categories) array is not defined.\n         *\n         * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n         *         Logarithmic with minor grid lines\n         * @sample {highcharts} highcharts/yaxis/type-log-negative/\n         *         Logarithmic with extension to emulate negative values\n         * @sample {gantt} gantt/treegrid-axis/demo\n         *         Treegrid axis\n         *\n         * @type      {Highcharts.AxisTypeValue}\n         * @default   {highcharts} linear\n         * @default   {gantt} treegrid\n         * @product   highcharts gantt\n         * @apioption yAxis.type\n         */\n        /**\n         * The height of the Y axis. If it's a number, it is interpreted as\n         * pixels.\n         *\n         * Since Highcharts 2: If it's a percentage string, it is interpreted as\n         * percentages of the total plot height.\n         *\n         * @see [yAxis.top](#yAxis.top)\n         *\n         * @sample {highstock} stock/demo/candlestick-and-volume/\n         *         Percentage height panes\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption yAxis.height\n         */\n        /**\n         * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n         * to represent the maximum value of the Y axis.\n         *\n         * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n         *         Min and max colors\n         *\n         * @type      {Highcharts.ColorType}\n         * @default   #003399\n         * @since     4.0\n         * @product   highcharts\n         * @apioption yAxis.maxColor\n         */\n        /**\n         * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n         * to represent the minimum value of the Y axis.\n         *\n         * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n         *         Min and max color\n         *\n         * @type      {Highcharts.ColorType}\n         * @default   #e6ebf5\n         * @since     4.0\n         * @product   highcharts\n         * @apioption yAxis.minColor\n         */\n        /**\n         * Whether to reverse the axis so that the highest number is closest\n         * to the origin.\n         *\n         * @sample {highcharts} highcharts/yaxis/reversed/\n         *         Reversed Y axis\n         * @sample {highstock} stock/xaxis/reversed/\n         *         Reversed Y axis\n         *\n         * @type      {boolean}\n         * @default   {highcharts} false\n         * @default   {highstock} false\n         * @default   {highmaps} true\n         * @default   {gantt} true\n         * @apioption yAxis.reversed\n         */\n        /**\n         * If `true`, the first series in a stack will be drawn on top in a\n         * positive, non-reversed Y axis. If `false`, the first series is in\n         * the base of the stack.\n         *\n         * @sample {highcharts} highcharts/yaxis/reversedstacks-false/\n         *         Non-reversed stacks\n         * @sample {highstock} highcharts/yaxis/reversedstacks-false/\n         *         Non-reversed stacks\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     3.0.10\n         * @product   highcharts highstock\n         * @apioption yAxis.reversedStacks\n         */\n        reversedStacks: true,\n        /**\n         * Solid gauge series only. Color stops for the solid gauge. Use this\n         * in cases where a linear gradient between a `minColor` and `maxColor`\n         * is not sufficient. The stops is an array of tuples, where the first\n         * item is a float between 0 and 1 assigning the relative position in\n         * the gradient, and the second item is the color.\n         *\n         * For solid gauges, the Y axis also inherits the concept of\n         * [data classes](https://api.highcharts.com/highmaps#colorAxis.dataClasses)\n         * from the Highmaps color axis.\n         *\n         * @sample {highcharts} highcharts/demo/gauge-solid/\n         *         Gauge with stops\n         *\n         * @see [minColor](#yAxis.minColor)\n         * @see [maxColor](#yAxis.maxColor)\n         *\n         * @type      {Array<Array<number,Highcharts.ColorType>>}\n         * @since     4.0\n         * @product   highcharts\n         * @apioption yAxis.stops\n         */\n        /**\n         * The pixel width of the major tick marks.\n         *\n         * @sample {highcharts} highcharts/xaxis/tickwidth/ 10 px width\n         * @sample {highstock} stock/xaxis/ticks/ Formatted ticks on X axis\n         *\n         * @type      {number}\n         * @default   0\n         * @product   highcharts highstock gantt\n         * @apioption yAxis.tickWidth\n         */\n        /**\n         * Whether to force the axis to end on a tick. Use this option with\n         * the `maxPadding` option to control the axis end.\n         *\n         * This option is always disabled, when panning type is\n         * either `y` or `xy`.\n         *\n         * @see [type](#chart.panning.type)\n         *\n         *\n         * @sample {highcharts} highcharts/yaxis/endontick/\n         *         True by default\n         * @sample {highcharts} highcharts/yaxis/endontick-false/\n         *         False\n         * @sample {highstock} stock/demo/basic-line/\n         *         True by default\n         * @sample {highstock} stock/xaxis/endontick/\n         *         False for Y axis\n         *\n         * @since 1.2.0\n         */\n        endOnTick: true,\n        /**\n         * Padding of the max value relative to the length of the axis. A\n         * padding of 0.05 will make a 100px axis 5px longer. This is useful\n         * when you don't want the highest data value to appear on the edge\n         * of the plot area. When the axis' `max` option is set or a max extreme\n         * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n         *\n         * Also the `softThreshold` option takes precedence over `maxPadding`,\n         * so if the data is tangent to the threshold, `maxPadding` may not\n         * apply unless `softThreshold` is set to false.\n         *\n         * @sample {highcharts} highcharts/yaxis/maxpadding-02/\n         *         Max padding of 0.2\n         * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n         *         Greater min- and maxPadding\n         *\n         * @since   1.2.0\n         * @product highcharts highstock gantt\n         */\n        maxPadding: 0.05,\n        /**\n         * Padding of the min value relative to the length of the axis. A\n         * padding of 0.05 will make a 100px axis 5px longer. This is useful\n         * when you don't want the lowest data value to appear on the edge\n         * of the plot area. When the axis' `min` option is set or a max extreme\n         * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n         *\n         * Also the `softThreshold` option takes precedence over `minPadding`,\n         * so if the data is tangent to the threshold, `minPadding` may not\n         * apply unless `softThreshold` is set to false.\n         *\n         * @sample {highcharts} highcharts/yaxis/minpadding/\n         *         Min padding of 0.2\n         * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n         *         Greater min- and maxPadding\n         *\n         * @since   1.2.0\n         * @product highcharts highstock gantt\n         */\n        minPadding: 0.05,\n        /**\n         * @productdesc {highstock}\n         * In Highcharts Stock 1.x, the Y axis was placed\n         * on the left side by default.\n         *\n         * @sample {highcharts} highcharts/yaxis/opposite/\n         *         Secondary Y axis opposite\n         * @sample {highstock} stock/xaxis/opposite/\n         *         Y axis on left side\n         *\n         * @type      {boolean}\n         * @default   {highstock} true\n         * @default   {highcharts} false\n         * @product   highstock highcharts gantt\n         * @apioption yAxis.opposite\n         */\n        /**\n         * @see [tickInterval](#xAxis.tickInterval)\n         * @see [tickPositioner](#xAxis.tickPositioner)\n         * @see [tickPositions](#xAxis.tickPositions)\n         */\n        tickPixelInterval: 72,\n        /**\n         * Whether to show the last tick label.\n         *\n         * @productdesc {highcharts|gantt}\n         * Defaults to `true` on cartesian charts, and `false` on polar charts.\n         *\n         * @productdesc {highstock}\n         * Defaults to `true` for categorized yAxis and `false` for other types\n         * of yAxis.\n         *\n         * @default undefined\n         */\n        showLastLabel: true,\n        /**\n         * @extends xAxis.labels\n         */\n        labels: {\n            /**\n             * The label's pixel distance from the perimeter of the plot area.\n             * On cartesian charts, this is overridden if the `labels.y` setting\n             * is set.\n             *\n             * On polar charts, if it's a percentage string, it is interpreted\n             * the same as [series.radius](#plotOptions.gauge.radius), so the\n             * label can be aligned under the gauge's shape.\n             *\n             * @sample {highcharts} highcharts/yaxis/labels-distance/\n             *         Polar chart, labels centered under the arc\n             *\n             * @type      {number|string}\n             * @product   highcharts\n             * @apioption yAxis.labels.distance\n             */\n            /**\n             * The y position offset of all labels relative to the tick\n             * positions on the axis. For polar and radial axis consider the use\n             * of the [distance](#yAxis.labels.distance) option.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-x/\n             *         Y axis labels placed on grid lines\n             *\n             * @type      {number}\n             * @default   {highcharts} 3\n             * @default   {highstock} -2\n             * @default   {highmaps} 3\n             * @apioption yAxis.labels.y\n             */\n            /**\n             * What part of the string the given position is anchored to. Can\n             * be one of `\"left\"`, `\"center\"` or `\"right\"`. The exact position\n             * also depends on the `labels.x` setting.\n             *\n             * Angular gauges and solid gauges defaults to `\"center\"`.\n             * Solid gauges with two labels have additional option `\"auto\"`\n             * for automatic horizontal and vertical alignment.\n             *\n             * @sample {highcharts} highcharts/yaxis/labels-align-left/\n             *         Left\n             * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n             *         Solid gauge labels auto aligned\n             *\n             * @type       {Highcharts.AlignValue}\n             * @default    {highstock} right\n             * @apioption  yAxis.labels.align\n             */\n            /**\n             * The x position offset of all labels relative to the tick\n             * positions on the axis. Defaults to -15 for left axis, 15 for\n             * right axis.\n             *\n             * @sample {highcharts} highcharts/xaxis/labels-x/\n             *         Y axis labels placed on grid lines\n             *\n             * @type {number}\n             */\n            x: void 0\n        },\n        /**\n         * @sample {highcharts} highcharts/yaxis/max-200/\n         *         Y axis max of 200\n         * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n         *         Y axis max on logarithmic axis\n         * @sample {highstock} stock/yaxis/min-max/\n         *         Fixed min and max on Y axis\n         *\n         * @apioption yAxis.max\n         */\n        /**\n         * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n         *         -50 with startOnTick to false\n         * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n         *         -50 with startOnTick true by default\n         * @sample {highstock} stock/yaxis/min-max/\n         *         Fixed min and max on Y axis\n         *\n         * @apioption yAxis.min\n         */\n        /**\n         * An optional scrollbar to display on the Y axis in response to\n         * limiting the minimum an maximum of the axis values.\n         *\n         * In styled mode, all the presentational options for the scrollbar\n         * are replaced by the classes `.highcharts-scrollbar-thumb`,\n         * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n         * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n         *\n         * @sample {highstock} stock/yaxis/scrollbar/\n         *         Scrollbar on the Y axis\n         *\n         * @extends   scrollbar\n         * @since     4.2.6\n         * @product   highstock\n         * @excluding height\n         * @apioption yAxis.scrollbar\n         */\n        /**\n         * Enable the scrollbar on the Y axis.\n         *\n         * @sample {highstock} stock/yaxis/scrollbar/\n         *         Enabled on Y axis\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption yAxis.scrollbar.enabled\n         */\n        /**\n         * Pixel margin between the scrollbar and the axis elements.\n         *\n         * @type      {number}\n         * @default   10\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption yAxis.scrollbar.margin\n         */\n        /* eslint-disable highcharts/doclet-apioption-last */\n        /**\n         * Defines the position of the scrollbar. By default, it is positioned\n         * on the opposite of the main axis (right side of the chart).\n         * However, in the case of RTL languages could be set to `false`\n         * which positions the scrollbar on the left.\n         *\n         * Works only for vertical axes.\n         * This means yAxis in a non-inverted chart and xAxis in the inverted.\n         *\n         * @sample stock/yaxis/scrollbar-opposite/\n         *         A scrollbar not on the opposite side\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since 9.3.0\n         *\n         * @apioption yAxis.scrollbar.opposite\n         * @apioption xAxis.scrollbar.opposite\n         *\n         */\n        /* eslint-enable highcharts/doclet-apioption-last */\n        /**\n         * Whether to show the scrollbar when it is fully zoomed out at max\n         * range. Setting it to `false` on the Y axis makes the scrollbar stay\n         * hidden until the user zooms in, like common in browsers.\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption yAxis.scrollbar.showFull\n         */\n        /**\n         * The width of a vertical scrollbar or height of a horizontal\n         * scrollbar. Defaults to 20 on touch devices.\n         *\n         * @type      {number}\n         * @default   14\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption yAxis.scrollbar.size\n         */\n        /**\n         * Z index of the scrollbar elements.\n         *\n         * @type      {number}\n         * @default   3\n         * @since     4.2.6\n         * @product   highstock\n         * @apioption yAxis.scrollbar.zIndex\n         */\n        /**\n         * A soft maximum for the axis. If the series data maximum is less\n         * than this, the axis will stay at this maximum, but if the series\n         * data maximum is higher, the axis will flex to show all data.\n         *\n         * **Note**: The [series.softThreshold](\n         * #plotOptions.series.softThreshold) option takes precedence over this\n         * option.\n         *\n         * @sample highcharts/yaxis/softmin-softmax/\n         *         Soft min and max\n         *\n         * @type      {number}\n         * @since     5.0.1\n         * @product   highcharts highstock gantt\n         * @apioption yAxis.softMax\n         */\n        /**\n         * A soft minimum for the axis. If the series data minimum is greater\n         * than this, the axis will stay at this minimum, but if the series\n         * data minimum is lower, the axis will flex to show all data.\n         *\n         * **Note**: The [series.softThreshold](\n         * #plotOptions.series.softThreshold) option takes precedence over this\n         * option.\n         *\n         * @sample highcharts/yaxis/softmin-softmax/\n         *         Soft min and max\n         *\n         * @type      {number}\n         * @since     5.0.1\n         * @product   highcharts highstock gantt\n         * @apioption yAxis.softMin\n         */\n        /**\n         * Defines the horizontal alignment of the stack total label. Can be one\n         * of `\"left\"`, `\"center\"` or `\"right\"`. The default value is calculated\n         * at runtime and depends on orientation and whether the stack is\n         * positive or negative.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-align-left/\n         *         Aligned to the left\n         * @sample {highcharts} highcharts/yaxis/stacklabels-align-center/\n         *         Aligned in center\n         * @sample {highcharts} highcharts/yaxis/stacklabels-align-right/\n         *         Aligned to the right\n         *\n         * @type      {Highcharts.AlignValue}\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.align\n         */\n        /**\n         * A format string for the data label. Available variables are the same\n         * as for `formatter`.\n         *\n         * @type      {string}\n         * @default   {total}\n         * @since     3.0.2\n         * @product   highcharts highstock\n         * @apioption yAxis.stackLabels.format\n         */\n        /**\n         * Rotation of the labels in degrees.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-rotation/\n         *         Labels rotated 45°\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.rotation\n         */\n        /**\n         * The text alignment for the label. While `align` determines where the\n         * texts anchor point is placed with regards to the stack, `textAlign`\n         * determines how the text is aligned against its anchor point. Possible\n         * values are `\"left\"`, `\"center\"` and `\"right\"`. The default value is\n         * calculated at runtime and depends on orientation and whether the\n         * stack is positive or negative.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-textalign-left/\n         *         Label in center position but text-aligned left\n         *\n         * @type      {Highcharts.AlignValue}\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.textAlign\n         */\n        /**\n         * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the labels.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     3.0\n         * @product   highcharts highstock\n         * @apioption yAxis.stackLabels.useHTML\n         */\n        /**\n         * Defines the vertical alignment of the stack total label. Can be one\n         * of `\"top\"`, `\"middle\"` or `\"bottom\"`. The default value is calculated\n         * at runtime and depends on orientation and whether the stack is\n         * positive or negative.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-top/\n         *         Vertically aligned top\n         * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-middle/\n         *         Vertically aligned middle\n         * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-bottom/\n         *         Vertically aligned bottom\n         *\n         * @type      {Highcharts.VerticalAlignValue}\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.verticalAlign\n         */\n        /**\n         * The x position offset of the label relative to the left of the\n         * stacked bar. The default value is calculated at runtime and depends\n         * on orientation and whether the stack is positive or negative.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-x/\n         *         Stack total labels with x offset\n         *\n         * @type      {number}\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.x\n         */\n        /**\n         * The y position offset of the label relative to the tick position\n         * on the axis. The default value is calculated at runtime and depends\n         * on orientation and whether the stack is positive or negative.\n         *\n         * @sample {highcharts} highcharts/yaxis/stacklabels-y/\n         *         Stack total labels with y offset\n         *\n         * @type      {number}\n         * @since     2.1.5\n         * @product   highcharts\n         * @apioption yAxis.stackLabels.y\n         */\n        /**\n         * Whether to force the axis to start on a tick. Use this option with\n         * the `maxPadding` option to control the axis start.\n         *\n         * This option is always disabled, when panning type is\n         * either `y` or `xy`.\n         *\n         * @see [type](#chart.panning.type)\n         *\n         * @sample {highcharts} highcharts/xaxis/startontick-false/\n         *         False by default\n         * @sample {highcharts} highcharts/xaxis/startontick-true/\n         *         True\n         * @sample {highstock} stock/xaxis/endontick/\n         *         False for Y axis\n         *\n         * @since   1.2.0\n         * @product highcharts highstock gantt\n         */\n        startOnTick: true,\n        title: {\n            /**\n             * The pixel distance between the axis labels and the title.\n             * Positive values are outside the axis line, negative are inside.\n             *\n             * @sample {highcharts} highcharts/xaxis/title-margin/\n             *         Y axis title margin of 60\n             *\n             * @type      {number}\n             * @default   40\n             * @apioption yAxis.title.margin\n             */\n            /**\n             * The actual text of the axis title. Horizontal texts can contain\n             * HTML, but rotated texts are painted using vector techniques and\n             * must be clean text. The Y axis title is disabled by setting the\n             * `text` option to `undefined`.\n             *\n             * @sample {highcharts} highcharts/xaxis/title-text/\n             *         Custom HTML\n             *\n             * @type    {string|null}\n             * @default {highcharts} Values\n             * @default {highstock} undefined\n             * @product highcharts highstock gantt\n             */\n            text: 'Values'\n        },\n        /**\n         * The top position of the Y axis. If it's a number, it is interpreted\n         * as pixel position relative to the chart.\n         *\n         * Since Highcharts 2: If it's a percentage string, it is interpreted as\n         * percentages of the plot height, offset from plot area top.\n         *\n         * @see [yAxis.height](#yAxis.height)\n         *\n         * @sample {highstock} stock/demo/candlestick-and-volume/\n         *         Percentage height panes\n         *\n         * @type      {number|string}\n         * @product   highcharts highstock\n         * @apioption yAxis.top\n         */\n        /**\n         * The stack labels show the total value for each bar in a stacked\n         * column or bar chart. The label will be placed on top of positive\n         * columns and below negative columns. In case of an inverted column\n         * chart or a bar chart the label is placed to the right of positive\n         * bars and to the left of negative bars.\n         *\n         * @product highcharts\n         */\n        stackLabels: {\n            /**\n             * Enable or disable the initial animation when a series is\n             * displayed for the `stackLabels`. The animation can also be set as\n             * a configuration object. Please note that this option only\n             * applies to the initial animation.\n             * For other animations, see [chart.animation](#chart.animation)\n             * and the animation parameter under the API methods.\n             * The following properties are supported:\n             *\n             * - `defer`: The animation delay time in milliseconds.\n             *\n             * @sample {highcharts} highcharts/plotoptions/animation-defer/\n             *          Animation defer settings\n             * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n             * @since 8.2.0\n             * @apioption yAxis.stackLabels.animation\n             */\n            animation: {},\n            /**\n             * The animation delay time in milliseconds.\n             * Set to `0` renders stackLabel immediately.\n             * As `undefined` inherits defer time from the [series.animation.defer](#plotOptions.series.animation.defer).\n             *\n             * @type      {number}\n             * @since 8.2.0\n             * @apioption yAxis.stackLabels.animation.defer\n             */\n            /**\n             * Allow the stack labels to overlap.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-allowoverlap-false/\n             *         Default false\n             *\n             * @since   5.0.13\n             * @product highcharts\n             */\n            allowOverlap: false,\n            /**\n             * The background color or gradient for the stack label.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n             *          Stack labels box options\n             * @type      {Highcharts.ColorType}\n             * @since 8.1.0\n             * @apioption yAxis.stackLabels.backgroundColor\n             */\n            /**\n             * The border color for the stack label. Defaults to `undefined`.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n             *          Stack labels box options\n             * @type      {Highcharts.ColorType}\n             * @since 8.1.0\n             * @apioption yAxis.stackLabels.borderColor\n             */\n            /**\n             * The border radius in pixels for the stack label.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n             *          Stack labels box options\n             * @type      {number}\n             * @default   0\n             * @since 8.1.0\n             * @apioption yAxis.stackLabels.borderRadius\n             */\n            /**\n             * The border width in pixels for the stack label.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n             *          Stack labels box options\n             * @type      {number}\n             * @default   0\n             * @since 8.1.0\n             * @apioption yAxis.stackLabels.borderWidth\n             */\n            /**\n             * Enable or disable the stack total labels.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-enabled/\n             *         Enabled stack total labels\n             * @sample {highcharts} highcharts/yaxis/stacklabels-enabled-waterfall/\n             *         Enabled stack labels in waterfall chart\n             *\n             * @since   2.1.5\n             * @product highcharts\n             */\n            enabled: false,\n            /**\n             * Whether to hide stack labels that are outside the plot area.\n             * By default, the stack label is moved\n             * inside the plot area according to the\n             * [overflow](/highcharts/#yAxis/stackLabels/overflow)\n             * option.\n             *\n             * @type  {boolean}\n             * @since 7.1.3\n             */\n            crop: true,\n            /**\n             * How to handle stack total labels that flow outside the plot area.\n             * The default is set to `\"justify\"`,\n             * which aligns them inside the plot area.\n             * For columns and bars, this means it will be moved inside the bar.\n             * To display stack labels outside the plot area,\n             * set `crop` to `false` and `overflow` to `\"allow\"`.\n             *\n             * @sample highcharts/yaxis/stacklabels-overflow/\n             *         Stack labels flows outside the plot area.\n             *\n             * @type  {Highcharts.DataLabelsOverflowValue}\n             * @since 7.1.3\n             */\n            overflow: 'justify',\n            /* eslint-disable valid-jsdoc */\n            /**\n             * Callback JavaScript function to format the label. The value is\n             * given by `this.total`.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-formatter/\n             *         Added units to stack total value\n             *\n             * @type    {Highcharts.FormatterCallbackFunction<Highcharts.StackItemObject>}\n             * @since   2.1.5\n             * @product highcharts\n             */\n            formatter: function () {\n                const { numberFormatter } = this.axis.chart;\n                /* eslint-enable valid-jsdoc */\n                return numberFormatter(this.total || 0, -1);\n            },\n            /**\n             * CSS styles for the label.\n             *\n             * In styled mode, the styles are set in the\n             * `.highcharts-stack-label` class.\n             *\n             * @sample {highcharts} highcharts/yaxis/stacklabels-style/\n             *         Red stack total labels\n             *\n             * @type    {Highcharts.CSSObject}\n             * @since   2.1.5\n             * @product highcharts\n             */\n            style: {\n                /** @internal */\n                color: \"#000000\" /* Palette.neutralColor100 */,\n                /** @internal */\n                fontSize: '0.7em',\n                /** @internal */\n                fontWeight: 'bold',\n                /** @internal */\n                textOutline: '1px contrast'\n            }\n        },\n        gridLineWidth: 1,\n        lineWidth: 0\n    };\n})(AxisDefaults || (AxisDefaults = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default AxisDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport AxisDefaults from './AxisDefaults.js';\nconst { xAxis, yAxis } = AxisDefaults;\nimport Color from '../Color/Color.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport F from '../Foundation.js';\nconst { registerEventOptions } = F;\nimport H from '../Globals.js';\nconst { deg2rad } = H;\nimport Tick from './Tick.js';\nimport U from '../Utilities.js';\nconst { arrayMax, arrayMin, clamp, correctFloat, defined, destroyObjectProperties, erase, error, extend, fireEvent, getClosestDistance, insertItem, isArray, isNumber, isString, merge, normalizeTickInterval, objectEach, pick, relativeLength, removeEvent, splat, syncTimeout } = U;\nconst getNormalizedTickInterval = (axis, tickInterval) => normalizeTickInterval(tickInterval, void 0, void 0, pick(axis.options.allowDecimals, \n// If the tick interval is greater than 0.5, avoid decimals, as\n// linear axes are often used to render discrete values (#3363). If\n// a tick amount is set, allow decimals by default, as it increases\n// the chances for a good fit.\ntickInterval < 0.5 || axis.tickAmount !== void 0), !!axis.tickAmount);\nextend(defaultOptions, { xAxis, yAxis: merge(xAxis, yAxis) });\n/* *\n *\n *  Class\n *\n * */\n/**\n * Create a new axis object. Called internally when instantiating a new chart or\n * adding axes by {@link Highcharts.Chart#addAxis}.\n *\n * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n * series cartesian chart, there is one X axis and one Y axis.\n *\n * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n * an array of Axis objects. If there is only one axis, it can be referenced\n * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n * pattern goes for Y axes.\n *\n * If you need to get the axes from a series object, use the `series.xAxis` and\n * `series.yAxis` properties. These are not arrays, as one series can only be\n * associated to one X and one Y axis.\n *\n * A third way to reference the axis programmatically is by `id`. Add an `id` in\n * the axis configuration options, and get the axis by\n * {@link Highcharts.Chart#get}.\n *\n * Configuration options for the axes are given in options.xAxis and\n * options.yAxis.\n *\n * @class\n * @name Highcharts.Axis\n *\n * @param {Highcharts.Chart} chart\n * The Chart instance to apply the axis on.\n *\n * @param {Highcharts.AxisOptions} userOptions\n * Axis options\n */\nclass Axis {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(chart, userOptions, coll) {\n        this.init(chart, userOptions, coll);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Overrideable function to initialize the axis.\n     *\n     * @see {@link Axis}\n     *\n     * @function Highcharts.Axis#init\n     *\n     * @param {Highcharts.Chart} chart\n     * The Chart instance to apply the axis on.\n     *\n     * @param {AxisOptions} userOptions\n     * Axis options.\n     *\n     * @emits Highcharts.Axis#event:afterInit\n     * @emits Highcharts.Axis#event:init\n     */\n    init(chart, userOptions, coll = this.coll) {\n        const isXAxis = coll === 'xAxis', axis = this, horiz = axis.isZAxis || (chart.inverted ? !isXAxis : isXAxis);\n        /**\n         * The Chart that the axis belongs to.\n         *\n         * @name Highcharts.Axis#chart\n         * @type {Highcharts.Chart}\n         */\n        axis.chart = chart;\n        /**\n         * Whether the axis is horizontal.\n         *\n         * @name Highcharts.Axis#horiz\n         * @type {boolean|undefined}\n         */\n        axis.horiz = horiz;\n        /**\n         * Whether the axis is the x-axis.\n         *\n         * @name Highcharts.Axis#isXAxis\n         * @type {boolean|undefined}\n         */\n        axis.isXAxis = isXAxis;\n        /**\n         * The collection where the axis belongs, for example `xAxis`, `yAxis`\n         * or `colorAxis`. Corresponds to properties on Chart, for example\n         * {@link Chart.xAxis}.\n         *\n         * @name Highcharts.Axis#coll\n         * @type {string}\n         */\n        axis.coll = coll;\n        fireEvent(this, 'init', { userOptions: userOptions });\n        // Needed in setOptions\n        axis.opposite = pick(userOptions.opposite, axis.opposite);\n        /**\n         * The side on which the axis is rendered. 0 is top, 1 is right, 2\n         * is bottom and 3 is left.\n         *\n         * @name Highcharts.Axis#side\n         * @type {number}\n         */\n        axis.side = pick(userOptions.side, axis.side, (horiz ?\n            (axis.opposite ? 0 : 2) : // Top : bottom\n            (axis.opposite ? 1 : 3)) // Right : left\n        );\n        /**\n         * Current options for the axis after merge of defaults and user's\n         * options.\n         *\n         * @name Highcharts.Axis#options\n         * @type {Highcharts.AxisOptions}\n         */\n        axis.setOptions(userOptions);\n        const options = axis.options, labelsOptions = options.labels;\n        // Set the type and fire an event\n        axis.type ?? (axis.type = options.type || 'linear');\n        axis.uniqueNames ?? (axis.uniqueNames = options.uniqueNames ?? true);\n        fireEvent(axis, 'afterSetType');\n        /**\n         * User's options for this axis without defaults.\n         *\n         * @name Highcharts.Axis#userOptions\n         * @type {Highcharts.AxisOptions}\n         */\n        axis.userOptions = userOptions;\n        axis.minPixelPadding = 0;\n        /**\n         * Whether the axis is reversed. Based on the `axis.reversed`,\n         * option, but inverted charts have reversed xAxis by default.\n         *\n         * @name Highcharts.Axis#reversed\n         * @type {boolean}\n         */\n        axis.reversed = pick(options.reversed, axis.reversed);\n        axis.visible = options.visible;\n        axis.zoomEnabled = options.zoomEnabled;\n        // Initial categories\n        axis.hasNames = this.type === 'category' || options.categories === true;\n        /**\n         * If categories are present for the axis, names are used instead of\n         * numbers for that axis.\n         *\n         * Since Highcharts 3.0, categories can also be extracted by giving each\n         * point a name and setting axis type to `category`. However, if you\n         * have multiple series, best practice remains defining the `categories`\n         * array.\n         *\n         * @see [xAxis.categories](/highcharts/xAxis.categories)\n         *\n         * @name Highcharts.Axis#categories\n         * @type {Array<string>}\n         * @readonly\n         */\n        axis.categories = (isArray(options.categories) && options.categories) ||\n            (axis.hasNames ? [] : void 0);\n        if (!axis.names) { // Preserve on update (#3830)\n            axis.names = [];\n            axis.names.keys = {};\n        }\n        // Placeholder for plotlines and plotbands groups\n        axis.plotLinesAndBandsGroups = {};\n        // Shorthand types\n        axis.positiveValuesOnly = !!axis.logarithmic;\n        // Flag, if axis is linked to another axis\n        axis.isLinked = defined(options.linkedTo);\n        /**\n         * List of major ticks mapped by position on axis.\n         *\n         * @see {@link Highcharts.Tick}\n         *\n         * @name Highcharts.Axis#ticks\n         * @type {Highcharts.Dictionary<Highcharts.Tick>}\n         */\n        axis.ticks = {};\n        axis.labelEdge = [];\n        /**\n         * List of minor ticks mapped by position on the axis.\n         *\n         * @see {@link Highcharts.Tick}\n         *\n         * @name Highcharts.Axis#minorTicks\n         * @type {Highcharts.Dictionary<Highcharts.Tick>}\n         */\n        axis.minorTicks = {};\n        // List of plotLines/Bands\n        axis.plotLinesAndBands = [];\n        // Alternate bands\n        axis.alternateBands = {};\n        /**\n         * The length of the axis in terms of pixels.\n         *\n         * @name Highcharts.Axis#len\n         * @type {number}\n         */\n        axis.len ?? (axis.len = 0);\n        axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n        axis.range = options.range;\n        axis.offset = options.offset || 0;\n        /**\n         * The maximum value of the axis. In a logarithmic axis, this is the\n         * logarithm of the real value, and the real value can be obtained from\n         * {@link Axis#getExtremes}.\n         *\n         * @name Highcharts.Axis#max\n         * @type {number|undefined}\n         */\n        axis.max = void 0;\n        /**\n         * The minimum value of the axis. In a logarithmic axis, this is the\n         * logarithm of the real value, and the real value can be obtained from\n         * {@link Axis#getExtremes}.\n         *\n         * @name Highcharts.Axis#min\n         * @type {number|undefined}\n         */\n        axis.min = void 0;\n        /**\n         * The processed crosshair options.\n         *\n         * @name Highcharts.Axis#crosshair\n         * @type {boolean|Highcharts.AxisCrosshairOptions}\n         */\n        const crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1]);\n        axis.crosshair = crosshair === true ? {} : crosshair;\n        // Register. Don't add it again on Axis.update().\n        if (chart.axes.indexOf(axis) === -1) { //\n            if (isXAxis) { // #2713\n                chart.axes.splice(chart.xAxis.length, 0, axis);\n            }\n            else {\n                chart.axes.push(axis);\n            }\n            insertItem(this, chart[this.coll]);\n        }\n        chart.orderItems(axis.coll);\n        /**\n         * All series associated to the axis.\n         *\n         * @name Highcharts.Axis#series\n         * @type {Array<Highcharts.Series>}\n         */\n        axis.series = axis.series || []; // Populated by Series\n        // Reversed axis\n        if (chart.inverted &&\n            !axis.isZAxis &&\n            isXAxis &&\n            !defined(axis.reversed)) {\n            axis.reversed = true;\n        }\n        axis.labelRotation = isNumber(labelsOptions.rotation) ?\n            labelsOptions.rotation :\n            void 0;\n        // Register event listeners\n        registerEventOptions(axis, options);\n        fireEvent(this, 'afterInit');\n    }\n    /**\n     * Merge and set options.\n     *\n     * @private\n     * @function Highcharts.Axis#setOptions\n     *\n     * @param {Highcharts.AxisOptions} userOptions\n     * Axis options.\n     *\n     * @emits Highcharts.Axis#event:afterSetOptions\n     */\n    setOptions(userOptions) {\n        const sideSpecific = this.horiz ?\n            // Top and bottom axis defaults\n            {\n                labels: {\n                    autoRotation: [-45],\n                    padding: 4\n                },\n                margin: 15\n            } :\n            // Left and right axis, title rotated 90 or 270 degrees\n            // respectively\n            {\n                labels: {\n                    padding: 1\n                },\n                title: {\n                    rotation: 90 * this.side\n                }\n            };\n        this.options = merge(sideSpecific, defaultOptions[this.coll], userOptions);\n        fireEvent(this, 'afterSetOptions', { userOptions });\n    }\n    /**\n     * The default label formatter. The context is a special config object for\n     * the label. In apps, use the\n     * [labels.formatter](https://api.highcharts.com/highcharts/xAxis.labels.formatter)\n     * instead, except when a modification is needed.\n     *\n     * @function Highcharts.Axis#defaultLabelFormatter\n     *\n     * @param {Highcharts.AxisLabelsFormatterContextObject} this\n     * Formatter context of axis label.\n     *\n     * @param {Highcharts.AxisLabelsFormatterContextObject} [ctx]\n     * Formatter context of axis label.\n     *\n     * @return {string}\n     * The formatted label content.\n     */\n    defaultLabelFormatter() {\n        const axis = this.axis, chart = this.chart, { numberFormatter } = chart, value = isNumber(this.value) ? this.value : NaN, time = axis.chart.time, categories = axis.categories, dateTimeLabelFormat = this.dateTimeLabelFormat, lang = defaultOptions.lang, numericSymbols = lang.numericSymbols, numSymMagnitude = lang.numericSymbolMagnitude || 1000, \n        // Make sure the same symbol is added for all labels on a linear\n        // axis\n        numericSymbolDetector = axis.logarithmic ?\n            Math.abs(value) :\n            axis.tickInterval;\n        let i = numericSymbols && numericSymbols.length, multi, ret;\n        if (categories) {\n            ret = `${this.value}`;\n        }\n        else if (dateTimeLabelFormat) { // Datetime axis\n            ret = time.dateFormat(dateTimeLabelFormat, value);\n        }\n        else if (i &&\n            numericSymbols &&\n            numericSymbolDetector >= 1000) {\n            // Decide whether we should add a numeric symbol like k (thousands)\n            // or M (millions). If we are to enable this in tooltip or other\n            // places as well, we can move this logic to the numberFormatter and\n            // enable it by a parameter.\n            while (i-- && typeof ret === 'undefined') {\n                multi = Math.pow(numSymMagnitude, i + 1);\n                if (\n                // Only accept a numeric symbol when the distance is more\n                // than a full unit. So for example if the symbol is k, we\n                // don't accept numbers like 0.5k.\n                numericSymbolDetector >= multi &&\n                    // Accept one decimal before the symbol. Accepts 0.5k but\n                    // not 0.25k. How does this work with the previous?\n                    (value * 10) % multi === 0 &&\n                    numericSymbols[i] !== null &&\n                    value !== 0) { // #5480\n                    ret = numberFormatter(value / multi, -1) + numericSymbols[i];\n                }\n            }\n        }\n        if (typeof ret === 'undefined') {\n            if (Math.abs(value) >= 10000) { // Add thousands separators\n                ret = numberFormatter(value, -1);\n            }\n            else { // Small numbers\n                ret = numberFormatter(value, -1, void 0, ''); // #2466\n            }\n        }\n        return ret;\n    }\n    /**\n     * Get the minimum and maximum for the series of each axis. The function\n     * analyzes the axis series and updates `this.dataMin` and `this.dataMax`.\n     *\n     * @private\n     * @function Highcharts.Axis#getSeriesExtremes\n     *\n     * @emits Highcharts.Axis#event:afterGetSeriesExtremes\n     * @emits Highcharts.Axis#event:getSeriesExtremes\n     */\n    getSeriesExtremes() {\n        const axis = this;\n        let xExtremes;\n        fireEvent(this, 'getSeriesExtremes', null, function () {\n            axis.hasVisibleSeries = false;\n            // Reset properties in case we're redrawing (#3353)\n            axis.dataMin = axis.dataMax = axis.threshold = void 0;\n            axis.softThreshold = !axis.isXAxis;\n            // Loop through this axis' series\n            axis.series.forEach((series) => {\n                if (series.reserveSpace()) {\n                    const seriesOptions = series.options;\n                    let xData, threshold = seriesOptions.threshold, seriesDataMin, seriesDataMax;\n                    axis.hasVisibleSeries = true;\n                    // Validate threshold in logarithmic axes\n                    if (axis.positiveValuesOnly && (threshold || 0) <= 0) {\n                        threshold = void 0;\n                    }\n                    // Get dataMin and dataMax for X axes\n                    if (axis.isXAxis) {\n                        xData = series.xData;\n                        if (xData && xData.length) {\n                            xData = axis.logarithmic ?\n                                xData.filter((x) => x > 0) :\n                                xData;\n                            xExtremes = series.getXExtremes(xData);\n                            // If xData contains values which is not numbers,\n                            // then filter them out. To prevent performance hit,\n                            // we only do this after we have already found\n                            // seriesDataMin because in most cases all data is\n                            // valid. #5234.\n                            seriesDataMin = xExtremes.min;\n                            seriesDataMax = xExtremes.max;\n                            if (!isNumber(seriesDataMin) &&\n                                // #5010:\n                                !(seriesDataMin instanceof Date)) {\n                                xData = xData.filter(isNumber);\n                                xExtremes = series.getXExtremes(xData);\n                                // Do it again with valid data\n                                seriesDataMin = xExtremes.min;\n                                seriesDataMax = xExtremes.max;\n                            }\n                            if (xData.length) {\n                                axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                                axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                            }\n                        }\n                        // Get dataMin and dataMax for Y axes, as well as handle\n                        // stacking and processed data\n                    }\n                    else {\n                        // Get this particular series extremes\n                        const dataExtremes = series.applyExtremes();\n                        // Get the dataMin and dataMax so far. If percentage is\n                        // used, the min and max are always 0 and 100. If\n                        // seriesDataMin and seriesDataMax is null, then series\n                        // doesn't have active y data, we continue with nulls\n                        if (isNumber(dataExtremes.dataMin)) {\n                            seriesDataMin = dataExtremes.dataMin;\n                            axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                        }\n                        if (isNumber(dataExtremes.dataMax)) {\n                            seriesDataMax = dataExtremes.dataMax;\n                            axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                        }\n                        // Adjust to threshold\n                        if (defined(threshold)) {\n                            axis.threshold = threshold;\n                        }\n                        // If any series has a hard threshold, it takes\n                        // precedence\n                        if (!seriesOptions.softThreshold ||\n                            axis.positiveValuesOnly) {\n                            axis.softThreshold = false;\n                        }\n                    }\n                }\n            });\n        });\n        fireEvent(this, 'afterGetSeriesExtremes');\n    }\n    /**\n     * Translate from axis value to pixel position on the chart, or back. Use\n     * the `toPixels` and `toValue` functions in applications.\n     *\n     * @private\n     * @function Highcharts.Axis#translate\n     */\n    translate(val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n        const axis = (this.linkedParent || this), // #1417\n        localMin = (old && axis.old ? axis.old.min : axis.min);\n        if (!isNumber(localMin)) {\n            return NaN;\n        }\n        const minPixelPadding = axis.minPixelPadding, doPostTranslate = (axis.isOrdinal ||\n            axis.brokenAxis?.hasBreaks ||\n            (axis.logarithmic && handleLog)) && axis.lin2val;\n        let sign = 1, cvsOffset = 0, localA = old && axis.old ? axis.old.transA : axis.transA, returnValue = 0;\n        if (!localA) {\n            localA = axis.transA;\n        }\n        // In vertical axes, the canvas coordinates start from 0 at the top like\n        // in SVG.\n        if (cvsCoord) {\n            sign *= -1; // Canvas coordinates inverts the value\n            cvsOffset = axis.len;\n        }\n        // Handle reversed axis\n        if (axis.reversed) {\n            sign *= -1;\n            cvsOffset -= sign * (axis.sector || axis.len);\n        }\n        // From pixels to value\n        if (backwards) { // Reverse translation\n            val = val * sign + cvsOffset;\n            val -= minPixelPadding;\n            // From chart pixel to value:\n            returnValue = val / localA + localMin;\n            if (doPostTranslate) { // Log, ordinal and broken axis\n                returnValue = axis.lin2val(returnValue);\n            }\n            // From value to pixels\n        }\n        else {\n            if (doPostTranslate) { // Log, ordinal and broken axis\n                val = axis.val2lin(val);\n            }\n            const value = sign * (val - localMin) * localA;\n            returnValue = value +\n                cvsOffset +\n                (sign * minPixelPadding) +\n                (isNumber(pointPlacement) ? localA * pointPlacement : 0);\n            if (!axis.isRadial) {\n                returnValue = correctFloat(returnValue);\n            }\n        }\n        return returnValue;\n    }\n    /**\n     * Translate a value in terms of axis units into pixels within the chart.\n     *\n     * @function Highcharts.Axis#toPixels\n     *\n     * @param {number} value\n     * A value in terms of axis units.\n     *\n     * @param {boolean} [paneCoordinates=false]\n     * Whether to return the pixel coordinate relative to the chart or just the\n     * axis/pane itself.\n     *\n     * @return {number}\n     * Pixel position of the value on the chart or axis.\n     */\n    toPixels(value, paneCoordinates) {\n        return this.translate(value, false, !this.horiz, void 0, true) +\n            (paneCoordinates ? 0 : this.pos);\n    }\n    /**\n     * Translate a pixel position along the axis to a value in terms of axis\n     * units.\n     *\n     * @function Highcharts.Axis#toValue\n     *\n     * @param {number} pixel\n     * The pixel value coordinate.\n     *\n     * @param {boolean} [paneCoordinates=false]\n     * Whether the input pixel is relative to the chart or just the axis/pane\n     * itself.\n     *\n     * @return {number}\n     * The axis value.\n     */\n    toValue(pixel, paneCoordinates) {\n        return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, void 0, true);\n    }\n    /**\n     * Create the path for a plot line that goes from the given value on\n     * this axis, across the plot to the opposite side. Also used internally for\n     * grid lines and crosshairs.\n     *\n     * @function Highcharts.Axis#getPlotLinePath\n     *\n     * @param {Highcharts.AxisPlotLinePathOptionsObject} options\n     * Options for the path.\n     *\n     * @return {Highcharts.SVGPathArray|null}\n     * The SVG path definition for the plot line.\n     */\n    getPlotLinePath(options) {\n        const axis = this, chart = axis.chart, axisLeft = axis.left, axisTop = axis.top, old = options.old, value = options.value, lineWidth = options.lineWidth, cHeight = (old && chart.oldChartHeight) || chart.chartHeight, cWidth = (old && chart.oldChartWidth) || chart.chartWidth, transB = axis.transB;\n        let translatedValue = options.translatedValue, force = options.force, x1, y1, x2, y2, skip;\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Check if x is between a and b. If not, either move to a/b\n         * or skip, depending on the force parameter.\n         * @private\n         */\n        function between(x, a, b) {\n            if (force !== 'pass' && (x < a || x > b)) {\n                if (force) {\n                    x = clamp(x, a, b);\n                }\n                else {\n                    skip = true;\n                }\n            }\n            return x;\n        }\n        const evt = {\n            value,\n            lineWidth,\n            old,\n            force,\n            acrossPanes: options.acrossPanes,\n            translatedValue\n        };\n        fireEvent(this, 'getPlotLinePath', evt, function (e) {\n            translatedValue = pick(translatedValue, axis.translate(value, void 0, void 0, old));\n            // Keep the translated value within sane bounds, and avoid Infinity\n            // to fail the isNumber test (#7709).\n            translatedValue = clamp(translatedValue, -1e9, 1e9);\n            x1 = x2 = translatedValue + transB;\n            y1 = y2 = cHeight - translatedValue - transB;\n            if (!isNumber(translatedValue)) { // No min or max\n                skip = true;\n                force = false; // #7175, don't force it when path is invalid\n            }\n            else if (axis.horiz) {\n                y1 = axisTop;\n                y2 = cHeight - axis.bottom + (axis.options.isInternal ?\n                    0 :\n                    (chart.scrollablePixelsY || 0)); // #20354, scrollablePixelsY shouldn't be used for navigator\n                x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n            }\n            else {\n                x1 = axisLeft;\n                x2 = cWidth - axis.right + (chart.scrollablePixelsX || 0);\n                y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n            }\n            e.path = skip && !force ?\n                void 0 :\n                chart.renderer.crispLine([['M', x1, y1], ['L', x2, y2]], lineWidth || 1);\n        });\n        return evt.path;\n    }\n    /**\n     * Internal function to get the tick positions of a linear axis to round\n     * values like whole tens or every five.\n     *\n     * @function Highcharts.Axis#getLinearTickPositions\n     *\n     * @param {number} tickInterval\n     * The normalized tick interval.\n     *\n     * @param {number} min\n     * Axis minimum.\n     *\n     * @param {number} max\n     * Axis maximum.\n     *\n     * @return {Array<number>}\n     * An array of axis values where ticks should be placed.\n     */\n    getLinearTickPositions(tickInterval, min, max) {\n        const roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval), roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval), tickPositions = [];\n        let pos, lastPos, precision;\n        // When the precision is higher than what we filter out in\n        // correctFloat, skip it (#6183).\n        if (correctFloat(roundedMin + tickInterval) === roundedMin) {\n            precision = 20;\n        }\n        // For single points, add a tick regardless of the relative position\n        // (#2662, #6274)\n        if (this.single) {\n            return [min];\n        }\n        // Populate the intermediate values\n        pos = roundedMin;\n        while (pos <= roundedMax) {\n            // Place the tick on the rounded value\n            tickPositions.push(pos);\n            // Always add the raw tickInterval, not the corrected one.\n            pos = correctFloat(pos + tickInterval, precision);\n            // If the interval is not big enough in the current min - max range\n            // to actually increase the loop variable, we need to break out to\n            // prevent endless loop. Issue #619\n            if (pos === lastPos) {\n                break;\n            }\n            // Record the last value\n            lastPos = pos;\n        }\n        return tickPositions;\n    }\n    /**\n     * Resolve the new minorTicks/minorTickInterval options into the legacy\n     * loosely typed minorTickInterval option.\n     *\n     * @function Highcharts.Axis#getMinorTickInterval\n     *\n     * @return {number|\"auto\"|null}\n     * Legacy option\n     */\n    getMinorTickInterval() {\n        const { minorTicks, minorTickInterval } = this.options;\n        if (minorTicks === true) {\n            return pick(minorTickInterval, 'auto');\n        }\n        if (minorTicks === false) {\n            return;\n        }\n        return minorTickInterval;\n    }\n    /**\n     * Internal function to return the minor tick positions. For logarithmic\n     * axes, the same logic as for major ticks is reused.\n     *\n     * @function Highcharts.Axis#getMinorTickPositions\n     *\n     * @return {Array<number>}\n     * An array of axis values where ticks should be placed.\n     */\n    getMinorTickPositions() {\n        const axis = this, options = axis.options, tickPositions = axis.tickPositions, minorTickInterval = axis.minorTickInterval, pointRangePadding = axis.pointRangePadding || 0, min = (axis.min || 0) - pointRangePadding, // #1498\n        max = (axis.max || 0) + pointRangePadding, // #1498\n        range = max - min;\n        let minorTickPositions = [], pos;\n        // If minor ticks get too dense, they are hard to read, and may cause\n        // long running script. So we don't draw them.\n        if (range && range / minorTickInterval < axis.len / 3) { // #3875\n            const logarithmic = axis.logarithmic;\n            if (logarithmic) {\n                // For each interval in the major ticks, compute the minor ticks\n                // separately.\n                this.paddedTicks.forEach(function (_pos, i, paddedTicks) {\n                    if (i) {\n                        minorTickPositions.push.apply(minorTickPositions, logarithmic.getLogTickPositions(minorTickInterval, paddedTicks[i - 1], paddedTicks[i], true));\n                    }\n                });\n            }\n            else if (axis.dateTime &&\n                this.getMinorTickInterval() === 'auto') { // #1314\n                minorTickPositions = minorTickPositions.concat(axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(minorTickInterval), min, max, options.startOfWeek));\n            }\n            else {\n                for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {\n                    // Very, very, tight grid lines (#5771)\n                    if (pos === minorTickPositions[0]) {\n                        break;\n                    }\n                    minorTickPositions.push(pos);\n                }\n            }\n        }\n        if (minorTickPositions.length !== 0) {\n            axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n        }\n        return minorTickPositions;\n    }\n    /**\n     * Adjust the min and max for the minimum range. Keep in mind that the\n     * series data is not yet processed, so we don't have information on data\n     * cropping and grouping, or updated `axis.pointRange` or\n     * `series.pointRange`. The data can't be processed until we have finally\n     * established min and max.\n     *\n     * @private\n     * @function Highcharts.Axis#adjustForMinRange\n     */\n    adjustForMinRange() {\n        const axis = this, options = axis.options, logarithmic = axis.logarithmic;\n        let { max, min, minRange } = axis, zoomOffset, spaceAvailable, closestDataRange, minArgs, maxArgs;\n        // Set the automatic minimum range based on the closest point distance\n        if (axis.isXAxis &&\n            typeof minRange === 'undefined' &&\n            !logarithmic) {\n            if (defined(options.min) ||\n                defined(options.max) ||\n                defined(options.floor) ||\n                defined(options.ceiling)) {\n                // Setting it to null, as opposed to undefined, signals we don't\n                // run this block again as per the condition above.\n                minRange = null;\n            }\n            else {\n                // Find the closest distance between raw data points, as opposed\n                // to closestPointRange that applies to processed points\n                // (cropped and grouped)\n                closestDataRange = getClosestDistance(axis.series.map((s) => \n                // If xIncrement, we only need to measure the two first\n                // points to get the distance. Saves processing time.\n                (s.xIncrement ? s.xData?.slice(0, 2) : s.xData) || [])) || 0;\n                minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n            }\n        }\n        // If minRange is exceeded, adjust\n        if (isNumber(max) &&\n            isNumber(min) &&\n            isNumber(minRange) &&\n            max - min < minRange) {\n            spaceAvailable =\n                axis.dataMax - axis.dataMin >=\n                    minRange;\n            zoomOffset = (minRange - max + min) / 2;\n            // If min and max options have been set, don't go beyond it\n            minArgs = [\n                min - zoomOffset,\n                pick(options.min, min - zoomOffset)\n            ];\n            // If space is available, stay within the data range\n            if (spaceAvailable) {\n                minArgs[2] = logarithmic ?\n                    logarithmic.log2lin(axis.dataMin) :\n                    axis.dataMin;\n            }\n            min = arrayMax(minArgs);\n            maxArgs = [\n                min + minRange,\n                pick(options.max, min + minRange)\n            ];\n            // If space is available, stay within the data range\n            if (spaceAvailable) {\n                maxArgs[2] = logarithmic ?\n                    logarithmic.log2lin(axis.dataMax) :\n                    axis.dataMax;\n            }\n            max = arrayMin(maxArgs);\n            // Now if the max is adjusted, adjust the min back\n            if (max - min < minRange) {\n                minArgs[0] = max - minRange;\n                minArgs[1] = pick(options.min, max - minRange);\n                min = arrayMax(minArgs);\n            }\n        }\n        // Record modified extremes\n        axis.minRange = minRange;\n        axis.min = min;\n        axis.max = max;\n    }\n    /**\n     * Find the closestPointRange across all series, including the single data\n     * series.\n     *\n     * @private\n     * @function Highcharts.Axis#getClosest\n     */\n    getClosest() {\n        let closestSingleDistance, closestDistance;\n        if (this.categories) {\n            closestDistance = 1;\n        }\n        else {\n            const singleXs = [];\n            this.series.forEach(function (series) {\n                const seriesClosest = series.closestPointRange;\n                if (series.xData?.length === 1) {\n                    singleXs.push(series.xData[0]);\n                }\n                else if (!series.noSharedTooltip &&\n                    defined(seriesClosest) &&\n                    series.reserveSpace()) {\n                    closestDistance = defined(closestDistance) ?\n                        Math.min(closestDistance, seriesClosest) :\n                        seriesClosest;\n                }\n            });\n            if (singleXs.length) {\n                singleXs.sort((a, b) => a - b);\n                closestSingleDistance = getClosestDistance([singleXs]);\n            }\n        }\n        if (closestSingleDistance && closestDistance) {\n            return Math.min(closestSingleDistance, closestDistance);\n        }\n        return closestSingleDistance || closestDistance;\n    }\n    /**\n     * When a point name is given and no x, search for the name in the existing\n     * categories, or if categories aren't provided, search names or create a\n     * new category (#2522).\n     *\n     * @private\n     * @function Highcharts.Axis#nameToX\n     *\n     * @param {Highcharts.Point} point\n     * The point to inspect.\n     *\n     * @return {number}\n     * The X value that the point is given.\n     */\n    nameToX(point) {\n        const explicitCategories = isArray(this.options.categories), names = explicitCategories ? this.categories : this.names;\n        let nameX = point.options.x, x;\n        point.series.requireSorting = false;\n        if (!defined(nameX)) {\n            nameX = this.uniqueNames && names ?\n                (explicitCategories ?\n                    names.indexOf(point.name) :\n                    pick(names.keys[point.name], -1)) :\n                point.series.autoIncrement();\n        }\n        if (nameX === -1) { // Not found in current categories\n            if (!explicitCategories && names) {\n                x = names.length;\n            }\n        }\n        else {\n            x = nameX;\n        }\n        // Write the last point's name to the names array\n        if (typeof x !== 'undefined') {\n            this.names[x] = point.name;\n            // Backwards mapping is much faster than array searching (#7725)\n            this.names.keys[point.name] = x;\n        }\n        else if (point.x) {\n            x = point.x; // #17438\n        }\n        return x;\n    }\n    /**\n     * When changes have been done to series data, update the axis.names.\n     *\n     * @private\n     * @function Highcharts.Axis#updateNames\n     */\n    updateNames() {\n        const axis = this, names = this.names, i = names.length;\n        if (i > 0) {\n            Object.keys(names.keys).forEach(function (key) {\n                delete (names.keys)[key];\n            });\n            names.length = 0;\n            this.minRange = this.userMinRange; // Reset\n            (this.series || []).forEach((series) => {\n                // Reset incrementer (#5928)\n                series.xIncrement = null;\n                // When adding a series, points are not yet generated\n                if (!series.points || series.isDirtyData) {\n                    // When we're updating the series with data that is longer\n                    // than it was, and cropThreshold is passed, we need to make\n                    // sure that the axis.max is increased _before_ running the\n                    // premature processData. Otherwise this early iteration of\n                    // processData will crop the points to axis.max, and the\n                    // names array will be too short (#5857).\n                    axis.max = Math.max(axis.max, series.xData.length - 1);\n                    series.processData();\n                    series.generatePoints();\n                }\n                series.data.forEach(function (point, i) {\n                    let x;\n                    if (point?.options &&\n                        typeof point.name !== 'undefined' // #9562\n                    ) {\n                        x = axis.nameToX(point);\n                        if (typeof x !== 'undefined' && x !== point.x) {\n                            point.x = x;\n                            series.xData[i] = x;\n                        }\n                    }\n                });\n            });\n        }\n    }\n    /**\n     * Update translation information.\n     *\n     * @private\n     * @function Highcharts.Axis#setAxisTranslation\n     *\n     * @emits Highcharts.Axis#event:afterSetAxisTranslation\n     */\n    setAxisTranslation() {\n        const axis = this, range = axis.max - axis.min, linkedParent = axis.linkedParent, hasCategories = !!axis.categories, isXAxis = axis.isXAxis;\n        let pointRange = axis.axisPointRange || 0, closestPointRange, minPointOffset = 0, pointRangePadding = 0, ordinalCorrection, transA = axis.transA;\n        // Adjust translation for padding. Y axis with categories need to go\n        // through the same (#1784).\n        if (isXAxis || hasCategories || pointRange) {\n            // Get the closest points\n            closestPointRange = axis.getClosest();\n            if (linkedParent) {\n                minPointOffset = linkedParent.minPointOffset;\n                pointRangePadding = linkedParent.pointRangePadding;\n            }\n            else {\n                axis.series.forEach(function (series) {\n                    const seriesPointRange = hasCategories ?\n                        1 :\n                        (isXAxis ?\n                            pick(series.options.pointRange, closestPointRange, 0) :\n                            (axis.axisPointRange || 0)), // #2806\n                    pointPlacement = series.options.pointPlacement;\n                    pointRange = Math.max(pointRange, seriesPointRange);\n                    if (!axis.single || hasCategories) {\n                        // TODO: series should internally set x- and y-\n                        // pointPlacement to simplify this logic.\n                        const isPointPlacementAxis = series.is('xrange') ?\n                            !isXAxis :\n                            isXAxis;\n                        // The `minPointOffset` is the value padding to the left\n                        // of the axis in order to make room for points with a\n                        // pointRange, typically columns. When the\n                        // pointPlacement option is 'between' or 'on', this\n                        // padding does not apply.\n                        minPointOffset = Math.max(minPointOffset, isPointPlacementAxis && isString(pointPlacement) ?\n                            0 :\n                            seriesPointRange / 2);\n                        // Determine the total padding needed to the length of\n                        // the axis to make room for the pointRange. If the\n                        // series' pointPlacement is 'on', no padding is added.\n                        pointRangePadding = Math.max(pointRangePadding, isPointPlacementAxis && pointPlacement === 'on' ?\n                            0 :\n                            seriesPointRange);\n                    }\n                });\n            }\n            // Record minPointOffset and pointRangePadding\n            ordinalCorrection = (axis.ordinal && axis.ordinal.slope && closestPointRange) ?\n                axis.ordinal.slope / closestPointRange :\n                1; // #988, #1853\n            axis.minPointOffset = minPointOffset =\n                minPointOffset * ordinalCorrection;\n            axis.pointRangePadding =\n                pointRangePadding = pointRangePadding * ordinalCorrection;\n            // The `pointRange` is the width reserved for each point, like in a\n            // column chart\n            axis.pointRange = Math.min(pointRange, axis.single && hasCategories ? 1 : range);\n            // The `closestPointRange` is the closest distance between points.\n            // In columns it is mostly equal to pointRange, but in lines\n            // pointRange is 0 while closestPointRange is some other value\n            if (isXAxis && closestPointRange) {\n                axis.closestPointRange = closestPointRange;\n            }\n        }\n        // Secondary values\n        axis.translationSlope = axis.transA = transA =\n            axis.staticScale ||\n                axis.len / ((range + pointRangePadding) || 1);\n        // Translation addend\n        axis.transB = axis.horiz ? axis.left : axis.bottom;\n        axis.minPixelPadding = transA * minPointOffset;\n        fireEvent(this, 'afterSetAxisTranslation');\n    }\n    /**\n     * @private\n     * @function Highcharts.Axis#minFromRange\n     */\n    minFromRange() {\n        const { max, min } = this;\n        return isNumber(max) && isNumber(min) && max - min || void 0;\n    }\n    /**\n     * Set the tick positions to round values and optionally extend the extremes\n     * to the nearest tick.\n     *\n     * @private\n     * @function Highcharts.Axis#setTickInterval\n     *\n     * @param {boolean} secondPass\n     * TO-DO: parameter description\n     *\n     * @emits Highcharts.Axis#event:foundExtremes\n     */\n    setTickInterval(secondPass) {\n        const axis = this, { categories, chart, dataMax, dataMin, dateTime, isXAxis, logarithmic, options, softThreshold } = axis, threshold = isNumber(axis.threshold) ? axis.threshold : void 0, minRange = axis.minRange || 0, { ceiling, floor, linkedTo, softMax, softMin } = options, linkedParent = isNumber(linkedTo) && chart[axis.coll]?.[linkedTo], tickPixelIntervalOption = options.tickPixelInterval;\n        let maxPadding = options.maxPadding, minPadding = options.minPadding, range = 0, linkedParentExtremes, \n        // Only non-negative tickInterval is valid, #12961\n        tickIntervalOption = isNumber(options.tickInterval) && options.tickInterval >= 0 ?\n            options.tickInterval : void 0, thresholdMin, thresholdMax, hardMin, hardMax;\n        if (!dateTime && !categories && !linkedParent) {\n            this.getTickAmount();\n        }\n        // Min or max set either by zooming/setExtremes or initial options\n        hardMin = pick(axis.userMin, options.min);\n        hardMax = pick(axis.userMax, options.max);\n        // Linked axis gets the extremes from the parent axis\n        if (linkedParent) {\n            axis.linkedParent = linkedParent;\n            linkedParentExtremes = linkedParent.getExtremes();\n            axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n            axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n            if (this.type !== linkedParent.type) {\n                // Can't link axes of different type\n                error(11, true, chart);\n            }\n            // Initial min and max from the extreme data values\n        }\n        else {\n            // Adjust to hard threshold\n            if (softThreshold &&\n                defined(threshold) &&\n                isNumber(dataMax) &&\n                isNumber(dataMin)) {\n                if (dataMin >= threshold) {\n                    thresholdMin = threshold;\n                    minPadding = 0;\n                }\n                else if (dataMax <= threshold) {\n                    thresholdMax = threshold;\n                    maxPadding = 0;\n                }\n            }\n            axis.min = pick(hardMin, thresholdMin, dataMin);\n            axis.max = pick(hardMax, thresholdMax, dataMax);\n        }\n        if (isNumber(axis.max) && isNumber(axis.min)) {\n            if (logarithmic) {\n                if (axis.positiveValuesOnly &&\n                    !secondPass &&\n                    Math.min(axis.min, pick(dataMin, axis.min)) <= 0) { // #978\n                    // Can't plot negative values on log axis\n                    error(10, true, chart);\n                }\n                // The correctFloat cures #934, float errors on full tens. But\n                // it was too aggressive for #4360 because of conversion back to\n                // lin, therefore use precision 15.\n                axis.min = correctFloat(logarithmic.log2lin(axis.min), 16);\n                axis.max = correctFloat(logarithmic.log2lin(axis.max), 16);\n            }\n            // Handle zoomed range\n            if (axis.range && isNumber(dataMin)) {\n                // #618, #6773:\n                axis.userMin = axis.min = hardMin = Math.max(dataMin, axis.minFromRange() || 0);\n                axis.userMax = hardMax = axis.max;\n                axis.range = void 0; // Don't use it when running setExtremes\n            }\n        }\n        // Hook for Highcharts Stock Scroller and bubble axis padding\n        fireEvent(axis, 'foundExtremes');\n        // Adjust min and max for the minimum range\n        axis.adjustForMinRange();\n        if (isNumber(axis.min) && isNumber(axis.max)) {\n            // Handle options for floor, ceiling, softMin and softMax (#6359)\n            if (!isNumber(axis.userMin) &&\n                isNumber(softMin) &&\n                softMin < axis.min) {\n                axis.min = hardMin = softMin; // #6894\n            }\n            if (!isNumber(axis.userMax) &&\n                isNumber(softMax) &&\n                softMax > axis.max) {\n                axis.max = hardMax = softMax; // #6894\n            }\n            // Pad the values to get clear of the chart's edges. To avoid\n            // tickInterval taking the padding into account, we do this after\n            // computing tick interval (#1337).\n            if (!categories &&\n                !axis.axisPointRange &&\n                !axis.stacking?.usePercentage &&\n                !linkedParent) {\n                range = axis.max - axis.min;\n                if (range) {\n                    if (!defined(hardMin) && minPadding) {\n                        axis.min -= range * minPadding;\n                    }\n                    if (!defined(hardMax) && maxPadding) {\n                        axis.max += range * maxPadding;\n                    }\n                }\n            }\n            if (!isNumber(axis.userMin) && isNumber(floor)) {\n                axis.min = Math.max(axis.min, floor);\n            }\n            if (!isNumber(axis.userMax) && isNumber(ceiling)) {\n                axis.max = Math.min(axis.max, ceiling);\n            }\n            // When the threshold is soft, adjust the extreme value only if the\n            // data extreme and the padded extreme land on either side of the\n            // threshold. For example, a series of [0, 1, 2, 3] would make the\n            // yAxis add a tick for -1 because of the default `minPadding` and\n            // `startOnTick` options. This is prevented by the `softThreshold`\n            // option.\n            if (softThreshold &&\n                isNumber(dataMin) &&\n                isNumber(dataMax)) {\n                const numThreshold = threshold || 0;\n                if (!defined(hardMin) &&\n                    axis.min < numThreshold &&\n                    dataMin >= numThreshold) {\n                    axis.min = options.minRange ?\n                        Math.min(numThreshold, axis.max - minRange) :\n                        numThreshold;\n                }\n                else if (!defined(hardMax) &&\n                    axis.max > numThreshold &&\n                    dataMax <= numThreshold) {\n                    axis.max = options.minRange ?\n                        Math.max(numThreshold, axis.min + minRange) :\n                        numThreshold;\n                }\n            }\n            // If min is bigger than highest, or if max less than lowest value,\n            // the chart should not render points. (#14417)\n            if (!chart.polar && axis.min > axis.max) {\n                if (defined(options.min)) {\n                    axis.max = axis.min;\n                }\n                else if (defined(options.max)) {\n                    axis.min = axis.max;\n                }\n            }\n            range = axis.max - axis.min;\n        }\n        // Get tickInterval\n        if (axis.min === axis.max ||\n            !isNumber(axis.min) ||\n            !isNumber(axis.max)) {\n            axis.tickInterval = 1;\n        }\n        else if (linkedParent &&\n            !tickIntervalOption &&\n            tickPixelIntervalOption === linkedParent.options.tickPixelInterval) {\n            axis.tickInterval = tickIntervalOption = linkedParent.tickInterval;\n        }\n        else {\n            axis.tickInterval = pick(tickIntervalOption, this.tickAmount ?\n                range / Math.max(this.tickAmount - 1, 1) :\n                void 0, \n            // For categorized axis, 1 is default, for linear axis use\n            // tickPix\n            categories ?\n                1 :\n                // Don't let it be more than the data range\n                range * tickPixelIntervalOption /\n                    Math.max(axis.len, tickPixelIntervalOption));\n        }\n        // Now we're finished detecting min and max, crop and group series data.\n        // This is in turn needed in order to find tick positions in ordinal\n        // axes.\n        if (isXAxis && !secondPass) {\n            const hasExtremesChanged = axis.min !== axis.old?.min ||\n                axis.max !== axis.old?.max;\n            // First process all series assigned to that axis.\n            axis.series.forEach(function (series) {\n                // Allows filtering out points outside the plot area.\n                series.forceCrop = series.forceCropping?.();\n                series.processData(hasExtremesChanged);\n            });\n            // Then apply grouping if needed. The hasExtremesChanged helps to\n            // decide if the data grouping should be skipped in the further\n            // calculations #16319.\n            fireEvent(this, 'postProcessData', { hasExtremesChanged });\n        }\n        // Set the translation factor used in translate function\n        axis.setAxisTranslation();\n        // Hook for ordinal axes and radial axes\n        fireEvent(this, 'initialAxisTranslation');\n        // In column-like charts, don't cramp in more ticks than there are\n        // points (#1943, #4184)\n        if (axis.pointRange && !tickIntervalOption) {\n            axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n        }\n        // Before normalizing the tick interval, handle minimum tick interval.\n        // This applies only if tickInterval is not defined.\n        const minTickInterval = pick(options.minTickInterval, \n        // In datetime axes, don't go below the data interval, except when\n        // there are scatter-like series involved (#13369).\n        dateTime &&\n            !axis.series.some((s) => s.noSharedTooltip) ?\n            axis.closestPointRange : 0);\n        if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n            axis.tickInterval = minTickInterval;\n        }\n        // For linear axes, normalize the interval\n        if (!dateTime && !logarithmic && !tickIntervalOption) {\n            axis.tickInterval = getNormalizedTickInterval(axis, axis.tickInterval);\n        }\n        // Prevent ticks from getting so close that we can't draw the labels\n        if (!this.tickAmount) {\n            axis.tickInterval = axis.unsquish();\n        }\n        this.setTickPositions();\n    }\n    /**\n     * Now we have computed the normalized tickInterval, get the tick positions.\n     *\n     * @private\n     * @function Highcharts.Axis#setTickPositions\n     *\n     * @emits Highcharts.Axis#event:afterSetTickPositions\n     */\n    setTickPositions() {\n        const axis = this, options = this.options, tickPositionsOption = options.tickPositions, tickPositioner = options.tickPositioner, minorTickIntervalOption = this.getMinorTickInterval(), allowEndOnTick = !this.isPanning, startOnTick = allowEndOnTick && options.startOnTick, endOnTick = allowEndOnTick && options.endOnTick;\n        let tickPositions = [], tickPositionerResult;\n        // Set the tickmarkOffset\n        this.tickmarkOffset = (this.categories &&\n            options.tickmarkPlacement === 'between' &&\n            this.tickInterval === 1) ? 0.5 : 0; // #3202\n        // When there is only one point, or all points have the same value on\n        // this axis, then min and max are equal and tickPositions.length is 0\n        // or 1. In this case, add some padding in order to center the point,\n        // but leave it with one tick. #1337.\n        this.single =\n            this.min === this.max &&\n                defined(this.min) &&\n                !this.tickAmount &&\n                (\n                // Data is on integer (#6563)\n                this.min % 1 === 0 ||\n                    // Between integers and decimals are not allowed (#6274)\n                    options.allowDecimals !== false);\n        /**\n         * Contains the current positions that are laid out on the axis. The\n         * positions are numbers in terms of axis values. In a category axis\n         * they are integers, in a datetime axis they are also integers, but\n         * designating milliseconds.\n         *\n         * This property is read only - for modifying the tick positions, use\n         * the `tickPositioner` callback or [axis.tickPositions(\n         * https://api.highcharts.com/highcharts/xAxis.tickPositions) option\n         * instead.\n         *\n         * @name Highcharts.Axis#tickPositions\n         * @type {Highcharts.AxisTickPositionsArray|undefined}\n         */\n        if (tickPositionsOption) {\n            // Find the tick positions. Work on a copy (#1565)\n            tickPositions = tickPositionsOption.slice();\n        }\n        else if (isNumber(this.min) && isNumber(this.max)) {\n            // Too many ticks (#6405). Create a friendly warning and provide two\n            // ticks so at least we can show the data series.\n            if (!axis.ordinal?.positions &&\n                ((this.max - this.min) /\n                    this.tickInterval >\n                    Math.max(2 * this.len, 200))) {\n                tickPositions = [this.min, this.max];\n                error(19, false, this.chart);\n            }\n            else if (axis.dateTime) {\n                tickPositions = axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(this.tickInterval, options.units), this.min, this.max, options.startOfWeek, axis.ordinal?.positions, this.closestPointRange, true);\n            }\n            else if (axis.logarithmic) {\n                tickPositions = axis.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max);\n            }\n            else {\n                const startingTickInterval = this.tickInterval;\n                let adjustedTickInterval = startingTickInterval;\n                while (adjustedTickInterval <= startingTickInterval * 2) {\n                    tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);\n                    // If there are more tick positions than the set tickAmount,\n                    // increase the tickInterval and continue until it fits.\n                    // (#17100)\n                    if (this.tickAmount &&\n                        tickPositions.length > this.tickAmount) {\n                        this.tickInterval = getNormalizedTickInterval(this, adjustedTickInterval *= 1.1);\n                    }\n                    else {\n                        break;\n                    }\n                }\n            }\n            // Too dense ticks, keep only the first and last (#4477)\n            if (tickPositions.length > this.len) {\n                tickPositions = [\n                    tickPositions[0],\n                    tickPositions[tickPositions.length - 1]\n                ];\n                // Reduce doubled value (#7339)\n                if (tickPositions[0] === tickPositions[1]) {\n                    tickPositions.length = 1;\n                }\n            }\n            // Run the tick positioner callback, that allows modifying auto tick\n            // positions.\n            if (tickPositioner) {\n                // Make it available to the positioner\n                this.tickPositions = tickPositions;\n                tickPositionerResult = tickPositioner.apply(axis, [this.min, this.max]);\n                if (tickPositionerResult) {\n                    tickPositions = tickPositionerResult;\n                }\n            }\n        }\n        this.tickPositions = tickPositions;\n        // Get minorTickInterval\n        this.minorTickInterval =\n            minorTickIntervalOption === 'auto' && this.tickInterval ?\n                this.tickInterval / options.minorTicksPerMajor :\n                minorTickIntervalOption;\n        // Reset min/max or remove extremes based on start/end on tick\n        this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n        this.trimTicks(tickPositions, startOnTick, endOnTick);\n        if (!this.isLinked && isNumber(this.min) && isNumber(this.max)) {\n            // Substract half a unit (#2619, #2846, #2515, #3390), but not in\n            // case of multiple ticks (#6897)\n            if (this.single &&\n                tickPositions.length < 2 &&\n                !this.categories &&\n                !this.series.some((s) => (s.is('heatmap') && s.options.pointPlacement === 'between'))) {\n                this.min -= 0.5;\n                this.max += 0.5;\n            }\n            if (!tickPositionsOption && !tickPositionerResult) {\n                this.adjustTickAmount();\n            }\n        }\n        fireEvent(this, 'afterSetTickPositions');\n    }\n    /**\n     * Handle startOnTick and endOnTick by either adapting to padding min/max or\n     * rounded min/max. Also handle single data points.\n     *\n     * @private\n     * @function Highcharts.Axis#trimTicks\n     *\n     * @param {Array<number>} tickPositions\n     * TO-DO: parameter description\n     *\n     * @param {boolean} [startOnTick]\n     * TO-DO: parameter description\n     *\n     * @param {boolean} [endOnTick]\n     * TO-DO: parameter description\n     */\n    trimTicks(tickPositions, startOnTick, endOnTick) {\n        const roundedMin = tickPositions[0], roundedMax = tickPositions[tickPositions.length - 1], minPointOffset = (!this.isOrdinal && this.minPointOffset) || 0; // (#12716)\n        fireEvent(this, 'trimTicks');\n        if (!this.isLinked) {\n            if (startOnTick && roundedMin !== -Infinity) { // #6502\n                this.min = roundedMin;\n            }\n            else {\n                while (this.min - minPointOffset > tickPositions[0]) {\n                    tickPositions.shift();\n                }\n            }\n            if (endOnTick) {\n                this.max = roundedMax;\n            }\n            else {\n                while (this.max + minPointOffset <\n                    tickPositions[tickPositions.length - 1]) {\n                    tickPositions.pop();\n                }\n            }\n            // If no tick are left, set one tick in the middle (#3195)\n            if (tickPositions.length === 0 &&\n                defined(roundedMin) &&\n                !this.options.tickPositions) {\n                tickPositions.push((roundedMax + roundedMin) / 2);\n            }\n        }\n    }\n    /**\n     * Check if there are multiple axes in the same pane.\n     *\n     * @private\n     * @function Highcharts.Axis#alignToOthers\n     *\n     * @return {boolean|undefined}\n     * True if there are other axes.\n     */\n    alignToOthers() {\n        const axis = this, chart = axis.chart, alignedAxes = [this], options = axis.options, chartOptions = chart.options.chart, alignThresholds = (this.coll === 'yAxis' &&\n            chartOptions.alignThresholds), thresholdAlignments = [];\n        let hasOther;\n        axis.thresholdAlignment = void 0;\n        if ((\n        // Only if alignTicks or alignThresholds is true\n        (chartOptions.alignTicks !== false && options.alignTicks) ||\n            alignThresholds) &&\n            // Disabled when startOnTick or endOnTick are false (#7604)\n            options.startOnTick !== false &&\n            options.endOnTick !== false &&\n            // Don't try to align ticks on a log axis, they are not evenly\n            // spaced (#6021)\n            !axis.logarithmic) {\n            // Get a key identifying which pane the axis belongs to\n            const getKey = (axis) => {\n                const { horiz, options } = axis;\n                return [\n                    horiz ? options.left : options.top,\n                    options.width,\n                    options.height,\n                    options.pane\n                ].join(',');\n            };\n            const thisKey = getKey(this);\n            chart[this.coll].forEach(function (otherAxis) {\n                const { series } = otherAxis;\n                if (\n                // #4442\n                series.length &&\n                    series.some((s) => s.visible) &&\n                    otherAxis !== axis &&\n                    getKey(otherAxis) === thisKey) {\n                    hasOther = true; // #4201\n                    alignedAxes.push(otherAxis);\n                }\n            });\n        }\n        if (hasOther && alignThresholds) {\n            // Handle alignThresholds. The `thresholdAlignments` array keeps\n            // records of where each axis in the group wants its threshold, from\n            // 0 which is on `axis.min`, to 1 which is on `axis.max`.\n            alignedAxes.forEach((otherAxis) => {\n                const threshAlign = otherAxis.getThresholdAlignment(axis);\n                if (isNumber(threshAlign)) {\n                    thresholdAlignments.push(threshAlign);\n                }\n            });\n            // For each of the axes in the group, record the average\n            // `thresholdAlignment`.\n            const thresholdAlignment = thresholdAlignments.length > 1 ?\n                thresholdAlignments.reduce((sum, n) => (sum += n), 0) / thresholdAlignments.length :\n                void 0;\n            alignedAxes.forEach((axis) => {\n                axis.thresholdAlignment = thresholdAlignment;\n            });\n        }\n        return hasOther;\n    }\n    /**\n     * Where the axis wants its threshold, from 0 which is on `axis.min`, to 1 which\n     * is on `axis.max`.\n     *\n     * @private\n     * @function Highcharts.Axis#getThresholdAlignment\n     */\n    getThresholdAlignment(callerAxis) {\n        if (!isNumber(this.dataMin) ||\n            (this !== callerAxis &&\n                this.series.some((s) => (s.isDirty || s.isDirtyData)))) {\n            this.getSeriesExtremes();\n        }\n        if (isNumber(this.threshold)) {\n            let thresholdAlignment = clamp(((this.threshold - (this.dataMin || 0)) /\n                ((this.dataMax || 0) - (this.dataMin || 0))), 0, 1);\n            if (this.options.reversed) {\n                thresholdAlignment = 1 - thresholdAlignment;\n            }\n            return thresholdAlignment;\n        }\n    }\n    /**\n     * Find the max ticks of either the x and y axis collection, and record it\n     * in `this.tickAmount`.\n     *\n     * @private\n     * @function Highcharts.Axis#getTickAmount\n     */\n    getTickAmount() {\n        const axis = this, options = this.options, tickPixelInterval = options.tickPixelInterval;\n        let tickAmount = options.tickAmount;\n        if (!defined(options.tickInterval) &&\n            !tickAmount &&\n            this.len < tickPixelInterval &&\n            !this.isRadial &&\n            !axis.logarithmic &&\n            options.startOnTick &&\n            options.endOnTick) {\n            tickAmount = 2;\n        }\n        if (!tickAmount && this.alignToOthers()) {\n            // Add 1 because 4 tick intervals require 5 ticks (including first\n            // and last)\n            tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n        }\n        // For tick amounts of 2 and 3, compute five ticks and remove the\n        // intermediate ones. This prevents the axis from adding ticks that are\n        // too far away from the data extremes.\n        if (tickAmount < 4) {\n            this.finalTickAmt = tickAmount;\n            tickAmount = 5;\n        }\n        this.tickAmount = tickAmount;\n    }\n    /**\n     * When using multiple axes, adjust the number of ticks to match the highest\n     * number of ticks in that group.\n     *\n     * @private\n     * @function Highcharts.Axis#adjustTickAmount\n     */\n    adjustTickAmount() {\n        const axis = this, { finalTickAmt, max, min, options, tickPositions, tickAmount, thresholdAlignment } = axis, currentTickAmount = tickPositions?.length, threshold = pick(axis.threshold, axis.softThreshold ? 0 : null);\n        let len, i, tickInterval = axis.tickInterval, thresholdTickIndex;\n        const \n        // Extend the tickPositions by appending a position\n        append = () => tickPositions.push(correctFloat(tickPositions[tickPositions.length - 1] +\n            tickInterval)), \n        // Extend the tickPositions by prepending a position\n        prepend = () => tickPositions.unshift(correctFloat(tickPositions[0] - tickInterval));\n        // If `thresholdAlignment` is a number, it means the `alignThresholds`\n        // option is true. The `thresholdAlignment` is a scalar value between 0\n        // and 1 for where the threshold should be relative to `axis.min` and\n        // `axis.max`. Now that we know the tick amount, convert this to the\n        // tick index. Unless `thresholdAlignment` is exactly 0 or 1, avoid the\n        // first or last tick because that would lead to series being clipped.\n        if (isNumber(thresholdAlignment)) {\n            thresholdTickIndex = thresholdAlignment < 0.5 ?\n                Math.ceil(thresholdAlignment * (tickAmount - 1)) :\n                Math.floor(thresholdAlignment * (tickAmount - 1));\n            if (options.reversed) {\n                thresholdTickIndex = tickAmount - 1 - thresholdTickIndex;\n            }\n        }\n        if (axis.hasData() && isNumber(min) && isNumber(max)) { // #14769\n            // Adjust extremes and translation to the modified tick positions\n            const adjustExtremes = () => {\n                axis.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n                // Do not crop when ticks are not extremes (#9841)\n                axis.min = options.startOnTick ?\n                    tickPositions[0] :\n                    Math.min(min, tickPositions[0]);\n                axis.max = options.endOnTick ?\n                    tickPositions[tickPositions.length - 1] :\n                    Math.max(max, tickPositions[tickPositions.length - 1]);\n            };\n            // When the axis is subject to the alignThresholds option. Use\n            // axis.threshold because the local threshold includes the\n            // `softThreshold`.\n            if (isNumber(thresholdTickIndex) && isNumber(axis.threshold)) {\n                // Throw away the previously computed tickPositions and start\n                // from scratch with only the threshold itself, then add ticks\n                // below the threshold first, then fill up above the threshold.\n                // If we are not able to fill up to axis.max, double the\n                // tickInterval and run again.\n                while (tickPositions[thresholdTickIndex] !== threshold ||\n                    tickPositions.length !== tickAmount ||\n                    tickPositions[0] > min ||\n                    tickPositions[tickPositions.length - 1] < max) {\n                    tickPositions.length = 0;\n                    tickPositions.push(axis.threshold);\n                    while (tickPositions.length < tickAmount) {\n                        if (\n                        // Start by prepending positions until the threshold\n                        // is at the required index...\n                        tickPositions[thresholdTickIndex] === void 0 ||\n                            tickPositions[thresholdTickIndex] > axis.threshold) {\n                            prepend();\n                        }\n                        else {\n                            // ... then append positions until we have the\n                            // required length\n                            append();\n                        }\n                    }\n                    // Safety vent\n                    if (tickInterval > axis.tickInterval * 8) {\n                        break;\n                    }\n                    tickInterval *= 2;\n                }\n                adjustExtremes();\n            }\n            else if (currentTickAmount < tickAmount) {\n                while (tickPositions.length < tickAmount) {\n                    // Extend evenly for both sides unless we're on the\n                    // threshold (#3965)\n                    if (tickPositions.length % 2 || min === threshold) {\n                        append();\n                    }\n                    else {\n                        prepend();\n                    }\n                }\n                adjustExtremes();\n            }\n            // The finalTickAmt property is set in getTickAmount\n            if (defined(finalTickAmt)) {\n                i = len = tickPositions.length;\n                while (i--) {\n                    if (\n                    // Remove every other tick\n                    (finalTickAmt === 3 && i % 2 === 1) ||\n                        // Remove all but first and last\n                        (finalTickAmt <= 2 && i > 0 && i < len - 1)) {\n                        tickPositions.splice(i, 1);\n                    }\n                }\n                axis.finalTickAmt = void 0;\n            }\n        }\n    }\n    /**\n     * Set the scale based on data min and max, user set min and max or options.\n     *\n     * @private\n     * @function Highcharts.Axis#setScale\n     *\n     * @emits Highcharts.Axis#event:afterSetScale\n     */\n    setScale() {\n        const axis = this, { coll, stacking } = axis;\n        let isDirtyData = false, isXAxisDirty = false;\n        axis.series.forEach((series) => {\n            isDirtyData = isDirtyData || series.isDirtyData || series.isDirty;\n            // When x axis is dirty, we need new data extremes for y as\n            // well:\n            isXAxisDirty = (isXAxisDirty ||\n                (series.xAxis && series.xAxis.isDirty) ||\n                false);\n        });\n        // Set the new axisLength\n        axis.setAxisSize();\n        const isDirtyAxisLength = axis.len !== (axis.old && axis.old.len);\n        // Do we really need to go through all this?\n        if (isDirtyAxisLength ||\n            isDirtyData ||\n            isXAxisDirty ||\n            axis.isLinked ||\n            axis.forceRedraw ||\n            axis.userMin !== (axis.old && axis.old.userMin) ||\n            axis.userMax !== (axis.old && axis.old.userMax) ||\n            axis.alignToOthers()) {\n            if (stacking && coll === 'yAxis') {\n                stacking.buildStacks();\n            }\n            axis.forceRedraw = false;\n            // #18066 delete minRange property to ensure that it will be\n            // calculated again after dirty data in series\n            if (!axis.userMinRange) {\n                axis.minRange = void 0;\n            }\n            // Get data extremes if needed\n            axis.getSeriesExtremes();\n            // Get fixed positions based on tickInterval\n            axis.setTickInterval();\n            if (stacking && coll === 'xAxis') {\n                stacking.buildStacks();\n            }\n            // Mark as dirty if it is not already set to dirty and extremes have\n            // changed. #595.\n            if (!axis.isDirty) {\n                axis.isDirty =\n                    isDirtyAxisLength ||\n                        axis.min !== axis.old?.min ||\n                        axis.max !== axis.old?.max;\n            }\n        }\n        else if (stacking) {\n            stacking.cleanStacks();\n        }\n        // Recalculate all extremes object when the data has changed. It is\n        // required when vertical panning is enabled.\n        if (isDirtyData) {\n            delete axis.allExtremes;\n        }\n        fireEvent(this, 'afterSetScale');\n    }\n    /**\n     * Set the minimum and maximum of the axes after render time. If the\n     * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n     * values are rounded off to the nearest tick. To prevent this, these\n     * options can be set to false before calling setExtremes. Also, setExtremes\n     * will not allow a range lower than the `minRange` option, which by default\n     * is the range of five points.\n     *\n     * @sample highcharts/members/axis-setextremes/\n     *         Set extremes from a button\n     * @sample highcharts/members/axis-setextremes-datetime/\n     *         Set extremes on a datetime axis\n     * @sample highcharts/members/axis-setextremes-off-ticks/\n     *         Set extremes off ticks\n     * @sample stock/members/axis-setextremes/\n     *         Set extremes in Highcharts Stock\n     *\n     * @function Highcharts.Axis#setExtremes\n     *\n     * @param {number} [newMin]\n     * The new minimum value.\n     *\n     * @param {number} [newMax]\n     * The new maximum value.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart or wait for an explicit call to\n     * {@link Highcharts.Chart#redraw}\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation=true]\n     * Enable or modify animations.\n     *\n     * @param {*} [eventArguments]\n     * Arguments to be accessed in event handler.\n     *\n     * @emits Highcharts.Axis#event:setExtremes\n     */\n    setExtremes(min, max, redraw = true, animation, eventArguments) {\n        this.series.forEach((serie) => {\n            delete serie.kdTree;\n        });\n        // Extend the arguments with min and max\n        eventArguments = extend(eventArguments, { min, max });\n        // Fire the event\n        fireEvent(this, 'setExtremes', eventArguments, (e) => {\n            this.userMin = e.min;\n            this.userMax = e.max;\n            this.eventArgs = e;\n            if (redraw) {\n                this.chart.redraw(animation);\n            }\n        });\n    }\n    /**\n     * Update the axis metrics.\n     *\n     * @private\n     * @function Highcharts.Axis#setAxisSize\n     */\n    setAxisSize() {\n        const chart = this.chart, options = this.options, \n        // [top, right, bottom, left]\n        offsets = options.offsets || [0, 0, 0, 0], horiz = this.horiz, \n        // Check for percentage based input values. Rounding fixes problems\n        // with column overflow and plot line filtering (#4898, #4899)\n        width = this.width = Math.round(relativeLength(pick(options.width, chart.plotWidth - offsets[3] + offsets[1]), chart.plotWidth)), height = this.height = Math.round(relativeLength(pick(options.height, chart.plotHeight - offsets[0] + offsets[2]), chart.plotHeight)), top = this.top = Math.round(relativeLength(pick(options.top, chart.plotTop + offsets[0]), chart.plotHeight, chart.plotTop)), left = this.left = Math.round(relativeLength(pick(options.left, chart.plotLeft + offsets[3]), chart.plotWidth, chart.plotLeft));\n        // Expose basic values to use in Series object and navigator\n        this.bottom = chart.chartHeight - height - top;\n        this.right = chart.chartWidth - width - left;\n        // Direction agnostic properties\n        this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n        /**\n         * The position of the axis in terms of pixels, compared to the chart\n         * edge. In a horizontal axis it is the same as `chart.plotLeft` unless\n         * the axis is explicitly positioned, and in a default vertical axis it\n         * is the same as `chart.plotTop`.\n         *\n         * @name Highcharts.Axis#pos\n         * @type {number}\n         */\n        this.pos = horiz ? left : top; // Distance from SVG origin\n    }\n    /**\n     * Get the current extremes for the axis.\n     *\n     * @sample highcharts/members/axis-getextremes/\n     *         Report extremes by click on a button\n     *\n     * @function Highcharts.Axis#getExtremes\n     *\n     * @return {Highcharts.ExtremesObject}\n     * An object containing extremes information.\n     */\n    getExtremes() {\n        const axis = this, log = axis.logarithmic;\n        return {\n            min: log ?\n                correctFloat(log.lin2log(axis.min)) :\n                axis.min,\n            max: log ?\n                correctFloat(log.lin2log(axis.max)) :\n                axis.max,\n            dataMin: axis.dataMin,\n            dataMax: axis.dataMax,\n            userMin: axis.userMin,\n            userMax: axis.userMax\n        };\n    }\n    /**\n     * Get the zero plane either based on zero or on the min or max value.\n     * Used in bar and area plots.\n     *\n     * @function Highcharts.Axis#getThreshold\n     *\n     * @param {number} threshold\n     * The threshold in axis values.\n     *\n     * @return {number}\n     * The translated threshold position in terms of pixels, and corrected to\n     * stay within the axis bounds.\n     */\n    getThreshold(threshold) {\n        const axis = this, log = axis.logarithmic, realMin = log ? log.lin2log(axis.min) : axis.min, realMax = log ? log.lin2log(axis.max) : axis.max;\n        if (threshold === null || threshold === -Infinity) {\n            threshold = realMin;\n        }\n        else if (threshold === Infinity) {\n            threshold = realMax;\n        }\n        else if (realMin > threshold) {\n            threshold = realMin;\n        }\n        else if (realMax < threshold) {\n            threshold = realMax;\n        }\n        return axis.translate(threshold, 0, 1, 0, 1);\n    }\n    /**\n     * Compute auto alignment for the axis label based on which side the axis is\n     * on and the given rotation for the label.\n     *\n     * @private\n     * @function Highcharts.Axis#autoLabelAlign\n     *\n     * @param {number} rotation\n     * The rotation in degrees as set by either the `rotation` or `autoRotation`\n     * options.\n     *\n     * @return {Highcharts.AlignValue}\n     * Can be `\"center\"`, `\"left\"` or `\"right\"`.\n     */\n    autoLabelAlign(rotation) {\n        const angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360, evt = { align: 'center' };\n        fireEvent(this, 'autoLabelAlign', evt, function (e) {\n            if (angle > 15 && angle < 165) {\n                e.align = 'right';\n            }\n            else if (angle > 195 && angle < 345) {\n                e.align = 'left';\n            }\n        });\n        return evt.align;\n    }\n    /**\n     * Get the tick length and width for the axis based on axis options.\n     *\n     * @private\n     * @function Highcharts.Axis#tickSize\n     *\n     * @param {string} [prefix]\n     * 'tick' or 'minorTick'\n     *\n     * @return {Array<number,number>|undefined}\n     * An array of tickLength and tickWidth\n     */\n    tickSize(prefix) {\n        const options = this.options, tickWidth = pick(options[prefix === 'tick' ? 'tickWidth' : 'minorTickWidth'], \n        // Default to 1 on linear and datetime X axes\n        prefix === 'tick' && this.isXAxis && !this.categories ? 1 : 0);\n        let tickLength = options[prefix === 'tick' ? 'tickLength' : 'minorTickLength'], tickSize;\n        if (tickWidth && tickLength) {\n            // Negate the length\n            if (options[prefix + 'Position'] === 'inside') {\n                tickLength = -tickLength;\n            }\n            tickSize = [tickLength, tickWidth];\n        }\n        const e = { tickSize };\n        fireEvent(this, 'afterTickSize', e);\n        return e.tickSize;\n    }\n    /**\n     * Return the size of the labels.\n     *\n     * @private\n     * @function Highcharts.Axis#labelMetrics\n     */\n    labelMetrics() {\n        const renderer = this.chart.renderer, ticks = this.ticks, tick = ticks[Object.keys(ticks)[0]] || {};\n        return this.chart.renderer.fontMetrics(tick.label ||\n            tick.movedLabel ||\n            renderer.box);\n    }\n    /**\n     * Prevent the ticks from getting so close we can't draw the labels. On a\n     * horizontal axis, this is handled by rotating the labels, removing ticks\n     * and adding ellipsis. On a vertical axis remove ticks and add ellipsis.\n     *\n     * @private\n     * @function Highcharts.Axis#unsquish\n     */\n    unsquish() {\n        const labelOptions = this.options.labels, padding = labelOptions.padding || 0, horiz = this.horiz, tickInterval = this.tickInterval, slotSize = this.len / (((this.categories ? 1 : 0) +\n            this.max -\n            this.min) /\n            tickInterval), rotationOption = labelOptions.rotation, \n        // We don't know the actual rendered line height at this point, but\n        // it defaults to 0.8em\n        lineHeight = correctFloat(this.labelMetrics().h * 0.8), range = Math.max(this.max - this.min, 0), \n        // Return the multiple of tickInterval that is needed to avoid\n        // collision\n        getStep = function (spaceNeeded) {\n            let step = (spaceNeeded + 2 * padding) / (slotSize || 1);\n            step = step > 1 ? Math.ceil(step) : 1;\n            // Guard for very small or negative angles (#9835)\n            if (step * tickInterval > range &&\n                spaceNeeded !== Infinity &&\n                slotSize !== Infinity &&\n                range) {\n                step = Math.ceil(range / tickInterval);\n            }\n            return correctFloat(step * tickInterval);\n        };\n        let newTickInterval = tickInterval, rotation, bestScore = Number.MAX_VALUE, autoRotation;\n        if (horiz) {\n            if (!labelOptions.staggerLines) {\n                if (isNumber(rotationOption)) {\n                    autoRotation = [rotationOption];\n                }\n                else if (slotSize < labelOptions.autoRotationLimit) {\n                    autoRotation = labelOptions.autoRotation;\n                }\n            }\n            if (autoRotation) {\n                let step, score;\n                // Loop over the given autoRotation options, and determine which\n                // gives the best score. The best score is that with the lowest\n                // number of steps and a rotation closest to horizontal.\n                for (const rot of autoRotation) {\n                    if (rot === rotationOption ||\n                        (rot && rot >= -90 && rot <= 90)) { // #3891\n                        step = getStep(Math.abs(lineHeight / Math.sin(deg2rad * rot)));\n                        score = step + Math.abs(rot / 360);\n                        if (score < bestScore) {\n                            bestScore = score;\n                            rotation = rot;\n                            newTickInterval = step;\n                        }\n                    }\n                }\n            }\n        }\n        else { // #4411\n            newTickInterval = getStep(lineHeight * 0.75);\n        }\n        this.autoRotation = autoRotation;\n        this.labelRotation = pick(rotation, isNumber(rotationOption) ? rotationOption : 0);\n        return labelOptions.step ? tickInterval : newTickInterval;\n    }\n    /**\n     * Get the general slot width for labels/categories on this axis. This may\n     * change between the pre-render (from Axis.getOffset) and the final tick\n     * rendering and placement.\n     *\n     * @private\n     * @function Highcharts.Axis#getSlotWidth\n     *\n     * @param {Highcharts.Tick} [tick] Optionally, calculate the slot width\n     * basing on tick label. It is used in highcharts-3d module, where the slots\n     * has different widths depending on perspective angles.\n     *\n     * @return {number}\n     * The pixel width allocated to each axis label.\n     */\n    getSlotWidth(tick) {\n        // #5086, #1580, #1931\n        const chart = this.chart, horiz = this.horiz, labelOptions = this.options.labels, slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), marginLeft = chart.margin[3];\n        // Used by grid axis\n        if (tick && isNumber(tick.slotWidth)) { // #13221, can be 0\n            return tick.slotWidth;\n        }\n        if (horiz && labelOptions.step < 2) {\n            if (labelOptions.rotation) { // #4415\n                return 0;\n            }\n            return ((this.staggerLines || 1) * this.len) / slotCount;\n        }\n        if (!horiz) {\n            // #7028\n            const cssWidth = labelOptions.style.width;\n            if (cssWidth !== void 0) {\n                return parseInt(String(cssWidth), 10);\n            }\n            if (marginLeft) {\n                return marginLeft - chart.spacing[3];\n            }\n        }\n        // Last resort, a fraction of the available size\n        return chart.chartWidth * 0.33;\n    }\n    /**\n     * Render the axis labels and determine whether ellipsis or rotation need to\n     * be applied.\n     *\n     * @private\n     * @function Highcharts.Axis#renderUnsquish\n     */\n    renderUnsquish() {\n        const chart = this.chart, renderer = chart.renderer, tickPositions = this.tickPositions, ticks = this.ticks, labelOptions = this.options.labels, labelStyleOptions = labelOptions.style, horiz = this.horiz, slotWidth = this.getSlotWidth(), innerWidth = Math.max(1, Math.round(slotWidth - (horiz ?\n            2 * (labelOptions.padding || 0) :\n            labelOptions.distance || 0 // #21172\n        ))), attr = {}, labelMetrics = this.labelMetrics(), textOverflowOption = labelStyleOptions.textOverflow;\n        let commonWidth, commonTextOverflow, maxLabelLength = 0, label, i, pos;\n        // Set rotation option unless it is \"auto\", like in gauges\n        if (!isString(labelOptions.rotation)) {\n            // #4443\n            attr.rotation = labelOptions.rotation || 0;\n        }\n        // Get the longest label length\n        tickPositions.forEach(function (tickPosition) {\n            const tick = ticks[tickPosition];\n            // Replace label - sorting animation\n            if (tick.movedLabel) {\n                tick.replaceMovedLabel();\n            }\n            if (tick &&\n                tick.label &&\n                tick.label.textPxLength > maxLabelLength) {\n                maxLabelLength = tick.label.textPxLength;\n            }\n        });\n        this.maxLabelLength = maxLabelLength;\n        // Handle auto rotation on horizontal axis\n        if (this.autoRotation) {\n            // Apply rotation only if the label is too wide for the slot, and\n            // the label is wider than its height.\n            if (maxLabelLength > innerWidth &&\n                maxLabelLength > labelMetrics.h) {\n                attr.rotation = this.labelRotation;\n            }\n            else {\n                this.labelRotation = 0;\n            }\n            // Handle word-wrap or ellipsis on vertical axis\n        }\n        else if (slotWidth) {\n            // For word-wrap or ellipsis\n            commonWidth = innerWidth;\n            if (!textOverflowOption) {\n                commonTextOverflow = 'clip';\n                // On vertical axis, only allow word wrap if there is room\n                // for more lines.\n                i = tickPositions.length;\n                while (!horiz && i--) {\n                    pos = tickPositions[i];\n                    label = ticks[pos].label;\n                    if (label) {\n                        // Reset ellipsis in order to get the correct\n                        // bounding box (#4070)\n                        if (label.styles.textOverflow === 'ellipsis') {\n                            label.css({ textOverflow: 'clip' });\n                            // Set the correct width in order to read\n                            // the bounding box height (#4678, #5034)\n                        }\n                        else if (label.textPxLength > slotWidth) {\n                            label.css({ width: slotWidth + 'px' });\n                        }\n                        if (label.getBBox().height > (this.len / tickPositions.length -\n                            (labelMetrics.h - labelMetrics.f))) {\n                            label.specificTextOverflow = 'ellipsis';\n                        }\n                    }\n                }\n            }\n        }\n        // Add ellipsis if the label length is significantly longer than ideal\n        if (attr.rotation) {\n            commonWidth = (maxLabelLength > chart.chartHeight * 0.5 ?\n                chart.chartHeight * 0.33 :\n                maxLabelLength);\n            if (!textOverflowOption) {\n                commonTextOverflow = 'ellipsis';\n            }\n        }\n        // Set the explicit or automatic label alignment\n        this.labelAlign = labelOptions.align ||\n            this.autoLabelAlign(this.labelRotation);\n        if (this.labelAlign) {\n            attr.align = this.labelAlign;\n        }\n        // Apply general and specific CSS\n        tickPositions.forEach(function (pos) {\n            const tick = ticks[pos], label = tick && tick.label, widthOption = labelStyleOptions.width, css = {};\n            if (label) {\n                // This needs to go before the CSS in old IE (#4502)\n                label.attr(attr);\n                if (tick.shortenLabel) {\n                    tick.shortenLabel();\n                }\n                else if (commonWidth &&\n                    !widthOption &&\n                    // Setting width in this case messes with the bounding box\n                    // (#7975)\n                    labelStyleOptions.whiteSpace !== 'nowrap' &&\n                    (\n                    // Speed optimizing, #7656\n                    commonWidth < label.textPxLength ||\n                        // Resetting CSS, #4928\n                        label.element.tagName === 'SPAN')) {\n                    css.width = commonWidth + 'px';\n                    if (!textOverflowOption) {\n                        css.textOverflow = (label.specificTextOverflow ||\n                            commonTextOverflow);\n                    }\n                    label.css(css);\n                    // Reset previously shortened label (#8210)\n                }\n                else if (label.styles.width && !css.width && !widthOption) {\n                    label.css({ width: null });\n                }\n                delete label.specificTextOverflow;\n                tick.rotation = attr.rotation;\n            }\n        }, this);\n        // Note: Why is this not part of getLabelPosition?\n        this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n    }\n    /**\n     * Return true if the axis has associated data.\n     *\n     * @function Highcharts.Axis#hasData\n     *\n     * @return {boolean}\n     * True if the axis has associated visible series and those series have\n     * either valid data points or explicit `min` and `max` settings.\n     */\n    hasData() {\n        return this.series.some(function (s) {\n            return s.hasData();\n        }) ||\n            (this.options.showEmpty &&\n                defined(this.min) &&\n                defined(this.max));\n    }\n    /**\n     * Adds the title defined in axis.options.title.\n     *\n     * @function Highcharts.Axis#addTitle\n     *\n     * @param {boolean} [display]\n     * Whether or not to display the title.\n     */\n    addTitle(display) {\n        const axis = this, renderer = axis.chart.renderer, horiz = axis.horiz, opposite = axis.opposite, options = axis.options, axisTitleOptions = options.title, styledMode = axis.chart.styledMode;\n        let textAlign;\n        if (!axis.axisTitle) {\n            textAlign = axisTitleOptions.textAlign;\n            if (!textAlign) {\n                textAlign = (horiz ? {\n                    low: 'left',\n                    middle: 'center',\n                    high: 'right'\n                } : {\n                    low: opposite ? 'right' : 'left',\n                    middle: 'center',\n                    high: opposite ? 'left' : 'right'\n                })[axisTitleOptions.align];\n            }\n            axis.axisTitle = renderer\n                .text(axisTitleOptions.text || '', 0, 0, axisTitleOptions.useHTML)\n                .attr({\n                zIndex: 7,\n                rotation: axisTitleOptions.rotation || 0,\n                align: textAlign\n            })\n                .addClass('highcharts-axis-title');\n            // #7814, don't mutate style option\n            if (!styledMode) {\n                axis.axisTitle.css(merge(axisTitleOptions.style));\n            }\n            axis.axisTitle.add(axis.axisGroup);\n            axis.axisTitle.isNew = true;\n        }\n        // Max width defaults to the length of the axis\n        if (!styledMode &&\n            !axisTitleOptions.style.width &&\n            !axis.isRadial) {\n            axis.axisTitle.css({\n                width: axis.len + 'px'\n            });\n        }\n        // Hide or show the title depending on whether showEmpty is set\n        axis.axisTitle[display ? 'show' : 'hide'](display);\n    }\n    /**\n     * Generates a tick for initial positioning.\n     *\n     * @private\n     * @function Highcharts.Axis#generateTick\n     *\n     * @param {number} pos\n     * The tick position in axis values.\n     *\n     * @param {number} [i]\n     * The index of the tick in {@link Axis.tickPositions}.\n     */\n    generateTick(pos) {\n        const axis = this, ticks = axis.ticks;\n        if (!ticks[pos]) {\n            ticks[pos] = new Tick(axis, pos);\n        }\n        else {\n            ticks[pos].addLabel(); // Update labels depending on tick interval\n        }\n    }\n    /**\n     * Create the axisGroup and gridGroup elements on first iteration.\n     *\n     * @private\n     * @function Highcharts.Axis#getOffset\n     *\n     * @emits Highcharts.Axis#event:afterGetOffset\n     */\n    createGroups() {\n        const { axisParent, // Used in color axis\n        chart, coll, options } = this, renderer = chart.renderer;\n        const createGroup = (name, suffix, zIndex) => renderer.g(name)\n            .attr({ zIndex })\n            .addClass(`highcharts-${coll.toLowerCase()}${suffix} ` +\n            (this.isRadial ? `highcharts-radial-axis${suffix} ` : '') +\n            (options.className || ''))\n            .add(axisParent);\n        if (!this.axisGroup) {\n            this.gridGroup = createGroup('grid', '-grid', options.gridZIndex);\n            this.axisGroup = createGroup('axis', '', options.zIndex);\n            this.labelGroup = createGroup('axis-labels', '-labels', options.labels.zIndex);\n        }\n    }\n    /**\n     * Render the tick labels to a preliminary position to get their sizes\n     *\n     * @private\n     * @function Highcharts.Axis#getOffset\n     *\n     * @emits Highcharts.Axis#event:afterGetOffset\n     */\n    getOffset() {\n        const axis = this, { chart, horiz, options, side, ticks, tickPositions, coll } = axis, invertedSide = (chart.inverted && !axis.isZAxis ?\n            [1, 0, 3, 2][side] :\n            side), hasData = axis.hasData(), axisTitleOptions = options.title, labelOptions = options.labels, hasCrossing = isNumber(options.crossing), axisOffset = chart.axisOffset, clipOffset = chart.clipOffset, directionFactor = [-1, 1, 1, -1][side];\n        let showAxis, titleOffset = 0, titleOffsetOption, titleMargin = 0, labelOffset = 0, // Reset\n        labelOffsetPadded, lineHeightCorrection;\n        // For reuse in Axis.render\n        axis.showAxis = showAxis = hasData || options.showEmpty;\n        // Set/reset staggerLines\n        axis.staggerLines = (axis.horiz && labelOptions.staggerLines) || void 0;\n        axis.createGroups();\n        if (hasData || axis.isLinked) {\n            // Generate ticks\n            tickPositions.forEach(function (pos) {\n                axis.generateTick(pos);\n            });\n            axis.renderUnsquish();\n            // Left side must be align: right and right side must\n            // have align: left for labels\n            axis.reserveSpaceDefault = (side === 0 ||\n                side === 2 ||\n                { 1: 'left', 3: 'right' }[side] === axis.labelAlign);\n            if (pick(labelOptions.reserveSpace, hasCrossing ? false : null, axis.labelAlign === 'center' ? true : null, axis.reserveSpaceDefault)) {\n                tickPositions.forEach(function (pos) {\n                    // Get the highest offset\n                    labelOffset = Math.max(ticks[pos].getLabelSize(), labelOffset);\n                });\n            }\n            if (axis.staggerLines) {\n                labelOffset *= axis.staggerLines;\n            }\n            axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n        }\n        else { // Doesn't have data\n            objectEach(ticks, function (tick, n) {\n                tick.destroy();\n                delete ticks[n];\n            });\n        }\n        if (axisTitleOptions?.text &&\n            axisTitleOptions.enabled !== false) {\n            axis.addTitle(showAxis);\n            if (showAxis &&\n                !hasCrossing &&\n                axisTitleOptions.reserveSpace !== false) {\n                axis.titleOffset = titleOffset =\n                    axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n                titleOffsetOption = axisTitleOptions.offset;\n                titleMargin = defined(titleOffsetOption) ?\n                    0 :\n                    pick(axisTitleOptions.margin, horiz ? 5 : 10);\n            }\n        }\n        // Render the axis line\n        axis.renderLine();\n        // Handle automatic or user set offset\n        axis.offset = directionFactor * pick(options.offset, axisOffset[side] ? axisOffset[side] + (options.margin || 0) : 0);\n        axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // Polar\n        if (side === 0) {\n            lineHeightCorrection = -axis.labelMetrics().h;\n        }\n        else if (side === 2) {\n            lineHeightCorrection = axis.tickRotCorr.y;\n        }\n        else {\n            lineHeightCorrection = 0;\n        }\n        // Find the padded label offset\n        labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n        if (labelOffset) {\n            labelOffsetPadded -= lineHeightCorrection;\n            labelOffsetPadded += directionFactor * (horiz ?\n                pick(labelOptions.y, axis.tickRotCorr.y +\n                    directionFactor * labelOptions.distance) :\n                pick(labelOptions.x, directionFactor * labelOptions.distance));\n        }\n        axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n        if (axis.getMaxLabelDimensions) {\n            axis.maxLabelDimensions = axis.getMaxLabelDimensions(ticks, tickPositions);\n        }\n        // Due to GridAxis.tickSize, tickSize should be calculated after ticks\n        // has rendered.\n        if (coll !== 'colorAxis' && clipOffset) {\n            const tickSize = this.tickSize('tick');\n            axisOffset[side] = Math.max(axisOffset[side], (axis.axisTitleMargin || 0) + titleOffset +\n                directionFactor * axis.offset, labelOffsetPadded, // #3027\n            tickPositions && tickPositions.length && tickSize ?\n                tickSize[0] + directionFactor * axis.offset :\n                0 // #4866\n            );\n            // Decide the clipping needed to keep the graph inside\n            // the plot area and axis lines\n            const clip = !axis.axisLine || options.offset ?\n                0 :\n                // #4308, #4371\n                axis.axisLine.strokeWidth() / 2;\n            clipOffset[invertedSide] = Math.max(clipOffset[invertedSide], clip);\n        }\n        fireEvent(this, 'afterGetOffset');\n    }\n    /**\n     * Internal function to get the path for the axis line. Extended for polar\n     * charts.\n     *\n     * @function Highcharts.Axis#getLinePath\n     *\n     * @param {number} lineWidth\n     * The line width in pixels.\n     *\n     * @return {Highcharts.SVGPathArray}\n     * The SVG path definition in array form.\n     */\n    getLinePath(lineWidth) {\n        const chart = this.chart, opposite = this.opposite, offset = this.offset, horiz = this.horiz, lineLeft = this.left + (opposite ? this.width : 0) + offset, lineTop = chart.chartHeight - this.bottom -\n            (opposite ? this.height : 0) + offset;\n        if (opposite) {\n            lineWidth *= -1; // Crispify the other way - #1480, #1687\n        }\n        return chart.renderer\n            .crispLine([\n            [\n                'M',\n                horiz ?\n                    this.left :\n                    lineLeft,\n                horiz ?\n                    lineTop :\n                    this.top\n            ],\n            [\n                'L',\n                horiz ?\n                    chart.chartWidth - this.right :\n                    lineLeft,\n                horiz ?\n                    lineTop :\n                    chart.chartHeight - this.bottom\n            ]\n        ], lineWidth);\n    }\n    /**\n     * Render the axis line. Called internally when rendering and redrawing the\n     * axis.\n     *\n     * @function Highcharts.Axis#renderLine\n     */\n    renderLine() {\n        if (!this.axisLine) {\n            this.axisLine = this.chart.renderer.path()\n                .addClass('highcharts-axis-line')\n                .add(this.axisGroup);\n            if (!this.chart.styledMode) {\n                this.axisLine.attr({\n                    stroke: this.options.lineColor,\n                    'stroke-width': this.options.lineWidth,\n                    zIndex: 7\n                });\n            }\n        }\n    }\n    /**\n     * Position the axis title.\n     *\n     * @private\n     * @function Highcharts.Axis#getTitlePosition\n     *\n     * @return {Highcharts.PositionObject}\n     * X and Y positions for the title.\n     */\n    getTitlePosition(axisTitle) {\n        // Compute anchor points for each of the title align options\n        const horiz = this.horiz, axisLeft = this.left, axisTop = this.top, axisLength = this.len, axisTitleOptions = this.options.title, margin = horiz ? axisLeft : axisTop, opposite = this.opposite, offset = this.offset, xOption = axisTitleOptions.x, yOption = axisTitleOptions.y, fontMetrics = this.chart.renderer.fontMetrics(axisTitle), \n        // The part of a multiline text that is below the baseline of the\n        // first line. Subtract 1 to preserve pixel-perfectness from the\n        // old behaviour (v5.0.12), where only one line was allowed.\n        textHeightOvershoot = axisTitle ? Math.max(axisTitle.getBBox(false, 0).height - fontMetrics.h - 1, 0) : 0, \n        // The position in the length direction of the axis\n        alongAxis = ({\n            low: margin + (horiz ? 0 : axisLength),\n            middle: margin + axisLength / 2,\n            high: margin + (horiz ? axisLength : 0)\n        })[axisTitleOptions.align], \n        // The position in the perpendicular direction of the axis\n        offAxis = (horiz ? axisTop + this.height : axisLeft) +\n            (horiz ? 1 : -1) * // Horizontal axis reverses the margin\n                (opposite ? -1 : 1) * // So does opposite axes\n                (this.axisTitleMargin || 0) +\n            [\n                -textHeightOvershoot, // Top\n                textHeightOvershoot, // Right\n                fontMetrics.f, // Bottom\n                -textHeightOvershoot // Left\n            ][this.side], titlePosition = {\n            x: horiz ?\n                alongAxis + xOption :\n                offAxis + (opposite ? this.width : 0) + offset + xOption,\n            y: horiz ?\n                offAxis + yOption - (opposite ? this.height : 0) + offset :\n                alongAxis + yOption\n        };\n        fireEvent(this, 'afterGetTitlePosition', { titlePosition: titlePosition });\n        return titlePosition;\n    }\n    /**\n     * Render a minor tick into the given position. If a minor tick already\n     * exists in this position, move it.\n     *\n     * @function Highcharts.Axis#renderMinorTick\n     *\n     * @param {number} pos\n     * The position in axis values.\n     *\n     * @param {boolean} slideIn\n     * Whether the tick should animate in from last computed position\n     */\n    renderMinorTick(pos, slideIn) {\n        const axis = this;\n        const minorTicks = axis.minorTicks;\n        if (!minorTicks[pos]) {\n            minorTicks[pos] = new Tick(axis, pos, 'minor');\n        }\n        // Render new ticks in old position\n        if (slideIn && minorTicks[pos].isNew) {\n            minorTicks[pos].render(null, true);\n        }\n        minorTicks[pos].render(null, false, 1);\n    }\n    /**\n     * Render a major tick into the given position. If a tick already exists\n     * in this position, move it.\n     *\n     * @function Highcharts.Axis#renderTick\n     *\n     * @param {number} pos\n     * The position in axis values.\n     *\n     * @param {number} i\n     * The tick index.\n     *\n     * @param {boolean} slideIn\n     * Whether the tick should animate in from last computed position\n     */\n    renderTick(pos, i, slideIn) {\n        const axis = this, isLinked = axis.isLinked, ticks = axis.ticks;\n        // Linked axes need an extra check to find out if\n        if (!isLinked ||\n            (pos >= axis.min && pos <= axis.max) ||\n            (axis.grid && axis.grid.isColumn)) {\n            if (!ticks[pos]) {\n                ticks[pos] = new Tick(axis, pos);\n            }\n            // NOTE this seems like overkill. Could be handled in tick.render by\n            // setting old position in attr, then set new position in animate.\n            // render new ticks in old position\n            if (slideIn && ticks[pos].isNew) {\n                // Start with negative opacity so that it is visible from\n                // halfway into the animation\n                ticks[pos].render(i, true, -1);\n            }\n            ticks[pos].render(i);\n        }\n    }\n    /**\n     * Render the axis.\n     *\n     * @private\n     * @function Highcharts.Axis#render\n     *\n     * @emits Highcharts.Axis#event:afterRender\n     */\n    render() {\n        const axis = this, chart = axis.chart, log = axis.logarithmic, renderer = chart.renderer, options = axis.options, isLinked = axis.isLinked, tickPositions = axis.tickPositions, axisTitle = axis.axisTitle, ticks = axis.ticks, minorTicks = axis.minorTicks, alternateBands = axis.alternateBands, stackLabelOptions = options.stackLabels, alternateGridColor = options.alternateGridColor, crossing = options.crossing, tickmarkOffset = axis.tickmarkOffset, axisLine = axis.axisLine, showAxis = axis.showAxis, animation = animObject(renderer.globalAnimation);\n        let from, to;\n        // Reset\n        axis.labelEdge.length = 0;\n        axis.overlap = false;\n        // Mark all elements inActive before we go over and mark the active ones\n        [ticks, minorTicks, alternateBands].forEach(function (coll) {\n            objectEach(coll, function (tick) {\n                tick.isActive = false;\n            });\n        });\n        // Crossing\n        if (isNumber(crossing)) {\n            const otherAxis = this.isXAxis ? chart.yAxis[0] : chart.xAxis[0], directionFactor = [1, -1, -1, 1][this.side];\n            if (otherAxis) {\n                let px = otherAxis.toPixels(crossing, true);\n                if (axis.horiz) {\n                    px = otherAxis.len - px;\n                }\n                axis.offset = directionFactor * px;\n            }\n        }\n        // If the series has data draw the ticks. Else only the line and title\n        if (axis.hasData() || isLinked) {\n            const slideInTicks = axis.chart.hasRendered &&\n                axis.old && isNumber(axis.old.min);\n            // Minor ticks\n            if (axis.minorTickInterval && !axis.categories) {\n                axis.getMinorTickPositions().forEach(function (pos) {\n                    axis.renderMinorTick(pos, slideInTicks);\n                });\n            }\n            // Major ticks. Pull out the first item and render it last so that\n            // we can get the position of the neighbour label. #808.\n            if (tickPositions.length) { // #1300\n                tickPositions.forEach(function (pos, i) {\n                    axis.renderTick(pos, i, slideInTicks);\n                });\n                // In a categorized axis, the tick marks are displayed\n                // between labels. So we need to add a tick mark and\n                // grid line at the left edge of the X axis.\n                if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n                    if (!ticks[-1]) {\n                        ticks[-1] = new Tick(axis, -1, null, true);\n                    }\n                    ticks[-1].render(-1);\n                }\n            }\n            // Alternate grid color\n            if (alternateGridColor) {\n                tickPositions.forEach(function (pos, i) {\n                    to = typeof tickPositions[i + 1] !== 'undefined' ?\n                        tickPositions[i + 1] + tickmarkOffset :\n                        axis.max - tickmarkOffset;\n                    if (i % 2 === 0 &&\n                        pos < axis.max &&\n                        to <= axis.max + (chart.polar ?\n                            -tickmarkOffset :\n                            tickmarkOffset)) { // #2248, #4660\n                        if (!alternateBands[pos]) {\n                            // Should be imported from PlotLineOrBand.js, but\n                            // the dependency cycle with axis is a problem\n                            alternateBands[pos] = new H.PlotLineOrBand(axis, {});\n                        }\n                        from = pos + tickmarkOffset; // #949\n                        alternateBands[pos].options = {\n                            from: log ? log.lin2log(from) : from,\n                            to: log ? log.lin2log(to) : to,\n                            color: alternateGridColor,\n                            className: 'highcharts-alternate-grid'\n                        };\n                        alternateBands[pos].render();\n                        alternateBands[pos].isActive = true;\n                    }\n                });\n            }\n            // Custom plot lines and bands\n            if (!axis._addedPlotLB) { // Only first time\n                axis._addedPlotLB = true;\n                (options.plotLines || [])\n                    .concat(options.plotBands || [])\n                    .forEach(function (plotLineOptions) {\n                    axis\n                        .addPlotBandOrLine(plotLineOptions);\n                });\n            }\n        } // End if hasData\n        // Remove inactive ticks\n        [ticks, minorTicks, alternateBands].forEach(function (coll) {\n            const forDestruction = [], delay = animation.duration, destroyInactiveItems = function () {\n                let i = forDestruction.length;\n                while (i--) {\n                    // When resizing rapidly, the same items\n                    // may be destroyed in different timeouts,\n                    // or the may be reactivated\n                    if (coll[forDestruction[i]] &&\n                        !coll[forDestruction[i]].isActive) {\n                        coll[forDestruction[i]].destroy();\n                        delete coll[forDestruction[i]];\n                    }\n                }\n            };\n            objectEach(coll, function (tick, pos) {\n                if (!tick.isActive) {\n                    // Render to zero opacity\n                    tick.render(pos, false, 0);\n                    tick.isActive = false;\n                    forDestruction.push(pos);\n                }\n            });\n            // When the objects are finished fading out, destroy them\n            syncTimeout(destroyInactiveItems, coll === alternateBands ||\n                !chart.hasRendered ||\n                !delay ?\n                0 :\n                delay);\n        });\n        // Set the axis line path\n        if (axisLine) {\n            axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n                d: this.getLinePath(axisLine.strokeWidth())\n            });\n            axisLine.isPlaced = true;\n            // Show or hide the line depending on options.showEmpty\n            axisLine[showAxis ? 'show' : 'hide'](showAxis);\n        }\n        if (axisTitle && showAxis) {\n            axisTitle[axisTitle.isNew ? 'attr' : 'animate'](axis.getTitlePosition(axisTitle));\n            axisTitle.isNew = false;\n        }\n        // Stacked totals:\n        if (stackLabelOptions && stackLabelOptions.enabled && axis.stacking) {\n            axis.stacking.renderStackTotals();\n        }\n        // End stacked totals\n        // Record old scaling for updating/animation. Pinch base must be\n        // preserved until the pinch ends.\n        axis.old = {\n            len: axis.len,\n            max: axis.max,\n            min: axis.min,\n            transA: axis.transA,\n            userMax: axis.userMax,\n            userMin: axis.userMin\n        };\n        axis.isDirty = false;\n        fireEvent(this, 'afterRender');\n    }\n    /**\n     * Redraw the axis to reflect changes in the data or axis extremes. Called\n     * internally from Highcharts.Chart#redraw.\n     *\n     * @private\n     * @function Highcharts.Axis#redraw\n     */\n    redraw() {\n        if (this.visible) {\n            // Render the axis\n            this.render();\n            // Move plot lines and bands\n            this.plotLinesAndBands.forEach(function (plotLine) {\n                plotLine.render();\n            });\n        }\n        // Mark associated series as dirty and ready for redraw\n        this.series.forEach(function (series) {\n            series.isDirty = true;\n        });\n    }\n    /**\n     * Returns an array of axis properties, that should be untouched during\n     * reinitialization.\n     *\n     * @private\n     * @function Highcharts.Axis#getKeepProps\n     */\n    getKeepProps() {\n        return (this.keepProps || Axis.keepProps);\n    }\n    /**\n     * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n     * to fully remove the axis.\n     *\n     * @private\n     * @function Highcharts.Axis#destroy\n     *\n     * @param {boolean} [keepEvents]\n     * Whether to preserve events, used internally in Axis.update.\n     */\n    destroy(keepEvents) {\n        const axis = this, plotLinesAndBands = axis.plotLinesAndBands, eventOptions = this.eventOptions;\n        fireEvent(this, 'destroy', { keepEvents: keepEvents });\n        // Remove the events\n        if (!keepEvents) {\n            removeEvent(axis);\n        }\n        // Destroy collections\n        [axis.ticks, axis.minorTicks, axis.alternateBands].forEach(function (coll) {\n            destroyObjectProperties(coll);\n        });\n        if (plotLinesAndBands) {\n            let i = plotLinesAndBands.length;\n            while (i--) { // #1975\n                plotLinesAndBands[i].destroy();\n            }\n        }\n        // Destroy elements\n        [\n            'axisLine', 'axisTitle', 'axisGroup',\n            'gridGroup', 'labelGroup', 'cross', 'scrollbar'\n        ].forEach(function (prop) {\n            if (axis[prop]) {\n                axis[prop] = axis[prop].destroy();\n            }\n        });\n        // Destroy each generated group for plotlines and plotbands\n        for (const plotGroup in axis.plotLinesAndBandsGroups) { // eslint-disable-line guard-for-in\n            axis.plotLinesAndBandsGroups[plotGroup] =\n                axis.plotLinesAndBandsGroups[plotGroup].destroy();\n        }\n        // Delete all properties and fall back to the prototype.\n        objectEach(axis, function (val, key) {\n            if (axis.getKeepProps().indexOf(key) === -1) {\n                delete axis[key];\n            }\n        });\n        this.eventOptions = eventOptions;\n    }\n    /**\n     * Internal function to draw a crosshair.\n     *\n     * @function Highcharts.Axis#drawCrosshair\n     *\n     * @param {Highcharts.PointerEventObject} [e]\n     * The event arguments from the modified pointer event, extended with\n     * `chartX` and `chartY`\n     *\n     * @param {Highcharts.Point} [point]\n     * The Point object if the crosshair snaps to points.\n     *\n     * @emits Highcharts.Axis#event:afterDrawCrosshair\n     * @emits Highcharts.Axis#event:drawCrosshair\n     */\n    drawCrosshair(e, point) {\n        const options = this.crosshair, snap = pick(options && options.snap, true), chart = this.chart;\n        let path, pos, categorized, graphic = this.cross, crossOptions;\n        fireEvent(this, 'drawCrosshair', { e: e, point: point });\n        // Use last available event when updating non-snapped crosshairs without\n        // mouse interaction (#5287)\n        if (!e) {\n            e = this.cross && this.cross.e;\n        }\n        if (\n        // Disabled in options\n        !options ||\n            // Snap\n            ((defined(point) || !snap) === false)) {\n            this.hideCrosshair();\n        }\n        else {\n            // Get the path\n            if (!snap) {\n                pos = e &&\n                    (this.horiz ?\n                        e.chartX - this.pos :\n                        this.len - e.chartY + this.pos);\n            }\n            else if (defined(point)) {\n                // #3834\n                pos = pick(this.coll !== 'colorAxis' ?\n                    point.crosshairPos : // 3D axis extension\n                    null, this.isXAxis ?\n                    point.plotX :\n                    this.len - point.plotY);\n            }\n            if (defined(pos)) {\n                crossOptions = {\n                    // Value, only used on radial\n                    value: point && (this.isXAxis ?\n                        point.x :\n                        pick(point.stackY, point.y)),\n                    translatedValue: pos\n                };\n                if (chart.polar) {\n                    // Additional information required for crosshairs in\n                    // polar chart\n                    extend(crossOptions, {\n                        isCrosshair: true,\n                        chartX: e && e.chartX,\n                        chartY: e && e.chartY,\n                        point: point\n                    });\n                }\n                path = this.getPlotLinePath(crossOptions) ||\n                    null; // #3189\n            }\n            if (!defined(path)) {\n                this.hideCrosshair();\n                return;\n            }\n            categorized = this.categories && !this.isRadial;\n            // Draw the cross\n            if (!graphic) {\n                this.cross = graphic = chart.renderer\n                    .path()\n                    .addClass('highcharts-crosshair highcharts-crosshair-' +\n                    (categorized ? 'category ' : 'thin ') +\n                    (options.className || ''))\n                    .attr({\n                    zIndex: pick(options.zIndex, 2)\n                })\n                    .add();\n                // Presentational attributes\n                if (!chart.styledMode) {\n                    graphic.attr({\n                        stroke: options.color ||\n                            (categorized ?\n                                Color\n                                    .parse(\"#ccd3ff\" /* Palette.highlightColor20 */)\n                                    .setOpacity(0.25)\n                                    .get() :\n                                \"#cccccc\" /* Palette.neutralColor20 */),\n                        'stroke-width': pick(options.width, 1)\n                    }).css({\n                        'pointer-events': 'none'\n                    });\n                    if (options.dashStyle) {\n                        graphic.attr({\n                            dashstyle: options.dashStyle\n                        });\n                    }\n                }\n            }\n            graphic.show().attr({\n                d: path\n            });\n            if (categorized && !options.width) {\n                graphic.attr({\n                    'stroke-width': this.transA\n                });\n            }\n            this.cross.e = e;\n        }\n        fireEvent(this, 'afterDrawCrosshair', { e: e, point: point });\n    }\n    /**\n     * Hide the crosshair if visible.\n     *\n     * @function Highcharts.Axis#hideCrosshair\n     */\n    hideCrosshair() {\n        if (this.cross) {\n            this.cross.hide();\n        }\n        fireEvent(this, 'afterHideCrosshair');\n    }\n    /**\n     * Update an axis object with a new set of options. The options are merged\n     * with the existing options, so only new or altered options need to be\n     * specified.\n     *\n     * @sample highcharts/members/axis-update/\n     *         Axis update demo\n     *\n     * @function Highcharts.Axis#update\n     *\n     * @param {Highcharts.AxisOptions} options\n     * The new options that will be merged in with existing options on the axis.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart after the axis is altered. If doing more\n     * operations on the chart, it is a good idea to set redraw to false and\n     * call {@link Chart#redraw} after.\n     */\n    update(options, redraw) {\n        const chart = this.chart;\n        options = merge(this.userOptions, options);\n        this.destroy(true);\n        this.init(chart, options);\n        chart.isDirtyBox = true;\n        if (pick(redraw, true)) {\n            chart.redraw();\n        }\n    }\n    /**\n     * Remove the axis from the chart.\n     *\n     * @sample highcharts/members/chart-addaxis/\n     *         Add and remove axes\n     *\n     * @function Highcharts.Axis#remove\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart following the remove.\n     */\n    remove(redraw) {\n        const chart = this.chart, coll = this.coll, axisSeries = this.series;\n        let i = axisSeries.length;\n        // Remove associated series (#2687)\n        while (i--) {\n            if (axisSeries[i]) {\n                axisSeries[i].remove(false);\n            }\n        }\n        // Remove the axis\n        erase(chart.axes, this);\n        erase(chart[coll] || [], this);\n        chart.orderItems(coll);\n        this.destroy();\n        chart.isDirtyBox = true;\n        if (pick(redraw, true)) {\n            chart.redraw();\n        }\n    }\n    /**\n     * Update the axis title by options after render time.\n     *\n     * @sample highcharts/members/axis-settitle/\n     *         Set a new Y axis title\n     *\n     * @function Highcharts.Axis#setTitle\n     *\n     * @param {Highcharts.AxisTitleOptions} titleOptions\n     * The additional title options.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart after setting the title.\n     */\n    setTitle(titleOptions, redraw) {\n        this.update({ title: titleOptions }, redraw);\n    }\n    /**\n     * Set new axis categories and optionally redraw.\n     *\n     * @sample highcharts/members/axis-setcategories/\n     *         Set categories by click on a button\n     *\n     * @function Highcharts.Axis#setCategories\n     *\n     * @param {Array<string>} categories\n     * The new categories.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart.\n     */\n    setCategories(categories, redraw) {\n        this.update({ categories: categories }, redraw);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\n// Properties to survive after destroy, needed for Axis.update (#4317,\n// #5773, #5881).\nAxis.keepProps = [\n    'coll',\n    'extKey',\n    'hcEvents',\n    'len',\n    'names',\n    'series',\n    'userMax',\n    'userMin'\n];\n/* *\n *\n *  Default Export\n *\n * */\nexport default Axis;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Options for the path on the Axis to be calculated.\n * @interface Highcharts.AxisPlotLinePathOptionsObject\n */ /**\n* Axis value.\n* @name Highcharts.AxisPlotLinePathOptionsObject#value\n* @type {number|undefined}\n*/ /**\n* Line width used for calculation crisp line coordinates. Defaults to 1.\n* @name Highcharts.AxisPlotLinePathOptionsObject#lineWidth\n* @type {number|undefined}\n*/ /**\n* If `false`, the function will return null when it falls outside the axis\n* bounds. If `true`, the function will return a path aligned to the plot area\n* sides if it falls outside. If `pass`, it will return a path outside.\n* @name Highcharts.AxisPlotLinePathOptionsObject#force\n* @type {string|boolean|undefined}\n*/ /**\n* Used in Highcharts Stock. When `true`, plot paths\n* (crosshair, plotLines, gridLines)\n* will be rendered on all axes when defined on the first axis.\n* @name Highcharts.AxisPlotLinePathOptionsObject#acrossPanes\n* @type {boolean|undefined}\n*/ /**\n* Use old coordinates (for resizing and rescaling).\n* If not set, defaults to `false`.\n* @name Highcharts.AxisPlotLinePathOptionsObject#old\n* @type {boolean|undefined}\n*/ /**\n* If given, return the plot line path of a pixel position on the axis.\n* @name Highcharts.AxisPlotLinePathOptionsObject#translatedValue\n* @type {number|undefined}\n*/ /**\n* Used in Polar axes. Reverse the positions for concatenation of polygonal\n* plot bands\n* @name Highcharts.AxisPlotLinePathOptionsObject#reverse\n* @type {boolean|undefined}\n*/\n/**\n * Options for crosshairs on axes.\n *\n * @product highstock\n *\n * @typedef {Highcharts.XAxisCrosshairOptions|Highcharts.YAxisCrosshairOptions} Highcharts.AxisCrosshairOptions\n */\n/**\n * @typedef {\"navigator\"|\"pan\"|\"rangeSelectorButton\"|\"rangeSelectorInput\"|\"scrollbar\"|\"traverseUpButton\"|\"zoom\"} Highcharts.AxisExtremesTriggerValue\n */\n/**\n * @callback Highcharts.AxisEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n */\n/**\n * @callback Highcharts.AxisLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} this\n *\n * @param {Highcharts.AxisLabelsFormatterContextObject} ctx\n *\n * @return {string}\n */\n/**\n * @interface Highcharts.AxisLabelsFormatterContextObject\n */ /**\n* The axis item of the label\n* @name Highcharts.AxisLabelsFormatterContextObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* The chart instance.\n* @name Highcharts.AxisLabelsFormatterContextObject#chart\n* @type {Highcharts.Chart}\n*/ /**\n* Default formatting of date/time labels.\n* @name Highcharts.AxisLabelsFormatterContextObject#dateTimeLabelFormat\n* @type {string|undefined}\n*/ /**\n* Whether the label belongs to the first tick on the axis.\n* @name Highcharts.AxisLabelsFormatterContextObject#isFirst\n* @type {boolean}\n*/ /**\n* Whether the label belongs to the last tick on the axis.\n* @name Highcharts.AxisLabelsFormatterContextObject#isLast\n* @type {boolean}\n*/ /**\n* The position on the axis in terms of axis values. For category axes, a\n* zero-based index. For datetime axes, the JavaScript time in milliseconds\n* since 1970.\n* @name Highcharts.AxisLabelsFormatterContextObject#pos\n* @type {number}\n*/ /**\n* The preformatted text as the result of the default formatting. For example\n* dates will be formatted as strings, and numbers with language-specific comma\n* separators, thousands separators and numeric symbols like `k` or `M`.\n* @name Highcharts.AxisLabelsFormatterContextObject#text\n* @type {string|undefined}\n*/ /**\n* The Tick instance.\n* @name Highcharts.AxisLabelsFormatterContextObject#tick\n* @type {Highcharts.Tick}\n*/ /**\n* This can be either a numeric value or a category string.\n* @name Highcharts.AxisLabelsFormatterContextObject#value\n* @type {number|string}\n*/\n/**\n * Options for axes.\n *\n * @typedef {Highcharts.XAxisOptions|Highcharts.YAxisOptions|Highcharts.ZAxisOptions} Highcharts.AxisOptions\n */\n/**\n * @callback Highcharts.AxisPointBreakEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @param {Highcharts.AxisPointBreakEventObject} evt\n */\n/**\n * @interface Highcharts.AxisPointBreakEventObject\n */ /**\n* @name Highcharts.AxisPointBreakEventObject#brk\n* @type {Highcharts.Dictionary<number>}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#point\n* @type {Highcharts.Point}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#preventDefault\n* @type {Function}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#target\n* @type {Highcharts.SVGElement}\n*/ /**\n* @name Highcharts.AxisPointBreakEventObject#type\n* @type {\"pointBreak\"|\"pointInBreak\"}\n*/\n/**\n * @callback Highcharts.AxisSetExtremesEventCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @param {Highcharts.AxisSetExtremesEventObject} evt\n */\n/**\n * @interface Highcharts.AxisSetExtremesEventObject\n * @extends Highcharts.ExtremesObject\n */ /**\n* @name Highcharts.AxisSetExtremesEventObject#preventDefault\n* @type {Function}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#target\n* @type {Highcharts.SVGElement}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#trigger\n* @type {Highcharts.AxisExtremesTriggerValue|string}\n*/ /**\n* @name Highcharts.AxisSetExtremesEventObject#type\n* @type {\"setExtremes\"}\n*/\n/**\n * @callback Highcharts.AxisTickPositionerCallbackFunction\n *\n * @param {Highcharts.Axis} this\n *\n * @return {Highcharts.AxisTickPositionsArray}\n */\n/**\n * @interface Highcharts.AxisTickPositionsArray\n * @augments Array<number>\n */\n/**\n * @typedef {\"high\"|\"low\"|\"middle\"} Highcharts.AxisTitleAlignValue\n */\n/**\n * @typedef {Highcharts.XAxisTitleOptions|Highcharts.YAxisTitleOptions|Highcharts.ZAxisTitleOptions} Highcharts.AxisTitleOptions\n */\n/**\n * @typedef {\"linear\"|\"logarithmic\"|\"datetime\"|\"category\"|\"treegrid\"} Highcharts.AxisTypeValue\n */\n/**\n * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n * function.\n *\n * @interface Highcharts.ExtremesObject\n */ /**\n* The maximum value of the axis' associated series.\n* @name Highcharts.ExtremesObject#dataMax\n* @type {number}\n*/ /**\n* The minimum value of the axis' associated series.\n* @name Highcharts.ExtremesObject#dataMin\n* @type {number}\n*/ /**\n* The maximum axis value, either automatic or set manually. If the `max` option\n* is not set, `maxPadding` is 0 and `endOnTick` is false, this value will be\n* the same as `dataMax`.\n* @name Highcharts.ExtremesObject#max\n* @type {number}\n*/ /**\n* The minimum axis value, either automatic or set manually. If the `min` option\n* is not set, `minPadding` is 0 and `startOnTick` is false, this value will be\n* the same as `dataMin`.\n* @name Highcharts.ExtremesObject#min\n* @type {number}\n*/ /**\n* The user defined maximum, either from the `max` option or from a zoom or\n* `setExtremes` action.\n* @name Highcharts.ExtremesObject#userMax\n* @type {number|undefined}\n*/ /**\n* The user defined minimum, either from the `min` option or from a zoom or\n* `setExtremes` action.\n* @name Highcharts.ExtremesObject#userMin\n* @type {number|undefined}\n*/\n/**\n * Formatter function for the text of a crosshair label.\n *\n * @callback Highcharts.XAxisCrosshairLabelFormatterCallbackFunction\n *\n * @param {Highcharts.Axis} this\n * Axis context\n *\n * @param {number} value\n * Y value of the data point\n *\n * @return {string}\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport T from '../../Templating.js';\nconst { format } = T;\nimport SeriesRegistry from '../../Series/SeriesRegistry.js';\nconst { series: Series } = SeriesRegistry;\nimport U from '../../Utilities.js';\nconst { destroyObjectProperties, fireEvent, isNumber, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The class for stacks. Each stack, on a specific X value and either negative\n * or positive, has its own stack item.\n * @private\n */\nclass StackItem {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(axis, options, negativeValue, x, stackOption) {\n        const inverted = axis.chart.inverted, reversed = axis.reversed;\n        this.axis = axis;\n        // The stack goes to the left either if the stack has negative value\n        // or when axis is reversed. XOR operator.\n        const isNegative = (this.isNegative = !!negativeValue !== !!reversed);\n        // Save the options to be able to style the label\n        this.options = options = options || {};\n        // Save the x value to be able to position the label later\n        this.x = x;\n        // Initialize total value\n        this.total = null;\n        this.cumulative = null;\n        // This will keep each points' extremes stored by series.index and point\n        // index\n        this.points = {};\n        this.hasValidPoints = false;\n        // Save the stack option on the series configuration object,\n        // and whether to treat it as percent\n        this.stack = stackOption;\n        this.leftCliff = 0;\n        this.rightCliff = 0;\n        // The align options and text align varies on whether the stack is\n        // negative and if the chart is inverted or not.\n        // First test the user supplied value, then use the dynamic.\n        this.alignOptions = {\n            align: options.align ||\n                (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n            verticalAlign: options.verticalAlign ||\n                (inverted ? 'middle' : isNegative ? 'bottom' : 'top'),\n            y: options.y,\n            x: options.x\n        };\n        this.textAlign =\n            options.textAlign ||\n                (inverted ? (!isNegative ? 'left' : 'right') : 'center');\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    destroy() {\n        destroyObjectProperties(this, this.axis);\n    }\n    /**\n     * Renders the stack total label and adds it to the stack label group.\n     * @private\n     */\n    render(group) {\n        const chart = this.axis.chart, options = this.options, formatOption = options.format, \n        // Format the text in the label.\n        str = formatOption ?\n            format(formatOption, this, chart) :\n            options.formatter.call(this);\n        // Change the text to reflect the new total and set visibility to hidden\n        // in case the series is hidden\n        if (this.label) {\n            this.label.attr({ text: str, visibility: 'hidden' });\n        }\n        else {\n            // Create new label\n            this.label = chart.renderer.label(str, null, void 0, options.shape, void 0, void 0, options.useHTML, false, 'stack-labels');\n            const attr = {\n                r: options.borderRadius || 0,\n                text: str,\n                // Set default padding to 5 as it is in datalabels #12308\n                padding: pick(options.padding, 5),\n                visibility: 'hidden' // Hidden until setOffset is called\n            };\n            if (!chart.styledMode) {\n                attr.fill = options.backgroundColor;\n                attr.stroke = options.borderColor;\n                attr['stroke-width'] = options.borderWidth;\n                this.label.css(options.style || {});\n            }\n            this.label.attr(attr);\n            if (!this.label.added) {\n                this.label.add(group); // Add to the labels-group\n            }\n        }\n        // Rank it higher than data labels (#8742)\n        this.label.labelrank = chart.plotSizeY;\n        fireEvent(this, 'afterRender');\n    }\n    /**\n     * Sets the offset that the stack has from the x value and repositions the\n     * label.\n     * @private\n     */\n    setOffset(xOffset, width, boxBottom, boxTop, defaultX, xAxis) {\n        const { alignOptions, axis, label, options, textAlign } = this, chart = axis.chart, stackBox = this.getStackBox({\n            xOffset,\n            width,\n            boxBottom,\n            boxTop,\n            defaultX,\n            xAxis\n        }), { verticalAlign } = alignOptions;\n        if (label && stackBox) {\n            const labelBox = label.getBBox(void 0, 0), padding = label.padding;\n            let isJustify = pick(options.overflow, 'justify') === 'justify', visible;\n            // Reset alignOptions property after justify #12337\n            alignOptions.x = options.x || 0;\n            alignOptions.y = options.y || 0;\n            // Calculate the adjusted Stack position, to take into consideration\n            // The size if the labelBox and vertical alignment as\n            // well as the text alignment. It's need to be done to work with\n            // default SVGLabel.align/justify methods.\n            const { x, y } = this.adjustStackPosition({\n                labelBox,\n                verticalAlign,\n                textAlign\n            });\n            stackBox.x -= x;\n            stackBox.y -= y;\n            // Align the label to the adjusted box.\n            label.align(alignOptions, false, stackBox);\n            // Check if label is inside the plotArea #12294\n            visible = chart.isInsidePlot(label.alignAttr.x + alignOptions.x + x, label.alignAttr.y + alignOptions.y + y);\n            if (!visible) {\n                isJustify = false;\n            }\n            if (isJustify) {\n                // Justify stackLabel into the alignBox\n                Series.prototype.justifyDataLabel.call(axis, label, alignOptions, label.alignAttr, labelBox, stackBox);\n            }\n            // Add attr to avoid the default animation of justifyDataLabel.\n            // Also add correct rotation with its rotation origin. #15129\n            label.attr({\n                x: label.alignAttr.x,\n                y: label.alignAttr.y,\n                rotation: options.rotation,\n                rotationOriginX: labelBox.width * {\n                    left: 0,\n                    center: 0.5,\n                    right: 1\n                }[options.textAlign || 'center'],\n                rotationOriginY: labelBox.height / 2\n            });\n            // Check if the dataLabel should be visible.\n            if (pick(!isJustify && options.crop, true)) {\n                visible =\n                    isNumber(label.x) &&\n                        isNumber(label.y) &&\n                        chart.isInsidePlot(label.x - padding + (label.width || 0), label.y) &&\n                        chart.isInsidePlot(label.x + padding, label.y);\n            }\n            label[visible ? 'show' : 'hide']();\n        }\n        fireEvent(this, 'afterSetOffset', { xOffset, width });\n    }\n    /**\n     * Adjust the stack BBox position, to take into consideration the alignment\n     * of the dataLabel. This is necessary to make the stackDataLabel work with\n     * core methods like `SVGLabel.adjust` and `Series.justifyDataLabel`.\n     * @param AdjustStackPositionProps\n     * @return {{x: number, y: number}} Adjusted BBox position of the stack.\n     */\n    adjustStackPosition({ labelBox, verticalAlign, textAlign }) {\n        const factorMap = {\n            bottom: 0,\n            middle: 1,\n            top: 2,\n            right: 1,\n            center: 0,\n            left: -1\n        }, verticalAlignFactor = factorMap[verticalAlign], textAlignFactor = factorMap[textAlign];\n        return {\n            x: labelBox.width / 2 + (labelBox.width / 2) * textAlignFactor,\n            y: (labelBox.height / 2) * verticalAlignFactor\n        };\n    }\n    /**\n     * Get the bbox of the stack.\n     * @private\n     * @function Highcharts.StackItem#getStackBox\n     * @return {BBoxObject} The x, y, height, width of the stack.\n     */\n    getStackBox(stackBoxProps) {\n        const stackItem = this, axis = this.axis, chart = axis.chart, { boxTop, defaultX, xOffset, width, boxBottom } = stackBoxProps, totalStackValue = axis.stacking.usePercentage ?\n            100 :\n            pick(boxTop, this.total, 0), y = axis.toPixels(totalStackValue), xAxis = stackBoxProps.xAxis || chart.xAxis[0], x = pick(defaultX, xAxis.translate(this.x)) + xOffset, yZero = axis.toPixels(boxBottom ||\n            (isNumber(axis.min) &&\n                axis.logarithmic &&\n                axis.logarithmic.lin2log(axis.min)) ||\n            0), height = Math.abs(y - yZero), inverted = chart.inverted, neg = stackItem.isNegative;\n        return inverted ?\n            {\n                x: (neg ? y : y - height) - chart.plotLeft,\n                y: xAxis.height - x - width + xAxis.top - chart.plotTop,\n                width: height,\n                height: width\n            } : {\n            x: x + xAxis.transB - chart.plotLeft,\n            y: (neg ? y - height : y) - chart.plotTop,\n            width: width,\n            height: height\n        };\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default StackItem;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Stack of data points\n *\n * @product highcharts\n *\n * @interface Highcharts.StackItemObject\n */ /**\n* Alignment settings\n* @name Highcharts.StackItemObject#alignOptions\n* @type {Highcharts.AlignObject}\n*/ /**\n* Related axis\n* @name Highcharts.StackItemObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Cumulative value of the stacked data points\n* @name Highcharts.StackItemObject#cumulative\n* @type {number}\n*/ /**\n* True if on the negative side\n* @name Highcharts.StackItemObject#isNegative\n* @type {boolean}\n*/ /**\n* Related SVG element\n* @name Highcharts.StackItemObject#label\n* @type {Highcharts.SVGElement}\n*/ /**\n* Related stack options\n* @name Highcharts.StackItemObject#options\n* @type {Highcharts.YAxisStackLabelsOptions}\n*/ /**\n* Total value of the stacked data points\n* @name Highcharts.StackItemObject#total\n* @type {number}\n*/ /**\n* Shared x value of the stack\n* @name Highcharts.StackItemObject#x\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport F from '../Templating.js';\nimport H from '../Globals.js';\nconst { deg2rad } = H;\nimport U from '../Utilities.js';\nconst { clamp, correctFloat, defined, destroyObjectProperties, extend, fireEvent, isNumber, merge, objectEach, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Tick class.\n *\n * @class\n * @name Highcharts.Tick\n *\n * @param {Highcharts.Axis} axis\n * The axis of the tick.\n *\n * @param {number} pos\n * The position of the tick on the axis in terms of axis values.\n *\n * @param {string} [type]\n * The type of tick, either 'minor' or an empty string\n *\n * @param {boolean} [noLabel=false]\n * Whether to disable the label or not. Defaults to false.\n *\n * @param {Object} [parameters]\n * Optional parameters for the tick.\n */\nclass Tick {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(axis, pos, type, noLabel, parameters) {\n        this.isNew = true;\n        this.isNewLabel = true;\n        /**\n         * The related axis of the tick.\n         * @name Highcharts.Tick#axis\n         * @type {Highcharts.Axis}\n         */\n        this.axis = axis;\n        /**\n         * The logical position of the tick on the axis in terms of axis values.\n         * @name Highcharts.Tick#pos\n         * @type {number}\n         */\n        this.pos = pos;\n        /**\n         * The tick type, which can be `\"minor\"`, or an empty string.\n         * @name Highcharts.Tick#type\n         * @type {string}\n         */\n        this.type = type || '';\n        this.parameters = parameters || {};\n        /**\n         * The mark offset of the tick on the axis. Usually `undefined`, numeric\n         * for grid axes.\n         * @name Highcharts.Tick#tickmarkOffset\n         * @type {number|undefined}\n         */\n        this.tickmarkOffset = this.parameters.tickmarkOffset;\n        this.options = this.parameters.options;\n        fireEvent(this, 'init');\n        if (!type && !noLabel) {\n            this.addLabel();\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Write the tick label.\n     *\n     * @private\n     * @function Highcharts.Tick#addLabel\n     */\n    addLabel() {\n        const tick = this, axis = tick.axis, options = axis.options, chart = axis.chart, categories = axis.categories, log = axis.logarithmic, names = axis.names, pos = tick.pos, labelOptions = pick(tick.options && tick.options.labels, options.labels), tickPositions = axis.tickPositions, isFirst = pos === tickPositions[0], isLast = pos === tickPositions[tickPositions.length - 1], animateLabels = (!labelOptions.step || labelOptions.step === 1) &&\n            axis.tickInterval === 1, tickPositionInfo = tickPositions.info;\n        let label = tick.label, dateTimeLabelFormat, dateTimeLabelFormats, i;\n        // The context value\n        let value = this.parameters.category || (categories ?\n            pick(categories[pos], names[pos], pos) :\n            pos);\n        if (log && isNumber(value)) {\n            value = correctFloat(log.lin2log(value));\n        }\n        // Set the datetime label format. If a higher rank is set for this\n        // position, use that. If not, use the general format.\n        if (axis.dateTime) {\n            if (tickPositionInfo) {\n                dateTimeLabelFormats = chart.time.resolveDTLFormat(options.dateTimeLabelFormats[(!options.grid &&\n                    tickPositionInfo.higherRanks[pos]) ||\n                    tickPositionInfo.unitName]);\n                dateTimeLabelFormat = dateTimeLabelFormats.main;\n            }\n            else if (isNumber(value)) { // #1441\n                dateTimeLabelFormat = axis.dateTime.getXDateFormat(value, options.dateTimeLabelFormats ||\n                    {});\n            }\n        }\n        // Set properties for access in render method\n        /**\n         * True if the tick is the first one on the axis.\n         * @name Highcharts.Tick#isFirst\n         * @readonly\n         * @type {boolean|undefined}\n         */\n        tick.isFirst = isFirst;\n        /**\n         * True if the tick is the last one on the axis.\n         * @name Highcharts.Tick#isLast\n         * @readonly\n         * @type {boolean|undefined}\n         */\n        tick.isLast = isLast;\n        // Get the string\n        const ctx = {\n            axis,\n            chart,\n            dateTimeLabelFormat: dateTimeLabelFormat,\n            isFirst,\n            isLast,\n            pos,\n            tick: tick,\n            tickPositionInfo,\n            value\n        };\n        // Fire an event that allows modifying the context for use in\n        // `labels.format` and `labels.formatter`.\n        fireEvent(this, 'labelFormat', ctx);\n        // Label formatting. When `labels.format` is given, we first run the\n        // defaultFormatter and append the result to the context as `text`.\n        // Handy for adding prefix or suffix while keeping default number\n        // formatting.\n        const labelFormatter = (ctx) => {\n            if (labelOptions.formatter) {\n                return labelOptions.formatter.call(ctx, ctx);\n            }\n            if (labelOptions.format) {\n                ctx.text = axis.defaultLabelFormatter.call(ctx);\n                return F.format(labelOptions.format, ctx, chart);\n            }\n            return axis.defaultLabelFormatter.call(ctx);\n        };\n        const str = labelFormatter.call(ctx, ctx);\n        // Set up conditional formatting based on the format list if existing.\n        const list = dateTimeLabelFormats && dateTimeLabelFormats.list;\n        if (list) {\n            tick.shortenLabel = function () {\n                for (i = 0; i < list.length; i++) {\n                    extend(ctx, { dateTimeLabelFormat: list[i] });\n                    label.attr({\n                        text: labelFormatter.call(ctx, ctx)\n                    });\n                    if (label.getBBox().width <\n                        axis.getSlotWidth(tick) - 2 *\n                            (labelOptions.padding || 0)) {\n                        return;\n                    }\n                }\n                label.attr({\n                    text: ''\n                });\n            };\n        }\n        else {\n            // #15692\n            tick.shortenLabel = void 0;\n        }\n        // Call only after first render\n        if (animateLabels && axis._addedPlotLB) {\n            tick.moveLabel(str, labelOptions);\n        }\n        // First call\n        if (!defined(label) && !tick.movedLabel) {\n            /**\n             * The rendered text label of the tick.\n             * @name Highcharts.Tick#label\n             * @type {Highcharts.SVGElement|undefined}\n             */\n            tick.label = label = tick.createLabel(str, labelOptions);\n            // Base value to detect change for new calls to getBBox\n            tick.rotation = 0;\n            // Update\n        }\n        else if (label && label.textStr !== str && !animateLabels) {\n            // When resetting text, also reset the width if dynamically set\n            // (#8809)\n            if (label.textWidth &&\n                !labelOptions.style.width &&\n                !label.styles.width) {\n                label.css({ width: null });\n            }\n            label.attr({ text: str });\n            label.textPxLength = label.getBBox().width;\n        }\n    }\n    /**\n     * Render and return the label of the tick.\n     *\n     * @private\n     * @function Highcharts.Tick#createLabel\n     */\n    createLabel(str, labelOptions, xy) {\n        const axis = this.axis, chart = axis.chart, label = defined(str) && labelOptions.enabled ?\n            chart.renderer\n                .text(str, xy?.x, xy?.y, labelOptions.useHTML)\n                .add(axis.labelGroup) :\n            void 0;\n        // Un-rotated length\n        if (label) {\n            // Without position absolute, IE export sometimes is wrong\n            if (!chart.styledMode) {\n                label.css(merge(labelOptions.style));\n            }\n            label.textPxLength = label.getBBox().width;\n        }\n        return label;\n    }\n    /**\n     * Destructor for the tick prototype\n     *\n     * @private\n     * @function Highcharts.Tick#destroy\n     */\n    destroy() {\n        destroyObjectProperties(this, this.axis);\n    }\n    /**\n     * Gets the x and y positions for ticks in terms of pixels.\n     *\n     * @private\n     * @function Highcharts.Tick#getPosition\n     *\n     * @param {boolean} horiz\n     * Whether the tick is on an horizontal axis or not.\n     *\n     * @param {number} tickPos\n     * Position of the tick.\n     *\n     * @param {number} tickmarkOffset\n     * Tickmark offset for all ticks.\n     *\n     * @param {boolean} [old]\n     * Whether the axis has changed or not.\n     *\n     * @return {Highcharts.PositionObject}\n     * The tick position.\n     *\n     * @emits Highcharts.Tick#event:afterGetPosition\n     */\n    getPosition(horiz, tickPos, tickmarkOffset, old) {\n        const axis = this.axis, chart = axis.chart, cHeight = (old && chart.oldChartHeight) || chart.chartHeight, pos = {\n            x: horiz ?\n                correctFloat(axis.translate(tickPos + tickmarkOffset, void 0, void 0, old) +\n                    axis.transB) :\n                (axis.left +\n                    axis.offset +\n                    (axis.opposite ?\n                        (((old && chart.oldChartWidth) ||\n                            chart.chartWidth) -\n                            axis.right -\n                            axis.left) :\n                        0)),\n            y: horiz ?\n                (cHeight -\n                    axis.bottom +\n                    axis.offset -\n                    (axis.opposite ? axis.height : 0)) :\n                correctFloat(cHeight -\n                    axis.translate(tickPos + tickmarkOffset, void 0, void 0, old) -\n                    axis.transB)\n        };\n        // Chrome workaround for #10516\n        pos.y = clamp(pos.y, -1e9, 1e9);\n        fireEvent(this, 'afterGetPosition', { pos: pos });\n        return pos;\n    }\n    /**\n     * Get the x, y position of the tick label\n     * @private\n     */\n    getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n        const axis = this.axis, transA = axis.transA, reversed = ( // #7911\n        axis.isLinked && axis.linkedParent ?\n            axis.linkedParent.reversed :\n            axis.reversed), staggerLines = axis.staggerLines, rotCorr = axis.tickRotCorr || { x: 0, y: 0 }, \n        // Adjust for label alignment if we use reserveSpace: true (#5286)\n        labelOffsetCorrection = (!horiz && !axis.reserveSpaceDefault ?\n            -axis.labelOffset * (axis.labelAlign === 'center' ? 0.5 : 1) :\n            0), distance = labelOptions.distance, pos = {};\n        let yOffset, line;\n        if (axis.side === 0) {\n            yOffset = label.rotation ? -distance : -label.getBBox().height;\n        }\n        else if (axis.side === 2) {\n            yOffset = rotCorr.y + distance;\n        }\n        else {\n            // #3140, #3140\n            yOffset = Math.cos(label.rotation * deg2rad) *\n                (rotCorr.y - label.getBBox(false, 0).height / 2);\n        }\n        if (defined(labelOptions.y)) {\n            yOffset = axis.side === 0 && axis.horiz ?\n                labelOptions.y + yOffset :\n                labelOptions.y;\n        }\n        x = x +\n            pick(labelOptions.x, [0, 1, 0, -1][axis.side] * distance) +\n            labelOffsetCorrection +\n            rotCorr.x -\n            (tickmarkOffset && horiz ?\n                tickmarkOffset * transA * (reversed ? -1 : 1) :\n                0);\n        y = y + yOffset - (tickmarkOffset && !horiz ?\n            tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n        // Correct for staggered labels\n        if (staggerLines) {\n            line = (index / (step || 1) % staggerLines);\n            if (axis.opposite) {\n                line = staggerLines - line - 1;\n            }\n            y += line * (axis.labelOffset / staggerLines);\n        }\n        pos.x = x;\n        pos.y = Math.round(y);\n        fireEvent(this, 'afterGetLabelPosition', { pos: pos, tickmarkOffset: tickmarkOffset, index: index });\n        return pos;\n    }\n    /**\n     * Get the offset height or width of the label\n     *\n     * @private\n     * @function Highcharts.Tick#getLabelSize\n     */\n    getLabelSize() {\n        return this.label ?\n            this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n            0;\n    }\n    /**\n     * Extendible method to return the path of the marker\n     * @private\n     */\n    getMarkPath(x, y, tickLength, tickWidth, horiz = false, renderer) {\n        return renderer.crispLine([[\n                'M',\n                x,\n                y\n            ], [\n                'L',\n                x + (horiz ? 0 : -tickLength),\n                y + (horiz ? tickLength : 0)\n            ]], tickWidth);\n    }\n    /**\n     * Handle the label overflow by adjusting the labels to the left and right\n     * edge, or hide them if they collide into the neighbour label.\n     *\n     * @private\n     * @function Highcharts.Tick#handleOverflow\n     */\n    handleOverflow(xy) {\n        const tick = this, axis = this.axis, labelOptions = axis.options.labels, pxPos = xy.x, chartWidth = axis.chart.chartWidth, spacing = axis.chart.spacing, leftBound = pick(axis.labelLeft, Math.min(axis.pos, spacing[3])), rightBound = pick(axis.labelRight, Math.max(!axis.isRadial ? axis.pos + axis.len : 0, chartWidth - spacing[1])), label = this.label, rotation = this.rotation, factor = {\n            left: 0,\n            center: 0.5,\n            right: 1\n        }[axis.labelAlign || label.attr('align')], labelWidth = label.getBBox().width, slotWidth = axis.getSlotWidth(tick), xCorrection = factor, css = {};\n        let modifiedSlotWidth = slotWidth, goRight = 1, leftPos, rightPos, textWidth;\n        // Check if the label overshoots the chart spacing box. If it does, move\n        // it. If it now overshoots the slotWidth, add ellipsis.\n        if (!rotation && labelOptions.overflow === 'justify') {\n            leftPos = pxPos - factor * labelWidth;\n            rightPos = pxPos + (1 - factor) * labelWidth;\n            if (leftPos < leftBound) {\n                modifiedSlotWidth =\n                    xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n            }\n            else if (rightPos > rightBound) {\n                modifiedSlotWidth =\n                    rightBound - xy.x + modifiedSlotWidth * factor;\n                goRight = -1;\n            }\n            modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n            if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n                xy.x += (goRight *\n                    (slotWidth -\n                        modifiedSlotWidth -\n                        xCorrection * (slotWidth - Math.min(labelWidth, modifiedSlotWidth))));\n            }\n            // If the label width exceeds the available space, set a text width\n            // to be picked up below. Also, if a width has been set before, we\n            // need to set a new one because the reported labelWidth will be\n            // limited by the box (#3938).\n            if (labelWidth > modifiedSlotWidth ||\n                (axis.autoRotation && (label.styles || {}).width)) {\n                textWidth = modifiedSlotWidth;\n            }\n            // Add ellipsis to prevent rotated labels to be clipped against the edge\n            // of the chart\n        }\n        else if (rotation < 0 &&\n            pxPos - factor * labelWidth < leftBound) {\n            textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n        }\n        else if (rotation > 0 &&\n            pxPos + factor * labelWidth > rightBound) {\n            textWidth = Math.round((chartWidth - pxPos) /\n                Math.cos(rotation * deg2rad));\n        }\n        if (textWidth) {\n            if (tick.shortenLabel) {\n                tick.shortenLabel();\n            }\n            else {\n                css.width = Math.floor(textWidth) + 'px';\n                if (!(labelOptions.style || {}).textOverflow) {\n                    css.textOverflow = 'ellipsis';\n                }\n                label.css(css);\n            }\n        }\n    }\n    /**\n     * Try to replace the label if the same one already exists.\n     *\n     * @private\n     * @function Highcharts.Tick#moveLabel\n     */\n    moveLabel(str, labelOptions) {\n        const tick = this, label = tick.label, axis = tick.axis;\n        let moved = false, labelPos;\n        if (label && label.textStr === str) {\n            tick.movedLabel = label;\n            moved = true;\n            delete tick.label;\n        }\n        else { // Find a label with the same string\n            objectEach(axis.ticks, function (currentTick) {\n                if (!moved &&\n                    !currentTick.isNew &&\n                    currentTick !== tick &&\n                    currentTick.label &&\n                    currentTick.label.textStr === str) {\n                    tick.movedLabel = currentTick.label;\n                    moved = true;\n                    currentTick.labelPos = tick.movedLabel.xy;\n                    delete currentTick.label;\n                }\n            });\n        }\n        // Create new label if the actual one is moved\n        if (!moved && (tick.labelPos || label)) {\n            labelPos = tick.labelPos || label.xy;\n            tick.movedLabel = tick.createLabel(str, labelOptions, labelPos);\n            if (tick.movedLabel) {\n                tick.movedLabel.attr({ opacity: 0 });\n            }\n        }\n    }\n    /**\n     * Put everything in place\n     *\n     * @private\n     * @param {number} index\n     *\n     * @param {boolean} [old]\n     * Use old coordinates to prepare an animation into new position\n     *\n     * @param {number} [opacity]\n     */\n    render(index, old, opacity) {\n        const tick = this, axis = tick.axis, horiz = axis.horiz, pos = tick.pos, tickmarkOffset = pick(tick.tickmarkOffset, axis.tickmarkOffset), xy = tick.getPosition(horiz, pos, tickmarkOffset, old), x = xy.x, y = xy.y, axisStart = axis.pos, axisEnd = axisStart + axis.len, pxPos = horiz ? x : y;\n        // Anything that is not between `axis.pos` and `axis.pos + axis.length`\n        // should not be visible (#20166). The `correctFloat` is for reversed\n        // axes in Safari.\n        if (!axis.chart.polar &&\n            tick.isNew &&\n            (correctFloat(pxPos) < axisStart || pxPos > axisEnd)) {\n            opacity = 0;\n        }\n        const labelOpacity = pick(opacity, tick.label && tick.label.newOpacity, // #15528\n        1);\n        opacity = pick(opacity, 1);\n        this.isActive = true;\n        // Create the grid line\n        this.renderGridLine(old, opacity);\n        // Create the tick mark\n        this.renderMark(xy, opacity);\n        // The label is created on init - now move it into place\n        this.renderLabel(xy, old, labelOpacity, index);\n        tick.isNew = false;\n        fireEvent(this, 'afterRender');\n    }\n    /**\n     * Renders the gridLine.\n     *\n     * @private\n     * @function Highcharts.Tick#renderGridLine\n     * @param {boolean} old  Whether or not the tick is old\n     * @param {number} opacity  The opacity of the grid line\n     */\n    renderGridLine(old, opacity) {\n        const tick = this, axis = tick.axis, options = axis.options, attribs = {}, pos = tick.pos, type = tick.type, tickmarkOffset = pick(tick.tickmarkOffset, axis.tickmarkOffset), renderer = axis.chart.renderer;\n        let gridLine = tick.gridLine, gridLinePath, gridLineWidth = options.gridLineWidth, gridLineColor = options.gridLineColor, dashStyle = options.gridLineDashStyle;\n        if (tick.type === 'minor') {\n            gridLineWidth = options.minorGridLineWidth;\n            gridLineColor = options.minorGridLineColor;\n            dashStyle = options.minorGridLineDashStyle;\n        }\n        if (!gridLine) {\n            if (!axis.chart.styledMode) {\n                attribs.stroke = gridLineColor;\n                attribs['stroke-width'] = gridLineWidth || 0;\n                attribs.dashstyle = dashStyle;\n            }\n            if (!type) {\n                attribs.zIndex = 1;\n            }\n            if (old) {\n                opacity = 0;\n            }\n            /**\n             * The rendered grid line of the tick.\n             * @name Highcharts.Tick#gridLine\n             * @type {Highcharts.SVGElement|undefined}\n             */\n            tick.gridLine = gridLine = renderer.path()\n                .attr(attribs)\n                .addClass('highcharts-' + (type ? type + '-' : '') + 'grid-line')\n                .add(axis.gridGroup);\n        }\n        if (gridLine) {\n            gridLinePath = axis.getPlotLinePath({\n                value: pos + tickmarkOffset,\n                lineWidth: gridLine.strokeWidth(),\n                force: 'pass',\n                old: old,\n                acrossPanes: false // #18025\n            });\n            // If the parameter 'old' is set, the current call will be followed\n            // by another call, therefore do not do any animations this time\n            if (gridLinePath) {\n                gridLine[old || tick.isNew ? 'attr' : 'animate']({\n                    d: gridLinePath,\n                    opacity: opacity\n                });\n            }\n        }\n    }\n    /**\n     * Renders the tick mark.\n     *\n     * @private\n     * @function Highcharts.Tick#renderMark\n     * @param {Highcharts.PositionObject} xy  The position vector of the mark\n     * @param {number} opacity  The opacity of the mark\n     */\n    renderMark(xy, opacity) {\n        const tick = this, axis = tick.axis, options = axis.options, renderer = axis.chart.renderer, type = tick.type, tickSize = axis.tickSize(type ? type + 'Tick' : 'tick'), x = xy.x, y = xy.y, tickWidth = pick(options[type !== 'minor' ? 'tickWidth' : 'minorTickWidth'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1\n        tickColor = options[type !== 'minor' ? 'tickColor' : 'minorTickColor'];\n        let mark = tick.mark;\n        const isNewMark = !mark;\n        if (tickSize) {\n            // Negate the length\n            if (axis.opposite) {\n                tickSize[0] = -tickSize[0];\n            }\n            // First time, create it\n            if (!mark) {\n                /**\n                 * The rendered mark of the tick.\n                 * @name Highcharts.Tick#mark\n                 * @type {Highcharts.SVGElement|undefined}\n                 */\n                tick.mark = mark = renderer.path()\n                    .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n                    .add(axis.axisGroup);\n                if (!axis.chart.styledMode) {\n                    mark.attr({\n                        stroke: tickColor,\n                        'stroke-width': tickWidth\n                    });\n                }\n            }\n            mark[isNewMark ? 'attr' : 'animate']({\n                d: tick.getMarkPath(x, y, tickSize[0], mark.strokeWidth(), axis.horiz, renderer),\n                opacity: opacity\n            });\n        }\n    }\n    /**\n     * Renders the tick label.\n     * Note: The label should already be created in init(), so it should only\n     * have to be moved into place.\n     *\n     * @private\n     * @function Highcharts.Tick#renderLabel\n     * @param {Highcharts.PositionObject} xy  The position vector of the label\n     * @param {boolean} old  Whether or not the tick is old\n     * @param {number} opacity  The opacity of the label\n     * @param {number} index  The index of the tick\n     */\n    renderLabel(xy, old, opacity, index) {\n        const tick = this, axis = tick.axis, horiz = axis.horiz, options = axis.options, label = tick.label, labelOptions = options.labels, step = labelOptions.step, tickmarkOffset = pick(tick.tickmarkOffset, axis.tickmarkOffset), x = xy.x, y = xy.y;\n        let show = true;\n        if (label && isNumber(x)) {\n            label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n            // Apply show first and show last. If the tick is both first and\n            // last, it is a single centered tick, in which case we show the\n            // label anyway (#2100).\n            if ((tick.isFirst &&\n                !tick.isLast &&\n                !options.showFirstLabel) ||\n                (tick.isLast &&\n                    !tick.isFirst &&\n                    !options.showLastLabel)) {\n                show = false;\n                // Handle label overflow and show or hide accordingly\n            }\n            else if (horiz &&\n                !labelOptions.step &&\n                !labelOptions.rotation &&\n                !old &&\n                opacity !== 0) {\n                tick.handleOverflow(xy);\n            }\n            // Apply step\n            if (step && index % step) {\n                // Show those indices dividable by step\n                show = false;\n            }\n            // Set the new position, and show or hide\n            if (show && isNumber(xy.y)) {\n                xy.opacity = opacity;\n                label[tick.isNewLabel ? 'attr' : 'animate'](xy).show(true);\n                tick.isNewLabel = false;\n            }\n            else {\n                label.hide(); // #1338, #15863\n                tick.isNewLabel = true;\n            }\n        }\n    }\n    /**\n     * Replace labels with the moved ones to perform animation. Additionally\n     * destroy unused labels.\n     *\n     * @private\n     * @function Highcharts.Tick#replaceMovedLabel\n     */\n    replaceMovedLabel() {\n        const tick = this, label = tick.label, axis = tick.axis;\n        // Animate and destroy\n        if (label && !tick.isNew) {\n            label.animate({ opacity: 0 }, void 0, label.destroy);\n            delete tick.label;\n        }\n        axis.isDirty = true;\n        tick.label = tick.movedLabel;\n        delete tick.movedLabel;\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default Tick;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Optional parameters for the tick.\n * @private\n * @interface Highcharts.TickParametersObject\n */ /**\n* Set category for the tick.\n* @name Highcharts.TickParametersObject#category\n* @type {string|undefined}\n*/ /**\n* @name Highcharts.TickParametersObject#options\n* @type {Highcharts.Dictionary<any>|undefined}\n*/ /**\n* Set tickmarkOffset for the tick.\n* @name Highcharts.TickParametersObject#tickmarkOffset\n* @type {number|undefined}\n*/\n/**\n * Additional time tick information.\n *\n * @interface Highcharts.TimeTicksInfoObject\n * @extends Highcharts.TimeNormalizedObject\n */ /**\n* @name Highcharts.TimeTicksInfoObject#higherRanks\n* @type {Array<string>}\n*/ /**\n* @name Highcharts.TimeTicksInfoObject#totalRange\n* @type {number}\n*/\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Animation/AnimationUtilities.js';\nconst { animate, animObject, setAnimation } = A;\nimport Axis from '../Axis/Axis.js';\nimport D from '../Defaults.js';\nconst { defaultOptions, defaultTime } = D;\nimport Templating from '../Templating.js';\nconst { numberFormat } = Templating;\nimport Foundation from '../Foundation.js';\nconst { registerEventOptions } = Foundation;\nimport H from '../Globals.js';\nconst { charts, doc, marginNames, svg, win } = H;\nimport RendererRegistry from '../Renderer/RendererRegistry.js';\nimport Series from '../Series/Series.js';\nimport SeriesRegistry from '../Series/SeriesRegistry.js';\nconst { seriesTypes } = SeriesRegistry;\nimport SVGRenderer from '../Renderer/SVG/SVGRenderer.js';\nimport Time from '../Time.js';\nimport U from '../Utilities.js';\nimport AST from '../Renderer/HTML/AST.js';\nimport Tick from '../Axis/Tick.js';\nconst { addEvent, attr, createElement, css, defined, diffObjects, discardElement, erase, error, extend, find, fireEvent, getStyle, isArray, isNumber, isObject, isString, merge, objectEach, pick, pInt, relativeLength, removeEvent, splat, syncTimeout, uniqueKey } = U;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n *\n * @example\n * let chart = Highcharts.chart('container', {\n *        title: {\n *               text: 'My chart'\n *        },\n *        series: [{\n *            data: [1, 3, 2, 4]\n *        }]\n * })\n *\n * @class\n * @name Highcharts.Chart\n *\n * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n *        The DOM element to render to, or its id.\n *\n * @param {Highcharts.Options} options\n *        The chart options structure.\n *\n * @param {Highcharts.ChartCallbackFunction} [callback]\n *        Function to run when the chart has loaded and all external images\n *        are loaded. Defining a\n *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n *        handler is equivalent.\n */\nclass Chart {\n    /**\n     * Factory function for basic charts.\n     *\n     * @example\n     * // Render a chart in to div#container\n     * let chart = Highcharts.chart('container', {\n     *     title: {\n     *         text: 'My chart'\n     *     },\n     *     series: [{\n     *         data: [1, 3, 2, 4]\n     *     }]\n     * });\n     *\n     * @function Highcharts.chart\n     *\n     * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n     * The DOM element to render to, or its id.\n     *\n     * @param {Highcharts.Options} options\n     * The chart options structure.\n     *\n     * @param {Highcharts.ChartCallbackFunction} [callback]\n     * Function to run when the chart has loaded and all external images are\n     * loaded. Defining a\n     * [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n     * handler is equivalent.\n     *\n     * @return {Highcharts.Chart}\n     * Returns the Chart object.\n     */\n    static chart(a, b, c) {\n        return new Chart(a, b, c);\n    }\n    // Implementation\n    constructor(a, \n    /* eslint-disable @typescript-eslint/no-unused-vars */\n    b, c\n    /* eslint-enable @typescript-eslint/no-unused-vars */\n    ) {\n        this.sharedClips = {};\n        const args = [\n            // ES5 builds fail unless we cast it to an Array\n            ...arguments\n        ];\n        // Remove the optional first argument, renderTo, and set it on this.\n        if (isString(a) || a.nodeName) {\n            this.renderTo = args.shift();\n        }\n        this.init(args[0], args[1]);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Function setting zoom options after chart init and after chart update.\n     * Offers support for deprecated options.\n     *\n     * @private\n     * @function Highcharts.Chart#setZoomOptions\n     */\n    setZoomOptions() {\n        const chart = this, options = chart.options.chart, zooming = options.zooming;\n        chart.zooming = {\n            ...zooming,\n            type: pick(options.zoomType, zooming.type),\n            key: pick(options.zoomKey, zooming.key),\n            pinchType: pick(options.pinchType, zooming.pinchType),\n            singleTouch: pick(options.zoomBySingleTouch, zooming.singleTouch, false),\n            resetButton: merge(zooming.resetButton, options.resetZoomButton)\n        };\n    }\n    /**\n     * Overridable function that initializes the chart. The constructor's\n     * arguments are passed on directly.\n     *\n     * @function Highcharts.Chart#init\n     *\n     * @param {Highcharts.Options} userOptions\n     *        Custom options.\n     *\n     * @param {Function} [callback]\n     *        Function to run when the chart has loaded and all external\n     *        images are loaded.\n     *\n     *\n     * @emits Highcharts.Chart#event:init\n     * @emits Highcharts.Chart#event:afterInit\n     */\n    init(userOptions, callback) {\n        // Fire the event with a default function\n        fireEvent(this, 'init', { args: arguments }, function () {\n            const options = merge(defaultOptions, userOptions), // Do the merge\n            optionsChart = options.chart;\n            /**\n             * The original options given to the constructor or a chart factory\n             * like {@link Highcharts.chart} and {@link Highcharts.stockChart}.\n             * The original options are shallow copied to avoid mutation. The\n             * copy, `chart.userOptions`, may later be mutated to reflect\n             * updated options throughout the lifetime of the chart.\n             *\n             * For collections, like `series`, `xAxis` and `yAxis`, the chart\n             * user options should always be reflected by the item user option,\n             * so for example the following should always be true:\n             *\n             * `chart.xAxis[0].userOptions === chart.userOptions.xAxis[0]`\n             *\n             * @name Highcharts.Chart#userOptions\n             * @type {Highcharts.Options}\n             */\n            this.userOptions = extend({}, userOptions);\n            this.margin = [];\n            this.spacing = [];\n            // An array of functions that returns labels that should be\n            // considered for anti-collision\n            this.labelCollectors = [];\n            this.callback = callback;\n            this.isResizing = 0;\n            /**\n             * The options structure for the chart after merging\n             * {@link #defaultOptions} and {@link #userOptions}. It contains\n             * members for the sub elements like series, legend, tooltip etc.\n             *\n             * @name Highcharts.Chart#options\n             * @type {Highcharts.Options}\n             */\n            this.options = options;\n            /**\n             * All the axes in the chart.\n             *\n             * @see  Highcharts.Chart.xAxis\n             * @see  Highcharts.Chart.yAxis\n             *\n             * @name Highcharts.Chart#axes\n             * @type {Array<Highcharts.Axis>}\n             */\n            this.axes = [];\n            /**\n             * All the current series in the chart.\n             *\n             * @name Highcharts.Chart#series\n             * @type {Array<Highcharts.Series>}\n             */\n            this.series = [];\n            /**\n             * The `Time` object associated with the chart. Since v6.0.5,\n             * time settings can be applied individually for each chart. If\n             * no individual settings apply, the `Time` object is shared by\n             * all instances.\n             *\n             * @name Highcharts.Chart#time\n             * @type {Highcharts.Time}\n             */\n            this.time =\n                userOptions.time && Object.keys(userOptions.time).length ?\n                    new Time(userOptions.time) :\n                    H.time;\n            /**\n             * Callback function to override the default function that formats\n             * all the numbers in the chart. Returns a string with the formatted\n             * number.\n             *\n             * @name Highcharts.Chart#numberFormatter\n             * @type {Highcharts.NumberFormatterCallbackFunction}\n             */\n            this.numberFormatter = optionsChart.numberFormatter || numberFormat;\n            /**\n             * Whether the chart is in styled mode, meaning all presentational\n             * attributes are avoided.\n             *\n             * @name Highcharts.Chart#styledMode\n             * @type {boolean}\n             */\n            this.styledMode = optionsChart.styledMode;\n            this.hasCartesianSeries = optionsChart.showAxes;\n            const chart = this;\n            /**\n             * Index position of the chart in the {@link Highcharts#charts}\n             * property.\n             *\n             * @name Highcharts.Chart#index\n             * @type {number}\n             * @readonly\n             */\n            chart.index = charts.length; // Add the chart to the global lookup\n            charts.push(chart);\n            H.chartCount++;\n            // Chart event handlers\n            registerEventOptions(this, optionsChart);\n            /**\n             * A collection of the X axes in the chart.\n             *\n             * @name Highcharts.Chart#xAxis\n             * @type {Array<Highcharts.Axis>}\n             */\n            chart.xAxis = [];\n            /**\n             * A collection of the Y axes in the chart.\n             *\n             * @name Highcharts.Chart#yAxis\n             * @type {Array<Highcharts.Axis>}\n             *\n             * @todo\n             * Make events official: Fire the event `afterInit`.\n             */\n            chart.yAxis = [];\n            chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n            this.setZoomOptions();\n            // Fire after init but before first render, before axes and series\n            // have been initialized.\n            fireEvent(chart, 'afterInit');\n            chart.firstRender();\n        });\n    }\n    /**\n     * Internal function to unitialize an individual series.\n     *\n     * @private\n     * @function Highcharts.Chart#initSeries\n     */\n    initSeries(options) {\n        const chart = this, optionsChart = chart.options.chart, type = (options.type ||\n            optionsChart.type), SeriesClass = seriesTypes[type];\n        // No such series type\n        if (!SeriesClass) {\n            error(17, true, chart, { missingModuleFor: type });\n        }\n        const series = new SeriesClass();\n        if (typeof series.init === 'function') {\n            series.init(chart, options);\n        }\n        return series;\n    }\n    /**\n     * Internal function to set data for all series with enabled sorting.\n     *\n     * @private\n     * @function Highcharts.Chart#setSortedData\n     */\n    setSortedData() {\n        this.getSeriesOrderByLinks().forEach(function (series) {\n            // We need to set data for series with sorting after series init\n            if (!series.points && !series.data && series.enabledDataSorting) {\n                series.setData(series.options.data, false);\n            }\n        });\n    }\n    /**\n     * Sort and return chart series in order depending on the number of linked\n     * series.\n     *\n     * @private\n     * @function Highcharts.Series#getSeriesOrderByLinks\n     */\n    getSeriesOrderByLinks() {\n        return this.series.concat().sort(function (a, b) {\n            if (a.linkedSeries.length || b.linkedSeries.length) {\n                return b.linkedSeries.length - a.linkedSeries.length;\n            }\n            return 0;\n        });\n    }\n    /**\n     * Order all series or axes above a given index. When series or axes are\n     * added and ordered by configuration, only the last series is handled\n     * (#248, #1123, #2456, #6112). This function is called on series and axis\n     * initialization and destroy.\n     *\n     * @private\n     * @function Highcharts.Chart#orderItems\n     * @param {string} coll The collection name\n     * @param {number} [fromIndex=0]\n     * If this is given, only the series above this index are handled.\n     */\n    orderItems(coll, fromIndex = 0) {\n        const collection = this[coll], \n        // Item options should be reflected in chart.options.series,\n        // chart.options.yAxis etc\n        optionsArray = this.options[coll] = splat(this.options[coll])\n            .slice(), userOptionsArray = this.userOptions[coll] = this.userOptions[coll] ?\n            splat(this.userOptions[coll]).slice() :\n            [];\n        if (this.hasRendered) {\n            // Remove all above index\n            optionsArray.splice(fromIndex);\n            userOptionsArray.splice(fromIndex);\n        }\n        if (collection) {\n            for (let i = fromIndex, iEnd = collection.length; i < iEnd; ++i) {\n                const item = collection[i];\n                if (item) {\n                    /**\n                     * Contains the series' index in the `Chart.series` array.\n                     *\n                     * @name Highcharts.Series#index\n                     * @type {number}\n                     * @readonly\n                     */\n                    item.index = i;\n                    if (item instanceof Series) {\n                        item.name = item.getName();\n                    }\n                    if (!item.options.isInternal) {\n                        optionsArray[i] = item.options;\n                        userOptionsArray[i] = item.userOptions;\n                    }\n                }\n            }\n        }\n    }\n    /**\n     * Check whether a given point is within the plot area.\n     *\n     * @function Highcharts.Chart#isInsidePlot\n     *\n     * @param {number} plotX\n     * Pixel x relative to the plot area.\n     *\n     * @param {number} plotY\n     * Pixel y relative to the plot area.\n     *\n     * @param {Highcharts.ChartIsInsideOptionsObject} [options]\n     * Options object.\n     *\n     * @return {boolean}\n     * Returns true if the given point is inside the plot area.\n     */\n    isInsidePlot(plotX, plotY, options = {}) {\n        const { inverted, plotBox, plotLeft, plotTop, scrollablePlotBox } = this, { scrollLeft = 0, scrollTop = 0 } = (options.visiblePlotOnly &&\n            this.scrollablePlotArea?.scrollingContainer) || {}, series = options.series, box = (options.visiblePlotOnly && scrollablePlotBox) || plotBox, x = options.inverted ? plotY : plotX, y = options.inverted ? plotX : plotY, e = {\n            x,\n            y,\n            isInsidePlot: true,\n            options\n        };\n        if (!options.ignoreX) {\n            const xAxis = (series &&\n                (inverted && !this.polar ? series.yAxis : series.xAxis)) || {\n                pos: plotLeft,\n                len: Infinity\n            };\n            const chartX = options.paneCoordinates ?\n                xAxis.pos + x : plotLeft + x;\n            if (!(chartX >= Math.max(scrollLeft + plotLeft, xAxis.pos) &&\n                chartX <= Math.min(scrollLeft + plotLeft + box.width, xAxis.pos + xAxis.len))) {\n                e.isInsidePlot = false;\n            }\n        }\n        if (!options.ignoreY && e.isInsidePlot) {\n            const yAxis = (!inverted && options.axis &&\n                !options.axis.isXAxis && options.axis) || (series && (inverted ? series.xAxis : series.yAxis)) || {\n                pos: plotTop,\n                len: Infinity\n            };\n            const chartY = options.paneCoordinates ?\n                yAxis.pos + y : plotTop + y;\n            if (!(chartY >= Math.max(scrollTop + plotTop, yAxis.pos) &&\n                chartY <= Math.min(scrollTop + plotTop + box.height, yAxis.pos + yAxis.len))) {\n                e.isInsidePlot = false;\n            }\n        }\n        fireEvent(this, 'afterIsInsidePlot', e);\n        return e.isInsidePlot;\n    }\n    /**\n     * Redraw the chart after changes have been done to the data, axis extremes\n     * chart size or chart elements. All methods for updating axes, series or\n     * points have a parameter for redrawing the chart. This is `true` by\n     * default. But in many cases you want to do more than one operation on the\n     * chart before redrawing, for example add a number of points. In those\n     * cases it is a waste of resources to redraw the chart for each new point\n     * added. So you add the points and call `chart.redraw()` after.\n     *\n     * @function Highcharts.Chart#redraw\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     * If or how to apply animation to the redraw. When `undefined`, it applies\n     * the animation that is set in the `chart.animation` option.\n     *\n     * @emits Highcharts.Chart#event:afterSetExtremes\n     * @emits Highcharts.Chart#event:beforeRedraw\n     * @emits Highcharts.Chart#event:predraw\n     * @emits Highcharts.Chart#event:redraw\n     * @emits Highcharts.Chart#event:render\n     * @emits Highcharts.Chart#event:updatedData\n     */\n    redraw(animation) {\n        fireEvent(this, 'beforeRedraw');\n        const chart = this, axes = chart.hasCartesianSeries ? chart.axes : chart.colorAxis || [], series = chart.series, pointer = chart.pointer, legend = chart.legend, legendUserOptions = chart.userOptions.legend, renderer = chart.renderer, isHiddenChart = renderer.isHidden(), afterRedraw = [];\n        let hasDirtyStacks, hasStackedSeries, i, isDirtyBox = chart.isDirtyBox, redrawLegend = chart.isDirtyLegend, serie;\n        renderer.rootFontSize = renderer.boxWrapper.getStyle('font-size');\n        // Handle responsive rules, not only on resize (#6130)\n        if (chart.setResponsive) {\n            chart.setResponsive(false);\n        }\n        // Set the global animation. When chart.hasRendered is not true, the\n        // redraw call comes from a responsive rule and animation should not\n        // occur.\n        setAnimation(chart.hasRendered ? animation : false, chart);\n        if (isHiddenChart) {\n            chart.temporaryDisplay();\n        }\n        // Adjust title layout (reflow multiline text)\n        chart.layOutTitles(false);\n        // Link stacked series\n        i = series.length;\n        while (i--) {\n            serie = series[i];\n            if (serie.options.stacking || serie.options.centerInCategory) {\n                hasStackedSeries = true;\n                if (serie.isDirty) {\n                    hasDirtyStacks = true;\n                    break;\n                }\n            }\n        }\n        if (hasDirtyStacks) { // Mark others as dirty\n            i = series.length;\n            while (i--) {\n                serie = series[i];\n                if (serie.options.stacking) {\n                    serie.isDirty = true;\n                }\n            }\n        }\n        // Handle updated data in the series\n        series.forEach(function (serie) {\n            if (serie.isDirty) {\n                if (serie.options.legendType === 'point') {\n                    if (typeof serie.updateTotals === 'function') {\n                        serie.updateTotals();\n                    }\n                    redrawLegend = true;\n                }\n                else if (legendUserOptions &&\n                    (!!legendUserOptions.labelFormatter ||\n                        legendUserOptions.labelFormat)) {\n                    redrawLegend = true; // #2165\n                }\n            }\n            if (serie.isDirtyData) {\n                fireEvent(serie, 'updatedData');\n            }\n        });\n        // Handle added or removed series\n        if (redrawLegend && legend && legend.options.enabled) {\n            // Draw legend graphics\n            legend.render();\n            chart.isDirtyLegend = false;\n        }\n        // Reset stacks\n        if (hasStackedSeries) {\n            chart.getStacks();\n        }\n        // Set axes scales\n        axes.forEach(function (axis) {\n            axis.updateNames();\n            axis.setScale();\n        });\n        chart.getMargins(); // #3098\n        // If one axis is dirty, all axes must be redrawn (#792, #2169)\n        axes.forEach(function (axis) {\n            if (axis.isDirty) {\n                isDirtyBox = true;\n            }\n        });\n        // Redraw axes\n        axes.forEach(function (axis) {\n            // Fire 'afterSetExtremes' only if extremes are set\n            const key = axis.min + ',' + axis.max;\n            if (axis.extKey !== key) { // #821, #4452\n                axis.extKey = key;\n                // Prevent a recursive call to chart.redraw() (#1119)\n                afterRedraw.push(function () {\n                    fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n                    delete axis.eventArgs;\n                });\n            }\n            if (isDirtyBox || hasStackedSeries) {\n                axis.redraw();\n            }\n        });\n        // The plot areas size has changed\n        if (isDirtyBox) {\n            chart.drawChartBox();\n        }\n        // Fire an event before redrawing series, used by the boost module to\n        // clear previous series renderings.\n        fireEvent(chart, 'predraw');\n        // Redraw affected series\n        series.forEach(function (serie) {\n            if ((isDirtyBox || serie.isDirty) && serie.visible) {\n                serie.redraw();\n            }\n            // Set it here, otherwise we will have unlimited 'updatedData' calls\n            // for a hidden series after setData(). Fixes #6012\n            serie.isDirtyData = false;\n        });\n        // Move tooltip or reset\n        if (pointer) {\n            pointer.reset(true);\n        }\n        // Redraw if canvas\n        renderer.draw();\n        // Fire the events\n        fireEvent(chart, 'redraw');\n        fireEvent(chart, 'render');\n        if (isHiddenChart) {\n            chart.temporaryDisplay(true);\n        }\n        // Fire callbacks that are put on hold until after the redraw\n        afterRedraw.forEach(function (callback) {\n            callback.call();\n        });\n    }\n    /**\n     * Get an axis, series or point object by `id` as given in the configuration\n     * options. Returns `undefined` if no item is found.\n     *\n     * @sample highcharts/plotoptions/series-id/\n     *         Get series by id\n     *\n     * @function Highcharts.Chart#get\n     *\n     * @param {string} id\n     * The id as given in the configuration options.\n     *\n     * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n     * The retrieved item.\n     */\n    get(id) {\n        const series = this.series;\n        /**\n         * @private\n         */\n        function itemById(item) {\n            return (item.id === id ||\n                (item.options && item.options.id === id));\n        }\n        let ret = \n        // Search axes\n        find(this.axes, itemById) ||\n            // Search series\n            find(this.series, itemById);\n        // Search points\n        for (let i = 0; !ret && i < series.length; i++) {\n            ret = find(series[i].points || [], itemById);\n        }\n        return ret;\n    }\n    /**\n     * Create the Axis instances based on the config options.\n     *\n     * @private\n     * @function Highcharts.Chart#getAxes\n     * @emits Highcharts.Chart#event:afterGetAxes\n     * @emits Highcharts.Chart#event:getAxes\n     */\n    getAxes() {\n        const options = this.userOptions;\n        fireEvent(this, 'getAxes');\n        for (const coll of ['xAxis', 'yAxis']) {\n            const arr = options[coll] = splat(options[coll] || {});\n            for (const axisOptions of arr) {\n                // eslint-disable-next-line no-new\n                new Axis(this, axisOptions, coll);\n            }\n        }\n        fireEvent(this, 'afterGetAxes');\n    }\n    /**\n     * Returns an array of all currently selected points in the chart. Points\n     * can be selected by clicking or programmatically by the\n     * {@link Highcharts.Point#select}\n     * function.\n     *\n     * @sample highcharts/plotoptions/series-allowpointselect-line/\n     *         Get selected points\n     * @sample highcharts/members/point-select-lasso/\n     *         Lasso selection\n     * @sample highcharts/chart/events-selection-points/\n     *         Rectangle selection\n     *\n     * @function Highcharts.Chart#getSelectedPoints\n     *\n     * @return {Array<Highcharts.Point>}\n     *         The currently selected points.\n     */\n    getSelectedPoints() {\n        return this.series.reduce((acc, series) => {\n            // For one-to-one points inspect series.data in order to retrieve\n            // points outside the visible range (#6445). For grouped data,\n            // inspect the generated series.points.\n            series.getPointsCollection()\n                .forEach((point) => {\n                if (pick(point.selectedStaging, point.selected)) {\n                    acc.push(point);\n                }\n            });\n            return acc;\n        }, []);\n    }\n    /**\n     * Returns an array of all currently selected series in the chart. Series\n     * can be selected either programmatically by the\n     * {@link Highcharts.Series#select}\n     * function or by checking the checkbox next to the legend item if\n     * [series.showCheckBox](https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox)\n     * is true.\n     *\n     * @sample highcharts/members/chart-getselectedseries/\n     *         Get selected series\n     *\n     * @function Highcharts.Chart#getSelectedSeries\n     *\n     * @return {Array<Highcharts.Series>}\n     *         The currently selected series.\n     */\n    getSelectedSeries() {\n        return this.series.filter(function (serie) {\n            return serie.selected;\n        });\n    }\n    /**\n     * Set a new title or subtitle for the chart.\n     *\n     * @sample highcharts/members/chart-settitle/\n     *         Set title text and styles\n     *\n     * @function Highcharts.Chart#setTitle\n     *\n     * @param {Highcharts.TitleOptions} [titleOptions]\n     *        New title options. The title text itself is set by the\n     *        `titleOptions.text` property.\n     *\n     * @param {Highcharts.SubtitleOptions} [subtitleOptions]\n     *        New subtitle options. The subtitle text itself is set by the\n     *        `subtitleOptions.text` property.\n     *\n     * @param {boolean} [redraw]\n     *        Whether to redraw the chart or wait for a later call to\n     *        `chart.redraw()`.\n     */\n    setTitle(titleOptions, subtitleOptions, redraw) {\n        this.applyDescription('title', titleOptions);\n        this.applyDescription('subtitle', subtitleOptions);\n        // The initial call also adds the caption. On update, chart.update will\n        // relay to Chart.setCaption.\n        this.applyDescription('caption', void 0);\n        this.layOutTitles(redraw);\n    }\n    /**\n     * Apply a title, subtitle or caption for the chart\n     *\n     * @private\n     * @function Highcharts.Chart#applyDescription\n     * @param name {string}\n     * Either title, subtitle or caption\n     * @param {Highcharts.TitleOptions|Highcharts.SubtitleOptions|Highcharts.CaptionOptions|undefined} explicitOptions\n     * The options to set, will be merged with default options.\n     */\n    applyDescription(name, explicitOptions) {\n        const chart = this;\n        // Merge default options with explicit options\n        const options = this.options[name] = merge(this.options[name], explicitOptions);\n        let elem = this[name];\n        if (elem && explicitOptions) {\n            this[name] = elem = elem.destroy(); // Remove old\n        }\n        if (options && !elem) {\n            elem = this.renderer.text(options.text, 0, 0, options.useHTML)\n                .attr({\n                align: options.align,\n                'class': 'highcharts-' + name,\n                zIndex: options.zIndex || 4\n            })\n                .add();\n            // Update methods, relay to `applyDescription`\n            elem.update = function (updateOptions, redraw) {\n                chart.applyDescription(name, updateOptions);\n                chart.layOutTitles(redraw);\n            };\n            // Presentational\n            if (!this.styledMode) {\n                elem.css(extend(name === 'title' ? {\n                    // #2944\n                    fontSize: this.options.isStock ? '1em' : '1.2em'\n                } : {}, options.style));\n            }\n            /**\n             * The chart title. The title has an `update` method that allows\n             * modifying the options directly or indirectly via\n             * `chart.update`.\n             *\n             * @sample highcharts/members/title-update/\n             *         Updating titles\n             *\n             * @name Highcharts.Chart#title\n             * @type {Highcharts.TitleObject}\n             */\n            /**\n             * The chart subtitle. The subtitle has an `update` method that\n             * allows modifying the options directly or indirectly via\n             * `chart.update`.\n             *\n             * @name Highcharts.Chart#subtitle\n             * @type {Highcharts.SubtitleObject}\n             */\n            this[name] = elem;\n        }\n    }\n    /**\n     * Internal function to lay out the chart title, subtitle and caption, and\n     * cache the full offset height for use in `getMargins`. The result is\n     * stored in `this.titleOffset`.\n     *\n     * @private\n     * @function Highcharts.Chart#layOutTitles\n     *\n     * @param {boolean} [redraw=true]\n     * @emits Highcharts.Chart#event:afterLayOutTitles\n     */\n    layOutTitles(redraw = true) {\n        const titleOffset = [0, 0, 0], renderer = this.renderer, spacingBox = this.spacingBox;\n        // Lay out the title and the subtitle respectively\n        ['title', 'subtitle', 'caption'].forEach(function (key) {\n            const title = this[key], titleOptions = (this.options[key]), verticalAlign = titleOptions.verticalAlign || 'top', offset = key === 'title' ?\n                verticalAlign === 'top' ? -3 : 0 :\n                // Floating subtitle (#6574)\n                verticalAlign === 'top' ? titleOffset[0] + 2 : 0;\n            if (title) {\n                title\n                    .css({\n                    width: (titleOptions.width ||\n                        spacingBox.width + (titleOptions.widthAdjust || 0)) + 'px'\n                });\n                const baseline = renderer.fontMetrics(title).b, \n                // Skip the cache for HTML (#3481, #11666)\n                height = Math.round(title.getBBox(titleOptions.useHTML).height);\n                title.align(extend({\n                    y: verticalAlign === 'bottom' ?\n                        baseline :\n                        offset + baseline,\n                    height\n                }, titleOptions), false, 'spacingBox');\n                if (!titleOptions.floating) {\n                    if (verticalAlign === 'top') {\n                        titleOffset[0] = Math.ceil(titleOffset[0] +\n                            height);\n                    }\n                    else if (verticalAlign === 'bottom') {\n                        titleOffset[2] = Math.ceil(titleOffset[2] +\n                            height);\n                    }\n                }\n            }\n        }, this);\n        // Handle title.margin and caption.margin\n        if (titleOffset[0] &&\n            (this.options.title.verticalAlign || 'top') === 'top') {\n            titleOffset[0] += this.options.title.margin;\n        }\n        if (titleOffset[2] &&\n            this.options.caption.verticalAlign === 'bottom') {\n            titleOffset[2] += this.options.caption.margin;\n        }\n        const requiresDirtyBox = (!this.titleOffset ||\n            this.titleOffset.join(',') !== titleOffset.join(','));\n        // Used in getMargins\n        this.titleOffset = titleOffset;\n        fireEvent(this, 'afterLayOutTitles');\n        if (!this.isDirtyBox && requiresDirtyBox) {\n            this.isDirtyBox = this.isDirtyLegend = requiresDirtyBox;\n            // Redraw if necessary (#2719, #2744)\n            if (this.hasRendered && redraw && this.isDirtyBox) {\n                this.redraw();\n            }\n        }\n    }\n    /**\n     * Internal function to get the available size of the container element\n     *\n     * @private\n     * @function Highcharts.Chart#getContainerBox\n     */\n    getContainerBox() {\n        // Temporarily hide support divs from a11y and others, #21888\n        const nonContainers = [].map.call(this.renderTo.children, (child) => {\n            if (child !== this.container) {\n                const display = child.style.display;\n                child.style.display = 'none';\n                return [child, display];\n            }\n        }), box = {\n            width: getStyle(this.renderTo, 'width', true) || 0,\n            height: (getStyle(this.renderTo, 'height', true) || 0)\n        };\n        // Restore the non-containers\n        nonContainers.filter(Boolean).forEach(([div, display]) => {\n            div.style.display = display;\n        });\n        return box;\n    }\n    /**\n     * Internal function to get the chart width and height according to options\n     * and container size. Sets {@link Chart.chartWidth} and\n     * {@link Chart.chartHeight}.\n     *\n     * @private\n     * @function Highcharts.Chart#getChartSize\n     */\n    getChartSize() {\n        const chart = this, optionsChart = chart.options.chart, widthOption = optionsChart.width, heightOption = optionsChart.height, containerBox = chart.getContainerBox(), enableDefaultHeight = containerBox.height > 1 &&\n            !( // #21510, prevent infinite reflow\n            !chart.renderTo.parentElement?.style.height &&\n                chart.renderTo.style.height === '100%');\n        /**\n         * The current pixel width of the chart.\n         *\n         * @name Highcharts.Chart#chartWidth\n         * @type {number}\n         */\n        chart.chartWidth = Math.max(// #1393\n        0, widthOption || containerBox.width || 600 // #1460\n        );\n        /**\n         * The current pixel height of the chart.\n         *\n         * @name Highcharts.Chart#chartHeight\n         * @type {number}\n         */\n        chart.chartHeight = Math.max(0, relativeLength(heightOption, chart.chartWidth) ||\n            (enableDefaultHeight ? containerBox.height : 400));\n        chart.containerBox = containerBox;\n    }\n    /**\n     * If the renderTo element has no offsetWidth, most likely one or more of\n     * its parents are hidden. Loop up the DOM tree to temporarily display the\n     * parents, then save the original display properties, and when the true\n     * size is retrieved, reset them. Used on first render and on redraws.\n     *\n     * @private\n     * @function Highcharts.Chart#temporaryDisplay\n     *\n     * @param {boolean} [revert]\n     * Revert to the saved original styles.\n     */\n    temporaryDisplay(revert) {\n        let node = this.renderTo, tempStyle;\n        if (!revert) {\n            while (node && node.style) {\n                // When rendering to a detached node, it needs to be temporarily\n                // attached in order to read styling and bounding boxes (#5783,\n                // #7024).\n                if (!doc.body.contains(node) && !node.parentNode) {\n                    node.hcOrigDetached = true;\n                    doc.body.appendChild(node);\n                }\n                if (getStyle(node, 'display', false) === 'none' ||\n                    node.hcOricDetached) {\n                    node.hcOrigStyle = {\n                        display: node.style.display,\n                        height: node.style.height,\n                        overflow: node.style.overflow\n                    };\n                    tempStyle = {\n                        display: 'block',\n                        overflow: 'hidden'\n                    };\n                    if (node !== this.renderTo) {\n                        tempStyle.height = 0;\n                    }\n                    css(node, tempStyle);\n                    // If it still doesn't have an offset width after setting\n                    // display to block, it probably has an !important priority\n                    // #2631, 6803\n                    if (!node.offsetWidth) {\n                        node.style.setProperty('display', 'block', 'important');\n                    }\n                }\n                node = node.parentNode;\n                if (node === doc.body) {\n                    break;\n                }\n            }\n        }\n        else {\n            while (node && node.style) {\n                if (node.hcOrigStyle) {\n                    css(node, node.hcOrigStyle);\n                    delete node.hcOrigStyle;\n                }\n                if (node.hcOrigDetached) {\n                    doc.body.removeChild(node);\n                    node.hcOrigDetached = false;\n                }\n                node = node.parentNode;\n            }\n        }\n    }\n    /**\n     * Set the {@link Chart.container|chart container's} class name, in\n     * addition to `highcharts-container`.\n     *\n     * @function Highcharts.Chart#setClassName\n     *\n     * @param {string} [className]\n     * The additional class name.\n     */\n    setClassName(className) {\n        this.container.className = 'highcharts-container ' + (className || '');\n    }\n    /**\n     * Get the containing element, determine the size and create the inner\n     * container div to hold the chart.\n     *\n     * @private\n     * @function Highcharts.Chart#afterGetContainer\n     * @emits Highcharts.Chart#event:afterGetContainer\n     */\n    getContainer() {\n        const chart = this, options = chart.options, optionsChart = options.chart, indexAttrName = 'data-highcharts-chart', containerId = uniqueKey();\n        let containerStyle, renderTo = chart.renderTo;\n        if (!renderTo) {\n            chart.renderTo = renderTo =\n                optionsChart.renderTo;\n        }\n        if (isString(renderTo)) {\n            chart.renderTo = renderTo =\n                doc.getElementById(renderTo);\n        }\n        // Display an error if the renderTo is wrong\n        if (!renderTo) {\n            error(13, true, chart);\n        }\n        // If the container already holds a chart, destroy it. The check for\n        // hasRendered is there because web pages that are saved to disk from\n        // the browser, will preserve the data-highcharts-chart attribute and\n        // the SVG contents, but not an interactive chart. So in this case,\n        // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n        const oldChartIndex = pInt(attr(renderTo, indexAttrName));\n        if (isNumber(oldChartIndex) &&\n            charts[oldChartIndex] &&\n            charts[oldChartIndex].hasRendered) {\n            charts[oldChartIndex].destroy();\n        }\n        // Make a reference to the chart from the div\n        attr(renderTo, indexAttrName, chart.index);\n        // Remove previous chart\n        renderTo.innerHTML = AST.emptyHTML;\n        // If the container doesn't have an offsetWidth, it has or is a child of\n        // a node that has display:none. We need to temporarily move it out to a\n        // visible state to determine the size, else the legend and tooltips\n        // won't render properly. The skipClone option is used in sparklines as\n        // a micro optimization, saving about 1-2 ms each chart.\n        if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n            chart.temporaryDisplay();\n        }\n        // Get the width and height\n        chart.getChartSize();\n        const chartHeight = chart.chartHeight;\n        let chartWidth = chart.chartWidth;\n        // Allow table cells and flex-boxes to shrink without the chart blocking\n        // them out (#6427)\n        css(renderTo, { overflow: 'hidden' });\n        // Create the inner container\n        if (!chart.styledMode) {\n            containerStyle = extend({\n                position: 'relative',\n                // Needed for context menu (avoidscrollbars) and content\n                // overflow in IE\n                overflow: 'hidden',\n                width: chartWidth + 'px',\n                height: chartHeight + 'px',\n                textAlign: 'left',\n                lineHeight: 'normal', // #427\n                zIndex: 0, // #1072\n                '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\n                userSelect: 'none', // #13503\n                'touch-action': 'manipulation',\n                outline: 'none',\n                padding: '0px'\n            }, optionsChart.style || {});\n        }\n        /**\n         * The containing HTML element of the chart. The container is\n         * dynamically inserted into the element given as the `renderTo`\n         * parameter in the {@link Highcharts#chart} constructor.\n         *\n         * @name Highcharts.Chart#container\n         * @type {Highcharts.HTMLDOMElement}\n         */\n        const container = createElement('div', {\n            id: containerId\n        }, containerStyle, renderTo);\n        chart.container = container;\n        // Adjust width if setting height affected it (#20334)\n        chart.getChartSize();\n        if (chartWidth !== chart.chartWidth) {\n            chartWidth = chart.chartWidth;\n            if (!chart.styledMode) {\n                css(container, {\n                    width: pick(optionsChart.style?.width, chartWidth + 'px')\n                });\n            }\n        }\n        chart.containerBox = chart.getContainerBox();\n        // Cache the cursor (#1650)\n        chart._cursor = container.style.cursor;\n        // Initialize the renderer\n        const Renderer = optionsChart.renderer || !svg ?\n            RendererRegistry.getRendererType(optionsChart.renderer) :\n            SVGRenderer;\n        /**\n         * The renderer instance of the chart. Each chart instance has only one\n         * associated renderer.\n         *\n         * @name Highcharts.Chart#renderer\n         * @type {Highcharts.SVGRenderer}\n         */\n        chart.renderer = new Renderer(container, chartWidth, chartHeight, void 0, optionsChart.forExport, options.exporting && options.exporting.allowHTML, chart.styledMode);\n        // Set the initial animation from the options\n        setAnimation(void 0, chart);\n        chart.setClassName(optionsChart.className);\n        if (!chart.styledMode) {\n            chart.renderer.setStyle(optionsChart.style);\n        }\n        else {\n            // Initialize definitions\n            for (const key in options.defs) { // eslint-disable-line guard-for-in\n                this.renderer.definition(options.defs[key]);\n            }\n        }\n        // Add a reference to the charts index\n        chart.renderer.chartIndex = chart.index;\n        fireEvent(this, 'afterGetContainer');\n    }\n    /**\n     * Calculate margins by rendering axis labels in a preliminary position.\n     * Title, subtitle and legend have already been rendered at this stage, but\n     * will be moved into their final positions.\n     *\n     * @private\n     * @function Highcharts.Chart#getMargins\n     * @emits Highcharts.Chart#event:getMargins\n     */\n    getMargins(skipAxes) {\n        const { spacing, margin, titleOffset } = this;\n        this.resetMargins();\n        // Adjust for title and subtitle\n        if (titleOffset[0] && !defined(margin[0])) {\n            this.plotTop = Math.max(this.plotTop, titleOffset[0] + spacing[0]);\n        }\n        if (titleOffset[2] && !defined(margin[2])) {\n            this.marginBottom = Math.max(this.marginBottom, titleOffset[2] + spacing[2]);\n        }\n        // Adjust for legend\n        if (this.legend && this.legend.display) {\n            this.legend.adjustMargins(margin, spacing);\n        }\n        fireEvent(this, 'getMargins');\n        if (!skipAxes) {\n            this.getAxisMargins();\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Chart#getAxisMargins\n     */\n    getAxisMargins() {\n        const chart = this, \n        // [top, right, bottom, left]\n        axisOffset = chart.axisOffset = [0, 0, 0, 0], colorAxis = chart.colorAxis, margin = chart.margin, getOffset = function (axes) {\n            axes.forEach(function (axis) {\n                if (axis.visible) {\n                    axis.getOffset();\n                }\n            });\n        };\n        // Pre-render axes to get labels offset width\n        if (chart.hasCartesianSeries) {\n            getOffset(chart.axes);\n        }\n        else if (colorAxis && colorAxis.length) {\n            getOffset(colorAxis);\n        }\n        // Add the axis offsets\n        marginNames.forEach(function (m, side) {\n            if (!defined(margin[side])) {\n                chart[m] += axisOffset[side];\n            }\n        });\n        chart.setChartSize();\n    }\n    /**\n     * Return the current options of the chart, but only those that differ from\n     * default options. Items that can be either an object or an array of\n     * objects, like `series`, `xAxis` and `yAxis`, are always returned as\n     * array.\n     *\n     * @sample highcharts/members/chart-getoptions\n     *\n     * @function Highcharts.Chart#getOptions\n     *\n     * @since 11.1.0\n     */\n    getOptions() {\n        return diffObjects(this.userOptions, defaultOptions);\n    }\n    /**\n     * Reflows the chart to its container. By default, the Resize Observer is\n     * attached to the chart's div which allows to reflows the chart\n     * automatically to its container, as per the\n     * [chart.reflow](https://api.highcharts.com/highcharts/chart.reflow)\n     * option.\n     *\n     * @sample highcharts/chart/events-container/\n     *         Pop up and reflow\n     *\n     * @function Highcharts.Chart#reflow\n     *\n     * @param {global.Event} [e]\n     *        Event arguments. Used primarily when the function is called\n     *        internally as a response to window resize.\n     */\n    reflow(e) {\n        const chart = this, oldBox = chart.containerBox, containerBox = chart.getContainerBox();\n        delete chart.pointer?.chartPosition;\n        // Width and height checks for display:none. Target is doc in Opera\n        // and win in Firefox, Chrome and IE9.\n        if (!chart.isPrinting &&\n            !chart.isResizing &&\n            oldBox &&\n            // When fired by resize observer inside hidden container\n            containerBox.width) {\n            if (containerBox.width !== oldBox.width ||\n                containerBox.height !== oldBox.height) {\n                U.clearTimeout(chart.reflowTimeout);\n                // When called from window.resize, e is set, else it's called\n                // directly (#2224)\n                chart.reflowTimeout = syncTimeout(function () {\n                    // Set size, it may have been destroyed in the meantime\n                    // (#1257)\n                    if (chart.container) {\n                        chart.setSize(void 0, void 0, false);\n                    }\n                }, e ? 100 : 0);\n            }\n            chart.containerBox = containerBox;\n        }\n    }\n    /**\n     * Toggle the event handlers necessary for auto resizing, depending on the\n     * `chart.reflow` option.\n     *\n     * @private\n     * @function Highcharts.Chart#setReflow\n     */\n    setReflow() {\n        const chart = this;\n        const runReflow = (e) => {\n            if (chart.options?.chart.reflow && chart.hasLoaded) {\n                chart.reflow(e);\n            }\n        };\n        if (typeof ResizeObserver === 'function') {\n            (new ResizeObserver(runReflow)).observe(chart.renderTo);\n            // Fallback for more legacy browser versions.\n        }\n        else {\n            const unbind = addEvent(win, 'resize', runReflow);\n            addEvent(this, 'destroy', unbind);\n        }\n    }\n    /**\n     * Resize the chart to a given width and height. In order to set the width\n     * only, the height argument may be skipped. To set the height only, pass\n     * `undefined` for the width.\n     *\n     * @sample highcharts/members/chart-setsize-button/\n     *         Test resizing from buttons\n     * @sample highcharts/members/chart-setsize-jquery-resizable/\n     *         Add a jQuery UI resizable\n     * @sample stock/members/chart-setsize/\n     *         Highcharts Stock with UI resizable\n     *\n     * @function Highcharts.Chart#setSize\n     *\n     * @param {number|null} [width]\n     *        The new pixel width of the chart. Since v4.2.6, the argument can\n     *        be `undefined` in order to preserve the current value (when\n     *        setting height only), or `null` to adapt to the width of the\n     *        containing element.\n     *\n     * @param {number|null} [height]\n     *        The new pixel height of the chart. Since v4.2.6, the argument can\n     *        be `undefined` in order to preserve the current value, or `null`\n     *        in order to adapt to the height of the containing element.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether and how to apply animation. When `undefined`, it applies\n     *        the animation that is set in the `chart.animation` option.\n     *\n     *\n     * @emits Highcharts.Chart#event:endResize\n     * @emits Highcharts.Chart#event:resize\n     */\n    setSize(width, height, animation) {\n        const chart = this, renderer = chart.renderer;\n        // Handle the isResizing counter\n        chart.isResizing += 1;\n        // Set the animation for the current process\n        setAnimation(animation, chart);\n        const globalAnimation = renderer.globalAnimation;\n        chart.oldChartHeight = chart.chartHeight;\n        chart.oldChartWidth = chart.chartWidth;\n        if (typeof width !== 'undefined') {\n            chart.options.chart.width = width;\n        }\n        if (typeof height !== 'undefined') {\n            chart.options.chart.height = height;\n        }\n        chart.getChartSize();\n        const { chartWidth, chartHeight, scrollablePixelsX = 0, scrollablePixelsY = 0 } = chart;\n        // Avoid expensive redrawing if the computed size didn't change\n        if (chart.isDirtyBox ||\n            chartWidth !== chart.oldChartWidth ||\n            chartHeight !== chart.oldChartHeight) {\n            // Resize the container with the global animation applied if enabled\n            // (#2503)\n            if (!chart.styledMode) {\n                (globalAnimation ? animate : css)(chart.container, {\n                    width: `${chartWidth + scrollablePixelsX}px`,\n                    height: `${chartHeight + scrollablePixelsY}px`\n                }, globalAnimation);\n            }\n            chart.setChartSize(true);\n            renderer.setSize(chartWidth, chartHeight, globalAnimation);\n            // Handle axes\n            chart.axes.forEach(function (axis) {\n                axis.isDirty = true;\n                axis.setScale();\n            });\n            chart.isDirtyLegend = true; // Force legend redraw\n            chart.isDirtyBox = true; // Force redraw of plot and chart border\n            chart.layOutTitles(); // #2857\n            chart.getMargins();\n            chart.redraw(globalAnimation);\n            chart.oldChartHeight = void 0;\n            fireEvent(chart, 'resize');\n            // Fire endResize and set isResizing back. If animation is disabled,\n            // fire without delay, but in a new thread to avoid triggering the\n            // resize observer (#19027).\n            setTimeout(() => {\n                if (chart) {\n                    fireEvent(chart, 'endResize');\n                }\n            }, animObject(globalAnimation).duration);\n        }\n        // Handle resizing counter even if we've re-rendered or not (#20548).\n        chart.isResizing -= 1;\n    }\n    /**\n     * Set the public chart properties. This is done before and after the\n     * pre-render to determine margin sizes.\n     *\n     * @private\n     * @function Highcharts.Chart#setChartSize\n     * @emits Highcharts.Chart#event:afterSetChartSize\n     */\n    setChartSize(skipAxes) {\n        const chart = this, { chartHeight, chartWidth, inverted, spacing, renderer } = chart, clipOffset = chart.clipOffset, clipRoundFunc = Math[inverted ? 'floor' : 'round'];\n        let plotLeft, plotTop, plotWidth, plotHeight;\n        /**\n         * The current left position of the plot area in pixels.\n         *\n         * @name Highcharts.Chart#plotLeft\n         * @type {number}\n         */\n        chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n        /**\n         * The current top position of the plot area in pixels.\n         *\n         * @name Highcharts.Chart#plotTop\n         * @type {number}\n         */\n        chart.plotTop = plotTop = Math.round(chart.plotTop);\n        /**\n         * The current width of the plot area in pixels.\n         *\n         * @name Highcharts.Chart#plotWidth\n         * @type {number}\n         */\n        chart.plotWidth = plotWidth = Math.max(0, Math.round(chartWidth - plotLeft - chart.marginRight));\n        /**\n         * The current height of the plot area in pixels.\n         *\n         * @name Highcharts.Chart#plotHeight\n         * @type {number}\n         */\n        chart.plotHeight = plotHeight = Math.max(0, Math.round(chartHeight - plotTop - chart.marginBottom));\n        chart.plotSizeX = inverted ? plotHeight : plotWidth;\n        chart.plotSizeY = inverted ? plotWidth : plotHeight;\n        // Set boxes used for alignment\n        chart.spacingBox = renderer.spacingBox = {\n            x: spacing[3],\n            y: spacing[0],\n            width: chartWidth - spacing[3] - spacing[1],\n            height: chartHeight - spacing[0] - spacing[2]\n        };\n        chart.plotBox = renderer.plotBox = {\n            x: plotLeft,\n            y: plotTop,\n            width: plotWidth,\n            height: plotHeight\n        };\n        // Compute the clipping box\n        if (clipOffset) {\n            chart.clipBox = {\n                x: clipRoundFunc(clipOffset[3]),\n                y: clipRoundFunc(clipOffset[0]),\n                width: clipRoundFunc(chart.plotSizeX - clipOffset[1] - clipOffset[3]),\n                height: clipRoundFunc(chart.plotSizeY - clipOffset[0] - clipOffset[2])\n            };\n        }\n        if (!skipAxes) {\n            chart.axes.forEach(function (axis) {\n                axis.setAxisSize();\n                axis.setAxisTranslation();\n            });\n            renderer.alignElements();\n        }\n        fireEvent(chart, 'afterSetChartSize', { skipAxes: skipAxes });\n    }\n    /**\n     * Initial margins before auto size margins are applied.\n     *\n     * @private\n     * @function Highcharts.Chart#resetMargins\n     */\n    resetMargins() {\n        fireEvent(this, 'resetMargins');\n        const chart = this, chartOptions = chart.options.chart, plotBorderWidth = chartOptions.plotBorderWidth || 0, halfWidth = plotBorderWidth / 2;\n        // Create margin and spacing array\n        ['margin', 'spacing'].forEach(function splashArrays(target) {\n            const value = chartOptions[target], values = isObject(value) ? value : [value, value, value, value];\n            [\n                'Top',\n                'Right',\n                'Bottom',\n                'Left'\n            ].forEach(function (sideName, side) {\n                chart[target][side] = pick(chartOptions[target + sideName], values[side]);\n            });\n        });\n        // Set margin names like chart.plotTop, chart.plotLeft,\n        // chart.marginRight, chart.marginBottom.\n        marginNames.forEach(function (m, side) {\n            chart[m] = pick(chart.margin[side], chart.spacing[side]);\n        });\n        chart.axisOffset = [0, 0, 0, 0]; // Top, right, bottom, left\n        chart.clipOffset = [\n            halfWidth,\n            halfWidth,\n            halfWidth,\n            halfWidth\n        ];\n        chart.plotBorderWidth = plotBorderWidth;\n    }\n    /**\n     * Internal function to draw or redraw the borders and backgrounds for chart\n     * and plot area.\n     *\n     * @private\n     * @function Highcharts.Chart#drawChartBox\n     * @emits Highcharts.Chart#event:afterDrawChartBox\n     */\n    drawChartBox() {\n        const chart = this, optionsChart = chart.options.chart, renderer = chart.renderer, chartWidth = chart.chartWidth, chartHeight = chart.chartHeight, styledMode = chart.styledMode, plotBGImage = chart.plotBGImage, chartBackgroundColor = optionsChart.backgroundColor, plotBackgroundColor = optionsChart.plotBackgroundColor, plotBackgroundImage = optionsChart.plotBackgroundImage, plotLeft = chart.plotLeft, plotTop = chart.plotTop, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotBox = chart.plotBox, clipRect = chart.clipRect, clipBox = chart.clipBox;\n        let chartBackground = chart.chartBackground, plotBackground = chart.plotBackground, plotBorder = chart.plotBorder, chartBorderWidth, mgn, bgAttr, verb = 'animate';\n        // Chart area\n        if (!chartBackground) {\n            chart.chartBackground = chartBackground = renderer.rect()\n                .addClass('highcharts-background')\n                .add();\n            verb = 'attr';\n        }\n        if (!styledMode) {\n            // Presentational\n            chartBorderWidth = optionsChart.borderWidth || 0;\n            mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n            bgAttr = {\n                fill: chartBackgroundColor || 'none'\n            };\n            if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n                bgAttr.stroke = optionsChart.borderColor;\n                bgAttr['stroke-width'] = chartBorderWidth;\n            }\n            chartBackground\n                .attr(bgAttr)\n                .shadow(optionsChart.shadow);\n        }\n        else {\n            chartBorderWidth = mgn = chartBackground.strokeWidth();\n        }\n        chartBackground[verb]({\n            x: mgn / 2,\n            y: mgn / 2,\n            width: chartWidth - mgn - chartBorderWidth % 2,\n            height: chartHeight - mgn - chartBorderWidth % 2,\n            r: optionsChart.borderRadius\n        });\n        // Plot background\n        verb = 'animate';\n        if (!plotBackground) {\n            verb = 'attr';\n            chart.plotBackground = plotBackground = renderer.rect()\n                .addClass('highcharts-plot-background')\n                .add();\n        }\n        plotBackground[verb](plotBox);\n        if (!styledMode) {\n            // Presentational attributes for the background\n            plotBackground\n                .attr({\n                fill: plotBackgroundColor || 'none'\n            })\n                .shadow(optionsChart.plotShadow);\n            // Create the background image\n            if (plotBackgroundImage) {\n                if (!plotBGImage) {\n                    chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight).add();\n                }\n                else {\n                    if (plotBackgroundImage !== plotBGImage.attr('href')) {\n                        plotBGImage.attr('href', plotBackgroundImage);\n                    }\n                    plotBGImage.animate(plotBox);\n                }\n            }\n        }\n        // Plot clip\n        if (!clipRect) {\n            chart.clipRect = renderer.clipRect(clipBox);\n        }\n        else {\n            clipRect.animate({\n                width: clipBox.width,\n                height: clipBox.height\n            });\n        }\n        // Plot area border\n        verb = 'animate';\n        if (!plotBorder) {\n            verb = 'attr';\n            chart.plotBorder = plotBorder = renderer.rect()\n                .addClass('highcharts-plot-border')\n                .attr({\n                zIndex: 1 // Above the grid\n            })\n                .add();\n        }\n        if (!styledMode) {\n            // Presentational\n            plotBorder.attr({\n                stroke: optionsChart.plotBorderColor,\n                'stroke-width': optionsChart.plotBorderWidth || 0,\n                fill: 'none'\n            });\n        }\n        plotBorder[verb](plotBorder.crisp({\n            x: plotLeft,\n            y: plotTop,\n            width: plotWidth,\n            height: plotHeight\n        }, -plotBorder.strokeWidth())); // #3282 plotBorder should be negative;\n        // reset\n        chart.isDirtyBox = false;\n        fireEvent(this, 'afterDrawChartBox');\n    }\n    /**\n     * Detect whether a certain chart property is needed based on inspecting its\n     * options and series. This mainly applies to the chart.inverted property,\n     * and in extensions to the chart.angular and chart.polar properties.\n     *\n     * @private\n     * @function Highcharts.Chart#propFromSeries\n     */\n    propFromSeries() {\n        const chart = this, optionsChart = chart.options.chart, seriesOptions = chart.options.series;\n        let i, klass, value;\n        /**\n         * The flag is set to `true` if a series of the chart is inverted.\n         *\n         * @name Highcharts.Chart#inverted\n         * @type {boolean|undefined}\n         */\n        ['inverted', 'angular', 'polar'].forEach(function (key) {\n            // The default series type's class\n            klass = seriesTypes[optionsChart.type];\n            // Get the value from available chart-wide properties\n            value =\n                // It is set in the options:\n                optionsChart[key] ||\n                    // The default series class:\n                    (klass && klass.prototype[key]);\n            // Requires it\n            // 4. Check if any the chart's series require it\n            i = seriesOptions && seriesOptions.length;\n            while (!value && i--) {\n                klass = seriesTypes[seriesOptions[i].type];\n                if (klass && klass.prototype[key]) {\n                    value = true;\n                }\n            }\n            // Set the chart property\n            chart[key] = value;\n        });\n    }\n    /**\n     * Internal function to link two or more series together, based on the\n     * `linkedTo` option. This is done from `Chart.render`, and after\n     * `Chart.addSeries` and `Series.remove`.\n     *\n     * @private\n     * @function Highcharts.Chart#linkSeries\n     * @emits Highcharts.Chart#event:afterLinkSeries\n     */\n    linkSeries(isUpdating) {\n        const chart = this, chartSeries = chart.series;\n        // Reset links\n        chartSeries.forEach(function (series) {\n            series.linkedSeries.length = 0;\n        });\n        // Apply new links\n        chartSeries.forEach(function (series) {\n            const { linkedTo } = series.options;\n            if (isString(linkedTo)) {\n                let linkedParent;\n                if (linkedTo === ':previous') {\n                    linkedParent = chart.series[series.index - 1];\n                }\n                else {\n                    linkedParent = chart.get(linkedTo);\n                }\n                // #3341 avoid mutual linking\n                if (linkedParent &&\n                    linkedParent.linkedParent !== series) {\n                    linkedParent.linkedSeries.push(series);\n                    /**\n                     * The parent series of the current series, if the current\n                     * series has a [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n                     * setting.\n                     *\n                     * @name Highcharts.Series#linkedParent\n                     * @type {Highcharts.Series}\n                     * @readonly\n                     */\n                    series.linkedParent = linkedParent;\n                    if (linkedParent.enabledDataSorting) {\n                        series.setDataSortingOptions();\n                    }\n                    series.visible = pick(series.options.visible, linkedParent.options.visible, series.visible); // #3879\n                }\n            }\n        });\n        fireEvent(this, 'afterLinkSeries', { isUpdating });\n    }\n    /**\n     * Render series for the chart.\n     *\n     * @private\n     * @function Highcharts.Chart#renderSeries\n     */\n    renderSeries() {\n        this.series.forEach(function (serie) {\n            serie.translate();\n            serie.render();\n        });\n    }\n    /**\n     * Render all graphics for the chart. Runs internally on initialization.\n     *\n     * @private\n     * @function Highcharts.Chart#render\n     */\n    render() {\n        const chart = this, axes = chart.axes, colorAxis = chart.colorAxis, renderer = chart.renderer, axisLayoutRuns = chart.options.chart.axisLayoutRuns || 2, renderAxes = (axes) => {\n            axes.forEach((axis) => {\n                if (axis.visible) {\n                    axis.render();\n                }\n            });\n        };\n        let expectedSpace = 0, // Correction for X axis labels\n        // If the plot area size has changed significantly, calculate tick\n        // positions again\n        redoHorizontal = true, redoVertical, run = 0;\n        // Title\n        chart.setTitle();\n        // Fire an event before the margins are computed. This is where the\n        // legend is assigned.\n        fireEvent(chart, 'beforeMargins');\n        // Get stacks\n        chart.getStacks?.();\n        // Get chart margins\n        chart.getMargins(true);\n        chart.setChartSize();\n        for (const axis of axes) {\n            const { options } = axis, { labels } = options;\n            if (chart.hasCartesianSeries && // #20948\n                axis.horiz &&\n                axis.visible &&\n                labels.enabled &&\n                axis.series.length &&\n                axis.coll !== 'colorAxis' &&\n                !chart.polar) {\n                expectedSpace = options.tickLength;\n                axis.createGroups();\n                // Calculate expected space based on dummy tick\n                const mockTick = new Tick(axis, 0, '', true), label = mockTick.createLabel('x', labels);\n                mockTick.destroy();\n                if (label &&\n                    pick(labels.reserveSpace, !isNumber(options.crossing))) {\n                    expectedSpace = label.getBBox().height +\n                        labels.distance +\n                        Math.max(options.offset || 0, 0);\n                }\n                if (expectedSpace) {\n                    label?.destroy();\n                    break;\n                }\n            }\n        }\n        // Use Math.max to prevent negative plotHeight\n        chart.plotHeight = Math.max(chart.plotHeight - expectedSpace, 0);\n        while ((redoHorizontal || redoVertical || axisLayoutRuns > 1) &&\n            run < axisLayoutRuns // #19794\n        ) {\n            const tempWidth = chart.plotWidth, tempHeight = chart.plotHeight;\n            for (const axis of axes) {\n                if (run === 0) {\n                    // Get margins by pre-rendering axes\n                    axis.setScale();\n                }\n                else if ((axis.horiz && redoHorizontal) ||\n                    (!axis.horiz && redoVertical)) {\n                    // Update to reflect the new margins\n                    axis.setTickInterval(true);\n                }\n            }\n            if (run === 0) {\n                chart.getAxisMargins();\n            }\n            else {\n                // Check again for new, rotated or moved labels\n                chart.getMargins();\n            }\n            redoHorizontal = (tempWidth / chart.plotWidth) > (run ? 1 : 1.1);\n            redoVertical = (tempHeight / chart.plotHeight) > (run ? 1 : 1.05);\n            run++;\n        }\n        // Draw the borders and backgrounds\n        chart.drawChartBox();\n        // Axes\n        if (chart.hasCartesianSeries) {\n            renderAxes(axes);\n        }\n        else if (colorAxis && colorAxis.length) {\n            renderAxes(colorAxis);\n        }\n        // The series\n        if (!chart.seriesGroup) {\n            chart.seriesGroup = renderer.g('series-group')\n                .attr({ zIndex: 3 })\n                .shadow(chart.options.chart.seriesGroupShadow)\n                .add();\n        }\n        chart.renderSeries();\n        // Credits\n        chart.addCredits();\n        // Handle responsiveness\n        if (chart.setResponsive) {\n            chart.setResponsive();\n        }\n        // Set flag\n        chart.hasRendered = true;\n    }\n    /**\n     * Set a new credits label for the chart.\n     *\n     * @sample highcharts/credits/credits-update/\n     *         Add and update credits\n     *\n     * @function Highcharts.Chart#addCredits\n     *\n     * @param {Highcharts.CreditsOptions} [credits]\n     * A configuration object for the new credits.\n     */\n    addCredits(credits) {\n        const chart = this, creds = merge(true, this.options.credits, credits);\n        if (creds.enabled && !this.credits) {\n            /**\n             * The chart's credits label. The label has an `update` method that\n             * allows setting new options as per the\n             * [credits options set](https://api.highcharts.com/highcharts/credits).\n             *\n             * @name Highcharts.Chart#credits\n             * @type {Highcharts.SVGElement}\n             */\n            this.credits = this.renderer.text(creds.text + (this.mapCredits || ''), 0, 0)\n                .addClass('highcharts-credits')\n                .on('click', function () {\n                if (creds.href) {\n                    win.location.href = creds.href;\n                }\n            })\n                .attr({\n                align: creds.position.align,\n                zIndex: 8\n            });\n            if (!chart.styledMode) {\n                this.credits.css(creds.style);\n            }\n            this.credits\n                .add()\n                .align(creds.position);\n            // Dynamically update\n            this.credits.update = function (options) {\n                chart.credits = chart.credits.destroy();\n                chart.addCredits(options);\n            };\n        }\n    }\n    /**\n     * Remove the chart and purge memory. This method is called internally\n     * before adding a second chart into the same container, as well as on\n     * window unload to prevent leaks.\n     *\n     * @sample highcharts/members/chart-destroy/\n     *         Destroy the chart from a button\n     * @sample stock/members/chart-destroy/\n     *         Destroy with Highcharts Stock\n     *\n     * @function Highcharts.Chart#destroy\n     *\n     * @emits Highcharts.Chart#event:destroy\n     */\n    destroy() {\n        const chart = this, axes = chart.axes, series = chart.series, container = chart.container, parentNode = container && container.parentNode;\n        let i;\n        // Fire the chart.destroy event\n        fireEvent(chart, 'destroy');\n        // Delete the chart from charts lookup array\n        if (chart.renderer.forExport) {\n            erase(charts, chart); // #6569\n        }\n        else {\n            charts[chart.index] = void 0;\n        }\n        H.chartCount--;\n        chart.renderTo.removeAttribute('data-highcharts-chart');\n        // Remove events\n        removeEvent(chart);\n        // ==== Destroy collections:\n        // Destroy axes\n        i = axes.length;\n        while (i--) {\n            axes[i] = axes[i].destroy();\n        }\n        // Destroy scroller & scroller series before destroying base series\n        if (this.scroller && this.scroller.destroy) {\n            this.scroller.destroy();\n        }\n        // Destroy each series\n        i = series.length;\n        while (i--) {\n            series[i] = series[i].destroy();\n        }\n        // ==== Destroy chart properties:\n        [\n            'title', 'subtitle', 'chartBackground', 'plotBackground',\n            'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n            'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n            'renderer'\n        ].forEach(function (name) {\n            const prop = chart[name];\n            if (prop && prop.destroy) {\n                chart[name] = prop.destroy();\n            }\n        });\n        // Remove container and all SVG, check container as it can break in IE\n        // when destroyed before finished loading\n        if (container) {\n            container.innerHTML = AST.emptyHTML;\n            removeEvent(container);\n            if (parentNode) {\n                discardElement(container);\n            }\n        }\n        // Clean it all up\n        objectEach(chart, function (val, key) {\n            delete chart[key];\n        });\n    }\n    /**\n     * Prepare for first rendering after all data are loaded.\n     *\n     * @private\n     * @function Highcharts.Chart#firstRender\n     * @emits Highcharts.Chart#event:beforeRender\n     */\n    firstRender() {\n        const chart = this, options = chart.options;\n        // Create the container\n        chart.getContainer();\n        chart.resetMargins();\n        chart.setChartSize();\n        // Set the common chart properties (mainly invert) from the given series\n        chart.propFromSeries();\n        // Get axes\n        chart.getAxes();\n        // Initialize the series\n        const series = isArray(options.series) ? options.series : [];\n        options.series = []; // Avoid mutation\n        series.forEach(\n        // #9680\n        function (serieOptions) {\n            chart.initSeries(serieOptions);\n        });\n        chart.linkSeries();\n        chart.setSortedData();\n        // Run an event after axes and series are initialized, but before\n        // render. At this stage, the series data is indexed and cached in the\n        // xData and yData arrays, so we can access those before rendering. Used\n        // in Highcharts Stock.\n        fireEvent(chart, 'beforeRender');\n        chart.render();\n        chart.pointer?.getChartPosition(); // #14973\n        // Fire the load event if there are no external images\n        if (!chart.renderer.imgCount && !chart.hasLoaded) {\n            chart.onload();\n        }\n        // If the chart was rendered outside the top container, put it back in\n        // (#3679)\n        chart.temporaryDisplay(true);\n    }\n    /**\n     * Internal function that runs on chart load, async if any images are loaded\n     * in the chart. Runs the callbacks and triggers the `load` and `render`\n     * events.\n     *\n     * @private\n     * @function Highcharts.Chart#onload\n     * @emits Highcharts.Chart#event:load\n     * @emits Highcharts.Chart#event:render\n     */\n    onload() {\n        // Run callbacks, first the ones registered by modules, then user's one\n        this.callbacks.concat([this.callback]).forEach(function (fn) {\n            // Chart destroyed in its own callback (#3600)\n            if (fn && typeof this.index !== 'undefined') {\n                fn.apply(this, [this]);\n            }\n        }, this);\n        fireEvent(this, 'load');\n        fireEvent(this, 'render');\n        // Set up auto resize, check for not destroyed (#6068)\n        if (defined(this.index)) {\n            this.setReflow();\n        }\n        this.warnIfA11yModuleNotLoaded();\n        // Don't run again\n        this.hasLoaded = true;\n    }\n    /**\n     * Emit console warning if the a11y module is not loaded.\n     * @private\n     */\n    warnIfA11yModuleNotLoaded() {\n        const { options, title } = this;\n        if (options && !this.accessibility) {\n            // Make chart behave as an image with the title as alt text\n            this.renderer.boxWrapper.attr({\n                role: 'img',\n                'aria-label': ((title && title.element.textContent) || ''\n                // #17753, < is not allowed in SVG attributes\n                ).replace(/</g, '&lt;')\n            });\n            if (!(options.accessibility && options.accessibility.enabled === false)) {\n                error('Highcharts warning: Consider including the ' +\n                    '\"accessibility.js\" module to make your chart more ' +\n                    'usable for people with disabilities. Set the ' +\n                    '\"accessibility.enabled\" option to false to remove this ' +\n                    'warning. See https://www.highcharts.com/docs/accessibility/accessibility-module.', false, this);\n            }\n        }\n    }\n    /**\n     * Add a series to the chart after render time. Note that this method should\n     * never be used when adding data synchronously at chart render time, as it\n     * adds expense to the calculations and rendering. When adding data at the\n     * same time as the chart is initialized, add the series as a configuration\n     * option instead. With multiple axes, the `offset` is dynamically adjusted.\n     *\n     * @sample highcharts/members/chart-addseries/\n     *         Add a series from a button\n     * @sample stock/members/chart-addseries/\n     *         Add a series in Highcharts Stock\n     *\n     * @function Highcharts.Chart#addSeries\n     *\n     * @param {Highcharts.SeriesOptionsType} options\n     *        The config options for the series.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after adding.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether to apply animation, and optionally animation\n     *        configuration. When `undefined`, it applies the animation that is\n     *        set in the `chart.animation` option.\n     *\n     * @return {Highcharts.Series}\n     *         The newly created series object.\n     *\n     * @emits Highcharts.Chart#event:addSeries\n     * @emits Highcharts.Chart#event:afterAddSeries\n     */\n    addSeries(options, redraw, animation) {\n        const chart = this;\n        let series;\n        if (options) { // <- not necessary\n            redraw = pick(redraw, true); // Defaults to true\n            fireEvent(chart, 'addSeries', { options: options }, function () {\n                series = chart.initSeries(options);\n                chart.isDirtyLegend = true;\n                chart.linkSeries();\n                if (series.enabledDataSorting) {\n                    // We need to call `setData` after `linkSeries`\n                    series.setData(options.data, false);\n                }\n                fireEvent(chart, 'afterAddSeries', { series: series });\n                if (redraw) {\n                    chart.redraw(animation);\n                }\n            });\n        }\n        return series;\n    }\n    /**\n     * Add an axis to the chart after render time. Note that this method should\n     * never be used when adding data synchronously at chart render time, as it\n     * adds expense to the calculations and rendering. When adding data at the\n     * same time as the chart is initialized, add the axis as a configuration\n     * option instead.\n     *\n     * @sample highcharts/members/chart-addaxis/\n     *         Add and remove axes\n     *\n     * @function Highcharts.Chart#addAxis\n     *\n     * @param {Highcharts.AxisOptions} options\n     *        The axis options.\n     *\n     * @param {boolean} [isX=false]\n     *        Whether it is an X axis or a value axis.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after adding.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether and how to apply animation in the redraw. When\n     *        `undefined`, it applies the animation that is set in the\n     *        `chart.animation` option.\n     *\n     * @return {Highcharts.Axis}\n     *         The newly generated Axis object.\n     */\n    addAxis(options, isX, redraw, animation) {\n        return this.createAxis(isX ? 'xAxis' : 'yAxis', { axis: options, redraw: redraw, animation: animation });\n    }\n    /**\n     * Add a color axis to the chart after render time. Note that this method\n     * should never be used when adding data synchronously at chart render time,\n     * as it adds expense to the calculations and rendering. When adding data at\n     * the same time as the chart is initialized, add the axis as a\n     * configuration option instead.\n     *\n     * @sample highcharts/members/chart-addaxis/\n     *         Add and remove axes\n     *\n     * @function Highcharts.Chart#addColorAxis\n     *\n     * @param {Highcharts.ColorAxisOptions} options\n     *        The axis options.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after adding.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether and how to apply animation in the redraw. When\n     *        `undefined`, it applies the animation that is set in the\n     *        `chart.animation` option.\n     *\n     * @return {Highcharts.Axis}\n     *         The newly generated Axis object.\n     */\n    addColorAxis(options, redraw, animation) {\n        return this.createAxis('colorAxis', { axis: options, redraw: redraw, animation: animation });\n    }\n    /**\n     * Factory for creating different axis types.\n     *\n     * @private\n     * @function Highcharts.Chart#createAxis\n     *\n     * @param {string} coll\n     *        An axis type.\n     *\n     * @param {...Array<*>} arguments\n     *        All arguments for the constructor.\n     *\n     * @return {Highcharts.Axis}\n     *         The newly generated Axis object.\n     */\n    createAxis(coll, options) {\n        const axis = new Axis(this, options.axis, coll);\n        if (pick(options.redraw, true)) {\n            this.redraw(options.animation);\n        }\n        return axis;\n    }\n    /**\n     * Dim the chart and show a loading text or symbol. Options for the loading\n     * screen are defined in {@link\n     * https://api.highcharts.com/highcharts/loading|the loading options}.\n     *\n     * @sample highcharts/members/chart-hideloading/\n     *         Show and hide loading from a button\n     * @sample highcharts/members/chart-showloading/\n     *         Apply different text labels\n     * @sample stock/members/chart-show-hide-loading/\n     *         Toggle loading in Highcharts Stock\n     *\n     * @function Highcharts.Chart#showLoading\n     *\n     * @param {string} [str]\n     *        An optional text to show in the loading label instead of the\n     *        default one. The default text is set in\n     *        [lang.loading](https://api.highcharts.com/highcharts/lang.loading).\n     */\n    showLoading(str) {\n        const chart = this, options = chart.options, loadingOptions = options.loading, setLoadingSize = function () {\n            if (loadingDiv) {\n                css(loadingDiv, {\n                    left: chart.plotLeft + 'px',\n                    top: chart.plotTop + 'px',\n                    width: chart.plotWidth + 'px',\n                    height: chart.plotHeight + 'px'\n                });\n            }\n        };\n        let loadingDiv = chart.loadingDiv, loadingSpan = chart.loadingSpan;\n        // Create the layer at the first call\n        if (!loadingDiv) {\n            chart.loadingDiv = loadingDiv = createElement('div', {\n                className: 'highcharts-loading highcharts-loading-hidden'\n            }, null, chart.container);\n        }\n        if (!loadingSpan) {\n            chart.loadingSpan = loadingSpan = createElement('span', { className: 'highcharts-loading-inner' }, null, loadingDiv);\n            addEvent(chart, 'redraw', setLoadingSize); // #1080\n        }\n        loadingDiv.className = 'highcharts-loading';\n        // Update text\n        AST.setElementHTML(loadingSpan, pick(str, options.lang.loading, ''));\n        if (!chart.styledMode) {\n            // Update visuals\n            css(loadingDiv, extend(loadingOptions.style, {\n                zIndex: 10\n            }));\n            css(loadingSpan, loadingOptions.labelStyle);\n            // Show it\n            if (!chart.loadingShown) {\n                css(loadingDiv, {\n                    opacity: 0,\n                    display: ''\n                });\n                animate(loadingDiv, {\n                    opacity: loadingOptions.style.opacity || 0.5\n                }, {\n                    duration: loadingOptions.showDuration || 0\n                });\n            }\n        }\n        chart.loadingShown = true;\n        setLoadingSize();\n    }\n    /**\n     * Hide the loading layer.\n     *\n     * @see Highcharts.Chart#showLoading\n     *\n     * @sample highcharts/members/chart-hideloading/\n     *         Show and hide loading from a button\n     * @sample stock/members/chart-show-hide-loading/\n     *         Toggle loading in Highcharts Stock\n     *\n     * @function Highcharts.Chart#hideLoading\n     */\n    hideLoading() {\n        const options = this.options, loadingDiv = this.loadingDiv;\n        if (loadingDiv) {\n            loadingDiv.className =\n                'highcharts-loading highcharts-loading-hidden';\n            if (!this.styledMode) {\n                animate(loadingDiv, {\n                    opacity: 0\n                }, {\n                    duration: options.loading.hideDuration || 100,\n                    complete: function () {\n                        css(loadingDiv, { display: 'none' });\n                    }\n                });\n            }\n        }\n        this.loadingShown = false;\n    }\n    /**\n     * A generic function to update any element of the chart. Elements can be\n     * enabled and disabled, moved, re-styled, re-formatted etc.\n     *\n     * A special case is configuration objects that take arrays, for example\n     * [xAxis](https://api.highcharts.com/highcharts/xAxis),\n     * [yAxis](https://api.highcharts.com/highcharts/yAxis) or\n     * [series](https://api.highcharts.com/highcharts/series). For these\n     * collections, an `id` option is used to map the new option set to an\n     * existing object. If an existing object of the same id is not found, the\n     * corresponding item is updated. So for example, running `chart.update`\n     * with a series item without an id, will cause the existing chart's series\n     * with the same index in the series array to be updated. When the\n     * `oneToOne` parameter is true, `chart.update` will also take care of\n     * adding and removing items from the collection. Read more under the\n     * parameter description below.\n     *\n     * Note that when changing series data, `chart.update` may mutate the passed\n     * data options.\n     *\n     * See also the\n     * [responsive option set](https://api.highcharts.com/highcharts/responsive).\n     * Switching between `responsive.rules` basically runs `chart.update` under\n     * the hood.\n     *\n     * @sample highcharts/members/chart-update/\n     *         Update chart geometry\n     *\n     * @function Highcharts.Chart#update\n     *\n     * @param {Highcharts.Options} options\n     *        A configuration object for the new chart options.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart.\n     *\n     * @param {boolean} [oneToOne=false]\n     *        When `true`, the `series`, `xAxis`, `yAxis` and `annotations`\n     *        collections will be updated one to one, and items will be either\n     *        added or removed to match the new updated options. For example,\n     *        if the chart has two series and we call `chart.update` with a\n     *        configuration containing three series, one will be added. If we\n     *        call `chart.update` with one series, one will be removed. Setting\n     *        an empty `series` array will remove all series, but leaving out\n     *        the`series` property will leave all series untouched. If the\n     *        series have id's, the new series options will be matched by id,\n     *        and the remaining ones removed.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether to apply animation, and optionally animation\n     *        configuration. When `undefined`, it applies the animation that is\n     *        set in the `chart.animation` option.\n     *\n     * @emits Highcharts.Chart#event:update\n     * @emits Highcharts.Chart#event:afterUpdate\n     */\n    update(options, redraw, oneToOne, animation) {\n        const chart = this, adders = {\n            credits: 'addCredits',\n            title: 'setTitle',\n            subtitle: 'setSubtitle',\n            caption: 'setCaption'\n        }, isResponsiveOptions = options.isResponsiveOptions, itemsForRemoval = [];\n        let updateAllAxes, updateAllSeries, runSetSize;\n        fireEvent(chart, 'update', { options: options });\n        // If there are responsive rules in action, undo the responsive rules\n        // before we apply the updated options and replay the responsive rules\n        // on top from the chart.redraw function (#9617).\n        if (!isResponsiveOptions) {\n            chart.setResponsive(false, true);\n        }\n        options = diffObjects(options, chart.options);\n        chart.userOptions = merge(chart.userOptions, options);\n        // If the top-level chart option is present, some special updates are\n        // required\n        const optionsChart = options.chart;\n        if (optionsChart) {\n            merge(true, chart.options.chart, optionsChart);\n            // Add support for deprecated zooming options like zoomType, #17861\n            this.setZoomOptions();\n            // Setter function\n            if ('className' in optionsChart) {\n                chart.setClassName(optionsChart.className);\n            }\n            if ('inverted' in optionsChart ||\n                'polar' in optionsChart ||\n                'type' in optionsChart) {\n                // Parse options.chart.inverted and options.chart.polar together\n                // with the available series.\n                chart.propFromSeries();\n                updateAllAxes = true;\n            }\n            if ('alignTicks' in optionsChart) { // #6452\n                updateAllAxes = true;\n            }\n            if ('events' in optionsChart) {\n                // Chart event handlers\n                registerEventOptions(this, optionsChart);\n            }\n            objectEach(optionsChart, function (val, key) {\n                if (chart.propsRequireUpdateSeries.indexOf('chart.' + key) !==\n                    -1) {\n                    updateAllSeries = true;\n                }\n                // Only dirty box\n                if (chart.propsRequireDirtyBox.indexOf(key) !== -1) {\n                    chart.isDirtyBox = true;\n                }\n                // Chart setSize\n                if (chart.propsRequireReflow.indexOf(key) !== -1) {\n                    chart.isDirtyBox = true;\n                    if (!isResponsiveOptions) {\n                        runSetSize = true;\n                    }\n                }\n            });\n            if (!chart.styledMode && optionsChart.style) {\n                chart.renderer.setStyle(chart.options.chart.style || {});\n            }\n        }\n        // Moved up, because tooltip needs updated plotOptions (#6218)\n        if (!chart.styledMode && options.colors) {\n            this.options.colors = options.colors;\n        }\n        if (options.time) {\n            // Maintaining legacy global time. If the chart is instantiated\n            // first with global time, then updated with time options, we need\n            // to create a new Time instance to avoid mutating the global time\n            // (#10536).\n            if (this.time === defaultTime) {\n                this.time = new Time(options.time);\n            }\n            // If we're updating, the time class is different from other chart\n            // classes (chart.legend, chart.tooltip etc) in that it doesn't know\n            // about the chart. The other chart[something].update functions also\n            // set the chart.options[something]. For the time class however we\n            // need to update the chart options separately. #14230.\n            merge(true, chart.options.time, options.time);\n        }\n        // Some option structures correspond one-to-one to chart objects that\n        // have update methods, for example\n        // options.credits => chart.credits\n        // options.legend => chart.legend\n        // options.title => chart.title\n        // options.tooltip => chart.tooltip\n        // options.subtitle => chart.subtitle\n        // options.mapNavigation => chart.mapNavigation\n        // options.navigator => chart.navigator\n        // options.scrollbar => chart.scrollbar\n        objectEach(options, function (val, key) {\n            if (chart[key] &&\n                typeof chart[key].update === 'function') {\n                chart[key].update(val, false);\n                // If a one-to-one object does not exist, look for an adder function\n            }\n            else if (typeof chart[adders[key]] === 'function') {\n                chart[adders[key]](val);\n                // Else, just merge the options. For nodes like loading, noData,\n                // plotOptions\n            }\n            else if (key !== 'colors' &&\n                chart.collectionsWithUpdate.indexOf(key) === -1) {\n                merge(true, chart.options[key], options[key]);\n            }\n            if (key !== 'chart' &&\n                chart.propsRequireUpdateSeries.indexOf(key) !== -1) {\n                updateAllSeries = true;\n            }\n        });\n        // Setters for collections. For axes and series, each item is referred\n        // by an id. If the id is not found, it defaults to the corresponding\n        // item in the collection, so setting one series without an id, will\n        // update the first series in the chart. Setting two series without\n        // an id will update the first and the second respectively (#6019)\n        // chart.update and responsive.\n        this.collectionsWithUpdate.forEach(function (coll) {\n            if (options[coll]) {\n                splat(options[coll]).forEach(function (newOptions, i) {\n                    const hasId = defined(newOptions.id);\n                    let item;\n                    // Match by id\n                    if (hasId) {\n                        item = chart.get(newOptions.id);\n                    }\n                    // No match by id found, match by index instead\n                    if (!item && chart[coll]) {\n                        item = chart[coll][pick(newOptions.index, i)];\n                        // Check if we grabbed an item with an existing but\n                        // different id (#13541). Check that the item in this\n                        // position is not internal (navigator).\n                        if (item && ((hasId && defined(item.options.id)) ||\n                            item.options.isInternal)) {\n                            item = void 0;\n                        }\n                    }\n                    if (item && item.coll === coll) {\n                        item.update(newOptions, false);\n                        if (oneToOne) {\n                            item.touched = true;\n                        }\n                    }\n                    // If oneToOne and no matching item is found, add one\n                    if (!item && oneToOne && chart.collectionsWithInit[coll]) {\n                        chart.collectionsWithInit[coll][0].apply(chart, \n                        // [newOptions, ...extraArguments, redraw=false]\n                        [\n                            newOptions\n                        ].concat(\n                        // Not all initializers require extra args\n                        chart.collectionsWithInit[coll][1] || []).concat([\n                            false\n                        ])).touched = true;\n                    }\n                });\n                // Add items for removal\n                if (oneToOne) {\n                    chart[coll].forEach(function (item) {\n                        if (!item.touched && !item.options.isInternal) {\n                            itemsForRemoval.push(item);\n                        }\n                        else {\n                            delete item.touched;\n                        }\n                    });\n                }\n            }\n        });\n        itemsForRemoval.forEach(function (item) {\n            if (item.chart && item.remove) { // #9097, avoid removing twice\n                item.remove(false);\n            }\n        });\n        if (updateAllAxes) {\n            chart.axes.forEach(function (axis) {\n                axis.update({}, false);\n            });\n        }\n        // Certain options require the whole series structure to be thrown away\n        // and rebuilt\n        if (updateAllSeries) {\n            chart.getSeriesOrderByLinks().forEach(function (series) {\n                // Avoid removed navigator series\n                if (series.chart) {\n                    series.update({}, false);\n                }\n            }, this);\n        }\n        // Update size. Redraw is forced.\n        const newWidth = optionsChart && optionsChart.width;\n        const newHeight = optionsChart && (isString(optionsChart.height) ?\n            relativeLength(optionsChart.height, newWidth || chart.chartWidth) :\n            optionsChart.height);\n        if (\n        // In this case, run chart.setSize with newWidth and newHeight which\n        // are undefined, only for reflowing chart elements because margin\n        // or spacing has been set (#8190)\n        runSetSize ||\n            // In this case, the size is actually set\n            (isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n            (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n            chart.setSize(newWidth, newHeight, animation);\n        }\n        else if (pick(redraw, true)) {\n            chart.redraw(animation);\n        }\n        fireEvent(chart, 'afterUpdate', {\n            options: options,\n            redraw: redraw,\n            animation: animation\n        });\n    }\n    /**\n     * Shortcut to set the subtitle options. This can also be done from {@link\n     * Chart#update} or {@link Chart#setTitle}.\n     *\n     * @function Highcharts.Chart#setSubtitle\n     *\n     * @param {Highcharts.SubtitleOptions} options\n     *        New subtitle options. The subtitle text itself is set by the\n     *        `options.text` property.\n     */\n    setSubtitle(options, redraw) {\n        this.applyDescription('subtitle', options);\n        this.layOutTitles(redraw);\n    }\n    /**\n     * Set the caption options. This can also be done from {@link\n     * Chart#update}.\n     *\n     * @function Highcharts.Chart#setCaption\n     *\n     * @param {Highcharts.CaptionOptions} options\n     *        New caption options. The caption text itself is set by the\n     *        `options.text` property.\n     */\n    setCaption(options, redraw) {\n        this.applyDescription('caption', options);\n        this.layOutTitles(redraw);\n    }\n    /**\n     * Display the zoom button, so users can reset zoom to the default view\n     * settings.\n     *\n     * @function Highcharts.Chart#showResetZoom\n     *\n     * @emits Highcharts.Chart#event:afterShowResetZoom\n     * @emits Highcharts.Chart#event:beforeShowResetZoom\n     */\n    showResetZoom() {\n        const chart = this, lang = defaultOptions.lang, btnOptions = chart.zooming.resetButton, theme = btnOptions.theme, alignTo = (btnOptions.relativeTo === 'chart' ||\n            btnOptions.relativeTo === 'spacingBox' ?\n            null :\n            'plotBox');\n        /**\n         * @private\n         */\n        function zoomOut() {\n            chart.zoomOut();\n        }\n        fireEvent(this, 'beforeShowResetZoom', null, function () {\n            chart.resetZoomButton = chart.renderer\n                .button(lang.resetZoom, null, null, zoomOut, theme)\n                .attr({\n                align: btnOptions.position.align,\n                title: lang.resetZoomTitle\n            })\n                .addClass('highcharts-reset-zoom')\n                .add()\n                .align(btnOptions.position, false, alignTo);\n        });\n        fireEvent(this, 'afterShowResetZoom');\n    }\n    /**\n     * Zoom the chart out after a user has zoomed in. See also\n     * [Axis.setExtremes](/class-reference/Highcharts.Axis#setExtremes).\n     *\n     * @function Highcharts.Chart#zoomOut\n     *\n     * @emits Highcharts.Chart#event:selection\n     */\n    zoomOut() {\n        fireEvent(this, 'selection', { resetSelection: true }, () => this.transform({ reset: true, trigger: 'zoom' }));\n    }\n    /**\n     * Pan the chart by dragging the mouse across the pane. This function is\n     * called on mouse move, and the distance to pan is computed from chartX\n     * compared to the first chartX position in the dragging operation.\n     *\n     * @private\n     * @function Highcharts.Chart#pan\n     * @param {Highcharts.PointerEventObject} event\n     * @param {string} panning\n     */\n    pan(event, panning) {\n        const chart = this, panningOptions = (typeof panning === 'object' ?\n            panning :\n            {\n                enabled: panning,\n                type: 'x'\n            }), type = panningOptions.type, axes = type && chart[{\n            x: 'xAxis',\n            xy: 'axes',\n            y: 'yAxis'\n        }[type]]\n            .filter((axis) => axis.options.panningEnabled && !axis.options.isInternal), chartOptions = chart.options.chart;\n        if (chartOptions?.panning) {\n            chartOptions.panning = panningOptions;\n        }\n        fireEvent(this, 'pan', { originalEvent: event }, () => {\n            chart.transform({\n                axes,\n                event,\n                to: {\n                    x: event.chartX - (chart.mouseDownX || 0),\n                    y: event.chartY - (chart.mouseDownY || 0)\n                },\n                trigger: 'pan'\n            });\n            css(chart.container, { cursor: 'move' });\n        });\n    }\n    /**\n     * Pan and scale the chart. Used internally by mouse-pan, touch-pan,\n     * touch-zoom, and mousewheel zoom.\n     *\n     * The main positioning logic is created around two imaginary boxes. What is\n     * currently within the `from` rectangle, should be transformed to fill up\n     * the `to` rectangle.\n     * - In a mouse zoom, the `from` rectangle is the selection, while the `to`\n     *   rectangle is the full plot area.\n     * - In a touch zoom, the `from` rectangle is made up of the last two-finger\n     *   touch, while the `to`` rectangle is the current touch.\n     * - In a mousewheel zoom, the `to` rectangle is a 10x10 px square,\n     *   while the `to` rectangle reflects the scale around that.\n     *\n     * @private\n     * @function Highcharts.Chart#transform\n     */\n    transform(params) {\n        const { axes = this.axes, event, from = {}, reset, selection, to = {}, trigger } = params, { inverted } = this;\n        let hasZoomed = false, displayButton, isAnyAxisPanning;\n        // Remove active points for shared tooltip\n        this.hoverPoints?.forEach((point) => point.setState());\n        for (const axis of axes) {\n            const { horiz, len, minPointOffset = 0, options, reversed } = axis, wh = horiz ? 'width' : 'height', xy = horiz ? 'x' : 'y', toLength = pick(to[wh], axis.len), fromLength = pick(from[wh], axis.len), \n            // If fingers pinched very close on this axis, treat as pan\n            scale = Math.abs(toLength) < 10 ?\n                1 :\n                toLength / fromLength, fromCenter = (from[xy] || 0) + fromLength / 2 - axis.pos, toCenter = (to[xy] ?? axis.pos) +\n                toLength / 2 - axis.pos, move = fromCenter - toCenter / scale, pointRangeDirection = (reversed && !inverted) ||\n                (!reversed && inverted) ?\n                -1 :\n                1, minPx = move;\n            // Zooming in multiple panes, zoom only in the pane that receives\n            // the input\n            if (!reset && (fromCenter < 0 || fromCenter > axis.len)) {\n                continue;\n            }\n            let newMin = axis.toValue(minPx, true) +\n                // Don't apply offset for selection (#20784)\n                (selection || axis.isOrdinal ?\n                    0 : minPointOffset * pointRangeDirection), newMax = axis.toValue(minPx + len / scale, true) -\n                (\n                // Don't apply offset for selection (#20784)\n                selection || axis.isOrdinal ?\n                    0 :\n                    ((minPointOffset * pointRangeDirection) ||\n                        // Polar zoom tests failed when this was not\n                        // commented:\n                        // (axis.isXAxis && axis.pointRangePadding) ||\n                        0)), allExtremes = axis.allExtremes;\n            if (newMin > newMax) {\n                [newMin, newMax] = [newMax, newMin];\n            }\n            // General calculations of the full data extremes. It is calculated\n            // on the first call to transform, then reused for subsequent\n            // touch/pan calls. (#11315).\n            if (scale === 1 &&\n                !reset &&\n                axis.coll === 'yAxis' &&\n                !allExtremes) {\n                for (const series of axis.series) {\n                    const seriesExtremes = series.getExtremes(series.getProcessedData(true).yData, true);\n                    allExtremes ?? (allExtremes = {\n                        dataMin: Number.MAX_VALUE,\n                        dataMax: -Number.MAX_VALUE\n                    });\n                    if (isNumber(seriesExtremes.dataMin) &&\n                        isNumber(seriesExtremes.dataMax)) {\n                        allExtremes.dataMin = Math.min(seriesExtremes.dataMin, allExtremes.dataMin);\n                        allExtremes.dataMax = Math.max(seriesExtremes.dataMax, allExtremes.dataMax);\n                    }\n                }\n                axis.allExtremes = allExtremes;\n            }\n            const { dataMin, dataMax, min, max } = extend(axis.getExtremes(), allExtremes || {}), \n            // For boosted chart where data extremes are skipped\n            safeDataMin = dataMin ?? options.min, safeDataMax = dataMax ?? options.max, range = newMax - newMin, padRange = axis.categories ? 0 : Math.min(range, safeDataMax - safeDataMin), paddedMin = safeDataMin - padRange * (defined(options.min) ? 0 : options.minPadding), paddedMax = safeDataMax + padRange * (defined(options.max) ? 0 : options.maxPadding), \n            // We're allowed to zoom outside the data extremes if we're\n            // dealing with a bubble chart, if we're panning, or if we're\n            // pinching or mousewheeling in.\n            allowZoomOutside = axis.allowZoomOutside ||\n                scale === 1 ||\n                (trigger !== 'zoom' && scale > 1), \n            // Calculate the floor and the ceiling\n            floor = Math.min(options.min ?? paddedMin, paddedMin, allowZoomOutside ? min : paddedMin), ceiling = Math.max(options.max ?? paddedMax, paddedMax, allowZoomOutside ? max : paddedMax);\n            // It is not necessary to calculate extremes on ordinal axis,\n            // because they are already calculated, so we don't want to override\n            // them.\n            if (!axis.isOrdinal ||\n                axis.options.overscroll || // #21316\n                scale !== 1 ||\n                reset) {\n                // If the new range spills over, either to the min or max,\n                // adjust it.\n                if (newMin < floor) {\n                    newMin = floor;\n                    if (scale >= 1) {\n                        newMax = newMin + range;\n                    }\n                }\n                if (newMax > ceiling) {\n                    newMax = ceiling;\n                    if (scale >= 1) {\n                        newMin = newMax - range;\n                    }\n                }\n                // Set new extremes if they are actually new\n                if (reset || (axis.series.length &&\n                    (newMin !== min || newMax !== max) &&\n                    newMin >= floor &&\n                    newMax <= ceiling)) {\n                    if (selection) {\n                        selection[axis.coll].push({\n                            axis,\n                            min: newMin,\n                            max: newMax\n                        });\n                    }\n                    else {\n                        // Temporarily flag the axis as `isPanning` in order to\n                        // disallow certain axis padding options that would make\n                        // panning/zooming hard. Reset and redraw after the\n                        // operation has finished.\n                        axis.isPanning = trigger !== 'zoom';\n                        if (axis.isPanning) {\n                            isAnyAxisPanning = true; // #21319\n                        }\n                        axis.setExtremes(reset ? void 0 : newMin, reset ? void 0 : newMax, false, false, { move, trigger, scale });\n                        if (!reset &&\n                            (newMin > floor || newMax < ceiling) &&\n                            trigger !== 'mousewheel') {\n                            displayButton = true;\n                        }\n                    }\n                    hasZoomed = true;\n                }\n                if (event) {\n                    this[horiz ? 'mouseDownX' : 'mouseDownY'] =\n                        event[horiz ? 'chartX' : 'chartY'];\n                }\n            }\n        }\n        if (hasZoomed) {\n            if (selection) {\n                fireEvent(this, 'selection', selection, \n                // Run transform again, this time without the selection data\n                // so that the transform is applied.\n                () => {\n                    delete params.selection;\n                    params.trigger = 'zoom';\n                    this.transform(params);\n                });\n            }\n            else {\n                // Show or hide the Reset zoom button, but not while panning\n                if (displayButton &&\n                    !isAnyAxisPanning &&\n                    !this.resetZoomButton) {\n                    this.showResetZoom();\n                }\n                else if (!displayButton && this.resetZoomButton) {\n                    this.resetZoomButton = this.resetZoomButton.destroy();\n                }\n                this.redraw(trigger === 'zoom' &&\n                    (this.options.chart.animation ?? this.pointCount < 100));\n            }\n        }\n        return hasZoomed;\n    }\n}\nextend(Chart.prototype, {\n    // Hook for adding callbacks in modules\n    callbacks: [],\n    /**\n     * These collections (arrays) implement `Chart.addSomething` method used in\n     * chart.update() to create new object in the collection. Equivalent for\n     * deleting is resolved by simple `Something.remove()`.\n     *\n     * Note: We need to define these references after initializers are bound to\n     * chart's prototype.\n     *\n     * @private\n     */\n    collectionsWithInit: {\n        // CollectionName: [ initializingMethod, [extraArguments] ]\n        xAxis: [Chart.prototype.addAxis, [true]],\n        yAxis: [Chart.prototype.addAxis, [false]],\n        series: [Chart.prototype.addSeries]\n    },\n    /**\n     * These collections (arrays) implement update() methods with support for\n     * one-to-one option.\n     * @private\n     */\n    collectionsWithUpdate: [\n        'xAxis',\n        'yAxis',\n        'series'\n    ],\n    /**\n     * These properties cause isDirtyBox to be set to true when updating. Can be\n     * extended from plugins.\n     * @private\n     */\n    propsRequireDirtyBox: [\n        'backgroundColor',\n        'borderColor',\n        'borderWidth',\n        'borderRadius',\n        'plotBackgroundColor',\n        'plotBackgroundImage',\n        'plotBorderColor',\n        'plotBorderWidth',\n        'plotShadow',\n        'shadow'\n    ],\n    /**\n     * These properties require a full reflow of chart elements, best\n     * implemented through running `Chart.setSize` internally (#8190).\n     * @private\n     */\n    propsRequireReflow: [\n        'margin',\n        'marginTop',\n        'marginRight',\n        'marginBottom',\n        'marginLeft',\n        'spacing',\n        'spacingTop',\n        'spacingRight',\n        'spacingBottom',\n        'spacingLeft'\n    ],\n    /**\n     * These properties cause all series to be updated when updating. Can be\n     * extended from plugins.\n     * @private\n     */\n    propsRequireUpdateSeries: [\n        'chart.inverted',\n        'chart.polar',\n        'chart.ignoreHiddenSeries',\n        'chart.type',\n        'colors',\n        'plotOptions',\n        'time',\n        'tooltip'\n    ]\n});\n/* *\n *\n *  Default Export\n *\n * */\nexport default Chart;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Callback for chart constructors.\n *\n * @callback Highcharts.ChartCallbackFunction\n *\n * @param {Highcharts.Chart} chart\n *        Created chart.\n */\n/**\n * Format a number and return a string based on input settings.\n *\n * @callback Highcharts.NumberFormatterCallbackFunction\n *\n * @param {number} number\n *        The input number to format.\n *\n * @param {number} decimals\n *        The amount of decimals. A value of -1 preserves the amount in the\n *        input number.\n *\n * @param {string} [decimalPoint]\n *        The decimal point, defaults to the one given in the lang options, or\n *        a dot.\n *\n * @param {string} [thousandsSep]\n *        The thousands separator, defaults to the one given in the lang\n *        options, or a space character.\n *\n * @return {string} The formatted number.\n */\n/**\n * The chart title. The title has an `update` method that allows modifying the\n * options directly or indirectly via `chart.update`.\n *\n * @interface Highcharts.TitleObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the title.\n*\n* @function Highcharts.TitleObject#update\n*\n* @param {Highcharts.TitleOptions} titleOptions\n*        Options to modify.\n*\n* @param {boolean} [redraw=true]\n*        Whether to redraw the chart after the title is altered. If doing more\n*        operations on the chart, it is a good idea to set redraw to false and\n*        call {@link Chart#redraw} after.\n*/\n/**\n * The chart subtitle. The subtitle has an `update` method that\n * allows modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @interface Highcharts.SubtitleObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the subtitle.\n*\n* @function Highcharts.SubtitleObject#update\n*\n* @param {Highcharts.SubtitleOptions} subtitleOptions\n*        Options to modify.\n*\n* @param {boolean} [redraw=true]\n*        Whether to redraw the chart after the subtitle is altered. If doing\n*        more operations on the chart, it is a good idea to set redraw to false\n*        and call {@link Chart#redraw} after.\n*/\n/**\n * The chart caption. The caption has an `update` method that\n * allows modifying the options directly or indirectly via\n * `chart.update`.\n *\n * @interface Highcharts.CaptionObject\n * @extends Highcharts.SVGElement\n */ /**\n* Modify options for the caption.\n*\n* @function Highcharts.CaptionObject#update\n*\n* @param {Highcharts.CaptionOptions} captionOptions\n*        Options to modify.\n*\n* @param {boolean} [redraw=true]\n*        Whether to redraw the chart after the caption is altered. If doing\n*        more operations on the chart, it is a good idea to set redraw to false\n*        and call {@link Chart#redraw} after.\n*/\n/**\n * @interface Highcharts.ChartIsInsideOptionsObject\n */ /**\n* @name Highcharts.ChartIsInsideOptionsObject#axis\n* @type {Highcharts.Axis|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#ignoreX\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#ignoreY\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#paneCoordinates\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#series\n* @type {Highcharts.Series|undefined}\n*/ /**\n* @name Highcharts.ChartIsInsideOptionsObject#visiblePlotOnly\n* @type {boolean|undefined}\n*/\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Globals.js';\nimport U from '../Utilities.js';\nconst { isNumber, merge, pInt } = U;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable valid-jsdoc */\n/**\n * Handle color operations. Some object methods are chainable.\n *\n * @class\n * @name Highcharts.Color\n *\n * @param {Highcharts.ColorType} input\n * The input color in either rgba or hex format\n */\nclass Color {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    /**\n     * Creates a color instance out of a color string or object.\n     *\n     * @function Highcharts.Color.parse\n     *\n     * @param {Highcharts.ColorType} [input]\n     * The input color in either rgba or hex format.\n     *\n     * @return {Highcharts.Color}\n     * Color instance.\n     */\n    static parse(input) {\n        return input ? new Color(input) : Color.None;\n    }\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(input) {\n        this.rgba = [NaN, NaN, NaN, NaN];\n        this.input = input;\n        const GlobalColor = H.Color;\n        // Backwards compatibility, allow class overwrite\n        if (GlobalColor && GlobalColor !== Color) {\n            return new GlobalColor(input);\n        }\n        let result, rgba, i, parser;\n        // Gradients\n        if (typeof input === 'object' &&\n            typeof input.stops !== 'undefined') {\n            this.stops = input.stops.map((stop) => new Color(stop[1]));\n            // Solid colors\n        }\n        else if (typeof input === 'string') {\n            this.input = input = (Color.names[input.toLowerCase()] || input);\n            // Bitmasking as input[0] is not working for legacy IE.\n            if (input.charAt(0) === '#') {\n                const len = input.length, col = parseInt(input.substr(1), 16);\n                // Handle long-form, e.g. #AABBCC\n                if (len === 7) {\n                    rgba = [\n                        (col & 0xFF0000) >> 16,\n                        (col & 0xFF00) >> 8,\n                        (col & 0xFF),\n                        1\n                    ];\n                    // Handle short-form, e.g. #ABC\n                    // In short form, the value is assumed to be the same\n                    // for both nibbles for each component. e.g. #ABC = #AABBCC\n                }\n                else if (len === 4) {\n                    rgba = [\n                        (((col & 0xF00) >> 4) |\n                            (col & 0xF00) >> 8),\n                        (((col & 0xF0) >> 4) |\n                            (col & 0xF0)),\n                        ((col & 0xF) << 4) | (col & 0xF),\n                        1\n                    ];\n                }\n            }\n            // Otherwise, check regex parsers\n            if (!rgba) {\n                i = Color.parsers.length;\n                while (i-- && !rgba) {\n                    parser = Color.parsers[i];\n                    result = parser.regex.exec(input);\n                    if (result) {\n                        rgba = parser.parse(result);\n                    }\n                }\n            }\n        }\n        if (rgba) {\n            this.rgba = rgba;\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Return the color or gradient stops in the specified format\n     *\n     * @function Highcharts.Color#get\n     *\n     * @param {string} [format]\n     * Possible values are 'a', 'rgb', 'rgba' (default).\n     *\n     * @return {Highcharts.ColorType}\n     * This color as a string or gradient stops.\n     */\n    get(format) {\n        const input = this.input, rgba = this.rgba;\n        if (typeof input === 'object' &&\n            typeof this.stops !== 'undefined') {\n            const ret = merge(input);\n            ret.stops = [].slice.call(ret.stops);\n            this.stops.forEach((stop, i) => {\n                ret.stops[i] = [\n                    ret.stops[i][0],\n                    stop.get(format)\n                ];\n            });\n            return ret;\n        }\n        // It's NaN if gradient colors on a column chart\n        if (rgba && isNumber(rgba[0])) {\n            if (format === 'rgb' || (!format && rgba[3] === 1)) {\n                return 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n            }\n            if (format === 'a') {\n                return `${rgba[3]}`;\n            }\n            return 'rgba(' + rgba.join(',') + ')';\n        }\n        return input;\n    }\n    /**\n     * Brighten the color instance.\n     *\n     * @function Highcharts.Color#brighten\n     *\n     * @param {number} alpha\n     * The alpha value.\n     *\n     * @return {Highcharts.Color}\n     * This color with modifications.\n     */\n    brighten(alpha) {\n        const rgba = this.rgba;\n        if (this.stops) {\n            this.stops.forEach(function (stop) {\n                stop.brighten(alpha);\n            });\n        }\n        else if (isNumber(alpha) && alpha !== 0) {\n            for (let i = 0; i < 3; i++) {\n                rgba[i] += pInt(alpha * 255);\n                if (rgba[i] < 0) {\n                    rgba[i] = 0;\n                }\n                if (rgba[i] > 255) {\n                    rgba[i] = 255;\n                }\n            }\n        }\n        return this;\n    }\n    /**\n     * Set the color's opacity to a given alpha value.\n     *\n     * @function Highcharts.Color#setOpacity\n     *\n     * @param {number} alpha\n     *        Opacity between 0 and 1.\n     *\n     * @return {Highcharts.Color}\n     *         Color with modifications.\n     */\n    setOpacity(alpha) {\n        this.rgba[3] = alpha;\n        return this;\n    }\n    /**\n     * Return an intermediate color between two colors.\n     *\n     * @function Highcharts.Color#tweenTo\n     *\n     * @param {Highcharts.Color} to\n     * The color object to tween to.\n     *\n     * @param {number} pos\n     * The intermediate position, where 0 is the from color (current color\n     * item), and 1 is the `to` color.\n     *\n     * @return {Highcharts.ColorType}\n     * The intermediate color in rgba notation, or unsupported type.\n     */\n    tweenTo(to, pos) {\n        const fromRgba = this.rgba, toRgba = to.rgba;\n        // Unsupported color, return to-color (#3920, #7034)\n        if (!isNumber(fromRgba[0]) || !isNumber(toRgba[0])) {\n            return to.input || 'none';\n        }\n        // Check for has alpha, because rgba colors perform worse due to\n        // lack of support in WebKit.\n        const hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1);\n        return (hasAlpha ? 'rgba(' : 'rgb(') +\n            Math.round(toRgba[0] + (fromRgba[0] - toRgba[0]) * (1 - pos)) +\n            ',' +\n            Math.round(toRgba[1] + (fromRgba[1] - toRgba[1]) * (1 - pos)) +\n            ',' +\n            Math.round(toRgba[2] + (fromRgba[2] - toRgba[2]) * (1 - pos)) +\n            (hasAlpha ?\n                (',' +\n                    (toRgba[3] + (fromRgba[3] - toRgba[3]) * (1 - pos))) :\n                '') +\n            ')';\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\n/**\n * Collection of named colors. Can be extended from the outside by adding\n * colors to Highcharts.Color.names.\n * @private\n */\nColor.names = {\n    white: '#ffffff',\n    black: '#000000'\n};\n/**\n * Collection of parsers. This can be extended from the outside by pushing\n * parsers to `Color.parsers`.\n * @private\n */\nColor.parsers = [{\n        // RGBA color\n        // eslint-disable-next-line max-len\n        regex: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)/,\n        parse: function (result) {\n            return [\n                pInt(result[1]),\n                pInt(result[2]),\n                pInt(result[3]),\n                parseFloat(result[4], 10)\n            ];\n        }\n    }, {\n        // RGB color\n        regex: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)/,\n        parse: function (result) {\n            return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n        }\n    }];\n// Must be last static member for init cycle\nColor.None = new Color('');\n/* *\n *\n *  Default Export\n *\n * */\nexport default Color;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * A valid color to be parsed and handled by Highcharts. Highcharts internally\n * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n * browsers and displayed correctly, but Highcharts is not able to process them\n * and apply concepts like opacity and brightening.\n *\n * @typedef {string} Highcharts.ColorString\n */\n/**\n * A valid color type than can be parsed and handled by Highcharts. It can be a\n * color string, a gradient object, or a pattern object.\n *\n * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType\n */\n/**\n * Gradient options instead of a solid color.\n *\n * @example\n * // Linear gradient used as a color option\n * color: {\n *     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n *     stops: [\n *         [0, '#003399'], // start\n *         [0.5, '#ffffff'], // middle\n *         [1, '#3366AA'] // end\n *     ]\n * }\n *\n * @interface Highcharts.GradientColorObject\n */ /**\n* Holds an object that defines the start position and the end position relative\n* to the shape.\n* @name Highcharts.GradientColorObject#linearGradient\n* @type {Highcharts.LinearGradientColorObject|undefined}\n*/ /**\n* Holds an object that defines the center position and the radius.\n* @name Highcharts.GradientColorObject#radialGradient\n* @type {Highcharts.RadialGradientColorObject|undefined}\n*/ /**\n* The first item in each tuple is the position in the gradient, where 0 is the\n* start of the gradient and 1 is the end of the gradient. Multiple stops can be\n* applied. The second item is the color for each stop. This color can also be\n* given in the rgba format.\n* @name Highcharts.GradientColorObject#stops\n* @type {Array<Highcharts.GradientColorStopObject>}\n*/\n/**\n * Color stop tuple.\n *\n * @see Highcharts.GradientColorObject\n *\n * @interface Highcharts.GradientColorStopObject\n */ /**\n* @name Highcharts.GradientColorStopObject#0\n* @type {number}\n*/ /**\n* @name Highcharts.GradientColorStopObject#1\n* @type {Highcharts.ColorString}\n*/ /**\n* @name Highcharts.GradientColorStopObject#color\n* @type {Highcharts.Color|undefined}\n*/\n/**\n * Defines the start position and the end position for a gradient relative\n * to the shape. Start position (x1, y1) and end position (x2, y2) are relative\n * to the shape, where 0 means top/left and 1 is bottom/right.\n *\n * @interface Highcharts.LinearGradientColorObject\n */ /**\n* Start horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x1\n* @type {number}\n*/ /**\n* End horizontal position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#x2\n* @type {number}\n*/ /**\n* Start vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y1\n* @type {number}\n*/ /**\n* End vertical position of the gradient. Float ranges 0-1.\n* @name Highcharts.LinearGradientColorObject#y2\n* @type {number}\n*/\n/**\n * Defines the center position and the radius for a gradient.\n *\n * @interface Highcharts.RadialGradientColorObject\n */ /**\n* Center horizontal position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cx\n* @type {number}\n*/ /**\n* Center vertical position relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#cy\n* @type {number}\n*/ /**\n* Radius relative to the shape. Float ranges 0-1.\n* @name Highcharts.RadialGradientColorObject#r\n* @type {number}\n*/\n/**\n * Creates a color instance out of a color string.\n *\n * @function Highcharts.color\n *\n * @param {Highcharts.ColorType} input\n *        The input color in either rgba or hex format\n *\n * @return {Highcharts.Color}\n *         Color instance\n */\n(''); // Detach doclets above\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ChartDefaults from './Chart/ChartDefaults.js';\nimport H from './Globals.js';\nconst { isTouchDevice } = H;\nimport Palettes from './Color/Palettes.js';\nimport Time from './Time.js';\nimport U from './Utilities.js';\nconst { fireEvent, merge } = U;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Global default settings.\n *\n * @name Highcharts.defaultOptions\n * @type {Highcharts.Options}\n */ /**\n* @optionparent\n* @private\n*/\nconst defaultOptions = {\n    /**\n     * An array containing the default colors for the chart's series. When\n     * all colors are used, new colors are pulled from the start again.\n     *\n     * Default colors can also be set on a series or series.type basis,\n     * see [column.colors](#plotOptions.column.colors),\n     * [pie.colors](#plotOptions.pie.colors).\n     *\n     * In styled mode, the colors option doesn't exist. Instead, colors\n     * are defined in CSS and applied either through series or point class\n     * names, or through the [chart.colorCount](#chart.colorCount) option.\n     *\n     * @sample {highcharts} highcharts/chart/colors/\n     *         Assign a global color theme\n     * @sample highcharts/members/theme-v10/\n     *         Latest release styled like version 10\n     *\n     * @type    {Array<(Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject)>}\n     * @default [\n     *     \"#2caffe\",\n     *     \"#544fc5\",\n     *     \"#00e272\",\n     *     \"#fe6a35\",\n     *     \"#6b8abc\",\n     *     \"#d568fb\",\n     *     \"#2ee0ca\",\n     *     \"#fa4b42\",\n     *     \"#feb56a\",\n     *     \"#91e8e1\"\n     * ]\n     */\n    colors: Palettes.colors,\n    /**\n     * Styled mode only. Configuration object for adding SVG definitions for\n     * reusable elements. See [gradients, shadows and\n     * patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns)\n     * for more information and code examples.\n     *\n     * @type      {*}\n     * @since     5.0.0\n     * @apioption defs\n     */\n    /**\n     * @ignore-option\n     */\n    symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n    /**\n     * The language object is global and it can't be set on each chart\n     * initialization. Instead, use `Highcharts.setOptions` to set it before any\n     * chart is initialized.\n     *\n     * ```js\n     * Highcharts.setOptions({\n     *     lang: {\n     *         months: [\n     *             'Janvier', 'Février', 'Mars', 'Avril',\n     *             'Mai', 'Juin', 'Juillet', 'Août',\n     *             'Septembre', 'Octobre', 'Novembre', 'Décembre'\n     *         ],\n     *         weekdays: [\n     *             'Dimanche', 'Lundi', 'Mardi', 'Mercredi',\n     *             'Jeudi', 'Vendredi', 'Samedi'\n     *         ]\n     *     }\n     * });\n     * ```\n     */\n    lang: {\n        /**\n         * The loading text that appears when the chart is set into the loading\n         * state following a call to `chart.showLoading`.\n         */\n        loading: 'Loading...',\n        /**\n         * An array containing the months names. Corresponds to the `%B` format\n         * in `Highcharts.dateFormat()`.\n         *\n         * @type    {Array<string>}\n         * @default [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n         *          \"July\", \"August\", \"September\", \"October\", \"November\",\n         *          \"December\"]\n         */\n        months: [\n            'January', 'February', 'March', 'April', 'May', 'June', 'July',\n            'August', 'September', 'October', 'November', 'December'\n        ],\n        /**\n         * An array containing the months names in abbreviated form. Corresponds\n         * to the `%b` format in `Highcharts.dateFormat()`.\n         *\n         * @type    {Array<string>}\n         * @default [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n         *          \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n         */\n        shortMonths: [\n            'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n            'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n        ],\n        /**\n         * An array containing the weekday names.\n         *\n         * @type    {Array<string>}\n         * @default [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\",\n         *          \"Friday\", \"Saturday\"]\n         */\n        weekdays: [\n            'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n            'Thursday', 'Friday', 'Saturday'\n        ],\n        /**\n         * Short week days, starting Sunday. If not specified, Highcharts uses\n         * the first three letters of the `lang.weekdays` option.\n         *\n         * @sample highcharts/lang/shortweekdays/\n         *         Finnish two-letter abbreviations\n         *\n         * @type      {Array<string>}\n         * @since     4.2.4\n         * @apioption lang.shortWeekdays\n         */\n        /**\n         * What to show in a date field for invalid dates. Defaults to an empty\n         * string.\n         *\n         * @type      {string}\n         * @since     4.1.8\n         * @product   highcharts highstock\n         * @apioption lang.invalidDate\n         */\n        /**\n         * The title appearing on hovering the zoom in button. The text itself\n         * defaults to \"+\" and can be changed in the button options.\n         *\n         * @type      {string}\n         * @default   Zoom in\n         * @product   highmaps\n         * @apioption lang.zoomIn\n         */\n        /**\n         * The title appearing on hovering the zoom out button. The text itself\n         * defaults to \"-\" and can be changed in the button options.\n         *\n         * @type      {string}\n         * @default   Zoom out\n         * @product   highmaps\n         * @apioption lang.zoomOut\n         */\n        /**\n         * The default decimal point used in the `Highcharts.numberFormat`\n         * method unless otherwise specified in the function arguments.\n         *\n         * @since 1.2.2\n         */\n        decimalPoint: '.',\n        /**\n         * [Metric prefixes](https://en.wikipedia.org/wiki/Metric_prefix) used\n         * to shorten high numbers in axis labels. Replacing any of the\n         * positions with `null` causes the full number to be written. Setting\n         * `numericSymbols` to `undefined` disables shortening altogether.\n         *\n         * @sample {highcharts} highcharts/lang/numericsymbols/\n         *         Replacing the symbols with text\n         * @sample {highstock} highcharts/lang/numericsymbols/\n         *         Replacing the symbols with text\n         *\n         * @type    {Array<string>}\n         * @default [\"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n         * @since   2.3.0\n         */\n        numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\n        /**\n         * The magnitude of [numericSymbols](#lang.numericSymbol) replacements.\n         * Use 10000 for Japanese, Korean and various Chinese locales, which\n         * use symbols for 10^4, 10^8 and 10^12.\n         *\n         * @sample highcharts/lang/numericsymbolmagnitude/\n         *         10000 magnitude for Japanese\n         *\n         * @type      {number}\n         * @default   1000\n         * @since     5.0.3\n         * @apioption lang.numericSymbolMagnitude\n         */\n        /**\n         * The text for the label appearing when a chart is zoomed.\n         *\n         * @since 1.2.4\n         */\n        resetZoom: 'Reset zoom',\n        /**\n         * The tooltip title for the label appearing when a chart is zoomed.\n         *\n         * @since 1.2.4\n         */\n        resetZoomTitle: 'Reset zoom level 1:1',\n        /**\n         * The default thousands separator used in the `Highcharts.numberFormat`\n         * method unless otherwise specified in the function arguments. Defaults\n         * to a single space character, which is recommended in\n         * [ISO 31-0](https://en.wikipedia.org/wiki/ISO_31-0#Numbers) and works\n         * across Anglo-American and continental European languages.\n         *\n         * @default \\u0020\n         * @since   1.2.2\n         */\n        thousandsSep: ' '\n    },\n    /**\n     * Global options that don't apply to each chart. These options, like\n     * the `lang` options, must be set using the `Highcharts.setOptions`\n     * method.\n     *\n     * ```js\n     * Highcharts.setOptions({\n     *     global: {\n     *         buttonTheme: {\n     *             fill: '#d0d0d0'\n     *         }\n     *     }\n     * });\n     * ```\n     */\n    global: {\n        /**\n         * _Canvg rendering for Android 2.x is removed as of Highcharts 5.0\\.\n         * Use the [libURL](#exporting.libURL) option to configure exporting._\n         *\n         * The URL to the additional file to lazy load for Android 2.x devices.\n         * These devices don't support SVG, so we download a helper file that\n         * contains [canvg](https://github.com/canvg/canvg), its dependency\n         * rbcolor, and our own CanVG Renderer class. To avoid hotlinking to\n         * our site, you can install canvas-tools.js on your own server and\n         * change this option accordingly.\n         *\n         * @deprecated\n         *\n         * @type      {string}\n         * @default   https://code.highcharts.com/{version}/modules/canvas-tools.js\n         * @product   highcharts highmaps\n         * @apioption global.canvasToolsURL\n         */\n        /**\n         * This option is deprecated since v6.0.5. Instead, use\n         * [time.useUTC](#time.useUTC) that supports individual time settings\n         * per chart.\n         *\n         * @deprecated\n         *\n         * @type      {boolean}\n         * @apioption global.useUTC\n         */\n        /**\n         * This option is deprecated since v6.0.5. Instead, use\n         * [time.Date](#time.Date) that supports individual time settings\n         * per chart.\n         *\n         * @deprecated\n         *\n         * @type      {Function}\n         * @product   highcharts highstock\n         * @apioption global.Date\n         */\n        /**\n         * This option is deprecated since v6.0.5. Instead, use\n         * [time.getTimezoneOffset](#time.getTimezoneOffset) that supports\n         * individual time settings per chart.\n         *\n         * @deprecated\n         *\n         * @type      {Function}\n         * @product   highcharts highstock\n         * @apioption global.getTimezoneOffset\n         */\n        /**\n         * This option is deprecated since v6.0.5. Instead, use\n         * [time.timezone](#time.timezone) that supports individual time\n         * settings per chart.\n         *\n         * @deprecated\n         *\n         * @type      {string}\n         * @product   highcharts highstock\n         * @apioption global.timezone\n         */\n        /**\n         * This option is deprecated since v6.0.5. Instead, use\n         * [time.timezoneOffset](#time.timezoneOffset) that supports individual\n         * time settings per chart.\n         *\n         * @deprecated\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption global.timezoneOffset\n         */\n        /**\n         * General theme for buttons. This applies to the zoom button, exporting\n         * context menu, map navigation, range selector buttons and custom\n         * buttons generated using the `SVGRenderer.button` function. However,\n         * each of these may be overridden with more specific options.\n         *\n         * @sample highcharts/global/buttontheme\n         *         General button theme\n         * @since 11.4.2\n         */\n        buttonTheme: {\n            /**\n             * The fill color for buttons\n             */\n            fill: \"#f7f7f7\" /* Palette.neutralColor3 */,\n            /**\n             * The padding of buttons\n             */\n            padding: 8,\n            /**\n             * The border radius for buttons\n             */\n            r: 2,\n            /**\n             * The stroke color for buttons\n             */\n            stroke: \"#cccccc\" /* Palette.neutralColor20 */,\n            /**\n             * The stroke width for buttons\n             */\n            'stroke-width': 1,\n            /**\n             * CSS styling for the buttons' text\n             */\n            style: {\n                color: \"#333333\" /* Palette.neutralColor80 */,\n                cursor: 'pointer',\n                fontSize: '0.8em',\n                fontWeight: 'normal'\n            },\n            /**\n             * State overrides for the buttons\n             */\n            states: {\n                /**\n                 * Hover state overrides for the buttons are applied in addition\n                 * to the normal state options\n                 */\n                hover: {\n                    fill: \"#e6e6e6\" /* Palette.neutralColor10 */\n                },\n                /**\n                 * Select state overrides for the buttons are applied in\n                 * addition to the normal state options\n                 */\n                select: {\n                    fill: \"#e6e9ff\" /* Palette.highlightColor10 */,\n                    style: {\n                        color: \"#000000\" /* Palette.neutralColor100 */,\n                        fontWeight: 'bold'\n                    }\n                },\n                /**\n                 * Disabled state overrides for the buttons are applied in\n                 * addition to the normal state options\n                 */\n                disabled: {\n                    /**\n                     * Disabled state CSS style overrides for the buttons' text\n                     */\n                    style: {\n                        color: \"#cccccc\" /* Palette.neutralColor20 */\n                    }\n                }\n            }\n        }\n    },\n    /**\n     * Time options that can apply globally or to individual charts. These\n     * settings affect how `datetime` axes are laid out, how tooltips are\n     * formatted, how series\n     * [pointIntervalUnit](#plotOptions.series.pointIntervalUnit) works and how\n     * the Highcharts Stock range selector handles time.\n     *\n     * The common use case is that all charts in the same Highcharts object\n     * share the same time settings, in which case the global settings are set\n     * using `setOptions`.\n     *\n     * ```js\n     * // Apply time settings globally\n     * Highcharts.setOptions({\n     *     time: {\n     *         timezone: 'Europe/London'\n     *     }\n     * });\n     * // Apply time settings by instance\n     * let chart = Highcharts.chart('container', {\n     *     time: {\n     *         timezone: 'America/New_York'\n     *     },\n     *     series: [{\n     *         data: [1, 4, 3, 5]\n     *     }]\n     * });\n     *\n     * // Use the Time object\n     * console.log(\n     *        'Current time in New York',\n     *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n     * );\n     * ```\n     *\n     * Since v6.0.5, the time options were moved from the `global` object to the\n     * `time` object, and time options can be set on each individual chart.\n     *\n     * @sample {highcharts|highstock}\n     *         highcharts/time/timezone/\n     *         Set the timezone globally\n     * @sample {highcharts}\n     *         highcharts/time/individual/\n     *         Set the timezone per chart instance\n     * @sample {highstock}\n     *         stock/time/individual/\n     *         Set the timezone per chart instance\n     *\n     * @since     6.0.5\n     * @optionparent time\n     */\n    time: {\n        /**\n         * A custom `Date` class for advanced date handling. For example,\n         * [JDate](https://github.com/tahajahangir/jdate) can be hooked in to\n         * handle Jalali dates.\n         *\n         * @type      {*}\n         * @since     4.0.4\n         * @product   highcharts highstock gantt\n         */\n        Date: void 0,\n        /**\n         * A callback to return the time zone offset for a given datetime. It\n         * takes the timestamp in terms of milliseconds since January 1 1970,\n         * and returns the timezone offset in minutes. This provides a hook\n         * for drawing time based charts in specific time zones using their\n         * local DST crossover dates, with the help of external libraries.\n         *\n         * This option is deprecated as of v11.4.1 and will be removed in a\n         * future release. Use the [time.timezone](#time.timezone) option\n         * instead.\n         *\n         * @sample {highcharts|highstock} highcharts/time/gettimezoneoffset/\n         *         Use moment.js to draw Oslo time regardless of browser locale\n         *\n         * @type      {Highcharts.TimezoneOffsetCallbackFunction}\n         * @since     4.1.0\n         * @deprecated 11.4.2\n         * @product   highcharts highstock gantt\n         */\n        getTimezoneOffset: void 0,\n        /**\n         * A named time zone. Supported time zone names rely on the browser\n         * implementations, as described in the [mdn\n         * docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#timezone).\n         * If the given time zone is not recognized by the browser, Highcharts\n         * provides a warning and falls back to returning a 0 offset,\n         * corresponding to the UTC time zone.\n         *\n         * Until v11.2.0, this option depended on moment.js.\n         *\n         * @sample {highcharts|highstock} highcharts/time/timezone/ Europe/Oslo\n         *\n         * @type      {string}\n         * @since     5.0.7\n         * @product   highcharts highstock gantt\n         */\n        timezone: void 0,\n        /**\n         * The timezone offset in minutes. Positive values are west, negative\n         * values are east of UTC, as in the ECMAScript\n         * [getTimezoneOffset](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)\n         * method. Use this to display UTC based data in a predefined time zone.\n         *\n         * This option is deprecated as of v11.4.1 and will be removed in a\n         * future release. Use the [time.timezone](#time.timezone) option\n         * instead.\n         *\n         * @see [time.getTimezoneOffset](#time.getTimezoneOffset)\n         *\n         * @sample {highcharts|highstock} highcharts/time/timezoneoffset/\n         *         Timezone offset\n         *\n         * @since     3.0.8\n         * @deprecated 11.4.2\n         * @product   highcharts highstock gantt\n         */\n        timezoneOffset: 0,\n        /**\n         * Whether to use UTC time for axis scaling, tickmark placement and\n         * time display in `Highcharts.dateFormat`. Advantages of using UTC\n         * is that the time displays equally regardless of the user agent's\n         * time zone settings. Local time can be used when the data is loaded\n         * in real time or when correct Daylight Saving Time transitions are\n         * required.\n         *\n         * @sample {highcharts} highcharts/time/useutc-true/\n         *         True by default\n         * @sample {highcharts} highcharts/time/useutc-false/\n         *         False\n         */\n        useUTC: true\n    },\n    chart: ChartDefaults,\n    /**\n     * The chart's main title.\n     *\n     * @sample {highmaps} maps/title/title/\n     *         Title options demonstrated\n     */\n    title: {\n        /**\n         * When the title is floating, the plot area will not move to make space\n         * for it.\n         *\n         * @sample {highcharts} highcharts/chart/zoomtype-none/\n         *         False by default\n         * @sample {highcharts} highcharts/title/floating/\n         *         True - title on top of the plot area\n         * @sample {highstock} stock/chart/title-floating/\n         *         True - title on top of the plot area\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.1\n         * @apioption title.floating\n         */\n        /**\n         * Whether to\n         * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the text.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption title.useHTML\n         */\n        /**\n         * The vertical alignment of the title. Can be one of `\"top\"`,\n         * `\"middle\"` and `\"bottom\"`. When a value is given, the title behaves\n         * as if [floating](#title.floating) were `true`.\n         *\n         * @sample {highcharts} highcharts/title/verticalalign/\n         *         Chart title in bottom right corner\n         * @sample {highstock} stock/chart/title-verticalalign/\n         *         Chart title in bottom right corner\n         *\n         * @type      {Highcharts.VerticalAlignValue}\n         * @since     2.1\n         * @apioption title.verticalAlign\n         */\n        /**\n         * The x position of the title relative to the alignment within\n         * `chart.spacingLeft` and `chart.spacingRight`.\n         *\n         * @sample {highcharts} highcharts/title/align/\n         *         Aligned to the plot area (x = 70px = margin left - spacing\n         *         left)\n         * @sample {highstock} stock/chart/title-align/\n         *         Aligned to the plot area (x = 50px = margin left - spacing\n         *         left)\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.0\n         * @apioption title.x\n         */\n        /**\n         * The y position of the title relative to the alignment within\n         * [chart.spacingTop](#chart.spacingTop) and [chart.spacingBottom](\n         * #chart.spacingBottom). By default it depends on the font size.\n         *\n         * @sample {highcharts} highcharts/title/y/\n         *         Title inside the plot area\n         * @sample {highstock} stock/chart/title-verticalalign/\n         *         Chart title in bottom right corner\n         *\n         * @type      {number}\n         * @since     2.0\n         * @apioption title.y\n         */\n        /**\n         * CSS styles for the title. Use this for font styling, but use `align`,\n         * `x` and `y` for text alignment.\n         *\n         * In styled mode, the title style is given in the `.highcharts-title`\n         * class.\n         *\n         * @sample {highcharts} highcharts/title/style/\n         *         Custom color and weight\n         * @sample {highstock} stock/chart/title-style/\n         *         Custom color and weight\n         * @sample highcharts/css/titles/\n         *         Styled mode\n         *\n         * @type      {Highcharts.CSSObject}\n         * @default   {highcharts|highmaps} { \"color\": \"#333333\", \"fontSize\": \"18px\" }\n         * @default   {highstock} { \"color\": \"#333333\", \"fontSize\": \"16px\" }\n         */\n        style: {\n            color: \"#333333\" /* Palette.neutralColor80 */,\n            fontWeight: 'bold'\n        },\n        /**\n         * The title of the chart. To disable the title, set the `text` to\n         * `undefined`.\n         *\n         * @sample {highcharts} highcharts/title/text/\n         *         Custom title\n         * @sample {highstock} stock/chart/title-text/\n         *         Custom title\n         *\n         * @default {highcharts|highmaps} Chart title\n         * @default {highstock} undefined\n         */\n        text: 'Chart title',\n        /**\n         * The horizontal alignment of the title. Can be one of \"left\", \"center\"\n         * and \"right\".\n         *\n         * @sample {highcharts} highcharts/title/align/\n         *         Aligned to the plot area (x = 70px = margin left - spacing\n         *         left)\n         * @sample {highstock} stock/chart/title-align/\n         *         Aligned to the plot area (x = 50px = margin left - spacing\n         *         left)\n         *\n         * @type  {Highcharts.AlignValue}\n         * @since 2.0\n         */\n        align: 'center',\n        /**\n         * The margin between the title and the plot area, or if a subtitle\n         * is present, the margin between the subtitle and the plot area.\n         *\n         * @sample {highcharts} highcharts/title/margin-50/\n         *         A chart title margin of 50\n         * @sample {highcharts} highcharts/title/margin-subtitle/\n         *         The same margin applied with a subtitle\n         * @sample {highstock} stock/chart/title-margin/\n         *         A chart title margin of 50\n         *\n         * @since 2.1\n         */\n        margin: 15,\n        /**\n         * Adjustment made to the title width, normally to reserve space for\n         * the exporting burger menu.\n         *\n         * @sample highcharts/title/widthadjust/\n         *         Wider menu, greater padding\n         *\n         * @since 4.2.5\n         */\n        widthAdjust: -44\n    },\n    /**\n     * The chart's subtitle. This can be used both to display a subtitle below\n     * the main title, and to display random text anywhere in the chart. The\n     * subtitle can be updated after chart initialization through the\n     * `Chart.setTitle` method.\n     *\n     * @sample {highmaps} maps/title/subtitle/\n     *         Subtitle options demonstrated\n     */\n    subtitle: {\n        /**\n         * When the subtitle is floating, the plot area will not move to make\n         * space for it.\n         *\n         * @sample {highcharts} highcharts/subtitle/floating/\n         *         Floating title and subtitle\n         * @sample {highstock} stock/chart/subtitle-footnote\n         *         Footnote floating at bottom right of plot area\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.1\n         * @apioption subtitle.floating\n         */\n        /**\n         * CSS styles for the title.\n         *\n         * In styled mode, the subtitle style is given in the\n         * `.highcharts-subtitle` class.\n         *\n         * @sample {highcharts} highcharts/subtitle/style/\n         *         Custom color and weight\n         * @sample {highcharts} highcharts/css/titles/\n         *         Styled mode\n         * @sample {highstock} stock/chart/subtitle-style\n         *         Custom color and weight\n         * @sample {highstock} highcharts/css/titles/\n         *         Styled mode\n         * @sample {highmaps} highcharts/css/titles/\n         *         Styled mode\n         *\n         * @type      {Highcharts.CSSObject}\n         * @default   {\"color\": \"#666666\"}\n         * @apioption subtitle.style\n         */\n        /**\n         * Whether to\n         * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the text.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption subtitle.useHTML\n         */\n        /**\n         * The vertical alignment of the title. Can be one of `\"top\"`,\n         * `\"middle\"` and `\"bottom\"`. When middle, the subtitle behaves as\n         * floating.\n         *\n         * @sample {highcharts} highcharts/subtitle/verticalalign/\n         *         Footnote at the bottom right of plot area\n         * @sample {highstock} stock/chart/subtitle-footnote\n         *         Footnote at the bottom right of plot area\n         *\n         * @type      {Highcharts.VerticalAlignValue}\n         * @since     2.1\n         * @apioption subtitle.verticalAlign\n         */\n        /**\n         * The x position of the subtitle relative to the alignment within\n         * `chart.spacingLeft` and `chart.spacingRight`.\n         *\n         * @sample {highcharts} highcharts/subtitle/align/\n         *         Footnote at right of plot area\n         * @sample {highstock} stock/chart/subtitle-footnote\n         *         Footnote at the bottom right of plot area\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.0\n         * @apioption subtitle.x\n         */\n        /**\n         * The y position of the subtitle relative to the alignment within\n         * `chart.spacingTop` and `chart.spacingBottom`. By default the subtitle\n         * is laid out below the title unless the title is floating.\n         *\n         * @sample {highcharts} highcharts/subtitle/verticalalign/\n         *         Footnote at the bottom right of plot area\n         * @sample {highstock} stock/chart/subtitle-footnote\n         *         Footnote at the bottom right of plot area\n         *\n         * @type      {number}\n         * @since     2.0\n         * @apioption subtitle.y\n         */\n        /**\n         * CSS styles for the title.\n         *\n         * In styled mode, the subtitle style is given in the\n         * `.highcharts-subtitle` class.\n         *\n         * @sample {highcharts} highcharts/subtitle/style/\n         *         Custom color and weight\n         * @sample {highcharts} highcharts/css/titles/\n         *         Styled mode\n         * @sample {highstock} stock/chart/subtitle-style\n         *         Custom color and weight\n         * @sample {highstock} highcharts/css/titles/\n         *         Styled mode\n         * @sample {highmaps} highcharts/css/titles/\n         *         Styled mode\n         *\n         * @type      {Highcharts.CSSObject}\n         * @default   {\"color\": \"#666666\"}\n         */\n        style: {\n            color: \"#666666\" /* Palette.neutralColor60 */,\n            fontSize: '0.8em'\n        },\n        /**\n         * The subtitle of the chart.\n         *\n         * @sample {highcharts|highstock} highcharts/subtitle/text/\n         *         Custom subtitle\n         * @sample {highcharts|highstock} highcharts/subtitle/text-formatted/\n         *         Formatted and linked text.\n         */\n        text: '',\n        /**\n         * The horizontal alignment of the subtitle. Can be one of \"left\",\n         *  \"center\" and \"right\".\n         *\n         * @sample {highcharts} highcharts/subtitle/align/\n         *         Footnote at right of plot area\n         * @sample {highstock} stock/chart/subtitle-footnote\n         *         Footnote at bottom right of plot area\n         *\n         * @type  {Highcharts.AlignValue}\n         * @since 2.0\n         */\n        align: 'center',\n        /**\n         * Adjustment made to the subtitle width, normally to reserve space\n         * for the exporting burger menu.\n         *\n         * @see [title.widthAdjust](#title.widthAdjust)\n         *\n         * @sample highcharts/title/widthadjust/\n         *         Wider menu, greater padding\n         *\n         * @since 4.2.5\n         */\n        widthAdjust: -44\n    },\n    /**\n     * The chart's caption, which will render below the chart and will be part\n     * of exported charts. The caption can be updated after chart initialization\n     * through the `Chart.update` or `Chart.caption.update` methods.\n     *\n     * @sample highcharts/caption/text/\n     *         A chart with a caption\n     * @since  7.2.0\n     */\n    caption: {\n        /**\n         * When the caption is floating, the plot area will not move to make\n         * space for it.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption caption.floating\n         */\n        /**\n         * The margin between the caption and the plot area.\n         */\n        margin: 15,\n        /**\n         * Whether to\n         * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the text.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption caption.useHTML\n         */\n        /**\n         * The x position of the caption relative to the alignment within\n         * `chart.spacingLeft` and `chart.spacingRight`.\n         *\n         * @type      {number}\n         * @default   0\n         * @apioption caption.x\n         */\n        /**\n         * The y position of the caption relative to the alignment within\n         * `chart.spacingTop` and `chart.spacingBottom`.\n         *\n         * @type      {number}\n         * @apioption caption.y\n         */\n        /**\n         * CSS styles for the caption.\n         *\n         * In styled mode, the caption style is given in the\n         * `.highcharts-caption` class.\n         *\n         * @sample {highcharts} highcharts/css/titles/\n         *         Styled mode\n         *\n         * @type      {Highcharts.CSSObject}\n         * @default   {\"color\": \"#666666\"}\n         */\n        style: {\n            color: \"#666666\" /* Palette.neutralColor60 */,\n            fontSize: '0.8em'\n        },\n        /**\n         * The caption text of the chart.\n         *\n         * @sample {highcharts} highcharts/caption/text/\n         *         Custom caption\n         */\n        text: '',\n        /**\n         * The horizontal alignment of the caption. Can be one of \"left\",\n         *  \"center\" and \"right\".\n         *\n         * @type  {Highcharts.AlignValue}\n         */\n        align: 'left',\n        /**\n         * The vertical alignment of the caption. Can be one of `\"top\"`,\n         * `\"middle\"` and `\"bottom\"`. When middle, the caption behaves as\n         * floating.\n         *\n         * @type      {Highcharts.VerticalAlignValue}\n         */\n        verticalAlign: 'bottom'\n    },\n    /**\n     * The plotOptions is a wrapper object for config objects for each series\n     * type. The config objects for each series can also be overridden for\n     * each series item as given in the series array.\n     *\n     * Configuration options for the series are given in three levels. Options\n     * for all series in a chart are given in the [plotOptions.series](\n     * #plotOptions.series) object. Then options for all series of a specific\n     * type are given in the plotOptions of that type, for example\n     * `plotOptions.line`. Next, options for one single series are given in\n     * [the series array](#series).\n     */\n    plotOptions: {},\n    /**\n     * The legend is a box containing a symbol and name for each series\n     * item or point item in the chart. Each series (or points in case\n     * of pie charts) is represented by a symbol and its name in the legend.\n     *\n     * It is possible to override the symbol creator function and create\n     * [custom legend symbols](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/studies/legend-custom-symbol/).\n     *\n     * @productdesc {highmaps}\n     * A Highmaps legend by default contains one legend item per series, but if\n     * a `colorAxis` is defined, the axis will be displayed in the legend.\n     * Either as a gradient, or as multiple legend items for `dataClasses`.\n     */\n    legend: {\n        /**\n         * The background color of the legend.\n         *\n         * @see In styled mode, the legend background fill can be applied with\n         *      the `.highcharts-legend-box` class.\n         *\n         * @sample {highcharts} highcharts/legend/backgroundcolor/\n         *         Yellowish background\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/border-background/\n         *         Border and background options\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @apioption legend.backgroundColor\n         */\n        /**\n         * The width of the drawn border around the legend.\n         *\n         * @see In styled mode, the legend border stroke width can be applied\n         *      with the `.highcharts-legend-box` class.\n         *\n         * @sample {highcharts} highcharts/legend/borderwidth/\n         *         2px border width\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/border-background/\n         *         Border and background options\n         *\n         * @type      {number}\n         * @default   0\n         * @apioption legend.borderWidth\n         */\n        /**\n         * Enable or disable the legend. There is also a series-specific option,\n         * [showInLegend](#plotOptions.series.showInLegend), that can hide the\n         * series from the legend. In some series types this is `false` by\n         * default, so it must set to `true` in order to show the legend for the\n         * series.\n         *\n         * @sample {highcharts} highcharts/legend/enabled-false/ Legend disabled\n         * @sample {highstock} stock/legend/align/ Various legend options\n         * @sample {highmaps} maps/legend/enabled-false/ Legend disabled\n         *\n         * @default {highstock} false\n         * @default {highmaps} true\n         * @default {gantt} false\n         */\n        enabled: true,\n        /**\n         * The horizontal alignment of the legend box within the chart area.\n         * Valid values are `left`, `center` and `right`.\n         *\n         * In the case that the legend is aligned in a corner position, the\n         * `layout` option will determine whether to place it above/below\n         * or on the side of the plot area.\n         *\n         * @sample {highcharts} highcharts/legend/align/\n         *         Legend at the right of the chart\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/alignment/\n         *         Legend alignment\n         *\n         * @type  {Highcharts.AlignValue}\n         * @since 2.0\n         */\n        align: 'center',\n        /**\n         * If the [layout](legend.layout) is `horizontal` and the legend items\n         * span over two lines or more, whether to align the items into vertical\n         * columns. Setting this to `false` makes room for more items, but will\n         * look more messy.\n         *\n         * @since 6.1.0\n         */\n        alignColumns: true,\n        /**\n         * A CSS class name to apply to the legend group.\n         */\n        className: 'highcharts-no-tooltip',\n        /**\n         * General event handlers for the legend. These event hooks can\n         * also be attached to the legend at run time using the\n         * `Highcharts.addEvent` function.\n         *\n         * @declare Highcharts.LegendEventsOptionsObject\n         *\n         * @private\n         */\n        events: {},\n        /**\n         * Fires when the legend item belonging to the series is clicked. One\n         * parameter, `event`, is passed to the function. The default action\n         * is to toggle the visibility of the series, point or data class. This\n         * can be prevented by returning `false` or calling\n         * `event.preventDefault()`.\n         *\n         * @sample {highcharts} highcharts/legend/itemclick/\n         *         Confirm hiding and showing\n         * @sample {highcharts} highcharts/legend/pie-legend-itemclick/\n         *         Confirm toggle visibility of pie slices\n         *\n         * @type      {Highcharts.LegendItemClickCallbackFunction}\n         * @context   Highcharts.Legend\n         * @apioption legend.events.itemClick\n         */\n        /**\n         * When the legend is floating, the plot area ignores it and is allowed\n         * to be placed below it.\n         *\n         * @sample {highcharts} highcharts/legend/floating-false/\n         *         False by default\n         * @sample {highcharts} highcharts/legend/floating-true/\n         *         True\n         * @sample {highmaps} maps/legend/alignment/\n         *         Floating legend\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.1\n         * @apioption legend.floating\n         */\n        /**\n         * The layout of the legend items. Can be one of `horizontal` or\n         * `vertical` or `proximate`. When `proximate`, the legend items will be\n         * placed as close as possible to the graphs they're representing,\n         * except in inverted charts or when the legend position doesn't allow\n         * it.\n         *\n         * @sample {highcharts} highcharts/legend/layout-horizontal/\n         *         Horizontal by default\n         * @sample {highcharts} highcharts/legend/layout-vertical/\n         *         Vertical\n         * @sample highcharts/legend/layout-proximate\n         *         Labels proximate to the data\n         * @sample {highstock} stock/legend/layout-horizontal/\n         *         Horizontal by default\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         Vertical with data classes\n         * @sample {highmaps} maps/legend/layout-vertical/\n         *         Vertical with color axis gradient\n         *\n         * @validvalue [\"horizontal\", \"vertical\", \"proximate\"]\n         */\n        layout: 'horizontal',\n        /**\n         * In a legend with horizontal layout, the itemDistance defines the\n         * pixel distance between each item.\n         *\n         * @sample {highcharts} highcharts/legend/layout-horizontal/\n         *         50px item distance\n         * @sample {highstock} highcharts/legend/layout-horizontal/\n         *         50px item distance\n         *\n         * @type      {number}\n         * @default   {highcharts} 20\n         * @default   {highstock} 20\n         * @default   {highmaps} 8\n         * @since     3.0.3\n         * @apioption legend.itemDistance\n         */\n        /**\n         * The pixel bottom margin for each legend item.\n         *\n         * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         *\n         * @since     2.2.0\n         */\n        itemMarginBottom: 2,\n        /**\n         * The pixel top margin for each legend item.\n         *\n         * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         *\n         * @since     2.2.0\n         */\n        itemMarginTop: 2,\n        /**\n         * The width for each legend item. By default the items are laid out\n         * successively. In a [horizontal layout](legend.layout), if the items\n         * are laid out across two rows or more, they will be vertically aligned\n         * depending on the [legend.alignColumns](legend.alignColumns) option.\n         *\n         * @sample {highcharts} highcharts/legend/itemwidth-default/\n         *         Undefined by default\n         * @sample {highcharts} highcharts/legend/itemwidth-80/\n         *         80 for aligned legend items\n         *\n         * @type      {number}\n         * @since     2.0\n         * @apioption legend.itemWidth\n         */\n        /**\n         * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n         * for each legend label. Available variables relates to properties on\n         * the series, or the point in case of pies.\n         *\n         * @type      {string}\n         * @default   {name}\n         * @since     1.3\n         * @apioption legend.labelFormat\n         */\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Callback function to format each of the series' labels. The `this`\n         * keyword refers to the series object, or the point object in case of\n         * pie charts. By default the series or point name is printed.\n         *\n         * @productdesc {highmaps}\n         * In Highmaps the context can also be a data class in case of a\n         * `colorAxis`.\n         *\n         * @sample {highcharts} highcharts/legend/labelformatter/\n         *         Add text\n         * @sample {highmaps} maps/legend/labelformatter/\n         *         Data classes with label formatter\n         *\n         * @type {Highcharts.FormatterCallbackFunction<Point|Series>}\n         */\n        labelFormatter: function () {\n            // eslint-enable valid-jsdoc\n            return this.name;\n        },\n        /**\n         * Line height for the legend items. Deprecated as of 2.1\\. Instead,\n         * the line height for each item can be set using\n         * `itemStyle.lineHeight`, and the padding between items using\n         * `itemMarginTop` and `itemMarginBottom`.\n         *\n         * @sample {highcharts} highcharts/legend/lineheight/\n         *         Setting padding\n         *\n         * @deprecated\n         *\n         * @type      {number}\n         * @default   16\n         * @since     2.0\n         * @product   highcharts gantt\n         * @apioption legend.lineHeight\n         */\n        /**\n         * If the plot area sized is calculated automatically and the legend is\n         * not floating, the legend margin is the space between the legend and\n         * the axis labels or plot area.\n         *\n         * @sample {highcharts} highcharts/legend/margin-default/\n         *         12 pixels by default\n         * @sample {highcharts} highcharts/legend/margin-30/\n         *         30 pixels\n         *\n         * @type      {number}\n         * @default   12\n         * @since     2.1\n         * @apioption legend.margin\n         */\n        /**\n         * Maximum pixel height for the legend. When the maximum height is\n         * extended, navigation will show.\n         *\n         * @type      {number}\n         * @since     2.3.0\n         * @apioption legend.maxHeight\n         */\n        /**\n         * The color of the drawn border around the legend.\n         *\n         * @see In styled mode, the legend border stroke can be applied with the\n         *      `.highcharts-legend-box` class.\n         *\n         * @sample {highcharts} highcharts/legend/bordercolor/\n         *         Brown border\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/border-background/\n         *         Border and background options\n         *\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        borderColor: \"#999999\" /* Palette.neutralColor40 */,\n        /**\n         * The border corner radius of the legend.\n         *\n         * @sample {highcharts} highcharts/legend/borderradius-default/\n         *         Square by default\n         * @sample {highcharts} highcharts/legend/borderradius-round/\n         *         5px rounded\n         * @sample {highmaps} maps/legend/border-background/\n         *         Border and background options\n         */\n        borderRadius: 0,\n        /**\n         * Options for the paging or navigation appearing when the legend is\n         * overflown. Navigation works well on screen, but not in static\n         * exported images. One way of working around that is to\n         * [increase the chart height in\n         * export](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/navigation-enabled-false/).\n         *\n         * @sample highcharts/legend/scrollable-vertical/\n         *         Legend with vertical scrollable extension\n         * @sample highcharts/legend/scrollable-horizontal/\n         *         Legend with horizontal scrollable extension\n         *\n         */\n        navigation: {\n            /**\n             * How to animate the pages when navigating up or down. A value of\n             * `true` applies the default navigation given in the\n             * `chart.animation` option. Additional options can be given as an\n             * object containing values for easing and duration.\n             *\n             * @sample {highcharts} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             * @sample {highstock} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             *\n             * @type      {boolean|Partial<Highcharts.AnimationOptionsObject>}\n             * @default   true\n             * @since     2.2.4\n             * @apioption legend.navigation.animation\n             */\n            /**\n             * The pixel size of the up and down arrows in the legend paging\n             * navigation.\n             *\n             * @sample {highcharts} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             * @sample {highstock} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             *\n             * @type      {number}\n             * @default   12\n             * @since     2.2.4\n             * @apioption legend.navigation.arrowSize\n             */\n            /**\n             * Whether to enable the legend navigation. In most cases, disabling\n             * the navigation results in an unwanted overflow.\n             *\n             * See also the\n             * [adapt chart to legend](https://github.com/highcharts/adapt-chart-to-legend)\n             * plugin for a solution to extend the chart height to make room for\n             * the legend, optionally in exported charts only.\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     4.2.4\n             * @apioption legend.navigation.enabled\n             */\n            /**\n             * Text styles for the legend page navigation.\n             *\n             * @see In styled mode, the navigation items are styled with the\n             *      `.highcharts-legend-navigation` class.\n             *\n             * @sample {highcharts} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             * @sample {highstock} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             *\n             * @type      {Highcharts.CSSObject}\n             * @since     2.2.4\n             * @apioption legend.navigation.style\n             */\n            style: {\n                fontSize: '0.8em'\n            },\n            /**\n             * The color for the active up or down arrow in the legend page\n             * navigation.\n             *\n             * @see In styled mode, the active arrow be styled with the\n             *      `.highcharts-legend-nav-active` class.\n             *\n             * @sample  {highcharts} highcharts/legend/navigation/\n             *          Legend page navigation demonstrated\n             * @sample  {highstock} highcharts/legend/navigation/\n             *          Legend page navigation demonstrated\n             *\n             * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since 2.2.4\n             */\n            activeColor: \"#0022ff\" /* Palette.highlightColor100 */,\n            /**\n             * The color of the inactive up or down arrow in the legend page\n             * navigation. .\n             *\n             * @see In styled mode, the inactive arrow be styled with the\n             *      `.highcharts-legend-nav-inactive` class.\n             *\n             * @sample {highcharts} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             * @sample {highstock} highcharts/legend/navigation/\n             *         Legend page navigation demonstrated\n             *\n             * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since 2.2.4\n             */\n            inactiveColor: \"#cccccc\" /* Palette.neutralColor20 */\n        },\n        /**\n         * The inner padding of the legend box.\n         *\n         * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         *\n         * @type      {number}\n         * @default   8\n         * @since     2.2.0\n         * @apioption legend.padding\n         */\n        /**\n         * Whether to reverse the order of the legend items compared to the\n         * order of the series or points as defined in the configuration object.\n         *\n         * @see [yAxis.reversedStacks](#yAxis.reversedStacks),\n         *      [series.legendIndex](#series.legendIndex)\n         *\n         * @sample {highcharts} highcharts/legend/reversed/\n         *         Stacked bar with reversed legend\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     1.2.5\n         * @apioption legend.reversed\n         */\n        /**\n         * Whether to show the symbol on the right side of the text rather than\n         * the left side. This is common in Arabic and Hebrew.\n         *\n         * @sample {highcharts} highcharts/legend/rtl/\n         *         Symbol to the right\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.2\n         * @apioption legend.rtl\n         */\n        /**\n         * CSS styles for the legend area. In the 1.x versions the position\n         * of the legend area was determined by CSS. In 2.x, the position is\n         * determined by properties like `align`, `verticalAlign`, `x` and `y`,\n         * but the styles are still parsed for backwards compatibility.\n         *\n         * @deprecated\n         *\n         * @type      {Highcharts.CSSObject}\n         * @product   highcharts highstock\n         * @apioption legend.style\n         */\n        /**\n         * CSS styles for each legend item. Only a subset of CSS is supported,\n         * notably those options related to text. The default `textOverflow`\n         * property makes long texts truncate. Set it to `undefined` to wrap\n         * text instead. A `width` property can be added to control the text\n         * width.\n         *\n         * @see In styled mode, the legend items can be styled with the\n         *      `.highcharts-legend-item` class.\n         *\n         * @sample {highcharts} highcharts/legend/itemstyle/\n         *         Bold black text\n         * @sample {highmaps} maps/legend/itemstyle/\n         *         Item text styles\n         *\n         * @type    {Highcharts.CSSObject}\n         * @default {\"color\": \"#333333\", \"cursor\": \"pointer\", \"fontSize\": \"0.8em\", \"fontWeight\": \"bold\", \"textOverflow\": \"ellipsis\"}\n         */\n        itemStyle: {\n            /**\n             * @ignore\n             */\n            color: \"#333333\" /* Palette.neutralColor80 */,\n            /**\n             * @ignore\n             */\n            cursor: 'pointer',\n            /**\n             * @ignore\n             */\n            fontSize: '0.8em',\n            /**\n             * @ignore\n             */\n            textDecoration: 'none',\n            /**\n             * @ignore\n             */\n            textOverflow: 'ellipsis'\n        },\n        /**\n         * CSS styles for each legend item in hover mode. Only a subset of\n         * CSS is supported, notably those options related to text. Properties\n         * are inherited from `style` unless overridden here.\n         *\n         * @see In styled mode, the hovered legend items can be styled with\n         *      the `.highcharts-legend-item:hover` pseudo-class.\n         *\n         * @sample {highcharts} highcharts/legend/itemhoverstyle/\n         *         Red on hover\n         * @sample {highmaps} maps/legend/itemstyle/\n         *         Item text styles\n         *\n         * @type    {Highcharts.CSSObject}\n         * @default {\"color\": \"#000000\"}\n         */\n        itemHoverStyle: {\n            /**\n             * @ignore\n             */\n            color: \"#000000\" /* Palette.neutralColor100 */\n        },\n        /**\n         * CSS styles for each legend item when the corresponding series or\n         * point is hidden. Only a subset of CSS is supported, notably those\n         * options related to text. Properties are inherited from `style`\n         * unless overridden here.\n         *\n         * @see In styled mode, the hidden legend items can be styled with\n         *      the `.highcharts-legend-item-hidden` class.\n         *\n         * @sample {highcharts} highcharts/legend/itemhiddenstyle/\n         *         Darker gray color\n         *\n         * @type    {Highcharts.CSSObject}\n         * @default {\"color\": \"#cccccc\"}\n         */\n        itemHiddenStyle: {\n            /**\n             * @ignore\n             */\n            color: \"#666666\" /* Palette.neutralColor60 */,\n            /**\n             * @ignore\n             */\n            textDecoration: 'line-through'\n        },\n        /**\n         * Whether to apply a drop shadow to the legend. A `backgroundColor`\n         * also needs to be applied for this to take effect. The shadow can be\n         * an object configuration containing `color`, `offsetX`, `offsetY`,\n         * `opacity` and `width`.\n         *\n         * @sample {highcharts} highcharts/legend/shadow/\n         *         White background and drop shadow\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/border-background/\n         *         Border and background options\n         *\n         * @type {boolean|Highcharts.CSSObject}\n         */\n        shadow: false,\n        /**\n         * Default styling for the checkbox next to a legend item when\n         * `showCheckbox` is true.\n         *\n         * @type {Highcharts.CSSObject}\n         * @default {\"width\": \"13px\", \"height\": \"13px\", \"position\":\"absolute\"}\n         */\n        itemCheckboxStyle: {\n            /**\n             * @ignore\n             */\n            position: 'absolute',\n            /**\n             * @ignore\n             */\n            width: '13px', // For IE precision\n            /**\n             * @ignore\n             */\n            height: '13px'\n        },\n        /// itemWidth: undefined,\n        /**\n         * When this is true, the legend symbol width will be the same as\n         * the symbol height, which in turn defaults to the font size of the\n         * legend items.\n         *\n         * @since 5.0.0\n         */\n        squareSymbol: true,\n        /**\n         * The pixel height of the symbol for series types that use a rectangle\n         * in the legend. Defaults to the font size of legend items.\n         *\n         * Note: This option is a default source of color axis height, if the\n         * [colorAxis.height](https://api.highcharts.com/highcharts/colorAxis.height)\n         * option is not set.\n         *\n         * @productdesc {highmaps}\n         * In Highmaps, when the symbol is the gradient of a vertical color\n         * axis, the height defaults to 200.\n         *\n         * @sample {highmaps} maps/legend/layout-vertical-sized/\n         *         Sized vertical gradient\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         No distance between data classes\n         *\n         * @type      {number}\n         * @since     3.0.8\n         * @apioption legend.symbolHeight\n         */\n        /**\n         * The border radius of the symbol for series types that use a rectangle\n         * in the legend. Defaults to half the `symbolHeight`, effectively\n         * creating a circle.\n         *\n         * For color axis scales, it defaults to 3.\n         *\n         * @sample {highcharts} highcharts/legend/symbolradius/\n         *         Round symbols\n         * @sample {highstock} highcharts/legend/symbolradius/\n         *         Round symbols\n         * @sample {highmaps} highcharts/legend/symbolradius/\n         *         Round symbols\n         *\n         * @type      {number}\n         * @since     3.0.8\n         * @apioption legend.symbolRadius\n         */\n        /**\n         * The pixel width of the legend item symbol. When the `squareSymbol`\n         * option is set, this defaults to the `symbolHeight`, otherwise 16.\n         *\n         * Note: This option is a default source of color axis width, if the\n         * [colorAxis.width](https://api.highcharts.com/highcharts/colorAxis.width)\n         * option is not set.\n         *\n         * @productdesc {highmaps}\n         * In Highmaps, when the symbol is the gradient of a horizontal color\n         * axis, the width defaults to 200.\n         *\n         * @sample {highcharts} highcharts/legend/symbolwidth/\n         *         Greater symbol width and padding\n         * @sample {highmaps} maps/legend/padding-itemmargin/\n         *         Padding and item margins demonstrated\n         * @sample {highmaps} maps/legend/layout-vertical-sized/\n         *         Sized vertical gradient\n         *\n         * @type      {number}\n         * @apioption legend.symbolWidth\n         */\n        /**\n         * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the legend item texts.\n         *\n         * Prior to 4.1.7, when using HTML, [legend.navigation](\n         * #legend.navigation) was disabled.\n         *\n         * @sample highcharts/legend/scrollable-vertical/\n         *         Legend with vertical scrollable extension\n         * @sample highcharts/legend/scrollable-horizontal/\n         *         Legend with horizontal scrollable extension\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption legend.useHTML\n         */\n        /**\n         * For a color axis with data classes, how many decimals to render in\n         * the legend. The default preserves the decimals of the range numbers.\n         *\n         * @type      {number}\n         * @default   -1\n         * @product   highcharts highmaps\n         * @apioption legend.valueDecimals\n         */\n        /**\n         * For a color axis with data classes, a suffix for the range numbers in\n         * the legend.\n         *\n         * @type      {string}\n         * @default   ''\n         * @product   highcharts highmaps\n         * @apioption legend.valueSuffix\n         */\n        /**\n         * The width of the legend box. If a number is set, it translates to\n         * pixels. Since v7.0.2 it allows setting a percent string of the full\n         * chart width, for example `40%`.\n         *\n         * Defaults to the full chart width for legends below or above the\n         * chart, half the chart width for legends to the left and right.\n         *\n         * @sample {highcharts} highcharts/legend/width/\n         *         Aligned to the plot area\n         * @sample {highcharts} highcharts/legend/width-percent/\n         *         A percent of the chart width\n         *\n         * @type      {number|string}\n         * @since     2.0\n         * @apioption legend.width\n         */\n        /**\n         * The pixel padding between the legend item symbol and the legend\n         * item text.\n         *\n         * @sample {highcharts} highcharts/legend/symbolpadding/\n         *         Greater symbol width and padding\n         */\n        symbolPadding: 5,\n        /**\n         * The vertical alignment of the legend box. Can be one of `top`,\n         * `middle` or `bottom`. Vertical position can be further determined\n         * by the `y` option.\n         *\n         * In the case that the legend is aligned in a corner position, the\n         * `layout` option will determine whether to place it above/below\n         * or on the side of the plot area.\n         *\n         * When the [layout](#legend.layout) option is `proximate`, the\n         * `verticalAlign` option doesn't apply.\n         *\n         * @sample {highcharts} highcharts/legend/verticalalign/\n         *         Legend 100px from the top of the chart\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/alignment/\n         *         Legend alignment\n         *\n         * @type  {Highcharts.VerticalAlignValue}\n         * @since 2.0\n         */\n        verticalAlign: 'bottom',\n        // Width: undefined,\n        /**\n         * The x offset of the legend relative to its horizontal alignment\n         * `align` within chart.spacingLeft and chart.spacingRight. Negative\n         * x moves it to the left, positive x moves it to the right.\n         *\n         * @sample {highcharts} highcharts/legend/width/\n         *         Aligned to the plot area\n         *\n         * @since 2.0\n         */\n        x: 0,\n        /**\n         * The vertical offset of the legend relative to it's vertical alignment\n         * `verticalAlign` within chart.spacingTop and chart.spacingBottom.\n         *  Negative y moves it up, positive y moves it down.\n         *\n         * @sample {highcharts} highcharts/legend/verticalalign/\n         *         Legend 100px from the top of the chart\n         * @sample {highstock} stock/legend/align/\n         *         Various legend options\n         * @sample {highmaps} maps/legend/alignment/\n         *         Legend alignment\n         *\n         * @since 2.0\n         */\n        y: 0,\n        /**\n         * A title to be added on top of the legend.\n         *\n         * @sample {highcharts} highcharts/legend/title/\n         *         Legend title\n         * @sample {highmaps} maps/legend/alignment/\n         *         Legend with title\n         *\n         * @since 3.0\n         */\n        title: {\n            /**\n             * A text or HTML string for the title.\n             *\n             * @type      {string}\n             * @since     3.0\n             * @apioption legend.title.text\n             */\n            /**\n             * Generic CSS styles for the legend title.\n             *\n             * @see In styled mode, the legend title is styled with the\n             *      `.highcharts-legend-title` class.\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"fontSize\": \"0.8em\", \"fontWeight\": \"bold\"}\n             * @since   3.0\n             */\n            style: {\n                /**\n                 * @ignore\n                 */\n                fontSize: '0.8em',\n                /**\n                 * @ignore\n                 */\n                fontWeight: 'bold'\n            }\n        }\n    },\n    /**\n     * The loading options control the appearance of the loading screen\n     * that covers the plot area on chart operations. This screen only\n     * appears after an explicit call to `chart.showLoading()`. It is a\n     * utility for developers to communicate to the end user that something\n     * is going on, for example while retrieving new data via an XHR connection.\n     * The \"Loading...\" text itself is not part of this configuration\n     * object, but part of the `lang` object.\n     */\n    loading: {\n        /**\n         * The duration in milliseconds of the fade out effect.\n         *\n         * @sample highcharts/loading/hideduration/\n         *         Fade in and out over a second\n         *\n         * @type      {number}\n         * @default   100\n         * @since     1.2.0\n         * @apioption loading.hideDuration\n         */\n        /**\n         * The duration in milliseconds of the fade in effect.\n         *\n         * @sample highcharts/loading/hideduration/\n         *         Fade in and out over a second\n         *\n         * @type      {number}\n         * @default   100\n         * @since     1.2.0\n         * @apioption loading.showDuration\n         */\n        /**\n         * CSS styles for the loading label `span`.\n         *\n         * @see In styled mode, the loading label is styled with the\n         *      `.highcharts-loading-inner` class.\n         *\n         * @sample {highcharts|highmaps} highcharts/loading/labelstyle/\n         *         Vertically centered\n         * @sample {highstock} stock/loading/general/\n         *         Label styles\n         *\n         * @type    {Highcharts.CSSObject}\n         * @default {\"fontWeight\": \"bold\", \"position\": \"relative\", \"top\": \"45%\"}\n         * @since   1.2.0\n         */\n        labelStyle: {\n            /**\n             * @ignore\n             */\n            fontWeight: 'bold',\n            /**\n             * @ignore\n             */\n            position: 'relative',\n            /**\n             * @ignore\n             */\n            top: '45%'\n        },\n        /**\n         * CSS styles for the loading screen that covers the plot area.\n         *\n         * In styled mode, the loading label is styled with the\n         * `.highcharts-loading` class.\n         *\n         * @sample  {highcharts|highmaps} highcharts/loading/style/\n         *          Gray plot area, white text\n         * @sample  {highstock} stock/loading/general/\n         *          Gray plot area, white text\n         *\n         * @type    {Highcharts.CSSObject}\n         * @default {\"position\": \"absolute\", \"backgroundColor\": \"#ffffff\", \"opacity\": 0.5, \"textAlign\": \"center\"}\n         * @since   1.2.0\n         */\n        style: {\n            /**\n             * @ignore\n             */\n            position: 'absolute',\n            /**\n             * @ignore\n             */\n            backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n            /**\n             * @ignore\n             */\n            opacity: 0.5,\n            /**\n             * @ignore\n             */\n            textAlign: 'center'\n        }\n    },\n    /**\n     * Options for the tooltip that appears when the user hovers over a\n     * series or point.\n     *\n     * @declare Highcharts.TooltipOptions\n     */\n    tooltip: {\n        /**\n         * The color of the tooltip border. When `undefined`, the border takes\n         * the color of the corresponding series or point.\n         *\n         * Note that the [borderWidth](#tooltip.borderWidth) is usually 0 by\n         * default, so the border color may not be visible until a border width\n         * is set.\n         *\n         * @sample {highcharts} highcharts/tooltip/bordercolor-default/ Follow\n         *         series by default\n         * @sample {highcharts} highcharts/tooltip/bordercolor-black/ Black\n         *         border\n         * @sample {highstock} stock/tooltip/general/ Styled tooltip\n         * @sample {highmaps} maps/tooltip/background-border/ Background and\n         *         border demo\n         *\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @apioption tooltip.borderColor\n         */\n        /**\n         * A CSS class name to apply to the tooltip's container div,\n         * allowing unique CSS styling for each chart.\n         *\n         * @type      {string}\n         * @apioption tooltip.className\n         */\n        /**\n         * Since 4.1, the crosshair definitions are moved to the Axis object\n         * in order for a better separation from the tooltip. See\n         * [xAxis.crosshair](#xAxis.crosshair).\n         *\n         * @sample {highcharts} highcharts/tooltip/crosshairs-x/\n         *         Enable a crosshair for the x value\n         *\n         * @deprecated\n         *\n         * @type      {*}\n         * @default   true\n         * @apioption tooltip.crosshairs\n         */\n        /**\n         * Distance from point to tooltip in pixels.\n         *\n         * @type      {number}\n         * @default   16\n         * @apioption tooltip.distance\n         */\n        /**\n         * Whether the tooltip should follow the mouse as it moves across\n         * columns, pie slices and other point types with an extent.\n         * By default it behaves this way for pie, polygon, map, sankey\n         * and wordcloud series by override in the `plotOptions`\n         * for those series types.\n         *\n         * Does not apply if [split](#tooltip.split) is `true`.\n         *\n         * For touch moves to behave the same way, [followTouchMove](\n         * #tooltip.followTouchMove) must be `true` also.\n         *\n         * @sample highcharts/tooltip/followpointer/\n         *         Tooltip follow pointer comparison\n         *\n         * @type      {boolean}\n         * @default   {highcharts} false\n         * @default   {highstock} false\n         * @default   {highmaps} true\n         * @since     3.0\n         * @apioption tooltip.followPointer\n         */\n        /**\n         * Whether the tooltip should update as the finger moves on a touch\n         * device. If this is `true` and [chart.panning](#chart.panning) is\n         * set,`followTouchMove` will take over one-finger touches, so the user\n         * needs to use two fingers for zooming and panning.\n         *\n         * Note the difference to [followPointer](#tooltip.followPointer) that\n         * only defines the _position_ of the tooltip. If `followPointer` is\n         * false in for example a column series, the tooltip will show above or\n         * below the column, but as `followTouchMove` is true, the tooltip will\n         * jump from column to column as the user swipes across the plot area.\n         *\n         * @type      {boolean}\n         * @default   {highcharts} true\n         * @default   {highstock} true\n         * @default   {highmaps} false\n         * @since     3.0.1\n         * @apioption tooltip.followTouchMove\n         */\n        /**\n         * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n         * for the whole shared tooltip. When format strings are a requirement,\n         * it is usually more convenient to use `headerFormat`, `pointFormat`\n         * and `footerFormat`, but the `format` option allows combining them\n         * into one setting.\n         *\n         * The context of the format string is the same as that of the\n         * `tooltip.formatter` callback.\n         *\n         * @sample {highcharts} highcharts/tooltip/format-shared/\n         *         Format for shared tooltip\n         *\n         * @type      {string}\n         * @default   undefined\n         * @since     11.1.0\n         * @apioption tooltip.format\n         */\n        /**\n         * Callback function to format the text of the tooltip from scratch. In\n         * case of single or [shared](#tooltip.shared) tooltips, a string should\n         * be returned. In case of [split](#tooltip.split) tooltips, it should\n         * return an array where the first item is the header, and subsequent\n         * items are mapped to the points. Return `false` to disable tooltip for\n         * a specific point on series.\n         *\n         * A subset of HTML is supported. Unless `useHTML` is true, the HTML of\n         * the tooltip is parsed and converted to SVG, therefore this isn't a\n         * complete HTML renderer. The following HTML tags are supported: `b`,\n         * `br`, `em`, `i`, `span`, `strong`. Spans can be styled with a `style`\n         * attribute, but only text-related CSS, that is shared with SVG, is\n         * handled.\n         *\n         * The available data in the formatter differ a bit depending on whether\n         * the tooltip is shared or split, or belongs to a single point. In a\n         * shared/split tooltip, all properties except `x`, which is common for\n         * all points, are kept in an array, `this.points`.\n         *\n         * Available data are:\n         *\n         * - **this.percentage (not shared) /**\n         *   **this.points[i].percentage (shared)**:\n         *   Stacked series and pies only. The point's percentage of the total.\n         *\n         * - **this.point (not shared) / this.points[i].point (shared)**:\n         *   The point object. The point name, if defined, is available through\n         *   `this.point.name`.\n         *\n         * - **this.points**:\n         *   In a shared tooltip, this is an array containing all other\n         *   properties for each point.\n         *\n         * - **this.series (not shared) / this.points[i].series (shared)**:\n         *   The series object. The series name is available through\n         *   `this.series.name`.\n         *\n         * - **this.total (not shared) / this.points[i].total (shared)**:\n         *   Stacked series only. The total value at this point's x value.\n         *\n         * - **this.x**:\n         *   The x value. This property is the same regardless of the tooltip\n         *   being shared or not.\n         *\n         * - **this.y (not shared) / this.points[i].y (shared)**:\n         *   The y value.\n         *\n         * @sample {highcharts} highcharts/tooltip/formatter-simple/\n         *         Simple string formatting\n         * @sample {highcharts} highcharts/tooltip/formatter-shared/\n         *         Formatting with shared tooltip\n         * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n         *         Formatting with split tooltip\n         * @sample highcharts/tooltip/formatter-conditional-default/\n         *         Extending default formatter\n         * @sample {highstock} stock/tooltip/formatter/\n         *         Formatting with shared tooltip\n         * @sample {highmaps} maps/tooltip/formatter/\n         *         String formatting\n         *\n         * @type      {Highcharts.TooltipFormatterCallbackFunction}\n         * @apioption tooltip.formatter\n         */\n        /**\n         * Callback function to format the text of the tooltip for\n         * visible null points.\n         * Works analogously to [formatter](#tooltip.formatter).\n         *\n         * @sample highcharts/plotoptions/series-nullformat\n         *         Format data label and tooltip for null point.\n         *\n         * @type      {Highcharts.TooltipFormatterCallbackFunction}\n         * @apioption tooltip.nullFormatter\n         */\n        /**\n         * Whether to allow the tooltip to render outside the chart's SVG\n         * element box. By default (`false`), the tooltip is rendered within the\n         * chart's SVG element, which results in the tooltip being aligned\n         * inside the chart area. For small charts, this may result in clipping\n         * or overlapping. When `true`, a separate SVG element is created and\n         * overlaid on the page, allowing the tooltip to be aligned inside the\n         * page itself.\n         *\n         * Defaults to `true` if `chart.scrollablePlotArea` is activated,\n         * otherwise `false`.\n         *\n         * @sample highcharts/tooltip/outside\n         *         Small charts with tooltips outside\n         *\n         * @type      {boolean|undefined}\n         * @default   undefined\n         * @since     6.1.1\n         * @apioption tooltip.outside\n         */\n        /**\n         * A callback function for formatting the HTML output for a single point\n         * in the tooltip. Like the `pointFormat` string, but with more\n         * flexibility.\n         *\n         * @type      {Highcharts.FormatterCallbackFunction<Highcharts.Point>}\n         * @since     4.1.0\n         * @context   Highcharts.Point\n         * @apioption tooltip.pointFormatter\n         */\n        /**\n         * A callback function to place the tooltip in a custom position. The\n         * callback receives three parameters: `labelWidth`, `labelHeight` and\n         * `point`, where point contains values for `plotX` and `plotY` telling\n         * where the reference point is in the plot area. Add `chart.plotLeft`\n         * and `chart.plotTop` to get the full coordinates.\n         *\n         * To find the actual hovered `Point` instance, use\n         * `this.chart.hoverPoint`. For shared or split tooltips, all the hover\n         * points are available in `this.chart.hoverPoints`.\n         *\n         * Since v7, when [tooltip.split](#tooltip.split) option is enabled,\n         * positioner is called for each of the boxes separately, including\n         * xAxis header. xAxis header is not a point, instead `point` argument\n         * contains info: `{ plotX: Number, plotY: Number, isHeader: Boolean }`\n         *\n         * The return should be an object containing x and y values, for example\n         * `{ x: 100, y: 100 }`.\n         *\n         * @sample {highcharts} highcharts/tooltip/positioner/\n         *         A fixed tooltip position\n         * @sample {highstock} stock/tooltip/positioner/\n         *         A fixed tooltip position on top of the chart\n         * @sample {highmaps} maps/tooltip/positioner/\n         *         A fixed tooltip position\n         * @sample {highstock} stock/tooltip/split-positioner/\n         *         Split tooltip with fixed positions\n         * @sample {highstock} stock/tooltip/positioner-scrollable-plotarea/\n         *         Scrollable plot area combined with tooltip positioner\n         *\n         * @type      {Highcharts.TooltipPositionerCallbackFunction}\n         * @since     2.2.4\n         * @apioption tooltip.positioner\n         */\n        /**\n         * Shows tooltip for all points with the same X value. Splits the\n         * tooltip into one label per series, with the header close to the axis.\n         * This is recommended over [shared](#tooltip.shared)\n         * tooltips for charts with multiple line series, generally making them\n         * easier to read. This option takes precedence over `tooltip.shared`.\n         *\n         * Not supported for [polar](#chart.polar) and [inverted](#chart.inverted) charts.\n         *\n         * @productdesc {highstock} In Highcharts Stock, tooltips are split\n         * by default since v6.0.0. Stock charts typically contain\n         * multi-dimension points and multiple panes, making split tooltips\n         * the preferred layout over\n         * the previous `shared` tooltip.\n         *\n         * @sample highcharts/tooltip/split/\n         *         Split tooltip\n         * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n         *         Split tooltip and custom formatter callback\n         *\n         * @type      {boolean}\n         * @default   {highcharts} false\n         * @default   {highstock} true\n         * @since     5.0.0\n         * @product   highcharts highstock\n         * @apioption tooltip.split\n         */\n        /**\n         * Prevents the tooltip from switching or closing, when touched or\n         * pointed.\n         *\n         * @sample highcharts/tooltip/stickoncontact/\n         *         Tooltip sticks on pointer contact\n         *\n         * @type      {boolean}\n         * @since     8.0.1\n         * @apioption tooltip.stickOnContact\n         */\n        /**\n         * Use HTML to render the contents of the tooltip instead of SVG. Using\n         * HTML allows advanced formatting like tables and images in the\n         * tooltip. It is also recommended for rtl languages as it works around\n         * rtl bugs in early Firefox.\n         *\n         * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n         *         A table for value alignment\n         * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n         *         Full HTML tooltip\n         * @sample {highmaps} maps/tooltip/usehtml/\n         *         Pure HTML tooltip\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     2.2\n         * @apioption tooltip.useHTML\n         */\n        /**\n         * How many decimals to show in each series' y value. This is\n         * overridable in each series' tooltip options object. The default is to\n         * preserve all decimals.\n         *\n         * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         * @sample {highmaps} maps/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         *\n         * @type      {number|undefined}\n         * @since     2.2\n         * @apioption tooltip.valueDecimals\n         */\n        /**\n         * A string to prepend to each series' y value. Overridable in each\n         * series' tooltip options object.\n         *\n         * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         * @sample {highmaps} maps/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         *\n         * @type      {string}\n         * @since     2.2\n         * @apioption tooltip.valuePrefix\n         */\n        /**\n         * A string to append to each series' y value. Overridable in each\n         * series' tooltip options object.\n         *\n         * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         * @sample {highmaps} maps/tooltip/valuedecimals/\n         *         Set decimals, prefix and suffix for the value\n         *\n         * @type      {string}\n         * @since     2.2\n         * @apioption tooltip.valueSuffix\n         */\n        /**\n         * The format for the date in the tooltip header if the X axis is a\n         * datetime axis. The default is a best guess based on the smallest\n         * distance between points in the chart.\n         *\n         * @sample {highcharts} highcharts/tooltip/xdateformat/\n         *         A different format\n         *\n         * @type      {string}\n         * @product   highcharts highstock gantt\n         * @apioption tooltip.xDateFormat\n         */\n        /**\n         * How many decimals to show for the `point.change`\n         * or the `point.cumulativeSum` value when the `series.compare`\n         * or the `series.cumulative` option is set.\n         * This is overridable in each series' tooltip options object.\n         *\n         * @type      {number}\n         * @default   2\n         * @since     1.0.1\n         * @product   highstock\n         * @apioption tooltip.changeDecimals\n         */\n        /**\n         * Enable or disable the tooltip.\n         *\n         * @sample {highcharts} highcharts/tooltip/enabled/\n         *         Disabled\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n         *         Disable tooltip and show values on chart instead\n         */\n        enabled: true,\n        /**\n         * Enable or disable animation of the tooltip.\n         *\n         * @type       {boolean|Partial<Highcharts.AnimationOptionsObject>}\n         * @since      2.3.0\n         */\n        animation: {\n            duration: 300,\n            // EaseOutCirc\n            easing: (x) => Math.sqrt(1 - Math.pow(x - 1, 2))\n        },\n        /**\n         * The radius of the rounded border corners.\n         *\n         * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n         *         Default border radius\n         * @sample {highcharts} highcharts/tooltip/borderradius-0/\n         *         Square borders\n         * @sample {highmaps} maps/tooltip/background-border/\n         *         Background and border demo\n         */\n        borderRadius: 3,\n        /**\n         * For series on datetime axes, the date format in the tooltip's\n         * header will by default be guessed based on the closest data points.\n         * This member gives the default string representations used for\n         * each unit. For an overview of the replacement codes, see\n         * [dateFormat](/class-reference/Highcharts.Time#dateFormat).\n         *\n         * @see [xAxis.dateTimeLabelFormats](#xAxis.dateTimeLabelFormats)\n         *\n         * @type    {Highcharts.Dictionary<string>}\n         * @product highcharts highstock gantt\n         */\n        dateTimeLabelFormats: {\n            /** @internal */\n            millisecond: '%A, %e %b, %H:%M:%S.%L',\n            /** @internal */\n            second: '%A, %e %b, %H:%M:%S',\n            /** @internal */\n            minute: '%A, %e %b, %H:%M',\n            /** @internal */\n            hour: '%A, %e %b, %H:%M',\n            /** @internal */\n            day: '%A, %e %b %Y',\n            /** @internal */\n            week: 'Week from %A, %e %b %Y',\n            /** @internal */\n            month: '%B %Y',\n            /** @internal */\n            year: '%Y'\n        },\n        /**\n         * A string to append to the tooltip format.\n         *\n         * @sample {highcharts} highcharts/tooltip/footerformat/\n         *         A table for value alignment\n         * @sample {highmaps} maps/tooltip/format/\n         *         Format demo\n         *\n         * @since 2.2\n         */\n        footerFormat: '',\n        /**\n         * The name of a symbol to use for the border around the tooltip\n         * header. Applies only when [tooltip.split](#tooltip.split) is\n         * enabled.\n         *\n         * Custom callbacks for symbol path generation can also be added to\n         * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n         * [series.marker.symbol](plotOptions.line.marker.symbol).\n         *\n         * @see [tooltip.shape](#tooltip.shape)\n         *\n         * @sample {highstock} stock/tooltip/split-positioner/\n         *         Different shapes for header and split boxes\n         *\n         * @type       {Highcharts.TooltipShapeValue}\n         * @validvalue [\"callout\", \"rect\"]\n         * @since      7.0\n         */\n        headerShape: 'callout',\n        /**\n         * The number of milliseconds to wait until the tooltip is hidden when\n         * mouse out from a point or chart.\n         *\n         * @since 3.0\n         */\n        hideDelay: 500,\n        /**\n         * Padding inside the tooltip, in pixels.\n         *\n         * @since 5.0.0\n         */\n        padding: 8,\n        /**\n         * The name of a symbol to use for the border around the tooltip. Can\n         * be one of: `\"callout\"`, `\"circle\"` or `\"rect\"`. When\n         * [tooltip.split](#tooltip.split)\n         * option is enabled, shape is applied to all boxes except header, which\n         * is controlled by\n         * [tooltip.headerShape](#tooltip.headerShape).\n         *\n         * Custom callbacks for symbol path generation can also be added to\n         * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n         * [series.marker.symbol](plotOptions.line.marker.symbol).\n         *\n         * @type  {Highcharts.TooltipShapeValue}\n         * @since 4.0\n         */\n        shape: 'callout',\n        /**\n         * Shows information in the tooltip for all points with the same X\n         * value. When the tooltip is shared, the entire plot area will capture\n         * mouse movement or touch events. Tooltip texts for series types with\n         * ordered data (not pie, scatter, flags etc) will be shown in a single\n         * bubble. This is recommended for single series charts and for\n         * tablet/mobile optimized charts.\n         *\n         * See also [tooltip.split](#tooltip.split), that is better suited for\n         * charts with many series, especially line-type series. The\n         * `tooltip.split` option takes precedence over `tooltip.shared`.\n         *\n         * @sample {highcharts} highcharts/tooltip/shared-false/\n         *         False by default\n         * @sample {highcharts} highcharts/tooltip/shared-true/\n         *         True\n         * @sample {highcharts} highcharts/tooltip/shared-x-crosshair/\n         *         True with x axis crosshair\n         * @sample {highcharts} highcharts/tooltip/shared-true-mixed-types/\n         *         True with mixed series types\n         *\n         * @since   2.1\n         * @product highcharts highstock\n         */\n        shared: false,\n        /**\n         * Proximity snap for graphs or single points. It defaults to 10 for\n         * mouse-powered devices and 25 for touch devices.\n         *\n         * Note that in most cases the whole plot area captures the mouse\n         * movement, and in these cases `tooltip.snap` doesn't make sense. This\n         * applies when [stickyTracking](#plotOptions.series.stickyTracking)\n         * is `true` (default) and when the tooltip is [shared](#tooltip.shared)\n         * or [split](#tooltip.split).\n         *\n         * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n         *         10 px by default\n         * @sample {highcharts} highcharts/tooltip/snap-50/\n         *         50 px on graph\n         *\n         * @type    {number}\n         * @default 10/25\n         * @since   1.2.0\n         * @product highcharts highstock\n         */\n        snap: isTouchDevice ? 25 : 10,\n        /**\n         * The HTML of the tooltip header line. Variables are enclosed by\n         * curly brackets. Available variables are `point.key`, `series.name`,\n         * `series.color` and other members from the `point` and `series`\n         * objects. The `point.key` variable contains the category name, x\n         * value or datetime string depending on the type of axis. For datetime\n         * axes, the `point.key` date format can be set using\n         * `tooltip.xDateFormat`.\n         *\n         * @sample {highcharts} highcharts/tooltip/footerformat/\n         *         An HTML table in the tooltip\n         * @sample {highstock} highcharts/tooltip/footerformat/\n         *         An HTML table in the tooltip\n         * @sample {highmaps} maps/tooltip/format/\n         *         Format demo\n         *\n         * @type      {string}\n         * @apioption tooltip.headerFormat\n         */\n        headerFormat: '<span style=\"font-size: 0.8em\">{point.key}</span><br/>',\n        /**\n         * The HTML of the null point's line in the tooltip. Works analogously\n         * to [pointFormat](#tooltip.pointFormat).\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-nullformat\n         *         Format data label and tooltip for null point.\n         *\n         * @type      {string}\n         * @apioption tooltip.nullFormat\n         */\n        /**\n         * The HTML of the point's line in the tooltip. Variables are enclosed\n         * by curly brackets. Available variables are `point.x`, `point.y`,\n         * `series.name` and `series.color` and other properties on the same\n         * form. Furthermore, `point.y` can be extended by the\n         * `tooltip.valuePrefix` and `tooltip.valueSuffix` variables. This can\n         * also be overridden for each series, which makes it a good hook for\n         * displaying units.\n         *\n         * In styled mode, the dot is colored by a class name rather\n         * than the point color.\n         *\n         * @sample {highcharts} highcharts/tooltip/pointformat/\n         *         A different point format with value suffix\n         * @sample {highcharts|highstock} highcharts/tooltip/pointformat-extra-information/\n         *         Show extra information about points in the tooltip\n         * @sample {highmaps} maps/tooltip/format/\n         *         Format demo\n         *\n         * @type       {string}\n         * @since      2.2\n         * @apioption  tooltip.pointFormat\n         */\n        pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.y}</b><br/>',\n        /**\n         * The background color or gradient for the tooltip.\n         *\n         * In styled mode, the stroke width is set in the\n         * `.highcharts-tooltip-box` class.\n         *\n         * @sample {highcharts} highcharts/tooltip/backgroundcolor-solid/\n         *         Yellowish background\n         * @sample {highcharts} highcharts/tooltip/backgroundcolor-gradient/\n         *         Gradient\n         * @sample {highcharts} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         * @sample {highstock} stock/tooltip/general/\n         *         Custom tooltip\n         * @sample {highstock} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         * @sample {highmaps} maps/tooltip/background-border/\n         *         Background and border demo\n         * @sample {highmaps} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         *\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n        /**\n         * The pixel width of the tooltip border. Defaults to 0 for single\n         * tooltips and 1 for split tooltips.\n         *\n         * In styled mode, the stroke width is set in the\n         * `.highcharts-tooltip-box` class.\n         *\n         * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n         *         2 pixels\n         * @sample {highcharts} highcharts/tooltip/borderwidth/\n         *         No border (shadow only)\n         * @sample {highcharts} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         * @sample {highstock} stock/tooltip/general/\n         *         Custom tooltip\n         * @sample {highstock} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         * @sample {highmaps} maps/tooltip/background-border/\n         *         Background and border demo\n         * @sample {highmaps} highcharts/css/tooltip-border-background/\n         *         Tooltip in styled mode\n         *\n         * @type {number}\n         */\n        borderWidth: void 0,\n        /**\n         * Whether to apply a drop shadow to the tooltip.\n         *\n         * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n         *         True by default\n         * @sample {highcharts} highcharts/tooltip/shadow/\n         *         False\n         * @sample {highmaps} maps/tooltip/positioner/\n         *         Fixed tooltip position, border and shadow disabled\n         *\n         * @type {boolean|Highcharts.ShadowOptionsObject}\n         */\n        shadow: true,\n        /**\n         * Prevents the tooltip from switching or closing when touched or\n         * pointed.\n         *\n         * @sample highcharts/tooltip/stickoncontact/\n         *         Tooltip sticks on pointer contact\n         *\n         * @since 8.0.1\n         */\n        stickOnContact: false,\n        /**\n         * CSS styles for the tooltip. The tooltip can also be styled through\n         * the CSS class `.highcharts-tooltip`.\n         *\n         * Note that the default `pointerEvents` style makes the tooltip ignore\n         * mouse events, so in order to use clickable tooltips, this value must\n         * be set to `auto`.\n         *\n         * @sample {highcharts} highcharts/tooltip/style/\n         *         Greater padding, bold text\n         *\n         * @type {Highcharts.CSSObject}\n         */\n        style: {\n            /** @internal */\n            color: \"#333333\" /* Palette.neutralColor80 */,\n            /** @internal */\n            cursor: 'default',\n            /** @internal */\n            fontSize: '0.8em'\n        },\n        /**\n         * Use HTML to render the contents of the tooltip instead of SVG. Using\n         * HTML allows advanced formatting like tables and images in the\n         * tooltip. It is also recommended for rtl languages as it works around\n         * rtl bugs in early Firefox.\n         *\n         * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n         *         A table for value alignment\n         * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n         *         Full HTML tooltip\n         * @sample {highmaps} maps/tooltip/usehtml/\n         *         Pure HTML tooltip\n         *\n         * @since 2.2\n         */\n        useHTML: false\n    },\n    /**\n     * Highchart by default puts a credits label in the lower right corner\n     * of the chart. This can be changed using these options.\n     */\n    credits: {\n        /**\n         * Credits for map source to be concatenated with conventional credit\n         * text. By default this is a format string that collects copyright\n         * information from the map if available.\n         *\n         * @see [mapTextFull](#credits.mapTextFull)\n         * @see [text](#credits.text)\n         *\n         * @type      {string}\n         * @default   \\u00a9 <a href=\"{geojson.copyrightUrl}\">{geojson.copyrightShort}</a>\n         * @since     4.2.2\n         * @product   highmaps\n         * @apioption credits.mapText\n         */\n        /**\n         * Detailed credits for map source to be displayed on hover of credits\n         * text. By default this is a format string that collects copyright\n         * information from the map if available.\n         *\n         * @see [mapText](#credits.mapText)\n         * @see [text](#credits.text)\n         *\n         * @type      {string}\n         * @default   {geojson.copyright}\n         * @since     4.2.2\n         * @product   highmaps\n         * @apioption credits.mapTextFull\n         */\n        /**\n         * Whether to show the credits text.\n         *\n         * @sample {highcharts} highcharts/credits/enabled-false/\n         *         Credits disabled\n         * @sample {highstock} stock/credits/enabled/\n         *         Credits disabled\n         * @sample {highmaps} maps/credits/enabled-false/\n         *         Credits disabled\n         */\n        enabled: true,\n        /**\n         * The URL for the credits label.\n         *\n         * @sample {highcharts} highcharts/credits/href/\n         *         Custom URL and text\n         * @sample {highmaps} maps/credits/customized/\n         *         Custom URL and text\n         */\n        href: 'https://www.highcharts.com?credits',\n        /**\n         * Position configuration for the credits label.\n         *\n         * @sample {highcharts} highcharts/credits/position-left/\n         *         Left aligned\n         * @sample {highcharts} highcharts/credits/position-left/\n         *         Left aligned\n         * @sample {highmaps} maps/credits/customized/\n         *         Left aligned\n         * @sample {highmaps} maps/credits/customized/\n         *         Left aligned\n         *\n         * @type    {Highcharts.AlignObject}\n         * @since   2.1\n         */\n        position: {\n            /** @internal */\n            align: 'right',\n            /** @internal */\n            x: -10,\n            /** @internal */\n            verticalAlign: 'bottom',\n            /** @internal */\n            y: -5\n        },\n        /**\n         * CSS styles for the credits label.\n         *\n         * @see In styled mode, credits styles can be set with the\n         *      `.highcharts-credits` class.\n         *\n         * @type {Highcharts.CSSObject}\n         */\n        style: {\n            /** @internal */\n            cursor: 'pointer',\n            /** @internal */\n            color: \"#999999\" /* Palette.neutralColor40 */,\n            /** @internal */\n            fontSize: '0.6em'\n        },\n        /**\n         * The text for the credits label.\n         *\n         * @productdesc {highmaps}\n         * If a map is loaded as GeoJSON, the text defaults to\n         * `Highcharts @ {map-credits}`. Otherwise, it defaults to\n         * `Highcharts.com`.\n         *\n         * @sample {highcharts} highcharts/credits/href/\n         *         Custom URL and text\n         * @sample {highmaps} maps/credits/customized/\n         *         Custom URL and text\n         */\n        text: 'Highcharts.com'\n    }\n};\n/* eslint-disable spaced-comment */\n/*= if (!build.classic) { =*/\n// Legacy build for styled mode, set the styledMode option to true by default.\ndefaultOptions.chart.styledMode = true;\n/*= } else { =*/\ndefaultOptions.chart.styledMode = false;\n/*= } =*/\n'';\nconst defaultTime = new Time(defaultOptions.time);\n/**\n * Get the updated default options. Until 3.0.7, merely exposing defaultOptions\n * for outside modules wasn't enough because the setOptions method created a new\n * object.\n *\n * @function Highcharts.getOptions\n *\n * @return {Highcharts.Options}\n * Default options.\n */\nfunction getOptions() {\n    return defaultOptions;\n}\n/**\n * Merge the default options with custom options and return the new options\n * structure. Commonly used for defining reusable templates.\n *\n * @sample highcharts/global/useutc-false Setting a global option\n * @sample highcharts/members/setoptions Applying a global theme\n *\n * @function Highcharts.setOptions\n *\n * @param {Highcharts.Options} options\n * The new custom chart options.\n *\n * @return {Highcharts.Options}\n * Updated options.\n */\nfunction setOptions(options) {\n    fireEvent(H, 'setOptions', { options });\n    // Copy in the default options\n    merge(true, defaultOptions, options);\n    // Update the time object\n    if (options.time || options.global) {\n        if (H.time) {\n            H.time.update(merge(defaultOptions.global, defaultOptions.time, options.global, options.time));\n        }\n        else {\n            /**\n             * Global `Time` object with default options. Since v6.0.5, time\n             * settings can be applied individually for each chart. If no\n             * individual settings apply, this `Time` object is shared by all\n             * instances.\n             *\n             * @name Highcharts.time\n             * @type {Highcharts.Time}\n             */\n            H.time = defaultTime;\n        }\n    }\n    return defaultOptions;\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst DefaultOptions = {\n    defaultOptions,\n    defaultTime,\n    getOptions,\n    setOptions\n};\nexport default DefaultOptions;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @typedef {\"plotBox\"|\"spacingBox\"} Highcharts.ButtonRelativeToValue\n */\n/**\n * Gets fired when a series is added to the chart after load time, using the\n * `addSeries` method. Returning `false` prevents the series from being added.\n *\n * @callback Highcharts.ChartAddSeriesCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {Highcharts.ChartAddSeriesEventObject} event\n *        The event that occurred.\n */\n/**\n * Contains common event information. Through the `options` property you can\n * access the series options that were passed to the `addSeries` method.\n *\n * @interface Highcharts.ChartAddSeriesEventObject\n */ /**\n* The series options that were passed to the `addSeries` method.\n* @name Highcharts.ChartAddSeriesEventObject#options\n* @type {Highcharts.SeriesOptionsType}\n*/ /**\n* Prevents the default behaviour of the event.\n* @name Highcharts.ChartAddSeriesEventObject#preventDefault\n* @type {Function}\n*/ /**\n* The event target.\n* @name Highcharts.ChartAddSeriesEventObject#target\n* @type {Highcharts.Chart}\n*/ /**\n* The event type.\n* @name Highcharts.ChartAddSeriesEventObject#type\n* @type {\"addSeries\"}\n*/\n/**\n * Gets fired when clicking on the plot background.\n *\n * @callback Highcharts.ChartClickCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {Highcharts.PointerEventObject} event\n *        The event that occurred.\n */\n/**\n * Contains an axes of the clicked spot.\n *\n * @interface Highcharts.ChartClickEventAxisObject\n */ /**\n* Axis at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Axis value at the clicked spot.\n* @name Highcharts.ChartClickEventAxisObject#value\n* @type {number}\n*/\n/**\n * Contains information about the clicked spot on the chart. Remember the unit\n * of a datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * @interface Highcharts.ChartClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Information about the x-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#xAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>}\n*/ /**\n* Information about the y-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#yAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>}\n*/ /**\n* Information about the z-axis on the clicked spot.\n* @name Highcharts.ChartClickEventObject#zAxis\n* @type {Array<Highcharts.ChartClickEventAxisObject>|undefined}\n*/\n/**\n * Gets fired when the chart is finished loading.\n *\n * @callback Highcharts.ChartLoadCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Fires when the chart is redrawn, either after a call to `chart.redraw()` or\n * after an axis, series or point is modified with the `redraw` option set to\n * `true`.\n *\n * @callback Highcharts.ChartRedrawCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Gets fired after initial load of the chart (directly after the `load` event),\n * and after each redraw (directly after the `redraw` event).\n *\n * @callback Highcharts.ChartRenderCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Gets fired when an area of the chart has been selected. The default action\n * for the selection event is to zoom the chart to the selected area. It can be\n * prevented by calling `event.preventDefault()` or return false.\n *\n * @callback Highcharts.ChartSelectionCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {Highcharts.SelectEventObject} event\n *        Event informations\n *\n * @return {boolean|undefined}\n *         Return false to prevent the default action, usually zoom.\n */\n(''); // Detach doclets above\n","/*\n * Series palettes for Highcharts. Series colors are defined in highcharts.css.\n * **Do not edit this file!** This file is generated using the 'gulp palette' task.\n */\nconst SeriesPalettes = {\n    /**\n     * Colors for data series and points\n     */\n    colors: [\n        '#2caffe',\n        '#544fc5',\n        '#00e272',\n        '#fe6a35',\n        '#6b8abc',\n        '#d568fb',\n        '#2ee0ca',\n        '#fa4b42',\n        '#feb56a',\n        '#91e8e1'\n    ],\n};\nexport default SeriesPalettes;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * General options for the chart.\n *\n * @optionparent chart\n */\nconst ChartDefaults = {\n    /**\n     * Default `mapData` for all series, in terms of a GeoJSON or TopoJSON\n     * object. If set to a string, it functions as an index into the\n     * `Highcharts.maps` array.\n     *\n     * For picking out individual shapes and geometries to use for each series\n     * of the map, see [series.mapData](#series.map.mapData).\n     *\n     * @sample    maps/demo/geojson\n     *            Loading GeoJSON data\n     * @sample    maps/chart/topojson\n     *            Loading TopoJSON data\n     *\n     * @type      {string|Array<*>|Highcharts.GeoJSON|Highcharts.TopoJSON}\n     * @since     5.0.0\n     * @product   highmaps\n     * @apioption chart.map\n     */\n    /**\n     * Set lat/lon transformation definitions for the chart. If not defined,\n     * these are extracted from the map data.\n     *\n     * @type      {*}\n     * @since     5.0.0\n     * @product   highmaps\n     * @apioption chart.mapTransforms\n     */\n    /**\n     * When using multiple axes, the ticks of two or more opposite axes\n     * will automatically be aligned by adding ticks to the axis or axes\n     * with the least ticks, as if `tickAmount` were specified.\n     *\n     * This can be prevented by setting `alignTicks` to false. If the grid\n     * lines look messy, it's a good idea to hide them for the secondary\n     * axis by setting `gridLineWidth` to 0.\n     *\n     * If `startOnTick` or `endOnTick` in the axis options are set to false,\n     * then the `alignTicks ` will be disabled for the axis.\n     *\n     * Disabled for logarithmic axes.\n     *\n     * @sample {highcharts} highcharts/chart/alignticks-true/\n     *         True by default\n     * @sample {highcharts} highcharts/chart/alignticks-false/\n     *         False\n     * @sample {highstock} stock/chart/alignticks-true/\n     *         True by default\n     * @sample {highstock} stock/chart/alignticks-false/\n     *         False\n     *\n     * @type      {boolean}\n     * @default   true\n     * @product   highcharts highstock gantt\n     * @apioption chart.alignTicks\n     */\n    /**\n     * When using multiple axes, align the thresholds. When this is true, other\n     * ticks will also be aligned.\n     *\n     * Note that for line series and some other series types, the `threshold`\n     * option is set to `null` by default. This will in turn cause their y-axis\n     * to not have a threshold. In order to avoid that, set the series\n     * `threshold` to 0 or another number.\n     *\n     * If `startOnTick` or `endOnTick` in the axis options are set to false, or\n     * if the axis is logarithmic, the threshold will not be aligned.\n     *\n     * @sample {highcharts} highcharts/chart/alignthresholds/ Set to true\n     *\n     * @since 10.0.0\n     * @product   highcharts highstock gantt\n     * @apioption chart.alignThresholds\n     */\n    alignThresholds: false,\n    /**\n     * Set the overall animation for all chart updating. Animation can be\n     * disabled throughout the chart by setting it to false here. It can\n     * be overridden for each individual API method as a function parameter.\n     * The only animation not affected by this option is the initial series\n     * animation, see [plotOptions.series.animation](\n     * #plotOptions.series.animation).\n     *\n     * The animation can either be set as a boolean or a configuration\n     * object. If `true`, it will use the 'swing' jQuery easing and a\n     * duration of 500 ms. If used as a configuration object, the following\n     * properties are supported:\n     *\n     * - `defer`: The animation delay time in milliseconds.\n     *\n     * - `duration`: The duration of the animation in milliseconds.\n     *\n     * - `easing`: A string reference to an easing function set on the\n     *   `Math` object. See\n     *   [the easing demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-animation-easing/).\n     *\n     * When zooming on a series with less than 100 points, the chart redraw\n     * will be done with animation, but in case of more data points, it is\n     * necessary to set this option to ensure animation on zoom.\n     *\n     * @sample {highcharts} highcharts/chart/animation-none/\n     *         Updating with no animation\n     * @sample {highcharts} highcharts/chart/animation-duration/\n     *         With a longer duration\n     * @sample {highcharts} highcharts/chart/animation-easing/\n     *         With a jQuery UI easing\n     * @sample {highmaps} maps/chart/animation-none/\n     *         Updating with no animation\n     * @sample {highmaps} maps/chart/animation-duration/\n     *         With a longer duration\n     *\n     * @type      {boolean|Partial<Highcharts.AnimationOptionsObject>}\n     * @default   true\n     * @apioption chart.animation\n     */\n    /**\n     * A CSS class name to apply to the charts container `div`, allowing\n     * unique CSS styling for each chart.\n     *\n     * @type      {string}\n     * @apioption chart.className\n     */\n    /**\n     * Event listeners for the chart.\n     *\n     * @apioption chart.events\n     */\n    /**\n     * Fires when a series is added to the chart after load time, using the\n     * `addSeries` method. One parameter, `event`, is passed to the\n     * function, containing common event information. Through\n     * `event.options` you can access the series options that were passed to\n     * the `addSeries` method. Returning false prevents the series from\n     * being added.\n     *\n     * @sample {highcharts} highcharts/chart/events-addseries/\n     *         Alert on add series\n     * @sample {highstock} stock/chart/events-addseries/\n     *         Alert on add series\n     *\n     * @type      {Highcharts.ChartAddSeriesCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Chart\n     * @apioption chart.events.addSeries\n     */\n    /**\n     * Fires when clicking on the plot background. One parameter, `event`,\n     * is passed to the function, containing common event information.\n     *\n     * Information on the clicked spot can be found through `event.xAxis`\n     * and `event.yAxis`, which are arrays containing the axes of each\n     * dimension and each axis' value at the clicked spot. The primary axes\n     * are `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n     * datetime axis is milliseconds since 1970-01-01 00:00:00.\n     *\n     * ```js\n     * click: function(e) {\n     *     console.log(\n     *         Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),\n     *         e.yAxis[0].value\n     *     )\n     * }\n     * ```\n     *\n     * @sample {highcharts} highcharts/chart/events-click/\n     *         Alert coordinates on click\n     * @sample {highcharts} highcharts/chart/events-container/\n     *         Alternatively, attach event to container\n     * @sample {highstock} stock/chart/events-click/\n     *         Alert coordinates on click\n     * @sample {highstock} highcharts/chart/events-container/\n     *         Alternatively, attach event to container\n     * @sample {highmaps} maps/chart/events-click/\n     *         Record coordinates on click\n     * @sample {highmaps} highcharts/chart/events-container/\n     *         Alternatively, attach event to container\n     *\n     * @type      {Highcharts.ChartClickCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Chart\n     * @apioption chart.events.click\n     */\n    /**\n     * Fires when the chart is finished loading. Since v4.2.2, it also waits\n     * for images to be loaded, for example from point markers. One\n     * parameter, `event`, is passed to the function, containing common\n     * event information.\n     *\n     * There is also a second parameter to the chart constructor where a\n     * callback function can be passed to be executed on chart.load.\n     *\n     * @sample {highcharts} highcharts/chart/events-load/\n     *         Alert on chart load\n     * @sample {highcharts} highcharts/chart/events-render/\n     *         Load vs Redraw vs Render\n     * @sample {highstock} stock/chart/events-load/\n     *         Alert on chart load\n     * @sample {highmaps} maps/chart/events-load/\n     *         Add series on chart load\n     *\n     * @type      {Highcharts.ChartLoadCallbackFunction}\n     * @context   Highcharts.Chart\n     * @apioption chart.events.load\n     */\n    /**\n     * Fires when the chart is redrawn, either after a call to\n     * `chart.redraw()` or after an axis, series or point is modified with\n     * the `redraw` option set to `true`. One parameter, `event`, is passed\n     * to the function, containing common event information.\n     *\n     * @sample {highcharts} highcharts/chart/events-redraw/\n     *         Alert on chart redraw\n     * @sample {highcharts} highcharts/chart/events-render/\n     *         Load vs Redraw vs Render\n     * @sample {highstock} stock/chart/events-redraw/\n     *         Alert on chart redraw when adding a series or moving the\n     *         zoomed range\n     * @sample {highmaps} maps/chart/events-redraw/\n     *         Set subtitle on chart redraw\n     *\n     * @type      {Highcharts.ChartRedrawCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Chart\n     * @apioption chart.events.redraw\n     */\n    /**\n     * Fires after initial load of the chart (directly after the `load`\n     * event), and after each redraw (directly after the `redraw` event).\n     *\n     * @sample {highcharts} highcharts/chart/events-render/\n     *         Load vs Redraw vs Render\n     *\n     * @type      {Highcharts.ChartRenderCallbackFunction}\n     * @since     5.0.7\n     * @context   Highcharts.Chart\n     * @apioption chart.events.render\n     */\n    /**\n     * Fires when an area of the chart has been selected. Selection is\n     * enabled by setting the chart's zoomType. One parameter, `event`, is\n     * passed to the function, containing common event information. The\n     * default action for the selection event is to zoom the chart to the\n     * selected area. It can be prevented by calling\n     * `event.preventDefault()` or return false.\n     *\n     * Information on the selected area can be found through `event.xAxis`\n     * and `event.yAxis`, which are arrays containing the axes of each\n     * dimension and each axis' min and max values. The primary axes are\n     * `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n     * datetime axis is milliseconds since 1970-01-01 00:00:00.\n     *\n     * ```js\n     * selection: function(event) {\n     *     // log the min and max of the primary, datetime x-axis\n     *     console.log(\n     *         Highcharts.dateFormat(\n     *             '%Y-%m-%d %H:%M:%S',\n     *             event.xAxis[0].min\n     *         ),\n     *         Highcharts.dateFormat(\n     *             '%Y-%m-%d %H:%M:%S',\n     *             event.xAxis[0].max\n     *         )\n     *     );\n     *     // log the min and max of the y axis\n     *     console.log(event.yAxis[0].min, event.yAxis[0].max);\n     * }\n     * ```\n     *\n     * @sample {highcharts} highcharts/chart/events-selection/\n     *         Report on selection and reset\n     * @sample {highcharts} highcharts/chart/events-selection-points/\n     *         Select a range of points through a drag selection\n     * @sample {highstock} stock/chart/events-selection/\n     *         Report on selection and reset\n     * @sample {highstock} highcharts/chart/events-selection-points/\n     *         Select a range of points through a drag selection\n     *         (Highcharts)\n     *\n     * @type      {Highcharts.ChartSelectionCallbackFunction}\n     * @apioption chart.events.selection\n     */\n    /**\n     * The margin between the outer edge of the chart and the plot area.\n     * The numbers in the array designate top, right, bottom and left\n     * respectively. Use the options `marginTop`, `marginRight`,\n     * `marginBottom` and `marginLeft` for shorthand setting of one option.\n     *\n     * By default there is no margin. The actual space is dynamically\n     * calculated from the offset of axis labels, axis title, title,\n     * subtitle and legend in addition to the `spacingTop`, `spacingRight`,\n     * `spacingBottom` and `spacingLeft` options.\n     *\n     * @sample {highcharts} highcharts/chart/margins-zero/\n     *         Zero margins\n     * @sample {highstock} stock/chart/margin-zero/\n     *         Zero margins\n     *\n     * @type      {number|Array<number>}\n     * @apioption chart.margin\n     */\n    /**\n     * The margin between the bottom outer edge of the chart and the plot\n     * area. Use this to set a fixed pixel value for the margin as opposed\n     * to the default dynamic margin. See also `spacingBottom`.\n     *\n     * @sample {highcharts} highcharts/chart/marginbottom/\n     *         100px bottom margin\n     * @sample {highstock} stock/chart/marginbottom/\n     *         100px bottom margin\n     * @sample {highmaps} maps/chart/margin/\n     *         100px margins\n     *\n     * @type      {number}\n     * @since     2.0\n     * @apioption chart.marginBottom\n     */\n    /**\n     * The margin between the left outer edge of the chart and the plot\n     * area. Use this to set a fixed pixel value for the margin as opposed\n     * to the default dynamic margin. See also `spacingLeft`.\n     *\n     * @sample {highcharts} highcharts/chart/marginleft/\n     *         150px left margin\n     * @sample {highstock} stock/chart/marginleft/\n     *         150px left margin\n     * @sample {highmaps} maps/chart/margin/\n     *         100px margins\n     *\n     * @type      {number}\n     * @since     2.0\n     * @apioption chart.marginLeft\n     */\n    /**\n     * The margin between the right outer edge of the chart and the plot\n     * area. Use this to set a fixed pixel value for the margin as opposed\n     * to the default dynamic margin. See also `spacingRight`.\n     *\n     * @sample {highcharts} highcharts/chart/marginright/\n     *         100px right margin\n     * @sample {highstock} stock/chart/marginright/\n     *         100px right margin\n     * @sample {highmaps} maps/chart/margin/\n     *         100px margins\n     *\n     * @type      {number}\n     * @since     2.0\n     * @apioption chart.marginRight\n     */\n    /**\n     * The margin between the top outer edge of the chart and the plot area.\n     * Use this to set a fixed pixel value for the margin as opposed to\n     * the default dynamic margin. See also `spacingTop`.\n     *\n     * @sample {highcharts} highcharts/chart/margintop/ 100px top margin\n     * @sample {highstock} stock/chart/margintop/\n     *         100px top margin\n     * @sample {highmaps} maps/chart/margin/\n     *         100px margins\n     *\n     * @type      {number}\n     * @since     2.0\n     * @apioption chart.marginTop\n     */\n    /**\n     * Callback function to override the default function that formats all\n     * the numbers in the chart. Returns a string with the formatted number.\n     *\n     * @sample highcharts/members/highcharts-numberformat\n     *      Arabic digits in Highcharts\n     * @type {Highcharts.NumberFormatterCallbackFunction}\n     * @since 8.0.0\n     * @apioption chart.numberFormatter\n     */\n    /**\n     * When a chart with an x and a y-axis is rendered, we first pre-render the\n     * labels of both in order to measure them. Then, if either of the axis\n     * labels take up so much space that it significantly affects the length of\n     * the other axis, we repeat the process.\n     *\n     * By default we stop at two axis layout runs, but it may be that the second\n     * run also alter the space required by either axis, for example if it\n     * causes the labels to rotate. In this situation, a subsequent redraw of\n     * the chart may cause the tick and label placement to change for apparently\n     * no reason.\n     *\n     * Use the `axisLayoutRuns` option to set the maximum allowed number of\n     * repetitions. But keep in mind that the default value of 2 is set because\n     * every run costs performance time.\n     *\n     * **Note:** Changing that option to higher than the default might decrease\n     * performance significantly, especially with bigger sets of data.\n     *\n     * @type      {number}\n     * @default   2\n     * @since     11.3.0\n     * @apioption chart.axisLayoutRuns\n     */\n    /**\n     * Allows setting a key to switch between zooming and panning. Can be\n     * one of `alt`, `ctrl`, `meta` (the command key on Mac and Windows\n     * key on Windows) or `shift`. The keys are mapped directly to the key\n     * properties of the click event argument (`event.altKey`,\n     * `event.ctrlKey`, `event.metaKey` and `event.shiftKey`).\n     *\n     * @type       {string}\n     * @since      4.0.3\n     * @product    highcharts gantt\n     * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n     * @apioption  chart.panKey\n     */\n    /**\n     * Allow panning in a chart. Best used with [panKey](#chart.panKey)\n     * to combine zooming and panning.\n     *\n     * On touch devices, when the [tooltip.followTouchMove](\n     * #tooltip.followTouchMove) option is `true` (default), panning\n     * requires two fingers. To allow panning with one finger, set\n     * `followTouchMove` to `false`.\n     *\n     * @sample  {highcharts} highcharts/chart/pankey/ Zooming and panning\n     * @sample  {highstock} stock/chart/panning/ Zooming and xy panning\n     */\n    panning: {\n        /**\n         * Enable or disable chart panning.\n         *\n         * @type      {boolean}\n         * @default   {highcharts} false\n         * @default   {highstock|highmaps} true\n         */\n        enabled: false,\n        /**\n         * Decides in what dimensions the user can pan the chart. Can be\n         * one of `x`, `y`, or `xy`.\n         *\n         * When this option is set to `y` or `xy`, [yAxis.startOnTick](#yAxis.startOnTick)\n         * and [yAxis.endOnTick](#yAxis.endOnTick) are overwritten to `false`.\n         *\n         * @sample {highcharts} highcharts/chart/panning-type\n         *         Zooming and xy panning\n         *\n         * @declare    Highcharts.OptionsChartPanningTypeValue\n         * @type       {string}\n         * @validvalue [\"x\", \"y\", \"xy\"]\n         * @default    {highcharts|highstock} x\n         * @product    highcharts highstock gantt\n         */\n        type: 'x'\n    },\n    /**\n     * Equivalent to [zoomType](#chart.zoomType), but for multitouch\n     * gestures only. By default, the `pinchType` is the same as the\n     * `zoomType` setting. However, pinching can be enabled separately in\n     * some cases, for example in stock charts where a mouse drag pans the\n     * chart, while pinching is enabled. When [tooltip.followTouchMove](\n     * #tooltip.followTouchMove) is true, pinchType only applies to\n     * two-finger touches.\n     *\n     * @type       {string}\n     * @default    {highcharts} undefined\n     * @default    {highstock} undefined\n     * @since      3.0\n     * @product    highcharts highstock gantt\n     * @deprecated\n     * @validvalue [\"x\", \"y\", \"xy\"]\n     * @apioption  chart.pinchType\n     */\n    /**\n     * Whether to apply styled mode. When in styled mode, no presentational\n     * attributes or CSS are applied to the chart SVG. Instead, CSS rules\n     * are required to style the chart. The default style sheet is\n     * available from `https://code.highcharts.com/css/highcharts.css`.\n     *\n     * [Read more in the docs](https://www.highcharts.com/docs/chart-design-and-style/style-by-css)\n     * on what classes and variables are available.\n     *\n     * @sample highcharts/css/colors\n     *         Color theming with CSS\n     * @sample highcharts/css/prefers-color-scheme\n     *         Dynamic theme based on system settings\n     * @type       {boolean}\n     * @default    false\n     * @since      7.0\n     * @apioption  chart.styledMode\n     */\n    styledMode: false,\n    /**\n     * The corner radius of the outer chart border.\n     *\n     * @sample {highcharts} highcharts/chart/borderradius/\n     *         20px radius\n     * @sample {highstock} stock/chart/border/\n     *         10px radius\n     * @sample {highmaps} maps/chart/border/\n     *         Border options\n     *\n     */\n    borderRadius: 0,\n    /**\n     * In styled mode, this sets how many colors the class names\n     * should rotate between. With ten colors, series (or points) are\n     * given class names like `highcharts-color-0`, `highcharts-color-1`\n     * [...] `highcharts-color-9`. The equivalent in non-styled mode\n     * is to set colors using the [colors](#colors) setting.\n     *\n     * @since      5.0.0\n     */\n    colorCount: 10,\n    /**\n     * By default, (because of memory and performance reasons) the chart does\n     * not copy the data but keeps it as a reference. In some cases, this might\n     * result in mutating the original data source. In order to prevent that,\n     * set that property to false. Please note that changing that might decrease\n     * performance, especially with bigger sets of data.\n     *\n     * @type       {boolean}\n     * @since 10.1.0\n     */\n    allowMutatingData: true,\n    /**\n     * If true, the axes will scale to the remaining visible series once\n     * one series is hidden. If false, hiding and showing a series will\n     * not affect the axes or the other series. For stacks, once one series\n     * within the stack is hidden, the rest of the stack will close in\n     * around it even if the axis is not affected.\n     *\n     * @sample {highcharts} highcharts/chart/ignorehiddenseries-true/\n     *         True by default\n     * @sample {highcharts} highcharts/chart/ignorehiddenseries-false/\n     *         False\n     * @sample {highcharts} highcharts/chart/ignorehiddenseries-true-stacked/\n     *         True with stack\n     * @sample {highstock} stock/chart/ignorehiddenseries-true/\n     *         True by default\n     * @sample {highstock} stock/chart/ignorehiddenseries-false/\n     *         False\n     *\n     * @since   1.2.0\n     * @product highcharts highstock gantt\n     */\n    ignoreHiddenSeries: true,\n    /**\n     * Whether to invert the axes so that the x axis is vertical and y axis\n     * is horizontal. When `true`, the x axis is [reversed](#xAxis.reversed)\n     * by default.\n     *\n     * @productdesc {highcharts}\n     * If a bar series is present in the chart, it will be inverted\n     * automatically. Inverting the chart doesn't have an effect if there\n     * are no cartesian series in the chart.\n     *\n     * @sample {highcharts} highcharts/chart/inverted/\n     *         Inverted line\n     * @sample {highstock} stock/navigator/inverted/\n     *         Inverted stock chart\n     *\n     * @type      {boolean}\n     * @default   false\n     * @product   highcharts highstock gantt\n     * @apioption chart.inverted\n     */\n    /**\n     * The distance between the outer edge of the chart and the content,\n     * like title or legend, or axis title and labels if present. The\n     * numbers in the array designate top, right, bottom and left\n     * respectively. Use the options spacingTop, spacingRight, spacingBottom\n     * and spacingLeft options for shorthand setting of one option.\n     *\n     * @type    {Array<number>}\n     * @see     [chart.margin](#chart.margin)\n     * @default [10, 10, 15, 10]\n     * @since   3.0.6\n     */\n    spacing: [10, 10, 15, 10],\n    /**\n     * The button that appears after a selection zoom, allowing the user\n     * to reset zoom. This option is deprecated in favor of\n     * [zooming](#chart.zooming).\n     *\n     * @since      2.2\n     * @deprecated 10.2.1\n     */\n    resetZoomButton: {\n        /**\n         * What frame the button placement should be related to. Can be\n         * either `plotBox` or `spacingBox`.\n         *\n         * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n         *         Relative to the chart\n         * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n         *         Relative to the chart\n         *\n         * @type      {Highcharts.ButtonRelativeToValue}\n         * @apioption chart.resetZoomButton.relativeTo\n         */\n        /**\n         * A collection of attributes for the button. The object takes SVG\n         * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n         * border radius. The theme also supports `style`, a collection of\n         * CSS properties for the text. Equivalent attributes for the hover\n         * state are given in `theme.states.hover`.\n         *\n         * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n         *         Theming the button\n         * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n         *         Theming the button\n         *\n         * @type {Highcharts.SVGAttributes}\n         */\n        theme: {\n        /**\n         * The z-index of the button.\n         *\n         * @type {number}\n         * @apioption chart.resetZoomButton.theme.zIndex\n         */\n        },\n        /**\n         * The position of the button.\n         *\n         * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n         *         Above the plot area\n         * @sample {highstock} highcharts/chart/resetzoombutton-position/\n         *         Above the plot area\n         * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n         *         Above the plot area\n         *\n         * @type {Highcharts.AlignObject}\n         */\n        position: {\n        /**\n         * The horizontal alignment of the button.\n         *\n         * @type {number}\n         * @apioption chart.resetZoomButton.position.align\n         */\n        /**\n         * The horizontal offset of the button.\n         *\n         * @type {number}\n         * @apioption chart.resetZoomButton.position.x\n         */\n        /**\n         * The vertical alignment of the button.\n         *\n         * @type      {Highcharts.VerticalAlignValue}\n         * @apioption chart.resetZoomButton.position.verticalAlign\n         */\n        /**\n         * The vertical offset of the button.\n         *\n         * @type {number}\n         * @apioption chart.resetZoomButton.position.y\n         */\n        }\n    },\n    /**\n     * The pixel width of the plot area border.\n     *\n     * @sample {highcharts} highcharts/chart/plotborderwidth/\n     *         1px border\n     * @sample {highstock} stock/chart/plotborder/\n     *         2px border\n     * @sample {highmaps} maps/chart/plotborder/\n     *         Plot border options\n     *\n     * @type      {number}\n     * @default   0\n     * @apioption chart.plotBorderWidth\n     */\n    /**\n     * Whether to apply a drop shadow to the plot area. Requires that\n     * plotBackgroundColor be set. The shadow can be an object configuration\n     * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n     *\n     * @sample {highcharts} highcharts/chart/plotshadow/\n     *         Plot shadow\n     * @sample {highstock} stock/chart/plotshadow/\n     *         Plot shadow\n     * @sample {highmaps} maps/chart/plotborder/\n     *         Plot border options\n     *\n     * @type      {boolean|Highcharts.ShadowOptionsObject}\n     * @default   false\n     * @apioption chart.plotShadow\n     */\n    /**\n     * When true, cartesian charts like line, spline, area and column are\n     * transformed into the polar coordinate system. This produces _polar\n     * charts_, also known as _radar charts_.\n     *\n     * @sample {highcharts} highcharts/demo/polar/\n     *         Polar chart\n     * @sample {highcharts} highcharts/demo/polar-wind-rose/\n     *         Wind rose, stacked polar column chart\n     * @sample {highcharts} highcharts/demo/polar-spider/\n     *         Spider web chart\n     * @sample {highcharts} highcharts/parallel-coordinates/polar/\n     *         Star plot, multivariate data in a polar chart\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     2.3.0\n     * @product   highcharts\n     * @requires  highcharts-more\n     * @apioption chart.polar\n     */\n    /**\n     * Whether to reflow the chart to fit the width of the container div\n     * on resizing the window.\n     *\n     * @sample {highcharts} highcharts/chart/reflow-true/\n     *         True by default\n     * @sample {highcharts} highcharts/chart/reflow-false/\n     *         False\n     * @sample {highstock} stock/chart/reflow-true/\n     *         True by default\n     * @sample {highstock} stock/chart/reflow-false/\n     *         False\n     * @sample {highmaps} maps/chart/reflow-true/\n     *         True by default\n     * @sample {highmaps} maps/chart/reflow-false/\n     *         False\n     *\n     * @since     2.1\n     */\n    reflow: true,\n    /**\n     * The HTML element where the chart will be rendered. If it is a string,\n     * the element by that id is used. The HTML element can also be passed\n     * by direct reference, or as the first argument of the chart\n     * constructor, in which case the option is not needed.\n     *\n     * @sample {highcharts} highcharts/chart/reflow-true/\n     *         String\n     * @sample {highcharts} highcharts/chart/renderto-object/\n     *         Object reference\n     * @sample {highstock} stock/chart/renderto-string/\n     *         String\n     * @sample {highstock} stock/chart/renderto-object/\n     *         Object reference\n     *\n     * @type      {string|Highcharts.HTMLDOMElement}\n     * @apioption chart.renderTo\n     */\n    /**\n     * The background color of the marker square when selecting (zooming\n     * in on) an area of the chart.\n     *\n     * @see In styled mode, the selection marker fill is set with the\n     *      `.highcharts-selection-marker` class.\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default   rgba(51,92,173,0.25)\n     * @since     2.1.7\n     * @apioption chart.selectionMarkerFill\n     */\n    /**\n     * Whether to apply a drop shadow to the global series group. This causes\n     * all the series to have the same shadow. Contrary to the `series.shadow`\n     * option, this prevents items from casting shadows on each other, like for\n     * others series in a stack. The shadow can be an object configuration\n     * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n     *\n     * @sample highcharts/chart/seriesgroupshadow/ Shadow\n     *\n     * @type      {boolean|Highcharts.ShadowOptionsObject}\n     * @default   false\n     * @apioption chart.shadow\n     */\n    /**\n     * Whether to apply a drop shadow to the outer chart area. Requires\n     * that backgroundColor be set. The shadow can be an object\n     * configuration containing `color`, `offsetX`, `offsetY`, `opacity` and\n     * `width`.\n     *\n     * @sample {highcharts} highcharts/chart/shadow/\n     *         Shadow\n     * @sample {highstock} stock/chart/shadow/\n     *         Shadow\n     * @sample {highmaps} maps/chart/border/\n     *         Chart border and shadow\n     *\n     * @type      {boolean|Highcharts.ShadowOptionsObject}\n     * @default   false\n     * @apioption chart.shadow\n     */\n    /**\n     * Whether to show the axes initially. This only applies to empty charts\n     * where series are added dynamically, as axes are automatically added\n     * to cartesian series.\n     *\n     * @sample {highcharts} highcharts/chart/showaxes-false/\n     *         False by default\n     * @sample {highcharts} highcharts/chart/showaxes-true/\n     *         True\n     *\n     * @type      {boolean}\n     * @since     1.2.5\n     * @product   highcharts gantt\n     * @apioption chart.showAxes\n     */\n    /**\n     * The space between the bottom edge of the chart and the content (plot\n     * area, axis title and labels, title, subtitle or legend in top\n     * position).\n     *\n     * @sample {highcharts} highcharts/chart/spacingbottom/\n     *         Spacing bottom set to 100\n     * @sample {highstock} stock/chart/spacingbottom/\n     *         Spacing bottom set to 100\n     * @sample {highmaps} maps/chart/spacing/\n     *         Spacing 100 all around\n     *\n     * @type      {number}\n     * @default   15\n     * @since     2.1\n     * @apioption chart.spacingBottom\n     */\n    /**\n     * The space between the left edge of the chart and the content (plot\n     * area, axis title and labels, title, subtitle or legend in top\n     * position).\n     *\n     * @sample {highcharts} highcharts/chart/spacingleft/\n     *         Spacing left set to 100\n     * @sample {highstock} stock/chart/spacingleft/\n     *         Spacing left set to 100\n     * @sample {highmaps} maps/chart/spacing/\n     *         Spacing 100 all around\n     *\n     * @type      {number}\n     * @default   10\n     * @since     2.1\n     * @apioption chart.spacingLeft\n     */\n    /**\n     * The space between the right edge of the chart and the content (plot\n     * area, axis title and labels, title, subtitle or legend in top\n     * position).\n     *\n     * @sample {highcharts} highcharts/chart/spacingright-100/\n     *         Spacing set to 100\n     * @sample {highcharts} highcharts/chart/spacingright-legend/\n     *         Legend in right position with default spacing\n     * @sample {highstock} stock/chart/spacingright/\n     *         Spacing set to 100\n     * @sample {highmaps} maps/chart/spacing/\n     *         Spacing 100 all around\n     *\n     * @type      {number}\n     * @default   10\n     * @since     2.1\n     * @apioption chart.spacingRight\n     */\n    /**\n     * The space between the top edge of the chart and the content (plot\n     * area, axis title and labels, title, subtitle or legend in top\n     * position).\n     *\n     * @sample {highcharts} highcharts/chart/spacingtop-100/\n     *         A top spacing of 100\n     * @sample {highcharts} highcharts/chart/spacingtop-10/\n     *         Floating chart title makes the plot area align to the default\n     *         spacingTop of 10.\n     * @sample {highstock} stock/chart/spacingtop/\n     *         A top spacing of 100\n     * @sample {highmaps} maps/chart/spacing/\n     *         Spacing 100 all around\n     *\n     * @type      {number}\n     * @default   10\n     * @since     2.1\n     * @apioption chart.spacingTop\n     */\n    /**\n     * Additional CSS styles to apply inline to the container `div` and the root\n     * SVG.\n     *\n     * According to the CSS syntax documentation, it is recommended to quote\n     * font family names that contain white space, digits, or punctuation\n     * characters other than hyphens. In such cases, wrap the fontFamily\n     * name as follows: `fontFamily: '\"Font name\"'`.\n     *\n     * Since v11, the root font size is 1rem by default, and all child element\n     * are given a relative `em` font size by default. This allows implementers\n     * to control all the chart's font sizes by only setting the root level.\n     *\n     * @see    In styled mode, general chart styles can be set with the\n     *         `.highcharts-root` class.\n     * @sample {highcharts} highcharts/chart/style-serif-font/\n     *         Using a serif type font\n     * @sample {highcharts} highcharts/chart/style-special-font/\n     *         Using a font with special character in name\n     * @sample {highcharts} highcharts/members/relative-font-size/\n     *         Relative font sizes\n     * @sample {highcharts} highcharts/css/em/\n     *         Styled mode with relative font sizes\n     * @sample {highstock} stock/chart/style/\n     *         Using a serif type font\n     * @sample {highmaps} maps/chart/style-serif-font/\n     *         Using a serif type font\n     *\n     * @type      {Highcharts.CSSObject}\n     * @default   {\"fontFamily\": Helvetica, Arial, sans-serif\",\"fontSize\":\"1rem\"}\n     * @apioption chart.style\n     */\n    /**\n     * The default series type for the chart. Can be any of the chart types\n     * listed under [plotOptions](#plotOptions) and [series](#series) or can\n     * be a series provided by an additional module.\n     *\n     * In TypeScript this option has no effect in sense of typing and\n     * instead the `type` option must always be set in the series.\n     *\n     * @sample {highcharts} highcharts/chart/type-bar/\n     *         Bar\n     * @sample {highstock} stock/chart/type/\n     *         Areaspline\n     * @sample {highmaps} maps/chart/type-mapline/\n     *         Mapline\n     *\n     * @type       {string}\n     * @default    {highcharts} line\n     * @default    {highstock} line\n     * @default    {highmaps} map\n     * @since      2.1.0\n     * @apioption  chart.type\n     */\n    type: 'line',\n    /**\n     * Decides in what dimensions the user can zoom by dragging the mouse.\n     * Can be one of `x`, `y` or `xy`.\n     *\n     * @see [panKey](#chart.panKey)\n     *\n     * @sample {highcharts} highcharts/chart/zoomtype-none/\n     *         None by default\n     * @sample {highcharts} highcharts/chart/zoomtype-x/\n     *         X\n     * @sample {highcharts} highcharts/chart/zoomtype-y/\n     *         Y\n     * @sample {highcharts} highcharts/chart/zoomtype-xy/\n     *         Xy\n     * @sample {highcharts} highcharts/chart/zoomtype-polar/\n     *         Zoom on polar chart\n     * @sample {highstock} stock/demo/basic-line/\n     *         None by default\n     * @sample {highstock} stock/chart/zoomtype-x/\n     *         X\n     * @sample {highstock} stock/chart/zoomtype-y/\n     *         Y\n     * @sample {highstock} stock/chart/zoomtype-xy/\n     *         Xy\n     * @sample {highmaps} maps/chart/zoomtype-xy/\n     *         Map with selection zoom\n     *\n     * @type       {string}\n     * @validvalue [\"x\", \"y\", \"xy\"]\n     * @deprecated\n     * @apioption  chart.zoomType\n     */\n    /**\n     * Enables zooming by a single touch, in combination with\n     * [chart.zoomType](#chart.zoomType). When enabled, two-finger pinch\n     * will still work as set up by [chart.pinchType](#chart.pinchType).\n     * However, `zoomBySingleTouch` will interfere with touch-dragging the\n     * chart to read the tooltip. And especially when vertical zooming is\n     * enabled, it will make it hard to scroll vertically on the page.\n     * @since      9.0.0\n     * @sample     highcharts/chart/zoombysingletouch\n     *             Zoom by single touch enabled, with buttons to toggle\n     * @product    highcharts highstock gantt\n     * @deprecated\n     */\n    /**\n     * Chart zooming options.\n     * @since 10.2.1\n     */\n    zooming: {\n        /**\n         * Equivalent to [type](#chart.zooming.type), but for multitouch\n         * gestures only. By default, the `pinchType` is the same as the\n         * `type` setting. However, pinching can be enabled separately in\n         * some cases, for example in stock charts where a mouse drag pans the\n         * chart, while pinching is enabled. When [tooltip.followTouchMove](\n         * #tooltip.followTouchMove) is true, pinchType only applies to\n         * two-finger touches.\n         *\n         * @type       {string}\n         * @default    {highcharts} undefined\n         * @default    {highstock} x\n         * @product    highcharts highstock gantt\n         * @validvalue [\"x\", \"y\", \"xy\"]\n         * @apioption  chart.zooming.pinchType\n         */\n        /**\n         * Decides in what dimensions the user can zoom by dragging the mouse.\n         * Can be one of `x`, `y` or `xy`.\n         *\n         * @declare    Highcharts.OptionsChartZoomingTypeValue\n         * @type       {string}\n         * @default    {highcharts} undefined\n         * @product    highcharts highstock gantt\n         * @validvalue [\"x\", \"y\", \"xy\"]\n         * @apioption  chart.zooming.type\n         */\n        /**\n         * Set a key to hold when dragging to zoom the chart. This is useful to\n         * avoid zooming while moving points. Should be set different than\n         * [chart.panKey](#chart.panKey).\n         *\n         * @type       {string}\n         * @default    {highcharts} undefined\n         * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n         * @requires   modules/draggable-points\n         * @apioption  chart.zooming.key\n         */\n        /**\n         * Enables zooming by a single touch, in combination with\n         * [chart.zooming.type](#chart.zooming.type). When enabled, two-finger\n         * pinch will still work as set up by [chart.zooming.pinchType]\n         * (#chart.zooming.pinchType). However, `singleTouch` will interfere\n         * with touch-dragging the chart to read the tooltip. And especially\n         * when vertical zooming is enabled, it will make it hard to scroll\n         * vertically on the page.\n         *\n         * @sample  highcharts/chart/zoombysingletouch\n         *          Zoom by single touch enabled, with buttons to toggle\n         *\n         * @product highcharts highstock gantt\n         */\n        singleTouch: false,\n        /**\n         * The button that appears after a selection zoom, allowing the user\n         * to reset zoom.\n         */\n        resetButton: {\n            /**\n             * What frame the button placement should be related to. Can be\n             * either `plotBox` or `spacingBox`.\n             *\n             * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n             *         Relative to the chart\n             * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n             *         Relative to the chart\n             *\n             * @type      {Highcharts.ButtonRelativeToValue}\n             * @default   plot\n             * @apioption chart.zooming.resetButton.relativeTo\n             */\n            /**\n             * A collection of attributes for the button. The object takes SVG\n             * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n             * border radius. The theme also supports `style`, a collection of\n             * CSS properties for the text. Equivalent attributes for the hover\n             * state are given in `theme.states.hover`.\n             *\n             * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n             *         Theming the button\n             * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n             *         Theming the button\n             *\n             * @type  {Highcharts.SVGAttributes}\n             * @since 10.2.1\n             */\n            theme: {\n                /** @internal */\n                zIndex: 6\n            },\n            /**\n             * The position of the button.\n             *\n             * Note: Adjusting position values might cause overlap with chart\n             * elements. Ensure coordinates do not obstruct other components or\n             * data visibility.\n             *\n             * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n             *         Above the plot area\n             * @sample {highstock} highcharts/chart/resetzoombutton-position/\n             *         Above the plot area\n             * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n             *         Above the plot area\n             *\n             * @type  {Highcharts.AlignObject}\n             * @since 10.2.1\n             */\n            position: {\n                /**\n                 * The horizontal alignment of the button.\n                 */\n                align: 'right',\n                /**\n                 * The horizontal offset of the button.\n                 */\n                x: -10,\n                /**\n                 * The vertical alignment of the button.\n                 *\n                 * @type       {Highcharts.VerticalAlignValue}\n                 * @default    top\n                 * @apioption  chart.zooming.resetButton.position.verticalAlign\n                 */\n                /**\n                 * The vertical offset of the button.\n                 */\n                y: 10\n            }\n        }\n    },\n    /**\n     * An explicit width for the chart. By default (when `null`) the width\n     * is calculated from the offset width of the containing element.\n     *\n     * @sample {highcharts} highcharts/chart/width/\n     *         800px wide\n     * @sample {highstock} stock/chart/width/\n     *         800px wide\n     * @sample {highmaps} maps/chart/size/\n     *         Chart with explicit size\n     *\n     * @type {null|number|string}\n     */\n    width: null,\n    /**\n     * An explicit height for the chart. If a _number_, the height is\n     * given in pixels. If given a _percentage string_ (for example\n     * `'56%'`), the height is given as the percentage of the actual chart\n     * width. This allows for preserving the aspect ratio across responsive\n     * sizes.\n     *\n     * By default (when `null`) the height is calculated from the offset\n     * height of the containing element, or 400 pixels if the containing\n     * element's height is 0.\n     *\n     * @sample {highcharts} highcharts/chart/height/\n     *         Forced 200px height\n     * @sample {highstock} stock/chart/height/\n     *         300px height\n     * @sample {highmaps} maps/chart/size/\n     *         Chart with explicit size\n     * @sample highcharts/chart/height-percent/\n     *         Highcharts with percentage height\n     * @sample highcharts/chart/height-inherited/\n     *         Chart with inherited height\n     *\n     * @type {null|number|string}\n     */\n    height: null,\n    /**\n     * The color of the outer chart border.\n     *\n     * @see In styled mode, the stroke is set with the\n     *      `.highcharts-background` class.\n     *\n     * @sample {highcharts} highcharts/chart/bordercolor/\n     *         Brown border\n     * @sample {highstock} stock/chart/border/\n     *         Brown border\n     * @sample {highmaps} maps/chart/border/\n     *         Border options\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    borderColor: \"#334eff\" /* Palette.highlightColor80 */,\n    /**\n     * The pixel width of the outer chart border.\n     *\n     * @see In styled mode, the stroke is set with the\n     *      `.highcharts-background` class.\n     *\n     * @sample {highcharts} highcharts/chart/borderwidth/\n     *         5px border\n     * @sample {highstock} stock/chart/border/\n     *         2px border\n     * @sample {highmaps} maps/chart/border/\n     *         Border options\n     *\n     * @type      {number}\n     * @default   0\n     * @apioption chart.borderWidth\n     */\n    /**\n     * The background color or gradient for the outer chart area.\n     *\n     * @see In styled mode, the background is set with the\n     *      `.highcharts-background` class.\n     *\n     * @sample {highcharts} highcharts/chart/backgroundcolor-color/\n     *         Color\n     * @sample {highcharts} highcharts/chart/backgroundcolor-gradient/\n     *         Gradient\n     * @sample {highstock} stock/chart/backgroundcolor-color/\n     *         Color\n     * @sample {highstock} stock/chart/backgroundcolor-gradient/\n     *         Gradient\n     * @sample {highmaps} maps/chart/backgroundcolor-color/\n     *         Color\n     * @sample {highmaps} maps/chart/backgroundcolor-gradient/\n     *         Gradient\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    backgroundColor: \"#ffffff\" /* Palette.backgroundColor */,\n    /**\n     * The background color or gradient for the plot area.\n     *\n     * @see In styled mode, the plot background is set with the\n     *      `.highcharts-plot-background` class.\n     *\n     * @sample {highcharts} highcharts/chart/plotbackgroundcolor-color/\n     *         Color\n     * @sample {highcharts} highcharts/chart/plotbackgroundcolor-gradient/\n     *         Gradient\n     * @sample {highstock} stock/chart/plotbackgroundcolor-color/\n     *         Color\n     * @sample {highstock} stock/chart/plotbackgroundcolor-gradient/\n     *         Gradient\n     * @sample {highmaps} maps/chart/plotbackgroundcolor-color/\n     *         Color\n     * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n     *         Gradient\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @apioption chart.plotBackgroundColor\n     */\n    /**\n     * The URL for an image to use as the plot background. To set an image\n     * as the background for the entire chart, set a CSS background image\n     * to the container element. Note that for the image to be applied to\n     * exported charts, its URL needs to be accessible by the export server.\n     *\n     * @see In styled mode, a plot background image can be set with the\n     *      `.highcharts-plot-background` class and a [custom pattern](\n     *      https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n     *\n     * @sample {highcharts} highcharts/chart/plotbackgroundimage/\n     *         Skies\n     * @sample {highstock} stock/chart/plotbackgroundimage/\n     *         Skies\n     *\n     * @type      {string}\n     * @apioption chart.plotBackgroundImage\n     */\n    /**\n     * The color of the inner chart or plot area border.\n     *\n     * @see In styled mode, a plot border stroke can be set with the\n     *      `.highcharts-plot-border` class.\n     *\n     * @sample {highcharts} highcharts/chart/plotbordercolor/\n     *         Blue border\n     * @sample {highstock} stock/chart/plotborder/\n     *         Blue border\n     * @sample {highmaps} maps/chart/plotborder/\n     *         Plot border options\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    plotBorderColor: \"#cccccc\" /* Palette.neutralColor20 */\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default ChartDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from './Utilities.js';\nconst { addEvent, isFunction, objectEach, removeEvent } = U;\n/* *\n *\n *  Class Namespace\n *\n * */\nvar Foundation;\n(function (Foundation) {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Register event options. If an event handler is set on the options, it\n     * should be subject to Chart.update, Axis.update and Series.update. This is\n     * contrary to general handlers that are set directly using addEvent either\n     * on the class or on the instance. #6538, #6943, #10861.\n     * @private\n     */\n    function registerEventOptions(component, options) {\n        // A lookup over those events that are added by _options_ (not\n        // programmatically). These are updated through .update()\n        component.eventOptions = component.eventOptions || {};\n        // Register event listeners\n        objectEach(options.events, function (event, eventType) {\n            // If event does not exist, or is changed by the .update()\n            // function\n            if (component.eventOptions[eventType] !== event) {\n                // Remove existing if set by option\n                if (component.eventOptions[eventType]) {\n                    removeEvent(component, eventType, component.eventOptions[eventType]);\n                    delete component.eventOptions[eventType];\n                }\n                if (isFunction(event)) {\n                    component.eventOptions[eventType] = event;\n                    addEvent(component, eventType, event, {\n                        order: 0 // #14080 fire those events as firsts\n                    });\n                }\n            }\n        });\n    }\n    Foundation.registerEventOptions = registerEventOptions;\n})(Foundation || (Foundation = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Foundation;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Namespace\n *\n * */\n/**\n * Shared Highcharts properties.\n * @private\n */\nvar Globals;\n(function (Globals) {\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '@product.version@', Globals.win = (typeof window !== 'undefined' ?\n        window :\n        {}), // eslint-disable-line node/no-unsupported-features/es-builtins\n    Globals.doc = Globals.win.document, Globals.svg = (Globals.doc &&\n        Globals.doc.createElementNS &&\n        !!Globals.doc.createElementNS(Globals.SVG_NS, 'svg').createSVGRect), Globals.userAgent = (Globals.win.navigator && Globals.win.navigator.userAgent) || '', Globals.isChrome = Globals.win.chrome, Globals.isFirefox = Globals.userAgent.indexOf('Firefox') !== -1, Globals.isMS = /(edge|msie|trident)/i.test(Globals.userAgent) && !Globals.win.opera, Globals.isSafari = !Globals.isChrome && Globals.userAgent.indexOf('Safari') !== -1, Globals.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(Globals.userAgent), Globals.isWebKit = Globals.userAgent.indexOf('AppleWebKit') !== -1, Globals.deg2rad = Math.PI * 2 / 360, Globals.hasBidiBug = (Globals.isFirefox &&\n        parseInt(Globals.userAgent.split('Firefox/')[1], 10) < 4 // Issue #38\n    ), Globals.marginNames = [\n        'plotTop',\n        'marginRight',\n        'marginBottom',\n        'plotLeft'\n    ], Globals.noop = function () { }, Globals.supportsPassiveEvents = (function () {\n        // Checks whether the browser supports passive events, (#11353).\n        let supportsPassive = false;\n        // Object.defineProperty doesn't work on IE as well as passive\n        // events - instead of using polyfill, we can exclude IE totally.\n        if (!Globals.isMS) {\n            const opts = Object.defineProperty({}, 'passive', {\n                get: function () {\n                    supportsPassive = true;\n                }\n            });\n            if (Globals.win.addEventListener && Globals.win.removeEventListener) {\n                Globals.win.addEventListener('testPassive', Globals.noop, opts);\n                Globals.win.removeEventListener('testPassive', Globals.noop, opts);\n            }\n        }\n        return supportsPassive;\n    }());\n    /**\n     * An array containing the current chart objects in the page. A chart's\n     * position in the array is preserved throughout the page's lifetime. When\n     * a chart is destroyed, the array item becomes `undefined`.\n     *\n     * @name Highcharts.charts\n     * @type {Array<Highcharts.Chart|undefined>}\n     */\n    Globals.charts = [];\n    /**\n     * A shared registry between all bundles to keep track of applied\n     * compositions.\n     * @private\n     */\n    Globals.composed = [];\n    /**\n     * A hook for defining additional date format specifiers. New\n     * specifiers are defined as key-value pairs by using the\n     * specifier as key, and a function which takes the timestamp as\n     * value. This function returns the formatted portion of the\n     * date.\n     *\n     * @sample highcharts/global/dateformats/\n     *         Adding support for week number\n     *\n     * @name Highcharts.dateFormats\n     * @type {Record<string, Highcharts.TimeFormatCallbackFunction>}\n     */\n    Globals.dateFormats = {};\n    /**\n     * @private\n     * @deprecated\n     * @todo Use only `Core/Series/SeriesRegistry.seriesTypes`\n     */\n    Globals.seriesTypes = {};\n    /**\n     * @private\n     */\n    Globals.symbolSizes = {};\n    /* *\n     *\n     *  Properties\n     *\n     * */\n    // eslint-disable-next-line prefer-const\n    Globals.chartCount = 0;\n})(Globals || (Globals = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Globals;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Theme options that should get applied to the chart. In module mode it\n * might not be possible to change this property because of read-only\n * restrictions, instead use {@link Highcharts.setOptions}.\n *\n * @deprecated\n * @name Highcharts.theme\n * @type {Highcharts.Options}\n */\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../Utilities.js';\nconst { extend, merge, pick } = U;\n/* *\n *\n *  Namespace\n *\n * */\nvar LegendSymbol;\n(function (LegendSymbol) {\n    /* *\n    *\n    *  Functions\n    *\n    * */\n    /**\n     * Draw a line, a point marker and an area in the legend.\n     *\n     * @private\n     * @function Highcharts.LegendSymbolMixin.areaMarker\n     *\n     * @param {Highcharts.Legend} legend\n     * The legend object.\n     */\n    function areaMarker(legend, item) {\n        lineMarker.call(this, legend, item, true);\n    }\n    LegendSymbol.areaMarker = areaMarker;\n    /**\n     * Draw a line and a point marker in the legend.\n     *\n     * @private\n     * @function Highcharts.LegendSymbolMixin.lineMarker\n     *\n     * @param {Highcharts.Legend} legend\n     * The legend object.\n     */\n    function lineMarker(legend, item, hasArea) {\n        const legendItem = this.legendItem = this.legendItem || {}, { chart, options } = this, { baseline = 0, symbolWidth, symbolHeight } = legend, symbol = this.symbol || 'circle', generalRadius = symbolHeight / 2, renderer = chart.renderer, legendItemGroup = legendItem.group, verticalCenter = baseline - Math.round((legend.fontMetrics?.b || symbolHeight) *\n            // Render line and marker slightly higher to make room for the\n            // area\n            (hasArea ? 0.4 : 0.3)), attr = {};\n        let legendSymbol, markerOptions = options.marker, lineSizer = 0;\n        // Draw the line\n        if (!chart.styledMode) {\n            attr['stroke-width'] = Math.min(options.lineWidth || 0, 24);\n            if (options.dashStyle) {\n                attr.dashstyle = options.dashStyle;\n            }\n            else if (options.linecap !== 'square') {\n                attr['stroke-linecap'] = 'round';\n            }\n        }\n        legendItem.line = renderer\n            .path()\n            .addClass('highcharts-graph')\n            .attr(attr)\n            .add(legendItemGroup);\n        if (hasArea) {\n            legendItem.area = renderer\n                .path()\n                .addClass('highcharts-area')\n                .add(legendItemGroup);\n        }\n        if (attr['stroke-linecap']) {\n            lineSizer = Math.min(legendItem.line.strokeWidth(), symbolWidth) / 2;\n        }\n        if (symbolWidth) {\n            const d = [\n                ['M', lineSizer, verticalCenter],\n                ['L', symbolWidth - lineSizer, verticalCenter]\n            ];\n            legendItem.line.attr({ d });\n            legendItem.area?.attr({\n                d: [\n                    ...d,\n                    ['L', symbolWidth - lineSizer, baseline],\n                    ['L', lineSizer, baseline]\n                ]\n            });\n        }\n        // Draw the marker\n        if (markerOptions && markerOptions.enabled !== false && symbolWidth) {\n            // Do not allow the marker to be larger than the symbolHeight\n            let radius = Math.min(pick(markerOptions.radius, generalRadius), generalRadius);\n            // Restrict symbol markers size\n            if (symbol.indexOf('url') === 0) {\n                markerOptions = merge(markerOptions, {\n                    width: symbolHeight,\n                    height: symbolHeight\n                });\n                radius = 0;\n            }\n            legendItem.symbol = legendSymbol = renderer\n                .symbol(symbol, (symbolWidth / 2) - radius, verticalCenter - radius, 2 * radius, 2 * radius, extend({ context: 'legend' }, markerOptions))\n                .addClass('highcharts-point')\n                .add(legendItemGroup);\n            legendSymbol.isMarker = true;\n        }\n    }\n    LegendSymbol.lineMarker = lineMarker;\n    /**\n     * Get the series' symbol in the legend.\n     *\n     * This method should be overridable to create custom symbols through\n     * Highcharts.seriesTypes[type].prototype.drawLegendSymbol.\n     *\n     * @private\n     * @function Highcharts.LegendSymbolMixin.rectangle\n     *\n     * @param {Highcharts.Legend} legend\n     * The legend object\n     *\n     * @param {Highcharts.Point|Highcharts.Series} item\n     * The series (this) or point\n     */\n    function rectangle(legend, item) {\n        const legendItem = item.legendItem || {}, options = legend.options, symbolHeight = legend.symbolHeight, square = options.squareSymbol, symbolWidth = square ? symbolHeight : legend.symbolWidth;\n        legendItem.symbol = this.chart.renderer\n            .rect(square ? (legend.symbolWidth - symbolHeight) / 2 : 0, legend.baseline - symbolHeight + 1, // #3988\n        symbolWidth, symbolHeight, pick(legend.options.symbolRadius, symbolHeight / 2))\n            .addClass('highcharts-point')\n            .attr({\n            zIndex: 3\n        })\n            .add(legendItem.group);\n    }\n    LegendSymbol.rectangle = rectangle;\n})(LegendSymbol || (LegendSymbol = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default LegendSymbol;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../../Globals.js';\nconst { SVG_NS, win } = H;\nimport U from '../../Utilities.js';\nconst { attr, createElement, css, error, isFunction, isString, objectEach, splat } = U;\nconst { trustedTypes } = win;\n/* *\n *\n *  Constants\n *\n * */\n// Create the trusted type policy. This should not be exposed.\nconst trustedTypesPolicy = (trustedTypes &&\n    isFunction(trustedTypes.createPolicy) &&\n    trustedTypes.createPolicy('highcharts', {\n        createHTML: (s) => s\n    }));\nconst emptyHTML = trustedTypesPolicy ?\n    trustedTypesPolicy.createHTML('') :\n    '';\n// IE9 and PhantomJS are only able to parse XML.\nconst hasValidDOMParser = (function () {\n    try {\n        return Boolean(new DOMParser().parseFromString(emptyHTML, 'text/html'));\n    }\n    catch (e) {\n        return false;\n    }\n}());\n/* *\n *\n *  Class\n *\n * */\n/**\n * The AST class represents an abstract syntax tree of HTML or SVG content. It\n * can take HTML as an argument, parse it, optionally transform it to SVG, then\n * perform sanitation before inserting it into the DOM.\n *\n * @class\n * @name Highcharts.AST\n *\n * @param {string|Array<Highcharts.ASTNode>} source\n * Either an HTML string or an ASTNode list to populate the tree.\n */\nclass AST {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    /**\n     * Filter an object of SVG or HTML attributes against the allow list.\n     *\n     * @static\n     *\n     * @function Highcharts.AST#filterUserAttributes\n     *\n     * @param {Highcharts.SVGAttributes} attributes The attributes to filter\n     *\n     * @return {Highcharts.SVGAttributes}\n     * The filtered attributes\n     */\n    static filterUserAttributes(attributes) {\n        objectEach(attributes, (val, key) => {\n            let valid = true;\n            if (AST.allowedAttributes.indexOf(key) === -1) {\n                valid = false;\n            }\n            if (['background', 'dynsrc', 'href', 'lowsrc', 'src']\n                .indexOf(key) !== -1) {\n                valid = isString(val) && AST.allowedReferences.some((ref) => val.indexOf(ref) === 0);\n            }\n            if (!valid) {\n                error(33, false, void 0, {\n                    'Invalid attribute in config': `${key}`\n                });\n                delete attributes[key];\n            }\n            // #17753, < is not allowed in SVG attributes\n            if (isString(val) && attributes[key]) {\n                attributes[key] = val.replace(/</g, '&lt;');\n            }\n        });\n        return attributes;\n    }\n    static parseStyle(style) {\n        return style\n            .split(';')\n            .reduce((styles, line) => {\n            const pair = line.split(':').map((s) => s.trim()), key = pair.shift();\n            if (key && pair.length) {\n                styles[key.replace(/-([a-z])/g, (g) => g[1].toUpperCase())] = pair.join(':'); // #17146\n            }\n            return styles;\n        }, {});\n    }\n    /**\n     * Utility function to set html content for an element by passing in a\n     * markup string. The markup is safely parsed by the AST class to avoid\n     * XSS vulnerabilities. This function should be used instead of setting\n     * `innerHTML` in all cases where the content is not fully trusted.\n     *\n     * @static\n     * @function Highcharts.AST#setElementHTML\n     *\n     * @param {SVGDOMElement|HTMLDOMElement} el\n     * Node to set content of.\n     *\n     * @param {string} html\n     * Markup string\n     */\n    static setElementHTML(el, html) {\n        el.innerHTML = AST.emptyHTML; // Clear previous\n        if (html) {\n            const ast = new AST(html);\n            ast.addToDOM(el);\n        }\n    }\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    // Construct an AST from HTML markup, or wrap an array of existing AST nodes\n    constructor(source) {\n        this.nodes = typeof source === 'string' ?\n            this.parseMarkup(source) : source;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Add the tree defined as a hierarchical JS structure to the DOM\n     *\n     * @function Highcharts.AST#addToDOM\n     *\n     * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} parent\n     * The node where it should be added\n     *\n     * @return {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement}\n     * The inserted node.\n     */\n    addToDOM(parent) {\n        /**\n         * @private\n         * @param {Highcharts.ASTNode} subtree\n         * HTML/SVG definition\n         * @param {Element} [subParent]\n         * parent node\n         * @return {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n         * The inserted node.\n         */\n        function recurse(subtree, subParent) {\n            let ret;\n            splat(subtree).forEach(function (item) {\n                const tagName = item.tagName;\n                const textNode = item.textContent ?\n                    H.doc.createTextNode(item.textContent) :\n                    void 0;\n                // Whether to ignore the AST filtering totally, #15345\n                const bypassHTMLFiltering = AST.bypassHTMLFiltering;\n                let node;\n                if (tagName) {\n                    if (tagName === '#text') {\n                        node = textNode;\n                    }\n                    else if (AST.allowedTags.indexOf(tagName) !== -1 ||\n                        bypassHTMLFiltering) {\n                        const NS = tagName === 'svg' ?\n                            SVG_NS :\n                            (subParent.namespaceURI || SVG_NS);\n                        const element = H.doc.createElementNS(NS, tagName);\n                        const attributes = item.attributes || {};\n                        // Apply attributes from root of AST node, legacy from\n                        // from before TextBuilder\n                        objectEach(item, function (val, key) {\n                            if (key !== 'tagName' &&\n                                key !== 'attributes' &&\n                                key !== 'children' &&\n                                key !== 'style' &&\n                                key !== 'textContent') {\n                                attributes[key] = val;\n                            }\n                        });\n                        attr(element, bypassHTMLFiltering ?\n                            attributes :\n                            AST.filterUserAttributes(attributes));\n                        if (item.style) {\n                            css(element, item.style);\n                        }\n                        // Add text content\n                        if (textNode) {\n                            element.appendChild(textNode);\n                        }\n                        // Recurse\n                        recurse(item.children || [], element);\n                        node = element;\n                    }\n                    else {\n                        error(33, false, void 0, {\n                            'Invalid tagName in config': tagName\n                        });\n                    }\n                }\n                // Add to the tree\n                if (node) {\n                    subParent.appendChild(node);\n                }\n                ret = node;\n            });\n            // Return last node added (on top level it's the only one)\n            return ret;\n        }\n        return recurse(this.nodes, parent);\n    }\n    /**\n     * Parse HTML/SVG markup into AST Node objects. Used internally from the\n     * constructor.\n     *\n     * @private\n     *\n     * @function Highcharts.AST#getNodesFromMarkup\n     *\n     * @param {string} markup The markup string.\n     *\n     * @return {Array<Highcharts.ASTNode>} The parsed nodes.\n     */\n    parseMarkup(markup) {\n        const nodes = [];\n        markup = markup\n            .trim()\n            // The style attribute throws a warning when parsing when CSP is\n            // enabled (#6884), so use an alias and pick it up below\n            // Make all quotation marks parse correctly to DOM (#17627)\n            .replace(/ style=([\"'])/g, ' data-style=$1');\n        let doc;\n        if (hasValidDOMParser) {\n            doc = new DOMParser().parseFromString(trustedTypesPolicy ?\n                trustedTypesPolicy.createHTML(markup) :\n                markup, 'text/html');\n        }\n        else {\n            const body = createElement('div');\n            body.innerHTML = markup;\n            doc = { body };\n        }\n        const appendChildNodes = (node, addTo) => {\n            const tagName = node.nodeName.toLowerCase();\n            // Add allowed tags\n            const astNode = {\n                tagName\n            };\n            if (tagName === '#text') {\n                astNode.textContent = node.textContent || '';\n            }\n            const parsedAttributes = node.attributes;\n            // Add attributes\n            if (parsedAttributes) {\n                const attributes = {};\n                [].forEach.call(parsedAttributes, (attrib) => {\n                    if (attrib.name === 'data-style') {\n                        astNode.style = AST.parseStyle(attrib.value);\n                    }\n                    else {\n                        attributes[attrib.name] = attrib.value;\n                    }\n                });\n                astNode.attributes = attributes;\n            }\n            // Handle children\n            if (node.childNodes.length) {\n                const children = [];\n                [].forEach.call(node.childNodes, (childNode) => {\n                    appendChildNodes(childNode, children);\n                });\n                if (children.length) {\n                    astNode.children = children;\n                }\n            }\n            addTo.push(astNode);\n        };\n        [].forEach.call(doc.body.childNodes, (childNode) => appendChildNodes(childNode, nodes));\n        return nodes;\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\n/**\n * The list of allowed SVG or HTML attributes, used for sanitizing\n * potentially harmful content from the chart configuration before adding to\n * the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedAttributes)\n *\n * @example\n * // Allow a custom, trusted attribute\n * Highcharts.AST.allowedAttributes.push('data-value');\n *\n * @name Highcharts.AST.allowedAttributes\n * @type {Array<string>}\n */\nAST.allowedAttributes = [\n    'alt',\n    'aria-controls',\n    'aria-describedby',\n    'aria-expanded',\n    'aria-haspopup',\n    'aria-hidden',\n    'aria-label',\n    'aria-labelledby',\n    'aria-live',\n    'aria-pressed',\n    'aria-readonly',\n    'aria-roledescription',\n    'aria-selected',\n    'class',\n    'clip-path',\n    'color',\n    'colspan',\n    'cx',\n    'cy',\n    'd',\n    'dx',\n    'dy',\n    'disabled',\n    'fill',\n    'filterUnits',\n    'flood-color',\n    'flood-opacity',\n    'height',\n    'href',\n    'id',\n    'in',\n    'in2',\n    'markerHeight',\n    'markerWidth',\n    'offset',\n    'opacity',\n    'operator',\n    'orient',\n    'padding',\n    'paddingLeft',\n    'paddingRight',\n    'patternUnits',\n    'r',\n    'radius',\n    'refX',\n    'refY',\n    'role',\n    'scope',\n    'slope',\n    'src',\n    'startOffset',\n    'stdDeviation',\n    'stroke',\n    'stroke-linecap',\n    'stroke-width',\n    'style',\n    'tableValues',\n    'result',\n    'rowspan',\n    'summary',\n    'target',\n    'tabindex',\n    'text-align',\n    'text-anchor',\n    'textAnchor',\n    'textLength',\n    'title',\n    'type',\n    'valign',\n    'width',\n    'x',\n    'x1',\n    'x2',\n    'xlink:href',\n    'y',\n    'y1',\n    'y2',\n    'zIndex'\n];\n/**\n * The list of allowed references for referring attributes like `href` and\n * `src`. Attribute values will only be allowed if they start with one of\n * these strings.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedReferences)\n *\n * @example\n * // Allow tel:\n * Highcharts.AST.allowedReferences.push('tel:');\n *\n * @name    Highcharts.AST.allowedReferences\n * @type    {Array<string>}\n */\nAST.allowedReferences = [\n    'https://',\n    'http://',\n    'mailto:',\n    '/',\n    '../',\n    './',\n    '#'\n];\n/**\n * The list of allowed SVG or HTML tags, used for sanitizing potentially\n * harmful content from the chart configuration before adding to the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedTags)\n *\n * @example\n * // Allow a custom, trusted tag\n * Highcharts.AST.allowedTags.push('blink'); // ;)\n *\n * @name    Highcharts.AST.allowedTags\n * @type    {Array<string>}\n */\nAST.allowedTags = [\n    'a',\n    'abbr',\n    'b',\n    'br',\n    'button',\n    'caption',\n    'circle',\n    'clipPath',\n    'code',\n    'dd',\n    'defs',\n    'div',\n    'dl',\n    'dt',\n    'em',\n    'feComponentTransfer',\n    'feComposite',\n    'feDropShadow',\n    'feFlood',\n    'feFuncA',\n    'feFuncB',\n    'feFuncG',\n    'feFuncR',\n    'feGaussianBlur',\n    'feMorphology',\n    'feOffset',\n    'feMerge',\n    'feMergeNode',\n    'filter',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'hr',\n    'i',\n    'img',\n    'li',\n    'linearGradient',\n    'marker',\n    'ol',\n    'p',\n    'path',\n    'pattern',\n    'pre',\n    'rect',\n    'small',\n    'span',\n    'stop',\n    'strong',\n    'style',\n    'sub',\n    'sup',\n    'svg',\n    'table',\n    'text',\n    'textPath',\n    'thead',\n    'title',\n    'tbody',\n    'tspan',\n    'td',\n    'th',\n    'tr',\n    'u',\n    'ul',\n    '#text'\n];\nAST.emptyHTML = emptyHTML;\n/**\n * Allow all custom SVG and HTML attributes, references and tags (together\n * with potentially harmful ones) to be added to the DOM from the chart\n * configuration. In other words, disable the allow-listing which is the\n * primary functionality of the AST.\n *\n * WARNING: Setting this property to `true` while allowing untrusted user\n * data in the chart configuration will expose your application to XSS\n * security risks!\n *\n * Note that in case you want to allow a known set of tags or attributes,\n * you should allow-list them instead of disabling the filtering totally.\n * See [allowedAttributes](Highcharts.AST#.allowedAttributes),\n * [allowedReferences](Highcharts.AST#.allowedReferences) and\n * [allowedTags](Highcharts.AST#.allowedTags). The `bypassHTMLFiltering`\n * setting is intended only for those cases where allow-listing is not\n * practical, and the chart configuration already comes from a secure\n * source.\n *\n * @example\n * // Allow all custom attributes, references and tags (disable DOM XSS\n * // filtering)\n * Highcharts.AST.bypassHTMLFiltering = true;\n *\n * @name Highcharts.AST.bypassHTMLFiltering\n * @static\n */\nAST.bypassHTMLFiltering = false;\n/* *\n *\n *  Default Export\n *\n * */\nexport default AST;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Serialized form of an SVG/HTML definition, including children.\n *\n * @interface Highcharts.ASTNode\n */ /**\n* @name Highcharts.ASTNode#attributes\n* @type {Highcharts.SVGAttributes|undefined}\n*/ /**\n* @name Highcharts.ASTNode#children\n* @type {Array<Highcharts.ASTNode>|undefined}\n*/ /**\n* @name Highcharts.ASTNode#tagName\n* @type {string|undefined}\n*/ /**\n* @name Highcharts.ASTNode#textContent\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Globals.js';\n/* *\n *\n *  Namespace\n *\n * */\nvar RendererRegistry;\n(function (RendererRegistry) {\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    RendererRegistry.rendererTypes = {};\n    /* *\n     *\n     *  Variables\n     *\n     * */\n    let defaultRenderer;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Gets a registered renderer class. If no renderer type is provided or the\n     * requested renderer was not founded, the default renderer is returned.\n     *\n     * @param {string} [rendererType]\n     * Renderer type or the default renderer.\n     *\n     * @return {Highcharts.Class<Highcharts.SVGRenderer>}\n     * Returns the requested renderer class or the default renderer class.\n     */\n    function getRendererType(rendererType = defaultRenderer) {\n        return (RendererRegistry.rendererTypes[rendererType] || RendererRegistry.rendererTypes[defaultRenderer]);\n    }\n    RendererRegistry.getRendererType = getRendererType;\n    /**\n     * Register a renderer class.\n     *\n     * @param {string} rendererType\n     * Renderer type to register.\n     *\n     * @param {Highcharts.Class<Highcharts.SVGRenderer>} rendererClass\n     * Returns the requested renderer class or the default renderer class.\n     *\n     * @param {boolean} setAsDefault\n     * Sets the renderer class as the default renderer.\n     */\n    function registerRendererType(rendererType, rendererClass, setAsDefault) {\n        RendererRegistry.rendererTypes[rendererType] = rendererClass;\n        if (!defaultRenderer || setAsDefault) {\n            defaultRenderer = rendererType;\n            H.Renderer = rendererClass; // Compatibility\n        }\n    }\n    RendererRegistry.registerRendererType = registerRendererType;\n})(RendererRegistry || (RendererRegistry = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default RendererRegistry;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../../Animation/AnimationUtilities.js';\nconst { animate, animObject, stop } = A;\nimport Color from '../../Color/Color.js';\nimport H from '../../Globals.js';\nconst { deg2rad, doc, svg, SVG_NS, win } = H;\nimport U from '../../Utilities.js';\nconst { addEvent, attr, createElement, crisp, css, defined, erase, extend, fireEvent, isArray, isFunction, isObject, isString, merge, objectEach, pick, pInt, pushUnique, replaceNested, syncTimeout, uniqueKey } = U;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n * rendering layer of Highcharts. Combined with the\n * {@link Highcharts.SVGRenderer}\n * object, these prototypes allow freeform annotation in the charts or even in\n * HTML pages without instanciating a chart. The SVGElement can also wrap HTML\n * labels, when `text` or `label` elements are created with the `useHTML`\n * parameter.\n *\n * The SVGElement instances are created through factory functions on the\n * {@link Highcharts.SVGRenderer}\n * object, like\n * {@link Highcharts.SVGRenderer#rect|rect},\n * {@link Highcharts.SVGRenderer#path|path},\n * {@link Highcharts.SVGRenderer#text|text},\n * {@link Highcharts.SVGRenderer#label|label},\n * {@link Highcharts.SVGRenderer#g|g}\n * and more.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial on how to draw SVG elements on a chart.\n *\n * @class\n * @name Highcharts.SVGElement\n */\nclass SVGElement {\n    // @todo public zIndex?: number;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Get the current value of an attribute or pseudo attribute,\n     * used mainly for animation. Called internally from\n     * the {@link Highcharts.SVGRenderer#attr} function.\n     *\n     * @private\n     * @function Highcharts.SVGElement#_defaultGetter\n     *\n     * @param {string} key\n     *        Property key.\n     *\n     * @return {number|string}\n     *         Property value.\n     */\n    _defaultGetter(key) {\n        let ret = pick(this[key + 'Value'], // Align getter\n        this[key], this.element ? this.element.getAttribute(key) : null, 0);\n        if (/^-?[\\d\\.]+$/.test(ret)) { // Is numerical\n            ret = parseFloat(ret);\n        }\n        return ret;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#_defaultSetter\n     *\n     * @param {string} value\n     *\n     * @param {string} key\n     *\n     * @param {Highcharts.SVGDOMElement} element\n     *\n     */\n    _defaultSetter(value, key, element) {\n        element.setAttribute(key, value);\n    }\n    /**\n     * Add the element to the DOM. All elements must be added this way.\n     *\n     * @sample highcharts/members/renderer-g\n     *         Elements added to a group\n     *\n     * @function Highcharts.SVGElement#add\n     *\n     * @param {Highcharts.SVGElement} [parent]\n     *        The parent item to add it to. If undefined, the element is added\n     *        to the {@link Highcharts.SVGRenderer.box}.\n     *\n     * @return {Highcharts.SVGElement}\n     *         Returns the SVGElement for chaining.\n     */\n    add(parent) {\n        const renderer = this.renderer, element = this.element;\n        let inserted;\n        if (parent) {\n            this.parentGroup = parent;\n        }\n        // Build formatted text\n        if (typeof this.textStr !== 'undefined' &&\n            this.element.nodeName === 'text' // Not for SVGLabel instances\n        ) {\n            renderer.buildText(this);\n        }\n        // Mark as added\n        this.added = true;\n        // If we're adding to renderer root, or other elements in the group\n        // have a z index, we need to handle it\n        if (!parent || parent.handleZ || this.zIndex) {\n            inserted = this.zIndexSetter();\n        }\n        // If zIndex is not handled, append at the end\n        if (!inserted) {\n            (parent ?\n                parent.element :\n                renderer.box).appendChild(element);\n        }\n        // Fire an event for internal hooks\n        if (this.onAdd) {\n            this.onAdd();\n        }\n        return this;\n    }\n    /**\n     * Add a class name to an element.\n     *\n     * @function Highcharts.SVGElement#addClass\n     *\n     * @param {string} className\n     * The new class name to add.\n     *\n     * @param {boolean} [replace=false]\n     * When true, the existing class name(s) will be overwritten with the new\n     * one. When false, the new one is added.\n     *\n     * @return {Highcharts.SVGElement}\n     * Return the SVG element for chainability.\n     */\n    addClass(className, replace) {\n        const currentClassName = replace ? '' : (this.attr('class') || '');\n        // Trim the string and remove duplicates\n        className = (className || '')\n            .split(/ /g)\n            .reduce(function (newClassName, name) {\n            if (currentClassName.indexOf(name) === -1) {\n                newClassName.push(name);\n            }\n            return newClassName;\n        }, (currentClassName ?\n            [currentClassName] :\n            []))\n            .join(' ');\n        if (className !== currentClassName) {\n            this.attr('class', className);\n        }\n        return this;\n    }\n    /**\n     * This method is executed in the end of `attr()`, after setting all\n     * attributes in the hash. In can be used to efficiently consolidate\n     * multiple attributes in one SVG property -- e.g., translate, rotate and\n     * scale are merged in one \"transform\" attribute in the SVG node.\n     *\n     * @private\n     * @function Highcharts.SVGElement#afterSetters\n     */\n    afterSetters() {\n        // Update transform. Do this outside the loop to prevent redundant\n        // updating for batch setting of attributes.\n        if (this.doTransform) {\n            this.updateTransform();\n            this.doTransform = false;\n        }\n    }\n    /**\n     * Align the element relative to the chart or another box.\n     *\n     * @function Highcharts.SVGElement#align\n     *\n     * @param {Highcharts.AlignObject} [alignOptions]\n     *        The alignment options. The function can be called without this\n     *        parameter in order to re-align an element after the box has been\n     *        updated.\n     *\n     * @param {boolean} [alignByTranslate]\n     *        Align element by translation.\n     *\n     * @param {string|Highcharts.BBoxObject} [alignTo]\n     *        The box to align to, needs a width and height. When the box is a\n     *        string, it refers to an object in the Renderer. For example, when\n     *        box is `spacingBox`, it refers to `Renderer.spacingBox` which\n     *        holds `width`, `height`, `x` and `y` properties.\n     *\n     * @param {boolean} [redraw]\n     *        Decide if SVGElement should be redrawn with new alignment or\n     *        just change its attributes.\n     *\n     * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n     */\n    align(alignOptions, alignByTranslate, alignTo, redraw = true) {\n        const attribs = {}, renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);\n        let x, y, alignFactor, vAlignFactor;\n        // First call on instanciate\n        if (alignOptions) {\n            this.alignOptions = alignOptions;\n            this.alignByTranslate = alignByTranslate;\n            this.alignTo = alignTo;\n            // When called on resize, no arguments are supplied\n        }\n        else {\n            alignOptions = this.alignOptions || {};\n            alignByTranslate = this.alignByTranslate;\n            alignTo = this.alignTo;\n        }\n        const alignToKey = !alignTo || isString(alignTo) ?\n            alignTo || 'renderer' :\n            void 0;\n        // When aligned to a key, automatically re-align on redraws\n        if (alignToKey) {\n            // Prevent duplicates, like legendGroup after resize\n            if (initialAlignment) {\n                pushUnique(alignedObjects, this);\n            }\n            alignTo = void 0; // Do not use the box\n        }\n        const alignToBox = pick(alignTo, renderer[alignToKey], renderer);\n        // Assign variables\n        const align = alignOptions.align, vAlign = alignOptions.verticalAlign;\n        // Default: left align\n        x = (alignToBox.x || 0) + (alignOptions.x || 0);\n        // Default: top align\n        y = (alignToBox.y || 0) + (alignOptions.y || 0);\n        // Align\n        if (align === 'right') {\n            alignFactor = 1;\n        }\n        else if (align === 'center') {\n            alignFactor = 2;\n        }\n        if (alignFactor) {\n            x += ((alignToBox.width || 0) - (alignOptions.width || 0)) /\n                alignFactor;\n        }\n        attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n        // Vertical align\n        if (vAlign === 'bottom') {\n            vAlignFactor = 1;\n        }\n        else if (vAlign === 'middle') {\n            vAlignFactor = 2;\n        }\n        if (vAlignFactor) {\n            y += ((alignToBox.height || 0) - (alignOptions.height || 0)) /\n                vAlignFactor;\n        }\n        attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n        // Animate only if already placed\n        if (redraw) {\n            this[this.placed ? 'animate' : 'attr'](attribs);\n            this.placed = true;\n        }\n        this.alignAttr = attribs;\n        return this;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#alignSetter\n     * @param {\"left\"|\"center\"|\"right\"} value\n     */\n    alignSetter(value) {\n        const convert = {\n            left: 'start',\n            center: 'middle',\n            right: 'end'\n        };\n        if (convert[value]) {\n            this.alignValue = value;\n            this.element.setAttribute('text-anchor', convert[value]);\n        }\n    }\n    /**\n     * Animate to given attributes or CSS properties.\n     *\n     * @sample highcharts/members/element-on/\n     *         Setting some attributes by animation\n     *\n     * @function Highcharts.SVGElement#animate\n     *\n     * @param {Highcharts.SVGAttributes} params\n     *        SVG attributes or CSS to animate.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [options]\n     *        Animation options.\n     *\n     * @param {Function} [complete]\n     *        Function to perform at the end of animation.\n     *\n     * @return {Highcharts.SVGElement}\n     *         Returns the SVGElement for chaining.\n     */\n    animate(params, options, complete) {\n        const animOptions = animObject(pick(options, this.renderer.globalAnimation, true)), deferTime = animOptions.defer;\n        // When the page is hidden save resources in the background by not\n        // running animation at all (#9749).\n        if (doc.hidden) {\n            animOptions.duration = 0;\n        }\n        if (animOptions.duration !== 0) {\n            // Allows using a callback with the global animation without\n            // overwriting it\n            if (complete) {\n                animOptions.complete = complete;\n            }\n            // If defer option is defined delay the animation #12901\n            syncTimeout(() => {\n                if (this.element) {\n                    animate(this, params, animOptions);\n                }\n            }, deferTime);\n        }\n        else {\n            this.attr(params, void 0, complete || animOptions.complete);\n            // Call the end step synchronously\n            objectEach(params, function (val, prop) {\n                if (animOptions.step) {\n                    animOptions.step.call(this, val, { prop: prop, pos: 1, elem: this });\n                }\n            }, this);\n        }\n        return this;\n    }\n    /**\n     * Apply a text outline through a custom CSS property, by copying the text\n     * element and apply stroke to the copy. Used internally. Contrast checks at\n     * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n     *\n     * @example\n     * // Specific color\n     * text.css({\n     *    textOutline: '1px black'\n     * });\n     * // Automatic contrast\n     * text.css({\n     *    color: '#000000', // black text\n     *    textOutline: '1px contrast' // => white outline\n     * });\n     *\n     * @private\n     * @function Highcharts.SVGElement#applyTextOutline\n     *\n     * @param {string} textOutline\n     *        A custom CSS `text-outline` setting, defined by `width color`.\n     */\n    applyTextOutline(textOutline) {\n        const elem = this.element, hasContrast = textOutline.indexOf('contrast') !== -1, styles = {};\n        // When the text shadow is set to contrast, use dark stroke for light\n        // text and vice versa.\n        if (hasContrast) {\n            styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n        }\n        // Extract the stroke width and color\n        const parts = textOutline.split(' ');\n        const color = parts[parts.length - 1];\n        let strokeWidth = parts[0];\n        if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n            this.fakeTS = true; // Fake text shadow\n            // Since the stroke is applied on center of the actual outline, we\n            // need to double it to get the correct stroke-width outside the\n            // glyphs.\n            strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n                return (2 * Number(digit)) + unit;\n            });\n            // Remove shadows from previous runs.\n            this.removeTextOutline();\n            const outline = doc.createElementNS(SVG_NS, 'tspan');\n            attr(outline, {\n                'class': 'highcharts-text-outline',\n                fill: color,\n                stroke: color,\n                'stroke-width': strokeWidth,\n                'stroke-linejoin': 'round'\n            });\n            // For each of the tspans and text nodes, create a copy in the\n            // outline.\n            const parentElem = elem.querySelector('textPath') || elem;\n            [].forEach.call(parentElem.childNodes, (childNode) => {\n                const clone = childNode.cloneNode(true);\n                if (clone.removeAttribute) {\n                    ['fill', 'stroke', 'stroke-width', 'stroke'].forEach((prop) => clone\n                        .removeAttribute(prop));\n                }\n                outline.appendChild(clone);\n            });\n            // Collect the sum of dy from all children, included nested ones\n            let totalHeight = 0;\n            [].forEach.call(parentElem.querySelectorAll('text tspan'), (element) => {\n                totalHeight += Number(element.getAttribute('dy'));\n            });\n            // Insert an absolutely positioned break before the original text\n            // to keep it in place\n            const br = doc.createElementNS(SVG_NS, 'tspan');\n            br.textContent = '\\u200B';\n            // Reset the position for the following text\n            attr(br, {\n                x: Number(elem.getAttribute('x')),\n                dy: -totalHeight\n            });\n            // Insert the outline\n            outline.appendChild(br);\n            parentElem.insertBefore(outline, parentElem.firstChild);\n        }\n    }\n    /**\n     * @function Highcharts.SVGElement#attr\n     * @param {string} key\n     * @return {number|string}\n     */ /**\n    * Apply native and custom attributes to the SVG elements.\n    *\n    * In order to set the rotation center for rotation, set x and y to 0 and\n    * use `translateX` and `translateY` attributes to position the element\n    * instead.\n    *\n    * Attributes frequently used in Highcharts are `fill`, `stroke`,\n    * `stroke-width`.\n    *\n    * @sample highcharts/members/renderer-rect/\n    *         Setting some attributes\n    *\n    * @example\n    * // Set multiple attributes\n    * element.attr({\n    *     stroke: 'red',\n    *     fill: 'blue',\n    *     x: 10,\n    *     y: 10\n    * });\n    *\n    * // Set a single attribute\n    * element.attr('stroke', 'red');\n    *\n    * // Get an attribute\n    * element.attr('stroke'); // => 'red'\n    *\n    * @function Highcharts.SVGElement#attr\n    *\n    * @param {string|Highcharts.SVGAttributes} [hash]\n    *        The native and custom SVG attributes.\n    *\n    * @param {number|string|Highcharts.SVGPathArray} [val]\n    *        If the type of the first argument is `string`, the second can be a\n    *        value, which will serve as a single attribute setter. If the first\n    *        argument is a string and the second is undefined, the function\n    *        serves as a getter and the current value of the property is\n    *        returned.\n    *\n    * @param {Function} [complete]\n    *        A callback function to execute after setting the attributes. This\n    *        makes the function compliant and interchangeable with the\n    *        {@link SVGElement#animate} function.\n    *\n    * @param {boolean} [continueAnimation=true]\n    *        Used internally when `.attr` is called as part of an animation\n    *        step. Otherwise, calling `.attr` for an attribute will stop\n    *        animation for that attribute.\n    *\n    * @return {Highcharts.SVGElement}\n    *         If used as a setter, it returns the current\n    *         {@link Highcharts.SVGElement} so the calls can be chained. If\n    *         used as a getter, the current value of the attribute is returned.\n    */\n    attr(hash, val, complete, continueAnimation) {\n        const { element } = this, symbolCustomAttribs = SVGElement.symbolCustomAttribs;\n        let key, hasSetSymbolSize, ret = this, skipAttr, setter;\n        // Single key-value pair\n        if (typeof hash === 'string' && typeof val !== 'undefined') {\n            key = hash;\n            hash = {};\n            hash[key] = val;\n        }\n        // Used as a getter: first argument is a string, second is undefined\n        if (typeof hash === 'string') {\n            ret = (this[hash + 'Getter'] ||\n                this._defaultGetter).call(this, hash, element);\n            // Setter\n        }\n        else {\n            objectEach(hash, function eachAttribute(val, key) {\n                skipAttr = false;\n                // Unless .attr is from the animator update, stop current\n                // running animation of this property\n                if (!continueAnimation) {\n                    stop(this, key);\n                }\n                // Special handling of symbol attributes\n                if (this.symbolName &&\n                    symbolCustomAttribs.indexOf(key) !== -1) {\n                    if (!hasSetSymbolSize) {\n                        this.symbolAttr(hash);\n                        hasSetSymbolSize = true;\n                    }\n                    skipAttr = true;\n                }\n                if (this.rotation && (key === 'x' || key === 'y')) {\n                    this.doTransform = true;\n                }\n                if (!skipAttr) {\n                    setter = (this[key + 'Setter'] ||\n                        this._defaultSetter);\n                    setter.call(this, val, key, element);\n                }\n            }, this);\n            this.afterSetters();\n        }\n        // In accordance with animate, run a complete callback\n        if (complete) {\n            complete.call(this);\n        }\n        return ret;\n    }\n    /**\n     * Apply a clipping shape to this element.\n     *\n     * @function Highcharts.SVGElement#clip\n     *\n     * @param {SVGElement} [clipElem]\n     *        The clipping shape. If skipped, the current clip is removed.\n     *\n     * @return {Highcharts.SVGElement}\n     *         Returns the SVG element to allow chaining.\n     */\n    clip(clipElem) {\n        if (clipElem && !clipElem.clipPath) {\n            // Add a hyphen at the end to avoid confusion in testing indexes\n            // -1 and -10, -11 etc (#6550)\n            const id = uniqueKey() + '-', clipPath = this.renderer.createElement('clipPath')\n                .attr({ id })\n                .add(this.renderer.defs);\n            extend(clipElem, { clipPath, id, count: 0 });\n            clipElem.add(clipPath);\n        }\n        return this.attr('clip-path', clipElem ?\n            `url(${this.renderer.url}#${clipElem.id})` :\n            'none');\n    }\n    /**\n     * Calculate the coordinates needed for drawing a rectangle crisply and\n     * return the calculated attributes.\n     *\n     * @function Highcharts.SVGElement#crisp\n     *\n     * @param {Highcharts.RectangleObject} rect\n     * Rectangle to crisp.\n     *\n     * @param {number} [strokeWidth]\n     * The stroke width to consider when computing crisp positioning. It can\n     * also be set directly on the rect parameter.\n     *\n     * @return {Highcharts.RectangleObject}\n     * The modified rectangle arguments.\n     */\n    crisp(rect, strokeWidth) {\n        // Math.round because strokeWidth can sometimes have roundoff errors\n        strokeWidth = Math.round(strokeWidth || rect.strokeWidth || 0);\n        const x1 = rect.x || this.x || 0, y1 = rect.y || this.y || 0, x2 = (rect.width || this.width || 0) + x1, y2 = (rect.height || this.height || 0) + y1, \n        // Find all the rounded coordinates for corners\n        x = crisp(x1, strokeWidth), y = crisp(y1, strokeWidth), x2Crisp = crisp(x2, strokeWidth), y2Crisp = crisp(y2, strokeWidth);\n        extend(rect, {\n            x,\n            y,\n            width: x2Crisp - x,\n            height: y2Crisp - y\n        });\n        if (defined(rect.strokeWidth)) {\n            rect.strokeWidth = strokeWidth;\n        }\n        return rect;\n    }\n    /**\n     * Build and apply an SVG gradient out of a common JavaScript configuration\n     * object. This function is called from the attribute setters. An event\n     * hook is added for supporting other complex color types.\n     *\n     * @private\n     * @function Highcharts.SVGElement#complexColor\n     *\n     * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n     * The gradient or pattern options structure.\n     *\n     * @param {string} prop\n     * The property to apply, can either be `fill` or `stroke`.\n     *\n     * @param {Highcharts.SVGDOMElement} elem\n     * SVG element to apply the gradient on.\n     */\n    complexColor(colorOptions, prop, elem) {\n        const renderer = this.renderer;\n        let colorObject, gradName, gradAttr, radAttr, gradients, stops, stopColor, stopOpacity, radialReference, id, key = [], value;\n        fireEvent(this.renderer, 'complexColor', {\n            args: arguments\n        }, function () {\n            // Apply linear or radial gradients\n            if (colorOptions.radialGradient) {\n                gradName = 'radialGradient';\n            }\n            else if (colorOptions.linearGradient) {\n                gradName = 'linearGradient';\n            }\n            if (gradName) {\n                gradAttr = colorOptions[gradName];\n                gradients = renderer.gradients;\n                stops = colorOptions.stops;\n                radialReference = elem.radialReference;\n                // Keep < 2.2 compatibility\n                if (isArray(gradAttr)) {\n                    colorOptions[gradName] = gradAttr = {\n                        x1: gradAttr[0],\n                        y1: gradAttr[1],\n                        x2: gradAttr[2],\n                        y2: gradAttr[3],\n                        gradientUnits: 'userSpaceOnUse'\n                    };\n                }\n                // Correct the radial gradient for the radial reference system\n                if (gradName === 'radialGradient' &&\n                    radialReference &&\n                    !defined(gradAttr.gradientUnits)) {\n                    // Save the radial attributes for updating\n                    radAttr = gradAttr;\n                    gradAttr = merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n                }\n                // Build the unique key to detect whether we need to create a\n                // new element (#1282)\n                objectEach(gradAttr, function (value, n) {\n                    if (n !== 'id') {\n                        key.push(n, value);\n                    }\n                });\n                objectEach(stops, function (val) {\n                    key.push(val);\n                });\n                key = key.join(',');\n                // Check if a gradient object with the same config object is\n                // created within this renderer\n                if (gradients[key]) {\n                    id = gradients[key].attr('id');\n                }\n                else {\n                    // Set the id and create the element\n                    gradAttr.id = id = uniqueKey();\n                    const gradientObject = gradients[key] =\n                        renderer.createElement(gradName)\n                            .attr(gradAttr)\n                            .add(renderer.defs);\n                    gradientObject.radAttr = radAttr;\n                    // The gradient needs to keep a list of stops to be able to\n                    // destroy them\n                    gradientObject.stops = [];\n                    stops.forEach(function (stop) {\n                        if (stop[1].indexOf('rgba') === 0) {\n                            colorObject = Color.parse(stop[1]);\n                            stopColor = colorObject.get('rgb');\n                            stopOpacity = colorObject.get('a');\n                        }\n                        else {\n                            stopColor = stop[1];\n                            stopOpacity = 1;\n                        }\n                        const stopObject = renderer.createElement('stop').attr({\n                            offset: stop[0],\n                            'stop-color': stopColor,\n                            'stop-opacity': stopOpacity\n                        }).add(gradientObject);\n                        // Add the stop element to the gradient\n                        gradientObject.stops.push(stopObject);\n                    });\n                }\n                // Set the reference to the gradient object\n                value = 'url(' + renderer.url + '#' + id + ')';\n                elem.setAttribute(prop, value);\n                elem.gradient = key;\n                // Allow the color to be concatenated into tooltips formatters\n                // etc. (#2995)\n                colorOptions.toString = function () {\n                    return value;\n                };\n            }\n        });\n    }\n    /**\n     * Set styles for the element. In addition to CSS styles supported by\n     * native SVG and HTML elements, there are also some custom made for\n     * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n     * elements.\n     *\n     * @sample highcharts/members/renderer-text-on-chart/\n     *         Styled text\n     *\n     * @function Highcharts.SVGElement#css\n     *\n     * @param {Highcharts.CSSObject} styles\n     *        The new CSS styles.\n     *\n     * @return {Highcharts.SVGElement}\n     *         Return the SVG element for chaining.\n     */\n    css(styles) {\n        const oldStyles = this.styles, newStyles = {}, elem = this.element;\n        let textWidth, hasNew = !oldStyles;\n        // Filter out existing styles to increase performance (#2640)\n        if (oldStyles) {\n            objectEach(styles, function (value, n) {\n                if (oldStyles && oldStyles[n] !== value) {\n                    newStyles[n] = value;\n                    hasNew = true;\n                }\n            });\n        }\n        if (hasNew) {\n            // Merge the new styles with the old ones\n            if (oldStyles) {\n                styles = extend(oldStyles, newStyles);\n            }\n            // Get the text width from style\n            // Previously set, unset it (#8234)\n            if (styles.width === null || styles.width === 'auto') {\n                delete this.textWidth;\n                // Apply new\n            }\n            else if (elem.nodeName.toLowerCase() === 'text' &&\n                styles.width) {\n                textWidth = this.textWidth = pInt(styles.width);\n            }\n            // Store object\n            extend(this.styles, styles);\n            if (textWidth && (!svg && this.renderer.forExport)) {\n                delete styles.width;\n            }\n            const stylesToApply = merge(styles);\n            if (elem.namespaceURI === this.SVG_NS) {\n                // These CSS properties are interpreted internally by the SVG\n                // renderer, but are not supported by SVG and should not be\n                // added to the DOM. In styled mode, no CSS should find its way\n                // to the DOM whatsoever (#6173, #6474).\n                ['textOutline', 'textOverflow', 'width'].forEach((key) => (stylesToApply &&\n                    delete stylesToApply[key]));\n                // SVG requires fill for text\n                if (stylesToApply.color) {\n                    stylesToApply.fill = stylesToApply.color;\n                }\n            }\n            css(elem, stylesToApply);\n        }\n        if (this.added) {\n            // Rebuild text after added. Cache mechanisms in the buildText will\n            // prevent building if there are no significant changes.\n            if (this.element.nodeName === 'text') {\n                this.renderer.buildText(this);\n            }\n            // Apply text outline after added\n            if (styles.textOutline) {\n                this.applyTextOutline(styles.textOutline);\n            }\n        }\n        return this;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#dashstyleSetter\n     * @param {string} value\n     */\n    dashstyleSetter(value) {\n        let i, strokeWidth = this['stroke-width'];\n        // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n        // strokeWidth function, we should be able to use that instead.\n        if (strokeWidth === 'inherit') {\n            strokeWidth = 1;\n        }\n        value = value && value.toLowerCase();\n        if (value) {\n            const v = value\n                .replace('shortdashdotdot', '3,1,1,1,1,1,')\n                .replace('shortdashdot', '3,1,1,1')\n                .replace('shortdot', '1,1,')\n                .replace('shortdash', '3,1,')\n                .replace('longdash', '8,3,')\n                .replace(/dot/g, '1,3,')\n                .replace('dash', '4,3,')\n                .replace(/,$/, '')\n                .split(','); // Ending comma\n            i = v.length;\n            while (i--) {\n                v[i] = '' + (pInt(v[i]) * pick(strokeWidth, NaN));\n            }\n            value = v.join(',').replace(/NaN/g, 'none'); // #3226\n            this.element.setAttribute('stroke-dasharray', value);\n        }\n    }\n    /**\n     * Destroy the element and element wrapper and clear up the DOM and event\n     * hooks.\n     *\n     * @function Highcharts.SVGElement#destroy\n     */\n    destroy() {\n        const wrapper = this, element = wrapper.element || {}, renderer = wrapper.renderer, ownerSVGElement = element.ownerSVGElement;\n        let parentToClean = (element.nodeName === 'SPAN' &&\n            wrapper.parentGroup ||\n            void 0), grandParent, i;\n        // Remove events\n        element.onclick = element.onmouseout = element.onmouseover =\n            element.onmousemove = element.point = null;\n        stop(wrapper); // Stop running animations\n        if (wrapper.clipPath && ownerSVGElement) {\n            const clipPath = wrapper.clipPath;\n            // Look for existing references to this clipPath and remove them\n            // before destroying the element (#6196).\n            // The upper case version is for Edge\n            [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n                if (el.getAttribute('clip-path').indexOf(clipPath.element.id) > -1) {\n                    el.removeAttribute('clip-path');\n                }\n            });\n            wrapper.clipPath = clipPath.destroy();\n        }\n        wrapper.connector = wrapper.connector?.destroy();\n        // Destroy stops in case this is a gradient object @todo old code?\n        if (wrapper.stops) {\n            for (i = 0; i < wrapper.stops.length; i++) {\n                wrapper.stops[i].destroy();\n            }\n            wrapper.stops.length = 0;\n            wrapper.stops = void 0;\n        }\n        // Remove element\n        wrapper.safeRemoveChild(element);\n        // In case of useHTML, clean up empty containers emulating SVG groups\n        // (#1960, #2393, #2697).\n        while (parentToClean &&\n            parentToClean.div &&\n            parentToClean.div.childNodes.length === 0) {\n            grandParent = parentToClean.parentGroup;\n            wrapper.safeRemoveChild(parentToClean.div);\n            delete parentToClean.div;\n            parentToClean = grandParent;\n        }\n        // Remove from alignObjects\n        if (wrapper.alignOptions) {\n            erase(renderer.alignedObjects, wrapper);\n        }\n        objectEach(wrapper, function (val, key) {\n            // Destroy child elements of a group\n            if (wrapper[key] &&\n                wrapper[key].parentGroup === wrapper &&\n                wrapper[key].destroy) {\n                wrapper[key].destroy();\n            }\n            // Delete all properties\n            delete wrapper[key];\n        });\n        return;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#dSettter\n     * @param {number|string|Highcharts.SVGPathArray} value\n     * @param {string} key\n     * @param {Highcharts.SVGDOMElement} element\n     */\n    dSetter(value, key, element) {\n        if (isArray(value)) {\n            // Backwards compatibility, convert one-dimensional array into an\n            // array of segments\n            if (typeof value[0] === 'string') {\n                value = this.renderer.pathToSegments(value);\n            }\n            this.pathArray = value;\n            value = value.reduce((acc, seg, i) => {\n                if (!seg || !seg.join) {\n                    return (seg || '').toString();\n                }\n                return (i ? acc + ' ' : '') + seg.join(' ');\n            }, '');\n        }\n        if (/(NaN| {2}|^$)/.test(value)) {\n            value = 'M 0 0';\n        }\n        // Check for cache before resetting. Resetting causes disturbance in the\n        // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n        // possible performance gain.\n        if (this[key] !== value) {\n            element.setAttribute(key, value);\n            this[key] = value;\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#fillSetter\n     * @param {Highcharts.ColorType} value\n     * @param {string} key\n     * @param {Highcharts.SVGDOMElement} element\n     */\n    fillSetter(value, key, element) {\n        if (typeof value === 'string') {\n            element.setAttribute(key, value);\n        }\n        else if (value) {\n            this.complexColor(value, key, element);\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#hrefSetter\n     * @param {Highcharts.ColorType} value\n     * @param {string} key\n     * @param {Highcharts.SVGDOMElement} element\n     */\n    hrefSetter(value, key, element) {\n        // Namespace is needed for offline export, #19106\n        element.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n    }\n    /**\n     * Get the bounding box (width, height, x and y) for the element. Generally\n     * used to get rendered text size. Since this is called a lot in charts,\n     * the results are cached based on text properties, in order to save DOM\n     * traffic. The returned bounding box includes the rotation, so for example\n     * a single text line of rotation 90 will report a greater height, and a\n     * width corresponding to the line-height.\n     *\n     * @sample highcharts/members/renderer-on-chart/\n     *         Draw a rectangle based on a text's bounding box\n     *\n     * @function Highcharts.SVGElement#getBBox\n     *\n     * @param {boolean} [reload]\n     *        Skip the cache and get the updated DOM bounding box.\n     *\n     * @param {number} [rot]\n     *        Override the element's rotation. This is internally used on axis\n     *        labels with a value of 0 to find out what the bounding box would\n     *        be have been if it were not rotated.\n     *\n     * @return {Highcharts.BBoxObject}\n     *         The bounding box with `x`, `y`, `width` and `height` properties.\n     */\n    getBBox(reload, rot) {\n        const wrapper = this, { alignValue, element, renderer, styles, textStr } = wrapper, { cache, cacheKeys } = renderer, isSVG = element.namespaceURI === wrapper.SVG_NS, rotation = pick(rot, wrapper.rotation, 0), fontSize = renderer.styledMode ? (element &&\n            SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles.fontSize);\n        let bBox, height, toggleTextShadowShim, cacheKey;\n        // Avoid undefined and null (#7316)\n        if (defined(textStr)) {\n            cacheKey = textStr.toString();\n            // Since numbers are monospaced, and numerical labels appear a lot\n            // in a chart, we assume that a label of n characters has the same\n            // bounding box as others of the same length. Unless there is inner\n            // HTML in the label. In that case, leave the numbers as is (#5899).\n            if (cacheKey.indexOf('<') === -1) {\n                cacheKey = cacheKey.replace(/\\d/g, '0');\n            }\n            // Properties that affect bounding box\n            cacheKey += [\n                '',\n                renderer.rootFontSize,\n                fontSize,\n                rotation,\n                wrapper.textWidth, // #7874, also useHTML\n                alignValue,\n                styles.textOverflow, // #5968\n                styles.fontWeight // #12163\n            ].join(',');\n        }\n        if (cacheKey && !reload) {\n            bBox = cache[cacheKey];\n        }\n        // No cache found\n        if (!bBox || bBox.polygon) {\n            // SVG elements\n            if (isSVG || renderer.forExport) {\n                try { // Fails in Firefox if the container has display: none.\n                    // When the text shadow shim is used, we need to hide the\n                    // fake shadows to get the correct bounding box (#3872)\n                    toggleTextShadowShim = this.fakeTS && function (display) {\n                        const outline = element.querySelector('.highcharts-text-outline');\n                        if (outline) {\n                            css(outline, { display });\n                        }\n                    };\n                    // Workaround for #3842, Firefox reporting wrong bounding\n                    // box for shadows\n                    if (isFunction(toggleTextShadowShim)) {\n                        toggleTextShadowShim('none');\n                    }\n                    bBox = element.getBBox ?\n                        // SVG: use extend because IE9 is not allowed to change\n                        // width and height in case of rotation (below)\n                        extend({}, element.getBBox()) : {\n                        // HTML elements with `exporting.allowHTML` and\n                        // legacy IE in export mode\n                        width: element.offsetWidth,\n                        height: element.offsetHeight,\n                        x: 0,\n                        y: 0\n                    };\n                    // #3842\n                    if (isFunction(toggleTextShadowShim)) {\n                        toggleTextShadowShim('');\n                    }\n                }\n                catch (e) {\n                    '';\n                }\n                // If the bBox is not set, the try-catch block above failed. The\n                // other condition is for Opera that returns a width of\n                // -Infinity on hidden elements.\n                if (!bBox || bBox.width < 0) {\n                    bBox = { x: 0, y: 0, width: 0, height: 0 };\n                }\n                // Use HTML within SVG\n            }\n            else {\n                bBox = wrapper.htmlGetBBox();\n            }\n            // True SVG elements as well as HTML elements in modern browsers\n            // using the .useHTML option need to compensated for rotation\n            height = bBox.height;\n            // Workaround for wrong bounding box in IE, Edge and Chrome on\n            // Windows. With Highcharts' default font, IE and Edge report\n            // a box height of 16.899 and Chrome rounds it to 17. If this\n            // stands uncorrected, it results in more padding added below\n            // the text than above when adding a label border or background.\n            // Also vertical positioning is affected.\n            // https://jsfiddle.net/highcharts/em37nvuj/\n            // (#1101, #1505, #1669, #2568, #6213).\n            if (isSVG) {\n                bBox.height = height = ({\n                    '11px,17': 14,\n                    '13px,20': 16\n                }[`${fontSize || ''},${Math.round(height)}`] ||\n                    height);\n            }\n            // Adjust for rotated text\n            if (rotation) {\n                bBox = this.getRotatedBox(bBox, rotation);\n            }\n            // Create a reference to catch changes to bBox\n            const e = { bBox };\n            fireEvent(this, 'afterGetBBox', e);\n            // Pick up any changes after the fired event\n            bBox = e.bBox;\n        }\n        // Cache it. When loading a chart in a hidden iframe in Firefox and\n        // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n        if (cacheKey && (textStr === '' || bBox.height > 0)) {\n            // Rotate (#4681)\n            while (cacheKeys.length > 250) {\n                delete cache[cacheKeys.shift()];\n            }\n            if (!cache[cacheKey]) {\n                cacheKeys.push(cacheKey);\n            }\n            cache[cacheKey] = bBox;\n        }\n        return bBox;\n    }\n    /**\n     * Get the rotated box.\n     * @private\n     */\n    getRotatedBox(box, rotation) {\n        const { x: boxX, y: boxY, width, height } = box, { alignValue, translateY, rotationOriginX = 0, rotationOriginY = 0 } = this, alignFactor = {\n            'right': 1,\n            'center': 0.5\n        }[alignValue || 0] || 0, baseline = Number(this.element.getAttribute('y') || 0) -\n            (translateY ? 0 : boxY), rad = rotation * deg2rad, rad90 = (rotation - 90) * deg2rad, cosRad = Math.cos(rad), sinRad = Math.sin(rad), wCosRad = width * cosRad, wSinRad = width * sinRad, cosRad90 = Math.cos(rad90), sinRad90 = Math.sin(rad90), [[xOriginCosRad, xOriginSinRad], [yOriginCosRad, yOriginSinRad]] = [\n            rotationOriginX,\n            rotationOriginY\n        ].map((rotOrigin) => [\n            rotOrigin - (rotOrigin * cosRad),\n            rotOrigin * sinRad\n        ]), \n        // Find the starting point on the left side baseline of\n        // the text\n        pX = ((boxX + alignFactor * (width - wCosRad)) +\n            xOriginCosRad + yOriginSinRad), pY = ((boxY + baseline - alignFactor * wSinRad) -\n            xOriginSinRad + yOriginCosRad), \n        // Find all corners\n        aX = pX + baseline * cosRad90, bX = aX + wCosRad, cX = bX - height * cosRad90, dX = cX - wCosRad, aY = pY + baseline * sinRad90, bY = aY + wSinRad, cY = bY - height * sinRad90, dY = cY - wSinRad;\n        // Deduct the bounding box from the corners\n        const x = Math.min(aX, bX, cX, dX), y = Math.min(aY, bY, cY, dY), boxWidth = Math.max(aX, bX, cX, dX) - x, boxHeight = Math.max(aY, bY, cY, dY) - y;\n        /* Uncomment to debug boxes\n        this.renderer.path([\n            ['M', aX, aY],\n            ['L', bX, bY],\n            ['L', cX, cY],\n            ['L', dX, dY],\n            ['Z']\n        ])\n            .attr({\n                stroke: 'red',\n                'stroke-width': 1\n            })\n            .add();\n        // */\n        return {\n            x,\n            y,\n            width: boxWidth,\n            height: boxHeight,\n            polygon: [\n                [aX, aY],\n                [bX, bY],\n                [cX, cY],\n                [dX, dY]\n            ]\n        };\n    }\n    /**\n     * Get the computed style. Only in styled mode.\n     *\n     * @example\n     * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n     *\n     * @function Highcharts.SVGElement#getStyle\n     *\n     * @param {string} prop\n     *        The property name to check for.\n     *\n     * @return {string}\n     *         The current computed value.\n     */\n    getStyle(prop) {\n        return win\n            .getComputedStyle(this.element || this, '')\n            .getPropertyValue(prop);\n    }\n    /**\n     * Check if an element has the given class name.\n     *\n     * @function Highcharts.SVGElement#hasClass\n     *\n     * @param {string} className\n     * The class name to check for.\n     *\n     * @return {boolean}\n     * Whether the class name is found.\n     */\n    hasClass(className) {\n        return ('' + this.attr('class'))\n            .split(' ')\n            .indexOf(className) !== -1;\n    }\n    /**\n     * Hide the element, similar to setting the `visibility` attribute to\n     * `hidden`.\n     *\n     * @function Highcharts.SVGElement#hide\n     *\n     * @return {Highcharts.SVGElement}\n     *         Returns the SVGElement for chaining.\n     */\n    hide() {\n        return this.attr({ visibility: 'hidden' });\n    }\n    /**\n     * @private\n     */\n    htmlGetBBox() {\n        return { height: 0, width: 0, x: 0, y: 0 };\n    }\n    /**\n     * Initialize the SVG element. This function only exists to make the\n     * initialization process overridable. It should not be called directly.\n     *\n     * @function Highcharts.SVGElement#init\n     *\n     * @param {Highcharts.SVGRenderer} renderer\n     * The SVGRenderer instance to initialize to.\n     *\n     * @param {string} nodeName\n     * The SVG node name.\n     */\n    constructor(renderer, nodeName) {\n        this.onEvents = {};\n        this.opacity = 1; // Default base for animation\n        this.SVG_NS = SVG_NS;\n        /**\n         * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n         * node, but may also represent more nodes.\n         *\n         * @name Highcharts.SVGElement#element\n         * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n         */\n        this.element = nodeName === 'span' || nodeName === 'body' ?\n            createElement(nodeName) :\n            doc.createElementNS(this.SVG_NS, nodeName);\n        /**\n         * The renderer that the SVGElement belongs to.\n         *\n         * @name Highcharts.SVGElement#renderer\n         * @type {Highcharts.SVGRenderer}\n         */\n        this.renderer = renderer;\n        this.styles = {};\n        fireEvent(this, 'afterInit');\n    }\n    /**\n     * Add an event listener. This is a simple setter that replaces the\n     * previous event of the same type added by this function, as opposed to\n     * the {@link Highcharts#addEvent} function.\n     *\n     * @sample highcharts/members/element-on/\n     *         A clickable rectangle\n     *\n     * @function Highcharts.SVGElement#on\n     *\n     * @param {string} eventType\n     * The event type.\n     *\n     * @param {Function} handler\n     * The handler callback.\n     *\n     * @return {Highcharts.SVGElement}\n     * The SVGElement for chaining.\n     */\n    on(eventType, handler) {\n        const { onEvents } = this;\n        if (onEvents[eventType]) {\n            // Unbind existing event\n            onEvents[eventType]();\n        }\n        onEvents[eventType] = addEvent(this.element, eventType, handler);\n        return this;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#opacitySetter\n     * @param {string} value\n     * @param {string} key\n     * @param {Highcharts.SVGDOMElement} element\n     */\n    opacitySetter(value, key, element) {\n        // Round off to avoid float errors, like tests where opacity lands on\n        // 9.86957e-06 instead of 0\n        const opacity = Number(Number(value).toFixed(3));\n        this.opacity = opacity;\n        element.setAttribute(key, opacity);\n    }\n    /**\n     * Re-align an aligned text or label after setting the text.\n     *\n     * @private\n     * @function Highcharts.SVGElement#reAlign\n     *\n     */\n    reAlign() {\n        if (this.alignOptions?.width && this.alignOptions.align !== 'left') {\n            this.alignOptions.width = this.getBBox().width;\n            this.placed = false; // Block animation\n            this.align();\n        }\n    }\n    /**\n     * Remove a class name from the element.\n     *\n     * @function Highcharts.SVGElement#removeClass\n     *\n     * @param {string|RegExp} className\n     *        The class name to remove.\n     *\n     * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n     */\n    removeClass(className) {\n        return this.attr('class', ('' + this.attr('class'))\n            .replace(isString(className) ?\n            new RegExp(`(^| )${className}( |$)`) : // #12064, #13590\n            className, ' ')\n            .replace(/ +/g, ' ')\n            .trim());\n    }\n    /**\n     *\n     * @private\n     */\n    removeTextOutline() {\n        const outline = this.element\n            .querySelector('tspan.highcharts-text-outline');\n        if (outline) {\n            this.safeRemoveChild(outline);\n        }\n    }\n    /**\n     * Removes an element from the DOM.\n     *\n     * @private\n     * @function Highcharts.SVGElement#safeRemoveChild\n     *\n     * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n     * The DOM node to remove.\n     */\n    safeRemoveChild(element) {\n        const parentNode = element.parentNode;\n        if (parentNode) {\n            parentNode.removeChild(element);\n        }\n    }\n    /**\n     * Set the coordinates needed to draw a consistent radial gradient across\n     * a shape regardless of positioning inside the chart. Used on pie slices\n     * to make all the slices have the same radial reference point.\n     *\n     * @function Highcharts.SVGElement#setRadialReference\n     *\n     * @param {Array<number>} coordinates\n     * The center reference. The format is `[centerX, centerY, diameter]` in\n     * pixels.\n     *\n     * @return {Highcharts.SVGElement}\n     * Returns the SVGElement for chaining.\n     */\n    setRadialReference(coordinates) {\n        const existingGradient = (this.element.gradient &&\n            this.renderer.gradients[this.element.gradient]);\n        this.element.radialReference = coordinates;\n        // On redrawing objects with an existing gradient, the gradient needs\n        // to be repositioned (#3801)\n        if (existingGradient && existingGradient.radAttr) {\n            existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n        }\n        return this;\n    }\n    /**\n     * Add a shadow to the element. In styled mode, this method is not used,\n     * instead use `defs` and filters.\n     *\n     * @example\n     * renderer.rect(10, 100, 100, 100)\n     *     .attr({ fill: 'red' })\n     *     .shadow(true);\n     *\n     * @function Highcharts.SVGElement#shadow\n     *\n     * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n     *        shadow options. If `true`, the default options are applied. If\n     *        `false`, the current shadow will be removed.\n     *\n     * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n     */\n    shadow(shadowOptions) {\n        const { renderer } = this, options = merge(this.parentGroup?.rotation === 90 ? {\n            offsetX: -1,\n            offsetY: -1\n        } : {}, isObject(shadowOptions) ? shadowOptions : {}), id = renderer.shadowDefinition(options);\n        return this.attr({\n            filter: shadowOptions ?\n                `url(${renderer.url}#${id})` :\n                'none'\n        });\n    }\n    /**\n     * Show the element after it has been hidden.\n     *\n     * @function Highcharts.SVGElement#show\n     *\n     * @param {boolean} [inherit=true]\n     *        Set the visibility attribute to `inherit` rather than `visible`.\n     *        The difference is that an element with `visibility=\"visible\"`\n     *        will be visible even if the parent is hidden.\n     *\n     * @return {Highcharts.SVGElement}\n     *         Returns the SVGElement for chaining.\n     */\n    show(inherit = true) {\n        return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n    }\n    /**\n     * Set the stroke-width and record it on the SVGElement\n     *\n     * @private\n     * @function Highcharts.SVGElement#strokeSetter\n     * @param {number|string|ColorType} value\n     * @param {string} key\n     * @param {Highcharts.SVGDOMElement} element\n     */\n    'stroke-widthSetter'(value, key, element) {\n        // Record it for quick access in getter\n        this[key] = value;\n        element.setAttribute(key, value);\n    }\n    /**\n     * Get the computed stroke width in pixel values. This is used extensively\n     * when drawing shapes to ensure the shapes are rendered crisp and\n     * positioned correctly relative to each other. Using\n     * `shape-rendering: crispEdges` leaves us less control over positioning,\n     * for example when we want to stack columns next to each other, or position\n     * things pixel-perfectly within the plot box.\n     *\n     * The common pattern when placing a shape is:\n     * - Create the SVGElement and add it to the DOM. In styled mode, it will\n     *   now receive a stroke width from the style sheet. In classic mode we\n     *   will add the `stroke-width` attribute.\n     * - Read the computed `elem.strokeWidth()`.\n     * - Place it based on the stroke width.\n     *\n     * @function Highcharts.SVGElement#strokeWidth\n     *\n     * @return {number}\n     * The stroke width in pixels. Even if the given stroke width (in CSS or by\n     * attributes) is based on `em` or other units, the pixel size is returned.\n     */\n    strokeWidth() {\n        // In non-styled mode, read the stroke width as set by .attr\n        if (!this.renderer.styledMode) {\n            return this['stroke-width'] || 0;\n        }\n        // In styled mode, read computed stroke width\n        const val = this.getStyle('stroke-width');\n        let ret = 0, tempElement;\n        // Read pixel values directly\n        if (/px$/.test(val)) {\n            ret = pInt(val);\n            // Other values like em, pt etc need to be measured\n        }\n        else if (val !== '') {\n            tempElement = doc.createElementNS(SVG_NS, 'rect');\n            attr(tempElement, {\n                width: val,\n                'stroke-width': 0\n            });\n            this.element.parentNode.appendChild(tempElement);\n            ret = tempElement.getBBox().width;\n            tempElement.parentNode.removeChild(tempElement);\n        }\n        return ret;\n    }\n    /**\n     * If one of the symbol size affecting parameters are changed,\n     * check all the others only once for each call to an element's\n     * .attr() method\n     *\n     * @private\n     * @function Highcharts.SVGElement#symbolAttr\n     *\n     * @param {Highcharts.SVGAttributes} hash\n     * The attributes to set.\n     */\n    symbolAttr(hash) {\n        const wrapper = this;\n        SVGElement.symbolCustomAttribs.forEach(function (key) {\n            wrapper[key] = pick(hash[key], wrapper[key]);\n        });\n        wrapper.attr({\n            d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n        });\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#textSetter\n     * @param {string} value\n     */\n    textSetter(value) {\n        if (value !== this.textStr) {\n            // Delete size caches when the text changes\n            // delete this.bBox; // old code in series-label\n            delete this.textPxLength;\n            this.textStr = value;\n            if (this.added) {\n                this.renderer.buildText(this);\n            }\n            this.reAlign();\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#titleSetter\n     * @param {string} value\n     */\n    titleSetter(value) {\n        const el = this.element;\n        const titleNode = el.getElementsByTagName('title')[0] ||\n            doc.createElementNS(this.SVG_NS, 'title');\n        // Move to first child\n        if (el.insertBefore) {\n            el.insertBefore(titleNode, el.firstChild);\n        }\n        else {\n            el.appendChild(titleNode);\n        }\n        // Replace text content and escape markup\n        titleNode.textContent = replaceNested(// Scan #[73]\n        pick(value, ''), // #3276, #3895\n        [/<[^>]*>/g, '']).replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n    }\n    /**\n     * Bring the element to the front. Alternatively, a new zIndex can be set.\n     *\n     * @sample highcharts/members/element-tofront/\n     *         Click an element to bring it to front\n     *\n     * @function Highcharts.SVGElement#toFront\n     *\n     * @return {Highcharts.SVGElement}\n     * Returns the SVGElement for chaining.\n     */\n    toFront() {\n        const element = this.element;\n        element.parentNode.appendChild(element);\n        return this;\n    }\n    /**\n     * Move an object and its children by x and y values.\n     *\n     * @function Highcharts.SVGElement#translate\n     *\n     * @param {number} x\n     * The x value.\n     *\n     * @param {number} y\n     * The y value.\n     *\n     * @return {Highcharts.SVGElement}\n     * Translated element.\n     */\n    translate(x, y) {\n        return this.attr({\n            translateX: x,\n            translateY: y\n        });\n    }\n    /**\n     * Update the transform attribute based on internal properties. Deals with\n     * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n     * attributes and updates the SVG `transform` attribute.\n     *\n     * @private\n     * @function Highcharts.SVGElement#updateTransform\n     */\n    updateTransform(attrib = 'transform') {\n        const { element, matrix, rotation = 0, rotationOriginX, rotationOriginY, scaleX, scaleY, translateX = 0, translateY = 0 } = this;\n        // Apply translate. Nearly all transformed elements have translation,\n        // so instead of checking for translate = 0, do it always (#1767,\n        // #1846).\n        const transform = ['translate(' + translateX + ',' + translateY + ')'];\n        // Apply matrix\n        if (defined(matrix)) {\n            transform.push('matrix(' + matrix.join(',') + ')');\n        }\n        // Apply rotation\n        if (rotation) {\n            transform.push('rotate(' + rotation + ' ' +\n                pick(rotationOriginX, element.getAttribute('x'), 0) +\n                ' ' +\n                pick(rotationOriginY, element.getAttribute('y') || 0) + ')');\n            // HTML labels rotation (#20685)\n            if (this.text?.element.tagName === 'SPAN') {\n                this.text.attr({\n                    rotation,\n                    rotationOriginX: (rotationOriginX || 0) - this.padding,\n                    rotationOriginY: (rotationOriginY || 0) - this.padding\n                });\n            }\n        }\n        // Apply scale\n        if (defined(scaleX) || defined(scaleY)) {\n            transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n        }\n        if (transform.length && !(this.text || this).textPath) {\n            element.setAttribute(attrib, transform.join(' '));\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#visibilitySetter\n     *\n     * @param {string} value\n     *\n     * @param {string} key\n     *\n     * @param {Highcharts.SVGDOMElement} element\n     *\n     */\n    visibilitySetter(value, key, element) {\n        // IE9-11 doesn't handle visibility:inherit well, so we remove the\n        // attribute instead (#2881, #3909)\n        if (value === 'inherit') {\n            element.removeAttribute(key);\n        }\n        else if (this[key] !== value) { // #6747\n            element.setAttribute(key, value);\n        }\n        this[key] = value;\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#xGetter\n     */\n    xGetter(key) {\n        if (this.element.nodeName === 'circle') {\n            if (key === 'x') {\n                key = 'cx';\n            }\n            else if (key === 'y') {\n                key = 'cy';\n            }\n        }\n        return this._defaultGetter(key);\n    }\n    /**\n     * @private\n     * @function Highcharts.SVGElement#zIndexSetter\n     */\n    zIndexSetter(value, key) {\n        const renderer = this.renderer, parentGroup = this.parentGroup, parentWrapper = parentGroup || renderer, parentNode = parentWrapper.element || renderer.box, element = this.element, svgParent = parentNode === renderer.box;\n        let childNodes, otherElement, otherZIndex, inserted = false, undefinedOtherZIndex, run = this.added, i;\n        if (defined(value)) {\n            // So we can read it for other elements in the group\n            element.setAttribute('data-z-index', value);\n            value = +value;\n            if (this[key] === value) {\n                // Only update when needed (#3865)\n                run = false;\n            }\n        }\n        else if (defined(this[key])) {\n            element.removeAttribute('data-z-index');\n        }\n        this[key] = value;\n        // Insert according to this and other elements' zIndex. Before .add() is\n        // called, nothing is done. Then on add, or by later calls to\n        // zIndexSetter, the node is placed on the right place in the DOM.\n        if (run) {\n            value = this.zIndex;\n            if (value && parentGroup) {\n                parentGroup.handleZ = true;\n            }\n            childNodes = parentNode.childNodes;\n            for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n                otherElement = childNodes[i];\n                otherZIndex = otherElement.getAttribute('data-z-index');\n                undefinedOtherZIndex = !defined(otherZIndex);\n                if (otherElement !== element) {\n                    if (\n                    // Negative zIndex versus no zIndex:\n                    // On all levels except the highest. If the parent is\n                    // <svg>, then we don't want to put items before <desc>\n                    // or <defs>\n                    value < 0 &&\n                        undefinedOtherZIndex &&\n                        !svgParent &&\n                        !i) {\n                        parentNode.insertBefore(element, childNodes[i]);\n                        inserted = true;\n                    }\n                    else if (\n                    // Insert after the first element with a lower zIndex\n                    pInt(otherZIndex) <= value ||\n                        // If negative zIndex, add this before first undefined\n                        // zIndex element\n                        (undefinedOtherZIndex &&\n                            (!defined(value) || value >= 0))) {\n                        parentNode.insertBefore(element, childNodes[i + 1]);\n                        inserted = true;\n                    }\n                }\n            }\n            if (!inserted) {\n                parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0]);\n                inserted = true;\n            }\n        }\n        return inserted;\n    }\n}\n/* *\n *\n *  Properties\n *\n * */\n// Custom attributes used for symbols, these should be filtered out when\n// setting SVGElement attributes (#9375).\nSVGElement.symbolCustomAttribs = [\n    'anchorX',\n    'anchorY',\n    'clockwise',\n    'end',\n    'height',\n    'innerR',\n    'r',\n    'start',\n    'width',\n    'x',\n    'y'\n];\n// Some shared setters and getters\nSVGElement.prototype.strokeSetter = SVGElement.prototype.fillSetter;\nSVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\nSVGElement.prototype.matrixSetter =\n    SVGElement.prototype.rotationOriginXSetter =\n        SVGElement.prototype.rotationOriginYSetter =\n            SVGElement.prototype.rotationSetter =\n                SVGElement.prototype.scaleXSetter =\n                    SVGElement.prototype.scaleYSetter =\n                        SVGElement.prototype.translateXSetter =\n                            SVGElement.prototype.translateYSetter =\n                                SVGElement.prototype.verticalAlignSetter = function (value, key) {\n                                    this[key] = value;\n                                    this.doTransform = true;\n                                };\n/* *\n *\n *  Default Export\n *\n * */\nexport default SVGElement;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Reference to the global SVGElement class as a workaround for a name conflict\n * in the Highcharts namespace.\n *\n * @global\n * @typedef {global.SVGElement} GlobalSVGElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The horizontal alignment of an element.\n *\n * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n */\n/**\n * Options to align the element relative to the chart or another box.\n *\n * @interface Highcharts.AlignObject\n */ /**\n* Horizontal alignment. Can be one of `left`, `center` and `right`.\n*\n* @name Highcharts.AlignObject#align\n* @type {Highcharts.AlignValue|undefined}\n*\n* @default left\n*/ /**\n* Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n*\n* @name Highcharts.AlignObject#verticalAlign\n* @type {Highcharts.VerticalAlignValue|undefined}\n*\n* @default top\n*/ /**\n* Horizontal pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#x\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Vertical pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#y\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Use the `transform` attribute with translateX and translateY custom\n* attributes to align this elements rather than `x` and `y` attributes.\n*\n* @name Highcharts.AlignObject#alignByTranslate\n* @type {boolean|undefined}\n*\n* @default false\n*/\n/**\n * Bounding box of an element.\n *\n * @interface Highcharts.BBoxObject\n * @extends Highcharts.PositionObject\n */ /**\n* Height of the bounding box.\n*\n* @name Highcharts.BBoxObject#height\n* @type {number}\n*/ /**\n* Width of the bounding box.\n*\n* @name Highcharts.BBoxObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the bounding box.\n*\n* @name Highcharts.BBoxObject#x\n* @type {number}\n*/ /**\n* Vertical position of the bounding box.\n*\n* @name Highcharts.BBoxObject#y\n* @type {number}\n*/\n/**\n * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n * elements for the most parts correspond to SVG, but some are specific to\n * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n * attributes containing a hyphen are _not_ camel-cased, they should be\n * quoted to preserve the hyphen.\n *\n * @example\n * {\n *     'stroke': '#ff0000', // basic\n *     'stroke-width': 2, // hyphenated\n *     'rotation': 45 // custom\n *     'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n * }\n *\n * @interface Highcharts.SVGAttributes\n */ /**\n* @name Highcharts.SVGAttributes#[key:string]\n* @type {*}\n*/ /**\n* @name Highcharts.SVGAttributes#d\n* @type {string|Highcharts.SVGPathArray|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dx\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dy\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#fill\n* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#matrix\n* @type {Array<number>|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotation\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#stroke\n* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#style\n* @type {string|Highcharts.CSSObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#zIndex\n* @type {number|undefined}\n*/\n/**\n * An SVG DOM element. The type is a reference to the regular SVGElement in the\n * global scope.\n *\n * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The vertical alignment of an element.\n *\n * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\nimport SVGElement from './SVGElement.js';\nimport U from '../../Utilities.js';\nconst { defined, extend, isNumber, merge, pick, removeEvent } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * SVG label to render text.\n * @private\n * @class\n * @name Highcharts.SVGLabel\n * @augments Highcharts.SVGElement\n */\nclass SVGLabel extends SVGElement {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(renderer, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n        super(renderer, 'g');\n        this.paddingLeftSetter = this.paddingSetter;\n        this.paddingRightSetter = this.paddingSetter;\n        this.doUpdate = false;\n        this.textStr = str;\n        this.x = x;\n        this.y = y;\n        this.anchorX = anchorX;\n        this.anchorY = anchorY;\n        this.baseline = baseline;\n        this.className = className;\n        this.addClass(className === 'button' ?\n            'highcharts-no-tooltip' :\n            'highcharts-label');\n        if (className) {\n            this.addClass('highcharts-' + className);\n        }\n        // Create the text element. An undefined text content prevents redundant\n        // box calculation (#16121)\n        this.text = renderer.text(void 0, 0, 0, useHTML).attr({ zIndex: 1 });\n        // Validate the shape argument\n        let hasBGImage;\n        if (typeof shape === 'string') {\n            hasBGImage = /^url\\((.*?)\\)$/.test(shape);\n            if (hasBGImage || this.renderer.symbols[shape]) {\n                this.symbolKey = shape;\n            }\n        }\n        this.bBox = SVGLabel.emptyBBox;\n        this.padding = 3;\n        this.baselineOffset = 0;\n        this.needsBox = renderer.styledMode || hasBGImage;\n        this.deferredAttr = {};\n        this.alignFactor = 0;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    alignSetter(value) {\n        const alignFactor = ({\n            left: 0,\n            center: 0.5,\n            right: 1\n        })[value];\n        if (alignFactor !== this.alignFactor) {\n            this.alignFactor = alignFactor;\n            // Bounding box exists, means we're dynamically changing\n            if (this.bBox && isNumber(this.xSetting)) {\n                this.attr({ x: this.xSetting }); // #5134\n            }\n        }\n    }\n    anchorXSetter(value, key) {\n        this.anchorX = value;\n        this.boxAttr(key, Math.round(value) - this.getCrispAdjust() - this.xSetting);\n    }\n    anchorYSetter(value, key) {\n        this.anchorY = value;\n        this.boxAttr(key, value - this.ySetting);\n    }\n    /*\n     * Set a box attribute, or defer it if the box is not yet created\n     */\n    boxAttr(key, value) {\n        if (this.box) {\n            this.box.attr(key, value);\n        }\n        else {\n            this.deferredAttr[key] = value;\n        }\n    }\n    /*\n     * Pick up some properties and apply them to the text instead of the\n     * wrapper.\n     */\n    css(styles) {\n        if (styles) {\n            const textStyles = {};\n            // Create a copy to avoid altering the original object\n            // (#537)\n            styles = merge(styles);\n            SVGLabel.textProps.forEach((prop) => {\n                if (typeof styles[prop] !== 'undefined') {\n                    textStyles[prop] = styles[prop];\n                    delete styles[prop];\n                }\n            });\n            this.text.css(textStyles);\n            // Update existing text, box (#9400, #12163, #18212)\n            if ('fontSize' in textStyles || 'fontWeight' in textStyles) {\n                this.updateTextPadding();\n            }\n            else if ('width' in textStyles || 'textOverflow' in textStyles) {\n                this.updateBoxSize();\n            }\n        }\n        return SVGElement.prototype.css.call(this, styles);\n    }\n    /*\n     * Destroy and release memory.\n     */\n    destroy() {\n        // Added by button implementation\n        removeEvent(this.element, 'mouseenter');\n        removeEvent(this.element, 'mouseleave');\n        if (this.text) {\n            this.text.destroy();\n        }\n        if (this.box) {\n            this.box = this.box.destroy();\n        }\n        // Call base implementation to destroy the rest\n        SVGElement.prototype.destroy.call(this);\n        return void 0;\n    }\n    fillSetter(value, key) {\n        if (value) {\n            this.needsBox = true;\n        }\n        // For animation getter (#6776)\n        this.fill = value;\n        this.boxAttr(key, value);\n    }\n    /*\n     * Return the bounding box of the box, not the group.\n     */\n    getBBox(reload, rot) {\n        // If we have a text string and the DOM bBox was 0, it typically means\n        // that the label was first rendered hidden, so we need to update the\n        // bBox (#15246)\n        if (this.textStr && this.bBox.width === 0 && this.bBox.height === 0) {\n            this.updateBoxSize();\n        }\n        const { padding, height = 0, translateX = 0, translateY = 0, width = 0 } = this, paddingLeft = pick(this.paddingLeft, padding), rotation = rot ?? (this.rotation || 0);\n        let bBox = {\n            width,\n            height,\n            x: translateX + this.bBox.x - paddingLeft,\n            y: translateY + this.bBox.y - padding + this.baselineOffset\n        };\n        if (rotation) {\n            bBox = this.getRotatedBox(bBox, rotation);\n        }\n        return bBox;\n    }\n    getCrispAdjust() {\n        return (this.renderer.styledMode && this.box ?\n            this.box.strokeWidth() :\n            (this['stroke-width'] ?\n                parseInt(this['stroke-width'], 10) :\n                0)) % 2 / 2;\n    }\n    heightSetter(value) {\n        this.heightSetting = value;\n        this.doUpdate = true;\n    }\n    /**\n     * This method is executed in the end of `attr()`, after setting all\n     * attributes in the hash. In can be used to efficiently consolidate\n     * multiple attributes in one SVG property -- e.g., translate, rotate and\n     * scale are merged in one \"transform\" attribute in the SVG node.\n     * Also updating height or width should trigger update of the box size.\n     *\n     * @private\n     * @function Highcharts.SVGLabel#afterSetters\n     */\n    afterSetters() {\n        super.afterSetters();\n        if (this.doUpdate) {\n            this.updateBoxSize();\n            this.doUpdate = false;\n        }\n    }\n    /*\n     * After the text element is added, get the desired size of the border\n     * box and add it before the text in the DOM.\n     */\n    onAdd() {\n        this.text.add(this);\n        this.attr({\n            // Alignment is available now  (#3295, 0 not rendered if given\n            // as a value)\n            text: pick(this.textStr, ''),\n            x: this.x || 0,\n            y: this.y || 0\n        });\n        if (this.box && defined(this.anchorX)) {\n            this.attr({\n                anchorX: this.anchorX,\n                anchorY: this.anchorY\n            });\n        }\n    }\n    paddingSetter(value, key) {\n        if (!isNumber(value)) {\n            this[key] = void 0;\n        }\n        else if (value !== this[key]) {\n            this[key] = value;\n            this.updateTextPadding();\n        }\n    }\n    rSetter(value, key) {\n        this.boxAttr(key, value);\n    }\n    strokeSetter(value, key) {\n        // For animation getter (#6776)\n        this.stroke = value;\n        this.boxAttr(key, value);\n    }\n    'stroke-widthSetter'(value, key) {\n        if (value) {\n            this.needsBox = true;\n        }\n        this['stroke-width'] = value;\n        this.boxAttr(key, value);\n    }\n    'text-alignSetter'(value) {\n        this.textAlign = value;\n    }\n    textSetter(text) {\n        if (typeof text !== 'undefined') {\n            // Must use .attr to ensure transforms are done (#10009)\n            this.text.attr({ text });\n        }\n        this.updateTextPadding();\n        this.reAlign();\n    }\n    /*\n     * This function runs after the label is added to the DOM (when the bounding\n     * box is available), and after the text of the label is updated to detect\n     * the new bounding box and reflect it in the border box.\n     */\n    updateBoxSize() {\n        const text = this.text, attribs = {}, padding = this.padding, \n        // #12165 error when width is null (auto)\n        // #12163 when fontweight: bold, recalculate bBox without cache\n        // #3295 && 3514 box failure when string equals 0\n        bBox = this.bBox = (((!isNumber(this.widthSetting) ||\n            !isNumber(this.heightSetting) ||\n            this.textAlign) && defined(text.textStr)) ?\n            text.getBBox(void 0, 0) :\n            SVGLabel.emptyBBox);\n        let crispAdjust;\n        this.width = this.getPaddedWidth();\n        this.height = (this.heightSetting || bBox.height || 0) + 2 * padding;\n        const metrics = this.renderer.fontMetrics(text);\n        // Update the label-scoped y offset. Math.min because of inline\n        // style (#9400)\n        this.baselineOffset = padding + Math.min(\n        // When applicable, use the font size of the first line (#15707)\n        (this.text.firstLineMetrics || metrics).b, \n        // When the height is 0, there is no bBox, so go with the font\n        // metrics. Highmaps CSS demos.\n        bBox.height || Infinity);\n        // #15491: Vertical centering\n        if (this.heightSetting) {\n            this.baselineOffset += (this.heightSetting - metrics.h) / 2;\n        }\n        if (this.needsBox && !text.textPath) {\n            // Create the border box if it is not already present\n            if (!this.box) {\n                // Symbol definition exists (#5324)\n                const box = this.box = this.symbolKey ?\n                    this.renderer.symbol(this.symbolKey) :\n                    this.renderer.rect();\n                box.addClass(// Don't use label className for buttons\n                (this.className === 'button' ?\n                    '' : 'highcharts-label-box') +\n                    (this.className ?\n                        ' highcharts-' + this.className + '-box' : ''));\n                box.add(this);\n            }\n            crispAdjust = this.getCrispAdjust();\n            attribs.x = crispAdjust;\n            attribs.y = ((this.baseline ? -this.baselineOffset : 0) + crispAdjust);\n            // Apply the box attributes\n            attribs.width = Math.round(this.width);\n            attribs.height = Math.round(this.height);\n            this.box.attr(extend(attribs, this.deferredAttr));\n            this.deferredAttr = {};\n        }\n    }\n    /*\n     * This function runs after setting text or padding, but only if padding\n     * is changed.\n     */\n    updateTextPadding() {\n        const text = this.text;\n        if (!text.textPath) {\n            this.updateBoxSize();\n            // Determine y based on the baseline\n            const textY = this.baseline ? 0 : this.baselineOffset;\n            let textX = pick(this.paddingLeft, this.padding);\n            // Compensate for alignment\n            if (defined(this.widthSetting) &&\n                this.bBox &&\n                (this.textAlign === 'center' || this.textAlign === 'right')) {\n                textX += { center: 0.5, right: 1 }[this.textAlign] * (this.widthSetting - this.bBox.width);\n            }\n            // Update if anything changed\n            if (textX !== text.x || textY !== text.y) {\n                text.attr('x', textX);\n                // #8159 - prevent misplaced data labels in treemap\n                // (useHTML: true)\n                if (text.hasBoxWidthChanged) {\n                    this.bBox = text.getBBox(true);\n                }\n                if (typeof textY !== 'undefined') {\n                    text.attr('y', textY);\n                }\n            }\n            // Record current values\n            text.x = textX;\n            text.y = textY;\n        }\n    }\n    widthSetter(value) {\n        // `width:auto` => null\n        this.widthSetting = isNumber(value) ? value : void 0;\n        this.doUpdate = true;\n    }\n    getPaddedWidth() {\n        const padding = this.padding;\n        const paddingLeft = pick(this.paddingLeft, padding);\n        const paddingRight = pick(this.paddingRight, padding);\n        return ((this.widthSetting || this.bBox.width || 0) +\n            paddingLeft +\n            paddingRight);\n    }\n    xSetter(value) {\n        this.x = value; // For animation getter\n        if (this.alignFactor) {\n            value -= this.alignFactor * this.getPaddedWidth();\n            // Force animation even when setting to the same value (#7898)\n            this['forceAnimate:x'] = true;\n        }\n        this.xSetting = Math.round(value);\n        this.attr('translateX', this.xSetting);\n    }\n    ySetter(value) {\n        this.ySetting = this.y = Math.round(value);\n        this.attr('translateY', this.ySetting);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nSVGLabel.emptyBBox = {\n    width: 0,\n    height: 0,\n    x: 0,\n    y: 0\n};\n/**\n * For labels, these CSS properties are applied to the `text` node directly.\n *\n * @private\n * @name Highcharts.SVGLabel#textProps\n * @type {Array<string>}\n */\nSVGLabel.textProps = [\n    'color', 'direction', 'fontFamily', 'fontSize', 'fontStyle',\n    'fontWeight', 'lineHeight', 'textAlign', 'textDecoration',\n    'textOutline', 'textOverflow', 'whiteSpace', 'width'\n];\n/* *\n *\n *  Default Export\n *\n * */\nexport default SVGLabel;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../HTML/AST.js';\nimport H from '../../Globals.js';\nconst { doc, SVG_NS, win } = H;\nimport U from '../../Utilities.js';\nconst { attr, extend, fireEvent, isString, objectEach, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * SVG Text Builder\n * @private\n * @class\n * @name Highcharts.TextBuilder\n */\nclass TextBuilder {\n    constructor(svgElement) {\n        const textStyles = svgElement.styles;\n        this.renderer = svgElement.renderer;\n        this.svgElement = svgElement;\n        this.width = svgElement.textWidth;\n        this.textLineHeight = textStyles && textStyles.lineHeight;\n        this.textOutline = textStyles && textStyles.textOutline;\n        this.ellipsis = Boolean(textStyles && textStyles.textOverflow === 'ellipsis');\n        this.noWrap = Boolean(textStyles && textStyles.whiteSpace === 'nowrap');\n    }\n    /**\n     * Build an SVG representation of the pseudo HTML given in the object's\n     * svgElement.\n     *\n     * @private\n     *\n     * @return {void}.\n     */\n    buildSVG() {\n        const wrapper = this.svgElement, textNode = wrapper.element, renderer = wrapper.renderer, textStr = pick(wrapper.textStr, '').toString(), hasMarkup = textStr.indexOf('<') !== -1, childNodes = textNode.childNodes, tempParent = !wrapper.added && renderer.box, regexMatchBreaks = /<br.*?>/g, \n        // The buildText code is quite heavy, so if we're not changing\n        // something that affects the text, skip it (#6113).\n        textCache = [\n            textStr,\n            this.ellipsis,\n            this.noWrap,\n            this.textLineHeight,\n            this.textOutline,\n            wrapper.getStyle('font-size'),\n            this.width\n        ].join(',');\n        if (textCache === wrapper.textCache) {\n            return;\n        }\n        wrapper.textCache = textCache;\n        delete wrapper.actualWidth;\n        // Remove old text\n        for (let i = childNodes.length; i--;) {\n            textNode.removeChild(childNodes[i]);\n        }\n        // Simple strings, add text directly and return\n        if (!hasMarkup &&\n            !this.ellipsis &&\n            !this.width &&\n            !wrapper.textPath &&\n            (textStr.indexOf(' ') === -1 ||\n                (this.noWrap && !regexMatchBreaks.test(textStr)))) {\n            textNode.appendChild(doc.createTextNode(this.unescapeEntities(textStr)));\n            // Complex strings, add more logic\n        }\n        else if (textStr !== '') {\n            if (tempParent) {\n                // Attach it to the DOM to read offset width and font size\n                tempParent.appendChild(textNode);\n            }\n            // Step 1. Parse the markup safely and directly into a tree\n            // structure.\n            const ast = new AST(textStr);\n            // Step 2. Do as many as we can of the modifications to the tree\n            // structure before it is added to the DOM\n            this.modifyTree(ast.nodes);\n            ast.addToDOM(textNode);\n            // Step 3. Some modifications can't be done until the structure is\n            // in the DOM, because we need to read computed metrics.\n            this.modifyDOM();\n            // Add title if an ellipsis was added\n            if (this.ellipsis &&\n                (textNode.textContent || '').indexOf('\\u2026') !== -1) {\n                wrapper.attr('title', this.unescapeEntities(wrapper.textStr || '', ['&lt;', '&gt;']) // #7179\n                );\n            }\n            if (tempParent) {\n                tempParent.removeChild(textNode);\n            }\n        }\n        // Apply the text outline\n        if (isString(this.textOutline) && wrapper.applyTextOutline) {\n            wrapper.applyTextOutline(this.textOutline);\n        }\n    }\n    /**\n     * Modify the DOM of the generated SVG structure. This function only does\n     * operations that cannot be done until the elements are attached to the\n     * DOM, like doing layout based on rendered metrics of the added elements.\n     *\n     * @private\n     *\n     */\n    modifyDOM() {\n        const wrapper = this.svgElement;\n        const x = attr(wrapper.element, 'x');\n        wrapper.firstLineMetrics = void 0;\n        // Remove empty tspans (including breaks) from the beginning because\n        // SVG's getBBox doesn't count empty lines. The use case is tooltip\n        // where the header is empty. By doing this in the DOM rather than in\n        // the AST, we can inspect the textContent directly and don't have to\n        // recurse down to look for valid content.\n        let firstChild;\n        while ((firstChild = wrapper.element.firstChild)) {\n            if (/^[\\s\\u200B]*$/.test(firstChild.textContent || ' ')) {\n                wrapper.element.removeChild(firstChild);\n            }\n            else {\n                break;\n            }\n        }\n        // Modify hard line breaks by applying the rendered line height\n        [].forEach.call(wrapper.element.querySelectorAll('tspan.highcharts-br'), (br, i) => {\n            if (br.nextSibling && br.previousSibling) { // #5261\n                if (i === 0 && br.previousSibling.nodeType === 1) {\n                    wrapper.firstLineMetrics = wrapper.renderer\n                        .fontMetrics(br.previousSibling);\n                }\n                attr(br, {\n                    // Since the break is inserted in front of the next\n                    // line, we need to use the next sibling for the line\n                    // height\n                    dy: this.getLineHeight(br.nextSibling),\n                    x\n                });\n            }\n        });\n        // Constrain the line width, either by ellipsis or wrapping\n        const width = this.width || 0;\n        if (!width) {\n            return;\n        }\n        // Insert soft line breaks into each text node\n        const modifyTextNode = (textNode, parentElement) => {\n            const text = textNode.textContent || '';\n            const words = text\n                .replace(/([^\\^])-/g, '$1- ') // Split on hyphens\n                // .trim()\n                .split(' '); // #1273\n            const hasWhiteSpace = !this.noWrap && (words.length > 1 || wrapper.element.childNodes.length > 1);\n            const dy = this.getLineHeight(parentElement);\n            let lineNo = 0;\n            let startAt = wrapper.actualWidth;\n            if (this.ellipsis) {\n                if (text) {\n                    this.truncate(textNode, text, void 0, 0, \n                    // Target width\n                    Math.max(0, \n                    // Subtract the font face to make room for the\n                    // ellipsis itself\n                    width - 0.8 * dy), \n                    // Build the text to test for\n                    (text, currentIndex) => text.substring(0, currentIndex) + '\\u2026');\n                }\n            }\n            else if (hasWhiteSpace) {\n                const lines = [];\n                // Remove preceding siblings in order to make the text length\n                // calculation correct in the truncate function\n                const precedingSiblings = [];\n                while (parentElement.firstChild &&\n                    parentElement.firstChild !== textNode) {\n                    precedingSiblings.push(parentElement.firstChild);\n                    parentElement.removeChild(parentElement.firstChild);\n                }\n                while (words.length) {\n                    // Apply the previous line\n                    if (words.length && !this.noWrap && lineNo > 0) {\n                        lines.push(textNode.textContent || '');\n                        textNode.textContent = words.join(' ')\n                            .replace(/- /g, '-');\n                    }\n                    // For each line, truncate the remaining\n                    // words into the line length.\n                    this.truncate(textNode, void 0, words, lineNo === 0 ? (startAt || 0) : 0, width, \n                    // Build the text to test for\n                    (t, currentIndex) => words\n                        .slice(0, currentIndex)\n                        .join(' ')\n                        .replace(/- /g, '-'));\n                    startAt = wrapper.actualWidth;\n                    lineNo++;\n                }\n                // Reinsert the preceding child nodes\n                precedingSiblings.forEach((childNode) => {\n                    parentElement.insertBefore(childNode, textNode);\n                });\n                // Insert the previous lines before the original text node\n                lines.forEach((line) => {\n                    // Insert the line\n                    parentElement.insertBefore(doc.createTextNode(line), textNode);\n                    // Insert a break\n                    const br = doc.createElementNS(SVG_NS, 'tspan');\n                    br.textContent = '\\u200B'; // Zero-width space\n                    attr(br, { dy, x });\n                    parentElement.insertBefore(br, textNode);\n                });\n            }\n        };\n        // Recurse down the DOM tree and handle line breaks for each text node\n        const modifyChildren = ((node) => {\n            const childNodes = [].slice.call(node.childNodes);\n            childNodes.forEach((childNode) => {\n                if (childNode.nodeType === win.Node.TEXT_NODE) {\n                    modifyTextNode(childNode, node);\n                }\n                else {\n                    // Reset word-wrap width readings after hard breaks\n                    if (childNode.className.baseVal\n                        .indexOf('highcharts-br') !== -1) {\n                        wrapper.actualWidth = 0;\n                    }\n                    // Recurse down to child node\n                    modifyChildren(childNode);\n                }\n            });\n        });\n        modifyChildren(wrapper.element);\n    }\n    /**\n     * Get the rendered line height of a <text>, <tspan> or pure text node.\n     *\n     * @param {DOMElementType|Text} node The node to check for\n     *\n     * @return {number} The rendered line height\n     */\n    getLineHeight(node) {\n        // If the node is a text node, use its parent\n        const element = (node.nodeType === win.Node.TEXT_NODE) ?\n            node.parentElement :\n            node;\n        return this.textLineHeight ?\n            parseInt(this.textLineHeight.toString(), 10) :\n            this.renderer.fontMetrics(element || this.svgElement.element).h;\n    }\n    /**\n     * Transform a pseudo HTML AST node tree into an SVG structure. We do as\n     * much heavy lifting as we can here, before doing the final processing in\n     * the modifyDOM function. The original data is mutated.\n     *\n     * @private\n     *\n     * @param {ASTNode[]} nodes The AST nodes\n     *\n     */\n    modifyTree(nodes) {\n        const modifyChild = (node, i) => {\n            const { attributes = {}, children, style = {}, tagName } = node, styledMode = this.renderer.styledMode;\n            // Apply styling to text tags\n            if (tagName === 'b' || tagName === 'strong') {\n                if (styledMode) {\n                    // eslint-disable-next-line dot-notation\n                    attributes['class'] = 'highcharts-strong';\n                }\n                else {\n                    style.fontWeight = 'bold';\n                }\n            }\n            else if (tagName === 'i' || tagName === 'em') {\n                if (styledMode) {\n                    // eslint-disable-next-line dot-notation\n                    attributes['class'] = 'highcharts-emphasized';\n                }\n                else {\n                    style.fontStyle = 'italic';\n                }\n            }\n            // Modify styling\n            if (style && style.color) {\n                style.fill = style.color;\n            }\n            // Handle breaks\n            if (tagName === 'br') {\n                attributes['class'] = 'highcharts-br'; // eslint-disable-line dot-notation\n                node.textContent = '\\u200B'; // Zero-width space\n                // Trim whitespace off the beginning of new lines\n                const nextNode = nodes[i + 1];\n                if (nextNode && nextNode.textContent) {\n                    nextNode.textContent =\n                        nextNode.textContent.replace(/^ +/gm, '');\n                }\n                // If an anchor has direct text node children, the text is unable to\n                // wrap because there is no `getSubStringLength` function on the\n                // element. Therefore we need to wrap the child text node or nodes\n                // in a tspan. #16173.\n            }\n            else if (tagName === 'a' &&\n                children &&\n                children.some((child) => child.tagName === '#text')) {\n                node.children = [{ children, tagName: 'tspan' }];\n            }\n            if (tagName !== '#text' && tagName !== 'a') {\n                node.tagName = 'tspan';\n            }\n            extend(node, { attributes, style });\n            // Recurse\n            if (children) {\n                children\n                    .filter((c) => c.tagName !== '#text')\n                    .forEach(modifyChild);\n            }\n        };\n        nodes.forEach(modifyChild);\n        fireEvent(this.svgElement, 'afterModifyTree', { nodes });\n    }\n    /*\n     * Truncate the text node contents to a given length. Used when the css\n     * width is set. If the `textOverflow` is `ellipsis`, the text is truncated\n     * character by character to the given length. If not, the text is\n     * word-wrapped line by line.\n     */\n    truncate(textNode, text, words, startAt, width, getString) {\n        const svgElement = this.svgElement;\n        const { rotation } = svgElement;\n        // Cache the lengths to avoid checking the same twice\n        const lengths = [];\n        // Word wrap cannot be truncated to shorter than one word, ellipsis\n        // text can be completely blank.\n        let minIndex = words ? 1 : 0;\n        let maxIndex = (text || words || '').length;\n        let currentIndex = maxIndex;\n        let str;\n        let actualWidth;\n        const getSubStringLength = function (charEnd, concatenatedEnd) {\n            // `charEnd` is used when finding the character-by-character\n            // break for ellipsis, concatenatedEnd is used for word-by-word\n            // break for word wrapping.\n            const end = concatenatedEnd || charEnd;\n            const parentNode = textNode.parentNode;\n            if (parentNode && typeof lengths[end] === 'undefined') {\n                // Modern browsers\n                if (parentNode.getSubStringLength) {\n                    // Fails with DOM exception on unit-tests/legend/members\n                    // of unknown reason. Desired width is 0, text content\n                    // is \"5\" and end is 1.\n                    try {\n                        lengths[end] = startAt +\n                            parentNode.getSubStringLength(0, words ? end + 1 : end);\n                    }\n                    catch (e) {\n                        '';\n                    }\n                }\n            }\n            return lengths[end];\n        };\n        svgElement.rotation = 0; // Discard rotation when computing box\n        actualWidth = getSubStringLength(textNode.textContent.length);\n        if (startAt + actualWidth > width) {\n            // Do a binary search for the index where to truncate the text\n            while (minIndex <= maxIndex) {\n                currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n                // When checking words for word-wrap, we need to build the\n                // string and measure the subStringLength at the concatenated\n                // word length.\n                if (words) {\n                    str = getString(words, currentIndex);\n                }\n                actualWidth = getSubStringLength(currentIndex, str && str.length - 1);\n                if (minIndex === maxIndex) {\n                    // Complete\n                    minIndex = maxIndex + 1;\n                }\n                else if (actualWidth > width) {\n                    // Too large. Set max index to current.\n                    maxIndex = currentIndex - 1;\n                }\n                else {\n                    // Within width. Set min index to current.\n                    minIndex = currentIndex;\n                }\n            }\n            // If max index was 0 it means the shortest possible text was also\n            // too large. For ellipsis that means only the ellipsis, while for\n            // word wrap it means the whole first word.\n            if (maxIndex === 0) {\n                // Remove ellipsis\n                textNode.textContent = '';\n                // If the new text length is one less than the original, we don't\n                // need the ellipsis\n            }\n            else if (!(text && maxIndex === text.length - 1)) {\n                textNode.textContent = str || getString(text || words, currentIndex);\n            }\n        }\n        // When doing line wrapping, prepare for the next line by removing the\n        // items from this line.\n        if (words) {\n            words.splice(0, currentIndex);\n        }\n        svgElement.actualWidth = actualWidth;\n        svgElement.rotation = rotation; // Apply rotation again.\n    }\n    /*\n     * Un-escape HTML entities based on the public `renderer.escapes` list\n     *\n     * @private\n     *\n     * @param {string} inputStr The string to unescape\n     * @param {Array<string>} [except] Exceptions\n     *\n     * @return {string} The processed string\n     */\n    unescapeEntities(inputStr, except) {\n        objectEach(this.renderer.escapes, function (value, key) {\n            if (!except || except.indexOf(value) === -1) {\n                inputStr = inputStr.toString().replace(new RegExp(value, 'g'), key);\n            }\n        });\n        return inputStr;\n    }\n}\nexport default TextBuilder;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../HTML/AST.js';\nimport D from '../../Defaults.js';\nconst { defaultOptions } = D;\nimport Color from '../../Color/Color.js';\nimport H from '../../Globals.js';\nconst { charts, deg2rad, doc, isFirefox, isMS, isWebKit, noop, SVG_NS, symbolSizes, win } = H;\nimport RendererRegistry from '../RendererRegistry.js';\nimport SVGElement from './SVGElement.js';\nimport SVGLabel from './SVGLabel.js';\nimport Symbols from './Symbols.js';\nimport TextBuilder from './TextBuilder.js';\nimport U from '../../Utilities.js';\nconst { addEvent, attr, createElement, crisp, css, defined, destroyObjectProperties, extend, isArray, isNumber, isObject, isString, merge, pick, pInt, replaceNested, uniqueKey } = U;\n/* *\n *\n *  Variables\n *\n * */\nlet hasInternalReferenceBug;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * Allows direct access to the Highcharts rendering layer in order to draw\n * primitive shapes like circles, rectangles, paths or text directly on a chart,\n * or independent from any chart. The SVGRenderer represents a wrapper object\n * for SVG in modern browsers.\n *\n * An existing chart's renderer can be accessed through {@link Chart.renderer}.\n * The renderer can also be used completely decoupled from a chart.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial.\n *\n * @sample highcharts/members/renderer-on-chart\n *         Annotating a chart programmatically.\n * @sample highcharts/members/renderer-basic\n *         Independent SVG drawing.\n *\n * @example\n * // Use directly without a chart object.\n * let renderer = new Highcharts.Renderer(parentNode, 600, 400);\n *\n * @class\n * @name Highcharts.SVGRenderer\n *\n * @param {Highcharts.HTMLDOMElement} container\n *        Where to put the SVG in the web page.\n *\n * @param {number} width\n *        The width of the SVG.\n *\n * @param {number} height\n *        The height of the SVG.\n *\n * @param {Highcharts.CSSObject} [style]\n *        The box style, if not in styleMode\n *\n * @param {boolean} [forExport=false]\n *        Whether the rendered content is intended for export.\n *\n * @param {boolean} [allowHTML=true]\n *        Whether the renderer is allowed to include HTML text, which will be\n *        projected on top of the SVG.\n *\n * @param {boolean} [styledMode=false]\n *        Whether the renderer belongs to a chart that is in styled mode.\n *        If it does, it will avoid setting presentational attributes in\n *        some cases, but not when set explicitly through `.attr` and `.css`\n *        etc.\n */\nclass SVGRenderer {\n    /**\n     * The root `svg` node of the renderer.\n     *\n     * @name Highcharts.SVGRenderer#box\n     * @type {Highcharts.SVGDOMElement}\n     */\n    /**\n     * The wrapper for the root `svg` node of the renderer.\n     *\n     * @name Highcharts.SVGRenderer#boxWrapper\n     * @type {Highcharts.SVGElement}\n     */\n    /**\n     * A pointer to the `defs` node of the root SVG.\n     *\n     * @name Highcharts.SVGRenderer#defs\n     * @type {Highcharts.SVGElement}\n     */\n    /**\n     * Whether the rendered content is intended for export.\n     *\n     * @name Highcharts.SVGRenderer#forExport\n     * @type {boolean | undefined}\n     */\n    /**\n     * Page url used for internal references.\n     *\n     * @private\n     * @name Highcharts.SVGRenderer#url\n     * @type {string}\n     */\n    /**\n     * Initialize the SVGRenderer. Overridable initializer function that takes\n     * the same parameters as the constructor.\n     *\n     * @function Highcharts.SVGRenderer#init\n     *\n     * @param {Highcharts.HTMLDOMElement} container\n     * Where to put the SVG in the web page.\n     *\n     * @param {number} width\n     * The width of the SVG.\n     *\n     * @param {number} height\n     * The height of the SVG.\n     *\n     * @param {Highcharts.CSSObject} [style]\n     * The box style, if not in styleMode\n     *\n     * @param {boolean} [forExport=false]\n     * Whether the rendered content is intended for export.\n     *\n     * @param {boolean} [allowHTML=true]\n     * Whether the renderer is allowed to include HTML text, which will be\n     * projected on top of the SVG.\n     *\n     * @param {boolean} [styledMode=false]\n     * Whether the renderer belongs to a chart that is in styled mode. If it\n     * does, it will avoid setting presentational attributes in some cases, but\n     * not when set explicitly through `.attr` and `.css` etc.\n     */\n    constructor(container, width, height, style, forExport, allowHTML, styledMode) {\n        const renderer = this, boxWrapper = renderer\n            .createElement('svg')\n            .attr({\n            version: '1.1',\n            'class': 'highcharts-root'\n        }), element = boxWrapper.element;\n        if (!styledMode) {\n            boxWrapper.css(this.getStyle(style || {}));\n        }\n        container.appendChild(element);\n        // Always use ltr on the container, otherwise text-anchor will be\n        // flipped and text appear outside labels, buttons, tooltip etc (#3482)\n        attr(container, 'dir', 'ltr');\n        // For browsers other than IE, add the namespace attribute (#1978)\n        if (container.innerHTML.indexOf('xmlns') === -1) {\n            attr(element, 'xmlns', this.SVG_NS);\n        }\n        this.box = element;\n        this.boxWrapper = boxWrapper;\n        this.alignedObjects = [];\n        this.url = this.getReferenceURL();\n        // Add description\n        const desc = this.createElement('desc').add();\n        desc.element.appendChild(doc.createTextNode('Created with @product.name@ @product.version@'));\n        this.defs = this.createElement('defs').add();\n        this.allowHTML = allowHTML;\n        this.forExport = forExport;\n        this.styledMode = styledMode;\n        this.gradients = {}; // Object where gradient SvgElements are stored\n        this.cache = {}; // Cache for numerical bounding boxes\n        this.cacheKeys = [];\n        this.imgCount = 0;\n        this.rootFontSize = boxWrapper.getStyle('font-size');\n        renderer.setSize(width, height, false);\n        // Issue 110 workaround:\n        // In Firefox, if a div is positioned by percentage, its pixel position\n        // may land between pixels. The container itself doesn't display this,\n        // but an SVG element inside this container will be drawn at subpixel\n        // precision. In order to draw sharp lines, this must be compensated\n        // for. This doesn't seem to work inside iframes though (like in\n        // jsFiddle).\n        let subPixelFix, rect;\n        if (isFirefox && container.getBoundingClientRect) {\n            subPixelFix = function () {\n                css(container, { left: 0, top: 0 });\n                rect = container.getBoundingClientRect();\n                css(container, {\n                    left: (Math.ceil(rect.left) - rect.left) + 'px',\n                    top: (Math.ceil(rect.top) - rect.top) + 'px'\n                });\n            };\n            // Run the fix now\n            subPixelFix();\n            // Run it on resize\n            renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * General method for adding a definition to the SVG `defs` tag. Can be used\n     * for gradients, fills, filters etc. Styled mode only. A hook for adding\n     * general definitions to the SVG's defs tag. Definitions can be referenced\n     * from the CSS by its `id`. Read more in\n     * [gradients, shadows and patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n     * Styled mode only.\n     *\n     * @function Highcharts.SVGRenderer#definition\n     *\n     * @param {Highcharts.ASTNode} def\n     * A serialized form of an SVG definition, including children.\n     *\n     * @return {Highcharts.SVGElement}\n     * The inserted node.\n     */\n    definition(def) {\n        const ast = new AST([def]);\n        return ast.addToDOM(this.defs.element);\n    }\n    /**\n     * Get the prefix needed for internal URL references to work in certain\n     * cases. Some older browser versions had a bug where internal url\n     * references in SVG attributes, on the form `url(#some-id)`, would fail if\n     * a base tag was present in the page. There were also issues with\n     * `history.pushState` related to this prefix.\n     *\n     * Related issues: #24, #672, #1070, #5244.\n     *\n     * The affected browsers are:\n     * - Chrome <= 53 (May 2018)\n     * - Firefox <= 51 (January 2017)\n     * - Safari/Mac <= 12.1 (2018 or 2019)\n     * - Safari/iOS <= 13\n     *\n     * @todo Remove this hack when time has passed. All the affected browsers\n     * are evergreens, so it is increasingly unlikely that users are affected by\n     * the bug.\n     *\n     * @return {string}\n     * The prefix to use. An empty string for modern browsers.\n     */\n    getReferenceURL() {\n        if ((isFirefox || isWebKit) &&\n            doc.getElementsByTagName('base').length) {\n            // Detect if a clip path is taking effect by performing a hit test\n            // outside the clipped area. If the hit element is the rectangle\n            // that was supposed to be clipped, the bug is present. This only\n            // has to be performed once per page load, so we store the result\n            // locally in the module.\n            if (!defined(hasInternalReferenceBug)) {\n                const id = uniqueKey();\n                const ast = new AST([{\n                        tagName: 'svg',\n                        attributes: {\n                            width: 8,\n                            height: 8\n                        },\n                        children: [{\n                                tagName: 'defs',\n                                children: [{\n                                        tagName: 'clipPath',\n                                        attributes: {\n                                            id\n                                        },\n                                        children: [{\n                                                tagName: 'rect',\n                                                attributes: {\n                                                    width: 4,\n                                                    height: 4\n                                                }\n                                            }]\n                                    }]\n                            }, {\n                                tagName: 'rect',\n                                attributes: {\n                                    id: 'hitme',\n                                    width: 8,\n                                    height: 8,\n                                    'clip-path': `url(#${id})`,\n                                    fill: 'rgba(0,0,0,0.001)'\n                                }\n                            }]\n                    }]);\n                const svg = ast.addToDOM(doc.body);\n                css(svg, {\n                    position: 'fixed',\n                    top: 0,\n                    left: 0,\n                    zIndex: 9e5\n                });\n                const hitElement = doc.elementFromPoint(6, 6);\n                hasInternalReferenceBug = (hitElement && hitElement.id) === 'hitme';\n                doc.body.removeChild(svg);\n            }\n            if (hasInternalReferenceBug) {\n                // Scan alert #[72]: Loop for nested patterns\n                return replaceNested(win.location.href.split('#')[0], // Remove hash\n                [/<[^>]*>/g, ''], // Wing cut HTML\n                [/([\\('\\)])/g, '\\\\$1'], // Escape parantheses and quotes\n                [/ /g, '%20'] // Replace spaces (needed for Safari only)\n                );\n            }\n        }\n        return '';\n    }\n    /**\n     * Get the global style setting for the renderer.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#getStyle\n     *\n     * @param {Highcharts.CSSObject} style\n     * Style settings.\n     *\n     * @return {Highcharts.CSSObject}\n     * The style settings mixed with defaults.\n     */\n    getStyle(style) {\n        this.style = extend({\n            fontFamily: 'Helvetica, Arial, sans-serif',\n            fontSize: '1rem'\n        }, style);\n        return this.style;\n    }\n    /**\n     * Apply the global style on the renderer, mixed with the default styles.\n     *\n     * @function Highcharts.SVGRenderer#setStyle\n     *\n     * @param {Highcharts.CSSObject} style\n     * CSS to apply.\n     */\n    setStyle(style) {\n        this.boxWrapper.css(this.getStyle(style));\n    }\n    /**\n     * Detect whether the renderer is hidden. This happens when one of the\n     * parent elements has `display: none`. Used internally to detect when we\n     * need to render preliminarily in another div to get the text bounding\n     * boxes right.\n     *\n     * @function Highcharts.SVGRenderer#isHidden\n     *\n     * @return {boolean}\n     * True if it is hidden.\n     */\n    isHidden() {\n        return !this.boxWrapper.getBBox().width;\n    }\n    /**\n     * Destroys the renderer and its allocated members.\n     *\n     * @function Highcharts.SVGRenderer#destroy\n     *\n     * @return {null}\n     * Pass through value.\n     */\n    destroy() {\n        const renderer = this, rendererDefs = renderer.defs;\n        renderer.box = null;\n        renderer.boxWrapper = renderer.boxWrapper.destroy();\n        // Call destroy on all gradient elements\n        destroyObjectProperties(renderer.gradients || {});\n        renderer.gradients = null;\n        renderer.defs = rendererDefs.destroy();\n        // Remove sub pixel fix handler (#982)\n        if (renderer.unSubPixelFix) {\n            renderer.unSubPixelFix();\n        }\n        renderer.alignedObjects = null;\n        return null;\n    }\n    /**\n     * Create a wrapper for an SVG element. Serves as a factory for\n     * {@link SVGElement}, but this function is itself mostly called from\n     * primitive factories like {@link SVGRenderer#path}, {@link\n     * SVGRenderer#rect} or {@link SVGRenderer#text}.\n     *\n     * @function Highcharts.SVGRenderer#createElement\n     *\n     * @param {string} nodeName\n     * The node name, for example `rect`, `g` etc.\n     *\n     * @return {Highcharts.SVGElement}\n     * The generated SVGElement.\n     */\n    createElement(nodeName) {\n        return new this.Element(this, nodeName);\n    }\n    /**\n     * Get converted radial gradient attributes according to the radial\n     * reference. Used internally from the {@link SVGElement#colorGradient}\n     * function.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#getRadialAttr\n     */\n    getRadialAttr(radialReference, gradAttr) {\n        return {\n            cx: (radialReference[0] - radialReference[2] / 2) +\n                (gradAttr.cx || 0) * radialReference[2],\n            cy: (radialReference[1] - radialReference[2] / 2) +\n                (gradAttr.cy || 0) * radialReference[2],\n            r: (gradAttr.r || 0) * radialReference[2]\n        };\n    }\n    /**\n     * Create a drop shadow definition and return its id\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#shadowDefinition\n     *\n     * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n     *        shadow options. If `true`, the default options are applied\n     */\n    shadowDefinition(shadowOptions) {\n        const id = [\n            `highcharts-drop-shadow-${this.chartIndex}`,\n            ...Object.keys(shadowOptions)\n                .map((key) => `${key}-${shadowOptions[key]}`)\n        ].join('-').toLowerCase().replace(/[^a-z\\d\\-]/g, ''), options = merge({\n            color: '#000000',\n            offsetX: 1,\n            offsetY: 1,\n            opacity: 0.15,\n            width: 5\n        }, shadowOptions);\n        if (!this.defs.element.querySelector(`#${id}`)) {\n            this.definition({\n                tagName: 'filter',\n                attributes: {\n                    id,\n                    filterUnits: options.filterUnits\n                },\n                children: this.getShadowFilterContent(options)\n            });\n        }\n        return id;\n    }\n    /**\n     * Get shadow filter content.\n     * NOTE! Overridden in es5 module for IE11 compatibility.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#getShadowFilterContent\n     *\n     * @param {ShadowOptionsObject} options\n     * The shadow options.\n     * @return {Array<AST.Node>}\n     * The shadow filter content.\n     */\n    getShadowFilterContent(options) {\n        return [{\n                tagName: 'feDropShadow',\n                attributes: {\n                    dx: options.offsetX,\n                    dy: options.offsetY,\n                    'flood-color': options.color,\n                    // Tuned and modified to keep a preserve compatibility\n                    // with the old settings\n                    'flood-opacity': Math.min(options.opacity * 5, 1),\n                    stdDeviation: options.width / 2\n                }\n            }];\n    }\n    /**\n     * Parse a simple HTML string into SVG tspans. Called internally when text\n     * is set on an SVGElement. The function supports a subset of HTML tags, CSS\n     * text features like `width`, `text-overflow`, `white-space`, and also\n     * attributes like `href` and `style`.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#buildText\n     *\n     * @param {Highcharts.SVGElement} wrapper\n     * The parent SVGElement.\n     */\n    buildText(wrapper) {\n        new TextBuilder(wrapper).buildSVG();\n    }\n    /**\n     * Returns white for dark colors and black for bright colors, based on W3C's\n     * definition of [Relative luminance](\n     * https://www.w3.org/WAI/GL/wiki/Relative_luminance).\n     *\n     * @function Highcharts.SVGRenderer#getContrast\n     *\n     * @param {Highcharts.ColorString} color\n     * The color to get the contrast for.\n     *\n     * @return {Highcharts.ColorString}\n     * The contrast color, either `#000000` or `#FFFFFF`.\n     */\n    getContrast(color) {\n        // #6216, #17273\n        const rgba = Color.parse(color).rgba\n            .map((b8) => {\n            const c = b8 / 255;\n            return c <= 0.03928 ?\n                c / 12.92 :\n                Math.pow((c + 0.055) / 1.055, 2.4);\n        });\n        // Relative luminance\n        const l = 0.2126 * rgba[0] + 0.7152 * rgba[1] + 0.0722 * rgba[2];\n        // Use white or black based on which provides more contrast\n        return 1.05 / (l + 0.05) > (l + 0.05) / 0.05 ? '#FFFFFF' : '#000000';\n    }\n    /**\n     * Create a button with preset states. Styles for the button can either be\n     * set as arguments, or a general theme for all buttons can be set by the\n     * `global.buttonTheme` option.\n     *\n     * @function Highcharts.SVGRenderer#button\n     *\n     * @param {string} text\n     * The text or HTML to draw.\n     *\n     * @param {number} x\n     * The x position of the button's left side.\n     *\n     * @param {number} y\n     * The y position of the button's top side.\n     *\n     * @param {Highcharts.EventCallbackFunction<Highcharts.SVGElement>} callback\n     * The function to execute on button click or touch.\n     *\n     * @param {Highcharts.SVGAttributes} [theme]\n     * SVG attributes for the normal state.\n     *\n     * @param {Highcharts.SVGAttributes} [hoverState]\n     * SVG attributes for the hover state.\n     *\n     * @param {Highcharts.SVGAttributes} [selectState]\n     * SVG attributes for the pressed state.\n     *\n     * @param {Highcharts.SVGAttributes} [disabledState]\n     * SVG attributes for the disabled state.\n     *\n     * @param {Highcharts.SymbolKeyValue} [shape=rect]\n     * The shape type.\n     *\n     * @param {boolean} [useHTML=false]\n     * Whether to use HTML to render the label.\n     *\n     * @return {Highcharts.SVGElement}\n     * The button element.\n     */\n    button(text, x, y, callback, theme = {}, hoverState, selectState, disabledState, shape, useHTML) {\n        const label = this.label(text, x, y, shape, void 0, void 0, useHTML, void 0, 'button'), styledMode = this.styledMode, args = arguments;\n        let curState = 0;\n        theme = merge(defaultOptions.global.buttonTheme, theme);\n        // @todo Consider moving this to a lower level, like .attr\n        if (styledMode) {\n            delete theme.fill;\n            delete theme.stroke;\n            delete theme['stroke-width'];\n        }\n        const states = theme.states || {}, normalStyle = theme.style || {};\n        delete theme.states;\n        delete theme.style;\n        // Presentational\n        const stateAttribs = [\n            AST.filterUserAttributes(theme)\n        ], \n        // The string type is a mistake, it is just for compliance with\n        // SVGAttribute and is not used in button theme.\n        stateStyles = [normalStyle];\n        if (!styledMode) {\n            ['hover', 'select', 'disabled'].forEach((stateName, i) => {\n                stateAttribs.push(merge(stateAttribs[0], AST.filterUserAttributes(args[i + 5] || states[stateName] || {})));\n                stateStyles.push(stateAttribs[i + 1].style);\n                delete stateAttribs[i + 1].style;\n            });\n        }\n        // Add the events. IE9 and IE10 need mouseover and mouseout to function\n        // (#667).\n        addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {\n            if (curState !== 3) {\n                label.setState(1);\n            }\n        });\n        addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {\n            if (curState !== 3) {\n                label.setState(curState);\n            }\n        });\n        label.setState = (state = 0) => {\n            // Hover state is temporary, don't record it\n            if (state !== 1) {\n                label.state = curState = state;\n            }\n            // Update visuals\n            label\n                .removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n                .addClass('highcharts-button-' +\n                ['normal', 'hover', 'pressed', 'disabled'][state]);\n            if (!styledMode) {\n                label.attr(stateAttribs[state]);\n                const css = stateStyles[state];\n                if (isObject(css)) {\n                    label.css(css);\n                }\n            }\n        };\n        label.attr(stateAttribs[0]);\n        // Presentational attributes\n        if (!styledMode) {\n            label.css(extend({ cursor: 'default' }, normalStyle));\n            // HTML labels don't need to handle pointer events because click and\n            // mouseenter/mouseleave is bound to the underlying <g> element.\n            // Should this be reconsidered, we need more complex logic to share\n            // events between the <g> and its <div> counterpart, and avoid\n            // triggering mouseenter/mouseleave when hovering from one to the\n            // other (#17440).\n            if (useHTML) {\n                label.text.css({ pointerEvents: 'none' });\n            }\n        }\n        return label\n            .on('touchstart', (e) => e.stopPropagation())\n            .on('click', function (e) {\n            if (curState !== 3) {\n                callback.call(label, e);\n            }\n        });\n    }\n    /**\n     * Make a straight line crisper by not spilling out to neighbour pixels.\n     *\n     * @function Highcharts.SVGRenderer#crispLine\n     *\n     * @param {Highcharts.SVGPathArray} points\n     *        The original points on the format `[['M', 0, 0], ['L', 100, 0]]`.\n     *\n     * @param {number} width\n     *        The width of the line.\n     *\n     * @return {Highcharts.SVGPathArray}\n     *         The original points array, but modified to render crisply.\n     */\n    crispLine(points, width) {\n        const [start, end] = points;\n        // Normalize to a crisp line\n        if (defined(start[1]) && start[1] === end[1]) {\n            start[1] = end[1] = crisp(start[1], width);\n        }\n        if (defined(start[2]) && start[2] === end[2]) {\n            start[2] = end[2] = crisp(start[2], width);\n        }\n        return points;\n    }\n    /**\n     * Draw a path, wraps the SVG `path` element.\n     *\n     * @sample highcharts/members/renderer-path-on-chart/\n     *         Draw a path in a chart\n     * @sample highcharts/members/renderer-path/\n     *         Draw a path independent from a chart\n     *\n     * @example\n     * let path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n     *     .attr({ stroke: '#ff00ff' })\n     *     .add();\n     *\n     * @function Highcharts.SVGRenderer#path\n     *\n     * @param {Highcharts.SVGPathArray} [path]\n     * An SVG path definition in array form.\n     *\n     * @return {Highcharts.SVGElement}\n     * The generated wrapper element.\n     *\n     */ /**\n    * Draw a path, wraps the SVG `path` element.\n    *\n    * @function Highcharts.SVGRenderer#path\n    *\n    * @param {Highcharts.SVGAttributes} [attribs]\n    * The initial attributes.\n    *\n    * @return {Highcharts.SVGElement}\n    * The generated wrapper element.\n    */\n    path(path) {\n        const attribs = (this.styledMode ? {} : {\n            fill: 'none'\n        });\n        if (isArray(path)) {\n            attribs.d = path;\n        }\n        else if (isObject(path)) { // Attributes\n            extend(attribs, path);\n        }\n        return this.createElement('path').attr(attribs);\n    }\n    /**\n     * Draw a circle, wraps the SVG `circle` element.\n     *\n     * @sample highcharts/members/renderer-circle/\n     *         Drawing a circle\n     *\n     * @function Highcharts.SVGRenderer#circle\n     *\n     * @param {number} [x]\n     * The center x position.\n     *\n     * @param {number} [y]\n     * The center y position.\n     *\n     * @param {number} [r]\n     * The radius.\n     *\n     * @return {Highcharts.SVGElement}\n     * The generated wrapper element.\n     */ /**\n    * Draw a circle, wraps the SVG `circle` element.\n    *\n    * @function Highcharts.SVGRenderer#circle\n    *\n    * @param {Highcharts.SVGAttributes} [attribs]\n    * The initial attributes.\n    *\n    * @return {Highcharts.SVGElement}\n    * The generated wrapper element.\n    */\n    circle(x, y, r) {\n        const attribs = (isObject(x) ?\n            x :\n            typeof x === 'undefined' ? {} : { x: x, y: y, r: r }), wrapper = this.createElement('circle');\n        // Setting x or y translates to cx and cy\n        wrapper.xSetter = wrapper.ySetter = function (value, key, element) {\n            element.setAttribute('c' + key, value);\n        };\n        return wrapper.attr(attribs);\n    }\n    /**\n     * Draw and return an arc.\n     *\n     * @sample highcharts/members/renderer-arc/\n     *         Drawing an arc\n     *\n     * @function Highcharts.SVGRenderer#arc\n     *\n     * @param {number} [x=0]\n     * Center X position.\n     *\n     * @param {number} [y=0]\n     * Center Y position.\n     *\n     * @param {number} [r=0]\n     * The outer radius' of the arc.\n     *\n     * @param {number} [innerR=0]\n     * Inner radius like used in donut charts.\n     *\n     * @param {number} [start=0]\n     * The starting angle of the arc in radians, where 0 is to the right and\n     * `-Math.PI/2` is up.\n     *\n     * @param {number} [end=0]\n     * The ending angle of the arc in radians, where 0 is to the right and\n     * `-Math.PI/2` is up.\n     *\n     * @return {Highcharts.SVGElement}\n     * The generated wrapper element.\n     */ /**\n    * Draw and return an arc. Overloaded function that takes arguments object.\n    *\n    * @function Highcharts.SVGRenderer#arc\n    *\n    * @param {Highcharts.SVGAttributes} attribs\n    * Initial SVG attributes.\n    *\n    * @return {Highcharts.SVGElement}\n    * The generated wrapper element.\n    */\n    arc(x, y, r, innerR, start, end) {\n        let options;\n        if (isObject(x)) {\n            options = x;\n            y = options.y;\n            r = options.r;\n            innerR = options.innerR;\n            start = options.start;\n            end = options.end;\n            x = options.x;\n        }\n        else {\n            options = { innerR, start, end };\n        }\n        // Arcs are defined as symbols for the ability to set\n        // attributes in attr and animate\n        const arc = this.symbol('arc', x, y, r, r, options);\n        arc.r = r; // #959\n        return arc;\n    }\n    /**\n     * Draw and return a rectangle.\n     *\n     * @function Highcharts.SVGRenderer#rect\n     *\n     * @param {number} [x]\n     * Left position.\n     *\n     * @param {number} [y]\n     * Top position.\n     *\n     * @param {number} [width]\n     * Width of the rectangle.\n     *\n     * @param {number} [height]\n     * Height of the rectangle.\n     *\n     * @param {number} [r]\n     * Border corner radius.\n     *\n     * @param {number} [strokeWidth]\n     * A stroke width can be supplied to allow crisp drawing.\n     *\n     * @return {Highcharts.SVGElement}\n     * The generated wrapper element.\n     */ /**\n    * Draw and return a rectangle.\n    *\n    * @sample highcharts/members/renderer-rect-on-chart/\n    *         Draw a rectangle in a chart\n    * @sample highcharts/members/renderer-rect/\n    *         Draw a rectangle independent from a chart\n    *\n    * @function Highcharts.SVGRenderer#rect\n    *\n    * @param {Highcharts.SVGAttributes} [attributes]\n    * General SVG attributes for the rectangle.\n    *\n    * @return {Highcharts.SVGElement}\n    * The generated wrapper element.\n    */\n    rect(x, y, width, height, r, strokeWidth) {\n        const attribs = (isObject(x) ?\n            x :\n            typeof x === 'undefined' ?\n                {} :\n                {\n                    x,\n                    y,\n                    r,\n                    width: Math.max(width || 0, 0),\n                    height: Math.max(height || 0, 0)\n                }), wrapper = this.createElement('rect');\n        if (!this.styledMode) {\n            if (typeof strokeWidth !== 'undefined') {\n                attribs['stroke-width'] = strokeWidth;\n                extend(attribs, wrapper.crisp(attribs));\n            }\n            attribs.fill = 'none';\n        }\n        wrapper.rSetter = function (value, _key, element) {\n            wrapper.r = value;\n            attr(element, {\n                rx: value,\n                ry: value\n            });\n        };\n        wrapper.rGetter = function () {\n            return wrapper.r || 0;\n        };\n        return wrapper.attr(attribs);\n    }\n    /**\n     * Draw and return a rectangle with advanced corner rounding options.\n     *\n     * @function Highcharts.SVGRenderer#roundedRect\n     *\n     * @param {Highcharts.SVGAttributes} attribs\n     *      Attributes\n     * @return {Highcharts.SVGElement}\n     * The generated wrapper element.\n     */\n    roundedRect(attribs) {\n        return this.symbol('roundedRect').attr(attribs);\n    }\n    /**\n     * Resize the {@link SVGRenderer#box} and re-align all aligned child\n     * elements.\n     *\n     * @sample highcharts/members/renderer-g/\n     *         Show and hide grouped objects\n     *\n     * @function Highcharts.SVGRenderer#setSize\n     *\n     * @param {number} width\n     * The new pixel width.\n     *\n     * @param {number} height\n     * The new pixel height.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animate=true]\n     * Whether and how to animate.\n     */\n    setSize(width, height, animate) {\n        const renderer = this;\n        renderer.width = width;\n        renderer.height = height;\n        renderer.boxWrapper.animate({\n            width: width,\n            height: height\n        }, {\n            step: function () {\n                this.attr({\n                    viewBox: '0 0 ' + this.attr('width') + ' ' +\n                        this.attr('height')\n                });\n            },\n            duration: pick(animate, true) ? void 0 : 0\n        });\n        renderer.alignElements();\n    }\n    /**\n     * Create and return an svg group element. Child\n     * {@link Highcharts.SVGElement} objects are added to the group by using the\n     * group as the first parameter in {@link Highcharts.SVGElement#add|add()}.\n     *\n     * @function Highcharts.SVGRenderer#g\n     *\n     * @param {string} [name]\n     *        The group will be given a class name of `highcharts-{name}`. This\n     *        can be used for styling and scripting.\n     *\n     * @return {Highcharts.SVGElement}\n     *         The generated wrapper element.\n     */\n    g(name) {\n        const elem = this.createElement('g');\n        return name ?\n            elem.attr({ 'class': 'highcharts-' + name }) :\n            elem;\n    }\n    /**\n     * Display an image.\n     *\n     * @sample highcharts/members/renderer-image-on-chart/\n     *         Add an image in a chart\n     * @sample highcharts/members/renderer-image/\n     *         Add an image independent of a chart\n     *\n     * @function Highcharts.SVGRenderer#image\n     *\n     * @param {string} href\n     *        The image source.\n     *\n     * @param {number} [x]\n     *        The X position.\n     *\n     * @param {number} [y]\n     *        The Y position.\n     *\n     * @param {number} [width]\n     *        The image width. If omitted, it defaults to the image file width.\n     *\n     * @param {number} [height]\n     *        The image height. If omitted it defaults to the image file\n     *        height.\n     *\n     * @param {Function} [onload]\n     *        Event handler for image load.\n     *\n     * @return {Highcharts.SVGElement}\n     *         The generated wrapper element.\n     */\n    image(href, x, y, width, height, onload) {\n        const attribs = { preserveAspectRatio: 'none' };\n        // Optional properties (#11756)\n        if (isNumber(x)) {\n            attribs.x = x;\n        }\n        if (isNumber(y)) {\n            attribs.y = y;\n        }\n        if (isNumber(width)) {\n            attribs.width = width;\n        }\n        if (isNumber(height)) {\n            attribs.height = height;\n        }\n        const elemWrapper = this.createElement('image').attr(attribs), onDummyLoad = function (e) {\n            elemWrapper.attr({ href });\n            onload.call(elemWrapper, e);\n        };\n        // Add load event if supplied\n        if (onload) {\n            // We have to use a dummy HTML image since IE support for SVG image\n            // load events is very buggy. First set a transparent src, wait for\n            // dummy to load, and then add the real src to the SVG image.\n            elemWrapper.attr({\n                /* eslint-disable-next-line max-len */\n                href: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n            });\n            const dummy = new win.Image();\n            addEvent(dummy, 'load', onDummyLoad);\n            dummy.src = href;\n            if (dummy.complete) {\n                onDummyLoad({});\n            }\n        }\n        else {\n            elemWrapper.attr({ href });\n        }\n        return elemWrapper;\n    }\n    /**\n     * Draw a symbol out of pre-defined shape paths from\n     * {@link SVGRenderer#symbols}.\n     * It is used in Highcharts for point makers, which cake a `symbol` option,\n     * and label and button backgrounds like in the tooltip and stock flags.\n     *\n     * @function Highcharts.SVGRenderer#symbol\n     *\n     * @param {string} symbol\n     * The symbol name.\n     *\n     * @param {number} [x]\n     * The X coordinate for the top left position.\n     *\n     * @param {number} [y]\n     * The Y coordinate for the top left position.\n     *\n     * @param {number} [width]\n     * The pixel width.\n     *\n     * @param {number} [height]\n     * The pixel height.\n     *\n     * @param {Highcharts.SymbolOptionsObject} [options]\n     * Additional options, depending on the actual symbol drawn.\n     *\n     * @return {Highcharts.SVGElement}\n     * SVG symbol.\n     */\n    symbol(symbol, x, y, width, height, options) {\n        const ren = this, imageRegex = /^url\\((.*?)\\)$/, isImage = imageRegex.test(symbol), sym = (!isImage && (this.symbols[symbol] ? symbol : 'circle')), \n        // Get the symbol definition function\n        symbolFn = (sym && this.symbols[sym]);\n        let obj, path, imageSrc, centerImage;\n        if (symbolFn) {\n            // Check if there's a path defined for this symbol\n            if (typeof x === 'number') {\n                path = symbolFn.call(this.symbols, x || 0, y || 0, width || 0, height || 0, options);\n            }\n            obj = this.path(path);\n            if (!ren.styledMode) {\n                obj.attr('fill', 'none');\n            }\n            // Expando properties for use in animate and attr\n            extend(obj, {\n                symbolName: (sym || void 0),\n                x: x,\n                y: y,\n                width: width,\n                height: height\n            });\n            if (options) {\n                extend(obj, options);\n            }\n            // Image symbols\n        }\n        else if (isImage) {\n            imageSrc = symbol.match(imageRegex)[1];\n            // Create the image synchronously, add attribs async\n            const img = obj = this.image(imageSrc);\n            // The image width is not always the same as the symbol width. The\n            // image may be centered within the symbol, as is the case when\n            // image shapes are used as label backgrounds, for example in flags.\n            img.imgwidth = pick(options && options.width, symbolSizes[imageSrc] && symbolSizes[imageSrc].width);\n            img.imgheight = pick(options && options.height, symbolSizes[imageSrc] && symbolSizes[imageSrc].height);\n            /**\n             * Set the size and position\n             */\n            centerImage = (obj) => obj.attr({\n                width: obj.width,\n                height: obj.height\n            });\n            /**\n             * Width and height setters that take both the image's physical size\n             * and the label size into consideration, and translates the image\n             * to center within the label.\n             */\n            ['width', 'height'].forEach((key) => {\n                img[`${key}Setter`] = function (value, key) {\n                    this[key] = value;\n                    const { alignByTranslate, element, width, height, imgwidth, imgheight } = this, imgSize = key === 'width' ? imgwidth : imgheight;\n                    let scale = 1;\n                    // Scale and center the image within its container. The name\n                    // `backgroundSize` is taken from the CSS spec, but the\n                    // value `within` is made up. Other possible values in the\n                    // spec, `cover` and `contain`, can be implemented if\n                    // needed.\n                    if (options &&\n                        options.backgroundSize === 'within' &&\n                        width &&\n                        height &&\n                        imgwidth &&\n                        imgheight) {\n                        scale = Math.min(width / imgwidth, height / imgheight);\n                        // Update both width and height to keep the ratio\n                        // correct (#17315)\n                        attr(element, {\n                            width: Math.round(imgwidth * scale),\n                            height: Math.round(imgheight * scale)\n                        });\n                    }\n                    else if (element && imgSize) {\n                        element.setAttribute(key, imgSize);\n                    }\n                    if (!alignByTranslate && imgwidth && imgheight) {\n                        this.translate(((width || 0) - (imgwidth * scale)) / 2, ((height || 0) - (imgheight * scale)) / 2);\n                    }\n                };\n            });\n            if (defined(x)) {\n                img.attr({\n                    x: x,\n                    y: y\n                });\n            }\n            img.isImg = true;\n            img.symbolUrl = symbol;\n            if (defined(img.imgwidth) && defined(img.imgheight)) {\n                centerImage(img);\n            }\n            else {\n                // Initialize image to be 0 size so export will still function\n                // if there's no cached sizes.\n                img.attr({ width: 0, height: 0 });\n                // Create a dummy JavaScript image to get the width and height.\n                createElement('img', {\n                    onload: function () {\n                        const chart = charts[ren.chartIndex];\n                        // Special case for SVGs on IE11, the width is not\n                        // accessible until the image is part of the DOM\n                        // (#2854).\n                        if (this.width === 0) {\n                            css(this, {\n                                position: 'absolute',\n                                top: '-999em'\n                            });\n                            doc.body.appendChild(this);\n                        }\n                        // Center the image\n                        symbolSizes[imageSrc] = {\n                            width: this.width,\n                            height: this.height\n                        };\n                        img.imgwidth = this.width;\n                        img.imgheight = this.height;\n                        if (img.element) {\n                            centerImage(img);\n                        }\n                        // Clean up after #2854 workaround.\n                        if (this.parentNode) {\n                            this.parentNode.removeChild(this);\n                        }\n                        // Fire the load event when all external images are\n                        // loaded\n                        ren.imgCount--;\n                        if (!ren.imgCount && chart && !chart.hasLoaded) {\n                            chart.onload();\n                        }\n                    },\n                    src: imageSrc\n                });\n                this.imgCount++;\n            }\n        }\n        return obj;\n    }\n    /**\n     * Define a clipping rectangle. The clipping rectangle is later applied\n     * to {@link SVGElement} objects through the {@link SVGElement#clip}\n     * function.\n     *\n     * This function is deprecated as of v11.2. Instead, use a regular shape\n     * (`rect`, `path` etc), and the `SVGElement.clipTo` function.\n     *\n     * @example\n     * let circle = renderer.circle(100, 100, 100)\n     *     .attr({ fill: 'red' })\n     *     .add();\n     * let clipRect = renderer.clipRect(100, 100, 100, 100);\n     *\n     * // Leave only the lower right quarter visible\n     * circle.clip(clipRect);\n     *\n     * @deprecated\n     *\n     * @function Highcharts.SVGRenderer#clipRect\n     *\n     * @param {number} [x]\n     *\n     * @param {number} [y]\n     *\n     * @param {number} [width]\n     *\n     * @param {number} [height]\n     *\n     * @return {Highcharts.ClipRectElement}\n     *         A clipping rectangle.\n     */\n    clipRect(x, y, width, height) {\n        return this.rect(x, y, width, height, 0);\n    }\n    /**\n     * Draw text. The text can contain a subset of HTML, like spans and anchors\n     * and some basic text styling of these. For more advanced features like\n     * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n     * To update the text after render, run `text.attr({ text: 'New text' })`.\n     *\n     * @sample highcharts/members/renderer-text-on-chart/\n     *         Annotate the chart freely\n     * @sample highcharts/members/renderer-on-chart/\n     *         Annotate with a border and in response to the data\n     * @sample highcharts/members/renderer-text/\n     *         Formatted text\n     *\n     * @function Highcharts.SVGRenderer#text\n     *\n     * @param {string} [str]\n     * The text of (subset) HTML to draw.\n     *\n     * @param {number} [x]\n     * The x position of the text's lower left corner.\n     *\n     * @param {number} [y]\n     * The y position of the text's lower left corner.\n     *\n     * @param {boolean} [useHTML=false]\n     * Use HTML to render the text.\n     *\n     * @return {Highcharts.SVGElement}\n     * The text object.\n     */\n    text(str, x, y, useHTML) {\n        const renderer = this, attribs = {};\n        if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n            return renderer.html(str, x, y);\n        }\n        attribs.x = Math.round(x || 0); // X always needed for line-wrap logic\n        if (y) {\n            attribs.y = Math.round(y);\n        }\n        if (defined(str)) {\n            attribs.text = str;\n        }\n        const wrapper = renderer.createElement('text').attr(attribs);\n        if (!useHTML || (renderer.forExport && !renderer.allowHTML)) {\n            wrapper.xSetter = function (value, key, element) {\n                const tspans = element.getElementsByTagName('tspan'), parentVal = element.getAttribute(key);\n                for (let i = 0, tspan; i < tspans.length; i++) {\n                    tspan = tspans[i];\n                    // If the x values are equal, the tspan represents a line\n                    // break\n                    if (tspan.getAttribute(key) === parentVal) {\n                        tspan.setAttribute(key, value);\n                    }\n                }\n                element.setAttribute(key, value);\n            };\n        }\n        return wrapper;\n    }\n    /**\n     * Utility to return the baseline offset and total line height from the font\n     * size.\n     *\n     * @function Highcharts.SVGRenderer#fontMetrics\n     *\n     * @param {Highcharts.SVGElement|Highcharts.SVGDOMElement|number} [element]\n     *        The element to inspect for a current font size. If a number is\n     *        given, it's used as a fall back for direct font size in pixels.\n     *\n     * @return {Highcharts.FontMetricsObject}\n     *         The font metrics.\n     */\n    fontMetrics(element) {\n        const f = pInt(SVGElement.prototype.getStyle.call(element, 'font-size') || 0);\n        // Empirical values found by comparing font size and bounding box\n        // height. Applies to the default font family.\n        // https://jsfiddle.net/highcharts/7xvn7/\n        const h = f < 24 ? f + 3 : Math.round(f * 1.2), b = Math.round(h * 0.8);\n        return {\n            // Line height\n            h,\n            // Baseline\n            b,\n            // Font size\n            f\n        };\n    }\n    /**\n     * Correct X and Y positioning of a label for rotation (#1764).\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#rotCorr\n     */\n    rotCorr(baseline, rotation, alterY) {\n        let y = baseline;\n        if (rotation && alterY) {\n            y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n        }\n        return {\n            x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n            y: y\n        };\n    }\n    /**\n     * Compatibility function to convert the legacy one-dimensional path array\n     * into an array of segments.\n     *\n     * It is used in maps to parse the `path` option, and in SVGRenderer.dSetter\n     * to support legacy paths from demos.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#pathToSegments\n     */\n    pathToSegments(path) {\n        const ret = [];\n        const segment = [];\n        const commandLength = {\n            A: 8,\n            C: 7,\n            H: 2,\n            L: 3,\n            M: 3,\n            Q: 5,\n            S: 5,\n            T: 3,\n            V: 2\n        };\n        // Short, non-typesafe parsing of the one-dimensional array. It splits\n        // the path on any string. This is not type checked against the tuple\n        // types, but is shorter, and doesn't require specific checks for any\n        // command type in SVG.\n        for (let i = 0; i < path.length; i++) {\n            // Command skipped, repeat previous or insert L/l for M/m\n            if (isString(segment[0]) &&\n                isNumber(path[i]) &&\n                segment.length === commandLength[(segment[0].toUpperCase())]) {\n                path.splice(i, 0, segment[0].replace('M', 'L').replace('m', 'l'));\n            }\n            // Split on string\n            if (typeof path[i] === 'string') {\n                if (segment.length) {\n                    ret.push(segment.slice(0));\n                }\n                segment.length = 0;\n            }\n            segment.push(path[i]);\n        }\n        ret.push(segment.slice(0));\n        return ret;\n        /*\n        // Fully type-safe version where each tuple type is checked. The\n        // downside is filesize and a lack of flexibility for unsupported\n        // commands\n        const ret: SVGPath = [],\n            commands = {\n                A: 7,\n                C: 6,\n                H: 1,\n                L: 2,\n                M: 2,\n                Q: 4,\n                S: 4,\n                T: 2,\n                V: 1,\n                Z: 0\n            };\n\n        let i = 0,\n            lastI = 0,\n            lastCommand;\n\n        while (i < path.length) {\n            const item = path[i];\n\n            let command;\n\n            if (typeof item === 'string') {\n                command = item;\n                i += 1;\n            } else {\n                command = lastCommand || 'M';\n            }\n\n            // Upper case\n            const commandUC = command.toUpperCase();\n\n            if (commandUC in commands) {\n\n                // No numeric parameters\n                if (command === 'Z' || command === 'z') {\n                    ret.push([command]);\n\n                // One numeric parameter\n                } else {\n                    const val0 = path[i];\n                    if (typeof val0 === 'number') {\n\n                        // Horizontal line to\n                        if (command === 'H' || command === 'h') {\n                            ret.push([command, val0]);\n                            i += 1;\n\n                        // Vertical line to\n                        } else if (command === 'V' || command === 'v') {\n                            ret.push([command, val0]);\n                            i += 1;\n\n                        // Two numeric parameters\n                        } else {\n                            const val1 = path[i + 1];\n                            if (typeof val1 === 'number') {\n                                // lineTo\n                                if (command === 'L' || command === 'l') {\n                                    ret.push([command, val0, val1]);\n                                    i += 2;\n\n                                // moveTo\n                                } else if (command === 'M' || command === 'm') {\n                                    ret.push([command, val0, val1]);\n                                    i += 2;\n\n                                // Smooth quadratic bezier\n                                } else if (command === 'T' || command === 't') {\n                                    ret.push([command, val0, val1]);\n                                    i += 2;\n\n                                // Four numeric parameters\n                                } else {\n                                    const val2 = path[i + 2],\n                                        val3 = path[i + 3];\n                                    if (\n                                        typeof val2 === 'number' &&\n                                        typeof val3 === 'number'\n                                    ) {\n                                        // Quadratic bezier to\n                                        if (\n                                            command === 'Q' ||\n                                            command === 'q'\n                                        ) {\n                                            ret.push([\n                                                command,\n                                                val0,\n                                                val1,\n                                                val2,\n                                                val3\n                                            ]);\n                                            i += 4;\n\n                                        // Smooth cubic bezier to\n                                        } else if (\n                                            command === 'S' ||\n                                            command === 's'\n                                        ) {\n                                            ret.push([\n                                                command,\n                                                val0,\n                                                val1,\n                                                val2,\n                                                val3\n                                            ]);\n                                            i += 4;\n\n                                        // Six numeric parameters\n                                        } else {\n                                            const val4 = path[i + 4],\n                                                val5 = path[i + 5];\n\n                                            if (\n                                                typeof val4 === 'number' &&\n                                                typeof val5 === 'number'\n                                            ) {\n                                                // Curve to\n                                                if (\n                                                    command === 'C' ||\n                                                    command === 'c'\n                                                ) {\n                                                    ret.push([\n                                                        command,\n                                                        val0,\n                                                        val1,\n                                                        val2,\n                                                        val3,\n                                                        val4,\n                                                        val5\n                                                    ]);\n                                                    i += 6;\n\n                                                // Seven numeric parameters\n                                                } else {\n                                                    const val6 = path[i + 6];\n\n                                                    // Arc to\n                                                    if (\n                                                        typeof val6 ===\n                                                        'number' &&\n                                                        (\n                                                            command === 'A' ||\n                                                            command === 'a'\n                                                        )\n                                                    ) {\n                                                        ret.push([\n                                                            command,\n                                                            val0,\n                                                            val1,\n                                                            val2,\n                                                            val3,\n                                                            val4,\n                                                            val5,\n                                                            val6\n                                                        ]);\n                                                        i += 7;\n\n                                                    }\n\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                        }\n                    }\n                }\n            }\n\n            // An unmarked command following a moveTo is a lineTo\n            lastCommand = command === 'M' ? 'L' : command;\n\n            if (i === lastI) {\n                break;\n            }\n            lastI = i;\n        }\n        return ret;\n        */\n    }\n    /**\n     * Draw a label, which is an extended text element with support for border\n     * and background. Highcharts creates a `g` element with a text and a `path`\n     * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n     * background are set through `stroke`, `stroke-width` and `fill` attributes\n     * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n     * text after render, run `label.attr({ text: 'New text' })`.\n     *\n     * @sample highcharts/members/renderer-label-on-chart/\n     *         A label on the chart\n     *\n     * @function Highcharts.SVGRenderer#label\n     *\n     * @param {string} str\n     *        The initial text string or (subset) HTML to render.\n     *\n     * @param {number} x\n     *        The x position of the label's left side.\n     *\n     * @param {number} [y]\n     *        The y position of the label's top side or baseline, depending on\n     *        the `baseline` parameter.\n     *\n     * @param {string} [shape='rect']\n     *        The shape of the label's border/background, if any. Defaults to\n     *        `rect`. Other possible values are `callout` or other shapes\n     *        defined in {@link Highcharts.SVGRenderer#symbols}.\n     *\n     * @param {number} [anchorX]\n     *        In case the `shape` has a pointer, like a flag, this is the\n     *        coordinates it should be pinned to.\n     *\n     * @param {number} [anchorY]\n     *        In case the `shape` has a pointer, like a flag, this is the\n     *        coordinates it should be pinned to.\n     *\n     * @param {boolean} [useHTML=false]\n     *        Whether to use HTML to render the label.\n     *\n     * @param {boolean} [baseline=false]\n     *        Whether to position the label relative to the text baseline,\n     *        like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n     *        upper border of the rectangle.\n     *\n     * @param {string} [className]\n     *        Class name for the group.\n     *\n     * @return {Highcharts.SVGElement}\n     *         The generated label.\n     */\n    label(str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n        return new SVGLabel(this, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className);\n    }\n    /**\n     * Re-align all aligned elements.\n     *\n     * @private\n     * @function Highcharts.SVGRenderer#alignElements\n     */\n    alignElements() {\n        this.alignedObjects.forEach((el) => el.align());\n    }\n}\nextend(SVGRenderer.prototype, {\n    /**\n     * A pointer to the renderer's associated Element class.\n     *\n     * @name Highcharts.SVGRenderer#Element\n     * @type {Highcharts.SVGElement}\n     */\n    Element: SVGElement,\n    SVG_NS,\n    /**\n     * A collection of characters mapped to HTML entities. When `useHTML` on an\n     * element is true, these entities will be rendered correctly by HTML. In\n     * the SVG pseudo-HTML, they need to be unescaped back to simple characters,\n     * so for example `&lt;` will render as `<`.\n     *\n     * @example\n     * // Add support for unescaping quotes\n     * Highcharts.SVGRenderer.prototype.escapes['\"'] = '&quot;';\n     *\n     * @name Highcharts.SVGRenderer#escapes\n     * @type {Highcharts.Dictionary<string>}\n     */\n    escapes: {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        \"'\": '&#39;', // eslint-disable-line quotes\n        '\"': '&quot;'\n    },\n    /**\n     * An extendable collection of functions for defining symbol paths.\n     *\n     * @name Highcharts.SVGRenderer#symbols\n     * @type {Highcharts.SymbolDictionary}\n     */\n    symbols: Symbols,\n    /**\n     * Dummy function for plugins, called every time the renderer is updated.\n     * Prior to Highcharts 5, this was used for the canvg renderer.\n     *\n     * @deprecated\n     * @function Highcharts.SVGRenderer#draw\n     */\n    draw: noop\n});\n/* *\n *\n *  Registry\n *\n * */\nRendererRegistry.registerRendererType('svg', SVGRenderer, true);\n/* *\n *\n *  Export Default\n *\n * */\nexport default SVGRenderer;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * A clipping rectangle that can be applied to one or more {@link SVGElement}\n * instances. It is instantiated with the {@link SVGRenderer#clipRect} function\n * and applied with the {@link SVGElement#clip} function.\n *\n * @example\n * let circle = renderer.circle(100, 100, 100)\n *     .attr({ fill: 'red' })\n *     .add();\n * let clipRect = renderer.clipRect(100, 100, 100, 100);\n *\n * // Leave only the lower right quarter visible\n * circle.clip(clipRect);\n *\n * @typedef {Highcharts.SVGElement} Highcharts.ClipRectElement\n */\n/**\n * The font metrics.\n *\n * @interface Highcharts.FontMetricsObject\n */ /**\n* The baseline relative to the top of the box.\n*\n* @name Highcharts.FontMetricsObject#b\n* @type {number}\n*/ /**\n* The font size.\n*\n* @name Highcharts.FontMetricsObject#f\n* @type {number}\n*/ /**\n* The line height.\n*\n* @name Highcharts.FontMetricsObject#h\n* @type {number}\n*/\n/**\n * An object containing `x` and `y` properties for the position of an element.\n *\n * @interface Highcharts.PositionObject\n */ /**\n* X position of the element.\n* @name Highcharts.PositionObject#x\n* @type {number}\n*/ /**\n* Y position of the element.\n* @name Highcharts.PositionObject#y\n* @type {number}\n*/\n/**\n * A rectangle.\n *\n * @interface Highcharts.RectangleObject\n */ /**\n* Height of the rectangle.\n* @name Highcharts.RectangleObject#height\n* @type {number}\n*/ /**\n* Width of the rectangle.\n* @name Highcharts.RectangleObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the rectangle.\n* @name Highcharts.RectangleObject#x\n* @type {number}\n*/ /**\n* Vertical position of the rectangle.\n* @name Highcharts.RectangleObject#y\n* @type {number}\n*/\n/**\n * The shadow options.\n *\n * @interface Highcharts.ShadowOptionsObject\n */ /**\n* The shadow color.\n* @name    Highcharts.ShadowOptionsObject#color\n* @type    {Highcharts.ColorString|undefined}\n* @default ${palette.neutralColor100}\n*/ /**\n* The horizontal offset from the element.\n*\n* @name    Highcharts.ShadowOptionsObject#offsetX\n* @type    {number|undefined}\n* @default 1\n*/ /**\n* The vertical offset from the element.\n* @name    Highcharts.ShadowOptionsObject#offsetY\n* @type    {number|undefined}\n* @default 1\n*/ /**\n* The shadow opacity.\n*\n* @name    Highcharts.ShadowOptionsObject#opacity\n* @type    {number|undefined}\n* @default 0.15\n*/ /**\n* The shadow width or distance from the element.\n* @name    Highcharts.ShadowOptionsObject#width\n* @type    {number|undefined}\n* @default 3\n*/\n/**\n * @interface Highcharts.SizeObject\n */ /**\n* @name Highcharts.SizeObject#height\n* @type {number}\n*/ /**\n* @name Highcharts.SizeObject#width\n* @type {number}\n*/\n/**\n * Array of path commands, that will go into the `d` attribute of an SVG\n * element.\n *\n * @typedef {Array<(Array<Highcharts.SVGPathCommand>|Array<Highcharts.SVGPathCommand,number>|Array<Highcharts.SVGPathCommand,number,number>|Array<Highcharts.SVGPathCommand,number,number,number,number>|Array<Highcharts.SVGPathCommand,number,number,number,number,number,number>|Array<Highcharts.SVGPathCommand,number,number,number,number,number,number,number>)>} Highcharts.SVGPathArray\n */\n/**\n * Possible path commands in an SVG path array. Valid values are `A`, `C`, `H`,\n * `L`, `M`, `Q`, `S`, `T`, `V`, `Z`.\n *\n * @typedef {string} Highcharts.SVGPathCommand\n * @validvalue [\"a\",\"c\",\"h\",\"l\",\"m\",\"q\",\"s\",\"t\",\"v\",\"z\",\"A\",\"C\",\"H\",\"L\",\"M\",\"Q\",\"S\",\"T\",\"V\",\"Z\"]\n */\n/**\n * An extendable collection of functions for defining symbol paths. Symbols are\n * used internally for point markers, button and label borders and backgrounds,\n * or custom shapes. Extendable by adding to {@link SVGRenderer#symbols}.\n *\n * @interface Highcharts.SymbolDictionary\n */ /**\n* @name Highcharts.SymbolDictionary#[key:string]\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#arc\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#callout\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#circle\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#diamond\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#square\n* @type {Function|undefined}\n*/ /**\n* @name Highcharts.SymbolDictionary#triangle\n* @type {Function|undefined}\n*/\n/**\n * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`, `triangle`,\n * and `triangle-down`. Symbols are used internally for point markers, button\n * and label borders and backgrounds, or custom shapes. Extendable by adding to\n * {@link SVGRenderer#symbols}.\n *\n * @typedef {\"arc\"|\"callout\"|\"circle\"|\"diamond\"|\"square\"|\"triangle\"|\"triangle-down\"} Highcharts.SymbolKeyValue\n */\n/**\n * Additional options, depending on the actual symbol drawn.\n *\n * @interface Highcharts.SymbolOptionsObject\n */ /**\n* The anchor X position for the `callout` symbol. This is where the chevron\n* points to.\n*\n* @name Highcharts.SymbolOptionsObject#anchorX\n* @type {number|undefined}\n*/ /**\n* The anchor Y position for the `callout` symbol. This is where the chevron\n* points to.\n*\n* @name Highcharts.SymbolOptionsObject#anchorY\n* @type {number|undefined}\n*/ /**\n* The end angle of an `arc` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#end\n* @type {number|undefined}\n*/ /**\n* Whether to draw `arc` symbol open or closed.\n*\n* @name Highcharts.SymbolOptionsObject#open\n* @type {boolean|undefined}\n*/ /**\n* The radius of an `arc` symbol, or the border radius for the `callout` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#r\n* @type {number|undefined}\n*/ /**\n* The start angle of an `arc` symbol.\n*\n* @name Highcharts.SymbolOptionsObject#start\n* @type {number|undefined}\n*/\n(''); // Keeps doclets above in transpiled file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../../Utilities.js';\nconst { defined, isNumber, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/* eslint-disable require-jsdoc, valid-jsdoc */\n/**\n *\n */\nfunction arc(cx, cy, w, h, options) {\n    const arc = [];\n    if (options) {\n        const start = options.start || 0, rx = pick(options.r, w), ry = pick(options.r, h || w), \n        // Subtract a small number to prevent cos and sin of start and end\n        // from becoming equal on 360 arcs (#1561). The size of the circle\n        // affects the constant, therefore the division by `rx`. If the\n        // proximity is too small, the arc disappears. If it is too great, a\n        // gap appears. This can be seen in the animation of the official\n        // bubble demo (#20586).\n        proximity = 0.0002 / (options.borderRadius ? 1 : Math.max(rx, 1)), fullCircle = (Math.abs((options.end || 0) - start - 2 * Math.PI) <\n            proximity), end = (options.end || 0) - (fullCircle ? proximity : 0), innerRadius = options.innerR, open = pick(options.open, fullCircle), cosStart = Math.cos(start), sinStart = Math.sin(start), cosEnd = Math.cos(end), sinEnd = Math.sin(end), \n        // Proximity takes care of rounding errors around PI (#6971)\n        longArc = pick(options.longArc, end - start - Math.PI < proximity ? 0 : 1);\n        let arcSegment = [\n            'A', // ArcTo\n            rx, // X radius\n            ry, // Y radius\n            0, // Slanting\n            longArc, // Long or short arc\n            pick(options.clockwise, 1), // Clockwise\n            cx + rx * cosEnd,\n            cy + ry * sinEnd\n        ];\n        arcSegment.params = { start, end, cx, cy }; // Memo for border radius\n        arc.push([\n            'M',\n            cx + rx * cosStart,\n            cy + ry * sinStart\n        ], arcSegment);\n        if (defined(innerRadius)) {\n            arcSegment = [\n                'A', // ArcTo\n                innerRadius, // X radius\n                innerRadius, // Y radius\n                0, // Slanting\n                longArc, // Long or short arc\n                // Clockwise - opposite to the outer arc clockwise\n                defined(options.clockwise) ? 1 - options.clockwise : 0,\n                cx + innerRadius * cosStart,\n                cy + innerRadius * sinStart\n            ];\n            // Memo for border radius\n            arcSegment.params = {\n                start: end,\n                end: start,\n                cx,\n                cy\n            };\n            arc.push(open ?\n                [\n                    'M',\n                    cx + innerRadius * cosEnd,\n                    cy + innerRadius * sinEnd\n                ] : [\n                'L',\n                cx + innerRadius * cosEnd,\n                cy + innerRadius * sinEnd\n            ], arcSegment);\n        }\n        if (!open) {\n            arc.push(['Z']);\n        }\n    }\n    return arc;\n}\n/**\n * Callout shape used for default tooltips.\n */\nfunction callout(x, y, w, h, options) {\n    const arrowLength = 6, halfDistance = 6, r = Math.min((options && options.r) || 0, w, h), safeDistance = r + halfDistance, anchorX = options && options.anchorX, anchorY = options && options.anchorY || 0;\n    const path = roundedRect(x, y, w, h, { r });\n    if (!isNumber(anchorX)) {\n        return path;\n    }\n    // Do not render a connector, if anchor starts inside the label\n    if (anchorX < w && anchorX > 0 && anchorY < h && anchorY > 0) {\n        return path;\n    }\n    // Anchor on right side\n    if (x + anchorX > w - safeDistance) {\n        // Chevron\n        if (anchorY > y + safeDistance &&\n            anchorY < y + h - safeDistance) {\n            path.splice(3, 1, ['L', x + w, anchorY - halfDistance], ['L', x + w + arrowLength, anchorY], ['L', x + w, anchorY + halfDistance], ['L', x + w, y + h - r]);\n            // Simple connector\n        }\n        else {\n            if (anchorX < w) { // Corner connector\n                const isTopCorner = anchorY < y + safeDistance, cornerY = isTopCorner ? y : y + h, sliceStart = isTopCorner ? 2 : 5;\n                path.splice(sliceStart, 0, ['L', anchorX, anchorY], ['L', x + w - r, cornerY]);\n            }\n            else { // Side connector\n                path.splice(3, 1, ['L', x + w, h / 2], ['L', anchorX, anchorY], ['L', x + w, h / 2], ['L', x + w, y + h - r]);\n            }\n        }\n        // Anchor on left side\n    }\n    else if (x + anchorX < safeDistance) {\n        // Chevron\n        if (anchorY > y + safeDistance &&\n            anchorY < y + h - safeDistance) {\n            path.splice(7, 1, ['L', x, anchorY + halfDistance], ['L', x - arrowLength, anchorY], ['L', x, anchorY - halfDistance], ['L', x, y + r]);\n            // Simple connector\n        }\n        else {\n            if (anchorX > 0) { // Corner connector\n                const isTopCorner = anchorY < y + safeDistance, cornerY = isTopCorner ? y : y + h, sliceStart = isTopCorner ? 1 : 6;\n                path.splice(sliceStart, 0, ['L', anchorX, anchorY], ['L', x + r, cornerY]);\n            }\n            else { // Side connector\n                path.splice(7, 1, ['L', x, h / 2], ['L', anchorX, anchorY], ['L', x, h / 2], ['L', x, y + r]);\n            }\n        }\n    }\n    else if ( // Replace bottom\n    anchorY > h &&\n        anchorX < w - safeDistance) {\n        path.splice(5, 1, ['L', anchorX + halfDistance, y + h], ['L', anchorX, y + h + arrowLength], ['L', anchorX - halfDistance, y + h], ['L', x + r, y + h]);\n    }\n    else if ( // Replace top\n    anchorY < 0 &&\n        anchorX > safeDistance) {\n        path.splice(1, 1, ['L', anchorX - halfDistance, y], ['L', anchorX, y - arrowLength], ['L', anchorX + halfDistance, y], ['L', w - r, y]);\n    }\n    return path;\n}\n/**\n *\n */\nfunction circle(x, y, w, h) {\n    // Return a full arc\n    return arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n        start: Math.PI * 0.5,\n        end: Math.PI * 2.5,\n        open: false\n    });\n}\n/**\n *\n */\nfunction diamond(x, y, w, h) {\n    return [\n        ['M', x + w / 2, y],\n        ['L', x + w, y + h / 2],\n        ['L', x + w / 2, y + h],\n        ['L', x, y + h / 2],\n        ['Z']\n    ];\n}\n// #15291\n/**\n *\n */\nfunction rect(x, y, w, h, options) {\n    if (options && options.r) {\n        return roundedRect(x, y, w, h, options);\n    }\n    return [\n        ['M', x, y],\n        ['L', x + w, y],\n        ['L', x + w, y + h],\n        ['L', x, y + h],\n        ['Z']\n    ];\n}\n/**\n *\n */\nfunction roundedRect(x, y, w, h, options) {\n    const r = options?.r || 0;\n    return [\n        ['M', x + r, y],\n        ['L', x + w - r, y], // Top side\n        ['A', r, r, 0, 0, 1, x + w, y + r], // Top-right corner\n        ['L', x + w, y + h - r], // Right side\n        ['A', r, r, 0, 0, 1, x + w - r, y + h], // Bottom-right corner\n        ['L', x + r, y + h], // Bottom side\n        ['A', r, r, 0, 0, 1, x, y + h - r], // Bottom-left corner\n        ['L', x, y + r], // Left side\n        ['A', r, r, 0, 0, 1, x + r, y],\n        ['Z'] // Top-left corner\n    ];\n}\n/**\n *\n */\nfunction triangle(x, y, w, h) {\n    return [\n        ['M', x + w / 2, y],\n        ['L', x + w, y + h],\n        ['L', x, y + h],\n        ['Z']\n    ];\n}\n/**\n *\n */\nfunction triangleDown(x, y, w, h) {\n    return [\n        ['M', x, y],\n        ['L', x + w, y],\n        ['L', x + w / 2, y + h],\n        ['Z']\n    ];\n}\nconst Symbols = {\n    arc,\n    callout,\n    circle,\n    diamond,\n    rect,\n    roundedRect,\n    square: rect,\n    triangle,\n    'triangle-down': triangleDown\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default Symbols;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../Renderer/HTML/AST.js';\nimport A from '../Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport F from '../Templating.js';\nconst { format } = F;\nimport U from '../Utilities.js';\nconst { addEvent, crisp, erase, extend, fireEvent, getNestedProperty, isArray, isFunction, isNumber, isObject, merge, pick, syncTimeout, removeEvent, uniqueKey } = U;\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n *  Class\n *\n * */\n/**\n * The Point object. The point objects are generated from the `series.data`\n * configuration objects or raw numbers. They can be accessed from the\n * `Series.points` array. Other ways to instantiate points are through {@link\n * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n *\n * @class\n * @name Highcharts.Point\n */\nclass Point {\n    /**\n     * For categorized axes this property holds the category name for the\n     * point. For other axes it holds the X value.\n     *\n     * @name Highcharts.Point#category\n     * @type {number|string}\n     */\n    /**\n     * The name of the point. The name can be given as the first position of the\n     * point configuration array, or as a `name` property in the configuration:\n     *\n     * @example\n     * // Array config\n     * data: [\n     *     ['John', 1],\n     *     ['Jane', 2]\n     * ]\n     *\n     * // Object config\n     * data: [{\n     *        name: 'John',\n     *        y: 1\n     * }, {\n     *     name: 'Jane',\n     *     y: 2\n     * }]\n     *\n     * @name Highcharts.Point#name\n     * @type {string}\n     */\n    /**\n     * The point's options as applied in the initial configuration, or\n     * extended through `Point.update`.\n     *\n     * In TypeScript you have to extend `PointOptionsObject` via an\n     * additional interface to allow custom data options:\n     *\n     * ```\n     * declare interface PointOptionsObject {\n     *     customProperty: string;\n     * }\n     * ```\n     *\n     * @name Highcharts.Point#options\n     * @type {Highcharts.PointOptionsObject}\n     */\n    /**\n     * The percentage for points in a stacked series, pies or gauges.\n     *\n     * @name Highcharts.Point#percentage\n     * @type {number|undefined}\n     */\n    /**\n     * The series object associated with the point.\n     *\n     * @name Highcharts.Point#series\n     * @type {Highcharts.Series}\n     */\n    /**\n     * The attributes of the rendered SVG shape like in `column` or `pie`\n     * series.\n     *\n     * @readonly\n     * @name Highcharts.Point#shapeArgs\n     * @type {Readonly<Highcharts.SVGAttributes>|undefined}\n     */\n    /**\n     * The total of values in either a stack for stacked series, or a pie in a\n     * pie series.\n     *\n     * @name Highcharts.Point#total\n     * @type {number|undefined}\n     */\n    /**\n     * For certain series types, like pie charts, where individual points can\n     * be shown or hidden.\n     *\n     * @name Highcharts.Point#visible\n     * @type {boolean}\n     * @default true\n     */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Animate SVG elements associated with the point.\n     *\n     * @private\n     * @function Highcharts.Point#animateBeforeDestroy\n     */\n    animateBeforeDestroy() {\n        const point = this, animateParams = { x: point.startXPos, opacity: 0 }, graphicalProps = point.getGraphicalProps();\n        graphicalProps.singular.forEach(function (prop) {\n            const isDataLabel = prop === 'dataLabel';\n            point[prop] = point[prop].animate(isDataLabel ? {\n                x: point[prop].startXPos,\n                y: point[prop].startYPos,\n                opacity: 0\n            } : animateParams);\n        });\n        graphicalProps.plural.forEach(function (plural) {\n            point[plural].forEach(function (item) {\n                if (item.element) {\n                    item.animate(extend({ x: point.startXPos }, (item.startYPos ? {\n                        x: item.startXPos,\n                        y: item.startYPos\n                    } : {})));\n                }\n            });\n        });\n    }\n    /**\n     * Apply the options containing the x and y data and possible some extra\n     * properties. Called on point init or from point.update.\n     *\n     * @private\n     * @function Highcharts.Point#applyOptions\n     *\n     * @param {Highcharts.PointOptionsType} options\n     *        The point options as defined in series.data.\n     *\n     * @param {number} [x]\n     *        Optionally, the x value.\n     *\n     * @return {Highcharts.Point}\n     *         The Point instance.\n     */\n    applyOptions(options, x) {\n        const point = this, series = point.series, pointValKey = series.options.pointValKey || series.pointValKey;\n        options = Point.prototype.optionsToObject.call(this, options);\n        // Copy options directly to point\n        extend(point, options);\n        point.options = point.options ?\n            extend(point.options, options) :\n            options;\n        // Since options are copied into the Point instance, some accidental\n        // options must be shielded (#5681)\n        if (options.group) {\n            delete point.group;\n        }\n        if (options.dataLabels) {\n            delete point.dataLabels;\n        }\n        /**\n         * The y value of the point.\n         * @name Highcharts.Point#y\n         * @type {number|undefined}\n         */\n        // For higher dimension series types. For instance, for ranges, point.y\n        // is mapped to point.low.\n        if (pointValKey) {\n            point.y = Point.prototype.getNestedProperty.call(point, pointValKey);\n        }\n        // The point is initially selected by options (#5777)\n        if (point.selected) {\n            point.state = 'select';\n        }\n        /**\n         * The x value of the point.\n         * @name Highcharts.Point#x\n         * @type {number}\n         */\n        // If no x is set by now, get auto incremented value. All points must\n        // have an x value, however the y value can be null to create a gap in\n        // the series\n        if ('name' in point &&\n            typeof x === 'undefined' &&\n            series.xAxis &&\n            series.xAxis.hasNames) {\n            point.x = series.xAxis.nameToX(point);\n        }\n        if (typeof point.x === 'undefined' && series) {\n            point.x = x ?? series.autoIncrement();\n        }\n        else if (isNumber(options.x) && series.options.relativeXValue) {\n            point.x = series.autoIncrement(options.x);\n        }\n        point.isNull = this.isValid && !this.isValid();\n        point.formatPrefix = point.isNull ? 'null' : 'point'; // #9233, #10874\n        return point;\n    }\n    /**\n     * Destroy a point to clear memory. Its reference still stays in\n     * `series.data`.\n     *\n     * @private\n     * @function Highcharts.Point#destroy\n     */\n    destroy() {\n        if (!this.destroyed) {\n            const point = this, series = point.series, chart = series.chart, dataSorting = series.options.dataSorting, hoverPoints = chart.hoverPoints, globalAnimation = point.series.chart.renderer.globalAnimation, animation = animObject(globalAnimation);\n            /**\n             * Allow to call after animation.\n             * @private\n             */\n            const destroyPoint = () => {\n                // Remove all events and elements\n                if (point.graphic ||\n                    point.graphics ||\n                    point.dataLabel ||\n                    point.dataLabels) {\n                    removeEvent(point);\n                    point.destroyElements();\n                }\n                for (const prop in point) { // eslint-disable-line guard-for-in\n                    delete point[prop];\n                }\n            };\n            if (point.legendItem) {\n                // Pies have legend items\n                chart.legend.destroyItem(point);\n            }\n            if (hoverPoints) {\n                point.setState();\n                erase(hoverPoints, point);\n                if (!hoverPoints.length) {\n                    chart.hoverPoints = null;\n                }\n            }\n            if (point === chart.hoverPoint) {\n                point.onMouseOut();\n            }\n            // Remove properties after animation\n            if (!dataSorting || !dataSorting.enabled) {\n                destroyPoint();\n            }\n            else {\n                this.animateBeforeDestroy();\n                syncTimeout(destroyPoint, animation.duration);\n            }\n            chart.pointCount--;\n        }\n        this.destroyed = true;\n    }\n    /**\n     * Destroy SVG elements associated with the point.\n     *\n     * @private\n     * @function Highcharts.Point#destroyElements\n     * @param {Highcharts.Dictionary<number>} [kinds]\n     */\n    destroyElements(kinds) {\n        const point = this, props = point.getGraphicalProps(kinds);\n        props.singular.forEach(function (prop) {\n            point[prop] = point[prop].destroy();\n        });\n        props.plural.forEach(function (plural) {\n            point[plural].forEach(function (item) {\n                if (item && item.element) {\n                    item.destroy();\n                }\n            });\n            delete point[plural];\n        });\n    }\n    /**\n     * Fire an event on the Point object.\n     *\n     * @private\n     * @function Highcharts.Point#firePointEvent\n     *\n     * @param {string} eventType\n     *        Type of the event.\n     *\n     * @param {Highcharts.Dictionary<any>|Event} [eventArgs]\n     *        Additional event arguments.\n     *\n     * @param {Highcharts.EventCallbackFunction<Highcharts.Point>|Function} [defaultFunction]\n     *        Default event handler.\n     *\n     * @emits Highcharts.Point#event:*\n     */\n    firePointEvent(eventType, eventArgs, defaultFunction) {\n        const point = this, series = this.series, seriesOptions = series.options;\n        // Load event handlers on demand to save time on mouseover/out\n        point.manageEvent(eventType);\n        // Add default handler if in selection mode\n        if (eventType === 'click' && seriesOptions.allowPointSelect) {\n            defaultFunction = function (event) {\n                // Control key is for Windows, meta (= Cmd key) for Mac, Shift\n                // for Opera.\n                if (!point.destroyed && point.select) { // #2911, #19075\n                    point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n                }\n            };\n        }\n        fireEvent(point, eventType, eventArgs, defaultFunction);\n    }\n    /**\n     * Get the CSS class names for individual points. Used internally where the\n     * returned value is set on every point.\n     *\n     * @function Highcharts.Point#getClassName\n     *\n     * @return {string}\n     *         The class names.\n     */\n    getClassName() {\n        const point = this;\n        return 'highcharts-point' +\n            (point.selected ? ' highcharts-point-select' : '') +\n            (point.negative ? ' highcharts-negative' : '') +\n            (point.isNull ? ' highcharts-null-point' : '') +\n            (typeof point.colorIndex !== 'undefined' ?\n                ' highcharts-color-' + point.colorIndex : '') +\n            (point.options.className ? ' ' + point.options.className : '') +\n            (point.zone && point.zone.className ? ' ' +\n                point.zone.className.replace('highcharts-negative', '') : '');\n    }\n    /**\n     * Get props of all existing graphical point elements.\n     *\n     * @private\n     * @function Highcharts.Point#getGraphicalProps\n     */\n    getGraphicalProps(kinds) {\n        const point = this, props = [], graphicalProps = { singular: [], plural: [] };\n        let prop, i;\n        kinds = kinds || { graphic: 1, dataLabel: 1 };\n        if (kinds.graphic) {\n            props.push('graphic', 'connector' // Used by dumbbell\n            );\n        }\n        if (kinds.dataLabel) {\n            props.push('dataLabel', 'dataLabelPath', 'dataLabelUpper');\n        }\n        i = props.length;\n        while (i--) {\n            prop = props[i];\n            if (point[prop]) {\n                graphicalProps.singular.push(prop);\n            }\n        }\n        [\n            'graphic',\n            'dataLabel'\n        ].forEach(function (prop) {\n            const plural = prop + 's';\n            if (kinds[prop] && point[plural]) {\n                graphicalProps.plural.push(plural);\n            }\n        });\n        return graphicalProps;\n    }\n    /**\n     * Return the configuration hash needed for the data label and tooltip\n     * formatters.\n     *\n     * @function Highcharts.Point#getLabelConfig\n     *\n     * @return {Highcharts.PointLabelObject}\n     *         Abstract object used in formatters and formats.\n     */\n    getLabelConfig() {\n        return {\n            x: this.category,\n            y: this.y,\n            color: this.color,\n            colorIndex: this.colorIndex,\n            key: this.name || this.category,\n            series: this.series,\n            point: this,\n            percentage: this.percentage,\n            total: this.total || this.stackTotal\n        };\n    }\n    /**\n     * Returns the value of the point property for a given value.\n     * @private\n     */\n    getNestedProperty(key) {\n        if (!key) {\n            return;\n        }\n        if (key.indexOf('custom.') === 0) {\n            return getNestedProperty(key, this.options);\n        }\n        return this[key];\n    }\n    /**\n     * In a series with `zones`, return the zone that the point belongs to.\n     *\n     * @function Highcharts.Point#getZone\n     *\n     * @return {Highcharts.SeriesZonesOptionsObject}\n     *         The zone item.\n     */\n    getZone() {\n        const series = this.series, zones = series.zones, zoneAxis = series.zoneAxis || 'y';\n        let zone, i = 0;\n        zone = zones[i];\n        while (this[zoneAxis] >= zone.value) {\n            zone = zones[++i];\n        }\n        // For resetting or reusing the point (#8100)\n        if (!this.nonZonedColor) {\n            this.nonZonedColor = this.color;\n        }\n        if (zone && zone.color && !this.options.color) {\n            this.color = zone.color;\n        }\n        else {\n            this.color = this.nonZonedColor;\n        }\n        return zone;\n    }\n    /**\n     * Utility to check if point has new shape type. Used in column series and\n     * all others that are based on column series.\n     * @private\n     */\n    hasNewShapeType() {\n        const point = this;\n        const oldShapeType = point.graphic &&\n            (point.graphic.symbolName || point.graphic.element.nodeName);\n        return oldShapeType !== this.shapeType;\n    }\n    /**\n     * Initialize the point. Called internally based on the `series.data`\n     * option.\n     *\n     * @function Highcharts.Point#init\n     *\n     * @param {Highcharts.Series} series\n     *        The series object containing this point.\n     *\n     * @param {Highcharts.PointOptionsType} options\n     *        The data in either number, array or object format.\n     *\n     * @param {number} [x]\n     *        Optionally, the X value of the point.\n     *\n     * @return {Highcharts.Point}\n     *         The Point instance.\n     *\n     * @emits Highcharts.Point#event:afterInit\n     */\n    constructor(series, options, x) {\n        this.formatPrefix = 'point';\n        this.visible = true;\n        this.series = series;\n        this.applyOptions(options, x);\n        // Add a unique ID to the point if none is assigned\n        this.id ?? (this.id = uniqueKey());\n        this.resolveColor();\n        series.chart.pointCount++;\n        fireEvent(this, 'afterInit');\n    }\n    /**\n     * Determine if point is valid.\n     * @private\n     * @function Highcharts.Point#isValid\n     */\n    isValid() {\n        return ((isNumber(this.x) ||\n            this.x instanceof Date) &&\n            isNumber(this.y));\n    }\n    /**\n     * Transform number or array configs into objects. Also called for object\n     * configs. Used internally to unify the different configuration formats for\n     * points. For example, a simple number `10` in a line series will be\n     * transformed to `{ y: 10 }`, and an array config like `[1, 10]` in a\n     * scatter series will be transformed to `{ x: 1, y: 10 }`.\n     *\n     * @deprecated\n     * @function Highcharts.Point#optionsToObject\n     *\n     * @param {Highcharts.PointOptionsType} options\n     * Series data options.\n     *\n     * @return {Highcharts.Dictionary<*>}\n     * Transformed point options.\n     */\n    optionsToObject(options) {\n        const series = this.series, keys = series.options.keys, pointArrayMap = keys || series.pointArrayMap || ['y'], valueCount = pointArrayMap.length;\n        let ret = {}, firstItemType, i = 0, j = 0;\n        if (isNumber(options) || options === null) {\n            ret[pointArrayMap[0]] = options;\n        }\n        else if (isArray(options)) {\n            // With leading x value\n            if (!keys && options.length > valueCount) {\n                firstItemType = typeof options[0];\n                if (firstItemType === 'string') {\n                    ret.name = options[0];\n                }\n                else if (firstItemType === 'number') {\n                    ret.x = options[0];\n                }\n                i++;\n            }\n            while (j < valueCount) {\n                // Skip undefined positions for keys\n                if (!keys || typeof options[i] !== 'undefined') {\n                    if (pointArrayMap[j].indexOf('.') > 0) {\n                        // Handle nested keys, e.g. ['color.pattern.image']\n                        // Avoid function call unless necessary.\n                        Point.prototype.setNestedProperty(ret, options[i], pointArrayMap[j]);\n                    }\n                    else {\n                        ret[pointArrayMap[j]] = options[i];\n                    }\n                }\n                i++;\n                j++;\n            }\n        }\n        else if (typeof options === 'object') {\n            ret = options;\n            // This is the fastest way to detect if there are individual point\n            // dataLabels that need to be considered in drawDataLabels. These\n            // can only occur in object configs.\n            if (options.dataLabels) {\n                // Override the prototype function to always return true,\n                // regardless of whether data labels are enabled series-wide\n                series.hasDataLabels = () => true;\n            }\n            // Same approach as above for markers\n            if (options.marker) {\n                series._hasPointMarkers = true;\n            }\n        }\n        return ret;\n    }\n    /**\n     * Get the pixel position of the point relative to the plot area.\n     * @function Highcharts.Point#pos\n     *\n     * @sample highcharts/point/position\n     *         Get point's position in pixels.\n     *\n     * @param {boolean} chartCoordinates\n     * If true, the returned position is relative to the full chart area.\n     * If false, it is relative to the plot area determined by the axes.\n     *\n     * @param {number|undefined} plotY\n     * A custom plot y position to be computed. Used internally for some\n     * series types that have multiple `y` positions, like area range (low\n     * and high values).\n     *\n     * @return {Array<number>|undefined}\n     * Coordinates of the point if the point exists.\n     */\n    pos(chartCoordinates, plotY = this.plotY) {\n        if (!this.destroyed) {\n            const { plotX, series } = this, { chart, xAxis, yAxis } = series;\n            let posX = 0, posY = 0;\n            if (isNumber(plotX) && isNumber(plotY)) {\n                if (chartCoordinates) {\n                    posX = xAxis ? xAxis.pos : chart.plotLeft;\n                    posY = yAxis ? yAxis.pos : chart.plotTop;\n                }\n                return chart.inverted && xAxis && yAxis ?\n                    [yAxis.len - plotY + posY, xAxis.len - plotX + posX] :\n                    [plotX + posX, plotY + posY];\n            }\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Point#resolveColor\n     */\n    resolveColor() {\n        const series = this.series, optionsChart = series.chart.options.chart, styledMode = series.chart.styledMode;\n        let color, colors, colorCount = optionsChart.colorCount, colorIndex;\n        // Remove points nonZonedColor for later recalculation\n        delete this.nonZonedColor;\n        if (series.options.colorByPoint) {\n            if (!styledMode) {\n                colors = series.options.colors || series.chart.options.colors;\n                color = colors[series.colorCounter];\n                colorCount = colors.length;\n            }\n            colorIndex = series.colorCounter;\n            series.colorCounter++;\n            // Loop back to zero\n            if (series.colorCounter === colorCount) {\n                series.colorCounter = 0;\n            }\n        }\n        else {\n            if (!styledMode) {\n                color = series.color;\n            }\n            colorIndex = series.colorIndex;\n        }\n        /**\n         * The point's current color index, used in styled mode instead of\n         * `color`. The color index is inserted in class names used for styling.\n         *\n         * @name Highcharts.Point#colorIndex\n         * @type {number|undefined}\n         */\n        this.colorIndex = pick(this.options.colorIndex, colorIndex);\n        /**\n         * The point's current color.\n         *\n         * @name Highcharts.Point#color\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n         */\n        this.color = pick(this.options.color, color);\n    }\n    /**\n     * Set a value in an object, on the property defined by key. The key\n     * supports nested properties using dot notation. The function modifies the\n     * input object and does not make a copy.\n     *\n     * @function Highcharts.Point#setNestedProperty<T>\n     *\n     * @param {T} object\n     *        The object to set the value on.\n     *\n     * @param {*} value\n     *        The value to set.\n     *\n     * @param {string} key\n     *        Key to the property to set.\n     *\n     * @return {T}\n     *         The modified object.\n     */\n    setNestedProperty(object, value, key) {\n        const nestedKeys = key.split('.');\n        nestedKeys.reduce(function (result, key, i, arr) {\n            const isLastKey = arr.length - 1 === i;\n            result[key] = (isLastKey ?\n                value :\n                isObject(result[key], true) ?\n                    result[key] :\n                    {});\n            return result[key];\n        }, object);\n        return object;\n    }\n    shouldDraw() {\n        return !this.isNull;\n    }\n    /**\n     * Extendable method for formatting each point's tooltip line.\n     *\n     * @function Highcharts.Point#tooltipFormatter\n     *\n     * @param {string} pointFormat\n     *        The point format.\n     *\n     * @return {string}\n     *         A string to be concatenated in to the common tooltip text.\n     */\n    tooltipFormatter(pointFormat) {\n        // Insert options for valueDecimals, valuePrefix, and valueSuffix\n        const series = this.series, seriesTooltipOptions = series.tooltipOptions, valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''), valuePrefix = seriesTooltipOptions.valuePrefix || '', valueSuffix = seriesTooltipOptions.valueSuffix || '';\n        // Replace default point style with class name\n        if (series.chart.styledMode) {\n            pointFormat =\n                series.chart.tooltip.styledModeFormat(pointFormat);\n        }\n        // Loop over the point array map and replace unformatted values with\n        // sprintf formatting markup\n        (series.pointArrayMap || ['y']).forEach(function (key) {\n            key = '{point.' + key; // Without the closing bracket\n            if (valuePrefix || valueSuffix) {\n                pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), valuePrefix + key + '}' + valueSuffix);\n            }\n            pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), key + ':,.' + valueDecimals + 'f}');\n        });\n        return format(pointFormat, {\n            point: this,\n            series: this.series\n        }, series.chart);\n    }\n    /**\n     * Update point with new options (typically x/y data) and optionally redraw\n     * the series.\n     *\n     * @sample highcharts/members/point-update-column/\n     *         Update column value\n     * @sample highcharts/members/point-update-pie/\n     *         Update pie slice\n     * @sample maps/members/point-update/\n     *         Update map area value in Highmaps\n     *\n     * @function Highcharts.Point#update\n     *\n     * @param {Highcharts.PointOptionsType} options\n     *        The point options. Point options are handled as described under\n     *        the `series.type.data` item for each series type. For example\n     *        for a line series, if options is a single number, the point will\n     *        be given that number as the marin y value. If it is an array, it\n     *        will be interpreted as x and y values respectively. If it is an\n     *        object, advanced options are applied.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after the point is updated. If doing\n     *        more operations on the chart, it is best practice to set\n     *        `redraw` to false and call `chart.redraw()` after.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation=true]\n     *        Whether to apply animation, and optionally animation\n     *        configuration.\n     *\n     * @emits Highcharts.Point#event:update\n     */\n    update(options, redraw, animation, runEvent) {\n        const point = this, series = point.series, graphic = point.graphic, chart = series.chart, seriesOptions = series.options;\n        let i;\n        redraw = pick(redraw, true);\n        /**\n         * @private\n         */\n        function update() {\n            point.applyOptions(options);\n            // Update visuals, #4146\n            // Handle mock graphic elements for a11y, #12718\n            const hasMockGraphic = graphic && point.hasMockGraphic;\n            const shouldDestroyGraphic = point.y === null ?\n                !hasMockGraphic :\n                hasMockGraphic;\n            if (graphic && shouldDestroyGraphic) {\n                point.graphic = graphic.destroy();\n                delete point.hasMockGraphic;\n            }\n            if (isObject(options, true)) {\n                // Destroy so we can get new elements\n                if (graphic && graphic.element) {\n                    // \"null\" is also a valid symbol\n                    if (options &&\n                        options.marker &&\n                        typeof options.marker.symbol !== 'undefined') {\n                        point.graphic = graphic.destroy();\n                    }\n                }\n                if (options?.dataLabels && point.dataLabel) {\n                    point.dataLabel = point.dataLabel.destroy(); // #2468\n                }\n            }\n            // Record changes in the parallel arrays\n            i = point.index;\n            series.updateParallelArrays(point, i);\n            // Record the options to options.data. If the old or the new config\n            // is an object, use point options, otherwise use raw options\n            // (#4701, #4916).\n            seriesOptions.data[i] = (isObject(seriesOptions.data[i], true) ||\n                isObject(options, true)) ?\n                point.options :\n                pick(options, seriesOptions.data[i]);\n            // Redraw\n            series.isDirty = series.isDirtyData = true;\n            if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n                chart.isDirtyBox = true;\n            }\n            if (seriesOptions.legendType === 'point') { // #1831, #1885\n                chart.isDirtyLegend = true;\n            }\n            if (redraw) {\n                chart.redraw(animation);\n            }\n        }\n        // Fire the event with a default handler of doing the update\n        if (runEvent === false) { // When called from setData\n            update();\n        }\n        else {\n            point.firePointEvent('update', { options: options }, update);\n        }\n    }\n    /**\n     * Remove a point and optionally redraw the series and if necessary the axes\n     *\n     * @sample highcharts/plotoptions/series-point-events-remove/\n     *         Remove point and confirm\n     * @sample highcharts/members/point-remove/\n     *         Remove pie slice\n     * @sample maps/members/point-remove/\n     *         Remove selected points in Highmaps\n     *\n     * @function Highcharts.Point#remove\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart or wait for an explicit call. When\n     *        doing more operations on the chart, for example running\n     *        `point.remove()` in a loop, it is best practice to set `redraw`\n     *        to false and call `chart.redraw()` after.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation=false]\n     *        Whether to apply animation, and optionally animation\n     *        configuration.\n     */\n    remove(redraw, animation) {\n        this.series.removePoint(this.series.data.indexOf(this), redraw, animation);\n    }\n    /**\n     * Toggle the selection status of a point.\n     *\n     * @see Highcharts.Chart#getSelectedPoints\n     *\n     * @sample highcharts/members/point-select/\n     *         Select a point from a button\n     * @sample highcharts/members/point-select-lasso/\n     *         Lasso selection\n     * @sample highcharts/chart/events-selection-points/\n     *         Rectangle selection\n     * @sample maps/series/data-id/\n     *         Select a point in Highmaps\n     *\n     * @function Highcharts.Point#select\n     *\n     * @param {boolean} [selected]\n     * When `true`, the point is selected. When `false`, the point is\n     * unselected. When `null` or `undefined`, the selection state is toggled.\n     *\n     * @param {boolean} [accumulate=false]\n     * When `true`, the selection is added to other selected points.\n     * When `false`, other selected points are deselected. Internally in\n     * Highcharts, when\n     * [allowPointSelect](https://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect)\n     * is `true`, selected points are accumulated on Control, Shift or Cmd\n     * clicking the point.\n     *\n     * @emits Highcharts.Point#event:select\n     * @emits Highcharts.Point#event:unselect\n     */\n    select(selected, accumulate) {\n        const point = this, series = point.series, chart = series.chart;\n        selected = pick(selected, !point.selected);\n        this.selectedStaging = selected;\n        // Fire the event with the default handler\n        point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n            /**\n             * Whether the point is selected or not.\n             *\n             * @see Point#select\n             * @see Chart#getSelectedPoints\n             *\n             * @name Highcharts.Point#selected\n             * @type {boolean}\n             */\n            point.selected = point.options.selected = selected;\n            series.options.data[series.data.indexOf(point)] =\n                point.options;\n            point.setState(selected && 'select');\n            // Unselect all other points unless Ctrl or Cmd + click\n            if (!accumulate) {\n                chart.getSelectedPoints().forEach(function (loopPoint) {\n                    const loopSeries = loopPoint.series;\n                    if (loopPoint.selected && loopPoint !== point) {\n                        loopPoint.selected = loopPoint.options.selected =\n                            false;\n                        loopSeries.options.data[loopSeries.data.indexOf(loopPoint)] = loopPoint.options;\n                        // Programmatically selecting a point should restore\n                        // normal state, but when click happened on other\n                        // point, set inactive state to match other points\n                        loopPoint.setState(chart.hoverPoints &&\n                            loopSeries.options.inactiveOtherPoints ?\n                            'inactive' : '');\n                        loopPoint.firePointEvent('unselect');\n                    }\n                });\n            }\n        });\n        delete this.selectedStaging;\n    }\n    /**\n     * Runs on mouse over the point. Called internally from mouse and touch\n     * events.\n     *\n     * @function Highcharts.Point#onMouseOver\n     *\n     * @param {Highcharts.PointerEventObject} [e]\n     *        The event arguments.\n     */\n    onMouseOver(e) {\n        const point = this, series = point.series, { inverted, pointer } = series.chart;\n        if (pointer) {\n            e = e ?\n                pointer.normalize(e) :\n                // In cases where onMouseOver is called directly without an\n                // event\n                pointer.getChartCoordinatesFromPoint(point, inverted);\n            pointer.runPointActions(e, point);\n        }\n    }\n    /**\n     * Runs on mouse out from the point. Called internally from mouse and touch\n     * events.\n     *\n     * @function Highcharts.Point#onMouseOut\n     * @emits Highcharts.Point#event:mouseOut\n     */\n    onMouseOut() {\n        const point = this, chart = point.series.chart;\n        point.firePointEvent('mouseOut');\n        if (!point.series.options.inactiveOtherPoints) {\n            (chart.hoverPoints || []).forEach(function (p) {\n                p.setState();\n            });\n        }\n        chart.hoverPoints = chart.hoverPoint = null;\n    }\n    /**\n     * Manage specific event from the series' and point's options. Only do it on\n     * demand, to save processing time on hovering.\n     *\n     * @private\n     * @function Highcharts.Point#importEvents\n     */\n    manageEvent(eventType) {\n        const point = this, options = merge(point.series.options.point, point.options), userEvent = options.events?.[eventType];\n        if (isFunction(userEvent) &&\n            (!point.hcEvents?.[eventType] ||\n                // Some HC modules, like marker-clusters, draggable-poins etc.\n                // use events in their logic, so we need to be sure, that\n                // callback function is different\n                point.hcEvents?.[eventType]?.map((el) => el.fn)\n                    .indexOf(userEvent) === -1)) {\n            // While updating the existing callback event the old one should be\n            // removed\n            point.importedUserEvent?.();\n            point.importedUserEvent = addEvent(point, eventType, userEvent);\n        }\n        else if (point.importedUserEvent &&\n            !userEvent &&\n            point.hcEvents?.[eventType]) {\n            removeEvent(point, eventType);\n            delete point.hcEvents[eventType];\n            if (!Object.keys(point.hcEvents)) {\n                delete point.importedUserEvent;\n            }\n        }\n    }\n    /**\n     * Set the point's state.\n     *\n     * @function Highcharts.Point#setState\n     *\n     * @param {Highcharts.PointStateValue|\"\"} [state]\n     *        The new state, can be one of `'hover'`, `'select'`, `'inactive'`,\n     *        or `''` (an empty string), `'normal'` or `undefined` to set to\n     *        normal state.\n     * @param {boolean} [move]\n     *        State for animation.\n     *\n     * @emits Highcharts.Point#event:afterSetState\n     */\n    setState(state, move) {\n        const point = this, series = point.series, previousState = point.state, stateOptions = (series.options.states[state || 'normal'] ||\n            {}), markerOptions = (defaultOptions.plotOptions[series.type].marker &&\n            series.options.marker), normalDisabled = (markerOptions && markerOptions.enabled === false), markerStateOptions = ((markerOptions &&\n            markerOptions.states &&\n            markerOptions.states[state || 'normal']) || {}), stateDisabled = markerStateOptions.enabled === false, pointMarker = point.marker || {}, chart = series.chart, hasMarkers = (markerOptions && series.markerAttribs);\n        let halo = series.halo, markerAttribs, pointAttribs, pointAttribsAnimation, stateMarkerGraphic = series.stateMarkerGraphic, newSymbol;\n        state = state || ''; // Empty string\n        if (\n        // Already has this state\n        (state === point.state && !move) ||\n            // Selected points don't respond to hover\n            (point.selected && state !== 'select') ||\n            // Series' state options is disabled\n            (stateOptions.enabled === false) ||\n            // General point marker's state options is disabled\n            (state && (stateDisabled ||\n                (normalDisabled &&\n                    markerStateOptions.enabled === false))) ||\n            // Individual point marker's state options is disabled\n            (state &&\n                pointMarker.states &&\n                pointMarker.states[state] &&\n                pointMarker.states[state].enabled === false) // #1610\n        ) {\n            return;\n        }\n        point.state = state;\n        if (hasMarkers) {\n            markerAttribs = series.markerAttribs(point, state);\n        }\n        // Apply hover styles to the existing point\n        // Prevent from mocked null points (#14966)\n        if (point.graphic && !point.hasMockGraphic) {\n            if (previousState) {\n                point.graphic.removeClass('highcharts-point-' + previousState);\n            }\n            if (state) {\n                point.graphic.addClass('highcharts-point-' + state);\n            }\n            if (!chart.styledMode) {\n                pointAttribs = series.pointAttribs(point, state);\n                pointAttribsAnimation = pick(chart.options.chart.animation, stateOptions.animation);\n                const opacity = pointAttribs.opacity;\n                // Some inactive points (e.g. slices in pie) should apply\n                // opacity also for their labels\n                if (series.options.inactiveOtherPoints && isNumber(opacity)) {\n                    (point.dataLabels || []).forEach(function (label) {\n                        if (label &&\n                            !label.hasClass('highcharts-data-label-hidden')) {\n                            label.animate({ opacity }, pointAttribsAnimation);\n                            if (label.connector) {\n                                label.connector.animate({ opacity }, pointAttribsAnimation);\n                            }\n                        }\n                    });\n                }\n                point.graphic.animate(pointAttribs, pointAttribsAnimation);\n            }\n            if (markerAttribs) {\n                point.graphic.animate(markerAttribs, pick(\n                // Turn off globally:\n                chart.options.chart.animation, markerStateOptions.animation, markerOptions.animation));\n            }\n            // Zooming in from a range with no markers to a range with markers\n            if (stateMarkerGraphic) {\n                stateMarkerGraphic.hide();\n            }\n        }\n        else {\n            // If a graphic is not applied to each point in the normal state,\n            // create a shared graphic for the hover state\n            if (state && markerStateOptions) {\n                newSymbol = pointMarker.symbol || series.symbol;\n                // If the point has another symbol than the previous one, throw\n                // away the state marker graphic and force a new one (#1459)\n                if (stateMarkerGraphic &&\n                    stateMarkerGraphic.currentSymbol !== newSymbol) {\n                    stateMarkerGraphic = stateMarkerGraphic.destroy();\n                }\n                // Add a new state marker graphic\n                if (markerAttribs) {\n                    if (!stateMarkerGraphic) {\n                        if (newSymbol) {\n                            series.stateMarkerGraphic = stateMarkerGraphic =\n                                chart.renderer\n                                    .symbol(newSymbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height)\n                                    .add(series.markerGroup);\n                            stateMarkerGraphic.currentSymbol = newSymbol;\n                        }\n                        // Move the existing graphic\n                    }\n                    else {\n                        stateMarkerGraphic[move ? 'animate' : 'attr']({\n                            x: markerAttribs.x,\n                            y: markerAttribs.y\n                        });\n                    }\n                }\n                if (!chart.styledMode && stateMarkerGraphic &&\n                    point.state !== 'inactive') {\n                    stateMarkerGraphic.attr(series.pointAttribs(point, state));\n                }\n            }\n            if (stateMarkerGraphic) {\n                stateMarkerGraphic[state && point.isInside ? 'show' : 'hide'](); // #2450\n                stateMarkerGraphic.element.point = point; // #4310\n                stateMarkerGraphic.addClass(point.getClassName(), true);\n            }\n        }\n        // Show me your halo\n        const haloOptions = stateOptions.halo;\n        const markerGraphic = (point.graphic || stateMarkerGraphic);\n        const markerVisibility = (markerGraphic && markerGraphic.visibility || 'inherit');\n        if (haloOptions &&\n            haloOptions.size &&\n            markerGraphic &&\n            markerVisibility !== 'hidden' &&\n            !point.isCluster) {\n            if (!halo) {\n                series.halo = halo = chart.renderer.path()\n                    // #5818, #5903, #6705\n                    .add(markerGraphic.parentGroup);\n            }\n            halo.show()[move ? 'animate' : 'attr']({\n                d: point.haloPath(haloOptions.size)\n            });\n            halo.attr({\n                'class': 'highcharts-halo highcharts-color-' +\n                    pick(point.colorIndex, series.colorIndex) +\n                    (point.className ? ' ' + point.className : ''),\n                'visibility': markerVisibility,\n                'zIndex': -1 // #4929, #8276\n            });\n            halo.point = point; // #6055\n            if (!chart.styledMode) {\n                halo.attr(extend({\n                    'fill': point.color || series.color,\n                    'fill-opacity': haloOptions.opacity\n                }, AST.filterUserAttributes(haloOptions.attributes || {})));\n            }\n        }\n        else if (halo?.point?.haloPath &&\n            !halo.point.destroyed) {\n            // Animate back to 0 on the current halo point (#6055)\n            halo.animate({ d: halo.point.haloPath(0) }, null, \n            // Hide after unhovering. The `complete` callback runs in the\n            // halo's context (#7681).\n            halo.hide);\n        }\n        fireEvent(point, 'afterSetState', { state });\n    }\n    /**\n     * Get the path definition for the halo, which is usually a shadow-like\n     * circle around the currently hovered point.\n     *\n     * @function Highcharts.Point#haloPath\n     *\n     * @param {number} size\n     *        The radius of the circular halo.\n     *\n     * @return {Highcharts.SVGPathArray}\n     *         The path definition.\n     */\n    haloPath(size) {\n        const pos = this.pos();\n        return pos ? this.series.chart.renderer.symbols.circle(crisp(pos[0], 1) - size, pos[1] - size, size * 2, size * 2) : [];\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default Point;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Function callback when a series point is clicked. Return false to cancel the\n * action.\n *\n * @callback Highcharts.PointClickCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        The point where the event occurred.\n *\n * @param {Highcharts.PointClickEventObject} event\n *        Event arguments.\n */\n/**\n * Common information for a click event on a series point.\n *\n * @interface Highcharts.PointClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Clicked point.\n* @name Highcharts.PointClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Configuration for the data label and tooltip formatters.\n *\n * @interface Highcharts.PointLabelObject\n */ /**\n* The point's current color.\n* @name Highcharts.PointLabelObject#color\n* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n*/ /**\n* The point's current color index, used in styled mode instead of `color`. The\n* color index is inserted in class names used for styling.\n* @name Highcharts.PointLabelObject#colorIndex\n* @type {number}\n*/ /**\n* The name of the related point.\n* @name Highcharts.PointLabelObject#key\n* @type {string|undefined}\n*/ /**\n* The percentage for related points in a stacked series or pies.\n* @name Highcharts.PointLabelObject#percentage\n* @type {number}\n*/ /**\n* The related point. The point name, if defined, is available through\n* `this.point.name`.\n* @name Highcharts.PointLabelObject#point\n* @type {Highcharts.Point}\n*/ /**\n* The related series. The series name is available through `this.series.name`.\n* @name Highcharts.PointLabelObject#series\n* @type {Highcharts.Series}\n*/ /**\n* The total of values in either a stack for stacked series, or a pie in a pie\n* series.\n* @name Highcharts.PointLabelObject#total\n* @type {number|undefined}\n*/ /**\n* For categorized axes this property holds the category name for the point. For\n* other axes it holds the X value.\n* @name Highcharts.PointLabelObject#x\n* @type {number|string|undefined}\n*/ /**\n* The y value of the point.\n* @name Highcharts.PointLabelObject#y\n* @type {number|null|undefined}\n*/\n/**\n * Gets fired when the mouse leaves the area close to the point.\n *\n * @callback Highcharts.PointMouseOutCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {global.PointerEvent} event\n *        Event that occurred.\n */\n/**\n * Gets fired when the mouse enters the area close to the point.\n *\n * @callback Highcharts.PointMouseOverCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {global.Event} event\n *        Event that occurred.\n */\n/**\n * The generic point options for all series.\n *\n * In TypeScript you have to extend `PointOptionsObject` with an additional\n * declaration to allow custom data options:\n *\n * ```\n * declare interface PointOptionsObject {\n *     customProperty: string;\n * }\n * ```\n *\n * @interface Highcharts.PointOptionsObject\n */\n/**\n * Possible option types for a data point. Use `null` to indicate a gap.\n *\n * @typedef {number|string|Highcharts.PointOptionsObject|Array<(number|string|null)>|null} Highcharts.PointOptionsType\n */\n/**\n * Gets fired when the point is removed using the `.remove()` method.\n *\n * @callback Highcharts.PointRemoveCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {global.Event} event\n *        Event that occurred.\n */\n/**\n * Possible key values for the point state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.PointStateValue\n */\n/**\n * Gets fired when the point is updated programmatically through the `.update()`\n * method.\n *\n * @callback Highcharts.PointUpdateCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {Highcharts.PointUpdateEventObject} event\n *        Event that occurred.\n */\n/**\n * Information about the update event.\n *\n * @interface Highcharts.PointUpdateEventObject\n * @extends global.Event\n */ /**\n* Options data of the update event.\n* @name Highcharts.PointUpdateEventObject#options\n* @type {Highcharts.PointOptionsType}\n*/\n/**\n * @interface Highcharts.PointEventsOptionsObject\n */ /**\n* Fires when the point is selected either programmatically or following a click\n* on the point. One parameter, `event`, is passed to the function. Returning\n* `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#select\n* @type {Highcharts.PointSelectCallbackFunction|undefined}\n*/ /**\n* Fires when the point is unselected either programmatically or following a\n* click on the point. One parameter, `event`, is passed to the function.\n* Returning `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#unselect\n* @type {Highcharts.PointUnselectCallbackFunction|undefined}\n*/\n/**\n * Information about the select/unselect event.\n *\n * @interface Highcharts.PointInteractionEventObject\n * @extends global.Event\n */ /**\n* @name Highcharts.PointInteractionEventObject#accumulate\n* @type {boolean}\n*/\n/**\n * Gets fired when the point is selected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointSelectCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n *        Event that occurred.\n */\n/**\n * Fires when the point is unselected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointUnselectCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n *        Event that occurred.\n */\n''; // Keeps doclets above in JS file.\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Animation/AnimationUtilities.js';\nconst { animObject, setAnimation } = A;\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport F from '../Foundation.js';\nconst { registerEventOptions } = F;\nimport H from '../Globals.js';\nconst { svg, win } = H;\nimport LegendSymbol from '../Legend/LegendSymbol.js';\nimport Point from './Point.js';\nimport SeriesDefaults from './SeriesDefaults.js';\nimport SeriesRegistry from './SeriesRegistry.js';\nconst { seriesTypes } = SeriesRegistry;\nimport SVGElement from '../Renderer/SVG/SVGElement.js';\nimport U from '../Utilities.js';\nconst { arrayMax, arrayMin, clamp, correctFloat, crisp, defined, destroyObjectProperties, diffObjects, erase, error, extend, find, fireEvent, getClosestDistance, getNestedProperty, insertItem, isArray, isNumber, isString, merge, objectEach, pick, removeEvent, splat, syncTimeout } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * This is the base series prototype that all other series types inherit from.\n * A new series is initialized either through the\n * [series](https://api.highcharts.com/highcharts/series)\n * option structure, or after the chart is initialized, through\n * {@link Highcharts.Chart#addSeries}.\n *\n * The object can be accessed in a number of ways. All series and point event\n * handlers give a reference to the `series` object. The chart object has a\n * {@link Highcharts.Chart#series|series} property that is a collection of all\n * the chart's series. The point objects and axis objects also have the same\n * reference.\n *\n * Another way to reference the series programmatically is by `id`. Add an id\n * in the series configuration options, and get the series object by\n * {@link Highcharts.Chart#get}.\n *\n * Configuration options for the series are given in three levels. Options for\n * all series in a chart are given in the\n * [plotOptions.series](https://api.highcharts.com/highcharts/plotOptions.series)\n * object. Then options for all series of a specific type\n * are given in the plotOptions of that type, for example `plotOptions.line`.\n * Next, options for one single series are given in the series array, or as\n * arguments to `chart.addSeries`.\n *\n * The data in the series is stored in various arrays.\n *\n * - First, `series.options.data` contains all the original config options for\n *   each point whether added by options or methods like `series.addPoint`.\n *\n * - Next, `series.data` contains those values converted to points, but in case\n *   the series data length exceeds the `cropThreshold`, or if the data is\n *   grouped, `series.data` doesn't contain all the points. It only contains the\n *   points that have been created on demand.\n *\n * - Then there's `series.points` that contains all currently visible point\n *   objects. In case of cropping, the cropped-away points are not part of this\n *   array. The `series.points` array starts at `series.cropStart` compared to\n *   `series.data` and `series.options.data`. If however the series data is\n *   grouped, these can't be correlated one to one.\n *\n * - `series.xData` and `series.processedXData` contain clean x values,\n *   equivalent to `series.data` and `series.points`.\n *\n * - `series.yData` and `series.processedYData` contain clean y values,\n *   equivalent to `series.data` and `series.points`.\n *\n * @class\n * @name Highcharts.Series\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.SeriesOptionsType|object} options\n * The series options.\n */\nclass Series {\n    constructor() {\n        /* *\n         *\n         *  Static Properties\n         *\n         * */\n        this.zoneAxis = 'y';\n        // eslint-enable valid-jsdoc\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    init(chart, userOptions) {\n        fireEvent(this, 'init', { options: userOptions });\n        const series = this, chartSeries = chart.series;\n        // The 'eventsToUnbind' property moved from prototype into the\n        // Series init to avoid reference to the same array between\n        // the different series and charts. #12959, #13937\n        this.eventsToUnbind = [];\n        /**\n         * Read only. The chart that the series belongs to.\n         *\n         * @name Highcharts.Series#chart\n         * @type {Highcharts.Chart}\n         */\n        series.chart = chart;\n        /**\n         * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n         * The type in the series options anc can be altered using\n         * {@link Series#update}.\n         *\n         * @name Highcharts.Series#type\n         * @type {string}\n         */\n        /**\n         * Read only. The series' current options. To update, use\n         * {@link Series#update}.\n         *\n         * @name Highcharts.Series#options\n         * @type {Highcharts.SeriesOptionsType}\n         */\n        series.options = series.setOptions(userOptions);\n        const options = series.options, visible = options.visible !== false;\n        /**\n         * All child series that are linked to the current series through the\n         * [linkedTo](https://api.highcharts.com/highcharts/series.line.linkedTo)\n         * option.\n         *\n         * @name Highcharts.Series#linkedSeries\n         * @type {Array<Highcharts.Series>}\n         * @readonly\n         */\n        series.linkedSeries = [];\n        // Bind the axes\n        series.bindAxes();\n        extend(series, {\n            /**\n             * The series name as given in the options. Defaults to\n             * \"Series {n}\".\n             *\n             * @name Highcharts.Series#name\n             * @type {string}\n             */\n            name: options.name,\n            state: '',\n            /**\n             * Read only. The series' visibility state as set by {@link\n             * Series#show}, {@link Series#hide}, or in the initial\n             * configuration.\n             *\n             * @name Highcharts.Series#visible\n             * @type {boolean}\n             */\n            visible, // True by default\n            /**\n             * Read only. The series' selected state as set by {@link\n             * Highcharts.Series#select}.\n             *\n             * @name Highcharts.Series#selected\n             * @type {boolean}\n             */\n            selected: options.selected === true // False by default\n        });\n        registerEventOptions(this, options);\n        const events = options.events;\n        if ((events && events.click) ||\n            (options.point &&\n                options.point.events &&\n                options.point.events.click) ||\n            options.allowPointSelect) {\n            chart.runTrackerClick = true;\n        }\n        series.getColor();\n        series.getSymbol();\n        // Initialize the parallel data arrays\n        series.parallelArrays.forEach(function (key) {\n            if (!series[key + 'Data']) {\n                series[key + 'Data'] = [];\n            }\n        });\n        // Mark cartesian\n        if (series.isCartesian) {\n            chart.hasCartesianSeries = true;\n        }\n        // Get the index and register the series in the chart. The index is\n        // one more than the current latest series index (#5960).\n        let lastSeries;\n        if (chartSeries.length) {\n            lastSeries = chartSeries[chartSeries.length - 1];\n        }\n        series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n        series.opacity = series.options.opacity;\n        // Insert the series and re-order all series above the insertion\n        // point.\n        chart.orderItems('series', insertItem(this, chartSeries));\n        // Set options for series with sorting and set data later.\n        if (options.dataSorting && options.dataSorting.enabled) {\n            series.setDataSortingOptions();\n        }\n        else if (!series.points && !series.data) {\n            series.setData(options.data, false);\n        }\n        fireEvent(this, 'afterInit');\n    }\n    /**\n     * Check whether the series item is itself or inherits from a certain\n     * series type.\n     *\n     * @function Highcharts.Series#is\n     * @param {string} type The type of series to check for, can be either\n     *        featured or custom series types. For example `column`, `pie`,\n     *        `ohlc` etc.\n     *\n     * @return {boolean}\n     *        True if this item is or inherits from the given type.\n     */\n    is(type) {\n        return seriesTypes[type] && this instanceof seriesTypes[type];\n    }\n    /**\n     * Set the xAxis and yAxis properties of cartesian series, and register\n     * the series in the `axis.series` array.\n     *\n     * @private\n     * @function Highcharts.Series#bindAxes\n     */\n    bindAxes() {\n        const series = this, seriesOptions = series.options, chart = series.chart;\n        let axisOptions;\n        fireEvent(this, 'bindAxes', null, function () {\n            // Repeat for xAxis and yAxis\n            (series.axisTypes || []).forEach(function (coll) {\n                // Loop through the chart's axis objects\n                (chart[coll] || []).forEach(function (axis) {\n                    axisOptions = axis.options;\n                    // Apply if the series xAxis or yAxis option matches\n                    // the number of the axis, or if undefined, use the\n                    // first axis\n                    if (pick(seriesOptions[coll], 0) === axis.index ||\n                        (typeof seriesOptions[coll] !==\n                            'undefined' &&\n                            seriesOptions[coll] === axisOptions.id)) {\n                        // Register this series in the axis.series lookup\n                        insertItem(series, axis.series);\n                        // Set this series.xAxis or series.yAxis reference\n                        /**\n                         * Read only. The unique xAxis object associated\n                         * with the series.\n                         *\n                         * @name Highcharts.Series#xAxis\n                         * @type {Highcharts.Axis}\n                         */\n                        /**\n                         * Read only. The unique yAxis object associated\n                         * with the series.\n                         *\n                         * @name Highcharts.Series#yAxis\n                         * @type {Highcharts.Axis}\n                         */\n                        series[coll] = axis;\n                        // Mark dirty for redraw\n                        axis.isDirty = true;\n                    }\n                });\n                // The series needs an X and an Y axis\n                if (!series[coll] &&\n                    series.optionalAxis !== coll) {\n                    error(18, true, chart);\n                }\n            });\n        });\n        fireEvent(this, 'afterBindAxes');\n    }\n    /**\n     * For simple series types like line and column, the data values are\n     * held in arrays like xData and yData for quick lookup to find extremes\n     * and more. For multidimensional series like bubble and map, this can\n     * be extended with arrays like zData and valueData by adding to the\n     * `series.parallelArrays` array.\n     *\n     * @private\n     * @function Highcharts.Series#updateParallelArrays\n     */\n    updateParallelArrays(point, i, iArgs) {\n        const series = point.series, fn = isNumber(i) ?\n            // Insert the value in the given position\n            function (key) {\n                const val = key === 'y' && series.toYData ?\n                    series.toYData(point) :\n                    point[key];\n                series[key + 'Data'][i] = val;\n            } :\n            // Apply the method specified in i with the following\n            // arguments as arguments\n            function (key) {\n                Array.prototype[i].apply(series[key + 'Data'], iArgs);\n            };\n        series.parallelArrays.forEach(fn);\n    }\n    /**\n     * Define hasData functions for series. These return true if there\n     * are data points on this series within the plot area.\n     *\n     * @private\n     * @function Highcharts.Series#hasData\n     */\n    hasData() {\n        return ((this.visible &&\n            typeof this.dataMax !== 'undefined' &&\n            typeof this.dataMin !== 'undefined') || ( // #3703\n        this.visible &&\n            this.yData &&\n            this.yData.length > 0) // #9758\n        );\n    }\n    /**\n     * Determine whether the marker in a series has changed.\n     *\n     * @private\n     * @function Highcharts.Series#hasMarkerChanged\n     */\n    hasMarkerChanged(options, oldOptions) {\n        const marker = options.marker, oldMarker = oldOptions.marker || {};\n        return marker && ((oldMarker.enabled && !marker.enabled) ||\n            oldMarker.symbol !== marker.symbol || // #10870, #15946\n            oldMarker.height !== marker.height || // #16274\n            oldMarker.width !== marker.width // #16274\n        );\n    }\n    /**\n     * Return an auto incremented x value based on the pointStart and\n     * pointInterval options. This is only used if an x value is not given\n     * for the point that calls autoIncrement.\n     *\n     * @private\n     * @function Highcharts.Series#autoIncrement\n     */\n    autoIncrement(x) {\n        const options = this.options, pointIntervalUnit = options.pointIntervalUnit, relativeXValue = options.relativeXValue, time = this.chart.time;\n        let xIncrement = this.xIncrement, date, pointInterval;\n        xIncrement = pick(xIncrement, options.pointStart, 0);\n        this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);\n        if (relativeXValue && isNumber(x)) {\n            pointInterval *= x;\n        }\n        // Added code for pointInterval strings\n        if (pointIntervalUnit) {\n            date = new time.Date(xIncrement);\n            if (pointIntervalUnit === 'day') {\n                time.set('Date', date, time.get('Date', date) + pointInterval);\n            }\n            else if (pointIntervalUnit === 'month') {\n                time.set('Month', date, time.get('Month', date) + pointInterval);\n            }\n            else if (pointIntervalUnit === 'year') {\n                time.set('FullYear', date, time.get('FullYear', date) + pointInterval);\n            }\n            pointInterval = date.getTime() - xIncrement;\n        }\n        if (relativeXValue && isNumber(x)) {\n            return xIncrement + pointInterval;\n        }\n        this.xIncrement = xIncrement + pointInterval;\n        return xIncrement;\n    }\n    /**\n     * Internal function to set properties for series if data sorting is\n     * enabled.\n     *\n     * @private\n     * @function Highcharts.Series#setDataSortingOptions\n     */\n    setDataSortingOptions() {\n        const options = this.options;\n        extend(this, {\n            requireSorting: false,\n            sorted: false,\n            enabledDataSorting: true,\n            allowDG: false\n        });\n        // To allow unsorted data for column series.\n        if (!defined(options.pointRange)) {\n            options.pointRange = 1;\n        }\n    }\n    /**\n     * Set the series options by merging from the options tree. Called\n     * internally on initializing and updating series. This function will\n     * not redraw the series. For API usage, use {@link Series#update}.\n     * @private\n     * @function Highcharts.Series#setOptions\n     * @param {Highcharts.SeriesOptionsType} itemOptions\n     * The series options.\n     * @emits Highcharts.Series#event:afterSetOptions\n     */\n    setOptions(itemOptions) {\n        const chart = this.chart, chartOptions = chart.options, plotOptions = chartOptions.plotOptions, userOptions = chart.userOptions || {}, seriesUserOptions = merge(itemOptions), styledMode = chart.styledMode, e = {\n            plotOptions: plotOptions,\n            userOptions: seriesUserOptions\n        };\n        let zone;\n        fireEvent(this, 'setOptions', e);\n        // These may be modified by the event\n        const typeOptions = e.plotOptions[this.type], userPlotOptions = (userOptions.plotOptions || {}), userPlotOptionsSeries = userPlotOptions.series || {}, defaultPlotOptionsType = (defaultOptions.plotOptions[this.type] || {}), userPlotOptionsType = userPlotOptions[this.type] || {};\n        // Use copy to prevent undetected changes (#9762)\n        /**\n         * Contains series options by the user without defaults.\n         * @name Highcharts.Series#userOptions\n         * @type {Highcharts.SeriesOptionsType}\n         */\n        this.userOptions = e.userOptions;\n        const options = merge(typeOptions, plotOptions.series, \n        // #3881, chart instance plotOptions[type] should trump\n        // plotOptions.series\n        userPlotOptionsType, seriesUserOptions);\n        // The tooltip options are merged between global and series specific\n        // options. Importance order asscendingly:\n        // globals: (1)tooltip, (2)plotOptions.series,\n        // (3)plotOptions[this.type]\n        // init userOptions with possible later updates: 4-6 like 1-3 and\n        // (7)this series options\n        this.tooltipOptions = merge(defaultOptions.tooltip, // 1\n        defaultOptions.plotOptions.series?.tooltip, // 2\n        defaultPlotOptionsType?.tooltip, // 3\n        chart.userOptions.tooltip, // 4\n        userPlotOptions.series?.tooltip, // 5\n        userPlotOptionsType.tooltip, // 6\n        seriesUserOptions.tooltip // 7\n        );\n        // When shared tooltip, stickyTracking is true by default,\n        // unless user says otherwise.\n        this.stickyTracking = pick(seriesUserOptions.stickyTracking, userPlotOptionsType.stickyTracking, userPlotOptionsSeries.stickyTracking, (this.tooltipOptions.shared && !this.noSharedTooltip ?\n            true :\n            options.stickyTracking));\n        // Delete marker object if not allowed (#1125)\n        if (typeOptions.marker === null) {\n            delete options.marker;\n        }\n        // Handle color zones\n        this.zoneAxis = options.zoneAxis || 'y';\n        const zones = this.zones = // #20440, create deep copy of zones options\n            (options.zones || []).map((z) => ({ ...z }));\n        if ((options.negativeColor || options.negativeFillColor) &&\n            !options.zones) {\n            zone = {\n                value: options[this.zoneAxis + 'Threshold'] ||\n                    options.threshold ||\n                    0,\n                className: 'highcharts-negative'\n            };\n            if (!styledMode) {\n                zone.color = options.negativeColor;\n                zone.fillColor = options.negativeFillColor;\n            }\n            zones.push(zone);\n        }\n        // Push one extra zone for the rest\n        if (zones.length && defined(zones[zones.length - 1].value)) {\n            zones.push(styledMode ? {} : {\n                color: this.color,\n                fillColor: this.fillColor\n            });\n        }\n        fireEvent(this, 'afterSetOptions', { options: options });\n        return options;\n    }\n    /**\n     * Return series name in \"Series {Number}\" format or the one defined by\n     * a user. This method can be simply overridden as series name format\n     * can vary (e.g. technical indicators).\n     *\n     * @function Highcharts.Series#getName\n     *\n     * @return {string}\n     * The series name.\n     */\n    getName() {\n        // #4119\n        return pick(this.options.name, 'Series ' + (this.index + 1));\n    }\n    /**\n     * @private\n     * @function Highcharts.Series#getCyclic\n     */\n    getCyclic(prop, value, defaults) {\n        const chart = this.chart, indexName = `${prop}Index`, counterName = `${prop}Counter`, len = (\n        // Symbol count\n        defaults?.length ||\n            // Color count\n            chart.options.chart.colorCount);\n        let i, setting;\n        if (!value) {\n            // Pick up either the colorIndex option, or the series.colorIndex\n            // after Series.update()\n            setting = pick(prop === 'color' ? this.options.colorIndex : void 0, this[indexName]);\n            if (defined(setting)) { // After Series.update()\n                i = setting;\n            }\n            else {\n                // #6138\n                if (!chart.series.length) {\n                    chart[counterName] = 0;\n                }\n                i = chart[counterName] % len;\n                chart[counterName] += 1;\n            }\n            if (defaults) {\n                value = defaults[i];\n            }\n        }\n        // Set the colorIndex\n        if (typeof i !== 'undefined') {\n            this[indexName] = i;\n        }\n        this[prop] = value;\n    }\n    /**\n     * Get the series' color based on either the options or pulled from\n     * global options.\n     *\n     * @private\n     * @function Highcharts.Series#getColor\n     */\n    getColor() {\n        if (this.chart.styledMode) {\n            this.getCyclic('color');\n        }\n        else if (this.options.colorByPoint) {\n            this.color = \"#cccccc\" /* Palette.neutralColor20 */;\n        }\n        else {\n            this.getCyclic('color', this.options.color ||\n                defaultOptions.plotOptions[this.type].color, this.chart.options.colors);\n        }\n    }\n    /**\n     * Get all points' instances created for this series.\n     *\n     * @private\n     * @function Highcharts.Series#getPointsCollection\n     */\n    getPointsCollection() {\n        return (this.hasGroupedData ? this.points : this.data) || [];\n    }\n    /**\n     * Get the series' symbol based on either the options or pulled from\n     * global options.\n     *\n     * @private\n     * @function Highcharts.Series#getSymbol\n     */\n    getSymbol() {\n        const seriesMarkerOption = this.options.marker;\n        this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n    }\n    /**\n     * Finds the index of an existing point that matches the given point\n     * options.\n     *\n     * @private\n     * @function Highcharts.Series#findPointIndex\n     * @param {Highcharts.PointOptionsObject} optionsObject\n     * The options of the point.\n     * @param {number} fromIndex\n     * The index to start searching from, used for optimizing series with\n     * required sorting.\n     * @return {number|undefined}\n     * Returns the index of a matching point, or undefined if no match is found.\n     */\n    findPointIndex(optionsObject, fromIndex) {\n        const id = optionsObject.id, x = optionsObject.x, oldData = this.points, dataSorting = this.options.dataSorting;\n        let matchingPoint, matchedById, pointIndex;\n        if (id) {\n            const item = this.chart.get(id);\n            if (item instanceof Point) {\n                matchingPoint = item;\n            }\n        }\n        else if (this.linkedParent ||\n            this.enabledDataSorting ||\n            this.options.relativeXValue) {\n            let matcher = (oldPoint) => !oldPoint.touched &&\n                oldPoint.index === optionsObject.index;\n            if (dataSorting && dataSorting.matchByName) {\n                matcher = (oldPoint) => !oldPoint.touched &&\n                    oldPoint.name === optionsObject.name;\n            }\n            else if (this.options.relativeXValue) {\n                matcher = (oldPoint) => !oldPoint.touched &&\n                    oldPoint.options.x === optionsObject.x;\n            }\n            matchingPoint = find(oldData, matcher);\n            // Add unmatched point as a new point\n            if (!matchingPoint) {\n                return void 0;\n            }\n        }\n        if (matchingPoint) {\n            pointIndex = matchingPoint && matchingPoint.index;\n            if (typeof pointIndex !== 'undefined') {\n                matchedById = true;\n            }\n        }\n        // Search for the same X in the existing data set\n        if (typeof pointIndex === 'undefined' && isNumber(x)) {\n            pointIndex = this.xData.indexOf(x, fromIndex);\n        }\n        // Reduce pointIndex if data is cropped\n        if (pointIndex !== -1 &&\n            typeof pointIndex !== 'undefined' &&\n            this.cropped) {\n            pointIndex = (pointIndex >= this.cropStart) ?\n                pointIndex - this.cropStart : pointIndex;\n        }\n        if (!matchedById &&\n            isNumber(pointIndex) &&\n            oldData[pointIndex] && oldData[pointIndex].touched) {\n            pointIndex = void 0;\n        }\n        return pointIndex;\n    }\n    /**\n     * Internal function called from setData. If the point count is the same\n     * as it was, or if there are overlapping X values, just run\n     * Point.update which is cheaper, allows animation, and keeps references\n     * to points. This also allows adding or removing points if the X-es\n     * don't match.\n     *\n     * @private\n     * @function Highcharts.Series#updateData\n     */\n    updateData(data, animation) {\n        const options = this.options, dataSorting = options.dataSorting, oldData = this.points, pointsToAdd = [], requireSorting = this.requireSorting, equalLength = data.length === oldData.length;\n        let hasUpdatedByKey, i, point, lastIndex, succeeded = true;\n        this.xIncrement = null;\n        // Iterate the new data\n        data.forEach(function (pointOptions, i) {\n            const optionsObject = (defined(pointOptions) &&\n                this.pointClass.prototype.optionsToObject.call({ series: this }, pointOptions)) || {};\n            let pointIndex;\n            // Get the x of the new data point\n            const x = optionsObject.x, id = optionsObject.id;\n            if (id || isNumber(x)) {\n                pointIndex = this.findPointIndex(optionsObject, lastIndex);\n                // Matching X not found\n                // or used already due to ununique x values (#8995),\n                // add point (but later)\n                if (pointIndex === -1 ||\n                    typeof pointIndex === 'undefined') {\n                    pointsToAdd.push(pointOptions);\n                    // Matching X found, update\n                }\n                else if (oldData[pointIndex] &&\n                    pointOptions !== options.data[pointIndex]) {\n                    oldData[pointIndex].update(pointOptions, false, null, false);\n                    // Mark it touched, below we will remove all points that\n                    // are not touched.\n                    oldData[pointIndex].touched = true;\n                    // Speed optimize by only searching after last known\n                    // index. Performs ~20% bettor on large data sets.\n                    if (requireSorting) {\n                        lastIndex = pointIndex + 1;\n                    }\n                    // Point exists, no changes, don't remove it\n                }\n                else if (oldData[pointIndex]) {\n                    oldData[pointIndex].touched = true;\n                }\n                // If the length is equal and some of the nodes had a\n                // match in the same position, we don't want to remove\n                // non-matches.\n                if (!equalLength ||\n                    i !== pointIndex ||\n                    (dataSorting && dataSorting.enabled) ||\n                    this.hasDerivedData) {\n                    hasUpdatedByKey = true;\n                }\n            }\n            else {\n                // Gather all points that are not matched\n                pointsToAdd.push(pointOptions);\n            }\n        }, this);\n        // Remove points that don't exist in the updated data set\n        if (hasUpdatedByKey) {\n            i = oldData.length;\n            while (i--) {\n                point = oldData[i];\n                if (point && !point.touched && point.remove) {\n                    point.remove(false, animation);\n                }\n            }\n            // If we did not find keys (ids or x-values), and the length is the\n            // same, update one-to-one\n        }\n        else if (equalLength && (!dataSorting || !dataSorting.enabled)) {\n            data.forEach(function (point, i) {\n                // .update doesn't exist on a linked, hidden series (#3709)\n                // (#10187)\n                if (point !== oldData[i].y && !oldData[i].destroyed) {\n                    oldData[i].update(point, false, null, false);\n                }\n            });\n            // Don't add new points since those configs are used above\n            pointsToAdd.length = 0;\n            // Did not succeed in updating data\n        }\n        else {\n            succeeded = false;\n        }\n        oldData.forEach(function (point) {\n            if (point) {\n                point.touched = false;\n            }\n        });\n        if (!succeeded) {\n            return false;\n        }\n        // Add new points\n        pointsToAdd.forEach(function (point) {\n            this.addPoint(point, false, null, null, false);\n        }, this);\n        if (this.xIncrement === null &&\n            this.xData &&\n            this.xData.length) {\n            this.xIncrement = arrayMax(this.xData);\n            this.autoIncrement();\n        }\n        return true;\n    }\n    /**\n     * Apply a new set of data to the series and optionally redraw it. The\n     * new data array is passed by reference (except in case of\n     * `updatePoints`), and may later be mutated when updating the chart\n     * data.\n     *\n     * Note the difference in behaviour when setting the same amount of\n     * points, or a different amount of points, as handled by the\n     * `updatePoints` parameter.\n     *\n     * @sample highcharts/members/series-setdata/\n     *         Set new data from a button\n     * @sample highcharts/members/series-setdata-pie/\n     *         Set data in a pie\n     * @sample stock/members/series-setdata/\n     *         Set new data in Highcharts Stock\n     * @sample maps/members/series-setdata/\n     *         Set new data in Highmaps\n     *\n     * @function Highcharts.Series#setData\n     *\n     * @param {Array<Highcharts.PointOptionsType>} data\n     *        Takes an array of data in the same format as described under\n     *        `series.{type}.data` for the given series type, for example a\n     *        line series would take data in the form described under\n     *        [series.line.data](https://api.highcharts.com/highcharts/series.line.data).\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after the series is altered. If\n     *        doing more operations on the chart, it is a good idea to set\n     *        redraw to false and call {@link Chart#redraw} after.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        When the updated data is the same length as the existing data,\n     *        points will be updated by default, and animation visualizes\n     *        how the points are changed. Set false to disable animation, or\n     *        a configuration object to set duration or easing.\n     *\n     * @param {boolean} [updatePoints=true]\n     *        When this is true, points will be updated instead of replaced\n     *        whenever possible. This occurs a) when the updated data is the\n     *        same length as the existing data, b) when points are matched\n     *        by their id's, or c) when points can be matched by X values.\n     *        This allows updating with animation and performs better. In\n     *        this case, the original array is not passed by reference. Set\n     *        `false` to prevent.\n     */\n    setData(data, redraw = true, animation, updatePoints) {\n        const series = this, oldData = series.points, oldDataLength = (oldData && oldData.length) || 0, options = series.options, chart = series.chart, dataSorting = options.dataSorting, xAxis = series.xAxis, turboThreshold = options.turboThreshold, xData = this.xData, yData = this.yData, pointArrayMap = series.pointArrayMap, valueCount = pointArrayMap && pointArrayMap.length, keys = options.keys;\n        let i, pt, updatedData, indexOfX = 0, indexOfY = 1, copiedData;\n        if (!chart.options.chart.allowMutatingData) { // #4259\n            // Remove old reference\n            if (options.data) {\n                delete series.options.data;\n            }\n            if (series.userOptions.data) {\n                delete series.userOptions.data;\n            }\n            copiedData = merge(true, data);\n        }\n        data = copiedData || data || [];\n        const dataLength = data.length;\n        if (dataSorting && dataSorting.enabled) {\n            data = this.sortData(data);\n        }\n        // First try to run Point.update which is cheaper, allows animation,\n        // and keeps references to points.\n        if (chart.options.chart.allowMutatingData &&\n            updatePoints !== false &&\n            dataLength &&\n            oldDataLength &&\n            !series.cropped &&\n            !series.hasGroupedData &&\n            series.visible &&\n            // Soft updating has no benefit in boost, and causes JS error\n            // (#8355)\n            !series.boosted) {\n            updatedData = this.updateData(data, animation);\n        }\n        if (!updatedData) {\n            // Reset properties\n            series.xIncrement = null;\n            series.colorCounter = 0; // For series with colorByPoint (#1547)\n            // Update parallel arrays\n            this.parallelArrays.forEach(function (key) {\n                series[key + 'Data'].length = 0;\n            });\n            // In turbo mode, look for one- or twodimensional arrays of numbers.\n            // The first and the last valid value are tested, and we assume that\n            // all the rest are defined the same way. Although the 'for' loops\n            // are similar, they are repeated inside each if-else conditional\n            // for max performance.\n            let runTurbo = turboThreshold && dataLength > turboThreshold;\n            if (runTurbo) {\n                const firstPoint = series.getFirstValidPoint(data), lastPoint = series.getFirstValidPoint(data, dataLength - 1, -1), isShortArray = (a) => Boolean(isArray(a) && (keys || isNumber(a[0])));\n                // Assume all points are numbers\n                if (isNumber(firstPoint) && isNumber(lastPoint)) {\n                    for (i = 0; i < dataLength; i++) {\n                        xData[i] = this.autoIncrement();\n                        yData[i] = data[i];\n                    }\n                    // Assume all points are arrays when first point is\n                }\n                else if (isShortArray(firstPoint) &&\n                    isShortArray(lastPoint)) {\n                    if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n                        if (firstPoint.length === valueCount) {\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i];\n                            }\n                        }\n                        else {\n                            for (i = 0; i < dataLength; i++) {\n                                pt = data[i];\n                                xData[i] = pt[0];\n                                yData[i] =\n                                    pt.slice(1, valueCount + 1);\n                            }\n                        }\n                    }\n                    else { // [x, y]\n                        if (keys) {\n                            indexOfX = keys.indexOf('x');\n                            indexOfY = keys.indexOf('y');\n                            indexOfX = indexOfX >= 0 ? indexOfX : 0;\n                            indexOfY = indexOfY >= 0 ? indexOfY : 1;\n                        }\n                        if (firstPoint.length === 1) {\n                            indexOfY = 0;\n                        }\n                        if (indexOfX === indexOfY) {\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i][indexOfY];\n                            }\n                        }\n                        else {\n                            for (i = 0; i < dataLength; i++) {\n                                pt = data[i];\n                                xData[i] = pt[indexOfX];\n                                yData[i] = pt[indexOfY];\n                            }\n                        }\n                    }\n                }\n                else {\n                    // Highcharts expects configs to be numbers or arrays in\n                    // turbo mode\n                    runTurbo = false;\n                }\n            }\n            if (!runTurbo) {\n                for (i = 0; i < dataLength; i++) {\n                    pt = { series: series };\n                    series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\n                    series.updateParallelArrays(pt, i);\n                }\n            }\n            // Forgetting to cast strings to numbers is a common caveat when\n            // handling CSV or JSON\n            if (yData && isString(yData[0])) {\n                error(14, true, chart);\n            }\n            series.data = [];\n            series.options.data = series.userOptions.data = data;\n            // Destroy old points\n            i = oldDataLength;\n            while (i--) {\n                oldData[i]?.destroy();\n            }\n            // Reset minRange (#878)\n            if (xAxis) {\n                xAxis.minRange = xAxis.userMinRange;\n            }\n            // Redraw\n            series.isDirty = chart.isDirtyBox = true;\n            series.isDirtyData = !!oldData;\n            animation = false;\n        }\n        // Typically for pie series, points need to be processed and\n        // generated prior to rendering the legend\n        if (options.legendType === 'point') {\n            this.processData();\n            this.generatePoints();\n        }\n        if (redraw) {\n            chart.redraw(animation);\n        }\n    }\n    /**\n     * Internal function to sort series data\n     *\n     * @private\n     * @function Highcharts.Series#sortData\n     * @param {Array<Highcharts.PointOptionsType>} data\n     * Force data grouping.\n     */\n    sortData(data) {\n        const series = this, options = series.options, dataSorting = options.dataSorting, sortKey = dataSorting.sortKey || 'y', getPointOptionsObject = function (series, pointOptions) {\n            return (defined(pointOptions) &&\n                series.pointClass.prototype.optionsToObject.call({\n                    series: series\n                }, pointOptions)) || {};\n        };\n        data.forEach(function (pointOptions, i) {\n            data[i] = getPointOptionsObject(series, pointOptions);\n            data[i].index = i;\n        }, this);\n        // Sorting\n        const sortedData = data.concat().sort((a, b) => {\n            const aValue = getNestedProperty(sortKey, a);\n            const bValue = getNestedProperty(sortKey, b);\n            return bValue < aValue ? -1 : bValue > aValue ? 1 : 0;\n        });\n        // Set x value depending on the position in the array\n        sortedData.forEach(function (point, i) {\n            point.x = i;\n        }, this);\n        // Set the same x for linked series points if they don't have their\n        // own sorting\n        if (series.linkedSeries) {\n            series.linkedSeries.forEach(function (linkedSeries) {\n                const options = linkedSeries.options, seriesData = options.data;\n                if ((!options.dataSorting ||\n                    !options.dataSorting.enabled) &&\n                    seriesData) {\n                    seriesData.forEach(function (pointOptions, i) {\n                        seriesData[i] = getPointOptionsObject(linkedSeries, pointOptions);\n                        if (data[i]) {\n                            seriesData[i].x = data[i].x;\n                            seriesData[i].index = i;\n                        }\n                    });\n                    linkedSeries.setData(seriesData, false);\n                }\n            });\n        }\n        return data;\n    }\n    /**\n     * Internal function to process the data by cropping away unused data\n     * points if the series is longer than the crop threshold. This saves\n     * computing time for large series.\n     *\n     * @private\n     * @function Highcharts.Series#getProcessedData\n     * @param {boolean} [forceExtremesFromAll]\n     * Force getting extremes of a total series data range.\n     */\n    getProcessedData(forceExtremesFromAll) {\n        const series = this, xAxis = series.xAxis, options = series.options, cropThreshold = options.cropThreshold, logarithmic = xAxis?.logarithmic, isCartesian = series.isCartesian;\n        let croppedData, cropped, cropStart = 0, xExtremes, min, max, \n        // Copied during slice operation:\n        processedXData = series.xData, processedYData = series.yData, updatingNames = false;\n        const dataLength = processedXData.length;\n        if (xAxis) {\n            // Corrected for log axis (#3053)\n            xExtremes = xAxis.getExtremes();\n            min = xExtremes.min;\n            max = xExtremes.max;\n            updatingNames = !!(xAxis.categories && !xAxis.names.length);\n        }\n        // Optionally filter out points outside the plot area\n        if (isCartesian &&\n            series.sorted &&\n            !forceExtremesFromAll &&\n            (!cropThreshold ||\n                dataLength > cropThreshold ||\n                series.forceCrop)) {\n            // It's outside current extremes\n            if (processedXData[dataLength - 1] < min ||\n                processedXData[0] > max) {\n                processedXData = [];\n                processedYData = [];\n                // Only crop if it's actually spilling out\n            }\n            else if (series.yData && (processedXData[0] < min ||\n                processedXData[dataLength - 1] > max)) {\n                croppedData = this.cropData(series.xData, series.yData, min, max);\n                processedXData = croppedData.xData;\n                processedYData = croppedData.yData;\n                cropStart = croppedData.start;\n                cropped = true;\n            }\n        }\n        // Find the closest distance between processed points\n        const closestPointRange = getClosestDistance([\n            logarithmic ?\n                processedXData.map(logarithmic.log2lin) :\n                processedXData\n        ], \n        // Unsorted data is not supported by the line tooltip, as well as\n        // data grouping and navigation in Stock charts (#725) and width\n        // calculation of columns (#1900). Avoid warning during the\n        // premature processing pass in updateNames (#16104).\n        () => (series.requireSorting &&\n            !updatingNames &&\n            error(15, false, series.chart)));\n        return {\n            xData: processedXData,\n            yData: processedYData,\n            cropped: cropped,\n            cropStart: cropStart,\n            closestPointRange: closestPointRange\n        };\n    }\n    /**\n     * Internal function to apply processed data.\n     * In Highcharts Stock, this function is extended to provide data grouping.\n     *\n     * @private\n     * @function Highcharts.Series#processData\n     * @param {boolean} [force]\n     * Force data grouping.\n     */\n    processData(force) {\n        const series = this, xAxis = series.xAxis;\n        // If the series data or axes haven't changed, don't go through\n        // this. Return false to pass the message on to override methods\n        // like in data grouping.\n        if (series.isCartesian &&\n            !series.isDirty &&\n            !xAxis.isDirty &&\n            !series.yAxis.isDirty &&\n            !force) {\n            return false;\n        }\n        const processedData = series.getProcessedData();\n        // Record the properties\n        series.cropped = processedData.cropped; // Undefined or true\n        series.cropStart = processedData.cropStart;\n        series.processedXData = processedData.xData;\n        series.processedYData = processedData.yData;\n        series.closestPointRange = (series.basePointRange = processedData.closestPointRange);\n        fireEvent(series, 'afterProcessData');\n    }\n    /**\n     * Iterate over xData and crop values between min and max. Returns\n     * object containing crop start/end cropped xData with corresponding\n     * part of yData, dataMin and dataMax within the cropped range.\n     *\n     * @private\n     * @function Highcharts.Series#cropData\n     */\n    cropData(xData, yData, min, max) {\n        const dataLength = xData.length;\n        let i, j, start = 0, end = dataLength;\n        // Iterate up to find slice start\n        for (i = 0; i < dataLength; i++) {\n            if (xData[i] >= min) {\n                start = Math.max(0, i - 1);\n                break;\n            }\n        }\n        // Proceed to find slice end\n        for (j = i; j < dataLength; j++) {\n            if (xData[j] > max) {\n                end = j + 1;\n                break;\n            }\n        }\n        return {\n            xData: xData.slice(start, end),\n            yData: yData.slice(start, end),\n            start,\n            end\n        };\n    }\n    /**\n     * Generate the data point after the data has been processed by cropping\n     * away unused points and optionally grouped in Highcharts Stock.\n     *\n     * @private\n     * @function Highcharts.Series#generatePoints\n     */\n    generatePoints() {\n        const series = this, options = series.options, dataOptions = series.processedData || options.data, processedXData = series.processedXData, processedYData = series.processedYData, PointClass = series.pointClass, processedDataLength = processedXData.length, cropStart = series.cropStart || 0, hasGroupedData = series.hasGroupedData, keys = options.keys, points = [], groupCropStartIndex = (options.dataGrouping &&\n            options.dataGrouping.groupAll ?\n            cropStart :\n            0);\n        let dataLength, cursor, point, i, data = series.data;\n        if (!data && !hasGroupedData) {\n            const arr = [];\n            arr.length = dataOptions.length;\n            data = series.data = arr;\n        }\n        if (keys && hasGroupedData) {\n            // Grouped data has already applied keys (#6590)\n            series.options.keys = false;\n        }\n        for (i = 0; i < processedDataLength; i++) {\n            cursor = cropStart + i;\n            if (!hasGroupedData) {\n                point = data[cursor];\n                // #970:\n                if (!point &&\n                    typeof dataOptions[cursor] !== 'undefined') {\n                    data[cursor] = point = new PointClass(series, dataOptions[cursor], processedXData[i]);\n                }\n            }\n            else {\n                // Splat the y data in case of ohlc data array\n                point = new PointClass(series, [processedXData[i]].concat(splat(processedYData[i])));\n                point.dataGroup = series.groupMap[groupCropStartIndex + i];\n                if (point.dataGroup.options) {\n                    point.options = point.dataGroup.options;\n                    extend(point, point.dataGroup.options);\n                    // Collision of props and options (#9770)\n                    delete point.dataLabels;\n                }\n            }\n            if (point) { // #6279\n                /**\n                 * Contains the point's index in the `Series.points` array.\n                 *\n                 * @name Highcharts.Point#index\n                 * @type {number}\n                 * @readonly\n                 */\n                // For faster access in Point.update\n                point.index = hasGroupedData ?\n                    (groupCropStartIndex + i) : cursor;\n                points[i] = point;\n            }\n        }\n        // Restore keys options (#6590)\n        series.options.keys = keys;\n        // Hide cropped-away points - this only runs when the number of\n        // points is above cropThreshold, or when switching view from\n        // non-grouped data to grouped data (#637)\n        if (data &&\n            (processedDataLength !== (dataLength = data.length) ||\n                hasGroupedData)) {\n            for (i = 0; i < dataLength; i++) {\n                // When has grouped data, clear all points\n                if (i === cropStart && !hasGroupedData) {\n                    i += processedDataLength;\n                }\n                if (data[i]) {\n                    data[i].destroyElements();\n                    data[i].plotX = void 0; // #1003\n                }\n            }\n        }\n        /**\n         * Read only. An array containing those values converted to points.\n         * In case the series data length exceeds the `cropThreshold`, or if\n         * the data is grouped, `series.data` doesn't contain all the\n         * points. Also, in case a series is hidden, the `data` array may be\n         * empty. In case of cropping, the `data` array may contain `undefined`\n         * values, instead of points. To access raw values,\n         * `series.options.data` will always be up to date. `Series.data` only\n         * contains the points that have been created on demand. To modify the\n         * data, use\n         * {@link Highcharts.Series#setData} or\n         * {@link Highcharts.Point#update}.\n         *\n         * @see Series.points\n         *\n         * @name Highcharts.Series#data\n         * @type {Array<Highcharts.Point>}\n         */\n        series.data = data;\n        /**\n         * An array containing all currently visible point objects. In case\n         * of cropping, the cropped-away points are not part of this array.\n         * The `series.points` array starts at `series.cropStart` compared\n         * to `series.data` and `series.options.data`. If however the series\n         * data is grouped, these can't be correlated one to one. To modify\n         * the data, use {@link Highcharts.Series#setData} or\n         * {@link Highcharts.Point#update}.\n         *\n         * @name Highcharts.Series#points\n         * @type {Array<Highcharts.Point>}\n         */\n        series.points = points;\n        fireEvent(this, 'afterGeneratePoints');\n    }\n    /**\n     * Get current X extremes for the visible data.\n     *\n     * @private\n     * @function Highcharts.Series#getXExtremes\n     * @param {Array<number>} xData\n     * The data to inspect. Defaults to the current data within the visible\n     * range.\n     */\n    getXExtremes(xData) {\n        return {\n            min: arrayMin(xData),\n            max: arrayMax(xData)\n        };\n    }\n    /**\n     * Calculate Y extremes for the visible data. The result is returned\n     * as an object with `dataMin` and `dataMax` properties.\n     *\n     * @private\n     * @function Highcharts.Series#getExtremes\n     * @param {Array<number>} [yData]\n     * The data to inspect. Defaults to the current data within the visible\n     * range.\n     * @param {boolean} [forceExtremesFromAll]\n     * Force getting extremes of a total series data range.\n     */\n    getExtremes(yData, forceExtremesFromAll) {\n        const xAxis = this.xAxis, yAxis = this.yAxis, activeYData = [], \n        // Handle X outside the viewed area. This does not work with\n        // non-sorted data like scatter (#7639).\n        shoulder = this.requireSorting && !this.is('column') ?\n            1 : 0, \n        // #2117, need to compensate for log X axis\n        positiveValuesOnly = yAxis ? yAxis.positiveValuesOnly : false, getExtremesFromAll = forceExtremesFromAll ||\n            this.getExtremesFromAll ||\n            this.options.getExtremesFromAll; // #4599\n        let { processedXData, processedYData } = this, xExtremes, validValue, withinRange, x, y, i, j, xMin = 0, xMax = 0, activeCounter = 0;\n        // Get the processed data from the full range (#21003)\n        if (this.cropped && getExtremesFromAll) {\n            const processedData = this.getProcessedData(true);\n            processedXData = processedData.xData;\n            processedYData = processedData.yData;\n        }\n        yData = yData || this.stackedYData || processedYData || [];\n        const yDataLength = yData.length, xData = processedXData || this.xData;\n        if (xAxis) {\n            xExtremes = xAxis.getExtremes();\n            xMin = xExtremes.min;\n            xMax = xExtremes.max;\n        }\n        for (i = 0; i < yDataLength; i++) {\n            x = xData[i];\n            y = yData[i];\n            // For points within the visible range, including the first\n            // point outside the visible range (#7061), consider y extremes.\n            validValue = ((isNumber(y) ||\n                isArray(y)) && ((isNumber(y) ? y > 0 : y.length) ||\n                !positiveValuesOnly));\n            withinRange = (forceExtremesFromAll ||\n                this.getExtremesFromAll ||\n                this.options.getExtremesFromAll ||\n                this.cropped ||\n                !xAxis || // For colorAxis support\n                ((xData[i + shoulder] || x) >= xMin &&\n                    (xData[i - shoulder] || x) <= xMax));\n            if (validValue && withinRange) {\n                j = y.length;\n                if (j) { // Array, like ohlc or range data\n                    while (j--) {\n                        if (isNumber(y[j])) { // #7380, #11513\n                            activeYData[activeCounter++] = y[j];\n                        }\n                    }\n                }\n                else {\n                    activeYData[activeCounter++] = y;\n                }\n            }\n        }\n        const dataExtremes = {\n            activeYData, // Needed for Stock Cumulative Sum\n            dataMin: arrayMin(activeYData),\n            dataMax: arrayMax(activeYData)\n        };\n        fireEvent(this, 'afterGetExtremes', { dataExtremes });\n        return dataExtremes;\n    }\n    /**\n     * Set the current data extremes as `dataMin` and `dataMax` on the\n     * Series item. Use this only when the series properties should be\n     * updated.\n     *\n     * @private\n     * @function Highcharts.Series#applyExtremes\n     */\n    applyExtremes() {\n        const dataExtremes = this.getExtremes();\n        /**\n         * Contains the minimum value of the series' data point. Some series\n         * types like `networkgraph` do not support this property as they\n         * lack a `y`-value.\n         * @name Highcharts.Series#dataMin\n         * @type {number|undefined}\n         * @readonly\n         */\n        this.dataMin = dataExtremes.dataMin;\n        /**\n         * Contains the maximum value of the series' data point. Some series\n         * types like `networkgraph` do not support this property as they\n         * lack a `y`-value.\n         * @name Highcharts.Series#dataMax\n         * @type {number|undefined}\n         * @readonly\n         */\n        this.dataMax = dataExtremes.dataMax;\n        return dataExtremes;\n    }\n    /**\n     * Find and return the first non nullish point in the data\n     *\n     * @private\n     * @function Highcharts.Series.getFirstValidPoint\n     * @param {Array<Highcharts.PointOptionsType>} data\n     *        Array of options for points\n     * @param {number} [start=0]\n     *        Index to start searching from\n     * @param {number} [increment=1]\n     *        Index increment, set -1 to search backwards\n     */\n    getFirstValidPoint(data, start = 0, increment = 1) {\n        const dataLength = data.length;\n        let i = start;\n        while (i >= 0 && i < dataLength) {\n            if (defined(data[i])) {\n                return data[i];\n            }\n            i += increment;\n        }\n    }\n    /**\n     * Translate data points from raw data values to chart specific\n     * positioning data needed later in the `drawPoints` and `drawGraph`\n     * functions. This function can be overridden in plugins and custom\n     * series type implementations.\n     *\n     * @function Highcharts.Series#translate\n     *\n     * @emits Highcharts.Series#events:translate\n     */\n    translate() {\n        if (!this.processedXData) { // Hidden series\n            this.processData();\n        }\n        this.generatePoints();\n        const series = this, options = series.options, stacking = options.stacking, xAxis = series.xAxis, categories = xAxis.categories, enabledDataSorting = series.enabledDataSorting, yAxis = series.yAxis, points = series.points, dataLength = points.length, pointPlacement = series.pointPlacementToXValue(), // #7860\n        dynamicallyPlaced = Boolean(pointPlacement), threshold = options.threshold, stackThreshold = options.startFromThreshold ? threshold : 0;\n        let i, plotX, lastPlotX, stackIndicator, closestPointRangePx = Number.MAX_VALUE;\n        /**\n         * Plotted coordinates need to be within a limited range. Drawing\n         * too far outside the viewport causes various rendering issues\n         * (#3201, #3923, #7555).\n         * @private\n         */\n        function limitedRange(val) {\n            return clamp(val, -1e9, 1e9);\n        }\n        // Translate each point\n        for (i = 0; i < dataLength; i++) {\n            const point = points[i], xValue = point.x;\n            let stackItem, stackValues, yValue = point.y, lowValue = point.low;\n            const stacks = stacking && yAxis.stacking?.stacks[(series.negStacks &&\n                yValue <\n                    (stackThreshold ? 0 : threshold) ?\n                '-' :\n                '') + series.stackKey];\n            plotX = xAxis.translate(// #3923\n            xValue, false, false, false, true, pointPlacement);\n            /**\n             * The translated X value for the point in terms of pixels. Relative\n             * to the X axis position if the series has one, otherwise relative\n             * to the plot area. Depending on the series type this value might\n             * not be defined.\n             *\n             * In an inverted chart the x-axis is going from the bottom to the\n             * top so the `plotX` value is the number of pixels from the bottom\n             * of the axis.\n             *\n             * @see Highcharts.Point#pos\n             * @name Highcharts.Point#plotX\n             * @type {number|undefined}\n             */\n            point.plotX = isNumber(plotX) ? correctFloat(// #5236\n            limitedRange(plotX) // #3923\n            ) : void 0;\n            // Calculate the bottom y value for stacked series\n            if (stacking &&\n                series.visible &&\n                stacks &&\n                stacks[xValue]) {\n                stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n                if (!point.isNull && stackIndicator.key) {\n                    stackItem = stacks[xValue];\n                    stackValues = stackItem.points[stackIndicator.key];\n                }\n                if (stackItem && isArray(stackValues)) {\n                    lowValue = stackValues[0];\n                    yValue = stackValues[1];\n                    if (lowValue === stackThreshold &&\n                        stackIndicator.key === stacks[xValue].base) {\n                        lowValue = pick(isNumber(threshold) ? threshold : yAxis.min);\n                    }\n                    // #1200, #1232\n                    if (yAxis.positiveValuesOnly &&\n                        defined(lowValue) &&\n                        lowValue <= 0) {\n                        lowValue = void 0;\n                    }\n                    point.total = point.stackTotal = pick(stackItem.total);\n                    point.percentage = defined(point.y) && stackItem.total ?\n                        (point.y / stackItem.total * 100) : void 0;\n                    point.stackY = yValue;\n                    // In case of variwide series (where widths of points are\n                    // different in most cases), stack labels are positioned\n                    // wrongly, so the call of the setOffset is omitted here and\n                    // labels are correctly positioned later, at the end of the\n                    // variwide's translate function (#10962)\n                    if (!series.irregularWidths) {\n                        stackItem.setOffset(series.pointXOffset || 0, series.barW || 0, void 0, void 0, void 0, series.xAxis);\n                    }\n                }\n            }\n            // Set translated yBottom or remove it\n            point.yBottom = defined(lowValue) ?\n                limitedRange(yAxis.translate(lowValue, false, true, false, true)) :\n                void 0;\n            // General hook, used for Highcharts Stock compare and cumulative\n            if (series.dataModify) {\n                yValue = series.dataModify.modifyValue(yValue, i);\n            }\n            // Set the plotY value, reset it for redraws #3201, #18422\n            let plotY;\n            if (isNumber(yValue) && point.plotX !== void 0) {\n                plotY = yAxis.translate(yValue, false, true, false, true);\n                plotY = isNumber(plotY) ? limitedRange(plotY) : void 0;\n            }\n            /**\n             * The translated Y value for the point in terms of pixels. Relative\n             * to the Y axis position if the series has one, otherwise relative\n             * to the plot area. Depending on the series type this value might\n             * not be defined.\n             *\n             * In an inverted chart the y-axis is going from right to left\n             * so the `plotY` value is the number of pixels from the right\n             * of the `yAxis`.\n             *\n             * @see Highcharts.Point#pos\n             * @name Highcharts.Point#plotY\n             * @type {number|undefined}\n             */\n            point.plotY = plotY;\n            point.isInside = this.isPointInside(point);\n            // Set client related positions for mouse tracking\n            point.clientX = dynamicallyPlaced ?\n                correctFloat(xAxis.translate(xValue, false, false, false, true, pointPlacement)) :\n                plotX; // #1514, #5383, #5518\n            // Negative points #19028\n            point.negative = (point.y || 0) < (threshold || 0);\n            // Some API data\n            point.category = pick(categories && categories[point.x], point.x);\n            // Determine auto enabling of markers (#3635, #5099)\n            if (!point.isNull && point.visible !== false) {\n                if (typeof lastPlotX !== 'undefined') {\n                    closestPointRangePx = Math.min(closestPointRangePx, Math.abs(plotX - lastPlotX));\n                }\n                lastPlotX = plotX;\n            }\n            // Find point zone\n            point.zone = this.zones.length ? point.getZone() : void 0;\n            // Animate new points with data sorting\n            if (!point.graphic && series.group && enabledDataSorting) {\n                point.isNew = true;\n            }\n        }\n        series.closestPointRangePx = closestPointRangePx;\n        fireEvent(this, 'afterTranslate');\n    }\n    /**\n     * Return the series points with null points filtered out.\n     *\n     * @function Highcharts.Series#getValidPoints\n     *\n     * @param {Array<Highcharts.Point>} [points]\n     * The points to inspect, defaults to {@link Series.points}.\n     *\n     * @param {boolean} [insideOnly=false]\n     * Whether to inspect only the points that are inside the visible view.\n     *\n     * @param {boolean} [allowNull=false]\n     * Whether to allow null points to pass as valid points.\n     *\n     * @return {Array<Highcharts.Point>}\n     * The valid points.\n     */\n    getValidPoints(points, insideOnly, allowNull) {\n        const chart = this.chart;\n        // #3916, #5029, #5085\n        return (points || this.points || []).filter(function (point) {\n            const { plotX, plotY } = point, \n            // Undefined plotY is treated as null when negative values\n            // in log axis (#18422)\n            asNull = !allowNull && (point.isNull || !isNumber(plotY));\n            if (asNull || (insideOnly && !chart.isInsidePlot(plotX, plotY, { inverted: chart.inverted }))) {\n                return false;\n            }\n            return point.visible !== false;\n        });\n    }\n    /**\n     * Get the clipping for the series. Could be called for a series to\n     * initiate animating the clip or to set the final clip (only width\n     * and x).\n     *\n     * @private\n     * @function Highcharts.Series#getClip\n     */\n    getClipBox() {\n        const { chart, xAxis, yAxis } = this;\n        // If no axes on the series, use global clipBox\n        let { x, y, width, height } = merge(chart.clipBox);\n        // Otherwise, use clipBox.width which is corrected for plotBorderWidth\n        // and clipOffset\n        if (xAxis && xAxis.len !== chart.plotSizeX) {\n            width = xAxis.len;\n        }\n        if (yAxis && yAxis.len !== chart.plotSizeY) {\n            height = yAxis.len;\n        }\n        // If the chart is inverted and the series is not invertible, the chart\n        // clip box should be inverted, but not the series clip box (#20264)\n        if (chart.inverted && !this.invertible) {\n            [width, height] = [height, width];\n        }\n        return { x, y, width, height };\n    }\n    /**\n     * Get the shared clip key, creating it if it doesn't exist.\n     *\n     * @private\n     * @function Highcharts.Series#getSharedClipKey\n     */\n    getSharedClipKey() {\n        this.sharedClipKey = (this.options.xAxis || 0) + ',' +\n            (this.options.yAxis || 0);\n        return this.sharedClipKey;\n    }\n    /**\n     * Set the clipping for the series. For animated series the clip is later\n     * modified.\n     *\n     * @private\n     * @function Highcharts.Series#setClip\n     */\n    setClip() {\n        const { chart, group, markerGroup } = this, sharedClips = chart.sharedClips, renderer = chart.renderer, clipBox = this.getClipBox(), sharedClipKey = this.getSharedClipKey(); // #4526\n        let clipRect = sharedClips[sharedClipKey];\n        // If a clipping rectangle for the same set of axes does not exist,\n        // create it\n        if (!clipRect) {\n            sharedClips[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n            // When setting chart size, or when the series is rendered again before\n            // starting animating, in compliance to a responsive rule\n        }\n        else {\n            clipRect.animate(clipBox);\n        }\n        if (group) {\n            // When clip is false, reset to no clip after animation\n            group.clip(this.options.clip === false ? void 0 : clipRect);\n        }\n        // Unclip temporary animation clip\n        if (markerGroup) {\n            markerGroup.clip();\n        }\n    }\n    /**\n     * Animate in the series. Called internally twice. First with the `init`\n     * parameter set to true, which sets up the initial state of the\n     * animation. Then when ready, it is called with the `init` parameter\n     * undefined, in order to perform the actual animation.\n     *\n     * @function Highcharts.Series#animate\n     *\n     * @param {boolean} [init]\n     * Initialize the animation.\n     */\n    animate(init) {\n        const { chart, group, markerGroup } = this, inverted = chart.inverted, animation = animObject(this.options.animation), \n        // The key for temporary animation clips\n        animationClipKey = [\n            this.getSharedClipKey(),\n            animation.duration,\n            animation.easing,\n            animation.defer\n        ].join(',');\n        let animationClipRect = chart.sharedClips[animationClipKey], markerAnimationClipRect = chart.sharedClips[animationClipKey + 'm'];\n        // Initialize the animation. Set up the clipping rectangle.\n        if (init && group) {\n            const clipBox = this.getClipBox();\n            // Create temporary animation clips\n            if (!animationClipRect) {\n                clipBox.width = 0;\n                if (inverted) {\n                    clipBox.x = chart.plotHeight;\n                }\n                animationClipRect = chart.renderer.clipRect(clipBox);\n                chart.sharedClips[animationClipKey] = animationClipRect;\n                // The marker clip box. The number 99 is a safe margin to avoid\n                // markers being clipped during animation.\n                const markerClipBox = {\n                    x: inverted ? -99 : -99,\n                    y: inverted ? -99 : -99,\n                    width: inverted ? chart.plotWidth + 199 : 99,\n                    height: inverted ? 99 : chart.plotHeight + 199\n                };\n                markerAnimationClipRect = chart.renderer.clipRect(markerClipBox);\n                chart.sharedClips[animationClipKey + 'm'] = markerAnimationClipRect;\n            }\n            else {\n                // When height changes during animation, typically due to\n                // responsive settings\n                animationClipRect.attr('height', clipBox.height);\n            }\n            group.clip(animationClipRect);\n            markerGroup?.clip(markerAnimationClipRect);\n            // Run the animation\n        }\n        else if (animationClipRect &&\n            // Only first series in this pane\n            !animationClipRect.hasClass('highcharts-animating')) {\n            const finalBox = this.getClipBox(), step = animation.step;\n            // Only do this when there are actually markers, or we have multiple\n            // series (#20473)\n            if (markerGroup?.element.childNodes.length ||\n                chart.series.length > 1) {\n                // To provide as smooth animation as possible, update the marker\n                // group clipping in steps of the main group animation\n                animation.step = function (val, fx) {\n                    if (step) {\n                        step.apply(fx, arguments);\n                    }\n                    if (fx.prop === 'width' &&\n                        markerAnimationClipRect?.element) {\n                        markerAnimationClipRect.attr(inverted ? 'height' : 'width', val + 99);\n                    }\n                };\n            }\n            animationClipRect\n                .addClass('highcharts-animating')\n                .animate(finalBox, animation);\n        }\n    }\n    /**\n     * This runs after animation to land on the final plot clipping.\n     *\n     * @private\n     * @function Highcharts.Series#afterAnimate\n     *\n     * @emits Highcharts.Series#event:afterAnimate\n     */\n    afterAnimate() {\n        this.setClip();\n        // Destroy temporary clip rectangles that are no longer in use\n        objectEach(this.chart.sharedClips, (clip, key, sharedClips) => {\n            if (clip && !this.chart.container.querySelector(`[clip-path=\"url(#${clip.id})\"]`)) {\n                clip.destroy();\n                delete sharedClips[key];\n            }\n        });\n        this.finishedAnimating = true;\n        fireEvent(this, 'afterAnimate');\n    }\n    /**\n     * Draw the markers for line-like series types, and columns or other\n     * graphical representation for {@link Point} objects for other series\n     * types. The resulting element is typically stored as\n     * {@link Point.graphic}, and is created on the first call and updated\n     * and moved on subsequent calls.\n     *\n     * @function Highcharts.Series#drawPoints\n     */\n    drawPoints(points = this.points) {\n        const series = this, chart = series.chart, styledMode = chart.styledMode, { colorAxis, options } = series, seriesMarkerOptions = options.marker, markerGroup = series[series.specialGroup || 'markerGroup'], xAxis = series.xAxis, globallyEnabled = pick(seriesMarkerOptions.enabled, !xAxis || xAxis.isRadial ? true : null, \n        // Use larger or equal as radius is null in bubbles (#6321)\n        series.closestPointRangePx >= (seriesMarkerOptions.enabledThreshold *\n            seriesMarkerOptions.radius));\n        let i, point, graphic, verb, pointMarkerOptions, hasPointMarker, markerAttribs;\n        if (seriesMarkerOptions.enabled !== false ||\n            series._hasPointMarkers) {\n            for (i = 0; i < points.length; i++) {\n                point = points[i];\n                graphic = point.graphic;\n                verb = graphic ? 'animate' : 'attr';\n                pointMarkerOptions = point.marker || {};\n                hasPointMarker = !!point.marker;\n                const shouldDrawMarker = ((globallyEnabled &&\n                    typeof pointMarkerOptions.enabled === 'undefined') || pointMarkerOptions.enabled) && !point.isNull && point.visible !== false;\n                // Only draw the point if y is defined\n                if (shouldDrawMarker) {\n                    // Shortcuts\n                    const symbol = pick(pointMarkerOptions.symbol, series.symbol, 'rect');\n                    markerAttribs = series.markerAttribs(point, (point.selected && 'select'));\n                    // Set starting position for point sliding animation.\n                    if (series.enabledDataSorting) {\n                        point.startXPos = xAxis.reversed ?\n                            -(markerAttribs.width || 0) :\n                            xAxis.width;\n                    }\n                    const isInside = point.isInside !== false;\n                    if (!graphic &&\n                        isInside &&\n                        ((markerAttribs.width || 0) > 0 || point.hasImage)) {\n                        /**\n                         * SVG graphic representing the point in the chart. In\n                         * some cases it may be a hidden graphic to improve\n                         * accessibility.\n                         *\n                         * Typically this is a simple shape, like a `rect`\n                         * for column charts or `path` for line markers, but\n                         * for some complex series types like boxplot or 3D\n                         * charts, the graphic may be a `g` element\n                         * containing other shapes. The graphic is generated\n                         * the first time {@link Series#drawPoints} runs,\n                         * and updated and moved on subsequent runs.\n                         *\n                         * @see Highcharts.Point#graphics\n                         *\n                         * @name Highcharts.Point#graphic\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        point.graphic = graphic = chart.renderer\n                            .symbol(symbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, hasPointMarker ?\n                            pointMarkerOptions :\n                            seriesMarkerOptions)\n                            .add(markerGroup);\n                        // Sliding animation for new points\n                        if (series.enabledDataSorting &&\n                            chart.hasRendered) {\n                            graphic.attr({\n                                x: point.startXPos\n                            });\n                            verb = 'animate';\n                        }\n                    }\n                    if (graphic && verb === 'animate') { // Update\n                        // Since the marker group isn't clipped, each\n                        // individual marker must be toggled\n                        graphic[isInside ? 'show' : 'hide'](isInside)\n                            .animate(markerAttribs);\n                    }\n                    // Presentational attributes\n                    if (graphic) {\n                        const pointAttr = series.pointAttribs(point, ((styledMode || !point.selected) ?\n                            void 0 :\n                            'select'));\n                        if (!styledMode) {\n                            graphic[verb](pointAttr);\n                        }\n                        else if (colorAxis) { // #14114\n                            graphic['css']({\n                                fill: pointAttr.fill\n                            });\n                        }\n                    }\n                    if (graphic) {\n                        graphic.addClass(point.getClassName(), true);\n                    }\n                }\n                else if (graphic) {\n                    point.graphic = graphic.destroy(); // #1269\n                }\n            }\n        }\n    }\n    /**\n     * Get non-presentational attributes for a point. Used internally for\n     * both styled mode and classic. Can be overridden for different series\n     * types.\n     *\n     * @see Series#pointAttribs\n     *\n     * @function Highcharts.Series#markerAttribs\n     *\n     * @param {Highcharts.Point} point\n     * The Point to inspect.\n     *\n     * @param {string} [state]\n     * The state, can be either `hover`, `select` or undefined.\n     *\n     * @return {Highcharts.SVGAttributes}\n     * A hash containing those attributes that are not settable from CSS.\n     */\n    markerAttribs(point, state) {\n        const seriesOptions = this.options, seriesMarkerOptions = seriesOptions.marker, pointMarkerOptions = point.marker || {}, symbol = (pointMarkerOptions.symbol ||\n            seriesMarkerOptions.symbol), attribs = {};\n        let seriesStateOptions, pointStateOptions, radius = pick(pointMarkerOptions.radius, seriesMarkerOptions && seriesMarkerOptions.radius);\n        // Handle hover and select states\n        if (state) {\n            seriesStateOptions = seriesMarkerOptions.states[state];\n            pointStateOptions = pointMarkerOptions.states &&\n                pointMarkerOptions.states[state];\n            radius = pick(pointStateOptions && pointStateOptions.radius, seriesStateOptions && seriesStateOptions.radius, radius && radius + (seriesStateOptions && seriesStateOptions.radiusPlus ||\n                0));\n        }\n        point.hasImage = symbol && symbol.indexOf('url') === 0;\n        if (point.hasImage) {\n            radius = 0; // And subsequently width and height is not set\n        }\n        const pos = point.pos();\n        if (isNumber(radius) && pos) {\n            if (seriesOptions.crisp) {\n                pos[0] = crisp(pos[0], point.hasImage ?\n                    0 :\n                    symbol === 'rect' ?\n                        // Rectangle symbols need crisp edges, others don't\n                        seriesMarkerOptions?.lineWidth || 0 :\n                        1);\n            }\n            attribs.x = pos[0] - radius;\n            attribs.y = pos[1] - radius;\n        }\n        if (radius) {\n            attribs.width = attribs.height = 2 * radius;\n        }\n        return attribs;\n    }\n    /**\n     * Internal function to get presentational attributes for each point.\n     * Unlike {@link Series#markerAttribs}, this function should return\n     * those attributes that can also be set in CSS. In styled mode,\n     * `pointAttribs` won't be called.\n     *\n     * @private\n     * @function Highcharts.Series#pointAttribs\n     *\n     * @param {Highcharts.Point} [point]\n     * The point instance to inspect.\n     *\n     * @param {string} [state]\n     * The point state, can be either `hover`, `select` or 'normal'. If\n     * undefined, normal state is assumed.\n     *\n     * @return {Highcharts.SVGAttributes}\n     * The presentational attributes to be set on the point.\n     */\n    pointAttribs(point, state) {\n        const seriesMarkerOptions = this.options.marker, pointOptions = point && point.options, pointMarkerOptions = ((pointOptions && pointOptions.marker) || {}), pointColorOption = pointOptions && pointOptions.color, pointColor = point && point.color, zoneColor = point && point.zone && point.zone.color;\n        let seriesStateOptions, pointStateOptions, color = this.color, fill, stroke, strokeWidth = pick(pointMarkerOptions.lineWidth, seriesMarkerOptions.lineWidth), opacity = 1;\n        color = (pointColorOption ||\n            zoneColor ||\n            pointColor ||\n            color);\n        fill = (pointMarkerOptions.fillColor ||\n            seriesMarkerOptions.fillColor ||\n            color);\n        stroke = (pointMarkerOptions.lineColor ||\n            seriesMarkerOptions.lineColor ||\n            color);\n        // Handle hover and select states\n        state = state || 'normal';\n        if (state) {\n            seriesStateOptions = (seriesMarkerOptions.states[state] || {});\n            pointStateOptions = (pointMarkerOptions.states &&\n                pointMarkerOptions.states[state]) || {};\n            strokeWidth = pick(pointStateOptions.lineWidth, seriesStateOptions.lineWidth, strokeWidth + pick(pointStateOptions.lineWidthPlus, seriesStateOptions.lineWidthPlus, 0));\n            fill = (pointStateOptions.fillColor ||\n                seriesStateOptions.fillColor ||\n                fill);\n            stroke = (pointStateOptions.lineColor ||\n                seriesStateOptions.lineColor ||\n                stroke);\n            opacity = pick(pointStateOptions.opacity, seriesStateOptions.opacity, opacity);\n        }\n        return {\n            'stroke': stroke,\n            'stroke-width': strokeWidth,\n            'fill': fill,\n            'opacity': opacity\n        };\n    }\n    /**\n     * Clear DOM objects and free up memory.\n     *\n     * @private\n     * @function Highcharts.Series#destroy\n     *\n     * @emits Highcharts.Series#event:destroy\n     */\n    destroy(keepEventsForUpdate) {\n        const series = this, chart = series.chart, issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent), data = series.data || [];\n        let destroy, i, point, axis;\n        // Add event hook\n        fireEvent(series, 'destroy', { keepEventsForUpdate });\n        // Remove events\n        this.removeEvents(keepEventsForUpdate);\n        // Erase from axes\n        (series.axisTypes || []).forEach(function (AXIS) {\n            axis = series[AXIS];\n            if (axis && axis.series) {\n                erase(axis.series, series);\n                axis.isDirty = axis.forceRedraw = true;\n            }\n        });\n        // Remove legend items\n        if (series.legendItem) {\n            series.chart.legend.destroyItem(series);\n        }\n        // Destroy all points with their elements\n        i = data.length;\n        while (i--) {\n            point = data[i];\n            if (point && point.destroy) {\n                point.destroy();\n            }\n        }\n        for (const zone of series.zones) {\n            // Destroy SVGElement's but preserve primitive props (#20426)\n            destroyObjectProperties(zone, void 0, true);\n        }\n        // Clear the animation timeout if we are destroying the series\n        // during initial animation\n        U.clearTimeout(series.animationTimeout);\n        // Destroy all SVGElements associated to the series\n        objectEach(series, function (val, prop) {\n            // Survive provides a hook for not destroying\n            if (val instanceof SVGElement && !val.survive) {\n                // Issue 134 workaround\n                destroy = issue134 && prop === 'group' ?\n                    'hide' :\n                    'destroy';\n                val[destroy]();\n            }\n        });\n        // Remove from hoverSeries\n        if (chart.hoverSeries === series) {\n            chart.hoverSeries = void 0;\n        }\n        erase(chart.series, series);\n        chart.orderItems('series');\n        // Clear all members\n        objectEach(series, function (val, prop) {\n            if (!keepEventsForUpdate || prop !== 'hcEvents') {\n                delete series[prop];\n            }\n        });\n    }\n    /**\n     * Clip the graphs into zones for colors and styling.\n     *\n     * @private\n     * @function Highcharts.Series#applyZones\n     */\n    applyZones() {\n        const series = this, { area, chart, graph, zones, points, xAxis, yAxis, zoneAxis } = series, { inverted, renderer } = chart, axis = this[`${zoneAxis}Axis`], { isXAxis, len = 0 } = axis || {}, halfWidth = (graph?.strokeWidth() || 0) / 2 + 1, \n        // Avoid points that are so close to the threshold that the graph\n        // line would be split\n        avoidClose = (zone, plotX = 0, plotY = 0) => {\n            if (inverted) {\n                plotY = len - plotY;\n            }\n            const { translated = 0, lineClip } = zone, distance = plotY - translated;\n            lineClip?.push([\n                'L',\n                plotX,\n                Math.abs(distance) < halfWidth ?\n                    plotY - halfWidth * (distance <= 0 ? -1 : 1) :\n                    translated\n            ]);\n        };\n        if (zones.length &&\n            (graph || area) &&\n            axis &&\n            isNumber(axis.min)) {\n            const axisMax = axis.getExtremes().max, \n            // Invert the x and y coordinates of inverted charts\n            invertPath = (path) => {\n                path.forEach((segment, i) => {\n                    if (segment[0] === 'M' || segment[0] === 'L') {\n                        path[i] = [\n                            segment[0],\n                            isXAxis ? len - segment[1] : segment[1],\n                            isXAxis ? segment[2] : len - segment[2]\n                        ];\n                    }\n                });\n            };\n            // Reset\n            zones.forEach((zone) => {\n                zone.lineClip = [];\n                zone.translated = clamp(axis.toPixels(pick(zone.value, axisMax), true) || 0, 0, len);\n            });\n            // The use of the Color Threshold assumes there are no gaps so it is\n            // safe to hide the original graph and area unless it is not\n            // waterfall series, then use showLine property to set lines between\n            // columns to be visible (#7862)\n            if (graph && !this.showLine) {\n                graph.hide();\n            }\n            if (area) {\n                area.hide();\n            }\n            // Prepare for adaptive clips, avoiding segments close to the\n            // threshold (#19709)\n            if (zoneAxis === 'y' &&\n                // Overheat protection\n                points.length < xAxis.len) {\n                for (const point of points) {\n                    const { plotX, plotY, zone } = point, zoneBelow = zone && zones[zones.indexOf(zone) - 1];\n                    // Close to upper boundary\n                    if (zone) {\n                        avoidClose(zone, plotX, plotY);\n                    }\n                    // Close to lower boundary\n                    if (zoneBelow) {\n                        avoidClose(zoneBelow, plotX, plotY);\n                    }\n                }\n            }\n            // Compute and apply the clips\n            let lastLineClip = [], lastTranslated = axis.toPixels(axis.getExtremes().min, true);\n            zones.forEach((zone) => {\n                const lineClip = zone.lineClip || [], translated = Math.round(zone.translated || 0);\n                if (xAxis.reversed) {\n                    lineClip.reverse();\n                }\n                let { clip, simpleClip } = zone, x1 = 0, y1 = 0, x2 = xAxis.len, y2 = yAxis.len;\n                if (isXAxis) {\n                    x1 = translated;\n                    x2 = lastTranslated;\n                }\n                else {\n                    y1 = translated;\n                    y2 = lastTranslated;\n                }\n                // Adaptive clips\n                const simplePath = [\n                    ['M', x1, y1],\n                    ['L', x2, y1],\n                    ['L', x2, y2],\n                    ['L', x1, y2],\n                    ['Z']\n                ], adaptivePath = [\n                    simplePath[0],\n                    ...lineClip,\n                    simplePath[1],\n                    simplePath[2],\n                    ...lastLineClip,\n                    simplePath[3],\n                    simplePath[4]\n                ];\n                lastLineClip = lineClip.reverse();\n                lastTranslated = translated;\n                if (inverted) {\n                    invertPath(adaptivePath);\n                    if (area) {\n                        invertPath(simplePath);\n                    }\n                }\n                /* Debug clip paths\n                chart.renderer.path(adaptivePath)\n                    .attr({\n                        stroke: zone.color || this.color || 'gray',\n                        'stroke-width': 1,\n                        'dashstyle': 'Dash'\n                    })\n                    .add(series.group);\n                // */\n                if (clip) {\n                    clip.animate({ d: adaptivePath });\n                    simpleClip?.animate({ d: simplePath });\n                }\n                else {\n                    clip = zone.clip = renderer.path(adaptivePath);\n                    if (area) {\n                        simpleClip = zone.simpleClip = renderer.path(simplePath);\n                    }\n                }\n                // When no data, graph zone is not applied and after setData\n                // clip was ignored. As a result, it should be applied each\n                // time.\n                if (graph) {\n                    zone.graph?.clip(clip);\n                }\n                if (area) {\n                    zone.area?.clip(simpleClip);\n                }\n            });\n        }\n        else if (series.visible) {\n            // If zones were removed, restore graph and area\n            if (graph) {\n                graph.show();\n            }\n            if (area) {\n                area.show();\n            }\n        }\n    }\n    /**\n     * General abstraction for creating plot groups like series.group,\n     * series.dataLabelsGroup and series.markerGroup. On subsequent calls,\n     * the group will only be adjusted to the updated plot size.\n     *\n     * @private\n     * @function Highcharts.Series#plotGroup\n     */\n    plotGroup(prop, name, visibility, zIndex, parent) {\n        let group = this[prop];\n        const isNew = !group, attrs = {\n            visibility,\n            zIndex: zIndex || 0.1 // Pointer logic uses this\n        };\n        // Avoid setting undefined opacity, or in styled mode\n        if (defined(this.opacity) &&\n            !this.chart.styledMode && this.state !== 'inactive' // #13719\n        ) {\n            attrs.opacity = this.opacity;\n        }\n        // Generate it on first call\n        if (!group) {\n            this[prop] = group = this.chart.renderer\n                .g()\n                .add(parent);\n        }\n        // Add the class names, and replace existing ones as response to\n        // Series.update (#6660)\n        group.addClass(('highcharts-' + name +\n            ' highcharts-series-' + this.index +\n            ' highcharts-' + this.type + '-series ' +\n            (defined(this.colorIndex) ?\n                'highcharts-color-' + this.colorIndex + ' ' :\n                '') +\n            (this.options.className || '') +\n            (group.hasClass('highcharts-tracker') ?\n                ' highcharts-tracker' :\n                '')), true);\n        // Place it on first and subsequent (redraw) calls\n        group.attr(attrs)[isNew ? 'attr' : 'animate'](this.getPlotBox(name));\n        return group;\n    }\n    /**\n     * Get the translation and scale for the plot area of this series.\n     *\n     * @function Highcharts.Series#getPlotBox\n     */\n    getPlotBox(name) {\n        let horAxis = this.xAxis, vertAxis = this.yAxis;\n        const chart = this.chart, inverted = (chart.inverted &&\n            !chart.polar &&\n            horAxis &&\n            this.invertible &&\n            name === 'series');\n        // Swap axes for inverted (#2339)\n        if (chart.inverted) {\n            horAxis = vertAxis;\n            vertAxis = this.xAxis;\n        }\n        return {\n            translateX: horAxis ? horAxis.left : chart.plotLeft,\n            translateY: vertAxis ? vertAxis.top : chart.plotTop,\n            rotation: inverted ? 90 : 0,\n            rotationOriginX: inverted ?\n                (horAxis.len - vertAxis.len) / 2 :\n                0,\n            rotationOriginY: inverted ?\n                (horAxis.len + vertAxis.len) / 2 :\n                0,\n            scaleX: inverted ? -1 : 1, // #1623\n            scaleY: 1\n        };\n    }\n    /**\n     * Removes the event handlers attached previously with addEvents.\n     * @private\n     * @function Highcharts.Series#removeEvents\n     */\n    removeEvents(keepEventsForUpdate) {\n        const { eventsToUnbind } = this;\n        if (!keepEventsForUpdate) {\n            // Remove all events\n            removeEvent(this);\n        }\n        if (eventsToUnbind.length) {\n            // Remove only internal events for proper update. #12355 solves\n            // problem with multiple destroy events\n            eventsToUnbind.forEach((unbind) => {\n                unbind();\n            });\n            eventsToUnbind.length = 0;\n        }\n    }\n    /**\n     * Render the graph and markers. Called internally when first rendering\n     * and later when redrawing the chart. This function can be extended in\n     * plugins, but normally shouldn't be called directly.\n     *\n     * @function Highcharts.Series#render\n     *\n     * @emits Highcharts.Series#event:afterRender\n     */\n    render() {\n        const series = this, { chart, options, hasRendered } = series, animOptions = animObject(options.animation), visibility = series.visible ?\n            'inherit' : 'hidden', // #2597\n        zIndex = options.zIndex, chartSeriesGroup = chart.seriesGroup;\n        let animDuration = series.finishedAnimating ?\n            0 : animOptions.duration;\n        fireEvent(this, 'render');\n        // The group\n        series.plotGroup('group', 'series', visibility, zIndex, chartSeriesGroup);\n        series.markerGroup = series.plotGroup('markerGroup', 'markers', visibility, zIndex, chartSeriesGroup);\n        // Initial clipping, applies to columns etc. (#3839).\n        if (options.clip !== false) {\n            series.setClip();\n        }\n        // Initialize the animation\n        if (animDuration) {\n            series.animate?.(true);\n        }\n        // Draw the graph if any\n        if (series.drawGraph) {\n            series.drawGraph();\n            series.applyZones();\n        }\n        // Draw the points\n        if (series.visible) {\n            series.drawPoints();\n        }\n        // Draw the data labels\n        series.drawDataLabels?.();\n        // In pie charts, slices are added to the DOM, but actual rendering\n        // is postponed until labels reserved their space\n        series.redrawPoints?.();\n        // Draw the mouse tracking area\n        if (options.enableMouseTracking) {\n            series.drawTracker?.();\n        }\n        // Run the animation\n        if (animDuration) {\n            series.animate?.();\n        }\n        // Call the afterAnimate function on animation complete (but don't\n        // overwrite the animation.complete option which should be available\n        // to the user).\n        if (!hasRendered) {\n            // Additional time if defer is defined before afterAnimate\n            // will be triggered\n            if (animDuration && animOptions.defer) {\n                animDuration += animOptions.defer;\n            }\n            series.animationTimeout = syncTimeout(() => {\n                series.afterAnimate();\n            }, animDuration || 0);\n        }\n        // Means data is in accordance with what you see\n        series.isDirty = false;\n        // (See #322) series.isDirty = series.isDirtyData = false; // means\n        // data is in accordance with what you see\n        series.hasRendered = true;\n        fireEvent(series, 'afterRender');\n    }\n    /**\n     * Redraw the series. This function is called internally from\n     * `chart.redraw` and normally shouldn't be called directly.\n     * @private\n     * @function Highcharts.Series#redraw\n     */\n    redraw() {\n        // Cache it here as it is set to false in render, but used after\n        const wasDirty = this.isDirty || this.isDirtyData;\n        this.translate();\n        this.render();\n        if (wasDirty) { // #3868, #3945\n            delete this.kdTree;\n        }\n    }\n    /**\n     * Whether to reserve space for the series, either because it is visible or\n     * because the `chart.ignoreHiddenSeries` option is false.\n     *\n     * @private\n     */\n    reserveSpace() {\n        return this.visible || !this.chart.options.chart.ignoreHiddenSeries;\n    }\n    /**\n     * Find the nearest point from a pointer event. This applies to series that\n     * use k-d-trees to get the nearest point. Native pointer events must be\n     * normalized using `Pointer.normalize`, that adds `chartX` and `chartY`\n     * properties.\n     *\n     * @sample highcharts/demo/synchronized-charts\n     *         Synchronized charts with tooltips\n     *\n     * @function Highcharts.Series#searchPoint\n     *\n     * @param {Highcharts.PointerEvent} e\n     *        The normalized pointer event\n     * @param {boolean} [compareX=false]\n     *        Search only by the X value, not Y\n     *\n     * @return {Point|undefined}\n     *        The closest point to the pointer event\n     */\n    searchPoint(e, compareX) {\n        const { xAxis, yAxis } = this, inverted = this.chart.inverted;\n        return this.searchKDTree({\n            clientX: inverted ?\n                xAxis.len - e.chartY + xAxis.pos :\n                e.chartX - xAxis.pos,\n            plotY: inverted ?\n                yAxis.len - e.chartX + yAxis.pos :\n                e.chartY - yAxis.pos\n        }, compareX, e);\n    }\n    /**\n     * Build the k-d-tree that is used by mouse and touch interaction to get\n     * the closest point. Line-like series typically have a one-dimensional\n     * tree where points are searched along the X axis, while scatter-like\n     * series typically search in two dimensions, X and Y.\n     *\n     * @private\n     * @function Highcharts.Series#buildKDTree\n     */\n    buildKDTree(e) {\n        // Prevent multiple k-d-trees from being built simultaneously\n        // (#6235)\n        this.buildingKdTree = true;\n        const series = this, dimensions = series.options.findNearestPointBy\n            .indexOf('y') > -1 ? 2 : 1;\n        /**\n         * Internal function\n         * @private\n         */\n        function kdtree(points, depth, dimensions) {\n            const length = points?.length;\n            let axis, median;\n            if (length) {\n                // Alternate between the axis\n                axis = series.kdAxisArray[depth % dimensions];\n                // Sort point array\n                points.sort((a, b) => (a[axis] || 0) - (b[axis] || 0));\n                median = Math.floor(length / 2);\n                // Build and return node\n                return {\n                    point: points[median],\n                    left: kdtree(points.slice(0, median), depth + 1, dimensions),\n                    right: kdtree(points.slice(median + 1), depth + 1, dimensions)\n                };\n            }\n        }\n        /**\n         * Start the recursive build process with a clone of the points\n         * array and null points filtered out. (#3873)\n         * @private\n         */\n        function startRecursive() {\n            series.kdTree = kdtree(series.getValidPoints(void 0, \n            // For line-type series restrict to plot area, but\n            // column-type series not (#3916, #4511)\n            !series.directTouch), dimensions, dimensions);\n            series.buildingKdTree = false;\n        }\n        delete series.kdTree;\n        // For testing tooltips, don't build async. Also if touchstart, we may\n        // be dealing with click events on mobile, so don't delay (#6817).\n        syncTimeout(startRecursive, series.options.kdNow || e?.type === 'touchstart' ? 0 : 1);\n    }\n    /**\n     * @private\n     * @function Highcharts.Series#searchKDTree\n     */\n    searchKDTree(point, compareX, e) {\n        const series = this, [kdX, kdY] = this.kdAxisArray, kdComparer = compareX ? 'distX' : 'dist', kdDimensions = (series.options.findNearestPointBy || '')\n            .indexOf('y') > -1 ? 2 : 1, useRadius = !!series.isBubble;\n        /**\n         * Set the one and two dimensional distance on the point object.\n         * @private\n         */\n        function setDistance(p1, p2) {\n            const p1kdX = p1[kdX], p2kdX = p2[kdX], x = (defined(p1kdX) && defined(p2kdX)) ? p1kdX - p2kdX : null, p1kdY = p1[kdY], p2kdY = p2[kdY], y = (defined(p1kdY) && defined(p2kdY)) ? p1kdY - p2kdY : 0, radius = useRadius ? (p2.marker?.radius || 0) : 0;\n            p2.dist = Math.sqrt(((x && x * x) || 0) + y * y) - radius;\n            p2.distX = defined(x) ? (Math.abs(x) - radius) : Number.MAX_VALUE;\n        }\n        /**\n         * @private\n         */\n        function doSearch(search, tree, depth, dimensions) {\n            const point = tree.point, axis = series.kdAxisArray[depth % dimensions];\n            let nPoint1, nPoint2, ret = point;\n            setDistance(search, point);\n            // Pick side based on distance to splitting point\n            const tdist = (search[axis] || 0) - (point[axis] || 0) +\n                (useRadius ? (point.marker?.radius || 0) : 0), sideA = tdist < 0 ? 'left' : 'right', sideB = tdist < 0 ? 'right' : 'left';\n            // End of tree\n            if (tree[sideA]) {\n                nPoint1 = doSearch(search, tree[sideA], depth + 1, dimensions);\n                ret = (nPoint1[kdComparer] <\n                    ret[kdComparer] ?\n                    nPoint1 :\n                    point);\n            }\n            if (tree[sideB]) {\n                // Compare distance to current best to splitting point to decide\n                // whether to check side B or not\n                if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n                    nPoint2 = doSearch(search, tree[sideB], depth + 1, dimensions);\n                    ret = (nPoint2[kdComparer] <\n                        ret[kdComparer] ?\n                        nPoint2 :\n                        ret);\n                }\n            }\n            return ret;\n        }\n        if (!this.kdTree && !this.buildingKdTree) {\n            this.buildKDTree(e);\n        }\n        if (this.kdTree) {\n            return doSearch(point, this.kdTree, kdDimensions, kdDimensions);\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Series#pointPlacementToXValue\n     */\n    pointPlacementToXValue() {\n        const { options, xAxis } = this;\n        let factor = options.pointPlacement;\n        // Point placement is relative to each series pointRange (#5889)\n        if (factor === 'between') {\n            factor = xAxis.reversed ? -0.5 : 0.5; // #11955\n        }\n        return isNumber(factor) ?\n            factor * (options.pointRange || xAxis.pointRange) :\n            0;\n    }\n    /**\n     * @private\n     * @function Highcharts.Series#isPointInside\n     */\n    isPointInside(point) {\n        const { chart, xAxis, yAxis } = this, { plotX = -1, plotY = -1 } = point, isInside = (plotY >= 0 &&\n            plotY <= (yAxis ? yAxis.len : chart.plotHeight) &&\n            plotX >= 0 &&\n            plotX <= (xAxis ? xAxis.len : chart.plotWidth));\n        return isInside;\n    }\n    /**\n     * Draw the tracker object that sits above all data labels and markers to\n     * track mouse events on the graph or points. For the line type charts\n     * the tracker uses the same graphPath, but with a greater stroke width\n     * for better control.\n     * @private\n     */\n    drawTracker() {\n        const series = this, options = series.options, trackByArea = options.trackByArea, trackerPath = [].concat((trackByArea ? series.areaPath : series.graphPath) || []), chart = series.chart, pointer = chart.pointer, renderer = chart.renderer, snap = chart.options.tooltip?.snap || 0, onMouseOver = () => {\n            if (options.enableMouseTracking &&\n                chart.hoverSeries !== series) {\n                series.onMouseOver();\n            }\n        }, \n        /*\n         * Empirical lowest possible opacities for TRACKER_FILL for an\n         * element to stay invisible but clickable\n         * IE9: 0.00000000001 (unlimited)\n         * IE10: 0.0001 (exporting only)\n         * FF: 0.00000000001 (unlimited)\n         * Chrome: 0.000001\n         * Safari: 0.000001\n         * Opera: 0.00000000001 (unlimited)\n         */\n        TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n        let tracker = series.tracker;\n        // Draw the tracker\n        if (tracker) {\n            tracker.attr({ d: trackerPath });\n        }\n        else if (series.graph) { // Create\n            series.tracker = tracker = renderer.path(trackerPath)\n                .attr({\n                visibility: series.visible ? 'inherit' : 'hidden',\n                zIndex: 2\n            })\n                .addClass(trackByArea ?\n                'highcharts-tracker-area' :\n                'highcharts-tracker-line')\n                .add(series.group);\n            if (!chart.styledMode) {\n                tracker.attr({\n                    'stroke-linecap': 'round',\n                    'stroke-linejoin': 'round', // #1225\n                    stroke: TRACKER_FILL,\n                    fill: trackByArea ? TRACKER_FILL : 'none',\n                    'stroke-width': series.graph.strokeWidth() +\n                        (trackByArea ? 0 : 2 * snap)\n                });\n            }\n            // The tracker is added to the series group, which is clipped, but\n            // is covered by the marker group. So the marker group also needs to\n            // capture events.\n            [\n                series.tracker,\n                series.markerGroup,\n                series.dataLabelsGroup\n            ].forEach((tracker) => {\n                if (tracker) {\n                    tracker.addClass('highcharts-tracker')\n                        .on('mouseover', onMouseOver)\n                        .on('mouseout', (e) => {\n                        pointer?.onTrackerMouseOut(e);\n                    });\n                    if (options.cursor && !chart.styledMode) {\n                        tracker.css({ cursor: options.cursor });\n                    }\n                    tracker.on('touchstart', onMouseOver);\n                }\n            });\n        }\n        fireEvent(this, 'afterDrawTracker');\n    }\n    /**\n     * Add a point to the series after render time. The point can be added at\n     * the end, or by giving it an X value, to the start or in the middle of the\n     * series.\n     *\n     * @sample highcharts/members/series-addpoint-append/\n     *         Append point\n     * @sample highcharts/members/series-addpoint-append-and-shift/\n     *         Append and shift\n     * @sample highcharts/members/series-addpoint-x-and-y/\n     *         Both X and Y values given\n     * @sample highcharts/members/series-addpoint-pie/\n     *         Append pie slice\n     * @sample stock/members/series-addpoint/\n     *         Append 100 points in Highcharts Stock\n     * @sample stock/members/series-addpoint-shift/\n     *         Append and shift in Highcharts Stock\n     * @sample maps/members/series-addpoint/\n     *         Add a point in Highmaps\n     *\n     * @function Highcharts.Series#addPoint\n     *\n     * @param {Highcharts.PointOptionsType} options\n     *        The point options. If options is a single number, a point with\n     *        that y value is appended to the series. If it is an array, it will\n     *        be interpreted as x and y values respectively. If it is an\n     *        object, advanced options as outlined under `series.data` are\n     *        applied.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after the point is added. When adding\n     *        more than one point, it is highly recommended that the redraw\n     *        option be set to false, and instead {@link Chart#redraw} is\n     *        explicitly called after the adding of points is finished.\n     *        Otherwise, the chart will redraw after adding each point.\n     *\n     * @param {boolean} [shift=false]\n     *        If true, a point is shifted off the start of the series as one is\n     *        appended to the end.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether to apply animation, and optionally animation\n     *        configuration.\n     *\n     * @param {boolean} [withEvent=true]\n     *        Used internally, whether to fire the series `addPoint` event.\n     *\n     * @emits Highcharts.Series#event:addPoint\n     */\n    addPoint(options, redraw, shift, animation, withEvent) {\n        const series = this, seriesOptions = series.options, data = series.data, chart = series.chart, xAxis = series.xAxis, names = xAxis && xAxis.hasNames && xAxis.names, dataOptions = seriesOptions.data, xData = series.xData;\n        let isInTheMiddle, i;\n        // Optional redraw, defaults to true\n        redraw = pick(redraw, true);\n        // Get options and push the point to xData, yData and series.options. In\n        // series.generatePoints the Point instance will be created on demand\n        // and pushed to the series.data array.\n        const point = { series: series };\n        series.pointClass.prototype.applyOptions.apply(point, [options]);\n        const x = point.x;\n        // Get the insertion point\n        i = xData.length;\n        if (series.requireSorting && x < xData[i - 1]) {\n            isInTheMiddle = true;\n            while (i && xData[i - 1] > x) {\n                i--;\n            }\n        }\n        // Insert undefined item\n        series.updateParallelArrays(point, 'splice', [i, 0, 0]);\n        // Update it\n        series.updateParallelArrays(point, i);\n        if (names && point.name) {\n            names[x] = point.name;\n        }\n        dataOptions.splice(i, 0, options);\n        if (isInTheMiddle ||\n            // When processedData is present we need to splice an empty slot\n            // into series.data, otherwise generatePoints won't pick it up.\n            series.processedData) {\n            series.data.splice(i, 0, null);\n            series.processData();\n        }\n        // Generate points to be added to the legend (#1329)\n        if (seriesOptions.legendType === 'point') {\n            series.generatePoints();\n        }\n        // Shift the first point off the parallel arrays\n        if (shift) {\n            if (data[0] && !!data[0].remove) {\n                data[0].remove(false);\n            }\n            else {\n                data.shift();\n                series.updateParallelArrays(point, 'shift');\n                dataOptions.shift();\n            }\n        }\n        // Fire event\n        if (withEvent !== false) {\n            fireEvent(series, 'addPoint', { point: point });\n        }\n        // Redraw\n        series.isDirty = true;\n        series.isDirtyData = true;\n        if (redraw) {\n            chart.redraw(animation); // Animation is set anyway on redraw, #5665\n        }\n    }\n    /**\n     * Remove a point from the series. Unlike the\n     * {@link Highcharts.Point#remove} method, this can also be done on a point\n     * that is not instantiated because it is outside the view or subject to\n     * Highcharts Stock data grouping.\n     *\n     * @sample highcharts/members/series-removepoint/\n     *         Remove cropped point\n     *\n     * @function Highcharts.Series#removePoint\n     *\n     * @param {number} i\n     *        The index of the point in the {@link Highcharts.Series.data|data}\n     *        array.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after the point is added. When\n     *        removing more than one point, it is highly recommended that the\n     *        `redraw` option be set to `false`, and instead {@link\n     *        Highcharts.Chart#redraw} is explicitly called after the adding of\n     *        points is finished.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether and optionally how the series should be animated.\n     *\n     * @emits Highcharts.Point#event:remove\n     */\n    removePoint(i, redraw, animation) {\n        const series = this, data = series.data, point = data[i], points = series.points, chart = series.chart, remove = function () {\n            if (points && points.length === data.length) { // #4935\n                points.splice(i, 1);\n            }\n            data.splice(i, 1);\n            series.options.data.splice(i, 1);\n            series.updateParallelArrays(point || { series: series }, 'splice', [i, 1]);\n            if (point) {\n                point.destroy();\n            }\n            // Redraw\n            series.isDirty = true;\n            series.isDirtyData = true;\n            if (redraw) {\n                chart.redraw();\n            }\n        };\n        setAnimation(animation, chart);\n        redraw = pick(redraw, true);\n        // Fire the event with a default handler of removing the point\n        if (point) {\n            point.firePointEvent('remove', null, remove);\n        }\n        else {\n            remove();\n        }\n    }\n    /**\n     * Remove a series and optionally redraw the chart.\n     *\n     * @sample highcharts/members/series-remove/\n     *         Remove first series from a button\n     *\n     * @function Highcharts.Series#remove\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart or wait for an explicit call to\n     *        {@link Highcharts.Chart#redraw}.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether to apply animation, and optionally animation\n     *        configuration.\n     *\n     * @param {boolean} [withEvent=true]\n     *        Used internally, whether to fire the series `remove` event.\n     *\n     * @emits Highcharts.Series#event:remove\n     */\n    remove(redraw, animation, withEvent, keepEvents) {\n        const series = this, chart = series.chart;\n        /**\n         * @private\n         */\n        function remove() {\n            // Destroy elements\n            series.destroy(keepEvents);\n            // Redraw\n            chart.isDirtyLegend = chart.isDirtyBox = true;\n            chart.linkSeries(keepEvents);\n            if (pick(redraw, true)) {\n                chart.redraw(animation);\n            }\n        }\n        // Fire the event with a default handler of removing the point\n        if (withEvent !== false) {\n            fireEvent(series, 'remove', null, remove);\n        }\n        else {\n            remove();\n        }\n    }\n    /**\n     * Update the series with a new set of options. For a clean and precise\n     * handling of new options, all methods and elements from the series are\n     * removed, and it is initialized from scratch. Therefore, this method is\n     * more performance expensive than some other utility methods like {@link\n     * Series#setData} or {@link Series#setVisible}.\n     *\n     * Note that `Series.update` may mutate the passed `data` options.\n     *\n     * @sample highcharts/members/series-update/\n     *         Updating series options\n     * @sample maps/members/series-update/\n     *         Update series options in Highmaps\n     *\n     * @function Highcharts.Series#update\n     *\n     * @param {Highcharts.SeriesOptionsType} options\n     *        New options that will be merged with the series' existing options.\n     *\n     * @param {boolean} [redraw=true]\n     *        Whether to redraw the chart after the series is altered. If doing\n     *        more operations on the chart, it is a good idea to set redraw to\n     *        false and call {@link Chart#redraw} after.\n     *\n     * @emits Highcharts.Series#event:update\n     * @emits Highcharts.Series#event:afterUpdate\n     */\n    update(options, redraw) {\n        options = diffObjects(options, this.userOptions);\n        fireEvent(this, 'update', { options: options });\n        const series = this, chart = series.chart, \n        // Must use user options when changing type because series.options\n        // is merged in with type specific plotOptions\n        oldOptions = series.userOptions, initialType = series.initialType || series.type, plotOptions = chart.options.plotOptions, initialSeriesProto = seriesTypes[initialType].prototype, groups = [\n            'group',\n            'markerGroup',\n            'dataLabelsGroup',\n            'transformGroup'\n        ], optionsToCheck = [\n            'dataGrouping',\n            'pointStart',\n            'pointInterval',\n            'pointIntervalUnit',\n            'keys'\n        ], \n        // Animation must be enabled when calling update before the initial\n        // animation has first run. This happens when calling update\n        // directly after chart initialization, or when applying responsive\n        // rules (#6912).\n        animation = series.finishedAnimating && { animation: false }, kinds = {};\n        let seriesOptions, n, preserve = [\n            'colorIndex',\n            'eventOptions',\n            'navigatorSeries',\n            'symbolIndex',\n            'baseSeries'\n        ], newType = (options.type ||\n            oldOptions.type ||\n            chart.options.chart.type);\n        const keepPoints = !(\n        // Indicators, histograms etc recalculate the data. It should be\n        // possible to omit this.\n        this.hasDerivedData ||\n            // New type requires new point classes\n            (newType && newType !== this.type) ||\n            // New options affecting how the data points are built\n            typeof options.pointStart !== 'undefined' ||\n            typeof options.pointInterval !== 'undefined' ||\n            typeof options.relativeXValue !== 'undefined' ||\n            options.joinBy ||\n            options.mapData || // #11636\n            // Changes to data grouping requires new points in new group\n            optionsToCheck.some((option) => series.hasOptionChanged(option)));\n        newType = newType || initialType;\n        if (keepPoints) {\n            preserve.push('data', 'isDirtyData', \n            // GeoHeatMap interpolation\n            'isDirtyCanvas', 'points', 'processedData', // #17057\n            'processedXData', 'processedYData', 'xIncrement', 'cropped', '_hasPointMarkers', 'hasDataLabels', \n            // Networkgraph (#14397)\n            'nodes', 'layout', \n            // Treemap\n            'level', \n            // Map specific, consider moving it to series-specific preserve-\n            // properties (#10617)\n            'mapMap', 'mapData', 'minY', 'maxY', 'minX', 'maxX', 'transformGroups' // #18857\n            );\n            if (options.visible !== false) {\n                preserve.push('area', 'graph');\n            }\n            series.parallelArrays.forEach(function (key) {\n                preserve.push(key + 'Data');\n            });\n            if (options.data) {\n                // `setData` uses `dataSorting` options so we need to update\n                // them earlier\n                if (options.dataSorting) {\n                    extend(series.options.dataSorting, options.dataSorting);\n                }\n                this.setData(options.data, false);\n            }\n        }\n        // Do the merge, with some forced options\n        options = merge(oldOptions, {\n            // When oldOptions.index is null it should't be cleared.\n            // Otherwise navigator series will have wrong indexes (#10193).\n            index: oldOptions.index === void 0 ?\n                series.index : oldOptions.index,\n            pointStart: \n            // When updating from blank (#7933)\n            plotOptions?.series?.pointStart ??\n                oldOptions.pointStart ??\n                // When updating after addPoint\n                series.xData?.[0]\n        }, !keepPoints && { data: series.options.data }, options, animation);\n        // Merge does not merge arrays, but replaces them. Since points were\n        // updated, `series.options.data` has correct merged options, use it:\n        if (keepPoints && options.data) {\n            options.data = series.options.data;\n        }\n        // Make sure preserved properties are not destroyed (#3094)\n        preserve = groups.concat(preserve);\n        preserve.forEach(function (prop) {\n            preserve[prop] = series[prop];\n            delete series[prop];\n        });\n        let casting = false;\n        if (seriesTypes[newType]) {\n            casting = newType !== series.type;\n            // Destroy the series and delete all properties, it will be\n            // reinserted within the `init` call below\n            series.remove(false, false, false, true);\n            if (casting) {\n                // #20264: Re-detect a certain chart properties from new series\n                chart.propFromSeries();\n                // Modern browsers including IE11\n                if (Object.setPrototypeOf) {\n                    Object.setPrototypeOf(series, seriesTypes[newType].prototype);\n                    // Legacy (IE < 11)\n                }\n                else {\n                    const ownEvents = Object.hasOwnProperty.call(series, 'hcEvents') && series.hcEvents;\n                    for (n in initialSeriesProto) { // eslint-disable-line guard-for-in\n                        series[n] = void 0;\n                    }\n                    // Reinsert all methods and properties from the new type\n                    // prototype (#2270, #3719).\n                    extend(series, seriesTypes[newType].prototype);\n                    // The events are tied to the prototype chain, don't copy if\n                    // they're not the series' own\n                    if (ownEvents) {\n                        series.hcEvents = ownEvents;\n                    }\n                    else {\n                        delete series.hcEvents;\n                    }\n                }\n            }\n        }\n        else {\n            error(17, true, chart, { missingModuleFor: newType });\n        }\n        // Re-register groups (#3094) and other preserved properties\n        preserve.forEach(function (prop) {\n            series[prop] = preserve[prop];\n        });\n        series.init(chart, options);\n        // Remove particular elements of the points. Check `series.options`\n        // because we need to consider the options being set on plotOptions as\n        // well.\n        if (keepPoints && this.points) {\n            seriesOptions = series.options;\n            // What kind of elements to destroy\n            if (seriesOptions.visible === false) {\n                kinds.graphic = 1;\n                kinds.dataLabel = 1;\n            }\n            else {\n                // If the marker got disabled or changed its symbol, width or\n                // height - destroy\n                if (this.hasMarkerChanged(seriesOptions, oldOptions)) {\n                    kinds.graphic = 1;\n                }\n                if (!series.hasDataLabels?.()) {\n                    kinds.dataLabel = 1;\n                }\n            }\n            for (const point of this.points) {\n                if (point && point.series) {\n                    point.resolveColor();\n                    // Destroy elements in order to recreate based on updated\n                    // series options.\n                    if (Object.keys(kinds).length) {\n                        point.destroyElements(kinds);\n                    }\n                    if (seriesOptions.showInLegend === false &&\n                        point.legendItem) {\n                        chart.legend.destroyItem(point);\n                    }\n                }\n            }\n        }\n        series.initialType = initialType;\n        chart.linkSeries(); // Links are lost in series.remove (#3028)\n        // Set data for series with sorting enabled if it isn't set yet (#19715)\n        chart.setSortedData();\n        // #15383: Fire updatedData if the type has changed to keep linked\n        // series such as indicators updated\n        if (casting && series.linkedSeries.length) {\n            series.isDirtyData = true;\n        }\n        fireEvent(this, 'afterUpdate');\n        if (pick(redraw, true)) {\n            chart.redraw(keepPoints ? void 0 : false);\n        }\n    }\n    /**\n     * Used from within series.update\n     * @private\n     */\n    setName(name) {\n        this.name = this.options.name = this.userOptions.name = name;\n        this.chart.isDirtyLegend = true;\n    }\n    /**\n     * Check if the option has changed.\n     * @private\n     */\n    hasOptionChanged(optionName) {\n        const chart = this.chart, option = this.options[optionName], plotOptions = chart.options.plotOptions, oldOption = this.userOptions[optionName], plotOptionsOption = pick(plotOptions?.[this.type]?.[optionName], plotOptions?.series?.[optionName]);\n        // Check if `plotOptions` are defined already, #19203\n        if (oldOption && !defined(plotOptionsOption)) {\n            return option !== oldOption;\n        }\n        return option !== pick(plotOptionsOption, option);\n    }\n    /**\n     * Runs on mouse over the series graphical items.\n     *\n     * @function Highcharts.Series#onMouseOver\n     * @emits Highcharts.Series#event:mouseOver\n     */\n    onMouseOver() {\n        const series = this, chart = series.chart, hoverSeries = chart.hoverSeries, pointer = chart.pointer;\n        pointer?.setHoverChartIndex();\n        // Set normal state to previous series\n        if (hoverSeries && hoverSeries !== series) {\n            hoverSeries.onMouseOut();\n        }\n        // Trigger the event, but to save processing time,\n        // only if defined\n        if (series.options.events.mouseOver) {\n            fireEvent(series, 'mouseOver');\n        }\n        // Hover this\n        series.setState('hover');\n        /**\n         * Contains the original hovered series.\n         *\n         * @name Highcharts.Chart#hoverSeries\n         * @type {Highcharts.Series|null}\n         */\n        chart.hoverSeries = series;\n    }\n    /**\n     * Runs on mouse out of the series graphical items.\n     *\n     * @function Highcharts.Series#onMouseOut\n     *\n     * @emits Highcharts.Series#event:mouseOut\n     */\n    onMouseOut() {\n        // Trigger the event only if listeners exist\n        const series = this, options = series.options, chart = series.chart, tooltip = chart.tooltip, hoverPoint = chart.hoverPoint;\n        // #182, set to null before the mouseOut event fires\n        chart.hoverSeries = null;\n        // Trigger mouse out on the point, which must be in this series\n        if (hoverPoint) {\n            hoverPoint.onMouseOut();\n        }\n        // Fire the mouse out event\n        if (series && options.events.mouseOut) {\n            fireEvent(series, 'mouseOut');\n        }\n        // Hide the tooltip\n        if (tooltip &&\n            !series.stickyTracking &&\n            (!tooltip.shared || series.noSharedTooltip)) {\n            tooltip.hide();\n        }\n        // Reset all inactive states\n        chart.series.forEach(function (s) {\n            s.setState('', true);\n        });\n    }\n    /**\n     * Set the state of the series. Called internally on mouse interaction\n     * operations, but it can also be called directly to visually\n     * highlight a series.\n     *\n     * @function Highcharts.Series#setState\n     *\n     * @param {Highcharts.SeriesStateValue|\"\"} [state]\n     *        The new state, can be either `'hover'`, `'inactive'`, `'select'`,\n     *        or `''` (an empty string), `'normal'` or `undefined` to set to\n     *        normal state.\n     * @param {boolean} [inherit]\n     *        Determines if state should be inherited by points too.\n     */\n    setState(state, inherit) {\n        const series = this, options = series.options, graph = series.graph, inactiveOtherPoints = options.inactiveOtherPoints, stateOptions = options.states, \n        // By default a quick animation to hover/inactive,\n        // slower to un-hover\n        stateAnimation = pick((stateOptions[state || 'normal'] &&\n            stateOptions[state || 'normal'].animation), series.chart.options.chart.animation);\n        let lineWidth = options.lineWidth, opacity = options.opacity;\n        state = state || '';\n        if (series.state !== state) {\n            // Toggle class names\n            [\n                series.group,\n                series.markerGroup,\n                series.dataLabelsGroup\n            ].forEach(function (group) {\n                if (group) {\n                    // Old state\n                    if (series.state) {\n                        group.removeClass('highcharts-series-' + series.state);\n                    }\n                    // New state\n                    if (state) {\n                        group.addClass('highcharts-series-' + state);\n                    }\n                }\n            });\n            series.state = state;\n            if (!series.chart.styledMode) {\n                if (stateOptions[state] &&\n                    stateOptions[state].enabled === false) {\n                    return;\n                }\n                if (state) {\n                    lineWidth = (stateOptions[state].lineWidth ||\n                        lineWidth + (stateOptions[state].lineWidthPlus || 0)); // #4035\n                    opacity = pick(stateOptions[state].opacity, opacity);\n                }\n                if (graph && !graph.dashstyle && isNumber(lineWidth)) {\n                    // Animate the graph stroke-width\n                    for (const graphElement of [\n                        graph,\n                        ...this.zones.map((zone) => zone.graph)\n                    ]) {\n                        graphElement?.animate({\n                            'stroke-width': lineWidth\n                        }, stateAnimation);\n                    }\n                }\n                // For some types (pie, networkgraph, sankey) opacity is\n                // resolved on a point level\n                if (!inactiveOtherPoints) {\n                    [\n                        series.group,\n                        series.markerGroup,\n                        series.dataLabelsGroup,\n                        series.labelBySeries\n                    ].forEach(function (group) {\n                        if (group) {\n                            group.animate({\n                                opacity: opacity\n                            }, stateAnimation);\n                        }\n                    });\n                }\n            }\n        }\n        // Don't loop over points on a series that doesn't apply inactive state\n        // to siblings markers (e.g. line, column)\n        if (inherit && inactiveOtherPoints && series.points) {\n            series.setAllPointsToState(state || void 0);\n        }\n    }\n    /**\n     * Set the state for all points in the series.\n     *\n     * @function Highcharts.Series#setAllPointsToState\n     *\n     * @private\n     *\n     * @param {string} [state]\n     *        Can be either `hover` or undefined to set to normal state.\n     */\n    setAllPointsToState(state) {\n        this.points.forEach(function (point) {\n            if (point.setState) {\n                point.setState(state);\n            }\n        });\n    }\n    /**\n     * Show or hide the series.\n     *\n     * @function Highcharts.Series#setVisible\n     *\n     * @param {boolean} [visible]\n     * True to show the series, false to hide. If undefined, the visibility is\n     * toggled.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart after the series is altered. If doing more\n     * operations on the chart, it is a good idea to set redraw to false and\n     * call {@link Chart#redraw|chart.redraw()} after.\n     *\n     * @emits Highcharts.Series#event:hide\n     * @emits Highcharts.Series#event:show\n     */\n    setVisible(vis, redraw) {\n        const series = this, chart = series.chart, ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, oldVisibility = series.visible;\n        // If called without an argument, toggle visibility\n        series.visible =\n            vis =\n                series.options.visible =\n                    series.userOptions.visible =\n                        typeof vis === 'undefined' ? !oldVisibility : vis; // #5618\n        const showOrHide = vis ? 'show' : 'hide';\n        // Show or hide elements\n        [\n            'group',\n            'dataLabelsGroup',\n            'markerGroup',\n            'tracker',\n            'tt'\n        ].forEach((key) => {\n            series[key]?.[showOrHide]();\n        });\n        // Hide tooltip (#1361)\n        if (chart.hoverSeries === series ||\n            chart.hoverPoint?.series === series) {\n            series.onMouseOut();\n        }\n        if (series.legendItem) {\n            chart.legend.colorizeItem(series, vis);\n        }\n        // Rescale or adapt to resized chart\n        series.isDirty = true;\n        // In a stack, all other series are affected\n        if (series.options.stacking) {\n            chart.series.forEach((otherSeries) => {\n                if (otherSeries.options.stacking && otherSeries.visible) {\n                    otherSeries.isDirty = true;\n                }\n            });\n        }\n        // Show or hide linked series\n        series.linkedSeries.forEach((otherSeries) => {\n            otherSeries.setVisible(vis, false);\n        });\n        if (ignoreHiddenSeries) {\n            chart.isDirtyBox = true;\n        }\n        fireEvent(series, showOrHide);\n        if (redraw !== false) {\n            chart.redraw();\n        }\n    }\n    /**\n     * Show the series if hidden.\n     *\n     * @sample highcharts/members/series-hide/\n     *         Toggle visibility from a button\n     *\n     * @function Highcharts.Series#show\n     * @emits Highcharts.Series#event:show\n     */\n    show() {\n        this.setVisible(true);\n    }\n    /**\n     * Hide the series if visible. If the\n     * [chart.ignoreHiddenSeries](https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries)\n     * option is true, the chart is redrawn without this series.\n     *\n     * @sample highcharts/members/series-hide/\n     *         Toggle visibility from a button\n     *\n     * @function Highcharts.Series#hide\n     * @emits Highcharts.Series#event:hide\n     */\n    hide() {\n        this.setVisible(false);\n    }\n    /**\n     * Select or unselect the series. This means its\n     * {@link Highcharts.Series.selected|selected}\n     * property is set, the checkbox in the legend is toggled and when selected,\n     * the series is returned by the {@link Highcharts.Chart#getSelectedSeries}\n     * function.\n     *\n     * @sample highcharts/members/series-select/\n     *         Select a series from a button\n     *\n     * @function Highcharts.Series#select\n     *\n     * @param {boolean} [selected]\n     * True to select the series, false to unselect. If undefined, the selection\n     * state is toggled.\n     *\n     * @emits Highcharts.Series#event:select\n     * @emits Highcharts.Series#event:unselect\n     */\n    select(selected) {\n        const series = this;\n        series.selected =\n            selected =\n                this.options.selected = (typeof selected === 'undefined' ?\n                    !series.selected :\n                    selected);\n        if (series.checkbox) {\n            series.checkbox.checked = selected;\n        }\n        fireEvent(series, selected ? 'select' : 'unselect');\n    }\n    /**\n     * Checks if a tooltip should be shown for a given point.\n     *\n     * @private\n     */\n    shouldShowTooltip(plotX, plotY, options = {}) {\n        options.series = this;\n        options.visiblePlotOnly = true;\n        return this.chart.isInsidePlot(plotX, plotY, options);\n    }\n    /**\n     * Draws the legend symbol based on the legendSymbol user option.\n     *\n     * @private\n     */\n    drawLegendSymbol(legend, item) {\n        LegendSymbol[this.options.legendSymbol || 'rectangle']\n            ?.call(this, legend, item);\n    }\n}\nSeries.defaultOptions = SeriesDefaults;\n/**\n * Registry of all available series types.\n *\n * @name Highcharts.Series.types\n * @type {Highcharts.Dictionary<typeof_Highcharts.Series>}\n */\nSeries.types = SeriesRegistry.seriesTypes;\n/* *\n *\n *  Static Functions\n *\n * */\n/**\n * Registers a series class to be accessible via `Series.types`.\n *\n * @function Highcharts.Series.registerType\n *\n * @param {string} seriesType\n * The series type as an identifier string in lower case.\n *\n * @param {Function} SeriesClass\n * The series class as a class pattern or a constructor function with\n * prototype.\n */\nSeries.registerType = SeriesRegistry.registerSeriesType;\nextend(Series.prototype, {\n    axisTypes: ['xAxis', 'yAxis'],\n    coll: 'series',\n    colorCounter: 0,\n    directTouch: false,\n    invertible: true,\n    isCartesian: true,\n    kdAxisArray: ['clientX', 'plotY'],\n    // Each point's x and y values are stored in this.xData and this.yData:\n    parallelArrays: ['x', 'y'],\n    pointClass: Point,\n    requireSorting: true,\n    // Requires the data to be sorted:\n    sorted: true\n});\n/* *\n *\n *  Registry\n *\n * */\nSeriesRegistry.series = Series;\n/* *\n *\n *  Default Export\n *\n * */\nexport default Series;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * This is a placeholder type of the possible series options for\n * [Highcharts](../highcharts/series), [Highcharts Stock](../highstock/series),\n * [Highmaps](../highmaps/series), and [Gantt](../gantt/series).\n *\n * In TypeScript is this dynamically generated to reference all possible types\n * of series options.\n *\n * @ignore-declaration\n * @typedef {Highcharts.SeriesOptions|Highcharts.Dictionary<*>} Highcharts.SeriesOptionsType\n */\n/**\n * Options for `dataSorting`.\n *\n * @interface Highcharts.DataSortingOptionsObject\n * @since 8.0.0\n */ /**\n* Enable or disable data sorting for the series.\n* @name Highcharts.DataSortingOptionsObject#enabled\n* @type {boolean|undefined}\n*/ /**\n* Whether to allow matching points by name in an update.\n* @name Highcharts.DataSortingOptionsObject#matchByName\n* @type {boolean|undefined}\n*/ /**\n* Determines what data value should be used to sort by.\n* @name Highcharts.DataSortingOptionsObject#sortKey\n* @type {string|undefined}\n*/\n/**\n * Function callback when a series has been animated.\n *\n * @callback Highcharts.SeriesAfterAnimateCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {Highcharts.SeriesAfterAnimateEventObject} event\n *        Event arguments.\n */\n/**\n * Event information regarding completed animation of a series.\n *\n * @interface Highcharts.SeriesAfterAnimateEventObject\n */ /**\n* Animated series.\n* @name Highcharts.SeriesAfterAnimateEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesAfterAnimateEventObject#type\n* @type {\"afterAnimate\"}\n*/\n/**\n * Function callback when the checkbox next to the series' name in the legend is\n * clicked.\n *\n * @callback Highcharts.SeriesCheckboxClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {Highcharts.SeriesCheckboxClickEventObject} event\n *        Event arguments.\n */\n/**\n * Event information regarding check of a series box.\n *\n * @interface Highcharts.SeriesCheckboxClickEventObject\n */ /**\n* Whether the box has been checked.\n* @name Highcharts.SeriesCheckboxClickEventObject#checked\n* @type {boolean}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#item\n* @type {Highcharts.Series}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesCheckboxClickEventObject#type\n* @type {\"checkboxClick\"}\n*/\n/**\n * Function callback when a series is clicked. Return false to cancel toogle\n * actions.\n *\n * @callback Highcharts.SeriesClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {Highcharts.SeriesClickEventObject} event\n *        Event arguments.\n */\n/**\n * Common information for a click event on a series.\n *\n * @interface Highcharts.SeriesClickEventObject\n * @extends global.Event\n */ /**\n* Nearest point on the graph.\n* @name Highcharts.SeriesClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Gets fired when the series is hidden after chart generation time, either by\n * clicking the legend item or by calling `.hide()`.\n *\n * @callback Highcharts.SeriesHideCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin` of a line\n * graph.\n *\n * @typedef {\"butt\"|\"round\"|\"square\"|string} Highcharts.SeriesLinecapValue\n */\n/**\n * Gets fired when the legend item belonging to the series is clicked. The\n * default action is to toggle the visibility of the series. This can be\n * prevented by returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {Highcharts.SeriesLegendItemClickEventObject} event\n *        The event that occurred.\n */\n/**\n * Information about the event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.SeriesLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n* @type {global.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series.\n* @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesCheckboxClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesCheckboxClickEventObject#type\n* @type {\"checkboxClick\"}\n*/\n/**\n * Gets fired when the mouse leaves the graph.\n *\n * @callback Highcharts.SeriesMouseOutCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n *        Event that occurred.\n */\n/**\n * Gets fired when the mouse enters the graph.\n *\n * @callback Highcharts.SeriesMouseOverCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        Series where the event occurred.\n *\n * @param {global.PointerEvent} event\n *        Event that occurred.\n */\n/**\n * Translation and scale for the plot area of a series.\n *\n * @interface Highcharts.SeriesPlotBoxObject\n */ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#scaleY\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateX\n* @type {number}\n*/ /**\n* @name Highcharts.SeriesPlotBoxObject#translateY\n* @type {number}\n*/\n/**\n * Gets fired when the series is shown after chart generation time, either by\n * clicking the legend item or by calling `.show()`.\n *\n * @callback Highcharts.SeriesShowCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        Series where the event occurred.\n *\n * @param {global.Event} event\n *        Event that occurred.\n */\n/**\n * Possible key values for the series state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.SeriesStateValue\n */\n''; // Detach doclets above\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Series options for specific data and the data itself. In TypeScript you\n * have to cast the series options to specific series types, to get all\n * possible options for a series.\n *\n * @example\n * // TypeScript example\n * Highcharts.chart('container', {\n *     series: [{\n *         color: '#06C',\n *         data: [[0, 1], [2, 3]]\n *     } as Highcharts.SeriesLineOptions ]\n * });\n *\n * @type      {Array<*>}\n * @apioption series\n */\n/**\n * An id for the series. This can be used after render time to get a pointer\n * to the series object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/plotoptions/series-id/\n *         Get series by id\n *\n * @type      {string}\n * @since     1.2.0\n * @apioption series.id\n */\n/**\n * The index of the series in the chart, affecting the internal index in the\n * `chart.series` array, the visible Z index as well as the order in the\n * legend.\n *\n * @type      {number}\n * @since     2.3.0\n * @apioption series.index\n */\n/**\n * The sequential index of the series in the legend.\n *\n * @see [legend.reversed](#legend.reversed),\n *      [yAxis.reversedStacks](#yAxis.reversedStacks)\n *\n * @sample {highcharts|highstock} highcharts/series/legendindex/\n *         Legend in opposite order\n *\n * @type      {number}\n * @apioption series.legendIndex\n */\n/**\n * The name of the series as shown in the legend, tooltip etc.\n *\n * @sample {highcharts} highcharts/series/name/\n *         Series name\n * @sample {highmaps} maps/demo/category-map/\n *         Series name\n *\n * @type      {string}\n * @apioption series.name\n */\n/**\n * This option allows grouping series in a stacked chart. The stack option\n * can be a string or anything else, as long as the grouped series' stack\n * options match each other after conversion into a string.\n *\n * @sample {highcharts} highcharts/series/stack/\n *         Stacked and grouped columns\n *\n * @type      {number|string}\n * @since     2.1\n * @product   highcharts highstock\n * @apioption series.stack\n */\n/**\n * The type of series, for example `line` or `column`. By default, the\n * series type is inherited from [chart.type](#chart.type), so unless the\n * chart is a combination of series types, there is no need to set it on the\n * series level.\n *\n * @sample {highcharts} highcharts/series/type/\n *         Line and column in the same chart\n * @sample highcharts/series/type-dynamic/\n *         Dynamic types with button selector\n * @sample {highmaps} maps/demo/mapline-mappoint/\n *         Multiple types in the same map\n *\n * @type      {string}\n * @apioption series.type\n */\n/**\n * When using dual or multiple x axes, this number defines which xAxis the\n * particular series is connected to. It refers to either the\n * {@link #xAxis.id|axis id}\n * or the index of the axis in the xAxis array, with 0 being the first.\n *\n * @type      {number|string}\n * @default   0\n * @product   highcharts highstock\n * @apioption series.xAxis\n */\n/**\n * When using dual or multiple y axes, this number defines which yAxis the\n * particular series is connected to. It refers to either the\n * {@link #yAxis.id|axis id}\n * or the index of the axis in the yAxis array, with 0 being the first.\n *\n * @sample {highcharts} highcharts/series/yaxis/\n *         Apply the column series to the secondary Y axis\n *\n * @type      {number|string}\n * @default   0\n * @product   highcharts highstock\n * @apioption series.yAxis\n */\n/**\n * Define the visual z index of the series.\n *\n * @sample {highcharts} highcharts/plotoptions/series-zindex-default/\n *         With no z index, the series defined last are on top\n * @sample {highcharts} highcharts/plotoptions/series-zindex/\n *         With a z index, the series with the highest z index is on top\n * @sample {highstock} highcharts/plotoptions/series-zindex-default/\n *         With no z index, the series defined last are on top\n * @sample {highstock} highcharts/plotoptions/series-zindex/\n *         With a z index, the series with the highest z index is on top\n *\n * @type      {number}\n * @product   highcharts highstock\n * @apioption series.zIndex\n */\n''; // Include precedent doclets in transpiled\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * General options for all series types.\n *\n * @optionparent plotOptions.series\n */\nconst seriesDefaults = {\n    // Base series options\n    /**\n     * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n     * of a line graph. Round means that lines are rounded in the ends and\n     * bends.\n     *\n     * @type       {Highcharts.SeriesLinecapValue}\n     * @default    round\n     * @since      3.0.7\n     * @apioption  plotOptions.line.linecap\n     */\n    /**\n     * Pixel width of the graph line.\n     *\n     * @see In styled mode, the line stroke-width can be set with the\n     *      `.highcharts-graph` class name.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-linewidth-general/\n     *         On all series\n     * @sample {highcharts} highcharts/plotoptions/series-linewidth-specific/\n     *         On one single series\n     *\n     * @product highcharts highstock\n     */\n    lineWidth: 2,\n    /**\n     * For some series, there is a limit that shuts down animation\n     * by default when the total number of points in the chart is too high.\n     * For example, for a column chart and its derivatives, animation does\n     * not run if there is more than 250 points totally. To disable this\n     * cap, set `animationLimit` to `Infinity`. This option works if animation\n     * is fired on individual points, not on a group of points like e.g. during\n     * the initial animation.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-animationlimit/\n     *         Animation limit on updating individual points\n     *\n     * @type      {number}\n     * @apioption plotOptions.series.animationLimit\n     */\n    /**\n     * Allow this series' points to be selected by clicking on the graphic\n     * (columns, point markers, pie slices, map areas etc).\n     *\n     * The selected points can be handled by point select and unselect\n     * events, or collectively by the [getSelectedPoints\n     * ](/class-reference/Highcharts.Chart#getSelectedPoints) function.\n     *\n     * And alternative way of selecting points is through dragging.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-line/\n     *         Line\n     * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-column/\n     *         Column\n     * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-pie/\n     *         Pie\n     * @sample {highcharts} highcharts/chart/events-selection-points/\n     *         Select a range of points through a drag selection\n     * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n     *         Map area\n     * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n     *         Map bubble\n     *\n     * @since 1.2.0\n     *\n     * @private\n     */\n    allowPointSelect: false,\n    /**\n     * When true, each point or column edge is rounded to its nearest pixel\n     * in order to render sharp on screen. In some cases, when there are a\n     * lot of densely packed columns, this leads to visible difference\n     * in column widths or distance between columns. In these cases,\n     * setting `crisp` to `false` may look better, even though each column\n     * is rendered blurry.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-crisp-false/\n     *         Crisp is false\n     *\n     * @since   5.0.10\n     * @product highcharts highstock gantt\n     *\n     * @private\n     */\n    crisp: true,\n    /**\n     * If true, a checkbox is displayed next to the legend item to allow\n     * selecting the series. The state of the checkbox is determined by\n     * the `selected` option.\n     *\n     * @productdesc {highmaps}\n     * Note that if a `colorAxis` is defined, the color axis is represented\n     * in the legend, not the series.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-showcheckbox-true/\n     *         Show select box\n     *\n     * @since 1.2.0\n     *\n     * @private\n     */\n    showCheckbox: false,\n    /**\n     * Enable or disable the initial animation when a series is displayed.\n     * The animation can also be set as a configuration object. Please\n     * note that this option only applies to the initial animation of the\n     * series itself. For other animations, see [chart.animation](\n     * #chart.animation) and the animation parameter under the API methods.\n     * The following properties are supported:\n     *\n     * - `defer`: The animation delay time in milliseconds.\n     *\n     * - `duration`: The duration of the animation in milliseconds. (Defaults to\n     *   `1000`)\n     *\n     * - `easing`: Can be a string reference to an easing function set on\n     *   the `Math` object or a function. See the _Custom easing function_\n     *   demo below. (Defaults to `easeInOutSine`)\n     *\n     * Due to poor performance, animation is disabled in old IE browsers\n     * for several chart types.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-animation-disabled/\n     *         Animation disabled\n     * @sample {highcharts} highcharts/plotoptions/series-animation-slower/\n     *         Slower animation\n     * @sample {highcharts} highcharts/plotoptions/series-animation-easing/\n     *         Custom easing function\n     * @sample {highstock} stock/plotoptions/animation-slower/\n     *         Slower animation\n     * @sample {highstock} stock/plotoptions/animation-easing/\n     *         Custom easing function\n     * @sample {highmaps} maps/plotoptions/series-animation-true/\n     *         Animation enabled on map series\n     * @sample {highmaps} maps/plotoptions/mapbubble-animation-false/\n     *         Disabled on mapbubble series\n     *\n     * @type    {boolean|Highcharts.AnimationOptionsObject}\n     * @default {highcharts} true\n     * @default {highstock} true\n     * @default {highmaps} false\n     *\n     * @private\n     */\n    animation: {\n        /** @ignore-option */\n        duration: 1000\n    },\n    /**\n     * An additional class name to apply to the series' graphical elements.\n     * This option does not replace default class names of the graphical\n     * element. Changes to the series' color will also be reflected in a\n     * chart's legend and tooltip.\n     *\n     * @sample {highcharts} highcharts/css/point-series-classname\n     *         Series and point class name\n     *\n     * @type      {string}\n     * @since     5.0.0\n     * @apioption plotOptions.series.className\n     */\n    /**\n     * Disable this option to allow series rendering in the whole plotting\n     * area.\n     *\n     * **Note:** Clipping should be always enabled when\n     * [chart.zoomType](#chart.zoomType) is set\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-clip/\n     *         Disabled clipping\n     *\n     * @default   true\n     * @type      {boolean}\n     * @since     3.0.0\n     * @apioption plotOptions.series.clip\n     */\n    /**\n     * The main color of the series. In line type series it applies to the\n     * line and the point markers unless otherwise specified. In bar type\n     * series it applies to the bars unless a color is specified per point.\n     * The default value is pulled from the `options.colors` array.\n     *\n     * In styled mode, the color can be defined by the\n     * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n     * color can be set with the `.highcharts-series`,\n     * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n     * `.highcharts-series-{n}` class, or individual classes given by the\n     * `className` option.\n     *\n     * @productdesc {highmaps}\n     * In maps, the series color is rarely used, as most choropleth maps use\n     * the color to denote the value of each point. The series color can\n     * however be used in a map with multiple series holding categorized\n     * data.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-color-general/\n     *         General plot option\n     * @sample {highcharts} highcharts/plotoptions/series-color-specific/\n     *         One specific series\n     * @sample {highcharts} highcharts/plotoptions/series-color-area/\n     *         Area color\n     * @sample {highcharts} highcharts/series/infographic/\n     *         Pattern fill\n     * @sample {highmaps} maps/demo/category-map/\n     *         Category map by multiple series\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @apioption plotOptions.series.color\n     */\n    /**\n     * Styled mode only. A specific color index to use for the series, so its\n     * graphic representations are given the class name `highcharts-color-{n}`.\n     *\n     * Since v11, CSS variables on the form `--highcharts-color-{n}` make\n     * changing the color scheme very convenient.\n     *\n     * @sample    {highcharts} highcharts/css/colorindex/ Series and point color\n     *            index\n     *\n     * @type      {number}\n     * @since     5.0.0\n     * @apioption plotOptions.series.colorIndex\n     */\n    /**\n     * Whether to connect a graph line across null points, or render a gap\n     * between the two points on either side of the null.\n     *\n     * In stacked area chart, if `connectNulls` is set to true,\n     * null points are interpreted as 0.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-connectnulls-false/\n     *         False by default\n     * @sample {highcharts} highcharts/plotoptions/series-connectnulls-true/\n     *         True\n     *\n     * @type      {boolean}\n     * @default   false\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.connectNulls\n     */\n    /**\n     * You can set the cursor to \"pointer\" if you have click events attached\n     * to the series, to signal to the user that the points and lines can\n     * be clicked.\n     *\n     * In styled mode, the series cursor can be set with the same classes\n     * as listed under [series.color](#plotOptions.series.color).\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-cursor-line/\n     *         On line graph\n     * @sample {highcharts} highcharts/plotoptions/series-cursor-column/\n     *         On columns\n     * @sample {highcharts} highcharts/plotoptions/series-cursor-scatter/\n     *         On scatter markers\n     * @sample {highstock} stock/plotoptions/cursor/\n     *         Pointer on a line graph\n     * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n     *         Map area\n     * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n     *         Map bubble\n     *\n     * @type      {string|Highcharts.CursorValue}\n     * @apioption plotOptions.series.cursor\n     */\n    /**\n     * A reserved subspace to store options and values for customized\n     * functionality. Here you can add additional data for your own event\n     * callbacks and formatter callbacks.\n     *\n     * @sample {highcharts} highcharts/point/custom/\n     *         Point and series with custom data\n     *\n     * @type      {Highcharts.Dictionary<*>}\n     * @apioption plotOptions.series.custom\n     */\n    /**\n     * Name of the dash style to use for the graph, or for some series types\n     * the outline of each shape.\n     *\n     * In styled mode, the\n     * [stroke dash-array](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/series-dashstyle/)\n     * can be set with the same classes as listed under\n     * [series.color](#plotOptions.series.color).\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-dashstyle-all/\n     *         Possible values demonstrated\n     * @sample {highcharts} highcharts/plotoptions/series-dashstyle/\n     *         Chart suitable for printing in black and white\n     * @sample {highstock} highcharts/plotoptions/series-dashstyle-all/\n     *         Possible values demonstrated\n     * @sample {highmaps} highcharts/plotoptions/series-dashstyle-all/\n     *         Possible values demonstrated\n     * @sample {highmaps} maps/plotoptions/series-dashstyle/\n     *         Dotted borders on a map\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @default   Solid\n     * @since     2.1\n     * @apioption plotOptions.series.dashStyle\n     */\n    /**\n     * A description of the series to add to the screen reader information\n     * about the series.\n     *\n     * @type      {string}\n     * @since     5.0.0\n     * @requires  modules/accessibility\n     * @apioption plotOptions.series.description\n     */\n    /**\n     * Options for the series data sorting.\n     *\n     * @type      {Highcharts.DataSortingOptionsObject}\n     * @since     8.0.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.dataSorting\n     */\n    /**\n     * Enable or disable data sorting for the series. Use [xAxis.reversed](\n     * #xAxis.reversed) to change the sorting order.\n     *\n     * @sample {highcharts} highcharts/datasorting/animation/\n     *         Data sorting in scatter-3d\n     * @sample {highcharts} highcharts/datasorting/labels-animation/\n     *         Axis labels animation\n     * @sample {highcharts} highcharts/datasorting/dependent-sorting/\n     *         Dependent series sorting\n     * @sample {highcharts} highcharts/datasorting/independent-sorting/\n     *         Independent series sorting\n     *\n     * @type      {boolean}\n     * @since     8.0.0\n     * @apioption plotOptions.series.dataSorting.enabled\n     */\n    /**\n     * Whether to allow matching points by name in an update. If this option\n     * is disabled, points will be matched by order.\n     *\n     * @sample {highcharts} highcharts/datasorting/match-by-name/\n     *         Enabled match by name\n     *\n     * @type      {boolean}\n     * @since     8.0.0\n     * @apioption plotOptions.series.dataSorting.matchByName\n     */\n    /**\n     * Determines what data value should be used to sort by.\n     *\n     * @sample {highcharts} highcharts/datasorting/sort-key/\n     *         Sort key as `z` value\n     *\n     * @type      {string}\n     * @since     8.0.0\n     * @default   y\n     * @apioption plotOptions.series.dataSorting.sortKey\n     */\n    /**\n     * Enable or disable the mouse tracking for a specific series. This\n     * includes point tooltips and click events on graphs and points. For\n     * large datasets it improves performance.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-enablemousetracking-false/\n     *         No mouse tracking\n     * @sample {highmaps} maps/plotoptions/series-enablemousetracking-false/\n     *         No mouse tracking\n     *\n     * @type      {boolean}\n     * @default   true\n     * @apioption plotOptions.series.enableMouseTracking\n     */\n    enableMouseTracking: true,\n    /**\n     * Whether to use the Y extremes of the total chart width or only the\n     * zoomed area when zooming in on parts of the X axis. By default, the\n     * Y axis adjusts to the min and max of the visible data. Cartesian\n     * series only.\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     4.1.6\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.series.getExtremesFromAll\n     */\n    /**\n     * Highlight only the hovered point and fade the remaining points.\n     *\n     * Scatter-type series require enabling the 'inactive' marker state and\n     * adjusting opacity. Note that this approach could affect performance\n     * with large datasets.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-inactiveotherpoints-enabled/\n     *         Chart with inactiveOtherPoints option enabled.\n     *\n     * @type      {boolean}\n     * @default   false\n     * @apioption plotOptions.series.inactiveOtherPoints\n     */\n    /**\n     * An array specifying which option maps to which key in the data point\n     * array. This makes it convenient to work with unstructured data arrays\n     * from different sources.\n     *\n     * @see [series.data](#series.line.data)\n     *\n     * @sample {highcharts|highstock} highcharts/series/data-keys/\n     *         An extended data array with keys\n     * @sample {highcharts|highstock} highcharts/series/data-nested-keys/\n     *         Nested keys used to access object properties\n     *\n     * @type      {Array<string>}\n     * @since     4.1.6\n     * @apioption plotOptions.series.keys\n     */\n    /**\n     * The line cap used for line ends and line joins on the graph.\n     *\n     * @sample highcharts/series-line/linecap/\n     *         Line cap comparison\n     *\n     * @type       {Highcharts.SeriesLinecapValue}\n     * @default    round\n     * @product    highcharts highstock\n     * @apioption  plotOptions.series.linecap\n     */\n    /**\n     * The [id](#series.id) of another series to link to. Additionally,\n     * the value can be \":previous\" to link to the previous series. When\n     * two series are linked, only the first one appears in the legend.\n     * Toggling the visibility of this also toggles the linked series.\n     *\n     * If master series uses data sorting and linked series does not have\n     * its own sorting definition, the linked series will be sorted in the\n     * same order as the master one.\n     *\n     * @sample {highcharts|highstock} highcharts/demo/arearange-line/\n     *         Linked series\n     *\n     * @type      {string}\n     * @since     3.0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.series.linkedTo\n     */\n    /**\n     * Options for the corresponding navigator series if `showInNavigator`\n     * is `true` for this series. Available options are the same as any\n     * series, documented at [plotOptions](#plotOptions.series) and\n     * [series](#series).\n     *\n     * These options are merged with options in [navigator.series](\n     * #navigator.series), and will take precedence if the same option is\n     * defined both places.\n     *\n     * @see [navigator.series](#navigator.series)\n     *\n     * @type      {Highcharts.PlotSeriesOptions}\n     * @since     5.0.0\n     * @product   highstock\n     * @apioption plotOptions.series.navigatorOptions\n     */\n    /**\n     * The color for the parts of the graph or points that are below the\n     * [threshold](#plotOptions.series.threshold). Note that `zones` takes\n     * precedence over the negative color. Using `negativeColor` is\n     * equivalent to applying a zone with value of 0.\n     *\n     * @see In styled mode, a negative color is applied by setting this option\n     *      to `true` combined with the `.highcharts-negative` class name.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-negative-color/\n     *         Spline, area and column\n     * @sample {highcharts} highcharts/plotoptions/arearange-negativecolor/\n     *         Arearange\n     * @sample {highcharts} highcharts/css/series-negative-color/\n     *         Styled mode\n     * @sample {highstock} highcharts/plotoptions/series-negative-color/\n     *         Spline, area and column\n     * @sample {highstock} highcharts/plotoptions/arearange-negativecolor/\n     *         Arearange\n     * @sample {highmaps} highcharts/plotoptions/series-negative-color/\n     *         Spline, area and column\n     * @sample {highmaps} highcharts/plotoptions/arearange-negativecolor/\n     *         Arearange\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     3.0\n     * @apioption plotOptions.series.negativeColor\n     */\n    /**\n     * Same as\n     * [accessibility.point.descriptionFormat](#accessibility.point.descriptionFormat),\n     * but for an individual series. Overrides the chart wide configuration.\n     *\n     * @type      {Function}\n     * @since 11.1.0\n     * @apioption plotOptions.series.pointDescriptionFormat\n     */\n    /**\n     * Same as\n     * [accessibility.series.descriptionFormatter](#accessibility.series.descriptionFormatter),\n     * but for an individual series. Overrides the chart wide configuration.\n     *\n     * @type      {Function}\n     * @since     5.0.12\n     * @apioption plotOptions.series.pointDescriptionFormatter\n     */\n    /**\n     * If no x values are given for the points in a series, `pointInterval`\n     * defines the interval of the x values. For example, if a series\n     * contains one value every decade starting from year 0, set\n     * `pointInterval` to `10`. In true `datetime` axes, the `pointInterval`\n     * is set in milliseconds.\n     *\n     * It can be also be combined with `pointIntervalUnit` to draw irregular\n     * time intervals.\n     *\n     * If combined with `relativeXValue`, an x value can be set on each\n     * point, and the `pointInterval` is added x times to the `pointStart`\n     * setting.\n     *\n     * Please note that this options applies to the _series data_, not the\n     * interval of the axis ticks, which is independent.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n     *         Datetime X axis\n     * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n     *         Relative x value\n     * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n     *         Using pointStart and pointInterval\n     * @sample {highstock} stock/plotoptions/relativexvalue/\n     *         Relative x value\n     *\n     * @type      {number}\n     * @default   1\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.series.pointInterval\n     */\n    /**\n     * On datetime series, this allows for setting the\n     * [pointInterval](#plotOptions.series.pointInterval) to irregular time\n     * units, `day`, `month` and `year`. A day is usually the same as 24\n     * hours, but `pointIntervalUnit` also takes the DST crossover into\n     * consideration when dealing with local time. Combine this option with\n     * `pointInterval` to draw weeks, quarters, 6 months, 10 years etc.\n     *\n     * Please note that this options applies to the _series data_, not the\n     * interval of the axis ticks, which is independent.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-pointintervalunit/\n     *         One point a month\n     * @sample {highstock} highcharts/plotoptions/series-pointintervalunit/\n     *         One point a month\n     *\n     * @type       {string}\n     * @since      4.1.0\n     * @product    highcharts highstock gantt\n     * @validvalue [\"day\", \"month\", \"year\"]\n     * @apioption  plotOptions.series.pointIntervalUnit\n     */\n    /**\n     * Possible values: `\"on\"`, `\"between\"`, `number`.\n     *\n     * In a column chart, when pointPlacement is `\"on\"`, the point will not\n     * create any padding of the X axis. In a polar column chart this means\n     * that the first column points directly north. If the pointPlacement is\n     * `\"between\"`, the columns will be laid out between ticks. This is\n     * useful for example for visualising an amount between two points in\n     * time or in a certain sector of a polar chart.\n     *\n     * Since Highcharts 3.0.2, the point placement can also be numeric,\n     * where 0 is on the axis value, -0.5 is between this value and the\n     * previous, and 0.5 is between this value and the next. Unlike the\n     * textual options, numeric point placement options won't affect axis\n     * padding.\n     *\n     * Note that pointPlacement needs a [pointRange](\n     * #plotOptions.series.pointRange) to work. For column series this is\n     * computed, but for line-type series it needs to be set.\n     *\n     * For the `xrange` series type and gantt charts, if the Y axis is a\n     * category axis, the `pointPlacement` applies to the Y axis rather than\n     * the (typically datetime) X axis.\n     *\n     * Defaults to `undefined` in cartesian charts, `\"between\"` in polar\n     * charts.\n     *\n     * @see [xAxis.tickmarkPlacement](#xAxis.tickmarkPlacement)\n     *\n     * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-between/\n     *         Between in a column chart\n     * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-numeric/\n     *         Numeric placement for custom layout\n     * @sample {highcharts|highstock} maps/plotoptions/heatmap-pointplacement/\n     *         Placement in heatmap\n     *\n     * @type      {string|number}\n     * @since     2.3.0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.series.pointPlacement\n     */\n    /**\n     * If no x values are given for the points in a series, pointStart\n     * defines on what value to start. For example, if a series contains one\n     * yearly value starting from 1945, set pointStart to 1945.\n     *\n     * If combined with `relativeXValue`, an x value can be set on each\n     * point. The x value from the point options is multiplied by\n     * `pointInterval` and added to `pointStart` to produce a modified x\n     * value.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-pointstart-linear/\n     *         Linear\n     * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n     *         Datetime\n     * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n     *         Relative x value\n     * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n     *         Using pointStart and pointInterval\n     * @sample {highstock} stock/plotoptions/relativexvalue/\n     *         Relative x value\n     *\n     * @type      {number}\n     * @default   0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.series.pointStart\n     */\n    /**\n     * When true, X values in the data set are relative to the current\n     * `pointStart`, `pointInterval` and `pointIntervalUnit` settings. This\n     * allows compression of the data for datasets with irregular X values.\n     *\n     * The real X values are computed on the formula `f(x) = ax + b`, where\n     * `a` is the `pointInterval` (optionally with a time unit given by\n     * `pointIntervalUnit`), and `b` is the `pointStart`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-relativexvalue/\n     *         Relative X value\n     * @sample {highstock} stock/plotoptions/relativexvalue/\n     *         Relative X value\n     *\n     * @type      {boolean}\n     * @default   false\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.relativeXValue\n     */\n    /**\n     * Whether to select the series initially. If `showCheckbox` is true,\n     * the checkbox next to the series name in the legend will be checked\n     * for a selected series.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-selected/\n     *         One out of two series selected\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     1.2.0\n     * @apioption plotOptions.series.selected\n     */\n    /**\n     * Whether to apply a drop shadow to the graph line. Since 2.3 the\n     * shadow can be an object configuration containing `color`, `offsetX`,\n     * `offsetY`, `opacity` and `width`.\n     *\n     * Note that in some cases, like stacked columns or other dense layouts, the\n     * series may cast shadows on each other. In that case, the\n     * `chart.seriesGroupShadow` allows applying a common drop shadow to the\n     * whole series group.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-shadow/\n     *         Shadow enabled\n     *\n     * @type      {boolean|Highcharts.ShadowOptionsObject}\n     * @default   false\n     * @apioption plotOptions.series.shadow\n     */\n    /**\n     * Whether to display this particular series or series type in the\n     * legend. Standalone series are shown in legend by default, and linked\n     * series are not. Since v7.2.0 it is possible to show series that use\n     * colorAxis by setting this option to `true`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n     *         One series in the legend, one hidden\n     *\n     * @type      {boolean}\n     * @apioption plotOptions.series.showInLegend\n     */\n    /**\n     * Whether or not to show the series in the navigator. Takes precedence\n     * over [navigator.baseSeries](#navigator.baseSeries) if defined.\n     *\n     * @type      {boolean}\n     * @since     5.0.0\n     * @product   highstock\n     * @apioption plotOptions.series.showInNavigator\n     */\n    /**\n     * If set to `true`, the accessibility module will skip past the points\n     * in this series for keyboard navigation.\n     *\n     * @type      {boolean}\n     * @since     5.0.12\n     * @apioption plotOptions.series.skipKeyboardNavigation\n     */\n    /**\n     * Whether to stack the values of each series on top of each other.\n     * Possible values are `undefined` to disable, `\"normal\"` to stack by\n     * value or `\"percent\"`.\n     *\n     * When stacking is enabled, data must be sorted\n     * in ascending X order.\n     *\n     * Some stacking options are related to specific series types. In the\n     * streamgraph series type, the stacking option is set to `\"stream\"`.\n     * The second one is `\"overlap\"`, which only applies to waterfall\n     * series.\n     *\n     * @see [yAxis.reversedStacks](#yAxis.reversedStacks)\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-line/\n     *         Line\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-column/\n     *         Column\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-bar/\n     *         Bar\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-area/\n     *         Area\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-line/\n     *         Line\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-column/\n     *         Column\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-bar/\n     *         Bar\n     * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-area/\n     *         Area\n     * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-normal-stacking\n     *         Waterfall with normal stacking\n     * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-overlap-stacking\n     *         Waterfall with overlap stacking\n     * @sample {highstock} stock/plotoptions/stacking/\n     *         Area\n     *\n     * @type       {string}\n     * @product    highcharts highstock\n     * @validvalue [\"normal\", \"overlap\", \"percent\", \"stream\"]\n     * @apioption  plotOptions.series.stacking\n     */\n    /**\n     * Whether to apply steps to the line. Possible values are `left`,\n     * `center` and `right`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/line-step/\n     *         Different step line options\n     * @sample {highcharts} highcharts/plotoptions/area-step/\n     *         Stepped, stacked area\n     * @sample {highstock} stock/plotoptions/line-step/\n     *         Step line\n     *\n     * @type       {string}\n     * @since      1.2.5\n     * @product    highcharts highstock\n     * @validvalue [\"left\", \"center\", \"right\"]\n     * @apioption  plotOptions.series.step\n     */\n    /**\n     * The threshold, also called zero level or base level. For line type\n     * series this is only used in conjunction with\n     * [negativeColor](#plotOptions.series.negativeColor).\n     *\n     * @see [softThreshold](#plotOptions.series.softThreshold).\n     *\n     * @type      {number|null}\n     * @default   0\n     * @since     3.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.threshold\n     */\n    /**\n     * Set the initial visibility of the series.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-visible/\n     *         Two series, one hidden and one visible\n     * @sample {highstock} stock/plotoptions/series-visibility/\n     *         Hidden series\n     *\n     * @type      {boolean}\n     * @default   true\n     * @apioption plotOptions.series.visible\n     */\n    /**\n     * Defines the Axis on which the zones are applied.\n     *\n     * @see [zones](#plotOptions.series.zones)\n     *\n     * @sample {highcharts} highcharts/series/color-zones-zoneaxis-x/\n     *         Zones on the X-Axis\n     * @sample {highstock} highcharts/series/color-zones-zoneaxis-x/\n     *         Zones on the X-Axis\n     *\n     * @type      {string}\n     * @default   y\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zoneAxis\n     */\n    /**\n     * General event handlers for the series items. These event hooks can\n     * also be attached to the series at run time using the\n     * `Highcharts.addEvent` function.\n     *\n     * @declare Highcharts.SeriesEventsOptionsObject\n     *\n     * @private\n     */\n    events: {},\n    /**\n     * Fires after the series has finished its initial animation, or in case\n     * animation is disabled, immediately as the series is displayed.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-afteranimate/\n     *         Show label after animate\n     * @sample {highstock} highcharts/plotoptions/series-events-afteranimate/\n     *         Show label after animate\n     *\n     * @type      {Highcharts.SeriesAfterAnimateCallbackFunction}\n     * @since     4.0\n     * @product   highcharts highstock gantt\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.afterAnimate\n     */\n    /**\n     * Fires when the checkbox next to the series' name in the legend is\n     * clicked. One parameter, `event`, is passed to the function. The state\n     * of the checkbox is found by `event.checked`. The checked item is\n     * found by `event.item`. Return `false` to prevent the default action\n     * which is to toggle the select state of the series.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n     *         Alert checkbox status\n     *\n     * @type      {Highcharts.SeriesCheckboxClickCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.checkboxClick\n     */\n    /**\n     * Fires when the series is clicked. One parameter, `event`, is passed\n     * to the function, containing common event information. Additionally,\n     * `event.point` holds a pointer to the nearest point on the graph.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-click/\n     *         Alert click info\n     * @sample {highstock} stock/plotoptions/series-events-click/\n     *         Alert click info\n     * @sample {highmaps} maps/plotoptions/series-events-click/\n     *         Display click info in subtitle\n     *\n     * @type      {Highcharts.SeriesClickCallbackFunction}\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.click\n     */\n    /**\n     * Fires when the series is hidden after chart generation time, either\n     * by clicking the legend item or by calling `.hide()`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-hide/\n     *         Alert when the series is hidden by clicking the legend item\n     *\n     * @type      {Highcharts.SeriesHideCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.hide\n     */\n    /**\n     * Fires when the legend item belonging to the series is clicked. One\n     * parameter, `event`, is passed to the function. The default action\n     * is to toggle the visibility of the series. This can be prevented\n     * by returning `false` or calling `event.preventDefault()`.\n     *\n     * **Note:** This option is deprecated in favor of\n     * [legend.events.itemClick](#legend.events.itemClick).\n     *\n     * @type       {Highcharts.SeriesLegendItemClickCallbackFunction}\n     * @deprecated 11.4.4\n     * @context    Highcharts.Series\n     * @apioption  plotOptions.series.events.legendItemClick\n     */\n    /**\n     * Fires when the mouse leaves the graph. One parameter, `event`, is\n     * passed to the function, containing common event information. If the\n     * [stickyTracking](#plotOptions.series) option is true, `mouseOut`\n     * doesn't happen before the mouse enters another graph or leaves the\n     * plot area.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n     *         With sticky tracking by default\n     * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n     *         Without sticky tracking\n     *\n     * @type      {Highcharts.SeriesMouseOutCallbackFunction}\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.mouseOut\n     */\n    /**\n     * Fires when the mouse enters the graph. One parameter, `event`, is\n     * passed to the function, containing common event information.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n     *         With sticky tracking by default\n     * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n     *         Without sticky tracking\n     *\n     * @type      {Highcharts.SeriesMouseOverCallbackFunction}\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.mouseOver\n     */\n    /**\n     * Fires when the series is shown after chart generation time, either\n     * by clicking the legend item or by calling `.show()`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-show/\n     *         Alert when the series is shown by clicking the legend item.\n     *\n     * @type      {Highcharts.SeriesShowCallbackFunction}\n     * @since     1.2.0\n     * @context   Highcharts.Series\n     * @apioption plotOptions.series.events.show\n     */\n    /**\n     * Options for the point markers of line and scatter-like series. Properties\n     * like `fillColor`, `lineColor` and `lineWidth` define the visual\n     * appearance of the markers. The `symbol` option defines the shape. Other\n     * series types, like column series, don't have markers, but have visual\n     * options on the series level instead.\n     *\n     * In styled mode, the markers can be styled with the `.highcharts-point`,\n     * `.highcharts-point-hover` and `.highcharts-point-select` class names.\n     *\n     * @declare Highcharts.PointMarkerOptionsObject\n     *\n     * @sample {highmaps} maps/demo/mappoint-mapmarker\n     *         Using the mapmarker symbol for points\n     *\n     * @private\n     */\n    marker: {\n        /**\n         * Enable or disable the point marker. If `undefined`, the markers\n         * are hidden when the data is dense, and shown for more widespread\n         * data points.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-enabled/\n         *         Disabled markers\n         * @sample {highcharts} highcharts/plotoptions/series-marker-enabled-false/\n         *         Disabled in normal state but enabled on hover\n         * @sample {highstock} stock/plotoptions/series-marker/\n         *         Enabled markers\n         *\n         * @type      {boolean}\n         * @default   {highcharts} undefined\n         * @default   {highstock} false\n         * @apioption plotOptions.series.marker.enabled\n         */\n        /**\n         * The threshold for how dense the point markers should be before\n         * they are hidden, given that `enabled` is not defined. The number\n         * indicates the horizontal distance between the two closest points\n         * in the series, as multiples of the `marker.radius`. In other\n         * words, the default value of 2 means points are hidden if\n         * overlapping horizontally.\n         *\n         * @sample highcharts/plotoptions/series-marker-enabledthreshold\n         *         A higher threshold\n         *\n         * @since 6.0.5\n         */\n        enabledThreshold: 2,\n        /**\n         * The fill color of the point marker. When `undefined`, the series'\n         * or point's color is used.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n         *         White fill\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @apioption plotOptions.series.marker.fillColor\n         */\n        /**\n         * Image markers only. Set the image width explicitly. When using\n         * this option, a `width` must also be set.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n         *         Fixed width and height\n         * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n         *         Fixed width and height\n         *\n         * @type      {number}\n         * @since     4.0.4\n         * @apioption plotOptions.series.marker.height\n         */\n        /**\n         * The color of the point marker's outline. When `undefined`, the\n         * series' or point's color is used.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n         *         Inherit from series color (undefined)\n         *\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        lineColor: \"#ffffff\" /* Palette.backgroundColor */,\n        /**\n         * The width of the point marker's outline.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n         *         2px blue marker\n         */\n        lineWidth: 0,\n        /**\n         * The radius of the point marker.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-radius/\n         *         Bigger markers\n         *\n         * @default {highstock} 2\n         * @default {highcharts} 4\n         *\n         */\n        radius: 4,\n        /**\n         * A predefined shape or symbol for the marker. When undefined, the\n         * symbol is pulled from options.symbols. Other possible values are\n         * `'circle'`, `'square'`,`'diamond'`, `'triangle'` and\n         * `'triangle-down'`.\n         *\n         * Additionally, the URL to a graphic can be given on this form:\n         * `'url(graphic.png)'`. Note that for the image to be applied to\n         * exported charts, its URL needs to be accessible by the export\n         * server.\n         *\n         * Custom callbacks for symbol path generation can also be added to\n         * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n         * used by its method name, as shown in the demo.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n         *         Predefined, graphic and custom markers\n         * @sample {highstock} highcharts/plotoptions/series-marker-symbol/\n         *         Predefined, graphic and custom markers\n         * @sample {highmaps} maps/demo/mappoint-mapmarker\n         *         Using the mapmarker symbol for points\n         *\n         * @type      {string}\n         * @apioption plotOptions.series.marker.symbol\n         */\n        /**\n         * Image markers only. Set the image width explicitly. When using\n         * this option, a `height` must also be set.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n         *         Fixed width and height\n         * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n         *         Fixed width and height\n         *\n         * @type      {number}\n         * @since     4.0.4\n         * @apioption plotOptions.series.marker.width\n         */\n        /**\n         * States for a single point marker.\n         *\n         * @declare Highcharts.PointStatesOptionsObject\n         */\n        states: {\n            /**\n             * The normal state of a single point marker. Currently only\n             * used for setting animation when returning to normal state\n             * from hover.\n             *\n             * @declare Highcharts.PointStatesNormalOptionsObject\n             */\n            normal: {\n                /**\n                 * Animation when returning to normal state after hovering.\n                 *\n                 * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n                 */\n                animation: true\n            },\n            /**\n             * The hover state for a single point marker.\n             *\n             * @declare Highcharts.PointStatesHoverOptionsObject\n             */\n            hover: {\n                /**\n                 * Animation when hovering over the marker.\n                 *\n                 * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n                 */\n                animation: {\n                    /** @internal */\n                    duration: 150\n                },\n                /**\n                 * Enable or disable the point marker.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-enabled/\n                 *         Disabled hover state\n                 */\n                enabled: true,\n                /**\n                 * The fill color of the marker in hover state. When\n                 * `undefined`, the series' or point's fillColor for normal\n                 * state is used.\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.marker.states.hover.fillColor\n                 */\n                /**\n                 * The color of the point marker's outline. When\n                 * `undefined`, the series' or point's lineColor for normal\n                 * state is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linecolor/\n                 *         White fill color, black line color\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.marker.states.hover.lineColor\n                 */\n                /**\n                 * The width of the point marker's outline. When\n                 * `undefined`, the series' or point's lineWidth for normal\n                 * state is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linewidth/\n                 *         3px line width\n                 *\n                 * @type      {number}\n                 * @apioption plotOptions.series.marker.states.hover.lineWidth\n                 */\n                /**\n                 * The radius of the point marker. In hover state, it\n                 * defaults to the normal state's radius + 2 as per the\n                 * [radiusPlus](#plotOptions.series.marker.states.hover.radiusPlus)\n                 * option.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-radius/\n                 *         10px radius\n                 *\n                 * @type      {number}\n                 * @apioption plotOptions.series.marker.states.hover.radius\n                 */\n                /**\n                 * The number of pixels to increase the radius of the\n                 * hovered point.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                 *         5 pixels greater radius on hover\n                 * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                 *         5 pixels greater radius on hover\n                 *\n                 * @since 4.0.3\n                 */\n                radiusPlus: 2,\n                /**\n                 * The additional line width for a hovered point.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                 *         2 pixels wider on hover\n                 * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                 *         2 pixels wider on hover\n                 *\n                 * @since 4.0.3\n                 */\n                lineWidthPlus: 1\n            },\n            /**\n             * The appearance of the point marker when selected. In order to\n             * allow a point to be selected, set the\n             * `series.allowPointSelect` option to true.\n             *\n             * @declare Highcharts.PointStatesSelectOptionsObject\n             */\n            select: {\n                /**\n                 * Enable or disable visible feedback for selection.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-enabled/\n                 *         Disabled select state\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @apioption plotOptions.series.marker.states.select.enabled\n                 */\n                /**\n                 * The radius of the point marker. In hover state, it\n                 * defaults to the normal state's radius + 2.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-radius/\n                 *         10px radius for selected points\n                 *\n                 * @type      {number}\n                 * @apioption plotOptions.series.marker.states.select.radius\n                 */\n                /**\n                 * The fill color of the point marker.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-fillcolor/\n                 *         Solid red discs for selected points\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                fillColor: \"#cccccc\" /* Palette.neutralColor20 */,\n                /**\n                 * The color of the point marker's outline. When\n                 * `undefined`, the series' or point's color is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linecolor/\n                 *         Red line color for selected points\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                lineColor: \"#000000\" /* Palette.neutralColor100 */,\n                /**\n                 * The width of the point marker's outline.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linewidth/\n                 *         3px line width for selected points\n                 */\n                lineWidth: 2\n            }\n        }\n    },\n    /**\n     * Properties for each single point.\n     *\n     * @declare Highcharts.PlotSeriesPointOptions\n     *\n     * @private\n     */\n    point: {\n        /**\n         * Fires when a point is clicked. One parameter, `event`, is passed\n         * to the function, containing common event information.\n         *\n         * If the `series.allowPointSelect` option is true, the default\n         * action for the point's click event is to toggle the point's\n         * select state. Returning `false` cancels this action.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-click/\n         *         Click marker to alert values\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-click-column/\n         *         Click column\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-click-url/\n         *         Go to URL\n         * @sample {highmaps} maps/plotoptions/series-point-events-click/\n         *         Click marker to display values\n         * @sample {highmaps} maps/plotoptions/series-point-events-click-url/\n         *         Go to URL\n         *\n         * @type      {Highcharts.PointClickCallbackFunction}\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.click\n         */\n        /**\n         * Fires when the mouse leaves the area close to the point. One\n         * parameter, `event`, is passed to the function, containing common\n         * event information.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n         *         Show values in the chart's corner on mouse over\n         *\n         * @type      {Highcharts.PointMouseOutCallbackFunction}\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.mouseOut\n         */\n        /**\n         * Fires when the mouse enters the area close to the point. One\n         * parameter, `event`, is passed to the function, containing common\n         * event information.\n         *\n         * Returning `false` cancels the default behavior, which is to show a\n         * tooltip for the point.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n         *         Show values in the chart's corner on mouse over\n         *\n         * @type      {Highcharts.PointMouseOverCallbackFunction}\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.mouseOver\n         */\n        /**\n         * Fires when the point is removed using the `.remove()` method. One\n         * parameter, `event`, is passed to the function. Returning `false`\n         * cancels the operation.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-remove/\n         *         Remove point and confirm\n         *\n         * @type      {Highcharts.PointRemoveCallbackFunction}\n         * @since     1.2.0\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.remove\n         */\n        /**\n         * Fires when the point is selected either programmatically or\n         * following a click on the point. One parameter, `event`, is passed\n         * to the function. Returning `false` cancels the operation.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-select/\n         *         Report the last selected point\n         * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n         *         Report select and unselect\n         *\n         * @type      {Highcharts.PointSelectCallbackFunction}\n         * @since     1.2.0\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.select\n         */\n        /**\n         * Fires when the point is unselected either programmatically or\n         * following a click on the point. One parameter, `event`, is passed\n         * to the function.\n         *  Returning `false` cancels the operation.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-unselect/\n         *         Report the last unselected point\n         * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n         *         Report select and unselect\n         *\n         * @type      {Highcharts.PointUnselectCallbackFunction}\n         * @since     1.2.0\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.unselect\n         */\n        /**\n         * Fires when the point is updated programmatically through the\n         * `.update()` method. One parameter, `event`, is passed to the\n         * function. The new point options can be accessed through\n         * `event.options`. Returning `false` cancels the operation.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-point-events-update/\n         *         Confirm point updating\n         *\n         * @type      {Highcharts.PointUpdateCallbackFunction}\n         * @since     1.2.0\n         * @context   Highcharts.Point\n         * @apioption plotOptions.series.point.events.update\n         */\n        /**\n         * Events for each single point.\n         *\n         * @declare Highcharts.PointEventsOptionsObject\n         */\n        events: {}\n    },\n    /**\n     * Options for the series data labels, appearing next to each data\n     * point.\n     *\n     * Since v6.2.0, multiple data labels can be applied to each single\n     * point by defining them as an array of configs.\n     *\n     * In styled mode, the data labels can be styled with the\n     * `.highcharts-data-label-box` and `.highcharts-data-label` class names\n     * ([see example](https://www.highcharts.com/samples/highcharts/css/series-datalabels)).\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled\n     *         Data labels enabled\n     * @sample {highcharts} highcharts/plotoptions/series-datalabels-multiple\n     *         Multiple data labels on a bar series\n     * @sample {highcharts} highcharts/css/series-datalabels\n     *         Styled mode example\n     * @sample {highmaps} maps/demo/color-axis\n     *         Choropleth map with data labels\n     * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n     *         Using data labels as map markers\n     *\n     * @type    {*|Array<*>}\n     * @product highcharts highstock highmaps gantt\n     *\n     * @private\n     */\n    dataLabels: {\n        /**\n         * Enable or disable the initial animation when a series is displayed\n         * for the `dataLabels`. The animation can also be set as a\n         * configuration object. Please note that this option only applies to\n         * the initial animation.\n         *\n         * For other animations, see [chart.animation](#chart.animation) and the\n         * animation parameter under the API methods. The following properties\n         * are supported:\n         *\n         * - `defer`: The animation delay time in milliseconds.\n         *\n         * @sample {highcharts} highcharts/plotoptions/animation-defer/\n         *          Animation defer settings\n         *\n         * @type      {boolean|Partial<Highcharts.AnimationOptionsObject>}\n         * @since     8.2.0\n         * @apioption plotOptions.series.dataLabels.animation\n         */\n        animation: {},\n        /**\n         * The animation delay time in milliseconds. Set to `0` to render the\n         * data labels immediately. As `undefined` inherits defer time from the\n         * [series.animation.defer](#plotOptions.series.animation.defer).\n         *\n         * @type      {number}\n         * @since     8.2.0\n         * @apioption plotOptions.series.dataLabels.animation.defer\n         */\n        /**\n         * The alignment of the data label compared to the point. If `right`,\n         * the right side of the label should be touching the point. For points\n         * with an extent, like columns, the alignments also dictates how to\n         * align it inside the box, as given with the\n         * [inside](#plotOptions.column.dataLabels.inside) option. Can be one of\n         * `left`, `center` or `right`.\n         *\n         * @sample {highcharts}\n         *         highcharts/plotoptions/series-datalabels-align-left/ Left\n         *         aligned\n         * @sample {highcharts}\n         *         highcharts/plotoptions/bar-datalabels-align-inside-bar/ Data\n         *         labels inside the bar\n         *\n         * @type {Highcharts.AlignValue|null}\n         */\n        align: 'center',\n        /**\n         * Alignment method for data labels. If set to `plotEdges`, the labels\n         * are aligned within the plot area in the direction of the y-axis. So\n         * in a regular column chart, the labels are aligned vertically\n         * according to the `verticalAlign` setting. In a bar chart, which is\n         * inverted, the labels are aligned horizontally according to the\n         * `align` setting. Applies to cartesian series only.\n         *\n         * @sample {highcharts} highcharts/series-bar/datalabels-alignto/\n         *         Align to plot edges\n         *\n         * @type      {string}\n         * @since 11.4.2\n         * @apioption plotOptions.series.dataLabels.alignTo\n         */\n        /**\n         * Whether to allow data labels to overlap. To make the labels less\n         * sensitive for overlapping, the\n         * [dataLabels.padding](#plotOptions.series.dataLabels.padding)\n         * can be set to 0.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-allowoverlap-false/\n         *         Don't allow overlap\n         *\n         * @type      {boolean}\n         * @default   false\n         * @since     4.1.0\n         * @apioption plotOptions.series.dataLabels.allowOverlap\n         */\n        /**\n         * The background color or gradient for the data label. Setting it to\n         * `auto` will use the point's color.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         * @sample {highmaps} maps/demo/mappoint-datalabels-mapmarker\n         *         Data labels as map markers\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @since     2.2.1\n         * @apioption plotOptions.series.dataLabels.backgroundColor\n         */\n        /**\n         * The border color for the data label. Setting it to `auto` will use\n         * the point's color. Defaults to `undefined`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @since     2.2.1\n         * @apioption plotOptions.series.dataLabels.borderColor\n         */\n        /**\n         * The border radius in pixels for the data label.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.2.1\n         * @apioption plotOptions.series.dataLabels.borderRadius\n         */\n        /**\n         * The border width in pixels for the data label.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.2.1\n         * @apioption plotOptions.series.dataLabels.borderWidth\n         */\n        borderWidth: 0,\n        /**\n         * A class name for the data label. Particularly in styled mode,\n         * this can be used to give each series' or point's data label\n         * unique styling. In addition to this option, a default color class\n         * name is added so that we can give the labels a contrast text\n         * shadow.\n         *\n         * @sample {highcharts} highcharts/css/data-label-contrast/\n         *         Contrast text shadow\n         * @sample {highcharts} highcharts/css/series-datalabels/\n         *         Styling by CSS\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @apioption plotOptions.series.dataLabels.className\n         */\n        /**\n         * This options is deprecated.\n         * Use [style.color](#plotOptions.series.dataLabels.style) instead.\n         *\n         * The text color for the data labels. Defaults to `undefined`. For\n         * certain series types, like column or map, the data labels can be\n         * drawn inside the points. In this case the data label will be\n         * drawn with maximum contrast by default. Additionally, it will be\n         * given a `text-outline` style with the opposite color, to further\n         * increase the contrast. This can be overridden by setting the\n         * `text-outline` style to `none` in the `dataLabels.style` option.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-color/\n         *         Red data labels\n         * @sample {highmaps} maps/demo/color-axis/\n         *         White data labels\n         *\n         * @see [style.color](#plotOptions.series.dataLabels.style)\n         *\n         * @type       {Highcharts.ColorType}\n         * @deprecated 10.3\n         * @apioption  plotOptions.series.dataLabels.color\n         */\n        /**\n         * Whether to hide data labels that are outside the plot area. By\n         * default, the data label is moved inside the plot area according\n         * to the\n         * [overflow](#plotOptions.series.dataLabels.overflow)\n         * option.\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     2.3.3\n         * @apioption plotOptions.series.dataLabels.crop\n         */\n        /**\n         * Whether to defer displaying the data labels until the initial\n         * series animation has finished. Setting to `false` renders the\n         * data label immediately. If set to `true` inherits the defer\n         * time set in [plotOptions.series.animation](#plotOptions.series.animation).\n         *\n         * @since     4.0.0\n         * @type      {boolean}\n         * @product   highcharts highstock gantt\n         */\n        defer: true,\n        /**\n         * Enable or disable the data labels.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled/\n         *         Data labels enabled\n         * @sample {highmaps} maps/demo/color-axis/\n         *         Data labels enabled\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption plotOptions.series.dataLabels.enabled\n         */\n        /**\n         * A declarative filter to control of which data labels to display.\n         * The declarative filter is designed for use when callback\n         * functions are not available, like when the chart options require\n         * a pure JSON structure or for use with graphical editors. For\n         * programmatic control, use the `formatter` instead, and return\n         * `undefined` to disable a single data label.\n         *\n         * @example\n         * filter: {\n         *     property: 'percentage',\n         *     operator: '>',\n         *     value: 4\n         * }\n         *\n         * @sample {highcharts} highcharts/demo/pie-monochrome\n         *         Data labels filtered by percentage\n         *\n         * @declare   Highcharts.DataLabelsFilterOptionsObject\n         * @since     6.0.3\n         * @apioption plotOptions.series.dataLabels.filter\n         */\n        /**\n         * The operator to compare by. Can be one of `>`, `<`, `>=`, `<=`,\n         * `==`, `===`, `!=` and `!==`.\n         *\n         * @type       {string}\n         * @validvalue [\">\", \"<\", \">=\", \"<=\", \"==\", \"===\", \"!=\", \"!==\"]\n         * @apioption  plotOptions.series.dataLabels.filter.operator\n         */\n        /**\n         * The point property to filter by. Point options are passed\n         * directly to properties, additionally there are `y` value,\n         * `percentage` and others listed under {@link Highcharts.Point}\n         * members.\n         *\n         * @type      {string}\n         * @apioption plotOptions.series.dataLabels.filter.property\n         */\n        /**\n         * The value to compare against.\n         *\n         * @type      {number}\n         * @apioption plotOptions.series.dataLabels.filter.value\n         */\n        /**\n         * A\n         * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n         * for the data label. Available variables are the same as for\n         * `formatter`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n         *         Add a unit\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-format-subexpression/\n         *         Complex logic in the format string\n         * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n         *         Formatted value in the data label\n         *\n         * @type      {string}\n         * @default   y\n         * @default   point.value\n         * @since     3.0\n         * @apioption plotOptions.series.dataLabels.format\n         */\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Callback JavaScript function to format the data label. Note that if a\n         * `format` is defined, the format takes precedence and the formatter is\n         * ignored.\n         *\n         * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n         *         Formatted value\n         *\n         * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n         */\n        formatter: function () {\n            const { numberFormatter } = this.series.chart;\n            return typeof this.y !== 'number' ?\n                '' : numberFormatter(this.y, -1);\n        },\n        /**\n         * For points with an extent, like columns or map areas, whether to\n         * align the data label inside the box or to the actual value point.\n         * Defaults to `false` in most cases, `true` in stacked columns.\n         *\n         * @type      {boolean}\n         * @since     3.0\n         * @apioption plotOptions.series.dataLabels.inside\n         */\n        /**\n         * Format for points with the value of null. Works analogously to\n         * [format](#plotOptions.series.dataLabels.format). `nullFormat` can\n         * be applied only to series which support displaying null points\n         * i.e `heatmap` or `tilemap`. Does not work with series that don't\n         * display null points, like `line`, `column`, `bar` or `pie`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n         *         Format data label for null points in heat map\n         *\n         * @type      {boolean|string}\n         * @since     7.1.0\n         * @apioption plotOptions.series.dataLabels.nullFormat\n         */\n        /**\n         * Callback JavaScript function that defines formatting for points\n         * with the value of null. Works analogously to\n         * [formatter](#plotOptions.series.dataLabels.formatter).\n         * `nullFormatter` can be applied only to series which support\n         * displaying null points i.e `heatmap` or `tilemap`. Does not work\n         * with series that don't display null points, like `line`, `column`,\n         * `bar` or `pie`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-nullformat/\n         *         Format data label for null points in heat map\n         *\n         * @type      {Highcharts.DataLabelsFormatterCallbackFunction}\n         * @since     7.1.0\n         * @apioption plotOptions.series.dataLabels.nullFormatter\n         */\n        /**\n         * How to handle data labels that flow outside the plot area. The\n         * default is `\"justify\"`, which aligns them inside the plot area.\n         * For columns and bars, this means it will be moved inside the bar.\n         * To display data labels outside the plot area, set `crop` to\n         * `false` and `overflow` to `\"allow\"`.\n         *\n         * @type       {Highcharts.DataLabelsOverflowValue}\n         * @default    justify\n         * @since      3.0.6\n         * @apioption  plotOptions.series.dataLabels.overflow\n         */\n        /**\n         * When either the `borderWidth` or the `backgroundColor` is set,\n         * this is the padding within the box.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         *\n         * @since 2.2.1\n         */\n        padding: 5,\n        /**\n         * Aligns data labels relative to points. If `center` alignment is\n         * not possible, it defaults to `right`.\n         *\n         * @type      {Highcharts.AlignValue}\n         * @default   center\n         * @apioption plotOptions.series.dataLabels.position\n         */\n        /**\n         * Text rotation in degrees. Note that due to a more complex\n         * structure, backgrounds, borders and padding will be lost on a\n         * rotated data label.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n         *         Vertical labels\n         *\n         * @type      {number}\n         * @default   0\n         * @apioption plotOptions.series.dataLabels.rotation\n         */\n        /**\n         * The shadow of the box. Works best with `borderWidth` or\n         * `backgroundColor`. Since 2.3 the shadow can be an object\n         * configuration containing `color`, `offsetX`, `offsetY`, `opacity`\n         * and `width`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n         *         Data labels box options\n         *\n         * @type      {boolean|Highcharts.ShadowOptionsObject}\n         * @default   false\n         * @since     2.2.1\n         * @apioption plotOptions.series.dataLabels.shadow\n         */\n        /**\n         * The name of a symbol to use for the border around the label.\n         * Symbols are predefined functions on the Renderer object.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-shape/\n         *         A callout for annotations\n         *\n         * @type      {string}\n         * @default   square\n         * @since     4.1.2\n         * @apioption plotOptions.series.dataLabels.shape\n         */\n        /**\n         * Styles for the label. The default `color` setting is\n         * `\"contrast\"`, which is a pseudo color that Highcharts picks up\n         * and applies the maximum contrast to the underlying point item,\n         * for example the bar in a bar chart.\n         *\n         * The `textOutline` is a pseudo property that applies an outline of\n         * the given width with the given color, which by default is the\n         * maximum contrast to the text. So a bright text color will result\n         * in a black text outline for maximum readability on a mixed\n         * background. In some cases, especially with grayscale text, the\n         * text outline doesn't work well, in which cases it can be disabled\n         * by setting it to `\"none\"`. When `useHTML` is true, the\n         * `textOutline` will not be picked up. In this, case, the same\n         * effect can be acheived through the `text-shadow` CSS property.\n         *\n         * For some series types, where each point has an extent, like for\n         * example tree maps, the data label may overflow the point. There\n         * are two strategies for handling overflow. By default, the text\n         * will wrap to multiple lines. The other strategy is to set\n         * `style.textOverflow` to `ellipsis`, which will keep the text on\n         * one line plus it will break inside long words.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-style/\n         *         Bold labels\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow/\n         *         Long labels truncated with an ellipsis in a pie\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap/\n         *         Long labels are wrapped in a pie\n         * @sample {highmaps} maps/demo/color-axis/\n         *         Bold labels\n         *\n         * @type      {Highcharts.CSSObject}\n         * @since     4.1.0\n         * @apioption plotOptions.series.dataLabels.style\n         */\n        style: {\n            /** @internal */\n            fontSize: '0.7em',\n            /** @internal */\n            fontWeight: 'bold',\n            /** @internal */\n            color: 'contrast',\n            /** @internal */\n            textOutline: '1px contrast'\n        },\n        /**\n         * Options for a label text which should follow marker's shape.\n         * Border and background are disabled for a label that follows a\n         * path.\n         *\n         * **Note:** Only SVG-based renderer supports this option. Setting\n         * `useHTML` to true will disable this option.\n         *\n         * @declare   Highcharts.DataLabelsTextPathOptionsObject\n         * @since     7.1.0\n         * @apioption plotOptions.series.dataLabels.textPath\n         */\n        /**\n         * Presentation attributes for the text path.\n         *\n         * @type      {Highcharts.SVGAttributes}\n         * @since     7.1.0\n         * @apioption plotOptions.series.dataLabels.textPath.attributes\n         */\n        /**\n         * Enable or disable `textPath` option for link's or marker's data\n         * labels.\n         *\n         * @type      {boolean}\n         * @since     7.1.0\n         * @apioption plotOptions.series.dataLabels.textPath.enabled\n         */\n        /**\n         * Whether to\n         * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n         * to render the labels.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @apioption plotOptions.series.dataLabels.useHTML\n         */\n        /**\n         * The vertical alignment of a data label. Can be one of `top`,\n         * `middle` or `bottom`. The default value depends on the data, for\n         * instance in a column chart, the label is above positive values\n         * and below negative values.\n         *\n         * @type  {Highcharts.VerticalAlignValue|null}\n         * @since 2.3.3\n         */\n        verticalAlign: 'bottom',\n        /**\n         * The x position offset of the label relative to the point in\n         * pixels.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n         *         Vertical and positioned\n         * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n         *         Data labels inside the bar\n         */\n        x: 0,\n        /**\n         * The z index of the data labels. Use a `zIndex` of 6 to display it above\n         * the series, or use a `zIndex` of 2 to display it behind the series.\n         *\n         * @type      {number}\n         * @default   6\n         * @since     2.3.5\n         * @apioption plotOptions.series.dataLabels.zIndex\n         */\n        /**\n         * The y position offset of the label relative to the point in\n         * pixels.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n         *         Vertical and positioned\n         */\n        y: 0\n    },\n    /**\n     * When the series contains less points than the crop threshold, all\n     * points are drawn, even if the points fall outside the visible plot\n     * area at the current zoom. The advantage of drawing all points\n     * (including markers and columns), is that animation is performed on\n     * updates. On the other hand, when the series contains more points than\n     * the crop threshold, the series data is cropped to only contain points\n     * that fall within the plot area. The advantage of cropping away\n     * invisible points is to increase performance on large series.\n     *\n     * @since   2.2\n     * @product highcharts highstock\n     *\n     * @private\n     */\n    cropThreshold: 300,\n    /**\n     * Opacity of a series parts: line, fill (e.g. area) and dataLabels.\n     *\n     * @see [states.inactive.opacity](#plotOptions.series.states.inactive.opacity)\n     *\n     * @since 7.1.0\n     *\n     * @private\n     */\n    opacity: 1,\n    /**\n     * The width of each point on the x axis. For example in a column chart\n     * with one value each day, the pointRange would be 1 day (= 24 * 3600\n     * * 1000 milliseconds). This is normally computed automatically, but\n     * this option can be used to override the automatic value.\n     *\n     * @product highstock\n     *\n     * @private\n     */\n    pointRange: 0,\n    /**\n     * When this is true, the series will not cause the Y axis to cross\n     * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n     * unless the data actually crosses the plane.\n     *\n     * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n     * 3 will make the Y axis show negative values according to the\n     * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n     * at 0.\n     *\n     * @since   4.1.9\n     * @product highcharts highstock\n     *\n     * @private\n     */\n    softThreshold: true,\n    /**\n     * @declare Highcharts.SeriesStatesOptionsObject\n     *\n     * @private\n     */\n    states: {\n        /**\n         * The normal state of a series, or for point items in column, pie\n         * and similar series. Currently only used for setting animation\n         * when returning to normal state from hover.\n         *\n         * @declare Highcharts.SeriesStatesNormalOptionsObject\n         */\n        normal: {\n            /**\n             * Animation when returning to normal state after hovering.\n             *\n                 * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n             */\n            animation: true\n        },\n        /**\n         * Options for the hovered series. These settings override the\n         * normal state options when a series is moused over or touched.\n         *\n         * @declare Highcharts.SeriesStatesHoverOptionsObject\n         */\n        hover: {\n            /**\n             * Enable separate styles for the hovered series to visualize\n             * that the user hovers either the series itself or the legend.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-pie/\n             *         Pie\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     1.2\n             * @apioption plotOptions.series.states.hover.enabled\n             */\n            /**\n             * Animation setting for hovering the graph in line-type series.\n             *\n             * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n             * @since   5.0.8\n             * @product highcharts highstock\n             */\n            animation: {\n                /**\n                 * The duration of the hover animation in milliseconds. By\n                 * default the hover state animates quickly in, and slowly\n                 * back to normal.\n                 *\n                 * @internal\n                 */\n                duration: 150\n            },\n            /**\n             * Pixel width of the graph line. By default this property is\n             * undefined, and the `lineWidthPlus` property dictates how much\n             * to increase the linewidth from normal state.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidth/\n             *         5px line on hover\n             *\n             * @type      {number}\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.states.hover.lineWidth\n             */\n            /**\n             * The additional line width for the graph of a hovered series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n             *         5 pixels wider\n             * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n             *         5 pixels wider\n             *\n             * @since   4.0.3\n             * @product highcharts highstock\n             */\n            lineWidthPlus: 1,\n            /**\n             * In Highcharts 1.0, the appearance of all markers belonging\n             * to the hovered series. For settings on the hover state of the\n             * individual point, see\n             * [marker.states.hover](#plotOptions.series.marker.states.hover).\n             *\n             * @deprecated\n             *\n             * @extends   plotOptions.series.marker\n             * @excluding states, symbol\n             * @product   highcharts highstock\n             */\n            marker: {\n            // `lineWidth: base + 1`,\n            // `radius: base + 1`\n            },\n            /**\n             * Options for the halo appearing around the hovered point in\n             * line-type series as well as outside the hovered slice in pie\n             * charts. By default the halo is filled by the current point or\n             * series color with an opacity of 0.25\\. The halo can be\n             * disabled by setting the `halo` option to `null`.\n             *\n             * In styled mode, the halo is styled with the\n             * `.highcharts-halo` class, with colors inherited from\n             * `.highcharts-color-{n}`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/halo/\n             *         Halo options\n             * @sample {highstock} highcharts/plotoptions/halo/\n             *         Halo options\n             *\n             * @declare Highcharts.SeriesStatesHoverHaloOptionsObject\n             * @type    {null|*}\n             * @since   4.0\n             * @product highcharts highstock\n             */\n            halo: {\n                /**\n                 * A collection of SVG attributes to override the appearance\n                 * of the halo, for example `fill`, `stroke` and\n                 * `stroke-width`.\n                 *\n                 * @type      {Highcharts.SVGAttributes}\n                 * @since     4.0\n                 * @product   highcharts highstock\n                 * @apioption plotOptions.series.states.hover.halo.attributes\n                 */\n                /**\n                 * The pixel size of the halo. For point markers this is the\n                 * radius of the halo. For pie slices it is the width of the\n                 * halo outside the slice. For bubbles it defaults to 5 and\n                 * is the width of the halo outside the bubble.\n                 *\n                 * @since   4.0\n                 * @product highcharts highstock\n                 */\n                size: 10,\n                /**\n                 * Opacity for the halo unless a specific fill is overridden\n                 * using the `attributes` setting. Note that Highcharts is\n                 * only able to apply opacity to colors of hex or rgb(a)\n                 * formats.\n                 *\n                 * @since   4.0\n                 * @product highcharts highstock\n                 */\n                opacity: 0.25\n            }\n        },\n        /**\n         * Specific options for point in selected states, after being\n         * selected by\n         * [allowPointSelect](#plotOptions.series.allowPointSelect)\n         * or programmatically.\n         *\n         * @sample maps/plotoptions/series-allowpointselect/\n         *         Allow point select demo\n         *\n         * @declare   Highcharts.SeriesStatesSelectOptionsObject\n         * @extends   plotOptions.series.states.hover\n         * @excluding brightness\n         */\n        select: {\n            animation: {\n                /** @internal */\n                duration: 0\n            }\n        },\n        /**\n         * The opposite state of a hover for series.\n         *\n         * @sample highcharts/plotoptions/series-states-inactive-disabled\n         *         Disabled inactive state\n         *\n         * @declare Highcharts.SeriesStatesInactiveOptionsObject\n         */\n        inactive: {\n            /**\n             * Enable or disable the inactive state for a series\n             *\n             * @sample highcharts/plotoptions/series-states-inactive-disabled\n             *         Disabled inactive state\n             *\n             * @type {boolean}\n             * @default true\n             * @apioption plotOptions.series.states.inactive.enabled\n             */\n            /**\n             * The animation for entering the inactive state.\n             *\n             * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n             */\n            animation: {\n                /** @internal */\n                duration: 150\n            },\n            /**\n             * Opacity of series elements (dataLabels, line, area).\n             *\n             * @type {number}\n             */\n            opacity: 0.2\n        }\n    },\n    /**\n     * Sticky tracking of mouse events. When true, the `mouseOut` event on a\n     * series isn't triggered until the mouse moves over another series, or\n     * out of the plot area. When false, the `mouseOut` event on a series is\n     * triggered when the mouse leaves the area around the series' graph or\n     * markers. This also implies the tooltip when not shared. When\n     * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n     * will be hidden when moving the mouse between series. Defaults to true\n     * for line and area type series, but to false for columns, pies etc.\n     *\n     * **Note:** The boost module will force this option because of\n     * technical limitations.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-stickytracking-true/\n     *         True by default\n     * @sample {highcharts} highcharts/plotoptions/series-stickytracking-false/\n     *         False\n     *\n     * @default {highcharts} true\n     * @default {highstock} true\n     * @default {highmaps} false\n     * @since   2.0\n     *\n     * @private\n     */\n    stickyTracking: true,\n    /**\n     * A configuration object for the tooltip rendering of each single\n     * series. Properties are inherited from [tooltip](#tooltip), but only\n     * the following properties can be defined on a series level.\n     *\n     * @declare   Highcharts.SeriesTooltipOptionsObject\n     * @since     2.3\n     * @extends   tooltip\n     * @excluding animation, backgroundColor, borderColor, borderRadius,\n     *            borderWidth, className, crosshairs, enabled, formatter,\n     *            headerShape, hideDelay, outside, padding, positioner,\n     *            shadow, shape, shared, snap, split, stickOnContact,\n     *            style, useHTML\n     * @apioption plotOptions.series.tooltip\n     */\n    /**\n     * When a series contains a `data` array that is longer than this, the\n     * Series class looks for data configurations of plain numbers or arrays of\n     * numbers. The first and last valid points are checked. If found, the rest\n     * of the data is assumed to be the same. This saves expensive data checking\n     * and indexing in long series, and makes data-heavy charts render faster.\n     *\n     * Set it to `0` disable.\n     *\n     * Note:\n     * - In boost mode turbo threshold is forced. Only array of numbers or two\n     *   dimensional arrays are allowed.\n     * - In version 11.4.3 and earlier, if object configurations were passed\n     *   beyond the turbo threshold, a warning was logged in the console and the\n     *   data series didn't render.\n     *\n     * @since   2.2\n     * @product highcharts highstock gantt\n     *\n     * @private\n     */\n    turboThreshold: 1000,\n    /**\n     * An array defining zones within a series. Zones can be applied to the\n     * X axis, Y axis or Z axis for bubbles, according to the `zoneAxis`\n     * option. The zone definitions have to be in ascending order regarding\n     * to the value.\n     *\n     * In styled mode, the color zones are styled with the\n     * `.highcharts-zone-{n}` class, or custom classed from the `className`\n     * option\n     * ([view live demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/color-zones/)).\n     *\n     * @see [zoneAxis](#plotOptions.series.zoneAxis)\n     *\n     * @sample {highcharts} highcharts/series/color-zones-simple/\n     *         Color zones\n     * @sample {highstock} highcharts/series/color-zones-simple/\n     *         Color zones\n     *\n     * @declare   Highcharts.SeriesZonesOptionsObject\n     * @type      {Array<*>}\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zones\n     */\n    /**\n     * Styled mode only. A custom class name for the zone.\n     *\n     * @sample highcharts/css/color-zones/\n     *         Zones styled by class name\n     *\n     * @type      {string}\n     * @since     5.0.0\n     * @apioption plotOptions.series.zones.className\n     */\n    /**\n     * Defines the color of the series.\n     *\n     * @see [series color](#plotOptions.series.color)\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zones.color\n     */\n    /**\n     * A name for the dash style to use for the graph.\n     *\n     * @see [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n     *\n     * @sample {highcharts|highstock} highcharts/series/color-zones-dashstyle-dot/\n     *         Dashed line indicates prognosis\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zones.dashStyle\n     */\n    /**\n     * Defines the fill color for the series (in area type series)\n     *\n     * @see [fillColor](#plotOptions.area.fillColor)\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zones.fillColor\n     */\n    /**\n     * The value up to where the zone extends, if undefined the zones\n     * stretches to the last value in the series.\n     *\n     * @type      {number}\n     * @since     4.1.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.series.zones.value\n     */\n    /**\n     * When using dual or multiple color axes, this number defines which\n     * colorAxis the particular series is connected to. It refers to\n     * either the\n     * {@link #colorAxis.id|axis id}\n     * or the index of the axis in the colorAxis array, with 0 being the\n     * first. Set this option to false to prevent a series from connecting\n     * to the default color axis.\n     *\n     * Since v7.2.0 the option can also be an axis id or an axis index\n     * instead of a boolean flag.\n     *\n     * @sample highcharts/coloraxis/coloraxis-with-pie/\n     *         Color axis with pie series\n     * @sample highcharts/coloraxis/multiple-coloraxis/\n     *         Multiple color axis\n     *\n     * @type      {number|string|boolean}\n     * @default   0\n     * @product   highcharts highstock highmaps\n     * @apioption plotOptions.series.colorAxis\n     */\n    /**\n     * Determines what data value should be used to calculate point color\n     * if `colorAxis` is used. Requires to set `min` and `max` if some\n     * custom point property is used or if approximation for data grouping\n     * is set to `'sum'`.\n     *\n     * @sample highcharts/coloraxis/custom-color-key/\n     *         Custom color key\n     * @sample highcharts/coloraxis/color-key-with-stops/\n     *         Custom colorKey with color axis stops\n     * @sample highcharts/coloraxis/changed-default-color-key/\n     *         Changed default color key\n     *\n     * @type      {string}\n     * @default   y\n     * @since     7.2.0\n     * @product   highcharts highstock highmaps\n     * @apioption plotOptions.series.colorKey\n     */\n    /**\n     * What type of legend symbol to render for this series. Can be one of\n     * `areaMarker`, `lineMarker` or `rectangle`.\n     *\n     * @validvalue [\"areaMarker\", \"lineMarker\", \"rectangle\"]\n     *\n     * @sample {highcharts} highcharts/series/legend-symbol/\n     *         Change the legend symbol\n     *\n     * @type      {string}\n     * @default   rectangle\n     * @since     11.0.1\n     * @apioption plotOptions.series.legendSymbol\n     */\n    /**\n     * Determines whether the series should look for the nearest point\n     * in both dimensions or just the x-dimension when hovering the series.\n     * Defaults to `'xy'` for scatter series and `'x'` for most other\n     * series. If the data has duplicate x-values, it is recommended to\n     * set this to `'xy'` to allow hovering over all points.\n     *\n     * Applies only to series types using nearest neighbor search (not\n     * direct hover) for tooltip.\n     *\n     * @sample {highcharts} highcharts/series/findnearestpointby/\n     *         Different hover behaviors\n     * @sample {highstock} highcharts/series/findnearestpointby/\n     *         Different hover behaviors\n     * @sample {highmaps} highcharts/series/findnearestpointby/\n     *         Different hover behaviors\n     *\n     * @since      5.0.10\n     * @validvalue [\"x\", \"xy\"]\n     *\n     * @private\n     */\n    findNearestPointBy: 'x'\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default seriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Globals.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport Point from './Point.js';\nimport U from '../Utilities.js';\nconst { extend, extendClass, merge } = U;\n/* *\n *\n *  Namespace\n *\n * */\nvar SeriesRegistry;\n(function (SeriesRegistry) {\n    /* *\n     *\n     *  Properties\n     *\n     * */\n    /**\n     * @internal\n     * @todo Move `Globals.seriesTypes` code to her.\n     */\n    SeriesRegistry.seriesTypes = H.seriesTypes;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Registers class pattern of a series.\n     *\n     * @private\n     */\n    function registerSeriesType(seriesType, SeriesClass) {\n        const defaultPlotOptions = defaultOptions.plotOptions || {}, seriesOptions = SeriesClass.defaultOptions, seriesProto = SeriesClass.prototype;\n        seriesProto.type = seriesType;\n        if (!seriesProto.pointClass) {\n            seriesProto.pointClass = Point;\n        }\n        if (SeriesRegistry.seriesTypes[seriesType]) {\n            return false;\n        }\n        if (seriesOptions) {\n            defaultPlotOptions[seriesType] = seriesOptions;\n        }\n        SeriesRegistry.seriesTypes[seriesType] = SeriesClass;\n        return true;\n    }\n    SeriesRegistry.registerSeriesType = registerSeriesType;\n    /**\n     * Old factory to create new series prototypes.\n     *\n     * @deprecated\n     * @function Highcharts.seriesType\n     *\n     * @param {string} type\n     * The series type name.\n     *\n     * @param {string} parent\n     * The parent series type name. Use `line` to inherit from the basic\n     * {@link Series} object.\n     *\n     * @param {Highcharts.SeriesOptionsType|Highcharts.Dictionary<*>} options\n     * The additional default options that are merged with the parent's options.\n     *\n     * @param {Highcharts.Dictionary<*>} [props]\n     * The properties (functions and primitives) to set on the new prototype.\n     *\n     * @param {Highcharts.Dictionary<*>} [pointProps]\n     * Members for a series-specific extension of the {@link Point} prototype if\n     * needed.\n     *\n     * @return {Highcharts.Series}\n     * The newly created prototype as extended from {@link Series} or its\n     * derivatives.\n     */\n    function seriesType(type, parent, options, seriesProto, pointProto) {\n        const defaultPlotOptions = defaultOptions.plotOptions || {};\n        parent = parent || '';\n        // Merge the options\n        defaultPlotOptions[type] = merge(defaultPlotOptions[parent], options);\n        // Create the class\n        delete SeriesRegistry.seriesTypes[type];\n        registerSeriesType(type, extendClass(SeriesRegistry.seriesTypes[parent] || function () { }, seriesProto));\n        SeriesRegistry.seriesTypes[type].prototype.type = type;\n        // Create the point class if needed\n        if (pointProto) {\n            class PointClass extends Point {\n            }\n            extend(PointClass.prototype, pointProto);\n            SeriesRegistry.seriesTypes[type].prototype.pointClass = PointClass;\n        }\n        return SeriesRegistry.seriesTypes[type];\n    }\n    SeriesRegistry.seriesType = seriesType;\n})(SeriesRegistry || (SeriesRegistry = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default SeriesRegistry;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport D from './Defaults.js';\nconst { defaultOptions, defaultTime } = D;\nimport U from './Utilities.js';\nconst { extend, getNestedProperty, isArray, isNumber, isObject, pick, pInt } = U;\nconst helpers = {\n    // Built-in helpers\n    add: (a, b) => a + b,\n    divide: (a, b) => (b !== 0 ? a / b : ''),\n    // eslint-disable-next-line eqeqeq\n    eq: (a, b) => a == b,\n    each: function (arr) {\n        const match = arguments[arguments.length - 1];\n        return isArray(arr) ?\n            arr.map((item, i) => format(match.body, extend(isObject(item) ? item : { '@this': item }, {\n                '@index': i,\n                '@first': i === 0,\n                '@last': i === arr.length - 1\n            }))).join('') :\n            false;\n    },\n    ge: (a, b) => a >= b,\n    gt: (a, b) => a > b,\n    'if': (condition) => !!condition,\n    le: (a, b) => a <= b,\n    lt: (a, b) => a < b,\n    multiply: (a, b) => a * b,\n    // eslint-disable-next-line eqeqeq\n    ne: (a, b) => a != b,\n    subtract: (a, b) => a - b,\n    unless: (condition) => !condition\n};\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n * human readable date string. The format is a subset of the formats for PHP's\n * [strftime](https://www.php.net/manual/en/function.strftime.php) function.\n * Additional formats can be given in the {@link Highcharts.dateFormats} hook.\n *\n * Since v6.0.5, all internal dates are formatted through the\n * {@link Highcharts.Chart#time} instance to respect chart-level time settings.\n * The `Highcharts.dateFormat` function only reflects global time settings set\n * with `setOptions`.\n *\n * Supported format keys:\n * - `%a`: Short weekday, like 'Mon'\n * - `%A`: Long weekday, like 'Monday'\n * - `%d`: Two digit day of the month, 01 to 31\n * - `%e`: Day of the month, 1 through 31\n * - `%w`: Day of the week, 0 through 6\n * - `%b`: Short month, like 'Jan'\n * - `%B`: Long month, like 'January'\n * - `%m`: Two digit month number, 01 through 12\n * - `%y`: Two digits year, like 09 for 2009\n * - `%Y`: Four digits year, like 2009\n * - `%H`: Two digits hours in 24h format, 00 through 23\n * - `%k`: Hours in 24h format, 0 through 23\n * - `%I`: Two digits hours in 12h format, 00 through 11\n * - `%l`: Hours in 12h format, 1 through 12\n * - `%M`: Two digits minutes, 00 through 59\n * - `%p`: Upper case AM or PM\n * - `%P`: Lower case AM or PM\n * - `%S`: Two digits seconds, 00 through 59\n * - `%L`: Milliseconds (naming from Ruby)\n *\n * @function Highcharts.dateFormat\n *\n * @param {string} format\n *        The desired format where various time representations are prefixed\n *        with `%`.\n *\n * @param {number} timestamp\n *        The JavaScript timestamp.\n *\n * @param {boolean} [capitalize=false]\n *        Upper case first letter in the return.\n *\n * @return {string}\n *         The formatted date.\n */\nfunction dateFormat(format, timestamp, capitalize) {\n    return defaultTime.dateFormat(format, timestamp, capitalize);\n}\n/**\n * Format a string according to a subset of the rules of Python's String.format\n * method.\n *\n * @example\n * let s = Highcharts.format(\n *     'The {color} fox was {len:.2f} feet long',\n *     { color: 'red', len: Math.PI }\n * );\n * // => The red fox was 3.14 feet long\n *\n * @function Highcharts.format\n *\n * @param {string} str\n *        The string to format.\n *\n * @param {Record<string, *>} ctx\n *        The context, a collection of key-value pairs where each key is\n *        replaced by its value.\n *\n * @param {Highcharts.Chart} [chart]\n *        A `Chart` instance used to get numberFormatter and time.\n *\n * @return {string}\n *         The formatted string.\n */\nfunction format(str = '', ctx, chart) {\n    const regex = /\\{([\\w\\:\\.\\,;\\-\\/<>%@\"'’= #\\(\\)]+)\\}/g, \n    // The sub expression regex is the same as the top expression regex,\n    // but except parens and block helpers (#), and surrounded by parens\n    // instead of curly brackets.\n    subRegex = /\\(([\\w\\:\\.\\,;\\-\\/<>%@\"'= ]+)\\)/g, matches = [], floatRegex = /f$/, decRegex = /\\.(\\d)/, lang = defaultOptions.lang, time = chart && chart.time || defaultTime, numberFormatter = chart && chart.numberFormatter || numberFormat;\n    /*\n     * Get a literal or variable value inside a template expression. May be\n     * extended with other types like string or null if needed, but keep it\n     * small for now.\n     */\n    const resolveProperty = (key = '') => {\n        let n;\n        // Literals\n        if (key === 'true') {\n            return true;\n        }\n        if (key === 'false') {\n            return false;\n        }\n        if ((n = Number(key)).toString() === key) {\n            return n;\n        }\n        // Variables and constants\n        return getNestedProperty(key, ctx);\n    };\n    let match, currentMatch, depth = 0, hasSub;\n    // Parse and create tree\n    while ((match = regex.exec(str)) !== null) {\n        // When a sub expression is found, it is evaluated first, and the\n        // results recursively evaluated until no subexpression exists.\n        const subMatch = subRegex.exec(match[1]);\n        if (subMatch) {\n            match = subMatch;\n            hasSub = true;\n        }\n        if (!currentMatch || !currentMatch.isBlock) {\n            currentMatch = {\n                ctx,\n                expression: match[1],\n                find: match[0],\n                isBlock: match[1].charAt(0) === '#',\n                start: match.index,\n                startInner: match.index + match[0].length,\n                length: match[0].length\n            };\n        }\n        // Identify helpers\n        const fn = match[1].split(' ')[0].replace('#', '');\n        if (helpers[fn]) {\n            // Block helper, only 0 level is handled\n            if (currentMatch.isBlock && fn === currentMatch.fn) {\n                depth++;\n            }\n            if (!currentMatch.fn) {\n                currentMatch.fn = fn;\n            }\n        }\n        // Closing a block helper\n        const startingElseSection = match[1] === 'else';\n        if (currentMatch.isBlock &&\n            currentMatch.fn && (match[1] === `/${currentMatch.fn}` ||\n            startingElseSection)) {\n            if (!depth) { // === 0\n                const start = currentMatch.startInner, body = str.substr(start, match.index - start);\n                // Either closing without an else section, or when encountering\n                // an else section\n                if (currentMatch.body === void 0) {\n                    currentMatch.body = body;\n                    currentMatch.startInner = match.index + match[0].length;\n                    // The body exists already, so this is the else section\n                }\n                else {\n                    currentMatch.elseBody = body;\n                }\n                currentMatch.find += body + match[0];\n                if (!startingElseSection) {\n                    matches.push(currentMatch);\n                    currentMatch = void 0;\n                }\n            }\n            else if (!startingElseSection) {\n                depth--;\n            }\n            // Common expression\n        }\n        else if (!currentMatch.isBlock) {\n            matches.push(currentMatch);\n        }\n        // Evaluate sub-matches one by one to prevent orphaned block closers\n        if (subMatch && !currentMatch?.isBlock) {\n            break;\n        }\n    }\n    // Execute\n    matches.forEach((match) => {\n        const { body, elseBody, expression, fn } = match;\n        let replacement, i;\n        // Helper function\n        if (fn) {\n            // Pass the helpers the amount of arguments defined by the function,\n            // then the match as the last argument.\n            const args = [match], parts = expression.split(' ');\n            i = helpers[fn].length;\n            while (i--) {\n                args.unshift(resolveProperty(parts[i + 1]));\n            }\n            replacement = helpers[fn].apply(ctx, args);\n            // Block helpers may return true or false. They may also return a\n            // string, like the `each` helper.\n            if (match.isBlock && typeof replacement === 'boolean') {\n                replacement = format(replacement ? body : elseBody, ctx, chart);\n            }\n            // Simple variable replacement\n        }\n        else {\n            const valueAndFormat = expression.split(':');\n            replacement = resolveProperty(valueAndFormat.shift() || '');\n            // Format the replacement\n            if (valueAndFormat.length && typeof replacement === 'number') {\n                const segment = valueAndFormat.join(':');\n                if (floatRegex.test(segment)) { // Float\n                    const decimals = parseInt((segment.match(decRegex) || ['', '-1'])[1], 10);\n                    if (replacement !== null) {\n                        replacement = numberFormatter(replacement, decimals, lang.decimalPoint, segment.indexOf(',') > -1 ? lang.thousandsSep : '');\n                    }\n                }\n                else {\n                    replacement = time.dateFormat(segment, replacement);\n                }\n            }\n        }\n        str = str.replace(match.find, pick(replacement, ''));\n    });\n    return hasSub ? format(str, ctx, chart) : str;\n}\n/**\n * Format a number and return a string based on input settings.\n *\n * @sample highcharts/members/highcharts-numberformat/\n *         Custom number format\n *\n * @function Highcharts.numberFormat\n *\n * @param {number} number\n *        The input number to format.\n *\n * @param {number} decimals\n *        The amount of decimals. A value of -1 preserves the amount in the\n *        input number.\n *\n * @param {string} [decimalPoint]\n *        The decimal point, defaults to the one given in the lang options, or\n *        a dot.\n *\n * @param {string} [thousandsSep]\n *        The thousands separator, defaults to the one given in the lang\n *        options, or a space character.\n *\n * @return {string}\n *         The formatted number.\n */\nfunction numberFormat(number, decimals, decimalPoint, thousandsSep) {\n    number = +number || 0;\n    decimals = +decimals;\n    let ret, fractionDigits;\n    const lang = defaultOptions.lang, origDec = (number.toString().split('.')[1] || '').split('e')[0].length, exponent = number.toString().split('e'), firstDecimals = decimals;\n    if (decimals === -1) {\n        // Preserve decimals. Not huge numbers (#3793).\n        decimals = Math.min(origDec, 20);\n    }\n    else if (!isNumber(decimals)) {\n        decimals = 2;\n    }\n    else if (decimals && exponent[1] && exponent[1] < 0) {\n        // Expose decimals from exponential notation (#7042)\n        fractionDigits = decimals + +exponent[1];\n        if (fractionDigits >= 0) {\n            // Remove too small part of the number while keeping the notation\n            exponent[0] = (+exponent[0]).toExponential(fractionDigits)\n                .split('e')[0];\n            decimals = fractionDigits;\n        }\n        else {\n            // `fractionDigits < 0`\n            exponent[0] = exponent[0].split('.')[0] || 0;\n            if (decimals < 20) {\n                // Use number instead of exponential notation (#7405)\n                number = (exponent[0] * Math.pow(10, exponent[1]))\n                    .toFixed(decimals);\n            }\n            else {\n                // Or zero\n                number = 0;\n            }\n            exponent[1] = 0;\n        }\n    }\n    // Add another decimal to avoid rounding errors of float numbers. (#4573)\n    // Then use toFixed to handle rounding.\n    const roundedNumber = (Math.abs(exponent[1] ? exponent[0] : number) +\n        Math.pow(10, -Math.max(decimals, origDec) - 1)).toFixed(decimals);\n    // A string containing the positive integer component of the number\n    const strinteger = String(pInt(roundedNumber));\n    // Leftover after grouping into thousands. Can be 0, 1 or 2.\n    const thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n    // Language\n    decimalPoint = pick(decimalPoint, lang.decimalPoint);\n    thousandsSep = pick(thousandsSep, lang.thousandsSep);\n    // Start building the return\n    ret = number < 0 ? '-' : '';\n    // Add the leftover after grouping into thousands. For example, in the\n    // number 42 000 000, this line adds 42.\n    ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n    if (+exponent[1] < 0 && !firstDecimals) {\n        ret = '0';\n    }\n    else {\n        // Add the remaining thousands groups, joined by the thousands separator\n        ret += strinteger\n            .substr(thousands)\n            .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n    }\n    // Add the decimal point and the decimal component\n    if (decimals) {\n        // Get the decimal component\n        ret += decimalPoint + roundedNumber.slice(-decimals);\n    }\n    else if (+ret === 0) { // Remove signed minus #20564\n        ret = '0';\n    }\n    if (exponent[1] && +ret !== 0) {\n        ret += 'e' + exponent[1];\n    }\n    return ret;\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst Templating = {\n    dateFormat,\n    format,\n    helpers,\n    numberFormat\n};\nexport default Templating;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from './Globals.js';\nconst { win } = H;\nimport U from './Utilities.js';\nconst { defined, error, extend, isNumber, isObject, merge, objectEach, pad, pick, splat, timeUnits } = U;\n/* *\n *\n *  Constants\n *\n * */\nconst hasNewSafariBug = H.isSafari &&\n    win.Intl &&\n    win.Intl.DateTimeFormat.prototype.formatRange;\n// To do: Remove this when we no longer need support for Safari < v14.1\nconst hasOldSafariBug = H.isSafari &&\n    win.Intl &&\n    !win.Intl.DateTimeFormat.prototype.formatRange;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The Time class. Time settings are applied in general for each page using\n * `Highcharts.setOptions`, or individually for each Chart item through the\n * [time](https://api.highcharts.com/highcharts/time) options set.\n *\n * The Time object is available from {@link Highcharts.Chart#time},\n * which refers to  `Highcharts.time` if no individual time settings are\n * applied.\n *\n * @example\n * // Apply time settings globally\n * Highcharts.setOptions({\n *     time: {\n *         timezone: 'Europe/London'\n *     }\n * });\n *\n * // Apply time settings by instance\n * let chart = Highcharts.chart('container', {\n *     time: {\n *         timezone: 'America/New_York'\n *     },\n *     series: [{\n *         data: [1, 4, 3, 5]\n *     }]\n * });\n *\n * // Use the Time object\n * console.log(\n *        'Current time in New York',\n *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n * );\n *\n * @since 6.0.5\n *\n * @class\n * @name Highcharts.Time\n *\n * @param {Highcharts.TimeOptions} [options]\n * Time options as defined in [chart.options.time](/highcharts/time).\n */\nclass Time {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(options) {\n        /* *\n         *\n         *  Properties\n         *\n         * */\n        this.options = {};\n        this.useUTC = false;\n        this.variableTimezone = false;\n        this.Date = win.Date;\n        /**\n         * Get the time zone offset based on the current timezone information as\n         * set in the global options.\n         *\n         * @function Highcharts.Time#getTimezoneOffset\n         *\n         * @param {number} timestamp\n         *        The JavaScript timestamp to inspect.\n         *\n         * @return {number}\n         *         The timezone offset in minutes compared to UTC.\n         */\n        this.getTimezoneOffset = this.timezoneOffsetFunction();\n        this.update(options);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Time units used in `Time.get` and `Time.set`\n     *\n     * @typedef {\"Date\"|\"Day\"|\"FullYear\"|\"Hours\"|\"Milliseconds\"|\"Minutes\"|\"Month\"|\"Seconds\"} Highcharts.TimeUnitValue\n     */\n    /**\n     * Get the value of a date object in given units, and subject to the Time\n     * object's current timezone settings. This function corresponds directly to\n     * JavaScripts `Date.getXXX / Date.getUTCXXX`, so instead of calling\n     * `date.getHours()` or `date.getUTCHours()` we will call\n     * `time.get('Hours')`.\n     *\n     * @function Highcharts.Time#get\n     *\n     * @param {Highcharts.TimeUnitValue} unit\n     * @param {Date} date\n     *\n     * @return {number}\n     *        The given time unit\n     */\n    get(unit, date) {\n        if (this.variableTimezone || this.timezoneOffset) {\n            const realMs = date.getTime();\n            const ms = realMs - this.getTimezoneOffset(date);\n            date.setTime(ms); // Temporary adjust to timezone\n            const ret = date['getUTC' + unit]();\n            date.setTime(realMs); // Reset\n            return ret;\n        }\n        // UTC time with no timezone handling\n        if (this.useUTC) {\n            return date['getUTC' + unit]();\n        }\n        // Else, local time\n        return date['get' + unit]();\n    }\n    /**\n     * Set the value of a date object in given units, and subject to the Time\n     * object's current timezone settings. This function corresponds directly to\n     * JavaScripts `Date.setXXX / Date.setUTCXXX`, so instead of calling\n     * `date.setHours(0)` or `date.setUTCHours(0)` we will call\n     * `time.set('Hours', 0)`.\n     *\n     * @function Highcharts.Time#set\n     *\n     * @param {Highcharts.TimeUnitValue} unit\n     * @param {Date} date\n     * @param {number} value\n     *\n     * @return {number}\n     *        The epoch milliseconds of the updated date\n     */\n    set(unit, date, value) {\n        // UTC time with timezone handling\n        if (this.variableTimezone || this.timezoneOffset) {\n            // For lower order time units, just set it directly using UTC\n            // time\n            if (unit === 'Milliseconds' ||\n                unit === 'Seconds' ||\n                (unit === 'Minutes' &&\n                    this.getTimezoneOffset(date) % 3600000 === 0) // #13961\n            ) {\n                return date['setUTC' + unit](value);\n            }\n            // Higher order time units need to take the time zone into\n            // account\n            // Adjust by timezone\n            const offset = this.getTimezoneOffset(date);\n            let ms = date.getTime() - offset;\n            date.setTime(ms);\n            date['setUTC' + unit](value);\n            const newOffset = this.getTimezoneOffset(date);\n            ms = date.getTime() + newOffset;\n            return date.setTime(ms);\n        }\n        // UTC time with no timezone handling\n        if (this.useUTC ||\n            // Leap calculation in UTC only\n            (hasNewSafariBug && unit === 'FullYear')) {\n            return date['setUTC' + unit](value);\n        }\n        // Else, local time\n        return date['set' + unit](value);\n    }\n    /**\n     * Update the Time object with current options. It is called internally on\n     * initializing Highcharts, after running `Highcharts.setOptions` and on\n     * `Chart.update`.\n     *\n     * @private\n     * @function Highcharts.Time#update\n     *\n     * @param {Highcharts.TimeOptions} [options]\n     *\n     */\n    update(options = {}) {\n        const useUTC = pick(options.useUTC, true);\n        this.options = options = merge(true, this.options, options);\n        // Allow using a different Date class\n        this.Date = options.Date || win.Date || Date;\n        this.useUTC = useUTC;\n        this.timezoneOffset = (useUTC && options.timezoneOffset) || void 0;\n        this.getTimezoneOffset = this.timezoneOffsetFunction();\n        /*\n         * The time object has options allowing for variable time zones, meaning\n         * the axis ticks or series data needs to consider this.\n         */\n        this.variableTimezone = useUTC && !!(options.getTimezoneOffset ||\n            options.timezone);\n    }\n    /**\n     * Make a time and returns milliseconds. Interprets the inputs as UTC time,\n     * local time or a specific timezone time depending on the current time\n     * settings.\n     *\n     * @function Highcharts.Time#makeTime\n     *\n     * @param {number} year\n     *        The year\n     *\n     * @param {number} month\n     *        The month. Zero-based, so January is 0.\n     *\n     * @param {number} [date=1]\n     *        The day of the month\n     *\n     * @param {number} [hours=0]\n     *        The hour of the day, 0-23.\n     *\n     * @param {number} [minutes=0]\n     *        The minutes\n     *\n     * @param {number} [seconds=0]\n     *        The seconds\n     *\n     * @return {number}\n     *         The time in milliseconds since January 1st 1970.\n     */\n    makeTime(year, month, date, hours, minutes, seconds) {\n        let d, offset, newOffset;\n        if (this.useUTC) {\n            d = this.Date.UTC.apply(0, arguments);\n            offset = this.getTimezoneOffset(d);\n            d += offset;\n            newOffset = this.getTimezoneOffset(d);\n            if (offset !== newOffset) {\n                d += newOffset - offset;\n                // A special case for transitioning from summer time to winter time.\n                // When the clock is set back, the same time is repeated twice, i.e.\n                // 02:30 am is repeated since the clock is set back from 3 am to\n                // 2 am. We need to make the same time as local Date does.\n            }\n            else if (offset - 36e5 === this.getTimezoneOffset(d - 36e5) &&\n                !hasOldSafariBug) {\n                d -= 36e5;\n            }\n        }\n        else {\n            d = new this.Date(year, month, pick(date, 1), pick(hours, 0), pick(minutes, 0), pick(seconds, 0)).getTime();\n        }\n        return d;\n    }\n    /**\n     * Sets the getTimezoneOffset function. If the `timezone` option is set, a\n     * default getTimezoneOffset function with that timezone is returned. If\n     * a `getTimezoneOffset` option is defined, it is returned. If neither are\n     * specified, the function using the `timezoneOffset` option or 0 offset is\n     * returned.\n     *\n     * @private\n     * @function Highcharts.Time#timezoneOffsetFunction\n     *\n     * @return {Function}\n     *         A getTimezoneOffset function\n     */\n    timezoneOffsetFunction() {\n        const time = this, options = this.options, getTimezoneOffset = options.getTimezoneOffset;\n        if (!this.useUTC) {\n            return (timestamp) => new Date(timestamp.toString()).getTimezoneOffset() * 60000;\n        }\n        if (options.timezone) {\n            return (timestamp) => {\n                try {\n                    // Cache the DateTimeFormat instances for performance\n                    // (#20720)\n                    const cacheKey = `shortOffset,${options.timezone || ''}`, dateTimeFormat = Time.formatCache[cacheKey] = (Time.formatCache[cacheKey] ||\n                        // eslint-disable-next-line new-cap\n                        Intl.DateTimeFormat('en', {\n                            timeZone: options.timezone,\n                            timeZoneName: 'shortOffset'\n                        }));\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    const [date, gmt, hours, colon, minutes = 0] = dateTimeFormat\n                        .format(timestamp)\n                        .split(/(GMT|:)/)\n                        .map(Number), offset = -(hours + minutes / 60) * 60 * 60000;\n                    // Possible future NaNs stop here\n                    if (isNumber(offset)) {\n                        return offset;\n                    }\n                }\n                catch (e) {\n                    error(34);\n                }\n                return 0;\n            };\n        }\n        // If not timezone is set, look for the getTimezoneOffset callback\n        if (this.useUTC && getTimezoneOffset) {\n            return (timestamp) => getTimezoneOffset(timestamp.valueOf()) * 60000;\n        }\n        // Last, use the `timezoneOffset` option if set\n        return () => (time.timezoneOffset || 0) * 60000;\n    }\n    /**\n     * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970)\n     * into a human readable date string. The available format keys are listed\n     * below. Additional formats can be given in the\n     * {@link Highcharts.dateFormats} hook.\n     *\n     * Supported format keys:\n     * - `%a`: Short weekday, like 'Mon'\n     * - `%A`: Long weekday, like 'Monday'\n     * - `%d`: Two digit day of the month, 01 to 31\n     * - `%e`: Day of the month, 1 through 31\n     * - `%w`: Day of the week, 0 through 6\n     * - `%b`: Short month, like 'Jan'\n     * - `%B`: Long month, like 'January'\n     * - `%m`: Two digit month number, 01 through 12\n     * - `%y`: Two digits year, like 09 for 2009\n     * - `%Y`: Four digits year, like 2009\n     * - `%H`: Two digits hours in 24h format, 00 through 23\n     * - `%k`: Hours in 24h format, 0 through 23\n     * - `%I`: Two digits hours in 12h format, 00 through 11\n     * - `%l`: Hours in 12h format, 1 through 12\n     * - `%M`: Two digits minutes, 00 through 59\n     * - `%p`: Upper case AM or PM\n     * - `%P`: Lower case AM or PM\n     * - `%S`: Two digits seconds, 00 through 59\n     * - `%L`: Milliseconds (naming from Ruby)\n     *\n     * @example\n     * const time = new Highcharts.Time();\n     * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));\n     * console.log(s); // => 2020-01-01 00:00:00\n     *\n     * @function Highcharts.Time#dateFormat\n     *\n     * @param {string} format\n     *        The desired format where various time representations are\n     *        prefixed with %.\n     *\n     * @param {number} [timestamp]\n     *        The JavaScript timestamp.\n     *\n     * @param {boolean} [capitalize=false]\n     *        Upper case first letter in the return.\n     *\n     * @return {string}\n     *         The formatted date.\n     */\n    dateFormat(format, timestamp, capitalize) {\n        if (!defined(timestamp) || isNaN(timestamp)) {\n            return (H.defaultOptions.lang &&\n                H.defaultOptions.lang.invalidDate ||\n                '');\n        }\n        format = pick(format, '%Y-%m-%d %H:%M:%S');\n        const time = this, date = new this.Date(timestamp), \n        // Get the basic time values\n        hours = this.get('Hours', date), day = this.get('Day', date), dayOfMonth = this.get('Date', date), month = this.get('Month', date), fullYear = this.get('FullYear', date), lang = H.defaultOptions.lang, langWeekdays = (lang && lang.weekdays), shortWeekdays = (lang && lang.shortWeekdays), \n        // List all format keys. Custom formats can be added from the\n        // outside.\n        replacements = extend({\n            // Day\n            // Short weekday, like 'Mon'\n            a: shortWeekdays ?\n                shortWeekdays[day] :\n                langWeekdays[day].substr(0, 3),\n            // Long weekday, like 'Monday'\n            A: langWeekdays[day],\n            // Two digit day of the month, 01 to 31\n            d: pad(dayOfMonth),\n            // Day of the month, 1 through 31\n            e: pad(dayOfMonth, 2, ' '),\n            // Day of the week, 0 through 6\n            w: day,\n            // Week (none implemented)\n            // 'W': weekNumber(),\n            // Month\n            // Short month, like 'Jan'\n            b: lang.shortMonths[month],\n            // Long month, like 'January'\n            B: lang.months[month],\n            // Two digit month number, 01 through 12\n            m: pad(month + 1),\n            // Month number, 1 through 12 (#8150)\n            o: month + 1,\n            // Year\n            // Two digits year, like 09 for 2009\n            y: fullYear.toString().substr(2, 2),\n            // Four digits year, like 2009\n            Y: fullYear,\n            // Time\n            // Two digits hours in 24h format, 00 through 23\n            H: pad(hours),\n            // Hours in 24h format, 0 through 23\n            k: hours,\n            // Two digits hours in 12h format, 00 through 11\n            I: pad((hours % 12) || 12),\n            // Hours in 12h format, 1 through 12\n            l: (hours % 12) || 12,\n            // Two digits minutes, 00 through 59\n            M: pad(this.get('Minutes', date)),\n            // Upper case AM or PM\n            p: hours < 12 ? 'AM' : 'PM',\n            // Lower case AM or PM\n            P: hours < 12 ? 'am' : 'pm',\n            // Two digits seconds, 00 through 59\n            S: pad(this.get('Seconds', date)),\n            // Milliseconds (naming from Ruby)\n            L: pad(Math.floor(timestamp % 1000), 3)\n        }, H.dateFormats);\n        // Do the replaces\n        objectEach(replacements, function (val, key) {\n            // Regex would do it in one line, but this is faster\n            while (format.indexOf('%' + key) !== -1) {\n                format = format.replace('%' + key, typeof val === 'function' ? val.call(time, timestamp) : val);\n            }\n        });\n        // Optionally capitalize the string and return\n        return capitalize ?\n            (format.substr(0, 1).toUpperCase() +\n                format.substr(1)) :\n            format;\n    }\n    /**\n     * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into\n     * an object.\n     * @private\n     * @param {string|Array<T>|Highcharts.Dictionary<T>} f\n     * General format description\n     * @return {Highcharts.Dictionary<T>}\n     * The object definition\n     */\n    resolveDTLFormat(f) {\n        if (!isObject(f, true)) { // Check for string or array\n            f = splat(f);\n            return {\n                main: f[0],\n                from: f[1],\n                to: f[2]\n            };\n        }\n        return f;\n    }\n    /**\n     * Return an array with time positions distributed on round time values\n     * right and right after min and max. Used in datetime axes as well as for\n     * grouping data on a datetime axis.\n     *\n     * @function Highcharts.Time#getTimeTicks\n     *\n     * @param {Highcharts.TimeNormalizedObject} normalizedInterval\n     *        The interval in axis values (ms) and the count\n     *\n     * @param {number} [min]\n     *        The minimum in axis values\n     *\n     * @param {number} [max]\n     *        The maximum in axis values\n     *\n     * @param {number} [startOfWeek=1]\n     *\n     * @return {Highcharts.AxisTickPositionsArray}\n     * Time positions\n     */\n    getTimeTicks(normalizedInterval, min, max, startOfWeek) {\n        const time = this, Date = time.Date, tickPositions = [], higherRanks = {}, \n        // When crossing DST, use the max. Resolves #6278.\n        minDate = new Date(min), interval = normalizedInterval.unitRange, count = normalizedInterval.count || 1;\n        let i, minYear, // Used in months and years as a basis for Date.UTC()\n        variableDayLength, minDay;\n        startOfWeek = pick(startOfWeek, 1);\n        if (defined(min)) { // #1300\n            time.set('Milliseconds', minDate, interval >= timeUnits.second ?\n                0 : // #3935\n                count * Math.floor(time.get('Milliseconds', minDate) / count)); // #3652, #3654\n            if (interval >= timeUnits.second) { // Second\n                time.set('Seconds', minDate, interval >= timeUnits.minute ?\n                    0 : // #3935\n                    count * Math.floor(time.get('Seconds', minDate) / count));\n            }\n            if (interval >= timeUnits.minute) { // Minute\n                time.set('Minutes', minDate, interval >= timeUnits.hour ?\n                    0 :\n                    count * Math.floor(time.get('Minutes', minDate) / count));\n            }\n            if (interval >= timeUnits.hour) { // Hour\n                time.set('Hours', minDate, interval >= timeUnits.day ?\n                    0 :\n                    count * Math.floor(time.get('Hours', minDate) / count));\n            }\n            if (interval >= timeUnits.day) { // Day\n                time.set('Date', minDate, interval >= timeUnits.month ?\n                    1 :\n                    Math.max(1, count * Math.floor(time.get('Date', minDate) / count)));\n            }\n            if (interval >= timeUnits.month) { // Month\n                time.set('Month', minDate, interval >= timeUnits.year ? 0 :\n                    count * Math.floor(time.get('Month', minDate) / count));\n                minYear = time.get('FullYear', minDate);\n            }\n            if (interval >= timeUnits.year) { // Year\n                minYear -= minYear % count;\n                time.set('FullYear', minDate, minYear);\n            }\n            // Week is a special case that runs outside the hierarchy\n            if (interval === timeUnits.week) {\n                // Get start of current week, independent of count\n                minDay = time.get('Day', minDate);\n                time.set('Date', minDate, (time.get('Date', minDate) -\n                    minDay + startOfWeek +\n                    // We don't want to skip days that are before\n                    // startOfWeek (#7051)\n                    (minDay < startOfWeek ? -7 : 0)));\n            }\n            // Get basics for variable time spans\n            minYear = time.get('FullYear', minDate);\n            const minMonth = time.get('Month', minDate), minDateDate = time.get('Date', minDate), minHours = time.get('Hours', minDate);\n            // Redefine min to the floored/rounded minimum time (#7432)\n            min = minDate.getTime();\n            // Handle local timezone offset\n            if ((time.variableTimezone || !time.useUTC) && defined(max)) {\n                // Detect whether we need to take the DST crossover into\n                // consideration. If we're crossing over DST, the day length may\n                // be 23h or 25h and we need to compute the exact clock time for\n                // each tick instead of just adding hours. This comes at a cost,\n                // so first we find out if it is needed (#4951).\n                variableDayLength = (\n                // Long range, assume we're crossing over.\n                max - min > 4 * timeUnits.month ||\n                    // Short range, check if min and max are in different time\n                    // zones.\n                    time.getTimezoneOffset(min) !==\n                        time.getTimezoneOffset(max));\n            }\n            // Iterate and add tick positions at appropriate values\n            let t = minDate.getTime();\n            i = 1;\n            while (t < max) {\n                tickPositions.push(t);\n                // If the interval is years, use Date.UTC to increase years\n                if (interval === timeUnits.year) {\n                    t = time.makeTime(minYear + i * count, 0);\n                    // If the interval is months, use Date.UTC to increase months\n                }\n                else if (interval === timeUnits.month) {\n                    t = time.makeTime(minYear, minMonth + i * count);\n                    // If we're using global time, the interval is not fixed as it\n                    // jumps one hour at the DST crossover\n                }\n                else if (variableDayLength &&\n                    (interval === timeUnits.day || interval === timeUnits.week)) {\n                    t = time.makeTime(minYear, minMonth, minDateDate +\n                        i * count * (interval === timeUnits.day ? 1 : 7));\n                }\n                else if (variableDayLength &&\n                    interval === timeUnits.hour &&\n                    count > 1) {\n                    // Make sure higher ranks are preserved across DST (#6797,\n                    // #7621)\n                    t = time.makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n                    // Else, the interval is fixed and we use simple addition\n                }\n                else {\n                    t += interval * count;\n                }\n                i++;\n            }\n            // Push the last time\n            tickPositions.push(t);\n            // Handle higher ranks. Mark new days if the time is on midnight\n            // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold\n            // to prevent looping over dense data grouping (#6156).\n            if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n                tickPositions.forEach(function (t) {\n                    if (\n                    // Speed optimization, no need to run dateFormat unless\n                    // we're on a full or half hour\n                    t % 1800000 === 0 &&\n                        // Check for local or global midnight\n                        time.dateFormat('%H%M%S%L', t) === '000000000') {\n                        higherRanks[t] = 'day';\n                    }\n                });\n            }\n        }\n        // Record information on the chosen unit - for dynamic label formatter\n        tickPositions.info = extend(normalizedInterval, {\n            higherRanks,\n            totalRange: interval * count\n        });\n        return tickPositions;\n    }\n    /**\n     * Get the optimal date format for a point, based on a range.\n     *\n     * @private\n     * @function Highcharts.Time#getDateFormat\n     *\n     * @param {number} range\n     *        The time range\n     *\n     * @param {number} timestamp\n     *        The timestamp of the date\n     *\n     * @param {number} startOfWeek\n     *        An integer representing the first day of the week, where 0 is\n     *        Sunday.\n     *\n     * @param {Highcharts.Dictionary<string>} dateTimeLabelFormats\n     *        A map of time units to formats.\n     *\n     * @return {string}\n     *         The optimal date format for a point.\n     */\n    getDateFormat(range, timestamp, startOfWeek, dateTimeLabelFormats) {\n        const dateStr = this.dateFormat('%m-%d %H:%M:%S.%L', timestamp), blank = '01-01 00:00:00.000', strpos = {\n            millisecond: 15,\n            second: 12,\n            minute: 9,\n            hour: 6,\n            day: 3\n        };\n        let n = 'millisecond', \n        // For sub-millisecond data, #4223\n        lastN = n;\n        for (n in timeUnits) { // eslint-disable-line guard-for-in\n            // If the range is exactly one week and we're looking at a\n            // Sunday/Monday, go for the week format\n            if (range === timeUnits.week &&\n                +this.dateFormat('%w', timestamp) === startOfWeek &&\n                dateStr.substr(6) === blank.substr(6)) {\n                n = 'week';\n                break;\n            }\n            // The first format that is too great for the range\n            if (timeUnits[n] > range) {\n                n = lastN;\n                break;\n            }\n            // If the point is placed every day at 23:59, we need to show\n            // the minutes as well. #2637.\n            if (strpos[n] &&\n                dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n                break;\n            }\n            // Weeks are outside the hierarchy, only apply them on\n            // Mondays/Sundays like in the first condition\n            if (n !== 'week') {\n                lastN = n;\n            }\n        }\n        return this.resolveDTLFormat(dateTimeLabelFormats[n]).main;\n    }\n}\nTime.formatCache = {};\n/* *\n *\n * Default export\n *\n * */\nexport default Time;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Normalized interval.\n *\n * @interface Highcharts.TimeNormalizedObject\n */ /**\n* The count.\n*\n* @name Highcharts.TimeNormalizedObject#count\n* @type {number|undefined}\n*/ /**\n* The interval in axis values (ms).\n*\n* @name Highcharts.TimeNormalizedObject#unitRange\n* @type {number}\n*/\n/**\n * Function of an additional date format specifier.\n *\n * @callback Highcharts.TimeFormatCallbackFunction\n *\n * @param {number} timestamp\n *        The time to format.\n *\n * @return {string}\n *         The formatted portion of the date.\n */\n/**\n * Time ticks.\n *\n * @interface Highcharts.AxisTickPositionsArray\n * @extends global.Array<number>\n */ /**\n* @name Highcharts.AxisTickPositionsArray#info\n* @type {Highcharts.TimeTicksInfoObject|undefined}\n*/\n/**\n * A callback to return the time zone offset for a given datetime. It\n * takes the timestamp in terms of milliseconds since January 1 1970,\n * and returns the timezone offset in minutes. This provides a hook\n * for drawing time based charts in specific time zones using their\n * local DST crossover dates, with the help of external libraries.\n *\n * @callback Highcharts.TimezoneOffsetCallbackFunction\n *\n * @param {number} timestamp\n * Timestamp in terms of milliseconds since January 1 1970.\n *\n * @return {number}\n * Timezone offset in minutes.\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from './Globals.js';\nconst { charts, doc, win } = H;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Provide error messages for debugging, with links to online explanation. This\n * function can be overridden to provide custom error handling.\n *\n * @sample highcharts/chart/highcharts-error/\n *         Custom error handler\n *\n * @function Highcharts.error\n *\n * @param {number|string} code\n *        The error code. See\n *        [errors.xml](https://github.com/highcharts/highcharts/blob/master/errors/errors.xml)\n *        for available codes. If it is a string, the error message is printed\n *        directly in the console.\n *\n * @param {boolean} [stop=false]\n *        Whether to throw an error or just log a warning in the console.\n *\n * @param {Highcharts.Chart} [chart]\n *        Reference to the chart that causes the error. Used in 'debugger'\n *        module to display errors directly on the chart.\n *        Important note: This argument is undefined for errors that lack\n *        access to the Chart instance. In such case, the error will be\n *        displayed on the last created chart.\n *\n * @param {Highcharts.Dictionary<string>} [params]\n *        Additional parameters for the generated message.\n *\n * @return {void}\n */\nfunction error(code, stop, chart, params) {\n    const severity = stop ? 'Highcharts error' : 'Highcharts warning';\n    if (code === 32) {\n        code = `${severity}: Deprecated member`;\n    }\n    const isCode = isNumber(code);\n    let message = isCode ?\n        `${severity} #${code}: www.highcharts.com/errors/${code}/` :\n        code.toString();\n    const defaultHandler = function () {\n        if (stop) {\n            throw new Error(message);\n        }\n        // Else ...\n        if (win.console &&\n            error.messages.indexOf(message) === -1 // Prevent console flooting\n        ) {\n            console.warn(message); // eslint-disable-line no-console\n        }\n    };\n    if (typeof params !== 'undefined') {\n        let additionalMessages = '';\n        if (isCode) {\n            message += '?';\n        }\n        objectEach(params, function (value, key) {\n            additionalMessages += `\\n - ${key}: ${value}`;\n            if (isCode) {\n                message += encodeURI(key) + '=' + encodeURI(value);\n            }\n        });\n        message += additionalMessages;\n    }\n    fireEvent(H, 'displayError', { chart, code, message, params }, defaultHandler);\n    error.messages.push(message);\n}\n(function (error) {\n    error.messages = [];\n})(error || (error = {}));\n/* eslint-disable valid-jsdoc */\n/**\n * Utility function to deep merge two or more objects and return a third object.\n * If the first argument is true, the contents of the second object is copied\n * into the first object. The merge function can also be used with a single\n * object argument to create a deep copy of an object.\n *\n * @function Highcharts.merge<T>\n *\n * @param {boolean} extend\n *        Whether to extend the left-side object (a) or return a whole new\n *        object.\n *\n * @param {T|undefined} a\n *        The first object to extend. When only this is given, the function\n *        returns a deep copy.\n *\n * @param {...Array<object|undefined>} [n]\n *        An object to merge into the previous one.\n *\n * @return {T}\n *         The merged object. If the first argument is true, the return is the\n *         same as the second argument.\n */ /**\n* Utility function to deep merge two or more objects and return a third object.\n* The merge function can also be used with a single object argument to create a\n* deep copy of an object.\n*\n* @function Highcharts.merge<T>\n*\n* @param {T|undefined} a\n*        The first object to extend. When only this is given, the function\n*        returns a deep copy.\n*\n* @param {...Array<object|undefined>} [n]\n*        An object to merge into the previous one.\n*\n* @return {T}\n*         The merged object. If the first argument is true, the return is the\n*         same as the second argument.\n*/\nfunction merge() {\n    /* eslint-enable valid-jsdoc */\n    let i, args = arguments, ret = {};\n    const doCopy = function (copy, original) {\n        // An object is replacing a primitive\n        if (typeof copy !== 'object') {\n            copy = {};\n        }\n        objectEach(original, function (value, key) {\n            // Prototype pollution (#14883)\n            if (key === '__proto__' || key === 'constructor') {\n                return;\n            }\n            // Copy the contents of objects, but not arrays or DOM nodes\n            if (isObject(value, true) &&\n                !isClass(value) &&\n                !isDOMElement(value)) {\n                copy[key] = doCopy(copy[key] || {}, value);\n                // Primitives and arrays are copied over directly\n            }\n            else {\n                copy[key] = original[key];\n            }\n        });\n        return copy;\n    };\n    // If first argument is true, copy into the existing object. Used in\n    // setOptions.\n    if (args[0] === true) {\n        ret = args[1];\n        args = Array.prototype.slice.call(args, 2);\n    }\n    // For each argument, extend the return\n    const len = args.length;\n    for (i = 0; i < len; i++) {\n        ret = doCopy(ret, args[i]);\n    }\n    return ret;\n}\n/**\n * Constrain a value to within a lower and upper threshold.\n *\n * @private\n * @param {number} value The initial value\n * @param {number} min The lower threshold\n * @param {number} max The upper threshold\n * @return {number} Returns a number value within min and max.\n */\nfunction clamp(value, min, max) {\n    return value > min ? value < max ? value : max : min;\n}\n/**\n * Utility for crisping a line position to the nearest full pixel depening on\n * the line width\n * @param {number} value       The raw pixel position\n * @param {number} lineWidth   The line width\n * @param {boolean} [inverted] Whether the containing group is inverted.\n *                             Crisping round numbers on the y-scale need to go\n *                             to the other side because the coordinate system\n *                             is flipped (scaleY is -1)\n * @return {number}            The pixel position to use for a crisp display\n */\nconst crisp = (value, lineWidth = 0, inverted) => {\n    const mod = lineWidth % 2 / 2, inverter = inverted ? -1 : 1;\n    return (Math.round(value * inverter - mod) + mod) * inverter;\n};\n// eslint-disable-next-line valid-jsdoc\n/**\n * Return the deep difference between two objects. It can either return the new\n * properties, or optionally return the old values of new properties.\n * @private\n */\nfunction diffObjects(newer, older, keepOlder, collectionsWithUpdate) {\n    const ret = {};\n    /**\n     * Recurse over a set of options and its current values, and store the\n     * current values in the ret object.\n     */\n    function diff(newer, older, ret, depth) {\n        const keeper = keepOlder ? older : newer;\n        objectEach(newer, function (newerVal, key) {\n            if (!depth &&\n                collectionsWithUpdate &&\n                collectionsWithUpdate.indexOf(key) > -1 &&\n                older[key]) {\n                newerVal = splat(newerVal);\n                ret[key] = [];\n                // Iterate over collections like series, xAxis or yAxis and map\n                // the items by index.\n                for (let i = 0; i < Math.max(newerVal.length, older[key].length); i++) {\n                    // Item exists in current data (#6347)\n                    if (older[key][i]) {\n                        // If the item is missing from the new data, we need to\n                        // save the whole config structure. Like when\n                        // responsively updating from a dual axis layout to a\n                        // single axis and back (#13544).\n                        if (newerVal[i] === void 0) {\n                            ret[key][i] = older[key][i];\n                            // Otherwise, proceed\n                        }\n                        else {\n                            ret[key][i] = {};\n                            diff(newerVal[i], older[key][i], ret[key][i], depth + 1);\n                        }\n                    }\n                }\n            }\n            else if (isObject(newerVal, true) &&\n                !newerVal.nodeType // #10044\n            ) {\n                ret[key] = isArray(newerVal) ? [] : {};\n                diff(newerVal, older[key] || {}, ret[key], depth + 1);\n                // Delete empty nested objects\n                if (Object.keys(ret[key]).length === 0 &&\n                    // Except colorAxis which is a special case where the empty\n                    // object means it is enabled. Which is unfortunate and we\n                    // should try to find a better way.\n                    !(key === 'colorAxis' && depth === 0)) {\n                    delete ret[key];\n                }\n            }\n            else if (newer[key] !== older[key] ||\n                // If the newer key is explicitly undefined, keep it (#10525)\n                (key in newer && !(key in older))) {\n                if (key !== '__proto__' && key !== 'constructor') {\n                    ret[key] = keeper[key];\n                }\n            }\n        });\n    }\n    diff(newer, older, ret, 0);\n    return ret;\n}\n/**\n * Shortcut for parseInt\n *\n * @private\n * @function Highcharts.pInt\n *\n * @param {*} s\n *        any\n *\n * @param {number} [mag]\n *        Magnitude\n *\n * @return {number}\n *         number\n */\nfunction pInt(s, mag) {\n    return parseInt(s, mag || 10);\n}\n/**\n * Utility function to check for string type.\n *\n * @function Highcharts.isString\n *\n * @param {*} s\n *        The item to check.\n *\n * @return {boolean}\n *         True if the argument is a string.\n */\nfunction isString(s) {\n    return typeof s === 'string';\n}\n/**\n * Utility function to check if an item is an array.\n *\n * @function Highcharts.isArray\n *\n * @param {*} obj\n *        The item to check.\n *\n * @return {boolean}\n *         True if the argument is an array.\n */\nfunction isArray(obj) {\n    const str = Object.prototype.toString.call(obj);\n    return str === '[object Array]' || str === '[object Array Iterator]';\n}\n/**\n * Utility function to check if an item is of type object.\n *\n * @function Highcharts.isObject\n *\n * @param {*} obj\n *        The item to check.\n *\n * @param {boolean} [strict=false]\n *        Also checks that the object is not an array.\n *\n * @return {boolean}\n *         True if the argument is an object.\n */\nfunction isObject(obj, strict) {\n    return (!!obj &&\n        typeof obj === 'object' &&\n        (!strict || !isArray(obj))); // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n/**\n * Utility function to check if an Object is a HTML Element.\n *\n * @function Highcharts.isDOMElement\n *\n * @param {*} obj\n *        The item to check.\n *\n * @return {boolean}\n *         True if the argument is a HTML Element.\n */\nfunction isDOMElement(obj) {\n    return isObject(obj) && typeof obj.nodeType === 'number';\n}\n/**\n * Utility function to check if an Object is a class.\n *\n * @function Highcharts.isClass\n *\n * @param {object|undefined} obj\n *        The item to check.\n *\n * @return {boolean}\n *         True if the argument is a class.\n */\nfunction isClass(obj) {\n    const c = obj && obj.constructor;\n    return !!(isObject(obj, true) &&\n        !isDOMElement(obj) &&\n        (c && c.name && c.name !== 'Object'));\n}\n/**\n * Utility function to check if an item is a number and it is finite (not NaN,\n * Infinity or -Infinity).\n *\n * @function Highcharts.isNumber\n *\n * @param {*} n\n *        The item to check.\n *\n * @return {boolean}\n *         True if the item is a finite number\n */\nfunction isNumber(n) {\n    return typeof n === 'number' && !isNaN(n) && n < Infinity && n > -Infinity;\n}\n/**\n * Remove the last occurence of an item from an array.\n *\n * @function Highcharts.erase\n *\n * @param {Array<*>} arr\n *        The array.\n *\n * @param {*} item\n *        The item to remove.\n *\n * @return {void}\n */\nfunction erase(arr, item) {\n    let i = arr.length;\n    while (i--) {\n        if (arr[i] === item) {\n            arr.splice(i, 1);\n            break;\n        }\n    }\n}\n/**\n * Insert a series or an axis in a collection with other items, either the\n * chart series or yAxis series or axis collections, in the correct order\n * according to the index option and whether it is internal. Used internally\n * when adding series and axes.\n *\n * @private\n * @function Highcharts.Chart#insertItem\n * @param  {Highcharts.Series|Highcharts.Axis} item\n *         The item to insert\n * @param  {Array<Highcharts.Series>|Array<Highcharts.Axis>} collection\n *         A collection of items, like `chart.series` or `xAxis.series`.\n * @return {number} The index of the series in the collection.\n */\nfunction insertItem(item, collection) {\n    const indexOption = item.options.index, length = collection.length;\n    let i;\n    for (\n    // Internal item (navigator) should always be pushed to the end\n    i = item.options.isInternal ? length : 0; i < length + 1; i++) {\n        if (\n        // No index option, reached the end of the collection,\n        // equivalent to pushing\n        !collection[i] ||\n            // Handle index option, the element to insert has lower index\n            (isNumber(indexOption) &&\n                indexOption < pick(collection[i].options.index, collection[i]._i)) ||\n            // Insert the new item before other internal items\n            // (navigator)\n            collection[i].options.isInternal) {\n            collection.splice(i, 0, item);\n            break;\n        }\n    }\n    return i;\n}\n/**\n * Adds an item to an array, if it is not present in the array.\n *\n * @function Highcharts.pushUnique\n *\n * @param {Array<unknown>} array\n * The array to add the item to.\n *\n * @param {unknown} item\n * The item to add.\n *\n * @return {boolean}\n * Returns true, if the item was not present and has been added.\n */\nfunction pushUnique(array, item) {\n    return array.indexOf(item) < 0 && !!array.push(item);\n}\n/**\n * Check if an object is null or undefined.\n *\n * @function Highcharts.defined\n *\n * @param {*} obj\n *        The object to check.\n *\n * @return {boolean}\n *         False if the object is null or undefined, otherwise true.\n */\nfunction defined(obj) {\n    return typeof obj !== 'undefined' && obj !== null;\n}\n/**\n * Set or get an attribute or an object of attributes.\n *\n * To use as a setter, pass a key and a value, or let the second argument be a\n * collection of keys and values. When using a collection, passing a value of\n * `null` or `undefined` will remove the attribute.\n *\n * To use as a getter, pass only a string as the second argument.\n *\n * @function Highcharts.attr\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} elem\n *        The DOM element to receive the attribute(s).\n *\n * @param {string|Highcharts.HTMLAttributes|Highcharts.SVGAttributes} [keyOrAttribs]\n *        The property or an object of key-value pairs.\n *\n * @param {number|string} [value]\n *        The value if a single property is set.\n *\n * @return {string|null|undefined}\n *         When used as a getter, return the value.\n */\nfunction attr(elem, keyOrAttribs, value) {\n    const isGetter = isString(keyOrAttribs) && !defined(value);\n    let ret;\n    const attrSingle = (value, key) => {\n        // Set the value\n        if (defined(value)) {\n            elem.setAttribute(key, value);\n            // Get the value\n        }\n        else if (isGetter) {\n            ret = elem.getAttribute(key);\n            // IE7 and below cannot get class through getAttribute (#7850)\n            if (!ret && key === 'class') {\n                ret = elem.getAttribute(key + 'Name');\n            }\n            // Remove the value\n        }\n        else {\n            elem.removeAttribute(key);\n        }\n    };\n    // If keyOrAttribs is a string\n    if (isString(keyOrAttribs)) {\n        attrSingle(value, keyOrAttribs);\n        // Else if keyOrAttribs is defined, it is a hash of key/value pairs\n    }\n    else {\n        objectEach(keyOrAttribs, attrSingle);\n    }\n    return ret;\n}\n/**\n * Check if an element is an array, and if not, make it into an array.\n *\n * @function Highcharts.splat\n *\n * @param {*} obj\n *        The object to splat.\n *\n * @return {Array}\n *         The produced or original array.\n */\nfunction splat(obj) {\n    return isArray(obj) ? obj : [obj];\n}\n/**\n * Set a timeout if the delay is given, otherwise perform the function\n * synchronously.\n *\n * @function Highcharts.syncTimeout\n *\n * @param {Function} fn\n *        The function callback.\n *\n * @param {number} delay\n *        Delay in milliseconds.\n *\n * @param {*} [context]\n *        An optional context to send to the function callback.\n *\n * @return {number}\n *         An identifier for the timeout that can later be cleared with\n *         Highcharts.clearTimeout. Returns -1 if there is no timeout.\n */\nfunction syncTimeout(fn, delay, context) {\n    if (delay > 0) {\n        return setTimeout(fn, delay, context);\n    }\n    fn.call(0, context);\n    return -1;\n}\n/**\n * Internal clear timeout. The function checks that the `id` was not removed\n * (e.g. by `chart.destroy()`). For the details see\n * [issue #7901](https://github.com/highcharts/highcharts/issues/7901).\n *\n * @function Highcharts.clearTimeout\n *\n * @param {number|undefined} id\n * Id of a timeout.\n */\nfunction internalClearTimeout(id) {\n    if (defined(id)) {\n        clearTimeout(id);\n    }\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Utility function to extend an object with the members of another.\n *\n * @function Highcharts.extend<T>\n *\n * @param {T|undefined} a\n *        The object to be extended.\n *\n * @param {Partial<T>} b\n *        The object to add to the first one.\n *\n * @return {T}\n *         Object a, the original object.\n */\nfunction extend(a, b) {\n    /* eslint-enable valid-jsdoc */\n    let n;\n    if (!a) {\n        a = {};\n    }\n    for (n in b) { // eslint-disable-line guard-for-in\n        a[n] = b[n];\n    }\n    return a;\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Return the first value that is not null or undefined.\n *\n * @function Highcharts.pick<T>\n *\n * @param {...Array<T|null|undefined>} items\n *        Variable number of arguments to inspect.\n *\n * @return {T}\n *         The value of the first argument that is not null or undefined.\n */\nfunction pick() {\n    const args = arguments;\n    const length = args.length;\n    for (let i = 0; i < length; i++) {\n        const arg = args[i];\n        if (typeof arg !== 'undefined' && arg !== null) {\n            return arg;\n        }\n    }\n}\n/**\n * Set CSS on a given element.\n *\n * @function Highcharts.css\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} el\n *        An HTML DOM element.\n *\n * @param {Highcharts.CSSObject} styles\n *        Style object with camel case property names.\n *\n * @return {void}\n */\nfunction css(el, styles) {\n    extend(el.style, styles);\n}\n/**\n * Utility function to create an HTML element with attributes and styles.\n *\n * @function Highcharts.createElement\n *\n * @param {string} tag\n *        The HTML tag.\n *\n * @param {Highcharts.HTMLAttributes} [attribs]\n *        Attributes as an object of key-value pairs.\n *\n * @param {Highcharts.CSSObject} [styles]\n *        Styles as an object of key-value pairs.\n *\n * @param {Highcharts.HTMLDOMElement} [parent]\n *        The parent HTML object.\n *\n * @param {boolean} [nopad=false]\n *        If true, remove all padding, border and margin.\n *\n * @return {Highcharts.HTMLDOMElement}\n *         The created DOM element.\n */\nfunction createElement(tag, attribs, styles, parent, nopad) {\n    const el = doc.createElement(tag);\n    if (attribs) {\n        extend(el, attribs);\n    }\n    if (nopad) {\n        css(el, { padding: '0', border: 'none', margin: '0' });\n    }\n    if (styles) {\n        css(el, styles);\n    }\n    if (parent) {\n        parent.appendChild(el);\n    }\n    return el;\n}\n// eslint-disable-next-line valid-jsdoc\n/**\n * Extend a prototyped class by new members.\n *\n * @deprecated\n * @function Highcharts.extendClass<T>\n *\n * @param {Highcharts.Class<T>} parent\n *        The parent prototype to inherit.\n *\n * @param {Highcharts.Dictionary<*>} members\n *        A collection of prototype members to add or override compared to the\n *        parent prototype.\n *\n * @return {Highcharts.Class<T>}\n *         A new prototype.\n */\nfunction extendClass(parent, members) {\n    const obj = (function () { });\n    obj.prototype = new parent(); // eslint-disable-line new-cap\n    extend(obj.prototype, members);\n    return obj;\n}\n/**\n * Left-pad a string to a given length by adding a character repetitively.\n *\n * @function Highcharts.pad\n *\n * @param {number} number\n *        The input string or number.\n *\n * @param {number} [length]\n *        The desired string length.\n *\n * @param {string} [padder=0]\n *        The character to pad with.\n *\n * @return {string}\n *         The padded string.\n */\nfunction pad(number, length, padder) {\n    return new Array((length || 2) +\n        1 -\n        String(number)\n            .replace('-', '')\n            .length).join(padder || '0') + number;\n}\n/**\n * Return a length based on either the integer value, or a percentage of a base.\n *\n * @function Highcharts.relativeLength\n *\n * @param {Highcharts.RelativeSize} value\n *        A percentage string or a number.\n *\n * @param {number} base\n *        The full length that represents 100%.\n *\n * @param {number} [offset=0]\n *        A pixel offset to apply for percentage values. Used internally in\n *        axis positioning.\n *\n * @return {number}\n *         The computed length.\n */\nfunction relativeLength(value, base, offset) {\n    return (/%$/).test(value) ?\n        (base * parseFloat(value) / 100) + (offset || 0) :\n        parseFloat(value);\n}\n/**\n * Replaces text in a string with a given replacement in a loop to catch nested\n * matches after previous replacements.\n *\n * @function Highcharts.replaceNested\n *\n * @param {string} text\n * Text to search and modify.\n *\n * @param {...Array<(RegExp|string)>} replacements\n * One or multiple tuples with search pattern (`[0]: (string|RegExp)`) and\n * replacement (`[1]: string`) for matching text.\n *\n * @return {string}\n * Text with replacements.\n */\nfunction replaceNested(text, ...replacements) {\n    let previous, replacement;\n    do {\n        previous = text;\n        for (replacement of replacements) {\n            text = text.replace(replacement[0], replacement[1]);\n        }\n    } while (text !== previous);\n    return text;\n}\n/**\n * Wrap a method with extended functionality, preserving the original function.\n *\n * @function Highcharts.wrap\n *\n * @param {*} obj\n *        The context object that the method belongs to. In real cases, this is\n *        often a prototype.\n *\n * @param {string} method\n *        The name of the method to extend.\n *\n * @param {Highcharts.WrapProceedFunction} func\n *        A wrapper function callback. This function is called with the same\n *        arguments as the original function, except that the original function\n *        is unshifted and passed as the first argument.\n */\nfunction wrap(obj, method, func) {\n    const proceed = obj[method];\n    obj[method] = function () {\n        const outerArgs = arguments, scope = this;\n        return func.apply(this, [\n            function () {\n                return proceed.apply(scope, arguments.length ? arguments : outerArgs);\n            }\n        ].concat([].slice.call(arguments)));\n    };\n}\n/**\n * Get the magnitude of a number.\n *\n * @function Highcharts.getMagnitude\n *\n * @param {number} num\n *        The number.\n *\n * @return {number}\n *         The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2 etc.\n */\nfunction getMagnitude(num) {\n    return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n}\n/**\n * Take an interval and normalize it to multiples of round numbers.\n *\n * @deprecated\n * @function Highcharts.normalizeTickInterval\n *\n * @param {number} interval\n *        The raw, un-rounded interval.\n *\n * @param {Array<*>} [multiples]\n *        Allowed multiples.\n *\n * @param {number} [magnitude]\n *        The magnitude of the number.\n *\n * @param {boolean} [allowDecimals]\n *        Whether to allow decimals.\n *\n * @param {boolean} [hasTickAmount]\n *        If it has tickAmount, avoid landing on tick intervals lower than\n *        original.\n *\n * @return {number}\n *         The normalized interval.\n *\n * @todo\n * Move this function to the Axis prototype. It is here only for historical\n * reasons.\n */\nfunction normalizeTickInterval(interval, multiples, magnitude, allowDecimals, hasTickAmount) {\n    let i, retInterval = interval;\n    // Round to a tenfold of 1, 2, 2.5 or 5\n    magnitude = pick(magnitude, getMagnitude(interval));\n    const normalized = interval / magnitude;\n    // Multiples for a linear scale\n    if (!multiples) {\n        multiples = hasTickAmount ?\n            // Finer grained ticks when the tick amount is hard set, including\n            // when alignTicks is true on multiple axes (#4580).\n            [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n            // Else, let ticks fall on rounder numbers\n            [1, 2, 2.5, 5, 10];\n        // The allowDecimals option\n        if (allowDecimals === false) {\n            if (magnitude === 1) {\n                multiples = multiples.filter(function (num) {\n                    return num % 1 === 0;\n                });\n            }\n            else if (magnitude <= 0.1) {\n                multiples = [1 / magnitude];\n            }\n        }\n    }\n    // Normalize the interval to the nearest multiple\n    for (i = 0; i < multiples.length; i++) {\n        retInterval = multiples[i];\n        // Only allow tick amounts smaller than natural\n        if ((hasTickAmount &&\n            retInterval * magnitude >= interval) ||\n            (!hasTickAmount &&\n                (normalized <=\n                    (multiples[i] +\n                        (multiples[i + 1] || multiples[i])) / 2))) {\n            break;\n        }\n    }\n    // Multiply back to the correct magnitude. Correct floats to appropriate\n    // precision (#6085).\n    retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));\n    return retInterval;\n}\n/**\n * Sort an object array and keep the order of equal items. The ECMAScript\n * standard does not specify the behaviour when items are equal.\n *\n * @function Highcharts.stableSort\n *\n * @param {Array<*>} arr\n *        The array to sort.\n *\n * @param {Function} sortFunction\n *        The function to sort it with, like with regular Array.prototype.sort.\n */\nfunction stableSort(arr, sortFunction) {\n    // @todo It seems like Chrome since v70 sorts in a stable way internally,\n    // plus all other browsers do it, so over time we may be able to remove this\n    // function\n    const length = arr.length;\n    let sortValue, i;\n    // Add index to each item\n    for (i = 0; i < length; i++) {\n        arr[i].safeI = i; // Stable sort index\n    }\n    arr.sort(function (a, b) {\n        sortValue = sortFunction(a, b);\n        return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n    });\n    // Remove index from items\n    for (i = 0; i < length; i++) {\n        delete arr[i].safeI; // Stable sort index\n    }\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.min` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMin\n *\n * @param {Array<*>} data\n *        An array of numbers.\n *\n * @return {number}\n *         The lowest number.\n */\nfunction arrayMin(data) {\n    let i = data.length, min = data[0];\n    while (i--) {\n        if (data[i] < min) {\n            min = data[i];\n        }\n    }\n    return min;\n}\n/**\n * Non-recursive method to find the lowest member of an array. `Math.max` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function Highcharts.arrayMax\n *\n * @param {Array<*>} data\n *        An array of numbers.\n *\n * @return {number}\n *         The highest number.\n */\nfunction arrayMax(data) {\n    let i = data.length, max = data[0];\n    while (i--) {\n        if (data[i] > max) {\n            max = data[i];\n        }\n    }\n    return max;\n}\n/**\n * Utility method that destroys any SVGElement instances that are properties on\n * the given object. It loops all properties and invokes destroy if there is a\n * destroy method. The property is then delete.\n *\n * @function Highcharts.destroyObjectProperties\n *\n * @param {*} obj\n *        The object to destroy properties on.\n *\n * @param {*} [except]\n *        Exception, do not destroy this property, only delete it.\n */\nfunction destroyObjectProperties(obj, except, destructablesOnly) {\n    objectEach(obj, function (val, n) {\n        // If the object is non-null and destroy is defined\n        if (val !== except && val?.destroy) {\n            // Invoke the destroy\n            val.destroy();\n        }\n        // Delete the property from the object\n        if (val?.destroy || !destructablesOnly) {\n            delete obj[n];\n        }\n    });\n}\n/**\n * Discard a HTML element\n *\n * @function Highcharts.discardElement\n *\n * @param {Highcharts.HTMLDOMElement} element\n *        The HTML node to discard.\n */\nfunction discardElement(element) {\n    if (element && element.parentElement) {\n        element.parentElement.removeChild(element);\n    }\n}\n/**\n * Fix JS round off float errors.\n *\n * @function Highcharts.correctFloat\n *\n * @param {number} num\n *        A float number to fix.\n *\n * @param {number} [prec=14]\n *        The precision.\n *\n * @return {number}\n *         The corrected float number.\n */\nfunction correctFloat(num, prec) {\n    // When the number is higher than 1e14 use the number (#16275)\n    return num > 1e14 ? num : parseFloat(num.toPrecision(prec || 14));\n}\n/**\n * The time unit lookup\n *\n * @ignore\n */\nconst timeUnits = {\n    millisecond: 1,\n    second: 1000,\n    minute: 60000,\n    hour: 3600000,\n    day: 24 * 3600000,\n    week: 7 * 24 * 3600000,\n    month: 28 * 24 * 3600000,\n    year: 364 * 24 * 3600000\n};\n/**\n * Easing definition\n *\n * @private\n * @function Math.easeInOutSine\n *\n * @param {number} pos\n *        Current position, ranging from 0 to 1.\n *\n * @return {number}\n *         Ease result\n */\nMath.easeInOutSine = function (pos) {\n    return -0.5 * (Math.cos(Math.PI * pos) - 1);\n};\n/**\n * Find the closest distance between two values of a two-dimensional array\n * @private\n * @function Highcharts.getClosestDistance\n *\n * @param {Array<Array<number>>} arrays\n *          An array of arrays of numbers\n *\n * @return {number | undefined}\n *          The closest distance between values\n */\nfunction getClosestDistance(arrays, onError) {\n    const allowNegative = !onError;\n    let closest, loopLength, distance, i;\n    arrays.forEach((xData) => {\n        if (xData.length > 1) {\n            loopLength = xData.length - 1;\n            for (i = loopLength; i > 0; i--) {\n                distance = xData[i] - xData[i - 1];\n                if (distance < 0 && !allowNegative) {\n                    onError?.();\n                    // Only one call\n                    onError = void 0;\n                }\n                else if (distance && (typeof closest === 'undefined' || distance < closest)) {\n                    closest = distance;\n                }\n            }\n        }\n    });\n    return closest;\n}\n/**\n * Returns the value of a property path on a given object.\n *\n * @private\n * @function getNestedProperty\n *\n * @param {string} path\n * Path to the property, for example `custom.myValue`.\n *\n * @param {unknown} obj\n * Instance containing the property on the specific path.\n *\n * @return {unknown}\n * The unknown property value.\n */\nfunction getNestedProperty(path, parent) {\n    const pathElements = path.split('.');\n    while (pathElements.length && defined(parent)) {\n        const pathElement = pathElements.shift();\n        // Filter on the key\n        if (typeof pathElement === 'undefined' ||\n            pathElement === '__proto__') {\n            return; // Undefined\n        }\n        if (pathElement === 'this') {\n            let thisProp;\n            if (isObject(parent)) {\n                thisProp = parent['@this'];\n            }\n            return thisProp ?? parent;\n        }\n        const child = parent[pathElement];\n        // Filter on the child\n        if (!defined(child) ||\n            typeof child === 'function' ||\n            typeof child.nodeType === 'number' ||\n            child === win) {\n            return; // Undefined\n        }\n        // Else, proceed\n        parent = child;\n    }\n    return parent;\n}\n/**\n * Get the computed CSS value for given element and property, only for numerical\n * properties. For width and height, the dimension of the inner box (excluding\n * padding) is returned. Used for fitting the chart within the container.\n *\n * @function Highcharts.getStyle\n *\n * @param {Highcharts.HTMLDOMElement} el\n * An HTML element.\n *\n * @param {string} prop\n * The property name.\n *\n * @param {boolean} [toInt=true]\n * Parse to integer.\n *\n * @return {number|string|undefined}\n * The style value.\n */\nfunction getStyle(el, prop, toInt) {\n    let style;\n    // For width and height, return the actual inner pixel size (#4913)\n    if (prop === 'width') {\n        let offsetWidth = Math.min(el.offsetWidth, el.scrollWidth);\n        // In flex boxes, we need to use getBoundingClientRect and floor it,\n        // because scrollWidth doesn't support subpixel precision (#6427) ...\n        const boundingClientRectWidth = el.getBoundingClientRect &&\n            el.getBoundingClientRect().width;\n        // ...unless if the containing div or its parents are transform-scaled\n        // down, in which case the boundingClientRect can't be used as it is\n        // also scaled down (#9871, #10498).\n        if (boundingClientRectWidth < offsetWidth &&\n            boundingClientRectWidth >= offsetWidth - 1) {\n            offsetWidth = Math.floor(boundingClientRectWidth);\n        }\n        return Math.max(0, // #8377\n        (offsetWidth -\n            (getStyle(el, 'padding-left', true) || 0) -\n            (getStyle(el, 'padding-right', true) || 0)));\n    }\n    if (prop === 'height') {\n        return Math.max(0, // #8377\n        (Math.min(el.offsetHeight, el.scrollHeight) -\n            (getStyle(el, 'padding-top', true) || 0) -\n            (getStyle(el, 'padding-bottom', true) || 0)));\n    }\n    // Otherwise, get the computed style\n    const css = win.getComputedStyle(el, void 0); // eslint-disable-line no-undefined\n    if (css) {\n        style = css.getPropertyValue(prop);\n        if (pick(toInt, prop !== 'opacity')) {\n            style = pInt(style);\n        }\n    }\n    return style;\n}\n/**\n * Search for an item in an array.\n *\n * @function Highcharts.inArray\n *\n * @deprecated\n *\n * @param {*} item\n *        The item to search for.\n *\n * @param {Array<*>} arr\n *        The array or node collection to search in.\n *\n * @param {number} [fromIndex=0]\n *        The index to start searching from.\n *\n * @return {number}\n *         The index within the array, or -1 if not found.\n */\nfunction inArray(item, arr, fromIndex) {\n    error(32, false, void 0, { 'Highcharts.inArray': 'use Array.indexOf' });\n    return arr.indexOf(item, fromIndex);\n}\n/**\n * Return the value of the first element in the array that satisfies the\n * provided testing function.\n *\n * @function Highcharts.find<T>\n *\n * @param {Array<T>} arr\n *        The array to test.\n *\n * @param {Function} callback\n *        The callback function. The function receives the item as the first\n *        argument. Return `true` if this item satisfies the condition.\n *\n * @return {T|undefined}\n *         The value of the element.\n */\nconst find = Array.prototype.find ?\n    function (arr, callback) {\n        return arr.find(callback);\n    } :\n    // Legacy implementation. PhantomJS, IE <= 11 etc. #7223.\n    function (arr, callback) {\n        let i;\n        const length = arr.length;\n        for (i = 0; i < length; i++) {\n            if (callback(arr[i], i)) { // eslint-disable-line node/callback-return\n                return arr[i];\n            }\n        }\n    };\n/**\n * Returns an array of a given object's own properties.\n *\n * @function Highcharts.keys\n * @deprecated\n *\n * @param {*} obj\n *        The object of which the properties are to be returned.\n *\n * @return {Array<string>}\n *         An array of strings that represents all the properties.\n */\nfunction keys(obj) {\n    error(32, false, void 0, { 'Highcharts.keys': 'use Object.keys' });\n    return Object.keys(obj);\n}\n/**\n * Get the element's offset position, corrected for `overflow: auto`.\n *\n * @function Highcharts.offset\n *\n * @param {global.Element} el\n *        The DOM element.\n *\n * @return {Highcharts.OffsetObject}\n *         An object containing `left` and `top` properties for the position in\n *         the page.\n */\nfunction offset(el) {\n    const docElem = doc.documentElement, box = (el.parentElement || el.parentNode) ?\n        el.getBoundingClientRect() :\n        { top: 0, left: 0, width: 0, height: 0 };\n    return {\n        top: box.top + (win.pageYOffset || docElem.scrollTop) -\n            (docElem.clientTop || 0),\n        left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n            (docElem.clientLeft || 0),\n        width: box.width,\n        height: box.height\n    };\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Iterate over object key pairs in an object.\n *\n * @function Highcharts.objectEach<T>\n *\n * @param {*} obj\n *        The object to iterate over.\n *\n * @param {Highcharts.ObjectEachCallbackFunction<T>} fn\n *        The iterator callback. It passes three arguments:\n *        * value - The property value.\n *        * key - The property key.\n *        * obj - The object that objectEach is being applied to.\n *\n * @param {T} [ctx]\n *        The context.\n */\nfunction objectEach(obj, fn, ctx) {\n    /* eslint-enable valid-jsdoc */\n    for (const key in obj) {\n        if (Object.hasOwnProperty.call(obj, key)) {\n            fn.call(ctx || obj[key], obj[key], key, obj);\n        }\n    }\n}\n/**\n * Iterate over an array.\n *\n * @deprecated\n * @function Highcharts.each\n *\n * @param {Array<*>} arr\n *        The array to iterate over.\n *\n * @param {Function} fn\n *        The iterator callback. It passes three arguments:\n *        - `item`: The array item.\n *        - `index`: The item's index in the array.\n *        - `arr`: The array that each is being applied to.\n *\n * @param {*} [ctx]\n *        The context.\n *\n * @return {void}\n */\n/**\n * Filter an array by a callback.\n *\n * @deprecated\n * @function Highcharts.grep\n *\n * @param {Array<*>} arr\n *        The array to filter.\n *\n * @param {Function} callback\n *        The callback function. The function receives the item as the first\n *        argument. Return `true` if the item is to be preserved.\n *\n * @return {Array<*>}\n *         A new, filtered array.\n */\n/**\n * Map an array by a callback.\n *\n * @deprecated\n * @function Highcharts.map\n *\n * @param {Array<*>} arr\n *        The array to map.\n *\n * @param {Function} fn\n *        The callback function. Return the new value for the new array.\n *\n * @return {Array<*>}\n *         A new array item with modified items.\n */\n/**\n * Reduce an array to a single value.\n *\n * @deprecated\n * @function Highcharts.reduce\n *\n * @param {Array<*>} arr\n *        The array to reduce.\n *\n * @param {Function} fn\n *        The callback function. Return the reduced value. Receives 4\n *        arguments: Accumulated/reduced value, current value, current array\n *        index, and the array.\n *\n * @param {*} initialValue\n *        The initial value of the accumulator.\n *\n * @return {*}\n *         The reduced value.\n */\n/**\n * Test whether at least one element in the array passes the test implemented by\n * the provided function.\n *\n * @deprecated\n * @function Highcharts.some\n *\n * @param {Array<*>} arr\n *        The array to test\n *\n * @param {Function} fn\n *        The function to run on each item. Return truthy to pass the test.\n *        Receives arguments `currentValue`, `index` and `array`.\n *\n * @param {*} ctx\n *        The context.\n *\n * @return {boolean}\n */\nobjectEach({\n    map: 'map',\n    each: 'forEach',\n    grep: 'filter',\n    reduce: 'reduce',\n    some: 'some'\n}, function (val, key) {\n    H[key] = function (arr) {\n        error(32, false, void 0, { [`Highcharts.${key}`]: `use Array.${val}` });\n        return Array.prototype[val].apply(arr, [].slice.call(arguments, 1));\n    };\n});\n/* eslint-disable valid-jsdoc */\n/**\n * Add an event listener.\n *\n * @function Highcharts.addEvent<T>\n *\n * @param  {Highcharts.Class<T>|T} el\n *         The element or object to add a listener to. It can be a\n *         {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n *\n * @param  {string} type\n *         The event type.\n *\n * @param  {Highcharts.EventCallbackFunction<T>|Function} fn\n *         The function callback to execute when the event is fired.\n *\n * @param  {Highcharts.EventOptionsObject} [options]\n *         Options for adding the event.\n *\n * @sample highcharts/members/addevent\n *         Use a general `render` event to draw shapes on a chart\n *\n * @return {Function}\n *         A callback function to remove the added event.\n */\nfunction addEvent(el, type, fn, options = {}) {\n    /* eslint-enable valid-jsdoc */\n    // Add hcEvents to either the prototype (in case we're running addEvent on a\n    // class) or the instance. If hasOwnProperty('hcEvents') is false, it is\n    // inherited down the prototype chain, in which case we need to set the\n    // property on this instance (which may itself be a prototype).\n    const owner = typeof el === 'function' && el.prototype || el;\n    if (!Object.hasOwnProperty.call(owner, 'hcEvents')) {\n        owner.hcEvents = {};\n    }\n    const events = owner.hcEvents;\n    // Allow click events added to points, otherwise they will be prevented by\n    // the TouchPointer.pinch function after a pinch zoom operation (#7091).\n    if (H.Point && // Without H a dependency loop occurs\n        el instanceof H.Point &&\n        el.series &&\n        el.series.chart) {\n        el.series.chart.runTrackerClick = true;\n    }\n    // Handle DOM events\n    // If the browser supports passive events, add it to improve performance\n    // on touch events (#11353).\n    const addEventListener = el.addEventListener;\n    if (addEventListener) {\n        addEventListener.call(el, type, fn, H.supportsPassiveEvents ? {\n            passive: options.passive === void 0 ?\n                type.indexOf('touch') !== -1 : options.passive,\n            capture: false\n        } : false);\n    }\n    if (!events[type]) {\n        events[type] = [];\n    }\n    const eventObject = {\n        fn,\n        order: typeof options.order === 'number' ? options.order : Infinity\n    };\n    events[type].push(eventObject);\n    // Order the calls\n    events[type].sort((a, b) => a.order - b.order);\n    // Return a function that can be called to remove this event.\n    return function () {\n        removeEvent(el, type, fn);\n    };\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Remove an event that was added with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.removeEvent<T>\n *\n * @param {Highcharts.Class<T>|T} el\n *        The element to remove events on.\n *\n * @param {string} [type]\n *        The type of events to remove. If undefined, all events are removed\n *        from the element.\n *\n * @param {Highcharts.EventCallbackFunction<T>} [fn]\n *        The specific callback to remove. If undefined, all events that match\n *        the element and optionally the type are removed.\n *\n * @return {void}\n */\nfunction removeEvent(el, type, fn) {\n    /* eslint-enable valid-jsdoc */\n    /**\n     * @private\n     */\n    function removeOneEvent(type, fn) {\n        const removeEventListener = el.removeEventListener;\n        if (removeEventListener) {\n            removeEventListener.call(el, type, fn, false);\n        }\n    }\n    /**\n     * @private\n     */\n    function removeAllEvents(eventCollection) {\n        let types, len;\n        if (!el.nodeName) {\n            return; // Break on non-DOM events\n        }\n        if (type) {\n            types = {};\n            types[type] = true;\n        }\n        else {\n            types = eventCollection;\n        }\n        objectEach(types, function (_val, n) {\n            if (eventCollection[n]) {\n                len = eventCollection[n].length;\n                while (len--) {\n                    removeOneEvent(n, eventCollection[n][len].fn);\n                }\n            }\n        });\n    }\n    const owner = typeof el === 'function' && el.prototype || el;\n    if (Object.hasOwnProperty.call(owner, 'hcEvents')) {\n        const events = owner.hcEvents;\n        if (type) {\n            const typeEvents = (events[type] || []);\n            if (fn) {\n                events[type] = typeEvents.filter(function (obj) {\n                    return fn !== obj.fn;\n                });\n                removeOneEvent(type, fn);\n            }\n            else {\n                removeAllEvents(events);\n                events[type] = [];\n            }\n        }\n        else {\n            removeAllEvents(events);\n            delete owner.hcEvents;\n        }\n    }\n}\n/* eslint-disable valid-jsdoc */\n/**\n * Fire an event that was registered with {@link Highcharts#addEvent}.\n *\n * @function Highcharts.fireEvent<T>\n *\n * @param {T} el\n *        The object to fire the event on. It can be a {@link HTMLDOMElement},\n *        an {@link SVGElement} or any other object.\n *\n * @param {string} type\n *        The type of event.\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n *        Custom event arguments that are passed on as an argument to the event\n *        handler.\n *\n * @param {Highcharts.EventCallbackFunction<T>|Function} [defaultFunction]\n *        The default function to execute if the other listeners haven't\n *        returned false.\n *\n * @return {void}\n */\nfunction fireEvent(el, type, eventArguments, defaultFunction) {\n    /* eslint-enable valid-jsdoc */\n    eventArguments = eventArguments || {};\n    if (doc.createEvent &&\n        (el.dispatchEvent ||\n            (el.fireEvent &&\n                // Enable firing events on Highcharts instance.\n                el !== H))) {\n        const e = doc.createEvent('Events');\n        e.initEvent(type, true, true);\n        eventArguments = extend(e, eventArguments);\n        if (el.dispatchEvent) {\n            el.dispatchEvent(eventArguments);\n        }\n        else {\n            el.fireEvent(type, eventArguments);\n        }\n    }\n    else if (el.hcEvents) {\n        if (!eventArguments.target) {\n            // We're running a custom event\n            extend(eventArguments, {\n                // Attach a simple preventDefault function to skip\n                // default handler if called. The built-in\n                // defaultPrevented property is not overwritable (#5112)\n                preventDefault: function () {\n                    eventArguments.defaultPrevented = true;\n                },\n                // Setting target to native events fails with clicking\n                // the zoom-out button in Chrome.\n                target: el,\n                // If the type is not set, we're running a custom event\n                // (#2297). If it is set, we're running a browser event.\n                type: type\n            });\n        }\n        const events = [];\n        let object = el;\n        let multilevel = false;\n        // Recurse up the inheritance chain and collect hcEvents set as own\n        // objects on the prototypes.\n        while (object.hcEvents) {\n            if (Object.hasOwnProperty.call(object, 'hcEvents') &&\n                object.hcEvents[type]) {\n                if (events.length) {\n                    multilevel = true;\n                }\n                events.unshift.apply(events, object.hcEvents[type]);\n            }\n            object = Object.getPrototypeOf(object);\n        }\n        // For performance reasons, only sort the event handlers in case we are\n        // dealing with multiple levels in the prototype chain. Otherwise, the\n        // events are already sorted in the addEvent function.\n        if (multilevel) {\n            // Order the calls\n            events.sort((a, b) => a.order - b.order);\n        }\n        // Call the collected event handlers\n        events.forEach((obj) => {\n            // If the event handler returns false, prevent the default handler\n            // from executing\n            if (obj.fn.call(el, eventArguments) === false) {\n                eventArguments.preventDefault();\n            }\n        });\n    }\n    // Run the default if not prevented\n    if (defaultFunction && !eventArguments.defaultPrevented) {\n        defaultFunction.call(el, eventArguments);\n    }\n}\nlet serialMode;\n/**\n * Get a unique key for using in internal element id's and pointers. The key is\n * composed of a random hash specific to this Highcharts instance, and a\n * counter.\n *\n * @example\n * let id = uniqueKey(); // => 'highcharts-x45f6hp-0'\n *\n * @function Highcharts.uniqueKey\n *\n * @return {string}\n * A unique key.\n */\nconst uniqueKey = (function () {\n    const hash = Math.random().toString(36).substring(2, 9) + '-';\n    let id = 0;\n    return function () {\n        return 'highcharts-' + (serialMode ? '' : hash) + id++;\n    };\n}());\n/**\n * Activates a serial mode for element IDs provided by\n * {@link Highcharts.uniqueKey}. This mode can be used in automated tests, where\n * a simple comparison of two rendered SVG graphics is needed.\n *\n * **Note:** This is only for testing purposes and will break functionality in\n * webpages with multiple charts.\n *\n * @example\n * if (\n *   process &&\n *   process.env.NODE_ENV === 'development'\n * ) {\n *   Highcharts.useSerialIds(true);\n * }\n *\n * @function Highcharts.useSerialIds\n *\n * @param {boolean} [mode]\n * Changes the state of serial mode.\n *\n * @return {boolean|undefined}\n * State of the serial mode.\n */\nfunction useSerialIds(mode) {\n    return (serialMode = pick(mode, serialMode));\n}\nfunction isFunction(obj) {\n    return typeof obj === 'function';\n}\n// Register Highcharts as a plugin in jQuery\nif (win.jQuery) {\n    /**\n     * Highcharts-extended JQuery.\n     *\n     * @external JQuery\n     */\n    /**\n     * Helper function to return the chart of the current JQuery selector\n     * element.\n     *\n     * @function external:JQuery#highcharts\n     *\n     * @return {Highcharts.Chart}\n     *         The chart that is linked to the JQuery selector element.\n     */ /**\n    * Factory function to create a chart in the current JQuery selector\n    * element.\n    *\n    * @function external:JQuery#highcharts\n    *\n    * @param {'Chart'|'Map'|'StockChart'|string} [className]\n    *        Name of the factory class in the Highcharts namespace.\n    *\n    * @param {Highcharts.Options} [options]\n    *        The chart options structure.\n    *\n    * @param {Highcharts.ChartCallbackFunction} [callback]\n    *        Function to run when the chart has loaded and all external\n    *        images are loaded. Defining a\n    *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n    *        handler is equivalent.\n    *\n    * @return {JQuery}\n    *         The current JQuery selector.\n    */\n    win.jQuery.fn.highcharts = function () {\n        const args = [].slice.call(arguments);\n        if (this[0]) { // `this[0]` is the renderTo div\n            // Create the chart\n            if (args[0]) {\n                new H[ // eslint-disable-line computed-property-spacing, no-new\n                // Constructor defaults to Chart\n                isString(args[0]) ? args.shift() : 'Chart'](this[0], args[0], args[1]);\n                return this;\n            }\n            // When called without parameters or with the return argument,\n            // return an existing chart\n            return charts[attr(this[0], 'data-highcharts-chart')];\n        }\n    };\n}\n/* *\n *\n *  Default Export\n *\n * */\n// TODO use named exports when supported.\nconst Utilities = {\n    addEvent,\n    arrayMax,\n    arrayMin,\n    attr,\n    clamp,\n    clearTimeout: internalClearTimeout,\n    correctFloat,\n    createElement,\n    crisp,\n    css,\n    defined,\n    destroyObjectProperties,\n    diffObjects,\n    discardElement,\n    erase,\n    error,\n    extend,\n    extendClass,\n    find,\n    fireEvent,\n    getClosestDistance,\n    getMagnitude,\n    getNestedProperty,\n    getStyle,\n    inArray,\n    insertItem,\n    isArray,\n    isClass,\n    isDOMElement,\n    isFunction,\n    isNumber,\n    isObject,\n    isString,\n    keys,\n    merge,\n    normalizeTickInterval,\n    objectEach,\n    offset,\n    pad,\n    pick,\n    pInt,\n    pushUnique,\n    relativeLength,\n    removeEvent,\n    replaceNested,\n    splat,\n    stableSort,\n    syncTimeout,\n    timeUnits,\n    uniqueKey,\n    useSerialIds,\n    wrap\n};\nexport default Utilities;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * An animation configuration. Animation configurations can also be defined as\n * booleans, where `false` turns off animation and `true` defaults to a duration\n * of 500ms and defer of 0ms.\n *\n * @interface Highcharts.AnimationOptionsObject\n */ /**\n* A callback function to execute when the animation finishes.\n* @name Highcharts.AnimationOptionsObject#complete\n* @type {Function|undefined}\n*/ /**\n* The animation defer in milliseconds.\n* @name Highcharts.AnimationOptionsObject#defer\n* @type {number|undefined}\n*/ /**\n* The animation duration in milliseconds.\n* @name Highcharts.AnimationOptionsObject#duration\n* @type {number|undefined}\n*/ /**\n* The name of an easing function as defined on the `Math` object.\n* @name Highcharts.AnimationOptionsObject#easing\n* @type {string|Function|undefined}\n*/ /**\n* A callback function to execute on each step of each attribute or CSS property\n* that's being animated. The first argument contains information about the\n* animation and progress.\n* @name Highcharts.AnimationOptionsObject#step\n* @type {Function|undefined}\n*/\n/**\n * Creates a frame for the animated SVG element.\n *\n * @callback Highcharts.AnimationStepCallbackFunction\n *\n * @param {Highcharts.SVGElement} this\n *        The SVG element to animate.\n *\n * @return {void}\n */\n/**\n * Interface description for a class.\n *\n * @interface Highcharts.Class<T>\n * @extends Function\n */ /**\n* Class constructor.\n* @function Highcharts.Class<T>#new\n* @param {...Array<*>} args\n*        Constructor arguments.\n* @return {T}\n*         Class instance.\n*/\n/**\n * A style object with camel case property names to define visual appearance of\n * a SVG element or HTML element. The properties can be whatever styles are\n * supported on the given SVG or HTML element.\n *\n * @example\n * {\n *    fontFamily: 'monospace',\n *    fontSize: '1.2em'\n * }\n *\n * @interface Highcharts.CSSObject\n */ /**\n* @name Highcharts.CSSObject#[key:string]\n* @type {boolean|number|string|undefined}\n*/ /**\n* Background style for the element.\n* @name Highcharts.CSSObject#background\n* @type {string|undefined}\n*/ /**\n* Background color of the element.\n* @name Highcharts.CSSObject#backgroundColor\n* @type {Highcharts.ColorString|undefined}\n*/ /**\n* Border style for the element.\n* @name Highcharts.CSSObject#border\n* @type {string|undefined}\n*/ /**\n* Radius of the element border.\n* @name Highcharts.CSSObject#borderRadius\n* @type {number|undefined}\n*/ /**\n* Color used in the element. The 'contrast' option is a Highcharts custom\n* property that results in black or white, depending on the background of the\n* element.\n* @name Highcharts.CSSObject#color\n* @type {'contrast'|Highcharts.ColorString|undefined}\n*/ /**\n* Style of the mouse cursor when resting over the element.\n* @name Highcharts.CSSObject#cursor\n* @type {Highcharts.CursorValue|undefined}\n*/ /**\n* Font family of the element text. Multiple values have to be in decreasing\n* preference order and separated by comma.\n* @name Highcharts.CSSObject#fontFamily\n* @type {string|undefined}\n*/ /**\n* Font size of the element text.\n* @name Highcharts.CSSObject#fontSize\n* @type {string|undefined}\n*/ /**\n* Font weight of the element text.\n* @name Highcharts.CSSObject#fontWeight\n* @type {string|undefined}\n*/ /**\n* Height of the element.\n* @name Highcharts.CSSObject#height\n* @type {number|undefined}\n*/ /**\n* Width of the element border.\n* @name Highcharts.CSSObject#lineWidth\n* @type {number|undefined}\n*/ /**\n* Opacity of the element.\n* @name Highcharts.CSSObject#opacity\n* @type {number|undefined}\n*/ /**\n* Space around the element content.\n* @name Highcharts.CSSObject#padding\n* @type {string|undefined}\n*/ /**\n* Behaviour of the element when the mouse cursor rests over it.\n* @name Highcharts.CSSObject#pointerEvents\n* @type {string|undefined}\n*/ /**\n* Positioning of the element.\n* @name Highcharts.CSSObject#position\n* @type {string|undefined}\n*/ /**\n* Alignment of the element text.\n* @name Highcharts.CSSObject#textAlign\n* @type {string|undefined}\n*/ /**\n* Additional decoration of the element text.\n* @name Highcharts.CSSObject#textDecoration\n* @type {string|undefined}\n*/ /**\n* Outline style of the element text.\n* @name Highcharts.CSSObject#textOutline\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text. Highcharts SVG elements support\n* `ellipsis` when a `width` is set.\n* @name Highcharts.CSSObject#textOverflow\n* @type {string|undefined}\n*/ /**\n* Top spacing of the element relative to the parent element.\n* @name Highcharts.CSSObject#top\n* @type {string|undefined}\n*/ /**\n* Animated transition of selected element properties.\n* @name Highcharts.CSSObject#transition\n* @type {string|undefined}\n*/ /**\n* Line break style of the element text.\n* @name Highcharts.CSSObject#whiteSpace\n* @type {string|undefined}\n*/ /**\n* Width of the element.\n* @name Highcharts.CSSObject#width\n* @type {number|undefined}\n*/\n/**\n * All possible cursor styles.\n *\n * @typedef {'alias'|'all-scroll'|'auto'|'cell'|'col-resize'|'context-menu'|'copy'|'crosshair'|'default'|'e-resize'|'ew-resize'|'grab'|'grabbing'|'help'|'move'|'n-resize'|'ne-resize'|'nesw-resize'|'no-drop'|'none'|'not-allowed'|'ns-resize'|'nw-resize'|'nwse-resize'|'pointer'|'progress'|'row-resize'|'s-resize'|'se-resize'|'sw-resize'|'text'|'vertical-text'|'w-resize'|'wait'|'zoom-in'|'zoom-out'} Highcharts.CursorValue\n */\n/**\n * All possible dash styles.\n *\n * @typedef {'Dash'|'DashDot'|'Dot'|'LongDash'|'LongDashDot'|'LongDashDotDot'|'ShortDash'|'ShortDashDot'|'ShortDashDotDot'|'ShortDot'|'Solid'} Highcharts.DashStyleValue\n */\n/**\n * Generic dictionary in TypeScript notation.\n * Use the native `AnyRecord` instead.\n *\n * @deprecated\n * @interface Highcharts.Dictionary<T>\n */ /**\n* @name Highcharts.Dictionary<T>#[key:string]\n* @type {T}\n*/\n/**\n * The function callback to execute when the event is fired. The `this` context\n * contains the instance, that fired the event.\n *\n * @callback Highcharts.EventCallbackFunction<T>\n *\n * @param {T} this\n *\n * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n *        Event arguments.\n *\n * @return {boolean|void}\n */\n/**\n * The event options for adding function callback.\n *\n * @interface Highcharts.EventOptionsObject\n */ /**\n* The order the event handler should be called. This opens for having one\n* handler be called before another, independent of in which order they were\n* added.\n* @name Highcharts.EventOptionsObject#order\n* @type {number}\n*/ /**\n* Whether an event should be passive or not.\n* When set to `true`, the function specified by listener will never call\n* `preventDefault()`.\n* @name Highcharts.EventOptionsObject#passive\n* @type boolean\n*/\n/**\n * Formats data as a string. Usually the data is accessible through the `this`\n * keyword.\n *\n * @callback Highcharts.FormatterCallbackFunction<T>\n *\n * @param {T} this\n *        Context to format\n *\n * @return {string}\n *         Formatted text\n */\n/**\n * An object of key-value pairs for HTML attributes.\n *\n * @typedef {Highcharts.Dictionary<boolean|number|string|Function>} Highcharts.HTMLAttributes\n */\n/**\n * An HTML DOM element. The type is a reference to the regular HTMLElement in\n * the global scope.\n *\n * @typedef {global.HTMLElement} Highcharts.HTMLDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement\n */\n/**\n * The iterator callback.\n *\n * @callback Highcharts.ObjectEachCallbackFunction<T>\n *\n * @param {T} this\n *        The context.\n *\n * @param {*} value\n *        The property value.\n *\n * @param {string} key\n *        The property key.\n *\n * @param {*} obj\n *        The object that objectEach is being applied to.\n */\n/**\n * An object containing `left` and `top` properties for the position in the\n * page.\n *\n * @interface Highcharts.OffsetObject\n */ /**\n* Left distance to the page border.\n* @name Highcharts.OffsetObject#left\n* @type {number}\n*/ /**\n* Top distance to the page border.\n* @name Highcharts.OffsetObject#top\n* @type {number}\n*/\n/**\n * Describes a range.\n *\n * @interface Highcharts.RangeObject\n */ /**\n* Maximum number of the range.\n* @name Highcharts.RangeObject#max\n* @type {number}\n*/ /**\n* Minimum number of the range.\n* @name Highcharts.RangeObject#min\n* @type {number}\n*/\n/**\n * If a number is given, it defines the pixel length. If a percentage string is\n * given, like for example `'50%'`, the setting defines a length relative to a\n * base size, for example the size of a container.\n *\n * @typedef {number|string} Highcharts.RelativeSize\n */\n/**\n * Proceed function to call original (wrapped) function.\n *\n * @callback Highcharts.WrapProceedFunction\n *\n * @param {*} [arg1]\n *        Optional argument. Without any arguments defaults to first argument of\n *        the wrapping function.\n *\n * @param {*} [arg2]\n *        Optional argument. Without any arguments defaults to second argument\n *        of the wrapping function.\n *\n * @param {*} [arg3]\n *        Optional argument. Without any arguments defaults to third argument of\n *        the wrapping function.\n *\n * @return {*}\n *         Return value of the original function.\n */\n/**\n * The Highcharts object is the placeholder for all other members, and various\n * utility functions. The most important member of the namespace would be the\n * chart constructor.\n *\n * @example\n * let chart = Highcharts.chart('container', { ... });\n *\n * @namespace Highcharts\n */\n''; // Detach doclets above\n","/* *\n *\n *  Highcharts Border Radius module\n *\n *  Author: Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport D from '../Core/Defaults.js';\nconst { defaultOptions } = D;\nimport H from '../Core/Globals.js';\nconst { noop } = H;\nimport U from '../Core/Utilities.js';\nconst { addEvent, extend, isObject, merge, relativeLength } = U;\n/* *\n *\n *  Constants\n *\n * */\nconst defaultBorderRadiusOptions = {\n    radius: 0,\n    scope: 'stack',\n    where: void 0\n};\n/* *\n *\n *  Variables\n *\n * */\nlet oldArc = noop;\nlet oldRoundedRect = noop;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction applyBorderRadius(path, i, r) {\n    const a = path[i];\n    let b = path[i + 1];\n    if (b[0] === 'Z') {\n        b = path[0];\n    }\n    let line, arc, fromLineToArc;\n    // From straight line to arc\n    if ((a[0] === 'M' || a[0] === 'L') && b[0] === 'A') {\n        line = a;\n        arc = b;\n        fromLineToArc = true;\n        // From arc to straight line\n    }\n    else if (a[0] === 'A' && (b[0] === 'M' || b[0] === 'L')) {\n        line = b;\n        arc = a;\n    }\n    if (line && arc && arc.params) {\n        const bigR = arc[1], \n        // In our use cases, outer pie slice arcs are clockwise and inner\n        // arcs (donut/sunburst etc) are anti-clockwise\n        clockwise = arc[5], params = arc.params, { start, end, cx, cy } = params;\n        // Some geometric constants\n        const relativeR = clockwise ? (bigR - r) : (bigR + r), \n        // The angle, on the big arc, that the border radius arc takes up\n        angleOfBorderRadius = relativeR ? Math.asin(r / relativeR) : 0, angleOffset = clockwise ?\n            angleOfBorderRadius :\n            -angleOfBorderRadius, \n        // The distance along the radius of the big arc to the starting\n        // point of the small border radius arc\n        distanceBigCenterToStartArc = (Math.cos(angleOfBorderRadius) *\n            relativeR);\n        // From line to arc\n        if (fromLineToArc) {\n            // Update the cache\n            params.start = start + angleOffset;\n            // First move to the start position at the radial line. We want to\n            // start one borderRadius closer to the center.\n            line[1] = cx + distanceBigCenterToStartArc * Math.cos(start);\n            line[2] = cy + distanceBigCenterToStartArc * Math.sin(start);\n            // Now draw an arc towards the point where the small circle touches\n            // the great circle.\n            path.splice(i + 1, 0, [\n                'A',\n                r,\n                r,\n                0, // Slanting,\n                0, // Long arc\n                1, // Clockwise\n                cx + bigR * Math.cos(params.start),\n                cy + bigR * Math.sin(params.start)\n            ]);\n            // From arc to line\n        }\n        else {\n            // Update the cache\n            params.end = end - angleOffset;\n            // End the big arc a bit earlier\n            arc[6] = cx + bigR * Math.cos(params.end);\n            arc[7] = cy + bigR * Math.sin(params.end);\n            // Draw a small arc towards a point on the end angle, but one\n            // borderRadius closer to the center relative to the perimeter.\n            path.splice(i + 1, 0, [\n                'A',\n                r,\n                r,\n                0,\n                0,\n                1,\n                cx + distanceBigCenterToStartArc * Math.cos(end),\n                cy + distanceBigCenterToStartArc * Math.sin(end)\n            ]);\n        }\n        // Long or short arc must be reconsidered because we have modified the\n        // start and end points\n        arc[4] = Math.abs(params.end - params.start) < Math.PI ? 0 : 1;\n    }\n}\n/**\n * Extend arc with borderRadius.\n * @private\n */\nfunction arc(x, y, w, h, options = {}) {\n    const path = oldArc(x, y, w, h, options), { innerR = 0, r = w, start = 0, end = 0 } = options;\n    if (options.open || !options.borderRadius) {\n        return path;\n    }\n    const alpha = end - start, sinHalfAlpha = Math.sin(alpha / 2), borderRadius = Math.max(Math.min(relativeLength(options.borderRadius || 0, r - innerR), \n    // Cap to half the sector radius\n    (r - innerR) / 2, \n    // For smaller pie slices, cap to the largest small circle that\n    // can be fitted within the sector\n    (r * sinHalfAlpha) / (1 + sinHalfAlpha)), 0), \n    // For the inner radius, we need an extra cap because the inner arc\n    // is shorter than the outer arc\n    innerBorderRadius = Math.min(borderRadius, 2 * (alpha / Math.PI) * innerR);\n    // Apply turn-by-turn border radius. Start at the end since we're\n    // splicing in arc segments.\n    let i = path.length - 1;\n    while (i--) {\n        applyBorderRadius(path, i, i > 1 ? innerBorderRadius : borderRadius);\n    }\n    return path;\n}\n/** @private */\nfunction seriesOnAfterColumnTranslate() {\n    if (this.options.borderRadius &&\n        !(this.chart.is3d && this.chart.is3d())) {\n        const { options, yAxis } = this, percent = options.stacking === 'percent', seriesDefault = defaultOptions.plotOptions?.[this.type]\n            ?.borderRadius, borderRadius = optionsToObject(options.borderRadius, isObject(seriesDefault) ? seriesDefault : {}), reversed = yAxis.options.reversed;\n        for (const point of this.points) {\n            const { shapeArgs } = point;\n            if (point.shapeType === 'roundedRect' && shapeArgs) {\n                const { width = 0, height = 0, y = 0 } = shapeArgs;\n                let brBoxY = y, brBoxHeight = height;\n                // It would be nice to refactor StackItem.getStackBox/\n                // setOffset so that we could get a reliable box out of\n                // it. Currently it is close if we remove the label\n                // offset, but we still need to run crispCol and also\n                // flip it if inverted, so atm it is simpler to do it\n                // like the below.\n                if (borderRadius.scope === 'stack' &&\n                    point.stackTotal) {\n                    const stackEnd = yAxis.translate(percent ? 100 : point.stackTotal, false, true, false, true), stackThreshold = yAxis.translate(options.threshold || 0, false, true, false, true), box = this.crispCol(0, Math.min(stackEnd, stackThreshold), 0, Math.abs(stackEnd - stackThreshold));\n                    brBoxY = box.y;\n                    brBoxHeight = box.height;\n                }\n                const flip = (point.negative ? -1 : 1) *\n                    (reversed ? -1 : 1) === -1;\n                // Handle the where option\n                let where = borderRadius.where;\n                // Waterfall, hanging columns should have rounding on\n                // all sides\n                if (!where &&\n                    this.is('waterfall') &&\n                    Math.abs((point.yBottom || 0) -\n                        (this.translatedThreshold || 0)) > this.borderWidth) {\n                    where = 'all';\n                }\n                if (!where) {\n                    where = 'end';\n                }\n                // Get the radius\n                const r = Math.min(relativeLength(borderRadius.radius, width), width / 2, \n                // Cap to the height, but not if where is `end`\n                where === 'all' ? height / 2 : Infinity) || 0;\n                // If the `where` option is 'end', cut off the\n                // rectangles by making the border-radius box one r\n                // greater, so that the imaginary radius falls outside\n                // the rectangle.\n                if (where === 'end') {\n                    if (flip) {\n                        brBoxY -= r;\n                        brBoxHeight += r;\n                    }\n                    else {\n                        brBoxHeight += r;\n                    }\n                }\n                extend(shapeArgs, { brBoxHeight, brBoxY, r });\n            }\n        }\n    }\n}\n/** @private */\nfunction compose(SeriesClass, SVGElementClass, SVGRendererClass) {\n    const PieSeriesClass = SeriesClass.types.pie;\n    if (!SVGElementClass.symbolCustomAttribs.includes('borderRadius')) {\n        const symbols = SVGRendererClass.prototype.symbols;\n        addEvent(SeriesClass, 'afterColumnTranslate', seriesOnAfterColumnTranslate, {\n            // After columnrange and polar column modifications\n            order: 9\n        });\n        addEvent(PieSeriesClass, 'afterTranslate', pieSeriesOnAfterTranslate);\n        SVGElementClass.symbolCustomAttribs.push('borderRadius', 'brBoxHeight', 'brBoxY');\n        oldArc = symbols.arc;\n        oldRoundedRect = symbols.roundedRect;\n        symbols.arc = arc;\n        symbols.roundedRect = roundedRect;\n    }\n}\n/** @private */\nfunction optionsToObject(options, seriesBROptions) {\n    if (!isObject(options)) {\n        options = { radius: options || 0 };\n    }\n    return merge(defaultBorderRadiusOptions, seriesBROptions, options);\n}\n/** @private */\nfunction pieSeriesOnAfterTranslate() {\n    const borderRadius = optionsToObject(this.options.borderRadius);\n    for (const point of this.points) {\n        const shapeArgs = point.shapeArgs;\n        if (shapeArgs) {\n            shapeArgs.borderRadius = relativeLength(borderRadius.radius, (shapeArgs.r || 0) - ((shapeArgs.innerR) || 0));\n        }\n    }\n}\n/**\n * Extend roundedRect with individual cutting through rOffset.\n * @private\n */\nfunction roundedRect(x, y, width, height, options = {}) {\n    const path = oldRoundedRect(x, y, width, height, options), { r = 0, brBoxHeight = height, brBoxY = y } = options, brOffsetTop = y - brBoxY, brOffsetBtm = (brBoxY + brBoxHeight) - (y + height), \n    // When the distance to the border-radius box is greater than the r\n    // itself, it means no border radius. The -0.1 accounts for float\n    // rounding errors.\n    rTop = (brOffsetTop - r) > -0.1 ? 0 : r, rBtm = (brOffsetBtm - r) > -0.1 ? 0 : r, cutTop = Math.max(rTop && brOffsetTop, 0), cutBtm = Math.max(rBtm && brOffsetBtm, 0);\n    /*\n\n    The naming of control points:\n\n      / a -------- b \\\n     /                \\\n    h                  c\n    |                  |\n    |                  |\n    |                  |\n    g                  d\n     \\                /\n      \\ f -------- e /\n\n    */\n    const a = [x + rTop, y], b = [x + width - rTop, y], c = [x + width, y + rTop], d = [\n        x + width, y + height - rBtm\n    ], e = [\n        x + width - rBtm,\n        y + height\n    ], f = [x + rBtm, y + height], g = [x, y + height - rBtm], h = [x, y + rTop];\n    const applyPythagoras = (r, altitude) => Math.sqrt(Math.pow(r, 2) - Math.pow(altitude, 2));\n    // Inside stacks, cut off part of the top\n    if (cutTop) {\n        const base = applyPythagoras(rTop, rTop - cutTop);\n        a[0] -= base;\n        b[0] += base;\n        c[1] = h[1] = y + rTop - cutTop;\n    }\n    // Column is lower than the radius. Cut off bottom inside the top\n    // radius.\n    if (height < rTop - cutTop) {\n        const base = applyPythagoras(rTop, rTop - cutTop - height);\n        c[0] = d[0] = x + width - rTop + base;\n        e[0] = Math.min(c[0], e[0]);\n        f[0] = Math.max(d[0], f[0]);\n        g[0] = h[0] = x + rTop - base;\n        c[1] = h[1] = y + height;\n    }\n    // Inside stacks, cut off part of the bottom\n    if (cutBtm) {\n        const base = applyPythagoras(rBtm, rBtm - cutBtm);\n        e[0] += base;\n        f[0] -= base;\n        d[1] = g[1] = y + height - rBtm + cutBtm;\n    }\n    // Cut off top inside the bottom radius\n    if (height < rBtm - cutBtm) {\n        const base = applyPythagoras(rBtm, rBtm - cutBtm - height);\n        c[0] = d[0] = x + width - rBtm + base;\n        b[0] = Math.min(c[0], b[0]);\n        a[0] = Math.max(d[0], a[0]);\n        g[0] = h[0] = x + rBtm - base;\n        d[1] = g[1] = y;\n    }\n    // Preserve the box for data labels\n    path.length = 0;\n    path.push(['M', ...a], \n    // Top side\n    ['L', ...b], \n    // Top right corner\n    ['A', rTop, rTop, 0, 0, 1, ...c], \n    // Right side\n    ['L', ...d], \n    // Bottom right corner\n    ['A', rBtm, rBtm, 0, 0, 1, ...e], \n    // Bottom side\n    ['L', ...f], \n    // Bottom left corner\n    ['A', rBtm, rBtm, 0, 0, 1, ...g], \n    // Left side\n    ['L', ...h], \n    // Top left corner\n    ['A', rTop, rTop, 0, 0, 1, ...a], ['Z']);\n    return path;\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst BorderRadius = {\n    compose,\n    optionsToObject\n};\nexport default BorderRadius;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Detailed options for border radius.\n *\n * @sample  {highcharts} highcharts/plotoptions/column-borderradius/\n *          Rounded columns\n * @sample  highcharts/plotoptions/series-border-radius\n *          Column and pie with rounded border\n *\n * @interface Highcharts.BorderRadiusOptionsObject\n */ /**\n* The border radius. A number signifies pixels. A percentage string, like for\n* example `50%`, signifies a relative size. For columns this is relative to the\n* column width, for pies it is relative to the radius and the inner radius.\n*\n* @name Highcharts.BorderRadiusOptionsObject#radius\n* @type {string|number}\n*/ /**\n* The scope of the rounding for column charts. In a stacked column chart, the\n* value `point` means each single point will get rounded corners. The value\n* `stack` means the rounding will apply to the full stack, so that only points\n* close to the top or bottom will receive rounding.\n*\n* @name Highcharts.BorderRadiusOptionsObject#scope\n* @validvalue [\"point\", \"stack\"]\n* @type {string}\n*/ /**\n* For column charts, where in the point or stack to apply rounding. The `end`\n* value means only those corners at the point value will be rounded, leaving\n* the corners at the base or threshold unrounded. This is the most intuitive\n* behaviour. The `all` value means also the base will be rounded.\n*\n* @name Highcharts.BorderRadiusOptionsObject#where\n* @validvalue [\"all\", \"end\"]\n* @type {string}\n* @default end\n*/\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Core/Globals.js';\nconst { deg2rad } = H;\nimport Series from '../Core/Series/Series.js';\nimport U from '../Core/Utilities.js';\nconst { fireEvent, isNumber, pick, relativeLength } = U;\n/**\n * @private\n */\nvar CenteredUtilities;\n(function (CenteredUtilities) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Get the center of the pie based on the size and center options relative\n     * to the plot area. Borrowed by the polar and gauge series types.\n     *\n     * @private\n     * @function Highcharts.CenteredSeriesMixin.getCenter\n     */\n    function getCenter() {\n        const options = this.options, chart = this.chart, slicingRoom = 2 * (options.slicedOffset || 0), plotWidth = chart.plotWidth - 2 * slicingRoom, plotHeight = chart.plotHeight - 2 * slicingRoom, centerOption = options.center, smallestSize = Math.min(plotWidth, plotHeight), thickness = options.thickness;\n        let handleSlicingRoom, size = options.size, innerSize = options.innerSize || 0, i, value;\n        if (typeof size === 'string') {\n            size = parseFloat(size);\n        }\n        if (typeof innerSize === 'string') {\n            innerSize = parseFloat(innerSize);\n        }\n        const positions = [\n            pick(centerOption[0], '50%'),\n            pick(centerOption[1], '50%'),\n            // Prevent from negative values\n            pick(size && size < 0 ? void 0 : options.size, '100%'),\n            pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')\n        ];\n        // No need for inner size in angular (gauges) series but still required\n        // for pie series\n        if (chart.angular && !(this instanceof Series)) {\n            positions[3] = 0;\n        }\n        for (i = 0; i < 4; ++i) {\n            value = positions[i];\n            handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n            // I == 0: centerX, relative to width\n            // i == 1: centerY, relative to height\n            // i == 2: size, relative to smallestSize\n            // i == 3: innerSize, relative to size\n            positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);\n        }\n        // Inner size cannot be larger than size (#3632)\n        if (positions[3] > positions[2]) {\n            positions[3] = positions[2];\n        }\n        // Thickness overrides innerSize, need to be less than pie size (#6647)\n        if (isNumber(thickness) &&\n            thickness * 2 < positions[2] && thickness > 0) {\n            positions[3] = positions[2] - thickness * 2;\n        }\n        fireEvent(this, 'afterGetCenter', { positions });\n        return positions;\n    }\n    CenteredUtilities.getCenter = getCenter;\n    /**\n     * GetStartAndEndRadians - Calculates start and end angles in radians.\n     * Used in series types such as pie and sunburst.\n     *\n     * @private\n     * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians\n     *\n     * @param {number} [start]\n     *        Start angle in degrees.\n     *\n     * @param {number} [end]\n     *        Start angle in degrees.\n     *\n     * @return {Highcharts.RadianAngles}\n     *         Returns an object containing start and end angles as radians.\n     */\n    function getStartAndEndRadians(start, end) {\n        const startAngle = isNumber(start) ? start : 0, // Must be a number\n        endAngle = ((isNumber(end) && // Must be a number\n            end > startAngle && // Must be larger than the start angle\n            // difference must be less than 360 degrees\n            (end - startAngle) < 360) ?\n            end :\n            startAngle + 360), correction = -90;\n        return {\n            start: deg2rad * (startAngle + correction),\n            end: deg2rad * (endAngle + correction)\n        };\n    }\n    CenteredUtilities.getStartAndEndRadians = getStartAndEndRadians;\n})(CenteredUtilities || (CenteredUtilities = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default CenteredUtilities;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @private\n * @interface Highcharts.RadianAngles\n */ /**\n* @name Highcharts.RadianAngles#end\n* @type {number}\n*/ /**\n* @name Highcharts.RadianAngles#start\n* @type {number}\n*/\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../../Core/Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport ColumnSeriesDefaults from './ColumnSeriesDefaults.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport Series from '../../Core/Series/Series.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport U from '../../Core/Utilities.js';\nconst { clamp, crisp, defined, extend, fireEvent, isArray, isNumber, merge, pick, objectEach } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The column series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.column\n *\n * @augments Highcharts.Series\n */\nclass ColumnSeries extends Series {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Animate the column heights one by one from zero.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#animate\n     *\n     * @param {boolean} init\n     *        Whether to initialize the animation or run it\n     */\n    animate(init) {\n        const series = this, yAxis = this.yAxis, yAxisPos = yAxis.pos, reversed = yAxis.reversed, options = series.options, { clipOffset, inverted } = this.chart, attr = {}, translateProp = inverted ?\n            'translateX' :\n            'translateY';\n        let translateStart, translatedThreshold;\n        if (init && clipOffset) {\n            attr.scaleY = 0.001;\n            translatedThreshold = clamp(yAxis.toPixels(options.threshold), yAxisPos, yAxisPos + yAxis.len);\n            if (inverted) {\n                // Make sure the columns don't cover the axis line during\n                // entrance animation\n                translatedThreshold += reversed ?\n                    -Math.floor(clipOffset[0]) :\n                    Math.ceil(clipOffset[2]);\n                attr.translateX = translatedThreshold - yAxis.len;\n            }\n            else {\n                // Make sure the columns don't cover the axis line during\n                // entrance animation\n                translatedThreshold += reversed ?\n                    Math.ceil(clipOffset[0]) :\n                    -Math.floor(clipOffset[2]);\n                attr.translateY = translatedThreshold;\n            }\n            // Apply final clipping (used in Highcharts Stock) (#7083)\n            // animation is done by scaleY, so clipping is for panes\n            if (series.clipBox) {\n                series.setClip();\n            }\n            series.group.attr(attr);\n        }\n        else { // Run the animation\n            translateStart = Number(series.group.attr(translateProp));\n            series.group.animate({ scaleY: 1 }, extend(animObject(series.options.animation), {\n                // Do the scale synchronously to ensure smooth\n                // updating (#5030, #7228)\n                step: function (val, fx) {\n                    if (series.group) {\n                        attr[translateProp] = translateStart +\n                            fx.pos * (yAxisPos - translateStart);\n                        series.group.attr(attr);\n                    }\n                }\n            }));\n        }\n    }\n    /**\n     * Initialize the series. Extends the basic Series.init method by\n     * marking other series of the same type as dirty.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#init\n     */\n    init(chart, \n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    options) {\n        super.init.apply(this, arguments);\n        const series = this;\n        chart = series.chart;\n        // If the series is added dynamically, force redraw of other\n        // series affected by a new column\n        if (chart.hasRendered) {\n            chart.series.forEach(function (otherSeries) {\n                if (otherSeries.type === series.type) {\n                    otherSeries.isDirty = true;\n                }\n            });\n        }\n    }\n    /**\n     * Return the width and x offset of the columns adjusted for grouping,\n     * groupPadding, pointPadding, pointWidth etc.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#getColumnMetrics\n     */\n    getColumnMetrics() {\n        const series = this, options = series.options, xAxis = series.xAxis, yAxis = series.yAxis, reversedStacks = xAxis.options.reversedStacks, \n        // Keep backward compatibility: reversed xAxis had reversed\n        // stacks\n        reverseStacks = (xAxis.reversed && !reversedStacks) ||\n            (!xAxis.reversed && reversedStacks), stackGroups = {};\n        let stackKey, columnCount = 0;\n        // Get the total number of column type series. This is called on\n        // every series. Consider moving this logic to a chart.orderStacks()\n        // function and call it on init, addSeries and removeSeries\n        if (options.grouping === false) {\n            columnCount = 1;\n        }\n        else {\n            series.chart.series.forEach(function (otherSeries) {\n                const otherYAxis = otherSeries.yAxis, otherOptions = otherSeries.options;\n                let columnIndex;\n                if (otherSeries.type === series.type &&\n                    otherSeries.reserveSpace() &&\n                    yAxis.len === otherYAxis.len &&\n                    yAxis.pos === otherYAxis.pos) { // #642, #2086\n                    if (otherOptions.stacking &&\n                        otherOptions.stacking !== 'group') {\n                        stackKey = otherSeries.stackKey;\n                        if (typeof stackGroups[stackKey] ===\n                            'undefined') {\n                            stackGroups[stackKey] = columnCount++;\n                        }\n                        columnIndex = stackGroups[stackKey];\n                    }\n                    else if (otherOptions.grouping !== false) { // #1162\n                        columnIndex = columnCount++;\n                    }\n                    otherSeries.columnIndex = columnIndex;\n                }\n            });\n        }\n        const categoryWidth = Math.min(Math.abs(xAxis.transA) * ((!xAxis.brokenAxis?.hasBreaks && xAxis.ordinal?.slope) ||\n            options.pointRange ||\n            xAxis.closestPointRange ||\n            xAxis.tickInterval ||\n            1), // #2610\n        xAxis.len // #1535\n        ), groupPadding = categoryWidth * options.groupPadding, groupWidth = categoryWidth - 2 * groupPadding, pointOffsetWidth = groupWidth / (columnCount || 1), pointWidth = Math.min(options.maxPointWidth || xAxis.len, pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))), pointPadding = (pointOffsetWidth - pointWidth) / 2, \n        // #1251, #3737\n        colIndex = (series.columnIndex || 0) + (reverseStacks ? 1 : 0), pointXOffset = pointPadding +\n            (groupPadding +\n                colIndex * pointOffsetWidth -\n                (categoryWidth / 2)) * (reverseStacks ? -1 : 1);\n        // Save it for reading in linked series (Error bars particularly)\n        series.columnMetrics = {\n            width: pointWidth,\n            offset: pointXOffset,\n            paddedWidth: pointOffsetWidth,\n            columnCount\n        };\n        return series.columnMetrics;\n    }\n    /**\n     * Make the columns crisp. The edges are rounded to the nearest full\n     * pixel.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#crispCol\n     */\n    crispCol(x, y, width, height) {\n        const borderWidth = this.borderWidth, inverted = this.chart.inverted, bottom = crisp(y + height, borderWidth, inverted);\n        // Vertical\n        y = crisp(y, borderWidth, inverted);\n        height = bottom - y;\n        // Horizontal. We need to first compute the exact right edge, then\n        // round it and compute the width from there.\n        if (this.options.crisp) {\n            const right = crisp(x + width, borderWidth);\n            x = crisp(x, borderWidth);\n            width = right - x;\n        }\n        return { x, y, width, height };\n    }\n    /**\n     * Adjust for missing columns, according to the `centerInCategory`\n     * option. Missing columns are either single points or stacks where the\n     * point or points are either missing or null.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#adjustForMissingColumns\n     * @param {number} x\n     * The x coordinate of the column, left side\n     *\n     * @param {number} pointWidth\n     * The pointWidth, already computed upstream\n     *\n     * @param {Highcharts.ColumnPoint} point\n     * The point instance\n     *\n     * @param {Highcharts.ColumnMetricsObject} metrics\n     * The series-wide column metrics\n     *\n     * @return {number}\n     * The adjusted x position, or the original if not adjusted\n     */\n    adjustForMissingColumns(x, pointWidth, point, metrics) {\n        if (!point.isNull && metrics.columnCount > 1) {\n            const visibleSeries = this.xAxis.series\n                .filter((s) => s.visible)\n                .map((s) => s.index);\n            let indexInCategory = 0, totalInCategory = 0;\n            // Loop over all the stacks on the Y axis. When stacking is enabled,\n            // these are real point stacks. When stacking is not enabled, but\n            // `centerInCategory` is true, there is one stack handling the\n            // grouping of points in each category. This is done in the\n            // `setGroupedPoints` function.\n            objectEach(this.xAxis.stacking?.stacks, (stack) => {\n                if (typeof point.x === 'number') {\n                    const stackItem = stack[point.x.toString()];\n                    if (stackItem) {\n                        const pointValues = stackItem.points[this.index];\n                        // Look for the index\n                        if (isArray(pointValues)) {\n                            // If there are multiple points with the same X\n                            // then gather all series in category, and\n                            // assign index\n                            const seriesIndexes = Object\n                                .keys(stackItem.points)\n                                .filter((pointKey) => \n                            // Filter out duplicate X's\n                            !pointKey.match(',') &&\n                                // Filter out null points\n                                stackItem.points[pointKey] &&\n                                stackItem.points[pointKey].length > 1)\n                                .map(parseFloat)\n                                .filter((index) => visibleSeries.indexOf(index) !== -1)\n                                .sort((a, b) => b - a);\n                            indexInCategory = seriesIndexes.indexOf(this.index);\n                            totalInCategory = seriesIndexes.length;\n                        }\n                    }\n                }\n            });\n            indexInCategory = this.xAxis.reversed ?\n                totalInCategory - 1 - indexInCategory : indexInCategory;\n            // Compute the adjusted x position\n            const boxWidth = (totalInCategory - 1) * metrics.paddedWidth +\n                pointWidth;\n            x = (point.plotX || 0) + boxWidth / 2 - pointWidth -\n                indexInCategory * metrics.paddedWidth;\n        }\n        return x;\n    }\n    /**\n     * Translate each point to the plot area coordinate system and find\n     * shape positions\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#translate\n     */\n    translate() {\n        const series = this, chart = series.chart, options = series.options, dense = series.dense =\n            series.closestPointRange * series.xAxis.transA < 2, borderWidth = series.borderWidth = pick(options.borderWidth, dense ? 0 : 1 // #3635\n        ), xAxis = series.xAxis, yAxis = series.yAxis, threshold = options.threshold, minPointLength = pick(options.minPointLength, 5), metrics = series.getColumnMetrics(), seriesPointWidth = metrics.width, seriesXOffset = series.pointXOffset = metrics.offset, dataMin = series.dataMin, dataMax = series.dataMax, translatedThreshold = series.translatedThreshold =\n            yAxis.getThreshold(threshold);\n        // Postprocessed for border width\n        let seriesBarW = series.barW =\n            Math.max(seriesPointWidth, 1 + 2 * borderWidth);\n        // When the pointPadding is 0, we want the columns to be packed\n        // tightly, so we allow individual columns to have individual sizes.\n        // When pointPadding is greater, we strive for equal-width columns\n        // (#2694).\n        if (options.pointPadding) {\n            seriesBarW = Math.ceil(seriesBarW);\n        }\n        Series.prototype.translate.apply(series);\n        // Record the new values\n        series.points.forEach(function (point) {\n            const yBottom = pick(point.yBottom, translatedThreshold), safeDistance = 999 + Math.abs(yBottom), plotX = point.plotX || 0, \n            // Don't draw too far outside plot area (#1303, #2241,\n            // #4264)\n            plotY = clamp(point.plotY, -safeDistance, yAxis.len + safeDistance);\n            let up, barY = Math.min(plotY, yBottom), barH = Math.max(plotY, yBottom) - barY, pointWidth = seriesPointWidth, barX = plotX + seriesXOffset, barW = seriesBarW;\n            // Handle options.minPointLength\n            if (minPointLength && Math.abs(barH) < minPointLength) {\n                barH = minPointLength;\n                up = (!yAxis.reversed && !point.negative) ||\n                    (yAxis.reversed && point.negative);\n                // Reverse zeros if there's no positive value in the series\n                // in visible range (#7046)\n                if (isNumber(threshold) &&\n                    isNumber(dataMax) &&\n                    point.y === threshold &&\n                    dataMax <= threshold &&\n                    // And if there's room for it (#7311)\n                    (yAxis.min || 0) < threshold &&\n                    // If all points are the same value (i.e zero) not draw\n                    // as negative points (#10646), but only if there's room\n                    // for it (#14876)\n                    (dataMin !== dataMax || (yAxis.max || 0) <= threshold)) {\n                    up = !up;\n                    point.negative = !point.negative;\n                }\n                // If stacked...\n                barY = (Math.abs(barY - translatedThreshold) > minPointLength ?\n                    // ...keep position\n                    yBottom - minPointLength :\n                    // #1485, #4051\n                    translatedThreshold -\n                        (up ? minPointLength : 0));\n            }\n            // Handle point.options.pointWidth\n            // @todo Handle grouping/stacking too. Calculate offset properly\n            if (defined(point.options.pointWidth)) {\n                pointWidth = barW =\n                    Math.ceil(point.options.pointWidth);\n                barX -= Math.round((pointWidth - seriesPointWidth) / 2);\n            }\n            // Adjust for null or missing points\n            if (options.centerInCategory && !options.stacking) {\n                barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n            }\n            // Cache for access in polar\n            point.barX = barX;\n            point.pointWidth = pointWidth;\n            // Fix the tooltip on center of grouped columns (#1216, #424,\n            // #3648)\n            point.tooltipPos = chart.inverted ?\n                [\n                    clamp(yAxis.len + yAxis.pos - chart.plotLeft - plotY, yAxis.pos - chart.plotLeft, yAxis.len + yAxis.pos - chart.plotLeft),\n                    xAxis.len + xAxis.pos - chart.plotTop - barX - barW / 2,\n                    barH\n                ] :\n                [\n                    xAxis.left - chart.plotLeft + barX + barW / 2,\n                    clamp(plotY + yAxis.pos -\n                        chart.plotTop, yAxis.pos - chart.plotTop, yAxis.len + yAxis.pos - chart.plotTop),\n                    barH\n                ];\n            // Register shape type and arguments to be used in drawPoints. Allow\n            // `shapeType` defined on `pointClass` level.\n            point.shapeType = series.pointClass.prototype.shapeType ||\n                'roundedRect';\n            point.shapeArgs = series.crispCol(barX, \n            // #3169, drilldown from null must have a position to work from.\n            // #6585, dataLabel should be placed on xAxis, not floating in\n            // the middle of the chart.\n            point.isNull ? translatedThreshold : barY, barW, point.isNull ? 0 : barH);\n        });\n        // Fire a specific event after column translate. We could instead apply\n        // all the column logic in an `afterTranslate` event handler, but there\n        // are so many other series types that use the column translation, that\n        // it is more convenient to have a specific event for it.\n        fireEvent(this, 'afterColumnTranslate');\n    }\n    /**\n     * Columns have no graph\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#drawGraph\n     */\n    drawGraph() {\n        this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n    }\n    /**\n     * Get presentational attributes\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#pointAttribs\n     */\n    pointAttribs(point, state) {\n        const options = this.options, p2o = this.pointAttrToOptions || {}, strokeOption = p2o.stroke || 'borderColor', strokeWidthOption = p2o['stroke-width'] || 'borderWidth';\n        let stateOptions, zone, brightness, fill = (point && point.color) || this.color, \n        // Set to fill when borderColor null:\n        stroke = ((point && point[strokeOption]) ||\n            options[strokeOption] ||\n            fill), dashstyle = (point && point.options.dashStyle) || options.dashStyle, strokeWidth = (point && point[strokeWidthOption]) ||\n            options[strokeWidthOption] ||\n            this[strokeWidthOption] || 0, opacity = pick(point && point.opacity, options.opacity, 1);\n        // Handle zone colors\n        if (point && this.zones.length) {\n            zone = point.getZone();\n            // When zones are present, don't use point.color (#4267).\n            // Changed order (#6527), added support for colorAxis (#10670)\n            fill = (point.options.color ||\n                (zone && (zone.color || point.nonZonedColor)) ||\n                this.color);\n            if (zone) {\n                stroke = zone.borderColor || stroke;\n                dashstyle = zone.dashStyle || dashstyle;\n                strokeWidth = zone.borderWidth || strokeWidth;\n            }\n        }\n        // Select or hover states\n        if (state && point) {\n            stateOptions = merge(options.states[state], \n            // #6401\n            point.options.states &&\n                point.options.states[state] ||\n                {});\n            brightness = stateOptions.brightness;\n            fill =\n                stateOptions.color || (typeof brightness !== 'undefined' &&\n                    color(fill)\n                        .brighten(stateOptions.brightness)\n                        .get()) || fill;\n            stroke = stateOptions[strokeOption] || stroke;\n            strokeWidth =\n                stateOptions[strokeWidthOption] || strokeWidth;\n            dashstyle = stateOptions.dashStyle || dashstyle;\n            opacity = pick(stateOptions.opacity, opacity);\n        }\n        const ret = {\n            fill: fill,\n            stroke: stroke,\n            'stroke-width': strokeWidth,\n            opacity: opacity\n        };\n        if (dashstyle) {\n            ret.dashstyle = dashstyle;\n        }\n        return ret;\n    }\n    /**\n     * Draw the columns. For bars, the series.group is rotated, so the same\n     * coordinates apply for columns and bars. This method is inherited by\n     * scatter series.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#drawPoints\n     */\n    drawPoints(points = this.points) {\n        const series = this, chart = this.chart, options = series.options, renderer = chart.renderer, animationLimit = options.animationLimit || 250;\n        let shapeArgs;\n        // Draw the columns\n        points.forEach(function (point) {\n            const plotY = point.plotY;\n            let graphic = point.graphic, hasGraphic = !!graphic, verb = graphic && chart.pointCount < animationLimit ?\n                'animate' : 'attr';\n            if (isNumber(plotY) && point.y !== null) {\n                shapeArgs = point.shapeArgs;\n                // When updating a series between 2d and 3d or cartesian and\n                // polar, the shape type changes.\n                if (graphic && point.hasNewShapeType()) {\n                    graphic = graphic.destroy();\n                }\n                // Set starting position for point sliding animation.\n                if (series.enabledDataSorting) {\n                    point.startXPos = series.xAxis.reversed ?\n                        -(shapeArgs ? (shapeArgs.width || 0) : 0) :\n                        series.xAxis.width;\n                }\n                if (!graphic) {\n                    point.graphic = graphic =\n                        renderer[point.shapeType](shapeArgs)\n                            .add(point.group || series.group);\n                    if (graphic &&\n                        series.enabledDataSorting &&\n                        chart.hasRendered &&\n                        chart.pointCount < animationLimit) {\n                        graphic.attr({\n                            x: point.startXPos\n                        });\n                        hasGraphic = true;\n                        verb = 'animate';\n                    }\n                }\n                if (graphic && hasGraphic) { // Update\n                    graphic[verb](merge(shapeArgs));\n                }\n                // Presentational\n                if (!chart.styledMode) {\n                    graphic[verb](series.pointAttribs(point, (point.selected && 'select')))\n                        .shadow(point.allowShadow !== false && options.shadow);\n                }\n                if (graphic) {\n                    graphic.addClass(point.getClassName(), true);\n                    graphic.attr({\n                        visibility: point.visible ? 'inherit' : 'hidden'\n                    });\n                }\n            }\n            else if (graphic) {\n                point.graphic = graphic.destroy(); // #1269\n            }\n        });\n    }\n    /**\n     * Draw the tracker for a point.\n     * @private\n     */\n    drawTracker(points = this.points) {\n        const series = this, chart = series.chart, pointer = chart.pointer, onMouseOver = function (e) {\n            const point = pointer?.getPointFromEvent(e);\n            // Undefined on graph in scatterchart\n            if (pointer &&\n                point &&\n                series.options.enableMouseTracking) {\n                pointer.isDirectTouch = true;\n                point.onMouseOver(e);\n            }\n        };\n        let dataLabels;\n        // Add reference to the point\n        points.forEach(function (point) {\n            dataLabels = (isArray(point.dataLabels) ?\n                point.dataLabels :\n                (point.dataLabel ? [point.dataLabel] : []));\n            if (point.graphic) {\n                point.graphic.element.point = point;\n            }\n            dataLabels.forEach(function (dataLabel) {\n                (dataLabel.div || dataLabel.element).point = point;\n            });\n        });\n        // Add the event listeners, we need to do this only once\n        if (!series._hasTracking) {\n            series.trackerGroups.forEach(function (key) {\n                if (series[key]) {\n                    // We don't always have dataLabelsGroup\n                    series[key]\n                        .addClass('highcharts-tracker')\n                        .on('mouseover', onMouseOver)\n                        .on('mouseout', function (e) {\n                        pointer?.onTrackerMouseOut(e);\n                    })\n                        .on('touchstart', onMouseOver);\n                    if (!chart.styledMode && series.options.cursor) {\n                        series[key]\n                            .css({ cursor: series.options.cursor });\n                    }\n                }\n            });\n            series._hasTracking = true;\n        }\n        fireEvent(this, 'afterDrawTracker');\n    }\n    /**\n     * Remove this series from the chart\n     *\n     * @private\n     * @function Highcharts.seriesTypes.column#remove\n     */\n    remove() {\n        const series = this, chart = series.chart;\n        // Column and bar series affects other series of the same type\n        // as they are either stacked or grouped\n        if (chart.hasRendered) {\n            chart.series.forEach(function (otherSeries) {\n                if (otherSeries.type === series.type) {\n                    otherSeries.isDirty = true;\n                }\n            });\n        }\n        Series.prototype.remove.apply(series, arguments);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nColumnSeries.defaultOptions = merge(Series.defaultOptions, ColumnSeriesDefaults);\nextend(ColumnSeries.prototype, {\n    // When tooltip is not shared, this series (and derivatives) requires\n    // direct touch/hover. KD-tree does not apply.\n    directTouch: true,\n    getSymbol: noop,\n    // Use separate negative stacks, unlike area stacks where a negative\n    // point is subtracted from previous (#1910)\n    negStacks: true,\n    trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeriesRegistry.registerSeriesType('column', ColumnSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnSeries;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Adjusted width and x offset of the columns for grouping.\n *\n * @private\n * @interface Highcharts.ColumnMetricsObject\n */ /**\n* Width of the columns.\n* @name Highcharts.ColumnMetricsObject#width\n* @type {number}\n*/ /**\n* Offset of the columns.\n* @name Highcharts.ColumnMetricsObject#offset\n* @type {number}\n*/\n''; // Detach doclets above\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Column series display one column per value along an X axis.\n *\n * @sample {highcharts} highcharts/demo/column-basic/\n *         Column chart\n * @sample {highstock} stock/demo/column/\n *         Column chart\n *\n * @extends      plotOptions.line\n * @excluding    connectEnds, connectNulls, gapSize, gapUnit, linecap,\n *               lineWidth, marker, step, useOhlcData\n * @product      highcharts highstock\n * @optionparent plotOptions.column\n */\nconst ColumnSeriesDefaults = {\n    /**\n     * The corner radius of the border surrounding each column or bar. A number\n     * signifies pixels. A percentage string, like for example `50%`, signifies\n     * a relative size. For columns this is relative to the column width, for\n     * pies it is relative to the radius and the inner radius.\n     *\n     * @sample  {highcharts} highcharts/plotoptions/column-borderradius/\n     *          Rounded columns\n     * @sample  highcharts/plotoptions/series-border-radius\n     *          Column and pie with rounded border\n     *\n     * @type    {number|string|Highcharts.BorderRadiusOptionsObject}\n     * @product highcharts highstock gantt\n     */\n    borderRadius: 3,\n    /**\n     * When using automatic point colors pulled from the global\n     * [colors](colors) or series-specific\n     * [plotOptions.column.colors](series.colors) collections, this option\n     * determines whether the chart should receive one color per series or\n     * one color per point.\n     *\n     * In styled mode, the `colors` or `series.colors` arrays are not\n     * supported, and instead this option gives the points individual color\n     * class names on the form `highcharts-color-{n}`.\n     *\n     * @see [series colors](#plotOptions.column.colors)\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-false/\n     *         False by default\n     * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-true/\n     *         True\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     2.0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.colorByPoint\n     */\n    /**\n     * A series specific or series type specific color set to apply instead\n     * of the global [colors](#colors) when [colorByPoint](\n     * #plotOptions.column.colorByPoint) is true.\n     *\n     * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n     * @since     3.0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.colors\n     */\n    /**\n     * When `true`, the columns will center in the category, ignoring null\n     * or missing points. When `false`, space will be reserved for null or\n     * missing points.\n     *\n     * @sample {highcharts} highcharts/series-column/centerincategory/\n     *         Center in category\n     *\n     * @since   8.0.1\n     * @product highcharts highstock gantt\n     */\n    centerInCategory: false,\n    /**\n     * Padding between each value groups, in x axis units.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-grouppadding-default/\n     *         0.2 by default\n     * @sample {highcharts} highcharts/plotoptions/column-grouppadding-none/\n     *         No group padding - all columns are evenly spaced\n     *\n     * @product highcharts highstock gantt\n     */\n    groupPadding: 0.2,\n    /**\n     * Whether to group non-stacked columns or to let them render\n     * independent of each other. Non-grouped columns will be laid out\n     * individually and overlap each other.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-grouping-false/\n     *         Grouping disabled\n     * @sample {highstock} highcharts/plotoptions/column-grouping-false/\n     *         Grouping disabled\n     *\n     * @type      {boolean}\n     * @default   true\n     * @since     2.3.0\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.grouping\n     */\n    /** @ignore-option */\n    marker: null, // Point options are specified in the base options\n    /**\n     * The maximum allowed pixel width for a column, translated to the\n     * height of a bar in a bar chart. This prevents the columns from\n     * becoming too wide when there is a small number of points in the\n     * chart.\n     *\n     * @see [pointWidth](#plotOptions.column.pointWidth)\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-maxpointwidth-20/\n     *         Limited to 50\n     * @sample {highstock} highcharts/plotoptions/column-maxpointwidth-20/\n     *         Limited to 50\n     *\n     * @type      {number}\n     * @since     4.1.8\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.maxPointWidth\n     */\n    /**\n     * Padding between each column or bar, in x axis units.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-pointpadding-default/\n     *         0.1 by default\n     * @sample {highcharts} highcharts/plotoptions/column-pointpadding-025/\n     *          0.25\n     * @sample {highcharts} highcharts/plotoptions/column-pointpadding-none/\n     *         0 for tightly packed columns\n     *\n     * @product highcharts highstock gantt\n     */\n    pointPadding: 0.1,\n    /**\n     * A pixel value specifying a fixed width for each column or bar point.\n     * When set to `undefined`, the width is calculated from the\n     * `pointPadding` and `groupPadding`. The width effects the dimension\n     * that is not based on the point value. For column series it is the\n     * horizontal length and for bar series it is the vertical length.\n     *\n     * @see [maxPointWidth](#plotOptions.column.maxPointWidth)\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-pointwidth-20/\n     *         20px wide columns regardless of chart width or the amount of\n     *         data points\n     *\n     * @type      {number}\n     * @since     1.2.5\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.pointWidth\n     */\n    /**\n     * A pixel value specifying a fixed width for the column or bar.\n     * Overrides pointWidth on the series.\n     *\n     * @see [series.pointWidth](#plotOptions.column.pointWidth)\n     *\n     * @type      {number}\n     * @default   undefined\n     * @since     7.0.0\n     * @product   highcharts highstock gantt\n     * @apioption series.column.data.pointWidth\n     */\n    /**\n     * The minimal height for a column or width for a bar. By default,\n     * 0 values are not shown. To visualize a 0 (or close to zero) point,\n     * set the minimal point length to a pixel value like 3\\. In stacked\n     * column charts, minPointLength might not be respected for tightly\n     * packed values.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-minpointlength/\n     *         Zero base value\n     * @sample {highcharts} highcharts/plotoptions/column-minpointlength-pos-and-neg/\n     *         Positive and negative close to zero values\n     *\n     * @product highcharts highstock gantt\n     */\n    minPointLength: 0,\n    /**\n     * When the series contains less points than the crop threshold, all\n     * points are drawn, event if the points fall outside the visible plot\n     * area at the current zoom. The advantage of drawing all points\n     * (including markers and columns), is that animation is performed on\n     * updates. On the other hand, when the series contains more points than\n     * the crop threshold, the series data is cropped to only contain points\n     * that fall within the plot area. The advantage of cropping away\n     * invisible points is to increase performance on large series.\n     *\n     * @product highcharts highstock gantt\n     */\n    cropThreshold: 50,\n    /**\n     * The X axis range that each point is valid for. This determines the\n     * width of the column. On a categorized axis, the range will be 1\n     * by default (one category unit). On linear and datetime axes, the\n     * range will be computed as the distance between the two closest data\n     * points.\n     *\n     * The default `null` means it is computed automatically, but this\n     * option can be used to override the automatic value.\n     *\n     * This option is set by default to 1 if data sorting is enabled.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-pointrange/\n     *         Set the point range to one day on a data set with one week\n     *         between the points\n     *\n     * @type    {number|null}\n     * @since   2.3\n     * @product highcharts highstock gantt\n     */\n    pointRange: null,\n    states: {\n        /**\n         * Options for the hovered point. These settings override the normal\n         * state options when a point is moused over or touched.\n         *\n         * @extends   plotOptions.series.states.hover\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock gantt\n         */\n        hover: {\n            /** @ignore-option */\n            halo: false,\n            /**\n             * A specific border color for the hovered point. Defaults to\n             * inherit the normal state border color.\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts gantt\n             * @apioption plotOptions.column.states.hover.borderColor\n             */\n            /**\n             * A specific color for the hovered point.\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts gantt\n             * @apioption plotOptions.column.states.hover.color\n             */\n            /**\n             * How much to brighten the point on interaction. Requires the\n             * main color to be defined in hex or rgb(a) format.\n             *\n             * In styled mode, the hover brightening is by default replaced\n             * with a fill-opacity set in the `.highcharts-point:hover`\n             * rule.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-states-hover-brightness/\n             *         Brighten by 0.5\n             *\n             * @product highcharts highstock gantt\n             */\n            brightness: 0.1\n        },\n        /**\n         * Options for the selected point. These settings override the\n         * normal state options when a point is selected.\n         *\n         * @extends   plotOptions.series.states.select\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock gantt\n         */\n        select: {\n            /**\n             * A specific color for the selected point.\n             *\n             * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default #cccccc\n             * @product highcharts highstock gantt\n             */\n            color: \"#cccccc\" /* Palette.neutralColor20 */,\n            /**\n             * A specific border color for the selected point.\n             *\n             * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default #000000\n             * @product highcharts highstock gantt\n             */\n            borderColor: \"#000000\" /* Palette.neutralColor100 */\n        }\n    },\n    dataLabels: {\n        align: void 0,\n        verticalAlign: void 0,\n        /**\n         * The y position offset of the label relative to the point in\n         * pixels.\n         *\n         * @type {number}\n         */\n        y: void 0\n    },\n    // False doesn't work well: https://jsfiddle.net/highcharts/hz8fopan/14/\n    /** @ignore-option */\n    startFromThreshold: true,\n    stickyTracking: false,\n    tooltip: {\n        distance: 6\n    },\n    /**\n     * The Y axis value to serve as the base for the columns, for\n     * distinguishing between values above and below a threshold. If `null`,\n     * the columns extend from the padding Y axis minimum.\n     *\n     * @type    {number|null}\n     * @since   2.0\n     * @product highcharts\n     */\n    threshold: 0,\n    /**\n     * The width of the border surrounding each column or bar. Defaults to\n     * `1` when there is room for a border, but to `0` when the columns are\n     * so dense that a border would cover the next column.\n     *\n     * In styled mode, the stroke width can be set with the\n     * `.highcharts-point` rule.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n     *         2px black border\n     *\n     * @type      {number}\n     * @default   undefined\n     * @product   highcharts highstock gantt\n     * @apioption plotOptions.column.borderWidth\n     */\n    /**\n     * The color of the border surrounding each column or bar.\n     *\n     * In styled mode, the border stroke can be set with the\n     * `.highcharts-point` rule.\n     *\n     * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n     *         Dark gray border\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default   #ffffff\n     * @product   highcharts highstock gantt\n     */\n    borderColor: \"#ffffff\" /* Palette.backgroundColor */\n};\n/**\n * A `column` series. If the [type](#series.column.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.column\n * @excluding connectNulls, dataParser, dataURL, gapSize, gapUnit, linecap,\n *            lineWidth, marker, connectEnds, step\n * @product   highcharts highstock\n * @apioption series.column\n */\n/**\n * An array of data points for the series. For the `column` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 6],\n *        [1, 2],\n *        [2, 6]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.column.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 9,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 6,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @excluding marker\n * @product   highcharts highstock\n * @apioption series.column.data\n */\n/**\n * The color of the border surrounding the column or bar.\n *\n * In styled mode, the border stroke can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n *         Dark gray border\n *\n * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product   highcharts highstock\n * @apioption series.column.data.borderColor\n */\n/**\n * The width of the border surrounding the column or bar.\n *\n * In styled mode, the stroke width can be set with the `.highcharts-point`\n * rule.\n *\n * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n *         2px black border\n *\n * @type      {number}\n * @product   highcharts highstock\n * @apioption series.column.data.borderWidth\n */\n/**\n * A name for the dash style to use for the column or bar. Overrides\n * dashStyle on the series.\n *\n * In styled mode, the stroke dash-array can be set with the same classes as\n * listed under [data.color](#series.column.data.color).\n *\n * @see [series.pointWidth](#plotOptions.column.dashStyle)\n *\n * @type      {Highcharts.DashStyleValue}\n * @apioption series.column.data.dashStyle\n */\n/**\n * A pixel value specifying a fixed width for the column or bar. Overrides\n * pointWidth on the series. The width effects the dimension that is not based\n * on the point value.\n *\n * @see [series.pointWidth](#plotOptions.column.pointWidth)\n *\n * @type      {number}\n * @apioption series.column.data.pointWidth\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.column.states.hover\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.column.states.select\n */\n''; // Keeps doclets above in JS file\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnSeriesDefaults;\n","/* *\n *\n *  Imports\n *\n * */\nimport U from '../../Core/Utilities.js';\nconst { addEvent, correctFloat, defined, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/** @private */\nfunction chartGetHoverPane(eventArgs) {\n    const chart = this;\n    let hoverPane;\n    if (eventArgs) {\n        chart.pane.forEach((pane) => {\n            const x = eventArgs.chartX - chart.plotLeft, y = eventArgs.chartY - chart.plotTop;\n            if (isInsidePane(x, y, pane.center)) {\n                hoverPane = pane;\n            }\n        });\n    }\n    return hoverPane;\n}\n/** @private */\nfunction compose(ChartClass, PointerClass) {\n    const chartProto = ChartClass.prototype;\n    if (!chartProto.getHoverPane) {\n        chartProto.collectionsWithUpdate.push('pane');\n        chartProto.getHoverPane = chartGetHoverPane;\n        addEvent(ChartClass, 'afterIsInsidePlot', onChartAfterIsInsiderPlot);\n        addEvent(PointerClass, 'afterGetHoverData', onPointerAfterGetHoverData);\n        addEvent(PointerClass, 'beforeGetHoverData', onPointerBeforeGetHoverData);\n    }\n}\n/**\n * Check whether element is inside or outside pane.\n * @private\n * @param  {number} x\n * Element's x coordinate\n * @param  {number} y\n * Element's y coordinate\n * @param  {Array<number>} center\n * Pane's center (x, y) and diameter\n * @param  {number} startAngle\n * Pane's normalized start angle in radians (<-PI, PI>)\n * @param  {number} endAngle\n * Pane's normalized end angle in radians (<-PI, PI>)\n */\nfunction isInsidePane(x, y, center, startAngle, endAngle) {\n    let insideSlice = true;\n    const cx = center[0], cy = center[1];\n    const distance = Math.sqrt(Math.pow(x - cx, 2) + Math.pow(y - cy, 2));\n    if (defined(startAngle) && defined(endAngle)) {\n        // Round angle to N-decimals to avoid numeric errors\n        const angle = Math.atan2(correctFloat(y - cy, 8), correctFloat(x - cx, 8));\n        // Ignore full circle panes:\n        if (endAngle !== startAngle) {\n            // If normalized start angle is bigger than normalized end,\n            // it means angles have different signs. In such situation we\n            // check the <-PI, startAngle> and <endAngle, PI> ranges.\n            if (startAngle > endAngle) {\n                insideSlice = (angle >= startAngle &&\n                    angle <= Math.PI) || (angle <= endAngle &&\n                    angle >= -Math.PI);\n            }\n            else {\n                // In this case, we simple check if angle is within the\n                // <startAngle, endAngle> range\n                insideSlice = angle >= startAngle &&\n                    angle <= correctFloat(endAngle, 8);\n            }\n        }\n    }\n    // Round up radius because x and y values are rounded\n    return distance <= Math.ceil(center[2] / 2) && insideSlice;\n}\n/**\n * Check if (x, y) position is within pane for polar.\n * @private\n */\nfunction onChartAfterIsInsiderPlot(e) {\n    const chart = this;\n    if (chart.polar) {\n        if (e.options.inverted) {\n            [e.x, e.y] = [e.y, e.x];\n        }\n        e.isInsidePlot = chart.pane.some((pane) => isInsidePane(e.x, e.y, pane.center, pane.axis && pane.axis.normalizedStartAngleRad, pane.axis && pane.axis.normalizedEndAngleRad));\n    }\n}\n/**\n *\n */\nfunction onPointerAfterGetHoverData(eventArgs) {\n    const chart = this.chart;\n    if (eventArgs.hoverPoint &&\n        eventArgs.hoverPoint.plotX &&\n        eventArgs.hoverPoint.plotY &&\n        chart.hoverPane &&\n        !isInsidePane(eventArgs.hoverPoint.plotX, eventArgs.hoverPoint.plotY, chart.hoverPane.center)) {\n        eventArgs.hoverPoint = void 0;\n    }\n}\n/** @private */\nfunction onPointerBeforeGetHoverData(eventArgs) {\n    const chart = this.chart;\n    if (chart.polar) {\n        // Find pane we are currently hovering over.\n        chart.hoverPane = chart.getHoverPane(eventArgs);\n        // Edit filter method to handle polar\n        eventArgs.filter = function (s) {\n            return (s.visible &&\n                !(!eventArgs.shared && s.directTouch) && // #3821\n                pick(s.options.enableMouseTracking, true) &&\n                (!chart.hoverPane || s.xAxis.pane === chart.hoverPane));\n        };\n    }\n    else {\n        chart.hoverPane = void 0;\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst PaneComposition = {\n    compose\n};\nexport default PaneComposition;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * An array of background items for the pane.\n *\n * @sample {highcharts} highcharts/demo/gauge-speedometer/\n *         Speedometer gauge with multiple backgrounds\n *\n * @type         {Array<*>}\n * @optionparent pane.background\n */\nconst background = {\n    /**\n     * The class name for this background.\n     *\n     * @sample {highcharts} highcharts/css/pane/\n     *         Panes styled by CSS\n     * @sample {highstock} highcharts/css/pane/\n     *         Panes styled by CSS\n     * @sample {highmaps} highcharts/css/pane/\n     *         Panes styled by CSS\n     *\n     * @type      {string}\n     * @default   highcharts-pane\n     * @since     5.0.0\n     * @apioption pane.background.className\n     */\n    /**\n     * The shape of the pane background. When `solid`, the background\n     * is circular. When `arc`, the background extends only from the min\n     * to the max of the value axis.\n     *\n     * @type    {Highcharts.PaneBackgroundShapeValue}\n     * @since   2.3.0\n     * @product highcharts\n     */\n    shape: 'circle',\n    /**\n     * The border radius of the pane background when the shape is `arc`. Can be\n     * a number (pixels) or a percentage string.\n     *\n     * @since 11.4.2\n     * @sample  highcharts/series-solidgauge/pane-borderradius\n     *          Circular gauge and pane with equal border radius\n     * @product highcharts\n     * @type    {number|string}\n     */\n    borderRadius: 0,\n    /**\n     * The pixel border width of the pane background.\n     *\n     * @since 2.3.0\n     * @product highcharts\n     */\n    borderWidth: 1,\n    /**\n     * The pane background border color.\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since   2.3.0\n     * @product highcharts\n     */\n    borderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n    /**\n     * The background color or gradient for the pane.\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: [[0, #ffffff], [1, #e6e6e6]] }\n     * @since   2.3.0\n     * @product highcharts\n     */\n    backgroundColor: {\n        /** @ignore-option */\n        linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n        /** @ignore-option */\n        stops: [\n            [0, \"#ffffff\" /* Palette.backgroundColor */],\n            [1, \"#e6e6e6\" /* Palette.neutralColor10 */]\n        ]\n    },\n    /** @ignore-option */\n    from: -Number.MAX_VALUE, // Corrected to axis min\n    /**\n     * The inner radius of the pane background. Can be either numeric\n     * (pixels) or a percentage string.\n     *\n     * @type    {number|string}\n     * @since   2.3.0\n     * @product highcharts\n     */\n    innerRadius: 0,\n    /** @ignore-option */\n    to: Number.MAX_VALUE, // Corrected to axis max\n    /**\n     * The outer radius of the circular pane background. Can be either\n     * numeric (pixels) or a percentage string.\n     *\n     * @type     {number|string}\n     * @since    2.3.0\n     * @product  highcharts\n     */\n    outerRadius: '105%'\n};\n/**\n * The pane serves as a container for axes and backgrounds for circular\n * gauges and polar charts.\n *\n * @type         {*|Array<*>}\n * @since        2.3.0\n * @product      highcharts\n * @requires     highcharts-more\n * @optionparent pane\n */\nconst pane = {\n    /**\n     * The end angle of the polar X axis or gauge value axis, given in\n     * degrees where 0 is north. Defaults to [startAngle](#pane.startAngle)\n     * + 360.\n     *\n     * @sample {highcharts} highcharts/demo/gauge-vu-meter/\n     *         VU-meter with custom start and end angle\n     *\n     * @type      {number}\n     * @since     2.3.0\n     * @product   highcharts\n     * @apioption pane.endAngle\n     */\n    /**\n     * The center of a polar chart or angular gauge, given as an array\n     * of [x, y] positions. Positions can be given as integers that\n     * transform to pixels, or as percentages of the plot area size.\n     *\n     * @sample {highcharts} highcharts/demo/gauge-vu-meter/\n     *         Two gauges with different center\n     *\n     * @type    {Array<string|number>}\n     * @default [\"50%\", \"50%\"]\n     * @since   2.3.0\n     * @product highcharts\n     */\n    center: ['50%', '50%'],\n    /**\n     * The size of the pane, either as a number defining pixels, or a\n     * percentage defining a percentage of the available plot area (the\n     * smallest of the plot height or plot width).\n     *\n     * @sample {highcharts} highcharts/demo/gauge-vu-meter/\n     *         Smaller size\n     *\n     * @type    {number|string}\n     * @product highcharts\n     */\n    size: '85%',\n    /**\n     * The inner size of the pane, either as a number defining pixels, or a\n     * percentage defining a percentage of the pane's size.\n     *\n     * @sample {highcharts} highcharts/series-polar/column-inverted-inner\n     *         The inner size set to 20%\n     *\n     * @type    {number|string}\n     * @product highcharts\n     */\n    innerSize: '0%',\n    /**\n     * The start angle of the polar X axis or gauge axis, given in degrees\n     * where 0 is north. Defaults to 0.\n     *\n     * @sample {highcharts} highcharts/demo/gauge-vu-meter/\n     *         VU-meter with custom start and end angle\n     *\n     * @since   2.3.0\n     * @product highcharts\n     */\n    startAngle: 0\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst PaneDefaults = {\n    pane,\n    background\n};\nexport default PaneDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport CU from '../../Series/CenteredUtilities.js';\nimport PaneComposition from './PaneComposition.js';\nimport PaneDefaults from './PaneDefaults.js';\nimport U from '../../Core/Utilities.js';\nconst { extend, merge, splat } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The Pane object allows options that are common to a set of X and Y axes.\n *\n * In the future, this can be extended to basic Highcharts and Highcharts Stock.\n *\n * @private\n * @class\n * @name Highcharts.Pane\n * @param {Highcharts.PaneOptions} options\n * @param {Highcharts.Chart} chart\n */\nclass Pane {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(options, chart) {\n        this.coll = 'pane'; // Member of chart.pane\n        this.init(options, chart);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Initialize the Pane object\n     *\n     * @private\n     * @function Highcharts.Pane#init\n     *\n     * @param {Highcharts.PaneOptions} options\n     *\n     * @param {Highcharts.Chart} chart\n     */\n    init(options, chart) {\n        this.chart = chart;\n        this.background = [];\n        chart.pane.push(this);\n        this.setOptions(options);\n    }\n    /**\n     * @private\n     * @function Highcharts.Pane#setOptions\n     *\n     * @param {Highcharts.PaneOptions} options\n     */\n    setOptions(options) {\n        // Set options. Angular charts have a default background (#3318)\n        this.options = options = merge(PaneDefaults.pane, this.chart.angular ? { background: {} } : void 0, options);\n    }\n    /**\n     * Render the pane with its backgrounds.\n     *\n     * @private\n     * @function Highcharts.Pane#render\n     */\n    render() {\n        const options = this.options, renderer = this.chart.renderer;\n        if (!this.group) {\n            this.group = renderer.g('pane-group')\n                .attr({ zIndex: options.zIndex || 0 })\n                .add();\n        }\n        this.updateCenter();\n        let backgroundOption = this.options.background;\n        // Render the backgrounds\n        if (backgroundOption) {\n            backgroundOption = splat(backgroundOption);\n            const len = Math.max(backgroundOption.length, this.background.length || 0);\n            for (let i = 0; i < len; i++) {\n                // #6641 - if axis exists, chart is circular and apply\n                // background\n                if (backgroundOption[i] && this.axis) {\n                    this.renderBackground(merge(PaneDefaults.background, backgroundOption[i]), i);\n                }\n                else if (this.background[i]) {\n                    this.background[i] = this.background[i].destroy();\n                    this.background.splice(i, 1);\n                }\n            }\n        }\n    }\n    /**\n     * Render an individual pane background.\n     *\n     * @private\n     * @function Highcharts.Pane#renderBackground\n     *\n     * @param {Highcharts.PaneBackgroundOptions} backgroundOptions\n     *        Background options\n     *\n     * @param {number} i\n     *        The index of the background in this.backgrounds\n     */\n    renderBackground(backgroundOptions, i) {\n        const attribs = {\n            'class': 'highcharts-pane ' + (backgroundOptions.className || '')\n        };\n        let method = 'animate';\n        if (!this.chart.styledMode) {\n            extend(attribs, {\n                'fill': backgroundOptions.backgroundColor,\n                'stroke': backgroundOptions.borderColor,\n                'stroke-width': backgroundOptions.borderWidth\n            });\n        }\n        if (!this.background[i]) {\n            this.background[i] = this.chart.renderer\n                .path()\n                .add(this.group);\n            method = 'attr';\n        }\n        this.background[i][method]({\n            'd': this.axis.getPlotBandPath(backgroundOptions.from, backgroundOptions.to, backgroundOptions)\n        }).attr(attribs);\n    }\n    /**\n     * Gets the center for the pane and its axis.\n     *\n     * @private\n     * @function Highcharts.Pane#updateCenter\n     * @param {Highcharts.Axis} [axis]\n     */\n    updateCenter(axis) {\n        this.center = (axis ||\n            this.axis ||\n            {}).center = CU.getCenter.call(this);\n    }\n    /**\n     * Destroy the pane item\n     *\n     * @ignore\n     * @private\n     * @function Highcharts.Pane#destroy\n     * /\n    destroy: function () {\n        erase(this.chart.pane, this);\n        this.background.forEach(function (background) {\n            background.destroy();\n        });\n        this.background.length = 0;\n        this.group = this.group.destroy();\n    },\n    */\n    /**\n     * Update the pane item with new options\n     *\n     * @private\n     * @function Highcharts.Pane#update\n     * @param {Highcharts.PaneOptions} options\n     *        New pane options\n     * @param {boolean} [redraw]\n     */\n    update(options, redraw) {\n        merge(true, this.options, options);\n        this.setOptions(this.options);\n        this.render();\n        this.chart.axes.forEach(function (axis) {\n            if (axis.pane === this) {\n                axis.pane = null;\n                axis.update({}, redraw);\n            }\n        }, this);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nPane.compose = PaneComposition.compose;\n/* *\n *\n *  Default Export\n *\n * */\nexport default Pane;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @typedef {\"arc\"|\"circle\"|\"solid\"} Highcharts.PaneBackgroundShapeValue\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { area: { prototype: { pointClass: AreaPoint, pointClass: { prototype: areaProto } } } } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { defined, isNumber } = U;\n/* *\n *\n *  Class\n *\n * */\nclass AreaRangePoint extends AreaPoint {\n    /**\n     * Range series only. The high or maximum value for each data point.\n     * @name Highcharts.Point#high\n     * @type {number|undefined}\n     */\n    /**\n     * Range series only. The low or minimum value for each data point.\n     * @name Highcharts.Point#low\n     * @type {number|undefined}\n     */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    setState() {\n        const prevState = this.state, series = this.series, isPolar = series.chart.polar;\n        if (!defined(this.plotHigh)) {\n            // Boost doesn't calculate plotHigh\n            this.plotHigh = series.yAxis.toPixels(this.high, true);\n        }\n        if (!defined(this.plotLow)) {\n            // Boost doesn't calculate plotLow\n            this.plotLow = this.plotY = series.yAxis.toPixels(this.low, true);\n        }\n        series.lowerStateMarkerGraphic = series.stateMarkerGraphic;\n        series.stateMarkerGraphic = series.upperStateMarkerGraphic;\n        // Change state also for the top marker\n        this.graphic = this.graphics && this.graphics[1];\n        this.plotY = this.plotHigh;\n        if (isPolar && isNumber(this.plotHighX)) {\n            this.plotX = this.plotHighX;\n        }\n        // Top state:\n        areaProto.setState.apply(this, arguments);\n        this.state = prevState;\n        // Now restore defaults\n        this.plotY = this.plotLow;\n        this.graphic = this.graphics && this.graphics[0];\n        if (isPolar && isNumber(this.plotLowX)) {\n            this.plotX = this.plotLowX;\n        }\n        series.upperStateMarkerGraphic = series.stateMarkerGraphic;\n        series.stateMarkerGraphic = series.lowerStateMarkerGraphic;\n        // Lower marker is stored at stateMarkerGraphic\n        // to avoid reference duplication (#7021)\n        series.lowerStateMarkerGraphic = void 0;\n        const originalSettings = series.modifyMarkerSettings();\n        // Bottom state\n        areaProto.setState.apply(this, arguments);\n        // Restore previous state\n        series.restoreMarkerSettings(originalSettings);\n    }\n    haloPath() {\n        const isPolar = this.series.chart.polar;\n        let path = [];\n        // Bottom halo\n        this.plotY = this.plotLow;\n        if (isPolar && isNumber(this.plotLowX)) {\n            this.plotX = this.plotLowX;\n        }\n        if (this.isInside) {\n            path = areaProto.haloPath.apply(this, arguments);\n        }\n        // Top halo\n        this.plotY = this.plotHigh;\n        if (isPolar && isNumber(this.plotHighX)) {\n            this.plotX = this.plotHighX;\n        }\n        if (this.isTopInside) {\n            path = path.concat(areaProto.haloPath.apply(this, arguments));\n        }\n        return path;\n    }\n    isValid() {\n        return isNumber(this.low) && isNumber(this.high);\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaRangePoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AreaRangePoint from './AreaRangePoint.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { area: AreaSeries, area: { prototype: areaProto }, column: { prototype: columnProto } } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, defined, extend, isArray, isNumber, pick, merge } = U;\n/* *\n *\n *  Constants\n *\n * */\n/**\n * The area range series is a carteseian series with higher and lower values for\n * each point along an X axis, where the area between the values is shaded.\n *\n * @sample {highcharts} highcharts/demo/arearange/\n *         Area range chart\n * @sample {highstock} stock/demo/arearange/\n *         Area range chart\n *\n * @extends      plotOptions.area\n * @product      highcharts highstock\n * @excluding    stack, stacking\n * @requires     highcharts-more\n * @optionparent plotOptions.arearange\n *\n * @private\n */\nconst areaRangeSeriesOptions = {\n    /**\n     * @see [fillColor](#plotOptions.arearange.fillColor)\n     * @see [fillOpacity](#plotOptions.arearange.fillOpacity)\n     *\n     * @apioption plotOptions.arearange.color\n     */\n    /**\n     * @default   low\n     * @apioption plotOptions.arearange.colorKey\n     */\n    /**\n     * @see [color](#plotOptions.arearange.color)\n     * @see [fillOpacity](#plotOptions.arearange.fillOpacity)\n     *\n     * @apioption plotOptions.arearange.fillColor\n     */\n    /**\n     * @see [color](#plotOptions.arearange.color)\n     * @see [fillColor](#plotOptions.arearange.fillColor)\n     *\n     * @default   {highcharts} 0.75\n     * @default   {highstock} 0.75\n     * @apioption plotOptions.arearange.fillOpacity\n     */\n    /**\n     * Whether to apply a drop shadow to the graph line. Since 2.3 the\n     * shadow can be an object configuration containing `color`, `offsetX`,\n     * `offsetY`, `opacity` and `width`.\n     *\n     * @type      {boolean|Highcharts.ShadowOptionsObject}\n     * @product   highcharts\n     * @apioption plotOptions.arearange.shadow\n     */\n    /**\n     * Pixel width of the arearange graph line.\n     *\n     * @since 2.3.0\n     *\n     * @private\n     */\n    lineWidth: 1,\n    /**\n     * @type {number|null}\n     */\n    threshold: null,\n    tooltip: {\n        pointFormat: '<span style=\"color:{series.color}\">\\u25CF</span> ' +\n            '{series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'\n    },\n    /**\n     * Whether the whole area or just the line should respond to mouseover\n     * tooltips and other mouse or touch events.\n     *\n     * @since 2.3.0\n     *\n     * @private\n     */\n    trackByArea: true,\n    /**\n     * Extended data labels for range series types. Range series data\n     * labels use no `x` and `y` options. Instead, they have `xLow`,\n     * `xHigh`, `yLow` and `yHigh` options to allow the higher and lower\n     * data label sets individually.\n     *\n     * @declare Highcharts.SeriesAreaRangeDataLabelsOptionsObject\n     * @exclude x, y\n     * @since   2.3.0\n     * @product highcharts highstock\n     *\n     * @private\n     */\n    dataLabels: {\n        align: void 0,\n        verticalAlign: void 0,\n        /**\n         * X offset of the lower data labels relative to the point value.\n         *\n         * @sample highcharts/plotoptions/arearange-datalabels/\n         *         Data labels on range series\n         * @sample highcharts/plotoptions/arearange-datalabels/\n         *         Data labels on range series\n         */\n        xLow: 0,\n        /**\n         * X offset of the higher data labels relative to the point value.\n         *\n         * @sample highcharts/plotoptions/arearange-datalabels/\n         *         Data labels on range series\n         */\n        xHigh: 0,\n        /**\n         * Y offset of the lower data labels relative to the point value.\n         *\n         * @sample highcharts/plotoptions/arearange-datalabels/\n         *         Data labels on range series\n         */\n        yLow: 0,\n        /**\n         * Y offset of the higher data labels relative to the point value.\n         *\n         * @sample highcharts/plotoptions/arearange-datalabels/\n         *         Data labels on range series\n         */\n        yHigh: 0\n    }\n};\n/* *\n *\n *  Class\n *\n * */\n/**\n * The AreaRange series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.arearange\n *\n * @augments Highcharts.Series\n */\nclass AreaRangeSeries extends AreaSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    toYData(point) {\n        return [point.low, point.high];\n    }\n    /**\n     * Translate a point's plotHigh from the internal angle and radius measures\n     * to true plotHigh coordinates. This is an addition of the toXY method\n     * found in Polar.js, because it runs too early for arearanges to be\n     * considered (#3419).\n     * @private\n     */\n    highToXY(point) {\n        // Find the polar plotX and plotY\n        const chart = this.chart, xy = this.xAxis.postTranslate(point.rectPlotX || 0, this.yAxis.len - (point.plotHigh || 0));\n        point.plotHighX = xy.x - chart.plotLeft;\n        point.plotHigh = xy.y - chart.plotTop;\n        point.plotLowX = point.plotX;\n    }\n    /**\n     * Extend the line series' getSegmentPath method by applying the segment\n     * path to both lower and higher values of the range.\n     * @private\n     */\n    getGraphPath(points) {\n        const highPoints = [], highAreaPoints = [], getGraphPath = areaProto.getGraphPath, options = this.options, polar = this.chart.polar, connectEnds = polar && options.connectEnds !== false, connectNulls = options.connectNulls;\n        let i, point, pointShim, step = options.step;\n        points = points || this.points;\n        // Create the top line and the top part of the area fill. The area fill\n        // compensates for null points by drawing down to the lower graph,\n        // moving across the null gap and starting again at the lower graph.\n        i = points.length;\n        while (i--) {\n            point = points[i];\n            // Support for polar\n            const highAreaPoint = polar ? {\n                plotX: point.rectPlotX,\n                plotY: point.yBottom,\n                doCurve: false // #5186, gaps in areasplinerange fill\n            } : {\n                plotX: point.plotX,\n                plotY: point.plotY,\n                doCurve: false // #5186, gaps in areasplinerange fill\n            };\n            if (!point.isNull &&\n                !connectEnds &&\n                !connectNulls &&\n                (!points[i + 1] || points[i + 1].isNull)) {\n                highAreaPoints.push(highAreaPoint);\n            }\n            pointShim = {\n                polarPlotY: point.polarPlotY,\n                rectPlotX: point.rectPlotX,\n                yBottom: point.yBottom,\n                // `plotHighX` is for polar charts\n                plotX: pick(point.plotHighX, point.plotX),\n                plotY: point.plotHigh,\n                isNull: point.isNull\n            };\n            highAreaPoints.push(pointShim);\n            highPoints.push(pointShim);\n            if (!point.isNull &&\n                !connectEnds &&\n                !connectNulls &&\n                (!points[i - 1] || points[i - 1].isNull)) {\n                highAreaPoints.push(highAreaPoint);\n            }\n        }\n        // Get the paths\n        const lowerPath = getGraphPath.call(this, points);\n        if (step) {\n            if (step === true) {\n                step = 'left';\n            }\n            options.step = {\n                left: 'right',\n                center: 'center',\n                right: 'left'\n            }[step]; // Swap for reading in getGraphPath\n        }\n        const higherPath = getGraphPath.call(this, highPoints);\n        const higherAreaPath = getGraphPath.call(this, highAreaPoints);\n        options.step = step;\n        // Create a line on both top and bottom of the range\n        const linePath = [].concat(lowerPath, higherPath);\n        // For the area path, we need to change the 'move' statement into\n        // 'lineTo'\n        if (!this.chart.polar &&\n            higherAreaPath[0] &&\n            higherAreaPath[0][0] === 'M') {\n            // This probably doesn't work for spline\n            higherAreaPath[0] = [\n                'L',\n                higherAreaPath[0][1],\n                higherAreaPath[0][2]\n            ];\n        }\n        this.graphPath = linePath;\n        this.areaPath = lowerPath.concat(higherAreaPath);\n        // Prepare for sideways animation\n        linePath.isArea = true;\n        linePath.xMap = lowerPath.xMap;\n        this.areaPath.xMap = lowerPath.xMap;\n        return linePath;\n    }\n    /**\n     * Extend the basic drawDataLabels method by running it for both lower and\n     * higher values.\n     * @private\n     */\n    drawDataLabels() {\n        const data = this.points, length = data.length, originalDataLabels = [], dataLabelOptions = this.options.dataLabels, inverted = this.chart.inverted;\n        let i, point, up, upperDataLabelOptions, lowerDataLabelOptions;\n        if (dataLabelOptions) {\n            // Split into upper and lower options. If data labels is an array,\n            // the first element is the upper label, the second is the lower.\n            //\n            // TODO: We want to change this and allow multiple labels for both\n            // upper and lower values in the future - introducing some options\n            // for which point value to use as Y for the dataLabel, so that this\n            // could be handled in Series.drawDataLabels. This would also\n            // improve performance since we now have to loop over all the points\n            // multiple times to work around the data label logic.\n            if (isArray(dataLabelOptions)) {\n                upperDataLabelOptions = dataLabelOptions[0] || {\n                    enabled: false\n                };\n                lowerDataLabelOptions = dataLabelOptions[1] || {\n                    enabled: false\n                };\n            }\n            else {\n                // Make copies\n                upperDataLabelOptions = extend({}, dataLabelOptions);\n                upperDataLabelOptions.x = dataLabelOptions.xHigh;\n                upperDataLabelOptions.y = dataLabelOptions.yHigh;\n                lowerDataLabelOptions = extend({}, dataLabelOptions);\n                lowerDataLabelOptions.x = dataLabelOptions.xLow;\n                lowerDataLabelOptions.y = dataLabelOptions.yLow;\n            }\n            // Draw upper labels\n            if (upperDataLabelOptions.enabled || this.hasDataLabels?.()) {\n                // Set preliminary values for plotY and dataLabel\n                // and draw the upper labels\n                i = length;\n                while (i--) {\n                    point = data[i];\n                    if (point) {\n                        const { plotHigh = 0, plotLow = 0 } = point;\n                        up = upperDataLabelOptions.inside ?\n                            plotHigh < plotLow :\n                            plotHigh > plotLow;\n                        point.y = point.high;\n                        point._plotY = point.plotY;\n                        point.plotY = plotHigh;\n                        // Store original data labels and set preliminary label\n                        // objects to be picked up in the uber method\n                        originalDataLabels[i] = point.dataLabel;\n                        point.dataLabel = point.dataLabelUpper;\n                        // Set the default offset\n                        point.below = up;\n                        if (inverted) {\n                            if (!upperDataLabelOptions.align) {\n                                upperDataLabelOptions.align = up ?\n                                    'right' : 'left';\n                            }\n                        }\n                        else {\n                            if (!upperDataLabelOptions.verticalAlign) {\n                                upperDataLabelOptions.verticalAlign = up ?\n                                    'top' :\n                                    'bottom';\n                            }\n                        }\n                    }\n                }\n                this.options.dataLabels = upperDataLabelOptions;\n                if (areaProto.drawDataLabels) {\n                    // #1209:\n                    areaProto.drawDataLabels.apply(this, arguments);\n                }\n                // Reset state after the upper labels were created. Move\n                // it to point.dataLabelUpper and reassign the originals.\n                // We do this here to support not drawing a lower label.\n                i = length;\n                while (i--) {\n                    point = data[i];\n                    if (point) {\n                        point.dataLabelUpper = point.dataLabel;\n                        point.dataLabel = originalDataLabels[i];\n                        delete point.dataLabels;\n                        point.y = point.low;\n                        point.plotY = point._plotY;\n                    }\n                }\n            }\n            // Draw lower labels\n            if (lowerDataLabelOptions.enabled || this.hasDataLabels?.()) {\n                i = length;\n                while (i--) {\n                    point = data[i];\n                    if (point) {\n                        const { plotHigh = 0, plotLow = 0 } = point;\n                        up = lowerDataLabelOptions.inside ?\n                            plotHigh < plotLow :\n                            plotHigh > plotLow;\n                        // Set the default offset\n                        point.below = !up;\n                        if (inverted) {\n                            if (!lowerDataLabelOptions.align) {\n                                lowerDataLabelOptions.align = up ?\n                                    'left' : 'right';\n                            }\n                        }\n                        else {\n                            if (!lowerDataLabelOptions.verticalAlign) {\n                                lowerDataLabelOptions.verticalAlign = up ?\n                                    'bottom' :\n                                    'top';\n                            }\n                        }\n                    }\n                }\n                this.options.dataLabels = lowerDataLabelOptions;\n                if (areaProto.drawDataLabels) {\n                    areaProto.drawDataLabels.apply(this, arguments);\n                }\n            }\n            // Merge upper and lower into point.dataLabels for later destroying\n            if (upperDataLabelOptions.enabled) {\n                i = length;\n                while (i--) {\n                    point = data[i];\n                    if (point) {\n                        point.dataLabels = [\n                            point.dataLabelUpper,\n                            point.dataLabel\n                        ].filter(function (label) {\n                            return !!label;\n                        });\n                    }\n                }\n            }\n            // Reset options\n            this.options.dataLabels = dataLabelOptions;\n        }\n    }\n    alignDataLabel() {\n        columnProto.alignDataLabel.apply(this, arguments);\n    }\n    modifyMarkerSettings() {\n        const series = this, originalMarkerSettings = {\n            marker: series.options.marker,\n            symbol: series.symbol\n        };\n        if (series.options.lowMarker) {\n            const { options: { marker, lowMarker } } = series;\n            series.options.marker = merge(marker, lowMarker);\n            if (lowMarker.symbol) {\n                series.symbol = lowMarker.symbol;\n            }\n        }\n        return originalMarkerSettings;\n    }\n    restoreMarkerSettings(originalSettings) {\n        const series = this;\n        series.options.marker = originalSettings.marker;\n        series.symbol = originalSettings.symbol;\n    }\n    drawPoints() {\n        const series = this, pointLength = series.points.length;\n        let i, point;\n        const originalSettings = series.modifyMarkerSettings();\n        // Draw bottom points\n        areaProto.drawPoints.apply(series, arguments);\n        // Restore previous state\n        series.restoreMarkerSettings(originalSettings);\n        // Prepare drawing top points\n        i = 0;\n        while (i < pointLength) {\n            point = series.points[i];\n            /**\n             * Array for multiple SVG graphics representing the point in the\n             * chart. Only used in cases where the point can not be represented\n             * by a single graphic.\n             *\n             * @see Highcharts.Point#graphic\n             *\n             * @name Highcharts.Point#graphics\n             * @type {Array<Highcharts.SVGElement>|undefined}\n             */\n            point.graphics = point.graphics || [];\n            // Save original props to be overridden by temporary props for top\n            // points\n            point.origProps = {\n                plotY: point.plotY,\n                plotX: point.plotX,\n                isInside: point.isInside,\n                negative: point.negative,\n                zone: point.zone,\n                y: point.y\n            };\n            if (point.graphic || point.graphics[0]) {\n                point.graphics[0] = point.graphic;\n            }\n            point.graphic = point.graphics[1];\n            point.plotY = point.plotHigh;\n            if (defined(point.plotHighX)) {\n                point.plotX = point.plotHighX;\n            }\n            point.y = pick(point.high, point.origProps.y); // #15523\n            point.negative = point.y < (series.options.threshold || 0);\n            if (series.zones.length) {\n                point.zone = point.getZone();\n            }\n            if (!series.chart.polar) {\n                point.isInside = point.isTopInside = (typeof point.plotY !== 'undefined' &&\n                    point.plotY >= 0 &&\n                    point.plotY <= series.yAxis.len && // #3519\n                    point.plotX >= 0 &&\n                    point.plotX <= series.xAxis.len);\n            }\n            i++;\n        }\n        // Draw top points\n        areaProto.drawPoints.apply(series, arguments);\n        // Reset top points preliminary modifications\n        i = 0;\n        while (i < pointLength) {\n            point = series.points[i];\n            point.graphics = point.graphics || [];\n            if (point.graphic || point.graphics[1]) {\n                point.graphics[1] = point.graphic;\n            }\n            point.graphic = point.graphics[0];\n            if (point.origProps) {\n                extend(point, point.origProps);\n                delete point.origProps;\n            }\n            i++;\n        }\n    }\n    hasMarkerChanged(options, oldOptions) {\n        const lowMarker = options.lowMarker, oldMarker = oldOptions.lowMarker || {};\n        return (lowMarker && (lowMarker.enabled === false ||\n            oldMarker.symbol !== lowMarker.symbol || // #10870, #15946\n            oldMarker.height !== lowMarker.height || // #16274\n            oldMarker.width !== lowMarker.width // #16274\n        )) || super.hasMarkerChanged(options, oldOptions);\n    }\n}\n/**\n *\n *  Static Properties\n *\n */\nAreaRangeSeries.defaultOptions = merge(AreaSeries.defaultOptions, areaRangeSeriesOptions);\naddEvent(AreaRangeSeries, 'afterTranslate', function () {\n    // Set plotLow and plotHigh\n    // Rules out lollipop, but lollipop should not inherit range series in the\n    // first place\n    if (this.pointArrayMap.join(',') === 'low,high') {\n        this.points.forEach((point) => {\n            const high = point.high, plotY = point.plotY;\n            if (point.isNull) {\n                point.plotY = void 0;\n            }\n            else {\n                point.plotLow = plotY;\n                // Calculate plotHigh value based on each yAxis scale (#15752)\n                point.plotHigh = isNumber(high) ? this.yAxis.translate(this.dataModify ?\n                    this.dataModify.modifyValue(high) : high, false, true, void 0, true) : void 0;\n                if (this.dataModify) {\n                    point.yBottom = point.plotHigh;\n                }\n            }\n        });\n    }\n}, { order: 0 });\naddEvent(AreaRangeSeries, 'afterTranslate', function () {\n    this.points.forEach((point) => {\n        // Postprocessing after the PolarComposition's afterTranslate\n        if (this.chart.polar) {\n            this.highToXY(point);\n            point.plotLow = point.plotY;\n            point.tooltipPos = [\n                ((point.plotHighX || 0) + (point.plotLowX || 0)) / 2,\n                ((point.plotHigh || 0) + (point.plotLow || 0)) / 2\n            ];\n            // Put the tooltip in the middle of the range\n        }\n        else {\n            const tooltipPos = point.pos(false, point.plotLow), posHigh = point.pos(false, point.plotHigh);\n            if (tooltipPos && posHigh) {\n                tooltipPos[0] = (tooltipPos[0] + posHigh[0]) / 2;\n                tooltipPos[1] = (tooltipPos[1] + posHigh[1]) / 2;\n            }\n            point.tooltipPos = tooltipPos;\n        }\n    });\n}, { order: 3 });\nextend(AreaRangeSeries.prototype, {\n    deferTranslatePolar: true,\n    pointArrayMap: ['low', 'high'],\n    pointClass: AreaRangePoint,\n    pointValKey: 'low',\n    setStackedPoints: noop\n});\nSeriesRegistry.registerSeriesType('arearange', AreaRangeSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaRangeSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AreaRangeSeries from '../AreaRange/AreaRangeSeries.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { spline: { prototype: splineProto } } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { merge, extend } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The areasplinerange series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.areasplinerange\n *\n * @augments Highcharts.Series\n */\nclass AreaSplineRangeSeries extends AreaRangeSeries {\n}\n/* *\n *\n *  Static Properties\n *\n * */\nAreaSplineRangeSeries.defaultOptions = merge(AreaRangeSeries.defaultOptions);\nextend(AreaSplineRangeSeries.prototype, {\n    getPointSpline: splineProto.getPointSpline\n});\nSeriesRegistry.registerSeriesType('areasplinerange', AreaSplineRangeSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaSplineRangeSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * The area spline range is a cartesian series type with higher and\n * lower Y values along an X axis. The area inside the range is colored, and\n * the graph outlining the area is a smoothed spline.\n *\n * @sample {highstock|highstock} stock/demo/areasplinerange/\n *         Area spline range\n *\n * @extends   plotOptions.arearange\n * @since     2.3.0\n * @excluding step, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption plotOptions.areasplinerange\n */\n/**\n * @see [fillColor](#plotOptions.areasplinerange.fillColor)\n * @see [fillOpacity](#plotOptions.areasplinerange.fillOpacity)\n *\n * @apioption plotOptions.areasplinerange.color\n */\n/**\n * @see [color](#plotOptions.areasplinerange.color)\n * @see [fillOpacity](#plotOptions.areasplinerange.fillOpacity)\n *\n * @apioption plotOptions.areasplinerange.fillColor\n */\n/**\n * @see [color](#plotOptions.areasplinerange.color)\n * @see [fillColor](#plotOptions.areasplinerange.fillColor)\n *\n * @default   0.75\n * @apioption plotOptions.areasplinerange.fillOpacity\n */\n/**\n * A `areasplinerange` series. If the [type](#series.areasplinerange.type)\n * option is not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.areasplinerange\n * @excluding dataParser, dataURL, stack, step, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption series.areasplinerange\n */\n/**\n * @see [fillColor](#series.areasplinerange.fillColor)\n * @see [fillOpacity](#series.areasplinerange.fillOpacity)\n *\n * @apioption series.areasplinerange.color\n */\n/**\n * An array of data points for the series. For the `areasplinerange`\n * series type, points can be given in the following ways:\n *\n * 1. An array of arrays with 3 or 2 values. In this case, the values correspond\n *    to `x,low,high`. If the first value is a string, it is applied as the name\n *    of the point, and the `x` value is inferred. The `x` value can also be\n *    omitted, in which case the inner arrays should be of length 2\\. Then the\n *    `x` value is automatically calculated, either starting at 0 and\n *    incremented by 1, or from `pointStart` and `pointInterval` given in the\n *    series options.\n *    ```js\n *    data: [\n *        [0, 0, 5],\n *        [1, 9, 1],\n *        [2, 5, 2]\n *    ]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.areasplinerange.turboThreshold), this option is\n *    not available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        low: 5,\n *        high: 0,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        low: 4,\n *        high: 1,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}\n * @extends   series.arearange.data\n * @product   highcharts highstock\n * @apioption series.areasplinerange.data\n */\n/**\n * @see [color](#series.areasplinerange.color)\n * @see [fillOpacity](#series.areasplinerange.fillOpacity)\n *\n * @apioption series.areasplinerange.fillColor\n */\n/**\n * @see [color](#series.areasplinerange.color)\n * @see [fillColor](#series.areasplinerange.fillColor)\n *\n * @default   0.75\n * @apioption series.areasplinerange.fillOpacity\n */\n''; // Adds doclets above to transpiled file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport BoxPlotSeriesDefaults from './BoxPlotSeriesDefaults.js';\nimport ColumnSeries from '../Column/ColumnSeries.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport U from '../../Core/Utilities.js';\nconst { crisp, extend, merge, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The boxplot series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes#boxplot\n *\n * @augments Highcharts.Series\n */\nclass BoxPlotSeries extends ColumnSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    // Get presentational attributes\n    pointAttribs() {\n        // No attributes should be set on point.graphic which is the group\n        return {};\n    }\n    // Translate data points from raw values x and y to plotX and plotY\n    translate() {\n        const series = this, yAxis = series.yAxis, pointArrayMap = series.pointArrayMap;\n        super.translate.apply(series);\n        // Do the translation on each point dimension\n        series.points.forEach(function (point) {\n            pointArrayMap.forEach(function (key) {\n                if (point[key] !== null) {\n                    point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);\n                }\n            });\n            point.plotHigh = point.highPlot; // For data label validation\n        });\n    }\n    /**\n     * Draw the data points\n     * @private\n     */\n    drawPoints() {\n        const series = this, points = series.points, options = series.options, chart = series.chart, renderer = chart.renderer, \n        // Error bar inherits this series type but doesn't do quartiles\n        doQuartiles = series.doQuartiles !== false, whiskerLength = series.options.whiskerLength;\n        let q1Plot, q3Plot, highPlot, lowPlot, medianPlot, medianPath, boxPath, graphic, width, x, right, halfWidth, pointWiskerLength;\n        for (const point of points) {\n            graphic = point.graphic;\n            const verb = graphic ? 'animate' : 'attr', shapeArgs = point.shapeArgs, boxAttr = {}, stemAttr = {}, whiskersAttr = {}, medianAttr = {}, color = point.color || series.color;\n            if (typeof point.plotY !== 'undefined') {\n                // Vector coordinates\n                width = shapeArgs.width;\n                x = shapeArgs.x;\n                right = x + width;\n                halfWidth = width / 2;\n                q1Plot = doQuartiles ? point.q1Plot : point.lowPlot;\n                q3Plot = doQuartiles ? point.q3Plot : point.lowPlot;\n                highPlot = point.highPlot;\n                lowPlot = point.lowPlot;\n                if (!graphic) {\n                    point.graphic = graphic = renderer.g('point')\n                        .add(series.group);\n                    point.stem = renderer.path()\n                        .addClass('highcharts-boxplot-stem')\n                        .add(graphic);\n                    if (whiskerLength) {\n                        point.whiskers = renderer.path()\n                            .addClass('highcharts-boxplot-whisker')\n                            .add(graphic);\n                    }\n                    if (doQuartiles) {\n                        point.box = renderer.path(boxPath)\n                            .addClass('highcharts-boxplot-box')\n                            .add(graphic);\n                    }\n                    point.medianShape = renderer.path(medianPath)\n                        .addClass('highcharts-boxplot-median')\n                        .add(graphic);\n                }\n                if (!chart.styledMode) {\n                    // Stem attributes\n                    stemAttr.stroke =\n                        point.stemColor || options.stemColor || color;\n                    stemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);\n                    stemAttr.dashstyle = (point.stemDashStyle ||\n                        options.stemDashStyle ||\n                        options.dashStyle);\n                    point.stem.attr(stemAttr);\n                    // Whiskers attributes\n                    if (whiskerLength) {\n                        whiskersAttr.stroke = (point.whiskerColor ||\n                            options.whiskerColor ||\n                            color);\n                        whiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);\n                        whiskersAttr.dashstyle = (point.whiskerDashStyle ||\n                            options.whiskerDashStyle ||\n                            options.dashStyle);\n                        point.whiskers.attr(whiskersAttr);\n                    }\n                    if (doQuartiles) {\n                        boxAttr.fill = (point.fillColor ||\n                            options.fillColor ||\n                            color);\n                        boxAttr.stroke = options.lineColor || color;\n                        boxAttr['stroke-width'] = options.lineWidth || 0;\n                        boxAttr.dashstyle = (point.boxDashStyle ||\n                            options.boxDashStyle ||\n                            options.dashStyle);\n                        point.box.attr(boxAttr);\n                    }\n                    // Median attributes\n                    medianAttr.stroke = (point.medianColor ||\n                        options.medianColor ||\n                        color);\n                    medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);\n                    medianAttr.dashstyle = (point.medianDashStyle ||\n                        options.medianDashStyle ||\n                        options.dashStyle);\n                    point.medianShape.attr(medianAttr);\n                }\n                let d;\n                // The stem\n                const stemX = crisp((point.plotX || 0) + (series.pointXOffset || 0) +\n                    ((series.barW || 0) / 2), point.stem.strokeWidth());\n                d = [\n                    // Stem up\n                    ['M', stemX, q3Plot],\n                    ['L', stemX, highPlot],\n                    // Stem down\n                    ['M', stemX, q1Plot],\n                    ['L', stemX, lowPlot]\n                ];\n                point.stem[verb]({ d });\n                // The box\n                if (doQuartiles) {\n                    const boxStrokeWidth = point.box.strokeWidth();\n                    q1Plot = crisp(q1Plot, boxStrokeWidth);\n                    q3Plot = crisp(q3Plot, boxStrokeWidth);\n                    x = crisp(x, boxStrokeWidth);\n                    right = crisp(right, boxStrokeWidth);\n                    d = [\n                        ['M', x, q3Plot],\n                        ['L', x, q1Plot],\n                        ['L', right, q1Plot],\n                        ['L', right, q3Plot],\n                        ['L', x, q3Plot],\n                        ['Z']\n                    ];\n                    point.box[verb]({ d });\n                }\n                // The whiskers\n                if (whiskerLength) {\n                    const whiskerStrokeWidth = point.whiskers.strokeWidth();\n                    highPlot = crisp(point.highPlot, whiskerStrokeWidth);\n                    lowPlot = crisp(point.lowPlot, whiskerStrokeWidth);\n                    pointWiskerLength = (typeof whiskerLength === 'string' &&\n                        (/%$/).test(whiskerLength)) ?\n                        halfWidth * parseFloat(whiskerLength) / 100 :\n                        Number(whiskerLength) / 2;\n                    d = [\n                        // High whisker\n                        ['M', crisp(stemX - pointWiskerLength), highPlot],\n                        ['L', crisp(stemX + pointWiskerLength), highPlot],\n                        // Low whisker\n                        ['M', crisp(stemX - pointWiskerLength), lowPlot],\n                        ['L', crisp(stemX + pointWiskerLength), lowPlot]\n                    ];\n                    point.whiskers[verb]({ d });\n                }\n                // The median\n                medianPlot = crisp(point.medianPlot, point.medianShape.strokeWidth());\n                d = [\n                    ['M', x, medianPlot],\n                    ['L', right, medianPlot]\n                ];\n                point.medianShape[verb]({ d });\n            }\n        }\n    }\n    // Return a plain array for speedy calculation\n    toYData(point) {\n        return [point.low, point.q1, point.median, point.q3, point.high];\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nBoxPlotSeries.defaultOptions = merge(ColumnSeries.defaultOptions, BoxPlotSeriesDefaults);\nextend(BoxPlotSeries.prototype, {\n    // Array point configs are mapped to this\n    pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'],\n    // Defines the top of the tracker\n    pointValKey: 'high',\n    // Disable data labels for box plot\n    drawDataLabels: noop,\n    setStackedPoints: noop // #3890\n});\nSeriesRegistry.registerSeriesType('boxplot', BoxPlotSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default BoxPlotSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A box plot is a convenient way of depicting groups of data through their\n * five-number summaries: the smallest observation (sample minimum), lower\n * quartile (Q1), median (Q2), upper quartile (Q3), and largest observation\n * (sample maximum).\n *\n * @sample highcharts/demo/box-plot/\n *         Box plot\n * @sample {highcharts} highcharts/css/boxplot/\n *         Box plot in styled mode\n * @sample {highcharts} highcharts/series-scatter/jitter-boxplot\n *         Jittered scatter plot on top of a box plot\n *\n * @extends      plotOptions.column\n * @excluding    borderColor, borderRadius, borderWidth, groupZPadding,\n *               states, boostThreshold, boostBlending\n * @product      highcharts\n * @requires     highcharts-more\n * @optionparent plotOptions.boxplot\n */\nconst BoxPlotSeriesDefaults = {\n    /**\n     * @type {number|null}\n     */\n    threshold: null,\n    tooltip: {\n        pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> <b>' +\n            '{series.name}</b><br/>' +\n            'Maximum: {point.high}<br/>' +\n            'Upper quartile: {point.q3}<br/>' +\n            'Median: {point.median}<br/>' +\n            'Lower quartile: {point.q1}<br/>' +\n            'Minimum: {point.low}<br/>'\n    },\n    /**\n     * The length of the whiskers, the horizontal lines marking low and\n     * high values. It can be a numerical pixel value, or a percentage\n     * value of the box width. Set `0` to disable whiskers.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         True by default\n     *\n     * @type    {number|string}\n     * @since   3.0\n     * @product highcharts\n     */\n    whiskerLength: '50%',\n    /**\n     * The fill color of the box.\n     *\n     * In styled mode, the fill color can be set with the\n     * `.highcharts-boxplot-box` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default #ffffff\n     * @since   3.0\n     * @product highcharts\n     */\n    fillColor: \"#ffffff\" /* Palette.backgroundColor */,\n    /**\n     * The width of the line surrounding the box. If any of\n     * [stemWidth](#plotOptions.boxplot.stemWidth),\n     * [medianWidth](#plotOptions.boxplot.medianWidth)\n     * or [whiskerWidth](#plotOptions.boxplot.whiskerWidth) are `null`,\n     * the lineWidth also applies to these lines.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @since   3.0\n     * @product highcharts\n     */\n    lineWidth: 1,\n    /**\n     * The color of the median line. If `undefined`, the general series\n     * color applies.\n     *\n     * In styled mode, the median stroke width can be set with the\n     * `.highcharts-boxplot-median` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.medianColor\n     */\n    /**\n     * The pixel width of the median line. If `null`, the\n     * [lineWidth](#plotOptions.boxplot.lineWidth) is used.\n     *\n     * In styled mode, the median stroke width can be set with the\n     * `.highcharts-boxplot-median` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @type    {number|null}\n     * @since   3.0\n     * @product highcharts\n     */\n    medianWidth: 2,\n    /*\n    // States are not working and are removed from docs.\n    // Refer to: #2340\n    states: {\n        hover: {\n            brightness: -0.3\n        }\n    },\n    */\n    /**\n     * The color of the stem, the vertical line extending from the box to\n     * the whiskers. If `undefined`, the series color is used.\n     *\n     * In styled mode, the stem stroke can be set with the\n     * `.highcharts-boxplot-stem` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.stemColor\n     */\n    /**\n     * The dash style of the box.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @default   Solid\n     * @since 8.1.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.boxDashStyle\n     */\n    /**\n     * The dash style of the median.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @default   Solid\n     * @since 8.1.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.medianDashStyle\n     */\n    /**\n     * The dash style of the stem, the vertical line extending from the\n     * box to the whiskers.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @default   Solid\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.stemDashStyle\n     */\n    /**\n     * The dash style of the whiskers.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @type      {Highcharts.DashStyleValue}\n     * @default   Solid\n     * @since 8.1.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.whiskerDashStyle\n     */\n    /**\n     * The width of the stem, the vertical line extending from the box to\n     * the whiskers. If `undefined`, the width is inherited from the\n     * [lineWidth](#plotOptions.boxplot.lineWidth) option.\n     *\n     * In styled mode, the stem stroke width can be set with the\n     * `.highcharts-boxplot-stem` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type      {number}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.stemWidth\n     */\n    /**\n     * @default   high\n     * @apioption plotOptions.boxplot.colorKey\n     */\n    /**\n     * The color of the whiskers, the horizontal lines marking low and high\n     * values. When `undefined`, the general series color is used.\n     *\n     * In styled mode, the whisker stroke can be set with the\n     * `.highcharts-boxplot-whisker` class .\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.boxplot.whiskerColor\n     */\n    /**\n     * The line width of the whiskers, the horizontal lines marking low and\n     * high values. When `undefined`, the general\n     * [lineWidth](#plotOptions.boxplot.lineWidth) applies.\n     *\n     * In styled mode, the whisker stroke width can be set with the\n     * `.highcharts-boxplot-whisker` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n     *         Box plot styling\n     * @sample {highcharts} highcharts/css/boxplot/\n     *         Box plot in styled mode\n     *\n     * @since   3.0\n     * @product highcharts\n     */\n    whiskerWidth: 2\n};\n/**\n * A `boxplot` series. If the [type](#series.boxplot.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.boxplot\n * @excluding dataParser, dataURL, marker, stack, stacking, states,\n *            boostThreshold, boostBlending\n * @product   highcharts\n * @requires  highcharts-more\n * @apioption series.boxplot\n */\n/**\n * An array of data points for the series. For the `boxplot` series\n * type, points can be given in the following ways:\n *\n * 1. An array of arrays with 6 or 5 values. In this case, the values correspond\n *    to `x,low,q1,median,q3,high`. If the first value is a string, it is\n *    applied as the name of the point, and the `x` value is inferred. The `x`\n *    value can also be omitted, in which case the inner arrays should be of\n *    length 5. Then the `x` value is automatically calculated, either starting\n *    at 0 and incremented by 1, or from `pointStart` and `pointInterval` given\n *    in the series options.\n *    ```js\n *    data: [\n *        [0, 3, 0, 10, 3, 5],\n *        [1, 7, 8, 7, 2, 9],\n *        [2, 6, 9, 5, 1, 3]\n *    ]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.boxplot.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        low: 4,\n *        q1: 9,\n *        median: 9,\n *        q3: 1,\n *        high: 10,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        low: 5,\n *        q1: 7,\n *        median: 3,\n *        q3: 6,\n *        high: 2,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<Array<(number|string),number,number,number,number>|Array<(number|string),number,number,number,number,number>|*>}\n * @extends   series.line.data\n * @excluding marker\n * @product   highcharts\n * @apioption series.boxplot.data\n */\n/**\n * The `high` value for each data point, signifying the highest value\n * in the sample set. The top whisker is drawn here.\n *\n * @type      {number}\n * @product   highcharts\n * @apioption series.boxplot.data.high\n */\n/**\n * The `low` value for each data point, signifying the lowest value\n * in the sample set. The bottom whisker is drawn here.\n *\n * @type      {number}\n * @product   highcharts\n * @apioption series.boxplot.data.low\n */\n/**\n * The median for each data point. This is drawn as a line through the\n * middle area of the box.\n *\n * @type      {number}\n * @product   highcharts\n * @apioption series.boxplot.data.median\n */\n/**\n * The lower quartile for each data point. This is the bottom of the\n * box.\n *\n * @type      {number}\n * @product   highcharts\n * @apioption series.boxplot.data.q1\n */\n/**\n * The higher quartile for each data point. This is the top of the box.\n *\n * @type      {number}\n * @product   highcharts\n * @apioption series.boxplot.data.q3\n */\n/**\n * The dash style of the box.\n *\n * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n *         Box plot styling\n * @sample {highcharts} highcharts/css/boxplot/\n *         Box plot in styled mode\n *\n * @type      {Highcharts.DashStyleValue}\n * @default   Solid\n * @since 8.1.0\n * @product   highcharts\n * @apioption series.boxplot.data.boxDashStyle\n */\n/**\n * The dash style of the median.\n *\n * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n *         Box plot styling\n * @sample {highcharts} highcharts/css/boxplot/\n *         Box plot in styled mode\n *\n * @type      {Highcharts.DashStyleValue}\n * @default   Solid\n * @since 8.1.0\n * @product   highcharts\n * @apioption series.boxplot.data.medianDashStyle\n */\n/**\n * The dash style of the stem.\n *\n * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n *         Box plot styling\n * @sample {highcharts} highcharts/css/boxplot/\n *         Box plot in styled mode\n *\n * @type      {Highcharts.DashStyleValue}\n * @default   Solid\n * @since 8.1.0\n * @product   highcharts\n * @apioption series.boxplot.data.stemDashStyle\n */\n/**\n * The dash style of the whiskers.\n *\n * @sample {highcharts} highcharts/plotoptions/box-plot-styling/\n *         Box plot styling\n * @sample {highcharts} highcharts/css/boxplot/\n *         Box plot in styled mode\n *\n * @type      {Highcharts.DashStyleValue}\n * @default   Solid\n * @since 8.1.0\n * @product   highcharts\n * @apioption series.boxplot.data.whiskerDashStyle\n */\n''; // Keeps doclets above separate\n/* *\n *\n *  Default Export\n *\n * */\nexport default BoxPlotSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  Author: Paweł Potaczek\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Constants\n *\n * */\n/**\n * The bubble legend is an additional element in legend which\n * presents the scale of the bubble series. Individual bubble ranges\n * can be defined by user or calculated from series. In the case of\n * automatically calculated ranges, a 1px margin of error is\n * permitted.\n *\n * @since        7.0.0\n * @product      highcharts highstock highmaps\n * @requires     highcharts-more\n * @optionparent legend.bubbleLegend\n */\nconst BubbleLegendDefaults = {\n    /**\n     * The color of the ranges borders, can be also defined for an\n     * individual range.\n     *\n     * @sample highcharts/bubble-legend/similartoseries/\n     *         Similar look to the bubble series\n     * @sample highcharts/bubble-legend/bordercolor/\n     *         Individual bubble border color\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    borderColor: void 0,\n    /**\n     * The width of the ranges borders in pixels, can be also\n     * defined for an individual range.\n     */\n    borderWidth: 2,\n    /**\n     * An additional class name to apply to the bubble legend'\n     * circle graphical elements. This option does not replace\n     * default class names of the graphical element.\n     *\n     * @sample {highcharts} highcharts/css/bubble-legend/\n     *         Styling by CSS\n     *\n     * @type {string}\n     */\n    className: void 0,\n    /**\n     * The main color of the bubble legend. Applies to ranges, if\n     * individual color is not defined.\n     *\n     * @sample highcharts/bubble-legend/similartoseries/\n     *         Similar look to the bubble series\n     * @sample highcharts/bubble-legend/color/\n     *         Individual bubble color\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    color: void 0,\n    /**\n     * An additional class name to apply to the bubble legend's\n     * connector graphical elements. This option does not replace\n     * default class names of the graphical element.\n     *\n     * @sample {highcharts} highcharts/css/bubble-legend/\n     *         Styling by CSS\n     *\n     * @type {string}\n     */\n    connectorClassName: void 0,\n    /**\n     * The color of the connector, can be also defined\n     * for an individual range.\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     */\n    connectorColor: void 0,\n    /**\n     * The length of the connectors in pixels. If labels are\n     * centered, the distance is reduced to 0.\n     *\n     * @sample highcharts/bubble-legend/connectorandlabels/\n     *         Increased connector length\n     */\n    connectorDistance: 60,\n    /**\n     * The width of the connectors in pixels.\n     *\n     * @sample highcharts/bubble-legend/connectorandlabels/\n     *         Increased connector width\n     */\n    connectorWidth: 1,\n    /**\n     * Enable or disable the bubble legend.\n     */\n    enabled: false,\n    /**\n     * Options for the bubble legend labels.\n     */\n    labels: {\n        /**\n         * An additional class name to apply to the bubble legend\n         * label graphical elements. This option does not replace\n         * default class names of the graphical element.\n         *\n         * @sample {highcharts} highcharts/css/bubble-legend/\n         *         Styling by CSS\n         *\n         * @type {string}\n         */\n        className: void 0,\n        /**\n         * Whether to allow data labels to overlap.\n         */\n        allowOverlap: false,\n        /**\n         * A format string for the bubble legend labels. Available\n         * variables are the same as for `formatter`.\n         *\n         * @sample highcharts/bubble-legend/format/\n         *         Add a unit\n         *\n         * @type {string}\n         */\n        format: '',\n        /**\n         * Available `this` properties are:\n         *\n         * - `this.value`: The bubble value.\n         *\n         * - `this.radius`: The radius of the bubble range.\n         *\n         * - `this.center`: The center y position of the range.\n         *\n         * @type {Highcharts.FormatterCallbackFunction<Highcharts.BubbleLegendFormatterContextObject>}\n         */\n        formatter: void 0,\n        /**\n         * The alignment of the labels compared to the bubble\n         * legend. Can be one of `left`, `center` or `right`.\n         *\n         * @sample highcharts/bubble-legend/connectorandlabels/\n         *         Labels on left\n         *\n         * @type {Highcharts.AlignValue}\n         */\n        align: 'right',\n        /**\n         * CSS styles for the labels.\n         *\n         * @type {Highcharts.CSSObject}\n         */\n        style: {\n            /** @ignore-option */\n            fontSize: '0.9em',\n            /** @ignore-option */\n            color: \"#000000\" /* Palette.neutralColor100 */\n        },\n        /**\n         * The x position offset of the label relative to the\n         * connector.\n         */\n        x: 0,\n        /**\n         * The y position offset of the label relative to the\n         * connector.\n         */\n        y: 0\n    },\n    /**\n     * Maximum bubble legend range size. If values for ranges are\n     * not specified, the `minSize` and the `maxSize` are calculated\n     * from bubble series.\n     */\n    maxSize: 60, // Number\n    /**\n     * Minimum bubble legend range size. If values for ranges are\n     * not specified, the `minSize` and the `maxSize` are calculated\n     * from bubble series.\n     */\n    minSize: 10, // Number\n    /**\n     * The position of the bubble legend in the legend.\n     * @sample highcharts/bubble-legend/connectorandlabels/\n     *         Bubble legend as last item in legend\n     */\n    legendIndex: 0, // Number\n    /**\n     * Options for specific range. One range consists of bubble,\n     * label and connector.\n     *\n     * @sample highcharts/bubble-legend/ranges/\n     *         Manually defined ranges\n     * @sample highcharts/bubble-legend/autoranges/\n     *         Auto calculated ranges\n     *\n     * @type {Array<*>}\n     */\n    ranges: {\n        /**\n         * Range size value, similar to bubble Z data.\n         * @type {number}\n         */\n        value: void 0,\n        /**\n         * The color of the border for individual range.\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        borderColor: void 0,\n        /**\n         * The color of the bubble for individual range.\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        color: void 0,\n        /**\n         * The color of the connector for individual range.\n         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         */\n        connectorColor: void 0\n    },\n    /**\n     * Whether the bubble legend range value should be represented\n     * by the area or the width of the bubble. The default, area,\n     * corresponds best to the human perception of the size of each\n     * bubble.\n     *\n     * @sample highcharts/bubble-legend/ranges/\n     *         Size by width\n     *\n     * @type {Highcharts.BubbleSizeByValue}\n     */\n    sizeBy: 'area',\n    /**\n     * When this is true, the absolute value of z determines the\n     * size of the bubble. This means that with the default\n     * zThreshold of 0, a bubble of value -1 will have the same size\n     * as a bubble of value 1, while a bubble of value 0 will have a\n     * smaller size according to minSize.\n     */\n    sizeByAbsoluteValue: false,\n    /**\n     * Define the visual z index of the bubble legend.\n     */\n    zIndex: 1,\n    /**\n     * Ranges with lower value than zThreshold are skipped.\n     */\n    zThreshold: 0\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default BubbleLegendDefaults;\n","/* *\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  Author: Paweł Potaczek\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport F from '../../Core/Templating.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport U from '../../Core/Utilities.js';\nconst { arrayMax, arrayMin, isNumber, merge, pick, stableSort } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * BubbleLegend class.\n *\n * @private\n * @class\n * @name Highcharts.BubbleLegend\n * @param {Highcharts.LegendBubbleLegendOptions} options\n * Options of BubbleLegendItem.\n *\n * @param {Highcharts.Legend} legend\n * Legend of item.\n */\nclass BubbleLegendItem {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(options, legend) {\n        this.setState = noop;\n        this.init(options, legend);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Create basic bubbleLegend properties similar to item in legend.\n     * @private\n     */\n    init(options, legend) {\n        this.options = options;\n        this.visible = true;\n        this.chart = legend.chart;\n        this.legend = legend;\n    }\n    /**\n     * Depending on the position option, add bubbleLegend to legend items.\n     *\n     * @private\n     *\n     * @param {Array<(Highcharts.Point|Highcharts.Series)>} items\n     *        All legend items\n     */\n    addToLegend(items) {\n        // Insert bubbleLegend into legend items\n        items.splice(this.options.legendIndex, 0, this);\n    }\n    /**\n     * Calculate ranges, sizes and call the next steps of bubbleLegend\n     * creation.\n     *\n     * @private\n     *\n     * @param {Highcharts.Legend} legend\n     *        Legend instance\n     */\n    drawLegendSymbol(legend) {\n        const itemDistance = pick(legend.options.itemDistance, 20), legendItem = this.legendItem || {}, options = this.options, ranges = options.ranges, connectorDistance = options.connectorDistance;\n        let connectorSpace;\n        // Do not create bubbleLegend now if ranges or ranges values are not\n        // specified or if are empty array.\n        if (!ranges || !ranges.length || !isNumber(ranges[0].value)) {\n            legend.options.bubbleLegend.autoRanges = true;\n            return;\n        }\n        // Sort ranges to right render order\n        stableSort(ranges, function (a, b) {\n            return b.value - a.value;\n        });\n        this.ranges = ranges;\n        this.setOptions();\n        this.render();\n        // Get max label size\n        const maxLabel = this.getMaxLabelSize(), radius = this.ranges[0].radius, size = radius * 2;\n        // Space for connectors and labels.\n        connectorSpace =\n            connectorDistance - radius + maxLabel.width;\n        connectorSpace = connectorSpace > 0 ? connectorSpace : 0;\n        this.maxLabel = maxLabel;\n        this.movementX = options.labels.align === 'left' ?\n            connectorSpace : 0;\n        legendItem.labelWidth = size + connectorSpace + itemDistance;\n        legendItem.labelHeight = size + maxLabel.height / 2;\n    }\n    /**\n     * Set style options for each bubbleLegend range.\n     * @private\n     */\n    setOptions() {\n        const ranges = this.ranges, options = this.options, series = this.chart.series[options.seriesIndex], baseline = this.legend.baseline, bubbleAttribs = {\n            zIndex: options.zIndex,\n            'stroke-width': options.borderWidth\n        }, connectorAttribs = {\n            zIndex: options.zIndex,\n            'stroke-width': options.connectorWidth\n        }, labelAttribs = {\n            align: (this.legend.options.rtl ||\n                options.labels.align === 'left') ? 'right' : 'left',\n            zIndex: options.zIndex\n        }, fillOpacity = series.options.marker.fillOpacity, styledMode = this.chart.styledMode;\n        // Allow to parts of styles be used individually for range\n        ranges.forEach(function (range, i) {\n            if (!styledMode) {\n                bubbleAttribs.stroke = pick(range.borderColor, options.borderColor, series.color);\n                bubbleAttribs.fill = pick(range.color, options.color, fillOpacity !== 1 ?\n                    color(series.color).setOpacity(fillOpacity)\n                        .get('rgba') :\n                    series.color);\n                connectorAttribs.stroke = pick(range.connectorColor, options.connectorColor, series.color);\n            }\n            // Set options needed for rendering each range\n            ranges[i].radius = this.getRangeRadius(range.value);\n            ranges[i] = merge(ranges[i], {\n                center: (ranges[0].radius - ranges[i].radius +\n                    baseline)\n            });\n            if (!styledMode) {\n                merge(true, ranges[i], {\n                    bubbleAttribs: merge(bubbleAttribs),\n                    connectorAttribs: merge(connectorAttribs),\n                    labelAttribs: labelAttribs\n                });\n            }\n        }, this);\n    }\n    /**\n     * Calculate radius for each bubble range,\n     * used code from BubbleSeries.js 'getRadius' method.\n     *\n     * @private\n     *\n     * @param {number} value\n     *        Range value\n     *\n     * @return {number|null}\n     *         Radius for one range\n     */\n    getRangeRadius(value) {\n        const options = this.options, seriesIndex = this.options.seriesIndex, bubbleSeries = this.chart.series[seriesIndex], zMax = options.ranges[0].value, zMin = options.ranges[options.ranges.length - 1].value, minSize = options.minSize, maxSize = options.maxSize;\n        return bubbleSeries.getRadius.call(this, zMin, zMax, minSize, maxSize, value);\n    }\n    /**\n     * Render the legendItem group.\n     * @private\n     */\n    render() {\n        const legendItem = this.legendItem || {}, renderer = this.chart.renderer, zThreshold = this.options.zThreshold;\n        if (!this.symbols) {\n            this.symbols = {\n                connectors: [],\n                bubbleItems: [],\n                labels: []\n            };\n        }\n        // Nesting SVG groups to enable handleOverflow\n        legendItem.symbol = renderer.g('bubble-legend');\n        legendItem.label = renderer.g('bubble-legend-item')\n            .css(this.legend.itemStyle || {});\n        // To enable default 'hideOverlappingLabels' method\n        legendItem.symbol.translateX = 0;\n        legendItem.symbol.translateY = 0;\n        // To use handleOverflow method\n        legendItem.symbol.add(legendItem.label);\n        legendItem.label.add(legendItem.group);\n        for (const range of this.ranges) {\n            if (range.value >= zThreshold) {\n                this.renderRange(range);\n            }\n        }\n        this.hideOverlappingLabels();\n    }\n    /**\n     * Render one range, consisting of bubble symbol, connector and label.\n     *\n     * @private\n     *\n     * @param {Highcharts.LegendBubbleLegendRangesOptions} range\n     *        Range options\n     */\n    renderRange(range) {\n        const mainRange = this.ranges[0], legend = this.legend, options = this.options, labelsOptions = options.labels, chart = this.chart, bubbleSeries = chart.series[options.seriesIndex], renderer = chart.renderer, symbols = this.symbols, labels = symbols.labels, elementCenter = range.center, absoluteRadius = Math.abs(range.radius), connectorDistance = options.connectorDistance || 0, labelsAlign = labelsOptions.align, rtl = legend.options.rtl, borderWidth = options.borderWidth, connectorWidth = options.connectorWidth, posX = mainRange.radius || 0, posY = elementCenter - absoluteRadius -\n            borderWidth / 2 + connectorWidth / 2, crispMovement = (posY % 1 ? 1 : 0.5) -\n            (connectorWidth % 2 ? 0 : 0.5), styledMode = renderer.styledMode;\n        let connectorLength = rtl || labelsAlign === 'left' ?\n            -connectorDistance : connectorDistance;\n        // Set options for centered labels\n        if (labelsAlign === 'center') {\n            connectorLength = 0; // Do not use connector\n            options.connectorDistance = 0;\n            range.labelAttribs.align = 'center';\n        }\n        // Render bubble symbol\n        symbols.bubbleItems.push(renderer\n            .circle(posX, elementCenter + crispMovement, absoluteRadius)\n            .attr(styledMode ? {} : range.bubbleAttribs)\n            .addClass((styledMode ?\n            'highcharts-color-' +\n                bubbleSeries.colorIndex + ' ' :\n            '') +\n            'highcharts-bubble-legend-symbol ' +\n            (options.className || '')).add(this.legendItem.symbol));\n        // Render connector\n        symbols.connectors.push(renderer\n            .path(renderer.crispLine([\n            ['M', posX, posY],\n            ['L', posX + connectorLength, posY]\n        ], options.connectorWidth))\n            .attr((styledMode ? {} : range.connectorAttribs))\n            .addClass((styledMode ?\n            'highcharts-color-' +\n                this.options.seriesIndex + ' ' : '') +\n            'highcharts-bubble-legend-connectors ' +\n            (options.connectorClassName || '')).add(this.legendItem.symbol));\n        // Render label\n        const label = renderer\n            .text(this.formatLabel(range))\n            .attr((styledMode ? {} : range.labelAttribs))\n            .css(styledMode ? {} : labelsOptions.style)\n            .addClass('highcharts-bubble-legend-labels ' +\n            (options.labels.className || '')).add(this.legendItem.symbol);\n        // Now that the label is added we can read the bounding box and\n        // vertically align\n        const position = {\n            x: posX + connectorLength + options.labels.x,\n            y: posY + options.labels.y + label.getBBox().height * 0.4\n        };\n        label.attr(position);\n        labels.push(label);\n        // To enable default 'hideOverlappingLabels' method\n        label.placed = true;\n        label.alignAttr = position;\n    }\n    /**\n     * Get the label which takes up the most space.\n     * @private\n     */\n    getMaxLabelSize() {\n        const labels = this.symbols.labels;\n        let maxLabel, labelSize;\n        labels.forEach(function (label) {\n            labelSize = label.getBBox(true);\n            if (maxLabel) {\n                maxLabel = labelSize.width > maxLabel.width ?\n                    labelSize : maxLabel;\n            }\n            else {\n                maxLabel = labelSize;\n            }\n        });\n        return maxLabel || {};\n    }\n    /**\n     * Get formatted label for range.\n     *\n     * @private\n     *\n     * @param {Highcharts.LegendBubbleLegendRangesOptions} range\n     *        Range options\n     *\n     * @return {string}\n     *         Range label text\n     */\n    formatLabel(range) {\n        const options = this.options, formatter = options.labels.formatter, format = options.labels.format;\n        const { numberFormatter } = this.chart;\n        return format ? F.format(format, range) :\n            formatter ? formatter.call(range) :\n                numberFormatter(range.value, 1);\n    }\n    /**\n     * By using default chart 'hideOverlappingLabels' method, hide or show\n     * labels and connectors.\n     * @private\n     */\n    hideOverlappingLabels() {\n        const chart = this.chart, allowOverlap = this.options.labels.allowOverlap, symbols = this.symbols;\n        if (!allowOverlap && symbols) {\n            chart.hideOverlappingLabels(symbols.labels);\n            // Hide or show connectors\n            symbols.labels.forEach(function (label, index) {\n                if (!label.newOpacity) {\n                    symbols.connectors[index].hide();\n                }\n                else if (label.newOpacity !== label.oldOpacity) {\n                    symbols.connectors[index].show();\n                }\n            });\n        }\n    }\n    /**\n     * Calculate ranges from created series.\n     *\n     * @private\n     *\n     * @return {Array<Highcharts.LegendBubbleLegendRangesOptions>}\n     *         Array of range objects\n     */\n    getRanges() {\n        const bubbleLegend = this.legend.bubbleLegend, series = bubbleLegend.chart.series, rangesOptions = bubbleLegend.options.ranges;\n        let ranges, zData, minZ = Number.MAX_VALUE, maxZ = -Number.MAX_VALUE;\n        series.forEach(function (s) {\n            // Find the min and max Z, like in bubble series\n            if (s.isBubble && !s.ignoreSeries) {\n                zData = s.zData.filter(isNumber);\n                if (zData.length) {\n                    minZ = pick(s.options.zMin, Math.min(minZ, Math.max(arrayMin(zData), s.options.displayNegative === false ?\n                        s.options.zThreshold :\n                        -Number.MAX_VALUE)));\n                    maxZ = pick(s.options.zMax, Math.max(maxZ, arrayMax(zData)));\n                }\n            }\n        });\n        // Set values for ranges\n        if (minZ === maxZ) {\n            // Only one range if min and max values are the same.\n            ranges = [{ value: maxZ }];\n        }\n        else {\n            ranges = [\n                { value: minZ },\n                { value: (minZ + maxZ) / 2 },\n                { value: maxZ, autoRanges: true }\n            ];\n        }\n        // Prevent reverse order of ranges after redraw\n        if (rangesOptions.length && rangesOptions[0].radius) {\n            ranges.reverse();\n        }\n        // Merge ranges values with user options\n        ranges.forEach(function (range, i) {\n            if (rangesOptions && rangesOptions[i]) {\n                ranges[i] = merge(rangesOptions[i], range);\n            }\n        });\n        return ranges;\n    }\n    /**\n     * Calculate bubble legend sizes from rendered series.\n     *\n     * @private\n     *\n     * @return {Array<number,number>}\n     *         Calculated min and max bubble sizes\n     */\n    predictBubbleSizes() {\n        const chart = this.chart, legendOptions = chart.legend.options, floating = legendOptions.floating, horizontal = legendOptions.layout === 'horizontal', lastLineHeight = horizontal ? chart.legend.lastLineHeight : 0, plotSizeX = chart.plotSizeX, plotSizeY = chart.plotSizeY, bubbleSeries = chart.series[this.options.seriesIndex], pxSizes = bubbleSeries.getPxExtremes(), minSize = Math.ceil(pxSizes.minPxSize), maxPxSize = Math.ceil(pxSizes.maxPxSize), plotSize = Math.min(plotSizeY, plotSizeX);\n        let calculatedSize, maxSize = bubbleSeries.options.maxSize;\n        // Calculate predicted max size of bubble\n        if (floating || !(/%$/.test(maxSize))) {\n            calculatedSize = maxPxSize;\n        }\n        else {\n            maxSize = parseFloat(maxSize);\n            calculatedSize = ((plotSize + lastLineHeight) * maxSize / 100) /\n                (maxSize / 100 + 1);\n            // Get maxPxSize from bubble series if calculated bubble legend\n            // size will not affect to bubbles series.\n            if ((horizontal && plotSizeY - calculatedSize >=\n                plotSizeX) || (!horizontal && plotSizeX -\n                calculatedSize >= plotSizeY)) {\n                calculatedSize = maxPxSize;\n            }\n        }\n        return [minSize, Math.ceil(calculatedSize)];\n    }\n    /**\n     * Correct ranges with calculated sizes.\n     * @private\n     */\n    updateRanges(min, max) {\n        const bubbleLegendOptions = this.legend.options.bubbleLegend;\n        bubbleLegendOptions.minSize = min;\n        bubbleLegendOptions.maxSize = max;\n        bubbleLegendOptions.ranges = this.getRanges();\n    }\n    /**\n     * Because of the possibility of creating another legend line, predicted\n     * bubble legend sizes may differ by a few pixels, so it is necessary to\n     * correct them.\n     * @private\n     */\n    correctSizes() {\n        const legend = this.legend, chart = this.chart, bubbleSeries = chart.series[this.options.seriesIndex], pxSizes = bubbleSeries.getPxExtremes(), bubbleSeriesSize = pxSizes.maxPxSize, bubbleLegendSize = this.options.maxSize;\n        if (Math.abs(Math.ceil(bubbleSeriesSize) - bubbleLegendSize) >\n            1) {\n            this.updateRanges(this.options.minSize, pxSizes.maxPxSize);\n            legend.render();\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default BubbleLegendItem;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @interface Highcharts.BubbleLegendFormatterContextObject\n */ /**\n* The center y position of the range.\n* @name Highcharts.BubbleLegendFormatterContextObject#center\n* @type {number}\n*/ /**\n* The radius of the bubble range.\n* @name Highcharts.BubbleLegendFormatterContextObject#radius\n* @type {number}\n*/ /**\n* The bubble value.\n* @name Highcharts.BubbleLegendFormatterContextObject#value\n* @type {number}\n*/\n''; // Detach doclets above\n","/* *\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  Author: Paweł Potaczek\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport BubbleLegendDefaults from './BubbleLegendDefaults.js';\nimport BubbleLegendItem from './BubbleLegendItem.js';\nimport D from '../../Core/Defaults.js';\nconst { setOptions } = D;\nimport H from '../../Core/Globals.js';\nconst { composed } = H;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, objectEach, pushUnique, wrap } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * If ranges are not specified, determine ranges from rendered bubble series\n * and render legend again.\n */\nfunction chartDrawChartBox(proceed, options, callback) {\n    const chart = this, legend = chart.legend, bubbleSeries = getVisibleBubbleSeriesIndex(chart) >= 0;\n    let bubbleLegendOptions, bubbleSizes, legendItem;\n    if (legend && legend.options.enabled && legend.bubbleLegend &&\n        legend.options.bubbleLegend.autoRanges && bubbleSeries) {\n        bubbleLegendOptions = legend.bubbleLegend.options;\n        bubbleSizes = legend.bubbleLegend.predictBubbleSizes();\n        legend.bubbleLegend.updateRanges(bubbleSizes[0], bubbleSizes[1]);\n        // Disable animation on init\n        if (!bubbleLegendOptions.placed) {\n            legend.group.placed = false;\n            legend.allItems.forEach((item) => {\n                legendItem = item.legendItem || {};\n                if (legendItem.group) {\n                    legendItem.group.translateY = void 0;\n                }\n            });\n        }\n        // Create legend with bubbleLegend\n        legend.render();\n        // Calculate margins after first rendering the bubble legend\n        if (!bubbleLegendOptions.placed) {\n            chart.getMargins();\n            chart.axes.forEach(function (axis) {\n                if (axis.visible) { // #11448\n                    axis.render();\n                }\n                if (!bubbleLegendOptions.placed) {\n                    axis.setScale();\n                    axis.updateNames();\n                    // Disable axis animation on init\n                    objectEach(axis.ticks, function (tick) {\n                        tick.isNew = true;\n                        tick.isNewLabel = true;\n                    });\n                }\n            });\n            chart.getMargins();\n        }\n        bubbleLegendOptions.placed = true;\n        // Call default 'drawChartBox' method.\n        proceed.call(chart, options, callback);\n        // Check bubble legend sizes and correct them if necessary.\n        legend.bubbleLegend.correctSizes();\n        // Correct items positions with different dimensions in legend.\n        retranslateItems(legend, getLinesHeights(legend));\n    }\n    else {\n        proceed.call(chart, options, callback);\n        // Allow color change on static bubble legend after click on legend\n        if (legend && legend.options.enabled && legend.bubbleLegend) {\n            legend.render();\n            retranslateItems(legend, getLinesHeights(legend));\n        }\n    }\n}\n/**\n * Compose classes for use with Bubble series.\n * @private\n *\n * @param {Highcharts.Chart} ChartClass\n * Core chart class to use with Bubble series.\n *\n * @param {Highcharts.Legend} LegendClass\n * Core legend class to use with Bubble series.\n */\nfunction compose(ChartClass, LegendClass) {\n    if (pushUnique(composed, 'Series.BubbleLegend')) {\n        setOptions({\n            // Set default bubble legend options\n            legend: {\n                bubbleLegend: BubbleLegendDefaults\n            }\n        });\n        wrap(ChartClass.prototype, 'drawChartBox', chartDrawChartBox);\n        addEvent(LegendClass, 'afterGetAllItems', onLegendAfterGetAllItems);\n        addEvent(LegendClass, 'itemClick', onLegendItemClick);\n    }\n}\n/**\n * Check if there is at least one visible bubble series.\n *\n * @private\n * @function getVisibleBubbleSeriesIndex\n * @param {Highcharts.Chart} chart\n * Chart to check.\n * @return {number}\n * First visible bubble series index\n */\nfunction getVisibleBubbleSeriesIndex(chart) {\n    const series = chart.series;\n    let i = 0;\n    while (i < series.length) {\n        if (series[i] &&\n            series[i].isBubble &&\n            series[i].visible &&\n            series[i].zData.length) {\n            return i;\n        }\n        i++;\n    }\n    return -1;\n}\n/**\n * Calculate height for each row in legend.\n *\n * @private\n * @function getLinesHeights\n *\n * @param {Highcharts.Legend} legend\n * Legend to calculate from.\n *\n * @return {Array<Highcharts.Dictionary<number>>}\n * Informations about line height and items amount\n */\nfunction getLinesHeights(legend) {\n    const items = legend.allItems, lines = [], length = items.length;\n    let lastLine, legendItem, legendItem2, i = 0, j = 0;\n    for (i = 0; i < length; i++) {\n        legendItem = items[i].legendItem || {};\n        legendItem2 = (items[i + 1] || {}).legendItem || {};\n        if (legendItem.labelHeight) {\n            // For bubbleLegend\n            items[i].itemHeight = legendItem.labelHeight;\n        }\n        if ( // Line break\n        items[i] === items[length - 1] ||\n            legendItem.y !== legendItem2.y) {\n            lines.push({ height: 0 });\n            lastLine = lines[lines.length - 1];\n            // Find the highest item in line\n            for (j; j <= i; j++) {\n                if (items[j].itemHeight > lastLine.height) {\n                    lastLine.height = items[j].itemHeight;\n                }\n            }\n            lastLine.step = i;\n        }\n    }\n    return lines;\n}\n/**\n * Start the bubble legend creation process.\n */\nfunction onLegendAfterGetAllItems(e) {\n    const legend = this, bubbleLegend = legend.bubbleLegend, legendOptions = legend.options, options = legendOptions.bubbleLegend, bubbleSeriesIndex = getVisibleBubbleSeriesIndex(legend.chart);\n    // Remove unnecessary element\n    if (bubbleLegend && bubbleLegend.ranges && bubbleLegend.ranges.length) {\n        // Allow change the way of calculating ranges in update\n        if (options.ranges.length) {\n            options.autoRanges =\n                !!options.ranges[0].autoRanges;\n        }\n        // Update bubbleLegend dimensions in each redraw\n        legend.destroyItem(bubbleLegend);\n    }\n    // Create bubble legend\n    if (bubbleSeriesIndex >= 0 &&\n        legendOptions.enabled &&\n        options.enabled) {\n        options.seriesIndex = bubbleSeriesIndex;\n        legend.bubbleLegend = new BubbleLegendItem(options, legend);\n        legend.bubbleLegend.addToLegend(e.allItems);\n    }\n}\n/**\n * Toggle bubble legend depending on the visible status of bubble series.\n */\nfunction onLegendItemClick(e) {\n    // #14080 don't fire this code if click function is prevented\n    if (e.defaultPrevented) {\n        return false;\n    }\n    const legend = this, series = e.legendItem, chart = legend.chart, visible = series.visible;\n    let status;\n    if (legend && legend.bubbleLegend) {\n        // Temporary correct 'visible' property\n        series.visible = !visible;\n        // Save future status for getRanges method\n        series.ignoreSeries = visible;\n        // Check if at lest one bubble series is visible\n        status = getVisibleBubbleSeriesIndex(chart) >= 0;\n        // Hide bubble legend if all bubble series are disabled\n        if (legend.bubbleLegend.visible !== status) {\n            // Show or hide bubble legend\n            legend.update({\n                bubbleLegend: { enabled: status }\n            });\n            legend.bubbleLegend.visible = status; // Restore default status\n        }\n        series.visible = visible;\n    }\n}\n/**\n * Correct legend items translation in case of different elements heights.\n *\n * @private\n * @function Highcharts.Legend#retranslateItems\n *\n * @param {Highcharts.Legend} legend\n * Legend to translate in.\n *\n * @param {Array<Highcharts.Dictionary<number>>} lines\n * Informations about line height and items amount\n */\nfunction retranslateItems(legend, lines) {\n    const items = legend.allItems, rtl = legend.options.rtl;\n    let orgTranslateX, orgTranslateY, movementX, legendItem, actualLine = 0;\n    items.forEach((item, index) => {\n        legendItem = item.legendItem || {};\n        if (!legendItem.group) {\n            return;\n        }\n        orgTranslateX = legendItem.group.translateX || 0;\n        orgTranslateY = legendItem.y || 0;\n        movementX = item.movementX;\n        if (movementX || (rtl && item.ranges)) {\n            movementX = rtl ?\n                orgTranslateX - item.options.maxSize / 2 :\n                orgTranslateX + movementX;\n            legendItem.group.attr({ translateX: movementX });\n        }\n        if (index > lines[actualLine].step) {\n            actualLine++;\n        }\n        legendItem.group.attr({\n            translateY: Math.round(orgTranslateY + lines[actualLine].height / 2)\n        });\n        legendItem.y = orgTranslateY + lines[actualLine].height / 2;\n    });\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst BubbleLegendComposition = {\n    compose\n};\nexport default BubbleLegendComposition;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Point from '../../Core/Series/Point.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { seriesTypes: { scatter: { prototype: { pointClass: ScatterPoint } } } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { extend } = U;\n/* *\n *\n *  Class\n *\n * */\nclass BubblePoint extends ScatterPoint {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * @private\n     */\n    haloPath(size) {\n        const computedSize = (size && this.marker ?\n            this.marker.radius ||\n                0 :\n            0) + size;\n        if (this.series.chart.inverted) {\n            const pos = this.pos() || [0, 0], { xAxis, yAxis, chart } = this.series;\n            return chart.renderer.symbols.circle(xAxis.len - pos[1] - computedSize, yAxis.len - pos[0] - computedSize, computedSize * 2, computedSize * 2);\n        }\n        return Point.prototype.haloPath.call(this, \n        // #6067\n        computedSize);\n    }\n}\n/* *\n *\n *  Class Prototype\n *\n * */\nextend(BubblePoint.prototype, {\n    ttBelow: false\n});\n/* *\n *\n *  Default Export\n *\n * */\nexport default BubblePoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport BubbleLegendComposition from './BubbleLegendComposition.js';\nimport BubblePoint from './BubblePoint.js';\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport H from '../../Core/Globals.js';\nconst { composed, noop } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: Series, seriesTypes: { column: { prototype: columnProto }, scatter: ScatterSeries } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, arrayMax, arrayMin, clamp, extend, isNumber, merge, pick, pushUnique } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Add logic to pad each axis with the amount of pixels necessary to avoid the\n * bubbles to overflow.\n */\nfunction onAxisFoundExtremes() {\n    const axisLength = this.len, { coll, isXAxis, min } = this, dataKey = isXAxis ? 'xData' : 'yData', range = (this.max || 0) - (min || 0);\n    let pxMin = 0, pxMax = axisLength, transA = axisLength / range, hasActiveSeries;\n    if (coll !== 'xAxis' && coll !== 'yAxis') {\n        return;\n    }\n    // Handle padding on the second pass, or on redraw\n    this.series.forEach((series) => {\n        if (series.bubblePadding && series.reserveSpace()) {\n            // Correction for #1673\n            this.allowZoomOutside = true;\n            hasActiveSeries = true;\n            const data = series[dataKey];\n            if (isXAxis) {\n                (series.onPoint || series).getRadii(0, 0, series);\n                if (series.onPoint) {\n                    series.radii = series.onPoint.radii;\n                }\n            }\n            if (range > 0) {\n                let i = data.length;\n                while (i--) {\n                    if (isNumber(data[i]) &&\n                        this.dataMin <= data[i] &&\n                        data[i] <= this.max) {\n                        const radius = series.radii && series.radii[i] || 0;\n                        pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);\n                        pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);\n                    }\n                }\n            }\n        }\n    });\n    // Apply the padding to the min and max properties\n    if (hasActiveSeries && range > 0 && !this.logarithmic) {\n        pxMax -= axisLength;\n        transA *= (axisLength +\n            Math.max(0, pxMin) - // #8901\n            Math.min(pxMax, axisLength)) / axisLength;\n        [\n            ['min', 'userMin', pxMin],\n            ['max', 'userMax', pxMax]\n        ].forEach((keys) => {\n            if (typeof pick(this.options[keys[0]], this[keys[1]]) === 'undefined') {\n                this[keys[0]] += keys[2] / transA;\n            }\n        });\n    }\n}\n/* *\n *\n *  Class\n *\n * */\nclass BubbleSeries extends ScatterSeries {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    static compose(AxisClass, ChartClass, LegendClass) {\n        BubbleLegendComposition.compose(ChartClass, LegendClass);\n        if (pushUnique(composed, 'Series.Bubble')) {\n            addEvent(AxisClass, 'foundExtremes', onAxisFoundExtremes);\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Perform animation on the bubbles\n     * @private\n     */\n    animate(init) {\n        if (!init &&\n            this.points.length < this.options.animationLimit // #8099\n        ) {\n            this.points.forEach(function (point) {\n                const { graphic, plotX = 0, plotY = 0 } = point;\n                if (graphic && graphic.width) { // URL symbols don't have width\n                    // Start values\n                    if (!this.hasRendered) {\n                        graphic.attr({\n                            x: plotX,\n                            y: plotY,\n                            width: 1,\n                            height: 1\n                        });\n                    }\n                    graphic.animate(this.markerAttribs(point), this.options.animation);\n                }\n            }, this);\n        }\n    }\n    /**\n     * Get the radius for each point based on the minSize, maxSize and each\n     * point's Z value. This must be done prior to Series.translate because\n     * the axis needs to add padding in accordance with the point sizes.\n     * @private\n     */\n    getRadii() {\n        const zData = this.zData, yData = this.yData, radii = [];\n        let len, i, value, zExtremes = this.chart.bubbleZExtremes;\n        const { minPxSize, maxPxSize } = this.getPxExtremes();\n        // Get the collective Z extremes of all bubblish series. The chart-level\n        // `bubbleZExtremes` are only computed once, and reset on `updatedData`\n        // in any member series.\n        if (!zExtremes) {\n            let zMin = Number.MAX_VALUE;\n            let zMax = -Number.MAX_VALUE;\n            let valid;\n            this.chart.series.forEach((otherSeries) => {\n                if (otherSeries.bubblePadding && otherSeries.reserveSpace()) {\n                    const zExtremes = (otherSeries.onPoint || otherSeries).getZExtremes();\n                    if (zExtremes) {\n                        // Changed '||' to 'pick' because min or max can be 0.\n                        // #17280\n                        zMin = Math.min(pick(zMin, zExtremes.zMin), zExtremes.zMin);\n                        zMax = Math.max(pick(zMax, zExtremes.zMax), zExtremes.zMax);\n                        valid = true;\n                    }\n                }\n            });\n            if (valid) {\n                zExtremes = { zMin, zMax };\n                this.chart.bubbleZExtremes = zExtremes;\n            }\n            else {\n                zExtremes = { zMin: 0, zMax: 0 };\n            }\n        }\n        // Set the shape type and arguments to be picked up in drawPoints\n        for (i = 0, len = zData.length; i < len; i++) {\n            value = zData[i];\n            // Separate method to get individual radius for bubbleLegend\n            radii.push(this.getRadius(zExtremes.zMin, zExtremes.zMax, minPxSize, maxPxSize, value, yData && yData[i]));\n        }\n        this.radii = radii;\n    }\n    /**\n     * Get the individual radius for one point.\n     * @private\n     */\n    getRadius(zMin, zMax, minSize, maxSize, value, yValue) {\n        const options = this.options, sizeByArea = options.sizeBy !== 'width', zThreshold = options.zThreshold;\n        let zRange = zMax - zMin, pos = 0.5;\n        // #8608 - bubble should be visible when z is undefined\n        if (yValue === null || value === null) {\n            return null;\n        }\n        if (isNumber(value)) {\n            // When sizing by threshold, the absolute value of z determines\n            // the size of the bubble.\n            if (options.sizeByAbsoluteValue) {\n                value = Math.abs(value - zThreshold);\n                zMax = zRange = Math.max(zMax - zThreshold, Math.abs(zMin - zThreshold));\n                zMin = 0;\n            }\n            // Issue #4419 - if value is less than zMin, push a radius that's\n            // always smaller than the minimum size\n            if (value < zMin) {\n                return minSize / 2 - 1;\n            }\n            // Relative size, a number between 0 and 1\n            if (zRange > 0) {\n                pos = (value - zMin) / zRange;\n            }\n        }\n        if (sizeByArea && pos >= 0) {\n            pos = Math.sqrt(pos);\n        }\n        return Math.ceil(minSize + pos * (maxSize - minSize)) / 2;\n    }\n    /**\n     * Define hasData function for non-cartesian series.\n     * Returns true if the series has points at all.\n     * @private\n     */\n    hasData() {\n        return !!this.processedXData.length; // != 0\n    }\n    /**\n     * @private\n     */\n    markerAttribs(point, state) {\n        const attr = super.markerAttribs(point, state), { height = 0, width = 0 } = attr;\n        // Bubble needs a specific `markerAttribs` override because the markers\n        // are rendered into the potentially inverted `series.group`. Unlike\n        // regular markers, which are rendered into the `markerGroup` (#21125).\n        return this.chart.inverted ? extend(attr, {\n            x: (point.plotX || 0) - width / 2,\n            y: (point.plotY || 0) - height / 2\n        }) : attr;\n    }\n    /**\n     * @private\n     */\n    pointAttribs(point, state) {\n        const markerOptions = this.options.marker, fillOpacity = markerOptions.fillOpacity, attr = Series.prototype.pointAttribs.call(this, point, state);\n        if (fillOpacity !== 1) {\n            attr.fill = color(attr.fill)\n                .setOpacity(fillOpacity)\n                .get('rgba');\n        }\n        return attr;\n    }\n    /**\n     * Extend the base translate method to handle bubble size\n     * @private\n     */\n    translate() {\n        // Run the parent method\n        super.translate.call(this);\n        this.getRadii();\n        this.translateBubble();\n    }\n    translateBubble() {\n        const { data, options, radii } = this, { minPxSize } = this.getPxExtremes();\n        // Set the shape type and arguments to be picked up in drawPoints\n        let i = data.length;\n        while (i--) {\n            const point = data[i], radius = radii ? radii[i] : 0; // #1737\n            // Negative points means negative z values (#9728)\n            if (this.zoneAxis === 'z') {\n                point.negative = (point.z || 0) < (options.zThreshold || 0);\n            }\n            if (isNumber(radius) && radius >= minPxSize / 2) {\n                // Shape arguments\n                point.marker = extend(point.marker, {\n                    radius,\n                    width: 2 * radius,\n                    height: 2 * radius\n                });\n                // Alignment box for the data label\n                point.dlBox = {\n                    x: point.plotX - radius,\n                    y: point.plotY - radius,\n                    width: 2 * radius,\n                    height: 2 * radius\n                };\n            }\n            else { // Below zThreshold\n                // #1691\n                point.shapeArgs = point.plotY = point.dlBox = void 0;\n                point.isInside = false; // #17281\n            }\n        }\n    }\n    getPxExtremes() {\n        const smallestSize = Math.min(this.chart.plotWidth, this.chart.plotHeight);\n        const getPxSize = (length) => {\n            let isPercent;\n            if (typeof length === 'string') {\n                isPercent = /%$/.test(length);\n                length = parseInt(length, 10);\n            }\n            return isPercent ? smallestSize * length / 100 : length;\n        };\n        const minPxSize = getPxSize(pick(this.options.minSize, 8));\n        // Prioritize min size if conflict to make sure bubbles are\n        // always visible. #5873\n        const maxPxSize = Math.max(getPxSize(pick(this.options.maxSize, '20%')), minPxSize);\n        return { minPxSize, maxPxSize };\n    }\n    getZExtremes() {\n        const options = this.options, zData = (this.zData || []).filter(isNumber);\n        if (zData.length) {\n            const zMin = pick(options.zMin, clamp(arrayMin(zData), options.displayNegative === false ?\n                (options.zThreshold || 0) :\n                -Number.MAX_VALUE, Number.MAX_VALUE));\n            const zMax = pick(options.zMax, arrayMax(zData));\n            if (isNumber(zMin) && isNumber(zMax)) {\n                return { zMin, zMax };\n            }\n        }\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\n/**\n * A bubble series is a three dimensional series type where each point\n * renders an X, Y and Z value. Each points is drawn as a bubble where the\n * position along the X and Y axes mark the X and Y values, and the size of\n * the bubble relates to the Z value.\n *\n * @sample {highcharts} highcharts/demo/bubble/\n *         Bubble chart\n *\n * @extends      plotOptions.scatter\n * @excluding    cluster\n * @product      highcharts highstock\n * @requires     highcharts-more\n * @optionparent plotOptions.bubble\n */\nBubbleSeries.defaultOptions = merge(ScatterSeries.defaultOptions, {\n    dataLabels: {\n        formatter: function () {\n            const { numberFormatter } = this.series.chart;\n            const { z } = this.point;\n            return isNumber(z) ? numberFormatter(z, -1) : '';\n        },\n        inside: true,\n        verticalAlign: 'middle'\n    },\n    /**\n     * If there are more points in the series than the `animationLimit`, the\n     * animation won't run. Animation affects overall performance and\n     * doesn't work well with heavy data series.\n     *\n     * @since 6.1.0\n     */\n    animationLimit: 250,\n    /**\n     * Whether to display negative sized bubbles. The threshold is given\n     * by the [zThreshold](#plotOptions.bubble.zThreshold) option, and negative\n     * bubbles can be visualized by setting\n     * [negativeColor](#plotOptions.bubble.negativeColor).\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-negative/\n     *         Negative bubbles\n     *\n     * @type      {boolean}\n     * @default   true\n     * @since     3.0\n     * @apioption plotOptions.bubble.displayNegative\n     */\n    /**\n     * @extends   plotOptions.series.marker\n     * @excluding enabled, enabledThreshold, height, radius, width\n     */\n    marker: {\n        lineColor: null, // Inherit from series.color\n        lineWidth: 1,\n        /**\n         * The fill opacity of the bubble markers.\n         */\n        fillOpacity: 0.5,\n        /**\n         * In bubble charts, the radius is overridden and determined based\n         * on the point's data value.\n         *\n         * @ignore-option\n         */\n        radius: null,\n        states: {\n            hover: {\n                radiusPlus: 0\n            }\n        },\n        /**\n         * A predefined shape or symbol for the marker. Possible values are\n         * \"circle\", \"square\", \"diamond\", \"triangle\" and \"triangle-down\".\n         *\n         * Additionally, the URL to a graphic can be given on the form\n         * `url(graphic.png)`. Note that for the image to be applied to\n         * exported charts, its URL needs to be accessible by the export\n         * server.\n         *\n         * Custom callbacks for symbol path generation can also be added to\n         * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n         * used by its method name, as shown in the demo.\n         *\n         * @sample {highcharts} highcharts/plotoptions/bubble-symbol/\n         *         Bubble chart with various symbols\n         * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n         *         General chart with predefined, graphic and custom markers\n         *\n         * @type  {Highcharts.SymbolKeyValue|string}\n         * @since 5.0.11\n         */\n        symbol: 'circle'\n    },\n    /**\n     * Minimum bubble size. Bubbles will automatically size between the\n     * `minSize` and `maxSize` to reflect the `z` value of each bubble.\n     * Can be either pixels (when no unit is given), or a percentage of\n     * the smallest one of the plot width and height.\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-size/\n     *         Bubble size\n     *\n     * @type    {number|string}\n     * @since   3.0\n     * @product highcharts highstock\n     */\n    minSize: 8,\n    /**\n     * Maximum bubble size. Bubbles will automatically size between the\n     * `minSize` and `maxSize` to reflect the `z` value of each bubble.\n     * Can be either pixels (when no unit is given), or a percentage of\n     * the smallest one of the plot width and height.\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-size/\n     *         Bubble size\n     *\n     * @type    {number|string}\n     * @since   3.0\n     * @product highcharts highstock\n     */\n    maxSize: '20%',\n    /**\n     * When a point's Z value is below the\n     * [zThreshold](#plotOptions.bubble.zThreshold)\n     * setting, this color is used.\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-negative/\n     *         Negative bubbles\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.bubble.negativeColor\n     */\n    /**\n     * Whether the bubble's value should be represented by the area or the\n     * width of the bubble. The default, `area`, corresponds best to the\n     * human perception of the size of each bubble.\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-sizeby/\n     *         Comparison of area and size\n     *\n     * @type       {Highcharts.BubbleSizeByValue}\n     * @default    area\n     * @since      3.0.7\n     * @apioption  plotOptions.bubble.sizeBy\n     */\n    /**\n     * When this is true, the absolute value of z determines the size of\n     * the bubble. This means that with the default `zThreshold` of 0, a\n     * bubble of value -1 will have the same size as a bubble of value 1,\n     * while a bubble of value 0 will have a smaller size according to\n     * `minSize`.\n     *\n     * @sample    {highcharts} highcharts/plotoptions/bubble-sizebyabsolutevalue/\n     *            Size by absolute value, various thresholds\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     4.1.9\n     * @product   highcharts\n     * @apioption plotOptions.bubble.sizeByAbsoluteValue\n     */\n    /**\n     * When this is true, the series will not cause the Y axis to cross\n     * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n     * unless the data actually crosses the plane.\n     *\n     * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n     * 3 will make the Y axis show negative values according to the\n     * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n     * at 0.\n     *\n     * @since   4.1.9\n     * @product highcharts\n     */\n    softThreshold: false,\n    states: {\n        hover: {\n            halo: {\n                size: 5\n            }\n        }\n    },\n    tooltip: {\n        pointFormat: '({point.x}, {point.y}), Size: {point.z}'\n    },\n    turboThreshold: 0,\n    /**\n     * The minimum for the Z value range. Defaults to the highest Z value\n     * in the data.\n     *\n     * @see [zMin](#plotOptions.bubble.zMin)\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-zmin-zmax/\n     *         Z has a possible range of 0-100\n     *\n     * @type      {number}\n     * @since     4.0.3\n     * @product   highcharts\n     * @apioption plotOptions.bubble.zMax\n     */\n    /**\n     * @default   z\n     * @apioption plotOptions.bubble.colorKey\n     */\n    /**\n     * The minimum for the Z value range. Defaults to the lowest Z value\n     * in the data.\n     *\n     * @see [zMax](#plotOptions.bubble.zMax)\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-zmin-zmax/\n     *         Z has a possible range of 0-100\n     *\n     * @type      {number}\n     * @since     4.0.3\n     * @product   highcharts\n     * @apioption plotOptions.bubble.zMin\n     */\n    /**\n     * When [displayNegative](#plotOptions.bubble.displayNegative) is `false`,\n     * bubbles with lower Z values are skipped. When `displayNegative`\n     * is `true` and a [negativeColor](#plotOptions.bubble.negativeColor)\n     * is given, points with lower Z is colored.\n     *\n     * @sample {highcharts} highcharts/plotoptions/bubble-negative/\n     *         Negative bubbles\n     *\n     * @since   3.0\n     * @product highcharts\n     */\n    zThreshold: 0,\n    zoneAxis: 'z'\n});\nextend(BubbleSeries.prototype, {\n    alignDataLabel: columnProto.alignDataLabel,\n    applyZones: noop,\n    bubblePadding: true,\n    isBubble: true,\n    pointArrayMap: ['y', 'z'],\n    pointClass: BubblePoint,\n    parallelArrays: ['x', 'y', 'z'],\n    trackerGroups: ['group', 'dataLabelsGroup'],\n    specialGroup: 'group', // To allow clipping (#6296)\n    zoneAxis: 'z'\n});\n// On updated data in any series, delete the chart-level Z extremes cache\naddEvent(BubbleSeries, 'updatedData', (e) => {\n    delete e.target.chart.bubbleZExtremes;\n});\n// After removing series, delete the chart-level Z extremes cache, #17502.\naddEvent(BubbleSeries, 'remove', (e) => {\n    delete e.target.chart.bubbleZExtremes;\n});\nSeriesRegistry.registerSeriesType('bubble', BubbleSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default BubbleSeries;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @typedef {\"area\"|\"width\"} Highcharts.BubbleSizeByValue\n */\n''; // Detach doclets above\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A `bubble` series. If the [type](#series.bubble.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.bubble\n * @excluding dataParser, dataURL, stack\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption series.bubble\n */\n/**\n * An array of data points for the series. For the `bubble` series type,\n * points can be given in the following ways:\n *\n * 1. An array of arrays with 3 or 2 values. In this case, the values correspond\n *    to `x,y,z`. If the first value is a string, it is applied as the name of\n *    the point, and the `x` value is inferred. The `x` value can also be\n *    omitted, in which case the inner arrays should be of length 2\\. Then the\n *    `x` value is automatically calculated, either starting at 0 and\n *    incremented by 1, or from `pointStart` and `pointInterval` given in the\n *    series options.\n *    ```js\n *    data: [\n *        [0, 1, 2],\n *        [1, 5, 5],\n *        [2, 0, 2]\n *    ]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.bubble.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 1,\n *        z: 1,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 5,\n *        z: 4,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}\n * @extends   series.line.data\n * @product   highcharts\n * @apioption series.bubble.data\n */\n/**\n * @extends     series.line.data.marker\n * @excluding   enabledThreshold, height, radius, width\n * @product     highcharts\n * @apioption   series.bubble.data.marker\n */\n/**\n * The size value for each bubble. The bubbles' diameters are computed\n * based on the `z`, and controlled by series options like `minSize`,\n * `maxSize`, `sizeBy`, `zMin` and `zMax`.\n *\n * @type      {number|null}\n * @product   highcharts\n * @apioption series.bubble.data.z\n */\n/**\n * @excluding enabled, enabledThreshold, height, radius, width\n * @apioption series.bubble.marker\n */\n''; // Adds doclets above to transpiled file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { seriesTypes: { column: { prototype: { pointClass: { prototype: columnProto } } }, arearange: { prototype: { pointClass: AreaRangePoint } } } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { extend, isNumber } = U;\n/* *\n *\n *  Class\n *\n * */\nclass ColumnRangePoint extends AreaRangePoint {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    isValid() {\n        return isNumber(this.low);\n    }\n}\nextend(ColumnRangePoint.prototype, {\n    setState: columnProto.setState\n});\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnRangePoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ColumnRangePoint from './ColumnRangePoint.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { seriesTypes: { arearange: AreaRangeSeries, column: ColumnSeries, column: { prototype: columnProto } } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, clamp, extend, isNumber, merge, pick } = U;\n/* *\n *\n *  Constants\n *\n * */\n/**\n * The column range is a cartesian series type with higher and lower\n * Y values along an X axis. To display horizontal bars, set\n * [chart.inverted](#chart.inverted) to `true`.\n *\n * @sample {highcharts|highstock} highcharts/demo/columnrange/\n *         Inverted column range\n *\n * @extends      plotOptions.column\n * @since        2.3.0\n * @excluding    negativeColor, stacking, softThreshold, threshold\n * @product      highcharts highstock\n * @requires     highcharts-more\n * @optionparent plotOptions.columnrange\n */\nconst columnRangeOptions = {\n    borderRadius: {\n        where: 'all'\n    },\n    /**\n     * Extended data labels for range series types. Range series data labels\n     * have no `x` and `y` options. Instead, they have `xLow`, `xHigh`,\n     * `yLow` and `yHigh` options to allow the higher and lower data label\n     * sets individually.\n     *\n     * @declare   Highcharts.SeriesAreaRangeDataLabelsOptionsObject\n     * @extends   plotOptions.arearange.dataLabels\n     * @since     2.3.0\n     * @product   highcharts highstock\n     * @apioption plotOptions.columnrange.dataLabels\n     */\n    pointRange: null,\n    legendSymbol: 'rectangle',\n    /** @ignore-option */\n    marker: null,\n    states: {\n        hover: {\n            /** @ignore-option */\n            halo: false\n        }\n    }\n};\n/* *\n *\n *  Class\n *\n * */\n/**\n * The ColumnRangeSeries class\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.columnrange\n *\n * @augments Highcharts.Series\n */\nclass ColumnRangeSeries extends AreaRangeSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    setOptions() {\n        // #14359 Prevent side-effect from stacking.\n        merge(true, arguments[0], { stacking: void 0 });\n        return AreaRangeSeries.prototype.setOptions.apply(this, arguments);\n    }\n    // Overrides from modules that may be loaded after this module\n    // @todo move to compositions\n    translate() {\n        return columnProto.translate.apply(this);\n    }\n    // Public crispCol(): BBoxObject {\n    //     return columnProto.crispCol.apply(this, arguments as any);\n    // }\n    // public drawPoints(): void {\n    //     return columnProto.drawPoints.apply(this, arguments as any);\n    // }\n    // public drawTracker(): void {\n    //     return columnProto.drawTracker.apply(this, arguments as any);\n    // }\n    // public getColumnMetrics(): ColumnMetricsObject {\n    //     return columnProto.getColumnMetrics.apply(this, arguments as any);\n    // }\n    pointAttribs() {\n        return columnProto.pointAttribs.apply(this, arguments);\n    }\n    // Public adjustForMissingColumns(): number {\n    //     return columnProto.adjustForMissingColumns.apply(this, arguments);\n    // }\n    // public animate(): void {\n    //     return columnProto.animate.apply(this, arguments as any);\n    // }\n    translate3dPoints() {\n        return columnProto.translate3dPoints.apply(this, arguments);\n    }\n    translate3dShapes() {\n        return columnProto.translate3dShapes.apply(this, arguments);\n    }\n    afterColumnTranslate() {\n        /**\n         * Translate data points from raw values x and y to plotX and plotY\n         * @private\n         */\n        const yAxis = this.yAxis, xAxis = this.xAxis, startAngleRad = xAxis.startAngleRad, chart = this.chart, isRadial = this.xAxis.isRadial, safeDistance = Math.max(chart.chartWidth, chart.chartHeight) + 999;\n        let height, heightDifference, start, y;\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Don't draw too far outside plot area (#6835)\n         * @private\n         */\n        function safeBounds(pixelPos) {\n            return clamp(pixelPos, -safeDistance, safeDistance);\n        }\n        // Set plotLow and plotHigh\n        this.points.forEach((point) => {\n            const shapeArgs = point.shapeArgs || {}, minPointLength = this.options.minPointLength, plotY = point.plotY, plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);\n            if (isNumber(plotHigh) && isNumber(plotY)) {\n                point.plotHigh = safeBounds(plotHigh);\n                point.plotLow = safeBounds(plotY);\n                // Adjust shape\n                y = point.plotHigh;\n                height = pick(point.rectPlotY, point.plotY) - point.plotHigh;\n                // Adjust for minPointLength\n                if (Math.abs(height) < minPointLength) {\n                    heightDifference = (minPointLength - height);\n                    height += heightDifference;\n                    y -= heightDifference / 2;\n                    // Adjust for negative ranges or reversed Y axis (#1457)\n                }\n                else if (height < 0) {\n                    height *= -1;\n                    y -= height;\n                }\n                if (isRadial && this.polar) {\n                    start = point.barX + startAngleRad;\n                    point.shapeType = 'arc';\n                    point.shapeArgs = this.polar.arc(y + height, y, start, start + point.pointWidth);\n                }\n                else {\n                    shapeArgs.height = height;\n                    shapeArgs.y = y;\n                    const { x = 0, width = 0 } = shapeArgs;\n                    // #17912, aligning column range points\n                    // merge if shapeArgs contains more properties e.g. for 3d\n                    point.shapeArgs = merge(point.shapeArgs, this.crispCol(x, y, width, height));\n                    point.tooltipPos = chart.inverted ?\n                        [\n                            yAxis.len + yAxis.pos - chart.plotLeft - y -\n                                height / 2,\n                            xAxis.len + xAxis.pos - chart.plotTop - x -\n                                width / 2,\n                            height\n                        ] : [\n                        xAxis.left - chart.plotLeft + x + width / 2,\n                        yAxis.pos - chart.plotTop + y + height / 2,\n                        height\n                    ]; // Don't inherit from column tooltip position - #3372\n                }\n            }\n        });\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nColumnRangeSeries.defaultOptions = merge(ColumnSeries.defaultOptions, AreaRangeSeries.defaultOptions, columnRangeOptions);\naddEvent(ColumnRangeSeries, 'afterColumnTranslate', function () {\n    ColumnRangeSeries.prototype.afterColumnTranslate.apply(this);\n}, { order: 5 });\nextend(ColumnRangeSeries.prototype, {\n    directTouch: true,\n    pointClass: ColumnRangePoint,\n    trackerGroups: ['group', 'dataLabelsGroup'],\n    adjustForMissingColumns: columnProto.adjustForMissingColumns,\n    animate: columnProto.animate,\n    crispCol: columnProto.crispCol,\n    drawGraph: noop,\n    drawPoints: columnProto.drawPoints,\n    getSymbol: noop,\n    drawTracker: columnProto.drawTracker,\n    getColumnMetrics: columnProto.getColumnMetrics\n});\nSeriesRegistry.registerSeriesType('columnrange', ColumnRangeSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnRangeSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A `columnrange` series. If the [type](#series.columnrange.type)\n * option is not specified, it is inherited from\n * [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.columnrange\n * @excluding dataParser, dataURL, stack, stacking\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption series.columnrange\n */\n/**\n * An array of data points for the series. For the `columnrange` series\n * type, points can be given in the following ways:\n *\n * 1. An array of arrays with 3 or 2 values. In this case, the values correspond\n *    to `x,low,high`. If the first value is a string, it is applied as the name\n *    of the point, and the `x` value is inferred. The `x` value can also be\n *    omitted, in which case the inner arrays should be of length 2\\. Then the\n *    `x` value is automatically calculated, either starting at 0 and\n *    incremented by 1, or from `pointStart` and `pointInterval` given in the\n *    series options.\n *    ```js\n *    data: [\n *        [0, 4, 2],\n *        [1, 2, 1],\n *        [2, 9, 10]\n *    ]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.columnrange.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        low: 0,\n *        high: 4,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        low: 5,\n *        high: 3,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}\n * @extends   series.arearange.data\n * @excluding marker\n * @product   highcharts highstock\n * @apioption series.columnrange.data\n */\n/**\n * @extends   series.columnrange.dataLabels\n * @product   highcharts highstock\n * @apioption series.columnrange.data.dataLabels\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.columnrange.states.hover\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.columnrange.states.select\n */\n''; // Adds doclets above into transpiled\n","/* *\n *\n *  (c) 2010-2024 Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ColumnPyramidSeriesDefaults from './ColumnPyramidSeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { column: ColumnSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { clamp, merge, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The ColumnPyramidSeries class\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.columnpyramid\n *\n * @augments Highcharts.Series\n */\nclass ColumnPyramidSeries extends ColumnSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Overrides the column translate method\n     * @private\n     */\n    translate() {\n        const series = this, chart = series.chart, options = series.options, dense = series.dense =\n            series.closestPointRange * series.xAxis.transA < 2, borderWidth = series.borderWidth = pick(options.borderWidth, dense ? 0 : 1 // #3635\n        ), yAxis = series.yAxis, threshold = options.threshold, minPointLength = pick(options.minPointLength, 5), metrics = series.getColumnMetrics(), pointWidth = metrics.width, pointXOffset = series.pointXOffset = metrics.offset;\n        let translatedThreshold = series.translatedThreshold =\n            yAxis.getThreshold(threshold), \n        // Postprocessed for border width\n        seriesBarW = series.barW =\n            Math.max(pointWidth, 1 + 2 * borderWidth);\n        if (chart.inverted) {\n            translatedThreshold -= 0.5; // #3355\n        }\n        // When the pointPadding is 0,\n        // we want the pyramids to be packed tightly,\n        // so we allow individual pyramids to have individual sizes.\n        // When pointPadding is greater,\n        // we strive for equal-width columns (#2694).\n        if (options.pointPadding) {\n            seriesBarW = Math.ceil(seriesBarW);\n        }\n        super.translate();\n        // Record the new values\n        for (const point of series.points) {\n            const yBottom = pick(point.yBottom, translatedThreshold), safeDistance = 999 + Math.abs(yBottom), plotY = clamp(point.plotY, -safeDistance, yAxis.len + safeDistance), \n            // Don't draw too far outside plot area\n            // (#1303, #2241, #4264)\n            barW = seriesBarW / 2, barY = Math.min(plotY, yBottom), barH = Math.max(plotY, yBottom) - barY;\n            let barX = point.plotX + pointXOffset, stackTotal, stackHeight, topXwidth, bottomXwidth, invBarPos, x1, x2, x3, x4, y1, y2;\n            // Adjust for null or missing points\n            if (options.centerInCategory) {\n                barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n            }\n            point.barX = barX;\n            point.pointWidth = pointWidth;\n            // Fix the tooltip on center of grouped pyramids\n            // (#1216, #424, #3648)\n            point.tooltipPos = chart.inverted ?\n                [\n                    yAxis.len + yAxis.pos - chart.plotLeft - plotY,\n                    series.xAxis.len - barX - barW,\n                    barH\n                ] :\n                [\n                    barX + barW,\n                    plotY + yAxis.pos - chart.plotTop,\n                    barH\n                ];\n            stackTotal =\n                threshold + (point.total || point.y);\n            // Overwrite stacktotal (always 100 / -100)\n            if (options.stacking === 'percent') {\n                stackTotal =\n                    threshold + (point.y < 0) ?\n                        -100 :\n                        100;\n            }\n            // Get the highest point (if stack, extract from total)\n            const topPointY = yAxis.toPixels((stackTotal), true);\n            // Calculate height of stack (in pixels)\n            stackHeight =\n                chart.plotHeight - topPointY -\n                    (chart.plotHeight - translatedThreshold);\n            // `topXwidth` and `bottomXwidth` = width of lines from the center\n            // calculated from tanges proportion. Cannot be a NaN #12514.\n            topXwidth = stackHeight ?\n                (barW * (barY - topPointY)) / stackHeight : 0;\n            // Like topXwidth, but with height of point\n            bottomXwidth = stackHeight ?\n                (barW * (barY + barH - topPointY)) / stackHeight :\n                0;\n            /*\n                    /\\\n                   /  \\\n            x1,y1,------ x2,y1\n                /       \\\n               -----------\n            x4,y2        x3,y2\n            */\n            x1 = barX - topXwidth + barW;\n            x2 = barX + topXwidth + barW;\n            x3 = barX + bottomXwidth + barW;\n            x4 = barX - bottomXwidth + barW;\n            y1 = barY - minPointLength;\n            y2 = barY + barH;\n            if (point.y < 0) {\n                y1 = barY;\n                y2 = barY + barH + minPointLength;\n            }\n            // Inverted chart\n            if (chart.inverted) {\n                invBarPos = yAxis.width - barY;\n                stackHeight =\n                    topPointY - (yAxis.width - translatedThreshold);\n                // Proportion tanges\n                topXwidth = (barW *\n                    (topPointY - invBarPos)) / stackHeight;\n                bottomXwidth = (barW *\n                    (topPointY - (invBarPos - barH))) / stackHeight;\n                x1 = barX + barW + topXwidth; // Top bottom\n                x2 = x1 - 2 * topXwidth; // Top top\n                x3 = barX - bottomXwidth + barW; // Bottom top\n                x4 = barX + bottomXwidth + barW; // Bottom bottom\n                y1 = barY;\n                y2 = barY + barH - minPointLength;\n                if (point.y < 0) {\n                    y2 = barY + barH + minPointLength;\n                }\n            }\n            // Register shape type and arguments to be used in drawPoints\n            point.shapeType = 'path';\n            point.shapeArgs = {\n                x: x1,\n                y: y1,\n                width: x2 - x1,\n                height: barH,\n                // Path of pyramid\n                d: [\n                    ['M', x1, y1],\n                    ['L', x2, y1],\n                    ['L', x3, y2],\n                    ['L', x4, y2],\n                    ['Z']\n                ]\n            };\n        }\n    }\n}\n/* *\n *\n *  Static properties\n *\n * */\nColumnPyramidSeries.defaultOptions = merge(ColumnSeries.defaultOptions, ColumnPyramidSeriesDefaults);\nSeriesRegistry.registerSeriesType('columnpyramid', ColumnPyramidSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnPyramidSeries;\n","/* *\n *\n *  (c) 2010-2024 Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Column pyramid series display one pyramid per value along an X axis.\n * To display horizontal pyramids, set [chart.inverted](#chart.inverted) to\n * `true`.\n *\n * @sample {highcharts|highstock} highcharts/demo/column-pyramid/\n *         Column pyramid\n * @sample {highcharts|highstock} highcharts/plotoptions/columnpyramid-stacked/\n *         Column pyramid stacked\n * @sample {highcharts|highstock} highcharts/plotoptions/columnpyramid-inverted/\n *         Column pyramid inverted\n *\n * @extends      plotOptions.column\n * @since        7.0.0\n * @product      highcharts highstock\n * @excluding    boostThreshold, borderRadius, crisp, depth, edgeColor,\n *               edgeWidth, groupZPadding, negativeColor, softThreshold,\n *               threshold, zoneAxis, zones, boostBlending\n * @requires     highcharts-more\n * @optionparent plotOptions.columnpyramid\n */\nconst ColumnPyramidSeriesDefaults = {};\n/**\n * A `columnpyramid` series. If the [type](#series.columnpyramid.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.columnpyramid\n * @excluding connectEnds, connectNulls, dashStyle, dataParser, dataURL,\n *            gapSize, gapUnit, linecap, lineWidth, marker, step,\n *            boostThreshold, boostBlending\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption series.columnpyramid\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.columnpyramid.states.hover\n */\n/**\n * @excluding halo, lineWidth, lineWidthPlus, marker\n * @product   highcharts highstock\n * @apioption series.columnpyramid.states.select\n */\n/**\n * An array of data points for the series. For the `columnpyramid` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 6],\n *        [1, 2],\n *        [2, 6]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The objects are point configuration\n *    objects as seen below. If the total number of data points exceeds the\n *    series' [turboThreshold](#series.columnpyramid.turboThreshold), this\n *    option is not available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 9,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 6,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @excluding marker\n * @product   highcharts highstock\n * @apioption series.columnpyramid.data\n */\n''; // Keeps doclets above separate\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnPyramidSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport BoxPlotSeries from '../BoxPlot/BoxPlotSeries.js';\nimport ColumnSeries from '../Column/ColumnSeries.js';\nimport ErrorBarSeriesDefaults from './ErrorBarSeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { arearange: AreaRangeSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, merge, extend } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Errorbar series type\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.errorbar\n *\n * @augments Highcharts.Series\n */\nclass ErrorBarSeries extends BoxPlotSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    getColumnMetrics() {\n        const series = this;\n        // Get the width and X offset, either on top of the linked series\n        // column or standalone\n        return ((series.linkedParent && series.linkedParent.columnMetrics) ||\n            ColumnSeries.prototype.getColumnMetrics.call(series));\n    }\n    drawDataLabels() {\n        const series = this, valKey = series.pointValKey;\n        if (AreaRangeSeries) {\n            AreaRangeSeries.prototype.drawDataLabels.call(series);\n            // Arearange drawDataLabels does not reset point.y to high,\n            // but to low after drawing (#4133)\n            for (const point of series.points) {\n                point.y = point[valKey];\n            }\n        }\n    }\n    toYData(point) {\n        // Return a plain array for speedy calculation\n        return [point.low, point.high];\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nErrorBarSeries.defaultOptions = merge(BoxPlotSeries.defaultOptions, ErrorBarSeriesDefaults);\naddEvent(ErrorBarSeries, 'afterTranslate', function () {\n    for (const point of this.points) {\n        point.plotLow = point.plotY;\n    }\n}, { order: 0 });\nextend(ErrorBarSeries.prototype, {\n    pointArrayMap: ['low', 'high'], // Array point configs are mapped to this\n    pointValKey: 'high', // Defines the top of the tracker\n    doQuartiles: false\n});\nSeriesRegistry.registerSeriesType('errorbar', ErrorBarSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default ErrorBarSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Error bars are a graphical representation of the variability of data and\n * are used on graphs to indicate the error, or uncertainty in a reported\n * measurement.\n *\n * @sample highcharts/demo/error-bar/\n *         Error bars on a column series\n * @sample highcharts/series-errorbar/on-scatter/\n *         Error bars on a scatter series\n * @sample highcharts/series-errorbar/datalabels/\n *         Error bars with data labels\n *\n * @extends      plotOptions.boxplot\n * @excluding    boostBlending, boostThreshold\n * @product      highcharts\n * @requires     highcharts-more\n * @optionparent plotOptions.errorbar\n */\nconst ErrorBarSeriesDefaults = {\n    /**\n     * The main color of the bars. This can be overridden by\n     * [stemColor](#plotOptions.errorbar.stemColor) and\n     * [whiskerColor](#plotOptions.errorbar.whiskerColor) individually.\n     *\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default #000000\n     * @since   3.0\n     * @product highcharts\n     */\n    color: \"#000000\" /* Palette.neutralColor100 */,\n    grouping: false,\n    /**\n     * The parent series of the error bar. The default value links it to\n     * the previous series. Otherwise, use the id of the parent series.\n     *\n     * @since   3.0\n     * @product highcharts\n     */\n    linkedTo: ':previous',\n    tooltip: {\n        pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'\n    },\n    /**\n     * The line width of the whiskers, the horizontal lines marking\n     * low and high values. When `null`, the general\n     * [lineWidth](#plotOptions.errorbar.lineWidth) applies.\n     *\n     * @sample {highcharts} highcharts/plotoptions/error-bar-styling/\n     *         Error bar styling\n     *\n     * @type    {number}\n     * @since   3.0\n     * @product highcharts\n     */\n    whiskerWidth: null\n};\n/**\n * A `errorbar` series. If the [type](#series.errorbar.type) option\n * is not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.errorbar\n * @excluding dataParser, dataURL, stack, stacking, boostThreshold,\n *            boostBlending\n * @product   highcharts\n * @requires  highcharts-more\n * @apioption series.errorbar\n */\n/**\n * An array of data points for the series. For the `errorbar` series\n * type, points can be given in the following ways:\n *\n * 1. An array of arrays with 3 or 2 values. In this case, the values correspond\n *    to `x,low,high`. If the first value is a string, it is applied as the name\n *    of the point, and the `x` value is inferred. The `x` value can also be\n *    omitted, in which case the inner arrays should be of length 2\\. Then the\n *    `x` value is automatically calculated, either starting at 0 and\n *    incremented by 1, or from `pointStart` and `pointInterval` given in the\n *    series options.\n *    ```js\n *    data: [\n *        [0, 10, 2],\n *        [1, 1, 8],\n *        [2, 4, 5]\n *    ]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.errorbar.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        low: 0,\n *        high: 0,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        low: 5,\n *        high: 5,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<Array<(number|string),number>|Array<(number|string),number,number>|*>}\n * @extends   series.arearange.data\n * @excluding dataLabels, drilldown, marker, states\n * @product   highcharts\n * @apioption series.errorbar.data\n */\n''; // Adds doclets above to transpiled file\n/* *\n *\n *  Default Export\n *\n * */\nexport default ErrorBarSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: { prototype: { pointClass: Point } } } = SeriesRegistry;\n/* *\n *\n *  Class\n *\n * */\nclass GaugePoint extends Point {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Don't do any hover colors or anything\n     * @private\n     */\n    setState(state) {\n        this.state = state;\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default GaugePoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport GaugePoint from './GaugePoint.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: Series, seriesTypes: { column: ColumnSeries } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { clamp, isNumber, extend, merge, pick, pInt, defined } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n *\n * The `gauge` series type\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.map\n *\n * @augments Highcharts.Series\n */\nclass GaugeSeries extends Series {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Calculate paths etc\n     * @private\n     */\n    translate() {\n        const series = this, yAxis = series.yAxis, options = series.options, center = yAxis.center;\n        series.generatePoints();\n        series.points.forEach((point) => {\n            const dialOptions = merge(options.dial, point.dial), radius = (pInt(dialOptions.radius) * center[2]) / 200, baseLength = (pInt(dialOptions.baseLength) * radius) / 100, rearLength = (pInt(dialOptions.rearLength) * radius) / 100, baseWidth = dialOptions.baseWidth, topWidth = dialOptions.topWidth;\n            let overshoot = options.overshoot, rotation = yAxis.startAngleRad + yAxis.translate(point.y, void 0, void 0, void 0, true);\n            // Handle the wrap and overshoot options\n            if (isNumber(overshoot) || options.wrap === false) {\n                overshoot = isNumber(overshoot) ?\n                    (overshoot / 180 * Math.PI) : 0;\n                rotation = clamp(rotation, yAxis.startAngleRad - overshoot, yAxis.endAngleRad + overshoot);\n            }\n            rotation = rotation * 180 / Math.PI;\n            point.shapeType = 'path';\n            const d = dialOptions.path || [\n                ['M', -rearLength, -baseWidth / 2],\n                ['L', baseLength, -baseWidth / 2],\n                ['L', radius, -topWidth / 2],\n                ['L', radius, topWidth / 2],\n                ['L', baseLength, baseWidth / 2],\n                ['L', -rearLength, baseWidth / 2],\n                ['Z']\n            ];\n            point.shapeArgs = {\n                d,\n                translateX: center[0],\n                translateY: center[1],\n                rotation: rotation\n            };\n            // Positions for data label\n            point.plotX = center[0];\n            point.plotY = center[1];\n            if (defined(point.y) && yAxis.max - yAxis.min) {\n                point.percentage =\n                    (point.y - yAxis.min) / (yAxis.max - yAxis.min) * 100;\n            }\n        });\n    }\n    /**\n     * Draw the points where each point is one needle\n     * @private\n     */\n    drawPoints() {\n        const series = this, chart = series.chart, center = series.yAxis.center, pivot = series.pivot, options = series.options, pivotOptions = options.pivot, renderer = chart.renderer;\n        series.points.forEach((point) => {\n            const graphic = point.graphic, shapeArgs = point.shapeArgs, d = shapeArgs.d, dialOptions = merge(options.dial, point.dial); // #1233\n            if (graphic) {\n                graphic.animate(shapeArgs);\n                shapeArgs.d = d; // Animate alters it\n            }\n            else {\n                point.graphic =\n                    renderer[point.shapeType](shapeArgs)\n                        .addClass('highcharts-dial')\n                        .add(series.group);\n            }\n            // Presentational attributes\n            if (!chart.styledMode) {\n                point.graphic[graphic ? 'animate' : 'attr']({\n                    stroke: dialOptions.borderColor,\n                    'stroke-width': dialOptions.borderWidth,\n                    fill: dialOptions.backgroundColor\n                });\n            }\n        });\n        // Add or move the pivot\n        if (pivot) {\n            pivot.animate({\n                translateX: center[0],\n                translateY: center[1]\n            });\n        }\n        else if (pivotOptions) {\n            series.pivot =\n                renderer.circle(0, 0, pivotOptions.radius)\n                    .attr({\n                    zIndex: 2\n                })\n                    .addClass('highcharts-pivot')\n                    .translate(center[0], center[1])\n                    .add(series.group);\n            // Presentational attributes\n            if (!chart.styledMode) {\n                series.pivot.attr({\n                    fill: pivotOptions.backgroundColor,\n                    stroke: pivotOptions.borderColor,\n                    'stroke-width': pivotOptions.borderWidth\n                });\n            }\n        }\n    }\n    /**\n     * Animate the arrow up from startAngle\n     * @private\n     */\n    animate(init) {\n        const series = this;\n        if (!init) {\n            series.points.forEach((point) => {\n                const graphic = point.graphic;\n                if (graphic) {\n                    // Start value\n                    graphic.attr({\n                        rotation: series.yAxis.startAngleRad * 180 / Math.PI\n                    });\n                    // Animate\n                    graphic.animate({\n                        rotation: point.shapeArgs.rotation\n                    }, series.options.animation);\n                }\n            });\n        }\n    }\n    /**\n     * @private\n     */\n    render() {\n        this.group = this.plotGroup('group', 'series', this.visible ? 'inherit' : 'hidden', this.options.zIndex, this.chart.seriesGroup);\n        Series.prototype.render.call(this);\n        this.group.clip(this.chart.clipRect);\n    }\n    /**\n     * Extend the basic setData method by running processData and generatePoints\n     * immediately, in order to access the points from the legend.\n     * @private\n     */\n    setData(data, redraw) {\n        Series.prototype.setData.call(this, data, false);\n        this.processData();\n        this.generatePoints();\n        if (pick(redraw, true)) {\n            this.chart.redraw();\n        }\n    }\n    /**\n     * Define hasData function for non-cartesian series.\n     * Returns true if the series has points at all.\n     * @private\n     */\n    hasData() {\n        return !!this.points.length; // != 0\n    }\n}\n/* *\n *\n *  Static properties\n *\n * */\n/**\n * Gauges are circular plots displaying one or more values with a dial\n * pointing to values along the perimeter.\n *\n * @sample highcharts/demo/gauge-speedometer/\n *         Gauge chart\n *\n * @extends      plotOptions.line\n * @excluding    animationLimit, boostThreshold, colorAxis, colorKey,\n *               connectEnds, connectNulls, cropThreshold, dashStyle,\n *               dragDrop, findNearestPointBy, getExtremesFromAll, marker,\n *               negativeColor, pointPlacement, shadow, softThreshold,\n *               stacking, states, step, threshold, turboThreshold, xAxis,\n *               zoneAxis, zones, dataSorting, boostBlending\n * @product      highcharts\n * @requires     highcharts-more\n * @optionparent plotOptions.gauge\n */\nGaugeSeries.defaultOptions = merge(Series.defaultOptions, {\n    /**\n     * When this option is `true`, the dial will wrap around the axes.\n     * For instance, in a full-range gauge going from 0 to 360, a value\n     * of 400 will point to 40\\. When `wrap` is `false`, the dial stops\n     * at 360.\n     *\n     * @see [overshoot](#plotOptions.gauge.overshoot)\n     *\n     * @type      {boolean}\n     * @default   true\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.gauge.wrap\n     */\n    /**\n     * Data labels for the gauge. For gauges, the data labels are\n     * enabled by default and shown in a bordered box below the point.\n     *\n     * @since   2.3.0\n     * @product highcharts\n     */\n    dataLabels: {\n        borderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n        borderRadius: 3,\n        borderWidth: 1,\n        crop: false,\n        defer: false,\n        enabled: true,\n        verticalAlign: 'top',\n        y: 15,\n        zIndex: 2\n    },\n    /**\n     * Options for the dial or arrow pointer of the gauge.\n     *\n     * In styled mode, the dial is styled with the\n     * `.highcharts-gauge-series .highcharts-dial` rule.\n     *\n     * @sample {highcharts} highcharts/css/gauge/\n     *         Styled mode\n     *\n     * @type    {*}\n     * @since   2.3.0\n     * @product highcharts\n     */\n    dial: {\n        /**\n         * The background or fill color of the gauge's dial.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @default   #000000\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.backgroundColor\n         */\n        backgroundColor: \"#000000\" /* Palette.neutralColor100 */,\n        /**\n         * The length of the dial's base part, relative to the total\n         * radius or length of the dial.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {string}\n         * @default   70%\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.baseLength\n         */\n        baseLength: '70%',\n        /**\n         * The pixel width of the base of the gauge dial. The base is\n         * the part closest to the pivot, defined by baseLength.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {number}\n         * @default   3\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.baseWidth\n         */\n        baseWidth: 3,\n        /**\n         * The border color or stroke of the gauge's dial. By default,\n         * the borderWidth is 0, so this must be set in addition to a\n         * custom border color.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @default   #cccccc\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.borderColor\n         */\n        borderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n        /**\n         * The width of the gauge dial border in pixels.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.borderWidth\n         */\n        borderWidth: 0,\n        /**\n         * An array with an SVG path for the custom dial.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-path/\n         *         Dial options demonstrated\n         *\n         * @type      {Highcharts.SVGPathArray}\n         * @since 10.2.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.path\n         */\n        /**\n         * The radius or length of the dial, in percentages relative to\n         * the radius of the gauge itself.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {string}\n         * @default   80%\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.radius\n         */\n        radius: '80%',\n        /**\n         * The length of the dial's rear end, the part that extends out\n         * on the other side of the pivot. Relative to the dial's\n         * length.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {string}\n         * @default   10%\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.rearLength\n         */\n        rearLength: '10%',\n        /**\n         * The width of the top of the dial, closest to the perimeter.\n         * The pivot narrows in from the base to the top.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-dial/\n         *         Dial options demonstrated\n         *\n         * @type      {number}\n         * @default   1\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.dial.topWidth\n         */\n        topWidth: 1\n    },\n    /**\n     * Allow the dial to overshoot the end of the perimeter axis by\n     * this many degrees. Say if the gauge axis goes from 0 to 60, a\n     * value of 100, or 1000, will show 5 degrees beyond the end of the\n     * axis when this option is set to 5.\n     *\n     * @see [wrap](#plotOptions.gauge.wrap)\n     *\n     * @sample {highcharts} highcharts/plotoptions/gauge-overshoot/\n     *         Allow 5 degrees overshoot\n     *\n     * @type      {number}\n     * @since     3.0.10\n     * @product   highcharts\n     * @apioption plotOptions.gauge.overshoot\n     */\n    /**\n     * Options for the pivot or the center point of the gauge.\n     *\n     * In styled mode, the pivot is styled with the\n     * `.highcharts-gauge-series .highcharts-pivot` rule.\n     *\n     * @sample {highcharts} highcharts/css/gauge/\n     *         Styled mode\n     *\n     * @type    {*}\n     * @since   2.3.0\n     * @product highcharts\n     */\n    pivot: {\n        /**\n         * The pixel radius of the pivot.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-pivot/\n         *         Pivot options demonstrated\n         *\n         * @type      {number}\n         * @default   5\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.pivot.radius\n         */\n        radius: 5,\n        /**\n         * The border or stroke width of the pivot.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-pivot/\n         *         Pivot options demonstrated\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.pivot.borderWidth\n         */\n        borderWidth: 0,\n        /**\n         * The border or stroke color of the pivot. In able to change\n         * this, the borderWidth must also be set to something other\n         * than the default 0.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-pivot/\n         *         Pivot options demonstrated\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @default   #cccccc\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.pivot.borderColor\n         */\n        borderColor: \"#cccccc\" /* Palette.neutralColor20 */,\n        /**\n         * The background color or fill of the pivot.\n         *\n         * @sample {highcharts} highcharts/plotoptions/gauge-pivot/\n         *         Pivot options demonstrated\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @default   #000000\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.gauge.pivot.backgroundColor\n         */\n        backgroundColor: \"#000000\" /* Palette.neutralColor100 */\n    },\n    tooltip: {\n        headerFormat: ''\n    },\n    /**\n     * Whether to display this particular series or series type in the\n     * legend. Defaults to false for gauge series.\n     *\n     * @since   2.3.0\n     * @product highcharts\n     */\n    showInLegend: false\n    // Prototype members\n});\nextend(GaugeSeries.prototype, {\n    // `chart.angular` will be set to true when a gauge series is present, and\n    // this will be used on the axes\n    angular: true,\n    directTouch: true, // #5063\n    drawGraph: noop,\n    drawTracker: ColumnSeries.prototype.drawTracker,\n    fixedBox: true,\n    forceDL: true,\n    noSharedTooltip: true,\n    pointClass: GaugePoint,\n    trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeriesRegistry.registerSeriesType('gauge', GaugeSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default GaugeSeries;\n/* *\n *\n *  API options\n *\n * */\n/**\n * A `gauge` series. If the [type](#series.gauge.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.gauge\n * @excluding animationLimit, boostThreshold, connectEnds, connectNulls,\n *            cropThreshold, dashStyle, dataParser, dataURL, findNearestPointBy,\n *            getExtremesFromAll, marker, negativeColor, pointPlacement, shadow,\n *            softThreshold, stack, stacking, states, step, threshold,\n *            turboThreshold, zoneAxis, zones, dataSorting, boostBlending\n * @product   highcharts\n * @requires  highcharts-more\n * @apioption series.gauge\n */\n/**\n * An array of data points for the series. For the `gauge` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.gauge.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        y: 6,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        y: 8,\n *        name: \"Point1\",\n *       color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * The typical gauge only contains a single data value.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|null|*>}\n * @extends   series.line.data\n * @excluding drilldown, marker, x\n * @product   highcharts\n * @apioption series.gauge.data\n */\n''; // Adds the doclets above in the transpiled file\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Core/Globals.js';\nconst { composed } = H;\nimport U from '../Core/Utilities.js';\nconst { addEvent, pushUnique } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction compose(ChartClass) {\n    if (pushUnique(composed, 'DragNodes')) {\n        addEvent(ChartClass, 'load', onChartLoad);\n    }\n}\n/**\n * Draggable mode:\n * @private\n */\nfunction onChartLoad() {\n    const chart = this;\n    let mousedownUnbinder, mousemoveUnbinder, mouseupUnbinder;\n    if (chart.container) {\n        mousedownUnbinder = addEvent(chart.container, 'mousedown', (event) => {\n            const point = chart.hoverPoint;\n            if (point &&\n                point.series &&\n                point.series.hasDraggableNodes &&\n                point.series.options.draggable) {\n                point.series.onMouseDown(point, event);\n                mousemoveUnbinder = addEvent(chart.container, 'mousemove', (e) => (point &&\n                    point.series &&\n                    point.series.onMouseMove(point, e)));\n                mouseupUnbinder = addEvent(chart.container.ownerDocument, 'mouseup', (e) => {\n                    mousemoveUnbinder();\n                    mouseupUnbinder();\n                    return point &&\n                        point.series &&\n                        point.series.onMouseUp(point, e);\n                });\n            }\n        });\n    }\n    addEvent(chart, 'destroy', function () {\n        mousedownUnbinder();\n    });\n}\n/**\n * Mouse down action, initializing drag&drop mode.\n *\n * @private\n * @param {Highcharts.Point} point\n *        The point that event occurred.\n * @param {Highcharts.PointerEventObject} event\n *        Browser event, before normalization.\n */\nfunction onMouseDown(point, event) {\n    const normalizedEvent = this.chart.pointer?.normalize(event) || event;\n    point.fixedPosition = {\n        chartX: normalizedEvent.chartX,\n        chartY: normalizedEvent.chartY,\n        plotX: point.plotX,\n        plotY: point.plotY\n    };\n    point.inDragMode = true;\n}\n/**\n * Mouse move action during drag&drop.\n *\n * @private\n *\n * @param {Highcharts.Point} point\n *        The point that event occurred.\n * @param {global.Event} event\n *        Browser event, before normalization.\n */\nfunction onMouseMove(point, event) {\n    if (point.fixedPosition && point.inDragMode) {\n        const series = this, chart = series.chart, normalizedEvent = chart.pointer?.normalize(event) || event, diffX = point.fixedPosition.chartX - normalizedEvent.chartX, diffY = point.fixedPosition.chartY - normalizedEvent.chartY, graphLayoutsLookup = chart.graphLayoutsLookup;\n        let newPlotX, newPlotY;\n        // At least 5px to apply change (avoids simple click):\n        if (Math.abs(diffX) > 5 || Math.abs(diffY) > 5) {\n            newPlotX = point.fixedPosition.plotX - diffX;\n            newPlotY = point.fixedPosition.plotY - diffY;\n            if (chart.isInsidePlot(newPlotX, newPlotY)) {\n                point.plotX = newPlotX;\n                point.plotY = newPlotY;\n                point.hasDragged = true;\n                this.redrawHalo(point);\n                graphLayoutsLookup.forEach((layout) => {\n                    layout.restartSimulation();\n                });\n            }\n        }\n    }\n}\n/**\n * Mouse up action, finalizing drag&drop.\n *\n * @private\n * @param {Highcharts.Point} point\n *        The point that event occurred.\n */\nfunction onMouseUp(point) {\n    if (point.fixedPosition) {\n        if (point.hasDragged) {\n            if (this.layout.enableSimulation) {\n                this.layout.start();\n            }\n            else {\n                this.chart.redraw();\n            }\n        }\n        point.inDragMode = point.hasDragged = false;\n        if (!this.options.fixedDraggable) {\n            delete point.fixedPosition;\n        }\n    }\n}\n/**\n * Redraw halo on mousemove during the drag&drop action.\n *\n * @private\n * @param {Highcharts.Point} point\n *        The point that should show halo.\n */\nfunction redrawHalo(point) {\n    if (point && this.halo) {\n        this.halo.attr({\n            d: point.haloPath(this.options.states.hover.halo.size)\n        });\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst DragNodesComposition = {\n    compose,\n    onMouseDown,\n    onMouseMove,\n    onMouseUp,\n    redrawHalo\n};\nexport default DragNodesComposition;\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Core/Animation/AnimationUtilities.js';\nconst { setAnimation } = A;\nimport H from '../Core/Globals.js';\nconst { composed } = H;\nimport U from '../Core/Utilities.js';\nconst { addEvent, pushUnique } = U;\n/* *\n *\n *  Constants\n *\n * */\nconst integrations = {};\nconst layouts = {};\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction compose(ChartClass) {\n    if (pushUnique(composed, 'GraphLayout')) {\n        addEvent(ChartClass, 'afterPrint', onChartAfterPrint);\n        addEvent(ChartClass, 'beforePrint', onChartBeforePrint);\n        addEvent(ChartClass, 'predraw', onChartPredraw);\n        addEvent(ChartClass, 'render', onChartRender);\n    }\n}\n/**\n * Re-enable simulation after print.\n * @private\n */\nfunction onChartAfterPrint() {\n    if (this.graphLayoutsLookup) {\n        this.graphLayoutsLookup.forEach((layout) => {\n            // Return to default simulation\n            layout.updateSimulation();\n        });\n        this.redraw();\n    }\n}\n/**\n * Disable simulation before print if enabled.\n * @private\n */\nfunction onChartBeforePrint() {\n    if (this.graphLayoutsLookup) {\n        this.graphLayoutsLookup.forEach((layout) => {\n            layout.updateSimulation(false);\n        });\n        this.redraw();\n    }\n}\n/**\n * Clear previous layouts.\n * @private\n */\nfunction onChartPredraw() {\n    if (this.graphLayoutsLookup) {\n        this.graphLayoutsLookup.forEach((layout) => {\n            layout.stop();\n        });\n    }\n}\n/**\n * @private\n */\nfunction onChartRender() {\n    let systemsStable, afterRender = false;\n    const layoutStep = (layout) => {\n        if (layout.maxIterations-- &&\n            isFinite(layout.temperature) &&\n            !layout.isStable() &&\n            !layout.enableSimulation) {\n            // Hook similar to build-in addEvent, but instead of\n            // creating whole events logic, use just a function.\n            // It's faster which is important for rAF code.\n            // Used e.g. in packed-bubble series for bubble radius\n            // calculations\n            if (layout.beforeStep) {\n                layout.beforeStep();\n            }\n            layout.step();\n            systemsStable = false;\n            afterRender = true;\n        }\n    };\n    if (this.graphLayoutsLookup) {\n        setAnimation(false, this);\n        // Start simulation\n        this.graphLayoutsLookup.forEach((layout) => layout.start());\n        // Just one sync step, to run different layouts similar to\n        // async mode.\n        while (!systemsStable) {\n            systemsStable = true;\n            this.graphLayoutsLookup.forEach(layoutStep);\n        }\n        if (afterRender) {\n            this.series.forEach((series) => {\n                if (series && series.layout) {\n                    series.render();\n                }\n            });\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst GraphLayoutComposition = {\n    compose,\n    integrations,\n    layouts\n};\nexport default GraphLayoutComposition;\n","/* *\n *\n *  (c) 2010-2024 Grzegorz Blachlinski, Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Chart from '../../Core/Chart/Chart.js';\nimport Point from '../../Core/Series/Point.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { seriesTypes: { bubble: { prototype: { pointClass: BubblePoint } } } } = SeriesRegistry;\n/* *\n *\n *  Class\n *\n * */\nclass PackedBubblePoint extends BubblePoint {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Destroy point.\n     * Then remove point from the layout.\n     * @private\n     */\n    destroy() {\n        if (this.series?.layout) {\n            this.series.layout.removeElementFromCollection(this, this.series.layout.nodes);\n        }\n        return Point.prototype.destroy.apply(this, arguments);\n    }\n    firePointEvent() {\n        const series = this.series, seriesOptions = series.options;\n        if (this.isParentNode && seriesOptions.parentNode) {\n            const temp = seriesOptions.allowPointSelect;\n            seriesOptions.allowPointSelect = (seriesOptions.parentNode.allowPointSelect);\n            Point.prototype.firePointEvent.apply(this, arguments);\n            seriesOptions.allowPointSelect = temp;\n        }\n        else {\n            Point.prototype.firePointEvent.apply(this, arguments);\n        }\n    }\n    select() {\n        const point = this, series = this.series, chart = series.chart;\n        if (point.isParentNode) {\n            chart.getSelectedPoints = chart.getSelectedParentNodes;\n            Point.prototype.select.apply(this, arguments);\n            chart.getSelectedPoints = Chart.prototype.getSelectedPoints;\n        }\n        else {\n            Point.prototype.select.apply(this, arguments);\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default PackedBubblePoint;\n","/* *\n *\n *  Imports\n *\n * */\nimport U from '../../Core/Utilities.js';\nconst { isNumber } = U;\n/* *\n *\n *  Constants\n *\n * */\n/**\n * A packed bubble series is a two dimensional series type, where each point\n * renders a value in X, Y position. Each point is drawn as a bubble\n * where the bubbles don't overlap with each other and the radius\n * of the bubble relates to the value.\n *\n * @sample highcharts/demo/packed-bubble/\n *         Packed bubble chart\n * @sample highcharts/demo/packed-bubble-split/\n *         Split packed bubble chart\n *\n * @extends      plotOptions.bubble\n * @excluding    connectEnds, connectNulls, cropThreshold, dragDrop, jitter,\n *               keys, pointPlacement, sizeByAbsoluteValue, step, xAxis,\n *               yAxis, zMax, zMin, dataSorting, boostThreshold,\n *               boostBlending\n * @product      highcharts\n * @since        7.0.0\n * @requires     highcharts-more\n * @optionparent plotOptions.packedbubble\n *\n * @private\n */\nconst PackedBubbleSeriesDefaults = {\n    /**\n     * Minimum bubble size. Bubbles will automatically size between the\n     * `minSize` and `maxSize` to reflect the value of each bubble.\n     * Can be either pixels (when no unit is given), or a percentage of\n     * the smallest one of the plot width and height, divided by the square\n     * root of total number of points.\n     *\n     * @sample highcharts/plotoptions/bubble-size/\n     *         Bubble size\n     *\n     * @type {number|string}\n     *\n     * @private\n     */\n    minSize: '10%',\n    /**\n     * Maximum bubble size. Bubbles will automatically size between the\n     * `minSize` and `maxSize` to reflect the value of each bubble.\n     * Can be either pixels (when no unit is given), or a percentage of\n     * the smallest one of the plot width and height, divided by the square\n     * root of total number of points.\n     *\n     * @sample highcharts/plotoptions/bubble-size/\n     *         Bubble size\n     *\n     * @type {number|string}\n     *\n     * @private\n     */\n    maxSize: '50%',\n    sizeBy: 'area',\n    zoneAxis: 'y',\n    crisp: false,\n    tooltip: {\n        pointFormat: 'Value: {point.value}'\n    },\n    /**\n     * Flag to determine if nodes are draggable or not. Available for\n     * graph with useSimulation set to true only.\n     *\n     * @since 7.1.0\n     *\n     * @private\n     */\n    draggable: true,\n    /**\n     * An option is giving a possibility to choose between using simulation\n     * for calculating bubble positions. These reflects in both animation\n     * and final position of bubbles. Simulation is also adding options to\n     * the series graph based on used layout. In case of big data sets, with\n     * any performance issues, it is possible to disable animation and pack\n     * bubble in a simple circular way.\n     *\n     * @sample highcharts/series-packedbubble/spiral/\n     *         useSimulation set to false\n     *\n     * @since 7.1.0\n     *\n     * @private\n     */\n    useSimulation: true,\n    /**\n     * Series options for parent nodes.\n     *\n     * @since 8.1.1\n     *\n     * @private\n     */\n    parentNode: {\n        /**\n         * Allow this series' parent nodes to be selected\n         * by clicking on the graph.\n         *\n         * @since 8.1.1\n         */\n        allowPointSelect: false\n    },\n    /**\n     *\n     * @declare Highcharts.SeriesPackedBubbleDataLabelsOptionsObject\n     *\n     * @private\n     */\n    dataLabels: {\n        /**\n         * The\n         * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n         * specifying what to show for _node_ in the networkgraph. In v7.0\n         * defaults to `{key}`, since v7.1 defaults to `undefined` and\n         * `formatter` is used instead.\n         *\n         * @type      {string}\n         * @since     7.0.0\n         * @apioption plotOptions.packedbubble.dataLabels.format\n         */\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Callback JavaScript function to format the data label for a node.\n         * Note that if a `format` is defined, the format takes precedence\n         * and the formatter is ignored.\n         *\n         * @type  {Highcharts.SeriesPackedBubbleDataLabelsFormatterCallbackFunction}\n         * @since 7.0.0\n         */\n        formatter: function () {\n            const { numberFormatter } = this.series.chart;\n            const { value } = this.point;\n            return isNumber(value) ? numberFormatter(value, -1) : '';\n        },\n        /**\n         * @type      {string}\n         * @since     7.1.0\n         * @apioption plotOptions.packedbubble.dataLabels.parentNodeFormat\n         */\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * @type  {Highcharts.SeriesPackedBubbleDataLabelsFormatterCallbackFunction}\n         * @since 7.1.0\n         */\n        parentNodeFormatter: function () {\n            return this.name;\n        },\n        /**\n         * @sample {highcharts} highcharts/series-packedbubble/packed-dashboard\n         *         Dashboard with dataLabels on parentNodes\n         *\n         * @declare Highcharts.SeriesPackedBubbleDataLabelsTextPathOptionsObject\n         * @since   7.1.0\n         */\n        parentNodeTextPath: {\n            /**\n             * Presentation attributes for the text path.\n             *\n             * @type      {Highcharts.SVGAttributes}\n             * @since     7.1.0\n             * @apioption plotOptions.packedbubble.dataLabels.attributes\n             */\n            /**\n             * Enable or disable `textPath` option for link's or marker's\n             * data labels.\n             *\n             * @since 7.1.0\n             */\n            enabled: true\n        },\n        /**\n         * Options for a _node_ label text which should follow marker's\n         * shape.\n         *\n         * **Note:** Only SVG-based renderer supports this option.\n         *\n         * @extends   plotOptions.series.dataLabels.textPath\n         * @apioption plotOptions.packedbubble.dataLabels.textPath\n         */\n        padding: 0,\n        style: {\n            transition: 'opacity 2000ms'\n        }\n    },\n    /**\n     * Options for layout algorithm when simulation is enabled. Inside there\n     * are options to change the speed, padding, initial bubbles positions\n     * and more.\n     *\n     * @extends   plotOptions.networkgraph.layoutAlgorithm\n     * @excluding approximation, attractiveForce, repulsiveForce, theta\n     * @since     7.1.0\n     *\n     * @private\n     */\n    layoutAlgorithm: {\n        /**\n         * Initial layout algorithm for positioning nodes. Can be one of\n         * the built-in options (\"circle\", \"random\") or a function where\n         * positions should be set on each node (`this.nodes`) as\n         * `node.plotX` and `node.plotY`.\n         *\n         * @sample highcharts/series-networkgraph/initial-positions/\n         *         Initial positions with callback\n         *\n         * @type {\"circle\"|\"random\"|Function}\n         */\n        initialPositions: 'circle',\n        /**\n         * @sample highcharts/series-packedbubble/initial-radius/\n         *         Initial radius set to 200\n         *\n         * @extends   plotOptions.networkgraph.layoutAlgorithm.initialPositionRadius\n         * @excluding states\n         */\n        initialPositionRadius: 20,\n        /**\n         * The distance between two bubbles, when the algorithm starts to\n         * treat two bubbles as overlapping. The `bubblePadding` is also the\n         * expected distance between all the bubbles on simulation end.\n         */\n        bubblePadding: 5,\n        /**\n         * Whether bubbles should interact with their parentNode to keep\n         * them inside.\n         */\n        parentNodeLimit: false,\n        /**\n         * Whether series should interact with each other or not. When\n         * `parentNodeLimit` is set to true, thi option should be set to\n         * false to avoid sticking points in wrong series parentNode.\n         */\n        seriesInteraction: true,\n        /**\n         * In case of split series, this option allows user to drag and\n         * drop points between series, for changing point related series.\n         *\n         * @sample highcharts/series-packedbubble/packed-dashboard/\n         *         Example of drag'n drop bubbles for bubble kanban\n         */\n        dragBetweenSeries: false,\n        /**\n         * Layout algorithm options for parent nodes.\n         *\n         * @extends   plotOptions.networkgraph.layoutAlgorithm\n         * @excluding approximation, attractiveForce, enableSimulation,\n         *            repulsiveForce, theta\n         */\n        parentNodeOptions: {\n            maxIterations: 400,\n            gravitationalConstant: 0.03,\n            maxSpeed: 50,\n            initialPositionRadius: 100,\n            seriesInteraction: true,\n            /**\n             * Styling options for parentNodes markers. Similar to\n             * line.marker options.\n             *\n             * @sample highcharts/series-packedbubble/parentnode-style/\n             *         Bubble size\n             *\n             * @extends   plotOptions.series.marker\n             * @excluding states\n             */\n            marker: {\n                fillColor: null,\n                fillOpacity: 1,\n                lineWidth: null,\n                lineColor: null,\n                symbol: 'circle'\n            }\n        },\n        enableSimulation: true,\n        /**\n         * Type of the algorithm used when positioning bubbles.\n         * @ignore-option\n         */\n        type: 'packedbubble',\n        /**\n         * Integration type. Integration determines how forces are applied\n         * on particles. The `packedbubble` integration is based on\n         * the networkgraph `verlet` integration, where the new position\n         * is based on a previous position without velocity:\n         * `newPosition += previousPosition - newPosition`.\n         *\n         * @sample highcharts/series-networkgraph/forces/\n         *\n         * @ignore-option\n         */\n        integration: 'packedbubble',\n        maxIterations: 1000,\n        /**\n         * Whether to split series into individual groups or to mix all\n         * series together.\n         *\n         * @since   7.1.0\n         * @default false\n         */\n        splitSeries: false,\n        /**\n         * Max speed that node can get in one iteration. In terms of\n         * simulation, it's a maximum translation (in pixels) that a node\n         * can move (in both, x and y, dimensions). While `friction` is\n         * applied on all nodes, max speed is applied only for nodes that\n         * move very fast, for example small or disconnected ones.\n         *\n         * @see [layoutAlgorithm.integration](#series.networkgraph.layoutAlgorithm.integration)\n         *\n         * @see [layoutAlgorithm.friction](#series.networkgraph.layoutAlgorithm.friction)\n         */\n        maxSpeed: 5,\n        gravitationalConstant: 0.01,\n        friction: -0.981\n    }\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default PackedBubbleSeriesDefaults;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A `packedbubble` series. If the [type](#series.packedbubble.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @type      {Object}\n * @extends   series,plotOptions.packedbubble\n * @excluding cropThreshold, dataParser, dataSorting, dataURL, dragDrop, stack,\n *            boostThreshold, boostBlending\n * @product   highcharts\n * @requires  highcharts-more\n * @apioption series.packedbubble\n */\n/**\n * An array of data points for the series. For the `packedbubble` series type,\n * points can be given in the following ways:\n *\n * 1.  An array of `values`.\n *\n *  ```js\n *     data: [5, 1, 20]\n *  ```\n *\n * 2.  An array of objects with named values. The objects are point\n * configuration objects as seen below. If the total number of data points\n * exceeds the series' [turboThreshold](#series.packedbubble.turboThreshold),\n * this option is not available.\n *\n *  ```js\n *     data: [{\n *         value: 1,\n *         name: \"Point2\",\n *         color: \"#00FF00\"\n *     }, {\n *         value: 5,\n *         name: \"Point1\",\n *         color: \"#FF00FF\"\n *     }]\n *  ```\n *\n * @type      {Array<Object|Array>}\n * @extends   series.line.data\n * @excluding marker, x, y\n * @sample    {highcharts} highcharts/series/data-array-of-objects/\n *            Config objects\n * @product   highcharts\n * @apioption series.packedbubble.data\n */\n/**\n * @type      {Highcharts.SeriesPackedBubbleDataLabelsOptionsObject|Array<Highcharts.SeriesPackedBubbleDataLabelsOptionsObject>}\n * @product   highcharts\n * @apioption series.packedbubble.data.dataLabels\n */\n/**\n * @excluding enabled,enabledThreshold,height,radius,width\n * @product   highcharts\n * @apioption series.packedbubble.marker\n */\n''; // Adds doclets above to transpiled file\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Attractive force.\n *\n * In Verlet integration, force is applied on a node immediately to it's\n * `plotX` and `plotY` position.\n *\n * @private\n * @param {Highcharts.Point} link\n *        Link that connects two nodes\n * @param {number} force\n *        Force calculated in `repulsiveForceFunction`\n * @param {Highcharts.PositionObject} distanceXY\n *        Distance between two nodes e.g. `{x, y}`\n */\nfunction attractive(link, force, distanceXY) {\n    const massFactor = link.getMass(), translatedX = -distanceXY.x * force * this.diffTemperature, translatedY = -distanceXY.y * force * this.diffTemperature;\n    if (!link.fromNode.fixedPosition) {\n        link.fromNode.plotX -=\n            translatedX * massFactor.fromNode / link.fromNode.degree;\n        link.fromNode.plotY -=\n            translatedY * massFactor.fromNode / link.fromNode.degree;\n    }\n    if (!link.toNode.fixedPosition) {\n        link.toNode.plotX +=\n            translatedX * massFactor.toNode / link.toNode.degree;\n        link.toNode.plotY +=\n            translatedY * massFactor.toNode / link.toNode.degree;\n    }\n}\n/**\n * Attractive force function. Can be replaced by API's\n * `layoutAlgorithm.attractiveForce`\n *\n * @private\n * @param {number} d current distance between two nodes\n * @param {number} k expected distance between two nodes\n * @return {number} force\n */\nfunction attractiveForceFunction(d, k) {\n    // Used in API:\n    return (k - d) / d;\n}\n/**\n * Barycenter force. Calculate and applys barycenter forces on the\n * nodes. Making them closer to the center of their barycenter point.\n *\n * In Verlet integration, force is applied on a node immediately to it's\n * `plotX` and `plotY` position.\n *\n * @private\n */\nfunction barycenter() {\n    const gravitationalConstant = this.options.gravitationalConstant || 0, xFactor = (this.barycenter.xFactor -\n        (this.box.left + this.box.width) / 2) * gravitationalConstant, yFactor = (this.barycenter.yFactor -\n        (this.box.top + this.box.height) / 2) * gravitationalConstant;\n    this.nodes.forEach(function (node) {\n        if (!node.fixedPosition) {\n            node.plotX -=\n                xFactor / node.mass / node.degree;\n            node.plotY -=\n                yFactor / node.mass / node.degree;\n        }\n    });\n}\n/**\n * Estiamte the best possible distance between two nodes, making graph\n * readable.\n * @private\n */\nfunction getK(layout) {\n    return Math.pow(layout.box.width * layout.box.height / layout.nodes.length, 0.5);\n}\n/**\n * Integration method.\n *\n * In Verlet integration, forces are applied on node immediately to it's\n * `plotX` and `plotY` position.\n *\n * Verlet without velocity:\n *\n *    x(n+1) = 2 * x(n) - x(n-1) + A(T) * deltaT ^ 2\n *\n * where:\n *     - x(n+1) - new position\n *     - x(n) - current position\n *     - x(n-1) - previous position\n *\n * Assuming A(t) = 0 (no acceleration) and (deltaT = 1) we get:\n *\n *     x(n+1) = x(n) + (x(n) - x(n-1))\n *\n * where:\n *     - (x(n) - x(n-1)) - position change\n *\n * TO DO:\n * Consider Verlet with velocity to support additional\n * forces. Or even Time-Corrected Verlet by Jonathan\n * \"lonesock\" Dummer\n *\n * @private\n * @param {Highcharts.NetworkgraphLayout} layout layout object\n * @param {Highcharts.Point} node node that should be translated\n */\nfunction integrate(layout, node) {\n    const friction = -layout.options.friction, maxSpeed = layout.options.maxSpeed, prevX = node.prevX, prevY = node.prevY, \n    // Apply friction:\n    frictionX = ((node.plotX + node.dispX -\n        prevX) * friction), frictionY = ((node.plotY + node.dispY -\n        prevY) * friction), abs = Math.abs, signX = abs(frictionX) / (frictionX || 1), // Need to deal with 0\n    signY = abs(frictionY) / (frictionY || 1), \n    // Apply max speed:\n    diffX = signX * Math.min(maxSpeed, Math.abs(frictionX)), diffY = signY * Math.min(maxSpeed, Math.abs(frictionY));\n    // Store for the next iteration:\n    node.prevX = node.plotX + node.dispX;\n    node.prevY = node.plotY + node.dispY;\n    // Update positions:\n    node.plotX += diffX;\n    node.plotY += diffY;\n    node.temperature = layout.vectorLength({\n        x: diffX,\n        y: diffY\n    });\n}\n/**\n * Repulsive force.\n *\n * In Verlet integration, force is applied on a node immediately to it's\n * `plotX` and `plotY` position.\n *\n * @private\n * @param {Highcharts.Point} node\n *        Node that should be translated by force.\n * @param {number} force\n *        Force calculated in `repulsiveForceFunction`\n * @param {Highcharts.PositionObject} distanceXY\n *        Distance between two nodes e.g. `{x, y}`\n */\nfunction repulsive(node, force, distanceXY) {\n    const factor = force * this.diffTemperature / node.mass / node.degree;\n    if (!node.fixedPosition) {\n        node.plotX += distanceXY.x * factor;\n        node.plotY += distanceXY.y * factor;\n    }\n}\n/**\n * Repulsive force function. Can be replaced by API's\n * `layoutAlgorithm.repulsiveForce`\n *\n * @private\n * @param {number} d current distance between two nodes\n * @param {number} k expected distance between two nodes\n * @return {number} force\n */\nfunction repulsiveForceFunction(d, k) {\n    // Used in API:\n    return (k - d) / d * (k > d ? 1 : 0); // Force only for close nodes\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst VerletIntegration = {\n    attractive,\n    attractiveForceFunction,\n    barycenter,\n    getK,\n    integrate,\n    repulsive,\n    repulsiveForceFunction\n};\nexport default VerletIntegration;\n","/* *\n *\n *  (c) 2010-2024 Grzegorz Blachlinski, Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport VerletIntegration from '../Networkgraph/VerletIntegration.js';\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction barycenter() {\n    const layout = this, gravitationalConstant = layout.options.gravitationalConstant, box = layout.box, nodes = layout.nodes;\n    let centerX, centerY;\n    for (const node of nodes) {\n        if (layout.options.splitSeries && !node.isParentNode) {\n            centerX = node.series.parentNode.plotX;\n            centerY = node.series.parentNode.plotY;\n        }\n        else {\n            centerX = box.width / 2;\n            centerY = box.height / 2;\n        }\n        if (!node.fixedPosition) {\n            node.plotX -=\n                (node.plotX - centerX) *\n                    gravitationalConstant /\n                    (node.mass * Math.sqrt(nodes.length));\n            node.plotY -=\n                (node.plotY - centerY) *\n                    gravitationalConstant /\n                    (node.mass * Math.sqrt(nodes.length));\n        }\n    }\n}\n/**\n * @private\n */\nfunction repulsive(node, force, distanceXY, repNode) {\n    const factor = (force * this.diffTemperature / node.mass /\n        node.degree), x = distanceXY.x * factor, y = distanceXY.y * factor;\n    if (!node.fixedPosition) {\n        node.plotX += x;\n        node.plotY += y;\n    }\n    if (!repNode.fixedPosition) {\n        repNode.plotX -= x;\n        repNode.plotY -= y;\n    }\n}\n/**\n * @private\n */\nfunction repulsiveForceFunction(d, k, node, repNode) {\n    return Math.min(d, (node.marker.radius +\n        repNode.marker.radius) / 2);\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst PackedBubbleIntegration = {\n    barycenter,\n    getK: noop,\n    integrate: VerletIntegration.integrate,\n    repulsive,\n    repulsiveForceFunction\n};\nexport default PackedBubbleIntegration;\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Attractive force.\n *\n * In Euler integration, force is stored in a node, not changing it's\n * position. Later, in `integrate()` forces are applied on nodes.\n *\n * @private\n * @param {Highcharts.Point} link\n *        Link that connects two nodes\n * @param {number} force\n *        Force calculated in `repulsiveForceFunction`\n * @param {Highcharts.PositionObject} distanceXY\n *        Distance between two nodes e.g. `{x, y}`\n * @param {number} distanceR\n     */\nfunction attractive(link, force, distanceXY, distanceR) {\n    const massFactor = link.getMass(), translatedX = (distanceXY.x / distanceR) * force, translatedY = (distanceXY.y / distanceR) * force;\n    if (!link.fromNode.fixedPosition) {\n        link.fromNode.dispX -=\n            translatedX * massFactor.fromNode / link.fromNode.degree;\n        link.fromNode.dispY -=\n            translatedY * massFactor.fromNode / link.fromNode.degree;\n    }\n    if (!link.toNode.fixedPosition) {\n        link.toNode.dispX +=\n            translatedX * massFactor.toNode / link.toNode.degree;\n        link.toNode.dispY +=\n            translatedY * massFactor.toNode / link.toNode.degree;\n    }\n}\n/**\n * Attractive force function. Can be replaced by API's\n * `layoutAlgorithm.attractiveForce`\n *\n * Other forces that can be used:\n *\n * basic, not recommended:\n *    `function (d, k) { return d / k }`\n *\n * @private\n * @param {number} d current distance between two nodes\n * @param {number} k expected distance between two nodes\n * @return {number} force\n */\nfunction attractiveForceFunction(d, k) {\n    return d * d / k;\n}\n/**\n * Barycenter force. Calculate and applys barycenter forces on the\n * nodes. Making them closer to the center of their barycenter point.\n *\n * In Euler integration, force is stored in a node, not changing it's\n * position. Later, in `integrate()` forces are applied on nodes.\n *\n * @private\n */\nfunction barycenter() {\n    const gravitationalConstant = this.options.gravitationalConstant, xFactor = this.barycenter.xFactor, yFactor = this.barycenter.yFactor;\n    this.nodes.forEach(function (node) {\n        if (!node.fixedPosition) {\n            const degree = node.getDegree(), phi = degree * (1 + degree / 2);\n            node.dispX += ((xFactor - node.plotX) *\n                gravitationalConstant *\n                phi / node.degree);\n            node.dispY += ((yFactor - node.plotY) *\n                gravitationalConstant *\n                phi / node.degree);\n        }\n    });\n}\n/**\n * Estimate the best possible distance between two nodes, making graph\n * readable.\n * @private\n */\nfunction getK(layout) {\n    return Math.pow(layout.box.width * layout.box.height / layout.nodes.length, 0.3);\n}\n/**\n * Integration method.\n *\n * In Euler integration, force were stored in a node, not changing it's\n * position. Now, in the integrator method, we apply changes.\n *\n * Euler:\n *\n * Basic form: `x(n+1) = x(n) + v(n)`\n *\n * With Rengoild-Fruchterman we get:\n * `x(n+1) = x(n) + v(n) / length(v(n)) * min(v(n), temperature(n))`\n * where:\n * - `x(n+1)`: next position\n * - `x(n)`: current position\n * - `v(n)`: velocity (comes from net force)\n * - `temperature(n)`: current temperature\n *\n * Known issues:\n * Oscillations when force vector has the same magnitude but opposite\n * direction in the next step. Potentially solved by decreasing force by\n * `v * (1 / node.degree)`\n *\n * Note:\n * Actually `min(v(n), temperature(n))` replaces simulated annealing.\n *\n * @private\n * @param {Highcharts.NetworkgraphLayout} layout\n *        Layout object\n * @param {Highcharts.Point} node\n *        Node that should be translated\n */\nfunction integrate(layout, node) {\n    node.dispX +=\n        node.dispX * layout.options.friction;\n    node.dispY +=\n        node.dispY * layout.options.friction;\n    const distanceR = node.temperature = layout.vectorLength({\n        x: node.dispX,\n        y: node.dispY\n    });\n    if (distanceR !== 0) {\n        node.plotX += (node.dispX / distanceR *\n            Math.min(Math.abs(node.dispX), layout.temperature));\n        node.plotY += (node.dispY / distanceR *\n            Math.min(Math.abs(node.dispY), layout.temperature));\n    }\n}\n/**\n * Repulsive force.\n *\n * @private\n * @param {Highcharts.Point} node\n *        Node that should be translated by force.\n * @param {number} force\n *        Force calculated in `repulsiveForceFunction`\n * @param {Highcharts.PositionObject} distanceXY\n *        Distance between two nodes e.g. `{x, y}`\n */\nfunction repulsive(node, force, distanceXY, distanceR) {\n    node.dispX +=\n        (distanceXY.x / distanceR) * force / node.degree;\n    node.dispY +=\n        (distanceXY.y / distanceR) * force / node.degree;\n}\n/**\n * Repulsive force function. Can be replaced by API's\n * `layoutAlgorithm.repulsiveForce`.\n *\n * Other forces that can be used:\n *\n * basic, not recommended:\n *    `function (d, k) { return k / d }`\n *\n * standard:\n *    `function (d, k) { return k * k / d }`\n *\n * grid-variant:\n *    `function (d, k) { return k * k / d * (2 * k - d > 0 ? 1 : 0) }`\n *\n * @private\n * @param {number} d current distance between two nodes\n * @param {number} k expected distance between two nodes\n * @return {number} force\n */\nfunction repulsiveForceFunction(d, k) {\n    return k * k / d;\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst EulerIntegration = {\n    attractive,\n    attractiveForceFunction,\n    barycenter,\n    getK,\n    integrate,\n    repulsive,\n    repulsiveForceFunction\n};\nexport default EulerIntegration;\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Class\n *\n * */\n/**\n * The QuadTree node class. Used in Networkgraph chart as a base for Barnes-Hut\n * approximation.\n *\n * @private\n * @class\n * @name Highcharts.QuadTreeNode\n *\n * @param {Highcharts.Dictionary<number>} box\n *        Available space for the node\n */\nclass QuadTreeNode {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(box) {\n        /* *\n         *\n         *  Properties\n         *\n         * */\n        /**\n         * Read only. If QuadTreeNode is an external node, Point is stored in\n         * `this.body`.\n         *\n         * @name Highcharts.QuadTreeNode#body\n         * @type {boolean|Highcharts.Point}\n         */\n        this.body = false;\n        /**\n         * Read only. Internal nodes when created are empty to reserve the\n         * space. If Point is added to this QuadTreeNode, QuadTreeNode is no\n         * longer empty.\n         *\n         * @name Highcharts.QuadTreeNode#isEmpty\n         * @type {boolean}\n         */\n        this.isEmpty = false;\n        /**\n         * Read only. Flag to determine if QuadTreeNode is internal (and has\n         * subnodes with mass and central position) or external (bound to\n         * Point).\n         *\n         * @name Highcharts.QuadTreeNode#isInternal\n         * @type {boolean}\n         */\n        this.isInternal = false;\n        /**\n         * Read only. Array of subnodes. Empty if QuadTreeNode has just one\n         * Point. When added another Point to this QuadTreeNode, array is\n         * filled with four subnodes.\n         *\n         * @name Highcharts.QuadTreeNode#nodes\n         * @type {Array<Highcharts.QuadTreeNode>}\n         */\n        this.nodes = [];\n        /**\n         * Read only. The available space for node.\n         *\n         * @name Highcharts.QuadTreeNode#box\n         * @type {Highcharts.Dictionary<number>}\n         */\n        this.box = box;\n        /**\n         * Read only. The minium of width and height values.\n         *\n         * @name Highcharts.QuadTreeNode#boxSize\n         * @type {number}\n         */\n        this.boxSize = Math.min(box.width, box.height);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * When inserting another node into the box, that already hove one node,\n     * divide the available space into another four quadrants.\n     *\n     * Indexes of quadrants are:\n     * ```\n     * -------------               -------------\n     * |           |               |     |     |\n     * |           |               |  0  |  1  |\n     * |           |   divide()    |     |     |\n     * |     1     | ----------->  -------------\n     * |           |               |     |     |\n     * |           |               |  3  |  2  |\n     * |           |               |     |     |\n     * -------------               -------------\n     * ```\n     */\n    divideBox() {\n        const halfWidth = this.box.width / 2, halfHeight = this.box.height / 2;\n        // Top left\n        this.nodes[0] = new QuadTreeNode({\n            left: this.box.left,\n            top: this.box.top,\n            width: halfWidth,\n            height: halfHeight\n        });\n        // Top right\n        this.nodes[1] = new QuadTreeNode({\n            left: this.box.left + halfWidth,\n            top: this.box.top,\n            width: halfWidth,\n            height: halfHeight\n        });\n        // Bottom right\n        this.nodes[2] = new QuadTreeNode({\n            left: this.box.left + halfWidth,\n            top: this.box.top + halfHeight,\n            width: halfWidth,\n            height: halfHeight\n        });\n        // Bottom left\n        this.nodes[3] = new QuadTreeNode({\n            left: this.box.left,\n            top: this.box.top + halfHeight,\n            width: halfWidth,\n            height: halfHeight\n        });\n    }\n    /**\n     * Determine which of the quadrants should be used when placing node in\n     * the QuadTree. Returned index is always in range `< 0 , 3 >`.\n     * @private\n     */\n    getBoxPosition(point) {\n        const left = point.plotX < this.box.left + this.box.width / 2, top = point.plotY < this.box.top + this.box.height / 2;\n        let index;\n        if (left) {\n            if (top) {\n                // Top left\n                index = 0;\n            }\n            else {\n                // Bottom left\n                index = 3;\n            }\n        }\n        else {\n            if (top) {\n                // Top right\n                index = 1;\n            }\n            else {\n                // Bottom right\n                index = 2;\n            }\n        }\n        return index;\n    }\n    /**\n     * Insert recursively point(node) into the QuadTree. If the given\n     * quadrant is already occupied, divide it into smaller quadrants.\n     *\n     * @param {Highcharts.Point} point\n     *        Point/node to be inserted\n     * @param {number} depth\n     *        Max depth of the QuadTree\n     */\n    insert(point, depth) {\n        let newQuadTreeNode;\n        if (this.isInternal) {\n            // Internal node:\n            this.nodes[this.getBoxPosition(point)].insert(point, depth - 1);\n        }\n        else {\n            this.isEmpty = false;\n            if (!this.body) {\n                // First body in a quadrant:\n                this.isInternal = false;\n                this.body = point;\n            }\n            else {\n                if (depth) {\n                    // Every other body in a quadrant:\n                    this.isInternal = true;\n                    this.divideBox();\n                    // Reinsert main body only once:\n                    if (this.body !== true) {\n                        this.nodes[this.getBoxPosition(this.body)]\n                            .insert(this.body, depth - 1);\n                        this.body = true;\n                    }\n                    // Add second body:\n                    this.nodes[this.getBoxPosition(point)]\n                        .insert(point, depth - 1);\n                }\n                else {\n                    // We are below max allowed depth. That means either:\n                    // - really huge number of points\n                    // - falling two points into exactly the same position\n                    // In this case, create another node in the QuadTree.\n                    //\n                    // Alternatively we could add some noise to the\n                    // position, but that could result in different\n                    // rendered chart in exporting.\n                    newQuadTreeNode = new QuadTreeNode({\n                        top: point.plotX || NaN,\n                        left: point.plotY || NaN,\n                        // Width/height below 1px\n                        width: 0.1,\n                        height: 0.1\n                    });\n                    newQuadTreeNode.body = point;\n                    newQuadTreeNode.isInternal = false;\n                    this.nodes.push(newQuadTreeNode);\n                }\n            }\n        }\n    }\n    /**\n     * Each quad node requires it's mass and center position. That mass and\n     * position is used to imitate real node in the layout by approximation.\n     */\n    updateMassAndCenter() {\n        let mass = 0, plotX = 0, plotY = 0;\n        if (this.isInternal) {\n            // Calculate weightened mass of the quad node:\n            for (const pointMass of this.nodes) {\n                if (!pointMass.isEmpty) {\n                    mass += pointMass.mass;\n                    plotX += pointMass.plotX * pointMass.mass;\n                    plotY += pointMass.plotY * pointMass.mass;\n                }\n            }\n            plotX /= mass;\n            plotY /= mass;\n        }\n        else if (this.body) {\n            // Just one node, use coordinates directly:\n            mass = this.body.mass;\n            plotX = this.body.plotX;\n            plotY = this.body.plotY;\n        }\n        // Store details:\n        this.mass = mass;\n        this.plotX = plotX;\n        this.plotY = plotY;\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default QuadTreeNode;\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport QuadTreeNode from './QuadTreeNode.js';\n/* *\n *\n *  Class\n *\n * */\n/**\n * The QuadTree class. Used in Networkgraph chart as a base for Barnes-Hut\n * approximation.\n *\n * @private\n * @class\n * @name Highcharts.QuadTree\n *\n * @param {number} x\n *        Left position of the plotting area\n * @param {number} y\n *        Top position of the plotting area\n * @param {number} width\n *        Width of the plotting area\n * @param {number} height\n *        Height of the plotting area\n */\nclass QuadTree {\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(x, y, width, height) {\n        // Boundary rectangle:\n        this.box = {\n            left: x,\n            top: y,\n            width: width,\n            height: height\n        };\n        this.maxDepth = 25;\n        this.root = new QuadTreeNode(this.box);\n        this.root.isInternal = true;\n        this.root.isRoot = true;\n        this.root.divideBox();\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Calculate mass of the each QuadNode in the tree.\n     */\n    calculateMassAndCenter() {\n        this.visitNodeRecursive(null, null, function (node) {\n            node.updateMassAndCenter();\n        });\n    }\n    /**\n     * Insert nodes into the QuadTree\n     *\n     * @param {Array<Highcharts.Point>} points\n     *        Points as nodes\n     */\n    insertNodes(points) {\n        for (const point of points) {\n            this.root.insert(point, this.maxDepth);\n        }\n    }\n    /**\n     * Depth first treversal (DFS). Using `before` and `after` callbacks,\n     * we can get two results: preorder and postorder traversals, reminder:\n     *\n     * ```\n     *     (a)\n     *     / \\\n     *   (b) (c)\n     *   / \\\n     * (d) (e)\n     * ```\n     *\n     * DFS (preorder): `a -> b -> d -> e -> c`\n     *\n     * DFS (postorder): `d -> e -> b -> c -> a`\n     *\n     * @param {Highcharts.QuadTreeNode|null} node\n     *        QuadTree node\n     * @param {Function} [beforeCallback]\n     *        Function to be called before visiting children nodes.\n     * @param {Function} [afterCallback]\n     *        Function to be called after visiting children nodes.\n     */\n    visitNodeRecursive(node, beforeCallback, afterCallback) {\n        let goFurther;\n        if (!node) {\n            node = this.root;\n        }\n        if (node === this.root && beforeCallback) {\n            goFurther = beforeCallback(node);\n        }\n        if (goFurther === false) {\n            return;\n        }\n        for (const qtNode of node.nodes) {\n            if (qtNode.isInternal) {\n                if (beforeCallback) {\n                    goFurther = beforeCallback(qtNode);\n                }\n                if (goFurther === false) {\n                    continue;\n                }\n                this.visitNodeRecursive(qtNode, beforeCallback, afterCallback);\n            }\n            else if (qtNode.body) {\n                if (beforeCallback) {\n                    beforeCallback(qtNode.body);\n                }\n            }\n            if (afterCallback) {\n                afterCallback(qtNode);\n            }\n        }\n        if (node === this.root && afterCallback) {\n            afterCallback(node);\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default QuadTree;\n","/* *\n *\n *  Networkgraph series\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport EulerIntegration from './EulerIntegration.js';\nimport H from '../../Core/Globals.js';\nconst { win } = H;\nimport GraphLayout from '../GraphLayoutComposition.js';\nimport QuadTree from './QuadTree.js';\nimport U from '../../Core/Utilities.js';\nconst { clamp, defined, isFunction, fireEvent, pick } = U;\nimport VerletIntegration from './VerletIntegration.js';\n/* *\n *\n *  Class\n *\n * */\n/**\n * Reingold-Fruchterman algorithm from\n * \"Graph Drawing by Force-directed Placement\" paper.\n * @private\n */\nclass ReingoldFruchtermanLayout {\n    constructor() {\n        /* *\n         *\n         *  Static Functions\n         *\n         * */\n        this.box = {};\n        this.currentStep = 0;\n        this.initialRendering = true;\n        this.links = [];\n        this.nodes = [];\n        this.series = [];\n        this.simulation = false;\n    }\n    static compose(ChartClass) {\n        GraphLayout.compose(ChartClass);\n        GraphLayout.integrations.euler = EulerIntegration;\n        GraphLayout.integrations.verlet = VerletIntegration;\n        GraphLayout.layouts['reingold-fruchterman'] =\n            ReingoldFruchtermanLayout;\n    }\n    init(options) {\n        this.options = options;\n        this.nodes = [];\n        this.links = [];\n        this.series = [];\n        this.box = {\n            x: 0,\n            y: 0,\n            width: 0,\n            height: 0\n        };\n        this.setInitialRendering(true);\n        this.integration =\n            GraphLayout.integrations[options.integration];\n        this.enableSimulation = options.enableSimulation;\n        this.attractiveForce = pick(options.attractiveForce, this.integration.attractiveForceFunction);\n        this.repulsiveForce = pick(options.repulsiveForce, this.integration.repulsiveForceFunction);\n        this.approximation = options.approximation;\n    }\n    updateSimulation(enable) {\n        this.enableSimulation = pick(enable, this.options.enableSimulation);\n    }\n    start() {\n        const layout = this, series = this.series, options = this.options;\n        layout.currentStep = 0;\n        layout.forces = series[0] && series[0].forces || [];\n        layout.chart = series[0] && series[0].chart;\n        if (layout.initialRendering) {\n            layout.initPositions();\n            // Render elements in initial positions:\n            series.forEach(function (s) {\n                s.finishedAnimating = true; // #13169\n                s.render();\n            });\n        }\n        layout.setK();\n        layout.resetSimulation(options);\n        if (layout.enableSimulation) {\n            layout.step();\n        }\n    }\n    step() {\n        const anyLayout = this, allSeries = this.series;\n        // Algorithm:\n        this.currentStep++;\n        if (this.approximation === 'barnes-hut') {\n            this.createQuadTree();\n            this.quadTree.calculateMassAndCenter();\n        }\n        for (const forceName of this.forces || []) {\n            anyLayout[forceName + 'Forces'](this.temperature);\n        }\n        // Limit to the plotting area and cool down:\n        this.applyLimits();\n        // Cool down the system:\n        this.temperature = this.coolDown(this.startTemperature, this.diffTemperature, this.currentStep);\n        this.prevSystemTemperature = this.systemTemperature;\n        this.systemTemperature = this.getSystemTemperature();\n        if (this.enableSimulation) {\n            for (const series of allSeries) {\n                // Chart could be destroyed during the simulation\n                if (series.chart) {\n                    series.render();\n                }\n            }\n            if (this.maxIterations-- &&\n                isFinite(this.temperature) &&\n                !this.isStable()) {\n                if (this.simulation) {\n                    win.cancelAnimationFrame(this.simulation);\n                }\n                this.simulation = win.requestAnimationFrame(() => this.step());\n            }\n            else {\n                this.simulation = false;\n                this.series.forEach((s) => {\n                    fireEvent(s, 'afterSimulation');\n                });\n            }\n        }\n    }\n    stop() {\n        if (this.simulation) {\n            win.cancelAnimationFrame(this.simulation);\n        }\n    }\n    setArea(x, y, w, h) {\n        this.box = {\n            left: x,\n            top: y,\n            width: w,\n            height: h\n        };\n    }\n    setK() {\n        // Optimal distance between nodes,\n        // available space around the node:\n        this.k = this.options.linkLength || this.integration.getK(this);\n    }\n    addElementsToCollection(elements, collection) {\n        for (const element of elements) {\n            if (collection.indexOf(element) === -1) {\n                collection.push(element);\n            }\n        }\n    }\n    removeElementFromCollection(element, collection) {\n        const index = collection.indexOf(element);\n        if (index !== -1) {\n            collection.splice(index, 1);\n        }\n    }\n    clear() {\n        this.nodes.length = 0;\n        this.links.length = 0;\n        this.series.length = 0;\n        this.resetSimulation();\n    }\n    resetSimulation() {\n        this.forcedStop = false;\n        this.systemTemperature = 0;\n        this.setMaxIterations();\n        this.setTemperature();\n        this.setDiffTemperature();\n    }\n    restartSimulation() {\n        if (!this.simulation) {\n            // When dragging nodes, we don't need to calculate\n            // initial positions and rendering nodes:\n            this.setInitialRendering(false);\n            // Start new simulation:\n            if (!this.enableSimulation) {\n                // Run only one iteration to speed things up:\n                this.setMaxIterations(1);\n            }\n            else {\n                this.start();\n            }\n            if (this.chart) {\n                this.chart.redraw();\n            }\n            // Restore defaults:\n            this.setInitialRendering(true);\n        }\n        else {\n            // Extend current simulation:\n            this.resetSimulation();\n        }\n    }\n    setMaxIterations(maxIterations) {\n        this.maxIterations = pick(maxIterations, this.options.maxIterations);\n    }\n    setTemperature() {\n        this.temperature = this.startTemperature =\n            Math.sqrt(this.nodes.length);\n    }\n    setDiffTemperature() {\n        this.diffTemperature = this.startTemperature /\n            (this.options.maxIterations + 1);\n    }\n    setInitialRendering(enable) {\n        this.initialRendering = enable;\n    }\n    createQuadTree() {\n        this.quadTree = new QuadTree(this.box.left, this.box.top, this.box.width, this.box.height);\n        this.quadTree.insertNodes(this.nodes);\n    }\n    initPositions() {\n        const initialPositions = this.options.initialPositions;\n        if (isFunction(initialPositions)) {\n            initialPositions.call(this);\n            for (const node of this.nodes) {\n                if (!defined(node.prevX)) {\n                    node.prevX = node.plotX;\n                }\n                if (!defined(node.prevY)) {\n                    node.prevY = node.plotY;\n                }\n                node.dispX = 0;\n                node.dispY = 0;\n            }\n        }\n        else if (initialPositions === 'circle') {\n            this.setCircularPositions();\n        }\n        else {\n            this.setRandomPositions();\n        }\n    }\n    setCircularPositions() {\n        const box = this.box, nodes = this.nodes, nodesLength = nodes.length + 1, angle = 2 * Math.PI / nodesLength, rootNodes = nodes.filter(function (node) {\n            return node.linksTo.length === 0;\n        }), visitedNodes = {}, radius = this.options.initialPositionRadius, addToNodes = (node) => {\n            for (const link of node.linksFrom || []) {\n                if (!visitedNodes[link.toNode.id]) {\n                    visitedNodes[link.toNode.id] = true;\n                    sortedNodes.push(link.toNode);\n                    addToNodes(link.toNode);\n                }\n            }\n        };\n        let sortedNodes = [];\n        // Start with identified root nodes an sort the nodes by their\n        // hierarchy. In trees, this ensures that branches don't cross\n        // eachother.\n        for (const rootNode of rootNodes) {\n            sortedNodes.push(rootNode);\n            addToNodes(rootNode);\n        }\n        // Cyclic tree, no root node found\n        if (!sortedNodes.length) {\n            sortedNodes = nodes;\n            // Dangling, cyclic trees\n        }\n        else {\n            for (const node of nodes) {\n                if (sortedNodes.indexOf(node) === -1) {\n                    sortedNodes.push(node);\n                }\n            }\n        }\n        let node;\n        // Initial positions are laid out along a small circle, appearing\n        // as a cluster in the middle\n        for (let i = 0, iEnd = sortedNodes.length; i < iEnd; ++i) {\n            node = sortedNodes[i];\n            node.plotX = node.prevX = pick(node.plotX, box.width / 2 + radius * Math.cos(i * angle));\n            node.plotY = node.prevY = pick(node.plotY, box.height / 2 + radius * Math.sin(i * angle));\n            node.dispX = 0;\n            node.dispY = 0;\n        }\n    }\n    setRandomPositions() {\n        const box = this.box, nodes = this.nodes, nodesLength = nodes.length + 1, \n        /**\n         * Return a repeatable, quasi-random number based on an integer\n         * input. For the initial positions\n         * @private\n         */\n        unrandom = (n) => {\n            let rand = n * n / Math.PI;\n            rand = rand - Math.floor(rand);\n            return rand;\n        };\n        let node;\n        // Initial positions:\n        for (let i = 0, iEnd = nodes.length; i < iEnd; ++i) {\n            node = nodes[i];\n            node.plotX = node.prevX = pick(node.plotX, box.width * unrandom(i));\n            node.plotY = node.prevY = pick(node.plotY, box.height * unrandom(nodesLength + i));\n            node.dispX = 0;\n            node.dispY = 0;\n        }\n    }\n    force(name, ...args) {\n        this.integration[name].apply(this, args);\n    }\n    barycenterForces() {\n        this.getBarycenter();\n        this.force('barycenter');\n    }\n    getBarycenter() {\n        let systemMass = 0, cx = 0, cy = 0;\n        for (const node of this.nodes) {\n            cx += node.plotX * node.mass;\n            cy += node.plotY * node.mass;\n            systemMass += node.mass;\n        }\n        this.barycenter = {\n            x: cx,\n            y: cy,\n            xFactor: cx / systemMass,\n            yFactor: cy / systemMass\n        };\n        return this.barycenter;\n    }\n    barnesHutApproximation(node, quadNode) {\n        const distanceXY = this.getDistXY(node, quadNode), distanceR = this.vectorLength(distanceXY);\n        let goDeeper, force;\n        if (node !== quadNode && distanceR !== 0) {\n            if (quadNode.isInternal) {\n                // Internal node:\n                if (quadNode.boxSize / distanceR <\n                    this.options.theta &&\n                    distanceR !== 0) {\n                    // Treat as an external node:\n                    force = this.repulsiveForce(distanceR, this.k);\n                    this.force('repulsive', node, force * quadNode.mass, distanceXY, distanceR);\n                    goDeeper = false;\n                }\n                else {\n                    // Go deeper:\n                    goDeeper = true;\n                }\n            }\n            else {\n                // External node, direct force:\n                force = this.repulsiveForce(distanceR, this.k);\n                this.force('repulsive', node, force * quadNode.mass, distanceXY, distanceR);\n            }\n        }\n        return goDeeper;\n    }\n    repulsiveForces() {\n        if (this.approximation === 'barnes-hut') {\n            for (const node of this.nodes) {\n                this.quadTree.visitNodeRecursive(null, (quadNode) => (this.barnesHutApproximation(node, quadNode)));\n            }\n        }\n        else {\n            let force, distanceR, distanceXY;\n            for (const node of this.nodes) {\n                for (const repNode of this.nodes) {\n                    if (\n                    // Node cannot repulse itself:\n                    node !== repNode &&\n                        // Only close nodes affect each other:\n                        // layout.getDistR(node, repNode) < 2 * k &&\n                        // Not dragged:\n                        !node.fixedPosition) {\n                        distanceXY = this.getDistXY(node, repNode);\n                        distanceR = this.vectorLength(distanceXY);\n                        if (distanceR !== 0) {\n                            force = this.repulsiveForce(distanceR, this.k);\n                            this.force('repulsive', node, force * repNode.mass, distanceXY, distanceR);\n                        }\n                    }\n                }\n            }\n        }\n    }\n    attractiveForces() {\n        let distanceXY, distanceR, force;\n        for (const link of this.links) {\n            if (link.fromNode && link.toNode) {\n                distanceXY = this.getDistXY(link.fromNode, link.toNode);\n                distanceR = this.vectorLength(distanceXY);\n                if (distanceR !== 0) {\n                    force = this.attractiveForce(distanceR, this.k);\n                    this.force('attractive', link, force, distanceXY, distanceR);\n                }\n            }\n        }\n    }\n    applyLimits() {\n        const nodes = this.nodes;\n        for (const node of nodes) {\n            if (node.fixedPosition) {\n                continue;\n            }\n            this.integration.integrate(this, node);\n            this.applyLimitBox(node, this.box);\n            // Reset displacement:\n            node.dispX = 0;\n            node.dispY = 0;\n        }\n    }\n    /**\n     * External box that nodes should fall. When hitting an edge, node\n     * should stop or bounce.\n     * @private\n     */\n    applyLimitBox(node, box) {\n        const radius = node.radius;\n        /*\n        TO DO: Consider elastic collision instead of stopping.\n        o' means end position when hitting plotting area edge:\n\n        - \"inelastic\":\n        o\n            \\\n        ______\n        |  o'\n        |   \\\n        |    \\\n\n        - \"elastic\"/\"bounced\":\n        o\n            \\\n        ______\n        |  ^\n        | / \\\n        |o'  \\\n\n        Euler sample:\n        if (plotX < 0) {\n            plotX = 0;\n            dispX *= -1;\n        }\n\n        if (plotX > box.width) {\n            plotX = box.width;\n            dispX *= -1;\n        }\n\n        */\n        // Limit X-coordinates:\n        node.plotX = clamp(node.plotX, box.left + radius, box.width - radius);\n        // Limit Y-coordinates:\n        node.plotY = clamp(node.plotY, box.top + radius, box.height - radius);\n    }\n    /**\n     * From \"A comparison of simulated annealing cooling strategies\" by\n     * Nourani and Andresen work.\n     * @private\n     */\n    coolDown(temperature, temperatureStep, currentStep) {\n        // Logarithmic:\n        /*\n        return Math.sqrt(this.nodes.length) -\n            Math.log(\n                currentStep * layout.diffTemperature\n            );\n        */\n        // Exponential:\n        /*\n        let alpha = 0.1;\n        layout.temperature = Math.sqrt(layout.nodes.length) *\n            Math.pow(alpha, layout.diffTemperature);\n        */\n        // Linear:\n        return temperature - temperatureStep * currentStep;\n    }\n    isStable() {\n        return Math.abs(this.systemTemperature -\n            this.prevSystemTemperature) < 0.00001 || this.temperature <= 0;\n    }\n    getSystemTemperature() {\n        let value = 0;\n        for (const node of this.nodes) {\n            value += node.temperature;\n        }\n        return value;\n    }\n    vectorLength(vector) {\n        return Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n    }\n    getDistR(nodeA, nodeB) {\n        const distance = this.getDistXY(nodeA, nodeB);\n        return this.vectorLength(distance);\n    }\n    getDistXY(nodeA, nodeB) {\n        const xDist = nodeA.plotX - nodeB.plotX, yDist = nodeA.plotY - nodeB.plotY;\n        return {\n            x: xDist,\n            y: yDist,\n            absX: Math.abs(xDist),\n            absY: Math.abs(yDist)\n        };\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default ReingoldFruchtermanLayout;\n","/* *\n *\n *  (c) 2010-2024 Grzegorz Blachlinski, Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport GraphLayout from '../GraphLayoutComposition.js';\nimport PackedBubbleIntegration from './PackedBubbleIntegration.js';\nimport ReingoldFruchtermanLayout from '../Networkgraph/ReingoldFruchtermanLayout.js';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction chartGetSelectedParentNodes() {\n    const allSeries = this.series, selectedParentsNodes = [];\n    allSeries.forEach((series) => {\n        if (series.parentNode && series.parentNode.selected) {\n            selectedParentsNodes.push(series.parentNode);\n        }\n    });\n    return selectedParentsNodes;\n}\n/**\n * Remove accumulated data points to redistribute all of them again\n * (i.e after hiding series by legend)\n * @private\n */\nfunction onChartBeforeRedraw() {\n    if (this.allDataPoints) {\n        delete this.allDataPoints;\n    }\n}\n/* *\n *\n *  Class\n *\n * */\nclass PackedBubbleLayout extends ReingoldFruchtermanLayout {\n    constructor() {\n        /* *\n         *\n         *  Static Functions\n         *\n         * */\n        super(...arguments);\n        this.index = NaN;\n        this.nodes = [];\n        this.series = [];\n    }\n    static compose(ChartClass) {\n        ReingoldFruchtermanLayout.compose(ChartClass);\n        GraphLayout.integrations.packedbubble = PackedBubbleIntegration;\n        GraphLayout.layouts.packedbubble = PackedBubbleLayout;\n        const chartProto = ChartClass.prototype;\n        if (!chartProto.getSelectedParentNodes) {\n            addEvent(ChartClass, 'beforeRedraw', onChartBeforeRedraw);\n            chartProto.getSelectedParentNodes = chartGetSelectedParentNodes;\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    beforeStep() {\n        if (this.options.marker) {\n            this.series.forEach((series) => {\n                if (series) {\n                    series.calculateParentRadius();\n                }\n            });\n        }\n    }\n    // #14439, new stable check.\n    isStable() {\n        const tempDiff = Math.abs(this.prevSystemTemperature -\n            this.systemTemperature);\n        const upScaledTemperature = 10 * this.systemTemperature /\n            Math.sqrt(this.nodes.length);\n        return Math.abs(upScaledTemperature) < 1 &&\n            tempDiff < 0.00001 ||\n            this.temperature <= 0;\n    }\n    setCircularPositions() {\n        const layout = this, box = layout.box, nodes = layout.nodes, nodesLength = nodes.length + 1, angle = 2 * Math.PI / nodesLength, radius = layout.options.initialPositionRadius;\n        let centerX, centerY, index = 0;\n        for (const node of nodes) {\n            if (layout.options.splitSeries &&\n                !node.isParentNode) {\n                centerX = node.series.parentNode.plotX;\n                centerY = node.series.parentNode.plotY;\n            }\n            else {\n                centerX = box.width / 2;\n                centerY = box.height / 2;\n            }\n            node.plotX = node.prevX = pick(node.plotX, centerX +\n                radius * Math.cos(node.index || index * angle));\n            node.plotY = node.prevY = pick(node.plotY, centerY +\n                radius * Math.sin(node.index || index * angle));\n            node.dispX = 0;\n            node.dispY = 0;\n            index++;\n        }\n    }\n    repulsiveForces() {\n        const layout = this, bubblePadding = layout.options.bubblePadding, nodes = layout.nodes;\n        let force, distanceR, distanceXY;\n        nodes.forEach((node) => {\n            node.degree = node.mass;\n            node.neighbours = 0;\n            nodes.forEach((repNode) => {\n                force = 0;\n                if (\n                // Node cannot repulse itself:\n                node !== repNode &&\n                    // Only close nodes affect each other:\n                    // Not dragged:\n                    !node.fixedPosition &&\n                    (layout.options.seriesInteraction ||\n                        node.series === repNode.series)) {\n                    distanceXY = layout.getDistXY(node, repNode);\n                    distanceR = (layout.vectorLength(distanceXY) -\n                        (node.marker.radius +\n                            repNode.marker.radius +\n                            bubblePadding));\n                    // TODO padding configurable\n                    if (distanceR < 0) {\n                        node.degree += 0.01;\n                        node.neighbours++;\n                        force = layout.repulsiveForce(-distanceR / Math.sqrt(node.neighbours), layout.k, node, repNode);\n                    }\n                    layout.force('repulsive', node, force * repNode.mass, distanceXY, repNode, distanceR);\n                }\n            });\n        });\n    }\n    applyLimitBox(node, box) {\n        const layout = this, factor = 0.01;\n        let distanceXY, distanceR;\n        // `parentNodeLimit` should be used together with seriesInteraction:\n        // false\n        if (layout.options.splitSeries &&\n            !node.isParentNode &&\n            layout.options.parentNodeLimit) {\n            distanceXY = layout.getDistXY(node, node.series.parentNode);\n            distanceR = (node.series.parentNodeRadius -\n                node.marker.radius -\n                layout.vectorLength(distanceXY));\n            if (distanceR < 0 &&\n                distanceR > -2 * node.marker.radius) {\n                node.plotX -= distanceXY.x * factor;\n                node.plotY -= distanceXY.y * factor;\n            }\n        }\n        super.applyLimitBox(node, box);\n    }\n}\n/* *\n *\n *  Registry\n *\n * */\nGraphLayout.layouts.packedbubble = PackedBubbleLayout;\n/* *\n *\n *  Default Export\n *\n * */\nexport default PackedBubbleLayout;\n","/* *\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../Core/Utilities.js';\nconst { merge, syncTimeout } = U;\nimport A from '../Core/Animation/AnimationUtilities.js';\nconst { animObject } = A;\n/**\n * Create a setTimeout for the first drawDataLabels()\n * based on the dataLabels.animation.defer value\n * for series which have enabled simulation.\n * @private\n */\nfunction initDataLabelsDefer() {\n    const dlOptions = this.options.dataLabels;\n    // Method drawDataLabels() fires for the first time after\n    // dataLabels.animation.defer time unless\n    // the dataLabels.animation = false or dataLabels.defer = false\n    // or if the simulation is disabled\n    if (!dlOptions?.defer ||\n        !this.options.layoutAlgorithm?.enableSimulation) {\n        this.deferDataLabels = false;\n    }\n    else {\n        syncTimeout(() => {\n            this.deferDataLabels = false;\n        }, dlOptions ? animObject(dlOptions.animation).defer : 0);\n    }\n}\n/**\n * Initialize the SVG group for the DataLabels with correct opacities\n * and correct styles so that the animation for the series that have\n * simulation enabled works fine.\n * @private\n */\nfunction initDataLabels() {\n    const series = this, dlOptions = series.options.dataLabels;\n    if (!series.dataLabelsGroup) {\n        const dataLabelsGroup = this.initDataLabelsGroup();\n        // Apply the dataLabels.style not only to the\n        // individual dataLabels but also to the entire group\n        if (!series.chart.styledMode && dlOptions?.style) {\n            dataLabelsGroup.css(dlOptions.style);\n        }\n        // Initialize the opacity of the group to 0 (start of animation)\n        dataLabelsGroup.attr({ opacity: 0 });\n        if (series.visible) { // #2597, #3023, #3024\n            dataLabelsGroup.show();\n        }\n        return dataLabelsGroup;\n    }\n    // Place it on first and subsequent (redraw) calls\n    series.dataLabelsGroup.attr(merge({ opacity: 1 }, this.getPlotBox('data-labels')));\n    return series.dataLabelsGroup;\n}\nconst DataLabelsDeferUtils = {\n    initDataLabels,\n    initDataLabelsDefer\n};\nexport default DataLabelsDeferUtils;\n","/* *\n *\n *  Highcharts module with textPath functionality.\n *\n *  (c) 2009-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Core/Globals.js';\nimport U from '../Core/Utilities.js';\nconst { deg2rad } = H;\nconst { addEvent, merge, uniqueKey, defined, extend } = U;\n/**\n * Set a text path for a `text` or `label` element, allowing the text to\n * flow along a path.\n *\n * In order to unset the path for an existing element, call `setTextPath`\n * with `{ enabled: false }` as the second argument.\n *\n * Text path support is not bundled into `highcharts.js`, and requires the\n * `modules/textpath.js` file. However, it is included in the script files of\n * those series types that use it by default\n *\n * @sample highcharts/members/renderer-textpath/ Text path demonstrated\n *\n * @function Highcharts.SVGElement#setTextPath\n *\n * @param {Highcharts.SVGElement|undefined} path\n *        Path to follow. If undefined, it allows changing options for the\n *        existing path.\n *\n * @param {Highcharts.DataLabelsTextPathOptionsObject} textPathOptions\n *        Options.\n *\n * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\nfunction setTextPath(path, textPathOptions) {\n    // Defaults\n    textPathOptions = merge(true, {\n        enabled: true,\n        attributes: {\n            dy: -5,\n            startOffset: '50%',\n            textAnchor: 'middle'\n        }\n    }, textPathOptions);\n    const url = this.renderer.url, textWrapper = this.text || this, textPath = textWrapper.textPath, { attributes, enabled } = textPathOptions;\n    path = path || (textPath && textPath.path);\n    // Remove previously added event\n    if (textPath) {\n        textPath.undo();\n    }\n    if (path && enabled) {\n        const undo = addEvent(textWrapper, 'afterModifyTree', (e) => {\n            if (path && enabled) {\n                // Set ID for the path\n                let textPathId = path.attr('id');\n                if (!textPathId) {\n                    path.attr('id', textPathId = uniqueKey());\n                }\n                // Set attributes for the <text>\n                const textAttribs = {\n                    // `dx`/`dy` options must by set on <text> (parent), the\n                    // rest should be set on <textPath>\n                    x: 0,\n                    y: 0\n                };\n                if (defined(attributes.dx)) {\n                    textAttribs.dx = attributes.dx;\n                    delete attributes.dx;\n                }\n                if (defined(attributes.dy)) {\n                    textAttribs.dy = attributes.dy;\n                    delete attributes.dy;\n                }\n                textWrapper.attr(textAttribs);\n                // Handle label properties\n                this.attr({ transform: '' });\n                if (this.box) {\n                    this.box = this.box.destroy();\n                }\n                // Wrap the nodes in a textPath\n                const children = e.nodes.slice(0);\n                e.nodes.length = 0;\n                e.nodes[0] = {\n                    tagName: 'textPath',\n                    attributes: extend(attributes, {\n                        'text-anchor': attributes.textAnchor,\n                        href: `${url}#${textPathId}`\n                    }),\n                    children\n                };\n            }\n        });\n        // Set the reference\n        textWrapper.textPath = { path, undo };\n    }\n    else {\n        textWrapper.attr({ dx: 0, dy: 0 });\n        delete textWrapper.textPath;\n    }\n    if (this.added) {\n        // Rebuild text after added\n        textWrapper.textCache = '';\n        this.renderer.buildText(textWrapper);\n    }\n    return this;\n}\n/**\n * Attach a polygon to a bounding box if the element contains a textPath.\n *\n * @function Highcharts.SVGElement#setPolygon\n *\n * @param {any} event\n *        An event containing a bounding box object\n *\n * @return {Highcharts.BBoxObject} Returns the bounding box object.\n */\nfunction setPolygon(event) {\n    const bBox = event.bBox, tp = this.element?.querySelector('textPath');\n    if (tp) {\n        const polygon = [], { b, h } = this.renderer.fontMetrics(this.element), descender = h - b, lineCleanerRegex = new RegExp('(<tspan>|' +\n            '<tspan(?!\\\\sclass=\"highcharts-br\")[^>]*>|' +\n            '<\\\\/tspan>)', 'g'), lines = tp\n            .innerHTML\n            .replace(lineCleanerRegex, '')\n            .split(/<tspan class=\"highcharts-br\"[^>]*>/), numOfLines = lines.length;\n        // Calculate top and bottom coordinates for\n        // either the start or the end of a single\n        // character, and append it to the polygon.\n        const appendTopAndBottom = (charIndex, positionOfChar) => {\n            const { x, y } = positionOfChar, rotation = (tp.getRotationOfChar(charIndex) - 90) * deg2rad, cosRot = Math.cos(rotation), sinRot = Math.sin(rotation);\n            return [\n                [\n                    x - descender * cosRot,\n                    y - descender * sinRot\n                ],\n                [\n                    x + b * cosRot,\n                    y + b * sinRot\n                ]\n            ];\n        };\n        for (let i = 0, lineIndex = 0; lineIndex < numOfLines; lineIndex++) {\n            const line = lines[lineIndex], lineLen = line.length;\n            for (let lineCharIndex = 0; lineCharIndex < lineLen; lineCharIndex += 5) {\n                try {\n                    const srcCharIndex = (i +\n                        lineCharIndex +\n                        lineIndex), [lower, upper] = appendTopAndBottom(srcCharIndex, tp.getStartPositionOfChar(srcCharIndex));\n                    if (lineCharIndex === 0) {\n                        polygon.push(upper);\n                        polygon.push(lower);\n                    }\n                    else {\n                        if (lineIndex === 0) {\n                            polygon.unshift(upper);\n                        }\n                        if (lineIndex === numOfLines - 1) {\n                            polygon.push(lower);\n                        }\n                    }\n                }\n                catch (e) {\n                    // Safari fails on getStartPositionOfChar even if the\n                    // character is within the `textContent.length`\n                    break;\n                }\n            }\n            i += lineLen - 1;\n            try {\n                const srcCharIndex = i + lineIndex, charPos = tp.getEndPositionOfChar(srcCharIndex), [lower, upper] = appendTopAndBottom(srcCharIndex, charPos);\n                polygon.unshift(upper);\n                polygon.unshift(lower);\n            }\n            catch (e) {\n                // Safari fails on getStartPositionOfChar even if the character\n                // is within the `textContent.length`\n                break;\n            }\n        }\n        // Close it\n        if (polygon.length) {\n            polygon.push(polygon[0].slice());\n        }\n        bBox.polygon = polygon;\n    }\n    return bBox;\n}\n/**\n * Draw text along a textPath for a dataLabel.\n *\n * @function Highcharts.SVGElement#setTextPath\n *\n * @param {any} event\n *        An event containing label options\n *\n * @return {void}\n */\nfunction drawTextPath(event) {\n    const labelOptions = event.labelOptions, point = event.point, textPathOptions = (labelOptions[point.formatPrefix + 'TextPath'] ||\n        labelOptions.textPath);\n    if (textPathOptions && !labelOptions.useHTML) {\n        this.setTextPath(point.getDataLabelPath?.(this) || point.graphic, textPathOptions);\n        if (point.dataLabelPath &&\n            !textPathOptions.enabled) {\n            // Clean the DOM\n            point.dataLabelPath = (point.dataLabelPath.destroy());\n        }\n    }\n}\nfunction compose(SVGElementClass) {\n    addEvent(SVGElementClass, 'afterGetBBox', setPolygon);\n    addEvent(SVGElementClass, 'beforeAddingDataLabel', drawTextPath);\n    const svgElementProto = SVGElementClass.prototype;\n    if (!svgElementProto.setTextPath) {\n        svgElementProto.setTextPath = setTextPath;\n    }\n}\nconst TextPath = {\n    compose\n};\nexport default TextPath;\n","/* *\n *\n *  (c) 2010-2024 Grzegorz Blachlinski, Sebastian Bochan\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport DragNodesComposition from '../DragNodesComposition.js';\nimport GraphLayout from '../GraphLayoutComposition.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport PackedBubblePoint from './PackedBubblePoint.js';\nimport PackedBubbleSeriesDefaults from './PackedBubbleSeriesDefaults.js';\nimport PackedBubbleLayout from './PackedBubbleLayout.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: { prototype: seriesProto }, seriesTypes: { bubble: BubbleSeries } } = SeriesRegistry;\nimport D from '../SimulationSeriesUtilities.js';\nconst { initDataLabels, initDataLabelsDefer } = D;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, clamp, defined, extend, fireEvent, isArray, isNumber, merge, pick } = U;\nimport SVGElement from '../../Core/Renderer/SVG/SVGElement.js';\nimport TextPath from '../../Extensions/TextPath.js';\nTextPath.compose(SVGElement);\n/* *\n *\n *  Class\n *\n * */\n/**\n * @private\n * @class\n * @name Highcharts.seriesTypes.packedbubble\n *\n * @extends Highcharts.Series\n */\nclass PackedBubbleSeries extends BubbleSeries {\n    constructor() {\n        /* *\n         *\n         *  Static Properties\n         *\n         * */\n        super(...arguments);\n        this.parentNodeMass = 0;\n        this.deferDataLabels = true;\n        /* eslint-enable valid-jsdoc */\n    }\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    static compose(AxisClass, ChartClass, LegendClass) {\n        BubbleSeries.compose(AxisClass, ChartClass, LegendClass);\n        DragNodesComposition.compose(ChartClass);\n        PackedBubbleLayout.compose(ChartClass);\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Create a single array of all points from all series\n     * @private\n     */\n    accumulateAllPoints() {\n        const chart = this.chart, allDataPoints = [];\n        let yData;\n        for (const series of chart.series) {\n            if (series.is('packedbubble') && // #13574\n                series.reserveSpace()) {\n                yData = series.yData || [];\n                // Add data to array only if series is visible\n                for (let j = 0; j < yData.length; j++) {\n                    allDataPoints.push([\n                        null, null,\n                        yData[j],\n                        series.index,\n                        j,\n                        {\n                            id: j,\n                            marker: {\n                                radius: 0\n                            }\n                        }\n                    ]);\n                }\n            }\n        }\n        return allDataPoints;\n    }\n    /**\n     * Adding the basic layout to series points.\n     * @private\n     */\n    addLayout() {\n        const layoutOptions = this.options.layoutAlgorithm =\n            this.options.layoutAlgorithm || {}, layoutType = layoutOptions.type || 'packedbubble', chartOptions = this.chart.options.chart;\n        let graphLayoutsStorage = this.chart.graphLayoutsStorage, graphLayoutsLookup = this.chart.graphLayoutsLookup, layout;\n        if (!graphLayoutsStorage) {\n            this.chart.graphLayoutsStorage = graphLayoutsStorage = {};\n            this.chart.graphLayoutsLookup = graphLayoutsLookup = [];\n        }\n        layout = graphLayoutsStorage[layoutType];\n        if (!layout) {\n            layoutOptions.enableSimulation =\n                !defined(chartOptions.forExport) ?\n                    layoutOptions.enableSimulation :\n                    !chartOptions.forExport;\n            graphLayoutsStorage[layoutType] = layout =\n                new GraphLayout.layouts[layoutType]();\n            layout.init(layoutOptions);\n            graphLayoutsLookup.splice(layout.index, 0, layout);\n        }\n        this.layout = layout;\n        this.points.forEach((node) => {\n            node.mass = 2;\n            node.degree = 1;\n            node.collisionNmb = 1;\n        });\n        layout.setArea(0, 0, this.chart.plotWidth, this.chart.plotHeight);\n        layout.addElementsToCollection([this], layout.series);\n        layout.addElementsToCollection(this.points, layout.nodes);\n    }\n    /**\n     * Function responsible for adding series layout, used for parent nodes.\n     * @private\n     */\n    addSeriesLayout() {\n        const layoutOptions = this.options.layoutAlgorithm =\n            this.options.layoutAlgorithm || {}, layoutType = (layoutOptions.type || 'packedbubble'), graphLayoutsStorage = this.chart.graphLayoutsStorage, graphLayoutsLookup = this.chart.graphLayoutsLookup, parentNodeOptions = merge(layoutOptions, layoutOptions.parentNodeOptions, {\n            enableSimulation: this.layout.options.enableSimulation\n        });\n        let seriesLayout = graphLayoutsStorage[layoutType + '-series'];\n        if (!seriesLayout) {\n            graphLayoutsStorage[layoutType + '-series'] = seriesLayout =\n                new GraphLayout.layouts[layoutType]();\n            seriesLayout.init(parentNodeOptions);\n            graphLayoutsLookup.splice(seriesLayout.index, 0, seriesLayout);\n        }\n        this.parentNodeLayout = seriesLayout;\n        this.createParentNodes();\n    }\n    /**\n     * The function responsible for calculating the parent node radius\n     * based on the total surface of inside-bubbles and the group BBox\n     * @private\n     */\n    calculateParentRadius() {\n        const bBox = this.seriesBox(), parentPadding = 20, minParentRadius = 20;\n        this.parentNodeRadius = clamp(Math.sqrt(2 * this.parentNodeMass / Math.PI) + parentPadding, minParentRadius, bBox ?\n            Math.max(Math.sqrt(Math.pow(bBox.width, 2) +\n                Math.pow(bBox.height, 2)) / 2 + parentPadding, minParentRadius) :\n            Math.sqrt(2 * this.parentNodeMass / Math.PI) + parentPadding);\n        if (this.parentNode) {\n            this.parentNode.marker.radius =\n                this.parentNode.radius = this.parentNodeRadius;\n        }\n    }\n    /**\n     * Calculate min and max bubble value for radius calculation.\n     * @private\n     */\n    calculateZExtremes() {\n        const chart = this.chart, allSeries = chart.series;\n        let zMin = this.options.zMin, zMax = this.options.zMax, valMin = Infinity, valMax = -Infinity;\n        if (zMin && zMax) {\n            return [zMin, zMax];\n        }\n        // It is needed to deal with null\n        // and undefined values\n        allSeries.forEach((series) => {\n            series.yData.forEach((y) => {\n                if (defined(y)) {\n                    if (y > valMax) {\n                        valMax = y;\n                    }\n                    if (y < valMin) {\n                        valMin = y;\n                    }\n                }\n            });\n        });\n        zMin = pick(zMin, valMin);\n        zMax = pick(zMax, valMax);\n        return [zMin, zMax];\n    }\n    /**\n     * Check if two bubbles overlaps.\n     * @private\n     */\n    checkOverlap(bubble1, bubble2) {\n        const diffX = bubble1[0] - bubble2[0], // Diff of X center values\n        diffY = bubble1[1] - bubble2[1], // Diff of Y center values\n        sumRad = bubble1[2] + bubble2[2]; // Sum of bubble radius\n        return (Math.sqrt(diffX * diffX + diffY * diffY) -\n            Math.abs(sumRad)) < -0.001;\n    }\n    /**\n     * Creating parent nodes for split series, in which all the bubbles\n     * are rendered.\n     * @private\n     */\n    createParentNodes() {\n        const PackedBubblePoint = this.pointClass, chart = this.chart, parentNodeLayout = this.parentNodeLayout, layoutOptions = this.layout.options;\n        let nodeAdded, parentNode = this.parentNode, parentMarkerOptions = {\n            radius: this.parentNodeRadius,\n            lineColor: this.color,\n            fillColor: color(this.color).brighten(0.4).get()\n        };\n        if (layoutOptions.parentNodeOptions) {\n            parentMarkerOptions = merge(layoutOptions.parentNodeOptions.marker || {}, parentMarkerOptions);\n        }\n        this.parentNodeMass = 0;\n        this.points.forEach((p) => {\n            this.parentNodeMass +=\n                Math.PI * Math.pow(p.marker.radius, 2);\n        });\n        this.calculateParentRadius();\n        parentNodeLayout.nodes\n            .forEach((node) => {\n            if (node.seriesIndex === this.index) {\n                nodeAdded = true;\n            }\n        });\n        parentNodeLayout.setArea(0, 0, chart.plotWidth, chart.plotHeight);\n        if (!nodeAdded) {\n            if (!parentNode) {\n                parentNode = new PackedBubblePoint(this, {\n                    mass: this.parentNodeRadius / 2,\n                    marker: parentMarkerOptions,\n                    dataLabels: {\n                        inside: false\n                    },\n                    states: {\n                        normal: {\n                            marker: parentMarkerOptions\n                        },\n                        hover: {\n                            marker: parentMarkerOptions\n                        }\n                    },\n                    dataLabelOnNull: true,\n                    degree: this.parentNodeRadius,\n                    isParentNode: true,\n                    seriesIndex: this.index\n                });\n            }\n            if (this.parentNode) {\n                parentNode.plotX = this.parentNode.plotX;\n                parentNode.plotY = this.parentNode.plotY;\n            }\n            this.parentNode = parentNode;\n            parentNodeLayout.addElementsToCollection([this], parentNodeLayout.series);\n            parentNodeLayout.addElementsToCollection([parentNode], parentNodeLayout.nodes);\n        }\n    }\n    /**\n     * Function responsible for adding all the layouts to the chart.\n     * @private\n     */\n    deferLayout() {\n        // TODO split layouts to independent methods\n        const layoutOptions = this.options.layoutAlgorithm;\n        if (!this.visible) {\n            return;\n        }\n        // Layout is using nodes for position calculation\n        this.addLayout();\n        if (layoutOptions.splitSeries) {\n            this.addSeriesLayout();\n        }\n    }\n    destroy() {\n        // Remove the series from all layouts series collections #11469\n        if (this.chart.graphLayoutsLookup) {\n            this.chart.graphLayoutsLookup.forEach((layout) => {\n                layout.removeElementFromCollection(this, layout.series);\n            }, this);\n        }\n        if (this.parentNode &&\n            this.parentNodeLayout) {\n            this.parentNodeLayout.removeElementFromCollection(this.parentNode, this.parentNodeLayout.nodes);\n            if (this.parentNode.dataLabel) {\n                this.parentNode.dataLabel =\n                    this.parentNode.dataLabel.destroy();\n            }\n        }\n        seriesProto.destroy.apply(this, arguments);\n    }\n    /**\n     * Packedbubble has two separate collections of nodes if split, render\n     * dataLabels for both sets:\n     * @private\n     */\n    drawDataLabels() {\n        // We defer drawing the dataLabels\n        // until dataLabels.animation.defer time passes\n        if (this.deferDataLabels) {\n            return;\n        }\n        seriesProto.drawDataLabels.call(this, this.points);\n        // Render parentNode labels:\n        if (this.parentNode) {\n            this.parentNode.formatPrefix = 'parentNode';\n            seriesProto.drawDataLabels.call(this, [this.parentNode]);\n        }\n    }\n    /**\n     * Create Background/Parent Nodes for split series.\n     * @private\n     */\n    drawGraph() {\n        // If the series is not using layout, don't add parent nodes\n        if (!this.layout || !this.layout.options.splitSeries) {\n            return;\n        }\n        const chart = this.chart, nodeMarker = this.layout.options.parentNodeOptions.marker, parentOptions = {\n            fill: (nodeMarker.fillColor ||\n                color(this.color).brighten(0.4).get()),\n            opacity: nodeMarker.fillOpacity,\n            stroke: nodeMarker.lineColor || this.color,\n            'stroke-width': pick(nodeMarker.lineWidth, this.options.lineWidth)\n        };\n        let parentAttribs = {};\n        // Create the group for parent Nodes if doesn't exist\n        // If exists it will only be adjusted to the updated plot size (#12063)\n        this.parentNodesGroup = this.plotGroup('parentNodesGroup', 'parentNode', this.visible ? 'inherit' : 'hidden', 0.1, chart.seriesGroup);\n        this.group?.attr({\n            zIndex: 2\n        });\n        this.calculateParentRadius();\n        if (this.parentNode &&\n            defined(this.parentNode.plotX) &&\n            defined(this.parentNode.plotY) &&\n            defined(this.parentNodeRadius)) {\n            parentAttribs = merge({\n                x: this.parentNode.plotX -\n                    this.parentNodeRadius,\n                y: this.parentNode.plotY -\n                    this.parentNodeRadius,\n                width: this.parentNodeRadius * 2,\n                height: this.parentNodeRadius * 2\n            }, parentOptions);\n            if (!this.parentNode.graphic) {\n                this.graph = this.parentNode.graphic =\n                    chart.renderer.symbol(parentOptions.symbol)\n                        .add(this.parentNodesGroup);\n            }\n            this.parentNode.graphic.attr(parentAttribs);\n        }\n    }\n    drawTracker() {\n        const parentNode = this.parentNode;\n        // Chart = series.chart,\n        // pointer = chart.pointer,\n        // onMouseOver = function (e: PointerEvent): void {\n        //     const point = pointer.getPointFromEvent(e);\n        //     // undefined on graph in scatterchart\n        //     if (typeof point !== 'undefined') {\n        //         pointer.isDirectTouch = true;\n        //         point.onMouseOver(e);\n        //     }\n        // };\n        let dataLabels;\n        super.drawTracker();\n        // Add reference to the point\n        if (parentNode) {\n            dataLabels = (isArray(parentNode.dataLabels) ?\n                parentNode.dataLabels :\n                (parentNode.dataLabel ? [parentNode.dataLabel] : []));\n            if (parentNode.graphic) {\n                parentNode.graphic.element.point = parentNode;\n            }\n            dataLabels.forEach((dataLabel) => {\n                (dataLabel.div || dataLabel.element).point = parentNode;\n            });\n        }\n    }\n    /**\n     * Calculate radius of bubbles in series.\n     * @private\n     */\n    getPointRadius() {\n        const chart = this.chart, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, seriesOptions = this.options, useSimulation = seriesOptions.useSimulation, smallestSize = Math.min(plotWidth, plotHeight), extremes = {}, radii = [], allDataPoints = chart.allDataPoints || [], allDataPointsLength = allDataPoints.length;\n        let minSize, maxSize, value, radius;\n        ['minSize', 'maxSize'].forEach((prop) => {\n            const length = parseInt(seriesOptions[prop], 10), isPercent = /%$/.test(seriesOptions[prop]);\n            extremes[prop] = isPercent ?\n                smallestSize * length / 100 :\n                length * Math.sqrt(allDataPointsLength);\n        });\n        chart.minRadius = minSize = extremes.minSize /\n            Math.sqrt(allDataPointsLength);\n        chart.maxRadius = maxSize = extremes.maxSize /\n            Math.sqrt(allDataPointsLength);\n        const zExtremes = useSimulation ?\n            this.calculateZExtremes() :\n            [minSize, maxSize];\n        allDataPoints.forEach((point, i) => {\n            value = useSimulation ?\n                clamp(point[2], zExtremes[0], zExtremes[1]) :\n                point[2];\n            radius = this.getRadius(zExtremes[0], zExtremes[1], minSize, maxSize, value);\n            if (radius === 0) {\n                radius = null;\n            }\n            allDataPoints[i][2] = radius;\n            radii.push(radius);\n        });\n        this.radii = radii;\n    }\n    init() {\n        seriesProto.init.apply(this, arguments);\n        initDataLabelsDefer.call(this);\n        /* eslint-disable no-invalid-this */\n        // When one series is modified, the others need to be recomputed\n        this.eventsToUnbind.push(addEvent(this, 'updatedData', function () {\n            this.chart.series.forEach((s) => {\n                if (s.type === this.type) {\n                    s.isDirty = true;\n                }\n            }, this);\n        }));\n        /* eslint-enable no-invalid-this */\n        return this;\n    }\n    /**\n     * Mouse up action, finalizing drag&drop.\n     * @private\n     * @param {Highcharts.Point} point The point that event occurred.\n     */\n    onMouseUp(dnPoint) {\n        const point = dnPoint;\n        if (point.fixedPosition && !point.removed) {\n            const layout = this.layout, parentNodeLayout = this.parentNodeLayout;\n            let distanceXY, distanceR;\n            if (parentNodeLayout && layout.options.dragBetweenSeries) {\n                parentNodeLayout.nodes.forEach((node) => {\n                    if (point && point.marker &&\n                        node !== point.series.parentNode) {\n                        distanceXY = layout.getDistXY(point, node);\n                        distanceR = (layout.vectorLength(distanceXY) -\n                            node.marker.radius -\n                            point.marker.radius);\n                        if (distanceR < 0) {\n                            node.series.addPoint(merge(point.options, {\n                                plotX: point.plotX,\n                                plotY: point.plotY\n                            }), false);\n                            layout.removeElementFromCollection(point, layout.nodes);\n                            point.remove();\n                        }\n                    }\n                });\n            }\n            DragNodesComposition.onMouseUp.apply(this, arguments);\n        }\n    }\n    /**\n     * This is the main function responsible\n     * for positioning all of the bubbles\n     * allDataPoints - bubble array, in format [pixel x value,\n     * pixel y value, radius,\n     * related series index, related point index]\n     * @private\n     * @param {Array<Highcharts.PackedBubbleData>} allDataPoints All points from all series\n     * @return {Array<Highcharts.PackedBubbleData>} Positions of all bubbles\n     */\n    placeBubbles(allDataPoints) {\n        const checkOverlap = this.checkOverlap, positionBubble = this.positionBubble, bubblePos = [];\n        let stage = 1, j = 0, k = 0, calculatedBubble, arr = [], i;\n        // Sort all points\n        const sortedArr = allDataPoints.sort((a, b) => b[2] - a[2]);\n        if (sortedArr.length) {\n            // Create first bubble in the middle of the chart\n            bubblePos.push([\n                [\n                    0, // Starting in 0,0 coordinates\n                    0,\n                    sortedArr[0][2], // Radius\n                    sortedArr[0][3], // Series index\n                    sortedArr[0][4]\n                ] // Point index\n            ]); // 0 level bubble\n            if (sortedArr.length > 1) {\n                bubblePos.push([\n                    [\n                        0,\n                        (0 - sortedArr[1][2] -\n                            sortedArr[0][2]),\n                        // Move bubble above first one\n                        sortedArr[1][2],\n                        sortedArr[1][3],\n                        sortedArr[1][4]\n                    ]\n                ]); // 1 level 1st bubble\n                // first two already positioned so starting from 2\n                for (i = 2; i < sortedArr.length; i++) {\n                    sortedArr[i][2] = sortedArr[i][2] || 1;\n                    // In case if radius is calculated as 0.\n                    calculatedBubble = positionBubble(bubblePos[stage][j], bubblePos[stage - 1][k], sortedArr[i]); // Calculate initial bubble position\n                    if (checkOverlap(calculatedBubble, bubblePos[stage][0])) {\n                        /* If new bubble is overlapping with first bubble\n                            * in current level (stage)\n                            */\n                        bubblePos.push([]);\n                        k = 0;\n                        /* Reset index of bubble, used for\n                            * positioning the bubbles around it,\n                            * we are starting from first bubble in next\n                            * stage because we are changing level to higher\n                            */\n                        bubblePos[stage + 1].push(positionBubble(bubblePos[stage][j], bubblePos[stage][0], sortedArr[i]));\n                        // (last bubble, 1. from curr stage, new bubble)\n                        stage++; // The new level is created, above current\n                        j = 0; // Set the index of bubble in curr level to 0\n                    }\n                    else if (stage > 1 &&\n                        bubblePos[stage - 1][k + 1] &&\n                        checkOverlap(calculatedBubble, bubblePos[stage - 1][k + 1])) {\n                        /* If new bubble is overlapping with one of the prev\n                            * stage bubbles, it means that - bubble, used for\n                            * positioning the bubbles around it has changed\n                            * so we need to recalculate it\n                            */\n                        k++;\n                        bubblePos[stage].push(positionBubble(bubblePos[stage][j], bubblePos[stage - 1][k], sortedArr[i]));\n                        // (last bubble, prev stage bubble, new bubble)\n                        j++;\n                    }\n                    else { // Simply add calculated bubble\n                        j++;\n                        bubblePos[stage].push(calculatedBubble);\n                    }\n                }\n            }\n            this.chart.stages = bubblePos;\n            // It may not be necessary but adding it just in case -\n            // it is containing all of the bubble levels\n            this.chart.rawPositions =\n                []\n                    .concat.apply([], bubblePos);\n            // Bubble positions merged into one array\n            this.resizeRadius();\n            arr = this.chart.rawPositions;\n        }\n        return arr;\n    }\n    /**\n     * Function that checks for a parentMarker and sets the correct opacity.\n     * @private\n     * @param {Highcharts.Pack} point\n     * Candidate point for opacity correction.\n     * @param {string} [state]\n     * The point state, can be either `hover`, `select` or 'normal'. If\n     * undefined, normal state is assumed.\n     *\n     * @return {Highcharts.SVGAttributes}\n     * The presentational attributes to be set on the point.\n     */\n    pointAttribs(point, state) {\n        const options = this.options, hasParentMarker = point && point.isParentNode;\n        let markerOptions = options.marker;\n        if (hasParentMarker &&\n            options.layoutAlgorithm &&\n            options.layoutAlgorithm.parentNodeOptions) {\n            markerOptions = options.layoutAlgorithm.parentNodeOptions.marker;\n        }\n        const fillOpacity = markerOptions.fillOpacity, attr = seriesProto.pointAttribs.call(this, point, state);\n        if (fillOpacity !== 1) {\n            attr['fill-opacity'] = fillOpacity;\n        }\n        return attr;\n    }\n    /**\n     * Function that is adding one bubble based on positions and sizes of\n     * two other bubbles, lastBubble is the last added bubble, newOrigin is\n     * the bubble for positioning new bubbles. nextBubble is the currently\n     * added bubble for which we are calculating positions\n     * @private\n     * @param {Array<number>} lastBubble The closest last bubble\n     * @param {Array<number>} newOrigin New bubble\n     * @param {Array<number>} nextBubble The closest next bubble\n     * @return {Array<number>} Bubble with correct positions\n     */\n    positionBubble(lastBubble, newOrigin, nextBubble) {\n        const sqrt = Math.sqrt, asin = Math.asin, acos = Math.acos, pow = Math.pow, abs = Math.abs, distance = sqrt(// Dist between lastBubble and newOrigin\n        pow((lastBubble[0] - newOrigin[0]), 2) +\n            pow((lastBubble[1] - newOrigin[1]), 2)), alfa = acos(\n        // From cosinus theorem: alfa is an angle used for\n        // calculating correct position\n        (pow(distance, 2) +\n            pow(nextBubble[2] + newOrigin[2], 2) -\n            pow(nextBubble[2] + lastBubble[2], 2)) / (2 * (nextBubble[2] + newOrigin[2]) * distance)), beta = asin(// From sinus theorem.\n        abs(lastBubble[0] - newOrigin[0]) /\n            distance), \n        // Providing helping variables, related to angle between\n        // lastBubble and newOrigin\n        gamma = (lastBubble[1] - newOrigin[1]) < 0 ? 0 : Math.PI, \n        // If new origin y is smaller than last bubble y value\n        // (2 and 3 quarter),\n        // add Math.PI to final angle\n        delta = (lastBubble[0] - newOrigin[0]) *\n            (lastBubble[1] - newOrigin[1]) < 0 ?\n            1 : -1, // (1st and 3rd quarter)\n        finalAngle = gamma + alfa + beta * delta, cosA = Math.cos(finalAngle), sinA = Math.sin(finalAngle), posX = newOrigin[0] + (newOrigin[2] + nextBubble[2]) * sinA, \n        // Center of new origin + (radius1 + radius2) * sinus A\n        posY = newOrigin[1] - (newOrigin[2] + nextBubble[2]) * cosA;\n        return [\n            posX,\n            posY,\n            nextBubble[2],\n            nextBubble[3],\n            nextBubble[4]\n        ]; // The same as described before\n    }\n    render() {\n        const dataLabels = [];\n        seriesProto.render.apply(this, arguments);\n        // #10823 - dataLabels should stay visible\n        // when enabled allowOverlap.\n        if (!this.options.dataLabels.allowOverlap) {\n            this.data.forEach((point) => {\n                if (isArray(point.dataLabels)) {\n                    point.dataLabels.forEach((dataLabel) => {\n                        dataLabels.push(dataLabel);\n                    });\n                }\n            });\n            // Only hide overlapping dataLabels for layouts that\n            // use simulation. Spiral packedbubble don't need\n            // additional dataLabel hiding on every simulation step\n            if (this.options.useSimulation) {\n                this.chart.hideOverlappingLabels(dataLabels);\n            }\n        }\n    }\n    /**\n     * The function responsible for resizing the bubble radius.\n     * In shortcut: it is taking the initially\n     * calculated positions of bubbles. Then it is calculating the min max\n     * of both dimensions, creating something in shape of bBox.\n     * The comparison of bBox and the size of plotArea\n     * (later it may be also the size set by customer) is giving the\n     * value how to recalculate the radius so it will match the size\n     * @private\n     */\n    resizeRadius() {\n        const chart = this.chart, positions = chart.rawPositions, min = Math.min, max = Math.max, plotLeft = chart.plotLeft, plotTop = chart.plotTop, chartHeight = chart.plotHeight, chartWidth = chart.plotWidth;\n        let minX, maxX, minY, maxY, radius;\n        minX = minY = Number.POSITIVE_INFINITY; // Set initial values\n        maxX = maxY = Number.NEGATIVE_INFINITY;\n        for (const position of positions) {\n            radius = position[2];\n            minX = min(minX, position[0] - radius);\n            // (x center-radius) is the min x value used by specific bubble\n            maxX = max(maxX, position[0] + radius);\n            minY = min(minY, position[1] - radius);\n            maxY = max(maxY, position[1] + radius);\n        }\n        const bBox = [maxX - minX, maxY - minY], spaceRatio = [\n            (chartWidth - plotLeft) / bBox[0],\n            (chartHeight - plotTop) / bBox[1]\n        ], smallerDimension = min.apply([], spaceRatio);\n        if (Math.abs(smallerDimension - 1) > 1e-10) {\n            // If bBox is considered not the same width as possible size\n            for (const position of positions) {\n                position[2] *= smallerDimension;\n            }\n            this.placeBubbles(positions);\n        }\n        else {\n            /** If no radius recalculation is needed, we need to position\n             * the whole bubbles in center of chart plotarea\n             * for this, we are adding two parameters,\n             * diffY and diffX, that are related to differences\n             * between the initial center and the bounding box\n             */\n            chart.diffY = chartHeight / 2 +\n                plotTop - minY - (maxY - minY) / 2;\n            chart.diffX = chartWidth / 2 +\n                plotLeft - minX - (maxX - minX) / 2;\n        }\n    }\n    /**\n     * The function responsible for calculating series bubble' s bBox.\n     * Needed because of exporting failure when useSimulation\n     * is set to false\n     * @private\n     */\n    seriesBox() {\n        const chart = this.chart, data = this.data, max = Math.max, min = Math.min, bBox = [\n            chart.plotLeft,\n            chart.plotLeft + chart.plotWidth,\n            chart.plotTop,\n            chart.plotTop + chart.plotHeight\n        ];\n        let radius;\n        data.forEach((p) => {\n            if (defined(p.plotX) &&\n                defined(p.plotY) &&\n                p.marker.radius) {\n                radius = p.marker.radius;\n                bBox[0] = min(bBox[0], p.plotX - radius);\n                bBox[1] = max(bBox[1], p.plotX + radius);\n                bBox[2] = min(bBox[2], p.plotY - radius);\n                bBox[3] = max(bBox[3], p.plotY + radius);\n            }\n        });\n        return isNumber(bBox.width / bBox.height) ?\n            bBox :\n            null;\n    }\n    /**\n     * Needed because of z-indexing issue if point is added in series.group\n     * @private\n     */\n    setVisible() {\n        const series = this;\n        seriesProto.setVisible.apply(series, arguments);\n        if (series.parentNodeLayout && series.graph) {\n            if (series.visible) {\n                series.graph.show();\n                if (series.parentNode.dataLabel) {\n                    series.parentNode.dataLabel.show();\n                }\n            }\n            else {\n                series.graph.hide();\n                series.parentNodeLayout.removeElementFromCollection(series.parentNode, series.parentNodeLayout.nodes);\n                if (series.parentNode.dataLabel) {\n                    series.parentNode.dataLabel.hide();\n                }\n            }\n        }\n        else if (series.layout) {\n            if (series.visible) {\n                series.layout.addElementsToCollection(series.points, series.layout.nodes);\n            }\n            else {\n                series.points.forEach((node) => {\n                    series.layout.removeElementFromCollection(node, series.layout.nodes);\n                });\n            }\n        }\n    }\n    /**\n     * Extend the base translate method to handle bubble size,\n     * and correct positioning them.\n     * @private\n     */\n    translate() {\n        const chart = this.chart, data = this.data, index = this.index, useSimulation = this.options.useSimulation;\n        let point, radius, positions;\n        this.processedXData = this.xData;\n        this.generatePoints();\n        // Merged data is an array with all of the data from all series\n        if (!defined(chart.allDataPoints)) {\n            chart.allDataPoints = this.accumulateAllPoints();\n            // Calculate radius for all added data\n            this.getPointRadius();\n        }\n        // After getting initial radius, calculate bubble positions\n        if (useSimulation) {\n            positions = chart.allDataPoints;\n        }\n        else {\n            positions = this.placeBubbles(chart.allDataPoints);\n            this.options.draggable = false;\n        }\n        // Set the shape and arguments to be picked up in drawPoints\n        for (const position of positions) {\n            if (position[3] === index) {\n                // Update the series points with the val from positions\n                // array\n                point = data[position[4]];\n                radius = pick(position[2], void 0);\n                if (!useSimulation) {\n                    point.plotX = (position[0] - chart.plotLeft +\n                        chart.diffX);\n                    point.plotY = (position[1] - chart.plotTop +\n                        chart.diffY);\n                }\n                if (isNumber(radius)) {\n                    point.marker = extend(point.marker, {\n                        radius,\n                        width: 2 * radius,\n                        height: 2 * radius\n                    });\n                    point.radius = radius;\n                }\n            }\n        }\n        if (useSimulation) {\n            this.deferLayout();\n        }\n        fireEvent(this, 'afterTranslate');\n    }\n}\nPackedBubbleSeries.defaultOptions = merge(BubbleSeries.defaultOptions, PackedBubbleSeriesDefaults);\nextend(PackedBubbleSeries.prototype, {\n    pointClass: PackedBubblePoint,\n    axisTypes: [],\n    directTouch: true,\n    forces: ['barycenter', 'repulsive'],\n    hasDraggableNodes: true,\n    invertible: false,\n    isCartesian: false,\n    noSharedTooltip: true,\n    pointArrayMap: ['value'],\n    pointValKey: 'value',\n    requireSorting: false,\n    trackerGroups: ['group', 'dataLabelsGroup', 'parentNodesGroup'],\n    initDataLabels: initDataLabels,\n    alignDataLabel: seriesProto.alignDataLabel,\n    indexateNodes: noop,\n    onMouseDown: DragNodesComposition.onMouseDown,\n    onMouseMove: DragNodesComposition.onMouseMove,\n    redrawHalo: DragNodesComposition.redrawHalo,\n    searchPoint: noop // Solving #12287\n});\nSeriesRegistry.registerSeriesType('packedbubble', PackedBubbleSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default PackedBubbleSeries;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Formatter callback function.\n *\n * @callback Highcharts.SeriesPackedBubbleDataLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.SeriesPackedBubbleDataLabelsFormatterContextObject} this\n *        Data label context to format\n *\n * @return {string}\n *         Formatted data label text\n */\n/**\n * Context for the formatter function.\n *\n * @interface Highcharts.SeriesPackedBubbleDataLabelsFormatterContextObject\n * @extends Highcharts.PointLabelObject\n * @since 7.0.0\n */ /**\n* The color of the node.\n* @name Highcharts.SeriesPackedBubbleDataLabelsFormatterContextObject#color\n* @type {Highcharts.ColorString}\n* @since 7.0.0\n*/ /**\n* The point (node) object. The node name, if defined, is available through\n* `this.point.name`. Arrays: `this.point.linksFrom` and `this.point.linksTo`\n* contains all nodes connected to this point.\n* @name Highcharts.SeriesPackedBubbleDataLabelsFormatterContextObject#point\n* @type {Highcharts.Point}\n* @since 7.0.0\n*/ /**\n* The ID of the node.\n* @name Highcharts.SeriesPackedBubbleDataLabelsFormatterContextObject#key\n* @type {string}\n* @since 7.0.0\n*/\n''; // Detach doclets above\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport PolygonSeriesDefaults from './PolygonSeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { area: AreaSeries, line: LineSeries, scatter: ScatterSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { extend, merge } = U;\n/* *\n *\n *  Class\n *\n * */\nclass PolygonSeries extends ScatterSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    getGraphPath() {\n        const graphPath = LineSeries.prototype.getGraphPath.call(this);\n        let i = graphPath.length + 1;\n        // Close all segments\n        while (i--) {\n            if ((i === graphPath.length || graphPath[i][0] === 'M') && i > 0) {\n                graphPath.splice(i, 0, ['Z']);\n            }\n        }\n        this.areaPath = graphPath;\n        return graphPath;\n    }\n    drawGraph() {\n        // Hack into the fill logic in area.drawGraph\n        this.options.fillColor = this.color;\n        AreaSeries.prototype.drawGraph.call(this);\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nPolygonSeries.defaultOptions = merge(ScatterSeries.defaultOptions, PolygonSeriesDefaults);\nextend(PolygonSeries.prototype, {\n    type: 'polygon',\n    drawTracker: LineSeries.prototype.drawTracker,\n    setStackedPoints: noop // No stacking points on polygons (#5310)\n});\nSeriesRegistry.registerSeriesType('polygon', PolygonSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default PolygonSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A polygon series can be used to draw any freeform shape in the cartesian\n * coordinate system. A fill is applied with the `color` option, and\n * stroke is applied through `lineWidth` and `lineColor` options.\n *\n * @sample {highcharts} highcharts/demo/polygon/\n *         Polygon\n * @sample {highstock} highcharts/demo/polygon/\n *         Polygon\n *\n * @extends      plotOptions.scatter\n * @since        4.1.0\n * @excluding    jitter, softThreshold, threshold, cluster, boostThreshold,\n *               boostBlending\n * @product      highcharts highstock\n * @requires     highcharts-more\n * @optionparent plotOptions.polygon\n */\nconst PolygonSeriesDefaults = {\n    marker: {\n        enabled: false,\n        states: {\n            hover: {\n                enabled: false\n            }\n        }\n    },\n    stickyTracking: false,\n    tooltip: {\n        followPointer: true,\n        pointFormat: ''\n    },\n    trackByArea: true,\n    legendSymbol: 'rectangle'\n};\n/**\n * A `polygon` series. If the [type](#series.polygon.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.polygon\n * @excluding dataParser, dataURL, stack, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @requires  highcharts-more\n * @apioption series.polygon\n */\n/**\n * An array of data points for the series. For the `polygon` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 10],\n *        [1, 3],\n *        [2, 1]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.polygon.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 1,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 8,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @product   highcharts highstock\n * @apioption series.polygon.data\n */\n''; // Keeps doclets above separate\n/* *\n *\n *  Default Export\n *\n * */\nexport default PolygonSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  Extension for radial axes\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/**\n     * Circular axis around the perimeter of a polar chart.\n     * @private\n     */\nconst defaultCircularOptions = {\n    gridLineWidth: 1, // Spokes\n    labels: {\n        align: void 0, // Auto\n        x: 0,\n        y: void 0, // Auto\n        style: {\n            textOverflow: 'none' // Wrap lines by default (#7248)\n        }\n    },\n    maxPadding: 0,\n    minPadding: 0,\n    showLastLabel: false,\n    tickLength: 0\n};\n/**\n * The default options extend defaultYAxisOptions.\n * @private\n */\nconst defaultRadialGaugeOptions = {\n    endOnTick: false,\n    gridLineWidth: 0,\n    labels: {\n        align: 'center',\n        distance: -25,\n        x: 0,\n        y: void 0 // Auto\n    },\n    lineWidth: 1,\n    minorGridLineWidth: 0,\n    minorTickInterval: 'auto',\n    minorTickLength: 10,\n    minorTickPosition: 'inside',\n    minorTickWidth: 1,\n    startOnTick: false,\n    tickLength: 10,\n    tickPixelInterval: 100,\n    tickPosition: 'inside',\n    tickWidth: 2,\n    title: {\n        rotation: 0,\n        text: ''\n    },\n    zIndex: 2 // Behind dials, points in the series group\n};\n/**\n * Radial axis, like a spoke in a polar chart.\n * @private\n */\nconst defaultRadialOptions = {\n    /**\n     * In a polar chart, this is the angle of the Y axis in degrees, where\n     * 0 is up and 90 is right. The angle determines the position of the\n     * axis line and the labels, though the coordinate system is unaffected.\n     * Since v8.0.0 this option is also applicable for X axis (inverted\n     * polar).\n     *\n     * @sample {highcharts} highcharts/xaxis/angle/\n     *         Custom X axis' angle on inverted polar chart\n     * @sample {highcharts} highcharts/yaxis/angle/\n     *         Dual axis polar chart\n     *\n     * @type      {number}\n     * @default   0\n     * @since     4.2.7\n     * @product   highcharts\n     * @apioption xAxis.angle\n     */\n    /**\n     * Polar charts only. Whether the grid lines should draw as a polygon\n     * with straight lines between categories, or as circles. Can be either\n     * `circle` or `polygon`. Since v8.0.0 this option is also applicable\n     * for X axis (inverted polar).\n     *\n     * @sample {highcharts} highcharts/demo/polar-spider/\n     *         Polygon grid lines\n     * @sample {highcharts} highcharts/xaxis/gridlineinterpolation/\n     *         Circle and polygon on inverted polar\n     * @sample {highcharts} highcharts/yaxis/gridlineinterpolation/\n     *         Circle and polygon\n     *\n     * @type       {string}\n     * @product    highcharts\n     * @validvalue [\"circle\", \"polygon\"]\n     * @apioption  xAxis.gridLineInterpolation\n     */\n    gridLineInterpolation: 'circle',\n    gridLineWidth: 1,\n    labels: {\n        align: 'right',\n        padding: 5,\n        x: -3,\n        y: -2\n    },\n    showLastLabel: false,\n    title: {\n        x: 4,\n        text: null,\n        rotation: 90\n    }\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst RadialAxisDefaults = {\n    circular: defaultCircularOptions,\n    radial: defaultRadialOptions,\n    radialGauge: defaultRadialGaugeOptions\n};\nexport default RadialAxisDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport RadialAxisDefaults from './RadialAxisDefaults.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport H from '../Globals.js';\nconst { composed, noop } = H;\nimport U from '../Utilities.js';\nconst { addEvent, correctFloat, defined, extend, fireEvent, isObject, merge, pick, pushUnique, relativeLength, wrap } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar RadialAxis;\n(function (RadialAxis) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    RadialAxis.radialDefaultOptions = merge(RadialAxisDefaults);\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * In case of auto connect, add one closestPointRange to the max value\n     * right before tickPositions are computed, so that ticks will extend\n     * passed the real max.\n     * @private\n     */\n    function beforeSetTickPositions() {\n        // If autoConnect is true, polygonal grid lines are connected, and\n        // one closestPointRange is added to the X axis to prevent the last\n        // point from overlapping the first.\n        this.autoConnect = (this.isCircular &&\n            typeof pick(this.userMax, this.options.max) === 'undefined' &&\n            correctFloat(this.endAngleRad - this.startAngleRad) ===\n                correctFloat(2 * Math.PI));\n        // This will lead to add an extra tick to xAxis in order to display\n        // a correct range on inverted polar\n        if (!this.isCircular && this.chart.inverted) {\n            this.max++;\n        }\n        if (this.autoConnect) {\n            this.max += ((this.categories && 1) ||\n                this.pointRange ||\n                this.closestPointRange ||\n                0); // #1197, #2260\n        }\n    }\n    /**\n     * Augments methods for the value axis.\n     *\n     * @private\n     *\n     * @param {Highcharts.Axis} AxisClass\n     * Axis class to extend.\n     *\n     * @param {Highcharts.Tick} TickClass\n     * Tick class to use.\n     *\n     * @return {Highcharts.Axis}\n     * Axis composition.\n     */\n    function compose(AxisClass, TickClass) {\n        if (pushUnique(composed, 'Axis.Radial')) {\n            addEvent(AxisClass, 'afterInit', onAxisAfterInit);\n            addEvent(AxisClass, 'autoLabelAlign', onAxisAutoLabelAlign);\n            addEvent(AxisClass, 'destroy', onAxisDestroy);\n            addEvent(AxisClass, 'init', onAxisInit);\n            addEvent(AxisClass, 'initialAxisTranslation', onAxisInitialAxisTranslation);\n            addEvent(TickClass, 'afterGetLabelPosition', onTickAfterGetLabelPosition);\n            addEvent(TickClass, 'afterGetPosition', onTickAfterGetPosition);\n            addEvent(H, 'setOptions', onGlobalSetOptions);\n            wrap(TickClass.prototype, 'getMarkPath', wrapTickGetMarkPath);\n        }\n        return AxisClass;\n    }\n    RadialAxis.compose = compose;\n    /**\n     * Attach and return collecting function for labels in radial axis for\n     * anti-collision.\n     *\n     * @private\n     */\n    function createLabelCollector() {\n        return () => {\n            if (this.isRadial &&\n                this.tickPositions &&\n                // Undocumented option for now, but working\n                this.options.labels &&\n                this.options.labels.allowOverlap !== true) {\n                return this.tickPositions\n                    .map((pos) => this.ticks[pos] && this.ticks[pos].label)\n                    .filter((label) => Boolean(label));\n            }\n        };\n    }\n    /**\n     * Creates an empty collector function.\n     * @private\n     */\n    function createLabelCollectorHidden() {\n        return noop;\n    }\n    /**\n     * Find the correct end values of crosshair in polar.\n     * @private\n     */\n    function getCrosshairPosition(options, x1, y1) {\n        const center = this.pane.center;\n        let value = options.value, shapeArgs, end, x2, y2;\n        if (this.isCircular) {\n            if (!defined(value)) {\n                // When the snap is set to false\n                x2 = options.chartX || 0;\n                y2 = options.chartY || 0;\n                value = this.translate(Math.atan2(y2 - y1, x2 - x1) - this.startAngleRad, true);\n            }\n            else if (options.point) {\n                // When the snap is set to true\n                shapeArgs = options.point.shapeArgs || {};\n                if (shapeArgs.start) {\n                    // Find a true value of the point based on the\n                    // angle\n                    value = this.chart.inverted ?\n                        this.translate(options.point.rectPlotY, true) :\n                        options.point.x;\n                }\n            }\n            end = this.getPosition(value);\n            x2 = end.x;\n            y2 = end.y;\n        }\n        else {\n            if (!defined(value)) {\n                x2 = options.chartX;\n                y2 = options.chartY;\n            }\n            if (defined(x2) && defined(y2)) {\n                // Calculate radius of non-circular axis' crosshair\n                y1 = center[1] + this.chart.plotTop;\n                value = this.translate(Math.min(Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)), center[2] / 2) - center[3] / 2, true);\n            }\n        }\n        return [value, x2 || 0, y2 || 0];\n    }\n    /**\n     * Get the path for the axis line. This method is also referenced in the\n     * getPlotLinePath method.\n     *\n     * @private\n     * @param {number} _lineWidth\n     * Line width is not used.\n     * @param {number} [radius]\n     * Radius of radial path.\n     * @param {number} [innerRadius]\n     * Inner radius of radial path.\n     */\n    function getLinePath(_lineWidth, radius, innerRadius) {\n        const center = this.pane.center, chart = this.chart, left = this.left || 0, top = this.top || 0;\n        let end, r = pick(radius, center[2] / 2 - this.offset), path;\n        if (typeof innerRadius === 'undefined') {\n            innerRadius = this.horiz ? 0 : this.center && -this.center[3] / 2;\n        }\n        // In case when innerSize of pane is set, it must be included\n        if (innerRadius) {\n            r += innerRadius;\n        }\n        if (this.isCircular || typeof radius !== 'undefined') {\n            path = this.chart.renderer.symbols.arc(left + center[0], top + center[1], r, r, {\n                start: this.startAngleRad,\n                end: this.endAngleRad,\n                open: true,\n                innerR: 0\n            });\n            // Bounds used to position the plotLine label next to the line\n            // (#7117)\n            path.xBounds = [left + center[0]];\n            path.yBounds = [top + center[1] - r];\n        }\n        else {\n            end = this.postTranslate(this.angleRad, r);\n            path = [\n                [\n                    'M',\n                    this.center[0] + chart.plotLeft,\n                    this.center[1] + chart.plotTop\n                ],\n                ['L', end.x, end.y]\n            ];\n        }\n        return path;\n    }\n    /**\n     * Wrap the getOffset method to return zero offset for title or labels\n     * in a radial axis.\n     */\n    function getOffset() {\n        const axisProto = this.constructor.prototype;\n        // Call the Axis prototype method (the method we're in now is on the\n        // instance)\n        axisProto.getOffset.call(this);\n        // Title or label offsets are not counted\n        this.chart.axisOffset[this.side] = 0;\n    }\n    /**\n     * Find the path for plot bands along the radial axis.\n     *\n     * @private\n     */\n    function getPlotBandPath(from, to, options) {\n        const chart = this.chart, radiusToPixels = (radius) => {\n            if (typeof radius === 'string') {\n                let r = parseInt(radius, 10);\n                if (percentRegex.test(radius)) {\n                    r = (r * fullRadius) / 100;\n                }\n                return r;\n            }\n            return radius;\n        }, center = this.center, startAngleRad = this.startAngleRad, fullRadius = center[2] / 2, offset = Math.min(this.offset, 0), left = this.left || 0, top = this.top || 0, percentRegex = /%$/, isCircular = this.isCircular; // X axis in a polar chart\n        let start, end, angle, xOnPerimeter, open, path, outerRadius = pick(radiusToPixels(options.outerRadius), fullRadius), innerRadius = radiusToPixels(options.innerRadius), thickness = pick(radiusToPixels(options.thickness), 10);\n        // Polygonal plot bands\n        if (this.options.gridLineInterpolation === 'polygon') {\n            path = this.getPlotLinePath({ value: from }).concat(this.getPlotLinePath({ value: to, reverse: true }));\n            // Circular grid bands\n        }\n        else {\n            // Keep within bounds\n            from = Math.max(from, this.min);\n            to = Math.min(to, this.max);\n            const transFrom = this.translate(from), transTo = this.translate(to);\n            // Plot bands on Y axis (radial axis) - inner and outer\n            // radius depend on to and from\n            if (!isCircular) {\n                outerRadius = transFrom || 0;\n                innerRadius = transTo || 0;\n            }\n            // Handle full circle\n            if (options.shape === 'circle' || !isCircular) {\n                start = -Math.PI / 2;\n                end = Math.PI * 1.5;\n                open = true;\n            }\n            else {\n                start = startAngleRad + (transFrom || 0);\n                end = startAngleRad + (transTo || 0);\n            }\n            outerRadius -= offset; // #5283\n            thickness -= offset; // #5283\n            path = chart.renderer.symbols.arc(left + center[0], top + center[1], outerRadius, outerRadius, {\n                // Math is for reversed yAxis (#3606)\n                start: Math.min(start, end),\n                end: Math.max(start, end),\n                innerR: pick(innerRadius, outerRadius - thickness),\n                open,\n                borderRadius: options.borderRadius\n            });\n            // Provide positioning boxes for the label (#6406)\n            if (isCircular) {\n                angle = (end + start) / 2;\n                xOnPerimeter = (left +\n                    center[0] +\n                    (center[2] / 2) * Math.cos(angle));\n                path.xBounds = angle > -Math.PI / 2 && angle < Math.PI / 2 ?\n                    // Right hemisphere\n                    [xOnPerimeter, chart.plotWidth] :\n                    // Left hemisphere\n                    [0, xOnPerimeter];\n                path.yBounds = [\n                    top + center[1] + (center[2] / 2) * Math.sin(angle)\n                ];\n                // Shift up or down to get the label clear of the perimeter\n                path.yBounds[0] += ((angle > -Math.PI && angle < 0) ||\n                    (angle > Math.PI)) ? -10 : 10;\n            }\n        }\n        return path;\n    }\n    /**\n     * Find the path for plot lines perpendicular to the radial axis.\n     */\n    function getPlotLinePath(options) {\n        const center = this.pane.center, chart = this.chart, inverted = chart.inverted, reverse = options.reverse, background = this.pane.options.background ?\n            (this.pane.options.background[0] ||\n                this.pane.options.background) :\n            {}, innerRadius = background.innerRadius || '0%', outerRadius = background.outerRadius || '100%', x1 = center[0] + chart.plotLeft, y1 = center[1] + chart.plotTop, height = this.height, isCrosshair = options.isCrosshair, paneInnerR = center[3] / 2;\n        let value = options.value, innerRatio, distance, a, b, otherAxis, xy, tickPositions, crossPos, path;\n        const end = this.getPosition(value);\n        let x2 = end.x, y2 = end.y;\n        // Crosshair logic\n        if (isCrosshair) {\n            // Find crosshair's position and perform destructuring\n            // assignment\n            crossPos = this.getCrosshairPosition(options, x1, y1);\n            value = crossPos[0];\n            x2 = crossPos[1];\n            y2 = crossPos[2];\n        }\n        // Spokes\n        if (this.isCircular) {\n            distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n            a = (typeof innerRadius === 'string') ?\n                relativeLength(innerRadius, 1) :\n                (innerRadius / distance);\n            b = (typeof outerRadius === 'string') ?\n                relativeLength(outerRadius, 1) :\n                (outerRadius / distance);\n            // To ensure that gridlines won't be displayed in area\n            // defined by innerSize in case of custom radiuses of pane's\n            // background\n            if (center && paneInnerR) {\n                innerRatio = paneInnerR / distance;\n                if (a < innerRatio) {\n                    a = innerRatio;\n                }\n                if (b < innerRatio) {\n                    b = innerRatio;\n                }\n            }\n            path = [\n                ['M', x1 + a * (x2 - x1), y1 - a * (y1 - y2)],\n                ['L', x2 - (1 - b) * (x2 - x1), y2 + (1 - b) * (y1 - y2)]\n            ];\n            // Concentric circles\n        }\n        else {\n            // Pick the right values depending if it is grid line or\n            // crosshair\n            value = this.translate(value);\n            // This is required in case when xAxis is non-circular to\n            // prevent grid lines (or crosshairs, if enabled) from\n            // rendering above the center after they supposed to be\n            // displayed below the center point\n            if (value) {\n                if (value < 0 || value > height) {\n                    value = 0;\n                }\n            }\n            if (this.options.gridLineInterpolation === 'circle') {\n                // A value of 0 is in the center, so it won't be\n                // visible, but draw it anyway for update and animation\n                // (#2366)\n                path = this.getLinePath(0, value, paneInnerR);\n                // Concentric polygons\n            }\n            else {\n                path = [];\n                // Find the other axis (a circular one) in the same pane\n                chart[inverted ? 'yAxis' : 'xAxis'].forEach((a) => {\n                    if (a.pane === this.pane) {\n                        otherAxis = a;\n                    }\n                });\n                if (otherAxis) {\n                    tickPositions = otherAxis.tickPositions;\n                    if (otherAxis.autoConnect) {\n                        tickPositions =\n                            tickPositions.concat([tickPositions[0]]);\n                    }\n                    // Reverse the positions for concatenation of polygonal\n                    // plot bands\n                    if (reverse) {\n                        tickPositions = tickPositions.slice().reverse();\n                    }\n                    if (value) {\n                        value += paneInnerR;\n                    }\n                    for (let i = 0; i < tickPositions.length; i++) {\n                        xy = otherAxis.getPosition(tickPositions[i], value);\n                        path.push(i ? ['L', xy.x, xy.y] : ['M', xy.x, xy.y]);\n                    }\n                }\n            }\n        }\n        return path;\n    }\n    /**\n     * Returns the x, y coordinate of a point given by a value and a pixel\n     * distance from center.\n     *\n     * @private\n     * @param {number} value\n     * Point value.\n     * @param {number} [length]\n     * Distance from center.\n     */\n    function getPosition(value, length) {\n        const translatedVal = this.translate(value);\n        return this.postTranslate(this.isCircular ? translatedVal : this.angleRad, // #2848\n        // In case when translatedVal is negative, the 0 value must be\n        // used instead, in order to deal with lines and labels that\n        // fall out of the visible range near the center of a pane\n        pick(this.isCircular ?\n            length :\n            (translatedVal < 0 ? 0 : translatedVal), this.center[2] / 2) - this.offset);\n    }\n    /**\n     * Find the position for the axis title, by default inside the gauge.\n     */\n    function getTitlePosition() {\n        const center = this.center, chart = this.chart, titleOptions = this.options.title;\n        return {\n            x: chart.plotLeft + center[0] + (titleOptions.x || 0),\n            y: (chart.plotTop +\n                center[1] -\n                ({\n                    high: 0.5,\n                    middle: 0.25,\n                    low: 0\n                }[titleOptions.align] *\n                    center[2]) +\n                (titleOptions.y || 0))\n        };\n    }\n    /**\n     * Modify radial axis.\n     * @private\n     *\n     * @param {Highcharts.Axis} radialAxis\n     * Radial axis to modify.\n     */\n    function modify(axis) {\n        axis.beforeSetTickPositions = beforeSetTickPositions;\n        axis.createLabelCollector = createLabelCollector;\n        axis.getCrosshairPosition = getCrosshairPosition;\n        axis.getLinePath = getLinePath;\n        axis.getOffset = getOffset;\n        axis.getPlotBandPath = getPlotBandPath;\n        axis.getPlotLinePath = getPlotLinePath;\n        axis.getPosition = getPosition;\n        axis.getTitlePosition = getTitlePosition;\n        axis.postTranslate = postTranslate;\n        axis.setAxisSize = setAxisSize;\n        axis.setAxisTranslation = setAxisTranslation;\n        axis.setOptions = setOptions;\n    }\n    /**\n     * Modify radial axis as hidden.\n     * @private\n     *\n     * @param {Highcharts.Axis} radialAxis\n     * Radial axis to modify.\n     */\n    function modifyAsHidden(radialAxis) {\n        radialAxis.isHidden = true;\n        radialAxis.createLabelCollector = createLabelCollectorHidden;\n        radialAxis.getOffset = noop;\n        radialAxis.redraw = renderHidden;\n        radialAxis.render = renderHidden;\n        radialAxis.setScale = noop;\n        radialAxis.setCategories = noop;\n        radialAxis.setTitle = noop;\n    }\n    /**\n     * Finalize modification of axis instance with radial logic.\n     */\n    function onAxisAfterInit() {\n        const chart = this.chart, options = this.options, isHidden = chart.angular && this.isXAxis, pane = this.pane, paneOptions = pane && pane.options;\n        if (!isHidden && pane && (chart.angular || chart.polar)) {\n            const fullCircle = Math.PI * 2, \n            // Start and end angle options are given in degrees relative to\n            // top, while internal computations are in radians relative to\n            // right (like SVG).\n            start = (pick(paneOptions.startAngle, 0) - 90) * Math.PI / 180, end = (pick(paneOptions.endAngle, pick(paneOptions.startAngle, 0) + 360) - 90) * Math.PI / 180;\n            // Y axis in polar charts\n            this.angleRad = (options.angle || 0) * Math.PI / 180;\n            // Gauges\n            this.startAngleRad = start;\n            this.endAngleRad = end;\n            this.offset = options.offset || 0;\n            // Normalize Start and End to <0, 2*PI> range\n            // (in degrees: <0,360>)\n            let normalizedStart = (start % fullCircle + fullCircle) %\n                fullCircle, normalizedEnd = (end % fullCircle + fullCircle) % fullCircle;\n            // Move normalized angles to <-PI, PI> range (<-180, 180>)\n            // to match values returned by Math.atan2()\n            if (normalizedStart > Math.PI) {\n                normalizedStart -= fullCircle;\n            }\n            if (normalizedEnd > Math.PI) {\n                normalizedEnd -= fullCircle;\n            }\n            this.normalizedStartAngleRad = normalizedStart;\n            this.normalizedEndAngleRad = normalizedEnd;\n        }\n    }\n    /**\n     * Wrap auto label align to avoid setting axis-wide rotation on radial axes.\n     * (#4920)\n     */\n    function onAxisAutoLabelAlign(e) {\n        if (this.isRadial) {\n            e.align = void 0;\n            e.preventDefault();\n        }\n    }\n    /**\n     * Remove label collector function on axis remove/update.\n     */\n    function onAxisDestroy() {\n        if (this.chart &&\n            this.chart.labelCollectors) {\n            const index = (this.labelCollector ?\n                this.chart.labelCollectors.indexOf(this.labelCollector) :\n                -1);\n            if (index >= 0) {\n                this.chart.labelCollectors.splice(index, 1);\n            }\n        }\n    }\n    /**\n     * Modify axis instance with radial logic before common axis init.\n     */\n    function onAxisInit(e) {\n        const chart = this.chart, angular = chart.angular, polar = chart.polar, isX = this.isXAxis, coll = this.coll, isHidden = angular && isX, paneIndex = e.userOptions.pane || 0, pane = this.pane = chart.pane && chart.pane[paneIndex];\n        let isCircular;\n        // Prevent changes for colorAxis\n        if (coll === 'colorAxis') {\n            this.isRadial = false;\n            return;\n        }\n        // Before prototype.init\n        if (angular) {\n            if (isHidden) {\n                modifyAsHidden(this);\n            }\n            else {\n                modify(this);\n            }\n            isCircular = !isX;\n        }\n        else if (polar) {\n            modify(this);\n            // Check which axis is circular\n            isCircular = this.horiz;\n        }\n        // Disable certain features on angular and polar axes\n        if (angular || polar) {\n            this.isRadial = true;\n            if (!this.labelCollector) {\n                this.labelCollector = this.createLabelCollector();\n            }\n            if (this.labelCollector) {\n                // Prevent overlapping axis labels (#9761)\n                chart.labelCollectors.push(this.labelCollector);\n            }\n        }\n        else {\n            this.isRadial = false;\n        }\n        // A pointer back to this axis to borrow geometry\n        if (pane && isCircular) {\n            pane.axis = this;\n        }\n        this.isCircular = isCircular;\n    }\n    /**\n     * Prepare axis translation.\n     */\n    function onAxisInitialAxisTranslation() {\n        if (this.isRadial) {\n            this.beforeSetTickPositions();\n        }\n    }\n    /**\n     * Find the center position of the label based on the distance option.\n     */\n    function onTickAfterGetLabelPosition(e) {\n        const label = this.label;\n        if (!label) {\n            return;\n        }\n        const axis = this.axis, labelBBox = label.getBBox(), labelOptions = axis.options.labels, angle = ((axis.translate(this.pos) + axis.startAngleRad +\n            Math.PI / 2) / Math.PI * 180) % 360, correctAngle = Math.round(angle), labelYPosCorrection = !defined(labelOptions.y) ? -labelBBox.height * 0.3 : 0;\n        let optionsY = labelOptions.y, ret, centerSlot = 20, // 20 degrees to each side at the top and bottom\n        align = labelOptions.align, labelDir = 'end', // Direction of the label 'start' or 'end'\n        reducedAngle1 = correctAngle < 0 ?\n            correctAngle + 360 : correctAngle, reducedAngle2 = reducedAngle1, translateY = 0, translateX = 0;\n        if (axis.isRadial) { // Both X and Y axes in a polar chart\n            ret = axis.getPosition(this.pos, (axis.center[2] / 2) +\n                relativeLength(pick(labelOptions.distance, -25), axis.center[2] / 2, -axis.center[2] / 2));\n            // Automatically rotated\n            if (labelOptions.rotation === 'auto') {\n                label.attr({\n                    rotation: angle\n                });\n                // Vertically centered\n            }\n            else if (!defined(optionsY)) {\n                optionsY = (axis.chart.renderer.fontMetrics(label).b -\n                    labelBBox.height / 2);\n            }\n            // Automatic alignment\n            if (!defined(align)) {\n                if (axis.isCircular) { // Y axis\n                    if (labelBBox.width >\n                        axis.len * axis.tickInterval / (axis.max - axis.min)) { // #3506\n                        centerSlot = 0;\n                    }\n                    if (angle > centerSlot && angle < 180 - centerSlot) {\n                        align = 'left'; // Right hemisphere\n                    }\n                    else if (angle > 180 + centerSlot &&\n                        angle < 360 - centerSlot) {\n                        align = 'right'; // Left hemisphere\n                    }\n                    else {\n                        align = 'center'; // Top or bottom\n                    }\n                }\n                else {\n                    align = 'center';\n                }\n                label.attr({\n                    align: align\n                });\n            }\n            // Auto alignment for solid-gauges with two labels (#10635)\n            if (align === 'auto' &&\n                axis.tickPositions.length === 2 &&\n                axis.isCircular) {\n                // Angles reduced to 0 - 90 or 180 - 270\n                if (reducedAngle1 > 90 && reducedAngle1 < 180) {\n                    reducedAngle1 = 180 - reducedAngle1;\n                }\n                else if (reducedAngle1 > 270 && reducedAngle1 <= 360) {\n                    reducedAngle1 = 540 - reducedAngle1;\n                }\n                // Angles reduced to 0 - 180\n                if (reducedAngle2 > 180 && reducedAngle2 <= 360) {\n                    reducedAngle2 = 360 - reducedAngle2;\n                }\n                if ((axis.pane.options.startAngle === correctAngle) ||\n                    (axis.pane.options.startAngle === correctAngle + 360) ||\n                    (axis.pane.options.startAngle === correctAngle - 360)) {\n                    labelDir = 'start';\n                }\n                if ((correctAngle >= -90 && correctAngle <= 90) ||\n                    (correctAngle >= -360 && correctAngle <= -270) ||\n                    (correctAngle >= 270 && correctAngle <= 360)) {\n                    align = (labelDir === 'start') ? 'right' : 'left';\n                }\n                else {\n                    align = (labelDir === 'start') ? 'left' : 'right';\n                }\n                // For angles between (90 + n * 180) +- 20\n                if (reducedAngle2 > 70 && reducedAngle2 < 110) {\n                    align = 'center';\n                }\n                // Auto Y translation\n                if (reducedAngle1 < 15 ||\n                    (reducedAngle1 >= 180 && reducedAngle1 < 195)) {\n                    translateY = labelBBox.height * 0.3;\n                }\n                else if (reducedAngle1 >= 15 && reducedAngle1 <= 35) {\n                    translateY = labelDir === 'start' ?\n                        0 : labelBBox.height * 0.75;\n                }\n                else if (reducedAngle1 >= 195 && reducedAngle1 <= 215) {\n                    translateY = labelDir === 'start' ?\n                        labelBBox.height * 0.75 : 0;\n                }\n                else if (reducedAngle1 > 35 && reducedAngle1 <= 90) {\n                    translateY = labelDir === 'start' ?\n                        -labelBBox.height * 0.25 : labelBBox.height;\n                }\n                else if (reducedAngle1 > 215 && reducedAngle1 <= 270) {\n                    translateY = labelDir === 'start' ?\n                        labelBBox.height : -labelBBox.height * 0.25;\n                }\n                // Auto X translation\n                if (reducedAngle2 < 15) {\n                    translateX = labelDir === 'start' ?\n                        -labelBBox.height * 0.15 : labelBBox.height * 0.15;\n                }\n                else if (reducedAngle2 > 165 && reducedAngle2 <= 180) {\n                    translateX = labelDir === 'start' ?\n                        labelBBox.height * 0.15 : -labelBBox.height * 0.15;\n                }\n                label.attr({ align: align });\n                label.translate(translateX, translateY + labelYPosCorrection);\n            }\n            e.pos.x = ret.x + (labelOptions.x || 0);\n            e.pos.y = ret.y + (optionsY || 0);\n        }\n    }\n    /**\n     * Add special cases within the Tick class' methods for radial axes.\n     */\n    function onTickAfterGetPosition(e) {\n        if (this.axis.getPosition) {\n            extend(e.pos, this.axis.getPosition(this.pos));\n        }\n    }\n    /**\n     * Update default options for radial axes from setOptions method.\n     */\n    function onGlobalSetOptions({ options }) {\n        if (options.xAxis) {\n            merge(true, RadialAxis.radialDefaultOptions.circular, options.xAxis);\n        }\n        if (options.yAxis) {\n            merge(true, RadialAxis.radialDefaultOptions.radialGauge, options.yAxis);\n        }\n    }\n    /**\n     * Translate from intermediate plotX (angle), plotY (axis.len - radius)\n     * to final chart coordinates.\n     *\n     * @private\n     * @param {number} angle\n     * Translation angle.\n     * @param {number} radius\n     * Translation radius.\n     */\n    function postTranslate(angle, radius) {\n        const chart = this.chart, center = this.center;\n        angle = this.startAngleRad + angle;\n        return {\n            x: chart.plotLeft + center[0] + Math.cos(angle) * radius,\n            y: chart.plotTop + center[1] + Math.sin(angle) * radius\n        };\n    }\n    /**\n     * Prevent setting Y axis dirty.\n     */\n    function renderHidden() {\n        this.isDirty = false;\n    }\n    /**\n     * Override the setAxisSize method to use the arc's circumference as\n     * length. This allows tickPixelInterval to apply to pixel lengths along\n     * the perimeter.\n     * @private\n     */\n    function setAxisSize() {\n        const axisProto = this.constructor.prototype;\n        let center, start;\n        axisProto.setAxisSize.call(this);\n        if (this.isRadial) {\n            // Set the center array\n            this.pane.updateCenter(this);\n            // In case when the innerSize is set in a polar chart, the axis'\n            // center cannot be a reference to pane's center\n            center = this.center = this.pane.center.slice();\n            // The sector is used in Axis.translate to compute the\n            // translation of reversed axis points (#2570)\n            if (this.isCircular) {\n                this.sector = this.endAngleRad - this.startAngleRad;\n            }\n            else {\n                // When the pane's startAngle or the axis' angle is set then\n                // new x and y values for vertical axis' center must be\n                // calculated\n                start = this.postTranslate(this.angleRad, center[3] / 2);\n                center[0] = start.x - this.chart.plotLeft;\n                center[1] = start.y - this.chart.plotTop;\n            }\n            // Axis len is used to lay out the ticks\n            this.len = this.width = this.height =\n                (center[2] - center[3]) * pick(this.sector, 1) / 2;\n        }\n    }\n    /**\n     * Override setAxisTranslation by setting the translation to the\n     * difference in rotation. This allows the translate method to return\n     * angle for any given value.\n     *\n     * @private\n     */\n    function setAxisTranslation() {\n        const axisProto = this.constructor.prototype;\n        // Call uber method\n        axisProto.setAxisTranslation.call(this);\n        // Set transA and minPixelPadding\n        if (this.center) { // It's not defined the first time\n            if (this.isCircular) {\n                this.transA = (this.endAngleRad - this.startAngleRad) /\n                    ((this.max - this.min) || 1);\n            }\n            else {\n                // The transA here is the length of the axis, so in case\n                // of inner radius, the length must be decreased by it\n                this.transA = ((this.center[2] - this.center[3]) / 2) /\n                    ((this.max - this.min) || 1);\n            }\n            if (this.isXAxis) {\n                this.minPixelPadding = this.transA * this.minPointOffset;\n            }\n            else {\n                // This is a workaround for regression #2593, but categories\n                // still don't position correctly.\n                this.minPixelPadding = 0;\n            }\n        }\n    }\n    /**\n     * Merge and set options.\n     */\n    function setOptions(userOptions) {\n        const { coll } = this;\n        const { angular, inverted, polar } = this.chart;\n        let defaultPolarOptions = {};\n        if (angular) {\n            if (!this.isXAxis) {\n                defaultPolarOptions = merge(defaultOptions.yAxis, RadialAxis.radialDefaultOptions.radialGauge);\n            }\n        }\n        else if (polar) {\n            defaultPolarOptions = this.horiz ?\n                merge(defaultOptions.xAxis, RadialAxis.radialDefaultOptions.circular) :\n                merge(coll === 'xAxis' ?\n                    defaultOptions.xAxis :\n                    defaultOptions.yAxis, RadialAxis.radialDefaultOptions.radial);\n        }\n        if (inverted && coll === 'yAxis') {\n            defaultPolarOptions.stackLabels = isObject(defaultOptions.yAxis, true) ? defaultOptions.yAxis.stackLabels : {};\n            defaultPolarOptions.reversedStacks = true;\n        }\n        const options = this.options = merge(defaultPolarOptions, userOptions);\n        // Make sure the plotBands array is instantiated for each Axis\n        // (#2649)\n        if (!options.plotBands) {\n            options.plotBands = [];\n        }\n        fireEvent(this, 'afterSetOptions');\n    }\n    /**\n     * Wrap the getMarkPath function to return the path of the radial marker.\n     */\n    function wrapTickGetMarkPath(proceed, x, y, tickLength, tickWidth, horiz, renderer) {\n        const axis = this.axis;\n        let endPoint, ret;\n        if (axis.isRadial) {\n            endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);\n            ret = [\n                'M',\n                x,\n                y,\n                'L',\n                endPoint.x,\n                endPoint.y\n            ];\n        }\n        else {\n            ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);\n        }\n        return ret;\n    }\n    /* eslint-enable valid-jsdoc */\n})(RadialAxis || (RadialAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default RadialAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Core/Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport H from '../Core/Globals.js';\nconst { composed } = H;\nimport Series from '../Core/Series/Series.js';\nimport Pane from '../Extensions/Pane/Pane.js';\nimport RadialAxis from '../Core/Axis/RadialAxis.js';\nimport U from '../Core/Utilities.js';\nconst { addEvent, defined, find, isNumber, merge, pick, pushUnique, relativeLength, splat, uniqueKey, wrap } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction clipCircle(renderer, x, y, r, innerR) {\n    const id = uniqueKey(), clipPath = renderer.createElement('clipPath').attr({\n        id: id\n    }).add(renderer.defs), wrapper = innerR ?\n        renderer.arc(x, y, r, innerR, 0, 2 * Math.PI).add(clipPath) :\n        renderer.circle(x, y, r).add(clipPath);\n    wrapper.id = id;\n    wrapper.clipPath = clipPath;\n    return wrapper;\n}\n/**\n * Find correct align and vertical align based on an angle in polar chart\n * @private\n */\nfunction findAlignments(angle, options) {\n    let align, verticalAlign;\n    if (options.align === null) {\n        if (angle > 20 && angle < 160) {\n            align = 'left'; // Right hemisphere\n        }\n        else if (angle > 200 && angle < 340) {\n            align = 'right'; // Left hemisphere\n        }\n        else {\n            align = 'center'; // Top or bottom\n        }\n        options.align = align;\n    }\n    if (options.verticalAlign === null) {\n        if (angle < 45 || angle > 315) {\n            verticalAlign = 'bottom'; // Top part\n        }\n        else if (angle > 135 && angle < 225) {\n            verticalAlign = 'top'; // Bottom part\n        }\n        else {\n            verticalAlign = 'middle'; // Left or right\n        }\n        options.verticalAlign = verticalAlign;\n    }\n    return options;\n}\n/**\n * #6212 Calculate connectors for spline series in polar chart.\n * @private\n * @param {boolean} calculateNeighbours\n *        Check if connectors should be calculated for neighbour points as\n *        well allows short recurrence\n */\nfunction getConnectors(segment, index, calculateNeighbours, connectEnds) {\n    const smoothing = 1.5, denom = smoothing + 1, addedNumber = connectEnds ? 1 : 0;\n    let i, leftContX, leftContY, rightContX, rightContY, jointAngle;\n    // Calculate final index of points depending on the initial index value.\n    // Because of calculating neighbours, index may be outside segment\n    // array.\n    if (index >= 0 && index <= segment.length - 1) {\n        i = index;\n    }\n    else if (index < 0) {\n        i = segment.length - 1 + index;\n    }\n    else {\n        i = 0;\n    }\n    // 1 means control points midway between points, 2 means 1/3 from\n    // the point, 3 is 1/4 etc;\n    const prevPointInd = ((i - 1 < 0) ? segment.length - (1 + addedNumber) : i - 1), nextPointInd = (i + 1 > segment.length - 1) ? addedNumber : i + 1, previousPoint = segment[prevPointInd], nextPoint = segment[nextPointInd], previousX = previousPoint.plotX, previousY = previousPoint.plotY, nextX = nextPoint.plotX, nextY = nextPoint.plotY, plotX = segment[i].plotX, // Actual point\n    plotY = segment[i].plotY;\n    leftContX = (smoothing * plotX + previousX) / denom;\n    leftContY = (smoothing * plotY + previousY) / denom;\n    rightContX = (smoothing * plotX + nextX) / denom;\n    rightContY = (smoothing * plotY + nextY) / denom;\n    // Distance left control point\n    const dLControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2)), dRControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2)), leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX), rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);\n    jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);\n    // Ensure the right direction, jointAngle should be in the same quadrant\n    // as leftContAngle\n    if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {\n        jointAngle -= Math.PI;\n    }\n    // Find the corrected control points for a spline straight through the\n    // point\n    leftContX = plotX + Math.cos(jointAngle) * dLControlPoint;\n    leftContY = plotY + Math.sin(jointAngle) * dLControlPoint;\n    rightContX = plotX + Math.cos(Math.PI + jointAngle) * dRControlPoint;\n    rightContY = plotY + Math.sin(Math.PI + jointAngle) * dRControlPoint;\n    // Push current point's connectors into returned object\n    const ret = {\n        rightContX: rightContX,\n        rightContY: rightContY,\n        leftContX: leftContX,\n        leftContY: leftContY,\n        plotX: plotX,\n        plotY: plotY\n    };\n    // Calculate connectors for previous and next point and push them inside\n    // returned object\n    if (calculateNeighbours) {\n        ret.prevPointCont = getConnectors(segment, prevPointInd, false, connectEnds);\n    }\n    return ret;\n}\n/**\n *\n */\nfunction onChartAfterDrawChartBox() {\n    (this.pane || []).forEach((pane) => {\n        pane.render();\n    });\n}\n/**\n * If polar has polygonal grid lines, force start and endOnTick on radial axis\n * @private\n */\nfunction onChartAfterInit(event) {\n    const xAxis = event.args[0].xAxis, yAxis = event.args[0].yAxis, chart = event.args[0].chart;\n    if (xAxis && yAxis) {\n        if (yAxis.gridLineInterpolation === 'polygon') {\n            xAxis.startOnTick = true;\n            xAxis.endOnTick = true;\n        }\n        else if (xAxis.gridLineInterpolation === 'polygon' &&\n            chart.inverted) {\n            yAxis.startOnTick = true;\n            yAxis.endOnTick = true;\n        }\n    }\n}\n/**\n *\n */\nfunction onChartGetAxes() {\n    if (!this.pane) {\n        this.pane = [];\n    }\n    this.options.pane = splat(this.options.pane);\n    this.options.pane.forEach((paneOptions) => {\n        new Pane(// eslint-disable-line no-new\n        paneOptions, this);\n    }, this);\n}\n/**\n * Get selection dimensions\n * @private\n */\nfunction onPointerGetSelectionBox(event) {\n    const marker = event.args.marker, xAxis = this.chart.xAxis[0], yAxis = this.chart.yAxis[0], inverted = this.chart.inverted, radialAxis = inverted ? yAxis : xAxis, linearAxis = inverted ? xAxis : yAxis;\n    if (this.chart.polar) {\n        event.preventDefault();\n        const start = (marker.attr ? marker.attr('start') : marker.start) - radialAxis.startAngleRad, r = (marker.attr ? marker.attr('r') : marker.r), end = (marker.attr ? marker.attr('end') : marker.end) - radialAxis.startAngleRad, innerR = (marker.attr ? marker.attr('innerR') : marker.innerR);\n        event.result.x = start + radialAxis.pos;\n        event.result.width = end - start;\n        // `innerR` goes from pane's center but `toValue` computes values from\n        // top\n        event.result.y = linearAxis.len + linearAxis.pos - r;\n        event.result.height = r - innerR;\n    }\n}\n/**\n * Get attrs for Polar selection marker\n * @private\n */\nfunction onPointerGetSelectionMarkerAttrs(event) {\n    const chart = this.chart;\n    if (chart.polar && chart.hoverPane && chart.hoverPane.axis) {\n        event.preventDefault();\n        const center = chart.hoverPane.center, mouseDownX = chart.mouseDownX || 0, mouseDownY = chart.mouseDownY || 0, chartY = event.args.chartY, chartX = event.args.chartX, fullCircle = Math.PI * 2, startAngleRad = chart.hoverPane.axis.startAngleRad, endAngleRad = chart.hoverPane.axis.endAngleRad, linearAxis = chart.inverted ? chart.xAxis[0] : chart.yAxis[0], attrs = {};\n        let shapeType = 'arc';\n        attrs.x = center[0] + chart.plotLeft;\n        attrs.y = center[1] + chart.plotTop;\n        // Adjust the width of the selection marker\n        if (this.zoomHor) {\n            const paneRadRange = startAngleRad > 0 ?\n                endAngleRad - startAngleRad :\n                Math.abs(startAngleRad) + Math.abs(endAngleRad);\n            let startAngle = Math.atan2(mouseDownY - chart.plotTop - center[1], mouseDownX - chart.plotLeft - center[0]) - startAngleRad, endAngle = Math.atan2(chartY - chart.plotTop - center[1], chartX - chart.plotLeft - center[0]) - startAngleRad;\n            attrs.r = center[2] / 2;\n            attrs.innerR = center[3] / 2;\n            if (startAngle <= 0) {\n                startAngle += fullCircle;\n            }\n            if (endAngle <= 0) {\n                endAngle += fullCircle;\n            }\n            if (endAngle < startAngle) {\n                // Swapping angles\n                endAngle = [startAngle, startAngle = endAngle][0];\n            }\n            // If pane is not a full circle we need to let users zoom to the min\n            // We do this by swapping angles after pointer crosses\n            // middle angle (swapAngle) of the missing slice of the pane\n            if (paneRadRange < fullCircle) {\n                const swapAngle = endAngleRad + (fullCircle - paneRadRange) / 2;\n                if (startAngleRad + endAngle > swapAngle) {\n                    endAngle = startAngle;\n                    startAngle = startAngleRad <= 0 ? startAngleRad : 0;\n                }\n            }\n            const start = attrs.start =\n                Math.max(startAngle + startAngleRad, startAngleRad), end = attrs.end =\n                Math.min(endAngle + startAngleRad, endAngleRad);\n            // Adjust the selection shape for polygon grid lines\n            if (linearAxis.options.gridLineInterpolation === 'polygon') {\n                const radialAxis = chart.hoverPane.axis, min = start - radialAxis.startAngleRad + radialAxis.pos, max = end - start;\n                let path = linearAxis.getPlotLinePath({\n                    value: linearAxis.max\n                }), pathStart = radialAxis.toValue(min), pathEnd = radialAxis.toValue(min + max);\n                if (pathStart < radialAxis.getExtremes().min) {\n                    const { min, max } = radialAxis.getExtremes();\n                    pathStart = max - (min - pathStart);\n                }\n                if (pathEnd < radialAxis.getExtremes().min) {\n                    const { min, max } = radialAxis.getExtremes();\n                    pathEnd = max - (min - pathEnd);\n                }\n                if (pathEnd < pathStart) {\n                    // Swapping angles\n                    pathEnd = [pathStart, pathStart = pathEnd][0];\n                }\n                // Get trimmed path\n                path = trimPath(path, pathStart, pathEnd, radialAxis);\n                // Add center to the path\n                path.push([\n                    'L', center[0] + chart.plotLeft,\n                    chart.plotTop + center[1]\n                ]);\n                attrs.d = path;\n                shapeType = 'path';\n            }\n        }\n        // Adjust the height of the selection marker\n        if (this.zoomVert) {\n            const linearAxis = chart.inverted ? chart.xAxis[0] : chart.yAxis[0];\n            let innerR = Math.sqrt(Math.pow(mouseDownX - chart.plotLeft - center[0], 2) +\n                Math.pow(mouseDownY - chart.plotTop - center[1], 2)), r = Math.sqrt(Math.pow(chartX - chart.plotLeft - center[0], 2) +\n                Math.pow(chartY - chart.plotTop - center[1], 2));\n            if (r < innerR) {\n                // Swapping angles\n                innerR = [r, r = innerR][0];\n            }\n            if (r > center[2] / 2) {\n                r = center[2] / 2;\n            }\n            if (innerR < center[3] / 2) {\n                innerR = center[3] / 2;\n            }\n            if (!this.zoomHor) {\n                attrs.start = startAngleRad;\n                attrs.end = endAngleRad;\n            }\n            attrs.r = r;\n            attrs.innerR = innerR;\n            if (linearAxis.options.gridLineInterpolation === 'polygon') {\n                const end = linearAxis.toValue(linearAxis.len + linearAxis.pos - innerR), start = linearAxis.toValue(linearAxis.len + linearAxis.pos - r), path = linearAxis.getPlotLinePath({\n                    value: start\n                }).concat(linearAxis.getPlotLinePath({\n                    value: end,\n                    reverse: true\n                }));\n                attrs.d = path;\n                shapeType = 'path';\n            }\n        }\n        if (this.zoomHor &&\n            this.zoomVert &&\n            linearAxis.options.gridLineInterpolation === 'polygon') {\n            const radialAxis = chart.hoverPane.axis, start = attrs.start || 0, end = attrs.end || 0, min = start - radialAxis.startAngleRad + radialAxis.pos, max = end - start, pathStart = radialAxis.toValue(min), pathEnd = radialAxis.toValue(min + max);\n            // Trim path\n            if (attrs.d instanceof Array) {\n                let innerPath = attrs.d.slice(0, attrs.d.length / 2), outerPath = attrs.d.slice(attrs.d.length / 2, attrs.d.length);\n                outerPath = [...outerPath].reverse();\n                const radialAxis = chart.hoverPane.axis;\n                innerPath = trimPath(innerPath, pathStart, pathEnd, radialAxis);\n                outerPath = trimPath(outerPath, pathStart, pathEnd, radialAxis);\n                if (outerPath) {\n                    (outerPath[0][0]) = 'L';\n                }\n                outerPath = [...outerPath].reverse();\n                attrs.d = innerPath.concat(outerPath);\n                shapeType = 'path';\n            }\n        }\n        event.attrs = attrs;\n        event.shapeType = shapeType;\n    }\n}\n/**\n * @private\n */\nfunction onSeriesAfterInit() {\n    const chart = this.chart;\n    if (chart.polar) {\n        this.polar = new PolarAdditions(this);\n        // Add flags that identifies radial inverted series\n        if (chart.inverted) {\n            this.isRadialSeries = true;\n            if (this.is('column')) {\n                this.isRadialBar = true;\n            }\n        }\n    }\n}\n/**\n * Extend translate. The plotX and plotY values are computed as if the polar\n * chart were a cartesian plane, where plotX denotes the angle in radians\n * and (yAxis.len - plotY) is the pixel distance from center.\n * @private\n */\nfunction onSeriesAfterTranslate() {\n    if (this.chart.polar && this.xAxis) {\n        const series = this, { xAxis, yAxis } = series, chart = series.chart;\n        // Prepare k-d-tree handling. It searches by angle (clientX) in\n        // case of shared tooltip, and by two dimensional distance in case\n        // of non-shared.\n        series.kdByAngle = chart.tooltip && chart.tooltip.shared;\n        if (series.kdByAngle || chart.inverted) {\n            series.searchPoint = searchPointByAngleOrInverted;\n        }\n        else {\n            series.options.findNearestPointBy = 'xy';\n        }\n        const points = series.points;\n        let i = points.length;\n        while (i--) {\n            // Translate plotX, plotY from angle and radius to true plot\n            // coordinates\n            if (!series.is('column') && !series.is('columnrange')) {\n                series.polar.toXY(points[i]);\n            }\n            // Treat points below Y axis min as null (#10082)\n            if (!chart.hasParallelCoordinates &&\n                !series.yAxis.reversed) {\n                if (pick(points[i].y, Number.MIN_VALUE) < yAxis.min ||\n                    points[i].x < xAxis.min ||\n                    points[i].x > xAxis.max) {\n                    // Destroy markers\n                    points[i].isNull = true;\n                    // Destroy column's graphic\n                    points[i].plotY = NaN;\n                }\n                else {\n                    // Restore isNull flag\n                    points[i].isNull =\n                        points[i].isValid && !points[i].isValid();\n                }\n            }\n        }\n        // Perform clip after render\n        if (!this.hasClipCircleSetter) {\n            this.hasClipCircleSetter = !!series.eventsToUnbind.push(addEvent(series, 'afterRender', function () {\n                let circ;\n                if (chart.polar && this.options.clip !== false) {\n                    // For clipping purposes there is a need for\n                    // coordinates from the absolute center\n                    circ = this.yAxis.pane.center;\n                    if (!this.clipCircle) {\n                        this.clipCircle = clipCircle(chart.renderer, circ[0], circ[1], circ[2] / 2, circ[3] / 2);\n                    }\n                    else {\n                        this.clipCircle.animate({\n                            x: circ[0],\n                            y: circ[1],\n                            r: circ[2] / 2,\n                            innerR: circ[3] / 2\n                        });\n                    }\n                    this.group.clip(this.clipCircle);\n                    this.setClip = H.noop;\n                }\n            }));\n        }\n    }\n}\n/**\n * Search a k-d tree by the point angle (used for shared tooltips in polar) or\n * the inverted point.\n * charts\n * @private\n */\nfunction searchPointByAngleOrInverted(e) {\n    const series = this, chart = series.chart, xAxis = series.xAxis, yAxis = series.yAxis, center = xAxis.pane && xAxis.pane.center, plotX = e.chartX - (center && center[0] || 0) - chart.plotLeft, plotY = e.chartY - (center && center[1] || 0) - chart.plotTop;\n    const searchKDTreePoint = chart.inverted ? {\n        clientX: e.chartX - yAxis.pos,\n        plotY: e.chartY - xAxis.pos\n    } : {\n        clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))\n    };\n    return series.searchKDTree(searchKDTreePoint);\n}\n/**\n * Trim polygonal path\n * @private\n */\nfunction trimPath(path, start, end, radialAxis) {\n    const tickInterval = radialAxis.tickInterval, ticks = radialAxis.tickPositions;\n    let lastTick = find(ticks, (tick) => tick >= end), firstTick = find([...ticks].reverse(), (tick) => tick <= start);\n    if (!defined(lastTick)) {\n        lastTick = ticks[ticks.length - 1];\n    }\n    if (!defined(firstTick)) {\n        firstTick = ticks[0];\n        lastTick += tickInterval;\n        path[0][0] = 'L';\n        // To do: figure out why -3 or -2\n        path.unshift(path[path.length - 3]);\n    }\n    path = path.slice(ticks.indexOf(firstTick), ticks.indexOf(lastTick) + 1);\n    path[0][0] = 'M';\n    return path;\n}\n/**\n * Extend chart.get to also search in panes. Used internally in\n * responsiveness and chart.update.\n * @private\n */\nfunction wrapChartGet(proceed, id) {\n    return find(this.pane || [], (pane) => (\n    // @todo remove id or define id type:\n    pane.options.id === id)) || proceed.call(this, id);\n}\n/**\n * Align column data labels outside the columns. #1199.\n * @private\n */\nfunction wrapColumnSeriesAlignDataLabel(proceed, point, dataLabel, options, alignTo, isNew) {\n    const chart = this.chart, inside = pick(options.inside, !!this.options.stacking);\n    let angle, shapeArgs, labelPos;\n    if (chart.polar) {\n        angle = point.rectPlotX / Math.PI * 180;\n        if (!chart.inverted) {\n            // Align nicely outside the perimeter of the columns\n            options = findAlignments(angle, options);\n        }\n        else { // Required corrections for data labels of inverted bars\n            // The plotX and plotY are correctly set therefore they\n            // don't need to be swapped (inverted argument is false)\n            this.forceDL = chart.isInsidePlot(point.plotX, point.plotY);\n            // Checks if labels should be positioned inside\n            if (inside && point.shapeArgs) {\n                shapeArgs = point.shapeArgs;\n                // Calculates pixel positions for a data label to be\n                // inside\n                labelPos =\n                    this.yAxis.postTranslate(\n                    // Angle\n                    ((shapeArgs.start || 0) + (shapeArgs.end || 0)) / 2 -\n                        this\n                            .xAxis.startAngleRad, \n                    // Radius\n                    point.barX +\n                        point.pointWidth / 2);\n                alignTo = merge(alignTo, {\n                    x: labelPos.x - chart.plotLeft,\n                    y: labelPos.y - chart.plotTop\n                });\n            }\n            else if (point.tooltipPos) {\n                alignTo = merge(alignTo, {\n                    x: point.tooltipPos[0],\n                    y: point.tooltipPos[1]\n                });\n            }\n            options.align = pick(options.align, 'center');\n            options.verticalAlign =\n                pick(options.verticalAlign, 'middle');\n        }\n        Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n        // Hide label of a point (only inverted) that is outside the\n        // visible y range\n        if (this.isRadialBar && point.shapeArgs &&\n            point.shapeArgs.start === point.shapeArgs.end) {\n            dataLabel.hide();\n        }\n        else {\n            dataLabel.show();\n        }\n    }\n    else {\n        proceed.call(this, point, dataLabel, options, alignTo, isNew);\n    }\n}\n/**\n * Extend the column prototype's translate method\n * @private\n */\nfunction onAfterColumnTranslate() {\n    const series = this, options = series.options, stacking = options.stacking, chart = series.chart, xAxis = series.xAxis, yAxis = series.yAxis, reversed = yAxis.reversed, center = yAxis.center, startAngleRad = xAxis.startAngleRad, endAngleRad = xAxis.endAngleRad, visibleRange = endAngleRad - startAngleRad;\n    let threshold = options.threshold, thresholdAngleRad = 0, points, point, i, yMin, yMax, start = 0, end = 0, tooltipPos, pointX, pointY, stackValues, stack, barX, innerR, r;\n    // Postprocess plot coordinates\n    if (xAxis.isRadial) {\n        points = series.points;\n        i = points.length;\n        yMin = yAxis.translate(yAxis.min);\n        yMax = yAxis.translate(yAxis.max);\n        threshold = options.threshold || 0;\n        if (chart.inverted) {\n            // Finding a correct threshold\n            if (isNumber(threshold)) {\n                thresholdAngleRad = yAxis.translate(threshold);\n                // Checks if threshold is outside the visible range\n                if (defined(thresholdAngleRad)) {\n                    if (thresholdAngleRad < 0) {\n                        thresholdAngleRad = 0;\n                    }\n                    else if (thresholdAngleRad > visibleRange) {\n                        thresholdAngleRad = visibleRange;\n                    }\n                    // Adding start angle offset\n                    series.translatedThreshold =\n                        thresholdAngleRad + startAngleRad;\n                }\n            }\n        }\n        while (i--) {\n            point = points[i];\n            barX = point.barX;\n            pointX = point.x;\n            pointY = point.y;\n            point.shapeType = 'arc';\n            if (chart.inverted) {\n                point.plotY = yAxis.translate(pointY);\n                if (stacking && yAxis.stacking) {\n                    stack = yAxis.stacking.stacks[(pointY < 0 ? '-' : '') +\n                        series.stackKey];\n                    if (series.visible && stack && stack[pointX]) {\n                        if (!point.isNull) {\n                            stackValues = stack[pointX].points[series.getStackIndicator(void 0, pointX, series.index).key];\n                            // Translating to radial values\n                            start = yAxis.translate(stackValues[0]);\n                            end = yAxis.translate(stackValues[1]);\n                            // If starting point is beyond the\n                            // range, set it to 0\n                            if (defined(start)) {\n                                start = U.clamp(start, 0, visibleRange);\n                            }\n                        }\n                    }\n                }\n                else {\n                    // Initial start and end angles for radial bar\n                    start = thresholdAngleRad;\n                    end = point.plotY;\n                }\n                if (start > end) {\n                    // Swapping start and end\n                    end = [start, start = end][0];\n                }\n                // Prevent from rendering point outside the\n                // acceptable circular range\n                if (!reversed) {\n                    if (start < yMin) {\n                        start = yMin;\n                    }\n                    else if (end > yMax) {\n                        end = yMax;\n                    }\n                    else if (end < yMin || start > yMax) {\n                        start = end = 0;\n                    }\n                }\n                else {\n                    if (end > yMin) {\n                        end = yMin;\n                    }\n                    else if (start < yMax) {\n                        start = yMax;\n                    }\n                    else if (start > yMin || end < yMax) {\n                        start = end = visibleRange;\n                    }\n                }\n                if (yAxis.min > yAxis.max) {\n                    start = end = reversed ? visibleRange : 0;\n                }\n                start += startAngleRad;\n                end += startAngleRad;\n                if (center) {\n                    point.barX = barX += center[3] / 2;\n                }\n                // In case when radius, inner radius or both are negative, a\n                // point is rendered but partially or as a center point\n                innerR = Math.max(barX, 0);\n                r = Math.max(barX + point.pointWidth, 0);\n                // Handle border radius\n                const brOption = options.borderRadius, brValue = typeof brOption === 'object' ?\n                    brOption.radius : brOption, borderRadius = relativeLength(brValue || 0, r - innerR);\n                point.shapeArgs = {\n                    x: center[0],\n                    y: center[1],\n                    r,\n                    innerR,\n                    start,\n                    end,\n                    borderRadius\n                };\n                // Fade out the points if not inside the polar \"plot area\"\n                point.opacity = start === end ? 0 : void 0;\n                // A correct value for stacked or not fully visible\n                // point\n                point.plotY = (defined(series.translatedThreshold) &&\n                    (start < series.translatedThreshold ? start : end)) -\n                    startAngleRad;\n                // Non-inverted polar columns\n            }\n            else {\n                start = barX + startAngleRad;\n                point.shapeArgs = series.polar.arc(point.yBottom, point.plotY, start, start + point.pointWidth);\n                // Disallow border radius on polar columns for now. It would\n                // take some refactoring to work with the `scope` and the\n                // `where` options. Those options would require that only\n                // individual corners be rounded, in practice individual calls\n                // to applyBorderRadius from the extended `arc` function. That\n                // would be a viable solution, though it would not be perfect\n                // until we implemented rounding that included the lower points\n                // in the stack, like we have for cartesian column.\n                point.shapeArgs.borderRadius = 0;\n            }\n            // Provided a correct coordinates for the tooltip\n            series.polar.toXY(point);\n            if (chart.inverted) {\n                tooltipPos = yAxis.postTranslate(point.rectPlotY, barX + point.pointWidth / 2);\n                point.tooltipPos = [\n                    tooltipPos.x - chart.plotLeft,\n                    tooltipPos.y - chart.plotTop\n                ];\n            }\n            else {\n                point.tooltipPos = [point.plotX, point.plotY];\n            }\n            if (center) {\n                point.ttBelow = point.plotY > center[1];\n            }\n        }\n    }\n}\n/**\n * Extend getSegmentPath to allow connecting ends across 0 to provide a\n * closed circle in line-like series.\n * @private\n */\nfunction wrapLineSeriesGetGraphPath(proceed, points) {\n    const series = this;\n    let firstValid, popLastPoint;\n    // Connect the path\n    if (this.chart.polar) {\n        points = points || this.points;\n        // Append first valid point in order to connect the ends\n        for (let i = 0; i < points.length; i++) {\n            if (!points[i].isNull) {\n                firstValid = i;\n                break;\n            }\n        }\n        /**\n         * Polar charts only. Whether to connect the ends of a line series\n         * plot across the extremes.\n         *\n         * @sample {highcharts} highcharts/plotoptions/line-connectends-false/\n         *         Do not connect\n         *\n         * @type      {boolean}\n         * @since     2.3.0\n         * @product   highcharts\n         * @apioption plotOptions.series.connectEnds\n         */\n        if (this.options.connectEnds !== false &&\n            typeof firstValid !== 'undefined') {\n            this.connectEnds = true; // Re-used in splines\n            points.splice(points.length, 0, points[firstValid]);\n            popLastPoint = true;\n        }\n        // For area charts, pseudo points are added to the graph, now we\n        // need to translate these\n        points.forEach((point) => {\n            if (typeof point.polarPlotY === 'undefined') {\n                series.polar.toXY(point);\n            }\n        });\n    }\n    // Run uber method\n    const ret = proceed.apply(this, [].slice.call(arguments, 1));\n    // #6212 points.splice method is adding points to an array. In case of\n    // areaspline getGraphPath method is used two times and in both times\n    // points are added to an array. That is why points.pop is used, to get\n    // unmodified points.\n    if (popLastPoint) {\n        points.pop();\n    }\n    return ret;\n}\n/**\n * Extend getCoordinates to prepare for polar axis values\n * @private\n */\nfunction wrapPointerGetCoordinates(proceed, e) {\n    const chart = this.chart;\n    let ret = {\n        xAxis: [],\n        yAxis: []\n    };\n    if (chart.polar) {\n        chart.axes.forEach((axis) => {\n            // Skip colorAxis\n            if (axis.coll === 'colorAxis') {\n                return;\n            }\n            const isXAxis = axis.isXAxis, center = axis.center, x = e.chartX - center[0] - chart.plotLeft, y = e.chartY - center[1] - chart.plotTop;\n            ret[isXAxis ? 'xAxis' : 'yAxis'].push({\n                axis: axis,\n                value: axis.translate(isXAxis ?\n                    Math.PI - Math.atan2(x, y) : // Angle\n                    // distance from center\n                    Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), true)\n            });\n        });\n    }\n    else {\n        ret = proceed.call(this, e);\n    }\n    return ret;\n}\n/**\n * Prevent zooming on mobile devices\n * @private\n */\nfunction wrapPointerPinch(proceed, e) {\n    if (this.chart.polar) {\n        return;\n    }\n    proceed.call(this, e);\n}\n/**\n * Define the animate method for regular series\n * @private\n */\nfunction wrapSeriesAnimate(proceed, init) {\n    const series = this, chart = this.chart, group = this.group, markerGroup = this.markerGroup, center = this.xAxis && this.xAxis.center, plotLeft = chart.plotLeft, plotTop = chart.plotTop;\n    let animation = this.options.animation, attribs, paneInnerR, graphic, shapeArgs, r, innerR;\n    // Specific animation for polar charts\n    if (chart.polar) {\n        if (series.isRadialBar) {\n            if (!init) {\n                // Run the pie animation for radial bars\n                series.startAngleRad = pick(series.translatedThreshold, series.xAxis.startAngleRad);\n                H.seriesTypes.pie.prototype.animate.call(series, init);\n            }\n        }\n        else {\n            animation = animObject(animation);\n            // A different animation needed for column like series\n            if (series.is('column')) {\n                if (!init) {\n                    paneInnerR = center[3] / 2;\n                    series.points.forEach((point) => {\n                        graphic = point.graphic;\n                        shapeArgs = point.shapeArgs;\n                        r = shapeArgs && shapeArgs.r;\n                        innerR = shapeArgs && shapeArgs.innerR;\n                        if (graphic && shapeArgs) {\n                            // Start values\n                            graphic.attr({\n                                r: paneInnerR,\n                                innerR: paneInnerR\n                            });\n                            // Animate\n                            graphic.animate({\n                                r: r,\n                                innerR: innerR\n                            }, series.options.animation);\n                        }\n                    });\n                }\n            }\n            else {\n                // Initialize the animation\n                if (init) {\n                    // Scale down the group and place it in the center\n                    attribs = {\n                        translateX: center[0] + plotLeft,\n                        translateY: center[1] + plotTop,\n                        scaleX: 0.001,\n                        scaleY: 0.001\n                    };\n                    group.attr(attribs);\n                    if (markerGroup) {\n                        markerGroup.attr(attribs);\n                    }\n                    // Run the animation\n                }\n                else {\n                    attribs = {\n                        translateX: plotLeft,\n                        translateY: plotTop,\n                        scaleX: 1,\n                        scaleY: 1\n                    };\n                    group.animate(attribs, animation);\n                    if (markerGroup) {\n                        markerGroup.animate(attribs, animation);\n                    }\n                }\n            }\n        }\n        // For non-polar charts, revert to the basic animation\n    }\n    else {\n        proceed.call(this, init);\n    }\n}\n/**\n * Overridden method for calculating a spline from one point to the next\n * @private\n */\nfunction wrapSplineSeriesGetPointSpline(proceed, segment, point, i) {\n    let ret, connectors;\n    if (this.chart.polar) {\n        // `moveTo` or `lineTo`\n        if (!i) {\n            ret = ['M', point.plotX, point.plotY];\n        }\n        else { // Curve from last point to this\n            connectors = getConnectors(segment, i, true, this.connectEnds);\n            const rightContX = connectors.prevPointCont &&\n                connectors.prevPointCont.rightContX;\n            const rightContY = connectors.prevPointCont &&\n                connectors.prevPointCont.rightContY;\n            ret = [\n                'C',\n                isNumber(rightContX) ? rightContX : connectors.plotX,\n                isNumber(rightContY) ? rightContY : connectors.plotY,\n                isNumber(connectors.leftContX) ?\n                    connectors.leftContX :\n                    connectors.plotX,\n                isNumber(connectors.leftContY) ?\n                    connectors.leftContY :\n                    connectors.plotY,\n                connectors.plotX,\n                connectors.plotY\n            ];\n        }\n    }\n    else {\n        ret = proceed.call(this, segment, point, i);\n    }\n    return ret;\n}\n/**\n * Extend the point pos method to calculate point positions for the polar chart.\n * @private\n */\nfunction wrapPointPos(proceed, chartCoordinates, plotY = this.plotY) {\n    if (!this.destroyed) {\n        const { plotX, series } = this, { chart } = series;\n        if (chart.polar &&\n            isNumber(plotX) &&\n            isNumber(plotY)) {\n            return [\n                plotX + (chartCoordinates ? chart.plotLeft : 0),\n                plotY + (chartCoordinates ? chart.plotTop : 0)\n            ];\n        }\n        return proceed.call(this, chartCoordinates, plotY);\n    }\n}\n/* *\n *\n *  Class\n *\n * */\n/**\n * Extensions for polar charts. Additionally, much of the geometry required\n * for polar charts is gathered in RadialAxes.js.\n * @private\n */\nclass PolarAdditions {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    static compose(AxisClass, ChartClass, PointerClass, SeriesClass, TickClass, PointClass, AreaSplineRangeSeriesClass, ColumnSeriesClass, LineSeriesClass, SplineSeriesClass) {\n        Pane.compose(ChartClass, PointerClass);\n        RadialAxis.compose(AxisClass, TickClass);\n        if (pushUnique(composed, 'Polar')) {\n            const chartProto = ChartClass.prototype, pointProto = PointClass.prototype, pointerProto = PointerClass.prototype, seriesProto = SeriesClass.prototype;\n            addEvent(ChartClass, 'afterDrawChartBox', onChartAfterDrawChartBox);\n            addEvent(ChartClass, 'getAxes', onChartGetAxes);\n            addEvent(ChartClass, 'init', onChartAfterInit);\n            wrap(chartProto, 'get', wrapChartGet);\n            wrap(pointerProto, 'getCoordinates', wrapPointerGetCoordinates);\n            wrap(pointerProto, 'pinch', wrapPointerPinch);\n            addEvent(PointerClass, 'getSelectionMarkerAttrs', onPointerGetSelectionMarkerAttrs);\n            addEvent(PointerClass, 'getSelectionBox', onPointerGetSelectionBox);\n            addEvent(SeriesClass, 'afterInit', onSeriesAfterInit);\n            addEvent(SeriesClass, 'afterTranslate', onSeriesAfterTranslate, { order: 2 } // Run after translation of ||-coords\n            );\n            addEvent(SeriesClass, 'afterColumnTranslate', onAfterColumnTranslate, { order: 4 });\n            wrap(seriesProto, 'animate', wrapSeriesAnimate);\n            wrap(pointProto, 'pos', wrapPointPos);\n            if (ColumnSeriesClass) {\n                const columnProto = ColumnSeriesClass.prototype;\n                wrap(columnProto, 'alignDataLabel', wrapColumnSeriesAlignDataLabel);\n                wrap(columnProto, 'animate', wrapSeriesAnimate);\n            }\n            if (LineSeriesClass) {\n                const lineProto = LineSeriesClass.prototype;\n                wrap(lineProto, 'getGraphPath', wrapLineSeriesGetGraphPath);\n            }\n            if (SplineSeriesClass) {\n                const splineProto = SplineSeriesClass.prototype;\n                wrap(splineProto, 'getPointSpline', wrapSplineSeriesGetPointSpline);\n                if (AreaSplineRangeSeriesClass) {\n                    const areaSplineRangeProto = AreaSplineRangeSeriesClass.prototype;\n                    // #6430 Areasplinerange series use unwrapped getPointSpline\n                    // method, so we need to set this method again.\n                    areaSplineRangeProto.getPointSpline =\n                        splineProto.getPointSpline;\n                }\n            }\n        }\n    }\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(series) {\n        this.series = series;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    arc(low, high, start, end) {\n        const series = this.series, center = series.xAxis.center, len = series.yAxis.len, paneInnerR = center[3] / 2;\n        let r = len - high + paneInnerR, innerR = len - pick(low, len) + paneInnerR;\n        // Prevent columns from shooting through the pane's center\n        if (series.yAxis.reversed) {\n            if (r < 0) {\n                r = paneInnerR;\n            }\n            if (innerR < 0) {\n                innerR = paneInnerR;\n            }\n        }\n        // Return a new shapeArgs\n        return {\n            x: center[0],\n            y: center[1],\n            r: r,\n            innerR: innerR,\n            start: start,\n            end: end\n        };\n    }\n    /**\n     * Translate a point's plotX and plotY from the internal angle and radius\n     * measures to true plotX, plotY coordinates\n     * @private\n     */\n    toXY(point) {\n        const series = this.series, chart = series.chart, xAxis = series.xAxis, yAxis = series.yAxis, plotX = point.plotX, inverted = chart.inverted, pointY = point.y;\n        let plotY = point.plotY, radius = inverted ? plotX : yAxis.len - plotY, clientX;\n        // Corrected y position of inverted series other than column\n        if (inverted && series && !series.isRadialBar) {\n            point.plotY = plotY =\n                isNumber(pointY) ? yAxis.translate(pointY) : 0;\n        }\n        // Save rectangular plotX, plotY for later computation\n        point.rectPlotX = plotX;\n        point.rectPlotY = plotY;\n        if (yAxis.center) {\n            radius += yAxis.center[3] / 2;\n        }\n        // Find the polar plotX and plotY. Avoid setting plotX and plotY to NaN\n        // when plotY is undefined (#15438)\n        if (isNumber(plotY)) {\n            const xy = inverted ? yAxis.postTranslate(plotY, radius) :\n                xAxis.postTranslate(plotX, radius);\n            point.plotX = point.polarPlotX = xy.x - chart.plotLeft;\n            point.plotY = point.polarPlotY = xy.y - chart.plotTop;\n        }\n        // If shared tooltip, record the angle in degrees in order to align X\n        // points. Otherwise, use a standard k-d tree to get the nearest point\n        // in two dimensions.\n        if (series.kdByAngle) {\n            clientX = ((plotX / Math.PI * 180) + xAxis.pane.options.startAngle) % 360;\n            if (clientX < 0) { // #2665\n                clientX += 360;\n            }\n            point.clientX = clientX;\n        }\n        else {\n            point.clientX = point.plotX;\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default PolarAdditions;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../Globals.js';\nconst { composed } = H;\nimport StackItem from './Stacking/StackItem.js';\nimport U from '../Utilities.js';\nconst { addEvent, objectEach, pushUnique } = U;\n/* *\n *\n *  Namespace\n *\n * */\nvar WaterfallAxis;\n(function (WaterfallAxis) {\n    /* *\n     *\n     *  Interfaces\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    function compose(AxisClass, ChartClass) {\n        if (pushUnique(composed, 'Axis.Waterfall')) {\n            addEvent(AxisClass, 'init', onAxisInit);\n            addEvent(AxisClass, 'afterBuildStacks', onAxisAfterBuildStacks);\n            addEvent(AxisClass, 'afterRender', onAxisAfterRender);\n            addEvent(ChartClass, 'beforeRedraw', onChartBeforeRedraw);\n        }\n    }\n    WaterfallAxis.compose = compose;\n    /**\n     * @private\n     */\n    function onAxisAfterBuildStacks() {\n        const axis = this, stacks = axis.waterfall.stacks;\n        if (stacks) {\n            stacks.changed = false;\n            delete stacks.alreadyChanged;\n        }\n    }\n    /**\n     * @private\n     */\n    function onAxisAfterRender() {\n        const axis = this, stackLabelOptions = axis.options.stackLabels;\n        if (stackLabelOptions && stackLabelOptions.enabled &&\n            axis.waterfall.stacks) {\n            axis.waterfall.renderStackTotals();\n        }\n    }\n    /**\n     * @private\n     */\n    function onAxisInit() {\n        const axis = this;\n        if (!axis.waterfall) {\n            axis.waterfall = new Composition(axis);\n        }\n    }\n    /**\n     * @private\n     */\n    function onChartBeforeRedraw() {\n        const axes = this.axes, series = this.series;\n        for (const serie of series) {\n            if (serie.options.stacking) {\n                for (const axis of axes) {\n                    if (!axis.isXAxis) {\n                        axis.waterfall.stacks.changed = true;\n                    }\n                }\n                break;\n            }\n        }\n    }\n    /* *\n     *\n     *  Classes\n     *\n     * */\n    class Composition {\n        /* *\n         *\n         *  Constructors\n         *\n         * */\n        constructor(axis) {\n            this.axis = axis;\n            this.stacks = {\n                changed: false\n            };\n        }\n        /* *\n         *\n         *  Functions\n         *\n         * */\n        /**\n         * Calls StackItem.prototype.render function that creates and renders\n         * stack total label for each waterfall stack item.\n         *\n         * @private\n         * @function Highcharts.Axis#renderWaterfallStackTotals\n         */\n        renderStackTotals() {\n            const yAxis = this.axis, waterfallStacks = yAxis.waterfall.stacks, stackTotalGroup = (yAxis.stacking && yAxis.stacking.stackTotalGroup), dummyStackItem = new StackItem(yAxis, yAxis.options.stackLabels || {}, false, 0, void 0);\n            this.dummyStackItem = dummyStackItem;\n            // Render each waterfall stack total\n            if (stackTotalGroup) {\n                objectEach(waterfallStacks, (type) => {\n                    objectEach(type, (stackItem, key) => {\n                        dummyStackItem.total = stackItem.stackTotal;\n                        dummyStackItem.x = +key;\n                        if (stackItem.label) {\n                            dummyStackItem.label = stackItem.label;\n                        }\n                        StackItem.prototype.render.call(dummyStackItem, stackTotalGroup);\n                        stackItem.label = dummyStackItem.label;\n                        delete dummyStackItem.label;\n                    });\n                });\n            }\n            dummyStackItem.total = null;\n        }\n    }\n    WaterfallAxis.Composition = Composition;\n})(WaterfallAxis || (WaterfallAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default WaterfallAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\nimport ColumnSeries from '../Column/ColumnSeries.js';\nimport Point from '../../Core/Series/Point.js';\nimport U from '../../Core/Utilities.js';\nconst { isNumber } = U;\n/* *\n *\n *  Class\n *\n * */\nclass WaterfallPoint extends ColumnSeries.prototype.pointClass {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    getClassName() {\n        let className = Point.prototype.getClassName.call(this);\n        if (this.isSum) {\n            className += ' highcharts-sum';\n        }\n        else if (this.isIntermediateSum) {\n            className += ' highcharts-intermediate-sum';\n        }\n        return className;\n    }\n    // Pass the null test in ColumnSeries.translate.\n    isValid() {\n        return (isNumber(this.y) ||\n            this.isSum ||\n            Boolean(this.isIntermediateSum));\n    }\n}\n/* *\n *\n *  Export\n *\n * */\nexport default WaterfallPoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { column: ColumnSeries, line: LineSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, arrayMax, arrayMin, correctFloat, crisp, extend, isNumber, merge, objectEach, pick } = U;\nimport WaterfallAxis from '../../Core/Axis/WaterfallAxis.js';\nimport WaterfallPoint from './WaterfallPoint.js';\nimport WaterfallSeriesDefaults from './WaterfallSeriesDefaults.js';\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Returns true if the key is a direct property of the object.\n * @private\n * @param {*} obj\n * Object with property to test\n * @param {string} key\n * Property key to test\n * @return {boolean}\n * Whether it is a direct property\n */\nfunction ownProp(obj, key) {\n    return Object.hasOwnProperty.call(obj, key);\n}\n/* *\n *\n *  Class\n *\n * */\n/**\n * Waterfall series type.\n *\n * @private\n */\nclass WaterfallSeries extends ColumnSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    // After generating points, set y-values for all sums.\n    generatePoints() {\n        // Parent call:\n        ColumnSeries.prototype.generatePoints.apply(this);\n        for (let i = 0, len = this.points.length; i < len; i++) {\n            const point = this.points[i], y = this.processedYData[i];\n            // Override point value for sums. #3710 Update point does not\n            // propagate to sum\n            if (isNumber(y) && (point.isIntermediateSum || point.isSum)) {\n                point.y = correctFloat(y);\n            }\n        }\n    }\n    // Call default processData then override yData to reflect waterfall's\n    // extremes on yAxis\n    processData(force) {\n        const series = this, options = series.options, yData = series.yData, \n        // #3710 Update point does not propagate to sum\n        points = options.data, dataLength = yData.length, threshold = options.threshold || 0;\n        let point, subSum, sum, dataMin, dataMax, y;\n        sum = subSum = dataMin = dataMax = 0;\n        for (let i = 0; i < dataLength; i++) {\n            y = yData[i];\n            point = points && points[i] ? points[i] : {};\n            if (y === 'sum' || point.isSum) {\n                yData[i] = correctFloat(sum);\n            }\n            else if (y === 'intermediateSum' ||\n                point.isIntermediateSum) {\n                yData[i] = correctFloat(subSum);\n                subSum = 0;\n            }\n            else {\n                sum += y;\n                subSum += y;\n            }\n            dataMin = Math.min(sum, dataMin);\n            dataMax = Math.max(sum, dataMax);\n        }\n        super.processData.call(this, force);\n        // Record extremes only if stacking was not set:\n        if (!options.stacking) {\n            series.dataMin = dataMin + threshold;\n            series.dataMax = dataMax;\n        }\n        return;\n    }\n    // Return y value or string if point is sum\n    toYData(pt) {\n        if (pt.isSum) {\n            return 'sum';\n        }\n        if (pt.isIntermediateSum) {\n            return 'intermediateSum';\n        }\n        return pt.y;\n    }\n    updateParallelArrays(point, i) {\n        super.updateParallelArrays.call(this, point, i);\n        // Prevent initial sums from triggering an error (#3245, #7559)\n        if (this.yData[0] === 'sum' || this.yData[0] === 'intermediateSum') {\n            this.yData[0] = null;\n        }\n    }\n    // Postprocess mapping between options and SVG attributes\n    pointAttribs(point, state) {\n        const upColor = this.options.upColor;\n        // Set or reset up color (#3710, update to negative)\n        if (upColor && !point.options.color && isNumber(point.y)) {\n            point.color = point.y > 0 ? upColor : void 0;\n        }\n        const attr = ColumnSeries.prototype.pointAttribs.call(this, point, state);\n        // The dashStyle option in waterfall applies to the graph, not\n        // the points\n        delete attr.dashstyle;\n        return attr;\n    }\n    // Return an empty path initially, because we need to know the stroke-width\n    // in order to set the final path.\n    getGraphPath() {\n        return [['M', 0, 0]];\n    }\n    // Draw columns' connector lines\n    getCrispPath() {\n        const // Skip points where Y is not a number (#18636)\n        data = this.data.filter((d) => isNumber(d.y)), yAxis = this.yAxis, length = data.length, graphLineWidth = this.graph?.strokeWidth() || 0, reversedXAxis = this.xAxis.reversed, reversedYAxis = this.yAxis.reversed, stacking = this.options.stacking, path = [];\n        for (let i = 1; i < length; i++) {\n            if (!( // Skip lines that would pass over the null point (#18636)\n            this.options.connectNulls ||\n                isNumber(this.data[data[i].index - 1].y))) {\n                continue;\n            }\n            const box = data[i].box, prevPoint = data[i - 1], prevY = prevPoint.y || 0, prevBox = data[i - 1].box;\n            if (!box || !prevBox) {\n                continue;\n            }\n            const prevStack = yAxis.waterfall.stacks[this.stackKey], isPos = prevY > 0 ? -prevBox.height : 0;\n            if (prevStack && prevBox && box) {\n                const prevStackX = prevStack[i - 1];\n                // Y position of the connector is different when series are\n                // stacked, yAxis is reversed and it also depends on point's\n                // value\n                let yPos;\n                if (stacking) {\n                    const connectorThreshold = prevStackX.connectorThreshold;\n                    yPos = crisp(yAxis.translate(connectorThreshold, false, true, false, true) +\n                        (reversedYAxis ? isPos : 0), graphLineWidth);\n                }\n                else {\n                    yPos = crisp(prevBox.y + (prevPoint.minPointLengthOffset || 0), graphLineWidth);\n                }\n                path.push([\n                    'M',\n                    (prevBox.x || 0) + (reversedXAxis ?\n                        0 :\n                        (prevBox.width || 0)),\n                    yPos\n                ], [\n                    'L',\n                    (box.x || 0) + (reversedXAxis ?\n                        (box.width || 0) :\n                        0),\n                    yPos\n                ]);\n            }\n            if (prevBox &&\n                path.length &&\n                ((!stacking && prevY < 0 && !reversedYAxis) ||\n                    (prevY > 0 && reversedYAxis))) {\n                const nextLast = path[path.length - 2];\n                if (nextLast && typeof nextLast[2] === 'number') {\n                    nextLast[2] += prevBox.height || 0;\n                }\n                const last = path[path.length - 1];\n                if (last && typeof last[2] === 'number') {\n                    last[2] += prevBox.height || 0;\n                }\n            }\n        }\n        return path;\n    }\n    // The graph is initially drawn with an empty definition, then updated with\n    // crisp rendering.\n    drawGraph() {\n        LineSeries.prototype.drawGraph.call(this);\n        if (this.graph) {\n            this.graph.attr({\n                d: this.getCrispPath()\n            });\n        }\n    }\n    // Waterfall has stacking along the x-values too.\n    setStackedPoints(axis) {\n        const series = this, options = series.options, waterfallStacks = axis.waterfall?.stacks, seriesThreshold = options.threshold || 0, stackKey = series.stackKey, xData = series.xData, xLength = xData.length;\n        let stackThreshold = seriesThreshold, interSum = stackThreshold, actualStackX, totalYVal = 0, actualSum = 0, prevSum = 0, statesLen, posTotal, negTotal, xPoint, yVal, x, alreadyChanged, changed;\n        // Function responsible for calculating correct values for stackState\n        // array of each stack item. The arguments are: firstS - the value for\n        // the first state, nextS - the difference between the previous and the\n        // newest state, sInx - counter used in the for that updates each state\n        // when necessary, sOff - offset that must be added to each state when\n        // they need to be updated (if point isn't a total sum)\n        // eslint-disable-next-line require-jsdoc\n        const calculateStackState = (firstS, nextS, sInx, sOff) => {\n            if (actualStackX) {\n                if (!statesLen) {\n                    actualStackX.stackState[0] = firstS;\n                    statesLen = actualStackX.stackState.length;\n                }\n                else {\n                    for (sInx; sInx < statesLen; sInx++) {\n                        actualStackX.stackState[sInx] += sOff;\n                    }\n                }\n                actualStackX.stackState.push(actualStackX.stackState[statesLen - 1] + nextS);\n            }\n        };\n        if (axis.stacking && waterfallStacks) {\n            // Code responsible for creating stacks for waterfall series\n            if (series.reserveSpace()) {\n                changed = waterfallStacks.changed;\n                alreadyChanged = waterfallStacks.alreadyChanged;\n                // In case of a redraw, stack for each x value must be emptied\n                // (only for the first series in a specific stack) and\n                // recalculated once more\n                if (alreadyChanged &&\n                    alreadyChanged.indexOf(stackKey) < 0) {\n                    changed = true;\n                }\n                if (!waterfallStacks[stackKey]) {\n                    waterfallStacks[stackKey] = {};\n                }\n                const actualStack = waterfallStacks[stackKey];\n                if (actualStack) {\n                    for (let i = 0; i < xLength; i++) {\n                        x = xData[i];\n                        if (!actualStack[x] || changed) {\n                            actualStack[x] = {\n                                negTotal: 0,\n                                posTotal: 0,\n                                stackTotal: 0,\n                                threshold: 0,\n                                stateIndex: 0,\n                                stackState: [],\n                                label: ((changed &&\n                                    actualStack[x]) ?\n                                    actualStack[x].label :\n                                    void 0)\n                            };\n                        }\n                        actualStackX = actualStack[x];\n                        yVal = series.yData[i];\n                        if (yVal >= 0) {\n                            actualStackX.posTotal += yVal;\n                        }\n                        else {\n                            actualStackX.negTotal += yVal;\n                        }\n                        // Points do not exist yet, so raw data is used\n                        xPoint = options.data[i];\n                        posTotal = actualStackX.absolutePos =\n                            actualStackX.posTotal;\n                        negTotal = actualStackX.absoluteNeg =\n                            actualStackX.negTotal;\n                        actualStackX.stackTotal = posTotal + negTotal;\n                        statesLen = actualStackX.stackState.length;\n                        if (xPoint && xPoint.isIntermediateSum) {\n                            calculateStackState(prevSum, actualSum, 0, prevSum);\n                            prevSum = actualSum;\n                            actualSum = seriesThreshold;\n                            // Swapping values\n                            stackThreshold ^= interSum;\n                            interSum ^= stackThreshold;\n                            stackThreshold ^= interSum;\n                        }\n                        else if (xPoint && xPoint.isSum) {\n                            calculateStackState(seriesThreshold, totalYVal, statesLen, 0);\n                            stackThreshold = seriesThreshold;\n                        }\n                        else {\n                            calculateStackState(stackThreshold, yVal, 0, totalYVal);\n                            if (xPoint) {\n                                totalYVal += yVal;\n                                actualSum += yVal;\n                            }\n                        }\n                        actualStackX.stateIndex++;\n                        actualStackX.threshold = stackThreshold;\n                        stackThreshold += actualStackX.stackTotal;\n                    }\n                }\n                waterfallStacks.changed = false;\n                if (!waterfallStacks.alreadyChanged) {\n                    waterfallStacks.alreadyChanged = [];\n                }\n                waterfallStacks.alreadyChanged.push(stackKey);\n            }\n        }\n    }\n    // Extremes for a non-stacked series are recorded in processData.\n    // In case of stacking, use Series.stackedYData to calculate extremes.\n    getExtremes() {\n        const stacking = this.options.stacking;\n        let yAxis, waterfallStacks, stackedYNeg, stackedYPos;\n        if (stacking) {\n            yAxis = this.yAxis;\n            waterfallStacks = yAxis.waterfall.stacks;\n            stackedYNeg = this.stackedYNeg = [];\n            stackedYPos = this.stackedYPos = [];\n            // The visible y range can be different when stacking is set to\n            // overlap and different when it's set to normal\n            if (stacking === 'overlap') {\n                objectEach(waterfallStacks[this.stackKey], function (stackX) {\n                    stackedYNeg.push(arrayMin(stackX.stackState));\n                    stackedYPos.push(arrayMax(stackX.stackState));\n                });\n            }\n            else {\n                objectEach(waterfallStacks[this.stackKey], function (stackX) {\n                    stackedYNeg.push(stackX.negTotal + stackX.threshold);\n                    stackedYPos.push(stackX.posTotal + stackX.threshold);\n                });\n            }\n            return {\n                dataMin: arrayMin(stackedYNeg),\n                dataMax: arrayMax(stackedYPos)\n            };\n        }\n        // When not stacking, data extremes have already been computed in the\n        // processData function.\n        return {\n            dataMin: this.dataMin,\n            dataMax: this.dataMax\n        };\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nWaterfallSeries.defaultOptions = merge(ColumnSeries.defaultOptions, WaterfallSeriesDefaults);\nWaterfallSeries.compose = WaterfallAxis.compose;\nextend(WaterfallSeries.prototype, {\n    pointValKey: 'y',\n    // Property needed to prevent lines between the columns from disappearing\n    // when negativeColor is used.\n    showLine: true,\n    pointClass: WaterfallPoint\n});\n// Translate data points from raw values\naddEvent(WaterfallSeries, 'afterColumnTranslate', function () {\n    const series = this, { options, points, yAxis } = series, minPointLength = pick(options.minPointLength, 5), halfMinPointLength = minPointLength / 2, threshold = options.threshold || 0, stacking = options.stacking, actualStack = yAxis.waterfall.stacks[series.stackKey];\n    let previousIntermediate = threshold, previousY = threshold, y, total, yPos, hPos;\n    for (let i = 0; i < points.length; i++) {\n        const point = points[i], yValue = series.processedYData[i], shapeArgs = point.shapeArgs, box = extend({\n            x: 0,\n            y: 0,\n            width: 0,\n            height: 0\n        }, shapeArgs || {});\n        point.box = box;\n        const range = [0, yValue], pointY = point.y || 0;\n        // Code responsible for correct positions of stacked points\n        // starts here\n        if (stacking) {\n            if (actualStack) {\n                const actualStackX = actualStack[i];\n                if (stacking === 'overlap') {\n                    total =\n                        actualStackX.stackState[actualStackX.stateIndex--];\n                    y = pointY >= 0 ? total : total - pointY;\n                    if (ownProp(actualStackX, 'absolutePos')) {\n                        delete actualStackX.absolutePos;\n                    }\n                    if (ownProp(actualStackX, 'absoluteNeg')) {\n                        delete actualStackX.absoluteNeg;\n                    }\n                }\n                else {\n                    if (pointY >= 0) {\n                        total = actualStackX.threshold +\n                            actualStackX.posTotal;\n                        actualStackX.posTotal -= pointY;\n                        y = total;\n                    }\n                    else {\n                        total = actualStackX.threshold +\n                            actualStackX.negTotal;\n                        actualStackX.negTotal -= pointY;\n                        y = total - pointY;\n                    }\n                    if (!actualStackX.posTotal) {\n                        if (isNumber(actualStackX.absolutePos) &&\n                            ownProp(actualStackX, 'absolutePos')) {\n                            actualStackX.posTotal =\n                                actualStackX.absolutePos;\n                            delete actualStackX.absolutePos;\n                        }\n                    }\n                    if (!actualStackX.negTotal) {\n                        if (isNumber(actualStackX.absoluteNeg) &&\n                            ownProp(actualStackX, 'absoluteNeg')) {\n                            actualStackX.negTotal =\n                                actualStackX.absoluteNeg;\n                            delete actualStackX.absoluteNeg;\n                        }\n                    }\n                }\n                if (!point.isSum) {\n                    // The connectorThreshold property is later used in\n                    // getCrispPath function to draw a connector line in a\n                    // correct place\n                    actualStackX.connectorThreshold =\n                        actualStackX.threshold + actualStackX.stackTotal;\n                }\n                if (yAxis.reversed) {\n                    yPos = (pointY >= 0) ? (y - pointY) : (y + pointY);\n                    hPos = y;\n                }\n                else {\n                    yPos = y;\n                    hPos = y - pointY;\n                }\n                point.below = yPos <= threshold;\n                box.y = yAxis.translate(yPos, false, true, false, true);\n                box.height = Math.abs(box.y -\n                    yAxis.translate(hPos, false, true, false, true));\n                const dummyStackItem = yAxis.waterfall.dummyStackItem;\n                if (dummyStackItem) {\n                    dummyStackItem.x = i;\n                    dummyStackItem.label = actualStack[i].label;\n                    dummyStackItem.setOffset(series.pointXOffset || 0, series.barW || 0, series.stackedYNeg[i], series.stackedYPos[i], void 0, this.xAxis);\n                }\n            }\n        }\n        else {\n            // Up points\n            y = Math.max(previousY, previousY + pointY) + range[0];\n            box.y = yAxis.translate(y, false, true, false, true);\n            // Sum points\n            if (point.isSum) {\n                box.y = yAxis.translate(range[1], false, true, false, true);\n                box.height = Math.min(yAxis.translate(range[0], false, true, false, true), yAxis.len) - box.y; // #4256\n                point.below = range[1] <= threshold;\n            }\n            else if (point.isIntermediateSum) {\n                if (pointY >= 0) {\n                    yPos = range[1] + previousIntermediate;\n                    hPos = previousIntermediate;\n                }\n                else {\n                    yPos = previousIntermediate;\n                    hPos = range[1] + previousIntermediate;\n                }\n                if (yAxis.reversed) {\n                    // Swapping values\n                    yPos ^= hPos;\n                    hPos ^= yPos;\n                    yPos ^= hPos;\n                }\n                box.y = yAxis.translate(yPos, false, true, false, true);\n                box.height = Math.abs(box.y -\n                    Math.min(yAxis.translate(hPos, false, true, false, true), yAxis.len));\n                previousIntermediate += range[1];\n                point.below = yPos <= threshold;\n                // If it's not the sum point, update previous stack end position\n                // and get shape height (#3886)\n            }\n            else {\n                box.height = yValue > 0 ?\n                    yAxis.translate(previousY, false, true, false, true) - box.y :\n                    yAxis.translate(previousY, false, true, false, true) - yAxis.translate(previousY - yValue, false, true, false, true);\n                previousY += yValue;\n                point.below = previousY < threshold;\n            }\n            // #3952 Negative sum or intermediate sum not rendered correctly\n            if (box.height < 0) {\n                box.y += box.height;\n                box.height *= -1;\n            }\n        }\n        point.plotY = box.y;\n        point.yBottom = box.y + box.height;\n        if (box.height <= minPointLength && !point.isNull) {\n            box.height = minPointLength;\n            box.y -= halfMinPointLength;\n            point.yBottom = box.y + box.height;\n            point.plotY = box.y;\n            if (pointY < 0) {\n                point.minPointLengthOffset = -halfMinPointLength;\n            }\n            else {\n                point.minPointLengthOffset = halfMinPointLength;\n            }\n        }\n        else {\n            // #8024, empty gaps in the line for null data\n            if (point.isNull) {\n                box.width = 0;\n            }\n            point.minPointLengthOffset = 0;\n        }\n        // Correct tooltip placement (#3014)\n        const tooltipY = point.plotY + (point.negative ? box.height : 0);\n        if (point.below) { // #15334\n            point.plotY += box.height;\n        }\n        if (point.tooltipPos) {\n            if (series.chart.inverted) {\n                point.tooltipPos[0] = yAxis.len - tooltipY;\n            }\n            else {\n                point.tooltipPos[1] = tooltipY;\n            }\n        }\n        // Check point position after recalculation (#16788)\n        point.isInside = this.isPointInside(point);\n        // Crisp vector coordinates\n        const crispBottom = crisp(point.yBottom, series.borderWidth);\n        box.y = crisp(box.y, series.borderWidth);\n        box.height = crispBottom - box.y;\n        merge(true, point.shapeArgs, box);\n    }\n}, { order: 2 });\nSeriesRegistry.registerSeriesType('waterfall', WaterfallSeries);\n/* *\n *\n * Export\n *\n * */\nexport default WaterfallSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A waterfall chart displays sequentially introduced positive or negative\n * values in cumulative columns.\n *\n * @sample highcharts/demo/waterfall/\n *         Waterfall chart\n * @sample highcharts/plotoptions/waterfall-inverted/\n *         Horizontal (inverted) waterfall\n * @sample highcharts/plotoptions/waterfall-stacked/\n *         Stacked waterfall chart\n *\n * @extends      plotOptions.column\n * @excluding    boostThreshold, boostBlending\n * @product      highcharts\n * @requires     highcharts-more\n * @optionparent plotOptions.waterfall\n */\nconst WaterfallSeriesDefaults = {\n    /**\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @apioption plotOptions.waterfall.color\n     */\n    /**\n     * The color used specifically for positive point columns. When not\n     * specified, the general series color is used.\n     *\n     * In styled mode, the waterfall colors can be set with the\n     * `.highcharts-point-negative`, `.highcharts-sum` and\n     * `.highcharts-intermediate-sum` classes.\n     *\n     * @sample {highcharts} highcharts/demo/waterfall/\n     *         Waterfall\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @product   highcharts\n     * @apioption plotOptions.waterfall.upColor\n     */\n    dataLabels: {\n        inside: true\n    },\n    /**\n     * The width of the line connecting waterfall columns.\n     *\n     * @product highcharts\n     */\n    lineWidth: 1,\n    /**\n     * The color of the line that connects columns in a waterfall series.\n     *\n     * In styled mode, the stroke can be set with the `.highcharts-graph`\n     * class.\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since   3.0\n     * @product highcharts\n     */\n    lineColor: \"#333333\" /* Palette.neutralColor80 */,\n    /**\n     * A name for the dash style to use for the line connecting the columns\n     * of the waterfall series. Possible values: Dash, DashDot, Dot,\n     * LongDash, LongDashDot, LongDashDotDot, ShortDash, ShortDashDot,\n     * ShortDashDotDot, ShortDot, Solid\n     *\n     * In styled mode, the stroke dash-array can be set with the\n     * `.highcharts-graph` class.\n     *\n     * @type    {Highcharts.DashStyleValue}\n     * @since   3.0\n     * @product highcharts\n     */\n    dashStyle: 'Dot',\n    /**\n     * The color of the border of each waterfall column.\n     *\n     * In styled mode, the border stroke can be set with the\n     * `.highcharts-point` class.\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since   3.0\n     * @product highcharts\n     */\n    borderColor: \"#333333\" /* Palette.neutralColor80 */,\n    states: {\n        hover: {\n            lineWidthPlus: 0 // #3126\n        }\n    }\n};\n/**\n * A `waterfall` series. If the [type](#series.waterfall.type) option\n * is not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.waterfall\n * @excluding dataParser, dataURL, boostThreshold, boostBlending\n * @product   highcharts\n * @requires  highcharts-more\n * @apioption series.waterfall\n */\n/**\n * An array of data points for the series. For the `waterfall` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 7],\n *        [1, 8],\n *        [2, 3]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.waterfall.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 8,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 8,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @excluding marker\n * @product   highcharts\n * @apioption series.waterfall.data\n */\n/**\n * When this property is true, the points acts as a summary column for\n * the values added or subtracted since the last intermediate sum,\n * or since the start of the series. The `y` value is ignored.\n *\n * @sample {highcharts} highcharts/demo/waterfall/\n *         Waterfall\n *\n * @type      {boolean}\n * @default   false\n * @product   highcharts\n * @apioption series.waterfall.data.isIntermediateSum\n */\n/**\n * When this property is true, the point display the total sum across\n * the entire series. The `y` value is ignored.\n *\n * @sample {highcharts} highcharts/demo/waterfall/\n *         Waterfall\n *\n * @type      {boolean}\n * @default   false\n * @product   highcharts\n * @apioption series.waterfall.data.isSum\n */\n''; // Adds doclets above to transpiled file\n/* *\n *\n *  Default Export\n *\n * */\nexport default WaterfallSeriesDefaults;\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/highcharts-more\n * @requires highcharts\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../Core/Globals.js';\nimport SeriesRegistry from '../Core/Series/SeriesRegistry.js';\nimport Pane from '../Extensions/Pane/Pane.js';\nimport '../Series/AreaRange/AreaRangeSeries.js';\nimport '../Series/AreaSplineRange/AreaSplineRangeSeries.js';\nimport '../Series/BoxPlot/BoxPlotSeries.js';\nimport BubbleSeries from '../Series/Bubble/BubbleSeries.js';\nimport '../Series/ColumnRange/ColumnRangeSeries.js';\nimport '../Series/ColumnPyramid/ColumnPyramidSeries.js';\nimport '../Series/ErrorBar/ErrorBarSeries.js';\nimport '../Series/Gauge/GaugeSeries.js';\nimport PackedBubbleSeries from '../Series/PackedBubble/PackedBubbleSeries.js';\nimport '../Series/Polygon/PolygonSeries.js';\nimport PolarAdditions from '../Series/PolarComposition.js';\nimport RadialAxis from '../Core/Axis/RadialAxis.js';\nimport WaterfallSeries from '../Series/Waterfall/WaterfallSeries.js';\nconst G = Highcharts;\nG.RadialAxis = RadialAxis;\nBubbleSeries.compose(G.Axis, G.Chart, G.Legend);\nPackedBubbleSeries.compose(G.Axis, G.Chart, G.Legend);\nPane.compose(G.Chart, G.Pointer);\nPolarAdditions.compose(G.Axis, G.Chart, G.Pointer, G.Series, G.Tick, G.Point, SeriesRegistry.seriesTypes.areasplinerange, SeriesRegistry.seriesTypes.column, SeriesRegistry.seriesTypes.line, SeriesRegistry.seriesTypes.spline);\nWaterfallSeries.compose(G.Axis, G.Chart);\nexport default G;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Imports\n *\n * */\nimport U from '../Utilities.js';\nconst { clamp, pick, pushUnique, stableSort } = U;\n/* *\n *\n *  Namespace\n *\n * */\nvar RendererUtilities;\n(function (RendererUtilities) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * General distribution algorithm for distributing labels of differing size\n     * along a confined length in two dimensions. The algorithm takes an array\n     * of objects containing a size, a target and a rank. It will place the\n     * labels as close as possible to their targets, skipping the lowest ranked\n     * labels if necessary.\n     * @private\n     */\n    function distribute(boxes, len, maxDistance) {\n        // Original array will be altered with added .pos\n        const origBoxes = boxes, reducedLen = origBoxes.reducedLen || len, sortByRank = (a, b) => (b.rank || 0) - (a.rank || 0), sortByTarget = (a, b) => a.target - b.target, restBoxes = [], // The outranked overshoot\n        boxesLength = boxes.length, forDeletion = [], push = restBoxes.push;\n        let i, cursor, step, overlapping = true, box, target, total = 0, equalRank;\n        // If the total size exceeds the len, remove those boxes with the lowest\n        // rank\n        i = boxesLength;\n        while (i--) {\n            total += boxes[i].size;\n        }\n        // Sort by rank, then slice away overshoot\n        if (total > reducedLen) {\n            stableSort(boxes, sortByRank);\n            equalRank = boxes[0].rank === boxes[boxes.length - 1].rank;\n            step = equalRank ? boxesLength / 2 : -1;\n            cursor = equalRank ? step : boxesLength - 1;\n            // When the boxes have equal rank (pie data labels, flags - #10073),\n            // decimate the boxes by starting in the middle and gradually remove\n            // more items inside the array. When they are sorted by rank, just\n            // remove the ones with the lowest rank from the end.\n            while (step && total > reducedLen) {\n                i = Math.floor(cursor);\n                box = boxes[i];\n                if (pushUnique(forDeletion, i)) {\n                    total -= box.size;\n                }\n                cursor += step;\n                // Start over the decimation with smaller steps\n                if (equalRank && cursor >= boxes.length) {\n                    step /= 2;\n                    cursor = step;\n                }\n            }\n            // Clean out the boxes marked for deletion\n            forDeletion\n                .sort((a, b) => b - a)\n                .forEach((i) => push.apply(restBoxes, boxes.splice(i, 1)));\n        }\n        // Order by target\n        stableSort(boxes, sortByTarget);\n        // So far we have been mutating the original array. Now\n        // create a copy with target arrays\n        boxes = boxes.map((box) => ({\n            size: box.size,\n            targets: [box.target],\n            align: pick(box.align, 0.5)\n        }));\n        while (overlapping) {\n            // Initial positions: target centered in box\n            i = boxes.length;\n            while (i--) {\n                box = boxes[i];\n                // Composite box, average of targets\n                target = (Math.min.apply(0, box.targets) +\n                    Math.max.apply(0, box.targets)) / 2;\n                box.pos = clamp(target - box.size * box.align, 0, len - box.size);\n            }\n            // Detect overlap and join boxes\n            i = boxes.length;\n            overlapping = false;\n            while (i--) {\n                // Overlap\n                if (i > 0 &&\n                    boxes[i - 1].pos + boxes[i - 1].size >\n                        boxes[i].pos) {\n                    // Add this size to the previous box\n                    boxes[i - 1].size += boxes[i].size;\n                    boxes[i - 1].targets = boxes[i - 1]\n                        .targets\n                        .concat(boxes[i].targets);\n                    boxes[i - 1].align = 0.5;\n                    // Overlapping right, push left\n                    if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n                        boxes[i - 1].pos = len - boxes[i - 1].size;\n                    }\n                    boxes.splice(i, 1); // Remove this item\n                    overlapping = true;\n                }\n            }\n        }\n        // Add the rest (hidden boxes)\n        push.apply(origBoxes, restBoxes);\n        // Now the composite boxes are placed, we need to put the original boxes\n        // within them\n        i = 0;\n        boxes.some((box) => {\n            let posInCompositeBox = 0;\n            // Exceeded maxDistance => abort\n            return (box.targets || []).some(() => {\n                origBoxes[i].pos = box.pos + posInCompositeBox;\n                // If the distance between the position and the target exceeds\n                // maxDistance, abort the loop and decrease the length in\n                // increments of 10% to recursively reduce the number of\n                // visible boxes by rank. Once all boxes are within the\n                // maxDistance, we're good.\n                if (typeof maxDistance !== 'undefined' &&\n                    Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {\n                    // Reset the positions that are already set\n                    origBoxes\n                        .slice(0, i + 1)\n                        .forEach((box) => delete box.pos);\n                    // Try with a smaller length\n                    origBoxes.reducedLen =\n                        (origBoxes.reducedLen || len) - (len * 0.1);\n                    // Recurse\n                    if (origBoxes.reducedLen > len * 0.1) {\n                        distribute(origBoxes, len, maxDistance);\n                    }\n                    // Exceeded maxDistance => abort\n                    return true;\n                }\n                posInCompositeBox += origBoxes[i].size;\n                i++;\n                return false;\n            });\n        });\n        // Add the rest (hidden) boxes and sort by target\n        stableSort(origBoxes, sortByTarget);\n        return origBoxes;\n    }\n    RendererUtilities.distribute = distribute;\n})(RendererUtilities || (RendererUtilities = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default RendererUtilities;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from './AST.js';\nimport H from '../../Globals.js';\nconst { composed } = H;\nimport SVGElement from '../SVG/SVGElement.js';\nimport U from '../../Utilities.js';\nconst { attr, css, createElement, defined, extend, pInt, pushUnique } = U;\n/**\n * The opacity and visibility properties are set as attributes on the main\n * element and SVG groups, and as identical CSS properties on the HTML element\n * and the ancestry divs. (#3542)\n *\n * @private\n */\nfunction commonSetter(value, key, elem) {\n    const style = this.div?.style || elem.style;\n    SVGElement.prototype[`${key}Setter`].call(this, value, key, elem);\n    if (style) {\n        style[key] = value;\n    }\n}\n/**\n * Decorate each SVG group in the ancestry line. Each SVG `g` element that\n * contains children with useHTML, will receive a `div` element counterpart to\n * contain the HTML span. These div elements are translated and styled like\n * original `g` counterparts.\n *\n * @private\n */\nconst decorateSVGGroup = (g, container) => {\n    if (!g.div) {\n        const className = attr(g.element, 'class'), cssProto = g.css;\n        // Create the parallel HTML group\n        const div = createElement('div', className ? { className } : void 0, {\n            // Add HTML specific styles\n            position: 'absolute',\n            left: `${g.translateX || 0}px`,\n            top: `${g.translateY || 0}px`,\n            // Add pre-existing styles\n            ...g.styles,\n            // Add g attributes that correspond to CSS\n            display: g.display,\n            opacity: g.opacity, // #5075\n            visibility: g.visibility\n        }, \n        // The top group is appended to container\n        g.parentGroup?.div || container);\n        g.classSetter = (value, key, element) => {\n            element.setAttribute('class', value);\n            div.className = value;\n        };\n        /**\n         * Common translate setter for X and Y on the HTML group.\n         *\n         * Reverted the fix for #6957 due to positioning problems and offline\n         * export (#7254, #7280, #7529)\n         * @private\n         */\n        g.translateXSetter = g.translateYSetter = (value, key) => {\n            g[key] = value;\n            div.style[key === 'translateX' ? 'left' : 'top'] = `${value}px`;\n            g.doTransform = true;\n        };\n        g.opacitySetter = g.visibilitySetter = commonSetter;\n        // Extend the parent group's css function by updating the parallel div\n        // counterpart with the same style.\n        g.css = (styles) => {\n            // Call the base css method. The `parentGroup` can be either an\n            // SVGElement or an SVGLabel, in which the css method is extended\n            // (#19200).\n            cssProto.call(g, styles);\n            // #6794\n            if (styles.cursor) {\n                div.style.cursor = styles.cursor;\n            }\n            // #18821\n            if (styles.pointerEvents) {\n                div.style.pointerEvents = styles.pointerEvents;\n            }\n            return g;\n        };\n        // Event handling\n        g.on = function () {\n            SVGElement.prototype.on.apply({\n                element: div,\n                onEvents: g.onEvents\n            }, arguments);\n            return g;\n        };\n        g.div = div;\n    }\n    return g.div;\n};\n/* *\n *\n *  Class\n *\n * */\nclass HTMLElement extends SVGElement {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    /**\n     * Compose\n     * @private\n     */\n    static compose(SVGRendererClass) {\n        if (pushUnique(composed, this.compose)) {\n            /**\n             * Create a HTML text node. This is used by the SVG renderer `text`\n             * and `label` functions through the `useHTML` parameter.\n             *\n             * @private\n             */\n            SVGRendererClass.prototype.html = function (str, x, y) {\n                return new HTMLElement(this, 'span')\n                    // Set the default attributes\n                    .attr({\n                    text: str,\n                    x: Math.round(x),\n                    y: Math.round(y)\n                });\n            };\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    constructor(renderer, nodeName) {\n        super(renderer, nodeName);\n        this.css({\n            position: 'absolute',\n            ...(renderer.styledMode ? {} : {\n                fontFamily: renderer.style.fontFamily,\n                fontSize: renderer.style.fontSize\n            })\n        });\n        // Keep the whiteSpace style outside the `HTMLElement.styles` collection\n        this.element.style.whiteSpace = 'nowrap';\n    }\n    /**\n     * Get the correction in X and Y positioning as the element is rotated.\n     * @private\n     */\n    getSpanCorrection(width, baseline, alignCorrection) {\n        this.xCorr = -width * alignCorrection;\n        this.yCorr = -baseline;\n    }\n    /**\n     * Apply CSS to HTML elements. This is used in text within SVG rendering.\n     * @private\n     */\n    css(styles) {\n        const { element } = this, \n        // When setting or unsetting the width style, we need to update\n        // transform (#8809)\n        isSettingWidth = (element.tagName === 'SPAN' &&\n            styles &&\n            'width' in styles), textWidth = isSettingWidth && styles.width;\n        let doTransform;\n        if (isSettingWidth) {\n            delete styles.width;\n            this.textWidth = pInt(textWidth) || void 0;\n            doTransform = true;\n        }\n        if (styles?.textOverflow === 'ellipsis') {\n            styles.whiteSpace = 'nowrap';\n            styles.overflow = 'hidden';\n        }\n        extend(this.styles, styles);\n        css(element, styles);\n        // Now that all styles are applied, to the transform\n        if (doTransform) {\n            this.updateTransform();\n        }\n        return this;\n    }\n    /**\n     * The useHTML method for calculating the bounding box based on offsets.\n     * Called internally from the `SVGElement.getBBox` function and subsequently\n     * rotated.\n     *\n     * @private\n     */\n    htmlGetBBox() {\n        const { element } = this;\n        return {\n            x: element.offsetLeft,\n            y: element.offsetTop,\n            width: element.offsetWidth,\n            height: element.offsetHeight\n        };\n    }\n    /**\n     * Batch update styles and attributes related to transform\n     *\n     * @private\n     */\n    updateTransform() {\n        // Aligning non added elements is expensive\n        if (!this.added) {\n            this.alignOnAdd = true;\n            return;\n        }\n        const { element, renderer, rotation, rotationOriginX, rotationOriginY, styles, textAlign = 'left', textWidth, translateX = 0, translateY = 0, x = 0, y = 0 } = this, alignCorrection = {\n            left: 0, center: 0.5, right: 1\n        }[textAlign], whiteSpace = styles.whiteSpace;\n        // Get the pixel length of the text\n        const getTextPxLength = () => {\n            if (this.textPxLength) {\n                return this.textPxLength;\n            }\n            // Reset multiline/ellipsis in order to read width (#4928,\n            // #5417)\n            css(element, {\n                width: '',\n                whiteSpace: whiteSpace || 'nowrap'\n            });\n            return element.offsetWidth;\n        };\n        // Apply translate\n        css(element, {\n            marginLeft: `${translateX}px`,\n            marginTop: `${translateY}px`\n        });\n        if (element.tagName === 'SPAN') {\n            const currentTextTransform = [\n                rotation,\n                textAlign,\n                element.innerHTML,\n                textWidth,\n                this.textAlign\n            ].join(','), parentPadding = (this.parentGroup?.padding * -1) || 0;\n            let baseline, hasBoxWidthChanged = false;\n            // Update textWidth. Use the memoized textPxLength if possible, to\n            // avoid the getTextPxLength function using elem.offsetWidth.\n            // Calling offsetWidth affects rendering time as it forces layout\n            // (#7656).\n            if (textWidth !== this.oldTextWidth) { // #983, #1254\n                const textPxLength = getTextPxLength(), textWidthNum = textWidth || 0;\n                if (((textWidthNum > this.oldTextWidth) ||\n                    textPxLength > textWidthNum) && (\n                // Only set the width if the text is able to word-wrap,\n                // or text-overflow is ellipsis (#9537)\n                /[ \\-]/.test(element.textContent || element.innerText) ||\n                    element.style.textOverflow === 'ellipsis')) {\n                    css(element, {\n                        width: (textPxLength > textWidthNum) || rotation ?\n                            textWidth + 'px' :\n                            'auto', // #16261\n                        display: 'block',\n                        whiteSpace: whiteSpace || 'normal' // #3331\n                    });\n                    this.oldTextWidth = textWidth;\n                    hasBoxWidthChanged = true; // #8159\n                }\n            }\n            this.hasBoxWidthChanged = hasBoxWidthChanged; // #8159\n            // Do the calculations and DOM access only if properties changed\n            if (currentTextTransform !== this.cTT) {\n                baseline = renderer.fontMetrics(element).b;\n                // Renderer specific handling of span rotation, but only if we\n                // have something to update.\n                if (defined(rotation) &&\n                    ((rotation !== (this.oldRotation || 0)) ||\n                        (textAlign !== this.oldAlign))) {\n                    this.setSpanRotation(rotation, parentPadding, parentPadding);\n                }\n                this.getSpanCorrection(\n                // Avoid elem.offsetWidth if we can, it affects rendering\n                // time heavily (#7656)\n                ((!defined(rotation) && this.textPxLength) || // #7920\n                    element.offsetWidth), baseline, alignCorrection);\n            }\n            // Apply position with correction and rotation origin\n            const { xCorr = 0, yCorr = 0 } = this, rotOriginX = (rotationOriginX ?? x) - xCorr - x - parentPadding, rotOriginY = (rotationOriginY ?? y) - yCorr - y - parentPadding, styles = {\n                left: `${x + xCorr}px`,\n                top: `${y + yCorr}px`,\n                transformOrigin: `${rotOriginX}px ${rotOriginY}px`\n            };\n            css(element, styles);\n            // Record current text transform\n            this.cTT = currentTextTransform;\n            this.oldRotation = rotation;\n            this.oldAlign = textAlign;\n        }\n    }\n    /**\n     * Set the rotation of an individual HTML span.\n     * @private\n     */\n    setSpanRotation(rotation, originX, originY) {\n        // CSS transform and transform-origin both supported without prefix\n        // since Firefox 16 (2012), IE 10 (2012), Chrome 36 (2014), Safari 9\n        // (2015).;\n        css(this.element, {\n            transform: `rotate(${rotation}deg)`,\n            transformOrigin: `${originX}% ${originY}px`\n        });\n    }\n    /**\n     * Add the element to a group wrapper. For HTML elements, a parallel div\n     * will be created for each ancenstor SVG `g` element.\n     *\n     * @private\n     */\n    add(parentGroup) {\n        const container = this.renderer.box\n            .parentNode, parents = [];\n        let div;\n        this.parentGroup = parentGroup;\n        // Create a parallel divs to hold the HTML elements\n        if (parentGroup) {\n            div = parentGroup.div;\n            if (!div) {\n                // Read the parent chain into an array and read from top\n                // down\n                let svgGroup = parentGroup;\n                while (svgGroup) {\n                    parents.push(svgGroup);\n                    // Move up to the next parent group\n                    svgGroup = svgGroup.parentGroup;\n                }\n                // Decorate each of the ancestor group elements with a parallel\n                // div that reflects translation and styling\n                for (const parentGroup of parents.reverse()) {\n                    div = decorateSVGGroup(parentGroup, container);\n                }\n            }\n        }\n        (div || container).appendChild(this.element);\n        this.added = true;\n        if (this.alignOnAdd) {\n            this.updateTransform();\n        }\n        return this;\n    }\n    /**\n     * Text setter\n     * @private\n     */\n    textSetter(value) {\n        if (value !== this.textStr) {\n            delete this.bBox;\n            delete this.oldTextWidth;\n            AST.setElementHTML(this.element, value ?? '');\n            this.textStr = value;\n            this.doTransform = true;\n        }\n    }\n    /**\n     * Align setter\n     *\n     * @private\n     */\n    alignSetter(value) {\n        this.alignValue = this.textAlign = value;\n        this.doTransform = true;\n    }\n    /**\n     * Various setters which rely on update transform\n     * @private\n     */\n    xSetter(value, key) {\n        this[key] = value;\n        this.doTransform = true;\n    }\n}\n// Some shared setters\nconst proto = HTMLElement.prototype;\nproto.visibilitySetter = proto.opacitySetter = commonSetter;\nproto.ySetter =\n    proto.rotationSetter =\n        proto.rotationOriginXSetter =\n            proto.rotationOriginYSetter = proto.xSetter;\n/* *\n *\n *  Default Export\n *\n * */\nexport default HTMLElement;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../Utilities.js';\nconst { addEvent, getMagnitude, normalizeTickInterval, timeUnits } = U;\n/* *\n *\n *  Composition\n *\n * */\n/* eslint-disable valid-jsdoc */\nvar DateTimeAxis;\n(function (DateTimeAxis) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Extends axis class with date and time support.\n     * @private\n     */\n    function compose(AxisClass) {\n        if (!AxisClass.keepProps.includes('dateTime')) {\n            AxisClass.keepProps.push('dateTime');\n            const axisProto = AxisClass.prototype;\n            axisProto.getTimeTicks = getTimeTicks;\n            addEvent(AxisClass, 'afterSetType', onAfterSetType);\n        }\n        return AxisClass;\n    }\n    DateTimeAxis.compose = compose;\n    /**\n     * Set the tick positions to a time unit that makes sense, for example\n     * on the first of each month or on every Monday. Return an array with\n     * the time positions. Used in datetime axes as well as for grouping\n     * data on a datetime axis.\n     *\n     * @private\n     * @function Highcharts.Axis#getTimeTicks\n     * @param {Highcharts.TimeNormalizeObject} normalizedInterval\n     * The interval in axis values (ms) and the count.\n     * @param {number} min\n     * The minimum in axis values.\n     * @param {number} max\n     * The maximum in axis values.\n     */\n    function getTimeTicks() {\n        return this.chart.time.getTimeTicks.apply(this.chart.time, arguments);\n    }\n    /**\n     * @private\n     */\n    function onAfterSetType() {\n        if (this.type !== 'datetime') {\n            this.dateTime = void 0;\n            return;\n        }\n        if (!this.dateTime) {\n            this.dateTime = new Additions(this);\n        }\n    }\n    /* *\n     *\n     *  Classes\n     *\n     * */\n    class Additions {\n        /* *\n         *\n         *  Constructors\n         *\n         * */\n        constructor(axis) {\n            this.axis = axis;\n        }\n        /* *\n         *\n         *  Functions\n         *\n         * */\n        /**\n         * Get a normalized tick interval for dates. Returns a configuration\n         * object with unit range (interval), count and name. Used to prepare\n         * data for `getTimeTicks`. Previously this logic was part of\n         * getTimeTicks, but as `getTimeTicks` now runs of segments in stock\n         * charts, the normalizing logic was extracted in order to prevent it\n         * for running over again for each segment having the same interval.\n         * #662, #697.\n         * @private\n         */\n        normalizeTimeTickInterval(tickInterval, unitsOption) {\n            const units = (unitsOption || [[\n                    // Unit name\n                    'millisecond',\n                    // Allowed multiples\n                    [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]\n                ], [\n                    'second',\n                    [1, 2, 5, 10, 15, 30]\n                ], [\n                    'minute',\n                    [1, 2, 5, 10, 15, 30]\n                ], [\n                    'hour',\n                    [1, 2, 3, 4, 6, 8, 12]\n                ], [\n                    'day',\n                    [1, 2]\n                ], [\n                    'week',\n                    [1, 2]\n                ], [\n                    'month',\n                    [1, 2, 3, 4, 6]\n                ], [\n                    'year',\n                    null\n                ]]);\n            let unit = units[units.length - 1], // Default unit is years\n            interval = timeUnits[unit[0]], multiples = unit[1], i;\n            // Loop through the units to find the one that best fits the\n            // tickInterval\n            for (i = 0; i < units.length; i++) {\n                unit = units[i];\n                interval = timeUnits[unit[0]];\n                multiples = unit[1];\n                if (units[i + 1]) {\n                    // `lessThan` is in the middle between the highest multiple\n                    // and the next unit.\n                    const lessThan = (interval *\n                        multiples[multiples.length - 1] +\n                        timeUnits[units[i + 1][0]]) / 2;\n                    // Break and keep the current unit\n                    if (tickInterval <= lessThan) {\n                        break;\n                    }\n                }\n            }\n            // Prevent 2.5 years intervals, though 25, 250 etc. are allowed\n            if (interval === timeUnits.year && tickInterval < 5 * interval) {\n                multiples = [1, 2, 5];\n            }\n            // Get the count\n            const count = normalizeTickInterval(tickInterval / interval, multiples, unit[0] === 'year' ? // #1913, #2360\n                Math.max(getMagnitude(tickInterval / interval), 1) :\n                1);\n            return {\n                unitRange: interval,\n                count: count,\n                unitName: unit[0]\n            };\n        }\n        /**\n         * Get the best date format for a specific X value based on the closest\n         * point range on the axis.\n         *\n         * @private\n         */\n        getXDateFormat(x, dateTimeLabelFormats) {\n            const { axis } = this, time = axis.chart.time;\n            return axis.closestPointRange ?\n                time.getDateFormat(axis.closestPointRange, x, axis.options.startOfWeek, dateTimeLabelFormats) ||\n                    // #2546, 2581\n                    time.resolveDTLFormat(dateTimeLabelFormats.year).main :\n                time.resolveDTLFormat(dateTimeLabelFormats.day).main;\n        }\n    }\n    DateTimeAxis.Additions = Additions;\n})(DateTimeAxis || (DateTimeAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default DateTimeAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../Utilities.js';\nconst { addEvent, normalizeTickInterval, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * @private\n */\nvar LogarithmicAxis;\n(function (LogarithmicAxis) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Provides logarithmic support for axes.\n     * @private\n     */\n    function compose(AxisClass) {\n        if (!AxisClass.keepProps.includes('logarithmic')) {\n            AxisClass.keepProps.push('logarithmic');\n            addEvent(AxisClass, 'afterSetType', onAfterSetType);\n            addEvent(AxisClass, 'afterInit', onAfterInit);\n        }\n        return AxisClass;\n    }\n    LogarithmicAxis.compose = compose;\n    /**\n     * @private\n     */\n    function onAfterSetType() {\n        if (this.type !== 'logarithmic') {\n            this.logarithmic = void 0;\n        }\n        else {\n            this.logarithmic ?? (this.logarithmic = new Additions(this));\n        }\n    }\n    /**\n     * @private\n     */\n    function onAfterInit() {\n        const axis = this;\n        const log = axis.logarithmic;\n        // Extend logarithmic axis\n        if (log) {\n            axis.lin2val = function (num) {\n                return log.lin2log(num);\n            };\n            axis.val2lin = function (num) {\n                return log.log2lin(num);\n            };\n        }\n    }\n    /* *\n     *\n     *  Class\n     *\n     * */\n    /**\n     * Provides logarithmic support for axes.\n     * @private\n     * @class\n     */\n    class Additions {\n        /* *\n        *\n        *  Constructors\n        *\n        * */\n        constructor(axis) {\n            this.axis = axis;\n        }\n        /* *\n        *\n        *  Functions\n        *\n        * */\n        /**\n         * Set the tick positions of a logarithmic axis.\n         */\n        getLogTickPositions(interval, min, max, minor) {\n            const log = this;\n            const axis = log.axis;\n            const axisLength = axis.len;\n            const options = axis.options;\n            // Since we use this method for both major and minor ticks,\n            // use a local variable and return the result\n            let positions = [];\n            // Reset\n            if (!minor) {\n                log.minorAutoInterval = void 0;\n            }\n            // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n            if (interval >= 0.5) {\n                interval = Math.round(interval);\n                positions = axis.getLinearTickPositions(interval, min, max);\n                // Second case: We need intermediary ticks. For example\n                // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n            }\n            else if (interval >= 0.08) {\n                const roundedMin = Math.floor(min);\n                let intermediate, i, j, len, pos, lastPos, break2;\n                if (interval > 0.3) {\n                    intermediate = [1, 2, 4];\n                    // 0.2 equals five minor ticks per 1, 10, 100 etc\n                }\n                else if (interval > 0.15) {\n                    intermediate = [1, 2, 4, 6, 8];\n                }\n                else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n                    intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n                }\n                for (i = roundedMin; i < max + 1 && !break2; i++) {\n                    len = intermediate.length;\n                    for (j = 0; j < len && !break2; j++) {\n                        pos = log.log2lin(log.lin2log(i) * intermediate[j]);\n                        // #1670, lastPos is #3113\n                        if (pos > min &&\n                            (!minor || lastPos <= max) &&\n                            typeof lastPos !== 'undefined') {\n                            positions.push(lastPos);\n                        }\n                        if (lastPos > max) {\n                            break2 = true;\n                        }\n                        lastPos = pos;\n                    }\n                }\n                // Third case: We are so deep in between whole logarithmic values,\n                // that we might as well handle the tick positions like a linear\n                // axis. For example 1.01, 1.02, 1.03, 1.04.\n            }\n            else {\n                const realMin = log.lin2log(min), realMax = log.lin2log(max), tickIntervalOption = minor ?\n                    axis.getMinorTickInterval() :\n                    options.tickInterval, filteredTickIntervalOption = tickIntervalOption === 'auto' ?\n                    null :\n                    tickIntervalOption, tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1), totalPixelLength = minor ?\n                    axisLength / axis.tickPositions.length :\n                    axisLength;\n                interval = pick(filteredTickIntervalOption, log.minorAutoInterval, (realMax - realMin) *\n                    tickPixelIntervalOption / (totalPixelLength || 1));\n                interval = normalizeTickInterval(interval);\n                positions = axis.getLinearTickPositions(interval, realMin, realMax).map(log.log2lin);\n                if (!minor) {\n                    log.minorAutoInterval = interval / 5;\n                }\n            }\n            // Set the axis-level tickInterval variable\n            if (!minor) {\n                axis.tickInterval = interval;\n            }\n            return positions;\n        }\n        lin2log(num) {\n            return Math.pow(10, num);\n        }\n        log2lin(num) {\n            return Math.log(num) / Math.LN10;\n        }\n    }\n    LogarithmicAxis.Additions = Additions;\n})(LogarithmicAxis || (LogarithmicAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default LogarithmicAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../../Utilities.js';\nconst { erase, extend, isNumber } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar PlotLineOrBandAxis;\n(function (PlotLineOrBandAxis) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Variables\n     *\n     * */\n    let PlotLineOrBandClass;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Add a plot band after render time.\n     *\n     * @sample highcharts/members/axis-addplotband/\n     *         Toggle the plot band from a button\n     *\n     * @function Highcharts.Axis#addPlotBand\n     *\n     * @param {Highcharts.AxisPlotBandsOptions} options\n     * A configuration object for the plot band, as defined in\n     * [xAxis.plotBands](https://api.highcharts.com/highcharts/xAxis.plotBands).\n     *\n     * @return {Highcharts.PlotLineOrBand|undefined}\n     * The added plot band, or `undefined` if the options are not valid.\n     */\n    function addPlotBand(options) {\n        return this.addPlotBandOrLine(options, 'plotBands');\n    }\n    /**\n     * Add a plot band or plot line after render time. Called from\n     * addPlotBand and addPlotLine internally.\n     *\n     * @private\n     * @function Highcharts.Axis#addPlotBandOrLine\n     * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n     * The plotBand or plotLine configuration object.\n     */\n    function addPlotBandOrLine(options, coll) {\n        const userOptions = this.userOptions;\n        let obj = new PlotLineOrBandClass(this, options);\n        if (this.visible) {\n            obj = obj.render();\n        }\n        if (obj) { // #2189\n            if (!this._addedPlotLB) {\n                this._addedPlotLB = true;\n                (userOptions.plotLines || [])\n                    .concat(userOptions.plotBands || [])\n                    .forEach((plotLineOptions) => {\n                    this.addPlotBandOrLine(plotLineOptions);\n                });\n            }\n            // Add it to the user options for exporting and Axis.update\n            if (coll) {\n                // Workaround Microsoft/TypeScript issue #32693\n                const updatedOptions = (userOptions[coll] || []);\n                updatedOptions.push(options);\n                userOptions[coll] = updatedOptions;\n            }\n            this.plotLinesAndBands.push(obj);\n        }\n        return obj;\n    }\n    /**\n     * Add a plot line after render time.\n     *\n     * @sample highcharts/members/axis-addplotline/\n     *         Toggle the plot line from a button\n     *\n     * @function Highcharts.Axis#addPlotLine\n     *\n     * @param {Highcharts.AxisPlotLinesOptions} options\n     * A configuration object for the plot line, as defined in\n     * [xAxis.plotLines](https://api.highcharts.com/highcharts/xAxis.plotLines).\n     *\n     * @return {Highcharts.PlotLineOrBand|undefined}\n     * The added plot line, or `undefined` if the options are not valid.\n     */\n    function addPlotLine(options) {\n        return this.addPlotBandOrLine(options, 'plotLines');\n    }\n    /**\n     * @private\n     */\n    function compose(PlotLineOrBandType, AxisClass) {\n        const axisProto = AxisClass.prototype;\n        if (!axisProto.addPlotBand) {\n            PlotLineOrBandClass = PlotLineOrBandType;\n            extend(axisProto, {\n                addPlotBand,\n                addPlotLine,\n                addPlotBandOrLine,\n                getPlotBandPath,\n                removePlotBand,\n                removePlotLine,\n                removePlotBandOrLine\n            });\n        }\n        return AxisClass;\n    }\n    PlotLineOrBandAxis.compose = compose;\n    /**\n     * Internal function to create the SVG path definition for a plot band.\n     *\n     * @function Highcharts.Axis#getPlotBandPath\n     *\n     * @param {number} from\n     * The axis value to start from.\n     *\n     * @param {number} to\n     * The axis value to end on.\n     *\n     * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n     * The plotBand or plotLine configuration object.\n     *\n     * @return {Highcharts.SVGPathArray}\n     * The SVG path definition in array form.\n     */\n    function getPlotBandPath(from, to, options) {\n        options = options || this.options;\n        const toPath = this.getPlotLinePath({\n            value: to,\n            force: true,\n            acrossPanes: options.acrossPanes\n        }), result = [], horiz = this.horiz, outside = !isNumber(this.min) ||\n            !isNumber(this.max) ||\n            (from < this.min && to < this.min) ||\n            (from > this.max && to > this.max), path = this.getPlotLinePath({\n            value: from,\n            force: true,\n            acrossPanes: options.acrossPanes\n        });\n        let i, \n        // #4964 check if chart is inverted or plotband is on yAxis\n        plus = 1, isFlat;\n        if (path && toPath) {\n            // Flat paths don't need labels (#3836)\n            if (outside) {\n                isFlat = path.toString() === toPath.toString();\n                plus = 0;\n            }\n            // Go over each subpath - for panes in Highcharts Stock\n            for (i = 0; i < path.length; i += 2) {\n                const pathStart = path[i], pathEnd = path[i + 1], toPathStart = toPath[i], toPathEnd = toPath[i + 1];\n                // Type checking all affected path segments. Consider\n                // something smarter.\n                if ((pathStart[0] === 'M' || pathStart[0] === 'L') &&\n                    (pathEnd[0] === 'M' || pathEnd[0] === 'L') &&\n                    (toPathStart[0] === 'M' || toPathStart[0] === 'L') &&\n                    (toPathEnd[0] === 'M' || toPathEnd[0] === 'L')) {\n                    // Add 1 pixel when coordinates are the same\n                    if (horiz && toPathStart[1] === pathStart[1]) {\n                        toPathStart[1] += plus;\n                        toPathEnd[1] += plus;\n                    }\n                    else if (!horiz && toPathStart[2] === pathStart[2]) {\n                        toPathStart[2] += plus;\n                        toPathEnd[2] += plus;\n                    }\n                    result.push(['M', pathStart[1], pathStart[2]], ['L', pathEnd[1], pathEnd[2]], ['L', toPathEnd[1], toPathEnd[2]], ['L', toPathStart[1], toPathStart[2]], ['Z']);\n                }\n                result.isFlat = isFlat;\n            }\n        }\n        return result;\n    }\n    /**\n     * Remove a plot band by its id.\n     *\n     * @sample highcharts/members/axis-removeplotband/\n     *         Remove plot band by id\n     * @sample highcharts/members/axis-addplotband/\n     *         Toggle the plot band from a button\n     *\n     * @function Highcharts.Axis#removePlotBand\n     *\n     * @param {string} id\n     *        The plot band's `id` as given in the original configuration\n     *        object or in the `addPlotBand` option.\n     */\n    function removePlotBand(id) {\n        this.removePlotBandOrLine(id);\n    }\n    /**\n     * Remove a plot band or plot line from the chart by id. Called\n     * internally from `removePlotBand` and `removePlotLine`.\n     * @private\n     * @function Highcharts.Axis#removePlotBandOrLine\n     */\n    function removePlotBandOrLine(id) {\n        const plotLinesAndBands = this.plotLinesAndBands, options = this.options, userOptions = this.userOptions;\n        if (plotLinesAndBands) { // #15639\n            let i = plotLinesAndBands.length;\n            while (i--) {\n                if (plotLinesAndBands[i].id === id) {\n                    plotLinesAndBands[i].destroy();\n                }\n            }\n            ([\n                options.plotLines || [],\n                userOptions.plotLines || [],\n                options.plotBands || [],\n                userOptions.plotBands || []\n            ]).forEach(function (arr) {\n                i = arr.length;\n                while (i--) {\n                    if ((arr[i] || {}).id === id) {\n                        erase(arr, arr[i]);\n                    }\n                }\n            });\n        }\n    }\n    /**\n     * Remove a plot line by its id.\n     *\n     * @sample highcharts/xaxis/plotlines-id/\n     *         Remove plot line by id\n     * @sample highcharts/members/axis-addplotline/\n     *         Toggle the plot line from a button\n     *\n     * @function Highcharts.Axis#removePlotLine\n     *\n     * @param {string} id\n     *        The plot line's `id` as given in the original configuration\n     *        object or in the `addPlotLine` option.\n     */\n    function removePlotLine(id) {\n        this.removePlotBandOrLine(id);\n    }\n})(PlotLineOrBandAxis || (PlotLineOrBandAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default PlotLineOrBandAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport PlotLineOrBandAxis from './PlotLineOrBandAxis.js';\nimport U from '../../Utilities.js';\nconst { addEvent, arrayMax, arrayMin, defined, destroyObjectProperties, erase, fireEvent, merge, objectEach, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The object wrapper for plot lines and plot bands\n *\n * @class\n * @name Highcharts.PlotLineOrBand\n *\n * @param {Highcharts.Axis} axis\n * Related axis.\n *\n * @param {Highcharts.AxisPlotLinesOptions|Highcharts.AxisPlotBandsOptions} [options]\n * Options to use.\n */\nclass PlotLineOrBand {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    static compose(ChartClass, AxisClass) {\n        addEvent(ChartClass, 'afterInit', function () {\n            this.labelCollectors.push(() => {\n                const labels = [];\n                for (const axis of this.axes) {\n                    for (const { label, options } of axis.plotLinesAndBands) {\n                        if (label && !options?.label?.allowOverlap) {\n                            labels.push(label);\n                        }\n                    }\n                }\n                return labels;\n            });\n        });\n        return PlotLineOrBandAxis.compose(PlotLineOrBand, AxisClass);\n    }\n    /* *\n     *\n     *  Constructor\n     *\n     * */\n    constructor(axis, options) {\n        /**\n         * Related axis.\n         *\n         * @name Highcharts.PlotLineOrBand#axis\n         * @type {Highcharts.Axis}\n         */\n        this.axis = axis;\n        /**\n         * Options of the plot line or band.\n         *\n         * @name Highcharts.PlotLineOrBand#options\n         * @type {AxisPlotBandsOptions|AxisPlotLinesOptions}\n         */\n        this.options = options;\n        this.id = options.id;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable no-invalid-this, valid-jsdoc */\n    /**\n     * Render the plot line or plot band. If it is already existing,\n     * move it.\n     * @private\n     * @function Highcharts.PlotLineOrBand#render\n     */\n    render() {\n        fireEvent(this, 'render');\n        const { axis, options } = this, { horiz, logarithmic } = axis, { color, events, zIndex = 0 } = options, groupAttribs = {}, renderer = axis.chart.renderer, \n        // These properties only exist on either band or line\n        to = options.to, from = options.from, value = options.value, borderWidth = options.borderWidth;\n        let optionsLabel = options.label, { label, svgElem } = this, path = [], group;\n        const isBand = defined(from) && defined(to), isLine = defined(value), isNew = !svgElem, attribs = {\n            'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') +\n                (options.className || '')\n        };\n        let groupName = isBand ? 'bands' : 'lines';\n        // Set the presentational attributes\n        if (!axis.chart.styledMode) {\n            if (isLine) {\n                attribs.stroke = color || \"#999999\" /* Palette.neutralColor40 */;\n                attribs['stroke-width'] = pick(options.width, 1);\n                if (options.dashStyle) {\n                    attribs.dashstyle = options.dashStyle;\n                }\n            }\n            else if (isBand) { // Plot band\n                attribs.fill = color || \"#e6e9ff\" /* Palette.highlightColor10 */;\n                if (borderWidth) {\n                    attribs.stroke = options.borderColor;\n                    attribs['stroke-width'] = borderWidth;\n                }\n            }\n        }\n        // Grouping and zIndex\n        groupAttribs.zIndex = zIndex;\n        groupName += '-' + zIndex;\n        group = axis.plotLinesAndBandsGroups[groupName];\n        if (!group) {\n            axis.plotLinesAndBandsGroups[groupName] = group =\n                renderer.g('plot-' + groupName)\n                    .attr(groupAttribs).add();\n        }\n        // Create the path\n        if (!svgElem) {\n            /**\n             * SVG element of the plot line or band.\n             *\n             * @name Highcharts.PlotLineOrBand#svgElem\n             * @type {Highcharts.SVGElement}\n             */\n            this.svgElem = svgElem = renderer\n                .path()\n                .attr(attribs)\n                .add(group);\n        }\n        // Set the path or return\n        if (defined(value)) { // Plot line\n            path = axis.getPlotLinePath({\n                value: logarithmic?.log2lin(value) ?? value,\n                lineWidth: svgElem.strokeWidth(),\n                acrossPanes: options.acrossPanes\n            });\n        }\n        else if (defined(from) && defined(to)) { // Plot band\n            path = axis.getPlotBandPath(logarithmic?.log2lin(from) ?? from, logarithmic?.log2lin(to) ?? to, options);\n        }\n        else {\n            return;\n        }\n        // Common for lines and bands. Add events only if they were not added\n        // before.\n        if (!this.eventsAdded && events) {\n            objectEach(events, (event, eventType) => {\n                svgElem?.on(eventType, (e) => {\n                    events[eventType].apply(this, [e]);\n                });\n            });\n            this.eventsAdded = true;\n        }\n        if ((isNew || !svgElem.d) && path?.length) {\n            svgElem.attr({ d: path });\n        }\n        else if (svgElem) {\n            if (path) {\n                svgElem.show();\n                svgElem.animate({ d: path });\n            }\n            else if (svgElem.d) {\n                svgElem.hide();\n                if (label) {\n                    this.label = label = label.destroy();\n                }\n            }\n        }\n        // The plot band/line label\n        if (optionsLabel &&\n            (defined(optionsLabel.text) || defined(optionsLabel.formatter)) &&\n            path?.length &&\n            axis.width > 0 &&\n            axis.height > 0 &&\n            !path.isFlat) {\n            // Apply defaults\n            optionsLabel = merge({\n                align: horiz && isBand ? 'center' : void 0,\n                x: horiz ? !isBand && 4 : 10,\n                verticalAlign: !horiz && isBand ? 'middle' : void 0,\n                y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n                rotation: horiz && !isBand ? 90 : 0,\n                ...(isBand ? { inside: true } : {})\n            }, optionsLabel);\n            this.renderLabel(optionsLabel, path, isBand, zIndex);\n            // Move out of sight\n        }\n        else if (label) {\n            label.hide();\n        }\n        // Chainable\n        return this;\n    }\n    /**\n     * Render and align label for plot line or band.\n     * @private\n     * @function Highcharts.PlotLineOrBand#renderLabel\n     */\n    renderLabel(optionsLabel, path, isBand, zIndex) {\n        const plotLine = this, axis = plotLine.axis, renderer = axis.chart.renderer, inside = optionsLabel.inside;\n        let label = plotLine.label;\n        // Add the SVG element\n        if (!label) {\n            /**\n             * SVG element of the label.\n             *\n             * @name Highcharts.PlotLineOrBand#label\n             * @type {Highcharts.SVGElement}\n             */\n            plotLine.label = label = renderer\n                .text(this.getLabelText(optionsLabel), 0, 0, optionsLabel.useHTML)\n                .attr({\n                align: optionsLabel.textAlign || optionsLabel.align,\n                rotation: optionsLabel.rotation,\n                'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') +\n                    '-label ' + (optionsLabel.className || ''),\n                zIndex\n            });\n            if (!axis.chart.styledMode) {\n                label.css(merge({\n                    fontSize: '0.8em',\n                    textOverflow: (isBand && !inside) ? '' : 'ellipsis'\n                }, optionsLabel.style));\n            }\n            label.add();\n        }\n        // Get the bounding box and align the label\n        // #3000 changed to better handle choice between plotband or plotline\n        const xBounds = path.xBounds ||\n            [path[0][1], path[1][1], (isBand ? path[2][1] : path[0][1])], yBounds = path.yBounds ||\n            [path[0][2], path[1][2], (isBand ? path[2][2] : path[0][2])], x = arrayMin(xBounds), y = arrayMin(yBounds), bBoxWidth = arrayMax(xBounds) - x;\n        label.align(optionsLabel, false, {\n            x,\n            y,\n            width: bBoxWidth,\n            height: arrayMax(yBounds) - y\n        });\n        if (!label.alignValue ||\n            label.alignValue === 'left' ||\n            defined(inside)) {\n            label.css({\n                width: (optionsLabel.style?.width || ((!isBand ||\n                    !inside) ? (label.rotation === 90 ?\n                    axis.height - (label.alignAttr.y -\n                        axis.top) : (optionsLabel.clip ?\n                    axis.width :\n                    axis.chart.chartWidth) - (label.alignAttr.x - axis.left)) :\n                    bBoxWidth)) + 'px'\n            });\n        }\n        label.show(true);\n    }\n    /**\n     * Get label's text content.\n     * @private\n     * @function Highcharts.PlotLineOrBand#getLabelText\n     */\n    getLabelText(optionsLabel) {\n        return defined(optionsLabel.formatter) ?\n            optionsLabel.formatter\n                .call(this) :\n            optionsLabel.text;\n    }\n    /**\n     * Remove the plot line or band.\n     *\n     * @function Highcharts.PlotLineOrBand#destroy\n     */\n    destroy() {\n        // Remove it from the lookup\n        erase(this.axis.plotLinesAndBands, this);\n        delete this.axis;\n        destroyObjectProperties(this);\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default PlotLineOrBand;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Options for plot bands on axes.\n *\n * @typedef {Highcharts.XAxisPlotBandsOptions|Highcharts.YAxisPlotBandsOptions|Highcharts.ZAxisPlotBandsOptions} Highcharts.AxisPlotBandsOptions\n */\n/**\n * Options for plot band labels on axes.\n *\n * @typedef {Highcharts.XAxisPlotBandsLabelOptions|Highcharts.YAxisPlotBandsLabelOptions|Highcharts.ZAxisPlotBandsLabelOptions} Highcharts.AxisPlotBandsLabelOptions\n */\n/**\n * Options for plot lines on axes.\n *\n * @typedef {Highcharts.XAxisPlotLinesOptions|Highcharts.YAxisPlotLinesOptions|Highcharts.ZAxisPlotLinesOptions} Highcharts.AxisPlotLinesOptions\n */\n/**\n * Options for plot line labels on axes.\n *\n * @typedef {Highcharts.XAxisPlotLinesLabelOptions|Highcharts.YAxisPlotLinesLabelOptions|Highcharts.ZAxisPlotLinesLabelOptions} Highcharts.AxisPlotLinesLabelOptions\n */\n('');\n/* *\n *\n *  API Options\n *\n * */\n/**\n * An array of colored bands stretching across the plot area marking an\n * interval on the axis.\n *\n * In styled mode, the plot bands are styled by the `.highcharts-plot-band`\n * class in addition to the `className` option.\n *\n * @productdesc {highcharts}\n * In a gauge, a plot band on the Y axis (value axis) will stretch along the\n * perimeter of the gauge.\n *\n * @type      {Array<*>}\n * @product   highcharts highstock gantt\n * @apioption xAxis.plotBands\n */\n/**\n * Flag to decide if plotBand should be rendered across all panes.\n *\n * @since     7.1.2\n * @product   highstock\n * @type      {boolean}\n * @default   true\n * @apioption xAxis.plotBands.acrossPanes\n */\n/**\n * Border color for the plot band. Also requires `borderWidth` to be set.\n *\n * @type      {Highcharts.ColorString}\n * @apioption xAxis.plotBands.borderColor\n */\n/**\n * Border radius for the plot band. Applies only to gauges. Can be a pixel\n * value or a percentage, for example `50%`.\n *\n * @type      {number|string}\n * @since 11.4.2\n * @sample    {highcharts} highcharts/xaxis/plotbands-gauge-borderradius\n *            Angular gauge with rounded plot bands\n * @apioption xAxis.plotBands.borderRadius\n */\n/**\n * Border width for the plot band. Also requires `borderColor` to be set.\n *\n * @type      {number}\n * @default   0\n * @apioption xAxis.plotBands.borderWidth\n */\n/**\n * A custom class name, in addition to the default `highcharts-plot-band`,\n * to apply to each individual band.\n *\n * @type      {string}\n * @since     5.0.0\n * @apioption xAxis.plotBands.className\n */\n/**\n * The color of the plot band.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n *         Color band\n * @sample {highstock} stock/xaxis/plotbands/\n *         Plot band on Y axis\n *\n * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @default   ${palette.highlightColor10}\n * @apioption xAxis.plotBands.color\n */\n/**\n * An object defining mouse events for the plot band. Supported properties\n * are `click`, `mouseover`, `mouseout`, `mousemove`.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-events/\n *         Mouse events demonstrated\n *\n * @since     1.2\n * @apioption xAxis.plotBands.events\n */\n/**\n * Click event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotBands.events.click\n */\n/**\n * Mouse move event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotBands.events.mousemove\n */\n/**\n * Mouse out event on the corner of a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotBands.events.mouseout\n */\n/**\n * Mouse over event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotBands.events.mouseover\n */\n/**\n * The start position of the plot band in axis units.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n *         Datetime axis\n * @sample {highcharts} highcharts/xaxis/plotbands-from/\n *         Categorized axis\n * @sample {highstock} stock/xaxis/plotbands/\n *         Plot band on Y axis\n *\n * @type      {number}\n * @apioption xAxis.plotBands.from\n */\n/**\n * An id used for identifying the plot band in Axis.removePlotBand.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-id/\n *         Remove plot band by id\n * @sample {highstock} highcharts/xaxis/plotbands-id/\n *         Remove plot band by id\n *\n * @type      {string}\n * @apioption xAxis.plotBands.id\n */\n/**\n * The end position of the plot band in axis units.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n *         Datetime axis\n * @sample {highcharts} highcharts/xaxis/plotbands-from/\n *         Categorized axis\n * @sample {highstock} stock/xaxis/plotbands/\n *         Plot band on Y axis\n *\n * @type      {number}\n * @apioption xAxis.plotBands.to\n */\n/**\n * The z index of the plot band within the chart, relative to other\n * elements. Using the same z index as another element may give\n * unpredictable results, as the last rendered element will be on top.\n * Values from 0 to 20 make sense.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-color/\n *         Behind plot lines by default\n * @sample {highcharts} highcharts/xaxis/plotbands-zindex/\n *         Above plot lines\n * @sample {highcharts} highcharts/xaxis/plotbands-zindex-above-series/\n *         Above plot lines and series\n *\n * @type      {number}\n * @since     1.2\n * @apioption xAxis.plotBands.zIndex\n */\n/**\n * Text labels for the plot bands\n *\n * @product   highcharts highstock gantt\n * @apioption xAxis.plotBands.label\n */\n/**\n * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n * \"right\".\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n *         Aligned to the right\n * @sample {highstock} stock/xaxis/plotbands-label/\n *         Plot band with labels\n *\n * @type      {Highcharts.AlignValue}\n * @default   center\n * @since     2.1\n * @apioption xAxis.plotBands.label.align\n */\n/**\n * Whether or not the label can be hidden if it overlaps with another label.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-allowoverlap/\n *         A Plotband label overlapping another\n *\n * @type      {boolean}\n * @default   undefined\n * @since     11.4.8\n * @apioption xAxis.plotBands.label.allowOverlap\n */\n/**\n * Wether or not the text of the label can exceed the width of the label.\n *\n * @type      {boolean}\n * @product   highcharts highstock gantt\n * @sample {highcharts} highcharts/xaxis/plotbands-label-textwidth/\n *         Displaying text with text-wrapping/ellipsis, or the full text.\n *\n * @default   true\n * @since     11.4.6\n * @apioption xAxis.plotBands.label.inside\n */\n/**\n * Rotation of the text label in degrees .\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n *         Vertical text\n *\n * @type      {number}\n * @default   0\n * @since     2.1\n * @apioption xAxis.plotBands.label.rotation\n */\n/**\n * CSS styles for the text label.\n *\n * In styled mode, the labels are styled by the\n * `.highcharts-plot-band-label` class.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-style/\n *         Blue and bold label\n *\n * @type      {Highcharts.CSSObject}\n * @since     2.1\n * @apioption xAxis.plotBands.label.style\n */\n/**\n * The string text itself. A subset of HTML is supported.\n *\n * @type      {string}\n * @since     2.1\n * @apioption xAxis.plotBands.label.text\n */\n/**\n * The text alignment for the label. While `align` determines where the\n * texts anchor point is placed within the plot band, `textAlign` determines\n * how the text is aligned against its anchor point. Possible values are\n * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n *         Vertical text in center position but text-aligned left\n *\n * @type       {Highcharts.AlignValue}\n * @since      2.1\n * @apioption  xAxis.plotBands.label.textAlign\n */\n/**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type      {boolean}\n * @default   false\n * @since     3.0.3\n * @apioption xAxis.plotBands.label.useHTML\n */\n/**\n * Vertical alignment of the label relative to the plot band. Can be one of\n * \"top\", \"middle\" or \"bottom\".\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-verticalalign/\n *         Vertically centered label\n * @sample {highstock} stock/xaxis/plotbands-label/\n *         Plot band with labels\n *\n * @type       {Highcharts.VerticalAlignValue}\n * @default    top\n * @since      2.1\n * @apioption  xAxis.plotBands.label.verticalAlign\n */\n/**\n * Horizontal position relative the alignment. Default varies by\n * orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n *         Aligned 10px from the right edge\n * @sample {highstock} stock/xaxis/plotbands-label/\n *         Plot band with labels\n *\n * @type      {number}\n * @since     2.1\n * @apioption xAxis.plotBands.label.x\n */\n/**\n * Vertical position of the text baseline relative to the alignment. Default\n * varies by orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-label-y/\n *         Label on x axis\n * @sample {highstock} stock/xaxis/plotbands-label/\n *         Plot band with labels\n *\n * @type      {number}\n * @since     2.1\n * @apioption xAxis.plotBands.label.y\n */\n/**\n * An array of lines stretching across the plot area, marking a specific\n * value on one of the axes.\n *\n * In styled mode, the plot lines are styled by the\n * `.highcharts-plot-line` class in addition to the `className` option.\n *\n * @type      {Array<*>}\n * @product   highcharts highstock gantt\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n *         Basic plot line\n * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n *         Solid gauge plot line\n * @apioption xAxis.plotLines\n */\n/**\n * Flag to decide if plotLine should be rendered across all panes.\n *\n * @sample {highstock} stock/xaxis/plotlines-acrosspanes/\n *         Plot lines on different panes\n *\n * @since     7.1.2\n * @product   highstock\n * @type      {boolean}\n * @default   true\n * @apioption xAxis.plotLines.acrossPanes\n */\n/**\n * A custom class name, in addition to the default `highcharts-plot-line`,\n * to apply to each individual line.\n *\n * @type      {string}\n * @since     5.0.0\n * @apioption xAxis.plotLines.className\n */\n/**\n * The color of the line.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n *         A red line from X axis\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {Highcharts.ColorString}\n * @default   ${palette.neutralColor40}\n * @apioption xAxis.plotLines.color\n */\n/**\n * The dashing or dot style for the plot line. For possible values see\n * [this overview](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-dashstyle/\n *         Dash and dot pattern\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {Highcharts.DashStyleValue}\n * @default   Solid\n * @since     1.2\n * @apioption xAxis.plotLines.dashStyle\n */\n/**\n * An object defining mouse events for the plot line. Supported\n * properties are `click`, `mouseover`, `mouseout`, `mousemove`.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-events/\n *         Mouse events demonstrated\n *\n * @since     1.2\n * @apioption xAxis.plotLines.events\n */\n/**\n * Click event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotLines.events.click\n */\n/**\n * Mouse move event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotLines.events.mousemove\n */\n/**\n * Mouse out event on the corner of a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotLines.events.mouseout\n */\n/**\n * Mouse over event on a plot band.\n *\n * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotLines.events.mouseover\n */\n/**\n * An id used for identifying the plot line in Axis.removePlotLine.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-id/\n *         Remove plot line by id\n *\n * @type      {string}\n * @apioption xAxis.plotLines.id\n */\n/**\n * The position of the line in axis units.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n *         Between two categories on X axis\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {number}\n * @apioption xAxis.plotLines.value\n */\n/**\n * The width or thickness of the plot line.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-color/\n *         2px wide line from X axis\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {number}\n * @default   2\n * @apioption xAxis.plotLines.width\n */\n/**\n * The z index of the plot line within the chart.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-behind/\n *         Behind plot lines by default\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above/\n *         Above plot lines\n * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above-all/\n *         Above plot lines and series\n *\n * @type      {number}\n * @since     1.2\n * @apioption xAxis.plotLines.zIndex\n */\n/**\n * Text labels for the plot bands\n *\n * @apioption xAxis.plotLines.label\n */\n/**\n * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n * \"right\".\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n *         Aligned to the right\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type       {Highcharts.AlignValue}\n * @default    left\n * @since      2.1\n * @apioption  xAxis.plotLines.label.align\n */\n/**\n * Whether to hide labels that are outside the plot area.\n *\n * @type      {boolean}\n * @default   false\n * @since 10.3.3\n * @apioption xAxis.plotLines.labels.clip\n */\n/**\n * Callback JavaScript function to format the label. Useful properties like\n * the value of plot line or the range of plot band (`from` & `to`\n * properties) can be found in `this.options` object.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-plotbands-label-formatter\n *         Label formatters for plot line and plot band.\n * @type      {Highcharts.FormatterCallbackFunction<Highcharts.PlotLineOrBand>}\n * @apioption xAxis.plotLines.label.formatter\n */\n/**\n * Rotation of the text label in degrees. Defaults to 0 for horizontal plot\n * lines and 90 for vertical lines.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n *         Slanted text\n *\n * @type      {number}\n * @since     2.1\n * @apioption xAxis.plotLines.label.rotation\n */\n/**\n * CSS styles for the text label.\n *\n * In styled mode, the labels are styled by the\n * `.highcharts-plot-line-label` class.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-style/\n *         Blue and bold label\n *\n * @type      {Highcharts.CSSObject}\n * @since     2.1\n * @apioption xAxis.plotLines.label.style\n */\n/**\n * The text itself. A subset of HTML is supported.\n *\n * @type      {string}\n * @since     2.1\n * @apioption xAxis.plotLines.label.text\n */\n/**\n * The text alignment for the label. While `align` determines where the\n * texts anchor point is placed within the plot band, `textAlign` determines\n * how the text is aligned against its anchor point. Possible values are\n * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-textalign/\n *         Text label in bottom position\n *\n * @type      {Highcharts.AlignValue}\n * @since     2.1\n * @apioption xAxis.plotLines.label.textAlign\n */\n/**\n * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n * to render the labels.\n *\n * @type      {boolean}\n * @default   false\n * @since     3.0.3\n * @apioption xAxis.plotLines.label.useHTML\n */\n/**\n * Vertical alignment of the label relative to the plot line. Can be\n * one of \"top\", \"middle\" or \"bottom\".\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n *         Vertically centered label\n *\n * @type       {Highcharts.VerticalAlignValue}\n * @default    {highcharts} top\n * @default    {highstock} top\n * @since      2.1\n * @apioption  xAxis.plotLines.label.verticalAlign\n */\n/**\n * Horizontal position relative the alignment. Default varies by\n * orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n *         Aligned 10px from the right edge\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {number}\n * @since     2.1\n * @apioption xAxis.plotLines.label.x\n */\n/**\n * Vertical position of the text baseline relative to the alignment. Default\n * varies by orientation.\n *\n * @sample {highcharts} highcharts/xaxis/plotlines-label-y/\n *         Label below the plot line\n * @sample {highstock} stock/xaxis/plotlines/\n *         Plot line on Y axis\n *\n * @type      {number}\n * @since     2.1\n * @apioption xAxis.plotLines.label.y\n */\n/**\n * @type      {Array<*>}\n * @extends   xAxis.plotBands\n * @apioption yAxis.plotBands\n */\n/**\n * In a gauge chart, this option determines the inner radius of the\n * plot band that stretches along the perimeter. It can be given as\n * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n * By default, the inner radius is controlled by the [thickness](\n * #yAxis.plotBands.thickness) option.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n *         Gauge plot band\n *\n * @type      {number|string}\n * @since     2.3\n * @product   highcharts\n * @apioption yAxis.plotBands.innerRadius\n */\n/**\n * In a gauge chart, this option determines the outer radius of the\n * plot band that stretches along the perimeter. It can be given as\n * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n *         Gauge plot band\n *\n * @type      {number|string}\n * @default   100%\n * @since     2.3\n * @product   highcharts\n * @apioption yAxis.plotBands.outerRadius\n */\n/**\n * In a gauge chart, this option sets the width of the plot band\n * stretching along the perimeter. It can be given as a percentage\n * string, like `\"10%\"`, or as a pixel number, like `10`. The default\n * value 10 is the same as the default [tickLength](#yAxis.tickLength),\n * thus making the plot band act as a background for the tick markers.\n *\n * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n *         Gauge plot band\n *\n * @type      {number|string}\n * @default   10\n * @since     2.3\n * @product   highcharts\n * @apioption yAxis.plotBands.thickness\n */\n/**\n * @type      {Array<*>}\n * @extends   xAxis.plotLines\n * @apioption yAxis.plotLines\n */\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from './Animation/AnimationUtilities.js';\nconst { animObject } = A;\nimport F from './Templating.js';\nconst { format } = F;\nimport H from './Globals.js';\nconst { composed, doc, isSafari } = H;\nimport R from './Renderer/RendererUtilities.js';\nconst { distribute } = R;\nimport RendererRegistry from './Renderer/RendererRegistry.js';\nimport U from './Utilities.js';\nconst { addEvent, clamp, css, discardElement, extend, fireEvent, isArray, isNumber, isString, merge, pick, pushUnique, splat, syncTimeout } = U;\n/* *\n *\n *  Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * Tooltip of a chart.\n *\n * @class\n * @name Highcharts.Tooltip\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.TooltipOptions} options\n * Tooltip options.\n *\n * @param {Highcharts.Pointer} pointer\n * The pointer instance.\n */\nclass Tooltip {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(chart, options, pointer) {\n        /* *\n         *\n         *  Properties\n         *\n         * */\n        this.allowShared = true;\n        this.crosshairs = [];\n        this.distance = 0;\n        this.isHidden = true;\n        this.isSticky = false;\n        this.options = {};\n        this.outside = false;\n        this.chart = chart;\n        this.init(chart, options);\n        this.pointer = pointer;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Build the body (lines) of the tooltip by iterating over the items and\n     * returning one entry for each item, abstracting this functionality allows\n     * to easily overwrite and extend it.\n     *\n     * @private\n     * @function Highcharts.Tooltip#bodyFormatter\n     */\n    bodyFormatter(items) {\n        return items.map(function (item) {\n            const tooltipOptions = item.series.tooltipOptions;\n            return (tooltipOptions[(item.point.formatPrefix || 'point') + 'Formatter'] ||\n                item.point.tooltipFormatter).call(item.point, tooltipOptions[(item.point.formatPrefix || 'point') + 'Format'] || '');\n        });\n    }\n    /**\n     * Destroy the single tooltips in a split tooltip.\n     * If the tooltip is active then it is not destroyed, unless forced to.\n     *\n     * @private\n     * @function Highcharts.Tooltip#cleanSplit\n     *\n     * @param {boolean} [force]\n     * Force destroy all tooltips.\n     */\n    cleanSplit(force) {\n        this.chart.series.forEach(function (series) {\n            const tt = series && series.tt;\n            if (tt) {\n                if (!tt.isActive || force) {\n                    series.tt = tt.destroy();\n                }\n                else {\n                    tt.isActive = false;\n                }\n            }\n        });\n    }\n    /**\n     * In case no user defined formatter is given, this will be used. Note that\n     * the context here is an object holding point, series, x, y etc.\n     *\n     * @function Highcharts.Tooltip#defaultFormatter\n     *\n     * @param {Highcharts.Tooltip} tooltip\n     *\n     * @return {string|Array<string>}\n     * Returns a string (single tooltip and shared)\n     * or an array of strings (split tooltip)\n     */\n    defaultFormatter(tooltip) {\n        const items = this.points || splat(this);\n        let s;\n        // Build the header\n        s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n        // Build the values\n        s = s.concat(tooltip.bodyFormatter(items));\n        // Footer\n        s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n        return s;\n    }\n    /**\n     * Removes and destroys the tooltip and its elements.\n     *\n     * @function Highcharts.Tooltip#destroy\n     */\n    destroy() {\n        // Destroy and clear local variables\n        if (this.label) {\n            this.label = this.label.destroy();\n        }\n        if (this.split) {\n            this.cleanSplit(true);\n            if (this.tt) {\n                this.tt = this.tt.destroy();\n            }\n        }\n        if (this.renderer) {\n            this.renderer = this.renderer.destroy();\n            discardElement(this.container);\n        }\n        U.clearTimeout(this.hideTimer);\n    }\n    /**\n     * Extendable method to get the anchor position of the tooltip\n     * from a point or set of points\n     *\n     * @private\n     * @function Highcharts.Tooltip#getAnchor\n     */\n    getAnchor(points, mouseEvent) {\n        const { chart, pointer } = this, inverted = chart.inverted, plotTop = chart.plotTop, plotLeft = chart.plotLeft;\n        let ret;\n        points = splat(points);\n        // If reversedStacks are false the tooltip position should be taken from\n        // the last point (#17948)\n        if (points[0].series &&\n            points[0].series.yAxis &&\n            !points[0].series.yAxis.options.reversedStacks) {\n            points = points.slice().reverse();\n        }\n        // When tooltip follows mouse, relate the position to the mouse\n        if (this.followPointer && mouseEvent) {\n            if (typeof mouseEvent.chartX === 'undefined') {\n                mouseEvent = pointer.normalize(mouseEvent);\n            }\n            ret = [\n                mouseEvent.chartX - plotLeft,\n                mouseEvent.chartY - plotTop\n            ];\n            // Some series types use a specificly calculated tooltip position for\n            // each point\n        }\n        else if (points[0].tooltipPos) {\n            ret = points[0].tooltipPos;\n            // Calculate the average position and adjust for axis positions\n        }\n        else {\n            let chartX = 0, chartY = 0;\n            points.forEach(function (point) {\n                const pos = point.pos(true);\n                if (pos) {\n                    chartX += pos[0];\n                    chartY += pos[1];\n                }\n            });\n            chartX /= points.length;\n            chartY /= points.length;\n            // When shared, place the tooltip next to the mouse (#424)\n            if (this.shared && points.length > 1 && mouseEvent) {\n                if (inverted) {\n                    chartX = mouseEvent.chartX;\n                }\n                else {\n                    chartY = mouseEvent.chartY;\n                }\n            }\n            // Use the average position for multiple points\n            ret = [chartX - plotLeft, chartY - plotTop];\n        }\n        return ret.map(Math.round);\n    }\n    /**\n     * Get the CSS class names for the tooltip's label. Styles the label\n     * by `colorIndex` or user-defined CSS.\n     *\n     * @function Highcharts.Tooltip#getClassName\n     *\n     * @return {string}\n     *         The class names.\n     */\n    getClassName(point, isSplit, isHeader) {\n        const options = this.options, series = point.series, seriesOptions = series.options;\n        return [\n            options.className,\n            'highcharts-label',\n            isHeader && 'highcharts-tooltip-header',\n            isSplit ? 'highcharts-tooltip-box' : 'highcharts-tooltip',\n            !isHeader && 'highcharts-color-' + pick(point.colorIndex, series.colorIndex),\n            (seriesOptions && seriesOptions.className)\n        ].filter(isString).join(' ');\n    }\n    /**\n     * Creates the Tooltip label element if it does not exist, then returns it.\n     *\n     * @function Highcharts.Tooltip#getLabel\n     *\n     * @return {Highcharts.SVGElement}\n     * Tooltip label\n     */\n    getLabel({ anchorX, anchorY } = { anchorX: 0, anchorY: 0 }) {\n        const tooltip = this, styledMode = this.chart.styledMode, options = this.options, doSplit = this.split && this.allowShared;\n        let container = this.container, renderer = this.chart.renderer;\n        // If changing from a split tooltip to a non-split tooltip, we must\n        // destroy it in order to get the SVG right. #13868.\n        if (this.label) {\n            const wasSplit = !this.label.hasClass('highcharts-label');\n            if ((!doSplit && wasSplit) || (doSplit && !wasSplit)) {\n                this.destroy();\n            }\n        }\n        if (!this.label) {\n            if (this.outside) {\n                const chartStyle = this.chart.options.chart.style, Renderer = RendererRegistry.getRendererType();\n                /**\n                 * Reference to the tooltip's container, when\n                 * [Highcharts.Tooltip#outside] is set to true, otherwise\n                 * it's undefined.\n                 *\n                 * @name Highcharts.Tooltip#container\n                 * @type {Highcharts.HTMLDOMElement|undefined}\n                 */\n                this.container = container = H.doc.createElement('div');\n                container.className = 'highcharts-tooltip-container';\n                // We need to set pointerEvents = 'none' as otherwise it makes\n                // the area under the tooltip non-hoverable even after the\n                // tooltip disappears, #19035.\n                css(container, {\n                    position: 'absolute',\n                    top: '1px',\n                    pointerEvents: 'none',\n                    zIndex: Math.max(this.options.style.zIndex || 0, (chartStyle && chartStyle.zIndex || 0) + 3)\n                });\n                /**\n                 * Reference to the tooltip's renderer, when\n                 * [Highcharts.Tooltip#outside] is set to true, otherwise\n                 * it's undefined.\n                 *\n                 * @name Highcharts.Tooltip#renderer\n                 * @type {Highcharts.SVGRenderer|undefined}\n                 */\n                this.renderer = renderer = new Renderer(container, 0, 0, chartStyle, void 0, void 0, renderer.styledMode);\n            }\n            // Create the label\n            if (doSplit) {\n                this.label = renderer.g('tooltip');\n            }\n            else {\n                this.label = renderer\n                    .label('', anchorX, anchorY, options.shape, void 0, void 0, options.useHTML, void 0, 'tooltip')\n                    .attr({\n                    padding: options.padding,\n                    r: options.borderRadius\n                });\n                if (!styledMode) {\n                    this.label\n                        .attr({\n                        fill: options.backgroundColor,\n                        'stroke-width': options.borderWidth || 0\n                    })\n                        // #2301, #2657\n                        .css(options.style)\n                        .css({\n                        pointerEvents: (options.style.pointerEvents ||\n                            (this.shouldStickOnContact() ? 'auto' : 'none'))\n                    });\n                }\n            }\n            // Split tooltip use updateTooltipContainer to position the tooltip\n            // container.\n            if (tooltip.outside) {\n                const label = this.label;\n                [label.xSetter, label.ySetter].forEach((setter, i) => {\n                    label[i ? 'ySetter' : 'xSetter'] = (value) => {\n                        setter.call(label, tooltip.distance);\n                        label[i ? 'y' : 'x'] = value;\n                        if (container) {\n                            container.style[i ? 'top' : 'left'] = `${value}px`;\n                        }\n                    };\n                });\n            }\n            this.label\n                .attr({ zIndex: 8 })\n                .shadow(options.shadow)\n                .add();\n        }\n        if (container && !container.parentElement) {\n            H.doc.body.appendChild(container);\n        }\n        return this.label;\n    }\n    /**\n     * Get the total area available area to place the tooltip\n     *\n     * @private\n     */\n    getPlayingField() {\n        const { body, documentElement } = doc, { chart, distance, outside } = this;\n        return {\n            width: outside ?\n                // Subtract distance to prevent scrollbars\n                Math.max(body.scrollWidth, documentElement.scrollWidth, body.offsetWidth, documentElement.offsetWidth, documentElement.clientWidth) - 2 * distance :\n                chart.chartWidth,\n            height: outside ?\n                Math.max(body.scrollHeight, documentElement.scrollHeight, body.offsetHeight, documentElement.offsetHeight, documentElement.clientHeight) :\n                chart.chartHeight\n        };\n    }\n    /**\n     * Place the tooltip in a chart without spilling over and not covering the\n     * point itself.\n     *\n     * @function Highcharts.Tooltip#getPosition\n     *\n     * @param {number} boxWidth\n     *        Width of the tooltip box.\n     *\n     * @param {number} boxHeight\n     *        Height of the tooltip box.\n     *\n     * @param {Highcharts.Point} point\n     *        Tooltip related point.\n     *\n     * @return {Highcharts.PositionObject}\n     *         Recommended position of the tooltip.\n     */\n    getPosition(boxWidth, boxHeight, point) {\n        const { distance, chart, outside, pointer } = this, { inverted, plotLeft, plotTop, polar } = chart, { plotX = 0, plotY = 0 } = point, ret = {}, \n        // Don't use h if chart isn't inverted (#7242) ???\n        h = (inverted && point.h) || 0, // #4117 ???\n        { height: outerHeight, width: outerWidth } = this.getPlayingField(), chartPosition = pointer.getChartPosition(), scaleX = (val) => (val * chartPosition.scaleX), scaleY = (val) => (val * chartPosition.scaleY), \n        // Build parameter arrays for firstDimension()/secondDimension()\n        buildDimensionArray = (dim) => {\n            const isX = dim === 'x';\n            return [\n                dim, // Dimension - x or y\n                isX ? outerWidth : outerHeight,\n                isX ? boxWidth : boxHeight\n            ].concat(outside ? [\n                // If we are using tooltip.outside, we need to scale the\n                // position to match scaling of the container in case there\n                // is a transform/zoom on the container. #11329\n                isX ? scaleX(boxWidth) : scaleY(boxHeight),\n                isX ? chartPosition.left - distance +\n                    scaleX(plotX + plotLeft) :\n                    chartPosition.top - distance +\n                        scaleY(plotY + plotTop),\n                0,\n                isX ? outerWidth : outerHeight\n            ] : [\n                // Not outside, no scaling is needed\n                isX ? boxWidth : boxHeight,\n                isX ? plotX + plotLeft : plotY + plotTop,\n                isX ? plotLeft : plotTop,\n                isX ? plotLeft + chart.plotWidth :\n                    plotTop + chart.plotHeight\n            ]);\n        };\n        let first = buildDimensionArray('y'), second = buildDimensionArray('x'), swapped;\n        // Handle negative points or reversed axis (#13780)\n        let flipped = !!point.negative;\n        if (!polar &&\n            chart.hoverSeries?.yAxis?.reversed) {\n            flipped = !flipped;\n        }\n        // The far side is right or bottom\n        const preferFarSide = !this.followPointer &&\n            pick(point.ttBelow, polar ? false : !inverted === flipped), // #4984\n        /*\n         * Handle the preferred dimension. When the preferred dimension is\n         * tooltip on top or bottom of the point, it will look for space\n         * there.\n         *\n         * @private\n         */\n        firstDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n        point, min, max) {\n            const scaledDist = outside ?\n                (dim === 'y' ? scaleY(distance) : scaleX(distance)) :\n                distance, scaleDiff = (innerSize - scaledInnerSize) / 2, roomLeft = scaledInnerSize < point - distance, roomRight = point + distance + scaledInnerSize < outerSize, alignedLeft = point - scaledDist - innerSize + scaleDiff, alignedRight = point + scaledDist - scaleDiff;\n            if (preferFarSide && roomRight) {\n                ret[dim] = alignedRight;\n            }\n            else if (!preferFarSide && roomLeft) {\n                ret[dim] = alignedLeft;\n            }\n            else if (roomLeft) {\n                ret[dim] = Math.min(max - scaledInnerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n            }\n            else if (roomRight) {\n                ret[dim] = Math.max(min, alignedRight + h + innerSize > outerSize ?\n                    alignedRight :\n                    alignedRight + h);\n            }\n            else {\n                return false;\n            }\n        }, \n        /*\n         * Handle the secondary dimension. If the preferred dimension is\n         * tooltip on top or bottom of the point, the second dimension is to\n         * align the tooltip above the point, trying to align center but\n         * allowing left or right align within the chart box.\n         *\n         * @private\n         */\n        secondDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n        point) {\n            // Too close to the edge, return false and swap dimensions\n            if (point < distance || point > outerSize - distance) {\n                return false;\n            }\n            // Align left/top\n            if (point < innerSize / 2) {\n                ret[dim] = 1;\n                // Align right/bottom\n            }\n            else if (point > outerSize - scaledInnerSize / 2) {\n                ret[dim] = outerSize - scaledInnerSize - 2;\n                // Align center\n            }\n            else {\n                ret[dim] = point - innerSize / 2;\n            }\n        }, \n        /*\n         * Swap the dimensions\n         */\n        swap = function (count) {\n            [first, second] = [second, first];\n            swapped = count;\n        }, run = () => {\n            if (firstDimension.apply(0, first) !== false) {\n                if (secondDimension.apply(0, second) === false &&\n                    !swapped) {\n                    swap(true);\n                    run();\n                }\n            }\n            else if (!swapped) {\n                swap(true);\n                run();\n            }\n            else {\n                ret.x = ret.y = 0;\n            }\n        };\n        // Under these conditions, prefer the tooltip on the side of the point\n        if ((inverted && !polar) || this.len > 1) {\n            swap();\n        }\n        run();\n        return ret;\n    }\n    /**\n     * Hides the tooltip with a fade out animation.\n     *\n     * @function Highcharts.Tooltip#hide\n     *\n     * @param {number} [delay]\n     *        The fade out in milliseconds. If no value is provided the value\n     *        of the tooltip.hideDelay option is used. A value of 0 disables\n     *        the fade out animation.\n     */\n    hide(delay) {\n        const tooltip = this;\n        // Disallow duplicate timers (#1728, #1766)\n        U.clearTimeout(this.hideTimer);\n        delay = pick(delay, this.options.hideDelay);\n        if (!this.isHidden) {\n            this.hideTimer = syncTimeout(function () {\n                const label = tooltip.getLabel();\n                // If there is a delay, fade out with the default duration. If\n                // the hideDelay is 0, we assume no animation is wanted, so we\n                // pass 0 duration. #12994.\n                tooltip.getLabel().animate({\n                    opacity: 0\n                }, {\n                    duration: delay ? 150 : delay,\n                    complete: () => {\n                        // #3088, assuming we're only using this for tooltips\n                        label.hide();\n                        // Clear the container for outside tooltip (#18490)\n                        if (tooltip.container) {\n                            tooltip.container.remove();\n                        }\n                    }\n                });\n                tooltip.isHidden = true;\n            }, delay);\n        }\n    }\n    /**\n     * Initialize tooltip.\n     *\n     * @private\n     * @function Highcharts.Tooltip#init\n     *\n     * @param {Highcharts.Chart} chart\n     *        The chart instance.\n     *\n     * @param {Highcharts.TooltipOptions} options\n     *        Tooltip options.\n     */\n    init(chart, options) {\n        /**\n         * Chart of the tooltip.\n         *\n         * @readonly\n         * @name Highcharts.Tooltip#chart\n         * @type {Highcharts.Chart}\n         */\n        this.chart = chart;\n        /**\n         * Used tooltip options.\n         *\n         * @readonly\n         * @name Highcharts.Tooltip#options\n         * @type {Highcharts.TooltipOptions}\n         */\n        this.options = options;\n        /**\n         * List of crosshairs.\n         *\n         * @private\n         * @readonly\n         * @name Highcharts.Tooltip#crosshairs\n         * @type {Array<null>}\n         */\n        this.crosshairs = [];\n        /**\n         * Tooltips are initially hidden.\n         *\n         * @private\n         * @readonly\n         * @name Highcharts.Tooltip#isHidden\n         * @type {boolean}\n         */\n        this.isHidden = true;\n        /**\n         * True, if the tooltip is split into one label per series, with the\n         * header close to the axis.\n         *\n         * @readonly\n         * @name Highcharts.Tooltip#split\n         * @type {boolean|undefined}\n         */\n        this.split = options.split && !chart.inverted && !chart.polar;\n        /**\n         * When the tooltip is shared, the entire plot area will capture mouse\n         * movement or touch events.\n         *\n         * @readonly\n         * @name Highcharts.Tooltip#shared\n         * @type {boolean|undefined}\n         */\n        this.shared = options.shared || this.split;\n        /**\n         * Whether to allow the tooltip to render outside the chart's SVG\n         * element box. By default (false), the tooltip is rendered within the\n         * chart's SVG element, which results in the tooltip being aligned\n         * inside the chart area.\n         *\n         * @readonly\n         * @name Highcharts.Tooltip#outside\n         * @type {boolean}\n         *\n         * @todo\n         * Split tooltip does not support outside in the first iteration. Should\n         * not be too complicated to implement.\n         */\n        this.outside = pick(options.outside, Boolean(chart.scrollablePixelsX || chart.scrollablePixelsY));\n    }\n    shouldStickOnContact(pointerEvent) {\n        return !!(!this.followPointer &&\n            this.options.stickOnContact &&\n            (!pointerEvent || this.pointer.inClass(pointerEvent.target, 'highcharts-tooltip')));\n    }\n    /**\n     * Moves the tooltip with a soft animation to a new position.\n     *\n     * @private\n     * @function Highcharts.Tooltip#move\n     *\n     * @param {number} x\n     *\n     * @param {number} y\n     *\n     * @param {number} anchorX\n     *\n     * @param {number} anchorY\n     */\n    move(x, y, anchorX, anchorY) {\n        const tooltip = this, animation = animObject(!tooltip.isHidden && tooltip.options.animation), skipAnchor = tooltip.followPointer || (tooltip.len || 0) > 1, attr = { x, y };\n        if (!skipAnchor) {\n            attr.anchorX = anchorX;\n            attr.anchorY = anchorY;\n        }\n        animation.step = () => tooltip.drawTracker();\n        tooltip.getLabel().animate(attr, animation);\n    }\n    /**\n     * Refresh the tooltip's text and position.\n     *\n     * @function Highcharts.Tooltip#refresh\n     *\n     * @param {Highcharts.Point|Array<Highcharts.Point>} pointOrPoints\n     *        Either a point or an array of points.\n     *\n     * @param {Highcharts.PointerEventObject} [mouseEvent]\n     *        Mouse event, that is responsible for the refresh and should be\n     *        used for the tooltip update.\n     */\n    refresh(pointOrPoints, mouseEvent) {\n        const tooltip = this, { chart, options, pointer, shared } = this, points = splat(pointOrPoints), point = points[0], pointConfig = [], formatString = options.format, formatter = options.formatter || tooltip.defaultFormatter, styledMode = chart.styledMode;\n        let formatterContext = {}, wasShared = tooltip.allowShared;\n        if (!options.enabled || !point.series) { // #16820\n            return;\n        }\n        U.clearTimeout(this.hideTimer);\n        // A switch saying if this specific tooltip configuration allows shared\n        // or split modes\n        tooltip.allowShared = !(!isArray(pointOrPoints) &&\n            pointOrPoints.series &&\n            pointOrPoints.series.noSharedTooltip);\n        wasShared = wasShared && !tooltip.allowShared;\n        // Get the reference point coordinates (pie charts use tooltipPos)\n        tooltip.followPointer = (!tooltip.split && point.series.tooltipOptions.followPointer);\n        const anchor = tooltip.getAnchor(pointOrPoints, mouseEvent), x = anchor[0], y = anchor[1];\n        // Shared tooltip, array is sent over\n        if (shared && tooltip.allowShared) {\n            pointer.applyInactiveState(points);\n            // Now set hover state for the chosen ones:\n            points.forEach(function (item) {\n                item.setState('hover');\n                pointConfig.push(item.getLabelConfig());\n            });\n            formatterContext = point.getLabelConfig();\n            formatterContext.points = pointConfig;\n            // Single point tooltip\n        }\n        else {\n            formatterContext = point.getLabelConfig();\n        }\n        this.len = pointConfig.length; // #6128\n        const text = isString(formatString) ?\n            format(formatString, formatterContext, chart) :\n            formatter.call(formatterContext, tooltip);\n        // Register the current series\n        const currentSeries = point.series;\n        this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n        // Update the inner HTML\n        if (text === false) {\n            this.hide();\n        }\n        else {\n            // Update text\n            if (tooltip.split && tooltip.allowShared) { // #13868\n                this.renderSplit(text, points);\n            }\n            else {\n                let checkX = x;\n                let checkY = y;\n                if (mouseEvent && pointer.isDirectTouch) {\n                    checkX = mouseEvent.chartX - chart.plotLeft;\n                    checkY = mouseEvent.chartY - chart.plotTop;\n                }\n                // #11493, #13095\n                if (chart.polar ||\n                    currentSeries.options.clip === false ||\n                    points.some((p) => // #16004\n                     pointer.isDirectTouch || // ##17929\n                        p.series.shouldShowTooltip(checkX, checkY))) {\n                    const label = tooltip.getLabel(wasShared && tooltip.tt || {});\n                    // Prevent the tooltip from flowing over the chart box\n                    // (#6659)\n                    if (!options.style.width || styledMode) {\n                        label.css({\n                            width: (this.outside ?\n                                this.getPlayingField() :\n                                chart.spacingBox).width + 'px'\n                        });\n                    }\n                    label.attr({\n                        // Add class before the label BBox calculation (#21035)\n                        'class': tooltip.getClassName(point),\n                        text: text && text.join ?\n                            text.join('') :\n                            text\n                    });\n                    // When the length of the label has increased, immediately\n                    // update the x position to prevent tooltip from flowing\n                    // outside the viewport during animation (#21371)\n                    if (this.outside) {\n                        label.attr({\n                            x: clamp(label.x || 0, 0, this.getPlayingField().width -\n                                (label.width || 0))\n                        });\n                    }\n                    if (!styledMode) {\n                        label.attr({\n                            stroke: (options.borderColor ||\n                                point.color ||\n                                currentSeries.color ||\n                                \"#666666\" /* Palette.neutralColor60 */)\n                        });\n                    }\n                    tooltip.updatePosition({\n                        plotX: x,\n                        plotY: y,\n                        negative: point.negative,\n                        ttBelow: point.ttBelow,\n                        h: anchor[2] || 0\n                    });\n                }\n                else {\n                    tooltip.hide();\n                    return;\n                }\n            }\n            // Show it\n            if (tooltip.isHidden && tooltip.label) {\n                tooltip.label.attr({\n                    opacity: 1\n                }).show();\n            }\n            tooltip.isHidden = false;\n        }\n        fireEvent(this, 'refresh');\n    }\n    /**\n     * Render the split tooltip. Loops over each point's text and adds\n     * a label next to the point, then uses the distribute function to\n     * find best non-overlapping positions.\n     *\n     * @private\n     * @function Highcharts.Tooltip#renderSplit\n     *\n     * @param {string|Array<(boolean|string)>} labels\n     *\n     * @param {Array<Highcharts.Point>} points\n     */\n    renderSplit(labels, points) {\n        const tooltip = this;\n        const { chart, chart: { chartWidth, chartHeight, plotHeight, plotLeft, plotTop, scrollablePixelsY = 0, scrollablePixelsX, styledMode }, distance, options, options: { positioner }, pointer } = tooltip;\n        const { scrollLeft = 0, scrollTop = 0 } = chart.scrollablePlotArea?.scrollingContainer || {};\n        // The area which the tooltip should be limited to. Limit to scrollable\n        // plot area if enabled, otherwise limit to the chart container. If\n        // outside is true it should be the whole viewport\n        const bounds = (tooltip.outside &&\n            typeof scrollablePixelsX !== 'number') ?\n            doc.documentElement.getBoundingClientRect() : {\n            left: scrollLeft,\n            right: scrollLeft + chartWidth,\n            top: scrollTop,\n            bottom: scrollTop + chartHeight\n        };\n        const tooltipLabel = tooltip.getLabel();\n        const ren = this.renderer || chart.renderer;\n        const headerTop = Boolean(chart.xAxis[0] && chart.xAxis[0].opposite);\n        const { left: chartLeft, top: chartTop } = pointer.getChartPosition();\n        let distributionBoxTop = plotTop + scrollTop;\n        let headerHeight = 0;\n        let adjustedPlotHeight = plotHeight - scrollablePixelsY;\n        /**\n         * Calculates the anchor position for the partial tooltip\n         *\n         * @private\n         * @param {Highcharts.Point} point The point related to the tooltip\n         * @return {Object} Returns an object with anchorX and anchorY\n         */\n        function getAnchor(point) {\n            const { isHeader, plotX = 0, plotY = 0, series } = point;\n            let anchorX;\n            let anchorY;\n            if (isHeader) {\n                // Set anchorX to plotX\n                anchorX = Math.max(plotLeft + plotX, plotLeft);\n                // Set anchorY to center of visible plot area.\n                anchorY = plotTop + plotHeight / 2;\n            }\n            else {\n                const { xAxis, yAxis } = series;\n                // Set anchorX to plotX. Limit to within xAxis.\n                anchorX = xAxis.pos + clamp(plotX, -distance, xAxis.len + distance);\n                // Set anchorY, limit to the scrollable plot area\n                if (series.shouldShowTooltip(0, yAxis.pos - plotTop + plotY, {\n                    ignoreX: true\n                })) {\n                    anchorY = yAxis.pos + plotY;\n                }\n            }\n            // Limit values to plot area\n            anchorX = clamp(anchorX, bounds.left - distance, bounds.right + distance);\n            return { anchorX, anchorY };\n        }\n        /**\n         * Calculates the position of the partial tooltip\n         *\n         * @private\n         * @param {number} anchorX\n         * The partial tooltip anchor x position\n         *\n         * @param {number} anchorY\n         * The partial tooltip anchor y position\n         *\n         * @param {boolean|undefined} isHeader\n         * Whether the partial tooltip is a header\n         *\n         * @param {number} boxWidth\n         * Width of the partial tooltip\n         *\n         * @return {Highcharts.PositionObject}\n         * Returns the partial tooltip x and y position\n         */\n        function defaultPositioner(anchorX, anchorY, isHeader, boxWidth, alignedLeft = true) {\n            let y;\n            let x;\n            if (isHeader) {\n                y = headerTop ? 0 : adjustedPlotHeight;\n                x = clamp(anchorX - (boxWidth / 2), bounds.left, bounds.right - boxWidth - (tooltip.outside ? chartLeft : 0));\n            }\n            else {\n                y = anchorY - distributionBoxTop;\n                x = alignedLeft ?\n                    anchorX - boxWidth - distance :\n                    anchorX + distance;\n                x = clamp(x, alignedLeft ? x : bounds.left, bounds.right);\n            }\n            // NOTE: y is relative to distributionBoxTop\n            return { x, y };\n        }\n        /**\n         * Updates the attributes and styling of the partial tooltip. Creates a\n         * new partial tooltip if it does not exists.\n         *\n         * @private\n         * @param {Highcharts.SVGElement|undefined} partialTooltip\n         *  The partial tooltip to update\n         * @param {Highcharts.Point} point\n         *  The point related to the partial tooltip\n         * @param {boolean|string} str The text for the partial tooltip\n         * @return {Highcharts.SVGElement} Returns the updated partial tooltip\n         */\n        function updatePartialTooltip(partialTooltip, point, str) {\n            let tt = partialTooltip;\n            const { isHeader, series } = point;\n            if (!tt) {\n                const attribs = {\n                    padding: options.padding,\n                    r: options.borderRadius\n                };\n                if (!styledMode) {\n                    attribs.fill = options.backgroundColor;\n                    attribs['stroke-width'] = options.borderWidth ?? 1;\n                }\n                tt = ren\n                    .label('', 0, 0, (options[isHeader ? 'headerShape' : 'shape']), void 0, void 0, options.useHTML)\n                    .addClass(tooltip.getClassName(point, true, isHeader))\n                    .attr(attribs)\n                    .add(tooltipLabel);\n            }\n            tt.isActive = true;\n            tt.attr({\n                text: str\n            });\n            if (!styledMode) {\n                tt.css(options.style)\n                    .attr({\n                    stroke: (options.borderColor ||\n                        point.color ||\n                        series.color ||\n                        \"#333333\" /* Palette.neutralColor80 */)\n                });\n            }\n            return tt;\n        }\n        // Graceful degradation for legacy formatters\n        if (isString(labels)) {\n            labels = [false, labels];\n        }\n        // Create the individual labels for header and points, ignore footer\n        let boxes = labels.slice(0, points.length + 1).reduce(function (boxes, str, i) {\n            if (str !== false && str !== '') {\n                const point = (points[i - 1] ||\n                    {\n                        // Item 0 is the header. Instead of this, we could also\n                        // use the crosshair label\n                        isHeader: true,\n                        plotX: points[0].plotX,\n                        plotY: plotHeight,\n                        series: {}\n                    });\n                const isHeader = point.isHeader;\n                // Store the tooltip label reference on the series\n                const owner = isHeader ? tooltip : point.series;\n                const tt = owner.tt = updatePartialTooltip(owner.tt, point, str.toString());\n                // Get X position now, so we can move all to the other side in\n                // case of overflow\n                const bBox = tt.getBBox();\n                const boxWidth = bBox.width + tt.strokeWidth();\n                if (isHeader) {\n                    headerHeight = bBox.height;\n                    adjustedPlotHeight += headerHeight;\n                    if (headerTop) {\n                        distributionBoxTop -= headerHeight;\n                    }\n                }\n                const { anchorX, anchorY } = getAnchor(point);\n                if (typeof anchorY === 'number') {\n                    const size = bBox.height + 1;\n                    const boxPosition = (positioner ?\n                        positioner.call(tooltip, boxWidth, size, point) :\n                        defaultPositioner(anchorX, anchorY, isHeader, boxWidth));\n                    boxes.push({\n                        // 0-align to the top, 1-align to the bottom\n                        align: positioner ? 0 : void 0,\n                        anchorX,\n                        anchorY,\n                        boxWidth,\n                        point,\n                        rank: pick(boxPosition.rank, isHeader ? 1 : 0),\n                        size,\n                        target: boxPosition.y,\n                        tt,\n                        x: boxPosition.x\n                    });\n                }\n                else {\n                    // Hide tooltips which anchorY is outside the visible plot\n                    // area\n                    tt.isActive = false;\n                }\n            }\n            return boxes;\n        }, []);\n        // Realign the tooltips towards the right if there is not enough space\n        // to the left and there is space to the right\n        if (!positioner && boxes.some((box) => {\n            // Always realign if the beginning of a label is outside bounds\n            const { outside } = tooltip;\n            const boxStart = (outside ? chartLeft : 0) + box.anchorX;\n            if (boxStart < bounds.left &&\n                boxStart + box.boxWidth < bounds.right) {\n                return true;\n            }\n            // Otherwise, check if there is more space available to the right\n            return boxStart < (chartLeft - bounds.left) + box.boxWidth &&\n                bounds.right - boxStart > boxStart;\n        })) {\n            boxes = boxes.map((box) => {\n                const { x, y } = defaultPositioner(box.anchorX, box.anchorY, box.point.isHeader, box.boxWidth, false);\n                return extend(box, {\n                    target: y,\n                    x\n                });\n            });\n        }\n        // Clean previous run (for missing points)\n        tooltip.cleanSplit();\n        // Distribute and put in place\n        distribute(boxes, adjustedPlotHeight);\n        const boxExtremes = {\n            left: chartLeft,\n            right: chartLeft\n        };\n        // Get the extremes from series tooltips\n        boxes.forEach(function (box) {\n            const { x, boxWidth, isHeader } = box;\n            if (!isHeader) {\n                if (tooltip.outside && chartLeft + x < boxExtremes.left) {\n                    boxExtremes.left = chartLeft + x;\n                }\n                if (!isHeader &&\n                    tooltip.outside &&\n                    boxExtremes.left + boxWidth > boxExtremes.right) {\n                    boxExtremes.right = chartLeft + x;\n                }\n            }\n        });\n        boxes.forEach(function (box) {\n            const { x, anchorX, anchorY, pos, point: { isHeader } } = box;\n            const attributes = {\n                visibility: typeof pos === 'undefined' ? 'hidden' : 'inherit',\n                x,\n                /* NOTE: y should equal pos to be consistent with !split\n                 * tooltip, but is currently relative to plotTop. Is left as is\n                 * to avoid breaking change. Remove distributionBoxTop to make\n                 * it consistent.\n                 */\n                y: (pos || 0) + distributionBoxTop,\n                anchorX,\n                anchorY\n            };\n            // Handle left-aligned tooltips overflowing the chart area\n            if (tooltip.outside && x < anchorX) {\n                const offset = chartLeft - boxExtremes.left;\n                // Skip this if there is no overflow\n                if (offset > 0) {\n                    if (!isHeader) {\n                        attributes.x = x + offset;\n                        attributes.anchorX = anchorX + offset;\n                    }\n                    if (isHeader) {\n                        attributes.x = (boxExtremes.right - boxExtremes.left) / 2;\n                        attributes.anchorX = anchorX + offset;\n                    }\n                }\n            }\n            // Put the label in place\n            box.tt.attr(attributes);\n        });\n        /* If we have a separate tooltip container, then update the necessary\n         * container properties.\n         * Test that tooltip has its own container and renderer before executing\n         * the operation.\n         */\n        const { container, outside, renderer } = tooltip;\n        if (outside && container && renderer) {\n            // Set container size to fit the bounds\n            const { width, height, x, y } = tooltipLabel.getBBox();\n            renderer.setSize(width + x, height + y, false);\n            // Position the tooltip container to the chart container\n            container.style.left = boxExtremes.left + 'px';\n            container.style.top = chartTop + 'px';\n        }\n        // Workaround for #18927, artefacts left by the shadows of split\n        // tooltips in Safari v16 (2023). Check again with later versions if we\n        // can remove this.\n        if (isSafari) {\n            tooltipLabel.attr({\n                // Force a redraw of the whole group by chaining the opacity\n                // slightly\n                opacity: tooltipLabel.opacity === 1 ? 0.999 : 1\n            });\n        }\n    }\n    /**\n     * If the `stickOnContact` option is active, this will add a tracker shape.\n     *\n     * @private\n     * @function Highcharts.Tooltip#drawTracker\n     */\n    drawTracker() {\n        const tooltip = this;\n        if (!this.shouldStickOnContact()) {\n            if (tooltip.tracker) {\n                tooltip.tracker = tooltip.tracker.destroy();\n            }\n            return;\n        }\n        const chart = tooltip.chart;\n        const label = tooltip.label;\n        const points = tooltip.shared ? chart.hoverPoints : chart.hoverPoint;\n        if (!label || !points) {\n            return;\n        }\n        const box = {\n            x: 0,\n            y: 0,\n            width: 0,\n            height: 0\n        };\n        // Combine anchor and tooltip\n        const anchorPos = this.getAnchor(points);\n        const labelBBox = label.getBBox();\n        anchorPos[0] += chart.plotLeft - (label.translateX || 0);\n        anchorPos[1] += chart.plotTop - (label.translateY || 0);\n        // When the mouse pointer is between the anchor point and the label,\n        // the label should stick.\n        box.x = Math.min(0, anchorPos[0]);\n        box.y = Math.min(0, anchorPos[1]);\n        box.width = (anchorPos[0] < 0 ?\n            Math.max(Math.abs(anchorPos[0]), labelBBox.width - anchorPos[0]) :\n            Math.max(Math.abs(anchorPos[0]), labelBBox.width));\n        box.height = (anchorPos[1] < 0 ?\n            Math.max(Math.abs(anchorPos[1]), labelBBox.height - Math.abs(anchorPos[1])) :\n            Math.max(Math.abs(anchorPos[1]), labelBBox.height));\n        if (tooltip.tracker) {\n            tooltip.tracker.attr(box);\n        }\n        else {\n            tooltip.tracker = label.renderer\n                .rect(box)\n                .addClass('highcharts-tracker')\n                .add(label);\n            if (!chart.styledMode) {\n                tooltip.tracker.attr({\n                    fill: 'rgba(0,0,0,0)'\n                });\n            }\n        }\n    }\n    /**\n     * @private\n     */\n    styledModeFormat(formatString) {\n        return formatString\n            .replace('style=\"font-size: 0.8em\"', 'class=\"highcharts-header\"')\n            .replace(/style=\"color:{(point|series)\\.color}\"/g, 'class=\"highcharts-color-{$1.colorIndex} ' +\n            '{series.options.className} ' +\n            '{point.options.className}\"');\n    }\n    /**\n     * Format the footer/header of the tooltip\n     * #3397: abstraction to enable formatting of footer and header\n     *\n     * @private\n     * @function Highcharts.Tooltip#tooltipFooterHeaderFormatter\n     */\n    tooltipFooterHeaderFormatter(labelConfig, isFooter) {\n        const series = labelConfig.series, tooltipOptions = series.tooltipOptions, xAxis = series.xAxis, dateTime = xAxis && xAxis.dateTime, e = {\n            isFooter: isFooter,\n            labelConfig: labelConfig\n        };\n        let xDateFormat = tooltipOptions.xDateFormat, formatString = tooltipOptions[isFooter ? 'footerFormat' : 'headerFormat'];\n        fireEvent(this, 'headerFormatter', e, function (e) {\n            // Guess the best date format based on the closest point distance\n            // (#568, #3418)\n            if (dateTime && !xDateFormat && isNumber(labelConfig.key)) {\n                xDateFormat = dateTime.getXDateFormat(labelConfig.key, tooltipOptions.dateTimeLabelFormats);\n            }\n            // Insert the footer date format if any\n            if (dateTime && xDateFormat) {\n                ((labelConfig.point && labelConfig.point.tooltipDateKeys) ||\n                    ['key']).forEach(function (key) {\n                    formatString = formatString.replace('{point.' + key + '}', '{point.' + key + ':' + xDateFormat + '}');\n                });\n            }\n            // Replace default header style with class name\n            if (series.chart.styledMode) {\n                formatString = this.styledModeFormat(formatString);\n            }\n            e.text = format(formatString, {\n                point: labelConfig,\n                series: series\n            }, this.chart);\n        });\n        return e.text;\n    }\n    /**\n     * Updates the tooltip with the provided tooltip options.\n     *\n     * @function Highcharts.Tooltip#update\n     *\n     * @param {Highcharts.TooltipOptions} options\n     *        The tooltip options to update.\n     */\n    update(options) {\n        this.destroy();\n        this.init(this.chart, merge(true, this.options, options));\n    }\n    /**\n     * Find the new position and perform the move\n     *\n     * @private\n     * @function Highcharts.Tooltip#updatePosition\n     *\n     * @param {Highcharts.Point} point\n     */\n    updatePosition(point) {\n        const { chart, container, distance, options, pointer, renderer } = this, { height = 0, width = 0 } = this.getLabel(), \n        // Needed for outside: true (#11688)\n        { left, top, scaleX, scaleY } = pointer.getChartPosition(), pos = (options.positioner || this.getPosition).call(this, width, height, point);\n        let anchorX = (point.plotX || 0) + chart.plotLeft, anchorY = (point.plotY || 0) + chart.plotTop, pad;\n        // Set the renderer size dynamically to prevent document size to change.\n        // Renderer only exists when tooltip is outside.\n        if (renderer && container) {\n            // Corrects positions, occurs with tooltip positioner (#16944)\n            if (options.positioner) {\n                pos.x += left - distance;\n                pos.y += top - distance;\n            }\n            // Pad it by the border width and distance. Add 2 to make room for\n            // the default shadow (#19314).\n            pad = (options.borderWidth || 0) + 2 * distance + 2;\n            renderer.setSize(width + pad, height + pad, false);\n            // Anchor and tooltip container need scaling if chart container has\n            // scale transform/css zoom. #11329.\n            if (scaleX !== 1 || scaleY !== 1) {\n                css(container, {\n                    transform: `scale(${scaleX}, ${scaleY})`\n                });\n                anchorX *= scaleX;\n                anchorY *= scaleY;\n            }\n            anchorX += left - pos.x;\n            anchorY += top - pos.y;\n        }\n        // Do the move\n        this.move(Math.round(pos.x), Math.round(pos.y || 0), // Can be undefined (#3977)\n        anchorX, anchorY);\n    }\n}\n/* *\n *\n *  Class namespace\n *\n * */\n(function (Tooltip) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    function compose(PointerClass) {\n        if (pushUnique(composed, 'Core.Tooltip')) {\n            addEvent(PointerClass, 'afterInit', function () {\n                const chart = this.chart;\n                if (chart.options.tooltip) {\n                    /**\n                     * Tooltip object for points of series.\n                     *\n                     * @name Highcharts.Chart#tooltip\n                     * @type {Highcharts.Tooltip}\n                     */\n                    chart.tooltip = new Tooltip(chart, chart.options.tooltip, this);\n                }\n            });\n        }\n    }\n    Tooltip.compose = compose;\n})(Tooltip || (Tooltip = {}));\n/* *\n *\n *  Default export\n *\n * */\nexport default Tooltip;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Callback function to format the text of the tooltip from scratch.\n *\n * In case of single or shared tooltips, a string should be returned. In case\n * of splitted tooltips, it should return an array where the first item is the\n * header, and subsequent items are mapped to the points. Return `false` to\n * disable tooltip for a specific point on series.\n *\n * @callback Highcharts.TooltipFormatterCallbackFunction\n *\n * @param {Highcharts.TooltipFormatterContextObject} this\n * Context to format\n *\n * @param {Highcharts.Tooltip} tooltip\n * The tooltip instance\n *\n * @return {false|string|Array<(string|null|undefined)>|null|undefined}\n * Formatted text or false\n */\n/**\n * Configuration for the tooltip formatters.\n *\n * @interface Highcharts.TooltipFormatterContextObject\n * @extends Highcharts.PointLabelObject\n */ /**\n* Array of points in shared tooltips.\n* @name Highcharts.TooltipFormatterContextObject#points\n* @type {Array<Highcharts.TooltipFormatterContextObject>|undefined}\n*/\n/**\n * A callback function to place the tooltip in a specific position.\n *\n * @callback Highcharts.TooltipPositionerCallbackFunction\n *\n * @param {Highcharts.Tooltip} this\n * Tooltip context of the callback.\n *\n * @param {number} labelWidth\n * Width of the tooltip.\n *\n * @param {number} labelHeight\n * Height of the tooltip.\n *\n * @param {Highcharts.TooltipPositionerPointObject} point\n * Point information for positioning a tooltip.\n *\n * @return {Highcharts.PositionObject}\n * New position for the tooltip.\n */\n/**\n * Point information for positioning a tooltip.\n *\n * @interface Highcharts.TooltipPositionerPointObject\n * @extends Highcharts.Point\n */ /**\n* If `tooltip.split` option is enabled and positioner is called for each of the\n* boxes separately, this property indicates the call on the xAxis header, which\n* is not a point itself.\n* @name Highcharts.TooltipPositionerPointObject#isHeader\n* @type {boolean}\n*/ /**\n* The reference point relative to the plot area. Add chart.plotLeft to get the\n* full coordinates.\n* @name Highcharts.TooltipPositionerPointObject#plotX\n* @type {number}\n*/ /**\n* The reference point relative to the plot area. Add chart.plotTop to get the\n* full coordinates.\n* @name Highcharts.TooltipPositionerPointObject#plotY\n* @type {number}\n*/\n/**\n * @typedef {\"callout\"|\"circle\"|\"rect\"} Highcharts.TooltipShapeValue\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Color from './Color/Color.js';\nconst { parse: color } = Color;\nimport H from './Globals.js';\nconst { charts, composed, isTouchDevice } = H;\nimport U from './Utilities.js';\nconst { addEvent, attr, css, extend, find, fireEvent, isNumber, isObject, objectEach, offset, pick, pushUnique, splat } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The mouse and touch tracker object. Each {@link Chart} item has one\n * associated Pointer item that can be accessed from the  {@link Chart.pointer}\n * property.\n *\n * @class\n * @name Highcharts.Pointer\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.Options} options\n * The root options object. The pointer uses options from the chart and tooltip\n * structures.\n */\nclass Pointer {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Set inactive state to all series that are not currently hovered,\n     * or, if `inactiveOtherPoints` is set to true, set inactive state to\n     * all points within that series.\n     *\n     * @private\n     * @function Highcharts.Pointer#applyInactiveState\n     *\n     * @param {Array<Highcharts.Point>} points\n     * Currently hovered points\n     */\n    applyInactiveState(points) {\n        let activeSeries = [], series;\n        // Get all active series from the hovered points\n        (points || []).forEach(function (item) {\n            series = item.series;\n            // Include itself\n            activeSeries.push(series);\n            // Include parent series\n            if (series.linkedParent) {\n                activeSeries.push(series.linkedParent);\n            }\n            // Include all child series\n            if (series.linkedSeries) {\n                activeSeries = activeSeries.concat(series.linkedSeries);\n            }\n            // Include navigator series\n            if (series.navigatorSeries) {\n                activeSeries.push(series.navigatorSeries);\n            }\n        });\n        // Now loop over all series, filtering out active series\n        this.chart.series.forEach(function (inactiveSeries) {\n            if (activeSeries.indexOf(inactiveSeries) === -1) {\n                // Inactive series\n                inactiveSeries.setState('inactive', true);\n            }\n            else if (inactiveSeries.options.inactiveOtherPoints) {\n                // Active series, but other points should be inactivated\n                inactiveSeries.setAllPointsToState('inactive');\n            }\n        });\n    }\n    /**\n     * Destroys the Pointer object and disconnects DOM events.\n     *\n     * @function Highcharts.Pointer#destroy\n     */\n    destroy() {\n        const pointer = this;\n        this.eventsToUnbind.forEach((unbind) => unbind());\n        this.eventsToUnbind = [];\n        if (!H.chartCount) {\n            if (Pointer.unbindDocumentMouseUp) {\n                Pointer.unbindDocumentMouseUp.forEach((e) => e());\n            }\n            if (Pointer.unbindDocumentTouchEnd) {\n                Pointer.unbindDocumentTouchEnd = (Pointer.unbindDocumentTouchEnd());\n            }\n        }\n        // Memory and CPU leak\n        clearInterval(pointer.tooltipTimeout);\n        objectEach(pointer, function (_val, prop) {\n            pointer[prop] = void 0;\n        });\n    }\n    /**\n     * Calculate attrs for selection marker.\n     * @private\n     * @function Highcharts.Pointer#getSelectionMarkerAttrs\n     * @emits getSelectionMarkerAttrs\n     */\n    getSelectionMarkerAttrs(chartX, chartY) {\n        const e = {\n            args: { chartX, chartY },\n            attrs: {},\n            shapeType: 'rect'\n        };\n        fireEvent(this, 'getSelectionMarkerAttrs', e, (e) => {\n            const { chart, zoomHor, zoomVert } = this, { mouseDownX = 0, mouseDownY = 0 } = chart, attrs = e.attrs;\n            let size;\n            attrs.x = chart.plotLeft;\n            attrs.y = chart.plotTop;\n            attrs.width = zoomHor ? 1 : chart.plotWidth;\n            attrs.height = zoomVert ? 1 : chart.plotHeight;\n            // Adjust the width of the selection marker. Firefox needs at\n            // least one pixel width or height in order to return a bounding\n            // box.\n            if (zoomHor) {\n                size = chartX - mouseDownX;\n                attrs.width = Math.max(1, Math.abs(size));\n                attrs.x = (size > 0 ? 0 : size) + mouseDownX;\n            }\n            // Adjust the height of the selection marker\n            if (zoomVert) {\n                size = chartY - mouseDownY;\n                attrs.height = Math.max(1, Math.abs(size));\n                attrs.y = (size > 0 ? 0 : size) + mouseDownY;\n            }\n        });\n        return e;\n    }\n    /**\n     * Perform a drag operation in response to a mousemove event while the mouse\n     * is down.\n     * @private\n     * @function Highcharts.Pointer#drag\n     */\n    drag(e) {\n        const { chart } = this, { mouseDownX = 0, mouseDownY = 0 } = chart, { panning, panKey, selectionMarkerFill } = chart.options.chart, plotLeft = chart.plotLeft, plotTop = chart.plotTop, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, panningEnabled = isObject(panning) ?\n            panning.enabled :\n            panning, panKeyPressed = panKey && e[`${panKey}Key`];\n        let chartX = e.chartX, chartY = e.chartY, clickedInside, selectionMarker = this.selectionMarker;\n        // If the device supports both touch and mouse (like IE11), and we are\n        // touch-dragging inside the plot area, don't handle the mouse event.\n        // #4339.\n        if (selectionMarker && selectionMarker.touch) {\n            return;\n        }\n        // If the mouse is outside the plot area, adjust to coordinates\n        // inside to prevent the selection marker from going outside\n        if (chartX < plotLeft) {\n            chartX = plotLeft;\n        }\n        else if (chartX > plotLeft + plotWidth) {\n            chartX = plotLeft + plotWidth;\n        }\n        if (chartY < plotTop) {\n            chartY = plotTop;\n        }\n        else if (chartY > plotTop + plotHeight) {\n            chartY = plotTop + plotHeight;\n        }\n        // Determine if the mouse has moved more than 10px\n        this.hasDragged = Math.sqrt(Math.pow(mouseDownX - chartX, 2) +\n            Math.pow(mouseDownY - chartY, 2));\n        if (this.hasDragged > 10) {\n            clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop, {\n                visiblePlotOnly: true\n            });\n            const { shapeType, attrs } = this.getSelectionMarkerAttrs(chartX, chartY);\n            // Make a selection\n            if ((chart.hasCartesianSeries || chart.mapView) &&\n                this.hasZoom &&\n                clickedInside &&\n                !panKeyPressed) {\n                if (!selectionMarker) {\n                    this.selectionMarker = selectionMarker =\n                        chart.renderer[shapeType]();\n                    selectionMarker\n                        .attr({\n                        'class': 'highcharts-selection-marker',\n                        zIndex: 7\n                    })\n                        .add();\n                    if (!chart.styledMode) {\n                        selectionMarker.attr({\n                            fill: selectionMarkerFill ||\n                                color(\"#334eff\" /* Palette.highlightColor80 */)\n                                    .setOpacity(0.25).get()\n                        });\n                    }\n                }\n            }\n            if (selectionMarker) {\n                selectionMarker.attr(attrs);\n            }\n            // Panning\n            if (clickedInside && !selectionMarker && panningEnabled) {\n                chart.pan(e, panning);\n            }\n        }\n    }\n    /**\n     * Start a drag operation.\n     * @private\n     * @function Highcharts.Pointer#dragStart\n     */\n    dragStart(e) {\n        const chart = this.chart;\n        // Record the start position\n        chart.mouseIsDown = e.type;\n        chart.cancelClick = false;\n        chart.mouseDownX = e.chartX;\n        chart.mouseDownY = e.chartY;\n    }\n    /**\n     * Get selection box to calculate extremes\n     * @private\n     * @function Highcharts.Pointer#getSelectionBox\n     * @emits getSelectionBox\n     */\n    getSelectionBox(marker) {\n        const e = {\n            args: { marker },\n            result: marker.getBBox()\n        };\n        fireEvent(this, 'getSelectionBox', e);\n        return e.result;\n    }\n    /**\n     * On mouse up or touch end across the entire document, drop the selection.\n     * @private\n     * @function Highcharts.Pointer#drop\n     */\n    drop(e) {\n        const { chart, selectionMarker } = this;\n        // During a mouse, touch or mousewheel pan, the `startOnTick` and\n        // `endOnTick` options are ignored. Otherwise the zooming or panning\n        // would be jumpy, or even not performed because the end ticks would\n        // block it. After the touch has ended, we undo this and render again.\n        let redraw;\n        for (const axis of chart.axes) {\n            if (axis.isPanning) {\n                axis.isPanning = false;\n                if (axis.options.startOnTick ||\n                    axis.options.endOnTick ||\n                    axis.series.some((s) => s.boosted)) {\n                    axis.forceRedraw = true;\n                    axis.setExtremes(axis.userMin, axis.userMax, false);\n                    redraw = true;\n                }\n            }\n        }\n        if (redraw) {\n            chart.redraw();\n        }\n        if (selectionMarker && e) {\n            // A selection has been made\n            if (this.hasDragged) {\n                const from = this.getSelectionBox(selectionMarker);\n                chart.transform({\n                    axes: chart.axes.filter((a) => a.zoomEnabled &&\n                        ((a.coll === 'xAxis' && this.zoomX) ||\n                            (a.coll === 'yAxis' && this.zoomY))),\n                    selection: {\n                        originalEvent: e, // #4890\n                        xAxis: [],\n                        yAxis: [],\n                        ...from\n                    },\n                    from\n                });\n            }\n            if (isNumber(chart.index)) {\n                this.selectionMarker = selectionMarker.destroy();\n            }\n        }\n        // Reset all. Check isNumber because it may be destroyed on mouse up\n        // (#877)\n        if (chart && isNumber(chart.index)) {\n            css(chart.container, { cursor: chart._cursor });\n            chart.cancelClick = this.hasDragged > 10; // #370\n            chart.mouseIsDown = false;\n            this.hasDragged = 0;\n            this.pinchDown = [];\n        }\n    }\n    /**\n     * Finds the closest point to a set of coordinates, using the k-d-tree\n     * algorithm.\n     *\n     * @function Highcharts.Pointer#findNearestKDPoint\n     *\n     * @param {Array<Highcharts.Series>} series\n     * All the series to search in.\n     *\n     * @param {boolean|undefined} shared\n     * Whether it is a shared tooltip or not.\n     *\n     * @param {Highcharts.PointerEventObject} e\n     * The pointer event object, containing chart coordinates of the pointer.\n     *\n     * @return {Highcharts.Point|undefined}\n     * The point closest to given coordinates.\n     */\n    findNearestKDPoint(series, shared, e) {\n        let closest;\n        /** @private */\n        function sort(p1, p2) {\n            const isCloserX = p1.distX - p2.distX, isCloser = p1.dist - p2.dist, isAbove = (p2.series.group?.zIndex -\n                p1.series.group?.zIndex);\n            let result;\n            // We have two points which are not in the same place on xAxis\n            // and shared tooltip:\n            if (isCloserX !== 0 && shared) { // #5721\n                result = isCloserX;\n                // Points are not exactly in the same place on x/yAxis:\n            }\n            else if (isCloser !== 0) {\n                result = isCloser;\n                // The same xAxis and yAxis position, sort by z-index:\n            }\n            else if (isAbove !== 0) {\n                result = isAbove;\n                // The same zIndex, sort by array index:\n            }\n            else {\n                result =\n                    p1.series.index > p2.series.index ?\n                        -1 :\n                        1;\n            }\n            return result;\n        }\n        series.forEach(function (s) {\n            const noSharedTooltip = s.noSharedTooltip && shared, compareX = (!noSharedTooltip &&\n                s.options.findNearestPointBy.indexOf('y') < 0), point = s.searchPoint(e, compareX);\n            if ( // Check that we actually found a point on the series.\n            isObject(point, true) && point.series &&\n                // Use the new point if it is closer.\n                (!isObject(closest, true) ||\n                    (sort(closest, point) > 0))) {\n                closest = point;\n            }\n        });\n        return closest;\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#getChartCoordinatesFromPoint\n     */\n    getChartCoordinatesFromPoint(point, inverted) {\n        const { xAxis, yAxis } = point.series, shapeArgs = point.shapeArgs;\n        if (xAxis && yAxis) {\n            let x = point.clientX ?? point.plotX ?? 0, y = point.plotY || 0;\n            if (point.isNode &&\n                shapeArgs &&\n                isNumber(shapeArgs.x) &&\n                isNumber(shapeArgs.y)) {\n                x = shapeArgs.x;\n                y = shapeArgs.y;\n            }\n            return inverted ? {\n                chartX: yAxis.len + yAxis.pos - y,\n                chartY: xAxis.len + xAxis.pos - x\n            } : {\n                chartX: x + xAxis.pos,\n                chartY: y + yAxis.pos\n            };\n        }\n        if (shapeArgs && shapeArgs.x && shapeArgs.y) {\n            // E.g. pies do not have axes\n            return {\n                chartX: shapeArgs.x,\n                chartY: shapeArgs.y\n            };\n        }\n    }\n    /**\n     * Return the cached chartPosition if it is available on the Pointer,\n     * otherwise find it. Running offset is quite expensive, so it should be\n     * avoided when we know the chart hasn't moved.\n     *\n     * @function Highcharts.Pointer#getChartPosition\n     *\n     * @return {Highcharts.ChartPositionObject}\n     * The offset of the chart container within the page\n     */\n    getChartPosition() {\n        if (this.chartPosition) {\n            return this.chartPosition;\n        }\n        const { container } = this.chart;\n        const pos = offset(container);\n        this.chartPosition = {\n            left: pos.left,\n            top: pos.top,\n            scaleX: 1,\n            scaleY: 1\n        };\n        const { offsetHeight, offsetWidth } = container;\n        // #13342 - tooltip was not visible in Chrome, when chart\n        // updates height.\n        if (offsetWidth > 2 && // #13342\n            offsetHeight > 2 // #13342\n        ) {\n            this.chartPosition.scaleX = pos.width / offsetWidth;\n            this.chartPosition.scaleY = pos.height / offsetHeight;\n        }\n        return this.chartPosition;\n    }\n    /**\n     * Get the click position in terms of axis values.\n     *\n     * @function Highcharts.Pointer#getCoordinates\n     *\n     * @param {Highcharts.PointerEventObject} e\n     * Pointer event, extended with `chartX` and `chartY` properties.\n     *\n     * @return {Highcharts.PointerAxisCoordinatesObject}\n     * Axis coordinates.\n     */\n    getCoordinates(e) {\n        const coordinates = {\n            xAxis: [],\n            yAxis: []\n        };\n        for (const axis of this.chart.axes) {\n            coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n                axis,\n                value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n            });\n        }\n        return coordinates;\n    }\n    /**\n     * Calculates what is the current hovered point/points and series.\n     *\n     * @private\n     * @function Highcharts.Pointer#getHoverData\n     *\n     * @param {Highcharts.Point|undefined} existingHoverPoint\n     * The point currently being hovered.\n     *\n     * @param {Highcharts.Series|undefined} existingHoverSeries\n     * The series currently being hovered.\n     *\n     * @param {Array<Highcharts.Series>} series\n     * All the series in the chart.\n     *\n     * @param {boolean} isDirectTouch\n     * Is the pointer directly hovering the point.\n     *\n     * @param {boolean|undefined} shared\n     * Whether it is a shared tooltip or not.\n     *\n     * @param {Highcharts.PointerEventObject} [e]\n     * The triggering event, containing chart coordinates of the pointer.\n     *\n     * @return {Object}\n     * Object containing resulting hover data: hoverPoint, hoverSeries, and\n     * hoverPoints.\n     */\n    getHoverData(existingHoverPoint, existingHoverSeries, series, isDirectTouch, shared, e) {\n        const hoverPoints = [], useExisting = !!(isDirectTouch && existingHoverPoint), filter = function (s) {\n            return (s.visible &&\n                !(!shared && s.directTouch) && // #3821\n                pick(s.options.enableMouseTracking, true));\n        };\n        let hoverSeries = existingHoverSeries, \n        // Which series to look in for the hover point\n        searchSeries, \n        // Parameters needed for beforeGetHoverData event.\n        eventArgs = {\n            chartX: e ? e.chartX : void 0,\n            chartY: e ? e.chartY : void 0,\n            shared: shared\n        };\n        // Find chart.hoverPane and update filter method in polar.\n        fireEvent(this, 'beforeGetHoverData', eventArgs);\n        const notSticky = hoverSeries && !hoverSeries.stickyTracking;\n        searchSeries = notSticky ?\n            // Only search on hovered series if it has stickyTracking false\n            [hoverSeries] :\n            // Filter what series to look in.\n            series.filter((s) => s.stickyTracking &&\n                (eventArgs.filter || filter)(s));\n        // Use existing hovered point or find the one closest to coordinates.\n        const hoverPoint = useExisting || !e ?\n            existingHoverPoint :\n            this.findNearestKDPoint(searchSeries, shared, e);\n        // Assign hover series\n        hoverSeries = hoverPoint && hoverPoint.series;\n        // If we have a hoverPoint, assign hoverPoints.\n        if (hoverPoint) {\n            // When tooltip is shared, it displays more than one point\n            if (shared && !hoverSeries.noSharedTooltip) {\n                searchSeries = series.filter(function (s) {\n                    return eventArgs.filter ?\n                        eventArgs.filter(s) : filter(s) && !s.noSharedTooltip;\n                });\n                // Get all points with the same x value as the hoverPoint\n                searchSeries.forEach(function (s) {\n                    let point = find(s.points, function (p) {\n                        return p.x === hoverPoint.x && !p.isNull;\n                    });\n                    if (isObject(point)) {\n                        /*\n                        * Boost returns a minimal point. Convert it to a usable\n                        * point for tooltip and states.\n                        */\n                        if (s.boosted && s.boost) {\n                            point = s.boost.getPoint(point);\n                        }\n                        hoverPoints.push(point);\n                    }\n                });\n            }\n            else {\n                hoverPoints.push(hoverPoint);\n            }\n        }\n        // Check whether the hoverPoint is inside pane we are hovering over.\n        eventArgs = { hoverPoint: hoverPoint };\n        fireEvent(this, 'afterGetHoverData', eventArgs);\n        return {\n            hoverPoint: eventArgs.hoverPoint,\n            hoverSeries: hoverSeries,\n            hoverPoints: hoverPoints\n        };\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#getPointFromEvent\n     */\n    getPointFromEvent(e) {\n        let target = e.target, point;\n        while (target && !point) {\n            point = target.point;\n            target = target.parentNode;\n        }\n        return point;\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onTrackerMouseOut\n     */\n    onTrackerMouseOut(e) {\n        const chart = this.chart;\n        const relatedTarget = e.relatedTarget;\n        const series = chart.hoverSeries;\n        this.isDirectTouch = false;\n        if (series &&\n            relatedTarget &&\n            !series.stickyTracking &&\n            !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n            (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465, #5553\n                !this.inClass(relatedTarget, 'highcharts-tracker'))) {\n            series.onMouseOut();\n        }\n    }\n    /**\n     * Utility to detect whether an element has, or has a parent with, a\n     * specific class name. Used on detection of tracker objects and on deciding\n     * whether hovering the tooltip should cause the active series to mouse out.\n     *\n     * @function Highcharts.Pointer#inClass\n     *\n     * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n     * The element to investigate.\n     *\n     * @param {string} className\n     * The class name to look for.\n     *\n     * @return {boolean|undefined}\n     * True if either the element or one of its parents has the given class\n     * name.\n     */\n    inClass(element, className) {\n        let elem = element, elemClassName;\n        while (elem) {\n            elemClassName = attr(elem, 'class');\n            if (elemClassName) {\n                if (elemClassName.indexOf(className) !== -1) {\n                    return true;\n                }\n                if (elemClassName.indexOf('highcharts-container') !== -1) {\n                    return false;\n                }\n            }\n            elem = elem.parentElement;\n        }\n    }\n    /**\n     * Initialize the Pointer.\n     *\n     * @private\n     * @function Highcharts.Pointer#init\n     *\n     * @param {Highcharts.Chart} chart\n     * The Chart instance.\n     *\n     * @param {Highcharts.Options} options\n     * The root options object. The pointer uses options from the chart and\n     * tooltip structures.\n     */\n    constructor(chart, options) {\n        this.hasDragged = 0;\n        this.pointerCaptureEventsToUnbind = [];\n        this.eventsToUnbind = [];\n        // Store references\n        this.options = options;\n        this.chart = chart;\n        // Do we need to handle click on a touch device?\n        this.runChartClick = Boolean(options.chart.events?.click);\n        this.pinchDown = [];\n        this.setDOMEvents();\n        fireEvent(this, 'afterInit');\n    }\n    /**\n     * Takes a browser event object and extends it with custom Highcharts\n     * properties `chartX` and `chartY` in order to work on the internal\n     * coordinate system.\n     *\n     * On map charts, the properties `lon` and `lat` are added to the event\n     * object given that the chart has projection information.\n     *\n     * @function Highcharts.Pointer#normalize\n     *\n     * @param {global.MouseEvent|global.PointerEvent|global.TouchEvent} e\n     * Event object in standard browsers.\n     *\n     * @param {Highcharts.OffsetObject} [chartPosition]\n     * Additional chart offset.\n     *\n     * @return {Highcharts.PointerEventObject}\n     * A browser event with extended properties `chartX` and `chartY`.\n     */\n    normalize(e, chartPosition) {\n        const touches = e.touches;\n        // Position for iOS (#2757)\n        const ePos = (touches ?\n            touches.length ?\n                touches.item(0) :\n                (pick(// #13534\n                touches.changedTouches, e.changedTouches))[0] :\n            e);\n        // Get mouse position\n        if (!chartPosition) {\n            chartPosition = this.getChartPosition();\n        }\n        let chartX = ePos.pageX - chartPosition.left, chartY = ePos.pageY - chartPosition.top;\n        // #11329 - when there is scaling on a parent element, we need to take\n        // this into account\n        chartX /= chartPosition.scaleX;\n        chartY /= chartPosition.scaleY;\n        return extend(e, {\n            chartX: Math.round(chartX),\n            chartY: Math.round(chartY)\n        });\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onContainerClick\n     */\n    onContainerClick(e) {\n        const chart = this.chart;\n        const hoverPoint = chart.hoverPoint;\n        const pEvt = this.normalize(e);\n        const plotLeft = chart.plotLeft;\n        const plotTop = chart.plotTop;\n        if (!chart.cancelClick) {\n            // On tracker click, fire the series and point events. #783, #1583\n            if (hoverPoint &&\n                this.inClass(pEvt.target, 'highcharts-tracker')) {\n                // The series click event\n                fireEvent(hoverPoint.series, 'click', extend(pEvt, {\n                    point: hoverPoint\n                }));\n                // The point click event\n                if (chart.hoverPoint) { // It may be destroyed (#1844)\n                    hoverPoint.firePointEvent('click', pEvt);\n                }\n                // When clicking outside a tracker, fire a chart event\n            }\n            else {\n                extend(pEvt, this.getCoordinates(pEvt));\n                // Fire a click event in the chart\n                if (chart.isInsidePlot(pEvt.chartX - plotLeft, pEvt.chartY - plotTop, {\n                    visiblePlotOnly: true\n                })) {\n                    fireEvent(chart, 'click', pEvt);\n                }\n            }\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onContainerMouseDown\n     */\n    onContainerMouseDown(e) {\n        const isPrimaryButton = ((e.buttons || e.button) & 1) === 1;\n        e = this.normalize(e);\n        // #11635, Firefox does not reliably fire move event after click scroll\n        if (H.isFirefox &&\n            e.button !== 0) {\n            this.onContainerMouseMove(e);\n        }\n        // #11635, limiting to primary button\n        if (typeof e.button === 'undefined' ||\n            isPrimaryButton) {\n            this.zoomOption(e);\n            // #295, #13737 solve conflict between container drag and chart zoom\n            if (isPrimaryButton) {\n                e.preventDefault?.();\n            }\n            this.dragStart(e);\n        }\n    }\n    /**\n     * When mouse leaves the container, hide the tooltip.\n     * @private\n     * @function Highcharts.Pointer#onContainerMouseLeave\n     */\n    onContainerMouseLeave(e) {\n        const { pointer } = charts[pick(Pointer.hoverChartIndex, -1)] || {};\n        e = this.normalize(e);\n        this.onContainerMouseMove(e);\n        // #4886, MS Touch end fires mouseleave but with no related target\n        if (pointer &&\n            !this.inClass(e.relatedTarget, 'highcharts-tooltip')) {\n            pointer.reset();\n            // Also reset the chart position, used in #149 fix\n            pointer.chartPosition = void 0;\n        }\n    }\n    /**\n     * When mouse enters the container, delete pointer's chartPosition.\n     * @private\n     * @function Highcharts.Pointer#onContainerMouseEnter\n     */\n    onContainerMouseEnter() {\n        delete this.chartPosition;\n    }\n    /**\n     * The mousemove, touchmove and touchstart event handler\n     * @private\n     * @function Highcharts.Pointer#onContainerMouseMove\n     */\n    onContainerMouseMove(e) {\n        const chart = this.chart, tooltip = chart.tooltip, pEvt = this.normalize(e);\n        this.setHoverChartIndex(e);\n        if (chart.mouseIsDown === 'mousedown' || this.touchSelect(pEvt)) {\n            this.drag(pEvt);\n        }\n        // Show the tooltip and run mouse over events (#977)\n        if (!chart.openMenu &&\n            (this.inClass(pEvt.target, 'highcharts-tracker') ||\n                chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop, {\n                    visiblePlotOnly: true\n                })) &&\n            // If the tooltip has stickOnContact enabled, do nothing. This\n            // applies regardless of any combinations of the `split` and\n            // `useHTML` options.\n            !(tooltip &&\n                tooltip.shouldStickOnContact(pEvt))) {\n            if (this.inClass(pEvt.target, 'highcharts-no-tooltip')) {\n                this.reset(false, 0);\n            }\n            else {\n                this.runPointActions(pEvt);\n            }\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onDocumentTouchEnd\n     */\n    onDocumentTouchEnd(e) {\n        this.onDocumentMouseUp(e);\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onContainerTouchMove\n     */\n    onContainerTouchMove(e) {\n        if (this.touchSelect(e)) {\n            this.onContainerMouseMove(e);\n        }\n        else {\n            this.touch(e);\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onContainerTouchStart\n     */\n    onContainerTouchStart(e) {\n        if (this.touchSelect(e)) {\n            this.onContainerMouseDown(e);\n        }\n        else {\n            this.zoomOption(e);\n            this.touch(e, true);\n        }\n    }\n    /**\n     * Special handler for mouse move that will hide the tooltip when the mouse\n     * leaves the plotarea. Issue #149 workaround. The mouseleave event does not\n     * always fire.\n     * @private\n     * @function Highcharts.Pointer#onDocumentMouseMove\n     */\n    onDocumentMouseMove(e) {\n        const chart = this.chart;\n        const tooltip = chart.tooltip;\n        const chartPosition = this.chartPosition;\n        const pEvt = this.normalize(e, chartPosition);\n        // If we're outside, hide the tooltip\n        if (chartPosition &&\n            !chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop, {\n                visiblePlotOnly: true\n            }) &&\n            !(tooltip &&\n                tooltip.shouldStickOnContact(pEvt)) && (pEvt.target === chart.container.ownerDocument ||\n            !this.inClass(pEvt.target, 'highcharts-tracker'))) {\n            this.reset();\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Pointer#onDocumentMouseUp\n     */\n    onDocumentMouseUp(e) {\n        charts[pick(Pointer.hoverChartIndex, -1)]\n            ?.pointer\n            ?.drop(e);\n    }\n    /**\n     * Handle touch events with two touches\n     * @private\n     * @function Highcharts.Pointer#pinch\n     */\n    pinch(e) {\n        const pointer = this, { chart, hasZoom, lastTouches } = pointer, touches = [].map.call(e.touches || [], \n        // Normalize each touch\n        (touch) => pointer.normalize(touch)), touchesLength = touches.length, fireClickEvent = touchesLength === 1 && ((pointer.inClass(e.target, 'highcharts-tracker') &&\n            chart.runTrackerClick) ||\n            pointer.runChartClick), tooltip = chart.tooltip, followTouchMove = touchesLength === 1 &&\n            pick(tooltip?.options.followTouchMove, true);\n        // Don't initiate panning until the user has pinched. This prevents us\n        // from blocking page scrolling as users scroll down a long page\n        // (#4210).\n        if (touchesLength > 1) {\n            pointer.initiated = true;\n        }\n        else if (followTouchMove) {\n            // #16119: Prevent blocking scroll when single-finger panning is\n            // not enabled\n            pointer.initiated = false;\n        }\n        // On touch devices, only proceed to trigger click if a handler is\n        // defined\n        if (hasZoom &&\n            pointer.initiated &&\n            !fireClickEvent &&\n            e.cancelable !== false) {\n            e.preventDefault();\n        }\n        // Register the touch start position\n        if (e.type === 'touchstart') {\n            pointer.pinchDown = touches;\n            pointer.res = true; // Reset on next move\n            chart.mouseDownX = e.chartX;\n            // Optionally move the tooltip on touchmove\n        }\n        else if (followTouchMove) {\n            this.runPointActions(pointer.normalize(e));\n            // Event type is touchmove, handle panning and pinching. The length can\n            // be 0 when releasing, if touchend fires first\n        }\n        else if (lastTouches) {\n            fireEvent(chart, 'touchpan', {\n                originalEvent: e,\n                touches\n            }, () => {\n                const boxFromTouches = (touches) => {\n                    const finger0 = touches[0], finger1 = touches[1] || finger0;\n                    return {\n                        x: finger0.chartX,\n                        y: finger0.chartY,\n                        width: finger1.chartX - finger0.chartX,\n                        height: finger1.chartY - finger0.chartY\n                    };\n                };\n                chart.transform({\n                    axes: chart.axes\n                        .filter((axis) => axis.zoomEnabled &&\n                        ((this.zoomHor && axis.horiz) ||\n                            (this.zoomVert && !axis.horiz))),\n                    to: boxFromTouches(touches),\n                    from: boxFromTouches(lastTouches),\n                    trigger: e.type\n                });\n            });\n            if (pointer.res) {\n                pointer.res = false;\n                this.reset(false, 0);\n            }\n        }\n        pointer.lastTouches = touches;\n    }\n    /**\n     * Run translation operations\n     * @private\n     * @function Highcharts.Pointer#pinchTranslate\n     * /\n    public pinchTranslate(\n        pinchDown: Array<any>,\n        touches: Array<PointerEvent>,\n        transform: any,\n        selectionMarker: any,\n        clip: any,\n        lastValidTouch: any\n    ): void {\n        if (this.zoomHor) {\n            this.pinchTranslateDirection(\n                true,\n                pinchDown,\n                touches,\n                transform,\n                selectionMarker,\n                clip,\n                lastValidTouch\n            );\n        }\n        if (this.zoomVert) {\n            this.pinchTranslateDirection(\n                false,\n                pinchDown,\n                touches,\n                transform,\n                selectionMarker,\n                clip,\n                lastValidTouch\n            );\n        }\n    }\n    */\n    /**\n     * Run translation operations for each direction (horizontal and vertical)\n     * independently.\n     * @private\n     * @function Highcharts.Pointer#pinchTranslateDirection\n     * /\n    public pinchTranslateDirection(\n        horiz: boolean,\n        pinchDown: Array<any>,\n        touches: Array<PointerEvent>,\n        transform: any,\n        selectionMarker: any,\n        clip: any,\n        lastValidTouch: any,\n        forcedScale?: number\n    ): void {\n        const chart = this.chart,\n            xy: ('x'|'y') = horiz ? 'x' : 'y',\n            XY: ('X'|'Y') = horiz ? 'X' : 'Y',\n            sChartXY: ('chartX'|'chartY') = ('chart' + XY) as any,\n            wh = horiz ? 'width' : 'height',\n            plotLeftTop = (chart as any)['plot' + (horiz ? 'Left' : 'Top')],\n            inverted = chart.inverted,\n            bounds = chart.bounds[horiz ? 'h' : 'v'],\n            singleTouch = pinchDown.length === 1,\n            touch0Start = pinchDown[0][sChartXY],\n            touch1Start = !singleTouch && pinchDown[1][sChartXY],\n            setScale = function (): void {\n                // Don't zoom if fingers are too close on this axis\n                if (\n                    typeof touch1Now === 'number' &&\n                    Math.abs(touch0Start - touch1Start) > 20\n                ) {\n                    scale = forcedScale ||\n                        Math.abs(touch0Now - touch1Now) /\n                        Math.abs(touch0Start - touch1Start);\n                }\n\n                clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n                selectionWH = (chart as any)[\n                    'plot' + (horiz ? 'Width' : 'Height')\n                ] / scale;\n            };\n\n        let selectionWH: any,\n            selectionXY,\n            clipXY: any,\n            scale = forcedScale || 1,\n            touch0Now = touches[0][sChartXY],\n            touch1Now = !singleTouch && touches[1][sChartXY],\n            outOfBounds;\n\n        // Set the scale, first pass\n        setScale();\n\n        // The clip position (x or y) is altered if out of bounds, the selection\n        // position is not\n        selectionXY = clipXY;\n\n        // Out of bounds\n        if (selectionXY < bounds.min) {\n            selectionXY = bounds.min;\n            outOfBounds = true;\n        } else if (selectionXY + selectionWH > bounds.max) {\n            selectionXY = bounds.max - selectionWH;\n            outOfBounds = true;\n        }\n\n        // Is the chart dragged off its bounds, determined by dataMin and\n        // dataMax?\n        if (outOfBounds) {\n\n            // Modify the touchNow position in order to create an elastic drag\n            // movement. This indicates to the user that the chart is responsive\n            // but can't be dragged further.\n            touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n            if (typeof touch1Now === 'number') {\n                touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n            }\n\n            // Set the scale, second pass to adapt to the modified touchNow\n            // positions\n            setScale();\n\n        } else {\n            lastValidTouch[xy] = [touch0Now, touch1Now];\n        }\n\n        // Set geometry for clipping, selection and transformation\n        if (!inverted) {\n            clip[xy] = clipXY - plotLeftTop;\n            clip[wh] = selectionWH;\n        }\n        const scaleKey = inverted ?\n            (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n        const transformScale = inverted ? 1 / scale : scale;\n\n        selectionMarker[wh] = selectionWH;\n        selectionMarker[xy] = selectionXY;\n        // Invert scale if needed (#19217)\n        transform[scaleKey] = scale * (inverted && !horiz ? -1 : 1);\n        transform['translate' + XY] = (transformScale * plotLeftTop) +\n            (touch0Now - (transformScale * touch0Start));\n    }\n    */\n    /**\n     * Reset the tracking by hiding the tooltip, the hover series state and the\n     * hover point\n     *\n     * @function Highcharts.Pointer#reset\n     *\n     * @param {boolean} [allowMove]\n     * Instead of destroying the tooltip altogether, allow moving it if\n     * possible.\n     *\n     * @param {number} [delay]\n     */\n    reset(allowMove, delay) {\n        const pointer = this, chart = pointer.chart, hoverSeries = chart.hoverSeries, hoverPoint = chart.hoverPoint, hoverPoints = chart.hoverPoints, tooltip = chart.tooltip, tooltipPoints = tooltip && tooltip.shared ?\n            hoverPoints :\n            hoverPoint;\n        // Check if the points have moved outside the plot area (#1003, #4736,\n        // #5101)\n        if (allowMove && tooltipPoints) {\n            splat(tooltipPoints).forEach(function (point) {\n                if (point.series.isCartesian &&\n                    typeof point.plotX === 'undefined') {\n                    allowMove = false;\n                }\n            });\n        }\n        // Just move the tooltip, #349\n        if (allowMove) {\n            if (tooltip && tooltipPoints && splat(tooltipPoints).length) {\n                tooltip.refresh(tooltipPoints);\n                if (tooltip.shared && hoverPoints) { // #8284\n                    hoverPoints.forEach(function (point) {\n                        point.setState(point.state, true);\n                        if (point.series.isCartesian) {\n                            if (point.series.xAxis.crosshair) {\n                                point.series.xAxis\n                                    .drawCrosshair(null, point);\n                            }\n                            if (point.series.yAxis.crosshair) {\n                                point.series.yAxis\n                                    .drawCrosshair(null, point);\n                            }\n                        }\n                    });\n                }\n                else if (hoverPoint) { // #2500\n                    hoverPoint.setState(hoverPoint.state, true);\n                    chart.axes.forEach(function (axis) {\n                        if (axis.crosshair &&\n                            hoverPoint.series[axis.coll] === axis) {\n                            axis.drawCrosshair(null, hoverPoint);\n                        }\n                    });\n                }\n            }\n            // Full reset\n        }\n        else {\n            if (hoverPoint) {\n                hoverPoint.onMouseOut();\n            }\n            if (hoverPoints) {\n                hoverPoints.forEach(function (point) {\n                    point.setState();\n                });\n            }\n            if (hoverSeries) {\n                hoverSeries.onMouseOut();\n            }\n            if (tooltip) {\n                tooltip.hide(delay);\n            }\n            if (pointer.unDocMouseMove) {\n                pointer.unDocMouseMove = pointer.unDocMouseMove();\n            }\n            // Remove crosshairs\n            chart.axes.forEach(function (axis) {\n                axis.hideCrosshair();\n            });\n            chart.hoverPoints = chart.hoverPoint = void 0;\n        }\n    }\n    /**\n     * With line type charts with a single tracker, get the point closest to the\n     * mouse. Run Point.onMouseOver and display tooltip for the point or points.\n     *\n     * @private\n     * @function Highcharts.Pointer#runPointActions\n     *\n     * @emits Highcharts.Point#event:mouseOut\n     * @emits Highcharts.Point#event:mouseOver\n     */\n    runPointActions(e, p, force) {\n        const pointer = this, chart = pointer.chart, series = chart.series, tooltip = (chart.tooltip && chart.tooltip.options.enabled ?\n            chart.tooltip :\n            void 0), shared = (tooltip ?\n            tooltip.shared :\n            false);\n        let hoverPoint = p || chart.hoverPoint, hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries;\n        const // `onMouseOver` or already hovering a series with directTouch\n        isDirectTouch = (!e || e.type !== 'touchmove') && (!!p || ((hoverSeries && hoverSeries.directTouch) &&\n            pointer.isDirectTouch)), hoverData = this.getHoverData(hoverPoint, hoverSeries, series, isDirectTouch, shared, e);\n        // Update variables from hoverData.\n        hoverPoint = hoverData.hoverPoint;\n        hoverSeries = hoverData.hoverSeries;\n        const points = hoverData.hoverPoints, followPointer = hoverSeries &&\n            hoverSeries.tooltipOptions.followPointer &&\n            !hoverSeries.tooltipOptions.split, useSharedTooltip = (shared &&\n            hoverSeries &&\n            !hoverSeries.noSharedTooltip);\n        // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n        // #3926, #4200\n        if (hoverPoint &&\n            (force ||\n                hoverPoint !== chart.hoverPoint ||\n                (tooltip && tooltip.isHidden))) {\n            (chart.hoverPoints || []).forEach(function (p) {\n                if (points.indexOf(p) === -1) {\n                    p.setState();\n                }\n            });\n            // Set normal state to previous series\n            if (chart.hoverSeries !== hoverSeries) {\n                hoverSeries.onMouseOver();\n            }\n            pointer.applyInactiveState(points);\n            // Do mouseover on all points (#3919, #3985, #4410, #5622)\n            (points || []).forEach(function (p) {\n                p.setState('hover');\n            });\n            // If tracking is on series in stead of on each point,\n            // fire mouseOver on hover point. // #4448\n            if (chart.hoverPoint) {\n                chart.hoverPoint.firePointEvent('mouseOut');\n            }\n            // Hover point may have been destroyed in the event handlers (#7127)\n            if (!hoverPoint.series) {\n                return;\n            }\n            /**\n             * Contains all hovered points.\n             *\n             * @name Highcharts.Chart#hoverPoints\n             * @type {Array<Highcharts.Point>|null}\n             */\n            chart.hoverPoints = points;\n            /**\n             * Contains the original hovered point.\n             *\n             * @name Highcharts.Chart#hoverPoint\n             * @type {Highcharts.Point|null}\n             */\n            chart.hoverPoint = hoverPoint;\n            /**\n             * Hover state should not be lost when axis is updated (#12569)\n             * Axis.update runs pointer.reset which uses chart.hoverPoint.state\n             * to apply state which does not exist in hoverPoint yet.\n             * The mouseOver event should be triggered when hoverPoint\n             * is correct.\n             */\n            hoverPoint.firePointEvent('mouseOver', void 0, () => {\n                // Draw tooltip if necessary\n                if (tooltip && hoverPoint) {\n                    tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n                }\n            });\n            // Update positions (regardless of kdpoint or hoverPoint)\n        }\n        else if (followPointer && tooltip && !tooltip.isHidden) {\n            const anchor = tooltip.getAnchor([{}], e);\n            if (chart.isInsidePlot(anchor[0], anchor[1], {\n                visiblePlotOnly: true\n            })) {\n                tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n            }\n        }\n        // Start the event listener to pick up the tooltip and crosshairs\n        if (!pointer.unDocMouseMove) {\n            pointer.unDocMouseMove = addEvent(chart.container.ownerDocument, 'mousemove', (e) => charts[Pointer.hoverChartIndex ?? -1]\n                ?.pointer\n                ?.onDocumentMouseMove(e));\n            pointer.eventsToUnbind.push(pointer.unDocMouseMove);\n        }\n        // Issues related to crosshair #4927, #5269 #5066, #5658\n        chart.axes.forEach(function drawAxisCrosshair(axis) {\n            const snap = pick((axis.crosshair || {}).snap, true);\n            let point;\n            if (snap) {\n                point = chart.hoverPoint; // #13002\n                if (!point || point.series[axis.coll] !== axis) {\n                    point = find(points, (p) => p.series && p.series[axis.coll] === axis);\n                }\n            }\n            // Axis has snapping crosshairs, and one of the hover points belongs\n            // to axis. Always call drawCrosshair when it is not snap.\n            if (point || !snap) {\n                axis.drawCrosshair(e, point);\n                // Axis has snapping crosshairs, but no hover point belongs to axis\n            }\n            else {\n                axis.hideCrosshair();\n            }\n        });\n    }\n    /**\n     * Set the JS DOM events on the container and document. This method should\n     * contain a one-to-one assignment between methods and their handlers. Any\n     * advanced logic should be moved to the handler reflecting the event's\n     * name.\n     * @private\n     * @function Highcharts.Pointer#setDOMEvents\n     */\n    setDOMEvents() {\n        const container = this.chart.container, ownerDoc = container.ownerDocument;\n        container.onmousedown = this.onContainerMouseDown.bind(this);\n        container.onmousemove = this.onContainerMouseMove.bind(this);\n        container.onclick = this.onContainerClick.bind(this);\n        this.eventsToUnbind.push(addEvent(container, 'mouseenter', this.onContainerMouseEnter.bind(this)), addEvent(container, 'mouseleave', this.onContainerMouseLeave.bind(this)));\n        if (!Pointer.unbindDocumentMouseUp) {\n            Pointer.unbindDocumentMouseUp = [];\n        }\n        Pointer.unbindDocumentMouseUp.push(addEvent(ownerDoc, 'mouseup', this.onDocumentMouseUp.bind(this)));\n        // In case we are dealing with overflow, reset the chart position when\n        // scrolling parent elements\n        let parent = this.chart.renderTo.parentElement;\n        while (parent && parent.tagName !== 'BODY') {\n            this.eventsToUnbind.push(addEvent(parent, 'scroll', () => {\n                delete this.chartPosition;\n            }));\n            parent = parent.parentElement;\n        }\n        this.eventsToUnbind.push(addEvent(container, 'touchstart', this.onContainerTouchStart.bind(this), { passive: false }), addEvent(container, 'touchmove', this.onContainerTouchMove.bind(this), { passive: false }));\n        if (!Pointer.unbindDocumentTouchEnd) {\n            Pointer.unbindDocumentTouchEnd = addEvent(ownerDoc, 'touchend', this.onDocumentTouchEnd.bind(this), { passive: false });\n        }\n        this.setPointerCapture();\n        addEvent(this.chart, 'redraw', this.setPointerCapture.bind(this));\n    }\n    /**\n     * Sets, or removes on update, pointer events using pointer capture for\n     * tooltip.followTouchMove if any series has findNearestPointBy that\n     * includes the y dimension.\n     * @private\n     * @function Highcharts.Pointer#setPointerCapture\n    */\n    setPointerCapture() {\n        // Only for touch\n        if (!isTouchDevice) {\n            return;\n        }\n        const pointer = this, events = pointer.pointerCaptureEventsToUnbind, chart = pointer.chart, container = chart.container, followTouchMove = pick(chart.options.tooltip?.followTouchMove, true), shouldHave = followTouchMove && chart.series.some((series) => series.options.findNearestPointBy\n            .indexOf('y') > -1);\n        if (!pointer.hasPointerCapture && shouldHave) {\n            // Add\n            // Bind\n            events.push(addEvent(container, 'pointerdown', (e) => {\n                if (e.target?.hasPointerCapture(e.pointerId)) {\n                    e.target?.releasePointerCapture(e.pointerId);\n                }\n            }), addEvent(container, 'pointermove', (e) => {\n                chart.pointer?.getPointFromEvent(e)?.onMouseOver(e);\n            }));\n            if (!chart.styledMode) {\n                css(container, { 'touch-action': 'none' });\n            }\n            // Mostly for styled mode\n            container.className += ' highcharts-no-touch-action';\n            pointer.hasPointerCapture = true;\n        }\n        else if (pointer.hasPointerCapture && !shouldHave) {\n            // Remove\n            // Unbind\n            events.forEach((e) => e());\n            events.length = 0;\n            if (!chart.styledMode) {\n                css(container, {\n                    'touch-action': pick(chart.options.chart.style?.['touch-action'], 'manipulation')\n                });\n            }\n            // Mostly for styled mode\n            container.className = container.className.replace(' highcharts-no-touch-action', '');\n            pointer.hasPointerCapture = false;\n        }\n    }\n    /**\n     * Sets the index of the hovered chart and leaves the previous hovered\n     * chart, to reset states like tooltip.\n     * @private\n     * @function Highcharts.Pointer#setHoverChartIndex\n     */\n    setHoverChartIndex(e) {\n        const chart = this.chart;\n        const hoverChart = H.charts[pick(Pointer.hoverChartIndex, -1)];\n        if (hoverChart &&\n            hoverChart !== chart) {\n            const relatedTargetObj = { relatedTarget: chart.container };\n            if (e && !e?.relatedTarget) {\n                e = { ...relatedTargetObj, ...e };\n            }\n            hoverChart.pointer?.onContainerMouseLeave(e || relatedTargetObj);\n        }\n        if (!hoverChart ||\n            !hoverChart.mouseIsDown) {\n            Pointer.hoverChartIndex = chart.index;\n        }\n    }\n    /**\n     * General touch handler shared by touchstart and touchmove.\n     * @private\n     * @function Highcharts.Pointer#touch\n     */\n    touch(e, start) {\n        const { chart, pinchDown = [] } = this;\n        let hasMoved, isInside;\n        this.setHoverChartIndex();\n        e = this.normalize(e);\n        if (e.touches.length === 1) {\n            isInside = chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop, {\n                visiblePlotOnly: true\n            });\n            if (isInside && !chart.openMenu) {\n                // Run mouse events and display tooltip etc\n                if (start) {\n                    this.runPointActions(e);\n                }\n                // Android fires touchmove events after the touchstart even if\n                // the finger hasn't moved, or moved only a pixel or two. In iOS\n                // however, the touchmove doesn't fire unless the finger moves\n                // more than ~4px. So we emulate this behaviour in Android by\n                // checking how much it moved, and cancelling on small\n                // distances. #3450. Tested and still relevant as of 2024.\n                if (e.type === 'touchmove') {\n                    hasMoved = pinchDown[0] ? // #5266\n                        (Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n                            Math.pow(pinchDown[0].chartY - e.chartY, 2)) >= 16 :\n                        false;\n                }\n                if (pick(hasMoved, true)) {\n                    this.pinch(e);\n                }\n            }\n            else if (start) {\n                // Hide the tooltip on touching outside the plot area (#1203)\n                this.reset();\n            }\n        }\n        else if (e.touches.length === 2) {\n            this.pinch(e);\n        }\n    }\n    /**\n     * Returns true if the chart is set up for zooming by single touch and the\n     * event is capable\n     * @private\n     * @function Highcharts.Pointer#touchSelect\n     */\n    touchSelect(e) {\n        return Boolean(this.chart.zooming.singleTouch &&\n            e.touches &&\n            e.touches.length === 1);\n    }\n    /**\n     * Resolve the zoomType option, this is reset on all touch start and mouse\n     * down events.\n     * @private\n     * @function Highcharts.Pointer#zoomOption\n     */\n    zoomOption(e) {\n        const chart = this.chart, inverted = chart.inverted;\n        let zoomType = chart.zooming.type || '', zoomX, zoomY;\n        // Look for the pinchType option\n        if (/touch/.test(e.type)) {\n            zoomType = pick(chart.zooming.pinchType, zoomType);\n        }\n        this.zoomX = zoomX = /x/.test(zoomType);\n        this.zoomY = zoomY = /y/.test(zoomType);\n        this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n        this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n        this.hasZoom = zoomX || zoomY;\n    }\n}\n/* *\n *\n *  Class Namespace\n *\n * */\n(function (Pointer) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    function compose(ChartClass) {\n        if (pushUnique(composed, 'Core.Pointer')) {\n            addEvent(ChartClass, 'beforeRender', function () {\n                /**\n                 * The Pointer that keeps track of mouse and touch\n                 * interaction.\n                 *\n                 * @memberof Highcharts.Chart\n                 * @name pointer\n                 * @type {Highcharts.Pointer}\n                 * @instance\n                 */\n                this.pointer = new Pointer(this, this.options);\n            });\n        }\n    }\n    Pointer.compose = compose;\n})(Pointer || (Pointer = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Pointer;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Chart position and scale.\n *\n * @interface Highcharts.ChartPositionObject\n */ /**\n* @name Highcharts.ChartPositionObject#left\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#scaleX\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#scaleY\n* @type {number}\n*/ /**\n* @name Highcharts.ChartPositionObject#top\n* @type {number}\n*/\n/**\n * One position in relation to an axis.\n *\n * @interface Highcharts.PointerAxisCoordinateObject\n */ /**\n* Related axis.\n*\n* @name Highcharts.PointerAxisCoordinateObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* Axis value.\n*\n* @name Highcharts.PointerAxisCoordinateObject#value\n* @type {number}\n*/\n/**\n * Positions in terms of axis values.\n *\n * @interface Highcharts.PointerAxisCoordinatesObject\n */ /**\n* Positions on the x-axis.\n* @name Highcharts.PointerAxisCoordinatesObject#xAxis\n* @type {Array<Highcharts.PointerAxisCoordinateObject>}\n*/ /**\n* Positions on the y-axis.\n* @name Highcharts.PointerAxisCoordinatesObject#yAxis\n* @type {Array<Highcharts.PointerAxisCoordinateObject>}\n*/\n/**\n * Pointer coordinates.\n *\n * @interface Highcharts.PointerCoordinatesObject\n */ /**\n* @name Highcharts.PointerCoordinatesObject#chartX\n* @type {number}\n*/ /**\n* @name Highcharts.PointerCoordinatesObject#chartY\n* @type {number}\n*/\n/**\n * A native browser mouse or touch event, extended with position information\n * relative to the {@link Chart.container}.\n *\n * @interface Highcharts.PointerEventObject\n * @extends global.PointerEvent\n */ /**\n* The X coordinate of the pointer interaction relative to the chart.\n*\n* @name Highcharts.PointerEventObject#chartX\n* @type {number}\n*/ /**\n* The Y coordinate of the pointer interaction relative to the chart.\n*\n* @name Highcharts.PointerEventObject#chartY\n* @type {number}\n*/\n/**\n * Axis-specific data of a selection.\n *\n * @interface Highcharts.SelectDataObject\n */ /**\n* The selected Axis.\n* @name Highcharts.SelectDataObject#axis\n* @type {Highcharts.Axis}\n*/ /**\n* The maximum axis value, either automatic or set manually.\n* @name Highcharts.SelectDataObject#max\n* @type {number}\n*/ /**\n* The minimum axis value, either automatic or set manually.\n* @name Highcharts.SelectDataObject#min\n* @type {number}\n*/\n/**\n * Object for select events.\n * The primary axes are `xAxis[0]` and `yAxis[0]`. Remember the unit of a\n * datetime axis is milliseconds since 1970-01-01 00:00:00.\n *\n * @interface Highcharts.SelectEventObject\n */ /**\n* The related browser event.\n* @name Highcharts.SelectEventObject#originalEvent\n* @type {global.Event}\n*/ /**\n* Indicates a reset event to restore default state.\n* @name Highcharts.SelectEventObject#resetSelection\n* @type {boolean|undefined}\n*/ /**\n* Arrays containing the axes of each dimension and each axis' min and max\n* values.\n* @name Highcharts.SelectEventObject#xAxis\n* @type {Array<Highcharts.SelectDataObject>}\n*/ /**\n* Arrays containing the axes of each dimension and each axis' min and max\n* values.\n* @name Highcharts.SelectEventObject#yAxis\n* @type {Array<Highcharts.SelectDataObject>}\n*/\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Animation/AnimationUtilities.js';\nconst { animObject, setAnimation } = A;\nimport F from '../Foundation.js';\nconst { registerEventOptions } = F;\nimport H from '../Globals.js';\nconst { composed, marginNames } = H;\nimport Series from '../Series/Series.js';\nimport Point from '../Series/Point.js';\nimport R from '../Renderer/RendererUtilities.js';\nconst { distribute } = R;\nimport T from '../Templating.js';\nconst { format } = T;\nimport U from '../Utilities.js';\nconst { addEvent, createElement, css, defined, discardElement, find, fireEvent, isNumber, merge, pick, pushUnique, relativeLength, stableSort, syncTimeout } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The overview of the chart's series. The legend object is instantiated\n * internally in the chart constructor, and is available from the `chart.legend`\n * property. Each chart has only one legend.\n *\n * @class\n * @name Highcharts.Legend\n *\n * @param {Highcharts.Chart} chart\n * The chart instance.\n *\n * @param {Highcharts.LegendOptions} options\n * Legend options.\n */\nclass Legend {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Initialize the legend.\n     *\n     * @private\n     * @function Highcharts.Legend#init\n     *\n     * @param {Highcharts.Chart} chart\n     * The chart instance.\n     *\n     * @param {Highcharts.LegendOptions} options\n     * Legend options.\n     */\n    constructor(chart, options) {\n        /* *\n         *\n         *  Properties\n         *\n         * */\n        this.allItems = [];\n        this.initialItemY = 0;\n        this.itemHeight = 0;\n        this.itemMarginBottom = 0;\n        this.itemMarginTop = 0;\n        this.itemX = 0;\n        this.itemY = 0;\n        this.lastItemY = 0;\n        this.lastLineHeight = 0;\n        this.legendHeight = 0;\n        this.legendWidth = 0;\n        this.maxItemWidth = 0;\n        this.maxLegendWidth = 0;\n        this.offsetWidth = 0;\n        this.padding = 0;\n        this.pages = [];\n        this.symbolHeight = 0;\n        this.symbolWidth = 0;\n        this.titleHeight = 0;\n        this.totalItemWidth = 0;\n        this.widthOption = 0;\n        /**\n         * Chart of this legend.\n         *\n         * @readonly\n         * @name Highcharts.Legend#chart\n         * @type {Highcharts.Chart}\n         */\n        this.chart = chart;\n        this.setOptions(options);\n        if (options.enabled) {\n            // Render it\n            this.render();\n            registerEventOptions(this, options);\n            // Move checkboxes\n            addEvent(this.chart, 'endResize', function () {\n                this.legend.positionCheckboxes();\n            });\n        }\n        // On Legend.init and Legend.update, make sure that proximate layout\n        // events are either added or removed (#18362).\n        addEvent(this.chart, 'render', () => {\n            if (this.options.enabled && this.proximate) {\n                this.proximatePositions();\n                this.positionItems();\n            }\n        });\n    }\n    /**\n     * @private\n     * @function Highcharts.Legend#setOptions\n     * @param {Highcharts.LegendOptions} options\n     */\n    setOptions(options) {\n        const padding = pick(options.padding, 8);\n        /**\n         * Legend options.\n         *\n         * @readonly\n         * @name Highcharts.Legend#options\n         * @type {Highcharts.LegendOptions}\n         */\n        this.options = options;\n        if (!this.chart.styledMode) {\n            this.itemStyle = options.itemStyle;\n            this.itemHiddenStyle = merge(this.itemStyle, options.itemHiddenStyle);\n        }\n        this.itemMarginTop = options.itemMarginTop;\n        this.itemMarginBottom = options.itemMarginBottom;\n        this.padding = padding;\n        this.initialItemY = padding - 5; // 5 is pixels above the text\n        this.symbolWidth = pick(options.symbolWidth, 16);\n        this.pages = [];\n        this.proximate = options.layout === 'proximate' && !this.chart.inverted;\n        // #12705: baseline has to be reset on every update\n        this.baseline = void 0;\n    }\n    /**\n     * Update the legend with new options. Equivalent to running `chart.update`\n     * with a legend configuration option.\n     *\n     * @sample highcharts/legend/legend-update/\n     *         Legend update\n     *\n     * @function Highcharts.Legend#update\n     *\n     * @param {Highcharts.LegendOptions} options\n     * Legend options.\n     *\n     * @param {boolean} [redraw=true]\n     * Whether to redraw the chart after the axis is altered. If doing more\n     * operations on the chart, it is a good idea to set redraw to false and\n     * call {@link Chart#redraw} after. Whether to redraw the chart.\n     *\n     * @emits Highcharts.Legends#event:afterUpdate\n     */\n    update(options, redraw) {\n        const chart = this.chart;\n        this.setOptions(merge(true, this.options, options));\n        if ('events' in this.options) {\n            // Legend event handlers\n            registerEventOptions(this, this.options);\n        }\n        this.destroy();\n        chart.isDirtyLegend = chart.isDirtyBox = true;\n        if (pick(redraw, true)) {\n            chart.redraw();\n        }\n        fireEvent(this, 'afterUpdate', { redraw });\n    }\n    /**\n     * Set the colors for the legend item.\n     *\n     * @private\n     * @function Highcharts.Legend#colorizeItem\n     * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n     *        A Series or Point instance\n     * @param {boolean} [visible=false]\n     *        Dimmed or colored\n     *\n     * @todo\n     * Make events official: Fires the event `afterColorizeItem`.\n     */\n    colorizeItem(item, visible) {\n        const { area, group, label, line, symbol } = item.legendItem || {};\n        group?.[visible ? 'removeClass' : 'addClass']('highcharts-legend-item-hidden');\n        if (!this.chart.styledMode) {\n            const { itemHiddenStyle = {} } = this, hiddenColor = itemHiddenStyle.color, { fillColor, fillOpacity, lineColor, marker } = item.options, colorizeHidden = (attr) => {\n                if (!visible) {\n                    if (attr.fill) {\n                        attr.fill = hiddenColor;\n                    }\n                    if (attr.stroke) {\n                        attr.stroke = hiddenColor;\n                    }\n                }\n                return attr;\n            };\n            label?.css(merge(visible ? this.itemStyle : itemHiddenStyle));\n            line?.attr(colorizeHidden({ stroke: lineColor || item.color }));\n            if (symbol) {\n                // Apply marker options\n                symbol.attr(colorizeHidden(marker && symbol.isMarker ? // #585\n                    item.pointAttribs() :\n                    { fill: item.color }));\n            }\n            area?.attr(colorizeHidden({\n                fill: fillColor || item.color,\n                'fill-opacity': fillColor ? 1 : (fillOpacity ?? 0.75)\n            }));\n        }\n        fireEvent(this, 'afterColorizeItem', { item, visible });\n    }\n    /**\n     * @private\n     * @function Highcharts.Legend#positionItems\n     */\n    positionItems() {\n        // Now that the legend width and height are established, put the items\n        // in the final position\n        this.allItems.forEach(this.positionItem, this);\n        if (!this.chart.isResizing) {\n            this.positionCheckboxes();\n        }\n    }\n    /**\n     * Position the legend item.\n     *\n     * @private\n     * @function Highcharts.Legend#positionItem\n     * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n     * The item to position\n     */\n    positionItem(item) {\n        const legend = this, { group, x = 0, y = 0 } = item.legendItem || {}, options = legend.options, symbolPadding = options.symbolPadding, ltr = !options.rtl, checkbox = item.checkbox;\n        if (group && group.element) {\n            const attribs = {\n                translateX: ltr ?\n                    x :\n                    legend.legendWidth - x - 2 * symbolPadding - 4,\n                translateY: y\n            };\n            const complete = () => {\n                fireEvent(this, 'afterPositionItem', { item });\n            };\n            group[defined(group.translateY) ? 'animate' : 'attr'](attribs, void 0, complete);\n        }\n        if (checkbox) {\n            checkbox.x = x;\n            checkbox.y = y;\n        }\n    }\n    /**\n     * Destroy a single legend item, used internally on removing series items.\n     *\n     * @private\n     * @function Highcharts.Legend#destroyItem\n     * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n     * The item to remove\n     */\n    destroyItem(item) {\n        const checkbox = item.checkbox, legendItem = item.legendItem || {};\n        // Destroy SVG elements\n        for (const key of ['group', 'label', 'line', 'symbol']) {\n            if (legendItem[key]) {\n                legendItem[key] = legendItem[key].destroy();\n            }\n        }\n        if (checkbox) {\n            discardElement(checkbox);\n        }\n        item.legendItem = void 0;\n    }\n    /**\n     * Destroy the legend. Used internally. To reflow objects, `chart.redraw`\n     * must be called after destruction.\n     *\n     * @private\n     * @function Highcharts.Legend#destroy\n     */\n    destroy() {\n        const legend = this;\n        // Destroy items\n        for (const item of this.getAllItems()) {\n            this.destroyItem(item);\n        }\n        // Destroy legend elements\n        for (const key of [\n            'clipRect',\n            'up',\n            'down',\n            'pager',\n            'nav',\n            'box',\n            'title',\n            'group'\n        ]) {\n            if (legend[key]) {\n                legend[key] = legend[key].destroy();\n            }\n        }\n        this.display = null; // Reset in .render on update.\n    }\n    /**\n     * Position the checkboxes after the width is determined.\n     *\n     * @private\n     * @function Highcharts.Legend#positionCheckboxes\n     */\n    positionCheckboxes() {\n        const alignAttr = this.group && this.group.alignAttr, clipHeight = this.clipHeight || this.legendHeight, titleHeight = this.titleHeight;\n        let translateY;\n        if (alignAttr) {\n            translateY = alignAttr.translateY;\n            this.allItems.forEach(function (item) {\n                const checkbox = item.checkbox;\n                let top;\n                if (checkbox) {\n                    top = translateY + titleHeight + checkbox.y +\n                        (this.scrollOffset || 0) + 3;\n                    css(checkbox, {\n                        left: (alignAttr.translateX + item.checkboxOffset +\n                            checkbox.x - 20) + 'px',\n                        top: top + 'px',\n                        display: this.proximate || (top > translateY - 6 &&\n                            top < translateY + clipHeight - 6) ?\n                            '' :\n                            'none'\n                    });\n                }\n            }, this);\n        }\n    }\n    /**\n     * Render the legend title on top of the legend.\n     *\n     * @private\n     * @function Highcharts.Legend#renderTitle\n     */\n    renderTitle() {\n        const options = this.options, padding = this.padding, titleOptions = options.title;\n        let bBox, titleHeight = 0;\n        if (titleOptions.text) {\n            if (!this.title) {\n                /**\n                 * SVG element of the legend title.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#title\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, void 0, void 0, void 0, options.useHTML, void 0, 'legend-title')\n                    .attr({ zIndex: 1 });\n                if (!this.chart.styledMode) {\n                    this.title.css(titleOptions.style);\n                }\n                this.title.add(this.group);\n            }\n            // Set the max title width (#7253)\n            if (!titleOptions.width) {\n                this.title.css({\n                    width: this.maxLegendWidth + 'px'\n                });\n            }\n            bBox = this.title.getBBox();\n            titleHeight = bBox.height;\n            this.offsetWidth = bBox.width; // #1717\n            this.contentGroup.attr({ translateY: titleHeight });\n        }\n        this.titleHeight = titleHeight;\n    }\n    /**\n     * Set the legend item text.\n     *\n     * @function Highcharts.Legend#setText\n     * @param {Highcharts.Point|Highcharts.Series} item\n     *        The item for which to update the text in the legend.\n     */\n    setText(item) {\n        const options = this.options;\n        item.legendItem.label.attr({\n            text: options.labelFormat ?\n                format(options.labelFormat, item, this.chart) :\n                options.labelFormatter.call(item)\n        });\n    }\n    /**\n     * Render a single specific legend item. Called internally from the `render`\n     * function.\n     *\n     * @private\n     * @function Highcharts.Legend#renderItem\n     * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n     * The item to render.\n     */\n    renderItem(item) {\n        const legend = this, legendItem = item.legendItem = item.legendItem || {}, chart = legend.chart, renderer = chart.renderer, options = legend.options, horizontal = options.layout === 'horizontal', symbolWidth = legend.symbolWidth, symbolPadding = options.symbolPadding || 0, itemStyle = legend.itemStyle, itemHiddenStyle = legend.itemHiddenStyle, itemDistance = horizontal ? pick(options.itemDistance, 20) : 0, ltr = !options.rtl, isSeries = !item.series, series = !isSeries && item.series.drawLegendSymbol ?\n            item.series :\n            item, seriesOptions = series.options, showCheckbox = (!!legend.createCheckboxForItem &&\n            seriesOptions &&\n            seriesOptions.showCheckbox), useHTML = options.useHTML, itemClassName = item.options.className;\n        let label = legendItem.label, \n        // Full width minus text width\n        itemExtraWidth = symbolWidth + symbolPadding +\n            itemDistance + (showCheckbox ? 20 : 0);\n        if (!label) { // Generate it once, later move it\n            // Generate the group box, a group to hold the symbol and text. Text\n            // is to be appended in Legend class.\n            legendItem.group = renderer\n                .g('legend-item')\n                .addClass('highcharts-' + series.type + '-series ' +\n                'highcharts-color-' + item.colorIndex +\n                (itemClassName ? ' ' + itemClassName : '') +\n                (isSeries ?\n                    ' highcharts-series-' + item.index :\n                    ''))\n                .attr({ zIndex: 1 })\n                .add(legend.scrollGroup);\n            // Generate the list item text and add it to the group\n            legendItem.label = label = renderer.text('', ltr ?\n                symbolWidth + symbolPadding :\n                -symbolPadding, legend.baseline || 0, useHTML);\n            if (!chart.styledMode) {\n                // Merge to prevent modifying original (#1021)\n                label.css(merge(item.visible ?\n                    itemStyle :\n                    itemHiddenStyle));\n            }\n            label\n                .attr({\n                align: ltr ? 'left' : 'right',\n                zIndex: 2\n            })\n                .add(legendItem.group);\n            // Get the baseline for the first item - the font size is equal for\n            // all\n            if (!legend.baseline) {\n                legend.fontMetrics = renderer.fontMetrics(label);\n                legend.baseline =\n                    legend.fontMetrics.f + 3 + legend.itemMarginTop;\n                label.attr('y', legend.baseline);\n                legend.symbolHeight =\n                    pick(options.symbolHeight, legend.fontMetrics.f);\n                if (options.squareSymbol) {\n                    legend.symbolWidth = pick(options.symbolWidth, Math.max(legend.symbolHeight, 16));\n                    itemExtraWidth = legend.symbolWidth + symbolPadding +\n                        itemDistance + (showCheckbox ? 20 : 0);\n                    if (ltr) {\n                        label.attr('x', legend.symbolWidth + symbolPadding);\n                    }\n                }\n            }\n            // Draw the legend symbol inside the group box\n            series.drawLegendSymbol(legend, item);\n            if (legend.setItemEvents) {\n                legend.setItemEvents(item, label, useHTML);\n            }\n        }\n        // Add the HTML checkbox on top\n        if (showCheckbox && !item.checkbox && legend.createCheckboxForItem) {\n            legend.createCheckboxForItem(item);\n        }\n        // Colorize the items\n        legend.colorizeItem(item, item.visible);\n        // Take care of max width and text overflow (#6659)\n        if (chart.styledMode || !itemStyle.width) {\n            label.css({\n                width: ((options.itemWidth ||\n                    legend.widthOption ||\n                    chart.spacingBox.width) - itemExtraWidth) + 'px'\n            });\n        }\n        // Always update the text\n        legend.setText(item);\n        // Calculate the positions for the next line\n        const bBox = label.getBBox();\n        const fontMetricsH = (legend.fontMetrics && legend.fontMetrics.h) || 0;\n        item.itemWidth = item.checkboxOffset =\n            options.itemWidth ||\n                legendItem.labelWidth ||\n                bBox.width + itemExtraWidth;\n        legend.maxItemWidth = Math.max(legend.maxItemWidth, item.itemWidth);\n        legend.totalItemWidth += item.itemWidth;\n        legend.itemHeight = item.itemHeight = Math.round(legendItem.labelHeight ||\n            // Use bBox for multiline (#16398)\n            (bBox.height > fontMetricsH * 1.5 ? bBox.height : fontMetricsH));\n    }\n    /**\n     * Get the position of the item in the layout. We now know the\n     * maxItemWidth from the previous loop.\n     *\n     * @private\n     * @function Highcharts.Legend#layoutItem\n     * @param {Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series} item\n     */\n    layoutItem(item) {\n        const options = this.options, padding = this.padding, horizontal = options.layout === 'horizontal', itemHeight = item.itemHeight, itemMarginBottom = this.itemMarginBottom, itemMarginTop = this.itemMarginTop, itemDistance = horizontal ? pick(options.itemDistance, 20) : 0, maxLegendWidth = this.maxLegendWidth, itemWidth = (options.alignColumns &&\n            this.totalItemWidth > maxLegendWidth) ?\n            this.maxItemWidth :\n            item.itemWidth, legendItem = item.legendItem || {};\n        // If the item exceeds the width, start a new line\n        if (horizontal &&\n            this.itemX - padding + itemWidth > maxLegendWidth) {\n            this.itemX = padding;\n            if (this.lastLineHeight) { // Not for the first line (#10167)\n                this.itemY += (itemMarginTop +\n                    this.lastLineHeight +\n                    itemMarginBottom);\n            }\n            this.lastLineHeight = 0; // Reset for next line (#915, #3976)\n        }\n        // Set the edge positions\n        this.lastItemY = itemMarginTop + this.itemY + itemMarginBottom;\n        this.lastLineHeight = Math.max(// #915\n        itemHeight, this.lastLineHeight);\n        // Cache the position of the newly generated or reordered items\n        legendItem.x = this.itemX;\n        legendItem.y = this.itemY;\n        // Advance\n        if (horizontal) {\n            this.itemX += itemWidth;\n        }\n        else {\n            this.itemY +=\n                itemMarginTop + itemHeight + itemMarginBottom;\n            this.lastLineHeight = itemHeight;\n        }\n        // The width of the widest item\n        this.offsetWidth = this.widthOption || Math.max((horizontal ? this.itemX - padding - (item.checkbox ?\n            // Decrease by itemDistance only when no checkbox #4853\n            0 :\n            itemDistance) : itemWidth) + padding, this.offsetWidth);\n    }\n    /**\n     * Get all items, which is one item per series for most series and one\n     * item per point for pie series and its derivatives. Fires the event\n     * `afterGetAllItems`.\n     *\n     * @private\n     * @function Highcharts.Legend#getAllItems\n     * @return {Array<(Highcharts.BubbleLegendItem|Highcharts.Point|Highcharts.Series)>}\n     * The current items in the legend.\n     * @emits Highcharts.Legend#event:afterGetAllItems\n     */\n    getAllItems() {\n        let allItems = [];\n        this.chart.series.forEach(function (series) {\n            const seriesOptions = series && series.options;\n            // Handle showInLegend. If the series is linked to another series,\n            // defaults to false.\n            if (series && pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? void 0 : false, true)) {\n                // Use points or series for the legend item depending on\n                // legendType\n                allItems = allItems.concat((series.legendItem || {}).labels ||\n                    (seriesOptions.legendType === 'point' ?\n                        series.data :\n                        series));\n            }\n        });\n        fireEvent(this, 'afterGetAllItems', { allItems });\n        return allItems;\n    }\n    /**\n     * Get a short, three letter string reflecting the alignment and layout.\n     *\n     * @private\n     * @function Highcharts.Legend#getAlignment\n     * @return {string}\n     * The alignment, empty string if floating\n     */\n    getAlignment() {\n        const options = this.options;\n        // Use the first letter of each alignment option in order to detect\n        // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n        if (this.proximate) {\n            return options.align.charAt(0) + 'tv';\n        }\n        return options.floating ? '' : (options.align.charAt(0) +\n            options.verticalAlign.charAt(0) +\n            options.layout.charAt(0));\n    }\n    /**\n     * Adjust the chart margins by reserving space for the legend on only one\n     * side of the chart. If the position is set to a corner, top or bottom is\n     * reserved for horizontal legends and left or right for vertical ones.\n     *\n     * @private\n     * @function Highcharts.Legend#adjustMargins\n     * @param {Array<number>} margin\n     * @param {Array<number>} spacing\n     */\n    adjustMargins(margin, spacing) {\n        const chart = this.chart, options = this.options, alignment = this.getAlignment();\n        if (alignment) {\n            ([\n                /(lth|ct|rth)/,\n                /(rtv|rm|rbv)/,\n                /(rbh|cb|lbh)/,\n                /(lbv|lm|ltv)/\n            ]).forEach(function (alignments, side) {\n                if (alignments.test(alignment) && !defined(margin[side])) {\n                    // Now we have detected on which side of the chart we should\n                    // reserve space for the legend\n                    chart[marginNames[side]] = Math.max(chart[marginNames[side]], (chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +\n                        [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +\n                        pick(options.margin, 12) +\n                        spacing[side] +\n                        (chart.titleOffset[side] || 0)));\n                }\n            });\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Legend#proximatePositions\n     */\n    proximatePositions() {\n        const chart = this.chart, boxes = [], alignLeft = this.options.align === 'left';\n        this.allItems.forEach(function (item) {\n            let lastPoint, height, useFirstPoint = alignLeft, target, top;\n            if (item.yAxis) {\n                if (item.xAxis.options.reversed) {\n                    useFirstPoint = !useFirstPoint;\n                }\n                if (item.points) {\n                    lastPoint = find(useFirstPoint ?\n                        item.points :\n                        item.points.slice(0).reverse(), function (item) {\n                        return isNumber(item.plotY);\n                    });\n                }\n                height = this.itemMarginTop +\n                    item.legendItem.label.getBBox().height +\n                    this.itemMarginBottom;\n                top = item.yAxis.top - chart.plotTop;\n                if (item.visible) {\n                    target = lastPoint ?\n                        lastPoint.plotY :\n                        item.yAxis.height;\n                    target += top - 0.3 * height;\n                }\n                else {\n                    target = top + item.yAxis.height;\n                }\n                boxes.push({\n                    target: target,\n                    size: height,\n                    item\n                });\n            }\n        }, this);\n        let legendItem;\n        for (const box of distribute(boxes, chart.plotHeight)) {\n            legendItem = box.item.legendItem || {};\n            if (isNumber(box.pos)) {\n                legendItem.y = chart.plotTop - chart.spacing[0] + box.pos;\n            }\n        }\n    }\n    /**\n     * Render the legend. This method can be called both before and after\n     * `chart.render`. If called after, it will only rearrange items instead\n     * of creating new ones. Called internally on initial render and after\n     * redraws.\n     *\n     * @private\n     * @function Highcharts.Legend#render\n     */\n    render() {\n        const legend = this, chart = legend.chart, renderer = chart.renderer, options = legend.options, padding = legend.padding, \n        // Add each series or point\n        allItems = legend.getAllItems();\n        let display, legendWidth, legendHeight, legendGroup = legend.group, allowedWidth, box = legend.box;\n        legend.itemX = padding;\n        legend.itemY = legend.initialItemY;\n        legend.offsetWidth = 0;\n        legend.lastItemY = 0;\n        legend.widthOption = relativeLength(options.width, chart.spacingBox.width - padding);\n        // Compute how wide the legend is allowed to be\n        allowedWidth = chart.spacingBox.width - 2 * padding - options.x;\n        if (['rm', 'lm'].indexOf(legend.getAlignment().substring(0, 2)) > -1) {\n            allowedWidth /= 2;\n        }\n        legend.maxLegendWidth = legend.widthOption || allowedWidth;\n        if (!legendGroup) {\n            /**\n             * SVG group of the legend.\n             *\n             * @readonly\n             * @name Highcharts.Legend#group\n             * @type {Highcharts.SVGElement}\n             */\n            legend.group = legendGroup = renderer\n                .g('legend')\n                .addClass(options.className || '')\n                .attr({ zIndex: 7 })\n                .add();\n            legend.contentGroup = renderer\n                .g()\n                .attr({ zIndex: 1 }) // Above background\n                .add(legendGroup);\n            legend.scrollGroup = renderer\n                .g()\n                .add(legend.contentGroup);\n        }\n        legend.renderTitle();\n        // Sort by legendIndex\n        stableSort(allItems, (a, b) => ((a.options && a.options.legendIndex) || 0) -\n            ((b.options && b.options.legendIndex) || 0));\n        // Reversed legend\n        if (options.reversed) {\n            allItems.reverse();\n        }\n        /**\n         * All items for the legend, which is an array of series for most series\n         * and an array of points for pie series and its derivatives.\n         *\n         * @readonly\n         * @name Highcharts.Legend#allItems\n         * @type {Array<(Highcharts.Point|Highcharts.Series)>}\n         */\n        legend.allItems = allItems;\n        legend.display = display = !!allItems.length;\n        // Render the items. First we run a loop to set the text and properties\n        // and read all the bounding boxes. The next loop computes the item\n        // positions based on the bounding boxes.\n        legend.lastLineHeight = 0;\n        legend.maxItemWidth = 0;\n        legend.totalItemWidth = 0;\n        legend.itemHeight = 0;\n        allItems.forEach(legend.renderItem, legend);\n        allItems.forEach(legend.layoutItem, legend);\n        // Get the box\n        legendWidth = (legend.widthOption || legend.offsetWidth) + padding;\n        legendHeight = legend.lastItemY + legend.lastLineHeight +\n            legend.titleHeight;\n        legendHeight = legend.handleOverflow(legendHeight);\n        legendHeight += padding;\n        // Draw the border and/or background\n        if (!box) {\n            /**\n             * SVG element of the legend box.\n             *\n             * @readonly\n             * @name Highcharts.Legend#box\n             * @type {Highcharts.SVGElement}\n             */\n            legend.box = box = renderer.rect()\n                .addClass('highcharts-legend-box')\n                .attr({\n                r: options.borderRadius\n            })\n                .add(legendGroup);\n        }\n        // Presentational\n        if (!chart.styledMode) {\n            box\n                .attr({\n                stroke: options.borderColor,\n                'stroke-width': options.borderWidth || 0,\n                fill: options.backgroundColor || 'none'\n            })\n                .shadow(options.shadow);\n        }\n        if (legendWidth > 0 && legendHeight > 0) {\n            box[box.placed ? 'animate' : 'attr'](box.crisp.call({}, {\n                x: 0,\n                y: 0,\n                width: legendWidth,\n                height: legendHeight\n            }, box.strokeWidth()));\n        }\n        // Hide the border if no items\n        legendGroup[display ? 'show' : 'hide']();\n        // Open for responsiveness\n        if (chart.styledMode && legendGroup.getStyle('display') === 'none') {\n            legendWidth = legendHeight = 0;\n        }\n        legend.legendWidth = legendWidth;\n        legend.legendHeight = legendHeight;\n        if (display) {\n            legend.align();\n        }\n        if (!this.proximate) {\n            this.positionItems();\n        }\n        fireEvent(this, 'afterRender');\n    }\n    /**\n     * Align the legend to chart's box.\n     *\n     * @private\n     * @function Highcharts.align\n     * @param {Highcharts.BBoxObject} alignTo\n     */\n    align(alignTo = this.chart.spacingBox) {\n        const chart = this.chart, options = this.options;\n        // If aligning to the top and the layout is horizontal, adjust for\n        // the title (#7428)\n        let y = alignTo.y;\n        if (/(lth|ct|rth)/.test(this.getAlignment()) &&\n            chart.titleOffset[0] > 0) {\n            y += chart.titleOffset[0];\n        }\n        else if (/(lbh|cb|rbh)/.test(this.getAlignment()) &&\n            chart.titleOffset[2] > 0) {\n            y -= chart.titleOffset[2];\n        }\n        if (y !== alignTo.y) {\n            alignTo = merge(alignTo, { y });\n        }\n        if (!chart.hasRendered) {\n            // Avoid animation when adjusting alignment for responsiveness and\n            // colorAxis label layout\n            this.group.placed = false;\n        }\n        this.group.align(merge(options, {\n            width: this.legendWidth,\n            height: this.legendHeight,\n            verticalAlign: this.proximate ? 'top' : options.verticalAlign\n        }), true, alignTo);\n    }\n    /**\n     * Set up the overflow handling by adding navigation with up and down arrows\n     * below the legend.\n     *\n     * @private\n     * @function Highcharts.Legend#handleOverflow\n     */\n    handleOverflow(legendHeight) {\n        const legend = this, chart = this.chart, renderer = chart.renderer, options = this.options, optionsY = options.y, alignTop = options.verticalAlign === 'top', padding = this.padding, maxHeight = options.maxHeight, navOptions = options.navigation, animation = pick(navOptions.animation, true), arrowSize = navOptions.arrowSize || 12, pages = this.pages, allItems = this.allItems, clipToHeight = function (height) {\n            if (typeof height === 'number') {\n                clipRect.attr({\n                    height: height\n                });\n            }\n            else if (clipRect) { // Reset (#5912)\n                legend.clipRect = clipRect.destroy();\n                legend.contentGroup.clip();\n            }\n            // Use HTML\n            if (legend.contentGroup.div) {\n                legend.contentGroup.div.style.clip = height ?\n                    'rect(' + padding + 'px,9999px,' +\n                        (padding + height) + 'px,0)' :\n                    'auto';\n            }\n        }, addTracker = function (key) {\n            legend[key] = renderer\n                .circle(0, 0, arrowSize * 1.3)\n                .translate(arrowSize / 2, arrowSize / 2)\n                .add(nav);\n            if (!chart.styledMode) {\n                legend[key].attr('fill', 'rgba(0,0,0,0.0001)');\n            }\n            return legend[key];\n        };\n        let clipHeight, lastY, legendItem, spaceHeight = (chart.spacingBox.height +\n            (alignTop ? -optionsY : optionsY) - padding), nav = this.nav, clipRect = this.clipRect;\n        // Adjust the height\n        if (options.layout === 'horizontal' &&\n            options.verticalAlign !== 'middle' &&\n            !options.floating) {\n            spaceHeight /= 2;\n        }\n        if (maxHeight) {\n            spaceHeight = Math.min(spaceHeight, maxHeight);\n        }\n        // Reset the legend height and adjust the clipping rectangle\n        pages.length = 0;\n        if (legendHeight &&\n            spaceHeight > 0 &&\n            legendHeight > spaceHeight &&\n            navOptions.enabled !== false) {\n            this.clipHeight = clipHeight =\n                Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n            this.currentPage = pick(this.currentPage, 1);\n            this.fullHeight = legendHeight;\n            // Fill pages with Y positions so that the top of each a legend item\n            // defines the scroll top for each page (#2098)\n            allItems.forEach((item, i) => {\n                legendItem = item.legendItem || {};\n                const y = legendItem.y || 0, h = Math.round(legendItem.label.getBBox().height);\n                let len = pages.length;\n                if (!len || (y - pages[len - 1] > clipHeight &&\n                    (lastY || y) !== pages[len - 1])) {\n                    pages.push(lastY || y);\n                    len++;\n                }\n                // Keep track of which page each item is on\n                legendItem.pageIx = len - 1;\n                if (lastY) {\n                    (allItems[i - 1].legendItem || {}).pageIx = len - 1;\n                }\n                // Add the last page if needed (#2617, #13683)\n                if (\n                // Check the last item\n                i === allItems.length - 1 &&\n                    // If adding next page is needed (#18768)\n                    y + h - pages[len - 1] > clipHeight &&\n                    y > pages[len - 1]) {\n                    pages.push(y);\n                    legendItem.pageIx = len;\n                }\n                if (y !== lastY) {\n                    lastY = y;\n                }\n            });\n            // Only apply clipping if needed. Clipping causes blurred legend in\n            // PDF export (#1787)\n            if (!clipRect) {\n                clipRect = legend.clipRect =\n                    renderer.clipRect(0, padding - 2, 9999, 0);\n                legend.contentGroup.clip(clipRect);\n            }\n            clipToHeight(clipHeight);\n            // Add navigation elements\n            if (!nav) {\n                this.nav = nav = renderer.g()\n                    .attr({ zIndex: 1 })\n                    .add(this.group);\n                this.up = renderer\n                    .symbol('triangle', 0, 0, arrowSize, arrowSize)\n                    .add(nav);\n                addTracker('upTracker')\n                    .on('click', function () {\n                    legend.scroll(-1, animation);\n                });\n                this.pager = renderer.text('', 15, 10)\n                    .addClass('highcharts-legend-navigation');\n                if (!chart.styledMode && navOptions.style) {\n                    this.pager.css(navOptions.style);\n                }\n                this.pager.add(nav);\n                this.down = renderer\n                    .symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n                    .add(nav);\n                addTracker('downTracker')\n                    .on('click', function () {\n                    legend.scroll(1, animation);\n                });\n            }\n            // Set initial position\n            legend.scroll(0);\n            legendHeight = spaceHeight;\n            // Reset\n        }\n        else if (nav) {\n            clipToHeight();\n            this.nav = nav.destroy(); // #6322\n            this.scrollGroup.attr({\n                translateY: 1\n            });\n            this.clipHeight = 0; // #1379\n        }\n        return legendHeight;\n    }\n    /**\n     * Scroll the legend by a number of pages.\n     *\n     * @private\n     * @function Highcharts.Legend#scroll\n     *\n     * @param {number} scrollBy\n     *        The number of pages to scroll.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     *        Whether and how to apply animation.\n     *\n     */\n    scroll(scrollBy, animation) {\n        const chart = this.chart, pages = this.pages, pageCount = pages.length, clipHeight = this.clipHeight, navOptions = this.options.navigation, pager = this.pager, padding = this.padding;\n        let currentPage = this.currentPage + scrollBy;\n        // When resizing while looking at the last page\n        if (currentPage > pageCount) {\n            currentPage = pageCount;\n        }\n        if (currentPage > 0) {\n            if (typeof animation !== 'undefined') {\n                setAnimation(animation, chart);\n            }\n            this.nav.attr({\n                translateX: padding,\n                translateY: clipHeight + this.padding + 7 + this.titleHeight,\n                visibility: 'inherit'\n            });\n            [this.up, this.upTracker].forEach(function (elem) {\n                elem.attr({\n                    'class': currentPage === 1 ?\n                        'highcharts-legend-nav-inactive' :\n                        'highcharts-legend-nav-active'\n                });\n            });\n            pager.attr({\n                text: currentPage + '/' + pageCount\n            });\n            [this.down, this.downTracker].forEach(function (elem) {\n                elem.attr({\n                    // Adjust to text width\n                    x: 18 + this.pager.getBBox().width,\n                    'class': currentPage === pageCount ?\n                        'highcharts-legend-nav-inactive' :\n                        'highcharts-legend-nav-active'\n                });\n            }, this);\n            if (!chart.styledMode) {\n                this.up\n                    .attr({\n                    fill: currentPage === 1 ?\n                        navOptions.inactiveColor :\n                        navOptions.activeColor\n                });\n                this.upTracker\n                    .css({\n                    cursor: currentPage === 1 ? 'default' : 'pointer'\n                });\n                this.down\n                    .attr({\n                    fill: currentPage === pageCount ?\n                        navOptions.inactiveColor :\n                        navOptions.activeColor\n                });\n                this.downTracker\n                    .css({\n                    cursor: currentPage === pageCount ?\n                        'default' :\n                        'pointer'\n                });\n            }\n            this.scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n            this.scrollGroup.animate({\n                translateY: this.scrollOffset\n            });\n            this.currentPage = currentPage;\n            this.positionCheckboxes();\n            // Fire event after scroll animation is complete\n            const animOptions = animObject(pick(animation, chart.renderer.globalAnimation, true));\n            syncTimeout(() => {\n                fireEvent(this, 'afterScroll', { currentPage });\n            }, animOptions.duration);\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Legend#setItemEvents\n     * @param {Highcharts.BubbleLegendItem|Point|Highcharts.Series} item\n     * @param {Highcharts.SVGElement} legendLabel\n     * @param {boolean} [useHTML=false]\n     * @emits Highcharts.Legend#event:itemClick\n     */\n    setItemEvents(item, legendLabel, useHTML) {\n        const legend = this, legendItem = item.legendItem || {}, boxWrapper = legend.chart.renderer.boxWrapper, isPoint = item instanceof Point, isSeries = item instanceof Series, activeClass = 'highcharts-legend-' +\n            (isPoint ? 'point' : 'series') + '-active', styledMode = legend.chart.styledMode, \n        // When `useHTML`, the symbol is rendered in other group, so\n        // we need to apply events listeners to both places\n        legendElements = useHTML ?\n            [legendLabel, legendItem.symbol] :\n            [legendItem.group];\n        const setOtherItemsState = (state) => {\n            legend.allItems.forEach((otherItem) => {\n                if (item !== otherItem) {\n                    [otherItem]\n                        .concat(otherItem.linkedSeries || [])\n                        .forEach((otherItem) => {\n                        otherItem.setState(state, !isPoint);\n                    });\n                }\n            });\n        };\n        // Set the events on the item group, or in case of useHTML, the item\n        // itself (#1249)\n        for (const element of legendElements) {\n            if (element) {\n                element\n                    .on('mouseover', function () {\n                    if (item.visible) {\n                        setOtherItemsState('inactive');\n                    }\n                    item.setState('hover');\n                    // A CSS class to dim or hide other than the hovered\n                    // series.\n                    // Works only if hovered series is visible (#10071).\n                    if (item.visible) {\n                        boxWrapper.addClass(activeClass);\n                    }\n                    if (!styledMode) {\n                        legendLabel.css(legend.options.itemHoverStyle);\n                    }\n                })\n                    .on('mouseout', function () {\n                    if (!legend.chart.styledMode) {\n                        legendLabel.css(merge(item.visible ?\n                            legend.itemStyle :\n                            legend.itemHiddenStyle));\n                    }\n                    setOtherItemsState('');\n                    // A CSS class to dim or hide other than the hovered\n                    // series.\n                    boxWrapper.removeClass(activeClass);\n                    item.setState();\n                })\n                    .on('click', function (event) {\n                    const defaultItemClick = function () {\n                        if (item.setVisible) {\n                            item.setVisible();\n                        }\n                        // Reset inactive state\n                        setOtherItemsState(item.visible ? 'inactive' : '');\n                    };\n                    // A CSS class to dim or hide other than the hovered\n                    // series. Event handling in iOS causes the activeClass\n                    // to be added prior to click in some cases (#7418).\n                    boxWrapper.removeClass(activeClass);\n                    fireEvent(legend, 'itemClick', {\n                        // Pass over the click/touch event. #4.\n                        browserEvent: event,\n                        legendItem: item\n                    }, defaultItemClick);\n                    // Deprecated logic\n                    // Click the name or symbol\n                    if (isPoint) {\n                        item.firePointEvent('legendItemClick', {\n                            browserEvent: event\n                        });\n                    }\n                    else if (isSeries) {\n                        fireEvent(item, 'legendItemClick', {\n                            browserEvent: event\n                        });\n                    }\n                });\n            }\n        }\n    }\n    /**\n     * @private\n     * @function Highcharts.Legend#createCheckboxForItem\n     * @param {Highcharts.BubbleLegendItem|Point|Highcharts.Series} item\n     * @emits Highcharts.Series#event:checkboxClick\n     */\n    createCheckboxForItem(item) {\n        const legend = this;\n        item.checkbox = createElement('input', {\n            type: 'checkbox',\n            className: 'highcharts-legend-checkbox',\n            checked: item.selected,\n            defaultChecked: item.selected // Required by IE7\n        }, legend.options.itemCheckboxStyle, legend.chart.container);\n        addEvent(item.checkbox, 'click', function (event) {\n            const target = event.target;\n            fireEvent(item.series || item, 'checkboxClick', {\n                checked: target.checked,\n                item: item\n            }, function () {\n                item.select();\n            });\n        });\n    }\n}\n/* *\n *\n *  Class Namespace\n *\n * */\n(function (Legend) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    function compose(ChartClass) {\n        if (pushUnique(composed, 'Core.Legend')) {\n            addEvent(ChartClass, 'beforeMargins', function () {\n                /**\n                 * The legend contains an interactive overview over chart items,\n                 * usually individual series or points depending on the series\n                 * type. The color axis and bubble legend are also rendered in\n                 * the chart legend.\n                 *\n                 * @name Highcharts.Chart#legend\n                 * @type {Highcharts.Legend}\n                 */\n                this.legend = new Legend(this, this.options.legend);\n            });\n        }\n    }\n    Legend.compose = compose;\n})(Legend || (Legend = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Legend;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @interface Highcharts.LegendItemObject\n */ /**\n* @name Highcharts.LegendItemObject#item\n* @type {Highcharts.SVGElement|undefined}\n*/ /**\n* @name Highcharts.LegendItemObject#line\n* @type {Highcharts.SVGElement|undefined}\n*/ /**\n* @name Highcharts.LegendItemObject#symbol\n* @type {Highcharts.SVGElement|undefined}\n*/\n/**\n * Gets fired when the legend item is clicked. The default\n * action is to toggle the visibility of the series or point. This can be\n * prevented by returning `false` or calling `event.preventDefault()`.\n *\n * @callback Highcharts.LegendItemClickCallbackFunction\n *\n * @param {Highcharts.Legend} this\n *        The legend on which the event occurred.\n *\n * @param {Highcharts.LegendItemClickEventObject} event\n *        The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * @interface Highcharts.LegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.LegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series or point.\n* @name Highcharts.LegendItemClickEventObject#preventDefault\n* @type {Function}\n* */ /**\n* Related legend item, it can be series, point, color axis or data class from\n* color axis.\n* @name Highcharts.LegendItemClickEventObject#legendItem\n* @type {Highcharts.Series|Highcharts.Point|Highcharts.LegendItemObject}\n* */ /**\n* Related legend.\n* @name Highcharts.LegendItemClickEventObject#target\n* @type {Highcharts.Legend}\n*/ /**\n* Event type.\n* @name Highcharts.LegendItemClickEventObject#type\n* @type {\"itemClick\"}\n*/\n/**\n * Gets fired when the legend item belonging to a point is clicked. The default\n * action is to toggle the visibility of the point. This can be prevented by\n * returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.PointLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Point} this\n *        The point on which the event occurred.\n *\n * @param {Highcharts.PointLegendItemClickEventObject} event\n *        The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.PointLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.PointLegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the point.\n* @name Highcharts.PointLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related point.\n* @name Highcharts.PointLegendItemClickEventObject#target\n* @type {Highcharts.Point}\n*/ /**\n* Event type.\n* @name Highcharts.PointLegendItemClickEventObject#type\n* @type {\"legendItemClick\"}\n*/\n/**\n * Series color as used by the legend and some series types.\n * @name Highcharts.Series#color\n * @type {Highcharts.ColorType|undefined}\n */ /**\n* Legend data for the series.\n* @name Highcharts.Series#legendItem\n* @type {Highcharts.LegendItemObject|undefined}\n* @since 10.3.0\n*/\n/**\n * Gets fired when the legend item belonging to a series is clicked. The default\n * action is to toggle the visibility of the series. This can be prevented by\n * returning `false` or calling `event.preventDefault()`.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickCallbackFunction.\n *\n * @deprecated 11.4.4\n * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n *\n * @param {Highcharts.Series} this\n *        The series where the event occurred.\n *\n * @param {Highcharts.SeriesLegendItemClickEventObject} event\n *        The event that occurred.\n */\n/**\n * Information about the legend click event.\n *\n * **Note:** This option is deprecated in favor of\n * Highcharts.LegendItemClickEventObject.\n *\n * @deprecated 11.4.4\n * @interface Highcharts.SeriesLegendItemClickEventObject\n */ /**\n* Related browser event.\n* @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n* @type {Highcharts.PointerEvent}\n*/ /**\n* Prevent the default action of toggle the visibility of the series.\n* @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n* @type {Function}\n*/ /**\n* Related series.\n* @name Highcharts.SeriesLegendItemClickEventObject#target\n* @type {Highcharts.Series}\n*/ /**\n* Event type.\n* @name Highcharts.SeriesLegendItemClickEventObject#type\n* @type {\"legendItemClick\"}\n*/\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n *  Highcharts feature to make the Y axis stay fixed when scrolling the chart\n *  horizontally on mobile devices. Supports left and right side axes.\n */\n'use strict';\nimport A from '../Core/Animation/AnimationUtilities.js';\nconst { stop } = A;\nimport H from '../Core/Globals.js';\nconst { composed } = H;\nimport RendererRegistry from '../Core/Renderer/RendererRegistry.js';\nimport U from '../Core/Utilities.js';\nconst { addEvent, createElement, css, defined, merge, pushUnique } = U;\n/* *\n *\n *  Functions\n *\n * */\n/** @private */\nfunction onChartRender() {\n    let scrollablePlotArea = this.scrollablePlotArea;\n    if ((this.scrollablePixelsX || this.scrollablePixelsY) &&\n        !scrollablePlotArea) {\n        this.scrollablePlotArea = scrollablePlotArea = new ScrollablePlotArea(this);\n    }\n    scrollablePlotArea?.applyFixed();\n}\n/** @private */\nfunction markDirty() {\n    if (this.chart.scrollablePlotArea) {\n        this.chart.scrollablePlotArea.isDirty = true;\n    }\n}\nclass ScrollablePlotArea {\n    static compose(AxisClass, ChartClass, SeriesClass) {\n        if (pushUnique(composed, this.compose)) {\n            addEvent(AxisClass, 'afterInit', markDirty);\n            addEvent(ChartClass, 'afterSetChartSize', (e) => this.afterSetSize(e.target, e));\n            addEvent(ChartClass, 'render', onChartRender);\n            addEvent(SeriesClass, 'show', markDirty);\n        }\n    }\n    static afterSetSize(chart, e) {\n        const { minWidth, minHeight } = chart.options.chart.scrollablePlotArea || {}, { clipBox, plotBox, inverted, renderer } = chart;\n        let scrollablePixelsX, scrollablePixelsY, recalculateHoriz;\n        if (!renderer.forExport) {\n            // The amount of pixels to scroll, the difference between chart\n            // width and scrollable width\n            if (minWidth) {\n                chart.scrollablePixelsX = scrollablePixelsX = Math.max(0, minWidth - chart.chartWidth);\n                if (scrollablePixelsX) {\n                    chart.scrollablePlotBox = merge(chart.plotBox);\n                    plotBox.width = chart.plotWidth += scrollablePixelsX;\n                    clipBox[inverted ? 'height' : 'width'] += scrollablePixelsX;\n                    recalculateHoriz = true;\n                }\n                // Currently we can only do either X or Y\n            }\n            else if (minHeight) {\n                chart.scrollablePixelsY = scrollablePixelsY = Math.max(0, minHeight - chart.chartHeight);\n                if (defined(scrollablePixelsY)) {\n                    chart.scrollablePlotBox = merge(chart.plotBox);\n                    plotBox.height = chart.plotHeight += scrollablePixelsY;\n                    clipBox[inverted ? 'width' : 'height'] += scrollablePixelsY;\n                    recalculateHoriz = false;\n                }\n            }\n            if (defined(recalculateHoriz) && !e.skipAxes) {\n                for (const axis of chart.axes) {\n                    // Apply the corrected plot size to the axes of the other\n                    // orientation than the scrolling direction\n                    if (axis.horiz === recalculateHoriz) {\n                        axis.setAxisSize();\n                        axis.setAxisTranslation();\n                    }\n                }\n            }\n        }\n    }\n    constructor(chart) {\n        const chartOptions = chart.options.chart, Renderer = RendererRegistry.getRendererType(), scrollableOptions = chartOptions.scrollablePlotArea || {}, moveFixedElements = this.moveFixedElements.bind(this), styles = {\n            WebkitOverflowScrolling: 'touch',\n            overflowX: 'hidden',\n            overflowY: 'hidden'\n        };\n        if (chart.scrollablePixelsX) {\n            styles.overflowX = 'auto';\n        }\n        if (chart.scrollablePixelsY) {\n            styles.overflowY = 'auto';\n        }\n        this.chart = chart;\n        // Insert a container with relative position that scrolling and fixed\n        // container renders to (#10555)\n        const parentDiv = this.parentDiv = createElement('div', {\n            className: 'highcharts-scrolling-parent'\n        }, {\n            position: 'relative'\n        }, chart.renderTo), \n        // Add the necessary divs to provide scrolling\n        scrollingContainer = this.scrollingContainer = createElement('div', {\n            'className': 'highcharts-scrolling'\n        }, styles, parentDiv), innerContainer = this.innerContainer = createElement('div', {\n            'className': 'highcharts-inner-container'\n        }, void 0, scrollingContainer), fixedDiv = this.fixedDiv = createElement('div', {\n            className: 'highcharts-fixed'\n        }, {\n            position: 'absolute',\n            overflow: 'hidden',\n            pointerEvents: 'none',\n            zIndex: (chartOptions.style?.zIndex || 0) + 2,\n            top: 0\n        }, void 0, true), fixedRenderer = this.fixedRenderer = new Renderer(fixedDiv, chart.chartWidth, chart.chartHeight, chartOptions.style);\n        // Mask\n        this.mask = fixedRenderer\n            .path()\n            .attr({\n            fill: chartOptions.backgroundColor || '#fff',\n            'fill-opacity': scrollableOptions.opacity ?? 0.85,\n            zIndex: -1\n        })\n            .addClass('highcharts-scrollable-mask')\n            .add();\n        scrollingContainer.parentNode.insertBefore(fixedDiv, scrollingContainer);\n        css(chart.renderTo, { overflow: 'visible' });\n        addEvent(chart, 'afterShowResetZoom', moveFixedElements);\n        addEvent(chart, 'afterApplyDrilldown', moveFixedElements);\n        addEvent(chart, 'afterLayOutTitles', moveFixedElements);\n        // On scroll, reset the chart position because it applies to the\n        // scrolled container\n        let lastHoverPoint;\n        addEvent(scrollingContainer, 'scroll', () => {\n            const { pointer, hoverPoint } = chart;\n            if (pointer) {\n                delete pointer.chartPosition;\n                if (hoverPoint) {\n                    lastHoverPoint = hoverPoint;\n                }\n                pointer.runPointActions(void 0, lastHoverPoint, true);\n            }\n        });\n        // Now move the container inside\n        innerContainer.appendChild(chart.container);\n    }\n    applyFixed() {\n        const { chart, fixedRenderer, isDirty, scrollingContainer } = this, { axisOffset, chartWidth, chartHeight, container, plotHeight, plotLeft, plotTop, plotWidth, scrollablePixelsX = 0, scrollablePixelsY = 0 } = chart, chartOptions = chart.options.chart, scrollableOptions = chartOptions.scrollablePlotArea || {}, { scrollPositionX = 0, scrollPositionY = 0 } = scrollableOptions, scrollableWidth = chartWidth + scrollablePixelsX, scrollableHeight = chartHeight + scrollablePixelsY;\n        // Set the size of the fixed renderer to the visible width\n        fixedRenderer.setSize(chartWidth, chartHeight);\n        if (isDirty ?? true) {\n            this.isDirty = false;\n            this.moveFixedElements();\n        }\n        // Increase the size of the scrollable renderer and background\n        stop(chart.container);\n        css(container, {\n            width: `${scrollableWidth}px`,\n            height: `${scrollableHeight}px`\n        });\n        chart.renderer.boxWrapper.attr({\n            width: scrollableWidth,\n            height: scrollableHeight,\n            viewBox: [0, 0, scrollableWidth, scrollableHeight].join(' ')\n        });\n        chart.chartBackground?.attr({\n            width: scrollableWidth,\n            height: scrollableHeight\n        });\n        css(scrollingContainer, {\n            width: `${chartWidth}px`,\n            height: `${chartHeight}px`\n        });\n        // Set scroll position the first time (this.isDirty was undefined at\n        // the top of this function)\n        if (!defined(isDirty)) {\n            scrollingContainer.scrollLeft = scrollablePixelsX * scrollPositionX;\n            scrollingContainer.scrollTop = scrollablePixelsY * scrollPositionY;\n        }\n        // Mask behind the left and right side\n        const maskTop = plotTop - axisOffset[0] - 1, maskLeft = plotLeft - axisOffset[3] - 1, maskBottom = plotTop + plotHeight + axisOffset[2] + 1, maskRight = plotLeft + plotWidth + axisOffset[1] + 1, maskPlotRight = plotLeft + plotWidth - scrollablePixelsX, maskPlotBottom = plotTop + plotHeight - scrollablePixelsY;\n        let d = [['M', 0, 0]];\n        if (scrollablePixelsX) {\n            d = [\n                // Left side\n                ['M', 0, maskTop],\n                ['L', plotLeft - 1, maskTop],\n                ['L', plotLeft - 1, maskBottom],\n                ['L', 0, maskBottom],\n                ['Z'],\n                // Right side\n                ['M', maskPlotRight, maskTop],\n                ['L', chartWidth, maskTop],\n                ['L', chartWidth, maskBottom],\n                ['L', maskPlotRight, maskBottom],\n                ['Z']\n            ];\n        }\n        else if (scrollablePixelsY) {\n            d = [\n                // Top side\n                ['M', maskLeft, 0],\n                ['L', maskLeft, plotTop - 1],\n                ['L', maskRight, plotTop - 1],\n                ['L', maskRight, 0],\n                ['Z'],\n                // Bottom side\n                ['M', maskLeft, maskPlotBottom],\n                ['L', maskLeft, chartHeight],\n                ['L', maskRight, chartHeight],\n                ['L', maskRight, maskPlotBottom],\n                ['Z']\n            ];\n        }\n        if (chart.redrawTrigger !== 'adjustHeight') {\n            this.mask.attr({ d });\n        }\n    }\n    /**\n     * These elements are moved over to the fixed renderer and stay fixed when\n     * the user scrolls the chart\n     * @private\n     */\n    moveFixedElements() {\n        const { container, inverted, scrollablePixelsX, scrollablePixelsY } = this.chart, fixedRenderer = this.fixedRenderer, fixedSelectors = ScrollablePlotArea.fixedSelectors;\n        let axisClass;\n        if (scrollablePixelsX && !inverted) {\n            axisClass = '.highcharts-yaxis';\n        }\n        else if (scrollablePixelsX && inverted) {\n            axisClass = '.highcharts-xaxis';\n        }\n        else if (scrollablePixelsY && !inverted) {\n            axisClass = '.highcharts-xaxis';\n        }\n        else if (scrollablePixelsY && inverted) {\n            axisClass = '.highcharts-yaxis';\n        }\n        if (axisClass) {\n            fixedSelectors.push(`${axisClass}:not(.highcharts-radial-axis)`, `${axisClass}-labels:not(.highcharts-radial-axis-labels)`);\n        }\n        for (const className of fixedSelectors) {\n            [].forEach.call(container.querySelectorAll(className), (elem) => {\n                (elem.namespaceURI === fixedRenderer.SVG_NS ?\n                    fixedRenderer.box :\n                    fixedRenderer.box.parentNode).appendChild(elem);\n                elem.style.pointerEvents = 'auto';\n            });\n        }\n    }\n}\nScrollablePlotArea.fixedSelectors = [\n    '.highcharts-breadcrumbs-group',\n    '.highcharts-contextbutton',\n    '.highcharts-caption',\n    '.highcharts-credits',\n    '.highcharts-drillup-button',\n    '.highcharts-legend',\n    '.highcharts-legend-checkbox',\n    '.highcharts-navigator-series',\n    '.highcharts-navigator-xaxis',\n    '.highcharts-navigator-yaxis',\n    '.highcharts-navigator',\n    '.highcharts-range-selector-group',\n    '.highcharts-reset-zoom',\n    '.highcharts-scrollbar',\n    '.highcharts-subtitle',\n    '.highcharts-title'\n];\n/* *\n *\n *  Default Export\n *\n * */\nexport default ScrollablePlotArea;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Options for a scrollable plot area. This feature provides a minimum size for\n * the plot area of the chart. If the size gets smaller than this, typically\n * on mobile devices, a native browser scrollbar is presented. This scrollbar\n * provides smooth scrolling for the contents of the plot area, whereas the\n * title, legend and unaffected axes are fixed.\n *\n * Since v7.1.2, a scrollable plot area can be defined for either horizontal or\n * vertical scrolling, depending on whether the `minWidth` or `minHeight`\n * option is set.\n *\n * @sample highcharts/chart/scrollable-plotarea\n *         Scrollable plot area\n * @sample highcharts/chart/scrollable-plotarea-vertical\n *         Vertically scrollable plot area\n * @sample {gantt} gantt/chart/scrollable-plotarea-vertical\n *         Gantt chart with vertically scrollable plot area\n *\n * @since     6.1.0\n * @product   highcharts gantt\n * @apioption chart.scrollablePlotArea\n */\n/**\n * The minimum height for the plot area. If it gets smaller than this, the plot\n * area will become scrollable.\n *\n * @type      {number}\n * @since     7.1.2\n * @apioption chart.scrollablePlotArea.minHeight\n */\n/**\n * The minimum width for the plot area. If it gets smaller than this, the plot\n * area will become scrollable.\n *\n * @type      {number}\n * @since     6.1.0\n * @apioption chart.scrollablePlotArea.minWidth\n */\n/**\n * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n * 1, where 0 aligns the plot area to the left and 1 aligns it to the right.\n * Typically we would use 1 if the chart has right aligned Y axes.\n *\n * @type      {number}\n * @since     6.1.0\n * @apioption chart.scrollablePlotArea.scrollPositionX\n */\n/**\n * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n * 1, where 0 aligns the plot area to the top and 1 aligns it to the bottom.\n *\n * @type      {number}\n * @since     7.1.2\n * @apioption chart.scrollablePlotArea.scrollPositionY\n */\n/**\n * The opacity of mask applied on one of the sides of the plot\n * area.\n *\n * @sample {highcharts} highcharts/chart/scrollable-plotarea-opacity\n *         Disabled opacity for the mask\n *\n * @type        {number}\n * @default     0.85\n * @since       7.1.1\n * @apioption   chart.scrollablePlotArea.opacity\n */\n(''); // Keep doclets above in transpiled file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../../Animation/AnimationUtilities.js';\nconst { getDeferredAnimation } = A;\nimport Axis from '../Axis.js';\nimport SeriesRegistry from '../../Series/SeriesRegistry.js';\nconst { series: { prototype: seriesProto } } = SeriesRegistry;\nimport StackItem from './StackItem.js';\nimport U from '../../Utilities.js';\nconst { addEvent, correctFloat, defined, destroyObjectProperties, fireEvent, isArray, isNumber, objectEach, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Generate stacks for each series and calculate stacks total values\n *\n * @private\n * @function Highcharts.Chart#getStacks\n */\nfunction chartGetStacks() {\n    const chart = this, inverted = chart.inverted;\n    // Reset stacks for each axis\n    chart.axes.forEach((axis) => {\n        if (axis.stacking && axis.stacking.stacks && axis.hasVisibleSeries) {\n            axis.stacking.oldStacks = axis.stacking.stacks;\n        }\n    });\n    chart.series.forEach((series) => {\n        const xAxisOptions = series.xAxis && series.xAxis.options || {};\n        if (series.options.stacking && series.reserveSpace()) {\n            series.stackKey = [\n                series.type,\n                pick(series.options.stack, ''),\n                inverted ? xAxisOptions.top : xAxisOptions.left,\n                inverted ? xAxisOptions.height : xAxisOptions.width\n            ].join(',');\n        }\n    });\n}\n/**\n * @private\n */\nfunction onAxisDestroy() {\n    const stacking = this.stacking;\n    if (stacking) {\n        const stacks = stacking.stacks;\n        // Destroy each stack total\n        objectEach(stacks, (stack, stackKey) => {\n            destroyObjectProperties(stack);\n            delete stacks[stackKey];\n        });\n        stacking.stackTotalGroup?.destroy();\n    }\n}\n/**\n * @private\n */\nfunction onAxisInit() {\n    if (!this.stacking) {\n        this.stacking = new AxisAdditions(this);\n    }\n}\n/**\n * Get stack indicator, according to it's x-value, to determine points with the\n * same x-value\n *\n * @private\n * @function Highcharts.Series#getStackIndicator\n */\nfunction seriesGetStackIndicator(stackIndicator, x, index, key) {\n    // Update stack indicator, when:\n    // first point in a stack || x changed || stack type (negative vs positive)\n    // changed:\n    if (!defined(stackIndicator) ||\n        stackIndicator.x !== x ||\n        (key && stackIndicator.stackKey !== key)) {\n        stackIndicator = {\n            x: x,\n            index: 0,\n            key,\n            stackKey: key\n        };\n    }\n    else {\n        stackIndicator.index++;\n    }\n    stackIndicator.key = [index, x, stackIndicator.index].join(',');\n    return stackIndicator;\n}\n/**\n * Iterate over all stacks and compute the absolute values to percent\n *\n * @private\n * @function Highcharts.Series#modifyStacks\n */\nfunction seriesModifyStacks() {\n    const series = this, yAxis = series.yAxis, stackKey = series.stackKey || '', stacks = yAxis.stacking.stacks, processedXData = series.processedXData, stacking = series.options.stacking, stacker = series[stacking + 'Stacker'];\n    let stackIndicator;\n    if (stacker) { // Modifier function exists (Series.percentStacker etc.)\n        [stackKey, '-' + stackKey].forEach((key) => {\n            let i = processedXData.length, x, stackItem, pointExtremes;\n            while (i--) {\n                x = processedXData[i];\n                stackIndicator = series.getStackIndicator(stackIndicator, x, series.index, key);\n                stackItem = stacks[key]?.[x];\n                pointExtremes = stackItem?.points[stackIndicator.key || ''];\n                if (pointExtremes) {\n                    stacker.call(series, pointExtremes, stackItem, i);\n                }\n            }\n        });\n    }\n}\n/**\n * Modifier function for percent stacks. Blows up the stack to 100%.\n *\n * @private\n * @function Highcharts.Series#percentStacker\n */\nfunction seriesPercentStacker(pointExtremes, stack, i) {\n    const totalFactor = stack.total ? 100 / stack.total : 0;\n    // Y bottom value\n    pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n    // Y value\n    pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n    this.stackedYData[i] = pointExtremes[1];\n}\n/**\n * Set grouped points in a stack-like object. When `centerInCategory` is true,\n * and `stacking` is not enabled, we need a pseudo (horizontal) stack in order\n * to handle grouping of points within the same category.\n *\n * @private\n * @function Highcharts.Series#setGroupedPoints\n * @return {void}\n */\nfunction seriesSetGroupedPoints(axis) {\n    // Only series types supporting centerInCategory need to do this. That also\n    // applies to resetting (#20221).\n    if (this.is('column') || this.is('columnrange')) {\n        if (this.options.centerInCategory &&\n            // With stacking enabled, we already have stacks that we can compute\n            // from\n            !this.options.stacking &&\n            // With only one series, we don't need to consider centerInCategory\n            this.chart.series.length > 1) {\n            seriesProto.setStackedPoints.call(this, axis, 'group');\n            // After updating, if we now have proper stacks, we must delete the\n            // group pseudo stacks (#14980)\n        }\n        else {\n            axis.stacking.resetStacks();\n        }\n    }\n}\n/**\n * Adds series' points value to corresponding stack\n *\n * @private\n * @function Highcharts.Series#setStackedPoints\n */\nfunction seriesSetStackedPoints(axis, stackingParam) {\n    const type = stackingParam || this.options.stacking;\n    if (!type ||\n        !this.reserveSpace() ||\n        // Group stacks (centerInCategory) belong on the x-axis, other stacks on\n        // the y-axis.\n        ({ group: 'xAxis' }[type] || 'yAxis') !== axis.coll) {\n        return;\n    }\n    const series = this, xData = series.processedXData, yData = series.processedYData, stackedYData = [], yDataLength = yData.length, seriesOptions = series.options, threshold = seriesOptions.threshold || 0, stackThreshold = seriesOptions.startFromThreshold ? threshold : 0, stackOption = seriesOptions.stack, stackKey = stackingParam ?\n        `${series.type},${type}` : (series.stackKey || ''), negKey = '-' + stackKey, negStacks = series.negStacks, stacking = axis.stacking, stacks = stacking.stacks, oldStacks = stacking.oldStacks;\n    let stackIndicator, isNegative, stack, other, key, pointKey, i, x, y;\n    stacking.stacksTouched += 1;\n    // Loop over the non-null y values and read them into a local array\n    for (i = 0; i < yDataLength; i++) {\n        x = xData[i];\n        y = yData[i];\n        stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n        pointKey = stackIndicator.key || '';\n        // Read stacked values into a stack based on the x value,\n        // the sign of y and the stack key. Stacking is also handled for null\n        // values (#739)\n        isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n        key = isNegative ? negKey : stackKey;\n        // Create empty object for this stack if it doesn't exist yet\n        if (!stacks[key]) {\n            stacks[key] = {};\n        }\n        // Initialize StackItem for this x\n        if (!stacks[key][x]) {\n            if (oldStacks[key]?.[x]) {\n                stacks[key][x] = oldStacks[key][x];\n                stacks[key][x].total = null;\n            }\n            else {\n                stacks[key][x] = new StackItem(axis, axis.options.stackLabels, !!isNegative, x, stackOption);\n            }\n        }\n        // If the StackItem doesn't exist, create it first\n        stack = stacks[key][x];\n        if (y !== null) {\n            stack.points[pointKey] = stack.points[series.index] = [\n                pick(stack.cumulative, stackThreshold)\n            ];\n            // Record the base of the stack\n            if (!defined(stack.cumulative)) {\n                stack.base = pointKey;\n            }\n            stack.touched = stacking.stacksTouched;\n            // In area charts, if there are multiple points on the same X value,\n            // let the area fill the full span of those points\n            if (stackIndicator.index > 0 && series.singleStacks === false) {\n                stack.points[pointKey][0] = stack.points[series.index + ',' + x + ',0'][0];\n            }\n            // When updating to null, reset the point stack (#7493)\n        }\n        else {\n            delete stack.points[pointKey];\n            delete stack.points[series.index];\n        }\n        // Add value to the stack total\n        let total = stack.total || 0;\n        if (type === 'percent') {\n            // Percent stacked column, totals are the same for the positive and\n            // negative stacks\n            other = isNegative ? stackKey : negKey;\n            if (negStacks && stacks[other]?.[x]) {\n                other = stacks[other][x];\n                total = other.total =\n                    Math.max(other.total || 0, total) +\n                        Math.abs(y) || 0;\n                // Percent stacked areas\n            }\n            else {\n                total = correctFloat(total + (Math.abs(y) || 0));\n            }\n        }\n        else if (type === 'group') {\n            if (isArray(y)) {\n                y = y[0];\n            }\n            // In this stack, the total is the number of valid points\n            if (y !== null) {\n                total++;\n            }\n        }\n        else {\n            total = correctFloat(total + (y || 0));\n        }\n        if (type === 'group') {\n            // This point's index within the stack, pushed to stack.points[1]\n            stack.cumulative = (total || 1) - 1;\n        }\n        else {\n            stack.cumulative = correctFloat(pick(stack.cumulative, stackThreshold) +\n                (y || 0));\n        }\n        stack.total = total;\n        if (y !== null) {\n            stack.points[pointKey].push(stack.cumulative);\n            stackedYData[i] = stack.cumulative;\n            stack.hasValidPoints = true;\n        }\n    }\n    if (type === 'percent') {\n        stacking.usePercentage = true;\n    }\n    if (type !== 'group') {\n        this.stackedYData = stackedYData; // To be used in getExtremes\n    }\n    // Reset old stacks\n    stacking.oldStacks = {};\n}\n/* *\n *\n *  Classes\n *\n * */\n/**\n * Adds stacking support to axes.\n * @private\n * @class\n */\nclass AxisAdditions {\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(axis) {\n        this.oldStacks = {};\n        this.stacks = {};\n        this.stacksTouched = 0;\n        this.axis = axis;\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Build the stacks from top down\n     * @private\n     */\n    buildStacks() {\n        const stacking = this, axis = stacking.axis, axisSeries = axis.series, isXAxis = axis.coll === 'xAxis', reversedStacks = axis.options.reversedStacks, len = axisSeries.length;\n        let actualSeries, i;\n        this.resetStacks();\n        stacking.usePercentage = false;\n        i = len;\n        while (i--) {\n            actualSeries = axisSeries[reversedStacks ? i : len - i - 1];\n            if (isXAxis) {\n                actualSeries.setGroupedPoints(axis);\n            }\n            actualSeries.setStackedPoints(axis);\n        }\n        // Loop up again to compute percent and stream stack\n        if (!isXAxis) {\n            for (i = 0; i < len; i++) {\n                axisSeries[i].modifyStacks();\n            }\n        }\n        fireEvent(axis, 'afterBuildStacks');\n    }\n    /**\n     * @private\n     */\n    cleanStacks() {\n        if (this.oldStacks) {\n            this.stacks = this.oldStacks;\n            // Reset stacks\n            objectEach(this.stacks, (type) => {\n                objectEach(type, (stack) => {\n                    stack.cumulative = stack.total;\n                });\n            });\n        }\n    }\n    /**\n     * Set all the stacks to initial states and destroy unused ones.\n     * @private\n     */\n    resetStacks() {\n        objectEach(this.stacks, (type) => {\n            objectEach(type, (stack, x) => {\n                // Clean up memory after point deletion (#1044, #4320)\n                if (isNumber(stack.touched) &&\n                    stack.touched < this.stacksTouched) {\n                    stack.destroy();\n                    delete type[x];\n                    // Reset stacks\n                }\n                else {\n                    stack.total = null;\n                    stack.cumulative = null;\n                }\n            });\n        });\n    }\n    /**\n     * @private\n     */\n    renderStackTotals() {\n        const stacking = this, axis = stacking.axis, chart = axis.chart, renderer = chart.renderer, stacks = stacking.stacks, stackLabelsAnim = axis.options.stackLabels?.animation, animationConfig = getDeferredAnimation(chart, stackLabelsAnim || false), stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||\n            renderer\n                .g('stack-labels')\n                .attr({\n                zIndex: 6,\n                opacity: 0\n            })\n                .add());\n        // The plotLeft/Top will change when y axis gets wider so we need to\n        // translate the stackTotalGroup at every render call. See bug #506\n        // and #516\n        stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n        // Render each stack total\n        objectEach(stacks, (type) => {\n            objectEach(type, (stack) => {\n                stack.render(stackTotalGroup);\n            });\n        });\n        stackTotalGroup.animate({\n            opacity: 1\n        }, animationConfig);\n    }\n}\n/* *\n *\n *  Composition\n *\n * */\nvar StackingAxis;\n(function (StackingAxis) {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Extends axis with stacking support.\n     * @private\n     */\n    function compose(AxisClass, ChartClass, SeriesClass) {\n        const chartProto = ChartClass.prototype, seriesProto = SeriesClass.prototype;\n        if (!chartProto.getStacks) {\n            addEvent(AxisClass, 'init', onAxisInit);\n            addEvent(AxisClass, 'destroy', onAxisDestroy);\n            chartProto.getStacks = chartGetStacks;\n            seriesProto.getStackIndicator = seriesGetStackIndicator;\n            seriesProto.modifyStacks = seriesModifyStacks;\n            seriesProto.percentStacker = seriesPercentStacker;\n            seriesProto.setGroupedPoints = seriesSetGroupedPoints;\n            seriesProto.setStackedPoints = seriesSetStackedPoints;\n        }\n    }\n    StackingAxis.compose = compose;\n})(StackingAxis || (StackingAxis = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default StackingAxis;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Series from '../../Core/Series/Series.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport U from '../../Core/Utilities.js';\nconst { defined, merge, isObject } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * The line series is the base type and is therefor the series base prototype.\n *\n * @private\n */\nclass LineSeries extends Series {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Draw the graph. Called internally when rendering line-like series\n     * types. The first time it generates the `series.graph` item and\n     * optionally other series-wide items like `series.area` for area\n     * charts. On subsequent calls these items are updated with new\n     * positions and attributes.\n     *\n     * @function Highcharts.Series#drawGraph\n     */\n    drawGraph() {\n        const options = this.options, graphPath = (this.gappedPath || this.getGraphPath).call(this), styledMode = this.chart.styledMode;\n        // Draw the graph\n        [this, ...this.zones].forEach((owner, i) => {\n            let attribs, graph = owner.graph;\n            const verb = graph ? 'animate' : 'attr', dashStyle = owner.dashStyle ||\n                options.dashStyle;\n            if (graph) {\n                graph.endX = this.preventGraphAnimation ?\n                    null :\n                    graphPath.xMap;\n                graph.animate({ d: graphPath });\n            }\n            else if (graphPath.length) { // #1487\n                /**\n                 * SVG element of line-based charts. Can be used for styling\n                 * purposes. If zones are configured, this element will be\n                 * hidden and replaced by multiple zone lines, accessible\n                 * via `series.zones[i].graph`.\n                 *\n                 * @name Highcharts.Series#graph\n                 * @type {Highcharts.SVGElement|undefined}\n                 */\n                owner.graph = graph = this.chart.renderer\n                    .path(graphPath)\n                    .addClass('highcharts-graph' +\n                    (i ? ` highcharts-zone-graph-${i - 1} ` : ' ') +\n                    ((i && owner.className) || ''))\n                    .attr({ zIndex: 1 }) // #1069\n                    .add(this.group);\n            }\n            if (graph && !styledMode) {\n                attribs = {\n                    'stroke': ((!i && options.lineColor) || // Series only\n                        owner.color ||\n                        this.color ||\n                        \"#cccccc\" /* Palette.neutralColor20 */),\n                    'stroke-width': options.lineWidth || 0,\n                    // Polygon series use filled graph\n                    'fill': (this.fillGraph && this.color) || 'none'\n                };\n                // Apply dash style\n                if (dashStyle) {\n                    attribs.dashstyle = dashStyle;\n                    // The reason for the `else if` is that linecaps don't mix well\n                    // with dashstyle. The gaps get partially filled by the\n                    // linecap.\n                }\n                else if (options.linecap !== 'square') {\n                    attribs['stroke-linecap'] =\n                        attribs['stroke-linejoin'] = 'round';\n                }\n                graph[verb](attribs)\n                    // Add shadow to normal series (0) or to first\n                    // zone (1) #3932\n                    .shadow((i < 2) &&\n                    options.shadow &&\n                    // If shadow is defined, call function with\n                    // `filterUnits: 'userSpaceOnUse'` to avoid known\n                    // SVG filter bug (#19093)\n                    merge({ filterUnits: 'userSpaceOnUse' }, isObject(options.shadow) ? options.shadow : {}));\n            }\n            // Helpers for animation\n            if (graph) {\n                graph.startX = graphPath.xMap;\n                graph.isArea = graphPath.isArea; // For arearange animation\n            }\n        });\n    }\n    // eslint-disable-next-line valid-jsdoc\n    /**\n     * Get the graph path.\n     *\n     * @private\n     */\n    getGraphPath(points, nullsAsZeroes, connectCliffs) {\n        const series = this, options = series.options, graphPath = [], xMap = [];\n        let gap, step = options.step;\n        points = points || series.points;\n        // Bottom of a stack is reversed\n        const reversed = points.reversed;\n        if (reversed) {\n            points.reverse();\n        }\n        // Reverse the steps (#5004)\n        step = {\n            right: 1,\n            center: 2\n        }[step] || (step && 3);\n        if (step && reversed) {\n            step = 4 - step;\n        }\n        // Remove invalid points, especially in spline (#5015)\n        points = this.getValidPoints(points, false, !(options.connectNulls && !nullsAsZeroes && !connectCliffs));\n        // Build the line\n        points.forEach(function (point, i) {\n            const plotX = point.plotX, plotY = point.plotY, lastPoint = points[i - 1], isNull = point.isNull || typeof plotY !== 'number';\n            // The path to this point from the previous\n            let pathToPoint;\n            if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) &&\n                !connectCliffs) {\n                gap = true; // ... and continue\n            }\n            // Line series, nullsAsZeroes is not handled\n            if (isNull && !defined(nullsAsZeroes) && i > 0) {\n                gap = !options.connectNulls;\n                // Area series, nullsAsZeroes is set\n            }\n            else if (isNull && !nullsAsZeroes) {\n                gap = true;\n            }\n            else {\n                if (i === 0 || gap) {\n                    pathToPoint = [[\n                            'M',\n                            point.plotX,\n                            point.plotY\n                        ]];\n                    // Generate the spline as defined in the SplineSeries object\n                }\n                else if (series.getPointSpline) {\n                    pathToPoint = [series.getPointSpline(points, point, i)];\n                }\n                else if (step) {\n                    if (step === 1) { // Right\n                        pathToPoint = [[\n                                'L',\n                                lastPoint.plotX,\n                                plotY\n                            ]];\n                    }\n                    else if (step === 2) { // Center\n                        pathToPoint = [[\n                                'L',\n                                (lastPoint.plotX + plotX) / 2,\n                                lastPoint.plotY\n                            ], [\n                                'L',\n                                (lastPoint.plotX + plotX) / 2,\n                                plotY\n                            ]];\n                    }\n                    else {\n                        pathToPoint = [[\n                                'L',\n                                plotX,\n                                lastPoint.plotY\n                            ]];\n                    }\n                    pathToPoint.push([\n                        'L',\n                        plotX,\n                        plotY\n                    ]);\n                }\n                else {\n                    // Normal line to next point\n                    pathToPoint = [[\n                            'L',\n                            plotX,\n                            plotY\n                        ]];\n                }\n                // Prepare for animation. When step is enabled, there are\n                // two path nodes for each x value.\n                xMap.push(point.x);\n                if (step) {\n                    xMap.push(point.x);\n                    if (step === 2) { // Step = center (#8073)\n                        xMap.push(point.x);\n                    }\n                }\n                graphPath.push.apply(graphPath, pathToPoint);\n                gap = false;\n            }\n        });\n        graphPath.xMap = xMap;\n        series.graphPath = graphPath;\n        return graphPath;\n    }\n}\n/* *\n *\n *  Static Functions\n *\n * */\nLineSeries.defaultOptions = merge(Series.defaultOptions, \n/**\n * General options for all series types.\n *\n * @optionparent plotOptions.series\n */\n{\n    legendSymbol: 'lineMarker'\n});\nSeriesRegistry.registerSeriesType('line', LineSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default LineSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A line series displays information as a series of data points connected by\n * straight line segments.\n *\n * @sample {highcharts} highcharts/demo/line-chart/\n *         Line chart\n * @sample {highstock} stock/demo/basic-line/\n *         Line chart\n *\n * @extends   plotOptions.series\n * @product   highcharts highstock\n * @apioption plotOptions.line\n */\n/**\n * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n * of a line graph. Round means that lines are rounded in the ends and\n * bends.\n *\n * @type       {Highcharts.SeriesLinecapValue}\n * @default    round\n * @since      3.0.7\n * @apioption  plotOptions.line.linecap\n */\n/**\n * A `line` series. If the [type](#series.line.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.line\n * @excluding dataParser,dataURL\n * @product   highcharts highstock\n * @apioption series.line\n */\n/**\n * An array of data points for the series. For the `line` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 1],\n *        [1, 2],\n *        [2, 8]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.line.turboThreshold),\n *    this option is not available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 9,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 6,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * **Note:** In TypeScript you have to extend `PointOptionsObject` with an\n * additional declaration to allow custom data types:\n * ```ts\n * declare module `highcharts` {\n *   interface PointOptionsObject {\n *     custom: Record<string, (boolean|number|string)>;\n *   }\n * }\n * ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @declare   Highcharts.PointOptionsObject\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @apioption series.line.data\n */\n/**\n * An additional, individual class name for the data point's graphic\n * representation. Changes to a point's color will also be reflected in a\n * chart's legend and tooltip.\n *\n * @sample {highcharts} highcharts/css/point-series-classname\n *         Series and point class name\n *\n * @type      {string}\n * @since     5.0.0\n * @product   highcharts gantt\n * @apioption series.line.data.className\n */\n/**\n * Individual color for the point. By default the color is pulled from\n * the global `colors` array.\n *\n * In styled mode, the `color` option doesn't take effect. Instead, use\n * `colorIndex`.\n *\n * @sample {highcharts} highcharts/point/color/\n *         Mark the highest point\n *\n * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n * @product   highcharts highstock gantt\n * @apioption series.line.data.color\n */\n/**\n * A specific color index to use for the point, so its graphic representations\n * are given the class name `highcharts-color-{n}`. In styled mode this will\n * change the color of the graphic. In non-styled mode, the color is set by the\n * `fill` attribute, so the change in class name won't have a visual effect by\n * default.\n *\n * Since v11, CSS variables on the form `--highcharts-color-{n}` make changing\n * the color scheme very convenient.\n *\n * @sample    {highcharts} highcharts/css/colorindex/\n *            Series and point color index\n *\n * @type      {number}\n * @since     5.0.0\n * @product   highcharts gantt\n * @apioption series.line.data.colorIndex\n */\n/**\n * A reserved subspace to store options and values for customized functionality.\n * Here you can add additional data for your own event callbacks and formatter\n * callbacks.\n *\n * @sample {highcharts} highcharts/point/custom/\n *         Point and series with custom data\n *\n * @type      {Highcharts.Dictionary<*>}\n * @apioption series.line.data.custom\n */\n/**\n * Individual data label for each point. The options are the same as\n * the ones for [plotOptions.series.dataLabels](\n * #plotOptions.series.dataLabels).\n *\n * @sample highcharts/point/datalabels/\n *         Show a label for the last value\n *\n * @type      {*|Array<*>}\n * @declare   Highcharts.DataLabelsOptions\n * @extends   plotOptions.line.dataLabels\n * @product   highcharts highstock gantt\n * @apioption series.line.data.dataLabels\n */\n/**\n * A description of the point to add to the screen reader information\n * about the point.\n *\n * @type      {string}\n * @since     5.0.0\n * @requires  modules/accessibility\n * @apioption series.line.data.description\n */\n/**\n * An id for the point. This can be used after render time to get a\n * pointer to the point object through `chart.get()`.\n *\n * @sample {highcharts} highcharts/point/id/\n *         Remove an id'd point\n *\n * @type      {string}\n * @since     1.2.0\n * @product   highcharts highstock gantt\n * @apioption series.line.data.id\n */\n/**\n * The rank for this point's data label in case of collision. If two\n * data labels are about to overlap, only the one with the highest `labelrank`\n * will be drawn.\n *\n * @type      {number}\n * @apioption series.line.data.labelrank\n */\n/**\n * The name of the point as shown in the legend, tooltip, dataLabels, etc.\n *\n * @see [xAxis.uniqueNames](#xAxis.uniqueNames)\n *\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Point names\n *\n * @type      {string}\n * @apioption series.line.data.name\n */\n/**\n * Whether the data point is selected initially.\n *\n * @type      {boolean}\n * @default   false\n * @product   highcharts highstock gantt\n * @apioption series.line.data.selected\n */\n/**\n * The x value of the point. For datetime axes, the X value is the timestamp\n * in milliseconds since 1970.\n *\n * @type      {number}\n * @product   highcharts highstock\n * @apioption series.line.data.x\n */\n/**\n * The y value of the point.\n *\n * @type      {number|null}\n * @product   highcharts highstock\n * @apioption series.line.data.y\n */\n/**\n * The individual point events.\n *\n * @extends   plotOptions.series.point.events\n * @product   highcharts highstock gantt\n * @apioption series.line.data.events\n */\n/**\n * Options for the point markers of line-like series.\n *\n * @declare   Highcharts.PointMarkerOptionsObject\n * @extends   plotOptions.series.marker\n * @product   highcharts highstock\n * @apioption series.line.data.marker\n */\n''; // Include precedent doclets in transpiled\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AreaSeriesDefaults from './AreaSeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { seriesTypes: { line: LineSeries } } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { extend, merge, objectEach, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Area series type.\n *\n * @private\n * @class\n * @name AreaSeries\n *\n * @augments LineSeries\n */\nclass AreaSeries extends LineSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Draw the graph and the underlying area. This method calls the Series\n     * base function and adds the area. The areaPath is calculated in the\n     * getSegmentPath method called from Series.prototype.drawGraph.\n     * @private\n     */\n    drawGraph() {\n        // Define or reset areaPath\n        this.areaPath = [];\n        // Call the base method\n        super.drawGraph.apply(this);\n        // Define local variables\n        const { areaPath, options } = this;\n        [this, ...this.zones].forEach((owner, i) => {\n            const attribs = {}, fillColor = owner.fillColor || options.fillColor;\n            let area = owner.area;\n            const verb = area ? 'animate' : 'attr';\n            // Create or update the area\n            if (area) { // Update\n                area.endX = this.preventGraphAnimation ?\n                    null :\n                    areaPath.xMap;\n                area.animate({ d: areaPath });\n            }\n            else { // Create\n                attribs.zIndex = 0; // #1069\n                /**\n                 * SVG element of area-based charts. Can be used for styling\n                 * purposes. If zones are configured, this element will be\n                 * hidden and replaced by multiple zone areas, accessible\n                 * via `series.zones[i].area`.\n                 *\n                 * @name Highcharts.Series#area\n                 * @type {Highcharts.SVGElement|undefined}\n                 */\n                area = owner.area = this.chart.renderer\n                    .path(areaPath)\n                    .addClass('highcharts-area' +\n                    (i ? ` highcharts-zone-area-${i - 1} ` : ' ') +\n                    ((i && owner.className) || ''))\n                    .add(this.group);\n                area.isArea = true;\n            }\n            if (!this.chart.styledMode) {\n                // If there is fillColor defined for the area, set it.\n                // Otherwise, we set it to the zone/series color and add\n                // fill-opacity (#18939).\n                attribs.fill = fillColor || owner.color || this.color;\n                attribs['fill-opacity'] = fillColor ?\n                    1 : (options.fillOpacity ?? 0.75);\n                // Allow clicking through the area if sticky tracking is true\n                // (#18744)\n                area.css({\n                    pointerEvents: this.stickyTracking ? 'none' : 'auto'\n                });\n            }\n            area[verb](attribs);\n            area.startX = areaPath.xMap;\n            area.shiftUnit = options.step ? 2 : 1;\n        });\n    }\n    /**\n     * @private\n     */\n    getGraphPath(points) {\n        const getGraphPath = LineSeries.prototype.getGraphPath, options = this.options, stacking = options.stacking, yAxis = this.yAxis, bottomPoints = [], graphPoints = [], seriesIndex = this.index, stacks = yAxis.stacking.stacks[this.stackKey], threshold = options.threshold, translatedThreshold = Math.round(// #10909\n        yAxis.getThreshold(options.threshold)), connectNulls = pick(// #10574\n        options.connectNulls, stacking === 'percent'), \n        // To display null points in underlying stacked series, this\n        // series graph must be broken, and the area also fall down to\n        // fill the gap left by the null point. #2069\n        addDummyPoints = function (i, otherI, side) {\n            const point = points[i], stackedValues = stacking &&\n                stacks[point.x].points[seriesIndex], nullVal = point[side + 'Null'] || 0, cliffVal = point[side + 'Cliff'] || 0;\n            let top, bottom, isNull = true;\n            if (cliffVal || nullVal) {\n                top = (nullVal ?\n                    stackedValues[0] :\n                    stackedValues[1]) + cliffVal;\n                bottom = stackedValues[0] + cliffVal;\n                isNull = !!nullVal;\n            }\n            else if (!stacking &&\n                points[otherI] &&\n                points[otherI].isNull) {\n                top = bottom = threshold;\n            }\n            // Add to the top and bottom line of the area\n            if (typeof top !== 'undefined') {\n                graphPoints.push({\n                    plotX: plotX,\n                    plotY: top === null ?\n                        translatedThreshold :\n                        yAxis.getThreshold(top),\n                    isNull: isNull,\n                    isCliff: true\n                });\n                bottomPoints.push({\n                    plotX: plotX,\n                    plotY: bottom === null ?\n                        translatedThreshold :\n                        yAxis.getThreshold(bottom),\n                    doCurve: false // #1041, gaps in areaspline areas\n                });\n            }\n        };\n        let plotX, isNull, yBottom;\n        // Find what points to use\n        points = points || this.points;\n        // Fill in missing points\n        if (stacking) {\n            points = this.getStackPoints(points);\n        }\n        for (let i = 0, iEnd = points.length; i < iEnd; ++i) {\n            // Reset after series.update of stacking property (#12033)\n            if (!stacking) {\n                points[i].leftCliff = points[i].rightCliff =\n                    points[i].leftNull = points[i].rightNull = void 0;\n            }\n            isNull = points[i].isNull;\n            plotX = pick(points[i].rectPlotX, points[i].plotX);\n            yBottom = stacking ?\n                pick(points[i].yBottom, translatedThreshold) :\n                translatedThreshold;\n            if (!isNull || connectNulls) {\n                if (!connectNulls) {\n                    addDummyPoints(i, i - 1, 'left');\n                }\n                // Skip null point when stacking is false and connectNulls\n                // true\n                if (!(isNull && !stacking && connectNulls)) {\n                    graphPoints.push(points[i]);\n                    bottomPoints.push({\n                        x: i,\n                        plotX: plotX,\n                        plotY: yBottom\n                    });\n                }\n                if (!connectNulls) {\n                    addDummyPoints(i, i + 1, 'right');\n                }\n            }\n        }\n        const topPath = getGraphPath.call(this, graphPoints, true, true);\n        bottomPoints.reversed = true;\n        const bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n        const firstBottomPoint = bottomPath[0];\n        if (firstBottomPoint && firstBottomPoint[0] === 'M') {\n            bottomPath[0] = ['L', firstBottomPoint[1], firstBottomPoint[2]];\n        }\n        const areaPath = topPath.concat(bottomPath);\n        if (areaPath.length) {\n            areaPath.push(['Z']);\n        }\n        // TODO: don't set leftCliff and rightCliff when connectNulls?\n        const graphPath = getGraphPath\n            .call(this, graphPoints, false, connectNulls);\n        if (this.chart.series.length > 1 &&\n            stacking &&\n            graphPoints.some((point) => point.isCliff)) {\n            areaPath.hasStackedCliffs = graphPath.hasStackedCliffs = true;\n        }\n        areaPath.xMap = topPath.xMap;\n        this.areaPath = areaPath;\n        return graphPath;\n    }\n    /**\n     * Return an array of stacked points, where null and missing points are\n     * replaced by dummy points in order for gaps to be drawn correctly in\n     * stacks.\n     * @private\n     */\n    getStackPoints(points) {\n        const series = this, segment = [], keys = [], xAxis = this.xAxis, yAxis = this.yAxis, stack = yAxis.stacking.stacks[this.stackKey], pointMap = {}, yAxisSeries = yAxis.series, seriesLength = yAxisSeries.length, upOrDown = yAxis.options.reversedStacks ? 1 : -1, seriesIndex = yAxisSeries.indexOf(series);\n        points = points || this.points;\n        if (this.options.stacking) {\n            for (let i = 0; i < points.length; i++) {\n                // Reset after point update (#7326)\n                points[i].leftNull = points[i].rightNull = void 0;\n                // Create a map where we can quickly look up the points by\n                // their X values.\n                pointMap[points[i].x] = points[i];\n            }\n            // Sort the keys (#1651)\n            objectEach(stack, function (stackX, x) {\n                // Nulled after switching between\n                // grouping and not (#1651, #2336)\n                if (stackX.total !== null) {\n                    keys.push(x);\n                }\n            });\n            keys.sort(function (a, b) {\n                return a - b;\n            });\n            const visibleSeries = yAxisSeries.map((s) => s.visible);\n            keys.forEach(function (x, idx) {\n                let y = 0, stackPoint, stackedValues;\n                if (pointMap[x] && !pointMap[x].isNull) {\n                    segment.push(pointMap[x]);\n                    // Find left and right cliff. -1 goes left, 1 goes\n                    // right.\n                    [-1, 1].forEach(function (direction) {\n                        const nullName = direction === 1 ?\n                            'rightNull' :\n                            'leftNull', cliffName = direction === 1 ?\n                            'rightCliff' :\n                            'leftCliff', otherStack = stack[keys[idx + direction]];\n                        let cliff = 0;\n                        // If there is a stack next to this one,\n                        // to the left or to the right...\n                        if (otherStack) {\n                            let i = seriesIndex;\n                            // Can go either up or down,\n                            // depending on reversedStacks\n                            while (i >= 0 && i < seriesLength) {\n                                const si = yAxisSeries[i].index;\n                                stackPoint = otherStack.points[si];\n                                if (!stackPoint) {\n                                    // If the next point in this series is\n                                    // missing, mark the point with\n                                    // point.leftNull or point.rightNull = true.\n                                    if (si === series.index) {\n                                        pointMap[x][nullName] = true;\n                                        // If there are missing points in the next\n                                        // stack in any of the series below this\n                                        // one, we need to subtract the missing\n                                        // values and add a hiatus to the left or\n                                        // right.\n                                    }\n                                    else if (visibleSeries[i]) {\n                                        stackedValues = stack[x].points[si];\n                                        if (stackedValues) {\n                                            cliff -= (stackedValues[1] -\n                                                stackedValues[0]);\n                                        }\n                                    }\n                                }\n                                // When reversedStacks is true, loop up,\n                                // else loop down\n                                i += upOrDown;\n                            }\n                        }\n                        pointMap[x][cliffName] = cliff;\n                    });\n                    // There is no point for this X value in this series, so we\n                    // insert a dummy point in order for the areas to be drawn\n                    // correctly.\n                }\n                else {\n                    // Loop down the stack to find the series below this\n                    // one that has a value (#1991)\n                    let i = seriesIndex;\n                    while (i >= 0 && i < seriesLength) {\n                        const si = yAxisSeries[i].index;\n                        stackPoint = stack[x].points[si];\n                        if (stackPoint) {\n                            y = stackPoint[1];\n                            break;\n                        }\n                        // When reversedStacks is true, loop up, else loop\n                        // down\n                        i += upOrDown;\n                    }\n                    y = pick(y, 0);\n                    y = yAxis.translate(// #6272\n                    y, 0, 1, 0, 1);\n                    segment.push({\n                        isNull: true,\n                        plotX: xAxis.translate(// #6272\n                        x, 0, 0, 0, 1),\n                        x: x,\n                        plotY: y,\n                        yBottom: y\n                    });\n                }\n            });\n        }\n        return segment;\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nAreaSeries.defaultOptions = merge(LineSeries.defaultOptions, AreaSeriesDefaults);\nextend(AreaSeries.prototype, {\n    singleStacks: false\n});\nSeriesRegistry.registerSeriesType('area', AreaSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * The area series type.\n *\n * @sample {highcharts} highcharts/demo/area-chart/\n *         Area chart\n * @sample {highstock} stock/demo/area/\n *         Area chart\n *\n * @extends      plotOptions.line\n * @excluding    useOhlcData\n * @product      highcharts highstock\n * @optionparent plotOptions.area\n */\nconst AreaSeriesDefaults = {\n    /**\n     * @see [fillColor](#plotOptions.area.fillColor)\n     * @see [fillOpacity](#plotOptions.area.fillOpacity)\n     *\n     * @apioption plotOptions.area.color\n     */\n    /**\n     * Fill color or gradient for the area. When `undefined`, the series'\n     * `color` is used with the series' `fillOpacity`.\n     *\n     * In styled mode, the fill color can be set with the `.highcharts-area`\n     * class name.\n     *\n     * @see [color](#plotOptions.area.color)\n     * @see [fillOpacity](#plotOptions.area.fillOpacity)\n     *\n     * @sample {highcharts} highcharts/plotoptions/area-fillcolor-default/\n     *         Undefined by default\n     * @sample {highcharts} highcharts/plotoptions/area-fillcolor-gradient/\n     *         Gradient\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @product   highcharts highstock\n     * @apioption plotOptions.area.fillColor\n     */\n    /**\n     * Fill opacity for the area. When you set an explicit `fillColor`,\n     * the `fillOpacity` is not applied. Instead, you should define the\n     * opacity in the `fillColor` with an rgba color definition. The\n     * `fillOpacity` setting, also the default setting, overrides the alpha\n     * component of the `color` setting.\n     *\n     * In styled mode, the fill opacity can be set with the\n     * `.highcharts-area` class name.\n     *\n     * @see [color](#plotOptions.area.color)\n     * @see [fillColor](#plotOptions.area.fillColor)\n     *\n     * @sample {highcharts} highcharts/plotoptions/area-fillopacity/\n     *         Automatic fill color and fill opacity of 0.1\n     *\n     * @type      {number}\n     * @default   {highcharts} 0.75\n     * @default   {highstock} 0.75\n     * @product   highcharts highstock\n     * @apioption plotOptions.area.fillOpacity\n     */\n    /**\n     * A separate color for the graph line. By default the line takes the\n     * `color` of the series, but the lineColor setting allows setting a\n     * separate color for the line without altering the `fillColor`.\n     *\n     * In styled mode, the line stroke can be set with the\n     * `.highcharts-graph` class name.\n     *\n     * @sample {highcharts} highcharts/plotoptions/area-linecolor/\n     *         Dark gray line\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @product   highcharts highstock\n     * @apioption plotOptions.area.lineColor\n     */\n    /**\n     * A separate color for the negative part of the area. Note that `zones`\n     * takes precedence over the negative fill color.\n     *\n     * In styled mode, a negative color is set with the\n     * `.highcharts-negative` class name.\n     *\n     * @see [negativeColor](#plotOptions.area.negativeColor)\n     *\n     * @sample {highcharts} highcharts/css/series-negative-color/\n     *         Negative color in styled mode\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @since     3.0\n     * @product   highcharts\n     * @apioption plotOptions.area.negativeFillColor\n     */\n    /**\n     * Whether the whole area or just the line should respond to mouseover\n     * tooltips and other mouse or touch events.\n     *\n     * @sample {highcharts|highstock} highcharts/plotoptions/area-trackbyarea/\n     *         Display the tooltip when the area is hovered\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     1.1.6\n     * @product   highcharts highstock\n     * @apioption plotOptions.area.trackByArea\n     */\n    /**\n     * The Y axis value to serve as the base for the area, for\n     * distinguishing between values above and below a threshold. The area\n     * between the graph and the threshold is filled.\n     *\n     * * If a number is given, the Y axis will scale to the threshold.\n     * * If `null`, the scaling behaves like a line series with fill between\n     *   the graph and the Y axis minimum.\n     * * If `Infinity` or `-Infinity`, the area between the graph and the\n     *   corresponding Y axis extreme is filled (since v6.1.0).\n     *\n     * @sample {highcharts} highcharts/plotoptions/area-threshold/\n     *         A threshold of 100\n     * @sample {highcharts} highcharts/plotoptions/area-threshold-infinity/\n     *         A threshold of Infinity\n     *\n     * @type    {number|null}\n     * @since   2.0\n     * @product highcharts highstock\n     */\n    threshold: 0,\n    legendSymbol: 'areaMarker'\n};\n/**\n * A `area` series. If the [type](#series.area.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.area\n * @excluding dataParser, dataURL, useOhlcData\n * @product   highcharts highstock\n * @apioption series.area\n */\n/**\n * @see [fillColor](#series.area.fillColor)\n * @see [fillOpacity](#series.area.fillOpacity)\n *\n * @apioption series.area.color\n */\n/**\n * An array of data points for the series. For the `area` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` * and `pointInterval` given in the series options. If the\n *    axis has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 9],\n *        [1, 7],\n *        [2, 6]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.area.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 9,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 6,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @product   highcharts highstock\n * @apioption series.area.data\n */\n/**\n * @see [color](#series.area.color)\n * @see [fillOpacity](#series.area.fillOpacity)\n *\n * @apioption series.area.fillColor\n */\n/**\n * @see [color](#series.area.color)\n * @see [fillColor](#series.area.fillColor)\n *\n * @default   {highcharts} 0.75\n * @default   {highstock} 0.75\n * @apioption series.area.fillOpacity\n */\n''; // Adds doclets above to transpiled\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { line: LineSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { merge, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Spline series type.\n *\n * @private\n */\nclass SplineSeries extends LineSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Get the spline segment from a given point's previous neighbour to the\n     * given point.\n     *\n     * @private\n     * @function Highcharts.seriesTypes.spline#getPointSpline\n     */\n    getPointSpline(points, point, i) {\n        const \n        // 1 means control points midway between points, 2 means 1/3\n        // from the point, 3 is 1/4 etc\n        smoothing = 1.5, denom = smoothing + 1, plotX = point.plotX || 0, plotY = point.plotY || 0, lastPoint = points[i - 1], nextPoint = points[i + 1];\n        let leftContX, leftContY, rightContX, rightContY;\n        /**\n         * @private\n         */\n        function doCurve(otherPoint) {\n            return otherPoint &&\n                !otherPoint.isNull &&\n                otherPoint.doCurve !== false &&\n                // #6387, area splines next to null:\n                !point.isCliff;\n        }\n        // Find control points\n        if (doCurve(lastPoint) && doCurve(nextPoint)) {\n            const lastX = lastPoint.plotX || 0, lastY = lastPoint.plotY || 0, nextX = nextPoint.plotX || 0, nextY = nextPoint.plotY || 0;\n            let correction = 0;\n            leftContX = (smoothing * plotX + lastX) / denom;\n            leftContY = (smoothing * plotY + lastY) / denom;\n            rightContX = (smoothing * plotX + nextX) / denom;\n            rightContY = (smoothing * plotY + nextY) / denom;\n            // Have the two control points make a straight line through main\n            // point\n            if (rightContX !== leftContX) { // #5016, division by zero\n                correction = (((rightContY - leftContY) *\n                    (rightContX - plotX)) /\n                    (rightContX - leftContX) + plotY - rightContY);\n            }\n            leftContY += correction;\n            rightContY += correction;\n            // To prevent false extremes, check that control points are\n            // between neighbouring points' y values\n            if (leftContY > lastY && leftContY > plotY) {\n                leftContY = Math.max(lastY, plotY);\n                // Mirror of left control point\n                rightContY = 2 * plotY - leftContY;\n            }\n            else if (leftContY < lastY && leftContY < plotY) {\n                leftContY = Math.min(lastY, plotY);\n                rightContY = 2 * plotY - leftContY;\n            }\n            if (rightContY > nextY && rightContY > plotY) {\n                rightContY = Math.max(nextY, plotY);\n                leftContY = 2 * plotY - rightContY;\n            }\n            else if (rightContY < nextY && rightContY < plotY) {\n                rightContY = Math.min(nextY, plotY);\n                leftContY = 2 * plotY - rightContY;\n            }\n            // Record for drawing in next point\n            point.rightContX = rightContX;\n            point.rightContY = rightContY;\n            // Visualize control points for debugging\n            /*\n            if (leftContX) {\n                this.chart.renderer\n                    .circle(\n                        leftContX + this.chart.plotLeft,\n                        leftContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer\n                    .path([['M', leftContX + this.chart.plotLeft,\n                        leftContY + this.chart.plotTop\n                    ], ['L', plotX + this.chart.plotLeft,\n                        plotY + this.chart.plotTop\n                    ]])\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n            if (rightContX) {\n                this.chart.renderer\n                    .circle(\n                        rightContX + this.chart.plotLeft,\n                        rightContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer\n                    .path([[\n                        'M', rightContX + this.chart.plotLeft,\n                        rightContY + this.chart.plotTop\n                    ], [\n                        'L', plotX + this.chart.plotLeft,\n                        plotY + this.chart.plotTop\n                    ]])\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n            // */\n            point.controlPoints = {\n                low: [leftContX, leftContY],\n                high: [rightContX, rightContY]\n            };\n        }\n        const ret = [\n            'C',\n            pick(lastPoint.rightContX, lastPoint.plotX, 0),\n            pick(lastPoint.rightContY, lastPoint.plotY, 0),\n            pick(leftContX, plotX, 0),\n            pick(leftContY, plotY, 0),\n            plotX,\n            plotY\n        ];\n        // Reset for updating series later\n        lastPoint.rightContX = lastPoint.rightContY = void 0;\n        return ret;\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\n/**\n * A spline series is a special type of line series, where the segments\n * between the data points are smoothed.\n *\n * @sample {highcharts} highcharts/demo/spline-irregular-time/\n *         Spline chart\n * @sample {highstock} stock/demo/spline/\n *         Spline chart\n *\n * @extends      plotOptions.series\n * @excluding    step, boostThreshold, boostBlending\n * @product      highcharts highstock\n * @optionparent plotOptions.spline\n */\nSplineSeries.defaultOptions = merge(LineSeries.defaultOptions);\nSeriesRegistry.registerSeriesType('spline', SplineSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default SplineSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A `spline` series. If the [type](#series.spline.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.spline\n * @excluding dataParser, dataURL, step, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @apioption series.spline\n */\n/**\n * An array of data points for the series. For the `spline` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 9],\n *        [1, 2],\n *        [2, 8]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.spline.turboThreshold),\n *    this option is not available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 9,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 0,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @product   highcharts highstock\n * @apioption series.spline.data\n */\n''; // Adds doclets above intro transpiled\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport SplineSeries from '../Spline/SplineSeries.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { area: AreaSeries, area: { prototype: areaProto } } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { extend, merge } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * AreaSpline series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.areaspline\n *\n * @augments Highcharts.Series\n */\nclass AreaSplineSeries extends SplineSeries {\n}\n/* *\n *\n *  Static Properties\n *\n * */\nAreaSplineSeries.defaultOptions = merge(SplineSeries.defaultOptions, AreaSeries.defaultOptions);\nextend(AreaSplineSeries.prototype, {\n    getGraphPath: areaProto.getGraphPath,\n    getStackPoints: areaProto.getStackPoints,\n    drawGraph: areaProto.drawGraph\n});\nSeriesRegistry.registerSeriesType('areaspline', AreaSplineSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default AreaSplineSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * The area spline series is an area series where the graph between the\n * points is smoothed into a spline.\n *\n * @sample {highcharts} highcharts/demo/areaspline/\n *         Area spline chart\n * @sample {highstock} stock/demo/areaspline/\n *         Area spline chart\n *\n * @extends   plotOptions.area\n * @excluding step, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @apioption plotOptions.areaspline\n */\n/**\n * @see [fillColor](#plotOptions.areaspline.fillColor)\n * @see [fillOpacity](#plotOptions.areaspline.fillOpacity)\n *\n * @apioption plotOptions.areaspline.color\n */\n/**\n * @see [color](#plotOptions.areaspline.color)\n * @see [fillOpacity](#plotOptions.areaspline.fillOpacity)\n *\n * @apioption plotOptions.areaspline.fillColor\n */\n/**\n * @see [color](#plotOptions.areaspline.color)\n * @see [fillColor](#plotOptions.areaspline.fillColor)\n *\n * @default   0.75\n * @apioption plotOptions.areaspline.fillOpacity\n */\n/**\n * A `areaspline` series. If the [type](#series.areaspline.type) option\n * is not specified, it is inherited from [chart.type](#chart.type).\n *\n *\n * @extends   series,plotOptions.areaspline\n * @excluding dataParser, dataURL, step, boostThreshold, boostBlending\n * @product   highcharts highstock\n * @apioption series.areaspline\n */\n/**\n * @see [fillColor](#series.areaspline.fillColor)\n * @see [fillOpacity](#series.areaspline.fillOpacity)\n *\n * @apioption series.areaspline.color\n */\n/**\n * An array of data points for the series. For the `areaspline` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 10],\n *        [1, 9],\n *        [2, 3]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.areaspline.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 4,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 4,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @product   highcharts highstock\n * @apioption series.areaspline.data\n */\n/**\n * @see [color](#series.areaspline.color)\n * @see [fillOpacity](#series.areaspline.fillOpacity)\n *\n * @apioption series.areaspline.fillColor\n */\n/**\n * @see [color](#series.areaspline.color)\n * @see [fillColor](#series.areaspline.fillColor)\n *\n * @default   0.75\n * @apioption series.areaspline.fillOpacity\n */\n''; // Adds doclets above into transpiled\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../Animation/AnimationUtilities.js';\nconst { getDeferredAnimation } = A;\nimport F from '../Templating.js';\nconst { format } = F;\nimport U from '../Utilities.js';\nconst { defined, extend, fireEvent, isArray, isString, merge, objectEach, pick, pInt, splat } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar DataLabel;\n(function (DataLabel) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Check if this series has data labels, either a series-level setting, or\n     * individual. In case of individual point labels, this method is overridden\n     * to always return true.\n     * @private\n     */\n    function hasDataLabels() {\n        return mergedDataLabelOptions(this)\n            .some((o) => o?.enabled);\n    }\n    /**\n     * Align each individual data label.\n     * @private\n     */\n    function alignDataLabel(point, dataLabel, options, alignTo, isNew) {\n        const series = this, { chart, enabledDataSorting } = this, inverted = this.isCartesian && chart.inverted, plotX = point.plotX, plotY = point.plotY, rotation = options.rotation || 0, isInsidePlot = defined(plotX) &&\n            defined(plotY) &&\n            chart.isInsidePlot(plotX, Math.round(plotY), {\n                inverted,\n                paneCoordinates: true,\n                series\n            }), setStartPos = (alignOptions) => {\n            if (enabledDataSorting && series.xAxis && !justify) {\n                series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);\n            }\n        }, justify = rotation === 0 ? pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify' : false;\n        // Math.round for rounding errors (#2683), alignTo to allow column\n        // labels (#2700)\n        let visible = this.visible &&\n            point.visible !== false &&\n            defined(plotX) &&\n            (point.series.forceDL ||\n                (enabledDataSorting && !justify) ||\n                isInsidePlot ||\n                (\n                // If the data label is inside the align box, it is enough\n                // that parts of the align box is inside the plot area\n                // (#12370). When stacking, it is always inside regardless\n                // of the option (#15148).\n                pick(options.inside, !!this.options.stacking) &&\n                    alignTo &&\n                    chart.isInsidePlot(plotX, inverted ?\n                        alignTo.x + 1 :\n                        alignTo.y + alignTo.height - 1, {\n                        inverted,\n                        paneCoordinates: true,\n                        series\n                    })));\n        const pos = point.pos();\n        if (visible && pos) {\n            const bBox = dataLabel.getBBox(), unrotatedbBox = dataLabel.getBBox(void 0, 0), alignFactor = {\n                'right': 1,\n                'center': 0.5\n            }[options.align || 0] || 0, verticalAlignFactor = {\n                'bottom': 1,\n                'middle': 0.5\n            }[options.verticalAlign || 0] || 0;\n            // The alignment box is a singular point\n            alignTo = extend({\n                x: pos[0],\n                y: Math.round(pos[1]),\n                width: 0,\n                height: 0\n            }, alignTo || {});\n            // Align to plot edges\n            if (options.alignTo === 'plotEdges' && series.isCartesian) {\n                alignTo[inverted ? 'x' : 'y'] = 0;\n                alignTo[inverted ? 'width' : 'height'] = this.yAxis?.len || 0;\n            }\n            // Add the text size for alignment calculation\n            extend(options, {\n                width: bBox.width,\n                height: bBox.height\n            });\n            setStartPos(alignTo); // Data sorting\n            // Align the label to the adjusted box with for unrotated bBox due\n            // to rotationOrigin, which is based on unrotated label\n            dataLabel.align(merge(options, {\n                width: unrotatedbBox.width,\n                height: unrotatedbBox.height\n            }), false, alignTo, false);\n            dataLabel.alignAttr.x += alignFactor *\n                (unrotatedbBox.width - bBox.width);\n            dataLabel.alignAttr.y += verticalAlignFactor *\n                (unrotatedbBox.height - bBox.height);\n            dataLabel[dataLabel.placed ? 'animate' : 'attr']({\n                x: dataLabel.alignAttr.x +\n                    (bBox.width - unrotatedbBox.width) / 2,\n                y: dataLabel.alignAttr.y +\n                    (bBox.height - unrotatedbBox.height) / 2,\n                rotationOriginX: (dataLabel.width || 0) / 2,\n                rotationOriginY: (dataLabel.height || 0) / 2\n            });\n            // Uncomment this block to visualize the bounding boxes used for\n            // determining visibility\n            // chart.renderer.rect(\n            //     (dataLabel.alignAttr.x || 0) + chart.plotLeft,\n            //     (dataLabel.alignAttr.y || 0) + chart.plotTop,\n            //     bBox.width,\n            //     bBox.height\n            // ).attr({\n            //     stroke: 'rgba(0, 0, 0, 0.3)',\n            //     'stroke-width': 1,\n            //     zIndex: 20\n            // }).add();\n            // chart.renderer.circle(\n            //     chart.plotLeft + pick(dataLabel.alignAttr.x, 0),\n            //     chart.plotTop + pick(dataLabel.alignAttr.y, 0),\n            //     2\n            // ).attr({\n            //     fill: 'red',\n            //     zIndex: 20\n            // }).add();\n            if (justify && alignTo.height >= 0) { // #8830\n                this.justifyDataLabel(dataLabel, options, dataLabel.alignAttr, bBox, alignTo, isNew);\n            }\n            else if (pick(options.crop, true)) {\n                const { x, y } = dataLabel.alignAttr, correction = 1;\n                // Check if the dataLabel should be visible.\n                visible =\n                    chart.isInsidePlot(x, y, {\n                        paneCoordinates: true,\n                        series\n                    }) &&\n                        chart.isInsidePlot(x + bBox.width - correction, y + bBox.height - correction, {\n                            paneCoordinates: true,\n                            series\n                        });\n            }\n            // When we're using a shape, make it possible with a connector or an\n            // arrow pointing to this point\n            if (options.shape && !rotation) {\n                dataLabel[isNew ? 'attr' : 'animate']({\n                    anchorX: pos[0],\n                    anchorY: pos[1]\n                });\n            }\n        }\n        // To use alignAttr property in hideOverlappingLabels\n        if (isNew && enabledDataSorting) {\n            dataLabel.placed = false;\n        }\n        // Show or hide based on the final aligned position\n        if (!visible && (!enabledDataSorting || justify)) {\n            dataLabel.hide();\n            dataLabel.placed = false; // Don't animate back in\n        }\n        else {\n            dataLabel.show();\n            dataLabel.placed = true; // Flag for overlapping logic\n        }\n    }\n    /**\n     * Handle the dataLabels.filter option.\n     * @private\n     */\n    function applyFilter(point, options) {\n        const filter = options.filter;\n        if (filter) {\n            const op = filter.operator, prop = point[filter.property], val = filter.value;\n            if ((op === '>' && prop > val) ||\n                (op === '<' && prop < val) ||\n                (op === '>=' && prop >= val) ||\n                (op === '<=' && prop <= val) ||\n                (op === '==' && prop == val) || // eslint-disable-line eqeqeq\n                (op === '===' && prop === val) ||\n                (op === '!=' && prop != val) || // eslint-disable-line eqeqeq\n                (op === '!==' && prop !== val)) {\n                return true;\n            }\n            return false;\n        }\n        return true;\n    }\n    /**\n     * @private\n     */\n    function compose(SeriesClass) {\n        const seriesProto = SeriesClass.prototype;\n        if (!seriesProto.initDataLabels) {\n            seriesProto.initDataLabels = initDataLabels;\n            seriesProto.initDataLabelsGroup = initDataLabelsGroup;\n            seriesProto.alignDataLabel = alignDataLabel;\n            seriesProto.drawDataLabels = drawDataLabels;\n            seriesProto.justifyDataLabel = justifyDataLabel;\n            seriesProto.setDataLabelStartPos = setDataLabelStartPos;\n            seriesProto.hasDataLabels = hasDataLabels;\n        }\n    }\n    DataLabel.compose = compose;\n    /**\n     * Create the SVGElement group for dataLabels\n     * @private\n     */\n    function initDataLabelsGroup() {\n        return this.plotGroup('dataLabelsGroup', 'data-labels', this.hasRendered ? 'inherit' : 'hidden', // #5133, #10220\n        this.options.dataLabels.zIndex || 6);\n    }\n    /**\n     * Init the data labels with the correct animation\n     * @private\n     */\n    function initDataLabels(animationConfig) {\n        const series = this, hasRendered = series.hasRendered || 0;\n        // Create a separate group for the data labels to avoid rotation\n        const dataLabelsGroup = this.initDataLabelsGroup()\n            .attr({ opacity: +hasRendered }); // #3300\n        if (!hasRendered && dataLabelsGroup) {\n            if (series.visible) { // #2597, #3023, #3024\n                dataLabelsGroup.show();\n            }\n            if (series.options.animation) {\n                dataLabelsGroup.animate({ opacity: 1 }, animationConfig);\n            }\n            else {\n                dataLabelsGroup.attr({ opacity: 1 });\n            }\n        }\n        return dataLabelsGroup;\n    }\n    /**\n     * Draw the data labels\n     * @private\n     */\n    function drawDataLabels(points) {\n        points = points || this.points;\n        const series = this, chart = series.chart, seriesOptions = series.options, renderer = chart.renderer, { backgroundColor, plotBackgroundColor } = chart.options.chart, contrastColor = renderer.getContrast((isString(plotBackgroundColor) && plotBackgroundColor) ||\n            (isString(backgroundColor) && backgroundColor) ||\n            \"#000000\" /* Palette.neutralColor100 */), seriesDlOptions = mergedDataLabelOptions(series);\n        let pointOptions, dataLabelsGroup;\n        // Resolve the animation\n        const { animation, defer } = seriesDlOptions[0], animationConfig = defer ?\n            getDeferredAnimation(chart, animation, series) :\n            { defer: 0, duration: 0 };\n        fireEvent(this, 'drawDataLabels');\n        if (series.hasDataLabels?.()) {\n            dataLabelsGroup = this.initDataLabels(animationConfig);\n            // Make the labels for each point\n            points.forEach((point) => {\n                const dataLabels = point.dataLabels || [];\n                // Merge in series options for the point.\n                // @note dataLabelAttribs (like pointAttribs) would eradicate\n                // the need for dlOptions, and simplify the section below.\n                pointOptions = splat(mergeArrays(seriesDlOptions, \n                // The dlOptions prop is used in treemaps\n                point.dlOptions || point.options?.dataLabels));\n                // Handle each individual data label for this point\n                pointOptions.forEach((labelOptions, i) => {\n                    // Options for one datalabel\n                    const labelEnabled = (labelOptions.enabled &&\n                        (point.visible || point.dataLabelOnHidden) &&\n                        // #2282, #4641, #7112, #10049\n                        (!point.isNull || point.dataLabelOnNull) &&\n                        applyFilter(point, labelOptions)), { backgroundColor, borderColor, distance, style = {} } = labelOptions;\n                    let labelConfig, formatString, labelText, rotation, attr = {}, dataLabel = dataLabels[i], isNew = !dataLabel, labelBgColor;\n                    if (labelEnabled) {\n                        // Create individual options structure that can be\n                        // extended without affecting others\n                        formatString = pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);\n                        labelConfig = point.getLabelConfig();\n                        labelText = defined(formatString) ?\n                            format(formatString, labelConfig, chart) :\n                            (labelOptions[point.formatPrefix + 'Formatter'] ||\n                                labelOptions.formatter).call(labelConfig, labelOptions);\n                        rotation = labelOptions.rotation;\n                        if (!chart.styledMode) {\n                            // Determine the color\n                            style.color = pick(labelOptions.color, style.color, isString(series.color) ? series.color : void 0, \"#000000\" /* Palette.neutralColor100 */);\n                            // Get automated contrast color\n                            if (style.color === 'contrast') {\n                                if (backgroundColor !== 'none') {\n                                    labelBgColor = backgroundColor;\n                                }\n                                point.contrastColor = renderer.getContrast(labelBgColor !== 'auto' && labelBgColor ||\n                                    (point.color || series.color));\n                                style.color = (labelBgColor || // #20007\n                                    (!defined(distance) &&\n                                        labelOptions.inside) ||\n                                    pInt(distance || 0) < 0 ||\n                                    seriesOptions.stacking) ?\n                                    point.contrastColor :\n                                    contrastColor;\n                            }\n                            else {\n                                delete point.contrastColor;\n                            }\n                            if (seriesOptions.cursor) {\n                                style.cursor = seriesOptions.cursor;\n                            }\n                        }\n                        attr = {\n                            r: labelOptions.borderRadius || 0,\n                            rotation,\n                            padding: labelOptions.padding,\n                            zIndex: 1\n                        };\n                        if (!chart.styledMode) {\n                            attr.fill = backgroundColor === 'auto' ?\n                                point.color :\n                                backgroundColor;\n                            attr.stroke = borderColor === 'auto' ?\n                                point.color :\n                                borderColor;\n                            attr['stroke-width'] = labelOptions.borderWidth;\n                        }\n                        // Remove unused attributes (#947)\n                        objectEach(attr, (val, name) => {\n                            if (typeof val === 'undefined') {\n                                delete attr[name];\n                            }\n                        });\n                    }\n                    // If the point is outside the plot area, or the label\n                    // changes properties that we cannot change, destroy it and\n                    // build a new one below. #678, #820.\n                    if (dataLabel && (!labelEnabled ||\n                        !defined(labelText) ||\n                        !!dataLabel.div !== !!labelOptions.useHTML ||\n                        (\n                        // Change from no rotation to rotation and\n                        // vice versa. Don't use defined() because\n                        // rotation = 0 means also rotation = undefined\n                        (!dataLabel.rotation ||\n                            !labelOptions.rotation) &&\n                            dataLabel.rotation !== labelOptions.rotation))) {\n                        dataLabel = void 0;\n                        isNew = true;\n                    }\n                    // Individual labels are disabled if the are explicitly\n                    // disabled in the point options, or if they fall outside\n                    // the plot area.\n                    if (labelEnabled && defined(labelText)) {\n                        if (!dataLabel) {\n                            // Create new label element\n                            dataLabel = renderer.label(labelText, 0, 0, labelOptions.shape, void 0, void 0, labelOptions.useHTML, void 0, 'data-label');\n                            dataLabel.addClass(' highcharts-data-label-color-' +\n                                point.colorIndex +\n                                ' ' + (labelOptions.className || '') +\n                                ( // #3398\n                                labelOptions.useHTML ?\n                                    ' highcharts-tracker' :\n                                    ''));\n                        }\n                        else {\n                            // Use old element and just update text\n                            attr.text = labelText;\n                        }\n                        // Store data label options for later access\n                        if (dataLabel) {\n                            dataLabel.options = labelOptions;\n                            dataLabel.attr(attr);\n                            if (!chart.styledMode) {\n                                // Styles must be applied before add in order to\n                                // read text bounding box\n                                dataLabel.css(style).shadow(labelOptions.shadow);\n                            }\n                            else if (style.width) {\n                                // In styled mode with a width property set,\n                                // the width should be applied to the\n                                // dataLabel. (#20499)\n                                dataLabel.css({\n                                    width: style.width,\n                                    textOverflow: style.textOverflow\n                                });\n                            }\n                            fireEvent(dataLabel, 'beforeAddingDataLabel', { labelOptions, point });\n                            if (!dataLabel.added) {\n                                dataLabel.add(dataLabelsGroup);\n                            }\n                            // Now the data label is created and placed at 0,0,\n                            // so we need to align it\n                            series.alignDataLabel(point, dataLabel, labelOptions, void 0, isNew);\n                            dataLabel.isActive = true;\n                            if (dataLabels[i] && dataLabels[i] !== dataLabel) {\n                                dataLabels[i].destroy();\n                            }\n                            dataLabels[i] = dataLabel;\n                        }\n                    }\n                });\n                // Destroy and remove the inactive ones\n                let j = dataLabels.length;\n                while (j--) {\n                    // The item can be undefined if a disabled data label is\n                    // succeeded by an enabled one (#19457)\n                    if (!dataLabels[j] || !dataLabels[j].isActive) {\n                        dataLabels[j]?.destroy();\n                        dataLabels.splice(j, 1);\n                    }\n                    else {\n                        dataLabels[j].isActive = false;\n                    }\n                }\n                // Write back\n                point.dataLabel = dataLabels[0];\n                point.dataLabels = dataLabels;\n            });\n        }\n        fireEvent(this, 'afterDrawDataLabels');\n    }\n    /**\n     * If data labels fall partly outside the plot area, align them back in, in\n     * a way that doesn't hide the point.\n     * @private\n     */\n    function justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n        const chart = this.chart, align = options.align, verticalAlign = options.verticalAlign, padding = dataLabel.box ? 0 : (dataLabel.padding || 0), horizontalAxis = chart.inverted ? this.yAxis : this.xAxis, horizontalAxisShift = horizontalAxis ?\n            horizontalAxis.left - chart.plotLeft : 0, verticalAxis = chart.inverted ? this.xAxis : this.yAxis, verticalAxisShift = verticalAxis ?\n            verticalAxis.top - chart.plotTop : 0;\n        let { x = 0, y = 0 } = options, off, justified;\n        // Off left\n        off = (alignAttr.x || 0) + padding + horizontalAxisShift;\n        if (off < 0) {\n            if (align === 'right' && x >= 0) {\n                options.align = 'left';\n                options.inside = true;\n            }\n            else {\n                x -= off;\n            }\n            justified = true;\n        }\n        // Off right\n        off = (alignAttr.x || 0) + bBox.width - padding + horizontalAxisShift;\n        if (off > chart.plotWidth) {\n            if (align === 'left' && x <= 0) {\n                options.align = 'right';\n                options.inside = true;\n            }\n            else {\n                x += chart.plotWidth - off;\n            }\n            justified = true;\n        }\n        // Off top\n        off = alignAttr.y + padding + verticalAxisShift;\n        if (off < 0) {\n            if (verticalAlign === 'bottom' && y >= 0) {\n                options.verticalAlign = 'top';\n                options.inside = true;\n            }\n            else {\n                y -= off;\n            }\n            justified = true;\n        }\n        // Off bottom\n        off = (alignAttr.y || 0) + bBox.height - padding + verticalAxisShift;\n        if (off > chart.plotHeight) {\n            if (verticalAlign === 'top' && y <= 0) {\n                options.verticalAlign = 'bottom';\n                options.inside = true;\n            }\n            else {\n                y += chart.plotHeight - off;\n            }\n            justified = true;\n        }\n        if (justified) {\n            options.x = x;\n            options.y = y;\n            dataLabel.placed = !isNew;\n            dataLabel.align(options, void 0, alignTo);\n        }\n        return justified;\n    }\n    /**\n     * Merge two objects that can be arrays. If one of them is an array, the\n     * other is merged into each element. If both are arrays, each element is\n     * merged by index. If neither are arrays, we use normal merge.\n     * @private\n     */\n    function mergeArrays(one, two) {\n        let res = [], i;\n        if (isArray(one) && !isArray(two)) {\n            res = one.map(function (el) {\n                return merge(el, two);\n            });\n        }\n        else if (isArray(two) && !isArray(one)) {\n            res = two.map(function (el) {\n                return merge(one, el);\n            });\n        }\n        else if (!isArray(one) && !isArray(two)) {\n            res = merge(one, two);\n        }\n        else if (isArray(one) && isArray(two)) {\n            i = Math.max(one.length, two.length);\n            while (i--) {\n                res[i] = merge(one[i], two[i]);\n            }\n        }\n        return res;\n    }\n    /**\n     * Merge plotOptions and series options for dataLabels.\n     * @private\n     */\n    function mergedDataLabelOptions(series) {\n        const plotOptions = series.chart.options.plotOptions;\n        return splat(mergeArrays(mergeArrays(plotOptions?.series?.dataLabels, plotOptions?.[series.type]?.dataLabels), series.options.dataLabels));\n    }\n    /**\n     * Set starting position for data label sorting animation.\n     * @private\n     */\n    function setDataLabelStartPos(point, dataLabel, isNew, isInside, alignOptions) {\n        const chart = this.chart, inverted = chart.inverted, xAxis = this.xAxis, reversed = xAxis.reversed, labelCenter = ((inverted ? dataLabel.height : dataLabel.width) || 0) / 2, pointWidth = point.pointWidth, halfWidth = pointWidth ? pointWidth / 2 : 0;\n        dataLabel.startXPos = inverted ?\n            alignOptions.x :\n            (reversed ?\n                -labelCenter - halfWidth :\n                xAxis.width - labelCenter + halfWidth);\n        dataLabel.startYPos = inverted ?\n            (reversed ?\n                this.yAxis.height - labelCenter + halfWidth :\n                -labelCenter - halfWidth) : alignOptions.y;\n        // We need to handle visibility in case of sorting point outside plot\n        // area\n        if (!isInside) {\n            dataLabel\n                .attr({ opacity: 1 })\n                .animate({ opacity: 0 }, void 0, dataLabel.hide);\n        }\n        else if (dataLabel.visibility === 'hidden') {\n            dataLabel.show();\n            dataLabel\n                .attr({ opacity: 0 })\n                .animate({ opacity: 1 });\n        }\n        // Save start position on first render, but do not change position\n        if (!chart.hasRendered) {\n            return;\n        }\n        // Set start position\n        if (isNew) {\n            dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });\n        }\n        dataLabel.placed = true;\n    }\n})(DataLabel || (DataLabel = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default DataLabel;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Callback JavaScript function to format the data label as a string. Note that\n * if a `format` is defined, the format takes precedence and the formatter is\n * ignored.\n *\n * @callback Highcharts.DataLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.PointLabelObject} this\n * Data label context to format\n *\n * @param {Highcharts.DataLabelsOptions} options\n * [API options](/highcharts/plotOptions.series.dataLabels) of the data label\n *\n * @return {number|string|null|undefined}\n * Formatted data label text\n */\n/**\n * Values for handling data labels that flow outside the plot area.\n *\n * @typedef {\"allow\"|\"justify\"} Highcharts.DataLabelsOverflowValue\n */\n''; // Keeps doclets above in JS file\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport DataLabel from '../../Core/Series/DataLabel.js';\nimport H from '../../Core/Globals.js';\nconst { composed } = H;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: Series } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { merge, pick, pushUnique } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar ColumnDataLabel;\n(function (ColumnDataLabel) {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Override the basic data label alignment by adjusting for the position of\n     * the column.\n     * @private\n     */\n    function alignDataLabel(point, dataLabel, options, alignTo, isNew) {\n        const inverted = this.chart.inverted, series = point.series, xLen = (series.xAxis ? series.xAxis.len : this.chart.plotSizeX) || 0, yLen = (series.yAxis ? series.yAxis.len : this.chart.plotSizeY) || 0, \n        // Data label box for alignment\n        dlBox = point.dlBox || point.shapeArgs, below = pick(point.below, // Range series\n        point.plotY >\n            pick(this.translatedThreshold, yLen)), \n        // Draw it inside the box?\n        inside = pick(options.inside, !!this.options.stacking);\n        // Align to the column itself, or the top of it\n        if (dlBox) { // Area range uses this method but not alignTo\n            alignTo = merge(dlBox);\n            // Check for specific overflow and crop conditions (#13240)\n            if (!(options.overflow === 'allow' && options.crop === false)) {\n                if (alignTo.y < 0) {\n                    alignTo.height += alignTo.y;\n                    alignTo.y = 0;\n                }\n                // If parts of the box overshoots outside the plot area, modify\n                // the box to center the label inside\n                const overshoot = alignTo.y + alignTo.height - yLen;\n                if (overshoot > 0 && overshoot < alignTo.height - 1) {\n                    alignTo.height -= overshoot;\n                }\n            }\n            if (inverted) {\n                alignTo = {\n                    x: yLen - alignTo.y - alignTo.height,\n                    y: xLen - alignTo.x - alignTo.width,\n                    width: alignTo.height,\n                    height: alignTo.width\n                };\n            }\n            // Compute the alignment box\n            if (!inside) {\n                if (inverted) {\n                    alignTo.x += below ? 0 : alignTo.width;\n                    alignTo.width = 0;\n                }\n                else {\n                    alignTo.y += below ? alignTo.height : 0;\n                    alignTo.height = 0;\n                }\n            }\n        }\n        // When alignment is undefined (typically columns and bars), display the\n        // individual point below or above the point depending on the threshold\n        options.align = pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');\n        options.verticalAlign = pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');\n        // Call the parent method\n        Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n        // If label was justified and we have contrast, set it:\n        if (options.inside && point.contrastColor) {\n            dataLabel.css({\n                color: point.contrastColor\n            });\n        }\n    }\n    /** @private */\n    function compose(ColumnSeriesClass) {\n        DataLabel.compose(Series);\n        if (pushUnique(composed, 'ColumnDataLabel')) {\n            ColumnSeriesClass.prototype.alignDataLabel = alignDataLabel;\n        }\n    }\n    ColumnDataLabel.compose = compose;\n})(ColumnDataLabel || (ColumnDataLabel = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnDataLabel;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ColumnSeries from '../Column/ColumnSeries.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport U from '../../Core/Utilities.js';\nconst { extend, merge } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Bar series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.bar\n *\n * @augments Highcharts.Series\n */\nclass BarSeries extends ColumnSeries {\n}\n/* *\n *\n *  Static Properties\n *\n * */\n/**\n * A bar series is a special type of column series where the columns are\n * horizontal.\n *\n * @sample highcharts/demo/bar-chart/\n *         Bar chart\n *\n * @extends      plotOptions.column\n * @product      highcharts\n * @optionparent plotOptions.bar\n */\nBarSeries.defaultOptions = merge(ColumnSeries.defaultOptions, {\n// Nothing here yet\n});\nextend(BarSeries.prototype, {\n    inverted: true\n});\nSeriesRegistry.registerSeriesType('bar', BarSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default BarSeries;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A `bar` series. If the [type](#series.bar.type) option is not specified,\n * it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.bar\n * @excluding connectNulls, dashStyle, dataParser, dataURL, gapSize, gapUnit,\n *            linecap, lineWidth, marker, connectEnds, step\n * @product   highcharts\n * @apioption series.bar\n */\n/**\n * An array of data points for the series. For the `bar` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 5],\n *        [1, 10],\n *        [2, 3]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.bar.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 1,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 10,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.column.data\n * @product   highcharts\n * @apioption series.bar.data\n */\n/**\n * @excluding halo,lineWidth,lineWidthPlus,marker\n * @product   highcharts highstock\n * @apioption series.bar.states.hover\n */\n/**\n * @excluding halo,lineWidth,lineWidthPlus,marker\n * @product   highcharts highstock\n * @apioption series.bar.states.select\n */\n''; // Gets doclets above into transpiled\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ScatterSeriesDefaults from './ScatterSeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { column: ColumnSeries, line: LineSeries } = SeriesRegistry.seriesTypes;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, extend, merge } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Scatter series type.\n *\n * @private\n */\nclass ScatterSeries extends LineSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Optionally add the jitter effect.\n     * @private\n     */\n    applyJitter() {\n        const series = this, jitter = this.options.jitter, len = this.points.length;\n        /**\n         * Return a repeatable, pseudo-random number based on an integer\n         * seed.\n         * @private\n         */\n        function unrandom(seed) {\n            const rand = Math.sin(seed) * 10000;\n            return rand - Math.floor(rand);\n        }\n        if (jitter) {\n            this.points.forEach(function (point, i) {\n                ['x', 'y'].forEach(function (dim, j) {\n                    if (jitter[dim] && !point.isNull) {\n                        const plotProp = `plot${dim.toUpperCase()}`, axis = series[`${dim}Axis`], translatedJitter = jitter[dim] *\n                            axis.transA;\n                        if (axis && !axis.logarithmic) {\n                            // Identify the outer bounds of the jitter range\n                            const min = Math.max(0, (point[plotProp] || 0) - translatedJitter), max = Math.min(axis.len, (point[plotProp] || 0) + translatedJitter);\n                            // Find a random position within this range\n                            point[plotProp] = min +\n                                (max - min) * unrandom(i + j * len);\n                            // Update clientX for the tooltip k-d-tree\n                            if (dim === 'x') {\n                                point.clientX = point.plotX;\n                            }\n                        }\n                    }\n                });\n            });\n        }\n    }\n    /**\n     * @private\n     */\n    drawGraph() {\n        if (this.options.lineWidth) {\n            super.drawGraph();\n        }\n        else if (this.graph) {\n            this.graph = this.graph.destroy();\n        }\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nScatterSeries.defaultOptions = merge(LineSeries.defaultOptions, ScatterSeriesDefaults);\nextend(ScatterSeries.prototype, {\n    drawTracker: ColumnSeries.prototype.drawTracker,\n    sorted: false,\n    requireSorting: false,\n    noSharedTooltip: true,\n    trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup']\n});\n/* *\n *\n *  Events\n *\n * */\n/* eslint-disable no-invalid-this */\naddEvent(ScatterSeries, 'afterTranslate', function () {\n    this.applyJitter();\n});\nSeriesRegistry.registerSeriesType('scatter', ScatterSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default ScatterSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A scatter plot uses cartesian coordinates to display values for two\n * variables for a set of data.\n *\n * @sample {highcharts} highcharts/demo/scatter/\n *         Scatter plot\n *\n * @extends      plotOptions.line\n * @excluding    cropThreshold, pointPlacement, shadow, useOhlcData\n * @product      highcharts highstock\n * @optionparent plotOptions.scatter\n */\nconst ScatterSeriesDefaults = {\n    /**\n     * The width of the line connecting the data points.\n     *\n     * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-none/\n     *         0 by default\n     * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-1/\n     *         1px\n     *\n     * @product highcharts highstock\n     */\n    lineWidth: 0,\n    findNearestPointBy: 'xy',\n    /**\n     * Apply a jitter effect for the rendered markers. When plotting\n     * discrete values, a little random noise may help telling the points\n     * apart. The jitter setting applies a random displacement of up to `n`\n     * axis units in either direction. So for example on a horizontal X\n     * axis, setting the `jitter.x` to 0.24 will render the point in a\n     * random position between 0.24 units to the left and 0.24 units to the\n     * right of the true axis position. On a category axis, setting it to\n     * 0.5 will fill up the bin and make the data appear continuous.\n     *\n     * When rendered on top of a box plot or a column series, a jitter value\n     * of 0.24 will correspond to the underlying series' default\n     * [groupPadding](\n     * https://api.highcharts.com/highcharts/plotOptions.column.groupPadding)\n     * and [pointPadding](\n     * https://api.highcharts.com/highcharts/plotOptions.column.pointPadding)\n     * settings.\n     *\n     * **Note:** With boost mode enabled, the jitter effect is not supported.\n     *\n     * @sample {highcharts} highcharts/demo/scatter-jitter\n     *         Jitter on a scatter plot\n     *\n     * @sample {highcharts} highcharts/series-scatter/jitter-boxplot\n     *         Jittered scatter plot on top of a box plot\n     *\n     * @product highcharts highstock\n     * @since 7.0.2\n     */\n    jitter: {\n        /**\n         * The maximal X offset for the random jitter effect.\n         */\n        x: 0,\n        /**\n         * The maximal Y offset for the random jitter effect.\n         */\n        y: 0\n    },\n    marker: {\n        enabled: true // Overrides auto-enabling in line series (#3647)\n    },\n    /**\n     * Sticky tracking of mouse events. When true, the `mouseOut` event\n     * on a series isn't triggered until the mouse moves over another\n     * series, or out of the plot area. When false, the `mouseOut` event on\n     * a series is triggered when the mouse leaves the area around the\n     * series' graph or markers. This also implies the tooltip. When\n     * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n     * will be hidden when moving the mouse between series.\n     *\n     * @type      {boolean}\n     * @default   false\n     * @product   highcharts highstock highmaps\n     * @apioption plotOptions.scatter.stickyTracking\n     */\n    /**\n     * A configuration object for the tooltip rendering of each single\n     * series. Properties are inherited from [tooltip](#tooltip).\n     * Overridable properties are `headerFormat`, `pointFormat`,\n     * `yDecimals`, `xDateFormat`, `yPrefix` and `ySuffix`. Unlike other\n     * series, in a scatter plot the series.name by default shows in the\n     * headerFormat and point.x and point.y in the pointFormat.\n     *\n     * @product highcharts highstock highmaps\n     */\n    tooltip: {\n        /**\n         * @product highcharts highstock\n         */\n        headerFormat: '<span style=\"color:{point.color}\">\\u25CF</span> ' +\n            '<span style=\"font-size: 0.8em\"> {series.name}</span><br/>',\n        pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'\n    }\n};\n/**\n * A `scatter` series. If the [type](#series.scatter.type) option is\n * not specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.scatter\n * @excluding cropThreshold, dataParser, dataURL, useOhlcData\n * @product   highcharts highstock\n * @apioption series.scatter\n */\n/**\n * An array of data points for the series. For the `scatter` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. The `x` values will be automatically\n *    calculated, either starting at 0 and incremented by 1, or from\n *    `pointStart` and `pointInterval` given in the series options. If the axis\n *    has categories, these will be used. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of arrays with 2 values. In this case, the values correspond to\n *    `x,y`. If the first value is a string, it is applied as the name of the\n *    point, and the `x` value is inferred.\n *    ```js\n *    data: [\n *        [0, 0],\n *        [1, 8],\n *        [2, 9]\n *    ]\n *    ```\n *\n * 3. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.scatter.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        x: 1,\n *        y: 2,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        x: 1,\n *        y: 4,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n * @extends   series.line.data\n * @product   highcharts highstock\n * @apioption series.scatter.data\n */\n''; // Keeps doclets above in JS file\n/* *\n *\n *  Default Export\n *\n * */\nexport default ScatterSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport A from '../../Core/Animation/AnimationUtilities.js';\nconst { setAnimation } = A;\nimport Point from '../../Core/Series/Point.js';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, defined, extend, isNumber, pick, relativeLength } = U;\n/* *\n *\n *  Class\n *\n * */\nclass PiePoint extends Point {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Extendable method for getting the path of the connector between the\n     * data label and the pie slice.\n     * @private\n     */\n    getConnectorPath(dataLabel) {\n        const labelPosition = dataLabel.dataLabelPosition, options = (dataLabel.options || {}), connectorShape = options.connectorShape, shapeFunc = (this.connectorShapes[connectorShape] || connectorShape);\n        return labelPosition && shapeFunc.call(this, {\n            // Pass simplified label position object for user's convenience\n            ...labelPosition.computed,\n            alignment: labelPosition.alignment\n        }, labelPosition.connectorPosition, options) || [];\n    }\n    /**\n     * @private\n     */\n    getTranslate() {\n        return this.sliced && this.slicedTranslation || {\n            translateX: 0,\n            translateY: 0\n        };\n    }\n    /**\n     * @private\n     */\n    haloPath(size) {\n        const shapeArgs = this.shapeArgs;\n        return this.sliced || !this.visible ?\n            [] :\n            this.series.chart.renderer.symbols.arc(shapeArgs.x, shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {\n                // Substract 1px to ensure the background is not bleeding\n                // through between the halo and the slice (#7495).\n                innerR: shapeArgs.r - 1,\n                start: shapeArgs.start,\n                end: shapeArgs.end,\n                borderRadius: shapeArgs.borderRadius\n            });\n    }\n    /**\n     * Initialize the pie slice.\n     * @private\n     */\n    constructor(series, options, x) {\n        super(series, options, x);\n        this.half = 0;\n        this.name ?? (this.name = 'Slice');\n        // Add event listener for select\n        const toggleSlice = (e) => {\n            this.slice(e.type === 'select');\n        };\n        addEvent(this, 'select', toggleSlice);\n        addEvent(this, 'unselect', toggleSlice);\n    }\n    /**\n     * Negative points are not valid (#1530, #3623, #5322)\n     * @private\n     */\n    isValid() {\n        return isNumber(this.y) && this.y >= 0;\n    }\n    /**\n     * Toggle the visibility of a pie slice or other data point. Note that this\n     * method is available only for some series, like pie, treemap and sunburst.\n     *\n     * @function Highcharts.Point#setVisible\n     *\n     * @param {boolean} [vis]\n     * True to show the pie slice or other data point, false to hide. If\n     * undefined, the visibility is toggled.\n     *\n     * @param {boolean} [redraw] Whether to redraw the chart after the point is\n     * altered. If doing more operations on the chart, it is a good idea to set\n     * redraw to false and call {@link Chart#redraw|chart.redraw()} after.\n     *\n     */\n    setVisible(vis, redraw = true) {\n        if (vis !== this.visible) {\n            // If called without an argument, toggle visibility\n            this.update({\n                visible: vis ?? !this.visible\n            }, redraw, void 0, false);\n        }\n    }\n    /**\n     * Set or toggle whether the slice is cut out from the pie.\n     * @private\n     *\n     * @param {boolean} sliced\n     * When undefined, the slice state is toggled.\n     *\n     * @param {boolean} [redraw]\n     * Whether to redraw the chart. True by default.\n     *\n     * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation]\n     * Animation options.\n     */\n    slice(sliced, redraw, animation) {\n        const series = this.series, chart = series.chart;\n        setAnimation(animation, chart);\n        // Redraw is true by default\n        redraw = pick(redraw, true);\n        /**\n         * Pie series only. Whether to display a slice offset from the\n         * center.\n         * @name Highcharts.Point#sliced\n         * @type {boolean|undefined}\n         */\n        // if called without an argument, toggle\n        this.sliced = this.options.sliced = sliced =\n            defined(sliced) ? sliced : !this.sliced;\n        // Update userOptions.data\n        series.options.data[series.data.indexOf(this)] =\n            this.options;\n        if (this.graphic) {\n            this.graphic.animate(this.getTranslate());\n        }\n    }\n}\nextend(PiePoint.prototype, {\n    connectorShapes: {\n        // Only one available before v7.0.0\n        fixedOffset: function (labelPosition, connectorPosition, options) {\n            const breakAt = connectorPosition.breakAt, touchingSliceAt = connectorPosition.touchingSliceAt, lineSegment = options.softConnector ? [\n                'C', // Soft break\n                // 1st control point (of the curve)\n                labelPosition.x +\n                    // 5 gives the connector a little horizontal bend\n                    (labelPosition.alignment === 'left' ? -5 : 5),\n                labelPosition.y, //\n                2 * breakAt.x - touchingSliceAt.x, // 2nd control point\n                2 * breakAt.y - touchingSliceAt.y, //\n                breakAt.x, // End of the curve\n                breakAt.y //\n            ] : [\n                'L', // Pointy break\n                breakAt.x,\n                breakAt.y\n            ];\n            // Assemble the path\n            return ([\n                ['M', labelPosition.x, labelPosition.y],\n                lineSegment,\n                ['L', touchingSliceAt.x, touchingSliceAt.y]\n            ]);\n        },\n        straight: function (labelPosition, connectorPosition) {\n            const touchingSliceAt = connectorPosition.touchingSliceAt;\n            // Direct line to the slice\n            return [\n                ['M', labelPosition.x, labelPosition.y],\n                ['L', touchingSliceAt.x, touchingSliceAt.y]\n            ];\n        },\n        crookedLine: function (labelPosition, connectorPosition, options) {\n            const { breakAt, touchingSliceAt } = connectorPosition, { series } = this, [cx, cy, diameter] = series.center, r = diameter / 2, { plotLeft, plotWidth } = series.chart, leftAligned = labelPosition.alignment === 'left', { x, y } = labelPosition;\n            let crookX = breakAt.x;\n            if (options.crookDistance) {\n                const crookDistance = relativeLength(// % to fraction\n                options.crookDistance, 1);\n                crookX = leftAligned ?\n                    cx +\n                        r +\n                        (plotWidth + plotLeft - cx - r) * (1 - crookDistance) :\n                    plotLeft + (cx - r) * crookDistance;\n                // When the crookDistance option is undefined, make the bend in the\n                // intersection between the radial line in the middle of the slice,\n                // and the extension of the label position.\n            }\n            else {\n                crookX = cx + (cy - y) * Math.tan((this.angle || 0) - Math.PI / 2);\n            }\n            const path = [['M', x, y]];\n            // The crookedLine formula doesn't make sense if the path overlaps\n            // the label - use straight line instead in that case\n            if (leftAligned ?\n                (crookX <= x && crookX >= breakAt.x) :\n                (crookX >= x && crookX <= breakAt.x)) {\n                path.push(['L', crookX, y]);\n            }\n            path.push(['L', breakAt.x, breakAt.y], ['L', touchingSliceAt.x, touchingSliceAt.y]);\n            return path;\n        }\n    }\n});\n/* *\n *\n *  Default Export\n *\n * */\nexport default PiePoint;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport CU from '../CenteredUtilities.js';\nconst { getStartAndEndRadians } = CU;\nimport ColumnSeries from '../Column/ColumnSeries.js';\nimport H from '../../Core/Globals.js';\nconst { noop } = H;\nimport PiePoint from './PiePoint.js';\nimport PieSeriesDefaults from './PieSeriesDefaults.js';\nimport Series from '../../Core/Series/Series.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport Symbols from '../../Core/Renderer/SVG/Symbols.js';\nimport U from '../../Core/Utilities.js';\nconst { clamp, extend, fireEvent, merge, pick } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * Pie series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.pie\n *\n * @augments Highcharts.Series\n */\nclass PieSeries extends Series {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Animates the pies in.\n     * @private\n     */\n    animate(init) {\n        const series = this, points = series.points, startAngleRad = series.startAngleRad;\n        if (!init) {\n            points.forEach(function (point) {\n                const graphic = point.graphic, args = point.shapeArgs;\n                if (graphic && args) {\n                    // Start values\n                    graphic.attr({\n                        // Animate from inner radius (#779)\n                        r: pick(point.startR, (series.center && series.center[3] / 2)),\n                        start: startAngleRad,\n                        end: startAngleRad\n                    });\n                    // Animate\n                    graphic.animate({\n                        r: args.r,\n                        start: args.start,\n                        end: args.end\n                    }, series.options.animation);\n                }\n            });\n        }\n    }\n    /**\n     * Called internally to draw auxiliary graph in pie-like series in\n     * situtation when the default graph is not sufficient enough to present\n     * the data well. Auxiliary graph is saved in the same object as\n     * regular graph.\n     * @private\n     */\n    drawEmpty() {\n        const start = this.startAngleRad, end = this.endAngleRad, options = this.options;\n        let centerX, centerY;\n        // Draw auxiliary graph if there're no visible points.\n        if (this.total === 0 && this.center) {\n            centerX = this.center[0];\n            centerY = this.center[1];\n            if (!this.graph) {\n                this.graph = this.chart.renderer\n                    .arc(centerX, centerY, this.center[1] / 2, 0, start, end)\n                    .addClass('highcharts-empty-series')\n                    .add(this.group);\n            }\n            this.graph.attr({\n                d: Symbols.arc(centerX, centerY, this.center[2] / 2, 0, {\n                    start,\n                    end,\n                    innerR: this.center[3] / 2\n                })\n            });\n            if (!this.chart.styledMode) {\n                this.graph.attr({\n                    'stroke-width': options.borderWidth,\n                    fill: options.fillColor || 'none',\n                    stroke: options.color || \"#cccccc\" /* Palette.neutralColor20 */\n                });\n            }\n        }\n        else if (this.graph) { // Destroy the graph object.\n            this.graph = this.graph.destroy();\n        }\n    }\n    /**\n     * Slices in pie chart are initialized in DOM, but it's shapes and\n     * animations are normally run in `drawPoints()`.\n     * @private\n     */\n    drawPoints() {\n        const renderer = this.chart.renderer;\n        this.points.forEach(function (point) {\n            // When updating a series between 2d and 3d or cartesian and\n            // polar, the shape type changes.\n            if (point.graphic && point.hasNewShapeType()) {\n                point.graphic = point.graphic.destroy();\n            }\n            if (!point.graphic) {\n                point.graphic = renderer[point.shapeType](point.shapeArgs)\n                    .add(point.series.group);\n                point.delayedRendering = true;\n            }\n        });\n    }\n    /**\n     * Extend the generatePoints method by adding total and percentage\n     * properties to each point\n     * @private\n     */\n    generatePoints() {\n        super.generatePoints();\n        this.updateTotals();\n    }\n    /**\n     * Utility for getting the x value from a given y, used for anticollision\n     * logic in data labels.\n     * @private\n     */\n    getX(y, left, point, dataLabel) {\n        const center = this.center, \n        // Variable pie has individual radius\n        radius = this.radii ?\n            this.radii[point.index] || 0 :\n            center[2] / 2, labelPosition = dataLabel.dataLabelPosition, distance = labelPosition?.distance || 0;\n        const angle = Math.asin(clamp((y - center[1]) / (radius + distance), -1, 1));\n        const x = center[0] +\n            (left ? -1 : 1) *\n                (Math.cos(angle) * (radius + distance)) +\n            (distance > 0 ?\n                (left ? -1 : 1) * (dataLabel.padding || 0) :\n                0);\n        return x;\n    }\n    /**\n     * Define hasData function for non-cartesian series. Returns true if the\n     * series has points at all.\n     * @private\n     */\n    hasData() {\n        return !!this.processedXData.length; // != 0\n    }\n    /**\n     * Draw the data points\n     * @private\n     */\n    redrawPoints() {\n        const series = this, chart = series.chart;\n        let groupTranslation, graphic, pointAttr, shapeArgs;\n        this.drawEmpty();\n        // Apply the drop-shadow to the group because otherwise each element\n        // would cast a shadow on others\n        if (series.group && !chart.styledMode) {\n            series.group.shadow(series.options.shadow);\n        }\n        // Draw the slices\n        series.points.forEach(function (point) {\n            const animateTo = {};\n            graphic = point.graphic;\n            if (!point.isNull && graphic) {\n                shapeArgs = point.shapeArgs;\n                // If the point is sliced, use special translation, else use\n                // plot area translation\n                groupTranslation = point.getTranslate();\n                if (!chart.styledMode) {\n                    pointAttr = series.pointAttribs(point, (point.selected && 'select'));\n                }\n                // Draw the slice\n                if (!point.delayedRendering) {\n                    graphic\n                        .setRadialReference(series.center);\n                    if (!chart.styledMode) {\n                        merge(true, animateTo, pointAttr);\n                    }\n                    merge(true, animateTo, shapeArgs, groupTranslation);\n                    graphic.animate(animateTo);\n                }\n                else {\n                    graphic\n                        .setRadialReference(series.center)\n                        .attr(shapeArgs)\n                        .attr(groupTranslation);\n                    if (!chart.styledMode) {\n                        graphic\n                            .attr(pointAttr)\n                            .attr({ 'stroke-linejoin': 'round' });\n                    }\n                    point.delayedRendering = false;\n                }\n                graphic\n                    .attr({\n                    visibility: point.visible ? 'inherit' : 'hidden'\n                });\n                graphic.addClass(point.getClassName(), true);\n            }\n            else if (graphic) {\n                point.graphic = graphic.destroy();\n            }\n        });\n    }\n    /**\n     * Utility for sorting data labels.\n     * @private\n     */\n    sortByAngle(points, sign) {\n        points.sort(function (a, b) {\n            return ((typeof a.angle !== 'undefined') &&\n                (b.angle - a.angle) * sign);\n        });\n    }\n    /**\n     * Do translation for pie slices\n     * @private\n     */\n    translate(positions) {\n        fireEvent(this, 'translate');\n        this.generatePoints();\n        const series = this, precision = 1000, // Issue #172\n        options = series.options, slicedOffset = options.slicedOffset, radians = getStartAndEndRadians(options.startAngle, options.endAngle), startAngleRad = series.startAngleRad = radians.start, endAngleRad = series.endAngleRad = radians.end, circ = endAngleRad - startAngleRad, // 2 * Math.PI,\n        points = series.points, ignoreHiddenPoint = options.ignoreHiddenPoint, len = points.length;\n        let start, end, angle, \n        // The x component of the radius vector for a given point\n        radiusX, radiusY, i, point, cumulative = 0;\n        // Get positions - either an integer or a percentage string must be\n        // given. If positions are passed as a parameter, we're in a\n        // recursive loop for adjusting space for data labels.\n        if (!positions) {\n            /**\n             * The series center position, read only. This applies only to\n             * circular chart types like pie and sunburst. It is an array of\n             * `[centerX, centerY, diameter, innerDiameter]`.\n             *\n             * @name Highcharts.Series#center\n             * @type {Array<number>}\n             */\n            series.center = positions = series.getCenter();\n        }\n        // Calculate the geometry for each point\n        for (i = 0; i < len; i++) {\n            point = points[i];\n            // Set start and end angle\n            start = startAngleRad + (cumulative * circ);\n            if (point.isValid() &&\n                (!ignoreHiddenPoint || point.visible)) {\n                cumulative += point.percentage / 100;\n            }\n            end = startAngleRad + (cumulative * circ);\n            // Set the shape\n            const shapeArgs = {\n                x: positions[0],\n                y: positions[1],\n                r: positions[2] / 2,\n                innerR: positions[3] / 2,\n                start: Math.round(start * precision) / precision,\n                end: Math.round(end * precision) / precision\n            };\n            point.shapeType = 'arc';\n            point.shapeArgs = shapeArgs;\n            // The angle must stay within -90 and 270 (#2645)\n            angle = (end + start) / 2;\n            if (angle > 1.5 * Math.PI) {\n                angle -= 2 * Math.PI;\n            }\n            else if (angle < -Math.PI / 2) {\n                angle += 2 * Math.PI;\n            }\n            // Center for the sliced out slice\n            point.slicedTranslation = {\n                translateX: Math.round(Math.cos(angle) * slicedOffset),\n                translateY: Math.round(Math.sin(angle) * slicedOffset)\n            };\n            // Set the anchor point for tooltips\n            radiusX = Math.cos(angle) * positions[2] / 2;\n            radiusY = Math.sin(angle) * positions[2] / 2;\n            point.tooltipPos = [\n                positions[0] + radiusX * 0.7,\n                positions[1] + radiusY * 0.7\n            ];\n            point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ?\n                1 :\n                0;\n            point.angle = angle;\n        }\n        fireEvent(series, 'afterTranslate');\n    }\n    /**\n     * Recompute total chart sum and update percentages of points.\n     * @private\n     */\n    updateTotals() {\n        const points = this.points, len = points.length, ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n        let i, point, total = 0;\n        // Get the total sum\n        for (i = 0; i < len; i++) {\n            point = points[i];\n            if (point.isValid() &&\n                (!ignoreHiddenPoint || point.visible)) {\n                total += point.y;\n            }\n        }\n        this.total = total;\n        // Set each point's properties\n        for (i = 0; i < len; i++) {\n            point = points[i];\n            point.percentage =\n                (total > 0 && (point.visible || !ignoreHiddenPoint)) ?\n                    point.y / total * 100 :\n                    0;\n            point.total = total;\n        }\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nPieSeries.defaultOptions = merge(Series.defaultOptions, PieSeriesDefaults);\nextend(PieSeries.prototype, {\n    axisTypes: [],\n    directTouch: true,\n    drawGraph: void 0,\n    drawTracker: ColumnSeries.prototype.drawTracker,\n    getCenter: CU.getCenter,\n    getSymbol: noop,\n    invertible: false,\n    isCartesian: false,\n    noSharedTooltip: true,\n    pointAttribs: ColumnSeries.prototype.pointAttribs,\n    pointClass: PiePoint,\n    requireSorting: false,\n    searchPoint: noop,\n    trackerGroups: ['group', 'dataLabelsGroup']\n});\nSeriesRegistry.registerSeriesType('pie', PieSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default PieSeries;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A pie chart is a circular graphic which is divided into slices to\n * illustrate numerical proportion.\n *\n * @sample highcharts/demo/pie-chart/\n *         Pie chart\n *\n * @extends      plotOptions.line\n * @excluding    animationLimit, boostThreshold, connectEnds, connectNulls,\n *               cropThreshold, dashStyle, dataSorting, dragDrop,\n *               findNearestPointBy, getExtremesFromAll, label, lineWidth,\n *               linkedTo, marker, negativeColor, pointInterval,\n *               pointIntervalUnit, pointPlacement, pointStart,\n *               softThreshold, stacking, step, threshold, turboThreshold,\n *               zoneAxis, zones, dataSorting, boostBlending\n * @product      highcharts highmaps\n * @optionparent plotOptions.pie\n *\n * @private\n */\nconst PieSeriesDefaults = {\n    /**\n     * The corner radius of the border surrounding each slice. A number\n     * signifies pixels. A percentage string, like for example `50%`, signifies\n     * a size relative to the radius and the inner radius.\n     *\n     * @sample  highcharts/plotoptions/series-border-radius\n     *          Column and pie with rounded border\n     *\n     * @since   11.0.0\n     *\n     * @type      {number|string|Highcharts.BorderRadiusOptionsObject}\n     */\n    borderRadius: 3,\n    /**\n     * @excluding legendItemClick\n     * @apioption plotOptions.pie.events\n     */\n    /**\n     * Fires when the checkbox next to the point name in the legend is\n     * clicked. One parameter, event, is passed to the function. The state\n     * of the checkbox is found by event.checked. The checked item is found\n     * by event.item. Return false to prevent the default action which is to\n     * toggle the select state of the series.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n     *         Alert checkbox status\n     *\n     * @type      {Function}\n     * @since     1.2.0\n     * @product   highcharts highmaps\n     * @context   Highcharts.Point\n     * @apioption plotOptions.pie.events.checkboxClick\n     */\n    /**\n     * Fires when the legend item belonging to the pie point (slice) is\n     * clicked. The `this` keyword refers to the point itself. One\n     * parameter, `event`, is passed to the function, containing common\n     * event information. The default action is to toggle the visibility of\n     * the point. This can be prevented by calling `event.preventDefault()`.\n     *\n     *  **Note:** This option is deprecated in favor of\n     * [legend.events.itemClick](#legend.events.itemClick).\n     *\n     * @deprecated 11.4.4\n     * @type       {Highcharts.PointLegendItemClickCallbackFunction}\n     * @since      1.2.0\n     * @product    highcharts highmaps\n     * @apioption  plotOptions.pie.point.events.legendItemClick\n     */\n    /**\n     * The center of the pie chart relative to the plot area. Can be\n     * percentages or pixel values. The default behaviour (as of 3.0) is to\n     * center the pie so that all slices and data labels are within the plot\n     * area. As a consequence, the pie may actually jump around in a chart\n     * with dynamic values, as the data labels move. In that case, the\n     * center should be explicitly set, for example to `[\"50%\", \"50%\"]`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-center/\n     *         Centered at 100, 100\n     *\n     * @type    {Array<(number|string|null),(number|string|null)>}\n     * @default [null, null]\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    center: [null, null],\n    /**\n     * The color of the pie series. A pie series is represented as an empty\n     * circle if the total sum of its values is 0. Use this property to\n     * define the color of its border.\n     *\n     * In styled mode, the color can be defined by the\n     * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n     * color can be set with the `.highcharts-series`,\n     * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n     * `.highcharts-series-{n}` class, or individual classes given by the\n     * `className` option.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n     *         Empty pie series\n     *\n     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default   ${palette.neutralColor20}\n     * @apioption plotOptions.pie.color\n     */\n    /**\n     * @product highcharts\n     *\n     * @private\n     */\n    clip: false,\n    /**\n     * @ignore-option\n     *\n     * @private\n     */\n    colorByPoint: true, // Always true for pies\n    /**\n     * A series specific or series type specific color set to use instead\n     * of the global [colors](#colors).\n     *\n     * @sample {highcharts} highcharts/demo/pie-monochrome/\n     *         Set default colors for all pies\n     *\n     * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n     * @since     3.0\n     * @product   highcharts highmaps\n     * @apioption plotOptions.pie.colors\n     */\n    /**\n     * @declare   Highcharts.SeriesPieDataLabelsOptionsObject\n     * @extends   plotOptions.series.dataLabels\n     * @excluding align, allowOverlap, inside, staggerLines, step\n     * @private\n     */\n    dataLabels: {\n        /**\n         * Alignment method for data labels. Possible values are:\n         *\n         * - `plotEdges`: Each label touches the nearest vertical edge of\n         *   the plot area.\n         *\n         * - `connectors`: Connectors have the same x position and the\n         *   widest label of each half (left & right) touches the nearest\n         *   vertical edge of the plot area.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-connectors/\n         *         alignTo: connectors\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-plotedges/\n         *         alignTo: plotEdges\n         *\n         * @type      {string}\n         * @since     7.0.0\n         * @product   highcharts highmaps\n         * @apioption plotOptions.pie.dataLabels.alignTo\n         */\n        /**\n         * The color of the line connecting the data label to the pie slice.\n         * The default color is the same as the point's color.\n         *\n         * In styled mode, the connector stroke is given in the\n         * `.highcharts-data-label-connector` class.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorcolor/\n         *         Blue connectors\n         * @sample {highcharts} highcharts/css/pie-point/\n         *         Styled connectors\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @since     2.1\n         * @product   highcharts highmaps\n         * @apioption plotOptions.pie.dataLabels.connectorColor\n         */\n        /**\n         * The distance from the data label to the connector. Note that\n         * data labels also have a default `padding`, so in order for the\n         * connector to touch the text, the `padding` must also be 0.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorpadding/\n         *         No padding\n         *\n         * @since   2.1\n         * @product highcharts highmaps\n         */\n        connectorPadding: 5,\n        /**\n         * Specifies the method that is used to generate the connector path.\n         * Highcharts provides 3 built-in connector shapes: `'crookedLine'`\n         * (default since v11), `'fixedOffset'` and `'straight'`.\n         *\n         * Users can provide their own method by passing a function instead of a\n         * string. Three arguments are passed to the callback:\n         *\n         * - An object that holds the information about the coordinates of the\n         *   label (`x` & `y` properties) and how the label is located in\n         *   relation to the pie (`alignment` property). `alignment` can by one\n         *   of the following: `'left'` (pie on the left side of the data\n         *   label), `'right'` (pie on the right side of the data label) or\n         *   `'center'` (data label overlaps the pie).\n         *\n         * - An object that holds the information about the position of the\n         *   connector. Its `touchingSliceAt`  porperty tells the position of\n         *   the place where the connector touches the slice.\n         *\n         * - Data label options\n         *\n         * The function has to return an SVG path definition in array form (see\n         * the example).\n         *\n         * @sample {highcharts}\n         *         highcharts/plotoptions/pie-datalabels-connectorshape-string/\n         *         connectorShape is a String\n         * @sample {highcharts}\n         *         highcharts/plotoptions/pie-datalabels-connectorshape-function/\n         *         connectorShape is a function\n         *\n         * @type    {string|Function}\n         * @since   7.0.0\n         * @product highcharts highmaps\n         */\n        connectorShape: 'crookedLine',\n        /**\n         * The width of the line connecting the data label to the pie slice.\n         *\n         * In styled mode, the connector stroke width is given in the\n         * `.highcharts-data-label-connector` class.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorwidth-disabled/\n         *         Disable the connector\n         * @sample {highcharts} highcharts/css/pie-point/\n         *         Styled connectors\n         *\n         * @type      {number}\n         * @default   1\n         * @since     2.1\n         * @product   highcharts highmaps\n         * @apioption plotOptions.pie.dataLabels.connectorWidth\n         */\n        /**\n         * Works only if `connectorShape` is `'crookedLine'`. It defines how\n         * far from the vertical plot edge the coonnector path should be\n         * crooked. With the default, `undefined`, the crook is placed so that\n         * the horizontal line from the label intersects with the radial line\n         * extending through the center of the pie slice.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-crookdistance/\n         *         crookDistance set to 90%\n         *\n         * @since   7.0.0\n         * @product highcharts highmaps\n         */\n        crookDistance: void 0,\n        /**\n         * The distance of the data label from the pie's edge. Negative\n         * numbers put the data label on top of the pie slices. Can also be\n         * defined as a percentage of pie's radius. Connectors are only\n         * shown for data labels outside the pie.\n         *\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-distance/\n         *         Data labels on top of the pie\n         *\n         * @type    {number|string}\n         * @since   2.1\n         * @product highcharts highmaps\n         */\n        distance: 30,\n        enabled: true,\n        /**\n         * A\n         * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n         * for the data label. Available variables are the same as for\n         * `formatter`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n         *         Add a unit\n         *\n         * @type      {string}\n         * @default   undefined\n         * @since     3.0\n         * @apioption plotOptions.pie.dataLabels.format\n         */\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Callback JavaScript function to format the data label. Note that\n         * if a `format` is defined, the format takes precedence and the\n         * formatter is ignored.\n         *\n         * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n         * @default function () { return this.point.isNull ? void 0 : this.point.name; }\n         */\n        formatter: function () {\n            return this.point.isNull ? void 0 : this.point.name;\n        },\n        /**\n         * Whether to render the connector as a soft arc or a line with a sharp\n         * break. Works only if `connectorShape` equals to `fixedOffset`.\n         *\n         * @sample {highcharts}\n         *         highcharts/plotoptions/pie-datalabels-softconnector-true/\n         *         Soft\n         * @sample {highcharts}\n         *         highcharts/plotoptions/pie-datalabels-softconnector-false/\n         *         Non soft\n         *\n         * @since   2.1.7\n         * @product highcharts highmaps\n         */\n        softConnector: true,\n        /**\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow\n         *         Long labels truncated with an ellipsis\n         * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap\n         *         Long labels are wrapped\n         *\n         * @type      {Highcharts.CSSObject}\n         * @apioption plotOptions.pie.dataLabels.style\n         */\n        x: 0\n    },\n    /**\n     * If the total sum of the pie's values is 0, the series is represented\n     * as an empty circle . The `fillColor` option defines the color of that\n     * circle. Use [pie.borderWidth](#plotOptions.pie.borderWidth) to set\n     * the border thickness.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n     *         Empty pie series\n     *\n     * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @private\n     */\n    fillColor: void 0,\n    /**\n     * The end angle of the pie in degrees where 0 is top and 90 is right.\n     * Defaults to `startAngle` plus 360.\n     *\n     * @sample {highcharts} highcharts/demo/pie-semi-circle/\n     *         Semi-circle donut\n     *\n     * @type      {number}\n     * @since     1.3.6\n     * @product   highcharts highmaps\n     * @apioption plotOptions.pie.endAngle\n     */\n    /**\n     * Thickness describing the ring size for a donut type chart,\n     * overriding [innerSize](#plotOptions.pie.innerSize).\n     *\n     * @type      {number}\n     * @default   undefined\n     * @product   highcharts\n     * @since 10.1.0\n     * @apioption plotOptions.pie.thickness\n     * @private\n     */\n    /**\n     * Equivalent to [chart.ignoreHiddenSeries](#chart.ignoreHiddenSeries),\n     * this option tells whether the series shall be redrawn as if the\n     * hidden point were `null`.\n     *\n     * The default value changed from `false` to `true` with Highcharts\n     * 3.0.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-ignorehiddenpoint/\n     *         True, the hiddden point is ignored\n     *\n     * @since   2.3.0\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    ignoreHiddenPoint: true,\n    /**\n     * @default   true\n     * @extends   plotOptions.series.inactiveOtherPoints\n     * @private\n     */\n    inactiveOtherPoints: true,\n    /**\n     * The size of the inner diameter for the pie. A size greater than 0\n     * renders a donut chart. Can be a percentage or pixel value.\n     * Percentages are relative to the pie size. Pixel values are given as\n     * integers. Setting overridden by thickness.\n     *\n     *\n     * Note: in Highcharts < 4.1.2, the percentage was relative to the plot\n     * area, not the pie size.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-innersize-80px/\n     *         80px inner size\n     * @sample {highcharts} highcharts/plotoptions/pie-innersize-50percent/\n     *         50% of the plot area\n     * @sample {highcharts} highcharts/demo/3d-pie-donut/\n     *         3D donut\n     *\n     * @type      {number|string}\n     * @default   0\n     * @since     2.0\n     * @product   highcharts highmaps\n     * @apioption plotOptions.pie.innerSize\n     */\n    /**\n     * @ignore-option\n     *\n     * @private\n     */\n    legendType: 'point',\n    /**\n     * @ignore-option\n     *\n     * @private\n     */\n    marker: null, // Point options are specified in the base options\n    /**\n     * The minimum size for a pie in response to auto margins. The pie will\n     * try to shrink to make room for data labels in side the plot area,\n     *  but only to this size.\n     *\n     * @type      {number|string}\n     * @default   80\n     * @since     3.0\n     * @product   highcharts highmaps\n     * @apioption plotOptions.pie.minSize\n     */\n    /**\n     * The diameter of the pie relative to the plot area. Can be a\n     * percentage or pixel value. Pixel values are given as integers. The\n     * default behaviour (as of 3.0) is to scale to the plot area and give\n     * room for data labels within the plot area.\n     * [slicedOffset](#plotOptions.pie.slicedOffset) is also included in the\n     * default size calculation. As a consequence, the size of the pie may\n     * vary when points are updated and data labels more around. In that\n     * case it is best to set a fixed value, for example `\"75%\"`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-size/\n     *         Smaller pie\n     *\n     * @type    {number|string|null}\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    size: null,\n    /**\n     * Whether to display this particular series or series type in the\n     * legend. Since 2.1, pies are not shown in the legend by default.\n     *\n     * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n     *         One series in the legend, one hidden\n     *\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    showInLegend: false,\n    /**\n     * If a point is sliced, moved out from the center, how many pixels\n     * should it be moved?.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-slicedoffset-20/\n     *         20px offset\n     *\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    slicedOffset: 10,\n    /**\n     * The start angle of the pie slices in degrees where 0 is top and 90\n     * right.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-startangle-90/\n     *         Start from right\n     *\n     * @type      {number}\n     * @default   0\n     * @since     2.3.4\n     * @product   highcharts highmaps\n     * @apioption plotOptions.pie.startAngle\n     */\n    /**\n     * Sticky tracking of mouse events. When true, the `mouseOut` event\n     * on a series isn't triggered until the mouse moves over another\n     * series, or out of the plot area. When false, the `mouseOut` event on\n     * a series is triggered when the mouse leaves the area around the\n     * series'  graph or markers. This also implies the tooltip. When\n     * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n     * will be hidden when moving the mouse between series.\n     *\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    stickyTracking: false,\n    tooltip: {\n        followPointer: true\n    },\n    /**\n     * The color of the border surrounding each slice. When `null`, the\n     * border takes the same color as the slice fill. This can be used\n     * together with a `borderWidth` to fill drawing gaps created by\n     * antialiazing artefacts in borderless pies.\n     *\n     * In styled mode, the border stroke is given in the `.highcharts-point`\n     * class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-bordercolor-black/\n     *         Black border\n     *\n     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n     * @default #ffffff\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    borderColor: \"#ffffff\" /* Palette.backgroundColor */,\n    /**\n     * The width of the border surrounding each slice.\n     *\n     * When setting the border width to 0, there may be small gaps between\n     * the slices due to SVG antialiasing artefacts. To work around this,\n     * keep the border width at 0.5 or 1, but set the `borderColor` to\n     * `null` instead.\n     *\n     * In styled mode, the border stroke width is given in the\n     * `.highcharts-point` class.\n     *\n     * @sample {highcharts} highcharts/plotoptions/pie-borderwidth/\n     *         3px border\n     *\n     * @product highcharts highmaps\n     *\n     * @private\n     */\n    borderWidth: 1,\n    /**\n     * @ignore-option\n     * @private\n     */\n    lineWidth: void 0, // #12222\n    states: {\n        /**\n         * @extends   plotOptions.series.states.hover\n         * @excluding marker, lineWidth, lineWidthPlus\n         * @product   highcharts highmaps\n         */\n        hover: {\n            /**\n             * How much to brighten the point on interaction. Requires the\n             * main color to be defined in hex or rgb(a) format.\n             *\n             * In styled mode, the hover brightness is by default replaced\n             * by a fill-opacity given in the `.highcharts-point-hover`\n             * class.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-states-hover-brightness/\n             *         Brightened by 0.5\n             *\n             * @product highcharts highmaps\n             */\n            brightness: 0.1\n        }\n    }\n};\n/**\n * A `pie` series. If the [type](#series.pie.type) option is not specified,\n * it is inherited from [chart.type](#chart.type).\n *\n * @extends   series,plotOptions.pie\n * @excluding cropThreshold, dataParser, dataURL, linkedTo, stack, xAxis, yAxis,\n *            dataSorting, step, boostThreshold, boostBlending\n * @product   highcharts highmaps\n * @apioption series.pie\n */\n/**\n * An array of data points for the series. For the `pie` series type,\n * points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.pie.turboThreshold),\n *    this option is not available.\n *    ```js\n *    data: [{\n *        y: 1,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        y: 7,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-arrays/\n *         Arrays of numeric x and y\n * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n *         Arrays of datetime x and y\n * @sample {highcharts} highcharts/series/data-array-of-name-value/\n *         Arrays of point.name and y\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|Array<string,(number|null)>|null|*>}\n * @extends   series.line.data\n * @excluding marker, x\n * @product   highcharts highmaps\n * @apioption series.pie.data\n */\n/**\n * @type      {Highcharts.SeriesPieDataLabelsOptionsObject}\n * @product   highcharts highmaps\n * @apioption series.pie.data.dataLabels\n */\n/**\n * The sequential index of the data point in the legend.\n *\n * @type      {number}\n * @product   highcharts highmaps\n * @apioption series.pie.data.legendIndex\n */\n/**\n * Whether to display a slice offset from the center.\n *\n * @sample {highcharts} highcharts/point/sliced/\n *         One sliced point\n *\n * @type      {boolean}\n * @product   highcharts highmaps\n * @apioption series.pie.data.sliced\n */\n/**\n * @extends plotOptions.pie.dataLabels\n * @excluding align, allowOverlap, inside, staggerLines, step\n * @product   highcharts highmaps\n * @apioption series.pie.dataLabels\n */\n/**\n * @excluding legendItemClick\n * @product   highcharts highmaps\n * @apioption series.pie.events\n */\n''; // Placeholder for transpiled doclets above\n/* *\n *\n *  Default Export\n *\n * */\nexport default PieSeriesDefaults;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport DataLabel from '../../Core/Series/DataLabel.js';\nimport H from '../../Core/Globals.js';\nconst { composed, noop } = H;\nimport R from '../../Core/Renderer/RendererUtilities.js';\nconst { distribute } = R;\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { series: Series } = SeriesRegistry;\nimport U from '../../Core/Utilities.js';\nconst { arrayMax, clamp, defined, pick, pushUnique, relativeLength } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar ColumnDataLabel;\n(function (ColumnDataLabel) {\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    const dataLabelPositioners = {\n        // Based on the value computed in Highcharts' distribute algorithm.\n        radialDistributionY: function (point, dataLabel) {\n            return (dataLabel.dataLabelPosition?.top || 0) +\n                point.distributeBox.pos;\n        },\n        // Get the x - use the natural x position for labels near the top and\n        // bottom, to prevent the top and botton slice connectors from touching\n        // each other on either side. Based on the value computed in Highcharts'\n        // distribute algorithm.\n        radialDistributionX: function (series, point, y, naturalY, dataLabel) {\n            const pos = dataLabel.dataLabelPosition;\n            return series.getX(y < (pos?.top || 0) + 2 || y > (pos?.bottom || 0) - 2 ?\n                naturalY :\n                y, point.half, point, dataLabel);\n        },\n        // The dataLabels.distance determines the x position of the label\n        justify: function (point, dataLabel, radius, seriesCenter) {\n            return seriesCenter[0] + (point.half ? -1 : 1) *\n                (radius + (dataLabel.dataLabelPosition?.distance || 0));\n        },\n        // Left edges of the left-half labels touch the left edge of the plot\n        // area. Right edges of the right-half labels touch the right edge of\n        // the plot area.\n        alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {\n            const dataLabelWidth = dataLabel.getBBox().width;\n            return half ? dataLabelWidth + plotLeft :\n                plotWidth - dataLabelWidth - plotLeft;\n        },\n        // Connectors of each side end in the same x position. Labels are\n        // aligned to them. Left edge of the widest left-half label touches the\n        // left edge of the plot area. Right edge of the widest right-half label\n        // touches the right edge of the plot area.\n        alignToConnectors: function (points, half, plotWidth, plotLeft) {\n            let maxDataLabelWidth = 0, dataLabelWidth;\n            // Find widest data label\n            points.forEach(function (point) {\n                dataLabelWidth = point.dataLabel.getBBox().width;\n                if (dataLabelWidth > maxDataLabelWidth) {\n                    maxDataLabelWidth = dataLabelWidth;\n                }\n            });\n            return half ? maxDataLabelWidth + plotLeft :\n                plotWidth - maxDataLabelWidth - plotLeft;\n        }\n    };\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /** @private */\n    function compose(PieSeriesClass) {\n        DataLabel.compose(Series);\n        if (pushUnique(composed, 'PieDataLabel')) {\n            const pieProto = PieSeriesClass.prototype;\n            pieProto.dataLabelPositioners = dataLabelPositioners;\n            pieProto.alignDataLabel = noop;\n            pieProto.drawDataLabels = drawDataLabels;\n            pieProto.getDataLabelPosition = getDataLabelPosition;\n            pieProto.placeDataLabels = placeDataLabels;\n            pieProto.verifyDataLabelOverflow = verifyDataLabelOverflow;\n        }\n    }\n    ColumnDataLabel.compose = compose;\n    /** @private */\n    function getDataLabelPosition(point, distance) {\n        const { center, options } = this, r = center[2] / 2, angle = point.angle || 0, cosAngle = Math.cos(angle), sinAngle = Math.sin(angle), x = center[0] + cosAngle * r, y = center[1] + sinAngle * r, finalConnectorOffset = Math.min((options.slicedOffset || 0) + (options.borderWidth || 0), distance / 5); // #1678\n        return {\n            natural: {\n                // Initial position of the data label - it's utilized for\n                // finding the final position for the label\n                x: x + cosAngle * distance,\n                y: y + sinAngle * distance\n            },\n            computed: {\n            // Used for generating connector path - initialized later in\n            // drawDataLabels function x: undefined, y: undefined\n            },\n            // Left - pie on the left side of the data label\n            // Right - pie on the right side of the data label\n            // Center - data label overlaps the pie\n            alignment: distance < 0 ? 'center' : point.half ? 'right' : 'left',\n            connectorPosition: {\n                breakAt: {\n                    x: x + cosAngle * finalConnectorOffset,\n                    y: y + sinAngle * finalConnectorOffset\n                },\n                touchingSliceAt: {\n                    x,\n                    y\n                }\n            },\n            distance\n        };\n    }\n    /**\n     * Override the base drawDataLabels method by pie specific functionality\n     * @private\n     */\n    function drawDataLabels() {\n        const series = this, points = series.points, chart = series.chart, plotWidth = chart.plotWidth, plotHeight = chart.plotHeight, plotLeft = chart.plotLeft, maxWidth = Math.round(chart.chartWidth / 3), seriesCenter = series.center, radius = seriesCenter[2] / 2, centerY = seriesCenter[1], halves = [\n            [], // Right\n            [] // Left\n        ], overflow = [0, 0, 0, 0], // Top, right, bottom, left\n        dataLabelPositioners = series.dataLabelPositioners;\n        let connector, dataLabelWidth, labelHeight, maxLabelDistance = 0;\n        // Get out if not enabled\n        if (!series.visible || !series.hasDataLabels?.()) {\n            return;\n        }\n        // Reset all labels that have been shortened\n        points.forEach((point) => {\n            (point.dataLabels || []).forEach((dataLabel) => {\n                if (dataLabel.shortened) {\n                    dataLabel\n                        .attr({\n                        width: 'auto'\n                    }).css({\n                        width: 'auto',\n                        textOverflow: 'clip'\n                    });\n                    dataLabel.shortened = false;\n                }\n            });\n        });\n        // Run parent method\n        Series.prototype.drawDataLabels.apply(series);\n        points.forEach((point) => {\n            (point.dataLabels || []).forEach((dataLabel, i) => {\n                const r = seriesCenter[2] / 2, dataLabelOptions = dataLabel.options, distance = relativeLength(dataLabelOptions?.distance || 0, r);\n                // Arrange points for collision detection\n                if (i === 0) {\n                    halves[point.half].push(point);\n                }\n                // Avoid long labels squeezing the pie size too far down\n                if (!defined(dataLabelOptions?.style?.width)) {\n                    if (dataLabel.getBBox().width > maxWidth) {\n                        dataLabel.css({\n                            // Use a fraction of the maxWidth to avoid wrapping\n                            // close to the end of the string.\n                            width: Math.round(maxWidth * 0.7) + 'px'\n                        });\n                        dataLabel.shortened = true;\n                    }\n                }\n                dataLabel.dataLabelPosition = this.getDataLabelPosition(point, distance);\n                maxLabelDistance = Math.max(maxLabelDistance, distance);\n            });\n        });\n        /* Loop over the points in each half, starting from the top and bottom\n         * of the pie to detect overlapping labels.\n         */\n        halves.forEach((points, halfIdx) => {\n            const length = points.length, positions = [];\n            let top, bottom, size = 0, distributionLength;\n            if (!length) {\n                return;\n            }\n            // Sort by angle\n            series.sortByAngle(points, halfIdx - 0.5);\n            // Only do anti-collision when we have dataLabels outside the pie\n            // and have connectors. (#856)\n            if (maxLabelDistance > 0) {\n                top = Math.max(0, centerY - radius - maxLabelDistance);\n                bottom = Math.min(centerY + radius + maxLabelDistance, chart.plotHeight);\n                points.forEach((point) => {\n                    // Check if specific points' label is outside the pie\n                    (point.dataLabels || []).forEach((dataLabel) => {\n                        const labelPosition = dataLabel.dataLabelPosition;\n                        if (labelPosition &&\n                            labelPosition.distance > 0) {\n                            // The point.top depends on point.labelDistance\n                            // value. Used for calculation of y value in getX\n                            // method\n                            labelPosition.top = Math.max(0, centerY - radius - labelPosition.distance);\n                            labelPosition.bottom = Math.min(centerY + radius + labelPosition.distance, chart.plotHeight);\n                            size = dataLabel.getBBox().height || 21;\n                            dataLabel.lineHeight = chart.renderer.fontMetrics(dataLabel.text || dataLabel).h + 2 * dataLabel.padding;\n                            point.distributeBox = {\n                                target: ((dataLabel.dataLabelPosition\n                                    ?.natural.y || 0) -\n                                    labelPosition.top +\n                                    dataLabel.lineHeight / 2),\n                                size,\n                                rank: point.y\n                            };\n                            positions.push(point.distributeBox);\n                        }\n                    });\n                });\n                distributionLength = bottom + size - top;\n                distribute(positions, distributionLength, distributionLength / 5);\n            }\n            // Now the used slots are sorted, fill them up sequentially\n            points.forEach((point) => {\n                (point.dataLabels || []).forEach((dataLabel) => {\n                    const dataLabelOptions = (dataLabel.options || {}), distributeBox = point.distributeBox, labelPosition = dataLabel.dataLabelPosition, naturalY = labelPosition?.natural.y || 0, connectorPadding = dataLabelOptions\n                        .connectorPadding || 0, lineHeight = dataLabel.lineHeight || 21, bBox = dataLabel.getBBox(), topOffset = (lineHeight - bBox.height) / 2;\n                    let x = 0, y = naturalY, visibility = 'inherit';\n                    if (labelPosition) {\n                        if (positions &&\n                            defined(distributeBox) &&\n                            labelPosition.distance > 0) {\n                            if (typeof distributeBox.pos === 'undefined') {\n                                visibility = 'hidden';\n                            }\n                            else {\n                                labelHeight = distributeBox.size;\n                                // Find label's y position\n                                y = dataLabelPositioners\n                                    .radialDistributionY(point, dataLabel);\n                            }\n                        }\n                        // Find label's x position. The justify option is\n                        // undocumented in the API - preserve support for it\n                        if (dataLabelOptions.justify) {\n                            x = dataLabelPositioners.justify(point, dataLabel, radius, seriesCenter);\n                        }\n                        else {\n                            switch (dataLabelOptions.alignTo) {\n                                case 'connectors':\n                                    x = dataLabelPositioners.alignToConnectors(points, halfIdx, plotWidth, plotLeft);\n                                    break;\n                                case 'plotEdges':\n                                    x = dataLabelPositioners.alignToPlotEdges(dataLabel, halfIdx, plotWidth, plotLeft);\n                                    break;\n                                default:\n                                    x = dataLabelPositioners.radialDistributionX(series, point, y - topOffset, naturalY, dataLabel);\n                            }\n                        }\n                        // Record the placement and visibility\n                        labelPosition.attribs = {\n                            visibility,\n                            align: labelPosition.alignment\n                        };\n                        labelPosition.posAttribs = {\n                            x: x +\n                                (dataLabelOptions.x || 0) + // (#12985)\n                                ({\n                                    left: connectorPadding,\n                                    right: -connectorPadding\n                                }[labelPosition.alignment] || 0),\n                            y: y +\n                                (dataLabelOptions.y || 0) - // (#12985)\n                                // Vertically center\n                                lineHeight / 2\n                        };\n                        labelPosition.computed.x = x;\n                        labelPosition.computed.y = y - topOffset;\n                        // Detect overflowing data labels\n                        if (pick(dataLabelOptions.crop, true)) {\n                            dataLabelWidth = dataLabel.getBBox().width;\n                            let sideOverflow;\n                            // Overflow left\n                            if (x - dataLabelWidth < connectorPadding &&\n                                halfIdx === 1 // Left half\n                            ) {\n                                sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);\n                                overflow[3] = Math.max(sideOverflow, overflow[3]);\n                                // Overflow right\n                            }\n                            else if (x + dataLabelWidth >\n                                plotWidth - connectorPadding &&\n                                halfIdx === 0 // Right half\n                            ) {\n                                sideOverflow = Math.round(x +\n                                    dataLabelWidth -\n                                    plotWidth +\n                                    connectorPadding);\n                                overflow[1] = Math.max(sideOverflow, overflow[1]);\n                            }\n                            // Overflow top\n                            if (y - labelHeight / 2 < 0) {\n                                overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);\n                                // Overflow left\n                            }\n                            else if (y + labelHeight / 2 > plotHeight) {\n                                overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);\n                            }\n                            labelPosition.sideOverflow = sideOverflow;\n                        }\n                    }\n                }); // For each data label of the point\n            }); // For each point\n        }); // For each half\n        // Do not apply the final placement and draw the connectors until we\n        // have verified that labels are not spilling over.\n        if (arrayMax(overflow) === 0 ||\n            this.verifyDataLabelOverflow(overflow)) {\n            // Place the labels in the final position\n            this.placeDataLabels();\n            this.points.forEach((point) => {\n                (point.dataLabels || []).forEach((dataLabel) => {\n                    // #8864: every connector can have individual options\n                    const { connectorColor, connectorWidth = 1 } = (dataLabel.options || {}), labelPosition = dataLabel.dataLabelPosition;\n                    // Draw the connector\n                    if (connectorWidth) {\n                        let isNew;\n                        connector = dataLabel.connector;\n                        if (labelPosition && labelPosition.distance > 0) {\n                            isNew = !connector;\n                            if (!connector) {\n                                dataLabel.connector = connector = chart.renderer\n                                    .path()\n                                    .addClass('highcharts-data-label-connector ' +\n                                    ' highcharts-color-' +\n                                    point.colorIndex +\n                                    (point.className ?\n                                        ' ' + point.className :\n                                        ''))\n                                    .add(series.dataLabelsGroup);\n                            }\n                            if (!chart.styledMode) {\n                                connector.attr({\n                                    'stroke-width': connectorWidth,\n                                    'stroke': (connectorColor ||\n                                        point.color ||\n                                        \"#666666\" /* Palette.neutralColor60 */)\n                                });\n                            }\n                            connector[isNew ? 'attr' : 'animate']({\n                                d: point.getConnectorPath(dataLabel)\n                            });\n                            connector.attr({\n                                visibility: labelPosition.attribs?.visibility\n                            });\n                        }\n                        else if (connector) {\n                            dataLabel.connector = connector.destroy();\n                        }\n                    }\n                });\n            });\n        }\n    }\n    /**\n     * Perform the final placement of the data labels after we have verified\n     * that they fall within the plot area.\n     * @private\n     */\n    function placeDataLabels() {\n        this.points.forEach((point) => {\n            (point.dataLabels || []).forEach((dataLabel) => {\n                const labelPosition = dataLabel.dataLabelPosition;\n                if (labelPosition) {\n                    // Shorten data labels with ellipsis if they still overflow\n                    // after the pie has reached minSize (#223).\n                    if (labelPosition.sideOverflow) {\n                        dataLabel.css({\n                            width: (Math.max(dataLabel.getBBox().width -\n                                labelPosition.sideOverflow, 0)) + 'px',\n                            textOverflow: ((dataLabel.options?.style || {})\n                                .textOverflow ||\n                                'ellipsis')\n                        });\n                        dataLabel.shortened = true;\n                    }\n                    dataLabel.attr(labelPosition.attribs);\n                    dataLabel[dataLabel.moved ? 'animate' : 'attr'](labelPosition.posAttribs);\n                    dataLabel.moved = true;\n                }\n                else if (dataLabel) {\n                    dataLabel.attr({ y: -9999 });\n                }\n            });\n            // Clear for update\n            delete point.distributeBox;\n        }, this);\n    }\n    /**\n     * Verify whether the data labels are allowed to draw, or we should run more\n     * translation and data label positioning to keep them inside the plot area.\n     * Returns true when data labels are ready to draw.\n     * @private\n     */\n    function verifyDataLabelOverflow(overflow) {\n        const center = this.center, options = this.options, centerOption = options.center, minSize = options.minSize || 80;\n        let newSize = minSize, \n        // If a size is set, return true and don't try to shrink the pie\n        // to fit the labels.\n        ret = options.size !== null;\n        if (!ret) {\n            // Handle horizontal size and center\n            if (centerOption[0] !== null) { // Fixed center\n                newSize = Math.max(center[2] -\n                    Math.max(overflow[1], overflow[3]), minSize);\n            }\n            else { // Auto center\n                newSize = Math.max(\n                // Horizontal overflow\n                center[2] - overflow[1] - overflow[3], minSize);\n                // Horizontal center\n                center[0] += (overflow[3] - overflow[1]) / 2;\n            }\n            // Handle vertical size and center\n            if (centerOption[1] !== null) { // Fixed center\n                newSize = clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));\n            }\n            else { // Auto center\n                newSize = clamp(newSize, minSize, \n                // Vertical overflow\n                center[2] - overflow[0] - overflow[2]);\n                // Vertical center\n                center[1] += (overflow[0] - overflow[2]) / 2;\n            }\n            // If the size must be decreased, we need to run translate and\n            // drawDataLabels again\n            if (newSize < center[2]) {\n                center[2] = newSize;\n                center[3] = Math.min(// #3632\n                options.thickness ?\n                    Math.max(0, newSize - options.thickness * 2) :\n                    Math.max(0, relativeLength(options.innerSize || 0, newSize)), newSize); // #6647\n                this.translate(center);\n                if (this.drawDataLabels) {\n                    this.drawDataLabels();\n                }\n                // Else, return true to indicate that the pie and its labels is\n                // within the plot area\n            }\n            else {\n                ret = true;\n            }\n        }\n        return ret;\n    }\n})(ColumnDataLabel || (ColumnDataLabel = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColumnDataLabel;\n","/* *\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Namespace\n *\n * */\nvar GeometryUtilities;\n(function (GeometryUtilities) {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Calculates the center between a list of points.\n     *\n     * @private\n     *\n     * @param {Array<Highcharts.PositionObject>} points\n     * A list of points to calculate the center of.\n     *\n     * @return {Highcharts.PositionObject}\n     * Calculated center\n     */\n    function getCenterOfPoints(points) {\n        const sum = points.reduce((sum, point) => {\n            sum.x += point.x;\n            sum.y += point.y;\n            return sum;\n        }, { x: 0, y: 0 });\n        return {\n            x: sum.x / points.length,\n            y: sum.y / points.length\n        };\n    }\n    GeometryUtilities.getCenterOfPoints = getCenterOfPoints;\n    /**\n     * Calculates the distance between two points based on their x and y\n     * coordinates.\n     *\n     * @private\n     *\n     * @param {Highcharts.PositionObject} p1\n     * The x and y coordinates of the first point.\n     *\n     * @param {Highcharts.PositionObject} p2\n     * The x and y coordinates of the second point.\n     *\n     * @return {number}\n     * Returns the distance between the points.\n     */\n    function getDistanceBetweenPoints(p1, p2) {\n        return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n    }\n    GeometryUtilities.getDistanceBetweenPoints = getDistanceBetweenPoints;\n    /**\n     * Calculates the angle between two points.\n     * @todo add unit tests.\n     * @private\n     * @param {Highcharts.PositionObject} p1 The first point.\n     * @param {Highcharts.PositionObject} p2 The second point.\n     * @return {number} Returns the angle in radians.\n     */\n    function getAngleBetweenPoints(p1, p2) {\n        return Math.atan2(p2.x - p1.x, p2.y - p1.y);\n    }\n    GeometryUtilities.getAngleBetweenPoints = getAngleBetweenPoints;\n    /**\n     * Test for point in polygon. Polygon defined as array of [x,y] points.\n     * @private\n     * @param {PositionObject} point The point potentially within a polygon.\n     * @param {Array<Array<number>>} polygon The polygon potentially containing the point.\n     */\n    function pointInPolygon({ x, y }, polygon) {\n        const len = polygon.length;\n        let i, j, inside = false;\n        for (i = 0, j = len - 1; i < len; j = i++) {\n            const [x1, y1] = polygon[i], [x2, y2] = polygon[j];\n            if (y1 > y !== y2 > y &&\n                (x < (x2 - x1) *\n                    (y - y1) /\n                    (y2 - y1) +\n                    x1)) {\n                inside = !inside;\n            }\n        }\n        return inside;\n    }\n    GeometryUtilities.pointInPolygon = pointInPolygon;\n})(GeometryUtilities || (GeometryUtilities = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default GeometryUtilities;\n","/* *\n *\n *  Highcharts module to hide overlapping data labels.\n *  This module is included in Highcharts.\n *\n *  (c) 2009-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport GeometryUtilities from '../Core/Geometry/GeometryUtilities.js';\nconst { pointInPolygon } = GeometryUtilities;\nimport U from '../Core/Utilities.js';\nconst { addEvent, fireEvent, objectEach, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n * provide a smooth visual impression.\n *\n * @requires modules/overlapping-datalabels\n *\n * @private\n * @function Highcharts.Chart#hideOverlappingLabels\n * @param {Array<Highcharts.SVGElement>} labels\n *        Rendered data labels\n */\nfunction chartHideOverlappingLabels(labels) {\n    const chart = this, len = labels.length, isIntersectRect = (box1, box2) => !(box2.x >= box1.x + box1.width ||\n        box2.x + box2.width <= box1.x ||\n        box2.y >= box1.y + box1.height ||\n        box2.y + box2.height <= box1.y), isPolygonOverlap = (box1Poly, box2Poly) => {\n        for (const p of box1Poly) {\n            if (pointInPolygon({ x: p[0], y: p[1] }, box2Poly)) {\n                return true;\n            }\n        }\n        return false;\n    };\n    /**\n     * Get the box with its position inside the chart, as opposed to getBBox\n     * that only reports the position relative to the parent.\n     */\n    function getAbsoluteBox(label) {\n        if (label && (!label.alignAttr || label.placed)) {\n            const padding = label.box ? 0 : (label.padding || 0), pos = label.alignAttr || {\n                x: label.attr('x'),\n                y: label.attr('y')\n            }, bBox = label.getBBox();\n            label.width = bBox.width;\n            label.height = bBox.height;\n            return {\n                x: pos.x + (label.parentGroup?.translateX || 0) + padding,\n                y: pos.y + (label.parentGroup?.translateY || 0) + padding,\n                width: (label.width || 0) - 2 * padding,\n                height: (label.height || 0) - 2 * padding,\n                polygon: bBox?.polygon\n            };\n        }\n    }\n    let label, label1, label2, box1, box2, isLabelAffected = false;\n    for (let i = 0; i < len; i++) {\n        label = labels[i];\n        if (label) {\n            // Mark with initial opacity\n            label.oldOpacity = label.opacity;\n            label.newOpacity = 1;\n            label.absoluteBox = getAbsoluteBox(label);\n        }\n    }\n    // Prevent a situation in a gradually rising slope, that each label will\n    // hide the previous one because the previous one always has lower rank.\n    labels.sort((a, b) => (b.labelrank || 0) - (a.labelrank || 0));\n    // Detect overlapping labels\n    for (let i = 0; i < len; ++i) {\n        label1 = labels[i];\n        box1 = label1 && label1.absoluteBox;\n        const box1Poly = box1?.polygon;\n        for (let j = i + 1; j < len; ++j) {\n            label2 = labels[j];\n            box2 = label2 && label2.absoluteBox;\n            let toHide = false;\n            if (box1 &&\n                box2 &&\n                label1 !== label2 && // #6465, polar chart with connectEnds\n                label1.newOpacity !== 0 &&\n                label2.newOpacity !== 0 &&\n                // #15863 dataLabels are no longer hidden by translation\n                label1.visibility !== 'hidden' &&\n                label2.visibility !== 'hidden') {\n                const box2Poly = box2.polygon;\n                // If labels have polygons, only evaluate\n                // based on polygons\n                if (box1Poly &&\n                    box2Poly &&\n                    box1Poly !== box2Poly) {\n                    if (isPolygonOverlap(box1Poly, box2Poly)) {\n                        toHide = true;\n                    }\n                    // If there are no polygons, evaluate rectangles coliding\n                }\n                else if (isIntersectRect(box1, box2)) {\n                    toHide = true;\n                }\n                if (toHide) {\n                    const overlappingLabel = (label1.labelrank < label2.labelrank ?\n                        label1 :\n                        label2), labelText = overlappingLabel.text;\n                    overlappingLabel.newOpacity = 0;\n                    if (labelText?.element.querySelector('textPath')) {\n                        labelText.hide();\n                    }\n                }\n            }\n        }\n    }\n    // Hide or show\n    for (const label of labels) {\n        if (hideOrShow(label, chart)) {\n            isLabelAffected = true;\n        }\n    }\n    if (isLabelAffected) {\n        fireEvent(chart, 'afterHideAllOverlappingLabels');\n    }\n}\n/** @private */\nfunction compose(ChartClass) {\n    const chartProto = ChartClass.prototype;\n    if (!chartProto.hideOverlappingLabels) {\n        chartProto.hideOverlappingLabels = chartHideOverlappingLabels;\n        addEvent(ChartClass, 'render', onChartRender);\n    }\n}\n/**\n * Hide or show labels based on opacity.\n *\n * @private\n * @function hideOrShow\n * @param {Highcharts.SVGElement} label\n * The label.\n * @param {Highcharts.Chart} chart\n * The chart that contains the label.\n * @return {boolean}\n * Whether label is affected\n */\nfunction hideOrShow(label, chart) {\n    let complete, newOpacity, isLabelAffected = false;\n    if (label) {\n        newOpacity = label.newOpacity;\n        if (label.oldOpacity !== newOpacity) {\n            // Toggle data labels\n            if (label.hasClass('highcharts-data-label')) {\n                // Make sure the label is completely hidden to avoid catching\n                // clicks (#4362)\n                label[newOpacity ? 'removeClass' : 'addClass']('highcharts-data-label-hidden');\n                complete = function () {\n                    if (!chart.styledMode) {\n                        label.css({\n                            pointerEvents: newOpacity ? 'auto' : 'none'\n                        });\n                    }\n                };\n                isLabelAffected = true;\n                // Animate or set the opacity\n                label[label.isOld ? 'animate' : 'attr']({ opacity: newOpacity }, void 0, complete);\n                fireEvent(chart, 'afterHideOverlappingLabel');\n                // Toggle other labels, tick labels\n            }\n            else {\n                label.attr({\n                    opacity: newOpacity\n                });\n            }\n        }\n        label.isOld = true;\n    }\n    return isLabelAffected;\n}\n/**\n * Collect potential overlapping data labels. Stack labels probably don't need\n * to be considered because they are usually accompanied by data labels that lie\n * inside the columns.\n * @private\n */\nfunction onChartRender() {\n    const chart = this;\n    let labels = [];\n    // Consider external label collectors\n    for (const collector of (chart.labelCollectors || [])) {\n        labels = labels.concat(collector());\n    }\n    for (const yAxis of (chart.yAxis || [])) {\n        if (yAxis.stacking &&\n            yAxis.options.stackLabels &&\n            !yAxis.options.stackLabels.allowOverlap) {\n            objectEach(yAxis.stacking.stacks, (stack) => {\n                objectEach(stack, (stackItem) => {\n                    if (stackItem.label) {\n                        labels.push(stackItem.label);\n                    }\n                });\n            });\n        }\n    }\n    for (const series of (chart.series || [])) {\n        if (series.visible && series.hasDataLabels?.()) { // #3866\n            const push = (points) => {\n                for (const point of points) {\n                    if (point.visible) {\n                        (point.dataLabels || []).forEach((label) => {\n                            const options = label.options || {};\n                            label.labelrank = pick(options.labelrank, point.labelrank, point.shapeArgs?.height); // #4118\n                            // Allow overlap if the option is explicitly true\n                            if (\n                            // #13449\n                            options.allowOverlap ??\n                                // Pie labels outside have a separate placement\n                                // logic, skip the overlap logic\n                                Number(options.distance) > 0) {\n                                label.oldOpacity = label.opacity;\n                                label.newOpacity = 1;\n                                hideOrShow(label, chart);\n                                // Do not allow overlap\n                            }\n                            else {\n                                labels.push(label);\n                            }\n                        });\n                    }\n                }\n            };\n            push(series.nodes || []);\n            push(series.points);\n        }\n    }\n    this.hideOverlappingLabels(labels);\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst OverlappingDataLabels = {\n    compose\n};\nexport default OverlappingDataLabels;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from './Utilities.js';\nconst { diffObjects, extend, find, merge, pick, uniqueKey } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar Responsive;\n(function (Responsive) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * @private\n     */\n    function compose(ChartClass) {\n        const chartProto = ChartClass.prototype;\n        if (!chartProto.matchResponsiveRule) {\n            extend(chartProto, {\n                matchResponsiveRule,\n                setResponsive\n            });\n        }\n        return ChartClass;\n    }\n    Responsive.compose = compose;\n    /**\n     * Handle a single responsiveness rule.\n     *\n     * @private\n     * @function Highcharts.Chart#matchResponsiveRule\n     * @param {Highcharts.ResponsiveRulesOptions} rule\n     * @param {Array<string>} matches\n     */\n    function matchResponsiveRule(rule, matches) {\n        const condition = rule.condition, fn = condition.callback || function () {\n            return (this.chartWidth <= pick(condition.maxWidth, Number.MAX_VALUE) &&\n                this.chartHeight <= pick(condition.maxHeight, Number.MAX_VALUE) &&\n                this.chartWidth >= pick(condition.minWidth, 0) &&\n                this.chartHeight >= pick(condition.minHeight, 0));\n        };\n        if (fn.call(this)) {\n            matches.push(rule._id);\n        }\n    }\n    /**\n     * Update the chart based on the current chart/document size and options\n     * for responsiveness.\n     *\n     * @private\n     * @function Highcharts.Chart#setResponsive\n     * @param  {boolean} [redraw=true]\n     * @param  {boolean} [reset=false]\n     * Reset by un-applying all rules. Chart.update resets all rules before\n     * applying updated options.\n     */\n    function setResponsive(redraw, reset) {\n        const options = this.options.responsive, currentResponsive = this.currentResponsive;\n        let ruleIds = [], undoOptions;\n        if (!reset && options && options.rules) {\n            options.rules.forEach((rule) => {\n                if (typeof rule._id === 'undefined') {\n                    rule._id = uniqueKey();\n                }\n                this.matchResponsiveRule(rule, ruleIds /* , redraw */);\n            }, this);\n        }\n        // Merge matching rules\n        const mergedOptions = merge(...ruleIds\n            .map((ruleId) => find((options || {}).rules || [], (rule) => (rule._id === ruleId)))\n            .map((rule) => (rule && rule.chartOptions)));\n        mergedOptions.isResponsiveOptions = true;\n        // Stringified key for the rules that currently apply.\n        ruleIds = (ruleIds.toString() || void 0);\n        const currentRuleIds = (currentResponsive && currentResponsive.ruleIds);\n        // Changes in what rules apply\n        if (ruleIds !== currentRuleIds) {\n            // Undo previous rules. Before we apply a new set of rules, we\n            // need to roll back completely to base options (#6291).\n            if (currentResponsive) {\n                this.currentResponsive = void 0;\n                this.updatingResponsive = true;\n                this.update(currentResponsive.undoOptions, redraw, true);\n                this.updatingResponsive = false;\n            }\n            if (ruleIds) {\n                // Get undo-options for matching rules. The `undoOptions``\n                // hold the current values before they are changed by the\n                // `mergedOptions`.\n                undoOptions = diffObjects(mergedOptions, this.options, true, this.collectionsWithUpdate);\n                undoOptions.isResponsiveOptions = true;\n                this.currentResponsive = {\n                    ruleIds: ruleIds,\n                    mergedOptions: mergedOptions,\n                    undoOptions: undoOptions\n                };\n                if (!this.updatingResponsive) {\n                    this.update(mergedOptions, redraw, true);\n                }\n            }\n            else {\n                this.currentResponsive = void 0;\n            }\n        }\n    }\n})(Responsive || (Responsive = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Responsive;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * A callback function to gain complete control on when the responsive rule\n * applies.\n *\n * @callback Highcharts.ResponsiveCallbackFunction\n *\n * @param {Highcharts.Chart} this\n * Chart context.\n *\n * @return {boolean}\n * Return `true` if it applies.\n */\n(''); // Keeps doclets above in JS file\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Allows setting a set of rules to apply for different screen or chart\n * sizes. Each rule specifies additional chart options.\n *\n * @sample {highstock} stock/demo/responsive/\n *         Stock chart\n * @sample highcharts/responsive/axis/\n *         Axis\n * @sample highcharts/responsive/legend/\n *         Legend\n * @sample highcharts/responsive/classname/\n *         Class name\n *\n * @since     5.0.0\n * @apioption responsive\n */\n/**\n * A set of rules for responsive settings. The rules are executed from\n * the top down.\n *\n * @sample {highcharts} highcharts/responsive/axis/\n *         Axis changes\n * @sample {highstock} highcharts/responsive/axis/\n *         Axis changes\n * @sample {highmaps} highcharts/responsive/axis/\n *         Axis changes\n *\n * @type      {Array<*>}\n * @since     5.0.0\n * @apioption responsive.rules\n */\n/**\n * A full set of chart options to apply as overrides to the general\n * chart options. The chart options are applied when the given rule\n * is active.\n *\n * A special case is configuration objects that take arrays, for example\n * [xAxis](#xAxis), [yAxis](#yAxis) or [series](#series). For these\n * collections, an `id` option is used to map the new option set to\n * an existing object. If an existing object of the same id is not found,\n * the item of the same index updated. So for example, setting `chartOptions`\n * with two series items without an `id`, will cause the existing chart's\n * two series to be updated with respective options.\n *\n * @sample {highstock} stock/demo/responsive/\n *         Stock chart\n * @sample highcharts/responsive/axis/\n *         Axis\n * @sample highcharts/responsive/legend/\n *         Legend\n * @sample highcharts/responsive/classname/\n *         Class name\n *\n * @type      {Highcharts.Options}\n * @since     5.0.0\n * @apioption responsive.rules.chartOptions\n */\n/**\n * Under which conditions the rule applies.\n *\n * @since     5.0.0\n * @apioption responsive.rules.condition\n */\n/**\n * A callback function to gain complete control on when the responsive\n * rule applies. Return `true` if it applies. This opens for checking\n * against other metrics than the chart size, for example the document\n * size or other elements.\n *\n * @type      {Highcharts.ResponsiveCallbackFunction}\n * @since     5.0.0\n * @context   Highcharts.Chart\n * @apioption responsive.rules.condition.callback\n */\n/**\n * The responsive rule applies if the chart height is less than this.\n *\n * @type      {number}\n * @since     5.0.0\n * @apioption responsive.rules.condition.maxHeight\n */\n/**\n * The responsive rule applies if the chart width is less than this.\n *\n * @sample highcharts/responsive/axis/\n *         Max width is 500\n *\n * @type      {number}\n * @since     5.0.0\n * @apioption responsive.rules.condition.maxWidth\n */\n/**\n * The responsive rule applies if the chart height is greater than this.\n *\n * @type      {number}\n * @default   0\n * @since     5.0.0\n * @apioption responsive.rules.condition.minHeight\n */\n/**\n * The responsive rule applies if the chart width is greater than this.\n *\n * @type      {number}\n * @default   0\n * @since     5.0.0\n * @apioption responsive.rules.condition.minWidth\n */\n(''); // Keeps doclets above in JS file\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/highcharts\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../Core/Globals.js';\nimport Utilities from '../Core/Utilities.js';\nimport Defaults from '../Core/Defaults.js';\nimport Fx from '../Core/Animation/Fx.js';\nimport Animation from '../Core/Animation/AnimationUtilities.js';\nimport AST from '../Core/Renderer/HTML/AST.js';\nimport Templating from '../Core/Templating.js';\nimport RendererRegistry from '../Core/Renderer/RendererRegistry.js';\nimport RendererUtilities from '../Core/Renderer/RendererUtilities.js';\nimport SVGElement from '../Core/Renderer/SVG/SVGElement.js';\nimport SVGRenderer from '../Core/Renderer/SVG/SVGRenderer.js';\nimport HTMLElement from '../Core/Renderer/HTML/HTMLElement.js';\nimport Axis from '../Core/Axis/Axis.js';\nimport DateTimeAxis from '../Core/Axis/DateTimeAxis.js';\nimport LogarithmicAxis from '../Core/Axis/LogarithmicAxis.js';\nimport PlotLineOrBand from '../Core/Axis/PlotLineOrBand/PlotLineOrBand.js';\nimport Tick from '../Core/Axis/Tick.js';\nimport Tooltip from '../Core/Tooltip.js';\nimport Point from '../Core/Series/Point.js';\nimport Pointer from '../Core/Pointer.js';\nimport Legend from '../Core/Legend/Legend.js';\nimport LegendSymbol from '../Core/Legend/LegendSymbol.js';\nimport Chart from '../Core/Chart/Chart.js';\nimport ScrollablePlotArea from '../Extensions/ScrollablePlotArea.js';\nimport StackingAxis from '../Core/Axis/Stacking/StackingAxis.js';\nimport StackItem from '../Core/Axis/Stacking/StackItem.js';\nimport Series from '../Core/Series/Series.js';\nimport SeriesRegistry from '../Core/Series/SeriesRegistry.js';\nimport '../Series/Line/LineSeries.js';\nimport '../Series/Area/AreaSeries.js';\nimport '../Series/Spline/SplineSeries.js';\nimport '../Series/AreaSpline/AreaSplineSeries.js';\nimport '../Series/Column/ColumnSeries.js';\nimport ColumnDataLabel from '../Series/Column/ColumnDataLabel.js';\nimport '../Series/Bar/BarSeries.js';\nimport '../Series/Scatter/ScatterSeries.js';\nimport '../Series/Pie/PieSeries.js';\nimport PieDataLabel from '../Series/Pie/PieDataLabel.js';\nimport DataLabel from '../Core/Series/DataLabel.js';\nimport OverlappingDataLabels from '../Extensions/OverlappingDataLabels.js';\nimport BorderRadius from '../Extensions/BorderRadius.js';\nimport Responsive from '../Core/Responsive.js';\nimport Color from '../Core/Color/Color.js';\nimport Time from '../Core/Time.js';\nconst G = Highcharts;\n// Classes\nG.AST = AST;\nG.Axis = Axis;\nG.Chart = Chart;\nG.Color = Color;\nG.DataLabel = DataLabel;\nG.Fx = Fx;\nG.HTMLElement = HTMLElement;\nG.Legend = Legend;\nG.LegendSymbol = LegendSymbol;\nG.OverlappingDataLabels = G.OverlappingDataLabels || OverlappingDataLabels;\nG.PlotLineOrBand = PlotLineOrBand;\nG.Point = Point;\nG.Pointer = Pointer;\nG.RendererRegistry = RendererRegistry;\nG.Series = Series;\nG.SeriesRegistry = SeriesRegistry;\nG.StackItem = StackItem;\nG.SVGElement = SVGElement;\nG.SVGRenderer = SVGRenderer;\nG.Templating = Templating;\nG.Tick = Tick;\nG.Time = Time;\nG.Tooltip = Tooltip;\n// Utilities\nG.animate = Animation.animate;\nG.animObject = Animation.animObject;\nG.chart = Chart.chart;\nG.color = Color.parse;\nG.dateFormat = Templating.dateFormat;\nG.defaultOptions = Defaults.defaultOptions;\nG.distribute = RendererUtilities.distribute;\nG.format = Templating.format;\nG.getDeferredAnimation = Animation.getDeferredAnimation;\nG.getOptions = Defaults.getOptions;\nG.numberFormat = Templating.numberFormat;\nG.seriesType = SeriesRegistry.seriesType;\nG.setAnimation = Animation.setAnimation;\nG.setOptions = Defaults.setOptions;\nG.stop = Animation.stop;\nG.time = Defaults.defaultTime;\nG.timers = Fx.timers;\n// Compositions\nBorderRadius.compose(G.Series, G.SVGElement, G.SVGRenderer);\nColumnDataLabel.compose(G.Series.types.column);\nDataLabel.compose(G.Series);\nDateTimeAxis.compose(G.Axis);\nHTMLElement.compose(G.SVGRenderer);\nLegend.compose(G.Chart);\nLogarithmicAxis.compose(G.Axis);\nOverlappingDataLabels.compose(G.Chart);\nPieDataLabel.compose(G.Series.types.pie);\nPlotLineOrBand.compose(G.Chart, G.Axis);\nPointer.compose(G.Chart);\nResponsive.compose(G.Chart);\nScrollablePlotArea.compose(G.Axis, G.Chart, G.Series);\nStackingAxis.compose(G.Axis, G.Chart, G.Series);\nTooltip.compose(G.Pointer);\nUtilities.extend(G, Utilities);\n// Default Export\nexport default G;\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","module.exports = self.fetch || (self.fetch = require('unfetch').default || require('unfetch'));\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","/*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\n// @function extend(dest: Object, src?: Object): Object\r\n// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\nexport function extend(dest) {\r\n\tvar i, j, len, src;\r\n\r\n\tfor (j = 1, len = arguments.length; j < len; j++) {\r\n\t\tsrc = arguments[j];\r\n\t\tfor (i in src) {\r\n\t\t\tdest[i] = src[i];\r\n\t\t}\r\n\t}\r\n\treturn dest;\r\n}\r\n\r\n// @function create(proto: Object, properties?: Object): Object\r\n// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\nexport var create = Object.create || (function () {\r\n\tfunction F() {}\r\n\treturn function (proto) {\r\n\t\tF.prototype = proto;\r\n\t\treturn new F();\r\n\t};\r\n})();\r\n\r\n// @function bind(fn: Function, …): Function\r\n// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n// Has a `L.bind()` shortcut.\r\nexport function bind(fn, obj) {\r\n\tvar slice = Array.prototype.slice;\r\n\r\n\tif (fn.bind) {\r\n\t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n\t}\r\n\r\n\tvar args = slice.call(arguments, 2);\r\n\r\n\treturn function () {\r\n\t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n\t};\r\n}\r\n\r\n// @property lastId: Number\r\n// Last unique ID used by [`stamp()`](#util-stamp)\r\nexport var lastId = 0;\r\n\r\n// @function stamp(obj: Object): Number\r\n// Returns the unique ID of an object, assigning it one if it doesn't have it.\r\nexport function stamp(obj) {\r\n\tif (!('_leaflet_id' in obj)) {\r\n\t\tobj['_leaflet_id'] = ++lastId;\r\n\t}\r\n\treturn obj._leaflet_id;\r\n}\r\n\r\n// @function throttle(fn: Function, time: Number, context: Object): Function\r\n// Returns a function which executes function `fn` with the given scope `context`\r\n// (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n// `fn` will be called no more than one time per given amount of `time`. The arguments\r\n// received by the bound function will be any arguments passed when binding the\r\n// function, followed by any arguments passed when invoking the bound function.\r\n// Has an `L.throttle` shortcut.\r\nexport function throttle(fn, time, context) {\r\n\tvar lock, args, wrapperFn, later;\r\n\r\n\tlater = function () {\r\n\t\t// reset lock and call if queued\r\n\t\tlock = false;\r\n\t\tif (args) {\r\n\t\t\twrapperFn.apply(context, args);\r\n\t\t\targs = false;\r\n\t\t}\r\n\t};\r\n\r\n\twrapperFn = function () {\r\n\t\tif (lock) {\r\n\t\t\t// called too soon, queue to call later\r\n\t\t\targs = arguments;\r\n\r\n\t\t} else {\r\n\t\t\t// call and lock until later\r\n\t\t\tfn.apply(context, arguments);\r\n\t\t\tsetTimeout(later, time);\r\n\t\t\tlock = true;\r\n\t\t}\r\n\t};\r\n\r\n\treturn wrapperFn;\r\n}\r\n\r\n// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n// Returns the number `num` modulo `range` in such a way so it lies within\r\n// `range[0]` and `range[1]`. The returned value will be always smaller than\r\n// `range[1]` unless `includeMax` is set to `true`.\r\nexport function wrapNum(x, range, includeMax) {\r\n\tvar max = range[1],\r\n\t    min = range[0],\r\n\t    d = max - min;\r\n\treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n}\r\n\r\n// @function falseFn(): Function\r\n// Returns a function which always returns `false`.\r\nexport function falseFn() { return false; }\r\n\r\n// @function formatNum(num: Number, precision?: Number|false): Number\r\n// Returns the number `num` rounded with specified `precision`.\r\n// The default `precision` value is 6 decimal places.\r\n// `false` can be passed to skip any processing (can be useful to avoid round-off errors).\r\nexport function formatNum(num, precision) {\r\n\tif (precision === false) { return num; }\r\n\tvar pow = Math.pow(10, precision === undefined ? 6 : precision);\r\n\treturn Math.round(num * pow) / pow;\r\n}\r\n\r\n// @function trim(str: String): String\r\n// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\nexport function trim(str) {\r\n\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n}\r\n\r\n// @function splitWords(str: String): String[]\r\n// Trims and splits the string on whitespace and returns the array of parts.\r\nexport function splitWords(str) {\r\n\treturn trim(str).split(/\\s+/);\r\n}\r\n\r\n// @function setOptions(obj: Object, options: Object): Object\r\n// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\nexport function setOptions(obj, options) {\r\n\tif (!Object.prototype.hasOwnProperty.call(obj, 'options')) {\r\n\t\tobj.options = obj.options ? create(obj.options) : {};\r\n\t}\r\n\tfor (var i in options) {\r\n\t\tobj.options[i] = options[i];\r\n\t}\r\n\treturn obj.options;\r\n}\r\n\r\n// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n// Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n// be appended at the end. If `uppercase` is `true`, the parameter names will\r\n// be uppercased (e.g. `'?A=foo&B=bar'`)\r\nexport function getParamString(obj, existingUrl, uppercase) {\r\n\tvar params = [];\r\n\tfor (var i in obj) {\r\n\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t}\r\n\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n}\r\n\r\nvar templateRe = /\\{ *([\\w_ -]+) *\\}/g;\r\n\r\n// @function template(str: String, data: Object): String\r\n// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n// `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n// data values — they will be evaluated passing `data` as an argument.\r\nexport function template(str, data) {\r\n\treturn str.replace(templateRe, function (str, key) {\r\n\t\tvar value = data[key];\r\n\r\n\t\tif (value === undefined) {\r\n\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n\t\t} else if (typeof value === 'function') {\r\n\t\t\tvalue = value(data);\r\n\t\t}\r\n\t\treturn value;\r\n\t});\r\n}\r\n\r\n// @function isArray(obj): Boolean\r\n// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\nexport var isArray = Array.isArray || function (obj) {\r\n\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n};\r\n\r\n// @function indexOf(array: Array, el: Object): Number\r\n// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\nexport function indexOf(array, el) {\r\n\tfor (var i = 0; i < array.length; i++) {\r\n\t\tif (array[i] === el) { return i; }\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\n// @property emptyImageUrl: String\r\n// Data URI string containing a base64-encoded empty GIF image.\r\n// Used as a hack to free memory from unused images on WebKit-powered\r\n// mobile devices (by setting image `src` to this string).\r\nexport var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r\n\r\n// inspired by https://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\nfunction getPrefixed(name) {\r\n\treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n}\r\n\r\nvar lastTime = 0;\r\n\r\n// fallback for IE 7-8\r\nfunction timeoutDefer(fn) {\r\n\tvar time = +new Date(),\r\n\t    timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\tlastTime = time + timeToCall;\r\n\treturn window.setTimeout(fn, timeToCall);\r\n}\r\n\r\nexport var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\nexport var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n\t\tgetPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n// Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n// `context` if given. When `immediate` is set, `fn` is called immediately if\r\n// the browser doesn't have native support for\r\n// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n// otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\nexport function requestAnimFrame(fn, context, immediate) {\r\n\tif (immediate && requestFn === timeoutDefer) {\r\n\t\tfn.call(context);\r\n\t} else {\r\n\t\treturn requestFn.call(window, bind(fn, context));\r\n\t}\r\n}\r\n\r\n// @function cancelAnimFrame(id: Number): undefined\r\n// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\nexport function cancelAnimFrame(id) {\r\n\tif (id) {\r\n\t\tcancelFn.call(window, id);\r\n\t}\r\n}\r\n","import * as Util from './Util';\r\n\r\n// @class Class\r\n// @aka L.Class\r\n\r\n// @section\r\n// @uninheritable\r\n\r\n// Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\nexport function Class() {}\r\n\r\nClass.extend = function (props) {\r\n\r\n\t// @function extend(props: Object): Function\r\n\t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n\t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n\tvar NewClass = function () {\r\n\r\n\t\tUtil.setOptions(this);\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tthis.callInitHooks();\r\n\t};\r\n\r\n\tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n\tvar proto = Util.create(parentProto);\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t// inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tUtil.extend(NewClass, props.statics);\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tcheckDeprecatedMixinEvents(props.includes);\r\n\t\tUtil.extend.apply(null, [proto].concat(props.includes));\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tUtil.extend(proto, props);\r\n\tdelete proto.statics;\r\n\tdelete proto.includes;\r\n\r\n\t// merge options\r\n\tif (proto.options) {\r\n\t\tproto.options = parentProto.options ? Util.create(parentProto.options) : {};\r\n\t\tUtil.extend(proto.options, props.options);\r\n\t}\r\n\r\n\tproto._initHooks = [];\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parentProto.callInitHooks) {\r\n\t\t\tparentProto.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// @function include(properties: Object): this\r\n// [Includes a mixin](#class-includes) into the current class.\r\nClass.include = function (props) {\r\n\tvar parentOptions = this.prototype.options;\r\n\tUtil.extend(this.prototype, props);\r\n\tif (props.options) {\r\n\t\tthis.prototype.options = parentOptions;\r\n\t\tthis.mergeOptions(props.options);\r\n\t}\r\n\treturn this;\r\n};\r\n\r\n// @function mergeOptions(options: Object): this\r\n// [Merges `options`](#class-options) into the defaults of the class.\r\nClass.mergeOptions = function (options) {\r\n\tUtil.extend(this.prototype.options, options);\r\n\treturn this;\r\n};\r\n\r\n// @function addInitHook(fn: Function): this\r\n// Adds a [constructor hook](#class-constructor-hooks) to the class.\r\nClass.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n\treturn this;\r\n};\r\n\r\nfunction checkDeprecatedMixinEvents(includes) {\r\n\t/* global L: true */\r\n\tif (typeof L === 'undefined' || !L || !L.Mixin) { return; }\r\n\r\n\tincludes = Util.isArray(includes) ? includes : [includes];\r\n\r\n\tfor (var i = 0; i < includes.length; i++) {\r\n\t\tif (includes[i] === L.Mixin.Events) {\r\n\t\t\tconsole.warn('Deprecated include of L.Mixin.Events: ' +\r\n\t\t\t\t'this property will be removed in future releases, ' +\r\n\t\t\t\t'please inherit from L.Evented instead.', new Error().stack);\r\n\t\t}\r\n\t}\r\n}\r\n","import {Class} from './Class';\r\nimport * as Util from './Util';\r\n\r\n/*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\nexport var Events = {\r\n\t/* @method on(type: String, fn: Function, context?: Object): this\r\n\t * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).\r\n\t *\r\n\t * @alternative\r\n\t * @method on(eventMap: Object): this\r\n\t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\t */\r\n\ton: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* @method off(type: String, fn?: Function, context?: Object): this\r\n\t * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.\r\n\t *\r\n\t * @alternative\r\n\t * @method off(eventMap: Object): this\r\n\t * Removes a set of type/listener pairs.\r\n\t *\r\n\t * @alternative\r\n\t * @method off: this\r\n\t * Removes all listeners to all events on the object. This includes implicitly attached events.\r\n\t */\r\n\toff: function (types, fn, context) {\r\n\r\n\t\tif (!arguments.length) {\r\n\t\t\t// clear all listeners if called without arguments\r\n\t\t\tdelete this._events;\r\n\r\n\t\t} else if (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tvar removeAll = arguments.length === 1;\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tif (removeAll) {\r\n\t\t\t\t\tthis._off(types[i]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._off(types[i], fn, context);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// attach listener (without syntactic sugar now)\r\n\t_on: function (type, fn, context, _once) {\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// check if fn already there\r\n\t\tif (this._listens(type, fn, context) !== false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tvar newListener = {fn: fn, ctx: context};\r\n\t\tif (_once) {\r\n\t\t\tnewListener.once = true;\r\n\t\t}\r\n\r\n\t\tthis._events = this._events || {};\r\n\t\tthis._events[type] = this._events[type] || [];\r\n\t\tthis._events[type].push(newListener);\r\n\t},\r\n\r\n\t_off: function (type, fn, context) {\r\n\t\tvar listeners,\r\n\t\t    i,\r\n\t\t    len;\r\n\r\n\t\tif (!this._events) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlisteners = this._events[type];\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (arguments.length === 1) { // remove all\r\n\t\t\tif (this._firingCount) {\r\n\t\t\t\t// Set all removed listeners to noop\r\n\t\t\t\t// so they are not called if remove happens in fire\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].fn = Util.falseFn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\tdelete this._events[type];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// find fn and remove it\r\n\t\tvar index = this._listens(type, fn, context);\r\n\t\tif (index !== false) {\r\n\t\t\tvar listener = listeners[index];\r\n\t\t\tif (this._firingCount) {\r\n\t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n\t\t\t\tlistener.fn = Util.falseFn;\r\n\r\n\t\t\t\t/* copy array in case events are being fired */\r\n\t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n\t\t\t}\r\n\t\t\tlisteners.splice(index, 1);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n\t// Fires an event of the specified type. You can optionally provide a data\r\n\t// object — the first argument of the listener function will contain its\r\n\t// properties. The event can optionally be propagated to event parents.\r\n\tfire: function (type, data, propagate) {\r\n\t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n\t\tvar event = Util.extend({}, data, {\r\n\t\t\ttype: type,\r\n\t\t\ttarget: this,\r\n\t\t\tsourceTarget: data && data.sourceTarget || this\r\n\t\t});\r\n\r\n\t\tif (this._events) {\r\n\t\t\tvar listeners = this._events[type];\r\n\t\t\tif (listeners) {\r\n\t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n\t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tvar l = listeners[i];\r\n\t\t\t\t\t// off overwrites l.fn, so we need to copy fn to a var\r\n\t\t\t\t\tvar fn = l.fn;\r\n\t\t\t\t\tif (l.once) {\r\n\t\t\t\t\t\tthis.off(type, fn, l.ctx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfn.call(l.ctx || this, event);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._firingCount--;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// propagate the event to parents (set with addEventParent)\r\n\t\t\tthis._propagateEvent(event);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method listens(type: String, propagate?: Boolean): Boolean\r\n\t// @method listens(type: String, fn: Function, context?: Object, propagate?: Boolean): Boolean\r\n\t// Returns `true` if a particular event type has any listeners attached to it.\r\n\t// The verification can optionally be propagated, it will return `true` if parents have the listener attached to it.\r\n\tlistens: function (type, fn, context, propagate) {\r\n\t\tif (typeof type !== 'string') {\r\n\t\t\tconsole.warn('\"string\" type argument expected');\r\n\t\t}\r\n\r\n\t\t// we don't overwrite the input `fn` value, because we need to use it for propagation\r\n\t\tvar _fn = fn;\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tpropagate = !!fn;\r\n\t\t\t_fn = undefined;\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tvar listeners = this._events && this._events[type];\r\n\t\tif (listeners && listeners.length) {\r\n\t\t\tif (this._listens(type, _fn, context) !== false) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// also check parents for listeners if event propagates\r\n\t\t\tfor (var id in this._eventParents) {\r\n\t\t\t\tif (this._eventParents[id].listens(type, fn, context, propagate)) { return true; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// returns the index (number) or false\r\n\t_listens: function (type, fn, context) {\r\n\t\tif (!this._events) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar listeners = this._events[type] || [];\r\n\t\tif (!fn) {\r\n\t\t\treturn !!listeners.length;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\t// @method once(…): this\r\n\t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n\tonce: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn, true);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addEventParent(obj: Evented): this\r\n\t// Adds an event parent - an `Evented` that will receive propagated events\r\n\taddEventParent: function (obj) {\r\n\t\tthis._eventParents = this._eventParents || {};\r\n\t\tthis._eventParents[Util.stamp(obj)] = obj;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeEventParent(obj: Evented): this\r\n\t// Removes an event parent, so it will stop receiving propagated events\r\n\tremoveEventParent: function (obj) {\r\n\t\tif (this._eventParents) {\r\n\t\t\tdelete this._eventParents[Util.stamp(obj)];\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\tfor (var id in this._eventParents) {\r\n\t\t\tthis._eventParents[id].fire(e.type, Util.extend({\r\n\t\t\t\tlayer: e.target,\r\n\t\t\t\tpropagatedFrom: e.target\r\n\t\t\t}, e), true);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// aliases; we should ditch those eventually\r\n\r\n// @method addEventListener(…): this\r\n// Alias to [`on(…)`](#evented-on)\r\nEvents.addEventListener = Events.on;\r\n\r\n// @method removeEventListener(…): this\r\n// Alias to [`off(…)`](#evented-off)\r\n\r\n// @method clearAllEventListeners(…): this\r\n// Alias to [`off()`](#evented-off)\r\nEvents.removeEventListener = Events.clearAllEventListeners = Events.off;\r\n\r\n// @method addOneTimeEventListener(…): this\r\n// Alias to [`once(…)`](#evented-once)\r\nEvents.addOneTimeEventListener = Events.once;\r\n\r\n// @method fireEvent(…): this\r\n// Alias to [`fire(…)`](#evented-fire)\r\nEvents.fireEvent = Events.fire;\r\n\r\n// @method hasEventListeners(…): Boolean\r\n// Alias to [`listens(…)`](#evented-listens)\r\nEvents.hasEventListeners = Events.listens;\r\n\r\nexport var Evented = Class.extend(Events);\r\n","import {isArray, formatNum} from '../core/Util';\r\n\r\n/*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n *\r\n * Note that `Point` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function Point(x, y, round) {\r\n\t// @property x: Number; The `x` coordinate of the point\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\t// @property y: Number; The `y` coordinate of the point\r\n\tthis.y = (round ? Math.round(y) : y);\r\n}\r\n\r\nvar trunc = Math.trunc || function (v) {\r\n\treturn v > 0 ? Math.floor(v) : Math.ceil(v);\r\n};\r\n\r\nPoint.prototype = {\r\n\r\n\t// @method clone(): Point\r\n\t// Returns a copy of the current point.\r\n\tclone: function () {\r\n\t\treturn new Point(this.x, this.y);\r\n\t},\r\n\r\n\t// @method add(otherPoint: Point): Point\r\n\t// Returns the result of addition of the current and the given points.\r\n\tadd: function (point) {\r\n\t\t// non-destructive, returns a new point\r\n\t\treturn this.clone()._add(toPoint(point));\r\n\t},\r\n\r\n\t_add: function (point) {\r\n\t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method subtract(otherPoint: Point): Point\r\n\t// Returns the result of subtraction of the given point from the current.\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(toPoint(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method divideBy(num: Number): Point\r\n\t// Returns the result of division of the current point by the given number.\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method multiplyBy(num: Number): Point\r\n\t// Returns the result of multiplication of the current point by the given number.\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method scaleBy(scale: Point): Point\r\n\t// Multiply each coordinate of the current point by each coordinate of\r\n\t// `scale`. In linear algebra terms, multiply the point by the\r\n\t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n\t// defined by `scale`.\r\n\tscaleBy: function (point) {\r\n\t\treturn new Point(this.x * point.x, this.y * point.y);\r\n\t},\r\n\r\n\t// @method unscaleBy(scale: Point): Point\r\n\t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n\t// each coordinate of `scale`.\r\n\tunscaleBy: function (point) {\r\n\t\treturn new Point(this.x / point.x, this.y / point.y);\r\n\t},\r\n\r\n\t// @method round(): Point\r\n\t// Returns a copy of the current point with rounded coordinates.\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method floor(): Point\r\n\t// Returns a copy of the current point with floored coordinates (rounded down).\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method ceil(): Point\r\n\t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n\tceil: function () {\r\n\t\treturn this.clone()._ceil();\r\n\t},\r\n\r\n\t_ceil: function () {\r\n\t\tthis.x = Math.ceil(this.x);\r\n\t\tthis.y = Math.ceil(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method trunc(): Point\r\n\t// Returns a copy of the current point with truncated coordinates (rounded towards zero).\r\n\ttrunc: function () {\r\n\t\treturn this.clone()._trunc();\r\n\t},\r\n\r\n\t_trunc: function () {\r\n\t\tthis.x = trunc(this.x);\r\n\t\tthis.y = trunc(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method distanceTo(otherPoint: Point): Number\r\n\t// Returns the cartesian distance between the current and the given points.\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t    y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\t// @method equals(otherPoint: Point): Boolean\r\n\t// Returns `true` if the given point has the same coordinates.\r\n\tequals: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t       point.y === this.y;\r\n\t},\r\n\r\n\t// @method contains(otherPoint: Point): Boolean\r\n\t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n\tcontains: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t       Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point for debugging purposes.\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t        formatNum(this.x) + ', ' +\r\n\t\t        formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\n// @factory L.point(x: Number, y: Number, round?: Boolean)\r\n// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Number[])\r\n// Expects an array of the form `[x, y]` instead.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Object)\r\n// Expects a plain object of the form `{x: Number, y: Number}` instead.\r\nexport function toPoint(x, y, round) {\r\n\tif (x instanceof Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (isArray(x)) {\r\n\t\treturn new Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n\t\treturn new Point(x.x, x.y);\r\n\t}\r\n\treturn new Point(x, y, round);\r\n}\r\n","import {Point, toPoint} from './Point';\r\n\r\n/*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n *\r\n * Note that `Bounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function Bounds(a, b) {\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n}\r\n\r\nBounds.prototype = {\r\n\t// @method extend(point: Point): this\r\n\t// Extends the bounds to contain the given point.\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: Bounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar min2, max2;\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tif (obj instanceof Point || typeof obj[0] === 'number' || 'x' in obj) {\r\n\t\t\tmin2 = max2 = toPoint(obj);\r\n\t\t} else {\r\n\t\t\tobj = toBounds(obj);\r\n\t\t\tmin2 = obj.min;\r\n\t\t\tmax2 = obj.max;\r\n\r\n\t\t\tif (!min2 || !max2) { return this; }\r\n\t\t}\r\n\r\n\t\t// @property min: Point\r\n\t\t// The top left corner of the rectangle.\r\n\t\t// @property max: Point\r\n\t\t// The bottom right corner of the rectangle.\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = min2.clone();\r\n\t\t\tthis.max = max2.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(min2.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(max2.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(min2.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(max2.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getCenter(round?: Boolean): Point\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function (round) {\r\n\t\treturn toPoint(\r\n\t\t        (this.min.x + this.max.x) / 2,\r\n\t\t        (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\t// @method getBottomLeft(): Point\r\n\t// Returns the bottom-left point of the bounds.\r\n\tgetBottomLeft: function () {\r\n\t\treturn toPoint(this.min.x, this.max.y);\r\n\t},\r\n\r\n\t// @method getTopRight(): Point\r\n\t// Returns the top-right point of the bounds.\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn toPoint(this.max.x, this.min.y);\r\n\t},\r\n\r\n\t// @method getTopLeft(): Point\r\n\t// Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)).\r\n\tgetTopLeft: function () {\r\n\t\treturn this.min; // left, top\r\n\t},\r\n\r\n\t// @method getBottomRight(): Point\r\n\t// Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)).\r\n\tgetBottomRight: function () {\r\n\t\treturn this.max; // right, bottom\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the size of the given bounds\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\t// @method contains(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\t// @alternative\r\n\t// @method contains(point: Point): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) {\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof Point) {\r\n\t\t\tobj = toPoint(obj);\r\n\t\t} else {\r\n\t\t\tobj = toBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t       (max.x <= this.max.x) &&\r\n\t\t       (min.y >= this.min.y) &&\r\n\t\t       (max.y <= this.max.y);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n\t// intersect if they have at least one point in common.\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n\t// overlap if their intersection is an area.\r\n\toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n\t\t    yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n\t\treturn xOverlaps && yOverlaps;\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t},\r\n\r\n\r\n\t// @method pad(bufferRatio: Number): Bounds\r\n\t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n\t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n\t// Negative values will retract the bounds.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar min = this.min,\r\n\t\tmax = this.max,\r\n\t\theightBuffer = Math.abs(min.x - max.x) * bufferRatio,\r\n\t\twidthBuffer = Math.abs(min.y - max.y) * bufferRatio;\r\n\r\n\r\n\t\treturn toBounds(\r\n\t\t\ttoPoint(min.x - heightBuffer, min.y - widthBuffer),\r\n\t\t\ttoPoint(max.x + heightBuffer, max.y + widthBuffer));\r\n\t},\r\n\r\n\r\n\t// @method equals(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle is equivalent to the given bounds.\r\n\tequals: function (bounds) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\treturn this.min.equals(bounds.getTopLeft()) &&\r\n\t\t\tthis.max.equals(bounds.getBottomRight());\r\n\t},\r\n};\r\n\r\n\r\n// @factory L.bounds(corner1: Point, corner2: Point)\r\n// Creates a Bounds object from two corners coordinate pairs.\r\n// @alternative\r\n// @factory L.bounds(points: Point[])\r\n// Creates a Bounds object from the given array of points.\r\nexport function toBounds(a, b) {\r\n\tif (!a || a instanceof Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new Bounds(a, b);\r\n}\r\n","import {LatLng, toLatLng} from './LatLng';\r\n\r\n/*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var corner1 = L.latLng(40.712, -74.227),\r\n * corner2 = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(corner1, corner2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n *\r\n * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.\r\n *\r\n * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!corner1) { return; }\r\n\r\n\tvar latlngs = corner2 ? [corner1, corner2] : corner1;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n}\r\n\r\nLatLngBounds.prototype = {\r\n\r\n\t// @method extend(latlng: LatLng): this\r\n\t// Extend the bounds to contain the given point\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: LatLngBounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof LatLng) {\r\n\t\t\tsw2 = obj;\r\n\t\t\tne2 = obj;\r\n\r\n\t\t} else if (obj instanceof LatLngBounds) {\r\n\t\t\tsw2 = obj._southWest;\r\n\t\t\tne2 = obj._northEast;\r\n\r\n\t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n\t\t} else {\r\n\t\t\treturn obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this;\r\n\t\t}\r\n\r\n\t\tif (!sw && !ne) {\r\n\t\t\tthis._southWest = new LatLng(sw2.lat, sw2.lng);\r\n\t\t\tthis._northEast = new LatLng(ne2.lat, ne2.lng);\r\n\t\t} else {\r\n\t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n\t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n\t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n\t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method pad(bufferRatio: Number): LatLngBounds\r\n\t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n\t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n\t// Negative values will retract the bounds.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new LatLngBounds(\r\n\t\t        new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t        new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function () {\r\n\t\treturn new LatLng(\r\n\t\t        (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t        (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\t// @method getSouthWest(): LatLng\r\n\t// Returns the south-west point of the bounds.\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\t// @method getNorthEast(): LatLng\r\n\t// Returns the north-east point of the bounds.\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\t// @method getNorthWest(): LatLng\r\n\t// Returns the north-west point of the bounds.\r\n\tgetNorthWest: function () {\r\n\t\treturn new LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\t// @method getSouthEast(): LatLng\r\n\t// Returns the south-east point of the bounds.\r\n\tgetSouthEast: function () {\r\n\t\treturn new LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\t// @method getWest(): Number\r\n\t// Returns the west longitude of the bounds\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\t// @method getSouth(): Number\r\n\t// Returns the south latitude of the bounds\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\t// @method getEast(): Number\r\n\t// Returns the east longitude of the bounds\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\t// @method getNorth(): Number\r\n\t// Returns the north latitude of the bounds\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\t// @method contains(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\r\n\t// @alternative\r\n\t// @method contains (latlng: LatLng): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) {\r\n\t\t\tobj = toLatLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = toLatLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n\tintersects: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n\toverlaps: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n\t\t    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n\t\treturn latOverlaps && lngOverlaps;\r\n\t},\r\n\r\n\t// @method toBBoxString(): String\r\n\t// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\t// @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.\r\n\tequals: function (bounds, maxMargin) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest(), maxMargin) &&\r\n\t\t       this._northEast.equals(bounds.getNorthEast(), maxMargin);\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n// TODO International date line?\r\n\r\n// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)\r\n// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.\r\n\r\n// @alternative\r\n// @factory L.latLngBounds(latlngs: LatLng[])\r\n// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).\r\nexport function toLatLngBounds(a, b) {\r\n\tif (a instanceof LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new LatLngBounds(a, b);\r\n}\r\n","import * as Util from '../core/Util';\r\nimport {Earth} from './crs/CRS.Earth';\r\nimport {toLatLngBounds} from './LatLngBounds';\r\n\r\n/* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n *\r\n * Note that `LatLng` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function LatLng(lat, lng, alt) {\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\t// @property lat: Number\r\n\t// Latitude in degrees\r\n\tthis.lat = +lat;\r\n\r\n\t// @property lng: Number\r\n\t// Longitude in degrees\r\n\tthis.lng = +lng;\r\n\r\n\t// @property alt: Number\r\n\t// Altitude in meters (optional)\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = +alt;\r\n\t}\r\n}\r\n\r\nLatLng.prototype = {\r\n\t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number.\r\n\tequals: function (obj, maxMargin) {\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = toLatLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t        Math.abs(this.lat - obj.lat),\r\n\t\t        Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point (for debugging purposes).\r\n\ttoString: function (precision) {\r\n\t\treturn 'LatLng(' +\r\n\t\t        Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t        Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// @method distanceTo(otherLatLng: LatLng): Number\r\n\t// Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines).\r\n\tdistanceTo: function (other) {\r\n\t\treturn Earth.distance(this, toLatLng(other));\r\n\t},\r\n\r\n\t// @method wrap(): LatLng\r\n\t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n\twrap: function () {\r\n\t\treturn Earth.wrapLatLng(this);\r\n\t},\r\n\r\n\t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n\t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.\r\n\ttoBounds: function (sizeInMeters) {\r\n\t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n\t\t    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n\t\treturn toLatLngBounds(\r\n\t\t        [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n\t\t        [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n\t},\r\n\r\n\tclone: function () {\r\n\t\treturn new LatLng(this.lat, this.lng, this.alt);\r\n\t}\r\n};\r\n\r\n\r\n\r\n// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Array): LatLng\r\n// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Object): LatLng\r\n// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\nexport function toLatLng(a, b, c) {\r\n\tif (a instanceof LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (Util.isArray(a) && typeof a[0] !== 'object') {\r\n\t\tif (a.length === 3) {\r\n\t\t\treturn new LatLng(a[0], a[1], a[2]);\r\n\t\t}\r\n\t\tif (a.length === 2) {\r\n\t\t\treturn new LatLng(a[0], a[1]);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new LatLng(a, b, c);\r\n}\r\n","\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {LatLng} from '../LatLng';\r\nimport {LatLngBounds} from '../LatLngBounds';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.Base\r\n * Object that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n *\r\n * Note that the CRS instances do not inherit from Leaflet's `Class` object,\r\n * and can't be instantiated. Also, new classes can't inherit from them,\r\n * and methods can't be added to them with the `include` function.\r\n */\r\n\r\nexport var CRS = {\r\n\t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n\t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n\tlatLngToPoint: function (latlng, zoom) {\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n\t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n\t// zoom into geographical coordinates.\r\n\tpointToLatLng: function (point, zoom) {\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t    untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng): Point\r\n\t// Projects geographical coordinates into coordinates in units accepted for\r\n\t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\t// @method unproject(point: Point): LatLng\r\n\t// Given a projected coordinate returns the corresponding LatLng.\r\n\t// The inverse of `project`.\r\n\tunproject: function (point) {\r\n\t\treturn this.projection.unproject(point);\r\n\t},\r\n\r\n\t// @method scale(zoom: Number): Number\r\n\t// Returns the scale used when transforming projected coordinates into\r\n\t// pixel coordinates for a particular zoom. For example, it returns\r\n\t// `256 * 2^zoom` for Mercator-based CRS.\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\t// @method zoom(scale: Number): Number\r\n\t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n\t// factor of `scale`.\r\n\tzoom: function (scale) {\r\n\t\treturn Math.log(scale / 256) / Math.LN2;\r\n\t},\r\n\r\n\t// @method getProjectedBounds(zoom: Number): Bounds\r\n\t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n\tgetProjectedBounds: function (zoom) {\r\n\t\tif (this.infinite) { return null; }\r\n\r\n\t\tvar b = this.projection.bounds,\r\n\t\t    s = this.scale(zoom),\r\n\t\t    min = this.transformation.transform(b.min, s),\r\n\t\t    max = this.transformation.transform(b.max, s);\r\n\r\n\t\treturn new Bounds(min, max);\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates.\r\n\r\n\t// @property code: String\r\n\t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n\t//\r\n\t// @property wrapLng: Number[]\r\n\t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n\t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n\t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n\t//\r\n\t// @property wrapLat: Number[]\r\n\t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n\t// wrapLng: [min, max],\r\n\t// wrapLat: [min, max],\r\n\r\n\t// @property infinite: Boolean\r\n\t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n\tinfinite: false,\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n\t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n\twrapLatLng: function (latlng) {\r\n\t\tvar lng = this.wrapLng ? Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n\t\t    lat = this.wrapLat ? Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n\t\t    alt = latlng.alt;\r\n\r\n\t\treturn new LatLng(lat, lng, alt);\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring\r\n\t// that its center is within the CRS's bounds.\r\n\t// Only accepts actual `L.LatLngBounds` instances, not arrays.\r\n\twrapLatLngBounds: function (bounds) {\r\n\t\tvar center = bounds.getCenter(),\r\n\t\t    newCenter = this.wrapLatLng(center),\r\n\t\t    latShift = center.lat - newCenter.lat,\r\n\t\t    lngShift = center.lng - newCenter.lng;\r\n\r\n\t\tif (latShift === 0 && lngShift === 0) {\r\n\t\t\treturn bounds;\r\n\t\t}\r\n\r\n\t\tvar sw = bounds.getSouthWest(),\r\n\t\t    ne = bounds.getNorthEast(),\r\n\t\t    newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift),\r\n\t\t    newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift);\r\n\r\n\t\treturn new LatLngBounds(newSw, newNe);\r\n\t}\r\n};\r\n","import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\nvar earthRadius = 6378137;\r\n\r\nexport var SphericalMercator = {\r\n\r\n\tR: earthRadius,\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    sin = Math.sin(lat * d);\r\n\r\n\t\treturn new Point(\r\n\t\t\tthis.R * latlng.lng * d,\r\n\t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI;\r\n\r\n\t\treturn new LatLng(\r\n\t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n\t\t\tpoint.x * d / this.R);\r\n\t},\r\n\r\n\tbounds: (function () {\r\n\t\tvar d = earthRadius * Math.PI;\r\n\t\treturn new Bounds([-d, -d], [d, d]);\r\n\t})()\r\n};\r\n","import {CRS} from './CRS';\nimport * as Util from '../../core/Util';\n\n/*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\nexport var Earth = Util.extend({}, CRS, {\n\twrapLng: [-180, 180],\n\n\t// Mean Earth Radius, as recommended for use by\n\t// the International Union of Geodesy and Geophysics,\n\t// see https://rosettacode.org/wiki/Haversine_formula\n\tR: 6371000,\n\n\t// distance between two geographical points using spherical law of cosines approximation\n\tdistance: function (latlng1, latlng2) {\n\t\tvar rad = Math.PI / 180,\n\t\t    lat1 = latlng1.lat * rad,\n\t\t    lat2 = latlng2.lat * rad,\n\t\t    sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),\n\t\t    sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),\n\t\t    a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,\n\t\t    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\treturn this.R * c;\n\t}\n});\n","import {Point} from './Point';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = L.transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), //  L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); //  L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Creates a `Transformation` object with the given coefficients.\r\nexport function Transformation(a, b, c, d) {\r\n\tif (Util.isArray(a)) {\r\n\t\t// use array properties\r\n\t\tthis._a = a[0];\r\n\t\tthis._b = a[1];\r\n\t\tthis._c = a[2];\r\n\t\tthis._d = a[3];\r\n\t\treturn;\r\n\t}\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n}\r\n\r\nTransformation.prototype = {\r\n\t// @method transform(point: Point, scale?: Number): Point\r\n\t// Returns a transformed point, optionally multiplied by the given scale.\r\n\t// Only accepts actual `L.Point` instances, not arrays.\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\t// @method untransform(point: Point, scale?: Number): Point\r\n\t// Returns the reverse transformation of the given point, optionally divided\r\n\t// by the given scale. Only accepts actual `L.Point` instances, not arrays.\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new Point(\r\n\t\t        (point.x / scale - this._b) / this._a,\r\n\t\t        (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\r\n// factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n\r\n// @factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Instantiates a Transformation object with the given coefficients.\r\n\r\n// @alternative\r\n// @factory L.transformation(coefficients: Array): Transformation\r\n// Expects an coefficients array of the form\r\n// `[a: Number, b: Number, c: Number, d: Number]`.\r\n\r\nexport function toTransformation(a, b, c, d) {\r\n\treturn new Transformation(a, b, c, d);\r\n}\r\n","import {Earth} from './CRS.Earth';\r\nimport {SphericalMercator} from '../projection/Projection.SphericalMercator';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\nexport var EPSG3857 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:3857',\r\n\tprojection: SphericalMercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * SphericalMercator.R);\r\n\t\treturn toTransformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\r\nexport var EPSG900913 = Util.extend({}, EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n","import Browser from '../../core/Browser';\n\n// @namespace SVG; @section\n// There are several static functions which can be called without instantiating L.SVG:\n\n// @function create(name: String): SVGElement\n// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n// corresponding to the class name passed. For example, using 'line' will return\n// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\nexport function svgCreate(name) {\n\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n\n// @function pointsToPath(rings: Point[], closed: Boolean): String\n// Generates a SVG path string for multiple rings, with each ring turning\n// into \"M..L..L..\" instructions\nexport function pointsToPath(rings, closed) {\n\tvar str = '',\n\ti, j, len, len2, points, p;\n\n\tfor (i = 0, len = rings.length; i < len; i++) {\n\t\tpoints = rings[i];\n\n\t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n\t\t\tp = points[j];\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t}\n\n\t\t// closes the ring for polygons; \"x\" is VML syntax\n\t\tstr += closed ? (Browser.svg ? 'z' : 'x') : '';\n\t}\n\n\t// SVG complains about empty path strings\n\treturn str || 'M0 0';\n}\n\n\n\n\n","import * as Util from './Util';\r\nimport {svgCreate} from '../layer/vector/SVG.Util';\r\n\r\n/*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n *   alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\nvar style = document.documentElement.style;\r\n\r\n// @property ie: Boolean; `true` for all Internet Explorer versions (not Edge).\r\nvar ie = 'ActiveXObject' in window;\r\n\r\n// @property ielt9: Boolean; `true` for Internet Explorer versions less than 9.\r\nvar ielt9 = ie && !document.addEventListener;\r\n\r\n// @property edge: Boolean; `true` for the Edge web browser.\r\nvar edge = 'msLaunchUri' in navigator && !('documentMode' in document);\r\n\r\n// @property webkit: Boolean;\r\n// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\nvar webkit = userAgentContains('webkit');\r\n\r\n// @property android: Boolean\r\n// **Deprecated.** `true` for any browser running on an Android platform.\r\nvar android = userAgentContains('android');\r\n\r\n// @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3.\r\nvar android23 = userAgentContains('android 2') || userAgentContains('android 3');\r\n\r\n/* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */\r\nvar webkitVer = parseInt(/WebKit\\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit\r\n// @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome)\r\nvar androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);\r\n\r\n// @property opera: Boolean; `true` for the Opera browser\r\nvar opera = !!window.opera;\r\n\r\n// @property chrome: Boolean; `true` for the Chrome browser.\r\nvar chrome = !edge && userAgentContains('chrome');\r\n\r\n// @property gecko: Boolean; `true` for gecko-based browsers like Firefox.\r\nvar gecko = userAgentContains('gecko') && !webkit && !opera && !ie;\r\n\r\n// @property safari: Boolean; `true` for the Safari browser.\r\nvar safari = !chrome && userAgentContains('safari');\r\n\r\nvar phantom = userAgentContains('phantom');\r\n\r\n// @property opera12: Boolean\r\n// `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\nvar opera12 = 'OTransition' in style;\r\n\r\n// @property win: Boolean; `true` when the browser is running in a Windows platform\r\nvar win = navigator.platform.indexOf('Win') === 0;\r\n\r\n// @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms.\r\nvar ie3d = ie && ('transition' in style);\r\n\r\n// @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms.\r\nvar webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23;\r\n\r\n// @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms.\r\nvar gecko3d = 'MozPerspective' in style;\r\n\r\n// @property any3d: Boolean\r\n// `true` for all browsers supporting CSS transforms.\r\nvar any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom;\r\n\r\n// @property mobile: Boolean; `true` for all browsers running in a mobile device.\r\nvar mobile = typeof orientation !== 'undefined' || userAgentContains('mobile');\r\n\r\n// @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device.\r\nvar mobileWebkit = mobile && webkit;\r\n\r\n// @property mobileWebkit3d: Boolean\r\n// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\nvar mobileWebkit3d = mobile && webkit3d;\r\n\r\n// @property msPointer: Boolean\r\n// `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\nvar msPointer = !window.PointerEvent && window.MSPointerEvent;\r\n\r\n// @property pointer: Boolean\r\n// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\nvar pointer = !!(window.PointerEvent || msPointer);\r\n\r\n// @property touchNative: Boolean\r\n// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n// **This does not necessarily mean** that the browser is running in a computer with\r\n// a touchscreen, it only means that the browser is capable of understanding\r\n// touch events.\r\nvar touchNative = 'ontouchstart' in window || !!window.TouchEvent;\r\n\r\n// @property touch: Boolean\r\n// `true` for all browsers supporting either [touch](#browser-touch) or [pointer](#browser-pointer) events.\r\n// Note: pointer events will be preferred (if available), and processed for all `touch*` listeners.\r\nvar touch = !window.L_NO_TOUCH && (touchNative || pointer);\r\n\r\n// @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device.\r\nvar mobileOpera = mobile && opera;\r\n\r\n// @property mobileGecko: Boolean\r\n// `true` for gecko-based browsers running in a mobile device.\r\nvar mobileGecko = mobile && gecko;\r\n\r\n// @property retina: Boolean\r\n// `true` for browsers on a high-resolution \"retina\" screen or on any screen when browser's display zoom is more than 100%.\r\nvar retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;\r\n\r\n// @property passiveEvents: Boolean\r\n// `true` for browsers that support passive events.\r\nvar passiveEvents = (function () {\r\n\tvar supportsPassiveOption = false;\r\n\ttry {\r\n\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\tget: function () { // eslint-disable-line getter-return\r\n\t\t\t\tsupportsPassiveOption = true;\r\n\t\t\t}\r\n\t\t});\r\n\t\twindow.addEventListener('testPassiveEventSupport', Util.falseFn, opts);\r\n\t\twindow.removeEventListener('testPassiveEventSupport', Util.falseFn, opts);\r\n\t} catch (e) {\r\n\t\t// Errors can safely be ignored since this is only a browser support test.\r\n\t}\r\n\treturn supportsPassiveOption;\r\n}());\r\n\r\n// @property canvas: Boolean\r\n// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\r\nvar canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\n// @property svg: Boolean\r\n// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\r\nvar svg = !!(document.createElementNS && svgCreate('svg').createSVGRect);\r\n\r\nvar inlineSvg = !!svg && (function () {\r\n\tvar div = document.createElement('div');\r\n\tdiv.innerHTML = '<svg/>';\r\n\treturn (div.firstChild && div.firstChild.namespaceURI) === 'http://www.w3.org/2000/svg';\r\n})();\r\n\r\n// @property vml: Boolean\r\n// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\r\nvar vml = !svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\n\r\n// @property mac: Boolean; `true` when the browser is running in a Mac platform\r\nvar mac = navigator.platform.indexOf('Mac') === 0;\r\n\r\n// @property mac: Boolean; `true` when the browser is running in a Linux platform\r\nvar linux = navigator.platform.indexOf('Linux') === 0;\r\n\r\nfunction userAgentContains(str) {\r\n\treturn navigator.userAgent.toLowerCase().indexOf(str) >= 0;\r\n}\r\n\r\n\r\nexport default {\r\n\tie: ie,\r\n\tielt9: ielt9,\r\n\tedge: edge,\r\n\twebkit: webkit,\r\n\tandroid: android,\r\n\tandroid23: android23,\r\n\tandroidStock: androidStock,\r\n\topera: opera,\r\n\tchrome: chrome,\r\n\tgecko: gecko,\r\n\tsafari: safari,\r\n\tphantom: phantom,\r\n\topera12: opera12,\r\n\twin: win,\r\n\tie3d: ie3d,\r\n\twebkit3d: webkit3d,\r\n\tgecko3d: gecko3d,\r\n\tany3d: any3d,\r\n\tmobile: mobile,\r\n\tmobileWebkit: mobileWebkit,\r\n\tmobileWebkit3d: mobileWebkit3d,\r\n\tmsPointer: msPointer,\r\n\tpointer: pointer,\r\n\ttouch: touch,\r\n\ttouchNative: touchNative,\r\n\tmobileOpera: mobileOpera,\r\n\tmobileGecko: mobileGecko,\r\n\tretina: retina,\r\n\tpassiveEvents: passiveEvents,\r\n\tcanvas: canvas,\r\n\tsvg: svg,\r\n\tvml: vml,\r\n\tinlineSvg: inlineSvg,\r\n\tmac: mac,\r\n\tlinux: linux\r\n};\r\n","import * as DomEvent from './DomEvent';\nimport Browser from '../core/Browser';\nimport {falseFn} from '../core/Util';\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nvar POINTER_DOWN =   Browser.msPointer ? 'MSPointerDown'   : 'pointerdown';\nvar POINTER_MOVE =   Browser.msPointer ? 'MSPointerMove'   : 'pointermove';\nvar POINTER_UP =     Browser.msPointer ? 'MSPointerUp'     : 'pointerup';\nvar POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel';\nvar pEvent = {\n\ttouchstart  : POINTER_DOWN,\n\ttouchmove   : POINTER_MOVE,\n\ttouchend    : POINTER_UP,\n\ttouchcancel : POINTER_CANCEL\n};\nvar handle = {\n\ttouchstart  : _onPointerStart,\n\ttouchmove   : _handlePointer,\n\ttouchend    : _handlePointer,\n\ttouchcancel : _handlePointer\n};\nvar _pointers = {};\nvar _pointerDocListener = false;\n\n// Provides a touch events wrapper for (ms)pointer events.\n// ref https://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\nexport function addPointerListener(obj, type, handler) {\n\tif (type === 'touchstart') {\n\t\t_addPointerDocListener();\n\t}\n\tif (!handle[type]) {\n\t\tconsole.warn('wrong event specified:', type);\n\t\treturn falseFn;\n\t}\n\thandler = handle[type].bind(this, handler);\n\tobj.addEventListener(pEvent[type], handler, false);\n\treturn handler;\n}\n\nexport function removePointerListener(obj, type, handler) {\n\tif (!pEvent[type]) {\n\t\tconsole.warn('wrong event specified:', type);\n\t\treturn;\n\t}\n\tobj.removeEventListener(pEvent[type], handler, false);\n}\n\nfunction _globalPointerDown(e) {\n\t_pointers[e.pointerId] = e;\n}\n\nfunction _globalPointerMove(e) {\n\tif (_pointers[e.pointerId]) {\n\t\t_pointers[e.pointerId] = e;\n\t}\n}\n\nfunction _globalPointerUp(e) {\n\tdelete _pointers[e.pointerId];\n}\n\nfunction _addPointerDocListener() {\n\t// need to keep track of what pointers and how many are active to provide e.touches emulation\n\tif (!_pointerDocListener) {\n\t\t// we listen document as any drags that end by moving the touch off the screen get fired there\n\t\tdocument.addEventListener(POINTER_DOWN, _globalPointerDown, true);\n\t\tdocument.addEventListener(POINTER_MOVE, _globalPointerMove, true);\n\t\tdocument.addEventListener(POINTER_UP, _globalPointerUp, true);\n\t\tdocument.addEventListener(POINTER_CANCEL, _globalPointerUp, true);\n\n\t\t_pointerDocListener = true;\n\t}\n}\n\nfunction _handlePointer(handler, e) {\n\tif (e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { return; }\n\n\te.touches = [];\n\tfor (var i in _pointers) {\n\t\te.touches.push(_pointers[i]);\n\t}\n\te.changedTouches = [e];\n\n\thandler(e);\n}\n\nfunction _onPointerStart(handler, e) {\n\t// IE10 specific: MsTouch needs preventDefault. See #2000\n\tif (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) {\n\t\tDomEvent.preventDefault(e);\n\t}\n\t_handlePointer(handler, e);\n}\n","import * as DomEvent from './DomEvent';\r\nimport * as Util from '../core/Util';\r\nimport {Point} from '../geometry/Point';\r\nimport Browser from '../core/Browser';\r\n\r\n/*\r\n * @namespace DomUtil\r\n *\r\n * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)\r\n * tree, used by Leaflet internally.\r\n *\r\n * Most functions expecting or returning a `HTMLElement` also work for\r\n * SVG elements. The only difference is that classes refer to CSS classes\r\n * in HTML and SVG classes in SVG.\r\n */\r\n\r\n\r\n// @property TRANSFORM: String\r\n// Vendor-prefixed transform style name (e.g. `'webkitTransform'` for WebKit).\r\nexport var TRANSFORM = testProp(\r\n\t['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\n// @property TRANSITION: String\r\n// Vendor-prefixed transition style name.\r\nexport var TRANSITION = testProp(\r\n\t['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\n// @property TRANSITION_END: String\r\n// Vendor-prefixed transitionend event name.\r\nexport var TRANSITION_END =\r\n\tTRANSITION === 'webkitTransition' || TRANSITION === 'OTransition' ? TRANSITION + 'End' : 'transitionend';\r\n\r\n\r\n// @function get(id: String|HTMLElement): HTMLElement\r\n// Returns an element given its DOM id, or returns the element itself\r\n// if it was passed directly.\r\nexport function get(id) {\r\n\treturn typeof id === 'string' ? document.getElementById(id) : id;\r\n}\r\n\r\n// @function getStyle(el: HTMLElement, styleAttrib: String): String\r\n// Returns the value for a certain style attribute on an element,\r\n// including computed values or values set through CSS.\r\nexport function getStyle(el, style) {\r\n\tvar value = el.style[style] || (el.currentStyle && el.currentStyle[style]);\r\n\r\n\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\tvalue = css ? css[style] : null;\r\n\t}\r\n\treturn value === 'auto' ? null : value;\r\n}\r\n\r\n// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement\r\n// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.\r\nexport function create(tagName, className, container) {\r\n\tvar el = document.createElement(tagName);\r\n\tel.className = className || '';\r\n\r\n\tif (container) {\r\n\t\tcontainer.appendChild(el);\r\n\t}\r\n\treturn el;\r\n}\r\n\r\n// @function remove(el: HTMLElement)\r\n// Removes `el` from its parent element\r\nexport function remove(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent) {\r\n\t\tparent.removeChild(el);\r\n\t}\r\n}\r\n\r\n// @function empty(el: HTMLElement)\r\n// Removes all of `el`'s children elements from `el`\r\nexport function empty(el) {\r\n\twhile (el.firstChild) {\r\n\t\tel.removeChild(el.firstChild);\r\n\t}\r\n}\r\n\r\n// @function toFront(el: HTMLElement)\r\n// Makes `el` the last child of its parent, so it renders in front of the other children.\r\nexport function toFront(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent && parent.lastChild !== el) {\r\n\t\tparent.appendChild(el);\r\n\t}\r\n}\r\n\r\n// @function toBack(el: HTMLElement)\r\n// Makes `el` the first child of its parent, so it renders behind the other children.\r\nexport function toBack(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent && parent.firstChild !== el) {\r\n\t\tparent.insertBefore(el, parent.firstChild);\r\n\t}\r\n}\r\n\r\n// @function hasClass(el: HTMLElement, name: String): Boolean\r\n// Returns `true` if the element's class attribute contains `name`.\r\nexport function hasClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\treturn el.classList.contains(name);\r\n\t}\r\n\tvar className = getClass(el);\r\n\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n}\r\n\r\n// @function addClass(el: HTMLElement, name: String)\r\n// Adds `name` to the element's class attribute.\r\nexport function addClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\tvar classes = Util.splitWords(name);\r\n\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\tel.classList.add(classes[i]);\r\n\t\t}\r\n\t} else if (!hasClass(el, name)) {\r\n\t\tvar className = getClass(el);\r\n\t\tsetClass(el, (className ? className + ' ' : '') + name);\r\n\t}\r\n}\r\n\r\n// @function removeClass(el: HTMLElement, name: String)\r\n// Removes `name` from the element's class attribute.\r\nexport function removeClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\tel.classList.remove(name);\r\n\t} else {\r\n\t\tsetClass(el, Util.trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t}\r\n}\r\n\r\n// @function setClass(el: HTMLElement, name: String)\r\n// Sets the element's class.\r\nexport function setClass(el, name) {\r\n\tif (el.className.baseVal === undefined) {\r\n\t\tel.className = name;\r\n\t} else {\r\n\t\t// in case of SVG element\r\n\t\tel.className.baseVal = name;\r\n\t}\r\n}\r\n\r\n// @function getClass(el: HTMLElement): String\r\n// Returns the element's class.\r\nexport function getClass(el) {\r\n\t// Check if the element is an SVGElementInstance and use the correspondingElement instead\r\n\t// (Required for linked SVG elements in IE11.)\r\n\tif (el.correspondingElement) {\r\n\t\tel = el.correspondingElement;\r\n\t}\r\n\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n}\r\n\r\n// @function setOpacity(el: HTMLElement, opacity: Number)\r\n// Set the opacity of an element (including old IE support).\r\n// `opacity` must be a number from `0` to `1`.\r\nexport function setOpacity(el, value) {\r\n\tif ('opacity' in el.style) {\r\n\t\tel.style.opacity = value;\r\n\t} else if ('filter' in el.style) {\r\n\t\t_setOpacityIE(el, value);\r\n\t}\r\n}\r\n\r\nfunction _setOpacityIE(el, value) {\r\n\tvar filter = false,\r\n\t    filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\ttry {\r\n\t\tfilter = el.filters.item(filterName);\r\n\t} catch (e) {\r\n\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t// it isn't needed and breaks transparent pngs.\r\n\t\tif (value === 1) { return; }\r\n\t}\r\n\r\n\tvalue = Math.round(value * 100);\r\n\r\n\tif (filter) {\r\n\t\tfilter.Enabled = (value !== 100);\r\n\t\tfilter.Opacity = value;\r\n\t} else {\r\n\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t}\r\n}\r\n\r\n// @function testProp(props: String[]): String|false\r\n// Goes through the array of style names and returns the first name\r\n// that is a valid style name for an element. If no such name is found,\r\n// it returns false. Useful for vendor-prefixed styles like `transform`.\r\nexport function testProp(props) {\r\n\tvar style = document.documentElement.style;\r\n\r\n\tfor (var i = 0; i < props.length; i++) {\r\n\t\tif (props[i] in style) {\r\n\t\t\treturn props[i];\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)\r\n// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels\r\n// and optionally scaled by `scale`. Does not have an effect if the\r\n// browser doesn't support 3D CSS transforms.\r\nexport function setTransform(el, offset, scale) {\r\n\tvar pos = offset || new Point(0, 0);\r\n\r\n\tel.style[TRANSFORM] =\r\n\t\t(Browser.ie3d ?\r\n\t\t\t'translate(' + pos.x + 'px,' + pos.y + 'px)' :\r\n\t\t\t'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +\r\n\t\t(scale ? ' scale(' + scale + ')' : '');\r\n}\r\n\r\n// @function setPosition(el: HTMLElement, position: Point)\r\n// Sets the position of `el` to coordinates specified by `position`,\r\n// using CSS translate or top/left positioning depending on the browser\r\n// (used by Leaflet internally to position its layers).\r\nexport function setPosition(el, point) {\r\n\r\n\t/*eslint-disable */\r\n\tel._leaflet_pos = point;\r\n\t/* eslint-enable */\r\n\r\n\tif (Browser.any3d) {\r\n\t\tsetTransform(el, point);\r\n\t} else {\r\n\t\tel.style.left = point.x + 'px';\r\n\t\tel.style.top = point.y + 'px';\r\n\t}\r\n}\r\n\r\n// @function getPosition(el: HTMLElement): Point\r\n// Returns the coordinates of an element previously positioned with setPosition.\r\nexport function getPosition(el) {\r\n\t// this method is only used for elements previously positioned using setPosition,\r\n\t// so it's safe to cache the position for performance\r\n\r\n\treturn el._leaflet_pos || new Point(0, 0);\r\n}\r\n\r\n// @function disableTextSelection()\r\n// Prevents the user from generating `selectstart` DOM events, usually generated\r\n// when the user drags the mouse through a page with text. Used internally\r\n// by Leaflet to override the behaviour of any click-and-drag interaction on\r\n// the map. Affects drag interactions on the whole document.\r\n\r\n// @function enableTextSelection()\r\n// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).\r\nexport var disableTextSelection;\r\nexport var enableTextSelection;\r\nvar _userSelect;\r\nif ('onselectstart' in document) {\r\n\tdisableTextSelection = function () {\r\n\t\tDomEvent.on(window, 'selectstart', DomEvent.preventDefault);\r\n\t};\r\n\tenableTextSelection = function () {\r\n\t\tDomEvent.off(window, 'selectstart', DomEvent.preventDefault);\r\n\t};\r\n} else {\r\n\tvar userSelectProperty = testProp(\r\n\t\t['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n\tdisableTextSelection = function () {\r\n\t\tif (userSelectProperty) {\r\n\t\t\tvar style = document.documentElement.style;\r\n\t\t\t_userSelect = style[userSelectProperty];\r\n\t\t\tstyle[userSelectProperty] = 'none';\r\n\t\t}\r\n\t};\r\n\tenableTextSelection = function () {\r\n\t\tif (userSelectProperty) {\r\n\t\t\tdocument.documentElement.style[userSelectProperty] = _userSelect;\r\n\t\t\t_userSelect = undefined;\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// @function disableImageDrag()\r\n// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but\r\n// for `dragstart` DOM events, usually generated when the user drags an image.\r\nexport function disableImageDrag() {\r\n\tDomEvent.on(window, 'dragstart', DomEvent.preventDefault);\r\n}\r\n\r\n// @function enableImageDrag()\r\n// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).\r\nexport function enableImageDrag() {\r\n\tDomEvent.off(window, 'dragstart', DomEvent.preventDefault);\r\n}\r\n\r\nvar _outlineElement, _outlineStyle;\r\n// @function preventOutline(el: HTMLElement)\r\n// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)\r\n// of the element `el` invisible. Used internally by Leaflet to prevent\r\n// focusable elements from displaying an outline when the user performs a\r\n// drag interaction on them.\r\nexport function preventOutline(element) {\r\n\twhile (element.tabIndex === -1) {\r\n\t\telement = element.parentNode;\r\n\t}\r\n\tif (!element.style) { return; }\r\n\trestoreOutline();\r\n\t_outlineElement = element;\r\n\t_outlineStyle = element.style.outlineStyle;\r\n\telement.style.outlineStyle = 'none';\r\n\tDomEvent.on(window, 'keydown', restoreOutline);\r\n}\r\n\r\n// @function restoreOutline()\r\n// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().\r\nexport function restoreOutline() {\r\n\tif (!_outlineElement) { return; }\r\n\t_outlineElement.style.outlineStyle = _outlineStyle;\r\n\t_outlineElement = undefined;\r\n\t_outlineStyle = undefined;\r\n\tDomEvent.off(window, 'keydown', restoreOutline);\r\n}\r\n\r\n// @function getSizedParentNode(el: HTMLElement): HTMLElement\r\n// Finds the closest parent node which size (width and height) is not null.\r\nexport function getSizedParentNode(element) {\r\n\tdo {\r\n\t\telement = element.parentNode;\r\n\t} while ((!element.offsetWidth || !element.offsetHeight) && element !== document.body);\r\n\treturn element;\r\n}\r\n\r\n// @function getScale(el: HTMLElement): Object\r\n// Computes the CSS scale currently applied on the element.\r\n// Returns an object with `x` and `y` members as horizontal and vertical scales respectively,\r\n// and `boundingClientRect` as the result of [`getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).\r\nexport function getScale(element) {\r\n\tvar rect = element.getBoundingClientRect(); // Read-only in old browsers.\r\n\r\n\treturn {\r\n\t\tx: rect.width / element.offsetWidth || 1,\r\n\t\ty: rect.height / element.offsetHeight || 1,\r\n\t\tboundingClientRect: rect\r\n\t};\r\n}\r\n","import {Point} from '../geometry/Point';\r\nimport * as Util from '../core/Util';\r\nimport Browser from '../core/Browser';\r\nimport {addPointerListener, removePointerListener} from './DomEvent.Pointer';\r\nimport {addDoubleTapListener, removeDoubleTapListener} from './DomEvent.DoubleTap';\r\nimport {getScale} from './DomUtil';\r\n\r\n/*\r\n * @namespace DomEvent\r\n * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.\r\n */\r\n\r\n// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.\r\n\r\n// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n// Adds a listener function (`fn`) to a particular DOM event type of the\r\n// element `el`. You can optionally specify the context of the listener\r\n// (object the `this` keyword will point to). You can also pass several\r\n// space-separated types (e.g. `'click dblclick'`).\r\n\r\n// @alternative\r\n// @function on(el: HTMLElement, eventMap: Object, context?: Object): this\r\n// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\nexport function on(obj, types, fn, context) {\r\n\r\n\tif (types && typeof types === 'object') {\r\n\t\tfor (var type in types) {\r\n\t\t\taddOne(obj, type, types[type], fn);\r\n\t\t}\r\n\t} else {\r\n\t\ttypes = Util.splitWords(types);\r\n\r\n\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\taddOne(obj, types[i], fn, context);\r\n\t\t}\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\n// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n// Removes a previously added listener function.\r\n// Note that if you passed a custom context to on, you must pass the same\r\n// context to `off` in order to remove the listener.\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement, eventMap: Object, context?: Object): this\r\n// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement, types: String): this\r\n// Removes all previously added listeners of given types.\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement): this\r\n// Removes all previously added listeners from given HTMLElement\r\nexport function off(obj, types, fn, context) {\r\n\r\n\tif (arguments.length === 1) {\r\n\t\tbatchRemove(obj);\r\n\t\tdelete obj[eventsKey];\r\n\r\n\t} else if (types && typeof types === 'object') {\r\n\t\tfor (var type in types) {\r\n\t\t\tremoveOne(obj, type, types[type], fn);\r\n\t\t}\r\n\r\n\t} else {\r\n\t\ttypes = Util.splitWords(types);\r\n\r\n\t\tif (arguments.length === 2) {\r\n\t\t\tbatchRemove(obj, function (type) {\r\n\t\t\t\treturn Util.indexOf(types, type) !== -1;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tremoveOne(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\nfunction batchRemove(obj, filterFn) {\r\n\tfor (var id in obj[eventsKey]) {\r\n\t\tvar type = id.split(/\\d/)[0];\r\n\t\tif (!filterFn || filterFn(type)) {\r\n\t\t\tremoveOne(obj, type, null, null, id);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvar mouseSubst = {\r\n\tmouseenter: 'mouseover',\r\n\tmouseleave: 'mouseout',\r\n\twheel: !('onwheel' in window) && 'mousewheel'\r\n};\r\n\r\nfunction addOne(obj, type, fn, context) {\r\n\tvar id = type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : '');\r\n\r\n\tif (obj[eventsKey] && obj[eventsKey][id]) { return this; }\r\n\r\n\tvar handler = function (e) {\r\n\t\treturn fn.call(context || obj, e || window.event);\r\n\t};\r\n\r\n\tvar originalHandler = handler;\r\n\r\n\tif (!Browser.touchNative && Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t// Needs DomEvent.Pointer.js\r\n\t\thandler = addPointerListener(obj, type, handler);\r\n\r\n\t} else if (Browser.touch && (type === 'dblclick')) {\r\n\t\thandler = addDoubleTapListener(obj, handler);\r\n\r\n\t} else if ('addEventListener' in obj) {\r\n\r\n\t\tif (type === 'touchstart' || type === 'touchmove' || type === 'wheel' ||  type === 'mousewheel') {\r\n\t\t\tobj.addEventListener(mouseSubst[type] || type, handler, Browser.passiveEvents ? {passive: false} : false);\r\n\r\n\t\t} else if (type === 'mouseenter' || type === 'mouseleave') {\r\n\t\t\thandler = function (e) {\r\n\t\t\t\te = e || window.event;\r\n\t\t\t\tif (isExternalTarget(obj, e)) {\r\n\t\t\t\t\toriginalHandler(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tobj.addEventListener(mouseSubst[type], handler, false);\r\n\r\n\t\t} else {\r\n\t\t\tobj.addEventListener(type, originalHandler, false);\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tobj.attachEvent('on' + type, handler);\r\n\t}\r\n\r\n\tobj[eventsKey] = obj[eventsKey] || {};\r\n\tobj[eventsKey][id] = handler;\r\n}\r\n\r\nfunction removeOne(obj, type, fn, context, id) {\r\n\tid = id || type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : '');\r\n\tvar handler = obj[eventsKey] && obj[eventsKey][id];\r\n\r\n\tif (!handler) { return this; }\r\n\r\n\tif (!Browser.touchNative && Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\tremovePointerListener(obj, type, handler);\r\n\r\n\t} else if (Browser.touch && (type === 'dblclick')) {\r\n\t\tremoveDoubleTapListener(obj, handler);\r\n\r\n\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\tobj.removeEventListener(mouseSubst[type] || type, handler, false);\r\n\r\n\t} else {\r\n\t\tobj.detachEvent('on' + type, handler);\r\n\t}\r\n\r\n\tobj[eventsKey][id] = null;\r\n}\r\n\r\n// @function stopPropagation(ev: DOMEvent): this\r\n// Stop the given event from propagation to parent elements. Used inside the listener functions:\r\n// ```js\r\n// L.DomEvent.on(div, 'click', function (ev) {\r\n// \tL.DomEvent.stopPropagation(ev);\r\n// });\r\n// ```\r\nexport function stopPropagation(e) {\r\n\r\n\tif (e.stopPropagation) {\r\n\t\te.stopPropagation();\r\n\t} else if (e.originalEvent) {  // In case of Leaflet event.\r\n\t\te.originalEvent._stopped = true;\r\n\t} else {\r\n\t\te.cancelBubble = true;\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\n// @function disableScrollPropagation(el: HTMLElement): this\r\n// Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants).\r\nexport function disableScrollPropagation(el) {\r\n\taddOne(el, 'wheel', stopPropagation);\r\n\treturn this;\r\n}\r\n\r\n// @function disableClickPropagation(el: HTMLElement): this\r\n// Adds `stopPropagation` to the element's `'click'`, `'dblclick'`, `'contextmenu'`,\r\n// `'mousedown'` and `'touchstart'` events (plus browser variants).\r\nexport function disableClickPropagation(el) {\r\n\ton(el, 'mousedown touchstart dblclick contextmenu', stopPropagation);\r\n\tel['_leaflet_disable_click'] = true;\r\n\treturn this;\r\n}\r\n\r\n// @function preventDefault(ev: DOMEvent): this\r\n// Prevents the default action of the DOM Event `ev` from happening (such as\r\n// following a link in the href of the a element, or doing a POST request\r\n// with page reload when a `<form>` is submitted).\r\n// Use it inside listener functions.\r\nexport function preventDefault(e) {\r\n\tif (e.preventDefault) {\r\n\t\te.preventDefault();\r\n\t} else {\r\n\t\te.returnValue = false;\r\n\t}\r\n\treturn this;\r\n}\r\n\r\n// @function stop(ev: DOMEvent): this\r\n// Does `stopPropagation` and `preventDefault` at the same time.\r\nexport function stop(e) {\r\n\tpreventDefault(e);\r\n\tstopPropagation(e);\r\n\treturn this;\r\n}\r\n\r\n// @function getPropagationPath(ev: DOMEvent): Array\r\n// Compatibility polyfill for [`Event.composedPath()`](https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath).\r\n// Returns an array containing the `HTMLElement`s that the given DOM event\r\n// should propagate to (if not stopped).\r\nexport function getPropagationPath(ev) {\r\n\tif (ev.composedPath) {\r\n\t\treturn ev.composedPath();\r\n\t}\r\n\r\n\tvar path = [];\r\n\tvar el = ev.target;\r\n\r\n\twhile (el) {\r\n\t\tpath.push(el);\r\n\t\tel = el.parentNode;\r\n\t}\r\n\treturn path;\r\n}\r\n\r\n\r\n// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point\r\n// Gets normalized mouse position from a DOM event relative to the\r\n// `container` (border excluded) or to the whole page if not specified.\r\nexport function getMousePosition(e, container) {\r\n\tif (!container) {\r\n\t\treturn new Point(e.clientX, e.clientY);\r\n\t}\r\n\r\n\tvar scale = getScale(container),\r\n\t    offset = scale.boundingClientRect; // left and top  values are in page scale (like the event clientX/Y)\r\n\r\n\treturn new Point(\r\n\t\t// offset.left/top values are in page scale (like clientX/Y),\r\n\t\t// whereas clientLeft/Top (border width) values are the original values (before CSS scale applies).\r\n\t\t(e.clientX - offset.left) / scale.x - container.clientLeft,\r\n\t\t(e.clientY - offset.top) / scale.y - container.clientTop\r\n\t);\r\n}\r\n\r\n\r\n//  except , Safari and\r\n// We need double the scroll pixels (see #7403 and #4538) for all Browsers\r\n// except OSX (Mac) -> 3x, Chrome running on Linux 1x\r\n\r\nvar wheelPxFactor =\r\n\t(Browser.linux && Browser.chrome) ? window.devicePixelRatio :\r\n\tBrowser.mac ? window.devicePixelRatio * 3 :\r\n\twindow.devicePixelRatio > 0 ? 2 * window.devicePixelRatio : 1;\r\n// @function getWheelDelta(ev: DOMEvent): Number\r\n// Gets normalized wheel delta from a wheel DOM event, in vertical\r\n// pixels scrolled (negative if scrolling down).\r\n// Events from pointing devices without precise scrolling are mapped to\r\n// a best guess of 60 pixels.\r\nexport function getWheelDelta(e) {\r\n\treturn (Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta\r\n\t       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / wheelPxFactor : // Pixels\r\n\t       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines\r\n\t       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages\r\n\t       (e.deltaX || e.deltaZ) ? 0 :\t// Skip horizontal/depth wheel events\r\n\t       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels\r\n\t       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines\r\n\t       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages\r\n\t       0;\r\n}\r\n\r\n// check if element really left/entered the event target (for mouseenter/mouseleave)\r\nexport function isExternalTarget(el, e) {\r\n\r\n\tvar related = e.relatedTarget;\r\n\r\n\tif (!related) { return true; }\r\n\r\n\ttry {\r\n\t\twhile (related && (related !== el)) {\r\n\t\t\trelated = related.parentNode;\r\n\t\t}\r\n\t} catch (err) {\r\n\t\treturn false;\r\n\t}\r\n\treturn (related !== el);\r\n}\r\n\r\n// @function addListener(…): this\r\n// Alias to [`L.DomEvent.on`](#domevent-on)\r\nexport {on as addListener};\r\n\r\n// @function removeListener(…): this\r\n// Alias to [`L.DomEvent.off`](#domevent-off)\r\nexport {off as removeListener};\r\n","import * as DomEvent from './DomEvent';\r\n\r\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n *\r\n * Note: currently most browsers fire native dblclick, with only a few exceptions\r\n * (see https://github.com/Leaflet/Leaflet/issues/7012#issuecomment-595087386)\r\n */\r\n\r\nfunction makeDblclick(event) {\r\n\t// in modern browsers `type` cannot be just overridden:\r\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only\r\n\tvar newEvent = {},\r\n\t    prop, i;\r\n\tfor (i in event) {\r\n\t\tprop = event[i];\r\n\t\tnewEvent[i] = prop && prop.bind ? prop.bind(event) : prop;\r\n\t}\r\n\tevent = newEvent;\r\n\tnewEvent.type = 'dblclick';\r\n\tnewEvent.detail = 2;\r\n\tnewEvent.isTrusted = false;\r\n\tnewEvent._simulated = true; // for debug purposes\r\n\treturn newEvent;\r\n}\r\n\r\nvar delay = 200;\r\nexport function addDoubleTapListener(obj, handler) {\r\n\t// Most browsers handle double tap natively\r\n\tobj.addEventListener('dblclick', handler);\r\n\r\n\t// On some platforms the browser doesn't fire native dblclicks for touch events.\r\n\t// It seems that in all such cases `detail` property of `click` event is always `1`.\r\n\t// So here we rely on that fact to avoid excessive 'dblclick' simulation when not needed.\r\n\tvar last = 0,\r\n\t    detail;\r\n\tfunction simDblclick(e) {\r\n\t\tif (e.detail !== 1) {\r\n\t\t\tdetail = e.detail; // keep in sync to avoid false dblclick in some cases\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (e.pointerType === 'mouse' ||\r\n\t\t\t(e.sourceCapabilities && !e.sourceCapabilities.firesTouchEvents)) {\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// When clicking on an <input>, the browser generates a click on its\r\n\t\t// <label> (and vice versa) triggering two clicks in quick succession.\r\n\t\t// This ignores clicks on elements which are a label with a 'for'\r\n\t\t// attribute (or children of such a label), but not children of\r\n\t\t// a <input>.\r\n\t\tvar path = DomEvent.getPropagationPath(e);\r\n\t\tif (path.some(function (el) {\r\n\t\t\treturn el instanceof HTMLLabelElement && el.attributes.for;\r\n\t\t}) &&\r\n\t\t\t!path.some(function (el) {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tel instanceof HTMLInputElement ||\r\n\t\t\t\t\tel instanceof HTMLSelectElement\r\n\t\t\t\t);\r\n\t\t\t})\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar now = Date.now();\r\n\t\tif (now - last <= delay) {\r\n\t\t\tdetail++;\r\n\t\t\tif (detail === 2) {\r\n\t\t\t\thandler(makeDblclick(e));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdetail = 1;\r\n\t\t}\r\n\t\tlast = now;\r\n\t}\r\n\r\n\tobj.addEventListener('click', simDblclick);\r\n\r\n\treturn {\r\n\t\tdblclick: handler,\r\n\t\tsimDblclick: simDblclick\r\n\t};\r\n}\r\n\r\nexport function removeDoubleTapListener(obj, handlers) {\r\n\tobj.removeEventListener('dblclick', handlers.dblclick);\r\n\tobj.removeEventListener('click', handlers.simDblclick);\r\n}\r\n","import * as Util from '../core/Util';\nimport {Evented} from '../core/Events';\nimport * as DomUtil from '../dom/DomUtil';\n\n\n/*\n * @class PosAnimation\n * @aka L.PosAnimation\n * @inherits Evented\n * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.\n *\n * @example\n * ```js\n * var myPositionMarker = L.marker([48.864716, 2.294694]).addTo(map);\n *\n * myPositionMarker.on(\"click\", function() {\n * \tvar pos = map.latLngToLayerPoint(myPositionMarker.getLatLng());\n * \tpos.y -= 25;\n * \tvar fx = new L.PosAnimation();\n *\n * \tfx.once('end',function() {\n * \t\tpos.y += 25;\n * \t\tfx.run(myPositionMarker._icon, pos, 0.8);\n * \t});\n *\n * \tfx.run(myPositionMarker._icon, pos, 0.3);\n * });\n *\n * ```\n *\n * @constructor L.PosAnimation()\n * Creates a `PosAnimation` object.\n *\n */\n\nexport var PosAnimation = Evented.extend({\n\n\t// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)\n\t// Run an animation of a given element to a new position, optionally setting\n\t// duration in seconds (`0.25` by default) and easing linearity factor (3rd\n\t// argument of the [cubic bezier curve](https://cubic-bezier.com/#0,0,.5,1),\n\t// `0.5` by default).\n\trun: function (el, newPos, duration, easeLinearity) {\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\t// @event start: Event\n\t\t// Fired when the animation starts\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\t// @method stop()\n\t// Stops the animation (if currently running).\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step(true);\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function (round) {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t    duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration), round);\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress, round) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tif (round) {\n\t\t\tpos._round();\n\t\t}\n\t\tDomUtil.setPosition(this._el, pos);\n\n\t\t// @event step: Event\n\t\t// Fired continuously during the animation.\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tUtil.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\t// @event end: Event\n\t\t// Fired when the animation ends.\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n","import * as Util from '../core/Util';\r\nimport {Evented} from '../core/Events';\r\nimport {EPSG3857} from '../geo/crs/CRS.EPSG3857';\r\nimport {Point, toPoint} from '../geometry/Point';\r\nimport {Bounds, toBounds} from '../geometry/Bounds';\r\nimport {LatLng, toLatLng} from '../geo/LatLng';\r\nimport {LatLngBounds, toLatLngBounds} from '../geo/LatLngBounds';\r\nimport Browser from '../core/Browser';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport {PosAnimation} from '../dom/PosAnimation';\r\n\r\n/*\r\n * @class Map\r\n * @aka L.Map\r\n * @inherits Evented\r\n *\r\n * The central class of the API — it is used to create a map on a page and manipulate it.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * // initialize the map on the \"map\" div with a given center and zoom\r\n * var map = L.map('map', {\r\n * \tcenter: [51.505, -0.09],\r\n * \tzoom: 13\r\n * });\r\n * ```\r\n *\r\n */\r\n\r\nexport var Map = Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section Map State Options\r\n\t\t// @option crs: CRS = L.CRS.EPSG3857\r\n\t\t// The [Coordinate Reference System](#crs) to use. Don't change this if you're not\r\n\t\t// sure what it means.\r\n\t\tcrs: EPSG3857,\r\n\r\n\t\t// @option center: LatLng = undefined\r\n\t\t// Initial geographic center of the map\r\n\t\tcenter: undefined,\r\n\r\n\t\t// @option zoom: Number = undefined\r\n\t\t// Initial map zoom level\r\n\t\tzoom: undefined,\r\n\r\n\t\t// @option minZoom: Number = *\r\n\t\t// Minimum zoom level of the map.\r\n\t\t// If not specified and at least one `GridLayer` or `TileLayer` is in the map,\r\n\t\t// the lowest of their `minZoom` options will be used instead.\r\n\t\tminZoom: undefined,\r\n\r\n\t\t// @option maxZoom: Number = *\r\n\t\t// Maximum zoom level of the map.\r\n\t\t// If not specified and at least one `GridLayer` or `TileLayer` is in the map,\r\n\t\t// the highest of their `maxZoom` options will be used instead.\r\n\t\tmaxZoom: undefined,\r\n\r\n\t\t// @option layers: Layer[] = []\r\n\t\t// Array of layers that will be added to the map initially\r\n\t\tlayers: [],\r\n\r\n\t\t// @option maxBounds: LatLngBounds = null\r\n\t\t// When this option is set, the map restricts the view to the given\r\n\t\t// geographical bounds, bouncing the user back if the user tries to pan\r\n\t\t// outside the view. To set the restriction dynamically, use\r\n\t\t// [`setMaxBounds`](#map-setmaxbounds) method.\r\n\t\tmaxBounds: undefined,\r\n\r\n\t\t// @option renderer: Renderer = *\r\n\t\t// The default method for drawing vector layers on the map. `L.SVG`\r\n\t\t// or `L.Canvas` by default depending on browser support.\r\n\t\trenderer: undefined,\r\n\r\n\r\n\t\t// @section Animation Options\r\n\t\t// @option zoomAnimation: Boolean = true\r\n\t\t// Whether the map zoom animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tzoomAnimation: true,\r\n\r\n\t\t// @option zoomAnimationThreshold: Number = 4\r\n\t\t// Won't animate zoom if the zoom difference exceeds this value.\r\n\t\tzoomAnimationThreshold: 4,\r\n\r\n\t\t// @option fadeAnimation: Boolean = true\r\n\t\t// Whether the tile fade animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tfadeAnimation: true,\r\n\r\n\t\t// @option markerZoomAnimation: Boolean = true\r\n\t\t// Whether markers animate their zoom with the zoom animation, if disabled\r\n\t\t// they will disappear for the length of the animation. By default it's\r\n\t\t// enabled in all browsers that support CSS3 Transitions except Android.\r\n\t\tmarkerZoomAnimation: true,\r\n\r\n\t\t// @option transform3DLimit: Number = 2^23\r\n\t\t// Defines the maximum size of a CSS translation transform. The default\r\n\t\t// value should not be changed unless a web browser positions layers in\r\n\t\t// the wrong place after doing a large `panBy`.\r\n\t\ttransform3DLimit: 8388608, // Precision limit of a 32-bit float\r\n\r\n\t\t// @section Interaction Options\r\n\t\t// @option zoomSnap: Number = 1\r\n\t\t// Forces the map's zoom level to always be a multiple of this, particularly\r\n\t\t// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.\r\n\t\t// By default, the zoom level snaps to the nearest integer; lower values\r\n\t\t// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`\r\n\t\t// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.\r\n\t\tzoomSnap: 1,\r\n\r\n\t\t// @option zoomDelta: Number = 1\r\n\t\t// Controls how much the map's zoom level will change after a\r\n\t\t// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`\r\n\t\t// or `-` on the keyboard, or using the [zoom controls](#control-zoom).\r\n\t\t// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.\r\n\t\tzoomDelta: 1,\r\n\r\n\t\t// @option trackResize: Boolean = true\r\n\t\t// Whether the map automatically handles browser window resize to update itself.\r\n\t\ttrackResize: true\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = Util.setOptions(this, options);\r\n\r\n\t\t// Make sure to assign internal flags at the beginning,\r\n\t\t// to avoid inconsistent state in some edge cases.\r\n\t\tthis._handlers = [];\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._sizeChanged = true;\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = Util.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.zoom !== undefined) {\r\n\t\t\tthis._zoom = this._limitZoom(options.zoom);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(toLatLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\r\n\t\tthis._zoomAnimated = DomUtil.TRANSITION && Browser.any3d && !Browser.mobileOpera &&\r\n\t\t\t\tthis.options.zoomAnimation;\r\n\r\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\r\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tthis._createAnimProxy();\r\n\t\t\tDomEvent.on(this._proxy, DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\r\n\t\t}\r\n\r\n\t\tthis._addLayers(this.options.layers);\r\n\t},\r\n\r\n\r\n\t// @section Methods for modifying map state\r\n\r\n\t// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) with the given\r\n\t// animation options.\r\n\tsetView: function (center, zoom, options) {\r\n\r\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\r\n\t\tcenter = this._limitCenter(toLatLng(center), zoom, this.options.maxBounds);\r\n\t\toptions = options || {};\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tif (this._loaded && !options.reset && options !== true) {\r\n\r\n\t\t\tif (options.animate !== undefined) {\r\n\t\t\t\toptions.zoom = Util.extend({animate: options.animate}, options.zoom);\r\n\t\t\t\toptions.pan = Util.extend({animate: options.animate, duration: options.duration}, options.pan);\r\n\t\t\t}\r\n\r\n\t\t\t// try animating pan or zoom\r\n\t\t\tvar moved = (this._zoom !== zoom) ?\r\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\r\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\r\n\r\n\t\t\tif (moved) {\r\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// animation didn't start, just reset the map view\r\n\t\tthis._resetView(center, zoom, options.pan && options.pan.noMoveStart);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setZoom(zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the zoom of the map.\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = zoom;\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\t// @method zoomIn(delta?: Number, options?: Zoom options): this\r\n\t// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomIn: function (delta, options) {\r\n\t\tdelta = delta || (Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom + delta, options);\r\n\t},\r\n\r\n\t// @method zoomOut(delta?: Number, options?: Zoom options): this\r\n\t// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomOut: function (delta, options) {\r\n\t\tdelta = delta || (Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom - delta, options);\r\n\t},\r\n\r\n\t// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified geographical point on the map\r\n\t// stationary (e.g. used internally for scroll zoom and double-click zoom).\r\n\t// @alternative\r\n\t// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    containerPoint = latlng instanceof Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\t_getBoundsCenterZoom: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : toLatLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tif (zoom === Infinity) {\r\n\t\t\treturn {\r\n\t\t\t\tcenter: bounds.getCenter(),\r\n\t\t\t\tzoom: zoom\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t    swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t    nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom\r\n\t\t};\r\n\t},\r\n\r\n\t// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets a map view that contains the given geographical bounds with the\r\n\t// maximum zoom level possible.\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthrow new Error('Bounds are not valid.');\r\n\t\t}\r\n\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.setView(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method fitWorld(options?: fitBounds options): this\r\n\t// Sets a map view that mostly contains the whole world with the maximum\r\n\t// zoom level possible.\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\t// @method panTo(latlng: LatLng, options?: Pan options): this\r\n\t// Pans the map to a given center.\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\t// @method panBy(offset: Point, options?: Pan options): this\r\n\t// Pans the map by a given number of pixels (animated).\r\n\tpanBy: function (offset, options) {\r\n\t\toffset = toPoint(offset).round();\r\n\t\toptions = options || {};\r\n\r\n\t\tif (!offset.x && !offset.y) {\r\n\t\t\treturn this.fire('moveend');\r\n\t\t}\r\n\t\t// If we pan too far, Chrome gets issues with tiles\r\n\t\t// and makes them disappear or appear in the wrong place (slightly offset) #2602\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) {\r\n\t\t\tthis._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!this._panAnim) {\r\n\t\t\tthis._panAnim = new PosAnimation();\r\n\r\n\t\t\tthis._panAnim.on({\r\n\t\t\t\t'step': this._onPanTransitionStep,\r\n\t\t\t\t'end': this._onPanTransitionEnd\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\t// don't fire movestart if animating inertia\r\n\t\tif (!options.noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\r\n\t\t// animate pan unless animate: false specified\r\n\t\tif (options.animate !== false) {\r\n\t\t\tDomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\r\n\r\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset).round();\r\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\r\n\t\t} else {\r\n\t\t\tthis._rawPanBy(offset);\r\n\t\t\tthis.fire('move').fire('moveend');\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) performing a smooth\r\n\t// pan-zoom animation.\r\n\tflyTo: function (targetCenter, targetZoom, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tif (options.animate === false || !Browser.any3d) {\r\n\t\t\treturn this.setView(targetCenter, targetZoom, options);\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tvar from = this.project(this.getCenter()),\r\n\t\t    to = this.project(targetCenter),\r\n\t\t    size = this.getSize(),\r\n\t\t    startZoom = this._zoom;\r\n\r\n\t\ttargetCenter = toLatLng(targetCenter);\r\n\t\ttargetZoom = targetZoom === undefined ? startZoom : targetZoom;\r\n\r\n\t\tvar w0 = Math.max(size.x, size.y),\r\n\t\t    w1 = w0 * this.getZoomScale(startZoom, targetZoom),\r\n\t\t    u1 = (to.distanceTo(from)) || 1,\r\n\t\t    rho = 1.42,\r\n\t\t    rho2 = rho * rho;\r\n\r\n\t\tfunction r(i) {\r\n\t\t\tvar s1 = i ? -1 : 1,\r\n\t\t\t    s2 = i ? w1 : w0,\r\n\t\t\t    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,\r\n\t\t\t    b1 = 2 * s2 * rho2 * u1,\r\n\t\t\t    b = t1 / b1,\r\n\t\t\t    sq = Math.sqrt(b * b + 1) - b;\r\n\r\n\t\t\t    // workaround for floating point precision bug when sq = 0, log = -Infinite,\r\n\t\t\t    // thus triggering an infinite loop in flyTo\r\n\t\t\t    var log = sq < 0.000000001 ? -18 : Math.log(sq);\r\n\r\n\t\t\treturn log;\r\n\t\t}\r\n\r\n\t\tfunction sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\r\n\t\tfunction cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\r\n\t\tfunction tanh(n) { return sinh(n) / cosh(n); }\r\n\r\n\t\tvar r0 = r(0);\r\n\r\n\t\tfunction w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }\r\n\t\tfunction u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }\r\n\r\n\t\tfunction easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }\r\n\r\n\t\tvar start = Date.now(),\r\n\t\t    S = (r(1) - r0) / rho,\r\n\t\t    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;\r\n\r\n\t\tfunction frame() {\r\n\t\t\tvar t = (Date.now() - start) / duration,\r\n\t\t\t    s = easeOut(t) * S;\r\n\r\n\t\t\tif (t <= 1) {\r\n\t\t\t\tthis._flyToFrame = Util.requestAnimFrame(frame, this);\r\n\r\n\t\t\t\tthis._move(\r\n\t\t\t\t\tthis.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),\r\n\t\t\t\t\tthis.getScaleZoom(w0 / w(s), startZoom),\r\n\t\t\t\t\t{flyTo: true});\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis\r\n\t\t\t\t\t._move(targetCenter, targetZoom)\r\n\t\t\t\t\t._moveEnd(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._moveStart(true, options.noMoveStart);\r\n\r\n\t\tframe.call(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),\r\n\t// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).\r\n\tflyToBounds: function (bounds, options) {\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.flyTo(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method setMaxBounds(bounds: LatLngBounds): this\r\n\t// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (this.listens('moveend', this._panInsideMaxBounds)) {\r\n\t\t\tthis.off('moveend', this._panInsideMaxBounds);\r\n\t\t}\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthis.options.maxBounds = null;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds);\r\n\t},\r\n\r\n\t// @method setMinZoom(zoom: Number): this\r\n\t// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).\r\n\tsetMinZoom: function (zoom) {\r\n\t\tvar oldZoom = this.options.minZoom;\r\n\t\tthis.options.minZoom = zoom;\r\n\r\n\t\tif (this._loaded && oldZoom !== zoom) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\r\n\t\t\tif (this.getZoom() < this.options.minZoom) {\r\n\t\t\t\treturn this.setZoom(zoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setMaxZoom(zoom: Number): this\r\n\t// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).\r\n\tsetMaxZoom: function (zoom) {\r\n\t\tvar oldZoom = this.options.maxZoom;\r\n\t\tthis.options.maxZoom = zoom;\r\n\r\n\t\tif (this._loaded && oldZoom !== zoom) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\r\n\t\t\tif (this.getZoom() > this.options.maxZoom) {\r\n\t\t\t\treturn this.setZoom(zoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this\r\n\t// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tthis._enforcingBounds = true;\r\n\t\tvar center = this.getCenter(),\r\n\t\t    newCenter = this._limitCenter(center, this._zoom, toLatLngBounds(bounds));\r\n\r\n\t\tif (!center.equals(newCenter)) {\r\n\t\t\tthis.panTo(newCenter, options);\r\n\t\t}\r\n\r\n\t\tthis._enforcingBounds = false;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInside(latlng: LatLng, options?: padding options): this\r\n\t// Pans the map the minimum amount to make the `latlng` visible. Use\r\n\t// padding options to fit the display to more restricted bounds.\r\n\t// If `latlng` is already within the (optionally padded) display bounds,\r\n\t// the map will not be panned.\r\n\tpanInside: function (latlng, options) {\r\n\t\toptions = options || {};\r\n\r\n\t\tvar paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),\r\n\t\t    pixelCenter = this.project(this.getCenter()),\r\n\t\t    pixelPoint = this.project(latlng),\r\n\t\t    pixelBounds = this.getPixelBounds(),\r\n\t\t    paddedBounds = toBounds([pixelBounds.min.add(paddingTL), pixelBounds.max.subtract(paddingBR)]),\r\n\t\t    paddedSize = paddedBounds.getSize();\r\n\r\n\t\tif (!paddedBounds.contains(pixelPoint)) {\r\n\t\t\tthis._enforcingBounds = true;\r\n\t\t\tvar centerOffset = pixelPoint.subtract(paddedBounds.getCenter());\r\n\t\t\tvar offset = paddedBounds.extend(pixelPoint).getSize().subtract(paddedSize);\r\n\t\t\tpixelCenter.x += centerOffset.x < 0 ? -offset.x : offset.x;\r\n\t\t\tpixelCenter.y += centerOffset.y < 0 ? -offset.y : offset.y;\r\n\t\t\tthis.panTo(this.unproject(pixelCenter), options);\r\n\t\t\tthis._enforcingBounds = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invalidateSize(options: Zoom/pan options): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default. If `options.pan` is `false`, panning will not occur.\r\n\t// If `options.debounceMoveend` is `true`, it will delay `moveend` event so\r\n\t// that it doesn't happen often even if the method is called many\r\n\t// times in a row.\r\n\r\n\t// @alternative\r\n\t// @method invalidateSize(animate: Boolean): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default.\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = Util.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._lastCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t    oldCenter = oldSize.divideBy(2).round(),\r\n\t\t    newCenter = newSize.divideBy(2).round(),\r\n\t\t    offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(Util.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @section Map state change events\r\n\t\t// @event resize: ResizeEvent\r\n\t\t// Fired when the map is resized.\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// @section Methods for modifying map state\r\n\t// @method stop(): this\r\n\t// Stops the currently running `panTo` or `flyTo` animation, if any.\r\n\tstop: function () {\r\n\t\tthis.setZoom(this._limitZoom(this._zoom));\r\n\t\tif (!this.options.zoomSnap) {\r\n\t\t\tthis.fire('viewreset');\r\n\t\t}\r\n\t\treturn this._stop();\r\n\t},\r\n\r\n\t// @section Geolocation methods\r\n\t// @method locate(options?: Locate options): this\r\n\t// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)\r\n\t// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,\r\n\t// and optionally sets the map view to the user's location with respect to\r\n\t// detection accuracy (or to the world view if geolocation failed).\r\n\t// Note that, if your page doesn't use HTTPS, this method will fail in\r\n\t// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))\r\n\t// See `Locate options` for more details.\r\n\tlocate: function (options) {\r\n\r\n\t\toptions = this._locateOptions = Util.extend({\r\n\t\t\ttimeout: 10000,\r\n\t\t\twatch: false\r\n\t\t\t// setView: false\r\n\t\t\t// maxZoom: <Number>\r\n\t\t\t// maximumAge: 0\r\n\t\t\t// enableHighAccuracy: false\r\n\t\t}, options);\r\n\r\n\t\tif (!('geolocation' in navigator)) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = Util.bind(this._handleGeolocationResponse, this),\r\n\t\t    onError = Util.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t        navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method stopLocate(): this\r\n\t// Stops watching location previously initiated by `map.locate({watch: true})`\r\n\t// and aborts resetting the map view if map.locate was called with\r\n\t// `{setView: true}`.\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation && navigator.geolocation.clearWatch) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tif (!this._container._leaflet_id) { return; }\r\n\r\n\t\tvar c = error.code,\r\n\t\t    message = error.message ||\r\n\t\t            (c === 1 ? 'permission denied' :\r\n\t\t            (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\t// @section Location events\r\n\t\t// @event locationerror: ErrorEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method) failed.\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tif (!this._container._leaflet_id) { return; }\r\n\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t    lng = pos.coords.longitude,\r\n\t\t    latlng = new LatLng(lat, lng),\r\n\t\t    bounds = latlng.toBounds(pos.coords.accuracy * 2),\r\n\t\t    options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = this.getBoundsZoom(bounds);\r\n\t\t\tthis.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @event locationfound: LocationEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method)\r\n\t\t// went successfully.\r\n\t\tthis.fire('locationfound', data);\r\n\t},\r\n\r\n\t// TODO Appropriate docs section?\r\n\t// @section Other Methods\r\n\t// @method addHandler(name: String, HandlerClass: Function): this\r\n\t// Adds a new `Handler` to the map, given its name and constructor function.\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove(): this\r\n\t// Destroys the map and clears all related event listeners.\r\n\tremove: function () {\r\n\r\n\t\tthis._initEvents(true);\r\n\t\tif (this.options.maxBounds) { this.off('moveend', this._panInsideMaxBounds); }\r\n\r\n\t\tif (this._containerId !== this._container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is being reused by another instance');\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet_id;\r\n\t\t\tdelete this._containerId;\r\n\t\t} catch (e) {\r\n\t\t\t/*eslint-disable */\r\n\t\t\tthis._container._leaflet_id = undefined;\r\n\t\t\t/* eslint-enable */\r\n\t\t\tthis._containerId = undefined;\r\n\t\t}\r\n\r\n\t\tif (this._locationWatchId !== undefined) {\r\n\t\t\tthis.stopLocate();\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tDomUtil.remove(this._mapPane);\r\n\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\t\tif (this._resizeRequest) {\r\n\t\t\tUtil.cancelAnimFrame(this._resizeRequest);\r\n\t\t\tthis._resizeRequest = null;\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\t// @section Map state change events\r\n\t\t\t// @event unload: Event\r\n\t\t\t// Fired when the map is destroyed with [remove](#map-remove) method.\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tvar i;\r\n\t\tfor (i in this._layers) {\r\n\t\t\tthis._layers[i].remove();\r\n\t\t}\r\n\t\tfor (i in this._panes) {\r\n\t\t\tDomUtil.remove(this._panes[i]);\r\n\t\t}\r\n\r\n\t\tthis._layers = [];\r\n\t\tthis._panes = [];\r\n\t\tdelete this._mapPane;\r\n\t\tdelete this._renderer;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\t// @method createPane(name: String, container?: HTMLElement): HTMLElement\r\n\t// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,\r\n\t// then returns it. The pane is created as a child of `container`, or\r\n\t// as a child of the main map pane if not set.\r\n\tcreatePane: function (name, container) {\r\n\t\tvar className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),\r\n\t\t    pane = DomUtil.create('div', className, container || this._mapPane);\r\n\r\n\t\tif (name) {\r\n\t\t\tthis._panes[name] = pane;\r\n\t\t}\r\n\t\treturn pane;\r\n\t},\r\n\r\n\t// @section Methods for Getting Map State\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the geographical center of the map view\r\n\tgetCenter: function () {\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._lastCenter && !this._moved()) {\r\n\t\t\treturn this._lastCenter.clone();\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// @method getZoom(): Number\r\n\t// Returns the current zoom level of the map view\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the geographical bounds visible in the current map view\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t    sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t    ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\t// @method getMinZoom(): Number\r\n\t// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;\r\n\t},\r\n\r\n\t// @method getMaxZoom(): Number\r\n\t// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\t// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean, padding?: Point): Number\r\n\t// Returns the maximum zoom level on which the given bounds fit to the map\r\n\t// view in its entirety. If `inside` (optional) is set to `true`, the method\r\n\t// instead returns the minimum zoom level on which the map view fits into\r\n\t// the given bounds in its entirety.\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\t\tpadding = toPoint(padding || [0, 0]);\r\n\r\n\t\tvar zoom = this.getZoom() || 0,\r\n\t\t    min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    nw = bounds.getNorthWest(),\r\n\t\t    se = bounds.getSouthEast(),\r\n\t\t    size = this.getSize().subtract(padding),\r\n\t\t    boundsSize = toBounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),\r\n\t\t    snap = Browser.any3d ? this.options.zoomSnap : 1,\r\n\t\t    scalex = size.x / boundsSize.x,\r\n\t\t    scaley = size.y / boundsSize.y,\r\n\t\t    scale = inside ? Math.max(scalex, scaley) : Math.min(scalex, scaley);\r\n\r\n\t\tzoom = this.getScaleZoom(scale, zoom);\r\n\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level\r\n\t\t\tzoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;\r\n\t\t}\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the current size of the map container (in pixels).\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new Point(\r\n\t\t\t\tthis._container.clientWidth || 0,\r\n\t\t\t\tthis._container.clientHeight || 0);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\t// @method getPixelBounds(): Bounds\r\n\t// Returns the bounds of the current map view in projected pixel\r\n\t// coordinates (sometimes useful in layer and overlay implementations).\r\n\tgetPixelBounds: function (center, zoom) {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint(center, zoom);\r\n\t\treturn new Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\t// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to\r\n\t// the map pane? \"left point of the map layer\" can be confusing, specially\r\n\t// since there can be negative offsets.\r\n\t// @method getPixelOrigin(): Point\r\n\t// Returns the projected pixel coordinates of the top left point of\r\n\t// the map layer (useful in custom layer and overlay implementations).\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._pixelOrigin;\r\n\t},\r\n\r\n\t// @method getPixelWorldBounds(zoom?: Number): Bounds\r\n\t// Returns the world's bounds in pixel coordinates for zoom level `zoom`.\r\n\t// If `zoom` is omitted, the map's current zoom level is used.\r\n\tgetPixelWorldBounds: function (zoom) {\r\n\t\treturn this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method getPane(pane: String|HTMLElement): HTMLElement\r\n\t// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).\r\n\tgetPane: function (pane) {\r\n\t\treturn typeof pane === 'string' ? this._panes[pane] : pane;\r\n\t},\r\n\r\n\t// @method getPanes(): Object\r\n\t// Returns a plain object containing the names of all [panes](#map-pane) as keys and\r\n\t// the panes as values.\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTML element that contains the map.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// @section Conversion Methods\r\n\r\n\t// @method getZoomScale(toZoom: Number, fromZoom: Number): Number\r\n\t// Returns the scale factor to be applied to a map transition from zoom level\r\n\t// `fromZoom` to `toZoom`. Used internally to help with zoom animations.\r\n\tgetZoomScale: function (toZoom, fromZoom) {\r\n\t\t// TODO replace with universal implementation after refactoring projections\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\treturn crs.scale(toZoom) / crs.scale(fromZoom);\r\n\t},\r\n\r\n\t// @method getScaleZoom(scale: Number, fromZoom: Number): Number\r\n\t// Returns the zoom level that the map would end up at, if it is at `fromZoom`\r\n\t// level and everything is scaled by a factor of `scale`. Inverse of\r\n\t// [`getZoomScale`](#map-getZoomScale).\r\n\tgetScaleZoom: function (scale, fromZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\tvar zoom = crs.zoom(scale * crs.scale(fromZoom));\r\n\t\treturn isNaN(zoom) ? Infinity : zoom;\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng, zoom: Number): Point\r\n\t// Projects a geographical coordinate `LatLng` according to the projection\r\n\t// of the map's CRS, then scales it according to `zoom` and the CRS's\r\n\t// `Transformation`. The result is pixel coordinate relative to\r\n\t// the CRS origin.\r\n\tproject: function (latlng, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(toLatLng(latlng), zoom);\r\n\t},\r\n\r\n\t// @method unproject(point: Point, zoom: Number): LatLng\r\n\t// Inverse of [`project`](#map-project).\r\n\tunproject: function (point, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(toPoint(point), zoom);\r\n\t},\r\n\r\n\t// @method layerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding geographical coordinate (for the current zoom level).\r\n\tlayerPointToLatLng: function (point) {\r\n\t\tvar projectedPoint = toPoint(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\t// @method latLngToLayerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the [origin pixel](#map-getpixelorigin).\r\n\tlatLngToLayerPoint: function (latlng) {\r\n\t\tvar projectedPoint = this.project(toLatLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the\r\n\t// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the\r\n\t// CRS's bounds.\r\n\t// By default this means longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees.\r\n\twrapLatLng: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLng(toLatLng(latlng));\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring that\r\n\t// its center is within the CRS's bounds.\r\n\t// By default this means the center longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees, and the majority of the bounds\r\n\t// overlaps the CRS's bounds.\r\n\twrapLatLngBounds: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLngBounds(toLatLngBounds(latlng));\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates according to\r\n\t// the map's CRS. By default this measures distance in meters.\r\n\tdistance: function (latlng1, latlng2) {\r\n\t\treturn this.options.crs.distance(toLatLng(latlng1), toLatLng(latlng2));\r\n\t},\r\n\r\n\t// @method containerPointToLayerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns the corresponding\r\n\t// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn toPoint(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method layerPointToContainerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding pixel coordinate relative to the map container.\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn toPoint(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method containerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the map container, returns\r\n\t// the corresponding geographical coordinate (for the current zoom level).\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(toPoint(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\t// @method latLngToContainerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the map container.\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(toLatLng(latlng)));\r\n\t},\r\n\r\n\t// @method mouseEventToContainerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to the\r\n\t// map container where the event took place.\r\n\tmouseEventToContainerPoint: function (e) {\r\n\t\treturn DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\t// @method mouseEventToLayerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to\r\n\t// the [origin pixel](#map-getpixelorigin) where the event took place.\r\n\tmouseEventToLayerPoint: function (e) {\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\t// @method mouseEventToLatLng(ev: MouseEvent): LatLng\r\n\t// Given a MouseEvent object, returns geographical coordinate where the\r\n\t// event took place.\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tDomEvent.on(container, 'scroll', this._onScroll, this);\r\n\t\tthis._containerId = Util.stamp(container);\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tthis._fadeAnimated = this.options.fadeAnimation && Browser.any3d;\r\n\r\n\t\tDomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(Browser.safari ? ' leaflet-safari' : '') +\r\n\t\t\t(this._fadeAnimated ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed' && position !== 'sticky') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\t\tthis._paneRenderers = {};\r\n\r\n\t\t// @section\r\n\t\t//\r\n\t\t// Panes are DOM elements used to control the ordering of layers on the map. You\r\n\t\t// can access panes with [`map.getPane`](#map-getpane) or\r\n\t\t// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the\r\n\t\t// [`map.createPane`](#map-createpane) method.\r\n\t\t//\r\n\t\t// Every map has the following default panes that differ only in zIndex.\r\n\t\t//\r\n\t\t// @pane mapPane: HTMLElement = 'auto'\r\n\t\t// Pane that contains all other map panes\r\n\r\n\t\tthis._mapPane = this.createPane('mapPane', this._container);\r\n\t\tDomUtil.setPosition(this._mapPane, new Point(0, 0));\r\n\r\n\t\t// @pane tilePane: HTMLElement = 200\r\n\t\t// Pane for `GridLayer`s and `TileLayer`s\r\n\t\tthis.createPane('tilePane');\r\n\t\t// @pane overlayPane: HTMLElement = 400\r\n\t\t// Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s\r\n\t\tthis.createPane('overlayPane');\r\n\t\t// @pane shadowPane: HTMLElement = 500\r\n\t\t// Pane for overlay shadows (e.g. `Marker` shadows)\r\n\t\tthis.createPane('shadowPane');\r\n\t\t// @pane markerPane: HTMLElement = 600\r\n\t\t// Pane for `Icon`s of `Marker`s\r\n\t\tthis.createPane('markerPane');\r\n\t\t// @pane tooltipPane: HTMLElement = 650\r\n\t\t// Pane for `Tooltip`s.\r\n\t\tthis.createPane('tooltipPane');\r\n\t\t// @pane popupPane: HTMLElement = 700\r\n\t\t// Pane for `Popup`s.\r\n\t\tthis.createPane('popupPane');\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tDomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');\r\n\t\t\tDomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t// @section Map state change events\r\n\t_resetView: function (center, zoom, noMoveStart) {\r\n\t\tDomUtil.setPosition(this._mapPane, new Point(0, 0));\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\t\tzoom = this._limitZoom(zoom);\r\n\r\n\t\tthis.fire('viewprereset');\r\n\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\t\tthis\r\n\t\t\t._moveStart(zoomChanged, noMoveStart)\r\n\t\t\t._move(center, zoom)\r\n\t\t\t._moveEnd(zoomChanged);\r\n\r\n\t\t// @event viewreset: Event\r\n\t\t// Fired when the map needs to redraw its content (this usually happens\r\n\t\t// on map zoom or load). Very useful for creating custom overlays.\r\n\t\tthis.fire('viewreset');\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the map is initialized (when its center and zoom are set\r\n\t\t// for the first time).\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t}\r\n\t},\r\n\r\n\t_moveStart: function (zoomChanged, noMoveStart) {\r\n\t\t// @event zoomstart: Event\r\n\t\t// Fired when the map zoom is about to change (e.g. before zoom animation).\r\n\t\t// @event movestart: Event\r\n\t\t// Fired when the view of the map starts changing (e.g. user starts dragging the map).\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomstart');\r\n\t\t}\r\n\t\tif (!noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_move: function (center, zoom, data, supressEvent) {\r\n\t\tif (zoom === undefined) {\r\n\t\t\tzoom = this._zoom;\r\n\t\t}\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._lastCenter = center;\r\n\t\tthis._pixelOrigin = this._getNewPixelOrigin(center);\r\n\r\n\t\tif (!supressEvent) {\r\n\t\t\t// @event zoom: Event\r\n\t\t\t// Fired repeatedly during any change in zoom level,\r\n\t\t\t// including zoom and fly animations.\r\n\t\t\tif (zoomChanged || (data && data.pinch)) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\t\tthis.fire('zoom', data);\r\n\t\t\t}\r\n\r\n\t\t\t// @event move: Event\r\n\t\t\t// Fired repeatedly during any movement of the map,\r\n\t\t\t// including pan and fly animations.\r\n\t\t\tthis.fire('move', data);\r\n\t\t} else if (data && data.pinch) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\tthis.fire('zoom', data);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_moveEnd: function (zoomChanged) {\r\n\t\t// @event zoomend: Event\r\n\t\t// Fired when the map zoom changed, after any animations.\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\t// @event moveend: Event\r\n\t\t// Fired when the center of the map stops changing\r\n\t\t// (e.g. user stopped dragging the map or after non-centered zoom).\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t_stop: function () {\r\n\t\tUtil.cancelAnimFrame(this._flyToFrame);\r\n\t\tif (this._panAnim) {\r\n\t\t\tthis._panAnim.stop();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tDomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tif (!this._enforcingBounds) {\r\n\t\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// DOM event handling\r\n\r\n\t// @section Interaction events\r\n\t_initEvents: function (remove) {\r\n\t\tthis._targets = {};\r\n\t\tthis._targets[Util.stamp(this._container)] = this;\r\n\r\n\t\tvar onOff = remove ? DomEvent.off : DomEvent.on;\r\n\r\n\t\t// @event click: MouseEvent\r\n\t\t// Fired when the user clicks (or taps) the map.\r\n\t\t// @event dblclick: MouseEvent\r\n\t\t// Fired when the user double-clicks (or double-taps) the map.\r\n\t\t// @event mousedown: MouseEvent\r\n\t\t// Fired when the user pushes the mouse button on the map.\r\n\t\t// @event mouseup: MouseEvent\r\n\t\t// Fired when the user releases the mouse button on the map.\r\n\t\t// @event mouseover: MouseEvent\r\n\t\t// Fired when the mouse enters the map.\r\n\t\t// @event mouseout: MouseEvent\r\n\t\t// Fired when the mouse leaves the map.\r\n\t\t// @event mousemove: MouseEvent\r\n\t\t// Fired while the mouse moves over the map.\r\n\t\t// @event contextmenu: MouseEvent\r\n\t\t// Fired when the user pushes the right mouse button on the map, prevents\r\n\t\t// default browser context menu from showing if there are listeners on\r\n\t\t// this event. Also fired on mobile when the user holds a single touch\r\n\t\t// for a second (also called long press).\r\n\t\t// @event keypress: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard that produces a character value while the map is focused.\r\n\t\t// @event keydown: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard while the map is focused. Unlike the `keypress` event,\r\n\t\t// the `keydown` event is fired for keys that produce a character value and for keys\r\n\t\t// that do not produce a character value.\r\n\t\t// @event keyup: KeyboardEvent\r\n\t\t// Fired when the user releases a key from the keyboard while the map is focused.\r\n\t\tonOff(this._container, 'click dblclick mousedown mouseup ' +\r\n\t\t\t'mouseover mouseout mousemove contextmenu keypress keydown keyup', this._handleDOMEvent, this);\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tonOff(window, 'resize', this._onResize, this);\r\n\t\t}\r\n\r\n\t\tif (Browser.any3d && this.options.transform3DLimit) {\r\n\t\t\t(remove ? this.off : this.on).call(this, 'moveend', this._onMoveEnd);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tUtil.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = Util.requestAnimFrame(\r\n\t\t        function () { this.invalidateSize({debounceMoveend: true}); }, this);\r\n\t},\r\n\r\n\t_onScroll: function () {\r\n\t\tthis._container.scrollTop  = 0;\r\n\t\tthis._container.scrollLeft = 0;\r\n\t},\r\n\r\n\t_onMoveEnd: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\tif (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {\r\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have\r\n\t\t\t// a pixel offset on very high values, see: https://jsfiddle.net/dg6r5hhb/\r\n\t\t\tthis._resetView(this.getCenter(), this.getZoom());\r\n\t\t}\r\n\t},\r\n\r\n\t_findEventTargets: function (e, type) {\r\n\t\tvar targets = [],\r\n\t\t    target,\r\n\t\t    isHover = type === 'mouseout' || type === 'mouseover',\r\n\t\t    src = e.target || e.srcElement,\r\n\t\t    dragging = false;\r\n\r\n\t\twhile (src) {\r\n\t\t\ttarget = this._targets[Util.stamp(src)];\r\n\t\t\tif (target && (type === 'click' || type === 'preclick') && this._draggableMoved(target)) {\r\n\t\t\t\t// Prevent firing click after you just dragged an object.\r\n\t\t\t\tdragging = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (target && target.listens(type, true)) {\r\n\t\t\t\tif (isHover && !DomEvent.isExternalTarget(src, e)) { break; }\r\n\t\t\t\ttargets.push(target);\r\n\t\t\t\tif (isHover) { break; }\r\n\t\t\t}\r\n\t\t\tif (src === this._container) { break; }\r\n\t\t\tsrc = src.parentNode;\r\n\t\t}\r\n\t\tif (!targets.length && !dragging && !isHover && this.listens(type, true)) {\r\n\t\t\ttargets = [this];\r\n\t\t}\r\n\t\treturn targets;\r\n\t},\r\n\r\n\t_isClickDisabled: function (el) {\r\n\t\twhile (el && el !== this._container) {\r\n\t\t\tif (el['_leaflet_disable_click']) { return true; }\r\n\t\t\tel = el.parentNode;\r\n\t\t}\r\n\t},\r\n\r\n\t_handleDOMEvent: function (e) {\r\n\t\tvar el = (e.target || e.srcElement);\r\n\t\tif (!this._loaded || el['_leaflet_disable_events'] || e.type === 'click' && this._isClickDisabled(el)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\tif (type === 'mousedown') {\r\n\t\t\t// prevents outline when clicking on keyboard-focusable element\r\n\t\t\tDomUtil.preventOutline(el);\r\n\t\t}\r\n\r\n\t\tthis._fireDOMEvent(e, type);\r\n\t},\r\n\r\n\t_mouseEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'],\r\n\r\n\t_fireDOMEvent: function (e, type, canvasTargets) {\r\n\r\n\t\tif (e.type === 'click') {\r\n\t\t\t// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\r\n\t\t\t// @event preclick: MouseEvent\r\n\t\t\t// Fired before mouse click on the map (sometimes useful when you\r\n\t\t\t// want something to happen on click before any existing click\r\n\t\t\t// handlers start running).\r\n\t\t\tvar synth = Util.extend({}, e);\r\n\t\t\tsynth.type = 'preclick';\r\n\t\t\tthis._fireDOMEvent(synth, synth.type, canvasTargets);\r\n\t\t}\r\n\r\n\t\t// Find the layer the event is propagating from and its parents.\r\n\t\tvar targets = this._findEventTargets(e, type);\r\n\r\n\t\tif (canvasTargets) {\r\n\t\t\tvar filtered = []; // pick only targets with listeners\r\n\t\t\tfor (var i = 0; i < canvasTargets.length; i++) {\r\n\t\t\t\tif (canvasTargets[i].listens(type, true)) {\r\n\t\t\t\t\tfiltered.push(canvasTargets[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttargets = filtered.concat(targets);\r\n\t\t}\r\n\r\n\t\tif (!targets.length) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tDomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar target = targets[0];\r\n\t\tvar data = {\r\n\t\t\toriginalEvent: e\r\n\t\t};\r\n\r\n\t\tif (e.type !== 'keypress' && e.type !== 'keydown' && e.type !== 'keyup') {\r\n\t\t\tvar isMarker = target.getLatLng && (!target._radius || target._radius <= 10);\r\n\t\t\tdata.containerPoint = isMarker ?\r\n\t\t\t\tthis.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\r\n\t\t\tdata.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\r\n\t\t\tdata.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < targets.length; i++) {\r\n\t\t\ttargets[i].fire(type, data, true);\r\n\t\t\tif (data.originalEvent._stopped ||\r\n\t\t\t\t(targets[i].options.bubblingMouseEvents === false && Util.indexOf(this._mouseEvents, type) !== -1)) { return; }\r\n\t\t}\r\n\t},\r\n\r\n\t_draggableMoved: function (obj) {\r\n\t\tobj = obj.dragging && obj.dragging.enabled() ? obj : this;\r\n\t\treturn (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method whenReady(fn: Function, context?: Object): this\r\n\t// Runs the given function `fn` when the map gets initialized with\r\n\t// a view (center and zoom) and at least one layer, or immediately\r\n\t// if it's already initialized, optionally passing a function context.\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, {target: this});\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn DomUtil.getPosition(this._mapPane) || new Point(0, 0);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function (center, zoom) {\r\n\t\tvar pixelOrigin = center && zoom !== undefined ?\r\n\t\t\tthis._getNewPixelOrigin(center, zoom) :\r\n\t\t\tthis.getPixelOrigin();\r\n\t\treturn pixelOrigin.subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewPixelOrigin: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn this.project(latlng, zoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn toBounds([\r\n\t\t\tthis.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)\r\n\t\t]);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    viewBounds = new Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t    offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\t// If offset is less than a pixel, ignore.\r\n\t\t// This prevents unstable projections from getting into\r\n\t\t// an infinite loop of tiny offsets.\r\n\t\tif (Math.abs(offset.x) <= 1 && Math.abs(offset.y) <= 1) {\r\n\t\t\treturn center;\r\n\t\t}\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t    newBounds = new Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar projectedMaxBounds = toBounds(\r\n\t\t        this.project(maxBounds.getNorthEast(), zoom),\r\n\t\t        this.project(maxBounds.getSouthWest(), zoom)\r\n\t\t    ),\r\n\t\t    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),\r\n\t\t    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),\r\n\r\n\t\t    dx = this._rebound(minOffset.x, -maxOffset.x),\r\n\t\t    dy = this._rebound(minOffset.y, -maxOffset.y);\r\n\r\n\t\treturn new Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    snap = Browser.any3d ? this.options.zoomSnap : 1;\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / snap) * snap;\r\n\t\t}\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t_onPanTransitionStep: function () {\r\n\t\tthis.fire('move');\r\n\t},\r\n\r\n\t_onPanTransitionEnd: function () {\r\n\t\tDomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_tryAnimatedPan: function (center, options) {\r\n\t\t// difference between the new and current centers in pixels\r\n\t\tvar offset = this._getCenterOffset(center)._trunc();\r\n\r\n\t\t// don't animate too far unless animate: true specified in options\r\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tthis.panBy(offset, options);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_createAnimProxy: function () {\r\n\r\n\t\tvar proxy = this._proxy = DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');\r\n\t\tthis._panes.mapPane.appendChild(proxy);\r\n\r\n\t\tthis.on('zoomanim', function (e) {\r\n\t\t\tvar prop = DomUtil.TRANSFORM,\r\n\t\t\t    transform = this._proxy.style[prop];\r\n\r\n\t\t\tDomUtil.setTransform(this._proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));\r\n\r\n\t\t\t// workaround for case when transform is the same and so transitionend event is not fired\r\n\t\t\tif (transform === this._proxy.style[prop] && this._animatingZoom) {\r\n\t\t\t\tthis._onZoomTransitionEnd();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tthis.on('load moveend', this._animMoveEnd, this);\r\n\r\n\t\tthis._on('unload', this._destroyAnimProxy, this);\r\n\t},\r\n\r\n\t_destroyAnimProxy: function () {\r\n\t\tDomUtil.remove(this._proxy);\r\n\t\tthis.off('load moveend', this._animMoveEnd, this);\r\n\t\tdelete this._proxy;\r\n\t},\r\n\r\n\t_animMoveEnd: function () {\r\n\t\tvar c = this.getCenter(),\r\n\t\t    z = this.getZoom();\r\n\t\tDomUtil.setTransform(this._proxy, this.project(c, z), this.getZoomScale(z, 1));\r\n\t},\r\n\r\n\t_catchTransitionEnd: function (e) {\r\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\r\n\t\t\tthis._onZoomTransitionEnd();\r\n\t\t}\r\n\t},\r\n\r\n\t_nothingToAnimate: function () {\r\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\r\n\t},\r\n\r\n\t_tryAnimatedZoom: function (center, zoom, options) {\r\n\r\n\t\tif (this._animatingZoom) { return true; }\r\n\r\n\t\toptions = options || {};\r\n\r\n\t\t// don't animate if disabled, not supported or zoom difference is too large\r\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\r\n\t\t        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\r\n\r\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);\r\n\r\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tUtil.requestAnimFrame(function () {\r\n\t\t\tthis\r\n\t\t\t    ._moveStart(true, options.noMoveStart || false)\r\n\t\t\t    ._animateZoom(center, zoom, true);\r\n\t\t}, this);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_animateZoom: function (center, zoom, startAnim, noUpdate) {\r\n\t\tif (!this._mapPane) { return; }\r\n\r\n\t\tif (startAnim) {\r\n\t\t\tthis._animatingZoom = true;\r\n\r\n\t\t\t// remember what center/zoom to set after animation\r\n\t\t\tthis._animateToCenter = center;\r\n\t\t\tthis._animateToZoom = zoom;\r\n\r\n\t\t\tDomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\t// @section Other Events\r\n\t\t// @event zoomanim: ZoomAnimEvent\r\n\t\t// Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.\r\n\t\tthis.fire('zoomanim', {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom,\r\n\t\t\tnoUpdate: noUpdate\r\n\t\t});\r\n\r\n\t\tif (!this._tempFireZoomEvent) {\r\n\t\t\tthis._tempFireZoomEvent = this._zoom !== this._animateToZoom;\r\n\t\t}\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom, undefined, true);\r\n\r\n\t\t// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693\r\n\t\tsetTimeout(Util.bind(this._onZoomTransitionEnd, this), 250);\r\n\t},\r\n\r\n\t_onZoomTransitionEnd: function () {\r\n\t\tif (!this._animatingZoom) { return; }\r\n\r\n\t\tif (this._mapPane) {\r\n\t\t\tDomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\tthis._animatingZoom = false;\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom, undefined, true);\r\n\r\n\t\tif (this._tempFireZoomEvent) {\r\n\t\t\tthis.fire('zoom');\r\n\t\t}\r\n\t\tdelete this._tempFireZoomEvent;\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tthis._moveEnd(true);\r\n\t}\r\n});\r\n\r\n// @section\r\n\r\n// @factory L.map(id: String, options?: Map options)\r\n// Instantiates a map object given the DOM ID of a `<div>` element\r\n// and optionally an object literal with `Map options`.\r\n//\r\n// @alternative\r\n// @factory L.map(el: HTMLElement, options?: Map options)\r\n// Instantiates a map object given an instance of a `<div>` HTML element\r\n// and optionally an object literal with `Map options`.\r\nexport function createMap(id, options) {\r\n\treturn new Map(id, options);\r\n}\r\n","\r\nimport {Class} from '../core/Class';\r\nimport {Map} from '../map/Map';\r\nimport * as Util from '../core/Util';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class Control\r\n * @aka L.Control\r\n * @inherits Class\r\n *\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nexport var Control = Class.extend({\r\n\t// @section\r\n\t// @aka Control Options\r\n\toptions: {\r\n\t\t// @option position: String = 'topright'\r\n\t\t// The position of the control (one of the map corners). Possible values are `'topleft'`,\r\n\t\t// `'topright'`, `'bottomleft'` or `'bottomright'`\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tUtil.setOptions(this, options);\r\n\t},\r\n\r\n\t/* @section\r\n\t * Classes extending L.Control will inherit the following methods:\r\n\t *\r\n\t * @method getPosition: string\r\n\t * Returns the position of the control.\r\n\t */\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\t// @method setPosition(position: string): this\r\n\t// Sets the position of the control.\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTMLElement that contains the control.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method addTo(map: Map): this\r\n\t// Adds the control to the given map.\r\n\taddTo: function (map) {\r\n\t\tthis.remove();\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t    pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tDomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\tthis._map.on('unload', this.remove, this);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove: this\r\n\t// Removes the control from the map it is currently active on.\r\n\tremove: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tDomUtil.remove(this._container);\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(this._map);\r\n\t\t}\r\n\r\n\t\tthis._map.off('unload', this.remove, this);\r\n\t\tthis._map = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function (e) {\r\n\t\t// if map exists and event is not a keyboard event\r\n\t\tif (this._map && e && e.screenX > 0 && e.screenY > 0) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport var control = function (options) {\r\n\treturn new Control(options);\r\n};\r\n\r\n/* @section Extension methods\r\n * @uninheritable\r\n *\r\n * Every control should extend from `L.Control` and (re-)implement the following methods.\r\n *\r\n * @method onAdd(map: Map): HTMLElement\r\n * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).\r\n *\r\n * @method onRemove(map: Map)\r\n * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).\r\n */\r\n\r\n/* @namespace Map\r\n * @section Methods for Layers and Controls\r\n */\r\nMap.include({\r\n\t// @method addControl(control: Control): this\r\n\t// Adds the given control to the map\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeControl(control: Control): this\r\n\t// Removes the given control from the map\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.remove();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t    l = 'leaflet-',\r\n\t\t    container = this._controlContainer =\r\n\t\t            DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tfor (var i in this._controlCorners) {\r\n\t\t\tDomUtil.remove(this._controlCorners[i]);\r\n\t\t}\r\n\t\tDomUtil.remove(this._controlContainer);\r\n\t\tdelete this._controlCorners;\r\n\t\tdelete this._controlContainer;\r\n\t}\r\n});\r\n","\r\nimport {Control} from './Control';\r\nimport * as Util from '../core/Util';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class Control.Layers\r\n * @aka L.Control.Layers\r\n * @inherits Control\r\n *\r\n * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](https://leafletjs.com/examples/layers-control/)). Extends `Control`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var baseLayers = {\r\n * \t\"Mapbox\": mapbox,\r\n * \t\"OpenStreetMap\": osm\r\n * };\r\n *\r\n * var overlays = {\r\n * \t\"Marker\": marker,\r\n * \t\"Roads\": roadsLayer\r\n * };\r\n *\r\n * L.control.layers(baseLayers, overlays).addTo(map);\r\n * ```\r\n *\r\n * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:\r\n *\r\n * ```js\r\n * {\r\n *     \"<someName1>\": layer1,\r\n *     \"<someName2>\": layer2\r\n * }\r\n * ```\r\n *\r\n * The layer names can contain HTML, which allows you to add additional styling to the items:\r\n *\r\n * ```js\r\n * {\"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>\": myLayer}\r\n * ```\r\n */\r\n\r\nexport var Layers = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Layers options\r\n\toptions: {\r\n\t\t// @option collapsed: Boolean = true\r\n\t\t// If `true`, the control will be collapsed into an icon and expanded on mouse hover, touch, or keyboard activation.\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\r\n\t\t// @option autoZIndex: Boolean = true\r\n\t\t// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.\r\n\t\tautoZIndex: true,\r\n\r\n\t\t// @option hideSingleBase: Boolean = false\r\n\t\t// If `true`, the base layers in the control will be hidden when there is only one.\r\n\t\thideSingleBase: false,\r\n\r\n\t\t// @option sortLayers: Boolean = false\r\n\t\t// Whether to sort the layers. When `false`, layers will keep the order\r\n\t\t// in which they were added to the control.\r\n\t\tsortLayers: false,\r\n\r\n\t\t// @option sortFunction: Function = *\r\n\t\t// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)\r\n\t\t// that will be used for sorting the layers, when `sortLayers` is `true`.\r\n\t\t// The function receives both the `L.Layer` instances and their names, as in\r\n\t\t// `sortFunction(layerA, layerB, nameA, nameB)`.\r\n\t\t// By default, it sorts layers alphabetically by their name.\r\n\t\tsortFunction: function (layerA, layerB, nameA, nameB) {\r\n\t\t\treturn nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layerControlInputs = [];\r\n\t\tthis._layers = [];\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\t\tthis._preventClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tthis._map = map;\r\n\t\tmap.on('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.on('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tControl.prototype.addTo.call(this, map);\r\n\t\t// Trigger expand after Layers Control has been inserted into DOM so that is now has an actual height.\r\n\t\treturn this._expandIfNotCollapsed();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tthis._map.off('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.off('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addBaseLayer(layer: Layer, name: String): this\r\n\t// Adds a base layer (radio button entry) with the given name to the control.\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method addOverlay(layer: Layer, name: String): this\r\n\t// Adds an overlay (checkbox entry) with the given name to the control.\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Remove the given layer from the control.\r\n\tremoveLayer: function (layer) {\r\n\t\tlayer.off('add remove', this._onLayerChange, this);\r\n\r\n\t\tvar obj = this._getLayer(Util.stamp(layer));\r\n\t\tif (obj) {\r\n\t\t\tthis._layers.splice(this._layers.indexOf(obj), 1);\r\n\t\t}\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method expand(): this\r\n\t// Expand the control container if collapsed.\r\n\texpand: function () {\r\n\t\tDomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\tthis._section.style.height = null;\r\n\t\tvar acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);\r\n\t\tif (acceptableHeight < this._section.clientHeight) {\r\n\t\t\tDomUtil.addClass(this._section, 'leaflet-control-layers-scrollbar');\r\n\t\t\tthis._section.style.height = acceptableHeight + 'px';\r\n\t\t} else {\r\n\t\t\tDomUtil.removeClass(this._section, 'leaflet-control-layers-scrollbar');\r\n\t\t}\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method collapse(): this\r\n\t// Collapse the control container if expanded.\r\n\tcollapse: function () {\r\n\t\tDomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t    container = this._container = DomUtil.create('div', className),\r\n\t\t    collapsed = this.options.collapsed;\r\n\r\n\t\t// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tDomEvent.disableClickPropagation(container);\r\n\t\tDomEvent.disableScrollPropagation(container);\r\n\r\n\t\tvar section = this._section = DomUtil.create('section', className + '-list');\r\n\r\n\t\tif (collapsed) {\r\n\t\t\tthis._map.on('click', this.collapse, this);\r\n\r\n\t\t\tDomEvent.on(container, {\r\n\t\t\t\tmouseenter: this._expandSafely,\r\n\t\t\t\tmouseleave: this.collapse\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tvar link = this._layersLink = DomUtil.create('a', className + '-toggle', container);\r\n\t\tlink.href = '#';\r\n\t\tlink.title = 'Layers';\r\n\t\tlink.setAttribute('role', 'button');\r\n\r\n\t\tDomEvent.on(link, {\r\n\t\t\tkeydown: function (e) {\r\n\t\t\t\tif (e.keyCode === 13) {\r\n\t\t\t\t\tthis._expandSafely();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// Certain screen readers intercept the key event and instead send a click event\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tDomEvent.preventDefault(e);\r\n\t\t\t\tthis._expandSafely();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tif (!collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = DomUtil.create('div', className + '-base', section);\r\n\t\tthis._separator = DomUtil.create('div', className + '-separator', section);\r\n\t\tthis._overlaysList = DomUtil.create('div', className + '-overlays', section);\r\n\r\n\t\tcontainer.appendChild(section);\r\n\t},\r\n\r\n\t_getLayer: function (id) {\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\r\n\t\t\tif (this._layers[i] && Util.stamp(this._layers[i].layer) === id) {\r\n\t\t\t\treturn this._layers[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tif (this._map) {\r\n\t\t\tlayer.on('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\r\n\t\tthis._layers.push({\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t});\r\n\r\n\t\tif (this.options.sortLayers) {\r\n\t\t\tthis._layers.sort(Util.bind(function (a, b) {\r\n\t\t\t\treturn this.options.sortFunction(a.layer, b.layer, a.name, b.name);\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\r\n\t\tthis._expandIfNotCollapsed();\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) { return this; }\r\n\r\n\t\tDomUtil.empty(this._baseLayersList);\r\n\t\tDomUtil.empty(this._overlaysList);\r\n\r\n\t\tthis._layerControlInputs = [];\r\n\t\tvar baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;\r\n\r\n\t\tfor (i = 0; i < this._layers.length; i++) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t\tbaseLayersCount += !obj.overlay ? 1 : 0;\r\n\t\t}\r\n\r\n\t\t// Hide base layers section if there's only one layer.\r\n\t\tif (this.options.hideSingleBase) {\r\n\t\t\tbaseLayersPresent = baseLayersPresent && baseLayersCount > 1;\r\n\t\t\tthis._baseLayersList.style.display = baseLayersPresent ? '' : 'none';\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar obj = this._getLayer(Util.stamp(e.target));\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Layer events\r\n\t\t// @event baselayerchange: LayersControlEvent\r\n\t\t// Fired when the base layer is changed through the [layers control](#control-layers).\r\n\t\t// @event overlayadd: LayersControlEvent\r\n\t\t// Fired when an overlay is selected through the [layers control](#control-layers).\r\n\t\t// @event overlayremove: LayersControlEvent\r\n\t\t// Fired when an overlay is deselected through the [layers control](#control-layers).\r\n\t\t// @namespace Control.Layers\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'add' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'add' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see https://stackoverflow.com/a/119079)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' +\r\n\t\t\t\tname + '\"' + (checked ? ' checked=\"checked\"' : '') + '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t    checked = this._map.hasLayer(obj.layer),\r\n\t\t    input;\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers_' + Util.stamp(this), checked);\r\n\t\t}\r\n\r\n\t\tthis._layerControlInputs.push(input);\r\n\t\tinput.layerId = Util.stamp(obj.layer);\r\n\r\n\t\tDomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\t// Helps from preventing layer control flicker when checkboxes are disabled\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2771\r\n\t\tvar holder = document.createElement('span');\r\n\r\n\t\tlabel.appendChild(holder);\r\n\t\tholder.appendChild(input);\r\n\t\tholder.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\t// expanding the control on mobile with a click can cause adding a layer - we don't want this\r\n\t\tif (this._preventClick) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar inputs = this._layerControlInputs,\r\n\t\t    input, layer;\r\n\t\tvar addedLayers = [],\r\n\t\t    removedLayers = [];\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\r\n\t\t\tif (input.checked) {\r\n\t\t\t\taddedLayers.push(layer);\r\n\t\t\t} else if (!input.checked) {\r\n\t\t\t\tremovedLayers.push(layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bugfix issue 2318: Should remove all old layers before readding new ones\r\n\t\tfor (i = 0; i < removedLayers.length; i++) {\r\n\t\t\tif (this._map.hasLayer(removedLayers[i])) {\r\n\t\t\t\tthis._map.removeLayer(removedLayers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; i < addedLayers.length; i++) {\r\n\t\t\tif (!this._map.hasLayer(addedLayers[i])) {\r\n\t\t\t\tthis._map.addLayer(addedLayers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_checkDisabledLayers: function () {\r\n\t\tvar inputs = this._layerControlInputs,\r\n\t\t    input,\r\n\t\t    layer,\r\n\t\t    zoom = this._map.getZoom();\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\tinput.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||\r\n\t\t\t                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_expandIfNotCollapsed: function () {\r\n\t\tif (this._map && !this.options.collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_expandSafely: function () {\r\n\t\tvar section = this._section;\r\n\t\tthis._preventClick = true;\r\n\t\tDomEvent.on(section, 'click', DomEvent.preventDefault);\r\n\t\tthis.expand();\r\n\t\tvar that = this;\r\n\t\tsetTimeout(function () {\r\n\t\t\tDomEvent.off(section, 'click', DomEvent.preventDefault);\r\n\t\t\tthat._preventClick = false;\r\n\t\t});\r\n\t}\r\n\r\n});\r\n\r\n\r\n// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)\r\n// Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.\r\nexport var layers = function (baseLayers, overlays, options) {\r\n\treturn new Layers(baseLayers, overlays, options);\r\n};\r\n","\r\nimport {Control} from './Control';\r\nimport {Map} from '../map/Map';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport * as DomEvent from '../dom/DomEvent';\r\n\r\n/*\r\n * @class Control.Zoom\r\n * @aka L.Control.Zoom\r\n * @inherits Control\r\n *\r\n * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.\r\n */\r\n\r\nexport var Zoom = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Zoom options\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\r\n\t\t// @option zoomInText: String = '<span aria-hidden=\"true\">+</span>'\r\n\t\t// The text set on the 'zoom in' button.\r\n\t\tzoomInText: '<span aria-hidden=\"true\">+</span>',\r\n\r\n\t\t// @option zoomInTitle: String = 'Zoom in'\r\n\t\t// The title set on the 'zoom in' button.\r\n\t\tzoomInTitle: 'Zoom in',\r\n\r\n\t\t// @option zoomOutText: String = '<span aria-hidden=\"true\">&#x2212;</span>'\r\n\t\t// The text set on the 'zoom out' button.\r\n\t\tzoomOutText: '<span aria-hidden=\"true\">&#x2212;</span>',\r\n\r\n\t\t// @option zoomOutTitle: String = 'Zoom out'\r\n\t\t// The title set on the 'zoom out' button.\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t    container = DomUtil.create('div', zoomName + ' leaflet-bar'),\r\n\t\t    options = this.options;\r\n\r\n\t\tthis._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,\r\n\t\t        zoomName + '-in',  container, this._zoomIn);\r\n\t\tthis._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,\r\n\t\t        zoomName + '-out', container, this._zoomOut);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tthis._disabled = true;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tthis._disabled = false;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {\r\n\t\t\tthis._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom > this._map.getMinZoom()) {\r\n\t\t\tthis._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn) {\r\n\t\tvar link = DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\t/*\r\n\t\t * Will force screen readers like VoiceOver to read this as \"Zoom in - button\"\r\n\t\t */\r\n\t\tlink.setAttribute('role', 'button');\r\n\t\tlink.setAttribute('aria-label', title);\r\n\r\n\t\tDomEvent.disableClickPropagation(link);\r\n\t\tDomEvent.on(link, 'click', DomEvent.stop);\r\n\t\tDomEvent.on(link, 'click', fn, this);\r\n\t\tDomEvent.on(link, 'click', this._refocusOnMap, this);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t    className = 'leaflet-disabled';\r\n\r\n\t\tDomUtil.removeClass(this._zoomInButton, className);\r\n\t\tDomUtil.removeClass(this._zoomOutButton, className);\r\n\t\tthis._zoomInButton.setAttribute('aria-disabled', 'false');\r\n\t\tthis._zoomOutButton.setAttribute('aria-disabled', 'false');\r\n\r\n\t\tif (this._disabled || map._zoom === map.getMinZoom()) {\r\n\t\t\tDomUtil.addClass(this._zoomOutButton, className);\r\n\t\t\tthis._zoomOutButton.setAttribute('aria-disabled', 'true');\r\n\t\t}\r\n\t\tif (this._disabled || map._zoom === map.getMaxZoom()) {\r\n\t\t\tDomUtil.addClass(this._zoomInButton, className);\r\n\t\t\tthis._zoomInButton.setAttribute('aria-disabled', 'true');\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option zoomControl: Boolean = true\r\n// Whether a [zoom control](#control-zoom) is added to the map by default.\r\nMap.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nMap.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\t// @section Controls\r\n\t\t// @property zoomControl: Control.Zoom\r\n\t\t// The default zoom control (only available if the\r\n\t\t// [`zoomControl` option](#map-zoomcontrol) was `true` when creating the map).\r\n\t\tthis.zoomControl = new Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Zoom\r\n// @factory L.control.zoom(options: Control.Zoom options)\r\n// Creates a zoom control\r\nexport var zoom = function (options) {\r\n\treturn new Zoom(options);\r\n};\r\n","\nimport {Control} from './Control';\nimport * as DomUtil from '../dom/DomUtil';\n\n/*\n * @class Control.Scale\n * @aka L.Control.Scale\n * @inherits Control\n *\n * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.\n *\n * @example\n *\n * ```js\n * L.control.scale().addTo(map);\n * ```\n */\n\nexport var Scale = Control.extend({\n\t// @section\n\t// @aka Control.Scale options\n\toptions: {\n\t\tposition: 'bottomleft',\n\n\t\t// @option maxWidth: Number = 100\n\t\t// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).\n\t\tmaxWidth: 100,\n\n\t\t// @option metric: Boolean = True\n\t\t// Whether to show the metric scale line (m/km).\n\t\tmetric: true,\n\n\t\t// @option imperial: Boolean = True\n\t\t// Whether to show the imperial scale line (mi/ft).\n\t\timperial: true\n\n\t\t// @option updateWhenIdle: Boolean = false\n\t\t// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).\n\t},\n\n\tonAdd: function (map) {\n\t\tvar className = 'leaflet-control-scale',\n\t\t    container = DomUtil.create('div', className),\n\t\t    options = this.options;\n\n\t\tthis._addScales(options, className + '-line', container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = DomUtil.create('div', className, container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = DomUtil.create('div', className, container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar map = this._map,\n\t\t    y = map.getSize().y / 2;\n\n\t\tvar maxMeters = map.distance(\n\t\t\tmap.containerPointToLatLng([0, y]),\n\t\t\tmap.containerPointToLatLng([this.options.maxWidth, y]));\n\n\t\tthis._updateScales(maxMeters);\n\t},\n\n\t_updateScales: function (maxMeters) {\n\t\tif (this.options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\t\tif (this.options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters),\n\t\t    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n\t\tthis._updateScale(this._mScale, label, meters / maxMeters);\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t    maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\t\t\tthis._updateScale(this._iScale, miles + ' mi', miles / maxMiles);\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\t\t\tthis._updateScale(this._iScale, feet + ' ft', feet / maxFeet);\n\t\t}\n\t},\n\n\t_updateScale: function (scale, text, ratio) {\n\t\tscale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';\n\t\tscale.innerHTML = text;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t    d = num / pow10;\n\n\t\td = d >= 10 ? 10 :\n\t\t    d >= 5 ? 5 :\n\t\t    d >= 3 ? 3 :\n\t\t    d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\n\n// @factory L.control.scale(options?: Control.Scale options)\n// Creates an scale control with the given options.\nexport var scale = function (options) {\n\treturn new Scale(options);\n};\n","\r\nimport {Control} from './Control';\r\nimport {Map} from '../map/Map';\r\nimport * as Util from '../core/Util';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport Browser from '../core/Browser';\r\n\r\nvar ukrainianFlag = '<svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" class=\"leaflet-attribution-flag\"><path fill=\"#4C7BE1\" d=\"M0 0h12v4H0z\"/><path fill=\"#FFD500\" d=\"M0 4h12v3H0z\"/><path fill=\"#E0BC00\" d=\"M0 7h12v1H0z\"/></svg>';\r\n\r\n\r\n/*\r\n * @class Control.Attribution\r\n * @aka L.Control.Attribution\r\n * @inherits Control\r\n *\r\n * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.\r\n */\r\n\r\nexport var Attribution = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Attribution options\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\r\n\t\t// @option prefix: String|false = 'Leaflet'\r\n\t\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\t\tprefix: '<a href=\"https://leafletjs.com\" title=\"A JavaScript library for interactive maps\">' + (Browser.inlineSvg ? ukrainianFlag + ' ' : '') + 'Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tmap.attributionControl = this;\r\n\t\tthis._container = DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tDomEvent.disableClickPropagation(this._container);\r\n\r\n\t\t// TODO ugly, refactor\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._update();\r\n\r\n\t\tmap.on('layeradd', this._addAttribution, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('layeradd', this._addAttribution, this);\r\n\t},\r\n\r\n\t_addAttribution: function (ev) {\r\n\t\tif (ev.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(ev.layer.getAttribution());\r\n\t\t\tev.layer.once('remove', function () {\r\n\t\t\t\tthis.removeAttribution(ev.layer.getAttribution());\r\n\t\t\t}, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setPrefix(prefix: String|false): this\r\n\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addAttribution(text: String): this\r\n\t// Adds an attribution text (e.g. `'&copy; OpenStreetMap contributors'`).\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeAttribution(text: String): this\r\n\t// Removes an attribution text.\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' <span aria-hidden=\"true\">|</span> ');\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option attributionControl: Boolean = true\r\n// Whether a [attribution control](#control-attribution) is added to the map by default.\r\nMap.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nMap.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tnew Attribution().addTo(this);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Attribution\r\n// @factory L.control.attribution(options: Control.Attribution options)\r\n// Creates an attribution control.\r\nexport var attribution = function (options) {\r\n\treturn new Attribution(options);\r\n};\r\n","import {Control, control} from './Control';\nimport {Layers, layers} from './Control.Layers';\nimport {Zoom, zoom} from './Control.Zoom';\nimport {Scale, scale} from './Control.Scale';\nimport {Attribution, attribution} from './Control.Attribution';\n\nControl.Layers = Layers;\nControl.Zoom = Zoom;\nControl.Scale = Scale;\nControl.Attribution = Attribution;\n\ncontrol.layers = layers;\ncontrol.zoom = zoom;\ncontrol.scale = scale;\ncontrol.attribution = attribution;\n\nexport {Control, control};\n","import {Class} from './Class';\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\n// @class Handler\n// @aka L.Handler\n// Abstract class for map interaction handlers\n\nexport var Handler = Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\t// @method enable(): this\n\t// Enables the handler\n\tenable: function () {\n\t\tif (this._enabled) { return this; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t\treturn this;\n\t},\n\n\t// @method disable(): this\n\t// Disables the handler\n\tdisable: function () {\n\t\tif (!this._enabled) { return this; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t\treturn this;\n\t},\n\n\t// @method enabled(): Boolean\n\t// Returns `true` if the handler is enabled\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n\n\t// @section Extension methods\n\t// Classes inheriting from `Handler` must implement the two following methods:\n\t// @method addHooks()\n\t// Called when the handler is enabled, should add event hooks.\n\t// @method removeHooks()\n\t// Called when the handler is disabled, should remove the event hooks added previously.\n});\n\n// @section There is static function which can be called without instantiating L.Handler:\n// @function addTo(map: Map, name: String): this\n// Adds a new Handler to the given map with the given name.\nHandler.addTo = function (map, name) {\n\tmap.addHandler(name, this);\n\treturn this;\n};\n","import Browser from './Browser';\nexport {Browser};\n\nexport {Class} from './Class';\n\nimport {Evented} from './Events';\nimport {Events} from './Events';\nexport {Evented};\nexport var Mixin = {Events: Events};\n\nexport {Handler} from './Handler';\n\nimport * as Util from './Util';\nexport {Util};\nexport {extend, bind, stamp, setOptions} from './Util';\n","import {Point, toPoint} from './Point';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLng} from '../geo/LatLng';\r\nimport {centroid} from './PolyUtil';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\n\r\n\r\n/*\r\n * @namespace LineUtil\r\n *\r\n * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.\r\n */\r\n\r\n// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n// @function simplify(points: Point[], tolerance: Number): Point[]\r\n// Dramatically reduces the number of points in a polyline while retaining\r\n// its shape and returns a new array of simplified points, using the\r\n// [Ramer-Douglas-Peucker algorithm](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm).\r\n// Used for a huge performance boost when processing/displaying Leaflet polylines for\r\n// each zoom level and also reducing visual noise. tolerance affects the amount of\r\n// simplification (lesser value means higher quality but slower and with more points).\r\n// Also released as a separated micro-library [Simplify.js](https://mourner.github.io/simplify-js/).\r\nexport function simplify(points, tolerance) {\r\n\tif (!tolerance || !points.length) {\r\n\t\treturn points.slice();\r\n\t}\r\n\r\n\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t    // stage 1: vertex reduction\r\n\t    points = _reducePoints(points, sqTolerance);\r\n\r\n\t    // stage 2: Douglas-Peucker simplification\r\n\t    points = _simplifyDP(points, sqTolerance);\r\n\r\n\treturn points;\r\n}\r\n\r\n// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number\r\n// Returns the distance between point `p` and segment `p1` to `p2`.\r\nexport function pointToSegmentDistance(p, p1, p2) {\r\n\treturn Math.sqrt(_sqClosestPointOnSegment(p, p1, p2, true));\r\n}\r\n\r\n// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number\r\n// Returns the closest point from a point `p` on a segment `p1` to `p2`.\r\nexport function closestPointOnSegment(p, p1, p2) {\r\n\treturn _sqClosestPointOnSegment(p, p1, p2);\r\n}\r\n\r\n// Ramer-Douglas-Peucker simplification, see https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm\r\nfunction _simplifyDP(points, sqTolerance) {\r\n\r\n\tvar len = points.length,\r\n\t    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t    markers = new ArrayConstructor(len);\r\n\r\n\t    markers[0] = markers[len - 1] = 1;\r\n\r\n\t_simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\tvar i,\r\n\t    newPoints = [];\r\n\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tif (markers[i]) {\r\n\t\t\tnewPoints.push(points[i]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn newPoints;\r\n}\r\n\r\nfunction _simplifyDPStep(points, markers, sqTolerance, first, last) {\r\n\r\n\tvar maxSqDist = 0,\r\n\tindex, i, sqDist;\r\n\r\n\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\tsqDist = _sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\tif (sqDist > maxSqDist) {\r\n\t\t\tindex = i;\r\n\t\t\tmaxSqDist = sqDist;\r\n\t\t}\r\n\t}\r\n\r\n\tif (maxSqDist > sqTolerance) {\r\n\t\tmarkers[index] = 1;\r\n\r\n\t\t_simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t_simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t}\r\n}\r\n\r\n// reduce points that are too close to each other to a single point\r\nfunction _reducePoints(points, sqTolerance) {\r\n\tvar reducedPoints = [points[0]];\r\n\r\n\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\tif (_sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\treducedPoints.push(points[i]);\r\n\t\t\tprev = i;\r\n\t\t}\r\n\t}\r\n\tif (prev < len - 1) {\r\n\t\treducedPoints.push(points[len - 1]);\r\n\t}\r\n\treturn reducedPoints;\r\n}\r\n\r\nvar _lastCode;\r\n\r\n// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean\r\n// Clips the segment a to b by rectangular bounds with the\r\n// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)\r\n// (modifying the segment points directly!). Used by Leaflet to only show polyline\r\n// points that are on the screen or near, increasing performance.\r\nexport function clipSegment(a, b, bounds, useLastCode, round) {\r\n\tvar codeA = useLastCode ? _lastCode : _getBitCode(a, bounds),\r\n\t    codeB = _getBitCode(b, bounds),\r\n\r\n\t    codeOut, p, newCode;\r\n\r\n\t    // save 2nd code to avoid calculating it on the next segment\r\n\t    _lastCode = codeB;\r\n\r\n\twhile (true) {\r\n\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\tif (!(codeA | codeB)) {\r\n\t\t\treturn [a, b];\r\n\t\t}\r\n\r\n\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\tif (codeA & codeB) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// other cases\r\n\t\tcodeOut = codeA || codeB;\r\n\t\tp = _getEdgeIntersection(a, b, codeOut, bounds, round);\r\n\t\tnewCode = _getBitCode(p, bounds);\r\n\r\n\t\tif (codeOut === codeA) {\r\n\t\t\ta = p;\r\n\t\t\tcodeA = newCode;\r\n\t\t} else {\r\n\t\t\tb = p;\r\n\t\t\tcodeB = newCode;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function _getEdgeIntersection(a, b, code, bounds, round) {\r\n\tvar dx = b.x - a.x,\r\n\t    dy = b.y - a.y,\r\n\t    min = bounds.min,\r\n\t    max = bounds.max,\r\n\t    x, y;\r\n\r\n\tif (code & 8) { // top\r\n\t\tx = a.x + dx * (max.y - a.y) / dy;\r\n\t\ty = max.y;\r\n\r\n\t} else if (code & 4) { // bottom\r\n\t\tx = a.x + dx * (min.y - a.y) / dy;\r\n\t\ty = min.y;\r\n\r\n\t} else if (code & 2) { // right\r\n\t\tx = max.x;\r\n\t\ty = a.y + dy * (max.x - a.x) / dx;\r\n\r\n\t} else if (code & 1) { // left\r\n\t\tx = min.x;\r\n\t\ty = a.y + dy * (min.x - a.x) / dx;\r\n\t}\r\n\r\n\treturn new Point(x, y, round);\r\n}\r\n\r\nexport function _getBitCode(p, bounds) {\r\n\tvar code = 0;\r\n\r\n\tif (p.x < bounds.min.x) { // left\r\n\t\tcode |= 1;\r\n\t} else if (p.x > bounds.max.x) { // right\r\n\t\tcode |= 2;\r\n\t}\r\n\r\n\tif (p.y < bounds.min.y) { // bottom\r\n\t\tcode |= 4;\r\n\t} else if (p.y > bounds.max.y) { // top\r\n\t\tcode |= 8;\r\n\t}\r\n\r\n\treturn code;\r\n}\r\n\r\n// square distance (to avoid unnecessary Math.sqrt calls)\r\nfunction _sqDist(p1, p2) {\r\n\tvar dx = p2.x - p1.x,\r\n\t    dy = p2.y - p1.y;\r\n\treturn dx * dx + dy * dy;\r\n}\r\n\r\n// return closest point on segment or distance to that point\r\nexport function _sqClosestPointOnSegment(p, p1, p2, sqDist) {\r\n\tvar x = p1.x,\r\n\t    y = p1.y,\r\n\t    dx = p2.x - x,\r\n\t    dy = p2.y - y,\r\n\t    dot = dx * dx + dy * dy,\r\n\t    t;\r\n\r\n\tif (dot > 0) {\r\n\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\tif (t > 1) {\r\n\t\t\tx = p2.x;\r\n\t\t\ty = p2.y;\r\n\t\t} else if (t > 0) {\r\n\t\t\tx += dx * t;\r\n\t\t\ty += dy * t;\r\n\t\t}\r\n\t}\r\n\r\n\tdx = p.x - x;\r\n\tdy = p.y - y;\r\n\r\n\treturn sqDist ? dx * dx + dy * dy : new Point(x, y);\r\n}\r\n\r\n\r\n// @function isFlat(latlngs: LatLng[]): Boolean\r\n// Returns true if `latlngs` is a flat array, false is nested.\r\nexport function isFlat(latlngs) {\r\n\treturn !Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');\r\n}\r\n\r\nexport function _flat(latlngs) {\r\n\tconsole.warn('Deprecated use of _flat, please use L.LineUtil.isFlat instead.');\r\n\treturn isFlat(latlngs);\r\n}\r\n\r\n/* @function polylineCenter(latlngs: LatLng[], crs: CRS): LatLng\r\n * Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the passed LatLngs (first ring) from a polyline.\r\n */\r\nexport function polylineCenter(latlngs, crs) {\r\n\tvar i, halfDist, segDist, dist, p1, p2, ratio, center;\r\n\r\n\tif (!latlngs || latlngs.length === 0) {\r\n\t\tthrow new Error('latlngs not passed');\r\n\t}\r\n\r\n\tif (!isFlat(latlngs)) {\r\n\t\tconsole.warn('latlngs are not flat! Only the first ring will be used');\r\n\t\tlatlngs = latlngs[0];\r\n\t}\r\n\r\n\tvar centroidLatLng = toLatLng([0, 0]);\r\n\r\n\tvar bounds = toLatLngBounds(latlngs);\r\n\tvar areaBounds = bounds.getNorthWest().distanceTo(bounds.getSouthWest()) * bounds.getNorthEast().distanceTo(bounds.getNorthWest());\r\n\t// tests showed that below 1700 rounding errors are happening\r\n\tif (areaBounds < 1700) {\r\n\t\t// getting a inexact center, to move the latlngs near to [0, 0] to prevent rounding errors\r\n\t\tcentroidLatLng = centroid(latlngs);\r\n\t}\r\n\r\n\tvar len = latlngs.length;\r\n\tvar points = [];\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tvar latlng = toLatLng(latlngs[i]);\r\n\t\tpoints.push(crs.project(toLatLng([latlng.lat - centroidLatLng.lat, latlng.lng - centroidLatLng.lng])));\r\n\t}\r\n\r\n\tfor (i = 0, halfDist = 0; i < len - 1; i++) {\r\n\t\thalfDist += points[i].distanceTo(points[i + 1]) / 2;\r\n\t}\r\n\r\n\t// The line is so small in the current view that all points are on the same pixel.\r\n\tif (halfDist === 0) {\r\n\t\tcenter = points[0];\r\n\t} else {\r\n\t\tfor (i = 0, dist = 0; i < len - 1; i++) {\r\n\t\t\tp1 = points[i];\r\n\t\t\tp2 = points[i + 1];\r\n\t\t\tsegDist = p1.distanceTo(p2);\r\n\t\t\tdist += segDist;\r\n\r\n\t\t\tif (dist > halfDist) {\r\n\t\t\t\tratio = (dist - halfDist) / segDist;\r\n\t\t\t\tcenter = [\r\n\t\t\t\t\tp2.x - ratio * (p2.x - p1.x),\r\n\t\t\t\t\tp2.y - ratio * (p2.y - p1.y)\r\n\t\t\t\t];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar latlngCenter = crs.unproject(toPoint(center));\r\n\treturn toLatLng([latlngCenter.lat + centroidLatLng.lat, latlngCenter.lng + centroidLatLng.lng]);\r\n}\r\n","import {Evented} from '../core/Events';\r\nimport Browser from '../core/Browser';\r\nimport * as DomEvent from './DomEvent';\r\nimport * as DomUtil from './DomUtil';\r\nimport * as Util from '../core/Util';\r\nimport {Point} from '../geometry/Point';\r\n\r\n/*\r\n * @class Draggable\r\n * @aka L.Draggable\r\n * @inherits Evented\r\n *\r\n * A class for making DOM elements draggable (including touch support).\r\n * Used internally for map and marker dragging. Only works for elements\r\n * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).\r\n *\r\n * @example\r\n * ```js\r\n * var draggable = new L.Draggable(elementToDrag);\r\n * draggable.enable();\r\n * ```\r\n */\r\n\r\nvar START = Browser.touch ? 'touchstart mousedown' : 'mousedown';\r\n\r\nexport var Draggable = Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section\r\n\t\t// @aka Draggable options\r\n\t\t// @option clickTolerance: Number = 3\r\n\t\t// The max number of pixels a user can shift the mouse pointer during a click\r\n\t\t// for it to be considered a valid click (as opposed to a mouse drag).\r\n\t\tclickTolerance: 3\r\n\t},\r\n\r\n\t// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline?: Boolean, options?: Draggable options)\r\n\t// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).\r\n\tinitialize: function (element, dragStartTarget, preventOutline, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t\tthis._preventOutline = preventOutline;\r\n\t},\r\n\r\n\t// @method enable()\r\n\t// Enables the dragging ability\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tDomEvent.on(this._dragStartTarget, START, this._onDown, this);\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\t// @method disable()\r\n\t// Disables the dragging ability\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\t// If we're currently dragging this draggable,\r\n\t\t// disabling it counts as first ending the drag.\r\n\t\tif (Draggable._dragging === this) {\r\n\t\t\tthis.finishDrag(true);\r\n\t\t}\r\n\r\n\t\tDomEvent.off(this._dragStartTarget, START, this._onDown, this);\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length !== 1) {\r\n\t\t\t// Finish dragging to avoid conflict with touchZoom\r\n\t\t\tif (Draggable._dragging === this) {\r\n\t\t\t\tthis.finishDrag();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\t\tDraggable._dragging = this;  // Prevent dragging multiple objects at once.\r\n\r\n\t\tif (this._preventOutline) {\r\n\t\t\tDomUtil.preventOutline(this._element);\r\n\t\t}\r\n\r\n\t\tDomUtil.disableImageDrag();\r\n\t\tDomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\t// @event down: Event\r\n\t\t// Fired when a drag is about to start.\r\n\t\tthis.fire('down');\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e,\r\n\t\t    sizedParent = DomUtil.getSizedParentNode(this._element);\r\n\r\n\t\tthis._startPoint = new Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = DomUtil.getPosition(this._element);\r\n\r\n\t\t// Cache the scale, so that we can continuously compensate for it during drag (_onMove).\r\n\t\tthis._parentScale = DomUtil.getScale(sizedParent);\r\n\r\n\t\tvar mouseevent = e.type === 'mousedown';\r\n\t\tDomEvent.on(document, mouseevent ? 'mousemove' : 'touchmove', this._onMove, this);\r\n\t\tDomEvent.on(document, mouseevent ? 'mouseup' : 'touchend touchcancel', this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t    offset = new Point(first.clientX, first.clientY)._subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\r\n\r\n\t\t// We assume that the parent container's position, border and scale do not change for the duration of the drag.\r\n\t\t// Therefore there is no need to account for the position and border (they are eliminated by the subtraction)\r\n\t\t// and we can use the cached value for the scale.\r\n\t\toffset.x /= this._parentScale.x;\r\n\t\toffset.y /= this._parentScale.y;\r\n\r\n\t\tDomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\t// @event dragstart: Event\r\n\t\t\t// Fired when a drag starts\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\r\n\t\t\tDomUtil.addClass(document.body, 'leaflet-dragging');\r\n\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\t// IE and Edge do not give the <use> element, so fetch it\r\n\t\t\t// if necessary\r\n\t\t\tif (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) {\r\n\t\t\t\tthis._lastTarget = this._lastTarget.correspondingUseElement;\r\n\t\t\t}\r\n\t\t\tDomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tthis._lastEvent = e;\r\n\t\tthis._updatePosition();\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tvar e = {originalEvent: this._lastEvent};\r\n\r\n\t\t// @event predrag: Event\r\n\t\t// Fired continuously during dragging *before* each corresponding\r\n\t\t// update of the element's position.\r\n\t\tthis.fire('predrag', e);\r\n\t\tDomUtil.setPosition(this._element, this._newPos);\r\n\r\n\t\t// @event drag: Event\r\n\t\t// Fired continuously during dragging.\r\n\t\tthis.fire('drag', e);\r\n\t},\r\n\r\n\t_onUp: function () {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\t\tthis.finishDrag();\r\n\t},\r\n\r\n\tfinishDrag: function (noInertia) {\r\n\t\tDomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tDomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tDomEvent.off(document, 'mousemove touchmove', this._onMove, this);\r\n\t\tDomEvent.off(document, 'mouseup touchend touchcancel', this._onUp, this);\r\n\r\n\t\tDomUtil.enableImageDrag();\r\n\t\tDomUtil.enableTextSelection();\r\n\r\n\t\tvar fireDragend = this._moved && this._moving;\r\n\r\n\t\tthis._moving = false;\r\n\t\tDraggable._dragging = false;\r\n\r\n\t\tif (fireDragend) {\r\n\t\t\t// @event dragend: DragEndEvent\r\n\t\t\t// Fired when the drag ends.\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tnoInertia: noInertia,\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n});\r\n","import * as LineUtil from './LineUtil';\r\nimport {toLatLng} from '../geo/LatLng';\r\nimport {toPoint} from './Point';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\n/*\r\n * @namespace PolyUtil\r\n * Various utility functions for polygon geometries.\r\n */\r\n\r\n/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]\r\n * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).\r\n * Used by Leaflet to only show polygon points that are on the screen or near, increasing\r\n * performance. Note that polygon points needs different algorithm for clipping\r\n * than polyline, so there's a separate method for it.\r\n */\r\nexport function clipPolygon(points, bounds, round) {\r\n\tvar clippedPoints,\r\n\t    edges = [1, 4, 2, 8],\r\n\t    i, j, k,\r\n\t    a, b,\r\n\t    len, edge, p;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = LineUtil._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = LineUtil._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\t\tp._code = LineUtil._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = LineUtil._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\tp._code = LineUtil._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n}\r\n\r\n/* @function polygonCenter(latlngs: LatLng[], crs: CRS): LatLng\r\n * Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the passed LatLngs (first ring) from a polygon.\r\n */\r\nexport function polygonCenter(latlngs, crs) {\r\n\tvar i, j, p1, p2, f, area, x, y, center;\r\n\r\n\tif (!latlngs || latlngs.length === 0) {\r\n\t\tthrow new Error('latlngs not passed');\r\n\t}\r\n\r\n\tif (!LineUtil.isFlat(latlngs)) {\r\n\t\tconsole.warn('latlngs are not flat! Only the first ring will be used');\r\n\t\tlatlngs = latlngs[0];\r\n\t}\r\n\r\n\tvar centroidLatLng = toLatLng([0, 0]);\r\n\r\n\tvar bounds = toLatLngBounds(latlngs);\r\n\tvar areaBounds = bounds.getNorthWest().distanceTo(bounds.getSouthWest()) * bounds.getNorthEast().distanceTo(bounds.getNorthWest());\r\n\t// tests showed that below 1700 rounding errors are happening\r\n\tif (areaBounds < 1700) {\r\n\t\t// getting a inexact center, to move the latlngs near to [0, 0] to prevent rounding errors\r\n\t\tcentroidLatLng = centroid(latlngs);\r\n\t}\r\n\r\n\tvar len = latlngs.length;\r\n\tvar points = [];\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tvar latlng = toLatLng(latlngs[i]);\r\n\t\tpoints.push(crs.project(toLatLng([latlng.lat - centroidLatLng.lat, latlng.lng - centroidLatLng.lng])));\r\n\t}\r\n\r\n\tarea = x = y = 0;\r\n\r\n\t// polygon centroid algorithm;\r\n\tfor (i = 0, j = len - 1; i < len; j = i++) {\r\n\t\tp1 = points[i];\r\n\t\tp2 = points[j];\r\n\r\n\t\tf = p1.y * p2.x - p2.y * p1.x;\r\n\t\tx += (p1.x + p2.x) * f;\r\n\t\ty += (p1.y + p2.y) * f;\r\n\t\tarea += f * 3;\r\n\t}\r\n\r\n\tif (area === 0) {\r\n\t\t// Polygon is so small that all points are on same pixel.\r\n\t\tcenter = points[0];\r\n\t} else {\r\n\t\tcenter = [x / area, y / area];\r\n\t}\r\n\r\n\tvar latlngCenter = crs.unproject(toPoint(center));\r\n\treturn toLatLng([latlngCenter.lat + centroidLatLng.lat, latlngCenter.lng + centroidLatLng.lng]);\r\n}\r\n\r\n/* @function centroid(latlngs: LatLng[]): LatLng\r\n * Returns the 'center of mass' of the passed LatLngs.\r\n */\r\nexport function centroid(coords) {\r\n\tvar latSum = 0;\r\n\tvar lngSum = 0;\r\n\tvar len = 0;\r\n\tfor (var i = 0; i < coords.length; i++) {\r\n\t\tvar latlng = toLatLng(coords[i]);\r\n\t\tlatSum += latlng.lat;\r\n\t\tlngSum += latlng.lng;\r\n\t\tlen++;\r\n\t}\r\n\treturn toLatLng([latSum / len, lngSum / len]);\r\n}\r\n","import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @section\r\n * Leaflet comes with a set of already defined Projections out of the box:\r\n *\r\n * @projection L.Projection.LonLat\r\n *\r\n * Equirectangular, or Plate Carree projection — the most simple projection,\r\n * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as\r\n * latitude. Also suitable for flat worlds, e.g. game maps. Used by the\r\n * `EPSG:4326` and `Simple` CRS.\r\n */\r\n\r\nexport var LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new LatLng(point.y, point.x);\r\n\t},\r\n\r\n\tbounds: new Bounds([-180, -90], [180, 90])\r\n};\r\n","import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.Mercator\r\n *\r\n * Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.\r\n */\r\n\r\nexport var Mercator = {\r\n\tR: 6378137,\r\n\tR_MINOR: 6356752.314245179,\r\n\r\n\tbounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    r = this.R,\r\n\t\t    y = latlng.lat * d,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    con = e * Math.sin(y);\r\n\r\n\t\tvar ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\ty = -r * Math.log(Math.max(ts, 1E-10));\r\n\r\n\t\treturn new Point(latlng.lng * d * r, y);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI,\r\n\t\t    r = this.R,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    ts = Math.exp(-point.y / r),\r\n\t\t    phi = Math.PI / 2 - 2 * Math.atan(ts);\r\n\r\n\t\tfor (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\r\n\t\t\tcon = e * Math.sin(phi);\r\n\t\t\tcon = Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\t\tdphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new LatLng(phi * d, point.x * d / r);\r\n\t}\r\n};\r\n","import {Earth} from './CRS.Earth';\r\nimport {Mercator} from '../projection/Projection.Mercator';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3395\r\n *\r\n * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.\r\n */\r\nexport var EPSG3395 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:3395',\r\n\tprojection: Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * Mercator.R);\r\n\t\treturn toTransformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n","import {Earth} from './CRS.Earth';\r\nimport {LonLat} from '../projection/Projection.LonLat';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG4326\r\n *\r\n * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.\r\n *\r\n * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),\r\n * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`\r\n * with this CRS, ensure that there are two 256x256 pixel tiles covering the\r\n * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),\r\n * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.\r\n */\r\n\r\nexport var EPSG4326 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:4326',\r\n\tprojection: LonLat,\r\n\ttransformation: toTransformation(1 / 180, 1, -1 / 180, 0.5)\r\n});\r\n","import {CRS} from './CRS';\nimport {LonLat} from '../projection/Projection.LonLat';\nimport {toTransformation} from '../../geometry/Transformation';\nimport * as Util from '../../core/Util';\n\n/*\n * @namespace CRS\n * @crs L.CRS.Simple\n *\n * A simple CRS that maps longitude and latitude into `x` and `y` directly.\n * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`\n * axis should still be inverted (going from bottom to top). `distance()` returns\n * simple euclidean distance.\n */\n\nexport var Simple = Util.extend({}, CRS, {\n\tprojection: LonLat,\n\ttransformation: toTransformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t},\n\n\tzoom: function (scale) {\n\t\treturn Math.log(scale) / Math.LN2;\n\t},\n\n\tdistance: function (latlng1, latlng2) {\n\t\tvar dx = latlng2.lng - latlng1.lng,\n\t\t    dy = latlng2.lat - latlng1.lat;\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t},\n\n\tinfinite: true\n});\n","import {CRS} from './CRS';\nimport {Earth} from './CRS.Earth';\nimport {EPSG3395} from './CRS.EPSG3395';\nimport {EPSG3857, EPSG900913} from './CRS.EPSG3857';\nimport {EPSG4326} from './CRS.EPSG4326';\nimport {Simple} from './CRS.Simple';\n\nCRS.Earth = Earth;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\n\nexport {CRS};\n","import {Evented} from '../core/Events';\nimport {Map} from '../map/Map';\nimport * as Util from '../core/Util';\n\n/*\n * @class Layer\n * @inherits Evented\n * @aka L.Layer\n * @aka ILayer\n *\n * A set of methods from the Layer base class that all Leaflet layers use.\n * Inherits all methods, options and events from `L.Evented`.\n *\n * @example\n *\n * ```js\n * var layer = L.marker(latlng).addTo(map);\n * layer.addTo(map);\n * layer.remove();\n * ```\n *\n * @event add: Event\n * Fired after the layer is added to a map\n *\n * @event remove: Event\n * Fired after the layer is removed from a map\n */\n\n\nexport var Layer = Evented.extend({\n\n\t// Classes extending `L.Layer` will inherit the following options:\n\toptions: {\n\t\t// @option pane: String = 'overlayPane'\n\t\t// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.\n\t\tpane: 'overlayPane',\n\n\t\t// @option attribution: String = null\n\t\t// String to be shown in the attribution control, e.g. \"© OpenStreetMap contributors\". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.\n\t\tattribution: null,\n\n\t\tbubblingMouseEvents: true\n\t},\n\n\t/* @section\n\t * Classes extending `L.Layer` will inherit the following methods:\n\t *\n\t * @method addTo(map: Map|LayerGroup): this\n\t * Adds the layer to the given map or layer group.\n\t */\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\t// @method remove: this\n\t// Removes the layer from the map it is currently active on.\n\tremove: function () {\n\t\treturn this.removeFrom(this._map || this._mapToAdd);\n\t},\n\n\t// @method removeFrom(map: Map): this\n\t// Removes the layer from the given map\n\t//\n\t// @alternative\n\t// @method removeFrom(group: LayerGroup): this\n\t// Removes the layer from the given `LayerGroup`\n\tremoveFrom: function (obj) {\n\t\tif (obj) {\n\t\t\tobj.removeLayer(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPane(name? : String): HTMLElement\n\t// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.\n\tgetPane: function (name) {\n\t\treturn this._map.getPane(name ? (this.options[name] || name) : this.options.pane);\n\t},\n\n\taddInteractiveTarget: function (targetEl) {\n\t\tthis._map._targets[Util.stamp(targetEl)] = this;\n\t\treturn this;\n\t},\n\n\tremoveInteractiveTarget: function (targetEl) {\n\t\tdelete this._map._targets[Util.stamp(targetEl)];\n\t\treturn this;\n\t},\n\n\t// @method getAttribution: String\n\t// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t_layerAdd: function (e) {\n\t\tvar map = e.target;\n\n\t\t// check in case layer gets added and then removed before the map is ready\n\t\tif (!map.hasLayer(this)) { return; }\n\n\t\tthis._map = map;\n\t\tthis._zoomAnimated = map._zoomAnimated;\n\n\t\tif (this.getEvents) {\n\t\t\tvar events = this.getEvents();\n\t\t\tmap.on(events, this);\n\t\t\tthis.once('remove', function () {\n\t\t\t\tmap.off(events, this);\n\t\t\t}, this);\n\t\t}\n\n\t\tthis.onAdd(map);\n\n\t\tthis.fire('add');\n\t\tmap.fire('layeradd', {layer: this});\n\t}\n});\n\n/* @section Extension methods\n * @uninheritable\n *\n * Every layer should extend from `L.Layer` and (re-)implement the following methods.\n *\n * @method onAdd(map: Map): this\n * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).\n *\n * @method onRemove(map: Map): this\n * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).\n *\n * @method getEvents(): Object\n * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.\n *\n * @method getAttribution(): String\n * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.\n *\n * @method beforeAdd(map: Map): this\n * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.\n */\n\n\n/* @namespace Map\n * @section Layer events\n *\n * @event layeradd: LayerEvent\n * Fired when a new layer is added to the map.\n *\n * @event layerremove: LayerEvent\n * Fired when some layer is removed from the map\n *\n * @section Methods for Layers and Controls\n */\nMap.include({\n\t// @method addLayer(layer: Layer): this\n\t// Adds the given layer to the map\n\taddLayer: function (layer) {\n\t\tif (!layer._layerAdd) {\n\t\t\tthrow new Error('The provided object is not a Layer.');\n\t\t}\n\n\t\tvar id = Util.stamp(layer);\n\t\tif (this._layers[id]) { return this; }\n\t\tthis._layers[id] = layer;\n\n\t\tlayer._mapToAdd = this;\n\n\t\tif (layer.beforeAdd) {\n\t\t\tlayer.beforeAdd(this);\n\t\t}\n\n\t\tthis.whenReady(layer._layerAdd, layer);\n\n\t\treturn this;\n\t},\n\n\t// @method removeLayer(layer: Layer): this\n\t// Removes the given layer from the map.\n\tremoveLayer: function (layer) {\n\t\tvar id = Util.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t\tlayer.fire('remove');\n\t\t}\n\n\t\tlayer._map = layer._mapToAdd = null;\n\n\t\treturn this;\n\t},\n\n\t// @method hasLayer(layer: Layer): Boolean\n\t// Returns `true` if the given layer is currently added to the map\n\thasLayer: function (layer) {\n\t\treturn Util.stamp(layer) in this._layers;\n\t},\n\n\t/* @method eachLayer(fn: Function, context?: Object): this\n\t * Iterates over the layers of the map, optionally specifying context of the iterator function.\n\t * ```\n\t * map.eachLayer(function(layer){\n\t *     layer.bindPopup('Hello');\n\t * });\n\t * ```\n\t */\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\t_addZoomLimit: function (layer) {\n\t\tif (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {\n\t\t\tthis._zoomBoundLayers[Util.stamp(layer)] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_removeZoomLimit: function (layer) {\n\t\tvar id = Util.stamp(layer);\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar minZoom = Infinity,\n\t\t    maxZoom = -Infinity,\n\t\t    oldZoomSpan = this._getZoomSpan();\n\n\t\tfor (var i in this._zoomBoundLayers) {\n\t\t\tvar options = this._zoomBoundLayers[i].options;\n\n\t\t\tminZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);\n\t\t\tmaxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);\n\t\t}\n\n\t\tthis._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;\n\t\tthis._layersMinZoom = minZoom === Infinity ? undefined : minZoom;\n\n\t\t// @section Map state change events\n\t\t// @event zoomlevelschange: Event\n\t\t// Fired when the number of zoomlevels on the map is changed due\n\t\t// to adding or removing a layer.\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\n\t\tif (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {\n\t\t\tthis.setZoom(this._layersMaxZoom);\n\t\t}\n\t\tif (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {\n\t\t\tthis.setZoom(this._layersMinZoom);\n\t\t}\n\t}\n});\n","\r\nimport {Layer} from './Layer';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class LayerGroup\r\n * @aka L.LayerGroup\r\n * @inherits Interactive layer\r\n *\r\n * Used to group several layers and handle them as one. If you add it to the map,\r\n * any layers added or removed from the group will be added/removed on the map as\r\n * well. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.layerGroup([marker1, marker2])\r\n * \t.addLayer(polyline)\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nexport var LayerGroup = Layer.extend({\r\n\r\n\tinitialize: function (layers, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addLayer(layer: Layer): this\r\n\t// Adds the given layer to the group.\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Removes the given layer from the group.\r\n\t// @alternative\r\n\t// @method removeLayer(id: Number): this\r\n\t// Removes the layer with the given internal ID from the group.\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method hasLayer(layer: Layer): Boolean\r\n\t// Returns `true` if the given layer is currently added to the group.\r\n\t// @alternative\r\n\t// @method hasLayer(id: Number): Boolean\r\n\t// Returns `true` if the given internal ID is currently added to the group.\r\n\thasLayer: function (layer) {\r\n\t\tvar layerId = typeof layer === 'number' ? layer : this.getLayerId(layer);\r\n\t\treturn layerId in this._layers;\r\n\t},\r\n\r\n\t// @method clearLayers(): this\r\n\t// Removes all the layers from the group.\r\n\tclearLayers: function () {\r\n\t\treturn this.eachLayer(this.removeLayer, this);\r\n\t},\r\n\r\n\t// @method invoke(methodName: String, …): this\r\n\t// Calls `methodName` on every layer contained in this group, passing any\r\n\t// additional parameters. Has no effect if the layers contained do not\r\n\t// implement `methodName`.\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t},\r\n\r\n\t// @method eachLayer(fn: Function, context?: Object): this\r\n\t// Iterates over the layers of the group, optionally specifying context of the iterator function.\r\n\t// ```js\r\n\t// group.eachLayer(function (layer) {\r\n\t// \tlayer.bindPopup('Hello');\r\n\t// });\r\n\t// ```\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getLayer(id: Number): Layer\r\n\t// Returns the layer with the given internal ID.\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\t// @method getLayers(): Layer[]\r\n\t// Returns an array of all the layers added to the group.\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\t\tthis.eachLayer(layers.push, layers);\r\n\t\treturn layers;\r\n\t},\r\n\r\n\t// @method setZIndex(zIndex: Number): this\r\n\t// Calls `setZIndex` on every layer contained in this group, passing the z-index.\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\t// @method getLayerId(layer: Layer): Number\r\n\t// Returns the internal ID for a layer\r\n\tgetLayerId: function (layer) {\r\n\t\treturn Util.stamp(layer);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.layerGroup(layers?: Layer[], options?: Object)\r\n// Create a layer group, optionally given an initial set of layers and an `options` object.\r\nexport var layerGroup = function (layers, options) {\r\n\treturn new LayerGroup(layers, options);\r\n};\r\n","import {LayerGroup} from './LayerGroup';\r\nimport {LatLngBounds} from '../geo/LatLngBounds';\r\n\r\n/*\r\n * @class FeatureGroup\r\n * @aka L.FeatureGroup\r\n * @inherits LayerGroup\r\n *\r\n * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:\r\n *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))\r\n *  * Events are propagated to the `FeatureGroup`, so if the group has an event\r\n * handler, it will handle events from any of the layers. This includes mouse events\r\n * and custom events.\r\n *  * Has `layeradd` and `layerremove` events\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.featureGroup([marker1, marker2, polyline])\r\n * \t.bindPopup('Hello world!')\r\n * \t.on('click', function() { alert('Clicked on a member of the group!'); })\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nexport var FeatureGroup = LayerGroup.extend({\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlayer.addEventParent(this);\r\n\r\n\t\tLayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\t// @event layeradd: LayerEvent\r\n\t\t// Fired when a layer is added to this `FeatureGroup`\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.removeEventParent(this);\r\n\r\n\t\tLayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\t// @event layerremove: LayerEvent\r\n\t\t// Fired when a layer is removed from this `FeatureGroup`\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\t// @method setStyle(style: Path options): this\r\n\t// Sets the given path options to each layer of the group that has a `setStyle` method.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer group to the back of all other layers\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new LatLngBounds();\r\n\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tvar layer = this._layers[id];\r\n\t\t\tbounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());\r\n\t\t}\r\n\t\treturn bounds;\r\n\t}\r\n});\r\n\r\n// @factory L.featureGroup(layers?: Layer[], options?: Object)\r\n// Create a feature group, optionally given an initial set of layers and an `options` object.\r\nexport var featureGroup = function (layers, options) {\r\n\treturn new FeatureGroup(layers, options);\r\n};\r\n","import {Class} from '../../core/Class';\r\nimport {setOptions} from '../../core/Util';\r\nimport {toPoint as point} from '../../geometry/Point';\r\nimport Browser from '../../core/Browser';\r\n\r\n/*\r\n * @class Icon\r\n * @aka L.Icon\r\n *\r\n * Represents an icon to provide when creating a marker.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var myIcon = L.icon({\r\n *     iconUrl: 'my-icon.png',\r\n *     iconRetinaUrl: 'my-icon@2x.png',\r\n *     iconSize: [38, 95],\r\n *     iconAnchor: [22, 94],\r\n *     popupAnchor: [-3, -76],\r\n *     shadowUrl: 'my-icon-shadow.png',\r\n *     shadowRetinaUrl: 'my-icon-shadow@2x.png',\r\n *     shadowSize: [68, 95],\r\n *     shadowAnchor: [22, 94]\r\n * });\r\n *\r\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\r\n * ```\r\n *\r\n * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.\r\n *\r\n */\r\n\r\nexport var Icon = Class.extend({\r\n\r\n\t/* @section\r\n\t * @aka Icon options\r\n\t *\r\n\t * @option iconUrl: String = null\r\n\t * **(required)** The URL to the icon image (absolute or relative to your script path).\r\n\t *\r\n\t * @option iconRetinaUrl: String = null\r\n\t * The URL to a retina sized version of the icon image (absolute or relative to your\r\n\t * script path). Used for Retina screen devices.\r\n\t *\r\n\t * @option iconSize: Point = null\r\n\t * Size of the icon image in pixels.\r\n\t *\r\n\t * @option iconAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the icon (relative to its top left corner). The icon\r\n\t * will be aligned so that this point is at the marker's geographical location. Centered\r\n\t * by default if size is specified, also can be set in CSS with negative margins.\r\n\t *\r\n\t * @option popupAnchor: Point = [0, 0]\r\n\t * The coordinates of the point from which popups will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option tooltipAnchor: Point = [0, 0]\r\n\t * The coordinates of the point from which tooltips will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option shadowUrl: String = null\r\n\t * The URL to the icon shadow image. If not specified, no shadow image will be created.\r\n\t *\r\n\t * @option shadowRetinaUrl: String = null\r\n\t *\r\n\t * @option shadowSize: Point = null\r\n\t * Size of the shadow image in pixels.\r\n\t *\r\n\t * @option shadowAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the shadow (relative to its top left corner) (the same\r\n\t * as iconAnchor if not specified).\r\n\t *\r\n\t * @option className: String = ''\r\n\t * A custom class name to assign to both icon and shadow images. Empty by default.\r\n\t */\r\n\r\n\toptions: {\r\n\t\tpopupAnchor: [0, 0],\r\n\t\ttooltipAnchor: [0, 0],\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tsetOptions(this, options);\r\n\t},\r\n\r\n\t// @method createIcon(oldIcon?: HTMLElement): HTMLElement\r\n\t// Called internally when the icon has to be shown, returns a `<img>` HTML element\r\n\t// styled according to the options.\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\t// @method createShadow(oldIcon?: HTMLElement): HTMLElement\r\n\t// As `createIcon`, but for the shadow beneath it.\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\timg.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options;\r\n\t\tvar sizeOption = options[name + 'Size'];\r\n\r\n\t\tif (typeof sizeOption === 'number') {\r\n\t\t\tsizeOption = [sizeOption, sizeOption];\r\n\t\t}\r\n\r\n\t\tvar size = point(sizeOption),\r\n\t\t    anchor = point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||\r\n\t\t            size && size.divideBy(2, true));\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + (options.className || '');\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop  = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width  = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\treturn Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.icon(options: Icon options)\r\n// Creates an icon instance with the given options.\r\nexport function icon(options) {\r\n\treturn new Icon(options);\r\n}\r\n","import {Icon} from './Icon';\nimport * as DomUtil from '../../dom/DomUtil';\n\n/*\n * @miniclass Icon.Default (Icon)\n * @aka L.Icon.Default\n * @section\n *\n * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when\n * no icon is specified. Points to the blue marker image distributed with Leaflet\n * releases.\n *\n * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`\n * (which is a set of `Icon options`).\n *\n * If you want to _completely_ replace the default icon, override the\n * `L.Marker.prototype.options.icon` with your own icon instead.\n */\n\nexport var IconDefault = Icon.extend({\n\n\toptions: {\n\t\ticonUrl:       'marker-icon.png',\n\t\ticonRetinaUrl: 'marker-icon-2x.png',\n\t\tshadowUrl:     'marker-shadow.png',\n\t\ticonSize:    [25, 41],\n\t\ticonAnchor:  [12, 41],\n\t\tpopupAnchor: [1, -34],\n\t\ttooltipAnchor: [16, -28],\n\t\tshadowSize:  [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (typeof IconDefault.imagePath !== 'string') {\t// Deprecated, backwards-compatibility only\n\t\t\tIconDefault.imagePath = this._detectIconPath();\n\t\t}\n\n\t\t// @option imagePath: String\n\t\t// `Icon.Default` will try to auto-detect the location of the\n\t\t// blue icon images. If you are placing these images in a non-standard\n\t\t// way, set this option to point to the right path.\n\t\treturn (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name);\n\t},\n\n\t_stripUrl: function (path) {\t// separate function to use in tests\n\t\tvar strip = function (str, re, idx) {\n\t\t\tvar match = re.exec(str);\n\t\t\treturn match && match[idx];\n\t\t};\n\t\tpath = strip(path, /^url\\((['\"])?(.+)\\1\\)$/, 2);\n\t\treturn path && strip(path, /^(.*)marker-icon\\.png$/, 1);\n\t},\n\n\t_detectIconPath: function () {\n\t\tvar el = DomUtil.create('div',  'leaflet-default-icon-path', document.body);\n\t\tvar path = DomUtil.getStyle(el, 'background-image') ||\n\t\t           DomUtil.getStyle(el, 'backgroundImage');\t// IE8\n\n\t\tdocument.body.removeChild(el);\n\t\tpath = this._stripUrl(path);\n\t\tif (path) { return path; }\n\t\tvar link = document.querySelector('link[href$=\"leaflet.css\"]');\n\t\tif (!link) { return ''; }\n\t\treturn link.href.substring(0, link.href.length - 'leaflet.css'.length - 1);\n\t}\n});\n","import {Handler} from '../../core/Handler';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {Draggable} from '../../dom/Draggable';\nimport {toBounds} from '../../geometry/Bounds';\nimport {toPoint} from '../../geometry/Point';\nimport {requestAnimFrame, cancelAnimFrame} from '../../core/Util';\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\n\n/* @namespace Marker\n * @section Interaction handlers\n *\n * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:\n *\n * ```js\n * marker.dragging.disable();\n * ```\n *\n * @property dragging: Handler\n * Marker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set [`marker.options.draggable`](#marker-draggable)).\n */\n\nexport var MarkerDrag = Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new Draggable(icon, icon, true);\n\t\t}\n\n\t\tthis._draggable.on({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tpredrag: this._onPreDrag,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).enable();\n\n\t\tDomUtil.addClass(icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.off({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tpredrag: this._onPreDrag,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).disable();\n\n\t\tif (this._marker._icon) {\n\t\t\tDomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t\t}\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_adjustPan: function (e) {\n\t\tvar marker = this._marker,\n\t\t    map = marker._map,\n\t\t    speed = this._marker.options.autoPanSpeed,\n\t\t    padding = this._marker.options.autoPanPadding,\n\t\t    iconPos = DomUtil.getPosition(marker._icon),\n\t\t    bounds = map.getPixelBounds(),\n\t\t    origin = map.getPixelOrigin();\n\n\t\tvar panBounds = toBounds(\n\t\t\tbounds.min._subtract(origin).add(padding),\n\t\t\tbounds.max._subtract(origin).subtract(padding)\n\t\t);\n\n\t\tif (!panBounds.contains(iconPos)) {\n\t\t\t// Compute incremental movement\n\t\t\tvar movement = toPoint(\n\t\t\t\t(Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) -\n\t\t\t\t(Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x),\n\n\t\t\t\t(Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) -\n\t\t\t\t(Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y)\n\t\t\t).multiplyBy(speed);\n\n\t\t\tmap.panBy(movement, {animate: false});\n\n\t\t\tthis._draggable._newPos._add(movement);\n\t\t\tthis._draggable._startPos._add(movement);\n\n\t\t\tDomUtil.setPosition(marker._icon, this._draggable._newPos);\n\t\t\tthis._onDrag(e);\n\n\t\t\tthis._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));\n\t\t}\n\t},\n\n\t_onDragStart: function () {\n\t\t// @section Dragging events\n\t\t// @event dragstart: Event\n\t\t// Fired when the user starts dragging the marker.\n\n\t\t// @event movestart: Event\n\t\t// Fired when the marker starts moving (because of dragging).\n\n\t\tthis._oldLatLng = this._marker.getLatLng();\n\n\t\t// When using ES6 imports it could not be set when `Popup` was not imported as well\n\t\tthis._marker.closePopup && this._marker.closePopup();\n\n\t\tthis._marker\n\t\t\t.fire('movestart')\n\t\t\t.fire('dragstart');\n\t},\n\n\t_onPreDrag: function (e) {\n\t\tif (this._marker.options.autoPan) {\n\t\t\tcancelAnimFrame(this._panRequest);\n\t\t\tthis._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tvar marker = this._marker,\n\t\t    shadow = marker._shadow,\n\t\t    iconPos = DomUtil.getPosition(marker._icon),\n\t\t    latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tDomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\t\te.latlng = latlng;\n\t\te.oldLatLng = this._oldLatLng;\n\n\t\t// @event drag: Event\n\t\t// Fired repeatedly while the user drags the marker.\n\t\tmarker\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onDragEnd: function (e) {\n\t\t// @event dragend: DragEndEvent\n\t\t// Fired when the user stops dragging the marker.\n\n\t\t cancelAnimFrame(this._panRequest);\n\n\t\t// @event moveend: Event\n\t\t// Fired when the marker stops moving (because of dragging).\n\t\tdelete this._oldLatLng;\n\t\tthis._marker\n\t\t    .fire('moveend')\n\t\t    .fire('dragend', e);\n\t}\n});\n","import {Layer} from '../Layer';\r\nimport {IconDefault} from './Icon.Default';\r\nimport * as Util from '../../core/Util';\r\nimport {toLatLng as latLng} from '../../geo/LatLng';\r\nimport {toPoint as point} from '../../geometry/Point';\r\nimport * as DomUtil from '../../dom/DomUtil';\r\nimport * as DomEvent from '../../dom/DomEvent';\r\nimport {MarkerDrag} from './Marker.Drag';\r\n\r\n/*\r\n * @class Marker\r\n * @inherits Interactive layer\r\n * @aka L.Marker\r\n * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.marker([50.5, 30.5]).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var Marker = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka Marker options\r\n\toptions: {\r\n\t\t// @option icon: Icon = *\r\n\t\t// Icon instance to use for rendering the marker.\r\n\t\t// See [Icon documentation](#L.Icon) for details on how to customize the marker icon.\r\n\t\t// If not specified, a common instance of `L.Icon.Default` is used.\r\n\t\ticon: new IconDefault(),\r\n\r\n\t\t// Option inherited from \"Interactive layer\" abstract class\r\n\t\tinteractive: true,\r\n\r\n\t\t// @option keyboard: Boolean = true\r\n\t\t// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.\r\n\t\tkeyboard: true,\r\n\r\n\t\t// @option title: String = ''\r\n\t\t// Text for the browser tooltip that appear on marker hover (no tooltip by default).\r\n\t\t// [Useful for accessibility](https://leafletjs.com/examples/accessibility/#markers-must-be-labelled).\r\n\t\ttitle: '',\r\n\r\n\t\t// @option alt: String = 'Marker'\r\n\t\t// Text for the `alt` attribute of the icon image.\r\n\t\t// [Useful for accessibility](https://leafletjs.com/examples/accessibility/#markers-must-be-labelled).\r\n\t\talt: 'Marker',\r\n\r\n\t\t// @option zIndexOffset: Number = 0\r\n\t\t// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\r\n\t\tzIndexOffset: 0,\r\n\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the marker.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option riseOnHover: Boolean = false\r\n\t\t// If `true`, the marker will get on top of others when you hover the mouse over it.\r\n\t\triseOnHover: false,\r\n\r\n\t\t// @option riseOffset: Number = 250\r\n\t\t// The z-index offset used for the `riseOnHover` feature.\r\n\t\triseOffset: 250,\r\n\r\n\t\t// @option pane: String = 'markerPane'\r\n\t\t// `Map pane` where the markers icon will be added.\r\n\t\tpane: 'markerPane',\r\n\r\n\t\t// @option shadowPane: String = 'shadowPane'\r\n\t\t// `Map pane` where the markers shadow will be added.\r\n\t\tshadowPane: 'shadowPane',\r\n\r\n\t\t// @option bubblingMouseEvents: Boolean = false\r\n\t\t// When `true`, a mouse event on this marker will trigger the same event on the map\r\n\t\t// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).\r\n\t\tbubblingMouseEvents: false,\r\n\r\n\t\t// @option autoPanOnFocus: Boolean = true\r\n\t\t// When `true`, the map will pan whenever the marker is focused (via\r\n\t\t// e.g. pressing `tab` on the keyboard) to ensure the marker is\r\n\t\t// visible within the map's bounds\r\n\t\tautoPanOnFocus: true,\r\n\r\n\t\t// @section Draggable marker options\r\n\t\t// @option draggable: Boolean = false\r\n\t\t// Whether the marker is draggable with mouse/touch or not.\r\n\t\tdraggable: false,\r\n\r\n\t\t// @option autoPan: Boolean = false\r\n\t\t// Whether to pan the map when dragging this marker near its edge or not.\r\n\t\tautoPan: false,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(50, 50)\r\n\t\t// Distance (in pixels to the left/right and to the top/bottom) of the\r\n\t\t// map edge to start panning the map.\r\n\t\tautoPanPadding: [50, 50],\r\n\r\n\t\t// @option autoPanSpeed: Number = 10\r\n\t\t// Number of pixels the map should pan by.\r\n\t\tautoPanSpeed: 10\r\n\t},\r\n\r\n\t/* @section\r\n\t *\r\n\t * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:\r\n\t */\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\t\tthis._latlng = latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging && this.dragging.enabled()) {\r\n\t\t\tthis.options.draggable = true;\r\n\t\t\tthis.dragging.removeHooks();\r\n\t\t}\r\n\t\tdelete this.dragging;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\treturn {\r\n\t\t\tzoom: this.update,\r\n\t\t\tviewreset: this.update\r\n\t\t};\r\n\t},\r\n\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the current geographical position of the marker.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Changes the marker position to the given point.\r\n\tsetLatLng: function (latlng) {\r\n\t\tvar oldLatLng = this._latlng;\r\n\t\tthis._latlng = latLng(latlng);\r\n\t\tthis.update();\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\r\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\r\n\t},\r\n\r\n\t// @method setZIndexOffset(offset: Number): this\r\n\t// Changes the [zIndex offset](#marker-zindexoffset) of the marker.\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\treturn this.update();\r\n\t},\r\n\r\n\t// @method getIcon: Icon\r\n\t// Returns the current icon used by the marker\r\n\tgetIcon: function () {\r\n\t\treturn this.options.icon;\r\n\t},\r\n\r\n\t// @method setIcon(icon: Icon): this\r\n\t// Changes the marker icon.\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup, this._popup.options);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._icon;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this._icon && this._map) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t    addIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\r\n\t\t\tif (icon.tagName === 'IMG') {\r\n\t\t\t\ticon.alt = options.alt || '';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tDomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t\ticon.setAttribute('role', 'button');\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tthis.on({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.options.autoPanOnFocus) {\r\n\t\t\tDomEvent.on(icon, 'focus', this._panOnFocus, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t    addShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tDomUtil.addClass(newShadow, classToAdd);\r\n\t\t\tnewShadow.alt = '';\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tthis.getPane().appendChild(this._icon);\r\n\t\t}\r\n\t\tthis._initInteraction();\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tthis.getPane(options.shadowPane).appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tthis.off({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.options.autoPanOnFocus) {\r\n\t\t\tDomEvent.off(this._icon, 'focus', this._panOnFocus, this);\r\n\t\t}\r\n\r\n\t\tDomUtil.remove(this._icon);\r\n\t\tthis.removeInteractiveTarget(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.remove(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tDomUtil.setPosition(this._icon, pos);\r\n\t\t}\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tif (this._icon) {\r\n\t\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t\t}\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.interactive) { return; }\r\n\r\n\t\tDomUtil.addClass(this._icon, 'leaflet-interactive');\r\n\r\n\t\tthis.addInteractiveTarget(this._icon);\r\n\r\n\t\tif (MarkerDrag) {\r\n\t\t\tvar draggable = this.options.draggable;\r\n\t\t\tif (this.dragging) {\r\n\t\t\t\tdraggable = this.dragging.enabled();\r\n\t\t\t\tthis.dragging.disable();\r\n\t\t\t}\r\n\r\n\t\t\tthis.dragging = new MarkerDrag(this);\r\n\r\n\t\t\tif (draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Changes the opacity of the marker.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar opacity = this.options.opacity;\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tDomUtil.setOpacity(this._icon, opacity);\r\n\t\t}\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.setOpacity(this._shadow, opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t},\r\n\r\n\t_panOnFocus: function () {\r\n\t\tvar map = this._map;\r\n\t\tif (!map) { return; }\r\n\r\n\t\tvar iconOpts = this.options.icon.options;\r\n\t\tvar size = iconOpts.iconSize ? point(iconOpts.iconSize) : point(0, 0);\r\n\t\tvar anchor = iconOpts.iconAnchor ? point(iconOpts.iconAnchor) : point(0, 0);\r\n\r\n\t\tmap.panInside(this._latlng, {\r\n\t\t\tpaddingTopLeft: anchor,\r\n\t\t\tpaddingBottomRight: size.subtract(anchor)\r\n\t\t});\r\n\t},\r\n\r\n\t_getPopupAnchor: function () {\r\n\t\treturn this.options.icon.options.popupAnchor;\r\n\t},\r\n\r\n\t_getTooltipAnchor: function () {\r\n\t\treturn this.options.icon.options.tooltipAnchor;\r\n\t}\r\n});\r\n\r\n\r\n// factory L.marker(latlng: LatLng, options? : Marker options)\r\n\r\n// @factory L.marker(latlng: LatLng, options? : Marker options)\r\n// Instantiates a Marker object given a geographical point and optionally an options object.\r\nexport function marker(latlng, options) {\r\n\treturn new Marker(latlng, options);\r\n}\r\n","import {Layer} from '../Layer';\nimport * as Util from '../../core/Util';\n\n/*\n * @class Path\n * @aka L.Path\n * @inherits Interactive layer\n *\n * An abstract class that contains options and constants shared between vector\n * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.\n */\n\nexport var Path = Layer.extend({\n\n\t// @section\n\t// @aka Path options\n\toptions: {\n\t\t// @option stroke: Boolean = true\n\t\t// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.\n\t\tstroke: true,\n\n\t\t// @option color: String = '#3388ff'\n\t\t// Stroke color\n\t\tcolor: '#3388ff',\n\n\t\t// @option weight: Number = 3\n\t\t// Stroke width in pixels\n\t\tweight: 3,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Stroke opacity\n\t\topacity: 1,\n\n\t\t// @option lineCap: String= 'round'\n\t\t// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.\n\t\tlineCap: 'round',\n\n\t\t// @option lineJoin: String = 'round'\n\t\t// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.\n\t\tlineJoin: 'round',\n\n\t\t// @option dashArray: String = null\n\t\t// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashArray: null,\n\n\t\t// @option dashOffset: String = null\n\t\t// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashOffset: null,\n\n\t\t// @option fill: Boolean = depends\n\t\t// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.\n\t\tfill: false,\n\n\t\t// @option fillColor: String = *\n\t\t// Fill color. Defaults to the value of the [`color`](#path-color) option\n\t\tfillColor: null,\n\n\t\t// @option fillOpacity: Number = 0.2\n\t\t// Fill opacity.\n\t\tfillOpacity: 0.2,\n\n\t\t// @option fillRule: String = 'evenodd'\n\t\t// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.\n\t\tfillRule: 'evenodd',\n\n\t\t// className: '',\n\n\t\t// Option inherited from \"Interactive layer\" abstract class\n\t\tinteractive: true,\n\n\t\t// @option bubblingMouseEvents: Boolean = true\n\t\t// When `true`, a mouse event on this path will trigger the same event on the map\n\t\t// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).\n\t\tbubblingMouseEvents: true\n\t},\n\n\tbeforeAdd: function (map) {\n\t\t// Renderer is set here because we need to call renderer.getEvents\n\t\t// before this.getEvents.\n\t\tthis._renderer = map.getRenderer(this);\n\t},\n\n\tonAdd: function () {\n\t\tthis._renderer._initPath(this);\n\t\tthis._reset();\n\t\tthis._renderer._addPath(this);\n\t},\n\n\tonRemove: function () {\n\t\tthis._renderer._removePath(this);\n\t},\n\n\t// @method redraw(): this\n\t// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._renderer._updatePath(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method setStyle(style: Path options): this\n\t// Changes the appearance of a Path based on the options in the `Path options` object.\n\tsetStyle: function (style) {\n\t\tUtil.setOptions(this, style);\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._updateStyle(this);\n\t\t\tif (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) {\n\t\t\t\tthis._updateBounds();\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToFront(): this\n\t// Brings the layer to the top of all path layers.\n\tbringToFront: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToFront(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack(): this\n\t// Brings the layer to the bottom of all path layers.\n\tbringToBack: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToBack(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetElement: function () {\n\t\treturn this._path;\n\t},\n\n\t_reset: function () {\n\t\t// defined in child classes\n\t\tthis._project();\n\t\tthis._update();\n\t},\n\n\t_clickTolerance: function () {\n\t\t// used when doing hit detection for Canvas layers\n\t\treturn (this.options.stroke ? this.options.weight / 2 : 0) +\n\t\t  (this._renderer.options.tolerance || 0);\n\t}\n});\n","import {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport {toLatLng} from '../../geo/LatLng';\nimport {Bounds} from '../../geometry/Bounds';\n\n\n/*\n * @class CircleMarker\n * @aka L.CircleMarker\n * @inherits Path\n *\n * A circle of a fixed size with radius specified in pixels. Extends `Path`.\n */\n\nexport var CircleMarker = Path.extend({\n\n\t// @section\n\t// @aka CircleMarker options\n\toptions: {\n\t\tfill: true,\n\n\t\t// @option radius: Number = 10\n\t\t// Radius of the circle marker, in pixels\n\t\tradius: 10\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tUtil.setOptions(this, options);\n\t\tthis._latlng = toLatLng(latlng);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\t// @method setLatLng(latLng: LatLng): this\n\t// Sets the position of a circle marker to a new location.\n\tsetLatLng: function (latlng) {\n\t\tvar oldLatLng = this._latlng;\n\t\tthis._latlng = toLatLng(latlng);\n\t\tthis.redraw();\n\n\t\t// @event move: Event\n\t\t// Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\n\t},\n\n\t// @method getLatLng(): LatLng\n\t// Returns the current geographical position of the circle marker\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle marker. Units are in pixels.\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of the circle\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t},\n\n\tsetStyle : function (options) {\n\t\tvar radius = options && options.radius || this._radius;\n\t\tPath.prototype.setStyle.call(this, options);\n\t\tthis.setRadius(radius);\n\t\treturn this;\n\t},\n\n\t_project: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._updateBounds();\n\t},\n\n\t_updateBounds: function () {\n\t\tvar r = this._radius,\n\t\t    r2 = this._radiusY || r,\n\t\t    w = this._clickTolerance(),\n\t\t    p = [r + w, r2 + w];\n\t\tthis._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p));\n\t},\n\n\t_update: function () {\n\t\tif (this._map) {\n\t\t\tthis._updatePath();\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updateCircle(this);\n\t},\n\n\t_empty: function () {\n\t\treturn this._radius && !this._renderer._bounds.intersects(this._pxBounds);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p) {\n\t\treturn p.distanceTo(this._point) <= this._radius + this._clickTolerance();\n\t}\n});\n\n\n// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)\n// Instantiates a circle marker object given a geographical point, and an optional options object.\nexport function circleMarker(latlng, options) {\n\treturn new CircleMarker(latlng, options);\n}\n","import {CircleMarker} from './CircleMarker';\nimport {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport {toLatLng} from '../../geo/LatLng';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Earth} from '../../geo/crs/CRS.Earth';\n\n\n/*\n * @class Circle\n * @aka L.Circle\n * @inherits CircleMarker\n *\n * A class for drawing circle overlays on a map. Extends `CircleMarker`.\n *\n * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).\n *\n * @example\n *\n * ```js\n * L.circle([50.5, 30.5], {radius: 200}).addTo(map);\n * ```\n */\n\nexport var Circle = CircleMarker.extend({\n\n\tinitialize: function (latlng, options, legacyOptions) {\n\t\tif (typeof options === 'number') {\n\t\t\t// Backwards compatibility with 0.7.x factory (latlng, radius, options?)\n\t\t\toptions = Util.extend({}, legacyOptions, {radius: options});\n\t\t}\n\t\tUtil.setOptions(this, options);\n\t\tthis._latlng = toLatLng(latlng);\n\n\t\tif (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }\n\n\t\t// @section\n\t\t// @aka Circle options\n\t\t// @option radius: Number; Radius of the circle, in meters.\n\t\tthis._mRadius = this.options.radius;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle. Units are in meters.\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of a circle. Units are in meters.\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\tvar half = [this._radius, this._radiusY || this._radius];\n\n\t\treturn new LatLngBounds(\n\t\t\tthis._map.layerPointToLatLng(this._point.subtract(half)),\n\t\t\tthis._map.layerPointToLatLng(this._point.add(half)));\n\t},\n\n\tsetStyle: Path.prototype.setStyle,\n\n\t_project: function () {\n\n\t\tvar lng = this._latlng.lng,\n\t\t    lat = this._latlng.lat,\n\t\t    map = this._map,\n\t\t    crs = map.options.crs;\n\n\t\tif (crs.distance === Earth.distance) {\n\t\t\tvar d = Math.PI / 180,\n\t\t\t    latR = (this._mRadius / Earth.R) / d,\n\t\t\t    top = map.project([lat + latR, lng]),\n\t\t\t    bottom = map.project([lat - latR, lng]),\n\t\t\t    p = top.add(bottom).divideBy(2),\n\t\t\t    lat2 = map.unproject(p).lat,\n\t\t\t    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /\n\t\t\t            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;\n\n\t\t\tif (isNaN(lngR) || lngR === 0) {\n\t\t\t\tlngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425\n\t\t\t}\n\n\t\t\tthis._point = p.subtract(map.getPixelOrigin());\n\t\t\tthis._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x;\n\t\t\tthis._radiusY = p.y - top.y;\n\n\t\t} else {\n\t\t\tvar latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));\n\n\t\t\tthis._point = map.latLngToLayerPoint(this._latlng);\n\t\t\tthis._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;\n\t\t}\n\n\t\tthis._updateBounds();\n\t}\n});\n\n// @factory L.circle(latlng: LatLng, options?: Circle options)\n// Instantiates a circle object given a geographical point, and an options object\n// which contains the circle radius.\n// @alternative\n// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)\n// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.\n// Do not use in new applications or plugins.\nexport function circle(latlng, options, legacyOptions) {\n\treturn new Circle(latlng, options, legacyOptions);\n}\n","import {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport * as LineUtil from '../../geometry/LineUtil';\nimport {LatLng, toLatLng} from '../../geo/LatLng';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Bounds} from '../../geometry/Bounds';\nimport {Point} from '../../geometry/Point';\n\n/*\n * @class Polyline\n * @aka L.Polyline\n * @inherits Path\n *\n * A class for drawing polyline overlays on a map. Extends `Path`.\n *\n * @example\n *\n * ```js\n * // create a red polyline from an array of LatLng points\n * var latlngs = [\n * \t[45.51, -122.68],\n * \t[37.77, -122.43],\n * \t[34.04, -118.2]\n * ];\n *\n * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polyline\n * map.fitBounds(polyline.getBounds());\n * ```\n *\n * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:\n *\n * ```js\n * // create a red polyline from an array of arrays of LatLng points\n * var latlngs = [\n * \t[[45.51, -122.68],\n * \t [37.77, -122.43],\n * \t [34.04, -118.2]],\n * \t[[40.78, -73.91],\n * \t [41.83, -87.62],\n * \t [32.76, -96.72]]\n * ];\n * ```\n */\n\n\nexport var Polyline = Path.extend({\n\n\t// @section\n\t// @aka Polyline options\n\toptions: {\n\t\t// @option smoothFactor: Number = 1.0\n\t\t// How much to simplify the polyline on each zoom level. More means\n\t\t// better performance and smoother look, and less means more accurate representation.\n\t\tsmoothFactor: 1.0,\n\n\t\t// @option noClip: Boolean = false\n\t\t// Disable polyline clipping.\n\t\tnoClip: false\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tUtil.setOptions(this, options);\n\t\tthis._setLatLngs(latlngs);\n\t},\n\n\t// @method getLatLngs(): LatLng[]\n\t// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\t// @method setLatLngs(latlngs: LatLng[]): this\n\t// Replaces all the points in the polyline with the given array of geographical points.\n\tsetLatLngs: function (latlngs) {\n\t\tthis._setLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\t// @method isEmpty(): Boolean\n\t// Returns `true` if the Polyline has no LatLngs.\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length;\n\t},\n\n\t// @method closestLayerPoint(p: Point): Point\n\t// Returns the point closest to `p` on the Polyline.\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity,\n\t\t    minPoint = null,\n\t\t    closest = LineUtil._sqClosestPointOnSegment,\n\t\t    p1, p2;\n\n\t\tfor (var j = 0, jLen = this._parts.length; j < jLen; j++) {\n\t\t\tvar points = this._parts[j];\n\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\n\t\t\t\tvar sqDist = closest(p, p1, p2, true);\n\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = closest(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](https://en.wikipedia.org/wiki/Centroid)) of the polyline.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\t\treturn LineUtil.polylineCenter(this._defaultShape(), this._map.options.crs);\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\treturn this._bounds;\n\t},\n\n\t// @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this\n\t// Adds a given point to the polyline. By default, adds to the first ring of\n\t// the polyline in case of a multi-polyline, but can be overridden by passing\n\t// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).\n\taddLatLng: function (latlng, latlngs) {\n\t\tlatlngs = latlngs || this._defaultShape();\n\t\tlatlng = toLatLng(latlng);\n\t\tlatlngs.push(latlng);\n\t\tthis._bounds.extend(latlng);\n\t\treturn this.redraw();\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tthis._bounds = new LatLngBounds();\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\t_defaultShape: function () {\n\t\treturn LineUtil.isFlat(this._latlngs) ? this._latlngs : this._latlngs[0];\n\t},\n\n\t// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = [],\n\t\t    flat = LineUtil.isFlat(latlngs);\n\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (flat) {\n\t\t\t\tresult[i] = toLatLng(latlngs[i]);\n\t\t\t\tthis._bounds.extend(result[i]);\n\t\t\t} else {\n\t\t\t\tresult[i] = this._convertLatLngs(latlngs[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\t_project: function () {\n\t\tvar pxBounds = new Bounds();\n\t\tthis._rings = [];\n\t\tthis._projectLatlngs(this._latlngs, this._rings, pxBounds);\n\n\t\tif (this._bounds.isValid() && pxBounds.isValid()) {\n\t\t\tthis._rawPxBounds = pxBounds;\n\t\t\tthis._updateBounds();\n\t\t}\n\t},\n\n\t_updateBounds: function () {\n\t\tvar w = this._clickTolerance(),\n\t\t    p = new Point(w, w);\n\n\t\tif (!this._rawPxBounds) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._pxBounds = new Bounds([\n\t\t\tthis._rawPxBounds.min.subtract(p),\n\t\t\tthis._rawPxBounds.max.add(p)\n\t\t]);\n\t},\n\n\t// recursively turns latlngs into a set of rings with projected coordinates\n\t_projectLatlngs: function (latlngs, result, projectedBounds) {\n\t\tvar flat = latlngs[0] instanceof LatLng,\n\t\t    len = latlngs.length,\n\t\t    i, ring;\n\n\t\tif (flat) {\n\t\t\tring = [];\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tring[i] = this._map.latLngToLayerPoint(latlngs[i]);\n\t\t\t\tprojectedBounds.extend(ring[i]);\n\t\t\t}\n\t\t\tresult.push(ring);\n\t\t} else {\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tthis._projectLatlngs(latlngs[i], result, projectedBounds);\n\t\t\t}\n\t\t}\n\t},\n\n\t// clip polyline by renderer bounds so that we have less to render for performance\n\t_clipPoints: function () {\n\t\tvar bounds = this._renderer._bounds;\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tvar parts = this._parts,\n\t\t    i, j, k, len, len2, segment, points;\n\n\t\tfor (i = 0, k = 0, len = this._rings.length; i < len; i++) {\n\t\t\tpoints = this._rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2 - 1; j++) {\n\t\t\t\tsegment = LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);\n\n\t\t\t\tif (!segment) { continue; }\n\n\t\t\t\tparts[k] = parts[k] || [];\n\t\t\t\tparts[k].push(segment[0]);\n\n\t\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\t\tif ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {\n\t\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline for performance\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t    tolerance = this.options.smoothFactor;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = LineUtil.simplify(parts[i], tolerance);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\t\tthis._updatePath();\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p, closed) {\n\t\tvar i, j, k, len, len2, part,\n\t\t    w = this._clickTolerance();\n\n\t\tif (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }\n\n\t\t// hit detection for polylines\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tif (!closed && (j === 0)) { continue; }\n\n\t\t\t\tif (LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n});\n\n// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)\n// Instantiates a polyline object given an array of geographical points and\n// optionally an options object. You can create a `Polyline` object with\n// multiple separate lines (`MultiPolyline`) by passing an array of arrays\n// of geographic points.\nexport function polyline(latlngs, options) {\n\treturn new Polyline(latlngs, options);\n}\n\n// Retrocompat. Allow plugins to support Leaflet versions before and after 1.1.\nPolyline._flat = LineUtil._flat;\n","import {Polyline} from './Polyline';\nimport {LatLng} from '../../geo/LatLng';\nimport * as LineUtil from '../../geometry/LineUtil';\nimport {Point} from '../../geometry/Point';\nimport {Bounds} from '../../geometry/Bounds';\nimport * as PolyUtil from '../../geometry/PolyUtil';\n\n/*\n * @class Polygon\n * @aka L.Polygon\n * @inherits Polyline\n *\n * A class for drawing polygon overlays on a map. Extends `Polyline`.\n *\n * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.\n *\n *\n * @example\n *\n * ```js\n * // create a red polygon from an array of LatLng points\n * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];\n *\n * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polygon\n * map.fitBounds(polygon.getBounds());\n * ```\n *\n * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:\n *\n * ```js\n * var latlngs = [\n *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n * ];\n * ```\n *\n * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.\n *\n * ```js\n * var latlngs = [\n *   [ // first polygon\n *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n *   ],\n *   [ // second polygon\n *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]\n *   ]\n * ];\n * ```\n */\n\nexport var Polygon = Polyline.extend({\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length || !this._latlngs[0].length;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the Polygon.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\t\treturn PolyUtil.polygonCenter(this._defaultShape(), this._map.options.crs);\n\t},\n\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = Polyline.prototype._convertLatLngs.call(this, latlngs),\n\t\t    len = result.length;\n\n\t\t// remove last point if it equals first one\n\t\tif (len >= 2 && result[0] instanceof LatLng && result[0].equals(result[len - 1])) {\n\t\t\tresult.pop();\n\t\t}\n\t\treturn result;\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tPolyline.prototype._setLatLngs.call(this, latlngs);\n\t\tif (LineUtil.isFlat(this._latlngs)) {\n\t\t\tthis._latlngs = [this._latlngs];\n\t\t}\n\t},\n\n\t_defaultShape: function () {\n\t\treturn LineUtil.isFlat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];\n\t},\n\n\t_clipPoints: function () {\n\t\t// polygons need a different clipping algorithm so we redefine that\n\n\t\tvar bounds = this._renderer._bounds,\n\t\t    w = this.options.weight,\n\t\t    p = new Point(w, w);\n\n\t\t// increase clip padding by stroke width to avoid stroke on clip edges\n\t\tbounds = new Bounds(bounds.min.subtract(p), bounds.max.add(p));\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, len = this._rings.length, clipped; i < len; i++) {\n\t\t\tclipped = PolyUtil.clipPolygon(this._rings[i], bounds, true);\n\t\t\tif (clipped.length) {\n\t\t\t\tthis._parts.push(clipped);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this, true);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p) {\n\t\tvar inside = false,\n\t\t    part, p1, p2, i, j, k, len, len2;\n\n\t\tif (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }\n\n\t\t// ray casting algorithm for detecting if point is in polygon\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tp1 = part[j];\n\t\t\t\tp2 = part[k];\n\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n\t\t\t\t\tinside = !inside;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// also check if it's on polygon stroke\n\t\treturn inside || Polyline.prototype._containsPoint.call(this, p, true);\n\t}\n\n});\n\n\n// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)\nexport function polygon(latlngs, options) {\n\treturn new Polygon(latlngs, options);\n}\n","import {LayerGroup} from './LayerGroup';\r\nimport {FeatureGroup} from './FeatureGroup';\r\nimport * as Util from '../core/Util';\r\nimport {Marker} from './marker/Marker';\r\nimport {Circle} from './vector/Circle';\r\nimport {CircleMarker} from './vector/CircleMarker';\r\nimport {Polyline} from './vector/Polyline';\r\nimport {Polygon} from './vector/Polygon';\r\nimport {LatLng} from '../geo/LatLng';\r\nimport * as LineUtil from '../geometry/LineUtil';\r\nimport {toLatLng} from '../geo/LatLng';\r\n\r\n\r\n/*\r\n * @class GeoJSON\r\n * @aka L.GeoJSON\r\n * @inherits FeatureGroup\r\n *\r\n * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse\r\n * GeoJSON data and display it on the map. Extends `FeatureGroup`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.geoJSON(data, {\r\n * \tstyle: function (feature) {\r\n * \t\treturn {color: feature.properties.color};\r\n * \t}\r\n * }).bindPopup(function (layer) {\r\n * \treturn layer.feature.properties.description;\r\n * }).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var GeoJSON = FeatureGroup.extend({\r\n\r\n\t/* @section\r\n\t * @aka GeoJSON options\r\n\t *\r\n\t * @option pointToLayer: Function = *\r\n\t * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally\r\n\t * called when data is added, passing the GeoJSON point feature and its `LatLng`.\r\n\t * The default is to spawn a default `Marker`:\r\n\t * ```js\r\n\t * function(geoJsonPoint, latlng) {\r\n\t * \treturn L.marker(latlng);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option style: Function = *\r\n\t * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,\r\n\t * called internally when data is added.\r\n\t * The default value is to not override any defaults:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn {}\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option onEachFeature: Function = *\r\n\t * A `Function` that will be called once for each created `Feature`, after it has\r\n\t * been created and styled. Useful for attaching events and popups to features.\r\n\t * The default is to do nothing with the newly created layers:\r\n\t * ```js\r\n\t * function (feature, layer) {}\r\n\t * ```\r\n\t *\r\n\t * @option filter: Function = *\r\n\t * A `Function` that will be used to decide whether to include a feature or not.\r\n\t * The default is to include all features:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn true;\r\n\t * }\r\n\t * ```\r\n\t * Note: dynamically changing the `filter` option will have effect only on newly\r\n\t * added data. It will _not_ re-evaluate already included features.\r\n\t *\r\n\t * @option coordsToLatLng: Function = *\r\n\t * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.\r\n\t * The default is the `coordsToLatLng` static method.\r\n\t *\r\n\t * @option markersInheritOptions: Boolean = false\r\n\t * Whether default Markers for \"Point\" type Features inherit from group options.\r\n\t */\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addData( <GeoJSON> data ): this\r\n\t// Adds a GeoJSON object to the layer.\r\n\taddData: function (geojson) {\r\n\t\tvar features = Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t    i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(feature);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return this; }\r\n\r\n\t\tvar layer = geometryToLayer(geojson, options);\r\n\t\tif (!layer) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tlayer.feature = asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\t// @method resetStyle( <Path> layer? ): this\r\n\t// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.\r\n\t// If `layer` is omitted, the style of all features in the current layer is reset.\r\n\tresetStyle: function (layer) {\r\n\t\tif (layer === undefined) {\r\n\t\t\treturn this.eachLayer(this.resetStyle, this);\r\n\t\t}\r\n\t\t// reset any custom styles\r\n\t\tlayer.options = Util.extend({}, layer.defaultOptions);\r\n\t\tthis._setLayerStyle(layer, this.options.style);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setStyle( <Function> style ): this\r\n\t// Changes styles of GeoJSON vector layers with the given style function.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (layer.setStyle) {\r\n\t\t\tif (typeof style === 'function') {\r\n\t\t\t\tstyle = style(layer.feature);\r\n\t\t\t}\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @section\r\n// There are several static functions which can be called without instantiating L.GeoJSON:\r\n\r\n// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer\r\n// Creates a `Layer` from a given GeoJSON feature. Can use a custom\r\n// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)\r\n// functions if provided as options.\r\nexport function geometryToLayer(geojson, options) {\r\n\r\n\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t    coords = geometry ? geometry.coordinates : null,\r\n\t    layers = [],\r\n\t    pointToLayer = options && options.pointToLayer,\r\n\t    _coordsToLatLng = options && options.coordsToLatLng || coordsToLatLng,\r\n\t    latlng, latlngs, i, len;\r\n\r\n\tif (!coords && !geometry) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tswitch (geometry.type) {\r\n\tcase 'Point':\r\n\t\tlatlng = _coordsToLatLng(coords);\r\n\t\treturn _pointToLayer(pointToLayer, geojson, latlng, options);\r\n\r\n\tcase 'MultiPoint':\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = _coordsToLatLng(coords[i]);\r\n\t\t\tlayers.push(_pointToLayer(pointToLayer, geojson, latlng, options));\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tcase 'LineString':\r\n\tcase 'MultiLineString':\r\n\t\tlatlngs = coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, _coordsToLatLng);\r\n\t\treturn new Polyline(latlngs, options);\r\n\r\n\tcase 'Polygon':\r\n\tcase 'MultiPolygon':\r\n\t\tlatlngs = coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, _coordsToLatLng);\r\n\t\treturn new Polygon(latlngs, options);\r\n\r\n\tcase 'GeometryCollection':\r\n\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\t\t\tvar geoLayer = geometryToLayer({\r\n\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\ttype: 'Feature',\r\n\t\t\t\tproperties: geojson.properties\r\n\t\t\t}, options);\r\n\r\n\t\t\tif (geoLayer) {\r\n\t\t\t\tlayers.push(geoLayer);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tcase 'FeatureCollection':\r\n\t\tfor (i = 0, len = geometry.features.length; i < len; i++) {\r\n\t\t\tvar featureLayer = geometryToLayer(geometry.features[i], options);\r\n\r\n\t\t\tif (featureLayer) {\r\n\t\t\t\tlayers.push(featureLayer);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tdefault:\r\n\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t}\r\n}\r\n\r\nfunction _pointToLayer(pointToLayerFn, geojson, latlng, options) {\r\n\treturn pointToLayerFn ?\r\n\t\tpointToLayerFn(geojson, latlng) :\r\n\t\tnew Marker(latlng, options && options.markersInheritOptions && options);\r\n}\r\n\r\n// @function coordsToLatLng(coords: Array): LatLng\r\n// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)\r\n// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.\r\nexport function coordsToLatLng(coords) {\r\n\treturn new LatLng(coords[1], coords[0], coords[2]);\r\n}\r\n\r\n// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array\r\n// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.\r\n// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).\r\n// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.\r\nexport function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) {\r\n\tvar latlngs = [];\r\n\r\n\tfor (var i = 0, len = coords.length, latlng; i < len; i++) {\r\n\t\tlatlng = levelsDeep ?\r\n\t\t\tcoordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) :\r\n\t\t\t(_coordsToLatLng || coordsToLatLng)(coords[i]);\r\n\r\n\t\tlatlngs.push(latlng);\r\n\t}\r\n\r\n\treturn latlngs;\r\n}\r\n\r\n// @function latLngToCoords(latlng: LatLng, precision?: Number|false): Array\r\n// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function.\r\nexport function latLngToCoords(latlng, precision) {\r\n\tlatlng = toLatLng(latlng);\r\n\treturn latlng.alt !== undefined ?\r\n\t\t[Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision), Util.formatNum(latlng.alt, precision)] :\r\n\t\t[Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision)];\r\n}\r\n\r\n// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean, precision?: Number|false): Array\r\n// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)\r\n// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function.\r\nexport function latLngsToCoords(latlngs, levelsDeep, closed, precision) {\r\n\tvar coords = [];\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t// Check for flat arrays required to ensure unbalanced arrays are correctly converted in recursion\r\n\t\tcoords.push(levelsDeep ?\r\n\t\t\tlatLngsToCoords(latlngs[i], LineUtil.isFlat(latlngs[i]) ? 0 : levelsDeep - 1, closed, precision) :\r\n\t\t\tlatLngToCoords(latlngs[i], precision));\r\n\t}\r\n\r\n\tif (!levelsDeep && closed && coords.length > 0) {\r\n\t\tcoords.push(coords[0].slice());\r\n\t}\r\n\r\n\treturn coords;\r\n}\r\n\r\nexport function getFeature(layer, newGeometry) {\r\n\treturn layer.feature ?\r\n\t\tUtil.extend({}, layer.feature, {geometry: newGeometry}) :\r\n\t\tasFeature(newGeometry);\r\n}\r\n\r\n// @function asFeature(geojson: Object): Object\r\n// Normalize GeoJSON geometries/features into GeoJSON features.\r\nexport function asFeature(geojson) {\r\n\tif (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {\r\n\t\treturn geojson;\r\n\t}\r\n\r\n\treturn {\r\n\t\ttype: 'Feature',\r\n\t\tproperties: {},\r\n\t\tgeometry: geojson\r\n\t};\r\n}\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function (precision) {\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: latLngToCoords(this.getLatLng(), precision)\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// @namespace Marker\r\n// @section Other methods\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).\r\nMarker.include(PointToGeoJSON);\r\n\r\n// @namespace CircleMarker\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).\r\nCircle.include(PointToGeoJSON);\r\nCircleMarker.include(PointToGeoJSON);\r\n\r\n\r\n// @namespace Polyline\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).\r\nPolyline.include({\r\n\ttoGeoJSON: function (precision) {\r\n\t\tvar multi = !LineUtil.isFlat(this._latlngs);\r\n\r\n\t\tvar coords = latLngsToCoords(this._latlngs, multi ? 1 : 0, false, precision);\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: (multi ? 'Multi' : '') + 'LineString',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n// @namespace Polygon\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).\r\nPolygon.include({\r\n\ttoGeoJSON: function (precision) {\r\n\t\tvar holes = !LineUtil.isFlat(this._latlngs),\r\n\t\t    multi = holes && !LineUtil.isFlat(this._latlngs[0]);\r\n\r\n\t\tvar coords = latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true, precision);\r\n\r\n\t\tif (!holes) {\r\n\t\t\tcoords = [coords];\r\n\t\t}\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: (multi ? 'Multi' : '') + 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\n// @namespace LayerGroup\r\nLayerGroup.include({\r\n\ttoMultiPoint: function (precision) {\r\n\t\tvar coords = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tcoords.push(layer.toGeoJSON(precision).geometry.coordinates);\r\n\t\t});\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: 'MultiPoint',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t},\r\n\r\n\t// @method toGeoJSON(precision?: Number|false): Object\r\n\t// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n\t// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`).\r\n\ttoGeoJSON: function (precision) {\r\n\r\n\t\tvar type = this.feature && this.feature.geometry && this.feature.geometry.type;\r\n\r\n\t\tif (type === 'MultiPoint') {\r\n\t\t\treturn this.toMultiPoint(precision);\r\n\t\t}\r\n\r\n\t\tvar isGeometryCollection = type === 'GeometryCollection',\r\n\t\t    jsons = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\tvar json = layer.toGeoJSON(precision);\r\n\t\t\t\tif (isGeometryCollection) {\r\n\t\t\t\t\tjsons.push(json.geometry);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar feature = asFeature(json);\r\n\t\t\t\t\t// Squash nested feature collections\r\n\t\t\t\t\tif (feature.type === 'FeatureCollection') {\r\n\t\t\t\t\t\tjsons.push.apply(jsons, feature.features);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tjsons.push(feature);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (isGeometryCollection) {\r\n\t\t\treturn getFeature(this, {\r\n\t\t\t\tgeometries: jsons,\r\n\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'FeatureCollection',\r\n\t\t\tfeatures: jsons\r\n\t\t};\r\n\t}\r\n});\r\n\r\n// @namespace GeoJSON\r\n// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)\r\n// Creates a GeoJSON layer. Optionally accepts an object in\r\n// [GeoJSON format](https://tools.ietf.org/html/rfc7946) to display on the map\r\n// (you can alternatively add it later with `addData` method) and an `options` object.\r\nexport function geoJSON(geojson, options) {\r\n\treturn new GeoJSON(geojson, options);\r\n}\r\n\r\n// Backward compatibility.\r\nexport var geoJson = geoJSON;\r\n","import {Layer} from './Layer';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\nimport {Bounds} from '../geometry/Bounds';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class ImageOverlay\r\n * @aka L.ImageOverlay\r\n * @inherits Interactive layer\r\n *\r\n * Used to load and display a single image over specific bounds of the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var imageUrl = 'https://maps.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\r\n * \timageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\r\n * L.imageOverlay(imageUrl, imageBounds).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var ImageOverlay = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka ImageOverlay options\r\n\toptions: {\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the image overlay.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the image.\r\n\t\t// If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false,\r\n\r\n\t\t// @option errorOverlayUrl: String = ''\r\n\t\t// URL to the overlay image to show in place of the overlay that failed to load.\r\n\t\terrorOverlayUrl: '',\r\n\r\n\t\t// @option zIndex: Number = 1\r\n\t\t// The explicit [zIndex](https://developer.mozilla.org/docs/Web/CSS/CSS_Positioning/Understanding_z_index) of the overlay layer.\r\n\t\tzIndex: 1,\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom class name to assign to the image. Empty by default.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = toLatLngBounds(bounds);\r\n\r\n\t\tUtil.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function () {\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.addClass(this._image, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._image);\r\n\t\t}\r\n\r\n\t\tthis.getPane().appendChild(this._image);\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tDomUtil.remove(this._image);\r\n\t\tif (this.options.interactive) {\r\n\t\t\tthis.removeInteractiveTarget(this._image);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Sets the opacity of the overlay.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (styleOpts) {\r\n\t\tif (styleOpts.opacity) {\r\n\t\t\tthis.setOpacity(styleOpts.opacity);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer to the top of all overlays.\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toFront(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer to the bottom of all overlays.\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toBack(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setUrl(url: String): this\r\n\t// Changes the URL of the image.\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._image.src = url;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setBounds(bounds: LatLngBounds): this\r\n\t// Update the bounds that this ImageOverlay covers\r\n\tsetBounds: function (bounds) {\r\n\t\tthis._bounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._reset,\r\n\t\t\tviewreset: this._reset\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method setZIndex(value: Number): this\r\n\t// Changes the [zIndex](#imageoverlay-zindex) of the image overlay.\r\n\tsetZIndex: function (value) {\r\n\t\tthis.options.zIndex = value;\r\n\t\tthis._updateZIndex();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Get the bounds that this ImageOverlay covers\r\n\tgetBounds: function () {\r\n\t\treturn this._bounds;\r\n\t},\r\n\r\n\t// @method getElement(): HTMLElement\r\n\t// Returns the instance of [`HTMLImageElement`](https://developer.mozilla.org/docs/Web/API/HTMLImageElement)\r\n\t// used by this overlay.\r\n\tgetElement: function () {\r\n\t\treturn this._image;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar wasElementSupplied = this._url.tagName === 'IMG';\r\n\t\tvar img = this._image = wasElementSupplied ? this._url : DomUtil.create('img');\r\n\r\n\t\tDomUtil.addClass(img, 'leaflet-image-layer');\r\n\t\tif (this._zoomAnimated) { DomUtil.addClass(img, 'leaflet-zoom-animated'); }\r\n\t\tif (this.options.className) { DomUtil.addClass(img, this.options.className); }\r\n\r\n\t\timg.onselectstart = Util.falseFn;\r\n\t\timg.onmousemove = Util.falseFn;\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the ImageOverlay layer has loaded its image\r\n\t\timg.onload = Util.bind(this.fire, this, 'load');\r\n\t\timg.onerror = Util.bind(this._overlayOnError, this, 'error');\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\timg.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\tif (this.options.zIndex) {\r\n\t\t\tthis._updateZIndex();\r\n\t\t}\r\n\r\n\t\tif (wasElementSupplied) {\r\n\t\t\tthis._url = img.src;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\timg.src = this._url;\r\n\t\timg.alt = this.options.alt;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar scale = this._map.getZoomScale(e.zoom),\r\n\t\t    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;\r\n\r\n\t\tDomUtil.setTransform(this._image, offset, scale);\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t    bounds = new Bounds(\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),\r\n\t\t    size = bounds.getSize();\r\n\r\n\t\tDomUtil.setPosition(image, bounds.min);\r\n\r\n\t\timage.style.width  = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tDomUtil.setOpacity(this._image, this.options.opacity);\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._image && this.options.zIndex !== undefined && this.options.zIndex !== null) {\r\n\t\t\tthis._image.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_overlayOnError: function () {\r\n\t\t// @event error: Event\r\n\t\t// Fired when the ImageOverlay layer fails to load its image\r\n\t\tthis.fire('error');\r\n\r\n\t\tvar errorUrl = this.options.errorOverlayUrl;\r\n\t\tif (errorUrl && this._url !== errorUrl) {\r\n\t\t\tthis._url = errorUrl;\r\n\t\t\tthis._image.src = errorUrl;\r\n\t\t}\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center of the ImageOverlay.\r\n\tgetCenter: function () {\r\n\t\treturn this._bounds.getCenter();\r\n\t}\r\n});\r\n\r\n// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)\r\n// Instantiates an image overlay object given the URL of the image and the\r\n// geographical bounds it is tied to.\r\nexport var imageOverlay = function (url, bounds, options) {\r\n\treturn new ImageOverlay(url, bounds, options);\r\n};\r\n","import {ImageOverlay} from './ImageOverlay';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class VideoOverlay\r\n * @aka L.VideoOverlay\r\n * @inherits ImageOverlay\r\n *\r\n * Used to load and display a video player over specific bounds of the map. Extends `ImageOverlay`.\r\n *\r\n * A video overlay uses the [`<video>`](https://developer.mozilla.org/docs/Web/HTML/Element/video)\r\n * HTML5 element.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',\r\n * \tvideoBounds = [[ 32, -130], [ 13, -100]];\r\n * L.videoOverlay(videoUrl, videoBounds ).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var VideoOverlay = ImageOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka VideoOverlay options\r\n\toptions: {\r\n\t\t// @option autoplay: Boolean = true\r\n\t\t// Whether the video starts playing automatically when loaded.\r\n\t\t// On some browsers autoplay will only work with `muted: true`\r\n\t\tautoplay: true,\r\n\r\n\t\t// @option loop: Boolean = true\r\n\t\t// Whether the video will loop back to the beginning when played.\r\n\t\tloop: true,\r\n\r\n\t\t// @option keepAspectRatio: Boolean = true\r\n\t\t// Whether the video will save aspect ratio after the projection.\r\n\t\t// Relevant for supported browsers. See [browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit)\r\n\t\tkeepAspectRatio: true,\r\n\r\n\t\t// @option muted: Boolean = false\r\n\t\t// Whether the video starts on mute when loaded.\r\n\t\tmuted: false,\r\n\r\n\t\t// @option playsInline: Boolean = true\r\n\t\t// Mobile browsers will play the video right where it is instead of open it up in fullscreen mode.\r\n\t\tplaysInline: true\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar wasElementSupplied = this._url.tagName === 'VIDEO';\r\n\t\tvar vid = this._image = wasElementSupplied ? this._url : DomUtil.create('video');\r\n\r\n\t\tDomUtil.addClass(vid, 'leaflet-image-layer');\r\n\t\tif (this._zoomAnimated) { DomUtil.addClass(vid, 'leaflet-zoom-animated'); }\r\n\t\tif (this.options.className) { DomUtil.addClass(vid, this.options.className); }\r\n\r\n\t\tvid.onselectstart = Util.falseFn;\r\n\t\tvid.onmousemove = Util.falseFn;\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the video has finished loading the first frame\r\n\t\tvid.onloadeddata = Util.bind(this.fire, this, 'load');\r\n\r\n\t\tif (wasElementSupplied) {\r\n\t\t\tvar sourceElements = vid.getElementsByTagName('source');\r\n\t\t\tvar sources = [];\r\n\t\t\tfor (var j = 0; j < sourceElements.length; j++) {\r\n\t\t\t\tsources.push(sourceElements[j].src);\r\n\t\t\t}\r\n\r\n\t\t\tthis._url = (sourceElements.length > 0) ? sources : [vid.src];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Util.isArray(this._url)) { this._url = [this._url]; }\r\n\r\n\t\tif (!this.options.keepAspectRatio && Object.prototype.hasOwnProperty.call(vid.style, 'objectFit')) {\r\n\t\t\tvid.style['objectFit'] = 'fill';\r\n\t\t}\r\n\t\tvid.autoplay = !!this.options.autoplay;\r\n\t\tvid.loop = !!this.options.loop;\r\n\t\tvid.muted = !!this.options.muted;\r\n\t\tvid.playsInline = !!this.options.playsInline;\r\n\t\tfor (var i = 0; i < this._url.length; i++) {\r\n\t\t\tvar source = DomUtil.create('source');\r\n\t\t\tsource.src = this._url[i];\r\n\t\t\tvid.appendChild(source);\r\n\t\t}\r\n\t}\r\n\r\n\t// @method getElement(): HTMLVideoElement\r\n\t// Returns the instance of [`HTMLVideoElement`](https://developer.mozilla.org/docs/Web/API/HTMLVideoElement)\r\n\t// used by this overlay.\r\n});\r\n\r\n\r\n// @factory L.videoOverlay(video: String|Array|HTMLVideoElement, bounds: LatLngBounds, options?: VideoOverlay options)\r\n// Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the\r\n// geographical bounds it is tied to.\r\n\r\nexport function videoOverlay(video, bounds, options) {\r\n\treturn new VideoOverlay(video, bounds, options);\r\n}\r\n","import {ImageOverlay} from './ImageOverlay';\nimport * as DomUtil from '../dom/DomUtil';\nimport * as Util from '../core/Util';\n\n/*\n * @class SVGOverlay\n * @aka L.SVGOverlay\n * @inherits ImageOverlay\n *\n * Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends `ImageOverlay`.\n *\n * An SVG overlay uses the [`<svg>`](https://developer.mozilla.org/docs/Web/SVG/Element/svg) element.\n *\n * @example\n *\n * ```js\n * var svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n * svgElement.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n * svgElement.setAttribute('viewBox', \"0 0 200 200\");\n * svgElement.innerHTML = '<rect width=\"200\" height=\"200\"/><rect x=\"75\" y=\"23\" width=\"50\" height=\"50\" style=\"fill:red\"/><rect x=\"75\" y=\"123\" width=\"50\" height=\"50\" style=\"fill:#0013ff\"/>';\n * var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];\n * L.svgOverlay(svgElement, svgElementBounds).addTo(map);\n * ```\n */\n\nexport var SVGOverlay = ImageOverlay.extend({\n\t_initImage: function () {\n\t\tvar el = this._image = this._url;\n\n\t\tDomUtil.addClass(el, 'leaflet-image-layer');\n\t\tif (this._zoomAnimated) { DomUtil.addClass(el, 'leaflet-zoom-animated'); }\n\t\tif (this.options.className) { DomUtil.addClass(el, this.options.className); }\n\n\t\tel.onselectstart = Util.falseFn;\n\t\tel.onmousemove = Util.falseFn;\n\t}\n\n\t// @method getElement(): SVGElement\n\t// Returns the instance of [`SVGElement`](https://developer.mozilla.org/docs/Web/API/SVGElement)\n\t// used by this overlay.\n});\n\n\n// @factory L.svgOverlay(svg: String|SVGElement, bounds: LatLngBounds, options?: SVGOverlay options)\n// Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to.\n// A viewBox attribute is required on the SVG element to zoom in and out properly.\n\nexport function svgOverlay(el, bounds, options) {\n\treturn new SVGOverlay(el, bounds, options);\n}\n","import {Map} from '../map/Map';\r\nimport {Layer} from './Layer';\r\nimport {FeatureGroup} from './FeatureGroup';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLng, LatLng} from '../geo/LatLng';\r\nimport {toPoint} from '../geometry/Point';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class DivOverlay\r\n * @inherits Interactive layer\r\n * @aka L.DivOverlay\r\n * Base model for L.Popup and L.Tooltip. Inherit from it for custom overlays like plugins.\r\n */\r\n\r\n// @namespace DivOverlay\r\nexport var DivOverlay = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka DivOverlay options\r\n\toptions: {\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If true, the popup/tooltip will listen to the mouse events.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option offset: Point = Point(0, 0)\r\n\t\t// The offset of the overlay position.\r\n\t\toffset: [0, 0],\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the overlay.\r\n\t\tclassName: '',\r\n\r\n\t\t// @option pane: String = undefined\r\n\t\t// `Map pane` where the overlay will be added.\r\n\t\tpane: undefined,\r\n\r\n\t\t// @option content: String|HTMLElement|Function = ''\r\n\t\t// Sets the HTML content of the overlay while initializing. If a function is passed the source layer will be\r\n\t\t// passed to the function. The function should return a `String` or `HTMLElement` to be used in the overlay.\r\n\t\tcontent: ''\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tif (options && (options instanceof LatLng || Util.isArray(options))) {\r\n\t\t\tthis._latlng = toLatLng(options);\r\n\t\t\tUtil.setOptions(this, source);\r\n\t\t} else {\r\n\t\t\tUtil.setOptions(this, options);\r\n\t\t\tthis._source = source;\r\n\t\t}\r\n\t\tif (this.options.content) {\r\n\t\t\tthis._content = this.options.content;\r\n\t\t}\r\n\t},\r\n\r\n\t// @method openOn(map: Map): this\r\n\t// Adds the overlay to the map.\r\n\t// Alternative to `map.openPopup(popup)`/`.openTooltip(tooltip)`.\r\n\topenOn: function (map) {\r\n\t\tmap = arguments.length ? map : this._source._map; // experimental, not the part of public api\r\n\t\tif (!map.hasLayer(this)) {\r\n\t\t\tmap.addLayer(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method close(): this\r\n\t// Closes the overlay.\r\n\t// Alternative to `map.closePopup(popup)`/`.closeTooltip(tooltip)`\r\n\t// and `layer.closePopup()`/`.closeTooltip()`.\r\n\tclose: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.removeLayer(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method toggle(layer?: Layer): this\r\n\t// Opens or closes the overlay bound to layer depending on its current state.\r\n\t// Argument may be omitted only for overlay bound to layer.\r\n\t// Alternative to `layer.togglePopup()`/`.toggleTooltip()`.\r\n\ttoggle: function (layer) {\r\n\t\tif (this._map) {\r\n\t\t\tthis.close();\r\n\t\t} else {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tthis._source = layer;\r\n\t\t\t} else {\r\n\t\t\t\tlayer = this._source;\r\n\t\t\t}\r\n\t\t\tthis._prepareOpen();\r\n\r\n\t\t\t// open the overlay on the map\r\n\t\t\tthis.openOn(layer._map);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = map._zoomAnimated;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tclearTimeout(this._removeTimeout);\r\n\t\tthis.getPane().appendChild(this._container);\r\n\t\tthis.update();\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.bringToFront();\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.addClass(this._container, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 0);\r\n\t\t\tthis._removeTimeout = setTimeout(Util.bind(DomUtil.remove, undefined, this._container), 200);\r\n\t\t} else {\r\n\t\t\tDomUtil.remove(this._container);\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-interactive');\r\n\t\t\tthis.removeInteractiveTarget(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\t// @namespace DivOverlay\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the geographical point of the overlay.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Sets the geographical point where the overlay will open.\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = toLatLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContent: String|HTMLElement\r\n\t// Returns the content of the overlay.\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\t// @method setContent(htmlContent: String|HTMLElement|Function): this\r\n\t// Sets the HTML content of the overlay. If a function is passed the source layer will be passed to the function.\r\n\t// The function should return a `String` or `HTMLElement` to be used in the overlay.\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getElement: String|HTMLElement\r\n\t// Returns the HTML container of the overlay.\r\n\tgetElement: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method update: null\r\n\t// Updates the overlay content, layout and position. Useful for updating the overlay after something inside changed, e.g. image loaded.\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._updatePosition,\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method isOpen: Boolean\r\n\t// Returns `true` when the overlay is visible on the map.\r\n\tisOpen: function () {\r\n\t\treturn !!this._map && this._map.hasLayer(this);\r\n\t},\r\n\r\n\t// @method bringToFront: this\r\n\t// Brings this overlay in front of other overlays (in the same map pane).\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toFront(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack: this\r\n\t// Brings this overlay to the back of other overlays (in the same map pane).\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toBack(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// prepare bound overlay to open: update latlng pos / content source (for FeatureGroup)\r\n\t_prepareOpen: function (latlng) {\r\n\t\tvar source = this._source;\r\n\t\tif (!source._map) { return false; }\r\n\r\n\t\tif (source instanceof FeatureGroup) {\r\n\t\t\tsource = null;\r\n\t\t\tvar layers = this._source._layers;\r\n\t\t\tfor (var id in layers) {\r\n\t\t\t\tif (layers[id]._map) {\r\n\t\t\t\t\tsource = layers[id];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!source) { return false; } // Unable to get source layer.\r\n\r\n\t\t\t// set overlay source to this layer\r\n\t\t\tthis._source = source;\r\n\t\t}\r\n\r\n\t\tif (!latlng) {\r\n\t\t\tif (source.getCenter) {\r\n\t\t\t\tlatlng = source.getCenter();\r\n\t\t\t} else if (source.getLatLng) {\r\n\t\t\t\tlatlng = source.getLatLng();\r\n\t\t\t} else if (source.getBounds) {\r\n\t\t\t\tlatlng = source.getBounds().getCenter();\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error('Unable to get source layer LatLng.');\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.setLatLng(latlng);\r\n\r\n\t\tif (this._map) {\r\n\t\t\t// update the overlay (content, layout, etc...)\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tvar node = this._contentNode;\r\n\t\tvar content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;\r\n\r\n\t\tif (typeof content === 'string') {\r\n\t\t\tnode.innerHTML = content;\r\n\t\t} else {\r\n\t\t\twhile (node.hasChildNodes()) {\r\n\t\t\t\tnode.removeChild(node.firstChild);\r\n\t\t\t}\r\n\t\t\tnode.appendChild(content);\r\n\t\t}\r\n\r\n\t\t// @namespace DivOverlay\r\n\t\t// @section DivOverlay events\r\n\t\t// @event contentupdate: Event\r\n\t\t// Fired when the content of the overlay is updated\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t    offset = toPoint(this.options.offset),\r\n\t\t    anchor = this._getAnchor();\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tDomUtil.setPosition(this._container, pos.add(anchor));\r\n\t\t} else {\r\n\t\t\toffset = offset.add(pos).add(anchor);\r\n\t\t}\r\n\r\n\t\tvar bottom = this._containerBottom = -offset.y,\r\n\t\t    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;\r\n\r\n\t\t// bottom position the overlay in case the height of the overlay changes (images loading etc)\r\n\t\tthis._container.style.bottom = bottom + 'px';\r\n\t\tthis._container.style.left = left + 'px';\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\treturn [0, 0];\r\n\t}\r\n\r\n});\r\n\r\nMap.include({\r\n\t_initOverlay: function (OverlayClass, content, latlng, options) {\r\n\t\tvar overlay = content;\r\n\t\tif (!(overlay instanceof OverlayClass)) {\r\n\t\t\toverlay = new OverlayClass(options).setContent(content);\r\n\t\t}\r\n\t\tif (latlng) {\r\n\t\t\toverlay.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn overlay;\r\n\t}\r\n});\r\n\r\n\r\nLayer.include({\r\n\t_initOverlay: function (OverlayClass, old, content, options) {\r\n\t\tvar overlay = content;\r\n\t\tif (overlay instanceof OverlayClass) {\r\n\t\t\tUtil.setOptions(overlay, options);\r\n\t\t\toverlay._source = this;\r\n\t\t} else {\r\n\t\t\toverlay = (old && !options) ? old : new OverlayClass(options, this);\r\n\t\t\toverlay.setContent(content);\r\n\t\t}\r\n\t\treturn overlay;\r\n\t}\r\n});\r\n","import {DivOverlay} from './DivOverlay';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport {Point, toPoint} from '../geometry/Point';\r\nimport {Map} from '../map/Map';\r\nimport {Layer} from './Layer';\r\nimport {Path} from './vector/Path';\r\nimport {FeatureGroup} from './FeatureGroup';\r\n\r\n/*\r\n * @class Popup\r\n * @inherits DivOverlay\r\n * @aka L.Popup\r\n * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to\r\n * open popups while making sure that only one popup is open at one time\r\n * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.\r\n *\r\n * @example\r\n *\r\n * If you want to just bind a popup to marker click and then open it, it's really easy:\r\n *\r\n * ```js\r\n * marker.bindPopup(popupContent).openPopup();\r\n * ```\r\n * Path overlays like polylines also have a `bindPopup` method.\r\n *\r\n * A popup can be also standalone:\r\n *\r\n * ```js\r\n * var popup = L.popup()\r\n * \t.setLatLng(latlng)\r\n * \t.setContent('<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n * or\r\n * ```js\r\n * var popup = L.popup(latlng, {content: '<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n */\r\n\r\n\r\n// @namespace Popup\r\nexport var Popup = DivOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka Popup options\r\n\toptions: {\r\n\t\t// @option pane: String = 'popupPane'\r\n\t\t// `Map pane` where the popup will be added.\r\n\t\tpane: 'popupPane',\r\n\r\n\t\t// @option offset: Point = Point(0, 7)\r\n\t\t// The offset of the popup position.\r\n\t\toffset: [0, 7],\r\n\r\n\t\t// @option maxWidth: Number = 300\r\n\t\t// Max width of the popup, in pixels.\r\n\t\tmaxWidth: 300,\r\n\r\n\t\t// @option minWidth: Number = 50\r\n\t\t// Min width of the popup, in pixels.\r\n\t\tminWidth: 50,\r\n\r\n\t\t// @option maxHeight: Number = null\r\n\t\t// If set, creates a scrollable container of the given height\r\n\t\t// inside a popup if its content exceeds it.\r\n\t\t// The scrollable container can be styled using the\r\n\t\t// `leaflet-popup-scrolled` CSS class selector.\r\n\t\tmaxHeight: null,\r\n\r\n\t\t// @option autoPan: Boolean = true\r\n\t\t// Set it to `false` if you don't want the map to do panning animation\r\n\t\t// to fit the opened popup.\r\n\t\tautoPan: true,\r\n\r\n\t\t// @option autoPanPaddingTopLeft: Point = null\r\n\t\t// The margin between the popup and the top left corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingTopLeft: null,\r\n\r\n\t\t// @option autoPanPaddingBottomRight: Point = null\r\n\t\t// The margin between the popup and the bottom right corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingBottomRight: null,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(5, 5)\r\n\t\t// Equivalent of setting both top left and bottom right autopan padding to the same value.\r\n\t\tautoPanPadding: [5, 5],\r\n\r\n\t\t// @option keepInView: Boolean = false\r\n\t\t// Set it to `true` if you want to prevent users from panning the popup\r\n\t\t// off of the screen while it is open.\r\n\t\tkeepInView: false,\r\n\r\n\t\t// @option closeButton: Boolean = true\r\n\t\t// Controls the presence of a close button in the popup.\r\n\t\tcloseButton: true,\r\n\r\n\t\t// @option autoClose: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the popup closing when another popup is opened.\r\n\t\tautoClose: true,\r\n\r\n\t\t// @option closeOnEscapeKey: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the ESC key for closing of the popup.\r\n\t\tcloseOnEscapeKey: true,\r\n\r\n\t\t// @option closeOnClick: Boolean = *\r\n\t\t// Set it if you want to override the default behavior of the popup closing when user clicks\r\n\t\t// on the map. Defaults to the map's [`closePopupOnClick`](#map-closepopuponclick) option.\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method openOn(map: Map): this\r\n\t// Alternative to `map.openPopup(popup)`.\r\n\t// Adds the popup to the map and closes the previous one.\r\n\topenOn: function (map) {\r\n\t\tmap = arguments.length ? map : this._source._map; // experimental, not the part of public api\r\n\r\n\t\tif (!map.hasLayer(this) && map._popup && map._popup.options.autoClose) {\r\n\t\t\tmap.removeLayer(map._popup);\r\n\t\t}\r\n\t\tmap._popup = this;\r\n\r\n\t\treturn DivOverlay.prototype.openOn.call(this, map);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tDivOverlay.prototype.onAdd.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupopen: PopupEvent\r\n\t\t// Fired when a popup is opened in the map\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupopen: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is opened\r\n\t\t\tthis._source.fire('popupopen', {popup: this}, true);\r\n\t\t\t// For non-path layers, we toggle the popup when clicking\r\n\t\t\t// again the layer, so prevent the map to reopen it.\r\n\t\t\tif (!(this._source instanceof Path)) {\r\n\t\t\t\tthis._source.on('preclick', DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tDivOverlay.prototype.onRemove.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupclose: PopupEvent\r\n\t\t// Fired when a popup in the map is closed\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupclose: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is closed\r\n\t\t\tthis._source.fire('popupclose', {popup: this}, true);\r\n\t\t\tif (!(this._source instanceof Path)) {\r\n\t\t\t\tthis._source.off('preclick', DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = DivOverlay.prototype.getEvents.call(this);\r\n\r\n\t\tif (this.options.closeOnClick !== undefined ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this.close;\r\n\t\t}\r\n\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t    container = this._container = DomUtil.create('div',\r\n\t\t\tprefix + ' ' + (this.options.className || '') +\r\n\t\t\t' leaflet-zoom-animated');\r\n\r\n\t\tvar wrapper = this._wrapper = DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tthis._contentNode = DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tDomEvent.disableClickPropagation(container);\r\n\t\tDomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tDomEvent.on(container, 'contextmenu', DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tvar closeButton = this._closeButton = DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.setAttribute('role', 'button'); // overrides the implicit role=link of <a> elements #7399\r\n\t\t\tcloseButton.setAttribute('aria-label', 'Close popup');\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '<span aria-hidden=\"true\">&#215;</span>';\r\n\r\n\t\t\tDomEvent.on(closeButton, 'click', function (ev) {\r\n\t\t\t\tDomEvent.preventDefault(ev);\r\n\t\t\t\tthis.close();\r\n\t\t\t}, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t    style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t    maxHeight = this.options.maxHeight,\r\n\t\t    scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tDomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tDomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),\r\n\t\t    anchor = this._getAnchor();\r\n\t\tDomUtil.setPosition(this._container, pos.add(anchor));\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\t\tif (this._map._panAnim) { this._map._panAnim.stop(); }\r\n\r\n\t\t// We can endlessly recurse if keepInView is set and the view resets.\r\n\t\t// Let's guard against that by exiting early if we're responding to our own autopan.\r\n\t\tif (this._autopanning) {\r\n\t\t\tthis._autopanning = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar map = this._map,\r\n\t\t    marginBottom = parseInt(DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,\r\n\t\t    containerHeight = this._container.offsetHeight + marginBottom,\r\n\t\t    containerWidth = this._containerWidth,\r\n\t\t    layerPos = new Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tlayerPos._add(DomUtil.getPosition(this._container));\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t    padding = toPoint(this.options.autoPanPadding),\r\n\t\t    paddingTL = toPoint(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t    paddingBR = toPoint(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t    size = map.getSize(),\r\n\t\t    dx = 0,\r\n\t\t    dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event autopanstart: Event\r\n\t\t// Fired when the map starts autopanning when opening a popup.\r\n\t\tif (dx || dy) {\r\n\t\t\t// Track that we're autopanning, as this function will be re-ran on moveend\r\n\t\t\tif (this.options.keepInView) {\r\n\t\t\t\tthis._autopanning = true;\r\n\t\t\t}\r\n\r\n\t\t\tmap\r\n\t\t\t    .fire('autopanstart')\r\n\t\t\t    .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\t// Where should we anchor the popup on the source layer?\r\n\t\treturn toPoint(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);\r\n\t}\r\n\r\n});\r\n\r\n// @namespace Popup\r\n// @factory L.popup(options?: Popup options, source?: Layer)\r\n// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.\r\n// @alternative\r\n// @factory L.popup(latlng: LatLng, options?: Popup options)\r\n// Instantiates a `Popup` object given `latlng` where the popup will open and an optional `options` object that describes its appearance and location.\r\nexport var popup = function (options, source) {\r\n\treturn new Popup(options, source);\r\n};\r\n\r\n\r\n/* @namespace Map\r\n * @section Interaction Options\r\n * @option closePopupOnClick: Boolean = true\r\n * Set it to `false` if you don't want popups to close when user clicks the map.\r\n */\r\nMap.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\n\r\n// @namespace Map\r\n// @section Methods for Layers and Controls\r\nMap.include({\r\n\t// @method openPopup(popup: Popup): this\r\n\t// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).\r\n\t// @alternative\r\n\t// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this\r\n\t// Creates a popup with the specified content and options and opens it in the given point on a map.\r\n\topenPopup: function (popup, latlng, options) {\r\n\t\tthis._initOverlay(Popup, popup, latlng, options)\r\n\t\t  .openOn(this);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(popup?: Popup): this\r\n\t// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).\r\n\tclosePopup: function (popup) {\r\n\t\tpopup = arguments.length ? popup : this._popup;\r\n\t\tif (popup) {\r\n\t\t\tpopup.close();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n/*\r\n * @namespace Layer\r\n * @section Popup methods example\r\n *\r\n * All layers share a set of methods convenient for binding popups to it.\r\n *\r\n * ```js\r\n * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);\r\n * layer.openPopup();\r\n * layer.closePopup();\r\n * ```\r\n *\r\n * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.\r\n */\r\n\r\n// @section Popup methods\r\nLayer.include({\r\n\r\n\t// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this\r\n\t// Binds a popup to the layer with the passed `content` and sets up the\r\n\t// necessary event listeners. If a `Function` is passed it will receive\r\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popup = this._initOverlay(Popup, this._popup, content, options);\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis.on({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tkeypress: this._onKeyPress,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method unbindPopup(): this\r\n\t// Removes the popup previously bound with `bindPopup`.\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis.off({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tkeypress: this._onKeyPress,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method openPopup(latlng?: LatLng): this\r\n\t// Opens the bound popup at the specified `latlng` or at the default popup anchor if no `latlng` is passed.\r\n\topenPopup: function (latlng) {\r\n\t\tif (this._popup) {\r\n\t\t\tif (!(this instanceof FeatureGroup)) {\r\n\t\t\t\tthis._popup._source = this;\r\n\t\t\t}\r\n\t\t\tif (this._popup._prepareOpen(latlng || this._latlng)) {\r\n\t\t\t\t// open the popup on the map\r\n\t\t\t\tthis._popup.openOn(this._map);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(): this\r\n\t// Closes the popup bound to this layer if it is open.\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method togglePopup(): this\r\n\t// Opens or closes the popup bound to this layer depending on its current state.\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.toggle(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method isPopupOpen(): boolean\r\n\t// Returns `true` if the popup bound to this layer is currently open.\r\n\tisPopupOpen: function () {\r\n\t\treturn (this._popup ? this._popup.isOpen() : false);\r\n\t},\r\n\r\n\t// @method setPopupContent(content: String|HTMLElement|Popup): this\r\n\t// Sets the content of the popup bound to this layer.\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getPopup(): Popup\r\n\t// Returns the popup bound to this layer.\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tif (!this._popup || !this._map) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// prevent map click\r\n\t\tDomEvent.stop(e);\r\n\r\n\t\tvar target = e.layer || e.target;\r\n\t\tif (this._popup._source === target && !(target instanceof Path)) {\r\n\t\t\t// treat it like a marker and figure out\r\n\t\t\t// if we should toggle it open/closed\r\n\t\t\tif (this._map.hasLayer(this._popup)) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup(e.latlng);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._popup._source = target;\r\n\t\tthis.openPopup(e.latlng);\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.originalEvent.keyCode === 13) {\r\n\t\t\tthis._openPopup(e);\r\n\t\t}\r\n\t}\r\n});\r\n","import {DivOverlay} from './DivOverlay';\nimport {toPoint} from '../geometry/Point';\nimport {Map} from '../map/Map';\nimport {Layer} from './Layer';\nimport * as DomUtil from '../dom/DomUtil';\nimport * as DomEvent from '../dom/DomEvent';\nimport * as Util from '../core/Util';\nimport {FeatureGroup} from './FeatureGroup';\n\n/*\n * @class Tooltip\n * @inherits DivOverlay\n * @aka L.Tooltip\n * Used to display small texts on top of map layers.\n *\n * @example\n * If you want to just bind a tooltip to marker:\n *\n * ```js\n * marker.bindTooltip(\"my tooltip text\").openTooltip();\n * ```\n * Path overlays like polylines also have a `bindTooltip` method.\n *\n * A tooltip can be also standalone:\n *\n * ```js\n * var tooltip = L.tooltip()\n * \t.setLatLng(latlng)\n * \t.setContent('Hello world!<br />This is a nice tooltip.')\n * \t.addTo(map);\n * ```\n * or\n * ```js\n * var tooltip = L.tooltip(latlng, {content: 'Hello world!<br />This is a nice tooltip.'})\n * \t.addTo(map);\n * ```\n *\n *\n * Note about tooltip offset. Leaflet takes two options in consideration\n * for computing tooltip offsetting:\n * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.\n *   Add a positive x offset to move the tooltip to the right, and a positive y offset to\n *   move it to the bottom. Negatives will move to the left and top.\n * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You\n *   should adapt this value if you use a custom icon.\n */\n\n\n// @namespace Tooltip\nexport var Tooltip = DivOverlay.extend({\n\n\t// @section\n\t// @aka Tooltip options\n\toptions: {\n\t\t// @option pane: String = 'tooltipPane'\n\t\t// `Map pane` where the tooltip will be added.\n\t\tpane: 'tooltipPane',\n\n\t\t// @option offset: Point = Point(0, 0)\n\t\t// Optional offset of the tooltip position.\n\t\toffset: [0, 0],\n\n\t\t// @option direction: String = 'auto'\n\t\t// Direction where to open the tooltip. Possible values are: `right`, `left`,\n\t\t// `top`, `bottom`, `center`, `auto`.\n\t\t// `auto` will dynamically switch between `right` and `left` according to the tooltip\n\t\t// position on the map.\n\t\tdirection: 'auto',\n\n\t\t// @option permanent: Boolean = false\n\t\t// Whether to open the tooltip permanently or only on mouseover.\n\t\tpermanent: false,\n\n\t\t// @option sticky: Boolean = false\n\t\t// If true, the tooltip will follow the mouse instead of being fixed at the feature center.\n\t\tsticky: false,\n\n\t\t// @option opacity: Number = 0.9\n\t\t// Tooltip container opacity.\n\t\topacity: 0.9\n\t},\n\n\tonAdd: function (map) {\n\t\tDivOverlay.prototype.onAdd.call(this, map);\n\t\tthis.setOpacity(this.options.opacity);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipopen: TooltipEvent\n\t\t// Fired when a tooltip is opened in the map.\n\t\tmap.fire('tooltipopen', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\tthis.addEventParent(this._source);\n\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipopen: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is opened.\n\t\t\tthis._source.fire('tooltipopen', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tonRemove: function (map) {\n\t\tDivOverlay.prototype.onRemove.call(this, map);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipclose: TooltipEvent\n\t\t// Fired when a tooltip in the map is closed.\n\t\tmap.fire('tooltipclose', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\tthis.removeEventParent(this._source);\n\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipclose: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is closed.\n\t\t\tthis._source.fire('tooltipclose', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = DivOverlay.prototype.getEvents.call(this);\n\n\t\tif (!this.options.permanent) {\n\t\t\tevents.preclick = this.close;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-tooltip',\n\t\t    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\n\n\t\tthis._contentNode = this._container = DomUtil.create('div', className);\n\n\t\tthis._container.setAttribute('role', 'tooltip');\n\t\tthis._container.setAttribute('id', 'leaflet-tooltip-' + Util.stamp(this));\n\t},\n\n\t_updateLayout: function () {},\n\n\t_adjustPan: function () {},\n\n\t_setPosition: function (pos) {\n\t\tvar subX, subY,\n\t\t    map = this._map,\n\t\t    container = this._container,\n\t\t    centerPoint = map.latLngToContainerPoint(map.getCenter()),\n\t\t    tooltipPoint = map.layerPointToContainerPoint(pos),\n\t\t    direction = this.options.direction,\n\t\t    tooltipWidth = container.offsetWidth,\n\t\t    tooltipHeight = container.offsetHeight,\n\t\t    offset = toPoint(this.options.offset),\n\t\t    anchor = this._getAnchor();\n\n\t\tif (direction === 'top') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = tooltipHeight;\n\t\t} else if (direction === 'bottom') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = 0;\n\t\t} else if (direction === 'center') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (direction === 'right') {\n\t\t\tsubX = 0;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (direction === 'left') {\n\t\t\tsubX = tooltipWidth;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (tooltipPoint.x < centerPoint.x) {\n\t\t\tdirection = 'right';\n\t\t\tsubX = 0;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else {\n\t\t\tdirection = 'left';\n\t\t\tsubX = tooltipWidth + (offset.x + anchor.x) * 2;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t}\n\n\t\tpos = pos.subtract(toPoint(subX, subY, true)).add(offset).add(anchor);\n\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-right');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-left');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-top');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-bottom');\n\t\tDomUtil.addClass(container, 'leaflet-tooltip-' + direction);\n\t\tDomUtil.setPosition(container, pos);\n\t},\n\n\t_updatePosition: function () {\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._setPosition(pos);\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._container) {\n\t\t\tDomUtil.setOpacity(this._container, opacity);\n\t\t}\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);\n\t\tthis._setPosition(pos);\n\t},\n\n\t_getAnchor: function () {\n\t\t// Where should we anchor the tooltip on the source layer?\n\t\treturn toPoint(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);\n\t}\n\n});\n\n// @namespace Tooltip\n// @factory L.tooltip(options?: Tooltip options, source?: Layer)\n// Instantiates a `Tooltip` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.\n// @alternative\n// @factory L.tooltip(latlng: LatLng, options?: Tooltip options)\n// Instantiates a `Tooltip` object given `latlng` where the tooltip will open and an optional `options` object that describes its appearance and location.\nexport var tooltip = function (options, source) {\n\treturn new Tooltip(options, source);\n};\n\n// @namespace Map\n// @section Methods for Layers and Controls\nMap.include({\n\n\t// @method openTooltip(tooltip: Tooltip): this\n\t// Opens the specified tooltip.\n\t// @alternative\n\t// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this\n\t// Creates a tooltip with the specified content and options and open it.\n\topenTooltip: function (tooltip, latlng, options) {\n\t\tthis._initOverlay(Tooltip, tooltip, latlng, options)\n\t\t  .openOn(this);\n\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(tooltip: Tooltip): this\n\t// Closes the tooltip given as parameter.\n\tcloseTooltip: function (tooltip) {\n\t\ttooltip.close();\n\t\treturn this;\n\t}\n\n});\n\n/*\n * @namespace Layer\n * @section Tooltip methods example\n *\n * All layers share a set of methods convenient for binding tooltips to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);\n * layer.openTooltip();\n * layer.closeTooltip();\n * ```\n */\n\n// @section Tooltip methods\nLayer.include({\n\n\t// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this\n\t// Binds a tooltip to the layer with the passed `content` and sets up the\n\t// necessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindTooltip: function (content, options) {\n\n\t\tif (this._tooltip && this.isTooltipOpen()) {\n\t\t\tthis.unbindTooltip();\n\t\t}\n\n\t\tthis._tooltip = this._initOverlay(Tooltip, this._tooltip, content, options);\n\t\tthis._initTooltipInteractions();\n\n\t\tif (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {\n\t\t\tthis.openTooltip();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindTooltip(): this\n\t// Removes the tooltip previously bound with `bindTooltip`.\n\tunbindTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._initTooltipInteractions(true);\n\t\t\tthis.closeTooltip();\n\t\t\tthis._tooltip = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initTooltipInteractions: function (remove) {\n\t\tif (!remove && this._tooltipHandlersAdded) { return; }\n\t\tvar onOff = remove ? 'off' : 'on',\n\t\t    events = {\n\t\t\tremove: this.closeTooltip,\n\t\t\tmove: this._moveTooltip\n\t\t    };\n\t\tif (!this._tooltip.options.permanent) {\n\t\t\tevents.mouseover = this._openTooltip;\n\t\t\tevents.mouseout = this.closeTooltip;\n\t\t\tevents.click = this._openTooltip;\n\t\t\tif (this._map) {\n\t\t\t\tthis._addFocusListeners();\n\t\t\t} else {\n\t\t\t\tevents.add = this._addFocusListeners;\n\t\t\t}\n\t\t} else {\n\t\t\tevents.add = this._openTooltip;\n\t\t}\n\t\tif (this._tooltip.options.sticky) {\n\t\t\tevents.mousemove = this._moveTooltip;\n\t\t}\n\t\tthis[onOff](events);\n\t\tthis._tooltipHandlersAdded = !remove;\n\t},\n\n\t// @method openTooltip(latlng?: LatLng): this\n\t// Opens the bound tooltip at the specified `latlng` or at the default tooltip anchor if no `latlng` is passed.\n\topenTooltip: function (latlng) {\n\t\tif (this._tooltip) {\n\t\t\tif (!(this instanceof FeatureGroup)) {\n\t\t\t\tthis._tooltip._source = this;\n\t\t\t}\n\t\t\tif (this._tooltip._prepareOpen(latlng)) {\n\t\t\t\t// open the tooltip on the map\n\t\t\t\tthis._tooltip.openOn(this._map);\n\n\t\t\t\tif (this.getElement) {\n\t\t\t\t\tthis._setAriaDescribedByOnLayer(this);\n\t\t\t\t} else if (this.eachLayer) {\n\t\t\t\t\tthis.eachLayer(this._setAriaDescribedByOnLayer, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(): this\n\t// Closes the tooltip bound to this layer if it is open.\n\tcloseTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\treturn this._tooltip.close();\n\t\t}\n\t},\n\n\t// @method toggleTooltip(): this\n\t// Opens or closes the tooltip bound to this layer depending on its current state.\n\ttoggleTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.toggle(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isTooltipOpen(): boolean\n\t// Returns `true` if the tooltip bound to this layer is currently open.\n\tisTooltipOpen: function () {\n\t\treturn this._tooltip.isOpen();\n\t},\n\n\t// @method setTooltipContent(content: String|HTMLElement|Tooltip): this\n\t// Sets the content of the tooltip bound to this layer.\n\tsetTooltipContent: function (content) {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getTooltip(): Tooltip\n\t// Returns the tooltip bound to this layer.\n\tgetTooltip: function () {\n\t\treturn this._tooltip;\n\t},\n\n\t_addFocusListeners: function () {\n\t\tif (this.getElement) {\n\t\t\tthis._addFocusListenersOnLayer(this);\n\t\t} else if (this.eachLayer) {\n\t\t\tthis.eachLayer(this._addFocusListenersOnLayer, this);\n\t\t}\n\t},\n\n\t_addFocusListenersOnLayer: function (layer) {\n\t\tvar el = typeof layer.getElement === 'function' && layer.getElement();\n\t\tif (el) {\n\t\t\tDomEvent.on(el, 'focus', function () {\n\t\t\t\tthis._tooltip._source = layer;\n\t\t\t\tthis.openTooltip();\n\t\t\t}, this);\n\t\t\tDomEvent.on(el, 'blur', this.closeTooltip, this);\n\t\t}\n\t},\n\n\t_setAriaDescribedByOnLayer: function (layer) {\n\t\tvar el = typeof layer.getElement === 'function' && layer.getElement();\n\t\tif (el) {\n\t\t\tel.setAttribute('aria-describedby', this._tooltip._container.id);\n\t\t}\n\t},\n\n\n\t_openTooltip: function (e) {\n\t\tif (!this._tooltip || !this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the map is moving, we will show the tooltip after it's done.\n\t\tif (this._map.dragging && this._map.dragging.moving() && !this._openOnceFlag) {\n\t\t\tthis._openOnceFlag = true;\n\t\t\tvar that = this;\n\t\t\tthis._map.once('moveend', function () {\n\t\t\t\tthat._openOnceFlag = false;\n\t\t\t\tthat._openTooltip(e);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tooltip._source = e.layer || e.target;\n\n\t\tthis.openTooltip(this._tooltip.options.sticky ? e.latlng : undefined);\n\t},\n\n\t_moveTooltip: function (e) {\n\t\tvar latlng = e.latlng, containerPoint, layerPoint;\n\t\tif (this._tooltip.options.sticky && e.originalEvent) {\n\t\t\tcontainerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);\n\t\t\tlayerPoint = this._map.containerPointToLayerPoint(containerPoint);\n\t\t\tlatlng = this._map.layerPointToLatLng(layerPoint);\n\t\t}\n\t\tthis._tooltip.setLatLng(latlng);\n\t}\n});\n","import {Icon} from './Icon';\nimport {toPoint as point} from '../../geometry/Point';\nimport {empty} from '../../dom/DomUtil';\n\n/*\n * @class DivIcon\n * @aka L.DivIcon\n * @inherits Icon\n *\n * Represents a lightweight icon for markers that uses a simple `<div>`\n * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.\n *\n * @example\n * ```js\n * var myIcon = L.divIcon({className: 'my-div-icon'});\n * // you can set .my-div-icon styles in CSS\n *\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\n * ```\n *\n * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.\n */\n\nexport var DivIcon = Icon.extend({\n\toptions: {\n\t\t// @section\n\t\t// @aka DivIcon options\n\t\ticonSize: [12, 12], // also can be set through CSS\n\n\t\t// iconAnchor: (Point),\n\t\t// popupAnchor: (Point),\n\n\t\t// @option html: String|HTMLElement = ''\n\t\t// Custom HTML code to put inside the div element, empty by default. Alternatively,\n\t\t// an instance of `HTMLElement`.\n\t\thtml: false,\n\n\t\t// @option bgPos: Point = [0, 0]\n\t\t// Optional relative position of the background, in pixels\n\t\tbgPos: null,\n\n\t\tclassName: 'leaflet-div-icon'\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t    options = this.options;\n\n\t\tif (options.html instanceof Element) {\n\t\t\tempty(div);\n\t\t\tdiv.appendChild(options.html);\n\t\t} else {\n\t\t\tdiv.innerHTML = options.html !== false ? options.html : '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tvar bgPos = point(options.bgPos);\n\t\t\tdiv.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n\t\t}\n\t\tthis._setIconStyles(div, 'icon');\n\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\n// @factory L.divIcon(options: DivIcon options)\n// Creates a `DivIcon` instance with the given options.\nexport function divIcon(options) {\n\treturn new DivIcon(options);\n}\n","import {Icon} from './Icon';\nexport {icon} from './Icon';\nimport {IconDefault} from './Icon.Default';\nIcon.Default = IconDefault;\nexport {Icon};\n\nexport {DivIcon, divIcon} from './DivIcon';\nexport {Marker, marker} from './Marker';\n","import {Layer} from '../Layer';\nimport Browser from '../../core/Browser';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {Point} from '../../geometry/Point';\nimport {Bounds} from '../../geometry/Bounds';\nimport {LatLngBounds, toLatLngBounds as latLngBounds} from '../../geo/LatLngBounds';\n\n/*\n * @class GridLayer\n * @inherits Layer\n * @aka L.GridLayer\n *\n * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.\n * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.\n *\n *\n * @section Synchronous usage\n * @example\n *\n * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords){\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z\n *         var ctx = tile.getContext('2d');\n *\n *         // return the tile so it can be rendered on screen\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section Asynchronous usage\n * @example\n *\n * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords, done){\n *         var error;\n *\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // draw something asynchronously and pass the tile to the done() callback\n *         setTimeout(function() {\n *             done(error, tile);\n *         }, 1000);\n *\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section\n */\n\n\nexport var GridLayer = Layer.extend({\n\n\t// @section\n\t// @aka GridLayer options\n\toptions: {\n\t\t// @option tileSize: Number|Point = 256\n\t\t// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.\n\t\ttileSize: 256,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Opacity of the tiles. Can be used in the `createTile()` function.\n\t\topacity: 1,\n\n\t\t// @option updateWhenIdle: Boolean = (depends)\n\t\t// Load new tiles only when panning ends.\n\t\t// `true` by default on mobile browsers, in order to avoid too many requests and keep smooth navigation.\n\t\t// `false` otherwise in order to display new tiles _during_ panning, since it is easy to pan outside the\n\t\t// [`keepBuffer`](#gridlayer-keepbuffer) option in desktop browsers.\n\t\tupdateWhenIdle: Browser.mobile,\n\n\t\t// @option updateWhenZooming: Boolean = true\n\t\t// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.\n\t\tupdateWhenZooming: true,\n\n\t\t// @option updateInterval: Number = 200\n\t\t// Tiles will not update more than once every `updateInterval` milliseconds when panning.\n\t\tupdateInterval: 200,\n\n\t\t// @option zIndex: Number = 1\n\t\t// The explicit zIndex of the tile layer.\n\t\tzIndex: 1,\n\n\t\t// @option bounds: LatLngBounds = undefined\n\t\t// If set, tiles will only be loaded inside the set `LatLngBounds`.\n\t\tbounds: null,\n\n\t\t// @option minZoom: Number = 0\n\t\t// The minimum zoom level down to which this layer will be displayed (inclusive).\n\t\tminZoom: 0,\n\n\t\t// @option maxZoom: Number = undefined\n\t\t// The maximum zoom level up to which this layer will be displayed (inclusive).\n\t\tmaxZoom: undefined,\n\n\t\t// @option maxNativeZoom: Number = undefined\n\t\t// Maximum zoom number the tile source has available. If it is specified,\n\t\t// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded\n\t\t// from `maxNativeZoom` level and auto-scaled.\n\t\tmaxNativeZoom: undefined,\n\n\t\t// @option minNativeZoom: Number = undefined\n\t\t// Minimum zoom number the tile source has available. If it is specified,\n\t\t// the tiles on all zoom levels lower than `minNativeZoom` will be loaded\n\t\t// from `minNativeZoom` level and auto-scaled.\n\t\tminNativeZoom: undefined,\n\n\t\t// @option noWrap: Boolean = false\n\t\t// Whether the layer is wrapped around the antimeridian. If `true`, the\n\t\t// GridLayer will only be displayed once at low zoom levels. Has no\n\t\t// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used\n\t\t// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting\n\t\t// tiles outside the CRS limits.\n\t\tnoWrap: false,\n\n\t\t// @option pane: String = 'tilePane'\n\t\t// `Map pane` where the grid layer will be added.\n\t\tpane: 'tilePane',\n\n\t\t// @option className: String = ''\n\t\t// A custom class name to assign to the tile layer. Empty by default.\n\t\tclassName: '',\n\n\t\t// @option keepBuffer: Number = 2\n\t\t// When panning the map, keep this many rows and columns of tiles before unloading them.\n\t\tkeepBuffer: 2\n\t},\n\n\tinitialize: function (options) {\n\t\tUtil.setOptions(this, options);\n\t},\n\n\tonAdd: function () {\n\t\tthis._initContainer();\n\n\t\tthis._levels = {};\n\t\tthis._tiles = {};\n\n\t\tthis._resetView(); // implicit _update() call\n\t},\n\n\tbeforeAdd: function (map) {\n\t\tmap._addZoomLimit(this);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._removeAllTiles();\n\t\tDomUtil.remove(this._container);\n\t\tmap._removeZoomLimit(this);\n\t\tthis._container = null;\n\t\tthis._tileZoom = undefined;\n\t},\n\n\t// @method bringToFront: this\n\t// Brings the tile layer to the top of all tile layers.\n\tbringToFront: function () {\n\t\tif (this._map) {\n\t\t\tDomUtil.toFront(this._container);\n\t\t\tthis._setAutoZIndex(Math.max);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack: this\n\t// Brings the tile layer to the bottom of all tile layers.\n\tbringToBack: function () {\n\t\tif (this._map) {\n\t\t\tDomUtil.toBack(this._container);\n\t\t\tthis._setAutoZIndex(Math.min);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getContainer: HTMLElement\n\t// Returns the HTML element that contains the tiles for this layer.\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\t// @method setOpacity(opacity: Number): this\n\t// Changes the [opacity](#gridlayer-opacity) of the grid layer.\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// @method setZIndex(zIndex: Number): this\n\t// Changes the [zIndex](#gridlayer-zindex) of the grid layer.\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\t// @method isLoading: Boolean\n\t// Returns `true` if any tile in the grid layer has not finished loading.\n\tisLoading: function () {\n\t\treturn this._loading;\n\t},\n\n\t// @method redraw: this\n\t// Causes the layer to clear all the tiles and request them again.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._removeAllTiles();\n\t\t\tvar tileZoom = this._clampZoom(this._map.getZoom());\n\t\t\tif (tileZoom !== this._tileZoom) {\n\t\t\t\tthis._tileZoom = tileZoom;\n\t\t\t\tthis._updateLevels();\n\t\t\t}\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewprereset: this._invalidateAll,\n\t\t\tviewreset: this._resetView,\n\t\t\tzoom: this._resetView,\n\t\t\tmoveend: this._onMoveEnd\n\t\t};\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\t// update tiles on move, but not more often than once per given interval\n\t\t\tif (!this._onMove) {\n\t\t\t\tthis._onMove = Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\n\t\t\t}\n\n\t\t\tevents.move = this._onMove;\n\t\t}\n\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._animateZoom;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t// @section Extension methods\n\t// Layers extending `GridLayer` shall reimplement the following method.\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\n\t// Called only internally, must be overridden by classes extending `GridLayer`.\n\t// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback\n\t// is specified, it must be called when the tile has finished loading and drawing.\n\tcreateTile: function () {\n\t\treturn document.createElement('div');\n\t},\n\n\t// @section\n\t// @method getTileSize: Point\n\t// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.\n\tgetTileSize: function () {\n\t\tvar s = this.options.tileSize;\n\t\treturn s instanceof Point ? s : new Point(s, s);\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (compare) {\n\t\t// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)\n\n\t\tvar layers = this.getPane().children,\n\t\t    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min\n\n\t\tfor (var i = 0, len = layers.length, zIndex; i < len; i++) {\n\n\t\t\tzIndex = layers[i].style.zIndex;\n\n\t\t\tif (layers[i] !== this._container && zIndex) {\n\t\t\t\tedgeZIndex = compare(edgeZIndex, +zIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (isFinite(edgeZIndex)) {\n\t\t\tthis.options.zIndex = edgeZIndex + compare(-1, 1);\n\t\t\tthis._updateZIndex();\n\t\t}\n\t},\n\n\t_updateOpacity: function () {\n\t\tif (!this._map) { return; }\n\n\t\t// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles\n\t\tif (Browser.ielt9) { return; }\n\n\t\tDomUtil.setOpacity(this._container, this.options.opacity);\n\n\t\tvar now = +new Date(),\n\t\t    nextFrame = false,\n\t\t    willPrune = false;\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar tile = this._tiles[key];\n\t\t\tif (!tile.current || !tile.loaded) { continue; }\n\n\t\t\tvar fade = Math.min(1, (now - tile.loaded) / 200);\n\n\t\t\tDomUtil.setOpacity(tile.el, fade);\n\t\t\tif (fade < 1) {\n\t\t\t\tnextFrame = true;\n\t\t\t} else {\n\t\t\t\tif (tile.active) {\n\t\t\t\t\twillPrune = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis._onOpaqueTile(tile);\n\t\t\t\t}\n\t\t\t\ttile.active = true;\n\t\t\t}\n\t\t}\n\n\t\tif (willPrune && !this._noPrune) { this._pruneTiles(); }\n\n\t\tif (nextFrame) {\n\t\t\tUtil.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = Util.requestAnimFrame(this._updateOpacity, this);\n\t\t}\n\t},\n\n\t_onOpaqueTile: Util.falseFn,\n\n\t_initContainer: function () {\n\t\tif (this._container) { return; }\n\n\t\tthis._container = DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));\n\t\tthis._updateZIndex();\n\n\t\tif (this.options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t},\n\n\t_updateLevels: function () {\n\n\t\tvar zoom = this._tileZoom,\n\t\t    maxZoom = this.options.maxZoom;\n\n\t\tif (zoom === undefined) { return undefined; }\n\n\t\tfor (var z in this._levels) {\n\t\t\tz = Number(z);\n\t\t\tif (this._levels[z].el.children.length || z === zoom) {\n\t\t\t\tthis._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n\t\t\t\tthis._onUpdateLevel(z);\n\t\t\t} else {\n\t\t\t\tDomUtil.remove(this._levels[z].el);\n\t\t\t\tthis._removeTilesAtZoom(z);\n\t\t\t\tthis._onRemoveLevel(z);\n\t\t\t\tdelete this._levels[z];\n\t\t\t}\n\t\t}\n\n\t\tvar level = this._levels[zoom],\n\t\t    map = this._map;\n\n\t\tif (!level) {\n\t\t\tlevel = this._levels[zoom] = {};\n\n\t\t\tlevel.el = DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);\n\t\t\tlevel.el.style.zIndex = maxZoom;\n\n\t\t\tlevel.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n\t\t\tlevel.zoom = zoom;\n\n\t\t\tthis._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n\t\t\t// force the browser to consider the newly added element for transition\n\t\t\tUtil.falseFn(level.el.offsetWidth);\n\n\t\t\tthis._onCreateLevel(level);\n\t\t}\n\n\t\tthis._level = level;\n\n\t\treturn level;\n\t},\n\n\t_onUpdateLevel: Util.falseFn,\n\n\t_onRemoveLevel: Util.falseFn,\n\n\t_onCreateLevel: Util.falseFn,\n\n\t_pruneTiles: function () {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar key, tile;\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom ||\n\t\t\tzoom < this.options.minZoom) {\n\t\t\tthis._removeAllTiles();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\ttile.retain = tile.current;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\tif (tile.current && !tile.active) {\n\t\t\t\tvar coords = tile.coords;\n\t\t\t\tif (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {\n\t\t\t\t\tthis._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\tif (!this._tiles[key].retain) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTilesAtZoom: function (zoom) {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (this._tiles[key].coords.z !== zoom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_removeAllTiles: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_invalidateAll: function () {\n\t\tfor (var z in this._levels) {\n\t\t\tDomUtil.remove(this._levels[z].el);\n\t\t\tthis._onRemoveLevel(Number(z));\n\t\t\tdelete this._levels[z];\n\t\t}\n\t\tthis._removeAllTiles();\n\n\t\tthis._tileZoom = undefined;\n\t},\n\n\t_retainParent: function (x, y, z, minZoom) {\n\t\tvar x2 = Math.floor(x / 2),\n\t\t    y2 = Math.floor(y / 2),\n\t\t    z2 = z - 1,\n\t\t    coords2 = new Point(+x2, +y2);\n\t\tcoords2.z = +z2;\n\n\t\tvar key = this._tileCoordsToKey(coords2),\n\t\t    tile = this._tiles[key];\n\n\t\tif (tile && tile.active) {\n\t\t\ttile.retain = true;\n\t\t\treturn true;\n\n\t\t} else if (tile && tile.loaded) {\n\t\t\ttile.retain = true;\n\t\t}\n\n\t\tif (z2 > minZoom) {\n\t\t\treturn this._retainParent(x2, y2, z2, minZoom);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_retainChildren: function (x, y, z, maxZoom) {\n\n\t\tfor (var i = 2 * x; i < 2 * x + 2; i++) {\n\t\t\tfor (var j = 2 * y; j < 2 * y + 2; j++) {\n\n\t\t\t\tvar coords = new Point(i, j);\n\t\t\t\tcoords.z = z + 1;\n\n\t\t\t\tvar key = this._tileCoordsToKey(coords),\n\t\t\t\t    tile = this._tiles[key];\n\n\t\t\t\tif (tile && tile.active) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} else if (tile && tile.loaded) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t}\n\n\t\t\t\tif (z + 1 < maxZoom) {\n\t\t\t\t\tthis._retainChildren(i, j, z + 1, maxZoom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetView: function (e) {\n\t\tvar animating = e && (e.pinch || e.flyTo);\n\t\tthis._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);\n\t},\n\n\t_animateZoom: function (e) {\n\t\tthis._setView(e.center, e.zoom, true, e.noUpdate);\n\t},\n\n\t_clampZoom: function (zoom) {\n\t\tvar options = this.options;\n\n\t\tif (undefined !== options.minNativeZoom && zoom < options.minNativeZoom) {\n\t\t\treturn options.minNativeZoom;\n\t\t}\n\n\t\tif (undefined !== options.maxNativeZoom && options.maxNativeZoom < zoom) {\n\t\t\treturn options.maxNativeZoom;\n\t\t}\n\n\t\treturn zoom;\n\t},\n\n\t_setView: function (center, zoom, noPrune, noUpdate) {\n\t\tvar tileZoom = Math.round(zoom);\n\t\tif ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||\n\t\t    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {\n\t\t\ttileZoom = undefined;\n\t\t} else {\n\t\t\ttileZoom = this._clampZoom(tileZoom);\n\t\t}\n\n\t\tvar tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);\n\n\t\tif (!noUpdate || tileZoomChanged) {\n\n\t\t\tthis._tileZoom = tileZoom;\n\n\t\t\tif (this._abortLoading) {\n\t\t\t\tthis._abortLoading();\n\t\t\t}\n\n\t\t\tthis._updateLevels();\n\t\t\tthis._resetGrid();\n\n\t\t\tif (tileZoom !== undefined) {\n\t\t\t\tthis._update(center);\n\t\t\t}\n\n\t\t\tif (!noPrune) {\n\t\t\t\tthis._pruneTiles();\n\t\t\t}\n\n\t\t\t// Flag to prevent _updateOpacity from pruning tiles during\n\t\t\t// a zoom anim or a pinch gesture\n\t\t\tthis._noPrune = !!noPrune;\n\t\t}\n\n\t\tthis._setZoomTransforms(center, zoom);\n\t},\n\n\t_setZoomTransforms: function (center, zoom) {\n\t\tfor (var i in this._levels) {\n\t\t\tthis._setZoomTransform(this._levels[i], center, zoom);\n\t\t}\n\t},\n\n\t_setZoomTransform: function (level, center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, level.zoom),\n\t\t    translate = level.origin.multiplyBy(scale)\n\t\t        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();\n\n\t\tif (Browser.any3d) {\n\t\t\tDomUtil.setTransform(level.el, translate, scale);\n\t\t} else {\n\t\t\tDomUtil.setPosition(level.el, translate);\n\t\t}\n\t},\n\n\t_resetGrid: function () {\n\t\tvar map = this._map,\n\t\t    crs = map.options.crs,\n\t\t    tileSize = this._tileSize = this.getTileSize(),\n\t\t    tileZoom = this._tileZoom;\n\n\t\tvar bounds = this._map.getPixelWorldBounds(this._tileZoom);\n\t\tif (bounds) {\n\t\t\tthis._globalTileRange = this._pxBoundsToTileRange(bounds);\n\t\t}\n\n\t\tthis._wrapX = crs.wrapLng && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),\n\t\t\tMath.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)\n\t\t];\n\t\tthis._wrapY = crs.wrapLat && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),\n\t\t\tMath.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)\n\t\t];\n\t},\n\n\t_onMoveEnd: function () {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\tthis._update();\n\t},\n\n\t_getTiledPixelBounds: function (center) {\n\t\tvar map = this._map,\n\t\t    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),\n\t\t    scale = map.getZoomScale(mapZoom, this._tileZoom),\n\t\t    pixelCenter = map.project(center, this._tileZoom).floor(),\n\t\t    halfSize = map.getSize().divideBy(scale * 2);\n\n\t\treturn new Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));\n\t},\n\n\t// Private method to load tiles in the grid's active zoom level according to map bounds\n\t_update: function (center) {\n\t\tvar map = this._map;\n\t\tif (!map) { return; }\n\t\tvar zoom = this._clampZoom(map.getZoom());\n\n\t\tif (center === undefined) { center = map.getCenter(); }\n\t\tif (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n\t\tvar pixelBounds = this._getTiledPixelBounds(center),\n\t\t    tileRange = this._pxBoundsToTileRange(pixelBounds),\n\t\t    tileCenter = tileRange.getCenter(),\n\t\t    queue = [],\n\t\t    margin = this.options.keepBuffer,\n\t\t    noPruneRange = new Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n\t\t                              tileRange.getTopRight().add([margin, -margin]));\n\n\t\t// Sanity check: panic if the tile range contains Infinity somewhere.\n\t\tif (!(isFinite(tileRange.min.x) &&\n\t\t      isFinite(tileRange.min.y) &&\n\t\t      isFinite(tileRange.max.x) &&\n\t\t      isFinite(tileRange.max.y))) { throw new Error('Attempted to load an infinite number of tiles'); }\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar c = this._tiles[key].coords;\n\t\t\tif (c.z !== this._tileZoom || !noPruneRange.contains(new Point(c.x, c.y))) {\n\t\t\t\tthis._tiles[key].current = false;\n\t\t\t}\n\t\t}\n\n\t\t// _update just loads more tiles. If the tile zoom level differs too much\n\t\t// from the map's, let _setView reset levels and prune old tiles.\n\t\tif (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n\t\t// create a queue of coordinates to load tiles from\n\t\tfor (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n\t\t\tfor (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n\t\t\t\tvar coords = new Point(i, j);\n\t\t\t\tcoords.z = this._tileZoom;\n\n\t\t\t\tif (!this._isValidTile(coords)) { continue; }\n\n\t\t\t\tvar tile = this._tiles[this._tileCoordsToKey(coords)];\n\t\t\t\tif (tile) {\n\t\t\t\t\ttile.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push(coords);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort tile queue to load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n\t\t});\n\n\t\tif (queue.length !== 0) {\n\t\t\t// if it's the first batch of tiles to load\n\t\t\tif (!this._loading) {\n\t\t\t\tthis._loading = true;\n\t\t\t\t// @event loading: Event\n\t\t\t\t// Fired when the grid layer starts loading tiles.\n\t\t\t\tthis.fire('loading');\n\t\t\t}\n\n\t\t\t// create DOM fragment to append tiles in one batch\n\t\t\tvar fragment = document.createDocumentFragment();\n\n\t\t\tfor (i = 0; i < queue.length; i++) {\n\t\t\t\tthis._addTile(queue[i], fragment);\n\t\t\t}\n\n\t\t\tthis._level.el.appendChild(fragment);\n\t\t}\n\t},\n\n\t_isValidTile: function (coords) {\n\t\tvar crs = this._map.options.crs;\n\n\t\tif (!crs.infinite) {\n\t\t\t// don't load tile if it's out of bounds and not wrapped\n\t\t\tvar bounds = this._globalTileRange;\n\t\t\tif ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||\n\t\t\t    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }\n\t\t}\n\n\t\tif (!this.options.bounds) { return true; }\n\n\t\t// don't load tile if it doesn't intersect the bounds in options\n\t\tvar tileBounds = this._tileCoordsToBounds(coords);\n\t\treturn latLngBounds(this.options.bounds).overlaps(tileBounds);\n\t},\n\n\t_keyToBounds: function (key) {\n\t\treturn this._tileCoordsToBounds(this._keyToTileCoords(key));\n\t},\n\n\t_tileCoordsToNwSe: function (coords) {\n\t\tvar map = this._map,\n\t\t    tileSize = this.getTileSize(),\n\t\t    nwPoint = coords.scaleBy(tileSize),\n\t\t    sePoint = nwPoint.add(tileSize),\n\t\t    nw = map.unproject(nwPoint, coords.z),\n\t\t    se = map.unproject(sePoint, coords.z);\n\t\treturn [nw, se];\n\t},\n\n\t// converts tile coordinates to its geographical bounds\n\t_tileCoordsToBounds: function (coords) {\n\t\tvar bp = this._tileCoordsToNwSe(coords),\n\t\t    bounds = new LatLngBounds(bp[0], bp[1]);\n\n\t\tif (!this.options.noWrap) {\n\t\t\tbounds = this._map.wrapLatLngBounds(bounds);\n\t\t}\n\t\treturn bounds;\n\t},\n\t// converts tile coordinates to key for the tile cache\n\t_tileCoordsToKey: function (coords) {\n\t\treturn coords.x + ':' + coords.y + ':' + coords.z;\n\t},\n\n\t// converts tile cache key to coordinates\n\t_keyToTileCoords: function (key) {\n\t\tvar k = key.split(':'),\n\t\t    coords = new Point(+k[0], +k[1]);\n\t\tcoords.z = +k[2];\n\t\treturn coords;\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\tDomUtil.remove(tile.el);\n\n\t\tdelete this._tiles[key];\n\n\t\t// @event tileunload: TileEvent\n\t\t// Fired when a tile is removed (e.g. when a tile goes off the screen).\n\t\tthis.fire('tileunload', {\n\t\t\ttile: tile.el,\n\t\t\tcoords: this._keyToTileCoords(key)\n\t\t});\n\t},\n\n\t_initTile: function (tile) {\n\t\tDomUtil.addClass(tile, 'leaflet-tile');\n\n\t\tvar tileSize = this.getTileSize();\n\t\ttile.style.width = tileSize.x + 'px';\n\t\ttile.style.height = tileSize.y + 'px';\n\n\t\ttile.onselectstart = Util.falseFn;\n\t\ttile.onmousemove = Util.falseFn;\n\n\t\t// update opacity on tiles in IE7-8 because of filter inheritance problems\n\t\tif (Browser.ielt9 && this.options.opacity < 1) {\n\t\t\tDomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\t},\n\n\t_addTile: function (coords, container) {\n\t\tvar tilePos = this._getTilePos(coords),\n\t\t    key = this._tileCoordsToKey(coords);\n\n\t\tvar tile = this.createTile(this._wrapCoords(coords), Util.bind(this._tileReady, this, coords));\n\n\t\tthis._initTile(tile);\n\n\t\t// if createTile is defined with a second argument (\"done\" callback),\n\t\t// we know that tile is async and will be ready later; otherwise\n\t\tif (this.createTile.length < 2) {\n\t\t\t// mark tile as ready, but delay one frame for opacity animation to happen\n\t\t\tUtil.requestAnimFrame(Util.bind(this._tileReady, this, coords, null, tile));\n\t\t}\n\n\t\tDomUtil.setPosition(tile, tilePos);\n\n\t\t// save tile in cache\n\t\tthis._tiles[key] = {\n\t\t\tel: tile,\n\t\t\tcoords: coords,\n\t\t\tcurrent: true\n\t\t};\n\n\t\tcontainer.appendChild(tile);\n\t\t// @event tileloadstart: TileEvent\n\t\t// Fired when a tile is requested and starts loading.\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\tcoords: coords\n\t\t});\n\t},\n\n\t_tileReady: function (coords, err, tile) {\n\t\tif (err) {\n\t\t\t// @event tileerror: TileErrorEvent\n\t\t\t// Fired when there is an error loading a tile.\n\t\t\tthis.fire('tileerror', {\n\t\t\t\terror: err,\n\t\t\t\ttile: tile,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tvar key = this._tileCoordsToKey(coords);\n\n\t\ttile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\ttile.loaded = +new Date();\n\t\tif (this._map._fadeAnimated) {\n\t\t\tDomUtil.setOpacity(tile.el, 0);\n\t\t\tUtil.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = Util.requestAnimFrame(this._updateOpacity, this);\n\t\t} else {\n\t\t\ttile.active = true;\n\t\t\tthis._pruneTiles();\n\t\t}\n\n\t\tif (!err) {\n\t\t\tDomUtil.addClass(tile.el, 'leaflet-tile-loaded');\n\n\t\t\t// @event tileload: TileEvent\n\t\t\t// Fired when a tile loads.\n\t\t\tthis.fire('tileload', {\n\t\t\t\ttile: tile.el,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tif (this._noTilesToLoad()) {\n\t\t\tthis._loading = false;\n\t\t\t// @event load: Event\n\t\t\t// Fired when the grid layer loaded all visible tiles.\n\t\t\tthis.fire('load');\n\n\t\t\tif (Browser.ielt9 || !this._map._fadeAnimated) {\n\t\t\t\tUtil.requestAnimFrame(this._pruneTiles, this);\n\t\t\t} else {\n\t\t\t\t// Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n\t\t\t\t// to trigger a pruning.\n\t\t\t\tsetTimeout(Util.bind(this._pruneTiles, this), 250);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getTilePos: function (coords) {\n\t\treturn coords.scaleBy(this.getTileSize()).subtract(this._level.origin);\n\t},\n\n\t_wrapCoords: function (coords) {\n\t\tvar newCoords = new Point(\n\t\t\tthis._wrapX ? Util.wrapNum(coords.x, this._wrapX) : coords.x,\n\t\t\tthis._wrapY ? Util.wrapNum(coords.y, this._wrapY) : coords.y);\n\t\tnewCoords.z = coords.z;\n\t\treturn newCoords;\n\t},\n\n\t_pxBoundsToTileRange: function (bounds) {\n\t\tvar tileSize = this.getTileSize();\n\t\treturn new Bounds(\n\t\t\tbounds.min.unscaleBy(tileSize).floor(),\n\t\t\tbounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));\n\t},\n\n\t_noTilesToLoad: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (!this._tiles[key].loaded) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n});\n\n// @factory L.gridLayer(options?: GridLayer options)\n// Creates a new instance of GridLayer with the supplied options.\nexport function gridLayer(options) {\n\treturn new GridLayer(options);\n}\n","import {GridLayer} from './GridLayer';\r\nimport Browser from '../../core/Browser';\r\nimport * as Util from '../../core/Util';\r\nimport * as DomEvent from '../../dom/DomEvent';\r\nimport * as DomUtil from '../../dom/DomUtil';\r\n\r\n\r\n/*\r\n * @class TileLayer\r\n * @inherits GridLayer\r\n * @aka L.TileLayer\r\n * Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under `Layer`. Extends `GridLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(map);\n * ```\r\n *\r\n * @section URL template\r\n * @example\r\n *\r\n * A string of the following form:\r\n *\r\n * ```\r\n * 'https://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'\r\n * ```\r\n *\r\n * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add \"&commat;2x\" to the URL to load retina tiles.\r\n *\r\n * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:\r\n *\r\n * ```\r\n * L.tileLayer('https://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});\r\n * ```\r\n */\r\n\r\n\r\nexport var TileLayer = GridLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer options\r\n\toptions: {\r\n\t\t// @option minZoom: Number = 0\r\n\t\t// The minimum zoom level down to which this layer will be displayed (inclusive).\r\n\t\tminZoom: 0,\r\n\r\n\t\t// @option maxZoom: Number = 18\r\n\t\t// The maximum zoom level up to which this layer will be displayed (inclusive).\r\n\t\tmaxZoom: 18,\r\n\r\n\t\t// @option subdomains: String|String[] = 'abc'\r\n\t\t// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.\r\n\t\tsubdomains: 'abc',\r\n\r\n\t\t// @option errorTileUrl: String = ''\r\n\t\t// URL to the tile image to show in place of the tile that failed to load.\r\n\t\terrorTileUrl: '',\r\n\r\n\t\t// @option zoomOffset: Number = 0\r\n\t\t// The zoom number used in tile URLs will be offset with this value.\r\n\t\tzoomOffset: 0,\r\n\r\n\t\t// @option tms: Boolean = false\r\n\t\t// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).\r\n\t\ttms: false,\r\n\r\n\t\t// @option zoomReverse: Boolean = false\r\n\t\t// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)\r\n\t\tzoomReverse: false,\r\n\r\n\t\t// @option detectRetina: Boolean = false\r\n\t\t// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.\r\n\t\tdetectRetina: false,\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false,\r\n\r\n\t\t// @option referrerPolicy: Boolean|String = false\r\n\t\t// Whether the referrerPolicy attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their referrerPolicy attribute set to the String provided.\r\n\t\t// This may be needed if your map's rendering context has a strict default but your tile provider expects a valid referrer\r\n\t\t// (e.g. to validate an API token).\r\n\t\t// Refer to [HTMLImageElement.referrerPolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/referrerPolicy) for valid String values.\r\n\t\treferrerPolicy: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\toptions = Util.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\r\n\t\t\tif (!options.zoomReverse) {\r\n\t\t\t\toptions.zoomOffset++;\r\n\t\t\t\toptions.maxZoom = Math.max(options.minZoom, options.maxZoom - 1);\r\n\t\t\t} else {\r\n\t\t\t\toptions.zoomOffset--;\r\n\t\t\t\toptions.minZoom = Math.min(options.maxZoom, options.minZoom + 1);\r\n\t\t\t}\r\n\r\n\t\t\toptions.minZoom = Math.max(0, options.minZoom);\r\n\t\t} else if (!options.zoomReverse) {\r\n\t\t\t// make sure maxZoom is gte minZoom\r\n\t\t\toptions.maxZoom = Math.max(options.minZoom, options.maxZoom);\r\n\t\t} else {\r\n\t\t\t// make sure minZoom is lte maxZoom\r\n\t\t\toptions.minZoom = Math.min(options.maxZoom, options.minZoom);\r\n\t\t}\r\n\r\n\t\tif (typeof options.subdomains === 'string') {\r\n\t\t\toptions.subdomains = options.subdomains.split('');\r\n\t\t}\r\n\r\n\t\tthis.on('tileunload', this._onTileRemove);\r\n\t},\r\n\r\n\t// @method setUrl(url: String, noRedraw?: Boolean): this\r\n\t// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).\r\n\t// If the URL does not change, the layer will not be redrawn unless\r\n\t// the noRedraw parameter is set to false.\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tif (this._url === url && noRedraw === undefined) {\r\n\t\t\tnoRedraw = true;\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\r\n\t// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)\r\n\t// to return an `<img>` HTML element with the appropriate image URL given `coords`. The `done`\r\n\t// callback is called when the tile has been loaded.\r\n\tcreateTile: function (coords, done) {\r\n\t\tvar tile = document.createElement('img');\r\n\r\n\t\tDomEvent.on(tile, 'load', Util.bind(this._tileOnLoad, this, done, tile));\r\n\t\tDomEvent.on(tile, 'error', Util.bind(this._tileOnError, this, done, tile));\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\ttile.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\t// for this new option we follow the documented behavior\r\n\t\t// more closely by only setting the property when string\r\n\t\tif (typeof this.options.referrerPolicy === 'string') {\r\n\t\t\ttile.referrerPolicy = this.options.referrerPolicy;\r\n\t\t}\r\n\r\n\t\t// The alt attribute is set to the empty string,\r\n\t\t// allowing screen readers to ignore the decorative image tiles.\r\n\t\t// https://www.w3.org/WAI/tutorials/images/decorative/\r\n\t\t// https://www.w3.org/TR/html-aria/#el-img-empty-alt\r\n\t\ttile.alt = '';\r\n\r\n\t\ttile.src = this.getTileUrl(coords);\r\n\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t// @section Extension methods\r\n\t// @uninheritable\r\n\t// Layers extending `TileLayer` might reimplement the following method.\r\n\t// @method getTileUrl(coords: Object): String\r\n\t// Called only internally, returns the URL for a tile given its coordinates.\r\n\t// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.\r\n\tgetTileUrl: function (coords) {\r\n\t\tvar data = {\r\n\t\t\tr: Browser.retina ? '@2x' : '',\r\n\t\t\ts: this._getSubdomain(coords),\r\n\t\t\tx: coords.x,\r\n\t\t\ty: coords.y,\r\n\t\t\tz: this._getZoomForUrl()\r\n\t\t};\r\n\t\tif (this._map && !this._map.options.crs.infinite) {\r\n\t\t\tvar invertedY = this._globalTileRange.max.y - coords.y;\r\n\t\t\tif (this.options.tms) {\r\n\t\t\t\tdata['y'] = invertedY;\r\n\t\t\t}\r\n\t\t\tdata['-y'] = invertedY;\r\n\t\t}\r\n\r\n\t\treturn Util.template(this._url, Util.extend(data, this.options));\r\n\t},\r\n\r\n\t_tileOnLoad: function (done, tile) {\r\n\t\t// For https://github.com/Leaflet/Leaflet/issues/3332\r\n\t\tif (Browser.ielt9) {\r\n\t\t\tsetTimeout(Util.bind(done, this, null, tile), 0);\r\n\t\t} else {\r\n\t\t\tdone(null, tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnError: function (done, tile, e) {\r\n\t\tvar errorUrl = this.options.errorTileUrl;\r\n\t\tif (errorUrl && tile.getAttribute('src') !== errorUrl) {\r\n\t\t\ttile.src = errorUrl;\r\n\t\t}\r\n\t\tdone(e, tile);\r\n\t},\r\n\r\n\t_onTileRemove: function (e) {\r\n\t\te.tile.onload = null;\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\t\tvar zoom = this._tileZoom,\r\n\t\tmaxZoom = this.options.maxZoom,\r\n\t\tzoomReverse = this.options.zoomReverse,\r\n\t\tzoomOffset = this.options.zoomOffset;\r\n\r\n\t\tif (zoomReverse) {\r\n\t\t\tzoom = maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\treturn zoom + zoomOffset;\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t// stops loading all tiles in the background layer\r\n\t_abortLoading: function () {\r\n\t\tvar i, tile;\r\n\t\tfor (i in this._tiles) {\r\n\t\t\tif (this._tiles[i].coords.z !== this._tileZoom) {\r\n\t\t\t\ttile = this._tiles[i].el;\r\n\r\n\t\t\t\ttile.onload = Util.falseFn;\r\n\t\t\t\ttile.onerror = Util.falseFn;\r\n\r\n\t\t\t\tif (!tile.complete) {\r\n\t\t\t\t\ttile.src = Util.emptyImageUrl;\r\n\t\t\t\t\tvar coords = this._tiles[i].coords;\r\n\t\t\t\t\tDomUtil.remove(tile);\r\n\t\t\t\t\tdelete this._tiles[i];\r\n\t\t\t\t\t// @event tileabort: TileEvent\r\n\t\t\t\t\t// Fired when a tile was loading but is now not wanted.\r\n\t\t\t\t\tthis.fire('tileabort', {\r\n\t\t\t\t\t\ttile: tile,\r\n\t\t\t\t\t\tcoords: coords\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\t\tif (!tile) { return; }\r\n\r\n\t\t// Cancels any pending http requests associated with the tile\r\n\t\ttile.el.setAttribute('src', Util.emptyImageUrl);\r\n\r\n\t\treturn GridLayer.prototype._removeTile.call(this, key);\r\n\t},\r\n\r\n\t_tileReady: function (coords, err, tile) {\r\n\t\tif (!this._map || (tile && tile.getAttribute('src') === Util.emptyImageUrl)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn GridLayer.prototype._tileReady.call(this, coords, err, tile);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)\r\n// Instantiates a tile layer object given a `URL template` and optionally an options object.\r\n\r\nexport function tileLayer(url, options) {\r\n\treturn new TileLayer(url, options);\r\n}\r\n","import {TileLayer} from './TileLayer';\r\nimport {extend, setOptions, getParamString} from '../../core/Util';\r\nimport Browser from '../../core/Browser';\r\nimport {EPSG4326} from '../../geo/crs/CRS.EPSG4326';\r\nimport {toBounds} from '../../geometry/Bounds';\r\n\r\n/*\r\n * @class TileLayer.WMS\r\n * @inherits TileLayer\r\n * @aka L.TileLayer.WMS\r\n * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var nexrad = L.tileLayer.wms(\"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi\", {\r\n * \tlayers: 'nexrad-n0r-900913',\r\n * \tformat: 'image/png',\r\n * \ttransparent: true,\r\n * \tattribution: \"Weather data © 2012 IEM Nexrad\"\r\n * });\r\n * ```\r\n */\r\n\r\nexport var TileLayerWMS = TileLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer.WMS options\r\n\t// If any custom options not documented here are used, they will be sent to the\r\n\t// WMS server as extra parameters in each request URL. This can be useful for\r\n\t// [non-standard vendor WMS parameters](https://docs.geoserver.org/stable/en/user/services/wms/vendor.html).\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\r\n\t\t// @option layers: String = ''\r\n\t\t// **(required)** Comma-separated list of WMS layers to show.\r\n\t\tlayers: '',\r\n\r\n\t\t// @option styles: String = ''\r\n\t\t// Comma-separated list of WMS styles.\r\n\t\tstyles: '',\r\n\r\n\t\t// @option format: String = 'image/jpeg'\r\n\t\t// WMS image format (use `'image/png'` for layers with transparency).\r\n\t\tformat: 'image/jpeg',\r\n\r\n\t\t// @option transparent: Boolean = false\r\n\t\t// If `true`, the WMS service will return images with transparency.\r\n\t\ttransparent: false,\r\n\r\n\t\t// @option version: String = '1.1.1'\r\n\t\t// Version of the WMS service to use\r\n\t\tversion: '1.1.1'\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// @option crs: CRS = null\r\n\t\t// Coordinate Reference System to use for the WMS requests, defaults to\r\n\t\t// map CRS. Don't change this if you're not sure what it means.\r\n\t\tcrs: null,\r\n\r\n\t\t// @option uppercase: Boolean = false\r\n\t\t// If `true`, WMS request parameter keys will be uppercase.\r\n\t\tuppercase: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = extend({}, this.defaultWmsParams);\r\n\r\n\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\tfor (var i in options) {\r\n\t\t\tif (!(i in this.options)) {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions = setOptions(this, options);\r\n\r\n\t\tvar realRetina = options.detectRetina && Browser.retina ? 2 : 1;\r\n\t\tvar tileSize = this.getTileSize();\r\n\t\twmsParams.width = tileSize.x * realRetina;\r\n\t\twmsParams.height = tileSize.y * realRetina;\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tTileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (coords) {\r\n\r\n\t\tvar tileBounds = this._tileCoordsToNwSe(coords),\r\n\t\t    crs = this._crs,\r\n\t\t    bounds = toBounds(crs.project(tileBounds[0]), crs.project(tileBounds[1])),\r\n\t\t    min = bounds.min,\r\n\t\t    max = bounds.max,\r\n\t\t    bbox = (this._wmsVersion >= 1.3 && this._crs === EPSG4326 ?\r\n\t\t    [min.y, min.x, max.y, max.x] :\r\n\t\t    [min.x, min.y, max.x, max.y]).join(','),\r\n\t\t    url = TileLayer.prototype.getTileUrl.call(this, coords);\r\n\t\treturn url +\r\n\t\t\tgetParamString(this.wmsParams, url, this.options.uppercase) +\r\n\t\t\t(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;\r\n\t},\r\n\r\n\t// @method setParams(params: Object, noRedraw?: Boolean): this\r\n\t// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\textend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)\r\n// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.\r\nexport function tileLayerWMS(url, options) {\r\n\treturn new TileLayerWMS(url, options);\r\n}\r\n","export {GridLayer, gridLayer} from './GridLayer';\nimport {TileLayer, tileLayer} from './TileLayer';\nimport {TileLayerWMS, tileLayerWMS} from './TileLayer.WMS';\nTileLayer.WMS = TileLayerWMS;\ntileLayer.wms = tileLayerWMS;\nexport {TileLayer, tileLayer};\n","import {Layer} from '../Layer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as Util from '../../core/Util';\nimport Browser from '../../core/Browser';\nimport {Bounds} from '../../geometry/Bounds';\n\n\n\n/*\n * @class Renderer\n * @inherits Layer\n * @aka L.Renderer\n *\n * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the\n * DOM container of the renderer, its bounds, and its zoom animation.\n *\n * A `Renderer` works as an implicit layer group for all `Path`s - the renderer\n * itself can be added or removed to the map. All paths use a renderer, which can\n * be implicit (the map will decide the type of renderer and use it automatically)\n * or explicit (using the [`renderer`](#path-renderer) option of the path).\n *\n * Do not use this class directly, use `SVG` and `Canvas` instead.\n *\n * @event update: Event\n * Fired when the renderer updates its bounds, center and zoom, for example when\n * its map has moved\n */\n\nexport var Renderer = Layer.extend({\n\n\t// @section\n\t// @aka Renderer options\n\toptions: {\n\t\t// @option padding: Number = 0.1\n\t\t// How much to extend the clip area around the map view (relative to its size)\n\t\t// e.g. 0.1 would be 10% of map view in each direction\n\t\tpadding: 0.1\n\t},\n\n\tinitialize: function (options) {\n\t\tUtil.setOptions(this, options);\n\t\tUtil.stamp(this);\n\t\tthis._layers = this._layers || {};\n\t},\n\n\tonAdd: function () {\n\t\tif (!this._container) {\n\t\t\tthis._initContainer(); // defined by renderer implementations\n\n\t\t\t// always keep transform-origin as 0 0\n\t\t\tDomUtil.addClass(this._container, 'leaflet-zoom-animated');\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t\tthis._update();\n\t\tthis.on('update', this._updatePaths, this);\n\t},\n\n\tonRemove: function () {\n\t\tthis.off('update', this._updatePaths, this);\n\t\tthis._destroyContainer();\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._reset,\n\t\t\tzoom: this._onZoom,\n\t\t\tmoveend: this._update,\n\t\t\tzoomend: this._onZoomEnd\n\t\t};\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._onAnimZoom;\n\t\t}\n\t\treturn events;\n\t},\n\n\t_onAnimZoom: function (ev) {\n\t\tthis._updateTransform(ev.center, ev.zoom);\n\t},\n\n\t_onZoom: function () {\n\t\tthis._updateTransform(this._map.getCenter(), this._map.getZoom());\n\t},\n\n\t_updateTransform: function (center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, this._zoom),\n\t\t    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),\n\t\t    currentCenterPoint = this._map.project(this._center, zoom),\n\n\t\t    topLeftOffset = viewHalf.multiplyBy(-scale).add(currentCenterPoint)\n\t\t\t\t  .subtract(this._map._getNewPixelOrigin(center, zoom));\n\n\t\tif (Browser.any3d) {\n\t\t\tDomUtil.setTransform(this._container, topLeftOffset, scale);\n\t\t} else {\n\t\t\tDomUtil.setPosition(this._container, topLeftOffset);\n\t\t}\n\t},\n\n\t_reset: function () {\n\t\tthis._update();\n\t\tthis._updateTransform(this._center, this._zoom);\n\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._reset();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._project();\n\t\t}\n\t},\n\n\t_updatePaths: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._update();\n\t\t}\n\t},\n\n\t_update: function () {\n\t\t// Update pixel bounds of renderer container (for positioning/sizing/clipping later)\n\t\t// Subclasses are responsible of firing the 'update' event.\n\t\tvar p = this.options.padding,\n\t\t    size = this._map.getSize(),\n\t\t    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();\n\n\t\tthis._bounds = new Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());\n\n\t\tthis._center = this._map.getCenter();\n\t\tthis._zoom = this._map.getZoom();\n\t}\n});\n","import {Renderer} from './Renderer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport Browser from '../../core/Browser';\nimport * as Util from '../../core/Util';\nimport {Bounds} from '../../geometry/Bounds';\n\n/*\n * @class Canvas\n * @inherits Renderer\n * @aka L.Canvas\n *\n * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](https://caniuse.com/canvas), Canvas is not\n * available in all web browsers, notably IE8, and overlapping geometries might\n * not display properly in some edge cases.\n *\n * @example\n *\n * Use Canvas by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.canvas()\n * });\n * ```\n *\n * Use a Canvas renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.canvas({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nexport var Canvas = Renderer.extend({\n\n\t// @section\n\t// @aka Canvas options\n\toptions: {\n\t\t// @option tolerance: Number = 0\n\t\t// How much to extend the click tolerance around a path/object on the map.\n\t\ttolerance: 0\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = Renderer.prototype.getEvents.call(this);\n\t\tevents.viewprereset = this._onViewPreReset;\n\t\treturn events;\n\t},\n\n\t_onViewPreReset: function () {\n\t\t// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once\n\t\tthis._postponeUpdatePaths = true;\n\t},\n\n\tonAdd: function () {\n\t\tRenderer.prototype.onAdd.call(this);\n\n\t\t// Redraw vectors since canvas is cleared upon removal,\n\t\t// in case of removing the renderer itself from the map.\n\t\tthis._draw();\n\t},\n\n\t_initContainer: function () {\n\t\tvar container = this._container = document.createElement('canvas');\n\n\t\tDomEvent.on(container, 'mousemove', this._onMouseMove, this);\n\t\tDomEvent.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this);\n\t\tDomEvent.on(container, 'mouseout', this._handleMouseOut, this);\n\t\tcontainer['_leaflet_disable_events'] = true;\n\n\t\tthis._ctx = container.getContext('2d');\n\t},\n\n\t_destroyContainer: function () {\n\t\tUtil.cancelAnimFrame(this._redrawRequest);\n\t\tdelete this._ctx;\n\t\tDomUtil.remove(this._container);\n\t\tDomEvent.off(this._container);\n\t\tdelete this._container;\n\t},\n\n\t_updatePaths: function () {\n\t\tif (this._postponeUpdatePaths) { return; }\n\n\t\tvar layer;\n\t\tthis._redrawBounds = null;\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tlayer._update();\n\t\t}\n\t\tthis._redraw();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tRenderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    container = this._container,\n\t\t    size = b.getSize(),\n\t\t    m = Browser.retina ? 2 : 1;\n\n\t\tDomUtil.setPosition(container, b.min);\n\n\t\t// set canvas size (also clearing it); use double size on retina\n\t\tcontainer.width = m * size.x;\n\t\tcontainer.height = m * size.y;\n\t\tcontainer.style.width = size.x + 'px';\n\t\tcontainer.style.height = size.y + 'px';\n\n\t\tif (Browser.retina) {\n\t\t\tthis._ctx.scale(2, 2);\n\t\t}\n\n\t\t// translate so we use the same path coordinates after canvas element moves\n\t\tthis._ctx.translate(-b.min.x, -b.min.y);\n\n\t\t// Tell paths to redraw themselves\n\t\tthis.fire('update');\n\t},\n\n\t_reset: function () {\n\t\tRenderer.prototype._reset.call(this);\n\n\t\tif (this._postponeUpdatePaths) {\n\t\t\tthis._postponeUpdatePaths = false;\n\t\t\tthis._updatePaths();\n\t\t}\n\t},\n\n\t_initPath: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._layers[Util.stamp(layer)] = layer;\n\n\t\tvar order = layer._order = {\n\t\t\tlayer: layer,\n\t\t\tprev: this._drawLast,\n\t\t\tnext: null\n\t\t};\n\t\tif (this._drawLast) { this._drawLast.next = order; }\n\t\tthis._drawLast = order;\n\t\tthis._drawFirst = this._drawFirst || this._drawLast;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\tthis._drawLast = prev;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\tdelete layer._order;\n\n\t\tdelete this._layers[Util.stamp(layer)];\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updatePath: function (layer) {\n\t\t// Redraw the union of the layer's old pixel\n\t\t// bounds and the new pixel bounds.\n\t\tthis._extendRedrawBounds(layer);\n\t\tlayer._project();\n\t\tlayer._update();\n\t\t// The redraw will extend the redraw bounds\n\t\t// with the new pixel bounds.\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateDashArray: function (layer) {\n\t\tif (typeof layer.options.dashArray === 'string') {\n\t\t\tvar parts = layer.options.dashArray.split(/[, ]+/),\n\t\t\t    dashArray = [],\n\t\t\t    dashValue,\n\t\t\t    i;\n\t\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\t\tdashValue = Number(parts[i]);\n\t\t\t\t// Ignore dash array containing invalid lengths\n\t\t\t\tif (isNaN(dashValue)) { return; }\n\t\t\t\tdashArray.push(dashValue);\n\t\t\t}\n\t\t\tlayer.options._dashArray = dashArray;\n\t\t} else {\n\t\t\tlayer.options._dashArray = layer.options.dashArray;\n\t\t}\n\t},\n\n\t_requestRedraw: function (layer) {\n\t\tif (!this._map) { return; }\n\n\t\tthis._extendRedrawBounds(layer);\n\t\tthis._redrawRequest = this._redrawRequest || Util.requestAnimFrame(this._redraw, this);\n\t},\n\n\t_extendRedrawBounds: function (layer) {\n\t\tif (layer._pxBounds) {\n\t\t\tvar padding = (layer.options.weight || 0) + 1;\n\t\t\tthis._redrawBounds = this._redrawBounds || new Bounds();\n\t\t\tthis._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));\n\t\t\tthis._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));\n\t\t}\n\t},\n\n\t_redraw: function () {\n\t\tthis._redrawRequest = null;\n\n\t\tif (this._redrawBounds) {\n\t\t\tthis._redrawBounds.min._floor();\n\t\t\tthis._redrawBounds.max._ceil();\n\t\t}\n\n\t\tthis._clear(); // clear layers in redraw bounds\n\t\tthis._draw(); // draw layers\n\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_clear: function () {\n\t\tvar bounds = this._redrawBounds;\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t} else {\n\t\t\tthis._ctx.save();\n\t\t\tthis._ctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\tthis._ctx.clearRect(0, 0, this._container.width, this._container.height);\n\t\t\tthis._ctx.restore();\n\t\t}\n\t},\n\n\t_draw: function () {\n\t\tvar layer, bounds = this._redrawBounds;\n\t\tthis._ctx.save();\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.beginPath();\n\t\t\tthis._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t\tthis._ctx.clip();\n\t\t}\n\n\t\tthis._drawing = true;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {\n\t\t\t\tlayer._updatePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._drawing = false;\n\n\t\tthis._ctx.restore();  // Restore state before clipping.\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tif (!this._drawing) { return; }\n\n\t\tvar i, j, len2, p,\n\t\t    parts = layer._parts,\n\t\t    len = parts.length,\n\t\t    ctx = this._ctx;\n\n\t\tif (!len) { return; }\n\n\t\tctx.beginPath();\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tfor (j = 0, len2 = parts[i].length; j < len2; j++) {\n\t\t\t\tp = parts[i][j];\n\t\t\t\tctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_updateCircle: function (layer) {\n\n\t\tif (!this._drawing || layer._empty()) { return; }\n\n\t\tvar p = layer._point,\n\t\t    ctx = this._ctx,\n\t\t    r = Math.max(Math.round(layer._radius), 1),\n\t\t    s = (Math.max(Math.round(layer._radiusY), 1) || r) / r;\n\n\t\tif (s !== 1) {\n\t\t\tctx.save();\n\t\t\tctx.scale(1, s);\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);\n\n\t\tif (s !== 1) {\n\t\t\tctx.restore();\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\t},\n\n\t_fillStroke: function (ctx, layer) {\n\t\tvar options = layer.options;\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = options.fillOpacity;\n\t\t\tctx.fillStyle = options.fillColor || options.color;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke && options.weight !== 0) {\n\t\t\tif (ctx.setLineDash) {\n\t\t\t\tctx.setLineDash(layer.options && layer.options._dashArray || []);\n\t\t\t}\n\t\t\tctx.globalAlpha = options.opacity;\n\t\t\tctx.lineWidth = options.weight;\n\t\t\tctx.strokeStyle = options.color;\n\t\t\tctx.lineCap = options.lineCap;\n\t\t\tctx.lineJoin = options.lineJoin;\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t// Canvas obviously doesn't have mouse events for individual drawn objects,\n\t// so we emulate that by calculating what's under the mouse on mousemove/click manually\n\n\t_onClick: function (e) {\n\t\tvar point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tif (!(e.type === 'click' || e.type === 'preclick') || !this._map._draggableMoved(layer)) {\n\t\t\t\t\tclickedLayer = layer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._fireEvent(clickedLayer ? [clickedLayer] : false, e);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }\n\n\t\tvar point = this._map.mouseEventToLayerPoint(e);\n\t\tthis._handleMouseHover(e, point);\n\t},\n\n\n\t_handleMouseOut: function (e) {\n\t\tvar layer = this._hoveredLayer;\n\t\tif (layer) {\n\t\t\t// if we're leaving the layer, fire mouseout\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-interactive');\n\t\t\tthis._fireEvent([layer], e, 'mouseout');\n\t\t\tthis._hoveredLayer = null;\n\t\t\tthis._mouseHoverThrottled = false;\n\t\t}\n\t},\n\n\t_handleMouseHover: function (e, point) {\n\t\tif (this._mouseHoverThrottled) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar layer, candidateHoveredLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tcandidateHoveredLayer = layer;\n\t\t\t}\n\t\t}\n\n\t\tif (candidateHoveredLayer !== this._hoveredLayer) {\n\t\t\tthis._handleMouseOut(e);\n\n\t\t\tif (candidateHoveredLayer) {\n\t\t\t\tDomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor\n\t\t\t\tthis._fireEvent([candidateHoveredLayer], e, 'mouseover');\n\t\t\t\tthis._hoveredLayer = candidateHoveredLayer;\n\t\t\t}\n\t\t}\n\n\t\tthis._fireEvent(this._hoveredLayer ? [this._hoveredLayer] : false, e);\n\n\t\tthis._mouseHoverThrottled = true;\n\t\tsetTimeout(Util.bind(function () {\n\t\t\tthis._mouseHoverThrottled = false;\n\t\t}, this), 32);\n\t},\n\n\t_fireEvent: function (layers, e, type) {\n\t\tthis._map._fireDOMEvent(e, type || e.type, layers);\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tvar order = layer._order;\n\n\t\tif (!order) { return; }\n\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\t// Already last\n\t\t\treturn;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else if (next) {\n\t\t\t// Update first entry unless this is the\n\t\t\t// single entry\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\torder.prev = this._drawLast;\n\t\tthis._drawLast.next = order;\n\n\t\torder.next = null;\n\t\tthis._drawLast = order;\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tvar order = layer._order;\n\n\t\tif (!order) { return; }\n\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\t// Already first\n\t\t\treturn;\n\t\t}\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else if (prev) {\n\t\t\t// Update last entry unless this is the\n\t\t\t// single entry\n\t\t\tthis._drawLast = prev;\n\t\t}\n\n\t\torder.prev = null;\n\n\t\torder.next = this._drawFirst;\n\t\tthis._drawFirst.prev = order;\n\t\tthis._drawFirst = order;\n\n\t\tthis._requestRedraw(layer);\n\t}\n});\n\n// @factory L.canvas(options?: Renderer options)\n// Creates a Canvas renderer with the given options.\nexport function canvas(options) {\n\treturn Browser.canvas ? new Canvas(options) : null;\n}\n","import * as DomUtil from '../../dom/DomUtil';\nimport * as Util from '../../core/Util';\nimport {Renderer} from './Renderer';\n\n/*\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\n\nexport var vmlCreate = (function () {\n\ttry {\n\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\treturn function (name) {\n\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\n\t\t};\n\t} catch (e) {\n\t\t// Do not return fn from catch block so `e` can be garbage collected\n\t\t// See https://github.com/Leaflet/Leaflet/pull/7279\n\t}\n\treturn function (name) {\n\t\treturn document.createElement('<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t};\n})();\n\n\n/*\n * @class SVG\n *\n *\n * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility\n * with old versions of Internet Explorer.\n */\n\n// mixin to redefine some SVG methods to handle VML syntax which is similar but with some differences\nexport var vmlMixin = {\n\n\t_initContainer: function () {\n\t\tthis._container = DomUtil.create('div', 'leaflet-vml-container');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom) { return; }\n\t\tRenderer.prototype._update.call(this);\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tvar container = layer._container = vmlCreate('shape');\n\n\t\tDomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tlayer._path = vmlCreate('path');\n\t\tcontainer.appendChild(layer._path);\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[Util.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tvar container = layer._container;\n\t\tthis._container.appendChild(container);\n\n\t\tif (layer.options.interactive) {\n\t\t\tlayer.addInteractiveTarget(container);\n\t\t}\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar container = layer._container;\n\t\tDomUtil.remove(container);\n\t\tlayer.removeInteractiveTarget(container);\n\t\tdelete this._layers[Util.stamp(layer)];\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar stroke = layer._stroke,\n\t\t    fill = layer._fill,\n\t\t    options = layer.options,\n\t\t    container = layer._container;\n\n\t\tcontainer.stroked = !!options.stroke;\n\t\tcontainer.filled = !!options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = layer._stroke = vmlCreate('stroke');\n\t\t\t}\n\t\t\tcontainer.appendChild(stroke);\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = Util.isArray(options.dashArray) ?\n\t\t\t\t    options.dashArray.join(' ') :\n\t\t\t\t    options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\tstroke.joinstyle = options.lineJoin;\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tlayer._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = layer._fill = vmlCreate('fill');\n\t\t\t}\n\t\t\tcontainer.appendChild(fill);\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tlayer._fill = null;\n\t\t}\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point.round(),\n\t\t    r = Math.round(layer._radius),\n\t\t    r2 = Math.round(layer._radiusY || r);\n\n\t\tthis._setPath(layer, layer._empty() ? 'M0 0' :\n\t\t\t'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.v = path;\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tDomUtil.toFront(layer._container);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tDomUtil.toBack(layer._container);\n\t}\n};\n","import {Renderer} from './Renderer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport Browser from '../../core/Browser';\nimport {stamp} from '../../core/Util';\nimport {svgCreate, pointsToPath} from './SVG.Util';\nexport {pointsToPath};\nimport {vmlMixin, vmlCreate} from './SVG.VML';\n\nexport var create = Browser.vml ? vmlCreate : svgCreate;\n\n/*\n * @class SVG\n * @inherits Renderer\n * @aka L.SVG\n *\n * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](https://caniuse.com/svg), SVG is not\n * available in all web browsers, notably Android 2.x and 3.x.\n *\n * Although SVG is not available on IE7 and IE8, these browsers support\n * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)\n * (a now deprecated technology), and the SVG renderer will fall back to VML in\n * this case.\n *\n * @example\n *\n * Use SVG by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.svg()\n * });\n * ```\n *\n * Use a SVG renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.svg({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nexport var SVG = Renderer.extend({\n\n\t_initContainer: function () {\n\t\tthis._container = create('svg');\n\n\t\t// makes it possible to click through svg root; we'll reset it back in individual paths\n\t\tthis._container.setAttribute('pointer-events', 'none');\n\n\t\tthis._rootGroup = create('g');\n\t\tthis._container.appendChild(this._rootGroup);\n\t},\n\n\t_destroyContainer: function () {\n\t\tDomUtil.remove(this._container);\n\t\tDomEvent.off(this._container);\n\t\tdelete this._container;\n\t\tdelete this._rootGroup;\n\t\tdelete this._svgSize;\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tRenderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    size = b.getSize(),\n\t\t    container = this._container;\n\n\t\t// set size of svg-container if changed\n\t\tif (!this._svgSize || !this._svgSize.equals(size)) {\n\t\t\tthis._svgSize = size;\n\t\t\tcontainer.setAttribute('width', size.x);\n\t\t\tcontainer.setAttribute('height', size.y);\n\t\t}\n\n\t\t// movement: update container viewBox so that we don't have to change coordinates of individual layers\n\t\tDomUtil.setPosition(container, b.min);\n\t\tcontainer.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));\n\n\t\tthis.fire('update');\n\t},\n\n\t// methods below are called by vector layers implementations\n\n\t_initPath: function (layer) {\n\t\tvar path = layer._path = create('path');\n\n\t\t// @namespace Path\n\t\t// @option className: String = null\n\t\t// Custom class name set on an element. Only for SVG renderer.\n\t\tif (layer.options.className) {\n\t\t\tDomUtil.addClass(path, layer.options.className);\n\t\t}\n\n\t\tif (layer.options.interactive) {\n\t\t\tDomUtil.addClass(path, 'leaflet-interactive');\n\t\t}\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tif (!this._rootGroup) { this._initContainer(); }\n\t\tthis._rootGroup.appendChild(layer._path);\n\t\tlayer.addInteractiveTarget(layer._path);\n\t},\n\n\t_removePath: function (layer) {\n\t\tDomUtil.remove(layer._path);\n\t\tlayer.removeInteractiveTarget(layer._path);\n\t\tdelete this._layers[stamp(layer)];\n\t},\n\n\t_updatePath: function (layer) {\n\t\tlayer._project();\n\t\tlayer._update();\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar path = layer._path,\n\t\t    options = layer.options;\n\n\t\tif (!path) { return; }\n\n\t\tif (options.stroke) {\n\t\t\tpath.setAttribute('stroke', options.color);\n\t\t\tpath.setAttribute('stroke-opacity', options.opacity);\n\t\t\tpath.setAttribute('stroke-width', options.weight);\n\t\t\tpath.setAttribute('stroke-linecap', options.lineCap);\n\t\t\tpath.setAttribute('stroke-linejoin', options.lineJoin);\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tpath.setAttribute('stroke-dasharray', options.dashArray);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dasharray');\n\t\t\t}\n\n\t\t\tif (options.dashOffset) {\n\t\t\t\tpath.setAttribute('stroke-dashoffset', options.dashOffset);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dashoffset');\n\t\t\t}\n\t\t} else {\n\t\t\tpath.setAttribute('stroke', 'none');\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tpath.setAttribute('fill', options.fillColor || options.color);\n\t\t\tpath.setAttribute('fill-opacity', options.fillOpacity);\n\t\t\tpath.setAttribute('fill-rule', options.fillRule || 'evenodd');\n\t\t} else {\n\t\t\tpath.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tthis._setPath(layer, pointsToPath(layer._parts, closed));\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point,\n\t\t    r = Math.max(Math.round(layer._radius), 1),\n\t\t    r2 = Math.max(Math.round(layer._radiusY), 1) || r,\n\t\t    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';\n\n\t\t// drawing a circle with two half-arcs\n\t\tvar d = layer._empty() ? 'M0 0' :\n\t\t\t'M' + (p.x - r) + ',' + p.y +\n\t\t\tarc + (r * 2) + ',0 ' +\n\t\t\tarc + (-r * 2) + ',0 ';\n\n\t\tthis._setPath(layer, d);\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.setAttribute('d', path);\n\t},\n\n\t// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements\n\t_bringToFront: function (layer) {\n\t\tDomUtil.toFront(layer._path);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tDomUtil.toBack(layer._path);\n\t}\n});\n\nif (Browser.vml) {\n\tSVG.include(vmlMixin);\n}\n\n// @namespace SVG\n// @factory L.svg(options?: Renderer options)\n// Creates a SVG renderer with the given options.\nexport function svg(options) {\n\treturn Browser.svg || Browser.vml ? new SVG(options) : null;\n}\n","import {Map} from '../../map/Map';\nimport {canvas} from './Canvas';\nimport {svg} from './SVG';\n\nMap.include({\n\t// @namespace Map; @method getRenderer(layer: Path): Renderer\n\t// Returns the instance of `Renderer` that should be used to render the given\n\t// `Path`. It will ensure that the `renderer` options of the map and paths\n\t// are respected, and that the renderers do exist on the map.\n\tgetRenderer: function (layer) {\n\t\t// @namespace Path; @option renderer: Renderer\n\t\t// Use this specific instance of `Renderer` for this path. Takes\n\t\t// precedence over the map's [default renderer](#map-renderer).\n\t\tvar renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;\n\n\t\tif (!renderer) {\n\t\t\trenderer = this._renderer = this._createRenderer();\n\t\t}\n\n\t\tif (!this.hasLayer(renderer)) {\n\t\t\tthis.addLayer(renderer);\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_getPaneRenderer: function (name) {\n\t\tif (name === 'overlayPane' || name === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar renderer = this._paneRenderers[name];\n\t\tif (renderer === undefined) {\n\t\t\trenderer = this._createRenderer({pane: name});\n\t\t\tthis._paneRenderers[name] = renderer;\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_createRenderer: function (options) {\n\t\t// @namespace Map; @option preferCanvas: Boolean = false\n\t\t// Whether `Path`s should be rendered on a `Canvas` renderer.\n\t\t// By default, all `Path`s are rendered in a `SVG` renderer.\n\t\treturn (this.options.preferCanvas && canvas(options)) || svg(options);\n\t}\n});\n","import {Polygon} from './Polygon';\nimport {toLatLngBounds} from '../../geo/LatLngBounds';\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\n/*\n * @class Rectangle\n * @aka L.Rectangle\n * @inherits Polygon\n *\n * A class for drawing rectangle overlays on a map. Extends `Polygon`.\n *\n * @example\n *\n * ```js\n * // define rectangle geographical bounds\n * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];\n *\n * // create an orange rectangle\n * L.rectangle(bounds, {color: \"#ff7800\", weight: 1}).addTo(map);\n *\n * // zoom the map to the rectangle bounds\n * map.fitBounds(bounds);\n * ```\n *\n */\n\n\nexport var Rectangle = Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tPolygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\t// @method setBounds(latLngBounds: LatLngBounds): this\n\t// Redraws the rectangle with the passed bounds.\n\tsetBounds: function (latLngBounds) {\n\t\treturn this.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = toLatLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\n\n// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)\nexport function rectangle(latLngBounds, options) {\n\treturn new Rectangle(latLngBounds, options);\n}\n","export {Renderer} from './Renderer';\nexport {Canvas, canvas} from './Canvas';\nimport {SVG, create, pointsToPath, svg} from './SVG';\nSVG.create = create;\nSVG.pointsToPath = pointsToPath;\nexport {SVG, svg};\nimport './Renderer.getRenderer';\t// This is a bit of a hack, but needed because circular dependencies\n\nexport {Path} from './Path';\nexport {CircleMarker, circleMarker} from './CircleMarker';\nexport {Circle, circle} from './Circle';\nexport {Polyline, polyline} from './Polyline';\nexport {Polygon, polygon} from './Polygon';\nexport {Rectangle, rectangle} from './Rectangle';\n","export {Layer} from './Layer';\nexport {LayerGroup, layerGroup} from './LayerGroup';\nexport {FeatureGroup, featureGroup} from './FeatureGroup';\nimport {GeoJSON, geoJSON, geoJson, geometryToLayer, coordsToLatLng, coordsToLatLngs, latLngToCoords, latLngsToCoords, getFeature, asFeature} from './GeoJSON';\nGeoJSON.geometryToLayer = geometryToLayer;\nGeoJSON.coordsToLatLng = coordsToLatLng;\nGeoJSON.coordsToLatLngs = coordsToLatLngs;\nGeoJSON.latLngToCoords = latLngToCoords;\nGeoJSON.latLngsToCoords = latLngsToCoords;\nGeoJSON.getFeature = getFeature;\nGeoJSON.asFeature = asFeature;\nexport {GeoJSON, geoJSON, geoJson};\n\nexport {ImageOverlay, imageOverlay} from './ImageOverlay';\nexport {VideoOverlay, videoOverlay} from './VideoOverlay';\nexport {SVGOverlay, svgOverlay} from './SVGOverlay';\n\nexport {DivOverlay} from './DivOverlay';\nexport {Popup, popup} from './Popup';\nexport {Tooltip, tooltip} from './Tooltip';\n\nexport * from './marker/index';\nexport * from './tile/index';\nexport * from './vector/index';\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Bounds} from '../../geometry/Bounds';\n\n/*\n * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @option boxZoom: Boolean = true\n\t// Whether the map can be zoomed to a rectangular area specified by\n\t// dragging the mouse while pressing the shift key.\n\tboxZoom: true\n});\n\nexport var BoxZoom = Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._resetStateTimeout = 0;\n\t\tmap.on('unload', this._destroy, this);\n\t},\n\n\taddHooks: function () {\n\t\tDomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_destroy: function () {\n\t\tDomUtil.remove(this._pane);\n\t\tdelete this._pane;\n\t},\n\n\t_resetState: function () {\n\t\tthis._resetStateTimeout = 0;\n\t\tthis._moved = false;\n\t},\n\n\t_clearDeferredResetState: function () {\n\t\tif (this._resetStateTimeout !== 0) {\n\t\t\tclearTimeout(this._resetStateTimeout);\n\t\t\tthis._resetStateTimeout = 0;\n\t\t}\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\t// Clear the deferred resetState if it hasn't executed yet, otherwise it\n\t\t// will interrupt the interaction and orphan a box element in the container.\n\t\tthis._clearDeferredResetState();\n\t\tthis._resetState();\n\n\t\tDomUtil.disableTextSelection();\n\t\tDomUtil.disableImageDrag();\n\n\t\tthis._startPoint = this._map.mouseEventToContainerPoint(e);\n\n\t\tDomEvent.on(document, {\n\t\t\tcontextmenu: DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._moved = true;\n\n\t\t\tthis._box = DomUtil.create('div', 'leaflet-zoom-box', this._container);\n\t\t\tDomUtil.addClass(this._container, 'leaflet-crosshair');\n\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tthis._point = this._map.mouseEventToContainerPoint(e);\n\n\t\tvar bounds = new Bounds(this._point, this._startPoint),\n\t\t    size = bounds.getSize();\n\n\t\tDomUtil.setPosition(this._box, bounds.min);\n\n\t\tthis._box.style.width  = size.x + 'px';\n\t\tthis._box.style.height = size.y + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tDomUtil.remove(this._box);\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-crosshair');\n\t\t}\n\n\t\tDomUtil.enableTextSelection();\n\t\tDomUtil.enableImageDrag();\n\n\t\tDomEvent.off(document, {\n\t\t\tcontextmenu: DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseUp: function (e) {\n\t\tif ((e.which !== 1) && (e.button !== 1)) { return; }\n\n\t\tthis._finish();\n\n\t\tif (!this._moved) { return; }\n\t\t// Postpone to next JS tick so internal click event handling\n\t\t// still see it as \"moved\".\n\t\tthis._clearDeferredResetState();\n\t\tthis._resetStateTimeout = setTimeout(Util.bind(this._resetState, this), 0);\n\n\t\tvar bounds = new LatLngBounds(\n\t\t        this._map.containerPointToLatLng(this._startPoint),\n\t\t        this._map.containerPointToLatLng(this._point));\n\n\t\tthis._map\n\t\t\t.fitBounds(bounds)\n\t\t\t.fire('boxzoomend', {boxZoomBounds: bounds});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t\tthis._clearDeferredResetState();\n\t\t\tthis._resetState();\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property boxZoom: Handler\n// Box (shift-drag with mouse) zoom handler.\nMap.addInitHook('addHandler', 'boxZoom', BoxZoom);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\n\nMap.mergeOptions({\n\t// @option doubleClickZoom: Boolean|String = true\n\t// Whether the map can be zoomed in by double clicking on it and\n\t// zoomed out by double clicking while holding shift. If passed\n\t// `'center'`, double-click zoom will zoom to the center of the\n\t//  view regardless of where the mouse was.\n\tdoubleClickZoom: true\n});\n\nexport var DoubleClickZoom = Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t    oldZoom = map.getZoom(),\n\t\t    delta = map.options.zoomDelta,\n\t\t    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\n// @section Handlers\n//\n// Map properties include interaction handlers that allow you to control\n// interaction behavior in runtime, enabling or disabling certain features such\n// as dragging or touch zoom (see `Handler` methods). For example:\n//\n// ```js\n// map.doubleClickZoom.disable();\n// ```\n//\n// @property doubleClickZoom: Handler\n// Double click zoom handler.\nMap.addInitHook('addHandler', 'doubleClickZoom', DoubleClickZoom);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport {Draggable} from '../../dom/Draggable';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {toLatLngBounds as latLngBounds} from '../../geo/LatLngBounds';\nimport {toBounds} from '../../geometry/Bounds';\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @option dragging: Boolean = true\n\t// Whether the map is draggable with mouse/touch or not.\n\tdragging: true,\n\n\t// @section Panning Inertia Options\n\t// @option inertia: Boolean = *\n\t// If enabled, panning of the map will have an inertia effect where\n\t// the map builds momentum while dragging and continues moving in\n\t// the same direction for some time. Feels especially nice on touch\n\t// devices. Enabled by default.\n\tinertia: true,\n\n\t// @option inertiaDeceleration: Number = 3000\n\t// The rate with which the inertial movement slows down, in pixels/second².\n\tinertiaDeceleration: 3400, // px/s^2\n\n\t// @option inertiaMaxSpeed: Number = Infinity\n\t// Max speed of the inertial movement, in pixels/second.\n\tinertiaMaxSpeed: Infinity, // px/s\n\n\t// @option easeLinearity: Number = 0.2\n\teaseLinearity: 0.2,\n\n\t// TODO refactor, move to CRS\n\t// @option worldCopyJump: Boolean = false\n\t// With this option enabled, the map tracks when you pan to another \"copy\"\n\t// of the world and seamlessly jumps to the original one so that all overlays\n\t// like markers and vector layers are still visible.\n\tworldCopyJump: false,\n\n\t// @option maxBoundsViscosity: Number = 0.0\n\t// If `maxBounds` is set, this option will control how solid the bounds\n\t// are when dragging the map around. The default value of `0.0` allows the\n\t// user to drag outside the bounds at normal speed, higher values will\n\t// slow down map dragging outside bounds, and `1.0` makes the bounds fully\n\t// solid, preventing the user from dragging outside the bounds.\n\tmaxBoundsViscosity: 0.0\n});\n\nexport var Drag = Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\tdragstart: this._onDragStart,\n\t\t\t\tdrag: this._onDrag,\n\t\t\t\tdragend: this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tthis._draggable.on('predrag', this._onPreDragLimit, this);\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDragWrap, this);\n\t\t\t\tmap.on('zoomend', this._onZoomEnd, this);\n\n\t\t\t\tmap.whenReady(this._onZoomEnd, this);\n\t\t\t}\n\t\t}\n\t\tDomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');\n\t\tthis._draggable.enable();\n\t\tthis._positions = [];\n\t\tthis._times = [];\n\t},\n\n\tremoveHooks: function () {\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-grab');\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-touch-drag');\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\tmoving: function () {\n\t\treturn this._draggable && this._draggable._moving;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tmap._stop();\n\t\tif (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {\n\t\t\tvar bounds = latLngBounds(this._map.options.maxBounds);\n\n\t\t\tthis._offsetLimit = toBounds(\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)\n\t\t\t\t\t.add(this._map.getSize()));\n\n\t\t\tthis._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));\n\t\t} else {\n\t\t\tthis._offsetLimit = null;\n\t\t}\n\n\t\tmap\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tthis._prunePositions(time);\n\t\t}\n\n\t\tthis._map\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_prunePositions: function (time) {\n\t\twhile (this._positions.length > 1 && time - this._times[0] > 50) {\n\t\t\tthis._positions.shift();\n\t\t\tthis._times.shift();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tvar pxCenter = this._map.getSize().divideBy(2),\n\t\t    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.getPixelWorldBounds().getSize().x;\n\t},\n\n\t_viscousLimit: function (value, threshold) {\n\t\treturn value - (value - threshold) * this._viscosity;\n\t},\n\n\t_onPreDragLimit: function () {\n\t\tif (!this._viscosity || !this._offsetLimit) { return; }\n\n\t\tvar offset = this._draggable._newPos.subtract(this._draggable._startPos);\n\n\t\tvar limit = this._offsetLimit;\n\t\tif (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }\n\t\tif (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }\n\t\tif (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }\n\t\tif (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }\n\n\t\tthis._draggable._newPos = this._draggable._startPos.add(offset);\n\t},\n\n\t_onPreDragWrap: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t    halfWidth = Math.round(worldWidth / 2),\n\t\t    dx = this._initialWorldOffset,\n\t\t    x = this._draggable._newPos.x,\n\t\t    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._absPos = this._draggable._newPos.clone();\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t    options = map.options,\n\n\t\t    noInertia = !options.inertia || e.noInertia || this._times.length < 2;\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\t\t\tthis._prunePositions(+new Date());\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t    duration = (this._lastTime - this._times[0]) / 1000,\n\t\t\t    ease = options.easeLinearity,\n\n\t\t\t    speedVector = direction.multiplyBy(ease / duration),\n\t\t\t    speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x && !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tUtil.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true,\n\t\t\t\t\t\tanimate: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property dragging: Handler\n// Map dragging handler (by both mouse and touch).\nMap.addInitHook('addHandler', 'dragging', Drag);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport {on, off, stop} from '../../dom/DomEvent';\nimport {toPoint} from '../../geometry/Point';\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\n// @namespace Map\n// @section Keyboard Navigation Options\nMap.mergeOptions({\n\t// @option keyboard: Boolean = true\n\t// Makes the map focusable and allows users to navigate the map with keyboard\n\t// arrows and `+`/`-` keys.\n\tkeyboard: true,\n\n\t// @option keyboardPanDelta: Number = 80\n\t// Amount of pixels to pan when pressing an arrow key.\n\tkeyboardPanDelta: 80\n});\n\nexport var Keyboard = Handler.extend({\n\n\tkeyCodes: {\n\t\tleft:    [37],\n\t\tright:   [39],\n\t\tdown:    [40],\n\t\tup:      [38],\n\t\tzoomIn:  [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 54, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanDelta(map.options.keyboardPanDelta);\n\t\tthis._setZoomDelta(map.options.zoomDelta);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex <= 0) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\ton(container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.on({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\toff(this._map._container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.off({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t    docEl = document.documentElement,\n\t\t    top = body.scrollTop || docEl.scrollTop,\n\t\t    left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanDelta: function (panDelta) {\n\t\tvar keys = this._panKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, panDelta];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * panDelta];\n\t\t}\n\t},\n\n\t_setZoomDelta: function (zoomDelta) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoomDelta;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoomDelta;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\ton(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\toff(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.altKey || e.ctrlKey || e.metaKey) { return; }\n\n\t\tvar key = e.keyCode,\n\t\t    map = this._map,\n\t\t    offset;\n\n\t\tif (key in this._panKeys) {\n\t\t\tif (!map._panAnim || !map._panAnim._inProgress) {\n\t\t\t\toffset = this._panKeys[key];\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\toffset = toPoint(offset).multiplyBy(3);\n\t\t\t\t}\n\n\t\t\t\tif (map.options.maxBounds) {\n\t\t\t\t\toffset = map._limitOffset(toPoint(offset), map.options.maxBounds);\n\t\t\t\t}\n\n\t\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\t\tvar newLatLng = map.wrapLatLng(map.unproject(map.project(map.getCenter()).add(offset)));\n\t\t\t\t\tmap.panTo(newLatLng);\n\t\t\t\t} else {\n\t\t\t\t\tmap.panBy(offset);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);\n\n\t\t} else if (key === 27 && map._popup && map._popup.options.closeOnEscapeKey) {\n\t\t\tmap.closePopup();\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tstop(e);\n\t}\n});\n\n// @section Handlers\n// @section Handlers\n// @property keyboard: Handler\n// Keyboard navigation handler.\nMap.addInitHook('addHandler', 'keyboard', Keyboard);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport * as Util from '../../core/Util';\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Mouse wheel options\n\t// @option scrollWheelZoom: Boolean|String = true\n\t// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,\n\t// it will zoom to the center of the view regardless of where the mouse was.\n\tscrollWheelZoom: true,\n\n\t// @option wheelDebounceTime: Number = 40\n\t// Limits the rate at which a wheel can fire (in milliseconds). By default\n\t// user can't zoom via wheel more often than once per 40 ms.\n\twheelDebounceTime: 40,\n\n\t// @option wheelPxPerZoomLevel: Number = 60\n\t// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))\n\t// mean a change of one full zoom level. Smaller values will make wheel-zooming\n\t// faster (and vice versa).\n\twheelPxPerZoomLevel: 60\n});\n\nexport var ScrollWheelZoom = Handler.extend({\n\taddHooks: function () {\n\t\tDomEvent.on(this._map._container, 'wheel', this._onWheelScroll, this);\n\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._map._container, 'wheel', this._onWheelScroll, this);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = DomEvent.getWheelDelta(e);\n\n\t\tvar debounce = this._map.options.wheelDebounceTime;\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(debounce - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(Util.bind(this._performZoom, this), left);\n\n\t\tDomEvent.stop(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t    zoom = map.getZoom(),\n\t\t    snap = this._map.options.zoomSnap || 0;\n\n\t\tmap._stop(); // stop panning and fly animations if any\n\n\t\t// map the delta with a sigmoid function to -4..4 range leaning on -1..1\n\t\tvar d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),\n\t\t    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,\n\t\t    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,\n\t\t    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property scrollWheelZoom: Handler\n// Scroll wheel zoom handler.\nMap.addInitHook('addHandler', 'scrollWheelZoom', ScrollWheelZoom);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport {Point} from '../../geometry/Point';\nimport * as Util from '../../core/Util';\nimport Browser from '../../core/Browser';\n\n/*\n * L.Map.TapHold is used to simulate `contextmenu` event on long hold,\n * which otherwise is not fired by mobile Safari.\n */\n\nvar tapHoldDelay = 600;\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Touch interaction options\n\t// @option tapHold: Boolean\n\t// Enables simulation of `contextmenu` event, default is `true` for mobile Safari.\n\ttapHold: Browser.touchNative && Browser.safari && Browser.mobile,\n\n\t// @option tapTolerance: Number = 15\n\t// The max number of pixels a user can shift his finger during touch\n\t// for it to be considered a valid tap.\n\ttapTolerance: 15\n});\n\nexport var TapHold = Handler.extend({\n\taddHooks: function () {\n\t\tDomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\t\tif (e.touches.length !== 1) { return; }\n\n\t\tvar first = e.touches[0];\n\t\tthis._startPos = this._newPos = new Point(first.clientX, first.clientY);\n\n\t\tthis._holdTimeout = setTimeout(Util.bind(function () {\n\t\t\tthis._cancel();\n\t\t\tif (!this._isTapValid()) { return; }\n\n\t\t\t// prevent simulated mouse events https://w3c.github.io/touch-events/#mouse-events\n\t\t\tDomEvent.on(document, 'touchend', DomEvent.preventDefault);\n\t\t\tDomEvent.on(document, 'touchend touchcancel', this._cancelClickPrevent);\n\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t}, this), tapHoldDelay);\n\n\t\tDomEvent.on(document, 'touchend touchcancel contextmenu', this._cancel, this);\n\t\tDomEvent.on(document, 'touchmove', this._onMove, this);\n\t},\n\n\t_cancelClickPrevent: function cancelClickPrevent() {\n\t\tDomEvent.off(document, 'touchend', DomEvent.preventDefault);\n\t\tDomEvent.off(document, 'touchend touchcancel', cancelClickPrevent);\n\t},\n\n\t_cancel: function () {\n\t\tclearTimeout(this._holdTimeout);\n\t\tDomEvent.off(document, 'touchend touchcancel contextmenu', this._cancel, this);\n\t\tDomEvent.off(document, 'touchmove', this._onMove, this);\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new Point(first.clientX, first.clientY);\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = new MouseEvent(type, {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tview: window,\n\t\t\t// detail: 1,\n\t\t\tscreenX: e.screenX,\n\t\t\tscreenY: e.screenY,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\t// button: 2,\n\t\t\t// buttons: 2\n\t\t});\n\n\t\tsimulatedEvent._simulated = true;\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\n// @section Handlers\n// @property tapHold: Handler\n// Long tap handler to simulate `contextmenu` event (useful in mobile Safari).\nMap.addInitHook('addHandler', 'tapHold', TapHold);\n","import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport Browser from '../../core/Browser';\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Touch interaction options\n\t// @option touchZoom: Boolean|String = *\n\t// Whether the map can be zoomed by touch-dragging with two fingers. If\n\t// passed `'center'`, it will zoom to the center of the view regardless of\n\t// where the touch events (fingers) were. Enabled for touch-capable web\n\t// browsers.\n\ttouchZoom: Browser.touch,\n\n\t// @option bounceAtZoomLimits: Boolean = true\n\t// Set it to false if you don't want the map to zoom beyond min/max zoom\n\t// and then bounce back when pinch-zooming.\n\tbounceAtZoomLimits: true\n});\n\nexport var TouchZoom = Handler.extend({\n\taddHooks: function () {\n\t\tDomUtil.addClass(this._map._container, 'leaflet-touch-zoom');\n\t\tDomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');\n\t\tDomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]);\n\n\t\tthis._centerPoint = map.getSize()._divideBy(2);\n\t\tthis._startLatLng = map.containerPointToLatLng(this._centerPoint);\n\t\tif (map.options.touchZoom !== 'center') {\n\t\t\tthis._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));\n\t\t}\n\n\t\tthis._startDist = p1.distanceTo(p2);\n\t\tthis._startZoom = map.getZoom();\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tmap._stop();\n\n\t\tDomEvent.on(document, 'touchmove', this._onTouchMove, this);\n\t\tDomEvent.on(document, 'touchend touchcancel', this._onTouchEnd, this);\n\n\t\tDomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar map = this._map,\n\t\t    p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]),\n\t\t    scale = p1.distanceTo(p2) / this._startDist;\n\n\t\tthis._zoom = map.getScaleZoom(scale, this._startZoom);\n\n\t\tif (!map.options.bounceAtZoomLimits && (\n\t\t\t(this._zoom < map.getMinZoom() && scale < 1) ||\n\t\t\t(this._zoom > map.getMaxZoom() && scale > 1))) {\n\t\t\tthis._zoom = map._limitZoom(this._zoom);\n\t\t}\n\n\t\tif (map.options.touchZoom === 'center') {\n\t\t\tthis._center = this._startLatLng;\n\t\t\tif (scale === 1) { return; }\n\t\t} else {\n\t\t\t// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng\n\t\t\tvar delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);\n\t\t\tif (scale === 1 && delta.x === 0 && delta.y === 0) { return; }\n\t\t\tthis._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tmap._moveStart(true, false);\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tUtil.cancelAnimFrame(this._animRequest);\n\n\t\tvar moveFn = Util.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}, undefined);\n\t\tthis._animRequest = Util.requestAnimFrame(moveFn, this, true);\n\n\t\tDomEvent.preventDefault(e);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._zooming = false;\n\t\tUtil.cancelAnimFrame(this._animRequest);\n\n\t\tDomEvent.off(document, 'touchmove', this._onTouchMove, this);\n\t\tDomEvent.off(document, 'touchend touchcancel', this._onTouchEnd, this);\n\n\t\t// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);\n\t\t} else {\n\t\t\tthis._map._resetView(this._center, this._map._limitZoom(this._zoom));\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property touchZoom: Handler\n// Touch zoom handler.\nMap.addInitHook('addHandler', 'touchZoom', TouchZoom);\n","import {Map} from './Map';\nimport {BoxZoom} from './handler/Map.BoxZoom';\nMap.BoxZoom = BoxZoom;\nimport {DoubleClickZoom} from './handler/Map.DoubleClickZoom';\nMap.DoubleClickZoom = DoubleClickZoom;\nimport {Drag} from './handler/Map.Drag';\nMap.Drag = Drag;\nimport {Keyboard} from './handler/Map.Keyboard';\nMap.Keyboard = Keyboard;\nimport {ScrollWheelZoom} from './handler/Map.ScrollWheelZoom';\nMap.ScrollWheelZoom = ScrollWheelZoom;\nimport {TapHold} from './handler/Map.TapHold';\nMap.TapHold = TapHold;\nimport {TouchZoom} from './handler/Map.TouchZoom';\nMap.TouchZoom = TouchZoom;\n\nexport {Map, createMap as map} from './Map';\n","import {css} from 'lit-element';\n\nexport const displayFlex = css`\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n`;\n\nexport const borderBox = css`\n  box-sizing: border-box;\n`;\n\nexport const displayInlineFlex = css`\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n`;\n\nexport const horizontal = css`\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n`;\n\nexport const vertical = css`\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n`;\n\nexport const wrap = css`\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n`;\n\nexport const noWrap = css`\n  -ms-flex-wrap: nowrap;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n`;\n\nexport const flexFactor = css`\n  -ms-flex: 1 1 0.000000001px;\n  -webkit-flex: 1;\n  flex: 1;\n  -webkit-flex-basis: 0.000000001px;\n  flex-basis: 0.000000001px;\n`;\n\nexport const flexFactorAuto = css`\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n`;\n\nexport const flexFactorNone = css`\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n`;\n\nexport const displayNone = css`\n  display: none !important;\n`;\n\nexport const flex2 = css`\n  -ms-flex: 2;\n  -webkit-flex: 2;\n  flex: 2;\n`;\n\nexport const flex3 = css`\n  -ms-flex: 3;\n  -webkit-flex: 3;\n  flex: 3;\n`;\n\nexport const flex4 = css`\n  -ms-flex: 4;\n  -webkit-flex: 4;\n  flex: 4;\n`;\n\nexport const flex5 = css`\n  -ms-flex: 5;\n  -webkit-flex: 5;\n  flex: 5;\n`;\n\nexport const flex6 = css`\n  -ms-flex: 6;\n  -webkit-flex: 6;\n  flex: 6;\n`;\n\nexport const flex7 = css`\n  -ms-flex: 7;\n  -webkit-flex: 7;\n  flex: 7;\n`;\n\nexport const flex8 = css`\n  -ms-flex: 8;\n  -webkit-flex: 8;\n  flex: 8;\n`;\n\nexport const flex9 = css`\n  -ms-flex: 9;\n  -webkit-flex: 9;\n  flex: 9;\n`;\n\nexport const flex10 = css`\n  -ms-flex: 10;\n  -webkit-flex: 10;\n  flex: 10;\n`;\n\nexport const flex11 = css`\n  -ms-flex: 11;\n  -webkit-flex: 11;\n  flex: 11;\n`;\n\nexport const flex12 = css`\n  -ms-flex: 12;\n  -webkit-flex: 12;\n  flex: 12;\n`;\n\nexport const horizontalReverse = css`\n  -ms-flex-direction: row-reverse;\n  -webkit-flex-direction: row-reverse;\n  flex-direction: row-reverse;\n`;\n\nexport const verticalReverse = css`\n  -ms-flex-direction: column-reverse;\n  -webkit-flex-direction: column-reverse;\n  flex-direction: column-reverse;\n`;\n\nexport const wrapReverse = css`\n  -ms-flex-wrap: wrap-reverse;\n  -webkit-flex-wrap: wrap-reverse;\n  flex-wrap: wrap-reverse;\n`;\n\nexport const displayBlock = css`\n  display: block;\n`;\n\nexport const invisible = css`\n  visibility: hidden !important;\n`;\n\nexport const relative = css`\n  position: relative;\n`;\n\nexport const fit = css`\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n`;\n\nexport const scroll = css`\n  -webkit-overflow-scrolling: touch;\n  overflow: auto;\n`;\n\nexport const fixed = css`\n  position: fixed;\n`;\n\nexport const fixedTop = css`\n  top: 0;\n  left: 0;\n  right: 0;\n`;\n\nexport const fixedRight = css`\n  top: 0;\n  right: 0;\n  bottom: 0;\n`;\n\nexport const fixedLeft = css`\n  top: 0;\n  bottom: 0;\n  left: 0;\n`;\n\nexport const fixedBottom = css`\n  right: 0;\n  bottom: 0;\n  left: 0;\n`;\n\nexport const startAligned = css`\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n`;\n\nexport const centerAligned = css`\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n`;\n\nexport const endAligned = css`\n  -ms-flex-align: end;\n  -webkit-align-items: flex-end;\n  align-items: flex-end;\n`;\n\nexport const baseline = css`\n  -ms-flex-align: baseline;\n  -webkit-align-items: baseline;\n  align-items: baseline;\n`;\n\nexport const startJustified = css`\n  -ms-flex-pack: start;\n  -webkit-justify-content: flex-start;\n  justify-content: flex-start;\n`;\n\nexport const centerJustified = css`\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n`;\n\nexport const endJustified = css`\n  -ms-flex-pack: end;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n`;\n\nexport const aroundJustified = css`\n  -ms-flex-pack: distribute;\n  -webkit-justify-content: space-around;\n  justify-content: space-around;\n`;\n\nexport const justified = css`\n  -ms-flex-pack: justify;\n  -webkit-justify-content: space-between;\n  justify-content: space-between;\n`;\n\nexport const selfStart = css`\n  -ms-align-self: flex-start;\n  -webkit-align-self: flex-start;\n  align-self: flex-start;\n`;\n\nexport const selfCenter = css`\n  -ms-align-self: center;\n  -webkit-align-self: center;\n  align-self: center;\n`;\n\nexport const selfEnd = css`\n  -ms-align-self: flex-end;\n  -webkit-align-self: flex-end;\n  align-self: flex-end;\n`;\n\nexport const selfStretch = css`\n  -ms-align-self: stretch;\n  -webkit-align-self: stretch;\n  align-self: stretch;\n`;\n\nexport const selfBaseline = css`\n  -ms-align-self: baseline;\n  -webkit-align-self: baseline;\n  align-self: baseline;\n`;\n\nexport const startAlignedContent = css`\n  -ms-flex-line-pack: start; /* IE10 */\n  -ms-align-content: flex-start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n`;\n\nexport const endAlignedContent = css`\n  -ms-flex-line-pack: end; /* IE10 */\n  -ms-align-content: flex-end;\n  -webkit-align-content: flex-end;\n  align-content: flex-end;\n`;\n\nexport const centerAlignedContent = css`\n  -ms-flex-line-pack: center; /* IE10 */\n  -ms-align-content: center;\n  -webkit-align-content: center;\n  align-content: center;\n`;\n\nexport const beteweenAlignedContent = css`\n  -ms-flex-line-pack: justify; /* IE10 */\n  -ms-align-content: space-between;\n  -webkit-align-content: space-between;\n  align-content: space-between;\n`;\n\nexport const aroundAlignedContent = css`\n  -ms-flex-line-pack: distribute; /* IE10 */\n  -ms-align-content: space-around;\n  -webkit-align-content: space-around;\n  align-content: space-around;\n`;\n","import {css} from 'lit-element';\n\nimport {\n  displayFlex,\n  displayInlineFlex,\n  horizontal,\n  vertical,\n  wrap,\n  noWrap,\n  flexFactor,\n  flexFactorAuto,\n  flexFactorNone,\n  displayNone,\n  flex2,\n  flex3,\n  flex4,\n  flex5,\n  flex6,\n  flex7,\n  flex8,\n  flex9,\n  flex10,\n  flex11,\n  flex12,\n  horizontalReverse,\n  verticalReverse,\n  wrapReverse,\n  displayBlock,\n  invisible,\n  relative,\n  fit,\n  scroll,\n  fixed,\n  fixedBottom,\n  fixedLeft,\n  fixedRight,\n  fixedTop,\n  startAligned,\n  centerAligned,\n  endAligned,\n  baseline,\n  startJustified,\n  centerJustified,\n  aroundJustified,\n  endJustified,\n  justified,\n  selfStart,\n  selfBaseline,\n  selfCenter,\n  selfEnd,\n  selfStretch,\n  startAlignedContent,\n  centerAlignedContent,\n  aroundAlignedContent,\n  beteweenAlignedContent,\n  endAlignedContent,\n} from '../Literals';\n\nexport const Layouts = css`\n  .layout.horizontal,\n  .layout.vertical {\n    ${displayFlex}\n  }\n  .layout.inline {\n    ${displayInlineFlex}\n  }\n  .layout.horizontal {\n    ${horizontal}\n  }\n  .layout.vertical {\n    ${vertical}\n  }\n  .layout.wrap {\n    ${wrap}\n  }\n  .layout.no-wrap {\n    ${noWrap}\n  }\n  .layout.center,\n  .layout.center-center {\n    ${centerAligned}\n  }\n  .layout.center-justified,\n  .layout.center-center {\n    ${centerJustified}\n  }\n  .flex {\n    ${flexFactor}\n  }\n  .flex-auto {\n    ${flexFactorAuto}\n  }\n  .flex-none {\n    ${flexFactorNone}\n  }\n  .none {\n    ${displayNone}\n  }\n`;\n\nexport const Factors = css`\n  .flex,\n  .flex-1 {\n    ${flexFactorAuto}\n  }\n\n  .flex-2 {\n    ${flex2}\n  }\n\n  .flex-3 {\n    ${flex3}\n  }\n\n  .flex-4 {\n    ${flex4}\n  }\n\n  .flex-5 {\n    ${flex5}\n  }\n\n  .flex-6 {\n    ${flex6}\n  }\n\n  .flex-7 {\n    ${flex7}\n  }\n\n  .flex-8 {\n    ${flex8}\n  }\n\n  .flex-9 {\n    ${flex9}\n  }\n\n  .flex-10 {\n    ${flex10}\n  }\n\n  .flex-11 {\n    ${flex11}\n  }\n\n  .flex-12 {\n    ${flex12}\n  }\n`;\n\nexport const ReverseLayouts = css`\n  .layout.horizontal-reverse,\n  .layout.vertical-reverse {\n    ${displayFlex}\n  }\n\n  .layout.horizontal-reverse {\n    ${horizontalReverse}\n  }\n\n  .layout.vertical-reverse {\n    ${verticalReverse}\n  }\n\n  .layout.wrap-reverse {\n    ${wrapReverse}\n  }\n`;\n\nexport const Positioning = css`\n  .block {\n    ${displayBlock}\n  }\n\n  [hidden] {\n    ${displayNone}\n  }\n\n  .invisible {\n    ${invisible}\n  }\n\n  .relative {\n    ${relative}\n  }\n\n  .fit {\n    ${fit}\n  }\n\n  body.fullbleed {\n    margin: 0;\n    height: 100vh;\n  }\n\n  .scroll {\n    ${scroll}\n  }\n\n  /* fixed position */\n  .fixed-bottom,\n  .fixed-left,\n  .fixed-right,\n  .fixed-top {\n    ${fixed}\n  }\n\n  .fixed-top {\n    ${fixedTop}\n  }\n\n  .fixed-right {\n    ${fixedRight}\n  }\n\n  .fixed-bottom {\n    ${fixedBottom}\n  }\n\n  .fixed-left {\n    ${fixedLeft}\n  }\n`;\n\nexport const Alignment = css`\n  .layout.start {\n    ${startAligned}\n  }\n\n  .layout.center,\n  .layout.center-center {\n    ${centerAligned}\n  }\n\n  .layout.end {\n    ${endAligned}\n  }\n\n  .layout.baseline {\n    ${baseline}\n  }\n\n  .layout.start-justified {\n    ${startJustified}\n  }\n\n  .layout.center-justified,\n  .layout.center-center {\n    ${centerJustified}\n  }\n\n  .layout.end-justified {\n    ${endJustified}\n  }\n\n  .layout.around-justified {\n    ${aroundJustified}\n  }\n\n  .layout.justified {\n    ${justified}\n  }\n\n  .self-start {\n   ${selfStart}\n\n  .self-center {\n   ${selfCenter}\n  }\n\n  .self-end {\n    ${selfEnd}\n  }\n\n  .self-stretch {\n   ${selfStretch}\n  }\n\n  .self-baseline {\n   ${selfBaseline}\n  }\n\n  .layout.start-aligned {\n   ${startAlignedContent}\n  }\n\n  .layout.end-aligned {\n    ${endAlignedContent}\n  }\n\n  .layout.center-aligned {\n   ${centerAlignedContent}\n  }\n\n  .layout.between-aligned {\n    ${beteweenAlignedContent}\n  }\n\n  .layout.around-aligned {\n    ${aroundAlignedContent}\n  }\n`;\n","//! moment.js locale configuration\n//! locale : Afrikaans [af]\n//! author : Werner Mollentze : https://github.com/wernerm\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var af = moment.defineLocale('af', {\n        months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n        weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(\n            '_'\n        ),\n        weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n        weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n        meridiemParse: /vm|nm/i,\n        isPM: function (input) {\n            return /^nm$/i.test(input);\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'vm' : 'VM';\n            } else {\n                return isLower ? 'nm' : 'NM';\n            }\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Vandag om] LT',\n            nextDay: '[Môre om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[Gister om] LT',\n            lastWeek: '[Laas] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'oor %s',\n            past: '%s gelede',\n            s: \"'n paar sekondes\",\n            ss: '%d sekondes',\n            m: \"'n minuut\",\n            mm: '%d minute',\n            h: \"'n uur\",\n            hh: '%d ure',\n            d: \"'n dag\",\n            dd: '%d dae',\n            M: \"'n maand\",\n            MM: '%d maande',\n            y: \"'n jaar\",\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            ); // Thanks to Joris Röling : https://github.com/jjupiter\n        },\n        week: {\n            dow: 1, // Maandag is die eerste dag van die week.\n            doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n        },\n    });\n\n    return af;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Algeria) [ar-dz]\n//! author : Amine Roukh: https://github.com/Amine27\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'جانفي',\n            'فيفري',\n            'مارس',\n            'أفريل',\n            'ماي',\n            'جوان',\n            'جويلية',\n            'أوت',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var arDz = moment.defineLocale('ar-dz', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arDz;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Kuwait) [ar-kw]\n//! author : Nusret Parlak: https://github.com/nusretparlak\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arKw = moment.defineLocale('ar-kw', {\n        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return arKw;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Libya) [ar-ly]\n//! author : Ali Hmer: https://github.com/kikoanis\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '1',\n            2: '2',\n            3: '3',\n            4: '4',\n            5: '5',\n            6: '6',\n            7: '7',\n            8: '8',\n            9: '9',\n            0: '0',\n        },\n        pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'يناير',\n            'فبراير',\n            'مارس',\n            'أبريل',\n            'مايو',\n            'يونيو',\n            'يوليو',\n            'أغسطس',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var arLy = moment.defineLocale('ar-ly', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return arLy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Morocco) [ar-ma]\n//! author : ElFadili Yassine : https://github.com/ElFadiliY\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arMa = moment.defineLocale('ar-ma', {\n        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arMa;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Palestine) [ar-ps]\n//! author : Majd Al-Shihabi : https://github.com/majdal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        };\n\n    var arPs = moment.defineLocale('ar-ps', {\n        months: 'كانون الثاني_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_تشري الأوّل_تشرين الثاني_كانون الأوّل'.split(\n            '_'\n        ),\n        monthsShort:\n            'ك٢_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_ت١_ت٢_ك١'.split('_'),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .split('') // reversed since negative lookbehind not supported everywhere\n                .reverse()\n                .join('')\n                .replace(/[١٢](?![\\u062a\\u0643])/g, function (match) {\n                    return numberMap[match];\n                })\n                .split('')\n                .reverse()\n                .join('')\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return arPs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Saudi Arabia) [ar-sa]\n//! author : Suhail Alkowaileet : https://github.com/xsoh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        };\n\n    var arSa = moment.defineLocale('ar-sa', {\n        months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return arSa;\n\n})));\n","//! moment.js locale configuration\n//! locale  :  Arabic (Tunisia) [ar-tn]\n//! author : Nader Toukabri : https://github.com/naderio\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arTn = moment.defineLocale('ar-tn', {\n        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arTn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic [ar]\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        },\n        pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'يناير',\n            'فبراير',\n            'مارس',\n            'أبريل',\n            'مايو',\n            'يونيو',\n            'يوليو',\n            'أغسطس',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var ar = moment.defineLocale('ar', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return ar;\n\n})));\n","//! moment.js locale configuration\n//! locale : Azerbaijani [az]\n//! author : topchiyev : https://github.com/topchiyev\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: '-inci',\n        5: '-inci',\n        8: '-inci',\n        70: '-inci',\n        80: '-inci',\n        2: '-nci',\n        7: '-nci',\n        20: '-nci',\n        50: '-nci',\n        3: '-üncü',\n        4: '-üncü',\n        100: '-üncü',\n        6: '-ncı',\n        9: '-uncu',\n        10: '-uncu',\n        30: '-uncu',\n        60: '-ıncı',\n        90: '-ıncı',\n    };\n\n    var az = moment.defineLocale('az', {\n        months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),\n        weekdays:\n            'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(\n                '_'\n            ),\n        weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),\n        weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün saat] LT',\n            nextDay: '[sabah saat] LT',\n            nextWeek: '[gələn həftə] dddd [saat] LT',\n            lastDay: '[dünən] LT',\n            lastWeek: '[keçən həftə] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s sonra',\n            past: '%s əvvəl',\n            s: 'bir neçə saniyə',\n            ss: '%d saniyə',\n            m: 'bir dəqiqə',\n            mm: '%d dəqiqə',\n            h: 'bir saat',\n            hh: '%d saat',\n            d: 'bir gün',\n            dd: '%d gün',\n            M: 'bir ay',\n            MM: '%d ay',\n            y: 'bir il',\n            yy: '%d il',\n        },\n        meridiemParse: /gecə|səhər|gündüz|axşam/,\n        isPM: function (input) {\n            return /^(gündüz|axşam)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'gecə';\n            } else if (hour < 12) {\n                return 'səhər';\n            } else if (hour < 17) {\n                return 'gündüz';\n            } else {\n                return 'axşam';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,\n        ordinal: function (number) {\n            if (number === 0) {\n                // special case for zero\n                return number + '-ıncı';\n            }\n            var a = number % 10,\n                b = (number % 100) - a,\n                c = number >= 100 ? 100 : null;\n            return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return az;\n\n})));\n","//! moment.js locale configuration\n//! locale : Belarusian [be]\n//! author : Dmitry Demidov : https://github.com/demidov91\n//! author: Praleska: http://praleska.pro/\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n            mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n            hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n            dd: 'дзень_дні_дзён',\n            MM: 'месяц_месяцы_месяцаў',\n            yy: 'год_гады_гадоў',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'хвіліна' : 'хвіліну';\n        } else if (key === 'h') {\n            return withoutSuffix ? 'гадзіна' : 'гадзіну';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n\n    var be = moment.defineLocale('be', {\n        months: {\n            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(\n                '_'\n            ),\n            standalone:\n                'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n        weekdays: {\n            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(\n                '_'\n            ),\n            standalone:\n                'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(\n                    '_'\n                ),\n            isFormat: /\\[ ?[Ууў] ?(?:мінулую|наступную)? ?\\] ?dddd/,\n        },\n        weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n        weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY г.',\n            LLL: 'D MMMM YYYY г., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY г., HH:mm',\n        },\n        calendar: {\n            sameDay: '[Сёння ў] LT',\n            nextDay: '[Заўтра ў] LT',\n            lastDay: '[Учора ў] LT',\n            nextWeek: function () {\n                return '[У] dddd [ў] LT';\n            },\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[У мінулую] dddd [ў] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[У мінулы] dddd [ў] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'праз %s',\n            past: '%s таму',\n            s: 'некалькі секунд',\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: relativeTimeWithPlural,\n            hh: relativeTimeWithPlural,\n            d: 'дзень',\n            dd: relativeTimeWithPlural,\n            M: 'месяц',\n            MM: relativeTimeWithPlural,\n            y: 'год',\n            yy: relativeTimeWithPlural,\n        },\n        meridiemParse: /ночы|раніцы|дня|вечара/,\n        isPM: function (input) {\n            return /^(дня|вечара)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночы';\n            } else if (hour < 12) {\n                return 'раніцы';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечара';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                case 'w':\n                case 'W':\n                    return (number % 10 === 2 || number % 10 === 3) &&\n                        number % 100 !== 12 &&\n                        number % 100 !== 13\n                        ? number + '-і'\n                        : number + '-ы';\n                case 'D':\n                    return number + '-га';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return be;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bulgarian [bg]\n//! author : Krasen Borisov : https://github.com/kraz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var bg = moment.defineLocale('bg', {\n        months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(\n            '_'\n        ),\n        monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n        weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(\n            '_'\n        ),\n        weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Днес в] LT',\n            nextDay: '[Утре в] LT',\n            nextWeek: 'dddd [в] LT',\n            lastDay: '[Вчера в] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 6:\n                        return '[Миналата] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[Миналия] dddd [в] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'след %s',\n            past: 'преди %s',\n            s: 'няколко секунди',\n            ss: '%d секунди',\n            m: 'минута',\n            mm: '%d минути',\n            h: 'час',\n            hh: '%d часа',\n            d: 'ден',\n            dd: '%d дена',\n            w: 'седмица',\n            ww: '%d седмици',\n            M: 'месец',\n            MM: '%d месеца',\n            y: 'година',\n            yy: '%d години',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n        ordinal: function (number) {\n            var lastDigit = number % 10,\n                last2Digits = number % 100;\n            if (number === 0) {\n                return number + '-ев';\n            } else if (last2Digits === 0) {\n                return number + '-ен';\n            } else if (last2Digits > 10 && last2Digits < 20) {\n                return number + '-ти';\n            } else if (lastDigit === 1) {\n                return number + '-ви';\n            } else if (lastDigit === 2) {\n                return number + '-ри';\n            } else if (lastDigit === 7 || lastDigit === 8) {\n                return number + '-ми';\n            } else {\n                return number + '-ти';\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return bg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bambara [bm]\n//! author : Estelle Comment : https://github.com/estellecomment\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var bm = moment.defineLocale('bm', {\n        months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(\n            '_'\n        ),\n        monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n        weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n        weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n        weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'MMMM [tile] D [san] YYYY',\n            LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n            LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Bi lɛrɛ] LT',\n            nextDay: '[Sini lɛrɛ] LT',\n            nextWeek: 'dddd [don lɛrɛ] LT',\n            lastDay: '[Kunu lɛrɛ] LT',\n            lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s kɔnɔ',\n            past: 'a bɛ %s bɔ',\n            s: 'sanga dama dama',\n            ss: 'sekondi %d',\n            m: 'miniti kelen',\n            mm: 'miniti %d',\n            h: 'lɛrɛ kelen',\n            hh: 'lɛrɛ %d',\n            d: 'tile kelen',\n            dd: 'tile %d',\n            M: 'kalo kelen',\n            MM: 'kalo %d',\n            y: 'san kelen',\n            yy: 'san %d',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return bm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bengali (Bangladesh) [bn-bd]\n//! author : Asraf Hossain Patoary : https://github.com/ashwoolford\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '১',\n            2: '২',\n            3: '৩',\n            4: '৪',\n            5: '৫',\n            6: '৬',\n            7: '৭',\n            8: '৮',\n            9: '৯',\n            0: '০',\n        },\n        numberMap = {\n            '১': '1',\n            '২': '2',\n            '৩': '3',\n            '৪': '4',\n            '৫': '5',\n            '৬': '6',\n            '৭': '7',\n            '৮': '8',\n            '৯': '9',\n            '০': '0',\n        };\n\n    var bnBd = moment.defineLocale('bn-bd', {\n        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n            '_'\n        ),\n        monthsShort:\n            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n                '_'\n            ),\n        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n            '_'\n        ),\n        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm সময়',\n            LTS: 'A h:mm:ss সময়',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm সময়',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n        },\n        calendar: {\n            sameDay: '[আজ] LT',\n            nextDay: '[আগামীকাল] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[গতকাল] LT',\n            lastWeek: '[গত] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s পরে',\n            past: '%s আগে',\n            s: 'কয়েক সেকেন্ড',\n            ss: '%d সেকেন্ড',\n            m: 'এক মিনিট',\n            mm: '%d মিনিট',\n            h: 'এক ঘন্টা',\n            hh: '%d ঘন্টা',\n            d: 'এক দিন',\n            dd: '%d দিন',\n            M: 'এক মাস',\n            MM: '%d মাস',\n            y: 'এক বছর',\n            yy: '%d বছর',\n        },\n        preparse: function (string) {\n            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n\n        meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'রাত') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ভোর') {\n                return hour;\n            } else if (meridiem === 'সকাল') {\n                return hour;\n            } else if (meridiem === 'দুপুর') {\n                return hour >= 3 ? hour : hour + 12;\n            } else if (meridiem === 'বিকাল') {\n                return hour + 12;\n            } else if (meridiem === 'সন্ধ্যা') {\n                return hour + 12;\n            }\n        },\n\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'রাত';\n            } else if (hour < 6) {\n                return 'ভোর';\n            } else if (hour < 12) {\n                return 'সকাল';\n            } else if (hour < 15) {\n                return 'দুপুর';\n            } else if (hour < 18) {\n                return 'বিকাল';\n            } else if (hour < 20) {\n                return 'সন্ধ্যা';\n            } else {\n                return 'রাত';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bnBd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bengali [bn]\n//! author : Kaushik Gandhi : https://github.com/kaushikgandhi\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '১',\n            2: '২',\n            3: '৩',\n            4: '৪',\n            5: '৫',\n            6: '৬',\n            7: '৭',\n            8: '৮',\n            9: '৯',\n            0: '০',\n        },\n        numberMap = {\n            '১': '1',\n            '২': '2',\n            '৩': '3',\n            '৪': '4',\n            '৫': '5',\n            '৬': '6',\n            '৭': '7',\n            '৮': '8',\n            '৯': '9',\n            '০': '0',\n        };\n\n    var bn = moment.defineLocale('bn', {\n        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n            '_'\n        ),\n        monthsShort:\n            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n                '_'\n            ),\n        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n            '_'\n        ),\n        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm সময়',\n            LTS: 'A h:mm:ss সময়',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm সময়',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n        },\n        calendar: {\n            sameDay: '[আজ] LT',\n            nextDay: '[আগামীকাল] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[গতকাল] LT',\n            lastWeek: '[গত] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s পরে',\n            past: '%s আগে',\n            s: 'কয়েক সেকেন্ড',\n            ss: '%d সেকেন্ড',\n            m: 'এক মিনিট',\n            mm: '%d মিনিট',\n            h: 'এক ঘন্টা',\n            hh: '%d ঘন্টা',\n            d: 'এক দিন',\n            dd: '%d দিন',\n            M: 'এক মাস',\n            MM: '%d মাস',\n            y: 'এক বছর',\n            yy: '%d বছর',\n        },\n        preparse: function (string) {\n            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'রাত' && hour >= 4) ||\n                (meridiem === 'দুপুর' && hour < 5) ||\n                meridiem === 'বিকাল'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'রাত';\n            } else if (hour < 10) {\n                return 'সকাল';\n            } else if (hour < 17) {\n                return 'দুপুর';\n            } else if (hour < 20) {\n                return 'বিকাল';\n            } else {\n                return 'রাত';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tibetan [bo]\n//! author : Thupten N. Chakrishar : https://github.com/vajradog\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '༡',\n            2: '༢',\n            3: '༣',\n            4: '༤',\n            5: '༥',\n            6: '༦',\n            7: '༧',\n            8: '༨',\n            9: '༩',\n            0: '༠',\n        },\n        numberMap = {\n            '༡': '1',\n            '༢': '2',\n            '༣': '3',\n            '༤': '4',\n            '༥': '5',\n            '༦': '6',\n            '༧': '7',\n            '༨': '8',\n            '༩': '9',\n            '༠': '0',\n        };\n\n    var bo = moment.defineLocale('bo', {\n        months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(\n                '_'\n            ),\n        monthsShortRegex: /^(ཟླ་\\d{1,2})/,\n        monthsParseExact: true,\n        weekdays:\n            'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(\n                '_'\n            ),\n        weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(\n            '_'\n        ),\n        weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[དི་རིང] LT',\n            nextDay: '[སང་ཉིན] LT',\n            nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',\n            lastDay: '[ཁ་སང] LT',\n            lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ལ་',\n            past: '%s སྔན་ལ',\n            s: 'ལམ་སང',\n            ss: '%d སྐར་ཆ།',\n            m: 'སྐར་མ་གཅིག',\n            mm: '%d སྐར་མ',\n            h: 'ཆུ་ཚོད་གཅིག',\n            hh: '%d ཆུ་ཚོད',\n            d: 'ཉིན་གཅིག',\n            dd: '%d ཉིན་',\n            M: 'ཟླ་བ་གཅིག',\n            MM: '%d ཟླ་བ',\n            y: 'ལོ་གཅིག',\n            yy: '%d ལོ',\n        },\n        preparse: function (string) {\n            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'མཚན་མོ' && hour >= 4) ||\n                (meridiem === 'ཉིན་གུང' && hour < 5) ||\n                meridiem === 'དགོང་དག'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'མཚན་མོ';\n            } else if (hour < 10) {\n                return 'ཞོགས་ཀས';\n            } else if (hour < 17) {\n                return 'ཉིན་གུང';\n            } else if (hour < 20) {\n                return 'དགོང་དག';\n            } else {\n                return 'མཚན་མོ';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Breton [br]\n//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function relativeTimeWithMutation(number, withoutSuffix, key) {\n        var format = {\n            mm: 'munutenn',\n            MM: 'miz',\n            dd: 'devezh',\n        };\n        return number + ' ' + mutation(format[key], number);\n    }\n    function specialMutationForYears(number) {\n        switch (lastNumber(number)) {\n            case 1:\n            case 3:\n            case 4:\n            case 5:\n            case 9:\n                return number + ' bloaz';\n            default:\n                return number + ' vloaz';\n        }\n    }\n    function lastNumber(number) {\n        if (number > 9) {\n            return lastNumber(number % 10);\n        }\n        return number;\n    }\n    function mutation(text, number) {\n        if (number === 2) {\n            return softMutation(text);\n        }\n        return text;\n    }\n    function softMutation(text) {\n        var mutationTable = {\n            m: 'v',\n            b: 'v',\n            d: 'z',\n        };\n        if (mutationTable[text.charAt(0)] === undefined) {\n            return text;\n        }\n        return mutationTable[text.charAt(0)] + text.substring(1);\n    }\n\n    var monthsParse = [\n            /^gen/i,\n            /^c[ʼ\\']hwe/i,\n            /^meu/i,\n            /^ebr/i,\n            /^mae/i,\n            /^(mez|eve)/i,\n            /^gou/i,\n            /^eos/i,\n            /^gwe/i,\n            /^her/i,\n            /^du/i,\n            /^ker/i,\n        ],\n        monthsRegex =\n            /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n        monthsStrictRegex =\n            /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,\n        monthsShortStrictRegex =\n            /^(gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n        fullWeekdaysParse = [\n            /^sul/i,\n            /^lun/i,\n            /^meurzh/i,\n            /^merc[ʼ\\']her/i,\n            /^yaou/i,\n            /^gwener/i,\n            /^sadorn/i,\n        ],\n        shortWeekdaysParse = [\n            /^Sul/i,\n            /^Lun/i,\n            /^Meu/i,\n            /^Mer/i,\n            /^Yao/i,\n            /^Gwe/i,\n            /^Sad/i,\n        ],\n        minWeekdaysParse = [\n            /^Su/i,\n            /^Lu/i,\n            /^Me([^r]|$)/i,\n            /^Mer/i,\n            /^Ya/i,\n            /^Gw/i,\n            /^Sa/i,\n        ];\n\n    var br = moment.defineLocale('br', {\n        months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(\n            '_'\n        ),\n        monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n        weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),\n        weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n        weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n        weekdaysParse: minWeekdaysParse,\n        fullWeekdaysParse: fullWeekdaysParse,\n        shortWeekdaysParse: shortWeekdaysParse,\n        minWeekdaysParse: minWeekdaysParse,\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex: monthsStrictRegex,\n        monthsShortStrictRegex: monthsShortStrictRegex,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [a viz] MMMM YYYY',\n            LLL: 'D [a viz] MMMM YYYY HH:mm',\n            LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hiziv da] LT',\n            nextDay: '[Warcʼhoazh da] LT',\n            nextWeek: 'dddd [da] LT',\n            lastDay: '[Decʼh da] LT',\n            lastWeek: 'dddd [paset da] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'a-benn %s',\n            past: '%s ʼzo',\n            s: 'un nebeud segondennoù',\n            ss: '%d eilenn',\n            m: 'ur vunutenn',\n            mm: relativeTimeWithMutation,\n            h: 'un eur',\n            hh: '%d eur',\n            d: 'un devezh',\n            dd: relativeTimeWithMutation,\n            M: 'ur miz',\n            MM: relativeTimeWithMutation,\n            y: 'ur bloaz',\n            yy: specialMutationForYears,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'añ' : 'vet';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn\n        isPM: function (token) {\n            return token === 'g.m.';\n        },\n        meridiem: function (hour, minute, isLower) {\n            return hour < 12 ? 'a.m.' : 'g.m.';\n        },\n    });\n\n    return br;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bosnian [bs]\n//! author : Nedim Cholich : https://github.com/frontyard\n//! author : Rasid Redzic : https://github.com/rasidre\n//! based on (hr) translation by Bojan Marković\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        switch (key) {\n            case 'm':\n                return withoutSuffix\n                    ? 'jedna minuta'\n                    : isFuture\n                      ? 'jednu minutu'\n                      : 'jedne minute';\n        }\n    }\n\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                if (number === 1) {\n                    result += 'sekunda';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sekunde';\n                } else {\n                    result += 'sekundi';\n                }\n                return result;\n            case 'mm':\n                if (number === 1) {\n                    result += 'minuta';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'minute';\n                } else {\n                    result += 'minuta';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'jedan sat' : 'jedan sat';\n            case 'hh':\n                if (number === 1) {\n                    result += 'sat';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sata';\n                } else {\n                    result += 'sati';\n                }\n                return result;\n            case 'dd':\n                if (number === 1) {\n                    result += 'dan';\n                } else {\n                    result += 'dana';\n                }\n                return result;\n            case 'MM':\n                if (number === 1) {\n                    result += 'mjesec';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'mjeseca';\n                } else {\n                    result += 'mjeseci';\n                }\n                return result;\n            case 'yy':\n                if (number === 1) {\n                    result += 'godina';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'godine';\n                } else {\n                    result += 'godina';\n                }\n                return result;\n        }\n    }\n\n    var bs = moment.defineLocale('bs', {\n        months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[jučer u] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                        return '[prošlu] dddd [u] LT';\n                    case 6:\n                        return '[prošle] [subote] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prošli] dddd [u] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'par sekundi',\n            ss: translate,\n            m: processRelativeTime,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: 'dan',\n            dd: translate,\n            M: 'mjesec',\n            MM: translate,\n            y: 'godinu',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return bs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Catalan [ca]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ca = moment.defineLocale('ca', {\n        months: {\n            standalone:\n                'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(\n                    '_'\n                ),\n            format: \"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre\".split(\n                '_'\n            ),\n            isFormat: /D[oD]?(\\s)+MMMM/,\n        },\n        monthsShort:\n            'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(\n                '_'\n            ),\n        weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n        weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [de] YYYY',\n            ll: 'D MMM YYYY',\n            LLL: 'D MMMM [de] YYYY [a les] H:mm',\n            lll: 'D MMM YYYY, H:mm',\n            LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',\n            llll: 'ddd D MMM YYYY, H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            nextDay: function () {\n                return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            lastDay: function () {\n                return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [passat a ' +\n                    (this.hours() !== 1 ? 'les' : 'la') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: \"d'aquí %s\",\n            past: 'fa %s',\n            s: 'uns segons',\n            ss: '%d segons',\n            m: 'un minut',\n            mm: '%d minuts',\n            h: 'una hora',\n            hh: '%d hores',\n            d: 'un dia',\n            dd: '%d dies',\n            M: 'un mes',\n            MM: '%d mesos',\n            y: 'un any',\n            yy: '%d anys',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n        ordinal: function (number, period) {\n            var output =\n                number === 1\n                    ? 'r'\n                    : number === 2\n                      ? 'n'\n                      : number === 3\n                        ? 'r'\n                        : number === 4\n                          ? 't'\n                          : 'è';\n            if (period === 'w' || period === 'W') {\n                output = 'a';\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ca;\n\n})));\n","//! moment.js locale configuration\n//! locale : Czech [cs]\n//! author : petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = {\n            standalone:\n                'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(\n                    '_'\n                ),\n            format: 'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(\n                '_'\n            ),\n            isFormat: /DD?[o.]?(\\[[^\\[\\]]*\\]|\\s)+MMMM/,\n        },\n        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),\n        monthsParse = [\n            /^led/i,\n            /^úno/i,\n            /^bře/i,\n            /^dub/i,\n            /^kvě/i,\n            /^(čvn|červen$|června)/i,\n            /^(čvc|červenec|července)/i,\n            /^srp/i,\n            /^zář/i,\n            /^říj/i,\n            /^lis/i,\n            /^pro/i,\n        ],\n        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n        monthsRegex =\n            /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;\n\n    function plural(n) {\n        return n > 1 && n < 5 && ~~(n / 10) !== 1;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's': // a few seconds / in a few seconds / a few seconds ago\n                return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';\n            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'sekundy' : 'sekund');\n                } else {\n                    return result + 'sekundami';\n                }\n            case 'm': // a minute / in a minute / a minute ago\n                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';\n            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'minuty' : 'minut');\n                } else {\n                    return result + 'minutami';\n                }\n            case 'h': // an hour / in an hour / an hour ago\n                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n            case 'hh': // 9 hours / in 9 hours / 9 hours ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'hodiny' : 'hodin');\n                } else {\n                    return result + 'hodinami';\n                }\n            case 'd': // a day / in a day / a day ago\n                return withoutSuffix || isFuture ? 'den' : 'dnem';\n            case 'dd': // 9 days / in 9 days / 9 days ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'dny' : 'dní');\n                } else {\n                    return result + 'dny';\n                }\n            case 'M': // a month / in a month / a month ago\n                return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';\n            case 'MM': // 9 months / in 9 months / 9 months ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'měsíce' : 'měsíců');\n                } else {\n                    return result + 'měsíci';\n                }\n            case 'y': // a year / in a year / a year ago\n                return withoutSuffix || isFuture ? 'rok' : 'rokem';\n            case 'yy': // 9 years / in 9 years / 9 years ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'roky' : 'let');\n                } else {\n                    return result + 'lety';\n                }\n        }\n    }\n\n    var cs = moment.defineLocale('cs', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n        monthsStrictRegex:\n            /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,\n        monthsShortStrictRegex:\n            /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n        weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),\n        weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd D. MMMM YYYY H:mm',\n            l: 'D. M. YYYY',\n        },\n        calendar: {\n            sameDay: '[dnes v] LT',\n            nextDay: '[zítra v] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v neděli v] LT';\n                    case 1:\n                    case 2:\n                        return '[v] dddd [v] LT';\n                    case 3:\n                        return '[ve středu v] LT';\n                    case 4:\n                        return '[ve čtvrtek v] LT';\n                    case 5:\n                        return '[v pátek v] LT';\n                    case 6:\n                        return '[v sobotu v] LT';\n                }\n            },\n            lastDay: '[včera v] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[minulou neděli v] LT';\n                    case 1:\n                    case 2:\n                        return '[minulé] dddd [v] LT';\n                    case 3:\n                        return '[minulou středu v] LT';\n                    case 4:\n                    case 5:\n                        return '[minulý] dddd [v] LT';\n                    case 6:\n                        return '[minulou sobotu v] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'před %s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return cs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chuvash [cv]\n//! author : Anatoly Mironov : https://github.com/mirontoli\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var cv = moment.defineLocale('cv', {\n        months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(\n            '_'\n        ),\n        monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),\n        weekdays:\n            'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(\n                '_'\n            ),\n        weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),\n        weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',\n            LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n            LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n        },\n        calendar: {\n            sameDay: '[Паян] LT [сехетре]',\n            nextDay: '[Ыран] LT [сехетре]',\n            lastDay: '[Ӗнер] LT [сехетре]',\n            nextWeek: '[Ҫитес] dddd LT [сехетре]',\n            lastWeek: '[Иртнӗ] dddd LT [сехетре]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (output) {\n                var affix = /сехет$/i.exec(output)\n                    ? 'рен'\n                    : /ҫул$/i.exec(output)\n                      ? 'тан'\n                      : 'ран';\n                return output + affix;\n            },\n            past: '%s каялла',\n            s: 'пӗр-ик ҫеккунт',\n            ss: '%d ҫеккунт',\n            m: 'пӗр минут',\n            mm: '%d минут',\n            h: 'пӗр сехет',\n            hh: '%d сехет',\n            d: 'пӗр кун',\n            dd: '%d кун',\n            M: 'пӗр уйӑх',\n            MM: '%d уйӑх',\n            y: 'пӗр ҫул',\n            yy: '%d ҫул',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-мӗш/,\n        ordinal: '%d-мӗш',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return cv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Welsh [cy]\n//! author : Robert Allen : https://github.com/robgallen\n//! author : https://github.com/ryangreaves\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var cy = moment.defineLocale('cy', {\n        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(\n            '_'\n        ),\n        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(\n            '_'\n        ),\n        weekdays:\n            'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(\n                '_'\n            ),\n        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n        weekdaysParseExact: true,\n        // time formats are the same as en-gb\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Heddiw am] LT',\n            nextDay: '[Yfory am] LT',\n            nextWeek: 'dddd [am] LT',\n            lastDay: '[Ddoe am] LT',\n            lastWeek: 'dddd [diwethaf am] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'mewn %s',\n            past: '%s yn ôl',\n            s: 'ychydig eiliadau',\n            ss: '%d eiliad',\n            m: 'munud',\n            mm: '%d munud',\n            h: 'awr',\n            hh: '%d awr',\n            d: 'diwrnod',\n            dd: '%d diwrnod',\n            M: 'mis',\n            MM: '%d mis',\n            y: 'blwyddyn',\n            yy: '%d flynedd',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n        ordinal: function (number) {\n            var b = number,\n                output = '',\n                lookup = [\n                    '',\n                    'af',\n                    'il',\n                    'ydd',\n                    'ydd',\n                    'ed',\n                    'ed',\n                    'ed',\n                    'fed',\n                    'fed',\n                    'fed', // 1af to 10fed\n                    'eg',\n                    'fed',\n                    'eg',\n                    'eg',\n                    'fed',\n                    'eg',\n                    'eg',\n                    'fed',\n                    'eg',\n                    'fed', // 11eg to 20fed\n                ];\n            if (b > 20) {\n                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n                    output = 'fed'; // not 30ain, 70ain or 90ain\n                } else {\n                    output = 'ain';\n                }\n            } else if (b > 0) {\n                output = lookup[b];\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return cy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Danish [da]\n//! author : Ulrik Nielsen : https://github.com/mrbase\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var da = moment.defineLocale('da', {\n        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n        weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),\n        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'på dddd [kl.] LT',\n            lastDay: '[i går kl.] LT',\n            lastWeek: '[i] dddd[s kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'få sekunder',\n            ss: '%d sekunder',\n            m: 'et minut',\n            mm: '%d minutter',\n            h: 'en time',\n            hh: '%d timer',\n            d: 'en dag',\n            dd: '%d dage',\n            M: 'en måned',\n            MM: '%d måneder',\n            y: 'et år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return da;\n\n})));\n","//! moment.js locale configuration\n//! locale : German (Austria) [de-at]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Martin Groller : https://github.com/MadMG\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var deAt = moment.defineLocale('de-at', {\n        months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return deAt;\n\n})));\n","//! moment.js locale configuration\n//! locale : German (Switzerland) [de-ch]\n//! author : sschueller : https://github.com/sschueller\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var deCh = moment.defineLocale('de-ch', {\n        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return deCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : German [de]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var de = moment.defineLocale('de', {\n        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return de;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maldivian [dv]\n//! author : Jawish Hameed : https://github.com/jawish\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'ޖެނުއަރީ',\n            'ފެބްރުއަރީ',\n            'މާރިޗު',\n            'އޭޕްރީލު',\n            'މޭ',\n            'ޖޫން',\n            'ޖުލައި',\n            'އޯގަސްޓު',\n            'ސެޕްޓެމްބަރު',\n            'އޮކްޓޯބަރު',\n            'ނޮވެމްބަރު',\n            'ޑިސެމްބަރު',\n        ],\n        weekdays = [\n            'އާދިއްތަ',\n            'ހޯމަ',\n            'އަންގާރަ',\n            'ބުދަ',\n            'ބުރާސްފަތި',\n            'ހުކުރު',\n            'ހޮނިހިރު',\n        ];\n\n    var dv = moment.defineLocale('dv', {\n        months: months,\n        monthsShort: months,\n        weekdays: weekdays,\n        weekdaysShort: weekdays,\n        weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/M/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /މކ|މފ/,\n        isPM: function (input) {\n            return 'މފ' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'މކ';\n            } else {\n                return 'މފ';\n            }\n        },\n        calendar: {\n            sameDay: '[މިއަދު] LT',\n            nextDay: '[މާދަމާ] LT',\n            nextWeek: 'dddd LT',\n            lastDay: '[އިއްޔެ] LT',\n            lastWeek: '[ފާއިތުވި] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ތެރޭގައި %s',\n            past: 'ކުރިން %s',\n            s: 'ސިކުންތުކޮޅެއް',\n            ss: 'd% ސިކުންތު',\n            m: 'މިނިޓެއް',\n            mm: 'މިނިޓު %d',\n            h: 'ގަޑިއިރެއް',\n            hh: 'ގަޑިއިރު %d',\n            d: 'ދުވަހެއް',\n            dd: 'ދުވަސް %d',\n            M: 'މަހެއް',\n            MM: 'މަސް %d',\n            y: 'އަހަރެއް',\n            yy: 'އަހަރު %d',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 7, // Sunday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return dv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Greek [el]\n//! author : Aggelos Karalias : https://github.com/mehiel\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    var el = moment.defineLocale('el', {\n        monthsNominativeEl:\n            'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(\n                '_'\n            ),\n        monthsGenitiveEl:\n            'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(\n                '_'\n            ),\n        months: function (momentToFormat, format) {\n            if (!momentToFormat) {\n                return this._monthsNominativeEl;\n            } else if (\n                typeof format === 'string' &&\n                /D/.test(format.substring(0, format.indexOf('MMMM')))\n            ) {\n                // if there is a day number before 'MMMM'\n                return this._monthsGenitiveEl[momentToFormat.month()];\n            } else {\n                return this._monthsNominativeEl[momentToFormat.month()];\n            }\n        },\n        monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n        weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(\n            '_'\n        ),\n        weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n        weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'μμ' : 'ΜΜ';\n            } else {\n                return isLower ? 'πμ' : 'ΠΜ';\n            }\n        },\n        isPM: function (input) {\n            return (input + '').toLowerCase()[0] === 'μ';\n        },\n        meridiemParse: /[ΠΜ]\\.?Μ?\\.?/i,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendarEl: {\n            sameDay: '[Σήμερα {}] LT',\n            nextDay: '[Αύριο {}] LT',\n            nextWeek: 'dddd [{}] LT',\n            lastDay: '[Χθες {}] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 6:\n                        return '[το προηγούμενο] dddd [{}] LT';\n                    default:\n                        return '[την προηγούμενη] dddd [{}] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        calendar: function (key, mom) {\n            var output = this._calendarEl[key],\n                hours = mom && mom.hours();\n            if (isFunction(output)) {\n                output = output.apply(mom);\n            }\n            return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');\n        },\n        relativeTime: {\n            future: 'σε %s',\n            past: '%s πριν',\n            s: 'λίγα δευτερόλεπτα',\n            ss: '%d δευτερόλεπτα',\n            m: 'ένα λεπτό',\n            mm: '%d λεπτά',\n            h: 'μία ώρα',\n            hh: '%d ώρες',\n            d: 'μία μέρα',\n            dd: '%d μέρες',\n            M: 'ένας μήνας',\n            MM: '%d μήνες',\n            y: 'ένας χρόνος',\n            yy: '%d χρόνια',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}η/,\n        ordinal: '%dη',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4st is the first week of the year.\n        },\n    });\n\n    return el;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Australia) [en-au]\n//! author : Jared Morse : https://github.com/jarcoal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enAu = moment.defineLocale('en-au', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enAu;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Canada) [en-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enCa = moment.defineLocale('en-ca', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'YYYY-MM-DD',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY h:mm A',\n            LLLL: 'dddd, MMMM D, YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    return enCa;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (United Kingdom) [en-gb]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enGb = moment.defineLocale('en-gb', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enGb;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Ireland) [en-ie]\n//! author : Chris Cartlidge : https://github.com/chriscartlidge\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIe = moment.defineLocale('en-ie', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enIe;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Israel) [en-il]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIl = moment.defineLocale('en-il', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    return enIl;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (India) [en-in]\n//! author : Jatin Agrawal : https://github.com/jatinag22\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIn = moment.defineLocale('en-in', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return enIn;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (New Zealand) [en-nz]\n//! author : Luke McGregor : https://github.com/lukemcgregor\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enNz = moment.defineLocale('en-nz', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enNz;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Singapore) [en-sg]\n//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enSg = moment.defineLocale('en-sg', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enSg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Esperanto [eo]\n//! author : Colin Dean : https://github.com/colindean\n//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia\n//! comment : miestasmia corrected the translation by colindean\n//! comment : Vivakvo corrected the translation by colindean and miestasmia\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var eo = moment.defineLocale('eo', {\n        months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),\n        weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n        weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: '[la] D[-an de] MMMM, YYYY',\n            LLL: '[la] D[-an de] MMMM, YYYY HH:mm',\n            LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',\n            llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',\n        },\n        meridiemParse: /[ap]\\.t\\.m/i,\n        isPM: function (input) {\n            return input.charAt(0).toLowerCase() === 'p';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'p.t.m.' : 'P.T.M.';\n            } else {\n                return isLower ? 'a.t.m.' : 'A.T.M.';\n            }\n        },\n        calendar: {\n            sameDay: '[Hodiaŭ je] LT',\n            nextDay: '[Morgaŭ je] LT',\n            nextWeek: 'dddd[n je] LT',\n            lastDay: '[Hieraŭ je] LT',\n            lastWeek: '[pasintan] dddd[n je] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'post %s',\n            past: 'antaŭ %s',\n            s: 'kelkaj sekundoj',\n            ss: '%d sekundoj',\n            m: 'unu minuto',\n            mm: '%d minutoj',\n            h: 'unu horo',\n            hh: '%d horoj',\n            d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo\n            dd: '%d tagoj',\n            M: 'unu monato',\n            MM: '%d monatoj',\n            y: 'unu jaro',\n            yy: '%d jaroj',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}a/,\n        ordinal: '%da',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return eo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (Dominican Republic) [es-do]\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esDo = moment.defineLocale('es-do', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY h:mm A',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return esDo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (Mexico) [es-mx]\n//! author : JC Franco : https://github.com/jcfranco\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esMx = moment.defineLocale('es-mx', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        invalidDate: 'Fecha inválida',\n    });\n\n    return esMx;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (United States) [es-us]\n//! author : bustta : https://github.com/bustta\n//! author : chrisrodz : https://github.com/chrisrodz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esUs = moment.defineLocale('es-us', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'MM/DD/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY h:mm A',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return esUs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish [es]\n//! author : Julio Napurí : https://github.com/julionc\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var es = moment.defineLocale('es', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        invalidDate: 'Fecha inválida',\n    });\n\n    return es;\n\n})));\n","//! moment.js locale configuration\n//! locale : Estonian [et]\n//! author : Henry Kehlmann : https://github.com/madhenry\n//! improvements : Illimar Tambek : https://github.com/ragulka\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n            ss: [number + 'sekundi', number + 'sekundit'],\n            m: ['ühe minuti', 'üks minut'],\n            mm: [number + ' minuti', number + ' minutit'],\n            h: ['ühe tunni', 'tund aega', 'üks tund'],\n            hh: [number + ' tunni', number + ' tundi'],\n            d: ['ühe päeva', 'üks päev'],\n            M: ['kuu aja', 'kuu aega', 'üks kuu'],\n            MM: [number + ' kuu', number + ' kuud'],\n            y: ['ühe aasta', 'aasta', 'üks aasta'],\n            yy: [number + ' aasta', number + ' aastat'],\n        };\n        if (withoutSuffix) {\n            return format[key][2] ? format[key][2] : format[key][1];\n        }\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var et = moment.defineLocale('et', {\n        months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n        weekdays:\n            'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(\n                '_'\n            ),\n        weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),\n        weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Täna,] LT',\n            nextDay: '[Homme,] LT',\n            nextWeek: '[Järgmine] dddd LT',\n            lastDay: '[Eile,] LT',\n            lastWeek: '[Eelmine] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s pärast',\n            past: '%s tagasi',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: '%d päeva',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return et;\n\n})));\n","//! moment.js locale configuration\n//! locale : Basque [eu]\n//! author : Eneko Illarramendi : https://github.com/eillarra\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var eu = moment.defineLocale('eu', {\n        months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(\n            '_'\n        ),\n        monthsShort:\n            'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(\n                '_'\n            ),\n        weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),\n        weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY[ko] MMMM[ren] D[a]',\n            LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n            LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n            l: 'YYYY-M-D',\n            ll: 'YYYY[ko] MMM D[a]',\n            lll: 'YYYY[ko] MMM D[a] HH:mm',\n            llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',\n        },\n        calendar: {\n            sameDay: '[gaur] LT[etan]',\n            nextDay: '[bihar] LT[etan]',\n            nextWeek: 'dddd LT[etan]',\n            lastDay: '[atzo] LT[etan]',\n            lastWeek: '[aurreko] dddd LT[etan]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s barru',\n            past: 'duela %s',\n            s: 'segundo batzuk',\n            ss: '%d segundo',\n            m: 'minutu bat',\n            mm: '%d minutu',\n            h: 'ordu bat',\n            hh: '%d ordu',\n            d: 'egun bat',\n            dd: '%d egun',\n            M: 'hilabete bat',\n            MM: '%d hilabete',\n            y: 'urte bat',\n            yy: '%d urte',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return eu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Persian [fa]\n//! author : Ebrahim Byagowi : https://github.com/ebraminio\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '۱',\n            2: '۲',\n            3: '۳',\n            4: '۴',\n            5: '۵',\n            6: '۶',\n            7: '۷',\n            8: '۸',\n            9: '۹',\n            0: '۰',\n        },\n        numberMap = {\n            '۱': '1',\n            '۲': '2',\n            '۳': '3',\n            '۴': '4',\n            '۵': '5',\n            '۶': '6',\n            '۷': '7',\n            '۸': '8',\n            '۹': '9',\n            '۰': '0',\n        };\n\n    var fa = moment.defineLocale('fa', {\n        months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n                '_'\n            ),\n        weekdays:\n            'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n                '_'\n            ),\n        weekdaysShort:\n            'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n                '_'\n            ),\n        weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /قبل از ظهر|بعد از ظهر/,\n        isPM: function (input) {\n            return /بعد از ظهر/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'قبل از ظهر';\n            } else {\n                return 'بعد از ظهر';\n            }\n        },\n        calendar: {\n            sameDay: '[امروز ساعت] LT',\n            nextDay: '[فردا ساعت] LT',\n            nextWeek: 'dddd [ساعت] LT',\n            lastDay: '[دیروز ساعت] LT',\n            lastWeek: 'dddd [پیش] [ساعت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'در %s',\n            past: '%s پیش',\n            s: 'چند ثانیه',\n            ss: '%d ثانیه',\n            m: 'یک دقیقه',\n            mm: '%d دقیقه',\n            h: 'یک ساعت',\n            hh: '%d ساعت',\n            d: 'یک روز',\n            dd: '%d روز',\n            M: 'یک ماه',\n            MM: '%d ماه',\n            y: 'یک سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[۰-۹]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}م/,\n        ordinal: '%dم',\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return fa;\n\n})));\n","//! moment.js locale configuration\n//! locale : Finnish [fi]\n//! author : Tarmo Aidantausta : https://github.com/bleadof\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var numbersPast =\n            'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(\n                ' '\n            ),\n        numbersFuture = [\n            'nolla',\n            'yhden',\n            'kahden',\n            'kolmen',\n            'neljän',\n            'viiden',\n            'kuuden',\n            numbersPast[7],\n            numbersPast[8],\n            numbersPast[9],\n        ];\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = '';\n        switch (key) {\n            case 's':\n                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';\n            case 'ss':\n                result = isFuture ? 'sekunnin' : 'sekuntia';\n                break;\n            case 'm':\n                return isFuture ? 'minuutin' : 'minuutti';\n            case 'mm':\n                result = isFuture ? 'minuutin' : 'minuuttia';\n                break;\n            case 'h':\n                return isFuture ? 'tunnin' : 'tunti';\n            case 'hh':\n                result = isFuture ? 'tunnin' : 'tuntia';\n                break;\n            case 'd':\n                return isFuture ? 'päivän' : 'päivä';\n            case 'dd':\n                result = isFuture ? 'päivän' : 'päivää';\n                break;\n            case 'M':\n                return isFuture ? 'kuukauden' : 'kuukausi';\n            case 'MM':\n                result = isFuture ? 'kuukauden' : 'kuukautta';\n                break;\n            case 'y':\n                return isFuture ? 'vuoden' : 'vuosi';\n            case 'yy':\n                result = isFuture ? 'vuoden' : 'vuotta';\n                break;\n        }\n        result = verbalNumber(number, isFuture) + ' ' + result;\n        return result;\n    }\n    function verbalNumber(number, isFuture) {\n        return number < 10\n            ? isFuture\n                ? numbersFuture[number]\n                : numbersPast[number]\n            : number;\n    }\n\n    var fi = moment.defineLocale('fi', {\n        months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(\n            '_'\n        ),\n        monthsShort:\n            'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(\n                '_'\n            ),\n        weekdays:\n            'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(\n                '_'\n            ),\n        weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),\n        weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM[ta] YYYY',\n            LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',\n            LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',\n            l: 'D.M.YYYY',\n            ll: 'Do MMM YYYY',\n            lll: 'Do MMM YYYY, [klo] HH.mm',\n            llll: 'ddd, Do MMM YYYY, [klo] HH.mm',\n        },\n        calendar: {\n            sameDay: '[tänään] [klo] LT',\n            nextDay: '[huomenna] [klo] LT',\n            nextWeek: 'dddd [klo] LT',\n            lastDay: '[eilen] [klo] LT',\n            lastWeek: '[viime] dddd[na] [klo] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s päästä',\n            past: '%s sitten',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Filipino [fil]\n//! author : Dan Hagman : https://github.com/hagmandan\n//! author : Matthew Co : https://github.com/matthewdeeco\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var fil = moment.defineLocale('fil', {\n        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(\n            '_'\n        ),\n        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(\n            '_'\n        ),\n        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'MM/D/YYYY',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY HH:mm',\n            LLLL: 'dddd, MMMM DD, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: 'LT [ngayong araw]',\n            nextDay: '[Bukas ng] LT',\n            nextWeek: 'LT [sa susunod na] dddd',\n            lastDay: 'LT [kahapon]',\n            lastWeek: 'LT [noong nakaraang] dddd',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'sa loob ng %s',\n            past: '%s ang nakalipas',\n            s: 'ilang segundo',\n            ss: '%d segundo',\n            m: 'isang minuto',\n            mm: '%d minuto',\n            h: 'isang oras',\n            hh: '%d oras',\n            d: 'isang araw',\n            dd: '%d araw',\n            M: 'isang buwan',\n            MM: '%d buwan',\n            y: 'isang taon',\n            yy: '%d taon',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fil;\n\n})));\n","//! moment.js locale configuration\n//! locale : Faroese [fo]\n//! author : Ragnar Johannesen : https://github.com/ragnar123\n//! author : Kristian Sakarisson : https://github.com/sakarisson\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var fo = moment.defineLocale('fo', {\n        months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n        weekdays:\n            'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(\n                '_'\n            ),\n        weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n        weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D. MMMM, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Í dag kl.] LT',\n            nextDay: '[Í morgin kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[Í gjár kl.] LT',\n            lastWeek: '[síðstu] dddd [kl] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'um %s',\n            past: '%s síðani',\n            s: 'fá sekund',\n            ss: '%d sekundir',\n            m: 'ein minuttur',\n            mm: '%d minuttir',\n            h: 'ein tími',\n            hh: '%d tímar',\n            d: 'ein dagur',\n            dd: '%d dagar',\n            M: 'ein mánaður',\n            MM: '%d mánaðir',\n            y: 'eitt ár',\n            yy: '%d ár',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fo;\n\n})));\n","//! moment.js locale configuration\n//! locale : French (Canada) [fr-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var frCa = moment.defineLocale('fr-ca', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'D':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n    });\n\n    return frCa;\n\n})));\n","//! moment.js locale configuration\n//! locale : French (Switzerland) [fr-ch]\n//! author : Gaspard Bucher : https://github.com/gaspard\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var frCh = moment.defineLocale('fr-ch', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'D':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return frCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : French [fr]\n//! author : John Fischer : https://github.com/jfroffice\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsStrictRegex =\n            /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n        monthsShortStrictRegex =\n            /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?)/i,\n        monthsRegex =\n            /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n        monthsParse = [\n            /^janv/i,\n            /^févr/i,\n            /^mars/i,\n            /^avr/i,\n            /^mai/i,\n            /^juin/i,\n            /^juil/i,\n            /^août/i,\n            /^sept/i,\n            /^oct/i,\n            /^nov/i,\n            /^déc/i,\n        ];\n\n    var fr = moment.defineLocale('fr', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex: monthsStrictRegex,\n        monthsShortStrictRegex: monthsShortStrictRegex,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            w: 'une semaine',\n            ww: '%d semaines',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // TODO: Return 'e' when day of month > 1. Move this case inside\n                // block for masculine words below.\n                // See https://github.com/moment/moment/issues/3375\n                case 'D':\n                    return number + (number === 1 ? 'er' : '');\n\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Frisian [fy]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n\n    var fy = moment.defineLocale('fy', {\n        months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n        monthsParseExact: true,\n        weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(\n            '_'\n        ),\n        weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),\n        weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[hjoed om] LT',\n            nextDay: '[moarn om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[juster om] LT',\n            lastWeek: '[ôfrûne] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'oer %s',\n            past: '%s lyn',\n            s: 'in pear sekonden',\n            ss: '%d sekonden',\n            m: 'ien minút',\n            mm: '%d minuten',\n            h: 'ien oere',\n            hh: '%d oeren',\n            d: 'ien dei',\n            dd: '%d dagen',\n            M: 'ien moanne',\n            MM: '%d moannen',\n            y: 'ien jier',\n            yy: '%d jierren',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Irish or Irish Gaelic [ga]\n//! author : André Silva : https://github.com/askpt\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'Eanáir',\n            'Feabhra',\n            'Márta',\n            'Aibreán',\n            'Bealtaine',\n            'Meitheamh',\n            'Iúil',\n            'Lúnasa',\n            'Meán Fómhair',\n            'Deireadh Fómhair',\n            'Samhain',\n            'Nollaig',\n        ],\n        monthsShort = [\n            'Ean',\n            'Feabh',\n            'Márt',\n            'Aib',\n            'Beal',\n            'Meith',\n            'Iúil',\n            'Lún',\n            'M.F.',\n            'D.F.',\n            'Samh',\n            'Noll',\n        ],\n        weekdays = [\n            'Dé Domhnaigh',\n            'Dé Luain',\n            'Dé Máirt',\n            'Dé Céadaoin',\n            'Déardaoin',\n            'Dé hAoine',\n            'Dé Sathairn',\n        ],\n        weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n        weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];\n\n    var ga = moment.defineLocale('ga', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsParseExact: true,\n        weekdays: weekdays,\n        weekdaysShort: weekdaysShort,\n        weekdaysMin: weekdaysMin,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Inniu ag] LT',\n            nextDay: '[Amárach ag] LT',\n            nextWeek: 'dddd [ag] LT',\n            lastDay: '[Inné ag] LT',\n            lastWeek: 'dddd [seo caite] [ag] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'i %s',\n            past: '%s ó shin',\n            s: 'cúpla soicind',\n            ss: '%d soicind',\n            m: 'nóiméad',\n            mm: '%d nóiméad',\n            h: 'uair an chloig',\n            hh: '%d uair an chloig',\n            d: 'lá',\n            dd: '%d lá',\n            M: 'mí',\n            MM: '%d míonna',\n            y: 'bliain',\n            yy: '%d bliain',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ga;\n\n})));\n","//! moment.js locale configuration\n//! locale : Scottish Gaelic [gd]\n//! author : Jon Ashdown : https://github.com/jonashdown\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'Am Faoilleach',\n            'An Gearran',\n            'Am Màrt',\n            'An Giblean',\n            'An Cèitean',\n            'An t-Ògmhios',\n            'An t-Iuchar',\n            'An Lùnastal',\n            'An t-Sultain',\n            'An Dàmhair',\n            'An t-Samhain',\n            'An Dùbhlachd',\n        ],\n        monthsShort = [\n            'Faoi',\n            'Gear',\n            'Màrt',\n            'Gibl',\n            'Cèit',\n            'Ògmh',\n            'Iuch',\n            'Lùn',\n            'Sult',\n            'Dàmh',\n            'Samh',\n            'Dùbh',\n        ],\n        weekdays = [\n            'Didòmhnaich',\n            'Diluain',\n            'Dimàirt',\n            'Diciadain',\n            'Diardaoin',\n            'Dihaoine',\n            'Disathairne',\n        ],\n        weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],\n        weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n\n    var gd = moment.defineLocale('gd', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsParseExact: true,\n        weekdays: weekdays,\n        weekdaysShort: weekdaysShort,\n        weekdaysMin: weekdaysMin,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[An-diugh aig] LT',\n            nextDay: '[A-màireach aig] LT',\n            nextWeek: 'dddd [aig] LT',\n            lastDay: '[An-dè aig] LT',\n            lastWeek: 'dddd [seo chaidh] [aig] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ann an %s',\n            past: 'bho chionn %s',\n            s: 'beagan diogan',\n            ss: '%d diogan',\n            m: 'mionaid',\n            mm: '%d mionaidean',\n            h: 'uair',\n            hh: '%d uairean',\n            d: 'latha',\n            dd: '%d latha',\n            M: 'mìos',\n            MM: '%d mìosan',\n            y: 'bliadhna',\n            yy: '%d bliadhna',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return gd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Galician [gl]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var gl = moment.defineLocale('gl', {\n        months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(\n            '_'\n        ),\n        monthsShort:\n            'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';\n            },\n            lastDay: function () {\n                return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (str) {\n                if (str.indexOf('un') === 0) {\n                    return 'n' + str;\n                }\n                return 'en ' + str;\n            },\n            past: 'hai %s',\n            s: 'uns segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'unha hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return gl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Konkani Devanagari script [gom-deva]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],\n            ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],\n            m: ['एका मिणटान', 'एक मिनूट'],\n            mm: [number + ' मिणटांनी', number + ' मिणटां'],\n            h: ['एका वरान', 'एक वर'],\n            hh: [number + ' वरांनी', number + ' वरां'],\n            d: ['एका दिसान', 'एक दीस'],\n            dd: [number + ' दिसांनी', number + ' दीस'],\n            M: ['एका म्हयन्यान', 'एक म्हयनो'],\n            MM: [number + ' म्हयन्यानी', number + ' म्हयने'],\n            y: ['एका वर्सान', 'एक वर्स'],\n            yy: [number + ' वर्सांनी', number + ' वर्सां'],\n        };\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var gomDeva = moment.defineLocale('gom-deva', {\n        months: {\n            standalone:\n                'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(\n                    '_'\n                ),\n            format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(\n                '_'\n            ),\n            isFormat: /MMMM(\\s)+D[oD]?/,\n        },\n        monthsShort:\n            'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),\n        weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),\n        weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'A h:mm [वाजतां]',\n            LTS: 'A h:mm:ss [वाजतां]',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY A h:mm [वाजतां]',\n            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',\n            llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',\n        },\n        calendar: {\n            sameDay: '[आयज] LT',\n            nextDay: '[फाल्यां] LT',\n            nextWeek: '[फुडलो] dddd[,] LT',\n            lastDay: '[काल] LT',\n            lastWeek: '[फाटलो] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s',\n            past: '%s आदीं',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(वेर)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // the ordinal 'वेर' only applies to day of the month\n                case 'D':\n                    return number + 'वेर';\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                case 'w':\n                case 'W':\n                    return number;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week\n            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n        },\n        meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'राती') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'सकाळीं') {\n                return hour;\n            } else if (meridiem === 'दनपारां') {\n                return hour > 12 ? hour : hour + 12;\n            } else if (meridiem === 'सांजे') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'राती';\n            } else if (hour < 12) {\n                return 'सकाळीं';\n            } else if (hour < 16) {\n                return 'दनपारां';\n            } else if (hour < 20) {\n                return 'सांजे';\n            } else {\n                return 'राती';\n            }\n        },\n    });\n\n    return gomDeva;\n\n})));\n","//! moment.js locale configuration\n//! locale : Konkani Latin script [gom-latn]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['thoddea sekondamni', 'thodde sekond'],\n            ss: [number + ' sekondamni', number + ' sekond'],\n            m: ['eka mintan', 'ek minut'],\n            mm: [number + ' mintamni', number + ' mintam'],\n            h: ['eka voran', 'ek vor'],\n            hh: [number + ' voramni', number + ' voram'],\n            d: ['eka disan', 'ek dis'],\n            dd: [number + ' disamni', number + ' dis'],\n            M: ['eka mhoinean', 'ek mhoino'],\n            MM: [number + ' mhoineamni', number + ' mhoine'],\n            y: ['eka vorsan', 'ek voros'],\n            yy: [number + ' vorsamni', number + ' vorsam'],\n        };\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var gomLatn = moment.defineLocale('gom-latn', {\n        months: {\n            standalone:\n                'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(\n                    '_'\n                ),\n            format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(\n                '_'\n            ),\n            isFormat: /MMMM(\\s)+D[oD]?/,\n        },\n        monthsShort:\n            'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays: \"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var\".split('_'),\n        weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),\n        weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'A h:mm [vazta]',\n            LTS: 'A h:mm:ss [vazta]',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY A h:mm [vazta]',\n            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',\n            llll: 'ddd, D MMM YYYY, A h:mm [vazta]',\n        },\n        calendar: {\n            sameDay: '[Aiz] LT',\n            nextDay: '[Faleam] LT',\n            nextWeek: '[Fuddlo] dddd[,] LT',\n            lastDay: '[Kal] LT',\n            lastWeek: '[Fattlo] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s',\n            past: '%s adim',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // the ordinal 'er' only applies to day of the month\n                case 'D':\n                    return number + 'er';\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                case 'w':\n                case 'W':\n                    return number;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week\n            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n        },\n        meridiemParse: /rati|sokallim|donparam|sanje/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'rati') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'sokallim') {\n                return hour;\n            } else if (meridiem === 'donparam') {\n                return hour > 12 ? hour : hour + 12;\n            } else if (meridiem === 'sanje') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'rati';\n            } else if (hour < 12) {\n                return 'sokallim';\n            } else if (hour < 16) {\n                return 'donparam';\n            } else if (hour < 20) {\n                return 'sanje';\n            } else {\n                return 'rati';\n            }\n        },\n    });\n\n    return gomLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Gujarati [gu]\n//! author : Kaushik Thanki : https://github.com/Kaushik1987\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '૧',\n            2: '૨',\n            3: '૩',\n            4: '૪',\n            5: '૫',\n            6: '૬',\n            7: '૭',\n            8: '૮',\n            9: '૯',\n            0: '૦',\n        },\n        numberMap = {\n            '૧': '1',\n            '૨': '2',\n            '૩': '3',\n            '૪': '4',\n            '૫': '5',\n            '૬': '6',\n            '૭': '7',\n            '૮': '8',\n            '૯': '9',\n            '૦': '0',\n        };\n\n    var gu = moment.defineLocale('gu', {\n        months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(\n            '_'\n        ),\n        monthsShort:\n            'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(\n            '_'\n        ),\n        weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),\n        weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm વાગ્યે',\n            LTS: 'A h:mm:ss વાગ્યે',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm વાગ્યે',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',\n        },\n        calendar: {\n            sameDay: '[આજ] LT',\n            nextDay: '[કાલે] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ગઇકાલે] LT',\n            lastWeek: '[પાછલા] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s મા',\n            past: '%s પહેલા',\n            s: 'અમુક પળો',\n            ss: '%d સેકંડ',\n            m: 'એક મિનિટ',\n            mm: '%d મિનિટ',\n            h: 'એક કલાક',\n            hh: '%d કલાક',\n            d: 'એક દિવસ',\n            dd: '%d દિવસ',\n            M: 'એક મહિનો',\n            MM: '%d મહિનો',\n            y: 'એક વર્ષ',\n            yy: '%d વર્ષ',\n        },\n        preparse: function (string) {\n            return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Gujarati notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.\n        meridiemParse: /રાત|બપોર|સવાર|સાંજ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'રાત') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'સવાર') {\n                return hour;\n            } else if (meridiem === 'બપોર') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'સાંજ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'રાત';\n            } else if (hour < 10) {\n                return 'સવાર';\n            } else if (hour < 17) {\n                return 'બપોર';\n            } else if (hour < 20) {\n                return 'સાંજ';\n            } else {\n                return 'રાત';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return gu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hebrew [he]\n//! author : Tomer Cohen : https://github.com/tomer\n//! author : Moshe Simantov : https://github.com/DevelopmentIL\n//! author : Tal Ater : https://github.com/TalAter\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var he = moment.defineLocale('he', {\n        months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(\n            '_'\n        ),\n        monthsShort:\n            'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n        weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n        weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n        weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [ב]MMMM YYYY',\n            LLL: 'D [ב]MMMM YYYY HH:mm',\n            LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',\n            l: 'D/M/YYYY',\n            ll: 'D MMM YYYY',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd, D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[היום ב־]LT',\n            nextDay: '[מחר ב־]LT',\n            nextWeek: 'dddd [בשעה] LT',\n            lastDay: '[אתמול ב־]LT',\n            lastWeek: '[ביום] dddd [האחרון בשעה] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'בעוד %s',\n            past: 'לפני %s',\n            s: 'מספר שניות',\n            ss: '%d שניות',\n            m: 'דקה',\n            mm: '%d דקות',\n            h: 'שעה',\n            hh: function (number) {\n                if (number === 2) {\n                    return 'שעתיים';\n                }\n                return number + ' שעות';\n            },\n            d: 'יום',\n            dd: function (number) {\n                if (number === 2) {\n                    return 'יומיים';\n                }\n                return number + ' ימים';\n            },\n            M: 'חודש',\n            MM: function (number) {\n                if (number === 2) {\n                    return 'חודשיים';\n                }\n                return number + ' חודשים';\n            },\n            y: 'שנה',\n            yy: function (number) {\n                if (number === 2) {\n                    return 'שנתיים';\n                } else if (number % 10 === 0 && number !== 10) {\n                    return number + ' שנה';\n                }\n                return number + ' שנים';\n            },\n        },\n        meridiemParse:\n            /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n        isPM: function (input) {\n            return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 5) {\n                return 'לפנות בוקר';\n            } else if (hour < 10) {\n                return 'בבוקר';\n            } else if (hour < 12) {\n                return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n            } else if (hour < 18) {\n                return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n            } else {\n                return 'בערב';\n            }\n        },\n    });\n\n    return he;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hindi [hi]\n//! author : Mayank Singhal : https://github.com/mayanksinghal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        },\n        monthsParse = [\n            /^जन/i,\n            /^फ़र|फर/i,\n            /^मार्च/i,\n            /^अप्रै/i,\n            /^मई/i,\n            /^जून/i,\n            /^जुल/i,\n            /^अग/i,\n            /^सितं|सित/i,\n            /^अक्टू/i,\n            /^नव|नवं/i,\n            /^दिसं|दिस/i,\n        ],\n        shortMonthsParse = [\n            /^जन/i,\n            /^फ़र/i,\n            /^मार्च/i,\n            /^अप्रै/i,\n            /^मई/i,\n            /^जून/i,\n            /^जुल/i,\n            /^अग/i,\n            /^सित/i,\n            /^अक्टू/i,\n            /^नव/i,\n            /^दिस/i,\n        ];\n\n    var hi = moment.defineLocale('hi', {\n        months: {\n            format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(\n                '_'\n            ),\n            standalone:\n                'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n        weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n        weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm बजे',\n            LTS: 'A h:mm:ss बजे',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm बजे',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',\n        },\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: shortMonthsParse,\n\n        monthsRegex:\n            /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n        monthsShortRegex:\n            /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n        monthsStrictRegex:\n            /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,\n\n        monthsShortStrictRegex:\n            /^(जन\\.?|फ़र\\.?|मार्च?|अप्रै\\.?|मई?|जून?|जुल\\.?|अग\\.?|सित\\.?|अक्टू\\.?|नव\\.?|दिस\\.?)/i,\n\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[कल] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[कल] LT',\n            lastWeek: '[पिछले] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s में',\n            past: '%s पहले',\n            s: 'कुछ ही क्षण',\n            ss: '%d सेकंड',\n            m: 'एक मिनट',\n            mm: '%d मिनट',\n            h: 'एक घंटा',\n            hh: '%d घंटे',\n            d: 'एक दिन',\n            dd: '%d दिन',\n            M: 'एक महीने',\n            MM: '%d महीने',\n            y: 'एक वर्ष',\n            yy: '%d वर्ष',\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n        meridiemParse: /रात|सुबह|दोपहर|शाम/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'रात') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'सुबह') {\n                return hour;\n            } else if (meridiem === 'दोपहर') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'शाम') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'रात';\n            } else if (hour < 10) {\n                return 'सुबह';\n            } else if (hour < 17) {\n                return 'दोपहर';\n            } else if (hour < 20) {\n                return 'शाम';\n            } else {\n                return 'रात';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return hi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Croatian [hr]\n//! author : Bojan Marković : https://github.com/bmarkovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                if (number === 1) {\n                    result += 'sekunda';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sekunde';\n                } else {\n                    result += 'sekundi';\n                }\n                return result;\n            case 'm':\n                return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n            case 'mm':\n                if (number === 1) {\n                    result += 'minuta';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'minute';\n                } else {\n                    result += 'minuta';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'jedan sat' : 'jednog sata';\n            case 'hh':\n                if (number === 1) {\n                    result += 'sat';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sata';\n                } else {\n                    result += 'sati';\n                }\n                return result;\n            case 'dd':\n                if (number === 1) {\n                    result += 'dan';\n                } else {\n                    result += 'dana';\n                }\n                return result;\n            case 'MM':\n                if (number === 1) {\n                    result += 'mjesec';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'mjeseca';\n                } else {\n                    result += 'mjeseci';\n                }\n                return result;\n            case 'yy':\n                if (number === 1) {\n                    result += 'godina';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'godine';\n                } else {\n                    result += 'godina';\n                }\n                return result;\n        }\n    }\n\n    var hr = moment.defineLocale('hr', {\n        months: {\n            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(\n                '_'\n            ),\n            standalone:\n                'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM YYYY',\n            LLL: 'Do MMMM YYYY H:mm',\n            LLLL: 'dddd, Do MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[jučer u] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[prošlu] [nedjelju] [u] LT';\n                    case 3:\n                        return '[prošlu] [srijedu] [u] LT';\n                    case 6:\n                        return '[prošle] [subote] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prošli] dddd [u] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'par sekundi',\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: 'dan',\n            dd: translate,\n            M: 'mjesec',\n            MM: translate,\n            y: 'godinu',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return hr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hungarian [hu]\n//! author : Adam Brunner : https://github.com/adambrunner\n//! author : Peter Viszt  : https://github.com/passatgt\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var weekEndings =\n        'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');\n    function translate(number, withoutSuffix, key, isFuture) {\n        var num = number;\n        switch (key) {\n            case 's':\n                return isFuture || withoutSuffix\n                    ? 'néhány másodperc'\n                    : 'néhány másodperce';\n            case 'ss':\n                return num + (isFuture || withoutSuffix)\n                    ? ' másodperc'\n                    : ' másodperce';\n            case 'm':\n                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');\n            case 'mm':\n                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');\n            case 'h':\n                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');\n            case 'hh':\n                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');\n            case 'd':\n                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');\n            case 'dd':\n                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');\n            case 'M':\n                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n            case 'MM':\n                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n            case 'y':\n                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');\n            case 'yy':\n                return num + (isFuture || withoutSuffix ? ' év' : ' éve');\n        }\n        return '';\n    }\n    function week(isFuture) {\n        return (\n            (isFuture ? '' : '[múlt] ') +\n            '[' +\n            weekEndings[this.day()] +\n            '] LT[-kor]'\n        );\n    }\n\n    var hu = moment.defineLocale('hu', {\n        months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),\n        weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),\n        weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'YYYY.MM.DD.',\n            LL: 'YYYY. MMMM D.',\n            LLL: 'YYYY. MMMM D. H:mm',\n            LLLL: 'YYYY. MMMM D., dddd H:mm',\n        },\n        meridiemParse: /de|du/i,\n        isPM: function (input) {\n            return input.charAt(1).toLowerCase() === 'u';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower === true ? 'de' : 'DE';\n            } else {\n                return isLower === true ? 'du' : 'DU';\n            }\n        },\n        calendar: {\n            sameDay: '[ma] LT[-kor]',\n            nextDay: '[holnap] LT[-kor]',\n            nextWeek: function () {\n                return week.call(this, true);\n            },\n            lastDay: '[tegnap] LT[-kor]',\n            lastWeek: function () {\n                return week.call(this, false);\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s múlva',\n            past: '%s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return hu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Armenian [hy-am]\n//! author : Armendarabyan : https://github.com/armendarabyan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var hyAm = moment.defineLocale('hy-am', {\n        months: {\n            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(\n                '_'\n            ),\n            standalone:\n                'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n        weekdays:\n            'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(\n                '_'\n            ),\n        weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n        weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY թ.',\n            LLL: 'D MMMM YYYY թ., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY թ., HH:mm',\n        },\n        calendar: {\n            sameDay: '[այսօր] LT',\n            nextDay: '[վաղը] LT',\n            lastDay: '[երեկ] LT',\n            nextWeek: function () {\n                return 'dddd [օրը ժամը] LT';\n            },\n            lastWeek: function () {\n                return '[անցած] dddd [օրը ժամը] LT';\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s հետո',\n            past: '%s առաջ',\n            s: 'մի քանի վայրկյան',\n            ss: '%d վայրկյան',\n            m: 'րոպե',\n            mm: '%d րոպե',\n            h: 'ժամ',\n            hh: '%d ժամ',\n            d: 'օր',\n            dd: '%d օր',\n            M: 'ամիս',\n            MM: '%d ամիս',\n            y: 'տարի',\n            yy: '%d տարի',\n        },\n        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n        isPM: function (input) {\n            return /^(ցերեկվա|երեկոյան)$/.test(input);\n        },\n        meridiem: function (hour) {\n            if (hour < 4) {\n                return 'գիշերվա';\n            } else if (hour < 12) {\n                return 'առավոտվա';\n            } else if (hour < 17) {\n                return 'ցերեկվա';\n            } else {\n                return 'երեկոյան';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'DDD':\n                case 'w':\n                case 'W':\n                case 'DDDo':\n                    if (number === 1) {\n                        return number + '-ին';\n                    }\n                    return number + '-րդ';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return hyAm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Indonesian [id]\n//! author : Mohammad Satrio Utomo : https://github.com/tyok\n//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var id = moment.defineLocale('id', {\n        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),\n        weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),\n        weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),\n        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|siang|sore|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'siang') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'sore' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'siang';\n            } else if (hours < 19) {\n                return 'sore';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Besok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kemarin pukul] LT',\n            lastWeek: 'dddd [lalu pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lalu',\n            s: 'beberapa detik',\n            ss: '%d detik',\n            m: 'semenit',\n            mm: '%d menit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return id;\n\n})));\n","//! moment.js locale configuration\n//! locale : Icelandic [is]\n//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(n) {\n        if (n % 100 === 11) {\n            return true;\n        } else if (n % 10 === 1) {\n            return false;\n        }\n        return true;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's':\n                return withoutSuffix || isFuture\n                    ? 'nokkrar sekúndur'\n                    : 'nokkrum sekúndum';\n            case 'ss':\n                if (plural(number)) {\n                    return (\n                        result +\n                        (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')\n                    );\n                }\n                return result + 'sekúnda';\n            case 'm':\n                return withoutSuffix ? 'mínúta' : 'mínútu';\n            case 'mm':\n                if (plural(number)) {\n                    return (\n                        result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')\n                    );\n                } else if (withoutSuffix) {\n                    return result + 'mínúta';\n                }\n                return result + 'mínútu';\n            case 'hh':\n                if (plural(number)) {\n                    return (\n                        result +\n                        (withoutSuffix || isFuture\n                            ? 'klukkustundir'\n                            : 'klukkustundum')\n                    );\n                }\n                return result + 'klukkustund';\n            case 'd':\n                if (withoutSuffix) {\n                    return 'dagur';\n                }\n                return isFuture ? 'dag' : 'degi';\n            case 'dd':\n                if (plural(number)) {\n                    if (withoutSuffix) {\n                        return result + 'dagar';\n                    }\n                    return result + (isFuture ? 'daga' : 'dögum');\n                } else if (withoutSuffix) {\n                    return result + 'dagur';\n                }\n                return result + (isFuture ? 'dag' : 'degi');\n            case 'M':\n                if (withoutSuffix) {\n                    return 'mánuður';\n                }\n                return isFuture ? 'mánuð' : 'mánuði';\n            case 'MM':\n                if (plural(number)) {\n                    if (withoutSuffix) {\n                        return result + 'mánuðir';\n                    }\n                    return result + (isFuture ? 'mánuði' : 'mánuðum');\n                } else if (withoutSuffix) {\n                    return result + 'mánuður';\n                }\n                return result + (isFuture ? 'mánuð' : 'mánuði');\n            case 'y':\n                return withoutSuffix || isFuture ? 'ár' : 'ári';\n            case 'yy':\n                if (plural(number)) {\n                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');\n                }\n                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');\n        }\n    }\n\n    var is = moment.defineLocale('is', {\n        months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),\n        weekdays:\n            'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(\n                '_'\n            ),\n        weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),\n        weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] H:mm',\n            LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',\n        },\n        calendar: {\n            sameDay: '[í dag kl.] LT',\n            nextDay: '[á morgun kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[í gær kl.] LT',\n            lastWeek: '[síðasta] dddd [kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'eftir %s',\n            past: 'fyrir %s síðan',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: 'klukkustund',\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return is;\n\n})));\n","//! moment.js locale configuration\n//! locale : Italian (Switzerland) [it-ch]\n//! author : xfh : https://github.com/xfh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var itCh = moment.defineLocale('it-ch', {\n        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n            '_'\n        ),\n        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(\n            '_'\n        ),\n        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Oggi alle] LT',\n            nextDay: '[Domani alle] LT',\n            nextWeek: 'dddd [alle] LT',\n            lastDay: '[Ieri alle] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[la scorsa] dddd [alle] LT';\n                    default:\n                        return '[lo scorso] dddd [alle] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (s) {\n                return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;\n            },\n            past: '%s fa',\n            s: 'alcuni secondi',\n            ss: '%d secondi',\n            m: 'un minuto',\n            mm: '%d minuti',\n            h: \"un'ora\",\n            hh: '%d ore',\n            d: 'un giorno',\n            dd: '%d giorni',\n            M: 'un mese',\n            MM: '%d mesi',\n            y: 'un anno',\n            yy: '%d anni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return itCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Italian [it]\n//! author : Lorenzo : https://github.com/aliem\n//! author: Mattia Larentis: https://github.com/nostalgiaz\n//! author: Marco : https://github.com/Manfre98\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var it = moment.defineLocale('it', {\n        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n            '_'\n        ),\n        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(\n            '_'\n        ),\n        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return (\n                    '[Oggi a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextDay: function () {\n                return (\n                    '[Domani a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextWeek: function () {\n                return (\n                    'dddd [a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastDay: function () {\n                return (\n                    '[Ieri a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return (\n                            '[La scorsa] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                    default:\n                        return (\n                            '[Lo scorso] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'tra %s',\n            past: '%s fa',\n            s: 'alcuni secondi',\n            ss: '%d secondi',\n            m: 'un minuto',\n            mm: '%d minuti',\n            h: \"un'ora\",\n            hh: '%d ore',\n            d: 'un giorno',\n            dd: '%d giorni',\n            w: 'una settimana',\n            ww: '%d settimane',\n            M: 'un mese',\n            MM: '%d mesi',\n            y: 'un anno',\n            yy: '%d anni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return it;\n\n})));\n","//! moment.js locale configuration\n//! locale : Japanese [ja]\n//! author : LI Long : https://github.com/baryon\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ja = moment.defineLocale('ja', {\n        eras: [\n            {\n                since: '2019-05-01',\n                offset: 1,\n                name: '令和',\n                narrow: '㋿',\n                abbr: 'R',\n            },\n            {\n                since: '1989-01-08',\n                until: '2019-04-30',\n                offset: 1,\n                name: '平成',\n                narrow: '㍻',\n                abbr: 'H',\n            },\n            {\n                since: '1926-12-25',\n                until: '1989-01-07',\n                offset: 1,\n                name: '昭和',\n                narrow: '㍼',\n                abbr: 'S',\n            },\n            {\n                since: '1912-07-30',\n                until: '1926-12-24',\n                offset: 1,\n                name: '大正',\n                narrow: '㍽',\n                abbr: 'T',\n            },\n            {\n                since: '1873-01-01',\n                until: '1912-07-29',\n                offset: 6,\n                name: '明治',\n                narrow: '㍾',\n                abbr: 'M',\n            },\n            {\n                since: '0001-01-01',\n                until: '1873-12-31',\n                offset: 1,\n                name: '西暦',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: '紀元前',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        eraYearOrdinalRegex: /(元|\\d+)年/,\n        eraYearOrdinalParse: function (input, match) {\n            return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);\n        },\n        months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n        weekdaysShort: '日_月_火_水_木_金_土'.split('_'),\n        weekdaysMin: '日_月_火_水_木_金_土'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日 dddd HH:mm',\n            l: 'YYYY/MM/DD',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日(ddd) HH:mm',\n        },\n        meridiemParse: /午前|午後/i,\n        isPM: function (input) {\n            return input === '午後';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return '午前';\n            } else {\n                return '午後';\n            }\n        },\n        calendar: {\n            sameDay: '[今日] LT',\n            nextDay: '[明日] LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    return '[来週]dddd LT';\n                } else {\n                    return 'dddd LT';\n                }\n            },\n            lastDay: '[昨日] LT',\n            lastWeek: function (now) {\n                if (this.week() !== now.week()) {\n                    return '[先週]dddd LT';\n                } else {\n                    return 'dddd LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}日/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'y':\n                    return number === 1 ? '元年' : number + '年';\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '数秒',\n            ss: '%d秒',\n            m: '1分',\n            mm: '%d分',\n            h: '1時間',\n            hh: '%d時間',\n            d: '1日',\n            dd: '%d日',\n            M: '1ヶ月',\n            MM: '%dヶ月',\n            y: '1年',\n            yy: '%d年',\n        },\n    });\n\n    return ja;\n\n})));\n","//! moment.js locale configuration\n//! locale : Javanese [jv]\n//! author : Rony Lantip : https://github.com/lantip\n//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var jv = moment.defineLocale('jv', {\n        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),\n        weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),\n        weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),\n        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /enjing|siyang|sonten|ndalu/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'enjing') {\n                return hour;\n            } else if (meridiem === 'siyang') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'enjing';\n            } else if (hours < 15) {\n                return 'siyang';\n            } else if (hours < 19) {\n                return 'sonten';\n            } else {\n                return 'ndalu';\n            }\n        },\n        calendar: {\n            sameDay: '[Dinten puniko pukul] LT',\n            nextDay: '[Mbenjang pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kala wingi pukul] LT',\n            lastWeek: 'dddd [kepengker pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'wonten ing %s',\n            past: '%s ingkang kepengker',\n            s: 'sawetawis detik',\n            ss: '%d detik',\n            m: 'setunggal menit',\n            mm: '%d menit',\n            h: 'setunggal jam',\n            hh: '%d jam',\n            d: 'sedinten',\n            dd: '%d dinten',\n            M: 'sewulan',\n            MM: '%d wulan',\n            y: 'setaun',\n            yy: '%d taun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return jv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Georgian [ka]\n//! author : Irakli Janiashvili : https://github.com/IrakliJani\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ka = moment.defineLocale('ka', {\n        months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(\n            '_'\n        ),\n        monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n        weekdays: {\n            standalone:\n                'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(\n                    '_'\n                ),\n            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(\n                '_'\n            ),\n            isFormat: /(წინა|შემდეგ)/,\n        },\n        weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n        weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[დღეს] LT[-ზე]',\n            nextDay: '[ხვალ] LT[-ზე]',\n            lastDay: '[გუშინ] LT[-ზე]',\n            nextWeek: '[შემდეგ] dddd LT[-ზე]',\n            lastWeek: '[წინა] dddd LT-ზე',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (s) {\n                return s.replace(\n                    /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,\n                    function ($0, $1, $2) {\n                        return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';\n                    }\n                );\n            },\n            past: function (s) {\n                if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {\n                    return s.replace(/(ი|ე)$/, 'ის წინ');\n                }\n                if (/წელი/.test(s)) {\n                    return s.replace(/წელი$/, 'წლის წინ');\n                }\n                return s;\n            },\n            s: 'რამდენიმე წამი',\n            ss: '%d წამი',\n            m: 'წუთი',\n            mm: '%d წუთი',\n            h: 'საათი',\n            hh: '%d საათი',\n            d: 'დღე',\n            dd: '%d დღე',\n            M: 'თვე',\n            MM: '%d თვე',\n            y: 'წელი',\n            yy: '%d წელი',\n        },\n        dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n        ordinal: function (number) {\n            if (number === 0) {\n                return number;\n            }\n            if (number === 1) {\n                return number + '-ლი';\n            }\n            if (\n                number < 20 ||\n                (number <= 100 && number % 20 === 0) ||\n                number % 100 === 0\n            ) {\n                return 'მე-' + number;\n            }\n            return number + '-ე';\n        },\n        week: {\n            dow: 1,\n            doy: 7,\n        },\n    });\n\n    return ka;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kazakh [kk]\n//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-ші',\n        1: '-ші',\n        2: '-ші',\n        3: '-ші',\n        4: '-ші',\n        5: '-ші',\n        6: '-шы',\n        7: '-ші',\n        8: '-ші',\n        9: '-шы',\n        10: '-шы',\n        20: '-шы',\n        30: '-шы',\n        40: '-шы',\n        50: '-ші',\n        60: '-шы',\n        70: '-ші',\n        80: '-ші',\n        90: '-шы',\n        100: '-ші',\n    };\n\n    var kk = moment.defineLocale('kk', {\n        months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(\n            '_'\n        ),\n        monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n        weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(\n            '_'\n        ),\n        weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n        weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бүгін сағат] LT',\n            nextDay: '[Ертең сағат] LT',\n            nextWeek: 'dddd [сағат] LT',\n            lastDay: '[Кеше сағат] LT',\n            lastWeek: '[Өткен аптаның] dddd [сағат] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ішінде',\n            past: '%s бұрын',\n            s: 'бірнеше секунд',\n            ss: '%d секунд',\n            m: 'бір минут',\n            mm: '%d минут',\n            h: 'бір сағат',\n            hh: '%d сағат',\n            d: 'бір күн',\n            dd: '%d күн',\n            M: 'бір ай',\n            MM: '%d ай',\n            y: 'бір жыл',\n            yy: '%d жыл',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return kk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Cambodian [km]\n//! author : Kruy Vanna : https://github.com/kruyvanna\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '១',\n            2: '២',\n            3: '៣',\n            4: '៤',\n            5: '៥',\n            6: '៦',\n            7: '៧',\n            8: '៨',\n            9: '៩',\n            0: '០',\n        },\n        numberMap = {\n            '១': '1',\n            '២': '2',\n            '៣': '3',\n            '៤': '4',\n            '៥': '5',\n            '៦': '6',\n            '៧': '7',\n            '៨': '8',\n            '៩': '9',\n            '០': '0',\n        };\n\n    var km = moment.defineLocale('km', {\n        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(\n            '_'\n        ),\n        monthsShort:\n            'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(\n                '_'\n            ),\n        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n        weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n        weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ព្រឹក|ល្ងាច/,\n        isPM: function (input) {\n            return input === 'ល្ងាច';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ព្រឹក';\n            } else {\n                return 'ល្ងាច';\n            }\n        },\n        calendar: {\n            sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',\n            nextDay: '[ស្អែក ម៉ោង] LT',\n            nextWeek: 'dddd [ម៉ោង] LT',\n            lastDay: '[ម្សិលមិញ ម៉ោង] LT',\n            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sទៀត',\n            past: '%sមុន',\n            s: 'ប៉ុន្មានវិនាទី',\n            ss: '%d វិនាទី',\n            m: 'មួយនាទី',\n            mm: '%d នាទី',\n            h: 'មួយម៉ោង',\n            hh: '%d ម៉ោង',\n            d: 'មួយថ្ងៃ',\n            dd: '%d ថ្ងៃ',\n            M: 'មួយខែ',\n            MM: '%d ខែ',\n            y: 'មួយឆ្នាំ',\n            yy: '%d ឆ្នាំ',\n        },\n        dayOfMonthOrdinalParse: /ទី\\d{1,2}/,\n        ordinal: 'ទី%d',\n        preparse: function (string) {\n            return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return km;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kannada [kn]\n//! author : Rajeev Naik : https://github.com/rajeevnaikte\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '೧',\n            2: '೨',\n            3: '೩',\n            4: '೪',\n            5: '೫',\n            6: '೬',\n            7: '೭',\n            8: '೮',\n            9: '೯',\n            0: '೦',\n        },\n        numberMap = {\n            '೧': '1',\n            '೨': '2',\n            '೩': '3',\n            '೪': '4',\n            '೫': '5',\n            '೬': '6',\n            '೭': '7',\n            '೮': '8',\n            '೯': '9',\n            '೦': '0',\n        };\n\n    var kn = moment.defineLocale('kn', {\n        months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(\n            '_'\n        ),\n        monthsShort:\n            'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(\n            '_'\n        ),\n        weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),\n        weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[ಇಂದು] LT',\n            nextDay: '[ನಾಳೆ] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ನಿನ್ನೆ] LT',\n            lastWeek: '[ಕೊನೆಯ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ನಂತರ',\n            past: '%s ಹಿಂದೆ',\n            s: 'ಕೆಲವು ಕ್ಷಣಗಳು',\n            ss: '%d ಸೆಕೆಂಡುಗಳು',\n            m: 'ಒಂದು ನಿಮಿಷ',\n            mm: '%d ನಿಮಿಷ',\n            h: 'ಒಂದು ಗಂಟೆ',\n            hh: '%d ಗಂಟೆ',\n            d: 'ಒಂದು ದಿನ',\n            dd: '%d ದಿನ',\n            M: 'ಒಂದು ತಿಂಗಳು',\n            MM: '%d ತಿಂಗಳು',\n            y: 'ಒಂದು ವರ್ಷ',\n            yy: '%d ವರ್ಷ',\n        },\n        preparse: function (string) {\n            return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ರಾತ್ರಿ') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {\n                return hour;\n            } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'ಸಂಜೆ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ರಾತ್ರಿ';\n            } else if (hour < 10) {\n                return 'ಬೆಳಿಗ್ಗೆ';\n            } else if (hour < 17) {\n                return 'ಮಧ್ಯಾಹ್ನ';\n            } else if (hour < 20) {\n                return 'ಸಂಜೆ';\n            } else {\n                return 'ರಾತ್ರಿ';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ನೇ)/,\n        ordinal: function (number) {\n            return number + 'ನೇ';\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return kn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Korean [ko]\n//! author : Kyungwook, Park : https://github.com/kyungw00k\n//! author : Jeeeyul Lee <jeeeyul@gmail.com>\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ko = moment.defineLocale('ko', {\n        months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n        monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(\n            '_'\n        ),\n        weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n        weekdaysShort: '일_월_화_수_목_금_토'.split('_'),\n        weekdaysMin: '일_월_화_수_목_금_토'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'YYYY.MM.DD.',\n            LL: 'YYYY년 MMMM D일',\n            LLL: 'YYYY년 MMMM D일 A h:mm',\n            LLLL: 'YYYY년 MMMM D일 dddd A h:mm',\n            l: 'YYYY.MM.DD.',\n            ll: 'YYYY년 MMMM D일',\n            lll: 'YYYY년 MMMM D일 A h:mm',\n            llll: 'YYYY년 MMMM D일 dddd A h:mm',\n        },\n        calendar: {\n            sameDay: '오늘 LT',\n            nextDay: '내일 LT',\n            nextWeek: 'dddd LT',\n            lastDay: '어제 LT',\n            lastWeek: '지난주 dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s 후',\n            past: '%s 전',\n            s: '몇 초',\n            ss: '%d초',\n            m: '1분',\n            mm: '%d분',\n            h: '한 시간',\n            hh: '%d시간',\n            d: '하루',\n            dd: '%d일',\n            M: '한 달',\n            MM: '%d달',\n            y: '일 년',\n            yy: '%d년',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(일|월|주)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '일';\n                case 'M':\n                    return number + '월';\n                case 'w':\n                case 'W':\n                    return number + '주';\n                default:\n                    return number;\n            }\n        },\n        meridiemParse: /오전|오후/,\n        isPM: function (token) {\n            return token === '오후';\n        },\n        meridiem: function (hour, minute, isUpper) {\n            return hour < 12 ? '오전' : '오후';\n        },\n    });\n\n    return ko;\n\n})));\n","//! moment.js locale configuration\n//! locale : Northern Kurdish [ku-kmr]\n//! authors : Mazlum Özdogan : https://github.com/mergehez\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(num, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['çend sanîye', 'çend sanîyeyan'],\n            ss: [num + ' sanîye', num + ' sanîyeyan'],\n            m: ['deqîqeyek', 'deqîqeyekê'],\n            mm: [num + ' deqîqe', num + ' deqîqeyan'],\n            h: ['saetek', 'saetekê'],\n            hh: [num + ' saet', num + ' saetan'],\n            d: ['rojek', 'rojekê'],\n            dd: [num + ' roj', num + ' rojan'],\n            w: ['hefteyek', 'hefteyekê'],\n            ww: [num + ' hefte', num + ' hefteyan'],\n            M: ['mehek', 'mehekê'],\n            MM: [num + ' meh', num + ' mehan'],\n            y: ['salek', 'salekê'],\n            yy: [num + ' sal', num + ' salan'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n    // function obliqueNumSuffix(num) {\n    //     if(num.includes(':'))\n    //         num = parseInt(num.split(':')[0]);\n    //     else\n    //         num = parseInt(num);\n    //     return num == 0 || num % 10 == 1 ? 'ê'\n    //                         : (num > 10 && num % 10 == 0 ? 'î' : 'an');\n    // }\n    function ezafeNumSuffix(num) {\n        num = '' + num;\n        var l = num.substring(num.length - 1),\n            ll = num.length > 1 ? num.substring(num.length - 2) : '';\n        if (\n            !(ll == 12 || ll == 13) &&\n            (l == '2' || l == '3' || ll == '50' || l == '70' || l == '80')\n        )\n            return 'yê';\n        return 'ê';\n    }\n\n    var kuKmr = moment.defineLocale('ku-kmr', {\n        // According to the spelling rules defined by the work group of Weqfa Mezopotamyayê (Mesopotamia Foundation)\n        // this should be: 'Kanûna Paşîn_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Çirîya Pêşîn_Çirîya Paşîn_Kanûna Pêşîn'\n        // But the names below are more well known and handy\n        months: 'Rêbendan_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Cotmeh_Mijdar_Berfanbar'.split(\n            '_'\n        ),\n        monthsShort: 'Rêb_Sib_Ada_Nîs_Gul_Hez_Tîr_Teb_Îlo_Cot_Mij_Ber'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'Yekşem_Duşem_Sêşem_Çarşem_Pêncşem_În_Şemî'.split('_'),\n        weekdaysShort: 'Yek_Du_Sê_Çar_Pên_În_Şem'.split('_'),\n        weekdaysMin: 'Ye_Du_Sê_Ça_Pê_În_Şe'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'bn' : 'BN';\n            } else {\n                return isLower ? 'pn' : 'PN';\n            }\n        },\n        meridiemParse: /bn|BN|pn|PN/,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM[a] YYYY[an]',\n            LLL: 'Do MMMM[a] YYYY[an] HH:mm',\n            LLLL: 'dddd, Do MMMM[a] YYYY[an] HH:mm',\n            ll: 'Do MMM[.] YYYY[an]',\n            lll: 'Do MMM[.] YYYY[an] HH:mm',\n            llll: 'ddd[.], Do MMM[.] YYYY[an] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Îro di saet] LT [de]',\n            nextDay: '[Sibê di saet] LT [de]',\n            nextWeek: 'dddd [di saet] LT [de]',\n            lastDay: '[Duh di saet] LT [de]',\n            lastWeek: 'dddd[a borî di saet] LT [de]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'di %s de',\n            past: 'berî %s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(?:yê|ê|\\.)/,\n        ordinal: function (num, period) {\n            var p = period.toLowerCase();\n            if (p.includes('w') || p.includes('m')) return num + '.';\n\n            return num + ezafeNumSuffix(num);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return kuKmr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kurdish [ku]\n//! author : Shahram Mebashar : https://github.com/ShahramMebashar\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        },\n        months = [\n            'کانونی دووەم',\n            'شوبات',\n            'ئازار',\n            'نیسان',\n            'ئایار',\n            'حوزەیران',\n            'تەمموز',\n            'ئاب',\n            'ئەیلوول',\n            'تشرینی یەكەم',\n            'تشرینی دووەم',\n            'كانونی یەکەم',\n        ];\n\n    var ku = moment.defineLocale('ku', {\n        months: months,\n        monthsShort: months,\n        weekdays:\n            'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(\n                '_'\n            ),\n        weekdaysShort:\n            'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),\n        weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ئێواره‌|به‌یانی/,\n        isPM: function (input) {\n            return /ئێواره‌/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'به‌یانی';\n            } else {\n                return 'ئێواره‌';\n            }\n        },\n        calendar: {\n            sameDay: '[ئه‌مرۆ كاتژمێر] LT',\n            nextDay: '[به‌یانی كاتژمێر] LT',\n            nextWeek: 'dddd [كاتژمێر] LT',\n            lastDay: '[دوێنێ كاتژمێر] LT',\n            lastWeek: 'dddd [كاتژمێر] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'له‌ %s',\n            past: '%s',\n            s: 'چه‌ند چركه‌یه‌ك',\n            ss: 'چركه‌ %d',\n            m: 'یه‌ك خوله‌ك',\n            mm: '%d خوله‌ك',\n            h: 'یه‌ك كاتژمێر',\n            hh: '%d كاتژمێر',\n            d: 'یه‌ك ڕۆژ',\n            dd: '%d ڕۆژ',\n            M: 'یه‌ك مانگ',\n            MM: '%d مانگ',\n            y: 'یه‌ك ساڵ',\n            yy: '%d ساڵ',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return ku;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kyrgyz [ky]\n//! author : Chyngyz Arystan uulu : https://github.com/chyngyz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-чү',\n        1: '-чи',\n        2: '-чи',\n        3: '-чү',\n        4: '-чү',\n        5: '-чи',\n        6: '-чы',\n        7: '-чи',\n        8: '-чи',\n        9: '-чу',\n        10: '-чу',\n        20: '-чы',\n        30: '-чу',\n        40: '-чы',\n        50: '-чү',\n        60: '-чы',\n        70: '-чи',\n        80: '-чи',\n        90: '-чу',\n        100: '-чү',\n    };\n\n    var ky = moment.defineLocale('ky', {\n        months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(\n            '_'\n        ),\n        monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(\n            '_'\n        ),\n        weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(\n            '_'\n        ),\n        weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),\n        weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бүгүн саат] LT',\n            nextDay: '[Эртең саат] LT',\n            nextWeek: 'dddd [саат] LT',\n            lastDay: '[Кечээ саат] LT',\n            lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ичинде',\n            past: '%s мурун',\n            s: 'бирнече секунд',\n            ss: '%d секунд',\n            m: 'бир мүнөт',\n            mm: '%d мүнөт',\n            h: 'бир саат',\n            hh: '%d саат',\n            d: 'бир күн',\n            dd: '%d күн',\n            M: 'бир ай',\n            MM: '%d ай',\n            y: 'бир жыл',\n            yy: '%d жыл',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(чи|чы|чү|чу)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ky;\n\n})));\n","//! moment.js locale configuration\n//! locale : Luxembourgish [lb]\n//! author : mweimerskirch : https://github.com/mweimerskirch\n//! author : David Raison : https://github.com/kwisatz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eng Minutt', 'enger Minutt'],\n            h: ['eng Stonn', 'enger Stonn'],\n            d: ['een Dag', 'engem Dag'],\n            M: ['ee Mount', 'engem Mount'],\n            y: ['ee Joer', 'engem Joer'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n    function processFutureTime(string) {\n        var number = string.substr(0, string.indexOf(' '));\n        if (eifelerRegelAppliesToNumber(number)) {\n            return 'a ' + string;\n        }\n        return 'an ' + string;\n    }\n    function processPastTime(string) {\n        var number = string.substr(0, string.indexOf(' '));\n        if (eifelerRegelAppliesToNumber(number)) {\n            return 'viru ' + string;\n        }\n        return 'virun ' + string;\n    }\n    /**\n     * Returns true if the word before the given number loses the '-n' ending.\n     * e.g. 'an 10 Deeg' but 'a 5 Deeg'\n     *\n     * @param number {integer}\n     * @returns {boolean}\n     */\n    function eifelerRegelAppliesToNumber(number) {\n        number = parseInt(number, 10);\n        if (isNaN(number)) {\n            return false;\n        }\n        if (number < 0) {\n            // Negative Number --> always true\n            return true;\n        } else if (number < 10) {\n            // Only 1 digit\n            if (4 <= number && number <= 7) {\n                return true;\n            }\n            return false;\n        } else if (number < 100) {\n            // 2 digits\n            var lastDigit = number % 10,\n                firstDigit = number / 10;\n            if (lastDigit === 0) {\n                return eifelerRegelAppliesToNumber(firstDigit);\n            }\n            return eifelerRegelAppliesToNumber(lastDigit);\n        } else if (number < 10000) {\n            // 3 or 4 digits --> recursively check first digit\n            while (number >= 10) {\n                number = number / 10;\n            }\n            return eifelerRegelAppliesToNumber(number);\n        } else {\n            // Anything larger than 4 digits: recursively check first n-3 digits\n            number = number / 1000;\n            return eifelerRegelAppliesToNumber(number);\n        }\n    }\n\n    var lb = moment.defineLocale('lb', {\n        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm [Auer]',\n            LTS: 'H:mm:ss [Auer]',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm [Auer]',\n            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',\n        },\n        calendar: {\n            sameDay: '[Haut um] LT',\n            sameElse: 'L',\n            nextDay: '[Muer um] LT',\n            nextWeek: 'dddd [um] LT',\n            lastDay: '[Gëschter um] LT',\n            lastWeek: function () {\n                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule\n                switch (this.day()) {\n                    case 2:\n                    case 4:\n                        return '[Leschten] dddd [um] LT';\n                    default:\n                        return '[Leschte] dddd [um] LT';\n                }\n            },\n        },\n        relativeTime: {\n            future: processFutureTime,\n            past: processPastTime,\n            s: 'e puer Sekonnen',\n            ss: '%d Sekonnen',\n            m: processRelativeTime,\n            mm: '%d Minutten',\n            h: processRelativeTime,\n            hh: '%d Stonnen',\n            d: processRelativeTime,\n            dd: '%d Deeg',\n            M: processRelativeTime,\n            MM: '%d Méint',\n            y: processRelativeTime,\n            yy: '%d Joer',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lb;\n\n})));\n","//! moment.js locale configuration\n//! locale : Lao [lo]\n//! author : Ryan Hart : https://github.com/ryanhart2\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var lo = moment.defineLocale('lo', {\n        months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n                '_'\n            ),\n        weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n        weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n        weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'ວັນdddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n        isPM: function (input) {\n            return input === 'ຕອນແລງ';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ຕອນເຊົ້າ';\n            } else {\n                return 'ຕອນແລງ';\n            }\n        },\n        calendar: {\n            sameDay: '[ມື້ນີ້ເວລາ] LT',\n            nextDay: '[ມື້ອື່ນເວລາ] LT',\n            nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',\n            lastDay: '[ມື້ວານນີ້ເວລາ] LT',\n            lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ອີກ %s',\n            past: '%sຜ່ານມາ',\n            s: 'ບໍ່ເທົ່າໃດວິນາທີ',\n            ss: '%d ວິນາທີ',\n            m: '1 ນາທີ',\n            mm: '%d ນາທີ',\n            h: '1 ຊົ່ວໂມງ',\n            hh: '%d ຊົ່ວໂມງ',\n            d: '1 ມື້',\n            dd: '%d ມື້',\n            M: '1 ເດືອນ',\n            MM: '%d ເດືອນ',\n            y: '1 ປີ',\n            yy: '%d ປີ',\n        },\n        dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n        ordinal: function (number) {\n            return 'ທີ່' + number;\n        },\n    });\n\n    return lo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Lithuanian [lt]\n//! author : Mindaugas Mozūras : https://github.com/mmozuras\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var units = {\n        ss: 'sekundė_sekundžių_sekundes',\n        m: 'minutė_minutės_minutę',\n        mm: 'minutės_minučių_minutes',\n        h: 'valanda_valandos_valandą',\n        hh: 'valandos_valandų_valandas',\n        d: 'diena_dienos_dieną',\n        dd: 'dienos_dienų_dienas',\n        M: 'mėnuo_mėnesio_mėnesį',\n        MM: 'mėnesiai_mėnesių_mėnesius',\n        y: 'metai_metų_metus',\n        yy: 'metai_metų_metus',\n    };\n    function translateSeconds(number, withoutSuffix, key, isFuture) {\n        if (withoutSuffix) {\n            return 'kelios sekundės';\n        } else {\n            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n        }\n    }\n    function translateSingular(number, withoutSuffix, key, isFuture) {\n        return withoutSuffix\n            ? forms(key)[0]\n            : isFuture\n              ? forms(key)[1]\n              : forms(key)[2];\n    }\n    function special(number) {\n        return number % 10 === 0 || (number > 10 && number < 20);\n    }\n    function forms(key) {\n        return units[key].split('_');\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        if (number === 1) {\n            return (\n                result + translateSingular(number, withoutSuffix, key[0], isFuture)\n            );\n        } else if (withoutSuffix) {\n            return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n        } else {\n            if (isFuture) {\n                return result + forms(key)[1];\n            } else {\n                return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n            }\n        }\n    }\n    var lt = moment.defineLocale('lt', {\n        months: {\n            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(\n                '_'\n            ),\n            standalone:\n                'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(\n                    '_'\n                ),\n            isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/,\n        },\n        monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n        weekdays: {\n            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(\n                '_'\n            ),\n            standalone:\n                'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(\n                    '_'\n                ),\n            isFormat: /dddd HH:mm/,\n        },\n        weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n        weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY [m.] MMMM D [d.]',\n            LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n            LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n            l: 'YYYY-MM-DD',\n            ll: 'YYYY [m.] MMMM D [d.]',\n            lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n            llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',\n        },\n        calendar: {\n            sameDay: '[Šiandien] LT',\n            nextDay: '[Rytoj] LT',\n            nextWeek: 'dddd LT',\n            lastDay: '[Vakar] LT',\n            lastWeek: '[Praėjusį] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'po %s',\n            past: 'prieš %s',\n            s: translateSeconds,\n            ss: translate,\n            m: translateSingular,\n            mm: translate,\n            h: translateSingular,\n            hh: translate,\n            d: translateSingular,\n            dd: translate,\n            M: translateSingular,\n            MM: translate,\n            y: translateSingular,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n        ordinal: function (number) {\n            return number + '-oji';\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Latvian [lv]\n//! author : Kristaps Karlsons : https://github.com/skakri\n//! author : Jānis Elmeris : https://github.com/JanisE\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var units = {\n        ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n        m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n        mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n        h: 'stundas_stundām_stunda_stundas'.split('_'),\n        hh: 'stundas_stundām_stunda_stundas'.split('_'),\n        d: 'dienas_dienām_diena_dienas'.split('_'),\n        dd: 'dienas_dienām_diena_dienas'.split('_'),\n        M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n        MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n        y: 'gada_gadiem_gads_gadi'.split('_'),\n        yy: 'gada_gadiem_gads_gadi'.split('_'),\n    };\n    /**\n     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n     */\n    function format(forms, number, withoutSuffix) {\n        if (withoutSuffix) {\n            // E.g. \"21 minūte\", \"3 minūtes\".\n            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n        } else {\n            // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n            // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n        }\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        return number + ' ' + format(units[key], number, withoutSuffix);\n    }\n    function relativeTimeWithSingular(number, withoutSuffix, key) {\n        return format(units[key], number, withoutSuffix);\n    }\n    function relativeSeconds(number, withoutSuffix) {\n        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n    }\n\n    var lv = moment.defineLocale('lv', {\n        months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n        weekdays:\n            'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(\n                '_'\n            ),\n        weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),\n        weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY.',\n            LL: 'YYYY. [gada] D. MMMM',\n            LLL: 'YYYY. [gada] D. MMMM, HH:mm',\n            LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',\n        },\n        calendar: {\n            sameDay: '[Šodien pulksten] LT',\n            nextDay: '[Rīt pulksten] LT',\n            nextWeek: 'dddd [pulksten] LT',\n            lastDay: '[Vakar pulksten] LT',\n            lastWeek: '[Pagājušā] dddd [pulksten] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'pēc %s',\n            past: 'pirms %s',\n            s: relativeSeconds,\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithSingular,\n            mm: relativeTimeWithPlural,\n            h: relativeTimeWithSingular,\n            hh: relativeTimeWithPlural,\n            d: relativeTimeWithSingular,\n            dd: relativeTimeWithPlural,\n            M: relativeTimeWithSingular,\n            MM: relativeTimeWithPlural,\n            y: relativeTimeWithSingular,\n            yy: relativeTimeWithPlural,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Montenegrin [me]\n//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['sekund', 'sekunda', 'sekundi'],\n            m: ['jedan minut', 'jednog minuta'],\n            mm: ['minut', 'minuta', 'minuta'],\n            h: ['jedan sat', 'jednog sata'],\n            hh: ['sat', 'sata', 'sati'],\n            dd: ['dan', 'dana', 'dana'],\n            MM: ['mjesec', 'mjeseca', 'mjeseci'],\n            yy: ['godina', 'godine', 'godina'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            return number === 1\n                ? wordKey[0]\n                : number >= 2 && number <= 4\n                  ? wordKey[1]\n                  : wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key) {\n            var wordKey = translator.words[key];\n            if (key.length === 1) {\n                return withoutSuffix ? wordKey[0] : wordKey[1];\n            } else {\n                return (\n                    number +\n                    ' ' +\n                    translator.correctGrammaticalCase(number, wordKey)\n                );\n            }\n        },\n    };\n\n    var me = moment.defineLocale('me', {\n        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sjutra u] LT',\n\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[juče u] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[prošle] [nedjelje] [u] LT',\n                    '[prošlog] [ponedjeljka] [u] LT',\n                    '[prošlog] [utorka] [u] LT',\n                    '[prošle] [srijede] [u] LT',\n                    '[prošlog] [četvrtka] [u] LT',\n                    '[prošlog] [petka] [u] LT',\n                    '[prošle] [subote] [u] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'nekoliko sekundi',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: 'dan',\n            dd: translator.translate,\n            M: 'mjesec',\n            MM: translator.translate,\n            y: 'godinu',\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return me;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maori [mi]\n//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mi = moment.defineLocale('mi', {\n        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(\n            '_'\n        ),\n        monthsShort:\n            'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(\n                '_'\n            ),\n        monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [i] HH:mm',\n            LLLL: 'dddd, D MMMM YYYY [i] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i teie mahana, i] LT',\n            nextDay: '[apopo i] LT',\n            nextWeek: 'dddd [i] LT',\n            lastDay: '[inanahi i] LT',\n            lastWeek: 'dddd [whakamutunga i] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'i roto i %s',\n            past: '%s i mua',\n            s: 'te hēkona ruarua',\n            ss: '%d hēkona',\n            m: 'he meneti',\n            mm: '%d meneti',\n            h: 'te haora',\n            hh: '%d haora',\n            d: 'he ra',\n            dd: '%d ra',\n            M: 'he marama',\n            MM: '%d marama',\n            y: 'he tau',\n            yy: '%d tau',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return mi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Macedonian [mk]\n//! author : Borislav Mickov : https://github.com/B0k0\n//! author : Sashko Todorov : https://github.com/bkyceh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mk = moment.defineLocale('mk', {\n        months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(\n            '_'\n        ),\n        monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n        weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(\n            '_'\n        ),\n        weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n        weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Денес во] LT',\n            nextDay: '[Утре во] LT',\n            nextWeek: '[Во] dddd [во] LT',\n            lastDay: '[Вчера во] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 6:\n                        return '[Изминатата] dddd [во] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[Изминатиот] dddd [во] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: 'пред %s',\n            s: 'неколку секунди',\n            ss: '%d секунди',\n            m: 'една минута',\n            mm: '%d минути',\n            h: 'еден час',\n            hh: '%d часа',\n            d: 'еден ден',\n            dd: '%d дена',\n            M: 'еден месец',\n            MM: '%d месеци',\n            y: 'една година',\n            yy: '%d години',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n        ordinal: function (number) {\n            var lastDigit = number % 10,\n                last2Digits = number % 100;\n            if (number === 0) {\n                return number + '-ев';\n            } else if (last2Digits === 0) {\n                return number + '-ен';\n            } else if (last2Digits > 10 && last2Digits < 20) {\n                return number + '-ти';\n            } else if (lastDigit === 1) {\n                return number + '-ви';\n            } else if (lastDigit === 2) {\n                return number + '-ри';\n            } else if (lastDigit === 7 || lastDigit === 8) {\n                return number + '-ми';\n            } else {\n                return number + '-ти';\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return mk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malayalam [ml]\n//! author : Floyd Pink : https://github.com/floydpink\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ml = moment.defineLocale('ml', {\n        months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(\n                '_'\n            ),\n        weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),\n        weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm -നു',\n            LTS: 'A h:mm:ss -നു',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm -നു',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',\n        },\n        calendar: {\n            sameDay: '[ഇന്ന്] LT',\n            nextDay: '[നാളെ] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ഇന്നലെ] LT',\n            lastWeek: '[കഴിഞ്ഞ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s കഴിഞ്ഞ്',\n            past: '%s മുൻപ്',\n            s: 'അൽപ നിമിഷങ്ങൾ',\n            ss: '%d സെക്കൻഡ്',\n            m: 'ഒരു മിനിറ്റ്',\n            mm: '%d മിനിറ്റ്',\n            h: 'ഒരു മണിക്കൂർ',\n            hh: '%d മണിക്കൂർ',\n            d: 'ഒരു ദിവസം',\n            dd: '%d ദിവസം',\n            M: 'ഒരു മാസം',\n            MM: '%d മാസം',\n            y: 'ഒരു വർഷം',\n            yy: '%d വർഷം',\n        },\n        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'രാത്രി' && hour >= 4) ||\n                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||\n                meridiem === 'വൈകുന്നേരം'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'രാത്രി';\n            } else if (hour < 12) {\n                return 'രാവിലെ';\n            } else if (hour < 17) {\n                return 'ഉച്ച കഴിഞ്ഞ്';\n            } else if (hour < 20) {\n                return 'വൈകുന്നേരം';\n            } else {\n                return 'രാത്രി';\n            }\n        },\n    });\n\n    return ml;\n\n})));\n","//! moment.js locale configuration\n//! locale : Mongolian [mn]\n//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function translate(number, withoutSuffix, key, isFuture) {\n        switch (key) {\n            case 's':\n                return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';\n            case 'ss':\n                return number + (withoutSuffix ? ' секунд' : ' секундын');\n            case 'm':\n            case 'mm':\n                return number + (withoutSuffix ? ' минут' : ' минутын');\n            case 'h':\n            case 'hh':\n                return number + (withoutSuffix ? ' цаг' : ' цагийн');\n            case 'd':\n            case 'dd':\n                return number + (withoutSuffix ? ' өдөр' : ' өдрийн');\n            case 'M':\n            case 'MM':\n                return number + (withoutSuffix ? ' сар' : ' сарын');\n            case 'y':\n            case 'yy':\n                return number + (withoutSuffix ? ' жил' : ' жилийн');\n            default:\n                return number;\n        }\n    }\n\n    var mn = moment.defineLocale('mn', {\n        months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(\n            '_'\n        ),\n        monthsShort:\n            '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),\n        weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),\n        weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY оны MMMMын D',\n            LLL: 'YYYY оны MMMMын D HH:mm',\n            LLLL: 'dddd, YYYY оны MMMMын D HH:mm',\n        },\n        meridiemParse: /ҮӨ|ҮХ/i,\n        isPM: function (input) {\n            return input === 'ҮХ';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ҮӨ';\n            } else {\n                return 'ҮХ';\n            }\n        },\n        calendar: {\n            sameDay: '[Өнөөдөр] LT',\n            nextDay: '[Маргааш] LT',\n            nextWeek: '[Ирэх] dddd LT',\n            lastDay: '[Өчигдөр] LT',\n            lastWeek: '[Өнгөрсөн] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s дараа',\n            past: '%s өмнө',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2} өдөр/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + ' өдөр';\n                default:\n                    return number;\n            }\n        },\n    });\n\n    return mn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Marathi [mr]\n//! author : Harshad Kale : https://github.com/kalehv\n//! author : Vivek Athalye : https://github.com/vnathalye\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        };\n\n    function relativeTimeMr(number, withoutSuffix, string, isFuture) {\n        var output = '';\n        if (withoutSuffix) {\n            switch (string) {\n                case 's':\n                    output = 'काही सेकंद';\n                    break;\n                case 'ss':\n                    output = '%d सेकंद';\n                    break;\n                case 'm':\n                    output = 'एक मिनिट';\n                    break;\n                case 'mm':\n                    output = '%d मिनिटे';\n                    break;\n                case 'h':\n                    output = 'एक तास';\n                    break;\n                case 'hh':\n                    output = '%d तास';\n                    break;\n                case 'd':\n                    output = 'एक दिवस';\n                    break;\n                case 'dd':\n                    output = '%d दिवस';\n                    break;\n                case 'M':\n                    output = 'एक महिना';\n                    break;\n                case 'MM':\n                    output = '%d महिने';\n                    break;\n                case 'y':\n                    output = 'एक वर्ष';\n                    break;\n                case 'yy':\n                    output = '%d वर्षे';\n                    break;\n            }\n        } else {\n            switch (string) {\n                case 's':\n                    output = 'काही सेकंदां';\n                    break;\n                case 'ss':\n                    output = '%d सेकंदां';\n                    break;\n                case 'm':\n                    output = 'एका मिनिटा';\n                    break;\n                case 'mm':\n                    output = '%d मिनिटां';\n                    break;\n                case 'h':\n                    output = 'एका तासा';\n                    break;\n                case 'hh':\n                    output = '%d तासां';\n                    break;\n                case 'd':\n                    output = 'एका दिवसा';\n                    break;\n                case 'dd':\n                    output = '%d दिवसां';\n                    break;\n                case 'M':\n                    output = 'एका महिन्या';\n                    break;\n                case 'MM':\n                    output = '%d महिन्यां';\n                    break;\n                case 'y':\n                    output = 'एका वर्षा';\n                    break;\n                case 'yy':\n                    output = '%d वर्षां';\n                    break;\n            }\n        }\n        return output.replace(/%d/i, number);\n    }\n\n    var mr = moment.defineLocale('mr', {\n        months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(\n            '_'\n        ),\n        monthsShort:\n            'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n        weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),\n        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm वाजता',\n            LTS: 'A h:mm:ss वाजता',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm वाजता',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',\n        },\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[उद्या] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[काल] LT',\n            lastWeek: '[मागील] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sमध्ये',\n            past: '%sपूर्वी',\n            s: relativeTimeMr,\n            ss: relativeTimeMr,\n            m: relativeTimeMr,\n            mm: relativeTimeMr,\n            h: relativeTimeMr,\n            hh: relativeTimeMr,\n            d: relativeTimeMr,\n            dd: relativeTimeMr,\n            M: relativeTimeMr,\n            MM: relativeTimeMr,\n            y: relativeTimeMr,\n            yy: relativeTimeMr,\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {\n                return hour;\n            } else if (\n                meridiem === 'दुपारी' ||\n                meridiem === 'सायंकाळी' ||\n                meridiem === 'रात्री'\n            ) {\n                return hour >= 12 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour >= 0 && hour < 6) {\n                return 'पहाटे';\n            } else if (hour < 12) {\n                return 'सकाळी';\n            } else if (hour < 17) {\n                return 'दुपारी';\n            } else if (hour < 20) {\n                return 'सायंकाळी';\n            } else {\n                return 'रात्री';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return mr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malay [ms-my]\n//! note : DEPRECATED, the correct one is [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var msMy = moment.defineLocale('ms-my', {\n        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|tengahari|petang|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'tengahari') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'petang' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'tengahari';\n            } else if (hours < 19) {\n                return 'petang';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Esok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kelmarin pukul] LT',\n            lastWeek: 'dddd [lepas pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lepas',\n            s: 'beberapa saat',\n            ss: '%d saat',\n            m: 'seminit',\n            mm: '%d minit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return msMy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malay [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ms = moment.defineLocale('ms', {\n        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|tengahari|petang|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'tengahari') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'petang' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'tengahari';\n            } else if (hours < 19) {\n                return 'petang';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Esok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kelmarin pukul] LT',\n            lastWeek: 'dddd [lepas pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lepas',\n            s: 'beberapa saat',\n            ss: '%d saat',\n            m: 'seminit',\n            mm: '%d minit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ms;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maltese (Malta) [mt]\n//! author : Alessandro Maruccia : https://github.com/alesma\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mt = moment.defineLocale('mt', {\n        months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),\n        weekdays:\n            'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(\n                '_'\n            ),\n        weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),\n        weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Illum fil-]LT',\n            nextDay: '[Għada fil-]LT',\n            nextWeek: 'dddd [fil-]LT',\n            lastDay: '[Il-bieraħ fil-]LT',\n            lastWeek: 'dddd [li għadda] [fil-]LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'f’ %s',\n            past: '%s ilu',\n            s: 'ftit sekondi',\n            ss: '%d sekondi',\n            m: 'minuta',\n            mm: '%d minuti',\n            h: 'siegħa',\n            hh: '%d siegħat',\n            d: 'ġurnata',\n            dd: '%d ġranet',\n            M: 'xahar',\n            MM: '%d xhur',\n            y: 'sena',\n            yy: '%d sni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return mt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Burmese [my]\n//! author : Squar team, mysquar.com\n//! author : David Rossellat : https://github.com/gholadr\n//! author : Tin Aung Lin : https://github.com/thanyawzinmin\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '၁',\n            2: '၂',\n            3: '၃',\n            4: '၄',\n            5: '၅',\n            6: '၆',\n            7: '၇',\n            8: '၈',\n            9: '၉',\n            0: '၀',\n        },\n        numberMap = {\n            '၁': '1',\n            '၂': '2',\n            '၃': '3',\n            '၄': '4',\n            '၅': '5',\n            '၆': '6',\n            '၇': '7',\n            '၈': '8',\n            '၉': '9',\n            '၀': '0',\n        };\n\n    var my = moment.defineLocale('my', {\n        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(\n            '_'\n        ),\n        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),\n        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(\n            '_'\n        ),\n        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[ယနေ.] LT [မှာ]',\n            nextDay: '[မနက်ဖြန်] LT [မှာ]',\n            nextWeek: 'dddd LT [မှာ]',\n            lastDay: '[မနေ.က] LT [မှာ]',\n            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'လာမည့် %s မှာ',\n            past: 'လွန်ခဲ့သော %s က',\n            s: 'စက္ကန်.အနည်းငယ်',\n            ss: '%d စက္ကန့်',\n            m: 'တစ်မိနစ်',\n            mm: '%d မိနစ်',\n            h: 'တစ်နာရီ',\n            hh: '%d နာရီ',\n            d: 'တစ်ရက်',\n            dd: '%d ရက်',\n            M: 'တစ်လ',\n            MM: '%d လ',\n            y: 'တစ်နှစ်',\n            yy: '%d နှစ်',\n        },\n        preparse: function (string) {\n            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return my;\n\n})));\n","//! moment.js locale configuration\n//! locale : Norwegian Bokmål [nb]\n//! authors : Espen Hovlandsdal : https://github.com/rexxars\n//!           Sigurd Gartmann : https://github.com/sigurdga\n//!           Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var nb = moment.defineLocale('nb', {\n        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n        weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] HH:mm',\n            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[i går kl.] LT',\n            lastWeek: '[forrige] dddd [kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'noen sekunder',\n            ss: '%d sekunder',\n            m: 'ett minutt',\n            mm: '%d minutter',\n            h: 'én time',\n            hh: '%d timer',\n            d: 'én dag',\n            dd: '%d dager',\n            w: 'én uke',\n            ww: '%d uker',\n            M: 'én måned',\n            MM: '%d måneder',\n            y: 'ett år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nb;\n\n})));\n","//! moment.js locale configuration\n//! locale : Nepalese [ne]\n//! author : suvash : https://github.com/suvash\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        };\n\n    var ne = moment.defineLocale('ne', {\n        months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(\n            '_'\n        ),\n        monthsShort:\n            'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(\n            '_'\n        ),\n        weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n        weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'Aको h:mm बजे',\n            LTS: 'Aको h:mm:ss बजे',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, Aको h:mm बजे',\n            LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'राति') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'बिहान') {\n                return hour;\n            } else if (meridiem === 'दिउँसो') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'साँझ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 3) {\n                return 'राति';\n            } else if (hour < 12) {\n                return 'बिहान';\n            } else if (hour < 16) {\n                return 'दिउँसो';\n            } else if (hour < 20) {\n                return 'साँझ';\n            } else {\n                return 'राति';\n            }\n        },\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[भोलि] LT',\n            nextWeek: '[आउँदो] dddd[,] LT',\n            lastDay: '[हिजो] LT',\n            lastWeek: '[गएको] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sमा',\n            past: '%s अगाडि',\n            s: 'केही क्षण',\n            ss: '%d सेकेण्ड',\n            m: 'एक मिनेट',\n            mm: '%d मिनेट',\n            h: 'एक घण्टा',\n            hh: '%d घण्टा',\n            d: 'एक दिन',\n            dd: '%d दिन',\n            M: 'एक महिना',\n            MM: '%d महिना',\n            y: 'एक बर्ष',\n            yy: '%d बर्ष',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return ne;\n\n})));\n","//! moment.js locale configuration\n//! locale : Dutch (Belgium) [nl-be]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        monthsParse = [\n            /^jan/i,\n            /^feb/i,\n            /^(maart|mrt\\.?)$/i,\n            /^apr/i,\n            /^mei$/i,\n            /^jun[i.]?$/i,\n            /^jul[i.]?$/i,\n            /^aug/i,\n            /^sep/i,\n            /^okt/i,\n            /^nov/i,\n            /^dec/i,\n        ],\n        monthsRegex =\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n    var nlBe = moment.defineLocale('nl-be', {\n        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n        monthsShortStrictRegex:\n            /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        weekdays:\n            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[vandaag om] LT',\n            nextDay: '[morgen om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[gisteren om] LT',\n            lastWeek: '[afgelopen] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'over %s',\n            past: '%s geleden',\n            s: 'een paar seconden',\n            ss: '%d seconden',\n            m: 'één minuut',\n            mm: '%d minuten',\n            h: 'één uur',\n            hh: '%d uur',\n            d: 'één dag',\n            dd: '%d dagen',\n            M: 'één maand',\n            MM: '%d maanden',\n            y: 'één jaar',\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nlBe;\n\n})));\n","//! moment.js locale configuration\n//! locale : Dutch [nl]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        monthsParse = [\n            /^jan/i,\n            /^feb/i,\n            /^(maart|mrt\\.?)$/i,\n            /^apr/i,\n            /^mei$/i,\n            /^jun[i.]?$/i,\n            /^jul[i.]?$/i,\n            /^aug/i,\n            /^sep/i,\n            /^okt/i,\n            /^nov/i,\n            /^dec/i,\n        ],\n        monthsRegex =\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n    var nl = moment.defineLocale('nl', {\n        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n        monthsShortStrictRegex:\n            /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        weekdays:\n            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[vandaag om] LT',\n            nextDay: '[morgen om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[gisteren om] LT',\n            lastWeek: '[afgelopen] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'over %s',\n            past: '%s geleden',\n            s: 'een paar seconden',\n            ss: '%d seconden',\n            m: 'één minuut',\n            mm: '%d minuten',\n            h: 'één uur',\n            hh: '%d uur',\n            d: 'één dag',\n            dd: '%d dagen',\n            w: 'één week',\n            ww: '%d weken',\n            M: 'één maand',\n            MM: '%d maanden',\n            y: 'één jaar',\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Nynorsk [nn]\n//! authors : https://github.com/mechuwind\n//!           Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var nn = moment.defineLocale('nn', {\n        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n        weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),\n        weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] H:mm',\n            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[I dag klokka] LT',\n            nextDay: '[I morgon klokka] LT',\n            nextWeek: 'dddd [klokka] LT',\n            lastDay: '[I går klokka] LT',\n            lastWeek: '[Føregåande] dddd [klokka] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s sidan',\n            s: 'nokre sekund',\n            ss: '%d sekund',\n            m: 'eit minutt',\n            mm: '%d minutt',\n            h: 'ein time',\n            hh: '%d timar',\n            d: 'ein dag',\n            dd: '%d dagar',\n            w: 'ei veke',\n            ww: '%d veker',\n            M: 'ein månad',\n            MM: '%d månader',\n            y: 'eit år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Occitan, lengadocian dialecte [oc-lnc]\n//! author : Quentin PAGÈS : https://github.com/Quenty31\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ocLnc = moment.defineLocale('oc-lnc', {\n        months: {\n            standalone:\n                'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(\n                    '_'\n                ),\n            format: \"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre\".split(\n                '_'\n            ),\n            isFormat: /D[oD]?(\\s)+MMMM/,\n        },\n        monthsShort:\n            'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(\n            '_'\n        ),\n        weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),\n        weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [de] YYYY',\n            ll: 'D MMM YYYY',\n            LLL: 'D MMMM [de] YYYY [a] H:mm',\n            lll: 'D MMM YYYY, H:mm',\n            LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',\n            llll: 'ddd D MMM YYYY, H:mm',\n        },\n        calendar: {\n            sameDay: '[uèi a] LT',\n            nextDay: '[deman a] LT',\n            nextWeek: 'dddd [a] LT',\n            lastDay: '[ièr a] LT',\n            lastWeek: 'dddd [passat a] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: \"d'aquí %s\",\n            past: 'fa %s',\n            s: 'unas segondas',\n            ss: '%d segondas',\n            m: 'una minuta',\n            mm: '%d minutas',\n            h: 'una ora',\n            hh: '%d oras',\n            d: 'un jorn',\n            dd: '%d jorns',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n        ordinal: function (number, period) {\n            var output =\n                number === 1\n                    ? 'r'\n                    : number === 2\n                      ? 'n'\n                      : number === 3\n                        ? 'r'\n                        : number === 4\n                          ? 't'\n                          : 'è';\n            if (period === 'w' || period === 'W') {\n                output = 'a';\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4,\n        },\n    });\n\n    return ocLnc;\n\n})));\n","//! moment.js locale configuration\n//! locale : Punjabi (India) [pa-in]\n//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '੧',\n            2: '੨',\n            3: '੩',\n            4: '੪',\n            5: '੫',\n            6: '੬',\n            7: '੭',\n            8: '੮',\n            9: '੯',\n            0: '੦',\n        },\n        numberMap = {\n            '੧': '1',\n            '੨': '2',\n            '੩': '3',\n            '੪': '4',\n            '੫': '5',\n            '੬': '6',\n            '੭': '7',\n            '੮': '8',\n            '੯': '9',\n            '੦': '0',\n        };\n\n    var paIn = moment.defineLocale('pa-in', {\n        // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.\n        months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n                '_'\n            ),\n        weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(\n            '_'\n        ),\n        weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n        weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm ਵਜੇ',\n            LTS: 'A h:mm:ss ਵਜੇ',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',\n        },\n        calendar: {\n            sameDay: '[ਅਜ] LT',\n            nextDay: '[ਕਲ] LT',\n            nextWeek: '[ਅਗਲਾ] dddd, LT',\n            lastDay: '[ਕਲ] LT',\n            lastWeek: '[ਪਿਛਲੇ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ਵਿੱਚ',\n            past: '%s ਪਿਛਲੇ',\n            s: 'ਕੁਝ ਸਕਿੰਟ',\n            ss: '%d ਸਕਿੰਟ',\n            m: 'ਇਕ ਮਿੰਟ',\n            mm: '%d ਮਿੰਟ',\n            h: 'ਇੱਕ ਘੰਟਾ',\n            hh: '%d ਘੰਟੇ',\n            d: 'ਇੱਕ ਦਿਨ',\n            dd: '%d ਦਿਨ',\n            M: 'ਇੱਕ ਮਹੀਨਾ',\n            MM: '%d ਮਹੀਨੇ',\n            y: 'ਇੱਕ ਸਾਲ',\n            yy: '%d ਸਾਲ',\n        },\n        preparse: function (string) {\n            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ਰਾਤ') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ਸਵੇਰ') {\n                return hour;\n            } else if (meridiem === 'ਦੁਪਹਿਰ') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'ਸ਼ਾਮ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ਰਾਤ';\n            } else if (hour < 10) {\n                return 'ਸਵੇਰ';\n            } else if (hour < 17) {\n                return 'ਦੁਪਹਿਰ';\n            } else if (hour < 20) {\n                return 'ਸ਼ਾਮ';\n            } else {\n                return 'ਰਾਤ';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return paIn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Polish [pl]\n//! author : Rafal Hirsz : https://github.com/evoL\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsNominative =\n            'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(\n                '_'\n            ),\n        monthsSubjective =\n            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(\n                '_'\n            ),\n        monthsParse = [\n            /^sty/i,\n            /^lut/i,\n            /^mar/i,\n            /^kwi/i,\n            /^maj/i,\n            /^cze/i,\n            /^lip/i,\n            /^sie/i,\n            /^wrz/i,\n            /^paź/i,\n            /^lis/i,\n            /^gru/i,\n        ];\n    function plural(n) {\n        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;\n    }\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                return result + (plural(number) ? 'sekundy' : 'sekund');\n            case 'm':\n                return withoutSuffix ? 'minuta' : 'minutę';\n            case 'mm':\n                return result + (plural(number) ? 'minuty' : 'minut');\n            case 'h':\n                return withoutSuffix ? 'godzina' : 'godzinę';\n            case 'hh':\n                return result + (plural(number) ? 'godziny' : 'godzin');\n            case 'ww':\n                return result + (plural(number) ? 'tygodnie' : 'tygodni');\n            case 'MM':\n                return result + (plural(number) ? 'miesiące' : 'miesięcy');\n            case 'yy':\n                return result + (plural(number) ? 'lata' : 'lat');\n        }\n    }\n\n    var pl = moment.defineLocale('pl', {\n        months: function (momentToFormat, format) {\n            if (!momentToFormat) {\n                return monthsNominative;\n            } else if (/D MMMM/.test(format)) {\n                return monthsSubjective[momentToFormat.month()];\n            } else {\n                return monthsNominative[momentToFormat.month()];\n            }\n        },\n        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays:\n            'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),\n        weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),\n        weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Dziś o] LT',\n            nextDay: '[Jutro o] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W niedzielę o] LT';\n\n                    case 2:\n                        return '[We wtorek o] LT';\n\n                    case 3:\n                        return '[W środę o] LT';\n\n                    case 6:\n                        return '[W sobotę o] LT';\n\n                    default:\n                        return '[W] dddd [o] LT';\n                }\n            },\n            lastDay: '[Wczoraj o] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W zeszłą niedzielę o] LT';\n                    case 3:\n                        return '[W zeszłą środę o] LT';\n                    case 6:\n                        return '[W zeszłą sobotę o] LT';\n                    default:\n                        return '[W zeszły] dddd [o] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: '%s temu',\n            s: 'kilka sekund',\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: '1 dzień',\n            dd: '%d dni',\n            w: 'tydzień',\n            ww: translate,\n            M: 'miesiąc',\n            MM: translate,\n            y: 'rok',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Portuguese (Brazil) [pt-br]\n//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ptBr = moment.defineLocale('pt-br', {\n        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n        weekdays:\n            'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(\n                '_'\n            ),\n        weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),\n        weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hoje às] LT',\n            nextDay: '[Amanhã às] LT',\n            nextWeek: 'dddd [às] LT',\n            lastDay: '[Ontem às] LT',\n            lastWeek: function () {\n                return this.day() === 0 || this.day() === 6\n                    ? '[Último] dddd [às] LT' // Saturday + Sunday\n                    : '[Última] dddd [às] LT'; // Monday - Friday\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'em %s',\n            past: 'há %s',\n            s: 'poucos segundos',\n            ss: '%d segundos',\n            m: 'um minuto',\n            mm: '%d minutos',\n            h: 'uma hora',\n            hh: '%d horas',\n            d: 'um dia',\n            dd: '%d dias',\n            M: 'um mês',\n            MM: '%d meses',\n            y: 'um ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        invalidDate: 'Data inválida',\n    });\n\n    return ptBr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Portuguese [pt]\n//! author : Jefferson : https://github.com/jalex79\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var pt = moment.defineLocale('pt', {\n        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n        weekdays:\n            'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(\n                '_'\n            ),\n        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n        weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY HH:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hoje às] LT',\n            nextDay: '[Amanhã às] LT',\n            nextWeek: 'dddd [às] LT',\n            lastDay: '[Ontem às] LT',\n            lastWeek: function () {\n                return this.day() === 0 || this.day() === 6\n                    ? '[Último] dddd [às] LT' // Saturday + Sunday\n                    : '[Última] dddd [às] LT'; // Monday - Friday\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'em %s',\n            past: 'há %s',\n            s: 'segundos',\n            ss: '%d segundos',\n            m: 'um minuto',\n            mm: '%d minutos',\n            h: 'uma hora',\n            hh: '%d horas',\n            d: 'um dia',\n            dd: '%d dias',\n            w: 'uma semana',\n            ww: '%d semanas',\n            M: 'um mês',\n            MM: '%d meses',\n            y: 'um ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Romanian [ro]\n//! author : Vlad Gurdiga : https://github.com/gurdiga\n//! author : Valentin Agachi : https://github.com/avaly\n//! author : Emanuel Cepoi : https://github.com/cepem\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n                ss: 'secunde',\n                mm: 'minute',\n                hh: 'ore',\n                dd: 'zile',\n                ww: 'săptămâni',\n                MM: 'luni',\n                yy: 'ani',\n            },\n            separator = ' ';\n        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {\n            separator = ' de ';\n        }\n        return number + separator + format[key];\n    }\n\n    var ro = moment.defineLocale('ro', {\n        months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(\n            '_'\n        ),\n        monthsShort:\n            'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n        weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n        weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[azi la] LT',\n            nextDay: '[mâine la] LT',\n            nextWeek: 'dddd [la] LT',\n            lastDay: '[ieri la] LT',\n            lastWeek: '[fosta] dddd [la] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'peste %s',\n            past: '%s în urmă',\n            s: 'câteva secunde',\n            ss: relativeTimeWithPlural,\n            m: 'un minut',\n            mm: relativeTimeWithPlural,\n            h: 'o oră',\n            hh: relativeTimeWithPlural,\n            d: 'o zi',\n            dd: relativeTimeWithPlural,\n            w: 'o săptămână',\n            ww: relativeTimeWithPlural,\n            M: 'o lună',\n            MM: relativeTimeWithPlural,\n            y: 'un an',\n            yy: relativeTimeWithPlural,\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ro;\n\n})));\n","//! moment.js locale configuration\n//! locale : Russian [ru]\n//! author : Viktorminator : https://github.com/Viktorminator\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Коренберг Марк : https://github.com/socketpair\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n            mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',\n            hh: 'час_часа_часов',\n            dd: 'день_дня_дней',\n            ww: 'неделя_недели_недель',\n            MM: 'месяц_месяца_месяцев',\n            yy: 'год_года_лет',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'минута' : 'минуту';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n    var monthsParse = [\n        /^янв/i,\n        /^фев/i,\n        /^мар/i,\n        /^апр/i,\n        /^ма[йя]/i,\n        /^июн/i,\n        /^июл/i,\n        /^авг/i,\n        /^сен/i,\n        /^окт/i,\n        /^ноя/i,\n        /^дек/i,\n    ];\n\n    // http://new.gramota.ru/spravka/rules/139-prop : § 103\n    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637\n    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753\n    var ru = moment.defineLocale('ru', {\n        months: {\n            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(\n                '_'\n            ),\n            standalone:\n                'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(\n                    '_'\n                ),\n        },\n        monthsShort: {\n            // по CLDR именно \"июл.\" и \"июн.\", но какой смысл менять букву на точку?\n            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(\n                '_'\n            ),\n            standalone:\n                'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(\n                    '_'\n                ),\n        },\n        weekdays: {\n            standalone:\n                'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(\n                    '_'\n                ),\n            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(\n                '_'\n            ),\n            isFormat: /\\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,\n        },\n        weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n        weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки\n        monthsRegex:\n            /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n        // копия предыдущего\n        monthsShortRegex:\n            /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n        // полные названия с падежами\n        monthsStrictRegex:\n            /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,\n\n        // Выражение, которое соответствует только сокращённым формам\n        monthsShortStrictRegex:\n            /^(янв\\.|февр?\\.|мар[т.]|апр\\.|ма[яй]|июн[ья.]|июл[ья.]|авг\\.|сент?\\.|окт\\.|нояб?\\.|дек\\.)/i,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY г.',\n            LLL: 'D MMMM YYYY г., H:mm',\n            LLLL: 'dddd, D MMMM YYYY г., H:mm',\n        },\n        calendar: {\n            sameDay: '[Сегодня, в] LT',\n            nextDay: '[Завтра, в] LT',\n            lastDay: '[Вчера, в] LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    switch (this.day()) {\n                        case 0:\n                            return '[В следующее] dddd, [в] LT';\n                        case 1:\n                        case 2:\n                        case 4:\n                            return '[В следующий] dddd, [в] LT';\n                        case 3:\n                        case 5:\n                        case 6:\n                            return '[В следующую] dddd, [в] LT';\n                    }\n                } else {\n                    if (this.day() === 2) {\n                        return '[Во] dddd, [в] LT';\n                    } else {\n                        return '[В] dddd, [в] LT';\n                    }\n                }\n            },\n            lastWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    switch (this.day()) {\n                        case 0:\n                            return '[В прошлое] dddd, [в] LT';\n                        case 1:\n                        case 2:\n                        case 4:\n                            return '[В прошлый] dddd, [в] LT';\n                        case 3:\n                        case 5:\n                        case 6:\n                            return '[В прошлую] dddd, [в] LT';\n                    }\n                } else {\n                    if (this.day() === 2) {\n                        return '[Во] dddd, [в] LT';\n                    } else {\n                        return '[В] dddd, [в] LT';\n                    }\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'через %s',\n            past: '%s назад',\n            s: 'несколько секунд',\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: 'час',\n            hh: relativeTimeWithPlural,\n            d: 'день',\n            dd: relativeTimeWithPlural,\n            w: 'неделя',\n            ww: relativeTimeWithPlural,\n            M: 'месяц',\n            MM: relativeTimeWithPlural,\n            y: 'год',\n            yy: relativeTimeWithPlural,\n        },\n        meridiemParse: /ночи|утра|дня|вечера/i,\n        isPM: function (input) {\n            return /^(дня|вечера)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночи';\n            } else if (hour < 12) {\n                return 'утра';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечера';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(й|го|я)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                    return number + '-й';\n                case 'D':\n                    return number + '-го';\n                case 'w':\n                case 'W':\n                    return number + '-я';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ru;\n\n})));\n","//! moment.js locale configuration\n//! locale : Sindhi [sd]\n//! author : Narain Sagar : https://github.com/narainsagar\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'جنوري',\n            'فيبروري',\n            'مارچ',\n            'اپريل',\n            'مئي',\n            'جون',\n            'جولاءِ',\n            'آگسٽ',\n            'سيپٽمبر',\n            'آڪٽوبر',\n            'نومبر',\n            'ڊسمبر',\n        ],\n        days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];\n\n    var sd = moment.defineLocale('sd', {\n        months: months,\n        monthsShort: months,\n        weekdays: days,\n        weekdaysShort: days,\n        weekdaysMin: days,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd، D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /صبح|شام/,\n        isPM: function (input) {\n            return 'شام' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'صبح';\n            }\n            return 'شام';\n        },\n        calendar: {\n            sameDay: '[اڄ] LT',\n            nextDay: '[سڀاڻي] LT',\n            nextWeek: 'dddd [اڳين هفتي تي] LT',\n            lastDay: '[ڪالهه] LT',\n            lastWeek: '[گزريل هفتي] dddd [تي] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s پوء',\n            past: '%s اڳ',\n            s: 'چند سيڪنڊ',\n            ss: '%d سيڪنڊ',\n            m: 'هڪ منٽ',\n            mm: '%d منٽ',\n            h: 'هڪ ڪلاڪ',\n            hh: '%d ڪلاڪ',\n            d: 'هڪ ڏينهن',\n            dd: '%d ڏينهن',\n            M: 'هڪ مهينو',\n            MM: '%d مهينا',\n            y: 'هڪ سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Northern Sami [se]\n//! authors : Bård Rolstad Henriksen : https://github.com/karamell\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var se = moment.defineLocale('se', {\n        months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(\n            '_'\n        ),\n        monthsShort:\n            'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n        weekdays:\n            'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(\n                '_'\n            ),\n        weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n        weekdaysMin: 's_v_m_g_d_b_L'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'MMMM D. [b.] YYYY',\n            LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',\n            LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[otne ti] LT',\n            nextDay: '[ihttin ti] LT',\n            nextWeek: 'dddd [ti] LT',\n            lastDay: '[ikte ti] LT',\n            lastWeek: '[ovddit] dddd [ti] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s geažes',\n            past: 'maŋit %s',\n            s: 'moadde sekunddat',\n            ss: '%d sekunddat',\n            m: 'okta minuhta',\n            mm: '%d minuhtat',\n            h: 'okta diimmu',\n            hh: '%d diimmut',\n            d: 'okta beaivi',\n            dd: '%d beaivvit',\n            M: 'okta mánnu',\n            MM: '%d mánut',\n            y: 'okta jahki',\n            yy: '%d jagit',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return se;\n\n})));\n","//! moment.js locale configuration\n//! locale : Sinhalese [si]\n//! author : Sampath Sitinamaluwa : https://github.com/sampathsris\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    /*jshint -W100*/\n    var si = moment.defineLocale('si', {\n        months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(\n            '_'\n        ),\n        monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(\n            '_'\n        ),\n        weekdays:\n            'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(\n                '_'\n            ),\n        weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n        weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'a h:mm',\n            LTS: 'a h:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY MMMM D',\n            LLL: 'YYYY MMMM D, a h:mm',\n            LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',\n        },\n        calendar: {\n            sameDay: '[අද] LT[ට]',\n            nextDay: '[හෙට] LT[ට]',\n            nextWeek: 'dddd LT[ට]',\n            lastDay: '[ඊයේ] LT[ට]',\n            lastWeek: '[පසුගිය] dddd LT[ට]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sකින්',\n            past: '%sකට පෙර',\n            s: 'තත්පර කිහිපය',\n            ss: 'තත්පර %d',\n            m: 'මිනිත්තුව',\n            mm: 'මිනිත්තු %d',\n            h: 'පැය',\n            hh: 'පැය %d',\n            d: 'දිනය',\n            dd: 'දින %d',\n            M: 'මාසය',\n            MM: 'මාස %d',\n            y: 'වසර',\n            yy: 'වසර %d',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n        ordinal: function (number) {\n            return number + ' වැනි';\n        },\n        meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n        isPM: function (input) {\n            return input === 'ප.ව.' || input === 'පස් වරු';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'ප.ව.' : 'පස් වරු';\n            } else {\n                return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n            }\n        },\n    });\n\n    return si;\n\n})));\n","//! moment.js locale configuration\n//! locale : Slovak [sk]\n//! author : Martin Minka : https://github.com/k2s\n//! based on work of petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months =\n            'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(\n                '_'\n            ),\n        monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\n    function plural(n) {\n        return n > 1 && n < 5;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's': // a few seconds / in a few seconds / a few seconds ago\n                return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';\n            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'sekundy' : 'sekúnd');\n                } else {\n                    return result + 'sekundami';\n                }\n            case 'm': // a minute / in a minute / a minute ago\n                return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';\n            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'minúty' : 'minút');\n                } else {\n                    return result + 'minútami';\n                }\n            case 'h': // an hour / in an hour / an hour ago\n                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n            case 'hh': // 9 hours / in 9 hours / 9 hours ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'hodiny' : 'hodín');\n                } else {\n                    return result + 'hodinami';\n                }\n            case 'd': // a day / in a day / a day ago\n                return withoutSuffix || isFuture ? 'deň' : 'dňom';\n            case 'dd': // 9 days / in 9 days / 9 days ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'dni' : 'dní');\n                } else {\n                    return result + 'dňami';\n                }\n            case 'M': // a month / in a month / a month ago\n                return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';\n            case 'MM': // 9 months / in 9 months / 9 months ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'mesiace' : 'mesiacov');\n                } else {\n                    return result + 'mesiacmi';\n                }\n            case 'y': // a year / in a year / a year ago\n                return withoutSuffix || isFuture ? 'rok' : 'rokom';\n            case 'yy': // 9 years / in 9 years / 9 years ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'roky' : 'rokov');\n                } else {\n                    return result + 'rokmi';\n                }\n        }\n    }\n\n    var sk = moment.defineLocale('sk', {\n        months: months,\n        monthsShort: monthsShort,\n        weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n        weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),\n        weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[dnes o] LT',\n            nextDay: '[zajtra o] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v nedeľu o] LT';\n                    case 1:\n                    case 2:\n                        return '[v] dddd [o] LT';\n                    case 3:\n                        return '[v stredu o] LT';\n                    case 4:\n                        return '[vo štvrtok o] LT';\n                    case 5:\n                        return '[v piatok o] LT';\n                    case 6:\n                        return '[v sobotu o] LT';\n                }\n            },\n            lastDay: '[včera o] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[minulú nedeľu o] LT';\n                    case 1:\n                    case 2:\n                        return '[minulý] dddd [o] LT';\n                    case 3:\n                        return '[minulú stredu o] LT';\n                    case 4:\n                    case 5:\n                        return '[minulý] dddd [o] LT';\n                    case 6:\n                        return '[minulú sobotu o] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'pred %s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Slovenian [sl]\n//! author : Robert Sedovšek : https://github.com/sedovsek\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's':\n                return withoutSuffix || isFuture\n                    ? 'nekaj sekund'\n                    : 'nekaj sekundami';\n            case 'ss':\n                if (number === 1) {\n                    result += withoutSuffix ? 'sekundo' : 'sekundi';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n                } else {\n                    result += 'sekund';\n                }\n                return result;\n            case 'm':\n                return withoutSuffix ? 'ena minuta' : 'eno minuto';\n            case 'mm':\n                if (number === 1) {\n                    result += withoutSuffix ? 'minuta' : 'minuto';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n                } else {\n                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'ena ura' : 'eno uro';\n            case 'hh':\n                if (number === 1) {\n                    result += withoutSuffix ? 'ura' : 'uro';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'uri' : 'urama';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'ure' : 'urami';\n                } else {\n                    result += withoutSuffix || isFuture ? 'ur' : 'urami';\n                }\n                return result;\n            case 'd':\n                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n            case 'dd':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n                } else {\n                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n                }\n                return result;\n            case 'M':\n                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n            case 'MM':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n                } else {\n                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n                }\n                return result;\n            case 'y':\n                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n            case 'yy':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'leto' : 'letom';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'leta' : 'leti';\n                } else {\n                    result += withoutSuffix || isFuture ? 'let' : 'leti';\n                }\n                return result;\n        }\n    }\n\n    var sl = moment.defineLocale('sl', {\n        months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n        weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n        weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD. MM. YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danes ob] LT',\n            nextDay: '[jutri ob] LT',\n\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v] [nedeljo] [ob] LT';\n                    case 3:\n                        return '[v] [sredo] [ob] LT';\n                    case 6:\n                        return '[v] [soboto] [ob] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[v] dddd [ob] LT';\n                }\n            },\n            lastDay: '[včeraj ob] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[prejšnjo] [nedeljo] [ob] LT';\n                    case 3:\n                        return '[prejšnjo] [sredo] [ob] LT';\n                    case 6:\n                        return '[prejšnjo] [soboto] [ob] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prejšnji] dddd [ob] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'čez %s',\n            past: 'pred %s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Albanian [sq]\n//! author : Flakërim Ismani : https://github.com/flakerimi\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Oerd Cukalla : https://github.com/oerd\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sq = moment.defineLocale('sq', {\n        months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),\n        weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(\n            '_'\n        ),\n        weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),\n        weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),\n        weekdaysParseExact: true,\n        meridiemParse: /PD|MD/,\n        isPM: function (input) {\n            return input.charAt(0) === 'M';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            return hours < 12 ? 'PD' : 'MD';\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Sot në] LT',\n            nextDay: '[Nesër në] LT',\n            nextWeek: 'dddd [në] LT',\n            lastDay: '[Dje në] LT',\n            lastWeek: 'dddd [e kaluar në] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'në %s',\n            past: '%s më parë',\n            s: 'disa sekonda',\n            ss: '%d sekonda',\n            m: 'një minutë',\n            mm: '%d minuta',\n            h: 'një orë',\n            hh: '%d orë',\n            d: 'një ditë',\n            dd: '%d ditë',\n            M: 'një muaj',\n            MM: '%d muaj',\n            y: 'një vit',\n            yy: '%d vite',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sq;\n\n})));\n","//! moment.js locale configuration\n//! locale : Serbian Cyrillic [sr-cyrl]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['секунда', 'секунде', 'секунди'],\n            m: ['један минут', 'једног минута'],\n            mm: ['минут', 'минута', 'минута'],\n            h: ['један сат', 'једног сата'],\n            hh: ['сат', 'сата', 'сати'],\n            d: ['један дан', 'једног дана'],\n            dd: ['дан', 'дана', 'дана'],\n            M: ['један месец', 'једног месеца'],\n            MM: ['месец', 'месеца', 'месеци'],\n            y: ['једну годину', 'једне године'],\n            yy: ['годину', 'године', 'година'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            if (\n                number % 10 >= 1 &&\n                number % 10 <= 4 &&\n                (number % 100 < 10 || number % 100 >= 20)\n            ) {\n                return number % 10 === 1 ? wordKey[0] : wordKey[1];\n            }\n            return wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key, isFuture) {\n            var wordKey = translator.words[key],\n                word;\n\n            if (key.length === 1) {\n                // Nominativ\n                if (key === 'y' && withoutSuffix) return 'једна година';\n                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n            }\n\n            word = translator.correctGrammaticalCase(number, wordKey);\n            // Nominativ\n            if (key === 'yy' && withoutSuffix && word === 'годину') {\n                return number + ' година';\n            }\n\n            return number + ' ' + word;\n        },\n    };\n\n    var srCyrl = moment.defineLocale('sr-cyrl', {\n        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(\n            '_'\n        ),\n        monthsShort:\n            'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D. M. YYYY.',\n            LL: 'D. MMMM YYYY.',\n            LLL: 'D. MMMM YYYY. H:mm',\n            LLLL: 'dddd, D. MMMM YYYY. H:mm',\n        },\n        calendar: {\n            sameDay: '[данас у] LT',\n            nextDay: '[сутра у] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[у] [недељу] [у] LT';\n                    case 3:\n                        return '[у] [среду] [у] LT';\n                    case 6:\n                        return '[у] [суботу] [у] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[у] dddd [у] LT';\n                }\n            },\n            lastDay: '[јуче у] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[прошле] [недеље] [у] LT',\n                    '[прошлог] [понедељка] [у] LT',\n                    '[прошлог] [уторка] [у] LT',\n                    '[прошле] [среде] [у] LT',\n                    '[прошлог] [четвртка] [у] LT',\n                    '[прошлог] [петка] [у] LT',\n                    '[прошле] [суботе] [у] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: 'пре %s',\n            s: 'неколико секунди',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: translator.translate,\n            dd: translator.translate,\n            M: translator.translate,\n            MM: translator.translate,\n            y: translator.translate,\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return srCyrl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Serbian [sr]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['sekunda', 'sekunde', 'sekundi'],\n            m: ['jedan minut', 'jednog minuta'],\n            mm: ['minut', 'minuta', 'minuta'],\n            h: ['jedan sat', 'jednog sata'],\n            hh: ['sat', 'sata', 'sati'],\n            d: ['jedan dan', 'jednog dana'],\n            dd: ['dan', 'dana', 'dana'],\n            M: ['jedan mesec', 'jednog meseca'],\n            MM: ['mesec', 'meseca', 'meseci'],\n            y: ['jednu godinu', 'jedne godine'],\n            yy: ['godinu', 'godine', 'godina'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            if (\n                number % 10 >= 1 &&\n                number % 10 <= 4 &&\n                (number % 100 < 10 || number % 100 >= 20)\n            ) {\n                return number % 10 === 1 ? wordKey[0] : wordKey[1];\n            }\n            return wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key, isFuture) {\n            var wordKey = translator.words[key],\n                word;\n\n            if (key.length === 1) {\n                // Nominativ\n                if (key === 'y' && withoutSuffix) return 'jedna godina';\n                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n            }\n\n            word = translator.correctGrammaticalCase(number, wordKey);\n            // Nominativ\n            if (key === 'yy' && withoutSuffix && word === 'godinu') {\n                return number + ' godina';\n            }\n\n            return number + ' ' + word;\n        },\n    };\n\n    var sr = moment.defineLocale('sr', {\n        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D. M. YYYY.',\n            LL: 'D. MMMM YYYY.',\n            LLL: 'D. MMMM YYYY. H:mm',\n            LLLL: 'dddd, D. MMMM YYYY. H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedelju] [u] LT';\n                    case 3:\n                        return '[u] [sredu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[juče u] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[prošle] [nedelje] [u] LT',\n                    '[prošlog] [ponedeljka] [u] LT',\n                    '[prošlog] [utorka] [u] LT',\n                    '[prošle] [srede] [u] LT',\n                    '[prošlog] [četvrtka] [u] LT',\n                    '[prošlog] [petka] [u] LT',\n                    '[prošle] [subote] [u] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'pre %s',\n            s: 'nekoliko sekundi',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: translator.translate,\n            dd: translator.translate,\n            M: translator.translate,\n            MM: translator.translate,\n            y: translator.translate,\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sr;\n\n})));\n","//! moment.js locale configuration\n//! locale : siSwati [ss]\n//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ss = moment.defineLocale('ss', {\n        months: \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split(\n            '_'\n        ),\n        monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n        weekdays:\n            'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(\n                '_'\n            ),\n        weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n        weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Namuhla nga] LT',\n            nextDay: '[Kusasa nga] LT',\n            nextWeek: 'dddd [nga] LT',\n            lastDay: '[Itolo nga] LT',\n            lastWeek: 'dddd [leliphelile] [nga] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'nga %s',\n            past: 'wenteka nga %s',\n            s: 'emizuzwana lomcane',\n            ss: '%d mzuzwana',\n            m: 'umzuzu',\n            mm: '%d emizuzu',\n            h: 'lihora',\n            hh: '%d emahora',\n            d: 'lilanga',\n            dd: '%d emalanga',\n            M: 'inyanga',\n            MM: '%d tinyanga',\n            y: 'umnyaka',\n            yy: '%d iminyaka',\n        },\n        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'ekuseni';\n            } else if (hours < 15) {\n                return 'emini';\n            } else if (hours < 19) {\n                return 'entsambama';\n            } else {\n                return 'ebusuku';\n            }\n        },\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ekuseni') {\n                return hour;\n            } else if (meridiem === 'emini') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n                if (hour === 0) {\n                    return 0;\n                }\n                return hour + 12;\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: '%d',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ss;\n\n})));\n","//! moment.js locale configuration\n//! locale : Swedish [sv]\n//! author : Jens Alm : https://github.com/ulmus\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sv = moment.defineLocale('sv', {\n        months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n        weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n        weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [kl.] HH:mm',\n            LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Idag] LT',\n            nextDay: '[Imorgon] LT',\n            lastDay: '[Igår] LT',\n            nextWeek: '[På] dddd LT',\n            lastWeek: '[I] dddd[s] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: 'för %s sedan',\n            s: 'några sekunder',\n            ss: '%d sekunder',\n            m: 'en minut',\n            mm: '%d minuter',\n            h: 'en timme',\n            hh: '%d timmar',\n            d: 'en dag',\n            dd: '%d dagar',\n            M: 'en månad',\n            MM: '%d månader',\n            y: 'ett år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(\\:e|\\:a)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? ':e'\n                        : b === 1\n                          ? ':a'\n                          : b === 2\n                            ? ':a'\n                            : b === 3\n                              ? ':e'\n                              : ':e';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Swahili [sw]\n//! author : Fahad Kassim : https://github.com/fadsel\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sw = moment.defineLocale('sw', {\n        months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n        weekdays:\n            'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(\n                '_'\n            ),\n        weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n        weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'hh:mm A',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[leo saa] LT',\n            nextDay: '[kesho saa] LT',\n            nextWeek: '[wiki ijayo] dddd [saat] LT',\n            lastDay: '[jana] LT',\n            lastWeek: '[wiki iliyopita] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s baadaye',\n            past: 'tokea %s',\n            s: 'hivi punde',\n            ss: 'sekunde %d',\n            m: 'dakika moja',\n            mm: 'dakika %d',\n            h: 'saa limoja',\n            hh: 'masaa %d',\n            d: 'siku moja',\n            dd: 'siku %d',\n            M: 'mwezi mmoja',\n            MM: 'miezi %d',\n            y: 'mwaka mmoja',\n            yy: 'miaka %d',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sw;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tamil [ta]\n//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '௧',\n            2: '௨',\n            3: '௩',\n            4: '௪',\n            5: '௫',\n            6: '௬',\n            7: '௭',\n            8: '௮',\n            9: '௯',\n            0: '௦',\n        },\n        numberMap = {\n            '௧': '1',\n            '௨': '2',\n            '௩': '3',\n            '௪': '4',\n            '௫': '5',\n            '௬': '6',\n            '௭': '7',\n            '௮': '8',\n            '௯': '9',\n            '௦': '0',\n        };\n\n    var ta = moment.defineLocale('ta', {\n        months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n            '_'\n        ),\n        monthsShort:\n            'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n                '_'\n            ),\n        weekdays:\n            'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(\n                '_'\n            ),\n        weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(\n            '_'\n        ),\n        weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, HH:mm',\n            LLLL: 'dddd, D MMMM YYYY, HH:mm',\n        },\n        calendar: {\n            sameDay: '[இன்று] LT',\n            nextDay: '[நாளை] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[நேற்று] LT',\n            lastWeek: '[கடந்த வாரம்] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s இல்',\n            past: '%s முன்',\n            s: 'ஒரு சில விநாடிகள்',\n            ss: '%d விநாடிகள்',\n            m: 'ஒரு நிமிடம்',\n            mm: '%d நிமிடங்கள்',\n            h: 'ஒரு மணி நேரம்',\n            hh: '%d மணி நேரம்',\n            d: 'ஒரு நாள்',\n            dd: '%d நாட்கள்',\n            M: 'ஒரு மாதம்',\n            MM: '%d மாதங்கள்',\n            y: 'ஒரு வருடம்',\n            yy: '%d ஆண்டுகள்',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n        ordinal: function (number) {\n            return number + 'வது';\n        },\n        preparse: function (string) {\n            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // refer http://ta.wikipedia.org/s/1er1\n        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 2) {\n                return ' யாமம்';\n            } else if (hour < 6) {\n                return ' வைகறை'; // வைகறை\n            } else if (hour < 10) {\n                return ' காலை'; // காலை\n            } else if (hour < 14) {\n                return ' நண்பகல்'; // நண்பகல்\n            } else if (hour < 18) {\n                return ' எற்பாடு'; // எற்பாடு\n            } else if (hour < 22) {\n                return ' மாலை'; // மாலை\n            } else {\n                return ' யாமம்';\n            }\n        },\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'யாமம்') {\n                return hour < 2 ? hour : hour + 12;\n            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n                return hour;\n            } else if (meridiem === 'நண்பகல்') {\n                return hour >= 10 ? hour : hour + 12;\n            } else {\n                return hour + 12;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return ta;\n\n})));\n","//! moment.js locale configuration\n//! locale : Telugu [te]\n//! author : Krishna Chaitanya Thota : https://github.com/kcthota\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var te = moment.defineLocale('te', {\n        months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(\n            '_'\n        ),\n        monthsShort:\n            'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(\n                '_'\n            ),\n        weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n        weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[నేడు] LT',\n            nextDay: '[రేపు] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[నిన్న] LT',\n            lastWeek: '[గత] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s లో',\n            past: '%s క్రితం',\n            s: 'కొన్ని క్షణాలు',\n            ss: '%d సెకన్లు',\n            m: 'ఒక నిమిషం',\n            mm: '%d నిమిషాలు',\n            h: 'ఒక గంట',\n            hh: '%d గంటలు',\n            d: 'ఒక రోజు',\n            dd: '%d రోజులు',\n            M: 'ఒక నెల',\n            MM: '%d నెలలు',\n            y: 'ఒక సంవత్సరం',\n            yy: '%d సంవత్సరాలు',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}వ/,\n        ordinal: '%dవ',\n        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'రాత్రి') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ఉదయం') {\n                return hour;\n            } else if (meridiem === 'మధ్యాహ్నం') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'సాయంత్రం') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'రాత్రి';\n            } else if (hour < 10) {\n                return 'ఉదయం';\n            } else if (hour < 17) {\n                return 'మధ్యాహ్నం';\n            } else if (hour < 20) {\n                return 'సాయంత్రం';\n            } else {\n                return 'రాత్రి';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return te;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tetun Dili (East Timor) [tet]\n//! author : Joshua Brooks : https://github.com/joshbrooks\n//! author : Onorio De J. Afonso : https://github.com/marobo\n//! author : Sonia Simoes : https://github.com/soniasimoes\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tet = moment.defineLocale('tet', {\n        months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n        weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n        weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n        weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Ohin iha] LT',\n            nextDay: '[Aban iha] LT',\n            nextWeek: 'dddd [iha] LT',\n            lastDay: '[Horiseik iha] LT',\n            lastWeek: 'dddd [semana kotuk] [iha] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'iha %s',\n            past: '%s liuba',\n            s: 'segundu balun',\n            ss: 'segundu %d',\n            m: 'minutu ida',\n            mm: 'minutu %d',\n            h: 'oras ida',\n            hh: 'oras %d',\n            d: 'loron ida',\n            dd: 'loron %d',\n            M: 'fulan ida',\n            MM: 'fulan %d',\n            y: 'tinan ida',\n            yy: 'tinan %d',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tet;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tajik [tg]\n//! author : Orif N. Jr. : https://github.com/orif-jr\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-ум',\n        1: '-ум',\n        2: '-юм',\n        3: '-юм',\n        4: '-ум',\n        5: '-ум',\n        6: '-ум',\n        7: '-ум',\n        8: '-ум',\n        9: '-ум',\n        10: '-ум',\n        12: '-ум',\n        13: '-ум',\n        20: '-ум',\n        30: '-юм',\n        40: '-ум',\n        50: '-ум',\n        60: '-ум',\n        70: '-ум',\n        80: '-ум',\n        90: '-ум',\n        100: '-ум',\n    };\n\n    var tg = moment.defineLocale('tg', {\n        months: {\n            format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(\n                '_'\n            ),\n            standalone:\n                'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n        weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(\n            '_'\n        ),\n        weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),\n        weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Имрӯз соати] LT',\n            nextDay: '[Фардо соати] LT',\n            lastDay: '[Дирӯз соати] LT',\n            nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',\n            lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'баъди %s',\n            past: '%s пеш',\n            s: 'якчанд сония',\n            m: 'як дақиқа',\n            mm: '%d дақиқа',\n            h: 'як соат',\n            hh: '%d соат',\n            d: 'як рӯз',\n            dd: '%d рӯз',\n            M: 'як моҳ',\n            MM: '%d моҳ',\n            y: 'як сол',\n            yy: '%d сол',\n        },\n        meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'шаб') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'субҳ') {\n                return hour;\n            } else if (meridiem === 'рӯз') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'бегоҳ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'шаб';\n            } else if (hour < 11) {\n                return 'субҳ';\n            } else if (hour < 16) {\n                return 'рӯз';\n            } else if (hour < 19) {\n                return 'бегоҳ';\n            } else {\n                return 'шаб';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ум|юм)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1th is the first week of the year.\n        },\n    });\n\n    return tg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Thai [th]\n//! author : Kridsada Thanabulpong : https://github.com/sirn\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var th = moment.defineLocale('th', {\n        months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(\n            '_'\n        ),\n        monthsShort:\n            'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n        weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference\n        weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY เวลา H:mm',\n            LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',\n        },\n        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n        isPM: function (input) {\n            return input === 'หลังเที่ยง';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ก่อนเที่ยง';\n            } else {\n                return 'หลังเที่ยง';\n            }\n        },\n        calendar: {\n            sameDay: '[วันนี้ เวลา] LT',\n            nextDay: '[พรุ่งนี้ เวลา] LT',\n            nextWeek: 'dddd[หน้า เวลา] LT',\n            lastDay: '[เมื่อวานนี้ เวลา] LT',\n            lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'อีก %s',\n            past: '%sที่แล้ว',\n            s: 'ไม่กี่วินาที',\n            ss: '%d วินาที',\n            m: '1 นาที',\n            mm: '%d นาที',\n            h: '1 ชั่วโมง',\n            hh: '%d ชั่วโมง',\n            d: '1 วัน',\n            dd: '%d วัน',\n            w: '1 สัปดาห์',\n            ww: '%d สัปดาห์',\n            M: '1 เดือน',\n            MM: '%d เดือน',\n            y: '1 ปี',\n            yy: '%d ปี',\n        },\n    });\n\n    return th;\n\n})));\n","//! moment.js locale configuration\n//! locale : Turkmen [tk]\n//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: \"'inji\",\n        5: \"'inji\",\n        8: \"'inji\",\n        70: \"'inji\",\n        80: \"'inji\",\n        2: \"'nji\",\n        7: \"'nji\",\n        20: \"'nji\",\n        50: \"'nji\",\n        3: \"'ünji\",\n        4: \"'ünji\",\n        100: \"'ünji\",\n        6: \"'njy\",\n        9: \"'unjy\",\n        10: \"'unjy\",\n        30: \"'unjy\",\n        60: \"'ynjy\",\n        90: \"'ynjy\",\n    };\n\n    var tk = moment.defineLocale('tk', {\n        months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),\n        weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(\n            '_'\n        ),\n        weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),\n        weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün sagat] LT',\n            nextDay: '[ertir sagat] LT',\n            nextWeek: '[indiki] dddd [sagat] LT',\n            lastDay: '[düýn] LT',\n            lastWeek: '[geçen] dddd [sagat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s soň',\n            past: '%s öň',\n            s: 'birnäçe sekunt',\n            m: 'bir minut',\n            mm: '%d minut',\n            h: 'bir sagat',\n            hh: '%d sagat',\n            d: 'bir gün',\n            dd: '%d gün',\n            M: 'bir aý',\n            MM: '%d aý',\n            y: 'bir ýyl',\n            yy: '%d ýyl',\n        },\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'Do':\n                case 'DD':\n                    return number;\n                default:\n                    if (number === 0) {\n                        // special case for zero\n                        return number + \"'unjy\";\n                    }\n                    var a = number % 10,\n                        b = (number % 100) - a,\n                        c = number >= 100 ? 100 : null;\n                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return tk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tagalog (Philippines) [tl-ph]\n//! author : Dan Hagman : https://github.com/hagmandan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tlPh = moment.defineLocale('tl-ph', {\n        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(\n            '_'\n        ),\n        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(\n            '_'\n        ),\n        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'MM/D/YYYY',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY HH:mm',\n            LLLL: 'dddd, MMMM DD, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: 'LT [ngayong araw]',\n            nextDay: '[Bukas ng] LT',\n            nextWeek: 'LT [sa susunod na] dddd',\n            lastDay: 'LT [kahapon]',\n            lastWeek: 'LT [noong nakaraang] dddd',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'sa loob ng %s',\n            past: '%s ang nakalipas',\n            s: 'ilang segundo',\n            ss: '%d segundo',\n            m: 'isang minuto',\n            mm: '%d minuto',\n            h: 'isang oras',\n            hh: '%d oras',\n            d: 'isang araw',\n            dd: '%d araw',\n            M: 'isang buwan',\n            MM: '%d buwan',\n            y: 'isang taon',\n            yy: '%d taon',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tlPh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Klingon [tlh]\n//! author : Dominika Kruk : https://github.com/amaranthrose\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\n    function translateFuture(output) {\n        var time = output;\n        time =\n            output.indexOf('jaj') !== -1\n                ? time.slice(0, -3) + 'leS'\n                : output.indexOf('jar') !== -1\n                  ? time.slice(0, -3) + 'waQ'\n                  : output.indexOf('DIS') !== -1\n                    ? time.slice(0, -3) + 'nem'\n                    : time + ' pIq';\n        return time;\n    }\n\n    function translatePast(output) {\n        var time = output;\n        time =\n            output.indexOf('jaj') !== -1\n                ? time.slice(0, -3) + 'Hu’'\n                : output.indexOf('jar') !== -1\n                  ? time.slice(0, -3) + 'wen'\n                  : output.indexOf('DIS') !== -1\n                    ? time.slice(0, -3) + 'ben'\n                    : time + ' ret';\n        return time;\n    }\n\n    function translate(number, withoutSuffix, string, isFuture) {\n        var numberNoun = numberAsNoun(number);\n        switch (string) {\n            case 'ss':\n                return numberNoun + ' lup';\n            case 'mm':\n                return numberNoun + ' tup';\n            case 'hh':\n                return numberNoun + ' rep';\n            case 'dd':\n                return numberNoun + ' jaj';\n            case 'MM':\n                return numberNoun + ' jar';\n            case 'yy':\n                return numberNoun + ' DIS';\n        }\n    }\n\n    function numberAsNoun(number) {\n        var hundred = Math.floor((number % 1000) / 100),\n            ten = Math.floor((number % 100) / 10),\n            one = number % 10,\n            word = '';\n        if (hundred > 0) {\n            word += numbersNouns[hundred] + 'vatlh';\n        }\n        if (ten > 0) {\n            word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';\n        }\n        if (one > 0) {\n            word += (word !== '' ? ' ' : '') + numbersNouns[one];\n        }\n        return word === '' ? 'pagh' : word;\n    }\n\n    var tlh = moment.defineLocale('tlh', {\n        months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(\n            '_'\n        ),\n        monthsShort:\n            'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(\n            '_'\n        ),\n        weekdaysShort:\n            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n        weekdaysMin:\n            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[DaHjaj] LT',\n            nextDay: '[wa’leS] LT',\n            nextWeek: 'LLL',\n            lastDay: '[wa’Hu’] LT',\n            lastWeek: 'LLL',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: translateFuture,\n            past: translatePast,\n            s: 'puS lup',\n            ss: translate,\n            m: 'wa’ tup',\n            mm: translate,\n            h: 'wa’ rep',\n            hh: translate,\n            d: 'wa’ jaj',\n            dd: translate,\n            M: 'wa’ jar',\n            MM: translate,\n            y: 'wa’ DIS',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tlh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Turkish [tr]\n//! authors : Erhan Gundogan : https://github.com/erhangundogan,\n//!           Burak Yiğit Kaya: https://github.com/BYK\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: \"'inci\",\n        5: \"'inci\",\n        8: \"'inci\",\n        70: \"'inci\",\n        80: \"'inci\",\n        2: \"'nci\",\n        7: \"'nci\",\n        20: \"'nci\",\n        50: \"'nci\",\n        3: \"'üncü\",\n        4: \"'üncü\",\n        100: \"'üncü\",\n        6: \"'ncı\",\n        9: \"'uncu\",\n        10: \"'uncu\",\n        30: \"'uncu\",\n        60: \"'ıncı\",\n        90: \"'ıncı\",\n    };\n\n    var tr = moment.defineLocale('tr', {\n        months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(\n            '_'\n        ),\n        monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),\n        weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(\n            '_'\n        ),\n        weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),\n        weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'öö' : 'ÖÖ';\n            } else {\n                return isLower ? 'ös' : 'ÖS';\n            }\n        },\n        meridiemParse: /öö|ÖÖ|ös|ÖS/,\n        isPM: function (input) {\n            return input === 'ös' || input === 'ÖS';\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün saat] LT',\n            nextDay: '[yarın saat] LT',\n            nextWeek: '[gelecek] dddd [saat] LT',\n            lastDay: '[dün] LT',\n            lastWeek: '[geçen] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s sonra',\n            past: '%s önce',\n            s: 'birkaç saniye',\n            ss: '%d saniye',\n            m: 'bir dakika',\n            mm: '%d dakika',\n            h: 'bir saat',\n            hh: '%d saat',\n            d: 'bir gün',\n            dd: '%d gün',\n            w: 'bir hafta',\n            ww: '%d hafta',\n            M: 'bir ay',\n            MM: '%d ay',\n            y: 'bir yıl',\n            yy: '%d yıl',\n        },\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'Do':\n                case 'DD':\n                    return number;\n                default:\n                    if (number === 0) {\n                        // special case for zero\n                        return number + \"'ıncı\";\n                    }\n                    var a = number % 10,\n                        b = (number % 100) - a,\n                        c = number >= 100 ? 100 : null;\n                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return tr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Talossan [tzl]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n//! author : Iustì Canun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.\n    // This is currently too difficult (maybe even impossible) to add.\n    var tzl = moment.defineLocale('tzl', {\n        months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),\n        weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),\n        weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),\n        weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM [dallas] YYYY',\n            LLL: 'D. MMMM [dallas] YYYY HH.mm',\n            LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',\n        },\n        meridiemParse: /d\\'o|d\\'a/i,\n        isPM: function (input) {\n            return \"d'o\" === input.toLowerCase();\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? \"d'o\" : \"D'O\";\n            } else {\n                return isLower ? \"d'a\" : \"D'A\";\n            }\n        },\n        calendar: {\n            sameDay: '[oxhi à] LT',\n            nextDay: '[demà à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[ieiri à] LT',\n            lastWeek: '[sür el] dddd [lasteu à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'osprei %s',\n            past: 'ja%s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['viensas secunds', \"'iensas secunds\"],\n            ss: [number + ' secunds', '' + number + ' secunds'],\n            m: [\"'n míut\", \"'iens míut\"],\n            mm: [number + ' míuts', '' + number + ' míuts'],\n            h: [\"'n þora\", \"'iensa þora\"],\n            hh: [number + ' þoras', '' + number + ' þoras'],\n            d: [\"'n ziua\", \"'iensa ziua\"],\n            dd: [number + ' ziuas', '' + number + ' ziuas'],\n            M: [\"'n mes\", \"'iens mes\"],\n            MM: [number + ' mesen', '' + number + ' mesen'],\n            y: [\"'n ar\", \"'iens ar\"],\n            yy: [number + ' ars', '' + number + ' ars'],\n        };\n        return isFuture\n            ? format[key][0]\n            : withoutSuffix\n              ? format[key][0]\n              : format[key][1];\n    }\n\n    return tzl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Central Atlas Tamazight Latin [tzm-latn]\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tzmLatn = moment.defineLocale('tzm-latn', {\n        months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(\n            '_'\n        ),\n        monthsShort:\n            'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(\n                '_'\n            ),\n        weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[asdkh g] LT',\n            nextDay: '[aska g] LT',\n            nextWeek: 'dddd [g] LT',\n            lastDay: '[assant g] LT',\n            lastWeek: 'dddd [g] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dadkh s yan %s',\n            past: 'yan %s',\n            s: 'imik',\n            ss: '%d imik',\n            m: 'minuḍ',\n            mm: '%d minuḍ',\n            h: 'saɛa',\n            hh: '%d tassaɛin',\n            d: 'ass',\n            dd: '%d ossan',\n            M: 'ayowr',\n            MM: '%d iyyirn',\n            y: 'asgas',\n            yy: '%d isgasn',\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return tzmLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Central Atlas Tamazight [tzm]\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tzm = moment.defineLocale('tzm', {\n        months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(\n                '_'\n            ),\n        weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',\n            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',\n            nextWeek: 'dddd [ⴴ] LT',\n            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',\n            lastWeek: 'dddd [ⴴ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',\n            past: 'ⵢⴰⵏ %s',\n            s: 'ⵉⵎⵉⴽ',\n            ss: '%d ⵉⵎⵉⴽ',\n            m: 'ⵎⵉⵏⵓⴺ',\n            mm: '%d ⵎⵉⵏⵓⴺ',\n            h: 'ⵙⴰⵄⴰ',\n            hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',\n            d: 'ⴰⵙⵙ',\n            dd: '%d oⵙⵙⴰⵏ',\n            M: 'ⴰⵢoⵓⵔ',\n            MM: '%d ⵉⵢⵢⵉⵔⵏ',\n            y: 'ⴰⵙⴳⴰⵙ',\n            yy: '%d ⵉⵙⴳⴰⵙⵏ',\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return tzm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uyghur (China) [ug-cn]\n//! author: boyaq : https://github.com/boyaq\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ugCn = moment.defineLocale('ug-cn', {\n        months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n                '_'\n            ),\n        weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(\n            '_'\n        ),\n        weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n        weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n            LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n            LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n        },\n        meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                meridiem === 'يېرىم كېچە' ||\n                meridiem === 'سەھەر' ||\n                meridiem === 'چۈشتىن بۇرۇن'\n            ) {\n                return hour;\n            } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n                return hour + 12;\n            } else {\n                return hour >= 11 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return 'يېرىم كېچە';\n            } else if (hm < 900) {\n                return 'سەھەر';\n            } else if (hm < 1130) {\n                return 'چۈشتىن بۇرۇن';\n            } else if (hm < 1230) {\n                return 'چۈش';\n            } else if (hm < 1800) {\n                return 'چۈشتىن كېيىن';\n            } else {\n                return 'كەچ';\n            }\n        },\n        calendar: {\n            sameDay: '[بۈگۈن سائەت] LT',\n            nextDay: '[ئەتە سائەت] LT',\n            nextWeek: '[كېلەركى] dddd [سائەت] LT',\n            lastDay: '[تۆنۈگۈن] LT',\n            lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s كېيىن',\n            past: '%s بۇرۇن',\n            s: 'نەچچە سېكونت',\n            ss: '%d سېكونت',\n            m: 'بىر مىنۇت',\n            mm: '%d مىنۇت',\n            h: 'بىر سائەت',\n            hh: '%d سائەت',\n            d: 'بىر كۈن',\n            dd: '%d كۈن',\n            M: 'بىر ئاي',\n            MM: '%d ئاي',\n            y: 'بىر يىل',\n            yy: '%d يىل',\n        },\n\n        dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '-كۈنى';\n                case 'w':\n                case 'W':\n                    return number + '-ھەپتە';\n                default:\n                    return number;\n            }\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return ugCn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Ukrainian [uk]\n//! author : zemlanin : https://github.com/zemlanin\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n            mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n            hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n            dd: 'день_дні_днів',\n            MM: 'місяць_місяці_місяців',\n            yy: 'рік_роки_років',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'хвилина' : 'хвилину';\n        } else if (key === 'h') {\n            return withoutSuffix ? 'година' : 'годину';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n    function weekdaysCaseReplace(m, format) {\n        var weekdays = {\n                nominative:\n                    'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(\n                        '_'\n                    ),\n                accusative:\n                    'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(\n                        '_'\n                    ),\n                genitive:\n                    'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(\n                        '_'\n                    ),\n            },\n            nounCase;\n\n        if (m === true) {\n            return weekdays['nominative']\n                .slice(1, 7)\n                .concat(weekdays['nominative'].slice(0, 1));\n        }\n        if (!m) {\n            return weekdays['nominative'];\n        }\n\n        nounCase = /(\\[[ВвУу]\\]) ?dddd/.test(format)\n            ? 'accusative'\n            : /\\[?(?:минулої|наступної)? ?\\] ?dddd/.test(format)\n              ? 'genitive'\n              : 'nominative';\n        return weekdays[nounCase][m.day()];\n    }\n    function processHoursFunction(str) {\n        return function () {\n            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n        };\n    }\n\n    var uk = moment.defineLocale('uk', {\n        months: {\n            format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(\n                '_'\n            ),\n            standalone:\n                'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(\n            '_'\n        ),\n        weekdays: weekdaysCaseReplace,\n        weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY р.',\n            LLL: 'D MMMM YYYY р., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY р., HH:mm',\n        },\n        calendar: {\n            sameDay: processHoursFunction('[Сьогодні '),\n            nextDay: processHoursFunction('[Завтра '),\n            lastDay: processHoursFunction('[Вчора '),\n            nextWeek: processHoursFunction('[У] dddd ['),\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 5:\n                    case 6:\n                        return processHoursFunction('[Минулої] dddd [').call(this);\n                    case 1:\n                    case 2:\n                    case 4:\n                        return processHoursFunction('[Минулого] dddd [').call(this);\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: '%s тому',\n            s: 'декілька секунд',\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: 'годину',\n            hh: relativeTimeWithPlural,\n            d: 'день',\n            dd: relativeTimeWithPlural,\n            M: 'місяць',\n            MM: relativeTimeWithPlural,\n            y: 'рік',\n            yy: relativeTimeWithPlural,\n        },\n        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n        meridiemParse: /ночі|ранку|дня|вечора/,\n        isPM: function (input) {\n            return /^(дня|вечора)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночі';\n            } else if (hour < 12) {\n                return 'ранку';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечора';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                case 'w':\n                case 'W':\n                    return number + '-й';\n                case 'D':\n                    return number + '-го';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return uk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Urdu [ur]\n//! author : Sawood Alam : https://github.com/ibnesayeed\n//! author : Zack : https://github.com/ZackVision\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'جنوری',\n            'فروری',\n            'مارچ',\n            'اپریل',\n            'مئی',\n            'جون',\n            'جولائی',\n            'اگست',\n            'ستمبر',\n            'اکتوبر',\n            'نومبر',\n            'دسمبر',\n        ],\n        days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];\n\n    var ur = moment.defineLocale('ur', {\n        months: months,\n        monthsShort: months,\n        weekdays: days,\n        weekdaysShort: days,\n        weekdaysMin: days,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd، D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /صبح|شام/,\n        isPM: function (input) {\n            return 'شام' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'صبح';\n            }\n            return 'شام';\n        },\n        calendar: {\n            sameDay: '[آج بوقت] LT',\n            nextDay: '[کل بوقت] LT',\n            nextWeek: 'dddd [بوقت] LT',\n            lastDay: '[گذشتہ روز بوقت] LT',\n            lastWeek: '[گذشتہ] dddd [بوقت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s بعد',\n            past: '%s قبل',\n            s: 'چند سیکنڈ',\n            ss: '%d سیکنڈ',\n            m: 'ایک منٹ',\n            mm: '%d منٹ',\n            h: 'ایک گھنٹہ',\n            hh: '%d گھنٹے',\n            d: 'ایک دن',\n            dd: '%d دن',\n            M: 'ایک ماہ',\n            MM: '%d ماہ',\n            y: 'ایک سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ur;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uzbek Latin [uz-latn]\n//! author : Rasulbek Mirzayev : github.com/Rasulbeeek\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var uzLatn = moment.defineLocale('uz-latn', {\n        months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),\n        weekdays:\n            'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(\n                '_'\n            ),\n        weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),\n        weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'D MMMM YYYY, dddd HH:mm',\n        },\n        calendar: {\n            sameDay: '[Bugun soat] LT [da]',\n            nextDay: '[Ertaga] LT [da]',\n            nextWeek: 'dddd [kuni soat] LT [da]',\n            lastDay: '[Kecha soat] LT [da]',\n            lastWeek: \"[O'tgan] dddd [kuni soat] LT [da]\",\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'Yaqin %s ichida',\n            past: 'Bir necha %s oldin',\n            s: 'soniya',\n            ss: '%d soniya',\n            m: 'bir daqiqa',\n            mm: '%d daqiqa',\n            h: 'bir soat',\n            hh: '%d soat',\n            d: 'bir kun',\n            dd: '%d kun',\n            M: 'bir oy',\n            MM: '%d oy',\n            y: 'bir yil',\n            yy: '%d yil',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return uzLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uzbek [uz]\n//! author : Sardor Muminov : https://github.com/muminoff\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var uz = moment.defineLocale('uz', {\n        months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(\n            '_'\n        ),\n        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n        weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n        weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n        weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'D MMMM YYYY, dddd HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бугун соат] LT [да]',\n            nextDay: '[Эртага] LT [да]',\n            nextWeek: 'dddd [куни соат] LT [да]',\n            lastDay: '[Кеча соат] LT [да]',\n            lastWeek: '[Утган] dddd [куни соат] LT [да]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'Якин %s ичида',\n            past: 'Бир неча %s олдин',\n            s: 'фурсат',\n            ss: '%d фурсат',\n            m: 'бир дакика',\n            mm: '%d дакика',\n            h: 'бир соат',\n            hh: '%d соат',\n            d: 'бир кун',\n            dd: '%d кун',\n            M: 'бир ой',\n            MM: '%d ой',\n            y: 'бир йил',\n            yy: '%d йил',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return uz;\n\n})));\n","//! moment.js locale configuration\n//! locale : Vietnamese [vi]\n//! author : Bang Nguyen : https://github.com/bangnk\n//! author : Chien Kira : https://github.com/chienkira\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var vi = moment.defineLocale('vi', {\n        months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(\n            '_'\n        ),\n        monthsShort:\n            'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(\n            '_'\n        ),\n        weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n        weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n        weekdaysParseExact: true,\n        meridiemParse: /sa|ch/i,\n        isPM: function (input) {\n            return /^ch$/i.test(input);\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'sa' : 'SA';\n            } else {\n                return isLower ? 'ch' : 'CH';\n            }\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [năm] YYYY',\n            LLL: 'D MMMM [năm] YYYY HH:mm',\n            LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',\n            l: 'DD/M/YYYY',\n            ll: 'D MMM YYYY',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd, D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hôm nay lúc] LT',\n            nextDay: '[Ngày mai lúc] LT',\n            nextWeek: 'dddd [tuần tới lúc] LT',\n            lastDay: '[Hôm qua lúc] LT',\n            lastWeek: 'dddd [tuần trước lúc] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s tới',\n            past: '%s trước',\n            s: 'vài giây',\n            ss: '%d giây',\n            m: 'một phút',\n            mm: '%d phút',\n            h: 'một giờ',\n            hh: '%d giờ',\n            d: 'một ngày',\n            dd: '%d ngày',\n            w: 'một tuần',\n            ww: '%d tuần',\n            M: 'một tháng',\n            MM: '%d tháng',\n            y: 'một năm',\n            yy: '%d năm',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return vi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Pseudo [x-pseudo]\n//! author : Andrew Hood : https://github.com/andrewhood125\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var xPseudo = moment.defineLocale('x-pseudo', {\n        months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(\n            '_'\n        ),\n        monthsShort:\n            'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(\n                '_'\n            ),\n        weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n        weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[T~ódá~ý át] LT',\n            nextDay: '[T~ómó~rró~w át] LT',\n            nextWeek: 'dddd [át] LT',\n            lastDay: '[Ý~ést~érdá~ý át] LT',\n            lastWeek: '[L~ást] dddd [át] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'í~ñ %s',\n            past: '%s á~gó',\n            s: 'á ~féw ~sécó~ñds',\n            ss: '%d s~écóñ~ds',\n            m: 'á ~míñ~úté',\n            mm: '%d m~íñú~tés',\n            h: 'á~ñ hó~úr',\n            hh: '%d h~óúrs',\n            d: 'á ~dáý',\n            dd: '%d d~áýs',\n            M: 'á ~móñ~th',\n            MM: '%d m~óñt~hs',\n            y: 'á ~ýéár',\n            yy: '%d ý~éárs',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return xPseudo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Yoruba Nigeria [yo]\n//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var yo = moment.defineLocale('yo', {\n        months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(\n            '_'\n        ),\n        monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),\n        weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),\n        weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),\n        weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Ònì ni] LT',\n            nextDay: '[Ọ̀la ni] LT',\n            nextWeek: \"dddd [Ọsẹ̀ tón'bọ] [ni] LT\",\n            lastDay: '[Àna ni] LT',\n            lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ní %s',\n            past: '%s kọjá',\n            s: 'ìsẹjú aayá die',\n            ss: 'aayá %d',\n            m: 'ìsẹjú kan',\n            mm: 'ìsẹjú %d',\n            h: 'wákati kan',\n            hh: 'wákati %d',\n            d: 'ọjọ́ kan',\n            dd: 'ọjọ́ %d',\n            M: 'osù kan',\n            MM: 'osù %d',\n            y: 'ọdún kan',\n            yy: 'ọdún %d',\n        },\n        dayOfMonthOrdinalParse: /ọjọ́\\s\\d{1,2}/,\n        ordinal: 'ọjọ́ %d',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return yo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (China) [zh-cn]\n//! author : suupic : https://github.com/suupic\n//! author : Zeno Zeng : https://github.com/zenozeng\n//! author : uu109 : https://github.com/uu109\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhCn = moment.defineLocale('zh-cn', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日Ah点mm分',\n            LLLL: 'YYYY年M月D日ddddAh点mm分',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            } else {\n                // '中午'\n                return hour >= 11 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天]LT',\n            nextDay: '[明天]LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    return '[下]dddLT';\n                } else {\n                    return '[本]dddLT';\n                }\n            },\n            lastDay: '[昨天]LT',\n            lastWeek: function (now) {\n                if (this.week() !== now.week()) {\n                    return '[上]dddLT';\n                } else {\n                    return '[本]dddLT';\n                }\n            },\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '周';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s后',\n            past: '%s前',\n            s: '几秒',\n            ss: '%d 秒',\n            m: '1 分钟',\n            mm: '%d 分钟',\n            h: '1 小时',\n            hh: '%d 小时',\n            d: '1 天',\n            dd: '%d 天',\n            w: '1 周',\n            ww: '%d 周',\n            M: '1 个月',\n            MM: '%d 个月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n        week: {\n            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return zhCn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Hong Kong) [zh-hk]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Konstantin : https://github.com/skfd\n//! author : Anthony : https://github.com/anthonylau\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhHk = moment.defineLocale('zh-hk', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1200) {\n                return '上午';\n            } else if (hm === 1200) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天]LT',\n            nextDay: '[明天]LT',\n            nextWeek: '[下]ddddLT',\n            lastDay: '[昨天]LT',\n            lastWeek: '[上]ddddLT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhHk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Macau) [zh-mo]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Tan Yuanhong : https://github.com/le0tan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhMo = moment.defineLocale('zh-mo', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'D/M/YYYY',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天] LT',\n            nextDay: '[明天] LT',\n            nextWeek: '[下]dddd LT',\n            lastDay: '[昨天] LT',\n            lastWeek: '[上]dddd LT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s內',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhMo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Taiwan) [zh-tw]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhTw = moment.defineLocale('zh-tw', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天] LT',\n            nextDay: '[明天] LT',\n            nextWeek: '[下]dddd LT',\n            lastDay: '[昨天] LT',\n            lastWeek: '[上]dddd LT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhTw;\n\n})));\n","//! moment.js\n//! version : 2.30.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks() {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback(callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return (\n            input instanceof Array ||\n            Object.prototype.toString.call(input) === '[object Array]'\n        );\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return (\n            input != null &&\n            Object.prototype.toString.call(input) === '[object Object]'\n        );\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return Object.getOwnPropertyNames(obj).length === 0;\n        } else {\n            var k;\n            for (k in obj) {\n                if (hasOwnProp(obj, k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return (\n            typeof input === 'number' ||\n            Object.prototype.toString.call(input) === '[object Number]'\n        );\n    }\n\n    function isDate(input) {\n        return (\n            input instanceof Date ||\n            Object.prototype.toString.call(input) === '[object Date]'\n        );\n    }\n\n    function map(arr, fn) {\n        var res = [],\n            i,\n            arrLen = arr.length;\n        for (i = 0; i < arrLen; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty: false,\n            unusedTokens: [],\n            unusedInput: [],\n            overflow: -2,\n            charsLeftOver: 0,\n            nullInput: false,\n            invalidEra: null,\n            invalidMonth: null,\n            invalidFormat: false,\n            userInvalidated: false,\n            iso: false,\n            parsedDateParts: [],\n            era: null,\n            meridiem: null,\n            rfc2822: false,\n            weekdayMismatch: false,\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this),\n                len = t.length >>> 0,\n                i;\n\n            for (i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        var flags = null,\n            parsedParts = false,\n            isNowValid = m._d && !isNaN(m._d.getTime());\n        if (isNowValid) {\n            flags = getParsingFlags(m);\n            parsedParts = some.call(flags.parsedDateParts, function (i) {\n                return i != null;\n            });\n            isNowValid =\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidEra &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.weekdayMismatch &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated &&\n                (!flags.meridiem || (flags.meridiem && parsedParts));\n            if (m._strict) {\n                isNowValid =\n                    isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n        }\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        } else {\n            return isNowValid;\n        }\n        return m._isValid;\n    }\n\n    function createInvalid(flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        } else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = (hooks.momentProperties = []),\n        updateInProgress = false;\n\n    function copyConfig(to, from) {\n        var i,\n            prop,\n            val,\n            momentPropertiesLen = momentProperties.length;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentPropertiesLen > 0) {\n            for (i = 0; i < momentPropertiesLen; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment(obj) {\n        return (\n            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n        );\n    }\n\n    function warn(msg) {\n        if (\n            hooks.suppressDeprecationWarnings === false &&\n            typeof console !== 'undefined' &&\n            console.warn\n        ) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [],\n                    arg,\n                    i,\n                    key,\n                    argLen = arguments.length;\n                for (i = 0; i < argLen; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (key in arguments[0]) {\n                            if (hasOwnProp(arguments[0], key)) {\n                                arg += key + ': ' + arguments[0][key] + ', ';\n                            }\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(\n                    msg +\n                        '\\nArguments: ' +\n                        Array.prototype.slice.call(args).join('') +\n                        '\\n' +\n                        new Error().stack\n                );\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    function set(config) {\n        var prop, i;\n        for (i in config) {\n            if (hasOwnProp(config, i)) {\n                prop = config[i];\n                if (isFunction(prop)) {\n                    this[i] = prop;\n                } else {\n                    this['_' + i] = prop;\n                }\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' +\n                /\\d{1,2}/.source\n        );\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig),\n            prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (\n                hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])\n            ) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i,\n                res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay: '[Today at] LT',\n        nextDay: '[Tomorrow at] LT',\n        nextWeek: 'dddd [at] LT',\n        lastDay: '[Yesterday at] LT',\n        lastWeek: '[Last] dddd [at] LT',\n        sameElse: 'L',\n    };\n\n    function calendar(key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (\n            (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n            absNumber\n        );\n    }\n\n    var formattingTokens =\n            /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n        localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n        formatFunctions = {},\n        formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken(token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(\n                    func.apply(this, arguments),\n                    token\n                );\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens),\n            i,\n            length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '',\n                i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i])\n                    ? array[i].call(mom, format)\n                    : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] =\n            formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(\n                localFormattingTokens,\n                replaceLongDateFormatTokens\n            );\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var defaultLongDateFormat = {\n        LTS: 'h:mm:ss A',\n        LT: 'h:mm A',\n        L: 'MM/DD/YYYY',\n        LL: 'MMMM D, YYYY',\n        LLL: 'MMMM D, YYYY h:mm A',\n        LLLL: 'dddd, MMMM D, YYYY h:mm A',\n    };\n\n    function longDateFormat(key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper\n            .match(formattingTokens)\n            .map(function (tok) {\n                if (\n                    tok === 'MMMM' ||\n                    tok === 'MM' ||\n                    tok === 'DD' ||\n                    tok === 'dddd'\n                ) {\n                    return tok.slice(1);\n                }\n                return tok;\n            })\n            .join('');\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate() {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d',\n        defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal(number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future: 'in %s',\n        past: '%s ago',\n        s: 'a few seconds',\n        ss: '%d seconds',\n        m: 'a minute',\n        mm: '%d minutes',\n        h: 'an hour',\n        hh: '%d hours',\n        d: 'a day',\n        dd: '%d days',\n        w: 'a week',\n        ww: '%d weeks',\n        M: 'a month',\n        MM: '%d months',\n        y: 'a year',\n        yy: '%d years',\n    };\n\n    function relativeTime(number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return isFunction(output)\n            ? output(number, withoutSuffix, string, isFuture)\n            : output.replace(/%d/i, number);\n    }\n\n    function pastFuture(diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {\n        D: 'date',\n        dates: 'date',\n        date: 'date',\n        d: 'day',\n        days: 'day',\n        day: 'day',\n        e: 'weekday',\n        weekdays: 'weekday',\n        weekday: 'weekday',\n        E: 'isoWeekday',\n        isoweekdays: 'isoWeekday',\n        isoweekday: 'isoWeekday',\n        DDD: 'dayOfYear',\n        dayofyears: 'dayOfYear',\n        dayofyear: 'dayOfYear',\n        h: 'hour',\n        hours: 'hour',\n        hour: 'hour',\n        ms: 'millisecond',\n        milliseconds: 'millisecond',\n        millisecond: 'millisecond',\n        m: 'minute',\n        minutes: 'minute',\n        minute: 'minute',\n        M: 'month',\n        months: 'month',\n        month: 'month',\n        Q: 'quarter',\n        quarters: 'quarter',\n        quarter: 'quarter',\n        s: 'second',\n        seconds: 'second',\n        second: 'second',\n        gg: 'weekYear',\n        weekyears: 'weekYear',\n        weekyear: 'weekYear',\n        GG: 'isoWeekYear',\n        isoweekyears: 'isoWeekYear',\n        isoweekyear: 'isoWeekYear',\n        w: 'week',\n        weeks: 'week',\n        week: 'week',\n        W: 'isoWeek',\n        isoweeks: 'isoWeek',\n        isoweek: 'isoWeek',\n        y: 'year',\n        years: 'year',\n        year: 'year',\n    };\n\n    function normalizeUnits(units) {\n        return typeof units === 'string'\n            ? aliases[units] || aliases[units.toLowerCase()]\n            : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {\n        date: 9,\n        day: 11,\n        weekday: 11,\n        isoWeekday: 11,\n        dayOfYear: 4,\n        hour: 13,\n        millisecond: 16,\n        minute: 14,\n        month: 8,\n        quarter: 7,\n        second: 15,\n        weekYear: 1,\n        isoWeekYear: 1,\n        week: 5,\n        isoWeek: 5,\n        year: 1,\n    };\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [],\n            u;\n        for (u in unitsObj) {\n            if (hasOwnProp(unitsObj, u)) {\n                units.push({ unit: u, priority: priorities[u] });\n            }\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    var match1 = /\\d/, //       0 - 9\n        match2 = /\\d\\d/, //      00 - 99\n        match3 = /\\d{3}/, //     000 - 999\n        match4 = /\\d{4}/, //    0000 - 9999\n        match6 = /[+-]?\\d{6}/, // -999999 - 999999\n        match1to2 = /\\d\\d?/, //       0 - 99\n        match3to4 = /\\d\\d\\d\\d?/, //     999 - 9999\n        match5to6 = /\\d\\d\\d\\d\\d\\d?/, //   99999 - 999999\n        match1to3 = /\\d{1,3}/, //       0 - 999\n        match1to4 = /\\d{1,4}/, //       0 - 9999\n        match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n        matchUnsigned = /\\d+/, //       0 - inf\n        matchSigned = /[+-]?\\d+/, //    -inf - inf\n        matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n        matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n        matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n        // any word (or two) characters or numbers including two/three word month in arabic.\n        // includes scottish gaelic two word and hyphenated months\n        matchWord =\n            /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n        match1to2NoLeadingZero = /^[1-9]\\d?/, //         1-99\n        match1to2HasZero = /^([1-9]\\d|\\d)/, //           0-99\n        regexes;\n\n    regexes = {};\n\n    function addRegexToken(token, regex, strictRegex) {\n        regexes[token] = isFunction(regex)\n            ? regex\n            : function (isStrict, localeData) {\n                  return isStrict && strictRegex ? strictRegex : regex;\n              };\n    }\n\n    function getParseRegexForToken(token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(\n            s\n                .replace('\\\\', '')\n                .replace(\n                    /\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,\n                    function (matched, p1, p2, p3, p4) {\n                        return p1 || p2 || p3 || p4;\n                    }\n                )\n        );\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    function absFloor(number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    var tokens = {};\n\n    function addParseToken(token, callback) {\n        var i,\n            func = callback,\n            tokenLen;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        tokenLen = token.length;\n        for (i = 0; i < tokenLen; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken(token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    var YEAR = 0,\n        MONTH = 1,\n        DATE = 2,\n        HOUR = 3,\n        MINUTE = 4,\n        SECOND = 5,\n        MILLISECOND = 6,\n        WEEK = 7,\n        WEEKDAY = 8;\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY', 4], 0, 'year');\n    addFormatToken(0, ['YYYYY', 5], 0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // PARSING\n\n    addRegexToken('Y', matchSigned);\n    addRegexToken('YY', match1to2, match2);\n    addRegexToken('YYYY', match1to4, match4);\n    addRegexToken('YYYYY', match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] =\n            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear() {\n        return isLeapYear(this.year());\n    }\n\n    function makeGetSet(unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get(mom, unit) {\n        if (!mom.isValid()) {\n            return NaN;\n        }\n\n        var d = mom._d,\n            isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();\n            case 'Seconds':\n                return isUTC ? d.getUTCSeconds() : d.getSeconds();\n            case 'Minutes':\n                return isUTC ? d.getUTCMinutes() : d.getMinutes();\n            case 'Hours':\n                return isUTC ? d.getUTCHours() : d.getHours();\n            case 'Date':\n                return isUTC ? d.getUTCDate() : d.getDate();\n            case 'Day':\n                return isUTC ? d.getUTCDay() : d.getDay();\n            case 'Month':\n                return isUTC ? d.getUTCMonth() : d.getMonth();\n            case 'FullYear':\n                return isUTC ? d.getUTCFullYear() : d.getFullYear();\n            default:\n                return NaN; // Just in case\n        }\n    }\n\n    function set$1(mom, unit, value) {\n        var d, isUTC, year, month, date;\n\n        if (!mom.isValid() || isNaN(value)) {\n            return;\n        }\n\n        d = mom._d;\n        isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return void (isUTC\n                    ? d.setUTCMilliseconds(value)\n                    : d.setMilliseconds(value));\n            case 'Seconds':\n                return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));\n            case 'Minutes':\n                return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));\n            case 'Hours':\n                return void (isUTC ? d.setUTCHours(value) : d.setHours(value));\n            case 'Date':\n                return void (isUTC ? d.setUTCDate(value) : d.setDate(value));\n            // case 'Day': // Not real\n            //    return void (isUTC ? d.setUTCDay(value) : d.setDay(value));\n            // case 'Month': // Not used because we need to pass two variables\n            //     return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));\n            case 'FullYear':\n                break; // See below ...\n            default:\n                return; // Just in case\n        }\n\n        year = value;\n        month = mom.month();\n        date = mom.date();\n        date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;\n        void (isUTC\n            ? d.setUTCFullYear(year, month, date)\n            : d.setFullYear(year, month, date));\n    }\n\n    // MOMENTS\n\n    function stringGet(units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n    function stringSet(units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units),\n                i,\n                prioritizedLen = prioritized.length;\n            for (i = 0; i < prioritizedLen; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1\n            ? isLeapYear(year)\n                ? 29\n                : 28\n            : 31 - ((modMonth % 7) % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // PARSING\n\n    addRegexToken('M', match1to2, match1to2NoLeadingZero);\n    addRegexToken('MM', match1to2, match2);\n    addRegexToken('MMM', function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths =\n            'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n                '_'\n            ),\n        defaultLocaleMonthsShort =\n            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n        defaultMonthsShortRegex = matchWord,\n        defaultMonthsRegex = matchWord;\n\n    function localeMonths(m, format) {\n        if (!m) {\n            return isArray(this._months)\n                ? this._months\n                : this._months['standalone'];\n        }\n        return isArray(this._months)\n            ? this._months[m.month()]\n            : this._months[\n                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n                      ? 'format'\n                      : 'standalone'\n              ][m.month()];\n    }\n\n    function localeMonthsShort(m, format) {\n        if (!m) {\n            return isArray(this._monthsShort)\n                ? this._monthsShort\n                : this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort)\n            ? this._monthsShort[m.month()]\n            : this._monthsShort[\n                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n              ][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse(monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp(\n                    '^' + this.months(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n                this._shortMonthsParse[i] = new RegExp(\n                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex =\n                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'MMMM' &&\n                this._longMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'MMM' &&\n                this._shortMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth(mom, value) {\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        var month = value,\n            date = mom.date();\n\n        date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));\n        void (mom._isUTC\n            ? mom._d.setUTCMonth(month, date)\n            : mom._d.setMonth(month, date));\n        return mom;\n    }\n\n    function getSetMonth(value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth() {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function monthsShortRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict\n                ? this._monthsShortStrictRegex\n                : this._monthsShortRegex;\n        }\n    }\n\n    function monthsRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict\n                ? this._monthsStrictRegex\n                : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            shortP,\n            longP;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortP = regexEscape(this.monthsShort(mom, ''));\n            longP = regexEscape(this.months(mom, ''));\n            shortPieces.push(shortP);\n            longPieces.push(longP);\n            mixedPieces.push(longP);\n            mixedPieces.push(shortP);\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._monthsShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    function createDate(y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date;\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            date = new Date(y + 400, m, d, h, M, s, ms);\n            if (isFinite(date.getFullYear())) {\n                date.setFullYear(y);\n            }\n        } else {\n            date = new Date(y, m, d, h, M, s, ms);\n        }\n\n        return date;\n    }\n\n    function createUTCDate(y) {\n        var date, args;\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            args = Array.prototype.slice.call(arguments);\n            // preserve leap years using a full 400 year cycle, then reset\n            args[0] = y + 400;\n            date = new Date(Date.UTC.apply(null, args));\n            if (isFinite(date.getUTCFullYear())) {\n                date.setUTCFullYear(y);\n            }\n        } else {\n            date = new Date(Date.UTC.apply(null, arguments));\n        }\n\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear,\n            resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear,\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek,\n            resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear,\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // PARSING\n\n    addRegexToken('w', match1to2, match1to2NoLeadingZero);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W', match1to2, match1to2NoLeadingZero);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(\n        ['w', 'ww', 'W', 'WW'],\n        function (input, week, config, token) {\n            week[token.substr(0, 1)] = toInt(input);\n        }\n    );\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek(mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6, // The week that contains Jan 6th is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek() {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear() {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek(input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek(input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // PARSING\n\n    addRegexToken('d', match1to2);\n    addRegexToken('e', match1to2);\n    addRegexToken('E', match1to2);\n    addRegexToken('dd', function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd', function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd', function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n    function shiftWeekdays(ws, n) {\n        return ws.slice(n, 7).concat(ws.slice(0, n));\n    }\n\n    var defaultLocaleWeekdays =\n            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        defaultWeekdaysRegex = matchWord,\n        defaultWeekdaysShortRegex = matchWord,\n        defaultWeekdaysMinRegex = matchWord;\n\n    function localeWeekdays(m, format) {\n        var weekdays = isArray(this._weekdays)\n            ? this._weekdays\n            : this._weekdays[\n                  m && m !== true && this._weekdays.isFormat.test(format)\n                      ? 'format'\n                      : 'standalone'\n              ];\n        return m === true\n            ? shiftWeekdays(weekdays, this._week.dow)\n            : m\n              ? weekdays[m.day()]\n              : weekdays;\n    }\n\n    function localeWeekdaysShort(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n            : m\n              ? this._weekdaysShort[m.day()]\n              : this._weekdaysShort;\n    }\n\n    function localeWeekdaysMin(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n            : m\n              ? this._weekdaysMin[m.day()]\n              : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse(weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._shortWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._minWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n            }\n            if (!this._weekdaysParse[i]) {\n                regex =\n                    '^' +\n                    this.weekdays(mom, '') +\n                    '|^' +\n                    this.weekdaysShort(mom, '') +\n                    '|^' +\n                    this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'dddd' &&\n                this._fullWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'ddd' &&\n                this._shortWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'dd' &&\n                this._minWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        var day = get(this, 'Day');\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    function weekdaysRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict\n                ? this._weekdaysStrictRegex\n                : this._weekdaysRegex;\n        }\n    }\n\n    function weekdaysShortRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict\n                ? this._weekdaysShortStrictRegex\n                : this._weekdaysShortRegex;\n        }\n    }\n\n    function weekdaysMinRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict\n                ? this._weekdaysMinStrictRegex\n                : this._weekdaysMinRegex;\n        }\n    }\n\n    function computeWeekdaysParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [],\n            shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            minp,\n            shortp,\n            longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = regexEscape(this.weekdaysMin(mom, ''));\n            shortp = regexEscape(this.weekdaysShort(mom, ''));\n            longp = regexEscape(this.weekdays(mom, ''));\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysMinStrictRegex = new RegExp(\n            '^(' + minPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return (\n            '' +\n            hFormat.apply(this) +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return (\n            '' +\n            this.hours() +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    function meridiem(token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(\n                this.hours(),\n                this.minutes(),\n                lowercase\n            );\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // PARSING\n\n    function matchMeridiem(isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a', matchMeridiem);\n    addRegexToken('A', matchMeridiem);\n    addRegexToken('H', match1to2, match1to2HasZero);\n    addRegexToken('h', match1to2, match1to2NoLeadingZero);\n    addRegexToken('k', match1to2, match1to2NoLeadingZero);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM(input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return (input + '').toLowerCase().charAt(0) === 'p';\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n        // Setting the hour should keep the time, because the user explicitly\n        // specified which hour they want. So trying to maintain the same hour (in\n        // a new timezone) makes sense. Adding/subtracting hours does not follow\n        // this rule.\n        getSetHour = makeGetSet('Hours', true);\n\n    function localeMeridiem(hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse,\n    };\n\n    // internal storage for locale config files\n    var locales = {},\n        localeFamilies = {},\n        globalLocale;\n\n    function commonPrefix(arr1, arr2) {\n        var i,\n            minl = Math.min(arr1.length, arr2.length);\n        for (i = 0; i < minl; i += 1) {\n            if (arr1[i] !== arr2[i]) {\n                return i;\n            }\n        }\n        return minl;\n    }\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0,\n            j,\n            next,\n            locale,\n            split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (\n                    next &&\n                    next.length >= j &&\n                    commonPrefix(split, next) >= j - 1\n                ) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function isLocaleNameSane(name) {\n        // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n        // Ensure name is available and function returns boolean\n        return !!(name && name.match('^[^/\\\\\\\\]*$'));\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null,\n            aliasedRequire;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (\n            locales[name] === undefined &&\n            typeof module !== 'undefined' &&\n            module &&\n            module.exports &&\n            isLocaleNameSane(name)\n        ) {\n            try {\n                oldLocale = globalLocale._abbr;\n                aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {\n                // mark as not found to avoid repeating expensive file require call causing high CPU\n                // when trying to find en-US, en_US, en-us for every format call\n                locales[name] = null; // null means not found\n            }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale(key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            } else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            } else {\n                if (typeof console !== 'undefined' && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn(\n                        'Locale ' + key + ' not found. Did you forget to load it?'\n                    );\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale(name, config) {\n        if (config !== null) {\n            var locale,\n                parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple(\n                    'defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n                );\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config,\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale,\n                tmpLocale,\n                parentConfig = baseConfig;\n\n            if (locales[name] != null && locales[name].parentLocale != null) {\n                // Update existing child locale in-place to avoid memory-leaks\n                locales[name].set(mergeConfigs(locales[name]._config, config));\n            } else {\n                // MERGE\n                tmpLocale = loadLocale(name);\n                if (tmpLocale != null) {\n                    parentConfig = tmpLocale._config;\n                }\n                config = mergeConfigs(parentConfig, config);\n                if (tmpLocale == null) {\n                    // updateLocale is called for creating a new locale\n                    // Set abbr so it will have a name (getters return\n                    // undefined otherwise).\n                    config.abbr = name;\n                }\n                locale = new Locale(config);\n                locale.parentLocale = locales[name];\n                locales[name] = locale;\n            }\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                    if (name === getSetGlobalLocale()) {\n                        getSetGlobalLocale(name);\n                    }\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale(key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow(m) {\n        var overflow,\n            a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH] < 0 || a[MONTH] > 11\n                    ? MONTH\n                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n                      ? DATE\n                      : a[HOUR] < 0 ||\n                          a[HOUR] > 24 ||\n                          (a[HOUR] === 24 &&\n                              (a[MINUTE] !== 0 ||\n                                  a[SECOND] !== 0 ||\n                                  a[MILLISECOND] !== 0))\n                        ? HOUR\n                        : a[MINUTE] < 0 || a[MINUTE] > 59\n                          ? MINUTE\n                          : a[SECOND] < 0 || a[SECOND] > 59\n                            ? SECOND\n                            : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n                              ? MILLISECOND\n                              : -1;\n\n            if (\n                getParsingFlags(m)._overflowDayOfYear &&\n                (overflow < YEAR || overflow > DATE)\n            ) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        basicIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n        isoDates = [\n            ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n            ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n            ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n            ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n            ['YYYY-DDD', /\\d{4}-\\d{3}/],\n            ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n            ['YYYYYYMMDD', /[+-]\\d{10}/],\n            ['YYYYMMDD', /\\d{8}/],\n            ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n            ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n            ['YYYYDDD', /\\d{7}/],\n            ['YYYYMM', /\\d{6}/, false],\n            ['YYYY', /\\d{4}/, false],\n        ],\n        // iso time formats and regexes\n        isoTimes = [\n            ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n            ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n            ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n            ['HH:mm', /\\d\\d:\\d\\d/],\n            ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n            ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n            ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n            ['HHmm', /\\d\\d\\d\\d/],\n            ['HH', /\\d\\d/],\n        ],\n        aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n        rfc2822 =\n            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n        obsOffsets = {\n            UT: 0,\n            GMT: 0,\n            EDT: -4 * 60,\n            EST: -5 * 60,\n            CDT: -5 * 60,\n            CST: -6 * 60,\n            MDT: -6 * 60,\n            MST: -7 * 60,\n            PDT: -7 * 60,\n            PST: -8 * 60,\n        };\n\n    // date from iso format\n    function configFromISO(config) {\n        var i,\n            l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime,\n            dateFormat,\n            timeFormat,\n            tzFormat,\n            isoDatesLen = isoDates.length,\n            isoTimesLen = isoTimes.length;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n            for (i = 0, l = isoDatesLen; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimesLen; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    function extractFromRFC2822Strings(\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr\n    ) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10),\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s\n            .replace(/\\([^()]*\\)|[\\n\\t]/g, ' ')\n            .replace(/(\\s\\s+)/g, ' ')\n            .replace(/^\\s\\s*/, '')\n            .replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(\n                    parsedInput[0],\n                    parsedInput[1],\n                    parsedInput[2]\n                ).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10),\n                m = hm % 100,\n                h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i)),\n            parsedArray;\n        if (match) {\n            parsedArray = extractFromRFC2822Strings(\n                match[4],\n                match[3],\n                match[2],\n                match[5],\n                match[6],\n                match[7]\n            );\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        if (config._strict) {\n            config._isValid = false;\n        } else {\n            // Final attempt, use Input Fallback\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [\n                nowValue.getUTCFullYear(),\n                nowValue.getUTCMonth(),\n                nowValue.getUTCDate(),\n            ];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray(config) {\n        var i,\n            date,\n            input = [],\n            currentDate,\n            expectedWeekday,\n            yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (\n                config._dayOfYear > daysInYear(yearToUse) ||\n                config._dayOfYear === 0\n            ) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] =\n                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (\n            config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0\n        ) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(\n            null,\n            input\n        );\n        expectedWeekday = config._useUTC\n            ? config._d.getUTCDay()\n            : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (\n            config._w &&\n            typeof config._w.d !== 'undefined' &&\n            config._w.d !== expectedWeekday\n        ) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(\n                w.GG,\n                config._a[YEAR],\n                weekOfYear(createLocal(), 1, 4).year\n            );\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from beginning of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to beginning of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i,\n            parsedInput,\n            tokens,\n            token,\n            skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0,\n            era,\n            tokenLen;\n\n        tokens =\n            expandFormat(config._f, config._locale).match(formattingTokens) || [];\n        tokenLen = tokens.length;\n        for (i = 0; i < tokenLen; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n                [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(\n                    string.indexOf(parsedInput) + parsedInput.length\n                );\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                } else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            } else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver =\n            stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (\n            config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0\n        ) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(\n            config._locale,\n            config._a[HOUR],\n            config._meridiem\n        );\n\n        // handle era\n        era = getParsingFlags(config).era;\n        if (era !== null) {\n            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n        }\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n    function meridiemFixWrap(locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n            scoreToBeat,\n            i,\n            currentScore,\n            validFormatFound,\n            bestFormatIsValid = false,\n            configfLen = config._f.length;\n\n        if (configfLen === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < configfLen; i++) {\n            currentScore = 0;\n            validFormatFound = false;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (isValid(tempConfig)) {\n                validFormatFound = true;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (!bestFormatIsValid) {\n                if (\n                    scoreToBeat == null ||\n                    currentScore < scoreToBeat ||\n                    validFormatFound\n                ) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                    if (validFormatFound) {\n                        bestFormatIsValid = true;\n                    }\n                }\n            } else {\n                if (currentScore < scoreToBeat) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                }\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i),\n            dayOrDate = i.day === undefined ? i.date : i.day;\n        config._a = map(\n            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n            function (obj) {\n                return obj && parseInt(obj, 10);\n            }\n        );\n\n        configFromArray(config);\n    }\n\n    function createFromConfig(config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig(config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({ nullInput: true });\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC(input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (format === true || format === false) {\n            strict = format;\n            format = undefined;\n        }\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if (\n            (isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)\n        ) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other < this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        ),\n        prototypeMax = deprecate(\n            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other > this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +new Date();\n    };\n\n    var ordering = [\n        'year',\n        'quarter',\n        'month',\n        'week',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'millisecond',\n    ];\n\n    function isDurationValid(m) {\n        var key,\n            unitHasDecimal = false,\n            i,\n            orderLen = ordering.length;\n        for (key in m) {\n            if (\n                hasOwnProp(m, key) &&\n                !(\n                    indexOf.call(ordering, key) !== -1 &&\n                    (m[key] == null || !isNaN(m[key]))\n                )\n            ) {\n                return false;\n            }\n        }\n\n        for (i = 0; i < orderLen; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration(duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds =\n            +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days + weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months + quarters * 3 + years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration(obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound(number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if (\n                (dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n            ) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    // FORMATTING\n\n    function offset(token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset(),\n                sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return (\n                sign +\n                zeroFill(~~(offset / 60), 2) +\n                separator +\n                zeroFill(~~offset % 60, 2)\n            );\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z', matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher),\n            chunk,\n            parts,\n            minutes;\n\n        if (matches === null) {\n            return null;\n        }\n\n        chunk = matches[matches.length - 1] || [];\n        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff =\n                (isMoment(input) || isDate(input)\n                    ? input.valueOf()\n                    : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset(m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset());\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset(input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(\n                        this,\n                        createDuration(input - offset, 'm'),\n                        1,\n                        false\n                    );\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone(input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC(keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal(keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset() {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            } else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset(input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime() {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted() {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {},\n            other;\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted =\n                this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal() {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset() {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc() {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n        // and further modified to allow for strings containing both week and day\n        isoRegex =\n            /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration(input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms: input._milliseconds,\n                d: input._days,\n                M: input._months,\n            };\n        } else if (isNumber(input) || !isNaN(+input)) {\n            duration = {};\n            if (key) {\n                duration[key] = +input;\n            } else {\n                duration.milliseconds = +input;\n            }\n        } else if ((match = aspNetRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: 0,\n                d: toInt(match[DATE]) * sign,\n                h: toInt(match[HOUR]) * sign,\n                m: toInt(match[MINUTE]) * sign,\n                s: toInt(match[SECOND]) * sign,\n                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n            };\n        } else if ((match = isoRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: parseIso(match[2], sign),\n                M: parseIso(match[3], sign),\n                w: parseIso(match[4], sign),\n                d: parseIso(match[5], sign),\n                h: parseIso(match[6], sign),\n                m: parseIso(match[7], sign),\n                s: parseIso(match[8], sign),\n            };\n        } else if (duration == null) {\n            // checks for null or undefined\n            duration = {};\n        } else if (\n            typeof duration === 'object' &&\n            ('from' in duration || 'to' in duration)\n        ) {\n            diffRes = momentsDifference(\n                createLocal(duration.from),\n                createLocal(duration.to)\n            );\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n            ret._isValid = input._isValid;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso(inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {};\n\n        res.months =\n            other.month() - base.month() + (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return { milliseconds: 0, months: 0 };\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(\n                    name,\n                    'moment().' +\n                        name +\n                        '(period, number) is deprecated. Please use moment().' +\n                        name +\n                        '(number, period). ' +\n                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n                );\n                tmp = val;\n                val = period;\n                period = tmp;\n            }\n\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract(mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add = createAdder(1, 'add'),\n        subtract = createAdder(-1, 'subtract');\n\n    function isString(input) {\n        return typeof input === 'string' || input instanceof String;\n    }\n\n    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n    function isMomentInput(input) {\n        return (\n            isMoment(input) ||\n            isDate(input) ||\n            isString(input) ||\n            isNumber(input) ||\n            isNumberOrStringArray(input) ||\n            isMomentInputObject(input) ||\n            input === null ||\n            input === undefined\n        );\n    }\n\n    function isMomentInputObject(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'years',\n                'year',\n                'y',\n                'months',\n                'month',\n                'M',\n                'days',\n                'day',\n                'd',\n                'dates',\n                'date',\n                'D',\n                'hours',\n                'hour',\n                'h',\n                'minutes',\n                'minute',\n                'm',\n                'seconds',\n                'second',\n                's',\n                'milliseconds',\n                'millisecond',\n                'ms',\n            ],\n            i,\n            property,\n            propertyLen = properties.length;\n\n        for (i = 0; i < propertyLen; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function isNumberOrStringArray(input) {\n        var arrayTest = isArray(input),\n            dataTypeTest = false;\n        if (arrayTest) {\n            dataTypeTest =\n                input.filter(function (item) {\n                    return !isNumber(item) && isString(input);\n                }).length === 0;\n        }\n        return arrayTest && dataTypeTest;\n    }\n\n    function isCalendarSpec(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'sameDay',\n                'nextDay',\n                'lastDay',\n                'nextWeek',\n                'lastWeek',\n                'sameElse',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6\n            ? 'sameElse'\n            : diff < -1\n              ? 'lastWeek'\n              : diff < 0\n                ? 'lastDay'\n                : diff < 1\n                  ? 'sameDay'\n                  : diff < 2\n                    ? 'nextDay'\n                    : diff < 7\n                      ? 'nextWeek'\n                      : 'sameElse';\n    }\n\n    function calendar$1(time, formats) {\n        // Support for single parameter, formats only overload to the calendar function\n        if (arguments.length === 1) {\n            if (!arguments[0]) {\n                time = undefined;\n                formats = undefined;\n            } else if (isMomentInput(arguments[0])) {\n                time = arguments[0];\n                formats = undefined;\n            } else if (isCalendarSpec(arguments[0])) {\n                formats = arguments[0];\n                time = undefined;\n            }\n        }\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse',\n            output =\n                formats &&\n                (isFunction(formats[format])\n                    ? formats[format].call(this, now)\n                    : formats[format]);\n\n        return this.format(\n            output || this.localeData().calendar(format, this, createLocal(now))\n        );\n    }\n\n    function clone() {\n        return new Moment(this);\n    }\n\n    function isAfter(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween(from, to, units, inclusivity) {\n        var localFrom = isMoment(from) ? from : createLocal(from),\n            localTo = isMoment(to) ? to : createLocal(to);\n        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n            return false;\n        }\n        inclusivity = inclusivity || '()';\n        return (\n            (inclusivity[0] === '('\n                ? this.isAfter(localFrom, units)\n                : !this.isBefore(localFrom, units)) &&\n            (inclusivity[1] === ')'\n                ? this.isBefore(localTo, units)\n                : !this.isAfter(localTo, units))\n        );\n    }\n\n    function isSame(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return (\n                this.clone().startOf(units).valueOf() <= inputMs &&\n                inputMs <= this.clone().endOf(units).valueOf()\n            );\n        }\n    }\n\n    function isSameOrAfter(input, units) {\n        return this.isSame(input, units) || this.isAfter(input, units);\n    }\n\n    function isSameOrBefore(input, units) {\n        return this.isSame(input, units) || this.isBefore(input, units);\n    }\n\n    function diff(input, units, asFloat) {\n        var that, zoneDelta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year':\n                output = monthDiff(this, that) / 12;\n                break;\n            case 'month':\n                output = monthDiff(this, that);\n                break;\n            case 'quarter':\n                output = monthDiff(this, that) / 3;\n                break;\n            case 'second':\n                output = (this - that) / 1e3;\n                break; // 1000\n            case 'minute':\n                output = (this - that) / 6e4;\n                break; // 1000 * 60\n            case 'hour':\n                output = (this - that) / 36e5;\n                break; // 1000 * 60 * 60\n            case 'day':\n                output = (this - that - zoneDelta) / 864e5;\n                break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week':\n                output = (this - that - zoneDelta) / 6048e5;\n                break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default:\n                output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff(a, b) {\n        if (a.date() < b.date()) {\n            // end-of-month calculations work correct when the start month has more\n            // days than the end month.\n            return -monthDiff(b, a);\n        }\n        // difference in months\n        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2,\n            adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString() {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true,\n            m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(\n                m,\n                utc\n                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n            );\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n                    .toISOString()\n                    .replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(\n            m,\n            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n        );\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect() {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment',\n            zone = '',\n            prefix,\n            year,\n            datetime,\n            suffix;\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        prefix = '[' + func + '(\"]';\n        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n        datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format(inputString) {\n        if (!inputString) {\n            inputString = this.isUtc()\n                ? hooks.defaultFormatUtc\n                : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ to: this, from: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow(withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ from: this, to: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow(withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale(key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData() {\n        return this._locale;\n    }\n\n    var MS_PER_SECOND = 1000,\n        MS_PER_MINUTE = 60 * MS_PER_SECOND,\n        MS_PER_HOUR = 60 * MS_PER_MINUTE,\n        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n    // actual modulo - handles negative numbers (for dates before 1970):\n    function mod$1(dividend, divisor) {\n        return ((dividend % divisor) + divisor) % divisor;\n    }\n\n    function localStartOfDate(y, m, d) {\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return new Date(y, m, d).valueOf();\n        }\n    }\n\n    function utcStartOfDate(y, m, d) {\n        // Date.UTC remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return Date.UTC(y, m, d);\n        }\n    }\n\n    function startOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year(), 0, 1);\n                break;\n            case 'quarter':\n                time = startOfDate(\n                    this.year(),\n                    this.month() - (this.month() % 3),\n                    1\n                );\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month(), 1);\n                break;\n            case 'week':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - this.weekday()\n                );\n                break;\n            case 'isoWeek':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - (this.isoWeekday() - 1)\n                );\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date());\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time -= mod$1(\n                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                    MS_PER_HOUR\n                );\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_MINUTE);\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_SECOND);\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function endOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year() + 1, 0, 1) - 1;\n                break;\n            case 'quarter':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month() - (this.month() % 3) + 3,\n                        1\n                    ) - 1;\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n                break;\n            case 'week':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - this.weekday() + 7\n                    ) - 1;\n                break;\n            case 'isoWeek':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - (this.isoWeekday() - 1) + 7\n                    ) - 1;\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time +=\n                    MS_PER_HOUR -\n                    mod$1(\n                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                        MS_PER_HOUR\n                    ) -\n                    1;\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function valueOf() {\n        return this._d.valueOf() - (this._offset || 0) * 60000;\n    }\n\n    function unix() {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate() {\n        return new Date(this.valueOf());\n    }\n\n    function toArray() {\n        var m = this;\n        return [\n            m.year(),\n            m.month(),\n            m.date(),\n            m.hour(),\n            m.minute(),\n            m.second(),\n            m.millisecond(),\n        ];\n    }\n\n    function toObject() {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds(),\n        };\n    }\n\n    function toJSON() {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2() {\n        return isValid(this);\n    }\n\n    function parsingFlags() {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt() {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict,\n        };\n    }\n\n    addFormatToken('N', 0, 0, 'eraAbbr');\n    addFormatToken('NN', 0, 0, 'eraAbbr');\n    addFormatToken('NNN', 0, 0, 'eraAbbr');\n    addFormatToken('NNNN', 0, 0, 'eraName');\n    addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n    addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n    addFormatToken('y', ['yy', 2], 0, 'eraYear');\n    addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n    addRegexToken('N', matchEraAbbr);\n    addRegexToken('NN', matchEraAbbr);\n    addRegexToken('NNN', matchEraAbbr);\n    addRegexToken('NNNN', matchEraName);\n    addRegexToken('NNNNN', matchEraNarrow);\n\n    addParseToken(\n        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],\n        function (input, array, config, token) {\n            var era = config._locale.erasParse(input, token, config._strict);\n            if (era) {\n                getParsingFlags(config).era = era;\n            } else {\n                getParsingFlags(config).invalidEra = input;\n            }\n        }\n    );\n\n    addRegexToken('y', matchUnsigned);\n    addRegexToken('yy', matchUnsigned);\n    addRegexToken('yyy', matchUnsigned);\n    addRegexToken('yyyy', matchUnsigned);\n    addRegexToken('yo', matchEraYearOrdinal);\n\n    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n    addParseToken(['yo'], function (input, array, config, token) {\n        var match;\n        if (config._locale._eraYearOrdinalRegex) {\n            match = input.match(config._locale._eraYearOrdinalRegex);\n        }\n\n        if (config._locale.eraYearOrdinalParse) {\n            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n        } else {\n            array[YEAR] = parseInt(input, 10);\n        }\n    });\n\n    function localeEras(m, format) {\n        var i,\n            l,\n            date,\n            eras = this._eras || getLocale('en')._eras;\n        for (i = 0, l = eras.length; i < l; ++i) {\n            switch (typeof eras[i].since) {\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].since).startOf('day');\n                    eras[i].since = date.valueOf();\n                    break;\n            }\n\n            switch (typeof eras[i].until) {\n                case 'undefined':\n                    eras[i].until = +Infinity;\n                    break;\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].until).startOf('day').valueOf();\n                    eras[i].until = date.valueOf();\n                    break;\n            }\n        }\n        return eras;\n    }\n\n    function localeErasParse(eraName, format, strict) {\n        var i,\n            l,\n            eras = this.eras(),\n            name,\n            abbr,\n            narrow;\n        eraName = eraName.toUpperCase();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            name = eras[i].name.toUpperCase();\n            abbr = eras[i].abbr.toUpperCase();\n            narrow = eras[i].narrow.toUpperCase();\n\n            if (strict) {\n                switch (format) {\n                    case 'N':\n                    case 'NN':\n                    case 'NNN':\n                        if (abbr === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNN':\n                        if (name === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNNN':\n                        if (narrow === eraName) {\n                            return eras[i];\n                        }\n                        break;\n                }\n            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n                return eras[i];\n            }\n        }\n    }\n\n    function localeErasConvertYear(era, year) {\n        var dir = era.since <= era.until ? +1 : -1;\n        if (year === undefined) {\n            return hooks(era.since).year();\n        } else {\n            return hooks(era.since).year() + (year - era.offset) * dir;\n        }\n    }\n\n    function getEraName() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].name;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].name;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraNarrow() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].narrow;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].narrow;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraAbbr() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].abbr;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].abbr;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraYear() {\n        var i,\n            l,\n            dir,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (\n                (eras[i].since <= val && val <= eras[i].until) ||\n                (eras[i].until <= val && val <= eras[i].since)\n            ) {\n                return (\n                    (this.year() - hooks(eras[i].since).year()) * dir +\n                    eras[i].offset\n                );\n            }\n        }\n\n        return this.year();\n    }\n\n    function erasNameRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNameRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNameRegex : this._erasRegex;\n    }\n\n    function erasAbbrRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasAbbrRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasAbbrRegex : this._erasRegex;\n    }\n\n    function erasNarrowRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNarrowRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNarrowRegex : this._erasRegex;\n    }\n\n    function matchEraAbbr(isStrict, locale) {\n        return locale.erasAbbrRegex(isStrict);\n    }\n\n    function matchEraName(isStrict, locale) {\n        return locale.erasNameRegex(isStrict);\n    }\n\n    function matchEraNarrow(isStrict, locale) {\n        return locale.erasNarrowRegex(isStrict);\n    }\n\n    function matchEraYearOrdinal(isStrict, locale) {\n        return locale._eraYearOrdinalRegex || matchUnsigned;\n    }\n\n    function computeErasParse() {\n        var abbrPieces = [],\n            namePieces = [],\n            narrowPieces = [],\n            mixedPieces = [],\n            i,\n            l,\n            erasName,\n            erasAbbr,\n            erasNarrow,\n            eras = this.eras();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            erasName = regexEscape(eras[i].name);\n            erasAbbr = regexEscape(eras[i].abbr);\n            erasNarrow = regexEscape(eras[i].narrow);\n\n            namePieces.push(erasName);\n            abbrPieces.push(erasAbbr);\n            narrowPieces.push(erasNarrow);\n            mixedPieces.push(erasName);\n            mixedPieces.push(erasAbbr);\n            mixedPieces.push(erasNarrow);\n        }\n\n        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n        this._erasNarrowRegex = new RegExp(\n            '^(' + narrowPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken(token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg', 'weekYear');\n    addWeekYearFormatToken('ggggg', 'weekYear');\n    addWeekYearFormatToken('GGGG', 'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    // PARSING\n\n    addRegexToken('G', matchSigned);\n    addRegexToken('g', matchSigned);\n    addRegexToken('GG', match1to2, match2);\n    addRegexToken('gg', match1to2, match2);\n    addRegexToken('GGGG', match1to4, match4);\n    addRegexToken('gggg', match1to4, match4);\n    addRegexToken('GGGGG', match1to6, match6);\n    addRegexToken('ggggg', match1to6, match6);\n\n    addWeekParseToken(\n        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],\n        function (input, week, config, token) {\n            week[token.substr(0, 2)] = toInt(input);\n        }\n    );\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.week(),\n            this.weekday() + this.localeData()._week.dow,\n            this.localeData()._week.dow,\n            this.localeData()._week.doy\n        );\n    }\n\n    function getSetISOWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.isoWeek(),\n            this.isoWeekday(),\n            1,\n            4\n        );\n    }\n\n    function getISOWeeksInYear() {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getISOWeeksInISOWeekYear() {\n        return weeksInYear(this.isoWeekYear(), 1, 4);\n    }\n\n    function getWeeksInYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getWeeksInWeekYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter(input) {\n        return input == null\n            ? Math.ceil((this.month() + 1) / 3)\n            : this.month((input - 1) * 3 + (this.month() % 3));\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // PARSING\n\n    addRegexToken('D', match1to2, match1to2NoLeadingZero);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict\n            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n            : locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // PARSING\n\n    addRegexToken('DDD', match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear(input) {\n        var dayOfYear =\n            Math.round(\n                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n            ) + 1;\n        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // PARSING\n\n    addRegexToken('m', match1to2, match1to2HasZero);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // PARSING\n\n    addRegexToken('s', match1to2, match1to2HasZero);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n    // PARSING\n\n    addRegexToken('S', match1to3, match1);\n    addRegexToken('SS', match1to3, match2);\n    addRegexToken('SSS', match1to3, match3);\n\n    var token, getSetMillisecond;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n\n    getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z', 0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr() {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName() {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add = add;\n    proto.calendar = calendar$1;\n    proto.clone = clone;\n    proto.diff = diff;\n    proto.endOf = endOf;\n    proto.format = format;\n    proto.from = from;\n    proto.fromNow = fromNow;\n    proto.to = to;\n    proto.toNow = toNow;\n    proto.get = stringGet;\n    proto.invalidAt = invalidAt;\n    proto.isAfter = isAfter;\n    proto.isBefore = isBefore;\n    proto.isBetween = isBetween;\n    proto.isSame = isSame;\n    proto.isSameOrAfter = isSameOrAfter;\n    proto.isSameOrBefore = isSameOrBefore;\n    proto.isValid = isValid$2;\n    proto.lang = lang;\n    proto.locale = locale;\n    proto.localeData = localeData;\n    proto.max = prototypeMax;\n    proto.min = prototypeMin;\n    proto.parsingFlags = parsingFlags;\n    proto.set = stringSet;\n    proto.startOf = startOf;\n    proto.subtract = subtract;\n    proto.toArray = toArray;\n    proto.toObject = toObject;\n    proto.toDate = toDate;\n    proto.toISOString = toISOString;\n    proto.inspect = inspect;\n    if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n            return 'Moment<' + this.format() + '>';\n        };\n    }\n    proto.toJSON = toJSON;\n    proto.toString = toString;\n    proto.unix = unix;\n    proto.valueOf = valueOf;\n    proto.creationData = creationData;\n    proto.eraName = getEraName;\n    proto.eraNarrow = getEraNarrow;\n    proto.eraAbbr = getEraAbbr;\n    proto.eraYear = getEraYear;\n    proto.year = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week = proto.weeks = getSetWeek;\n    proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n    proto.weeksInYear = getWeeksInYear;\n    proto.weeksInWeekYear = getWeeksInWeekYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n    proto.date = getSetDayOfMonth;\n    proto.day = proto.days = getSetDayOfWeek;\n    proto.weekday = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset = getSetOffset;\n    proto.utc = setOffsetToUTC;\n    proto.local = setOffsetToLocal;\n    proto.parseZone = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST = isDaylightSavingTime;\n    proto.isLocal = isLocal;\n    proto.isUtcOffset = isUtcOffset;\n    proto.isUtc = isUtc;\n    proto.isUTC = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates = deprecate(\n        'dates accessor is deprecated. Use date instead.',\n        getSetDayOfMonth\n    );\n    proto.months = deprecate(\n        'months accessor is deprecated. Use month instead',\n        getSetMonth\n    );\n    proto.years = deprecate(\n        'years accessor is deprecated. Use year instead',\n        getSetYear\n    );\n    proto.zone = deprecate(\n        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n        getSetZone\n    );\n    proto.isDSTShifted = deprecate(\n        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n        isDaylightSavingTimeShifted\n    );\n\n    function createUnix(input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone() {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat(string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar = calendar;\n    proto$1.longDateFormat = longDateFormat;\n    proto$1.invalidDate = invalidDate;\n    proto$1.ordinal = ordinal;\n    proto$1.preparse = preParsePostFormat;\n    proto$1.postformat = preParsePostFormat;\n    proto$1.relativeTime = relativeTime;\n    proto$1.pastFuture = pastFuture;\n    proto$1.set = set;\n    proto$1.eras = localeEras;\n    proto$1.erasParse = localeErasParse;\n    proto$1.erasConvertYear = localeErasConvertYear;\n    proto$1.erasAbbrRegex = erasAbbrRegex;\n    proto$1.erasNameRegex = erasNameRegex;\n    proto$1.erasNarrowRegex = erasNarrowRegex;\n\n    proto$1.months = localeMonths;\n    proto$1.monthsShort = localeMonthsShort;\n    proto$1.monthsParse = localeMonthsParse;\n    proto$1.monthsRegex = monthsRegex;\n    proto$1.monthsShortRegex = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays = localeWeekdays;\n    proto$1.weekdaysMin = localeWeekdaysMin;\n    proto$1.weekdaysShort = localeWeekdaysShort;\n    proto$1.weekdaysParse = localeWeekdaysParse;\n\n    proto$1.weekdaysRegex = weekdaysRegex;\n    proto$1.weekdaysShortRegex = weekdaysShortRegex;\n    proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1(format, index, field, setter) {\n        var locale = getLocale(),\n            utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl(format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i,\n            out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl(localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0,\n            i,\n            out = [];\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths(format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort(format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        eras: [\n            {\n                since: '0001-01-01',\n                until: +Infinity,\n                offset: 1,\n                name: 'Anno Domini',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: 'Before Christ',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    toInt((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate(\n        'moment.lang is deprecated. Use moment.locale instead.',\n        getSetGlobalLocale\n    );\n    hooks.langData = deprecate(\n        'moment.langData is deprecated. Use moment.localeData instead.',\n        getLocale\n    );\n\n    var mathAbs = Math.abs;\n\n    function abs() {\n        var data = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days = mathAbs(this._days);\n        this._months = mathAbs(this._months);\n\n        data.milliseconds = mathAbs(data.milliseconds);\n        data.seconds = mathAbs(data.seconds);\n        data.minutes = mathAbs(data.minutes);\n        data.hours = mathAbs(data.hours);\n        data.months = mathAbs(data.months);\n        data.years = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1(duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days += direction * other._days;\n        duration._months += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1(input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1(input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil(number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble() {\n        var milliseconds = this._milliseconds,\n            days = this._days,\n            months = this._months,\n            data = this._data,\n            seconds,\n            minutes,\n            hours,\n            years,\n            monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (\n            !(\n                (milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0)\n            )\n        ) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds = absFloor(milliseconds / 1000);\n        data.seconds = seconds % 60;\n\n        minutes = absFloor(seconds / 60);\n        data.minutes = minutes % 60;\n\n        hours = absFloor(minutes / 60);\n        data.hours = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days = days;\n        data.months = months;\n        data.years = years;\n\n        return this;\n    }\n\n    function daysToMonths(days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return (days * 4800) / 146097;\n    }\n\n    function monthsToDays(months) {\n        // the reverse of daysToMonths\n        return (months * 146097) / 4800;\n    }\n\n    function as(units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days,\n            months,\n            milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'quarter' || units === 'year') {\n            days = this._days + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            switch (units) {\n                case 'month':\n                    return months;\n                case 'quarter':\n                    return months / 3;\n                case 'year':\n                    return months / 12;\n            }\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week':\n                    return days / 7 + milliseconds / 6048e5;\n                case 'day':\n                    return days + milliseconds / 864e5;\n                case 'hour':\n                    return days * 24 + milliseconds / 36e5;\n                case 'minute':\n                    return days * 1440 + milliseconds / 6e4;\n                case 'second':\n                    return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond':\n                    return Math.floor(days * 864e5) + milliseconds;\n                default:\n                    throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    function makeAs(alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms'),\n        asSeconds = makeAs('s'),\n        asMinutes = makeAs('m'),\n        asHours = makeAs('h'),\n        asDays = makeAs('d'),\n        asWeeks = makeAs('w'),\n        asMonths = makeAs('M'),\n        asQuarters = makeAs('Q'),\n        asYears = makeAs('y'),\n        valueOf$1 = asMilliseconds;\n\n    function clone$1() {\n        return createDuration(this);\n    }\n\n    function get$2(units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds'),\n        seconds = makeGetter('seconds'),\n        minutes = makeGetter('minutes'),\n        hours = makeGetter('hours'),\n        days = makeGetter('days'),\n        months = makeGetter('months'),\n        years = makeGetter('years');\n\n    function weeks() {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round,\n        thresholds = {\n            ss: 44, // a few seconds to seconds\n            s: 45, // seconds to minute\n            m: 45, // minutes to hour\n            h: 22, // hours to day\n            d: 26, // days to month/week\n            w: null, // weeks to month\n            M: 11, // months to year\n        };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n        var duration = createDuration(posNegDuration).abs(),\n            seconds = round(duration.as('s')),\n            minutes = round(duration.as('m')),\n            hours = round(duration.as('h')),\n            days = round(duration.as('d')),\n            months = round(duration.as('M')),\n            weeks = round(duration.as('w')),\n            years = round(duration.as('y')),\n            a =\n                (seconds <= thresholds.ss && ['s', seconds]) ||\n                (seconds < thresholds.s && ['ss', seconds]) ||\n                (minutes <= 1 && ['m']) ||\n                (minutes < thresholds.m && ['mm', minutes]) ||\n                (hours <= 1 && ['h']) ||\n                (hours < thresholds.h && ['hh', hours]) ||\n                (days <= 1 && ['d']) ||\n                (days < thresholds.d && ['dd', days]);\n\n        if (thresholds.w != null) {\n            a =\n                a ||\n                (weeks <= 1 && ['w']) ||\n                (weeks < thresholds.w && ['ww', weeks]);\n        }\n        a = a ||\n            (months <= 1 && ['M']) ||\n            (months < thresholds.M && ['MM', months]) ||\n            (years <= 1 && ['y']) || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding(roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof roundingFunction === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold(threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize(argWithSuffix, argThresholds) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var withSuffix = false,\n            th = thresholds,\n            locale,\n            output;\n\n        if (typeof argWithSuffix === 'object') {\n            argThresholds = argWithSuffix;\n            argWithSuffix = false;\n        }\n        if (typeof argWithSuffix === 'boolean') {\n            withSuffix = argWithSuffix;\n        }\n        if (typeof argThresholds === 'object') {\n            th = Object.assign({}, thresholds, argThresholds);\n            if (argThresholds.s != null && argThresholds.ss == null) {\n                th.ss = argThresholds.s - 1;\n            }\n        }\n\n        locale = this.localeData();\n        output = relativeTime$1(this, !withSuffix, th, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return (x > 0) - (x < 0) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000,\n            days = abs$1(this._days),\n            months = abs$1(this._months),\n            minutes,\n            hours,\n            years,\n            s,\n            total = this.asSeconds(),\n            totalSign,\n            ymSign,\n            daysSign,\n            hmsSign;\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes = absFloor(seconds / 60);\n        hours = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n        totalSign = total < 0 ? '-' : '';\n        ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return (\n            totalSign +\n            'P' +\n            (years ? ymSign + years + 'Y' : '') +\n            (months ? ymSign + months + 'M' : '') +\n            (days ? daysSign + days + 'D' : '') +\n            (hours || minutes || seconds ? 'T' : '') +\n            (hours ? hmsSign + hours + 'H' : '') +\n            (minutes ? hmsSign + minutes + 'M' : '') +\n            (seconds ? hmsSign + s + 'S' : '')\n        );\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid = isValid$1;\n    proto$2.abs = abs;\n    proto$2.add = add$1;\n    proto$2.subtract = subtract$1;\n    proto$2.as = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds = asSeconds;\n    proto$2.asMinutes = asMinutes;\n    proto$2.asHours = asHours;\n    proto$2.asDays = asDays;\n    proto$2.asWeeks = asWeeks;\n    proto$2.asMonths = asMonths;\n    proto$2.asQuarters = asQuarters;\n    proto$2.asYears = asYears;\n    proto$2.valueOf = valueOf$1;\n    proto$2._bubble = bubble;\n    proto$2.clone = clone$1;\n    proto$2.get = get$2;\n    proto$2.milliseconds = milliseconds;\n    proto$2.seconds = seconds;\n    proto$2.minutes = minutes;\n    proto$2.hours = hours;\n    proto$2.days = days;\n    proto$2.weeks = weeks;\n    proto$2.months = months;\n    proto$2.years = years;\n    proto$2.humanize = humanize;\n    proto$2.toISOString = toISOString$1;\n    proto$2.toString = toISOString$1;\n    proto$2.toJSON = toISOString$1;\n    proto$2.locale = locale;\n    proto$2.localeData = localeData;\n\n    proto$2.toIsoString = deprecate(\n        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n        toISOString$1\n    );\n    proto$2.lang = lang;\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    //! moment.js\n\n    hooks.version = '2.30.1';\n\n    setHookCallback(createLocal);\n\n    hooks.fn = proto;\n    hooks.min = min;\n    hooks.max = max;\n    hooks.now = now;\n    hooks.utc = createUTC;\n    hooks.unix = createUnix;\n    hooks.months = listMonths;\n    hooks.isDate = isDate;\n    hooks.locale = getSetGlobalLocale;\n    hooks.invalid = createInvalid;\n    hooks.duration = createDuration;\n    hooks.isMoment = isMoment;\n    hooks.weekdays = listWeekdays;\n    hooks.parseZone = createInZone;\n    hooks.localeData = getLocale;\n    hooks.isDuration = isDuration;\n    hooks.monthsShort = listMonthsShort;\n    hooks.weekdaysMin = listWeekdaysMin;\n    hooks.defineLocale = defineLocale;\n    hooks.updateLocale = updateLocale;\n    hooks.locales = listLocales;\n    hooks.weekdaysShort = listWeekdaysShort;\n    hooks.normalizeUnits = normalizeUnits;\n    hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat = getCalendarFormat;\n    hooks.prototype = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD', // <input type=\"date\" />\n        TIME: 'HH:mm', // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss', // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS', // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'GGGG-[W]WW', // <input type=\"week\" />\n        MONTH: 'YYYY-MM', // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n","/**\n@license\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nimport { Store, Unsubscribe } from 'redux';\n\ntype Constructor<T> = new(...args: any[]) => T;\n\n/**\n  By using this `CustomElement` interface instead of `HTMLElement`, we avoid\n  having the generated typings include most DOM API already provided by\n  TypeScript. This is particularly useful since different versions of\n  TypeScript may have different DOM API typings (e.g. TS 3.0.3 and TS 3.1.1).\n  The required `isConnected` property is included to avoid the following\n  TypeScript error:\n\n      Type 'HTMLElement' has no properties in common with type 'CustomElement'.\n*/\ninterface CustomElement {\n  connectedCallback?(): void;\n  disconnectedCallback?(): void;\n  readonly isConnected: boolean;\n}\n\n/**\n  This is a JavaScript mixin that you can use to connect a Custom Element base\n  class to a Redux store. The `stateChanged(state)` method will be called when\n  the state is updated.\n\n  Example:\n\n      import { connect } from 'pwa-helpers/connect-mixin.js';\n\n      class MyElement extends connect(store)(HTMLElement) {\n        stateChanged(state) {\n          this.textContent = state.data.count.toString();\n        }\n      }\n*/\nexport const connect =\n  <S>(store: Store<S>) =>\n  <T extends Constructor<CustomElement>>(baseElement: T) =>\n  class extends baseElement {\n    _storeUnsubscribe!: Unsubscribe;\n\n    connectedCallback() {\n      if (super.connectedCallback) {\n        super.connectedCallback();\n      }\n\n      this._storeUnsubscribe = store.subscribe(() => this.stateChanged(store.getState()));\n      this.stateChanged(store.getState());\n    }\n\n    disconnectedCallback() {\n      this._storeUnsubscribe();\n\n      if (super.disconnectedCallback) {\n        super.disconnectedCallback();\n      }\n    }\n\n    /**\n     * The `stateChanged(state)` method will be called when the state is updated.\n     */\n    stateChanged(_state: S) {}\n  };\n","export default function(url, options) {\n\toptions = options || {};\n\treturn new Promise( (resolve, reject) => {\n\t\tconst request = new XMLHttpRequest();\n\t\tconst keys = [];\n\t\tconst all = [];\n\t\tconst headers = {};\n\n\t\tconst response = () => ({\n\t\t\tok: (request.status/100|0) == 2,\t\t// 200-299\n\t\t\tstatusText: request.statusText,\n\t\t\tstatus: request.status,\n\t\t\turl: request.responseURL,\n\t\t\ttext: () => Promise.resolve(request.responseText),\n\t\t\tjson: () => Promise.resolve(request.responseText).then(JSON.parse),\n\t\t\tblob: () => Promise.resolve(new Blob([request.response])),\n\t\t\tclone: response,\n\t\t\theaders: {\n\t\t\t\tkeys: () => keys,\n\t\t\t\tentries: () => all,\n\t\t\t\tget: n => headers[n.toLowerCase()],\n\t\t\t\thas: n => n.toLowerCase() in headers\n\t\t\t}\n\t\t});\n\n\t\trequest.open(options.method || 'get', url, true);\n\n\t\trequest.onload = () => {\n\t\t\trequest.getAllResponseHeaders().replace(/^(.*?):[^\\S\\n]*([\\s\\S]*?)$/gm, (m, key, value) => {\n\t\t\t\tkeys.push(key = key.toLowerCase());\n\t\t\t\tall.push([key, value]);\n\t\t\t\theaders[key] = headers[key] ? `${headers[key]},${value}` : value;\n\t\t\t});\n\t\t\tresolve(response());\n\t\t};\n\n\t\trequest.onerror = reject;\n\n\t\trequest.withCredentials = options.credentials=='include';\n\n\t\tfor (const i in options.headers) {\n\t\t\trequest.setRequestHeader(i, options.headers[i]);\n\t\t}\n\n\t\trequest.send(options.body || null);\n\t});\n}\n","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nexport default function assertString(input) {\n  var isString = typeof input === 'string' || input instanceof String;\n  if (!isString) {\n    var invalidType = _typeof(input);\n    if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;\n    throw new TypeError(\"Expected a string but received a \".concat(invalidType));\n  }\n}","import assertString from './util/assertString';\nexport default function toDate(date) {\n  assertString(date);\n  date = Date.parse(date);\n  return !isNaN(date) ? new Date(date) : null;\n}","export var alpha = {\n  'en-US': /^[A-Z]+$/i,\n  'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,\n  'bg-BG': /^[А-Я]+$/i,\n  'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,\n  'da-DK': /^[A-ZÆØÅ]+$/i,\n  'de-DE': /^[A-ZÄÖÜß]+$/i,\n  'el-GR': /^[Α-ώ]+$/i,\n  'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,\n  'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,\n  'fi-FI': /^[A-ZÅÄÖ]+$/i,\n  'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,\n  'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,\n  'ja-JP': /^[ぁ-んァ-ヶｦ-ﾟ一-龠ー・。、]+$/i,\n  'nb-NO': /^[A-ZÆØÅ]+$/i,\n  'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,\n  'nn-NO': /^[A-ZÆØÅ]+$/i,\n  'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,\n  'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,\n  'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,\n  'ru-RU': /^[А-ЯЁ]+$/i,\n  'kk-KZ': /^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]+$/i,\n  'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,\n  'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,\n  'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,\n  'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,\n  'sv-SE': /^[A-ZÅÄÖ]+$/i,\n  'th-TH': /^[ก-๐\\s]+$/i,\n  'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,\n  'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,\n  'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,\n  'ko-KR': /^[ㄱ-ㅎㅏ-ㅣ가-힣]*$/,\n  'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,\n  ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,\n  he: /^[א-ת]+$/,\n  fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,\n  bn: /^['ঀঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣৰৱ৲৳৴৵৶৷৸৹৺৻']+$/,\n  eo: /^[ABCĈD-GĜHĤIJĴK-PRSŜTUŬVZ]+$/i,\n  'hi-IN': /^[\\u0900-\\u0961]+[\\u0972-\\u097F]*$/i,\n  'si-LK': /^[\\u0D80-\\u0DFF]+$/\n};\nexport var alphanumeric = {\n  'en-US': /^[0-9A-Z]+$/i,\n  'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,\n  'bg-BG': /^[0-9А-Я]+$/i,\n  'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,\n  'da-DK': /^[0-9A-ZÆØÅ]+$/i,\n  'de-DE': /^[0-9A-ZÄÖÜß]+$/i,\n  'el-GR': /^[0-9Α-ω]+$/i,\n  'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,\n  'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,\n  'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,\n  'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,\n  'ja-JP': /^[0-9０-９ぁ-んァ-ヶｦ-ﾟ一-龠ー・。、]+$/i,\n  'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,\n  'nb-NO': /^[0-9A-ZÆØÅ]+$/i,\n  'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,\n  'nn-NO': /^[0-9A-ZÆØÅ]+$/i,\n  'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,\n  'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,\n  'ru-RU': /^[0-9А-ЯЁ]+$/i,\n  'kk-KZ': /^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]+$/i,\n  'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,\n  'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,\n  'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,\n  'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,\n  'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,\n  'th-TH': /^[ก-๙\\s]+$/i,\n  'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,\n  'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,\n  'ko-KR': /^[0-9ㄱ-ㅎㅏ-ㅣ가-힣]*$/,\n  'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,\n  'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,\n  ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,\n  he: /^[0-9א-ת]+$/,\n  fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,\n  bn: /^['ঀঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣ০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻']+$/,\n  eo: /^[0-9ABCĈD-GĜHĤIJĴK-PRSŜTUŬVZ]+$/i,\n  'hi-IN': /^[\\u0900-\\u0963]+[\\u0966-\\u097F]*$/i,\n  'si-LK': /^[0-9\\u0D80-\\u0DFF]+$/\n};\nexport var decimal = {\n  'en-US': '.',\n  ar: '٫'\n};\nexport var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];\nfor (var locale, i = 0; i < englishLocales.length; i++) {\n  locale = \"en-\".concat(englishLocales[i]);\n  alpha[locale] = alpha['en-US'];\n  alphanumeric[locale] = alphanumeric['en-US'];\n  decimal[locale] = decimal['en-US'];\n}\n\n// Source: http://www.localeplanet.com/java/\nexport var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];\nfor (var _locale, _i = 0; _i < arabicLocales.length; _i++) {\n  _locale = \"ar-\".concat(arabicLocales[_i]);\n  alpha[_locale] = alpha.ar;\n  alphanumeric[_locale] = alphanumeric.ar;\n  decimal[_locale] = decimal.ar;\n}\nexport var farsiLocales = ['IR', 'AF'];\nfor (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {\n  _locale2 = \"fa-\".concat(farsiLocales[_i2]);\n  alphanumeric[_locale2] = alphanumeric.fa;\n  decimal[_locale2] = decimal.ar;\n}\nexport var bengaliLocales = ['BD', 'IN'];\nfor (var _locale3, _i3 = 0; _i3 < bengaliLocales.length; _i3++) {\n  _locale3 = \"bn-\".concat(bengaliLocales[_i3]);\n  alpha[_locale3] = alpha.bn;\n  alphanumeric[_locale3] = alphanumeric.bn;\n  decimal[_locale3] = decimal['en-US'];\n}\n\n// Source: https://en.wikipedia.org/wiki/Decimal_mark\nexport var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];\nexport var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'eo', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'kk-KZ', 'si-LK', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];\nfor (var _i4 = 0; _i4 < dotDecimal.length; _i4++) {\n  decimal[dotDecimal[_i4]] = decimal['en-US'];\n}\nfor (var _i5 = 0; _i5 < commaDecimal.length; _i5++) {\n  decimal[commaDecimal[_i5]] = ',';\n}\nalpha['fr-CA'] = alpha['fr-FR'];\nalphanumeric['fr-CA'] = alphanumeric['fr-FR'];\nalpha['pt-BR'] = alpha['pt-PT'];\nalphanumeric['pt-BR'] = alphanumeric['pt-PT'];\ndecimal['pt-BR'] = decimal['pt-PT'];\n\n// see #862\nalpha['pl-Pl'] = alpha['pl-PL'];\nalphanumeric['pl-Pl'] = alphanumeric['pl-PL'];\ndecimal['pl-Pl'] = decimal['pl-PL'];\n\n// see #1455\nalpha['fa-AF'] = alpha.fa;","import assertString from './util/assertString';\nimport { decimal } from './alpha';\nexport default function isFloat(str, options) {\n  assertString(str);\n  options = options || {};\n  var _float = new RegExp(\"^(?:[-+])?(?:[0-9]+)?(?:\\\\\".concat(options.locale ? decimal[options.locale] : '.', \"[0-9]*)?(?:[eE][\\\\+\\\\-]?(?:[0-9]+))?$\"));\n  if (str === '' || str === '.' || str === ',' || str === '-' || str === '+') {\n    return false;\n  }\n  var value = parseFloat(str.replace(',', '.'));\n  return _float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);\n}\nexport var locales = Object.keys(decimal);","import isFloat from './isFloat';\nexport default function toFloat(str) {\n  if (!isFloat(str)) return NaN;\n  return parseFloat(str);\n}","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nexport default function toString(input) {\n  if (_typeof(input) === 'object' && input !== null) {\n    if (typeof input.toString === 'function') {\n      input = input.toString();\n    } else {\n      input = '[object Object]';\n    }\n  } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {\n    input = '';\n  }\n  return String(input);\n}","export default function merge() {\n  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var defaults = arguments.length > 1 ? arguments[1] : undefined;\n  for (var key in defaults) {\n    if (typeof obj[key] === 'undefined') {\n      obj[key] = defaults[key];\n    }\n  }\n  return obj;\n}","import assertString from './util/assertString';\nimport toString from './util/toString';\nimport merge from './util/merge';\nvar defaulContainsOptions = {\n  ignoreCase: false,\n  minOccurrences: 1\n};\nexport default function contains(str, elem, options) {\n  assertString(str);\n  options = merge(options, defaulContainsOptions);\n  if (options.ignoreCase) {\n    return str.toLowerCase().split(toString(elem).toLowerCase()).length > options.minOccurrences;\n  }\n  return str.split(toString(elem)).length > options.minOccurrences;\n}","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nimport assertString from './util/assertString';\n\n/* eslint-disable prefer-rest-params */\nexport default function isByteLength(str, options) {\n  assertString(str);\n  var min;\n  var max;\n  if (_typeof(options) === 'object') {\n    min = options.min || 0;\n    max = options.max;\n  } else {\n    // backwards compatibility: isByteLength(str, min [, max])\n    min = arguments[1];\n    max = arguments[2];\n  }\n  var len = encodeURI(str).split(/%..|./).length - 1;\n  return len >= min && (typeof max === 'undefined' || len <= max);\n}","import assertString from './util/assertString';\nimport merge from './util/merge';\nvar default_fqdn_options = {\n  require_tld: true,\n  allow_underscores: false,\n  allow_trailing_dot: false,\n  allow_numeric_tld: false,\n  allow_wildcard: false,\n  ignore_max_length: false\n};\nexport default function isFQDN(str, options) {\n  assertString(str);\n  options = merge(options, default_fqdn_options);\n\n  /* Remove the optional trailing dot before checking validity */\n  if (options.allow_trailing_dot && str[str.length - 1] === '.') {\n    str = str.substring(0, str.length - 1);\n  }\n\n  /* Remove the optional wildcard before checking validity */\n  if (options.allow_wildcard === true && str.indexOf('*.') === 0) {\n    str = str.substring(2);\n  }\n  var parts = str.split('.');\n  var tld = parts[parts.length - 1];\n  if (options.require_tld) {\n    // disallow fqdns without tld\n    if (parts.length < 2) {\n      return false;\n    }\n    if (!options.allow_numeric_tld && !/^([a-z\\u00A1-\\u00A8\\u00AA-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {\n      return false;\n    }\n\n    // disallow spaces\n    if (/\\s/.test(tld)) {\n      return false;\n    }\n  }\n\n  // reject numeric TLDs\n  if (!options.allow_numeric_tld && /^\\d+$/.test(tld)) {\n    return false;\n  }\n  return parts.every(function (part) {\n    if (part.length > 63 && !options.ignore_max_length) {\n      return false;\n    }\n    if (!/^[a-z_\\u00a1-\\uffff0-9-]+$/i.test(part)) {\n      return false;\n    }\n\n    // disallow full-width chars\n    if (/[\\uff01-\\uff5e]/.test(part)) {\n      return false;\n    }\n\n    // disallow parts starting or ending with hyphen\n    if (/^-|-$/.test(part)) {\n      return false;\n    }\n    if (!options.allow_underscores && /_/.test(part)) {\n      return false;\n    }\n    return true;\n  });\n}","import assertString from './util/assertString';\n/**\n11.3.  Examples\n\n   The following addresses\n\n             fe80::1234 (on the 1st link of the node)\n             ff02::5678 (on the 5th link of the node)\n             ff08::9abc (on the 10th organization of the node)\n\n   would be represented as follows:\n\n             fe80::1234%1\n             ff02::5678%5\n             ff08::9abc%10\n\n   (Here we assume a natural translation from a zone index to the\n   <zone_id> part, where the Nth zone of any scope is translated into\n   \"N\".)\n\n   If we use interface names as <zone_id>, those addresses could also be\n   represented as follows:\n\n            fe80::1234%ne0\n            ff02::5678%pvc1.3\n            ff08::9abc%interface10\n\n   where the interface \"ne0\" belongs to the 1st link, \"pvc1.3\" belongs\n   to the 5th link, and \"interface10\" belongs to the 10th organization.\n * * */\nvar IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';\nvar IPv4AddressFormat = \"(\".concat(IPv4SegmentFormat, \"[.]){3}\").concat(IPv4SegmentFormat);\nvar IPv4AddressRegExp = new RegExp(\"^\".concat(IPv4AddressFormat, \"$\"));\nvar IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';\nvar IPv6AddressRegExp = new RegExp('^(' + \"(?:\".concat(IPv6SegmentFormat, \":){7}(?:\").concat(IPv6SegmentFormat, \"|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){6}(?:\").concat(IPv4AddressFormat, \"|:\").concat(IPv6SegmentFormat, \"|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){5}(?::\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,2}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){4}(?:(:\").concat(IPv6SegmentFormat, \"){0,1}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,3}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){3}(?:(:\").concat(IPv6SegmentFormat, \"){0,2}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,4}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){2}(?:(:\").concat(IPv6SegmentFormat, \"){0,3}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,5}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){1}(?:(:\").concat(IPv6SegmentFormat, \"){0,4}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,6}|:)|\") + \"(?::((?::\".concat(IPv6SegmentFormat, \"){0,5}:\").concat(IPv4AddressFormat, \"|(?::\").concat(IPv6SegmentFormat, \"){1,7}|:))\") + ')(%[0-9a-zA-Z-.:]{1,})?$');\nexport default function isIP(str) {\n  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  assertString(str);\n  version = String(version);\n  if (!version) {\n    return isIP(str, 4) || isIP(str, 6);\n  }\n  if (version === '4') {\n    return IPv4AddressRegExp.test(str);\n  }\n  if (version === '6') {\n    return IPv6AddressRegExp.test(str);\n  }\n  return false;\n}","import assertString from './util/assertString';\nimport isByteLength from './isByteLength';\nimport isFQDN from './isFQDN';\nimport isIP from './isIP';\nimport merge from './util/merge';\nvar default_email_options = {\n  allow_display_name: false,\n  allow_underscores: false,\n  require_display_name: false,\n  allow_utf8_local_part: true,\n  require_tld: true,\n  blacklisted_chars: '',\n  ignore_max_length: false,\n  host_blacklist: [],\n  host_whitelist: []\n};\n\n/* eslint-disable max-len */\n/* eslint-disable no-control-regex */\nvar splitNameAddress = /^([^\\x00-\\x1F\\x7F-\\x9F\\cX]+)</i;\nvar emailUserPart = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]+$/i;\nvar gmailUserPart = /^[a-z\\d]+$/;\nvar quotedEmailUser = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]))*$/i;\nvar emailUserUtf8Part = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\u00A1-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+$/i;\nvar quotedEmailUserUtf8 = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))*$/i;\nvar defaultMaxEmailLength = 254;\n/* eslint-enable max-len */\n/* eslint-enable no-control-regex */\n\n/**\n * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2\n * @param {String} display_name\n */\nfunction validateDisplayName(display_name) {\n  var display_name_without_quotes = display_name.replace(/^\"(.+)\"$/, '$1');\n  // display name with only spaces is not valid\n  if (!display_name_without_quotes.trim()) {\n    return false;\n  }\n\n  // check whether display name contains illegal character\n  var contains_illegal = /[\\.\";<>]/.test(display_name_without_quotes);\n  if (contains_illegal) {\n    // if contains illegal characters,\n    // must to be enclosed in double-quotes, otherwise it's not a valid display name\n    if (display_name_without_quotes === display_name) {\n      return false;\n    }\n\n    // the quotes in display name must start with character symbol \\\n    var all_start_with_back_slash = display_name_without_quotes.split('\"').length === display_name_without_quotes.split('\\\\\"').length;\n    if (!all_start_with_back_slash) {\n      return false;\n    }\n  }\n  return true;\n}\nexport default function isEmail(str, options) {\n  assertString(str);\n  options = merge(options, default_email_options);\n  if (options.require_display_name || options.allow_display_name) {\n    var display_email = str.match(splitNameAddress);\n    if (display_email) {\n      var display_name = display_email[1];\n\n      // Remove display name and angle brackets to get email address\n      // Can be done in the regex but will introduce a ReDOS (See  #1597 for more info)\n      str = str.replace(display_name, '').replace(/(^<|>$)/g, '');\n\n      // sometimes need to trim the last space to get the display name\n      // because there may be a space between display name and email address\n      // eg. myname <address@gmail.com>\n      // the display name is `myname` instead of `myname `, so need to trim the last space\n      if (display_name.endsWith(' ')) {\n        display_name = display_name.slice(0, -1);\n      }\n      if (!validateDisplayName(display_name)) {\n        return false;\n      }\n    } else if (options.require_display_name) {\n      return false;\n    }\n  }\n  if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {\n    return false;\n  }\n  var parts = str.split('@');\n  var domain = parts.pop();\n  var lower_domain = domain.toLowerCase();\n  if (options.host_blacklist.includes(lower_domain)) {\n    return false;\n  }\n  if (options.host_whitelist.length > 0 && !options.host_whitelist.includes(lower_domain)) {\n    return false;\n  }\n  var user = parts.join('@');\n  if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {\n    /*\n      Previously we removed dots for gmail addresses before validating.\n      This was removed because it allows `multiple..dots@gmail.com`\n      to be reported as valid, but it is not.\n      Gmail only normalizes single dots, removing them from here is pointless,\n      should be done in normalizeEmail\n    */\n    user = user.toLowerCase();\n\n    // Removing sub-address from username before gmail validation\n    var username = user.split('+')[0];\n\n    // Dots are not included in gmail length restriction\n    if (!isByteLength(username.replace(/\\./g, ''), {\n      min: 6,\n      max: 30\n    })) {\n      return false;\n    }\n    var _user_parts = username.split('.');\n    for (var i = 0; i < _user_parts.length; i++) {\n      if (!gmailUserPart.test(_user_parts[i])) {\n        return false;\n      }\n    }\n  }\n  if (options.ignore_max_length === false && (!isByteLength(user, {\n    max: 64\n  }) || !isByteLength(domain, {\n    max: 254\n  }))) {\n    return false;\n  }\n  if (!isFQDN(domain, {\n    require_tld: options.require_tld,\n    ignore_max_length: options.ignore_max_length,\n    allow_underscores: options.allow_underscores\n  })) {\n    if (!options.allow_ip_domain) {\n      return false;\n    }\n    if (!isIP(domain)) {\n      if (!domain.startsWith('[') || !domain.endsWith(']')) {\n        return false;\n      }\n      var noBracketdomain = domain.slice(1, -1);\n      if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) {\n        return false;\n      }\n    }\n  }\n  if (user[0] === '\"') {\n    user = user.slice(1, user.length - 1);\n    return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);\n  }\n  var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;\n  var user_parts = user.split('.');\n  for (var _i = 0; _i < user_parts.length; _i++) {\n    if (!pattern.test(user_parts[_i])) {\n      return false;\n    }\n  }\n  if (options.blacklisted_chars) {\n    if (user.search(new RegExp(\"[\".concat(options.blacklisted_chars, \"]+\"), 'g')) !== -1) return false;\n  }\n  return true;\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nimport assertString from './util/assertString';\nimport isFQDN from './isFQDN';\nimport isIP from './isIP';\nimport merge from './util/merge';\n\n/*\noptions for isURL method\n\nrequire_protocol - if set as true isURL will return false if protocol is not present in the URL\nrequire_valid_protocol - isURL will check if the URL's protocol is present in the protocols option\nprotocols - valid protocols can be modified with this option\nrequire_host - if set as false isURL will not check if host is present in the URL\nrequire_port - if set as true isURL will check if port is present in the URL\nallow_protocol_relative_urls - if set as true protocol relative URLs will be allowed\nvalidate_length - if set as false isURL will skip string length validation (IE maximum is 2083)\n\n*/\n\nvar default_url_options = {\n  protocols: ['http', 'https', 'ftp'],\n  require_tld: true,\n  require_protocol: false,\n  require_host: true,\n  require_port: false,\n  require_valid_protocol: true,\n  allow_underscores: false,\n  allow_trailing_dot: false,\n  allow_protocol_relative_urls: false,\n  allow_fragments: true,\n  allow_query_components: true,\n  validate_length: true\n};\nvar wrapped_ipv6 = /^\\[([^\\]]+)\\](?::([0-9]+))?$/;\nfunction isRegExp(obj) {\n  return Object.prototype.toString.call(obj) === '[object RegExp]';\n}\nfunction checkHost(host, matches) {\n  for (var i = 0; i < matches.length; i++) {\n    var match = matches[i];\n    if (host === match || isRegExp(match) && match.test(host)) {\n      return true;\n    }\n  }\n  return false;\n}\nexport default function isURL(url, options) {\n  assertString(url);\n  if (!url || /[\\s<>]/.test(url)) {\n    return false;\n  }\n  if (url.indexOf('mailto:') === 0) {\n    return false;\n  }\n  options = merge(options, default_url_options);\n  if (options.validate_length && url.length >= 2083) {\n    return false;\n  }\n  if (!options.allow_fragments && url.includes('#')) {\n    return false;\n  }\n  if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {\n    return false;\n  }\n  var protocol, auth, host, hostname, port, port_str, split, ipv6;\n  split = url.split('#');\n  url = split.shift();\n  split = url.split('?');\n  url = split.shift();\n  split = url.split('://');\n  if (split.length > 1) {\n    protocol = split.shift().toLowerCase();\n    if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {\n      return false;\n    }\n  } else if (options.require_protocol) {\n    return false;\n  } else if (url.slice(0, 2) === '//') {\n    if (!options.allow_protocol_relative_urls) {\n      return false;\n    }\n    split[0] = url.slice(2);\n  }\n  url = split.join('://');\n  if (url === '') {\n    return false;\n  }\n  split = url.split('/');\n  url = split.shift();\n  if (url === '' && !options.require_host) {\n    return true;\n  }\n  split = url.split('@');\n  if (split.length > 1) {\n    if (options.disallow_auth) {\n      return false;\n    }\n    if (split[0] === '') {\n      return false;\n    }\n    auth = split.shift();\n    if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {\n      return false;\n    }\n    var _auth$split = auth.split(':'),\n      _auth$split2 = _slicedToArray(_auth$split, 2),\n      user = _auth$split2[0],\n      password = _auth$split2[1];\n    if (user === '' && password === '') {\n      return false;\n    }\n  }\n  hostname = split.join('@');\n  port_str = null;\n  ipv6 = null;\n  var ipv6_match = hostname.match(wrapped_ipv6);\n  if (ipv6_match) {\n    host = '';\n    ipv6 = ipv6_match[1];\n    port_str = ipv6_match[2] || null;\n  } else {\n    split = hostname.split(':');\n    host = split.shift();\n    if (split.length) {\n      port_str = split.join(':');\n    }\n  }\n  if (port_str !== null && port_str.length > 0) {\n    port = parseInt(port_str, 10);\n    if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {\n      return false;\n    }\n  } else if (options.require_port) {\n    return false;\n  }\n  if (options.host_whitelist) {\n    return checkHost(host, options.host_whitelist);\n  }\n  if (host === '' && !options.require_host) {\n    return true;\n  }\n  if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {\n    return false;\n  }\n  host = host || ipv6;\n  if (options.host_blacklist && checkHost(host, options.host_blacklist)) {\n    return false;\n  }\n  return true;\n}","import assertString from './util/assertString';\nvar macAddress48 = /^(?:[0-9a-fA-F]{2}([-:\\s]))([0-9a-fA-F]{2}\\1){4}([0-9a-fA-F]{2})$/;\nvar macAddress48NoSeparators = /^([0-9a-fA-F]){12}$/;\nvar macAddress48WithDots = /^([0-9a-fA-F]{4}\\.){2}([0-9a-fA-F]{4})$/;\nvar macAddress64 = /^(?:[0-9a-fA-F]{2}([-:\\s]))([0-9a-fA-F]{2}\\1){6}([0-9a-fA-F]{2})$/;\nvar macAddress64NoSeparators = /^([0-9a-fA-F]){16}$/;\nvar macAddress64WithDots = /^([0-9a-fA-F]{4}\\.){3}([0-9a-fA-F]{4})$/;\nexport default function isMACAddress(str, options) {\n  assertString(str);\n  if (options !== null && options !== void 0 && options.eui) {\n    options.eui = String(options.eui);\n  }\n  /**\n   * @deprecated `no_colons` TODO: remove it in the next major\n  */\n  if (options !== null && options !== void 0 && options.no_colons || options !== null && options !== void 0 && options.no_separators) {\n    if (options.eui === '48') {\n      return macAddress48NoSeparators.test(str);\n    }\n    if (options.eui === '64') {\n      return macAddress64NoSeparators.test(str);\n    }\n    return macAddress48NoSeparators.test(str) || macAddress64NoSeparators.test(str);\n  }\n  if ((options === null || options === void 0 ? void 0 : options.eui) === '48') {\n    return macAddress48.test(str) || macAddress48WithDots.test(str);\n  }\n  if ((options === null || options === void 0 ? void 0 : options.eui) === '64') {\n    return macAddress64.test(str) || macAddress64WithDots.test(str);\n  }\n  return isMACAddress(str, {\n    eui: '48'\n  }) || isMACAddress(str, {\n    eui: '64'\n  });\n}","import assertString from './util/assertString';\nimport isIP from './isIP';\nvar subnetMaybe = /^\\d{1,3}$/;\nvar v4Subnet = 32;\nvar v6Subnet = 128;\nexport default function isIPRange(str) {\n  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  assertString(str);\n  var parts = str.split('/');\n\n  // parts[0] -> ip, parts[1] -> subnet\n  if (parts.length !== 2) {\n    return false;\n  }\n  if (!subnetMaybe.test(parts[1])) {\n    return false;\n  }\n\n  // Disallow preceding 0 i.e. 01, 02, ...\n  if (parts[1].length > 1 && parts[1].startsWith('0')) {\n    return false;\n  }\n  var isValidIP = isIP(parts[0], version);\n  if (!isValidIP) {\n    return false;\n  }\n\n  // Define valid subnet according to IP's version\n  var expectedSubnet = null;\n  switch (String(version)) {\n    case '4':\n      expectedSubnet = v4Subnet;\n      break;\n    case '6':\n      expectedSubnet = v6Subnet;\n      break;\n    default:\n      expectedSubnet = isIP(parts[0], '6') ? v6Subnet : v4Subnet;\n  }\n  return parts[1] <= expectedSubnet && parts[1] >= 0;\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nimport merge from './util/merge';\nvar default_date_options = {\n  format: 'YYYY/MM/DD',\n  delimiters: ['/', '-'],\n  strictMode: false\n};\nfunction isValidFormat(format) {\n  return /(^(y{4}|y{2})[.\\/-](m{1,2})[.\\/-](d{1,2})$)|(^(m{1,2})[.\\/-](d{1,2})[.\\/-]((y{4}|y{2})$))|(^(d{1,2})[.\\/-](m{1,2})[.\\/-]((y{4}|y{2})$))/gi.test(format);\n}\nfunction zip(date, format) {\n  var zippedArr = [],\n    len = Math.min(date.length, format.length);\n  for (var i = 0; i < len; i++) {\n    zippedArr.push([date[i], format[i]]);\n  }\n  return zippedArr;\n}\nexport default function isDate(input, options) {\n  if (typeof options === 'string') {\n    // Allow backward compatibility for old format isDate(input [, format])\n    options = merge({\n      format: options\n    }, default_date_options);\n  } else {\n    options = merge(options, default_date_options);\n  }\n  if (typeof input === 'string' && isValidFormat(options.format)) {\n    var formatDelimiter = options.delimiters.find(function (delimiter) {\n      return options.format.indexOf(delimiter) !== -1;\n    });\n    var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {\n      return input.indexOf(delimiter) !== -1;\n    });\n    var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));\n    var dateObj = {};\n    var _iterator = _createForOfIteratorHelper(dateAndFormat),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var _step$value = _slicedToArray(_step.value, 2),\n          dateWord = _step$value[0],\n          formatWord = _step$value[1];\n        if (dateWord.length !== formatWord.length) {\n          return false;\n        }\n        dateObj[formatWord.charAt(0)] = dateWord;\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n    var fullYear = dateObj.y;\n\n    // Check if the year starts with a hyphen\n    if (fullYear.startsWith('-')) {\n      return false; // Hyphen before year is not allowed\n    }\n    if (dateObj.y.length === 2) {\n      var parsedYear = parseInt(dateObj.y, 10);\n      if (isNaN(parsedYear)) {\n        return false;\n      }\n      var currentYearLastTwoDigits = new Date().getFullYear() % 100;\n      if (parsedYear < currentYearLastTwoDigits) {\n        fullYear = \"20\".concat(dateObj.y);\n      } else {\n        fullYear = \"19\".concat(dateObj.y);\n      }\n    }\n    var month = dateObj.m;\n    if (dateObj.m.length === 1) {\n      month = \"0\".concat(dateObj.m);\n    }\n    var day = dateObj.d;\n    if (dateObj.d.length === 1) {\n      day = \"0\".concat(dateObj.d);\n    }\n    return new Date(\"\".concat(fullYear, \"-\").concat(month, \"-\").concat(day, \"T00:00:00.000Z\")).getUTCDate() === +dateObj.d;\n  }\n  if (!options.strictMode) {\n    return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);\n  }\n  return false;\n}","import merge from './util/merge';\nvar default_time_options = {\n  hourFormat: 'hour24',\n  mode: 'default'\n};\nvar formats = {\n  hour24: {\n    \"default\": /^([01]?[0-9]|2[0-3]):([0-5][0-9])$/,\n    withSeconds: /^([01]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/\n  },\n  hour12: {\n    \"default\": /^(0?[1-9]|1[0-2]):([0-5][0-9]) (A|P)M$/,\n    withSeconds: /^(0?[1-9]|1[0-2]):([0-5][0-9]):([0-5][0-9]) (A|P)M$/\n  }\n};\nexport default function isTime(input, options) {\n  options = merge(options, default_time_options);\n  if (typeof input !== 'string') return false;\n  return formats[options.hourFormat][options.mode].test(input);\n}","import assertString from './util/assertString';\nvar defaultOptions = {\n  loose: false\n};\nvar strictBooleans = ['true', 'false', '1', '0'];\nvar looseBooleans = [].concat(strictBooleans, ['yes', 'no']);\nexport default function isBoolean(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;\n  assertString(str);\n  if (options.loose) {\n    return looseBooleans.includes(str.toLowerCase());\n  }\n  return strictBooleans.includes(str);\n}","import assertString from './util/assertString';\n\n/*\n  = 3ALPHA              ; selected ISO 639 codes\n    *2(\"-\" 3ALPHA)      ; permanently reserved\n */\nvar extlang = '([A-Za-z]{3}(-[A-Za-z]{3}){0,2})';\n\n/*\n  = 2*3ALPHA            ; shortest ISO 639 code\n    [\"-\" extlang]       ; sometimes followed by\n                        ; extended language subtags\n  / 4ALPHA              ; or reserved for future use\n  / 5*8ALPHA            ; or registered language subtag\n */\nvar language = \"(([a-zA-Z]{2,3}(-\".concat(extlang, \")?)|([a-zA-Z]{5,8}))\");\n\n/*\n  = 4ALPHA              ; ISO 15924 code\n */\nvar script = '([A-Za-z]{4})';\n\n/*\n  = 2ALPHA              ; ISO 3166-1 code\n  / 3DIGIT              ; UN M.49 code\n */\nvar region = '([A-Za-z]{2}|\\\\d{3})';\n\n/*\n  = 5*8alphanum         ; registered variants\n  / (DIGIT 3alphanum)\n */\nvar variant = '([A-Za-z0-9]{5,8}|(\\\\d[A-Z-a-z0-9]{3}))';\n\n/*\n  = DIGIT               ; 0 - 9\n  / %x41-57             ; A - W\n  / %x59-5A             ; Y - Z\n  / %x61-77             ; a - w\n  / %x79-7A             ; y - z\n */\nvar singleton = '(\\\\d|[A-W]|[Y-Z]|[a-w]|[y-z])';\n\n/*\n  = singleton 1*(\"-\" (2*8alphanum))\n                        ; Single alphanumerics\n                        ; \"x\" reserved for private use\n */\nvar extension = \"(\".concat(singleton, \"(-[A-Za-z0-9]{2,8})+)\");\n\n/*\n  = \"x\" 1*(\"-\" (1*8alphanum))\n */\nvar privateuse = '(x(-[A-Za-z0-9]{1,8})+)';\n\n// irregular tags do not match the 'langtag' production and would not\n// otherwise be considered 'well-formed'. These tags are all valid, but\n// most are deprecated in favor of more modern subtags or subtag combination\n\nvar irregular = '((en-GB-oed)|(i-ami)|(i-bnn)|(i-default)|(i-enochian)|' + '(i-hak)|(i-klingon)|(i-lux)|(i-mingo)|(i-navajo)|(i-pwn)|(i-tao)|' + '(i-tay)|(i-tsu)|(sgn-BE-FR)|(sgn-BE-NL)|(sgn-CH-DE))';\n\n// regular tags match the 'langtag' production, but their subtags are not\n// extended language or variant subtags: their meaning is defined by\n// their registration and all of these are deprecated in favor of a more\n// modern subtag or sequence of subtags\n\nvar regular = '((art-lojban)|(cel-gaulish)|(no-bok)|(no-nyn)|(zh-guoyu)|' + '(zh-hakka)|(zh-min)|(zh-min-nan)|(zh-xiang))';\n\n/*\n  = irregular           ; non-redundant tags registered\n  / regular             ; during the RFC 3066 era\n\n */\nvar grandfathered = \"(\".concat(irregular, \"|\").concat(regular, \")\");\n\n/*\n  RFC 5646 defines delimitation of subtags via a hyphen:\n\n      \"Subtag\" refers to a specific section of a tag, delimited by a\n      hyphen, such as the subtags 'zh', 'Hant', and 'CN' in the tag \"zh-\n      Hant-CN\".  Examples of subtags in this document are enclosed in\n      single quotes ('Hant')\n\n  However, we need to add \"_\" to maintain the existing behaviour.\n */\nvar delimiter = '(-|_)';\n\n/*\n  = language\n    [\"-\" script]\n    [\"-\" region]\n    *(\"-\" variant)\n    *(\"-\" extension)\n    [\"-\" privateuse]\n */\nvar langtag = \"\".concat(language, \"(\").concat(delimiter).concat(script, \")?(\").concat(delimiter).concat(region, \")?(\").concat(delimiter).concat(variant, \")*(\").concat(delimiter).concat(extension, \")*(\").concat(delimiter).concat(privateuse, \")?\");\n\n/*\n  Regex implementation based on BCP RFC 5646\n  Tags for Identifying Languages\n  https://www.rfc-editor.org/rfc/rfc5646.html\n */\nvar languageTagRegex = new RegExp(\"(^\".concat(privateuse, \"$)|(^\").concat(grandfathered, \"$)|(^\").concat(langtag, \"$)\"));\nexport default function isLocale(str) {\n  assertString(str);\n  return languageTagRegex.test(str);\n}","import assertString from './util/assertString';\n\n// http://www.brainjar.com/js/validation/\n// https://www.aba.com/news-research/research-analysis/routing-number-policy-procedures\n// series reserved for future use are excluded\nvar isRoutingReg = /^(?!(1[3-9])|(20)|(3[3-9])|(4[0-9])|(5[0-9])|(60)|(7[3-9])|(8[1-9])|(9[0-2])|(9[3-9]))[0-9]{9}$/;\nexport default function isAbaRouting(str) {\n  assertString(str);\n  if (!isRoutingReg.test(str)) return false;\n  var checkSumVal = 0;\n  for (var i = 0; i < str.length; i++) {\n    if (i % 3 === 0) checkSumVal += str[i] * 3;else if (i % 3 === 1) checkSumVal += str[i] * 7;else checkSumVal += str[i] * 1;\n  }\n  return checkSumVal % 10 === 0;\n}","import assertString from './util/assertString';\nimport { alpha } from './alpha';\nexport default function isAlpha(_str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  assertString(_str);\n  var str = _str;\n  var ignore = options.ignore;\n  if (ignore) {\n    if (ignore instanceof RegExp) {\n      str = str.replace(ignore, '');\n    } else if (typeof ignore === 'string') {\n      str = str.replace(new RegExp(\"[\".concat(ignore.replace(/[-[\\]{}()*+?.,\\\\^$|#\\\\s]/g, '\\\\$&'), \"]\"), 'g'), ''); // escape regex for ignore\n    } else {\n      throw new Error('ignore should be instance of a String or RegExp');\n    }\n  }\n  if (locale in alpha) {\n    return alpha[locale].test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nexport var locales = Object.keys(alpha);","import assertString from './util/assertString';\nimport { alphanumeric } from './alpha';\nexport default function isAlphanumeric(_str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  assertString(_str);\n  var str = _str;\n  var ignore = options.ignore;\n  if (ignore) {\n    if (ignore instanceof RegExp) {\n      str = str.replace(ignore, '');\n    } else if (typeof ignore === 'string') {\n      str = str.replace(new RegExp(\"[\".concat(ignore.replace(/[-[\\]{}()*+?.,\\\\^$|#\\\\s]/g, '\\\\$&'), \"]\"), 'g'), ''); // escape regex for ignore\n    } else {\n      throw new Error('ignore should be instance of a String or RegExp');\n    }\n  }\n  if (locale in alphanumeric) {\n    return alphanumeric[locale].test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nexport var locales = Object.keys(alphanumeric);","import assertString from './util/assertString';\nimport { decimal } from './alpha';\nvar numericNoSymbols = /^[0-9]+$/;\nexport default function isNumeric(str, options) {\n  assertString(str);\n  if (options && options.no_symbols) {\n    return numericNoSymbols.test(str);\n  }\n  return new RegExp(\"^[+-]?([0-9]*[\".concat((options || {}).locale ? decimal[options.locale] : '.', \"])?[0-9]+$\")).test(str);\n}","import assertString from './util/assertString';\n\n/**\n * Reference:\n * https://en.wikipedia.org/ -- Wikipedia\n * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number\n * https://countrycode.org/ -- Country Codes\n */\nvar passportRegexByCountryCode = {\n  AM: /^[A-Z]{2}\\d{7}$/,\n  // ARMENIA\n  AR: /^[A-Z]{3}\\d{6}$/,\n  // ARGENTINA\n  AT: /^[A-Z]\\d{7}$/,\n  // AUSTRIA\n  AU: /^[A-Z]\\d{7}$/,\n  // AUSTRALIA\n  AZ: /^[A-Z]{1}\\d{8}$/,\n  // AZERBAIJAN\n  BE: /^[A-Z]{2}\\d{6}$/,\n  // BELGIUM\n  BG: /^\\d{9}$/,\n  // BULGARIA\n  BR: /^[A-Z]{2}\\d{6}$/,\n  // BRAZIL\n  BY: /^[A-Z]{2}\\d{7}$/,\n  // BELARUS\n  CA: /^[A-Z]{2}\\d{6}$/,\n  // CANADA\n  CH: /^[A-Z]\\d{7}$/,\n  // SWITZERLAND\n  CN: /^G\\d{8}$|^E(?![IO])[A-Z0-9]\\d{7}$/,\n  // CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits\n  CY: /^[A-Z](\\d{6}|\\d{8})$/,\n  // CYPRUS\n  CZ: /^\\d{8}$/,\n  // CZECH REPUBLIC\n  DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,\n  // GERMANY\n  DK: /^\\d{9}$/,\n  // DENMARK\n  DZ: /^\\d{9}$/,\n  // ALGERIA\n  EE: /^([A-Z]\\d{7}|[A-Z]{2}\\d{7})$/,\n  // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits\n  ES: /^[A-Z0-9]{2}([A-Z0-9]?)\\d{6}$/,\n  // SPAIN\n  FI: /^[A-Z]{2}\\d{7}$/,\n  // FINLAND\n  FR: /^\\d{2}[A-Z]{2}\\d{5}$/,\n  // FRANCE\n  GB: /^\\d{9}$/,\n  // UNITED KINGDOM\n  GR: /^[A-Z]{2}\\d{7}$/,\n  // GREECE\n  HR: /^\\d{9}$/,\n  // CROATIA\n  HU: /^[A-Z]{2}(\\d{6}|\\d{7})$/,\n  // HUNGARY\n  IE: /^[A-Z0-9]{2}\\d{7}$/,\n  // IRELAND\n  IN: /^[A-Z]{1}-?\\d{7}$/,\n  // INDIA\n  ID: /^[A-C]\\d{7}$/,\n  // INDONESIA\n  IR: /^[A-Z]\\d{8}$/,\n  // IRAN\n  IS: /^(A)\\d{7}$/,\n  // ICELAND\n  IT: /^[A-Z0-9]{2}\\d{7}$/,\n  // ITALY\n  JM: /^[Aa]\\d{7}$/,\n  // JAMAICA\n  JP: /^[A-Z]{2}\\d{7}$/,\n  // JAPAN\n  KR: /^[MS]\\d{8}$/,\n  // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]\n  KZ: /^[a-zA-Z]\\d{7}$/,\n  // KAZAKHSTAN\n  LI: /^[a-zA-Z]\\d{5}$/,\n  // LIECHTENSTEIN\n  LT: /^[A-Z0-9]{8}$/,\n  // LITHUANIA\n  LU: /^[A-Z0-9]{8}$/,\n  // LUXEMBURG\n  LV: /^[A-Z0-9]{2}\\d{7}$/,\n  // LATVIA\n  LY: /^[A-Z0-9]{8}$/,\n  // LIBYA\n  MT: /^\\d{7}$/,\n  // MALTA\n  MZ: /^([A-Z]{2}\\d{7})|(\\d{2}[A-Z]{2}\\d{5})$/,\n  // MOZAMBIQUE\n  MY: /^[AHK]\\d{8}$/,\n  // MALAYSIA\n  MX: /^\\d{10,11}$/,\n  // MEXICO\n  NL: /^[A-Z]{2}[A-Z0-9]{6}\\d$/,\n  // NETHERLANDS\n  NZ: /^([Ll]([Aa]|[Dd]|[Ff]|[Hh])|[Ee]([Aa]|[Pp])|[Nn])\\d{6}$/,\n  // NEW ZEALAND\n  PH: /^([A-Z](\\d{6}|\\d{7}[A-Z]))|([A-Z]{2}(\\d{6}|\\d{7}))$/,\n  // PHILIPPINES\n  PK: /^[A-Z]{2}\\d{7}$/,\n  // PAKISTAN\n  PL: /^[A-Z]{2}\\d{7}$/,\n  // POLAND\n  PT: /^[A-Z]\\d{6}$/,\n  // PORTUGAL\n  RO: /^\\d{8,9}$/,\n  // ROMANIA\n  RU: /^\\d{9}$/,\n  // RUSSIAN FEDERATION\n  SE: /^\\d{8}$/,\n  // SWEDEN\n  SL: /^(P)[A-Z]\\d{7}$/,\n  // SLOVENIA\n  SK: /^[0-9A-Z]\\d{7}$/,\n  // SLOVAKIA\n  TH: /^[A-Z]{1,2}\\d{6,7}$/,\n  // THAILAND\n  TR: /^[A-Z]\\d{8}$/,\n  // TURKEY\n  UA: /^[A-Z]{2}\\d{6}$/,\n  // UKRAINE\n  US: /^\\d{9}$/,\n  // UNITED STATES\n  ZA: /^[TAMD]\\d{8}$/ // SOUTH AFRICA\n};\n\n/**\n * Check if str is a valid passport number\n * relative to provided ISO Country Code.\n *\n * @param {string} str\n * @param {string} countryCode\n * @return {boolean}\n */\nexport default function isPassportNumber(str, countryCode) {\n  assertString(str);\n  /** Remove All Whitespaces, Convert to UPPERCASE */\n  var normalizedStr = str.replace(/\\s/g, '').toUpperCase();\n  return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);\n}","import assertString from './util/assertString';\nvar _int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;\nvar intLeadingZeroes = /^[-+]?[0-9]+$/;\nexport default function isInt(str, options) {\n  assertString(str);\n  options = options || {};\n\n  // Get the regex to use for testing, based on whether\n  // leading zeroes are allowed or not.\n  var regex = options.allow_leading_zeroes === false ? _int : intLeadingZeroes;\n\n  // Check min/max/lt/gt\n  var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;\n  var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;\n  var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;\n  var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;\n  return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;\n}","import assertString from './util/assertString';\nvar imeiRegexWithoutHypens = /^[0-9]{15}$/;\nvar imeiRegexWithHypens = /^\\d{2}-\\d{6}-\\d{6}-\\d{1}$/;\nexport default function isIMEI(str, options) {\n  assertString(str);\n  options = options || {};\n\n  // default regex for checking imei is the one without hyphens\n\n  var imeiRegex = imeiRegexWithoutHypens;\n  if (options.allow_hyphens) {\n    imeiRegex = imeiRegexWithHypens;\n  }\n  if (!imeiRegex.test(str)) {\n    return false;\n  }\n  str = str.replace(/-/g, '');\n  var sum = 0,\n    mul = 2,\n    l = 14;\n  for (var i = 0; i < l; i++) {\n    var digit = str.substring(l - i - 1, l - i);\n    var tp = parseInt(digit, 10) * mul;\n    if (tp >= 10) {\n      sum += tp % 10 + 1;\n    } else {\n      sum += tp;\n    }\n    if (mul === 1) {\n      mul += 1;\n    } else {\n      mul -= 1;\n    }\n  }\n  var chk = (10 - sum % 10) % 10;\n  if (chk !== parseInt(str.substring(14, 15), 10)) {\n    return false;\n  }\n  return true;\n}","/**\n * Build RegExp object from an array\n * of multiple/multi-line regexp parts\n *\n * @param {string[]} parts\n * @param {string} flags\n * @return {object} - RegExp object\n */\nexport default function multilineRegexp(parts, flags) {\n  var regexpAsStringLiteral = parts.join('');\n  return new RegExp(regexpAsStringLiteral, flags);\n}","import assertString from './util/assertString';\n\n/* eslint-disable no-control-regex */\nvar ascii = /^[\\x00-\\x7F]+$/;\n/* eslint-enable no-control-regex */\n\nexport default function isAscii(str) {\n  assertString(str);\n  return ascii.test(str);\n}","import assertString from './util/assertString';\nexport var fullWidth = /[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]/;\nexport default function isFullWidth(str) {\n  assertString(str);\n  return fullWidth.test(str);\n}","import assertString from './util/assertString';\nexport var halfWidth = /[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]/;\nexport default function isHalfWidth(str) {\n  assertString(str);\n  return halfWidth.test(str);\n}","import assertString from './util/assertString';\n\n/* eslint-disable no-control-regex */\nvar multibyte = /[^\\x00-\\x7F]/;\n/* eslint-enable no-control-regex */\n\nexport default function isMultibyte(str) {\n  assertString(str);\n  return multibyte.test(str);\n}","import assertString from './util/assertString';\nimport multilineRegexp from './util/multilineRegex';\n\n/**\n * Regular Expression to match\n * semantic versioning (SemVer)\n * built from multi-line, multi-parts regexp\n * Reference: https://semver.org/\n */\nvar semanticVersioningRegex = multilineRegexp(['^(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)', '(?:-((?:0|[1-9]\\\\d*|\\\\d*[a-z-][0-9a-z-]*)(?:\\\\.(?:0|[1-9]\\\\d*|\\\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\\\+([0-9a-z-]+(?:\\\\.[0-9a-z-]+)*))?$'], 'i');\nexport default function isSemVer(str) {\n  assertString(str);\n  return semanticVersioningRegex.test(str);\n}","import assertString from './util/assertString';\nvar surrogatePair = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nexport default function isSurrogatePair(str) {\n  assertString(str);\n  return surrogatePair.test(str);\n}","import merge from './util/merge';\nimport assertString from './util/assertString';\nimport includes from './util/includes';\nimport { decimal } from './alpha';\nfunction decimalRegExp(options) {\n  var regExp = new RegExp(\"^[-+]?([0-9]+)?(\\\\\".concat(decimal[options.locale], \"[0-9]{\").concat(options.decimal_digits, \"})\").concat(options.force_decimal ? '' : '?', \"$\"));\n  return regExp;\n}\nvar default_decimal_options = {\n  force_decimal: false,\n  decimal_digits: '1,',\n  locale: 'en-US'\n};\nvar blacklist = ['', '-', '+'];\nexport default function isDecimal(str, options) {\n  assertString(str);\n  options = merge(options, default_decimal_options);\n  if (options.locale in decimal) {\n    return !includes(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(options.locale, \"'\"));\n}","import assertString from './util/assertString';\nvar hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;\nexport default function isHexadecimal(str) {\n  assertString(str);\n  return hexadecimal.test(str);\n}","import assertString from './util/assertString';\nvar octal = /^(0o)?[0-7]+$/i;\nexport default function isOctal(str) {\n  assertString(str);\n  return octal.test(str);\n}","import assertString from './util/assertString';\nvar hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;\nexport default function isHexColor(str) {\n  assertString(str);\n  return hexcolor.test(str);\n}","import assertString from './util/assertString';\nvar rgbColor = /^rgb\\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\)$/;\nvar rgbaColor = /^rgba\\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\\.\\d|1(\\.0)?|0(\\.0)?)\\)$/;\nvar rgbColorPercent = /^rgb\\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\\)$/;\nvar rgbaColorPercent = /^rgba\\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\\.\\d|1(\\.0)?|0(\\.0)?)\\)$/;\nexport default function isRgbColor(str) {\n  var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  assertString(str);\n  if (!includePercentValues) {\n    return rgbColor.test(str) || rgbaColor.test(str);\n  }\n  return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);\n}","import assertString from './util/assertString';\nvar hslComma = /^hsla?\\(((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%){2}(,((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%?))?\\)$/i;\nvar hslSpace = /^hsla?\\(((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?))(deg|grad|rad|turn)?(\\s(\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%){2}\\s?(\\/\\s((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%?)\\s?)?\\)$/i;\nexport default function isHSL(str) {\n  assertString(str);\n\n  // Strip duplicate spaces before calling the validation regex (See  #1598 for more info)\n  var strippedStr = str.replace(/\\s+/g, ' ').replace(/\\s?(hsla?\\(|\\)|,)\\s?/ig, '$1');\n  if (strippedStr.indexOf(',') !== -1) {\n    return hslComma.test(strippedStr);\n  }\n  return hslSpace.test(strippedStr);\n}","import assertString from './util/assertString';\n\n// see http://isrc.ifpi.org/en/isrc-standard/code-syntax\nvar isrc = /^[A-Z]{2}[0-9A-Z]{3}\\d{2}\\d{5}$/;\nexport default function isISRC(str) {\n  assertString(str);\n  return isrc.test(str);\n}","import assertString from './util/assertString';\n\n/**\n * List of country codes with\n * corresponding IBAN regular expression\n * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n */\nvar ibanRegexThroughCountryCode = {\n  AD: /^(AD[0-9]{2})\\d{8}[A-Z0-9]{12}$/,\n  AE: /^(AE[0-9]{2})\\d{3}\\d{16}$/,\n  AL: /^(AL[0-9]{2})\\d{8}[A-Z0-9]{16}$/,\n  AT: /^(AT[0-9]{2})\\d{16}$/,\n  AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  BA: /^(BA[0-9]{2})\\d{16}$/,\n  BE: /^(BE[0-9]{2})\\d{12}$/,\n  BG: /^(BG[0-9]{2})[A-Z]{4}\\d{6}[A-Z0-9]{8}$/,\n  BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,\n  BR: /^(BR[0-9]{2})\\d{23}[A-Z]{1}[A-Z0-9]{1}$/,\n  BY: /^(BY[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  CH: /^(CH[0-9]{2})\\d{5}[A-Z0-9]{12}$/,\n  CR: /^(CR[0-9]{2})\\d{18}$/,\n  CY: /^(CY[0-9]{2})\\d{8}[A-Z0-9]{16}$/,\n  CZ: /^(CZ[0-9]{2})\\d{20}$/,\n  DE: /^(DE[0-9]{2})\\d{18}$/,\n  DK: /^(DK[0-9]{2})\\d{14}$/,\n  DO: /^(DO[0-9]{2})[A-Z]{4}\\d{20}$/,\n  DZ: /^(DZ\\d{24})$/,\n  EE: /^(EE[0-9]{2})\\d{16}$/,\n  EG: /^(EG[0-9]{2})\\d{25}$/,\n  ES: /^(ES[0-9]{2})\\d{20}$/,\n  FI: /^(FI[0-9]{2})\\d{14}$/,\n  FO: /^(FO[0-9]{2})\\d{14}$/,\n  FR: /^(FR[0-9]{2})\\d{10}[A-Z0-9]{11}\\d{2}$/,\n  GB: /^(GB[0-9]{2})[A-Z]{4}\\d{14}$/,\n  GE: /^(GE[0-9]{2})[A-Z0-9]{2}\\d{16}$/,\n  GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,\n  GL: /^(GL[0-9]{2})\\d{14}$/,\n  GR: /^(GR[0-9]{2})\\d{7}[A-Z0-9]{16}$/,\n  GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,\n  HR: /^(HR[0-9]{2})\\d{17}$/,\n  HU: /^(HU[0-9]{2})\\d{24}$/,\n  IE: /^(IE[0-9]{2})[A-Z0-9]{4}\\d{14}$/,\n  IL: /^(IL[0-9]{2})\\d{19}$/,\n  IQ: /^(IQ[0-9]{2})[A-Z]{4}\\d{15}$/,\n  IR: /^(IR[0-9]{2})0\\d{2}0\\d{18}$/,\n  IS: /^(IS[0-9]{2})\\d{22}$/,\n  IT: /^(IT[0-9]{2})[A-Z]{1}\\d{10}[A-Z0-9]{12}$/,\n  JO: /^(JO[0-9]{2})[A-Z]{4}\\d{22}$/,\n  KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,\n  KZ: /^(KZ[0-9]{2})\\d{3}[A-Z0-9]{13}$/,\n  LB: /^(LB[0-9]{2})\\d{4}[A-Z0-9]{20}$/,\n  LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,\n  LI: /^(LI[0-9]{2})\\d{5}[A-Z0-9]{12}$/,\n  LT: /^(LT[0-9]{2})\\d{16}$/,\n  LU: /^(LU[0-9]{2})\\d{3}[A-Z0-9]{13}$/,\n  LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,\n  MA: /^(MA[0-9]{26})$/,\n  MC: /^(MC[0-9]{2})\\d{10}[A-Z0-9]{11}\\d{2}$/,\n  MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,\n  ME: /^(ME[0-9]{2})\\d{18}$/,\n  MK: /^(MK[0-9]{2})\\d{3}[A-Z0-9]{10}\\d{2}$/,\n  MR: /^(MR[0-9]{2})\\d{23}$/,\n  MT: /^(MT[0-9]{2})[A-Z]{4}\\d{5}[A-Z0-9]{18}$/,\n  MU: /^(MU[0-9]{2})[A-Z]{4}\\d{19}[A-Z]{3}$/,\n  MZ: /^(MZ[0-9]{2})\\d{21}$/,\n  NL: /^(NL[0-9]{2})[A-Z]{4}\\d{10}$/,\n  NO: /^(NO[0-9]{2})\\d{11}$/,\n  PK: /^(PK[0-9]{2})[A-Z0-9]{4}\\d{16}$/,\n  PL: /^(PL[0-9]{2})\\d{24}$/,\n  PS: /^(PS[0-9]{2})[A-Z0-9]{4}\\d{21}$/,\n  PT: /^(PT[0-9]{2})\\d{21}$/,\n  QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,\n  RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,\n  RS: /^(RS[0-9]{2})\\d{18}$/,\n  SA: /^(SA[0-9]{2})\\d{2}[A-Z0-9]{18}$/,\n  SC: /^(SC[0-9]{2})[A-Z]{4}\\d{20}[A-Z]{3}$/,\n  SE: /^(SE[0-9]{2})\\d{20}$/,\n  SI: /^(SI[0-9]{2})\\d{15}$/,\n  SK: /^(SK[0-9]{2})\\d{20}$/,\n  SM: /^(SM[0-9]{2})[A-Z]{1}\\d{10}[A-Z0-9]{12}$/,\n  SV: /^(SV[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  TL: /^(TL[0-9]{2})\\d{19}$/,\n  TN: /^(TN[0-9]{2})\\d{20}$/,\n  TR: /^(TR[0-9]{2})\\d{5}[A-Z0-9]{17}$/,\n  UA: /^(UA[0-9]{2})\\d{6}[A-Z0-9]{19}$/,\n  VA: /^(VA[0-9]{2})\\d{18}$/,\n  VG: /^(VG[0-9]{2})[A-Z0-9]{4}\\d{16}$/,\n  XK: /^(XK[0-9]{2})\\d{16}$/\n};\n\n/**\n * Check if the country codes passed are valid using the\n * ibanRegexThroughCountryCode as a reference\n *\n * @param {array} countryCodeArray\n * @return {boolean}\n */\n\nfunction hasOnlyValidCountryCodes(countryCodeArray) {\n  var countryCodeArrayFilteredWithObjectIbanCode = countryCodeArray.filter(function (countryCode) {\n    return !(countryCode in ibanRegexThroughCountryCode);\n  });\n  if (countryCodeArrayFilteredWithObjectIbanCode.length > 0) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * Check whether string has correct universal IBAN format\n * The IBAN consists of up to 34 alphanumeric characters, as follows:\n * Country Code using ISO 3166-1 alpha-2, two letters\n * check digits, two digits and\n * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.\n * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]\n *\n * @param {string} str - string under validation\n * @param {object} options - object to pass the countries to be either whitelisted or blacklisted\n * @return {boolean}\n */\nfunction hasValidIbanFormat(str, options) {\n  // Strip white spaces and hyphens\n  var strippedStr = str.replace(/[\\s\\-]+/gi, '').toUpperCase();\n  var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();\n  var isoCountryCodeInIbanRegexCodeObject = (isoCountryCode in ibanRegexThroughCountryCode);\n  if (options.whitelist) {\n    if (!hasOnlyValidCountryCodes(options.whitelist)) {\n      return false;\n    }\n    var isoCountryCodeInWhiteList = options.whitelist.includes(isoCountryCode);\n    if (!isoCountryCodeInWhiteList) {\n      return false;\n    }\n  }\n  if (options.blacklist) {\n    var isoCountryCodeInBlackList = options.blacklist.includes(isoCountryCode);\n    if (isoCountryCodeInBlackList) {\n      return false;\n    }\n  }\n  return isoCountryCodeInIbanRegexCodeObject && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);\n}\n\n/**\n   * Check whether string has valid IBAN Checksum\n   * by performing basic mod-97 operation and\n   * the remainder should equal 1\n   * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string\n   * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35\n   * -- Interpret the string as a decimal integer and\n   * -- compute the remainder on division by 97 (mod 97)\n   * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n   *\n   * @param {string} str\n   * @return {boolean}\n   */\nfunction hasValidIbanChecksum(str) {\n  var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic\n  var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);\n  var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (_char) {\n    return _char.charCodeAt(0) - 55;\n  });\n  var remainder = alphaCapsReplacedWithDigits.match(/\\d{1,7}/g).reduce(function (acc, value) {\n    return Number(acc + value) % 97;\n  }, '');\n  return remainder === 1;\n}\nexport default function isIBAN(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  assertString(str);\n  return hasValidIbanFormat(str, options) && hasValidIbanChecksum(str);\n}\nexport var locales = Object.keys(ibanRegexThroughCountryCode);","import assertString from './util/assertString';\n\n// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\nvar validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);\nexport default function isISO31661Alpha2(str) {\n  assertString(str);\n  return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());\n}\nexport var CountryCodes = validISO31661Alpha2CountriesCodes;","import assertString from './util/assertString';\nimport { CountryCodes } from './isISO31661Alpha2';\n\n// https://en.wikipedia.org/wiki/ISO_9362\nvar isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;\nexport default function isBIC(str) {\n  assertString(str);\n\n  // toUpperCase() should be removed when a new major version goes out that changes\n  // the regex to [A-Z] (per the spec).\n  var countryCode = str.slice(4, 6).toUpperCase();\n  if (!CountryCodes.has(countryCode) && countryCode !== 'XK') {\n    return false;\n  }\n  return isBICReg.test(str);\n}","import assertString from './util/assertString';\nvar md5 = /^[a-f0-9]{32}$/;\nexport default function isMD5(str) {\n  assertString(str);\n  return md5.test(str);\n}","import assertString from './util/assertString';\nvar lengths = {\n  md5: 32,\n  md4: 32,\n  sha1: 40,\n  sha256: 64,\n  sha384: 96,\n  sha512: 128,\n  ripemd128: 32,\n  ripemd160: 40,\n  tiger128: 32,\n  tiger160: 40,\n  tiger192: 48,\n  crc32: 8,\n  crc32b: 8\n};\nexport default function isHash(str, algorithm) {\n  assertString(str);\n  var hash = new RegExp(\"^[a-fA-F0-9]{\".concat(lengths[algorithm], \"}$\"));\n  return hash.test(str);\n}","import assertString from './util/assertString';\nimport merge from './util/merge';\nvar notBase64 = /[^A-Z0-9+\\/=]/i;\nvar urlSafeBase64 = /^[A-Z0-9_\\-]*$/i;\nvar defaultBase64Options = {\n  urlSafe: false\n};\nexport default function isBase64(str, options) {\n  assertString(str);\n  options = merge(options, defaultBase64Options);\n  var len = str.length;\n  if (options.urlSafe) {\n    return urlSafeBase64.test(str);\n  }\n  if (len % 4 !== 0 || notBase64.test(str)) {\n    return false;\n  }\n  var firstPaddingChar = str.indexOf('=');\n  return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';\n}","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nimport assertString from './util/assertString';\nimport merge from './util/merge';\nvar default_json_options = {\n  allow_primitives: false\n};\nexport default function isJSON(str, options) {\n  assertString(str);\n  try {\n    options = merge(options, default_json_options);\n    var primitives = [];\n    if (options.allow_primitives) {\n      primitives = [null, false, true];\n    }\n    var obj = JSON.parse(str);\n    return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';\n  } catch (e) {/* ignore */}\n  return false;\n}","import assertString from './util/assertString';\nimport merge from './util/merge';\nvar default_is_empty_options = {\n  ignore_whitespace: false\n};\nexport default function isEmpty(str, options) {\n  assertString(str);\n  options = merge(options, default_is_empty_options);\n  return (options.ignore_whitespace ? str.trim().length : str.length) === 0;\n}","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nimport assertString from './util/assertString';\n\n/* eslint-disable prefer-rest-params */\nexport default function isLength(str, options) {\n  assertString(str);\n  var min;\n  var max;\n  if (_typeof(options) === 'object') {\n    min = options.min || 0;\n    max = options.max;\n  } else {\n    // backwards compatibility: isLength(str, min [, max])\n    min = arguments[1] || 0;\n    max = arguments[2];\n  }\n  var presentationSequences = str.match(/(\\uFE0F|\\uFE0E)/g) || [];\n  var surrogatePairs = str.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g) || [];\n  var len = str.length - presentationSequences.length - surrogatePairs.length;\n  return len >= min && (typeof max === 'undefined' || len <= max);\n}","import assertString from './util/assertString';\nvar uuid = {\n  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  7: /^[0-9A-F]{8}-[0-9A-F]{4}-7[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i\n};\nexport default function isUUID(str, version) {\n  assertString(str);\n  var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];\n  return !!pattern && pattern.test(str);\n}","function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nimport assertString from './util/assertString';\nimport toString from './util/toString';\nexport default function isIn(str, options) {\n  assertString(str);\n  var i;\n  if (Object.prototype.toString.call(options) === '[object Array]') {\n    var array = [];\n    for (i in options) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if ({}.hasOwnProperty.call(options, i)) {\n        array[i] = toString(options[i]);\n      }\n    }\n    return array.indexOf(str) >= 0;\n  } else if (_typeof(options) === 'object') {\n    return options.hasOwnProperty(str);\n  } else if (options && typeof options.indexOf === 'function') {\n    return options.indexOf(str) >= 0;\n  }\n  return false;\n}","import assertString from './util/assertString';\nexport default function isLuhnNumber(str) {\n  assertString(str);\n  var sanitized = str.replace(/[- ]+/g, '');\n  var sum = 0;\n  var digit;\n  var tmpNum;\n  var shouldDouble;\n  for (var i = sanitized.length - 1; i >= 0; i--) {\n    digit = sanitized.substring(i, i + 1);\n    tmpNum = parseInt(digit, 10);\n    if (shouldDouble) {\n      tmpNum *= 2;\n      if (tmpNum >= 10) {\n        sum += tmpNum % 10 + 1;\n      } else {\n        sum += tmpNum;\n      }\n    } else {\n      sum += tmpNum;\n    }\n    shouldDouble = !shouldDouble;\n  }\n  return !!(sum % 10 === 0 ? sanitized : false);\n}","import assertString from './util/assertString';\nimport isLuhnValid from './isLuhnNumber';\nvar cards = {\n  amex: /^3[47][0-9]{13}$/,\n  dinersclub: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,\n  discover: /^6(?:011|5[0-9][0-9])[0-9]{12,15}$/,\n  jcb: /^(?:2131|1800|35\\d{3})\\d{11}$/,\n  mastercard: /^5[1-5][0-9]{2}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/,\n  // /^[25][1-7][0-9]{14}$/;\n  unionpay: /^(6[27][0-9]{14}|^(81[0-9]{14,17}))$/,\n  visa: /^(?:4[0-9]{12})(?:[0-9]{3,6})?$/\n};\nvar allCards = function () {\n  var tmpCardsArray = [];\n  for (var cardProvider in cards) {\n    // istanbul ignore else\n    if (cards.hasOwnProperty(cardProvider)) {\n      tmpCardsArray.push(cards[cardProvider]);\n    }\n  }\n  return tmpCardsArray;\n}();\nexport default function isCreditCard(card) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  assertString(card);\n  var provider = options.provider;\n  var sanitized = card.replace(/[- ]+/g, '');\n  if (provider && provider.toLowerCase() in cards) {\n    // specific provider in the list\n    if (!cards[provider.toLowerCase()].test(sanitized)) {\n      return false;\n    }\n  } else if (provider && !(provider.toLowerCase() in cards)) {\n    /* specific provider not in the list */\n    throw new Error(\"\".concat(provider, \" is not a valid credit card provider.\"));\n  } else if (!allCards.some(function (cardProvider) {\n    return cardProvider.test(sanitized);\n  })) {\n    // no specific provider\n    return false;\n  }\n  return isLuhnValid(card);\n}","import assertString from './util/assertString';\nimport isInt from './isInt';\nvar validators = {\n  PL: function PL(str) {\n    assertString(str);\n    var weightOfDigits = {\n      1: 1,\n      2: 3,\n      3: 7,\n      4: 9,\n      5: 1,\n      6: 3,\n      7: 7,\n      8: 9,\n      9: 1,\n      10: 3,\n      11: 0\n    };\n    if (str != null && str.length === 11 && isInt(str, {\n      allow_leading_zeroes: true\n    })) {\n      var digits = str.split('').slice(0, -1);\n      var sum = digits.reduce(function (acc, digit, index) {\n        return acc + Number(digit) * weightOfDigits[index + 1];\n      }, 0);\n      var modulo = sum % 10;\n      var lastDigit = Number(str.charAt(str.length - 1));\n      if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {\n        return true;\n      }\n    }\n    return false;\n  },\n  ES: function ES(str) {\n    assertString(str);\n    var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;\n    var charsValue = {\n      X: 0,\n      Y: 1,\n      Z: 2\n    };\n    var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];\n\n    // sanitize user input\n    var sanitized = str.trim().toUpperCase();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n\n    // validate the control digit\n    var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (_char) {\n      return charsValue[_char];\n    });\n    return sanitized.endsWith(controlDigits[number % 23]);\n  },\n  FI: function FI(str) {\n    // https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated\n    assertString(str);\n    if (str.length !== 11) {\n      return false;\n    }\n    if (!str.match(/^\\d{6}[\\-A\\+]\\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {\n      return false;\n    }\n    var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';\n    var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);\n    var remainder = idAsNumber % 31;\n    var checkDigit = checkDigits[remainder];\n    return checkDigit === str.slice(10, 11);\n  },\n  IN: function IN(str) {\n    var DNI = /^[1-9]\\d{3}\\s?\\d{4}\\s?\\d{4}$/;\n\n    // multiplication table\n    var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];\n\n    // permutation table\n    var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]];\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    var c = 0;\n    var invertedArray = sanitized.replace(/\\s/g, '').split('').map(Number).reverse();\n    invertedArray.forEach(function (val, i) {\n      c = d[c][p[i % 8][val]];\n    });\n    return c === 0;\n  },\n  IR: function IR(str) {\n    if (!str.match(/^\\d{10}$/)) return false;\n    str = \"0000\".concat(str).slice(str.length - 6);\n    if (parseInt(str.slice(3, 9), 10) === 0) return false;\n    var lastNumber = parseInt(str.slice(9, 10), 10);\n    var sum = 0;\n    for (var i = 0; i < 9; i++) {\n      sum += parseInt(str.slice(i, i + 1), 10) * (10 - i);\n    }\n    sum %= 11;\n    return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;\n  },\n  IT: function IT(str) {\n    if (str.length !== 9) return false;\n    if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana\n    return str.search(/C[A-Z]\\d{5}[A-Z]{2}/i) > -1;\n  },\n  NO: function NO(str) {\n    var sanitized = str.trim();\n    if (isNaN(Number(sanitized))) return false;\n    if (sanitized.length !== 11) return false;\n    if (sanitized === '00000000000') return false;\n\n    // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer\n    var f = sanitized.split('').map(Number);\n    var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;\n    var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;\n    if (k1 !== f[9] || k2 !== f[10]) return false;\n    return true;\n  },\n  TH: function TH(str) {\n    if (!str.match(/^[1-8]\\d{12}$/)) return false;\n\n    // validate check digit\n    var sum = 0;\n    for (var i = 0; i < 12; i++) {\n      sum += parseInt(str[i], 10) * (13 - i);\n    }\n    return str[12] === ((11 - sum % 11) % 10).toString();\n  },\n  LK: function LK(str) {\n    var old_nic = /^[1-9]\\d{8}[vx]$/i;\n    var new_nic = /^[1-9]\\d{11}$/i;\n    if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;\n    return false;\n  },\n  'he-IL': function heIL(str) {\n    var DNI = /^\\d{9}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    var id = sanitized;\n    var sum = 0,\n      incNum;\n    for (var i = 0; i < id.length; i++) {\n      incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2\n      sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total\n    }\n    return sum % 10 === 0;\n  },\n  'ar-LY': function arLY(str) {\n    // Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2\n    var NIN = /^(1|2)\\d{11}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!NIN.test(sanitized)) {\n      return false;\n    }\n    return true;\n  },\n  'ar-TN': function arTN(str) {\n    var DNI = /^\\d{8}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    return true;\n  },\n  'zh-CN': function zhCN(str) {\n    var provincesAndCities = ['11',\n    // 北京\n    '12',\n    // 天津\n    '13',\n    // 河北\n    '14',\n    // 山西\n    '15',\n    // 内蒙古\n    '21',\n    // 辽宁\n    '22',\n    // 吉林\n    '23',\n    // 黑龙江\n    '31',\n    // 上海\n    '32',\n    // 江苏\n    '33',\n    // 浙江\n    '34',\n    // 安徽\n    '35',\n    // 福建\n    '36',\n    // 江西\n    '37',\n    // 山东\n    '41',\n    // 河南\n    '42',\n    // 湖北\n    '43',\n    // 湖南\n    '44',\n    // 广东\n    '45',\n    // 广西\n    '46',\n    // 海南\n    '50',\n    // 重庆\n    '51',\n    // 四川\n    '52',\n    // 贵州\n    '53',\n    // 云南\n    '54',\n    // 西藏\n    '61',\n    // 陕西\n    '62',\n    // 甘肃\n    '63',\n    // 青海\n    '64',\n    // 宁夏\n    '65',\n    // 新疆\n    '71',\n    // 台湾\n    '81',\n    // 香港\n    '82',\n    // 澳门\n    '91' // 国外\n    ];\n    var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];\n    var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n    var checkAddressCode = function checkAddressCode(addressCode) {\n      return provincesAndCities.includes(addressCode);\n    };\n    var checkBirthDayCode = function checkBirthDayCode(birDayCode) {\n      var yyyy = parseInt(birDayCode.substring(0, 4), 10);\n      var mm = parseInt(birDayCode.substring(4, 6), 10);\n      var dd = parseInt(birDayCode.substring(6), 10);\n      var xdata = new Date(yyyy, mm - 1, dd);\n      if (xdata > new Date()) {\n        return false;\n        // eslint-disable-next-line max-len\n      } else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {\n        return true;\n      }\n      return false;\n    };\n    var getParityBit = function getParityBit(idCardNo) {\n      var id17 = idCardNo.substring(0, 17);\n      var power = 0;\n      for (var i = 0; i < 17; i++) {\n        power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);\n      }\n      var mod = power % 11;\n      return parityBit[mod];\n    };\n    var checkParityBit = function checkParityBit(idCardNo) {\n      return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();\n    };\n    var check15IdCardNo = function check15IdCardNo(idCardNo) {\n      var check = /^[1-9]\\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\\d{3}$/.test(idCardNo);\n      if (!check) return false;\n      var addressCode = idCardNo.substring(0, 2);\n      check = checkAddressCode(addressCode);\n      if (!check) return false;\n      var birDayCode = \"19\".concat(idCardNo.substring(6, 12));\n      check = checkBirthDayCode(birDayCode);\n      if (!check) return false;\n      return true;\n    };\n    var check18IdCardNo = function check18IdCardNo(idCardNo) {\n      var check = /^[1-9]\\d{5}[1-9]\\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\\d{3}(\\d|x|X)$/.test(idCardNo);\n      if (!check) return false;\n      var addressCode = idCardNo.substring(0, 2);\n      check = checkAddressCode(addressCode);\n      if (!check) return false;\n      var birDayCode = idCardNo.substring(6, 14);\n      check = checkBirthDayCode(birDayCode);\n      if (!check) return false;\n      return checkParityBit(idCardNo);\n    };\n    var checkIdCardNo = function checkIdCardNo(idCardNo) {\n      var check = /^\\d{15}|(\\d{17}(\\d|x|X))$/.test(idCardNo);\n      if (!check) return false;\n      if (idCardNo.length === 15) {\n        return check15IdCardNo(idCardNo);\n      }\n      return check18IdCardNo(idCardNo);\n    };\n    return checkIdCardNo(str);\n  },\n  'zh-HK': function zhHK(str) {\n    // sanitize user input\n    str = str.trim();\n\n    // HKID number starts with 1 or 2 letters, followed by 6 digits,\n    // then a checksum contained in square / round brackets or nothing\n    var regexHKID = /^[A-Z]{1,2}[0-9]{6}((\\([0-9A]\\))|(\\[[0-9A]\\])|([0-9A]))$/;\n    var regexIsDigit = /^[0-9]$/;\n\n    // convert the user input to all uppercase and apply regex\n    str = str.toUpperCase();\n    if (!regexHKID.test(str)) return false;\n    str = str.replace(/\\[|\\]|\\(|\\)/g, '');\n    if (str.length === 8) str = \"3\".concat(str);\n    var checkSumVal = 0;\n    for (var i = 0; i <= 7; i++) {\n      var convertedChar = void 0;\n      if (!regexIsDigit.test(str[i])) convertedChar = (str[i].charCodeAt(0) - 55) % 11;else convertedChar = str[i];\n      checkSumVal += convertedChar * (9 - i);\n    }\n    checkSumVal %= 11;\n    var checkSumConverted;\n    if (checkSumVal === 0) checkSumConverted = '0';else if (checkSumVal === 1) checkSumConverted = 'A';else checkSumConverted = String(11 - checkSumVal);\n    if (checkSumConverted === str[str.length - 1]) return true;\n    return false;\n  },\n  'zh-TW': function zhTW(str) {\n    var ALPHABET_CODES = {\n      A: 10,\n      B: 11,\n      C: 12,\n      D: 13,\n      E: 14,\n      F: 15,\n      G: 16,\n      H: 17,\n      I: 34,\n      J: 18,\n      K: 19,\n      L: 20,\n      M: 21,\n      N: 22,\n      O: 35,\n      P: 23,\n      Q: 24,\n      R: 25,\n      S: 26,\n      T: 27,\n      U: 28,\n      V: 29,\n      W: 32,\n      X: 30,\n      Y: 31,\n      Z: 33\n    };\n    var sanitized = str.trim().toUpperCase();\n    if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;\n    return Array.from(sanitized).reduce(function (sum, number, index) {\n      if (index === 0) {\n        var code = ALPHABET_CODES[number];\n        return code % 10 * 9 + Math.floor(code / 10);\n      }\n      if (index === 9) {\n        return (10 - sum % 10 - Number(number)) % 10 === 0;\n      }\n      return sum + Number(number) * (9 - index);\n    }, 0);\n  }\n};\nexport default function isIdentityCard(str, locale) {\n  assertString(str);\n  if (locale in validators) {\n    return validators[locale](str);\n  } else if (locale === 'any') {\n    for (var key in validators) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (validators.hasOwnProperty(key)) {\n        var validator = validators[key];\n        if (validator(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}","/**\n * The most commonly used EAN standard is\n * the thirteen-digit EAN-13, while the\n * less commonly used 8-digit EAN-8 barcode was\n * introduced for use on small packages.\n * Also EAN/UCC-14 is used for Grouping of individual\n * trade items above unit level(Intermediate, Carton or Pallet).\n * For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/\n * EAN consists of:\n * GS1 prefix, manufacturer code, product code and check digit\n * Reference: https://en.wikipedia.org/wiki/International_Article_Number\n * Reference: https://www.gtin.info/\n */\n\nimport assertString from './util/assertString';\n\n/**\n * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14\n * and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),\n * with exact numberic matching of 8 or 13 or 14 digits [0-9]\n */\nvar LENGTH_EAN_8 = 8;\nvar LENGTH_EAN_14 = 14;\nvar validEanRegex = /^(\\d{8}|\\d{13}|\\d{14})$/;\n\n/**\n * Get position weight given:\n * EAN length and digit index/position\n *\n * @param {number} length\n * @param {number} index\n * @return {number}\n */\nfunction getPositionWeightThroughLengthAndIndex(length, index) {\n  if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {\n    return index % 2 === 0 ? 3 : 1;\n  }\n  return index % 2 === 0 ? 1 : 3;\n}\n\n/**\n * Calculate EAN Check Digit\n * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit\n *\n * @param {string} ean\n * @return {number}\n */\nfunction calculateCheckDigit(ean) {\n  var checksum = ean.slice(0, -1).split('').map(function (_char, index) {\n    return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index);\n  }).reduce(function (acc, partialSum) {\n    return acc + partialSum;\n  }, 0);\n  var remainder = 10 - checksum % 10;\n  return remainder < 10 ? remainder : 0;\n}\n\n/**\n * Check if string is valid EAN:\n * Matches EAN-8/EAN-13/EAN-14 regex\n * Has valid check digit.\n *\n * @param {string} str\n * @return {boolean}\n */\nexport default function isEAN(str) {\n  assertString(str);\n  var actualCheckDigit = Number(str.slice(-1));\n  return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);\n}","import assertString from './util/assertString';\nvar isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;\n\n// this link details how the check digit is calculated:\n// https://www.isin.org/isin-format/. it is a little bit\n// odd in that it works with digits, not numbers. in order\n// to make only one pass through the ISIN characters, the\n// each alpha character is handled as 2 characters within\n// the loop.\n\nexport default function isISIN(str) {\n  assertString(str);\n  if (!isin.test(str)) {\n    return false;\n  }\n  var _double = true;\n  var sum = 0;\n  // convert values\n  for (var i = str.length - 2; i >= 0; i--) {\n    if (str[i] >= 'A' && str[i] <= 'Z') {\n      var value = str[i].charCodeAt(0) - 55;\n      var lo = value % 10;\n      var hi = Math.trunc(value / 10);\n      // letters have two digits, so handle the low order\n      // and high order digits separately.\n      for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {\n        var digit = _arr[_i];\n        if (_double) {\n          if (digit >= 5) {\n            sum += 1 + (digit - 5) * 2;\n          } else {\n            sum += digit * 2;\n          }\n        } else {\n          sum += digit;\n        }\n        _double = !_double;\n      }\n    } else {\n      var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);\n      if (_double) {\n        if (_digit >= 5) {\n          sum += 1 + (_digit - 5) * 2;\n        } else {\n          sum += _digit * 2;\n        }\n      } else {\n        sum += _digit;\n      }\n      _double = !_double;\n    }\n  }\n  var check = Math.trunc((sum + 9) / 10) * 10 - sum;\n  return +str[str.length - 1] === check;\n}","import assertString from './util/assertString';\nvar possibleIsbn10 = /^(?:[0-9]{9}X|[0-9]{10})$/;\nvar possibleIsbn13 = /^(?:[0-9]{13})$/;\nvar factor = [1, 3];\nexport default function isISBN(isbn, options) {\n  assertString(isbn);\n\n  // For backwards compatibility:\n  // isISBN(str [, version]), i.e. `options` could be used as argument for the legacy `version`\n  var version = String((options === null || options === void 0 ? void 0 : options.version) || options);\n  if (!(options !== null && options !== void 0 && options.version || options)) {\n    return isISBN(isbn, {\n      version: 10\n    }) || isISBN(isbn, {\n      version: 13\n    });\n  }\n  var sanitizedIsbn = isbn.replace(/[\\s-]+/g, '');\n  var checksum = 0;\n  if (version === '10') {\n    if (!possibleIsbn10.test(sanitizedIsbn)) {\n      return false;\n    }\n    for (var i = 0; i < version - 1; i++) {\n      checksum += (i + 1) * sanitizedIsbn.charAt(i);\n    }\n    if (sanitizedIsbn.charAt(9) === 'X') {\n      checksum += 10 * 10;\n    } else {\n      checksum += 10 * sanitizedIsbn.charAt(9);\n    }\n    if (checksum % 11 === 0) {\n      return true;\n    }\n  } else if (version === '13') {\n    if (!possibleIsbn13.test(sanitizedIsbn)) {\n      return false;\n    }\n    for (var _i = 0; _i < 12; _i++) {\n      checksum += factor[_i % 2] * sanitizedIsbn.charAt(_i);\n    }\n    if (sanitizedIsbn.charAt(12) - (10 - checksum % 10) % 10 === 0) {\n      return true;\n    }\n  }\n  return false;\n}","/**\n * Algorithmic validation functions\n * May be used as is or implemented in the workflow of other validators.\n */\n\n/*\n * ISO 7064 validation function\n * Called with a string of numbers (incl. check digit)\n * to validate according to ISO 7064 (MOD 11, 10).\n */\nexport function iso7064Check(str) {\n  var checkvalue = 10;\n  for (var i = 0; i < str.length - 1; i++) {\n    checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;\n  }\n  checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;\n  return checkvalue === parseInt(str[10], 10);\n}\n\n/*\n * Luhn (mod 10) validation function\n * Called with a string of numbers (incl. check digit)\n * to validate according to the Luhn algorithm.\n */\nexport function luhnCheck(str) {\n  var checksum = 0;\n  var second = false;\n  for (var i = str.length - 1; i >= 0; i--) {\n    if (second) {\n      var product = parseInt(str[i], 10) * 2;\n      if (product > 9) {\n        // sum digits of product and add to checksum\n        checksum += product.toString().split('').map(function (a) {\n          return parseInt(a, 10);\n        }).reduce(function (a, b) {\n          return a + b;\n        }, 0);\n      } else {\n        checksum += product;\n      }\n    } else {\n      checksum += parseInt(str[i], 10);\n    }\n    second = !second;\n  }\n  return checksum % 10 === 0;\n}\n\n/*\n * Reverse TIN multiplication and summation helper function\n * Called with an array of single-digit integers and a base multiplier\n * to calculate the sum of the digits multiplied in reverse.\n * Normally used in variations of MOD 11 algorithmic checks.\n */\nexport function reverseMultiplyAndSum(digits, base) {\n  var total = 0;\n  for (var i = 0; i < digits.length; i++) {\n    total += digits[i] * (base - i);\n  }\n  return total;\n}\n\n/*\n * Verhoeff validation helper function\n * Called with a string of numbers\n * to validate according to the Verhoeff algorithm.\n */\nexport function verhoeffCheck(str) {\n  var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];\n  var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]];\n\n  // Copy (to prevent replacement) and reverse\n  var str_copy = str.split('').reverse().join('');\n  var checksum = 0;\n  for (var i = 0; i < str_copy.length; i++) {\n    checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];\n  }\n  return checksum === 0;\n}","function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nimport assertString from './util/assertString';\nimport * as algorithms from './util/algorithms';\nimport isDate from './isDate';\n\n/**\n * TIN Validation\n * Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.\n *\n * EU-UK:\n * National TIN validity is calculated using public algorithms as made available by DG TAXUD.\n *\n * See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.\n *\n * US:\n * An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,\n *  is used to identify a business entity.\n *\n * NOTES:\n *  - Prefix 47 is being reserved for future use\n *  - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.\n *\n * See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`\n * for more information.\n */\n\n// Locale functions\n\n/*\n * bg-BG validation function\n * (Edinen graždanski nomer (EGN/ЕГН), persons only)\n * Checks if birth date (first six digits) is valid and calculates check (last) digit\n */\nfunction bgBgCheck(tin) {\n  // Extract full year, normalize month and check birth date validity\n  var century_year = tin.slice(0, 2);\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 40) {\n    month -= 40;\n    century_year = \"20\".concat(century_year);\n  } else if (month > 20) {\n    month -= 20;\n    century_year = \"18\".concat(century_year);\n  } else {\n    century_year = \"19\".concat(century_year);\n  }\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n  var date = \"\".concat(century_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n\n  // Calculate checksum by multiplying digits with fixed values\n  var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n  var checksum = 0;\n  for (var i = 0; i < multip_lookup.length; i++) {\n    checksum += digits[i] * multip_lookup[i];\n  }\n  checksum = checksum % 11 === 10 ? 0 : checksum % 11;\n  return checksum === digits[9];\n}\n\n/**\n * Check if an input is a valid Canadian SIN (Social Insurance Number)\n *\n * The Social Insurance Number (SIN) is a 9 digit number that\n * you need to work in Canada or to have access to government programs and benefits.\n *\n * https://en.wikipedia.org/wiki/Social_Insurance_Number\n * https://www.canada.ca/en/employment-social-development/services/sin.html\n * https://www.codercrunch.com/challenge/819302488/sin-validator\n *\n * @param {string} input\n * @return {boolean}\n */\nfunction isCanadianSIN(input) {\n  var digitsArray = input.split('');\n  var even = digitsArray.filter(function (_, idx) {\n    return idx % 2;\n  }).map(function (i) {\n    return Number(i) * 2;\n  }).join('').split('');\n  var total = digitsArray.filter(function (_, idx) {\n    return !(idx % 2);\n  }).concat(even).map(function (i) {\n    return Number(i);\n  }).reduce(function (acc, cur) {\n    return acc + cur;\n  });\n  return total % 10 === 0;\n}\n\n/*\n * cs-CZ validation function\n * (Rodné číslo (RČ), persons only)\n * Checks if birth date (first six digits) is valid and divisibility by 11\n * Material not in DG TAXUD document sourced from:\n * -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`\n * -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`\n */\nfunction csCzCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n\n  // Extract full year from TIN length\n  var full_year = parseInt(tin.slice(0, 2), 10);\n  if (tin.length === 10) {\n    if (full_year < 54) {\n      full_year = \"20\".concat(full_year);\n    } else {\n      full_year = \"19\".concat(full_year);\n    }\n  } else {\n    if (tin.slice(6) === '000') {\n      return false;\n    } // Three-zero serial not assigned before 1954\n    if (full_year < 54) {\n      full_year = \"19\".concat(full_year);\n    } else {\n      return false; // No 18XX years seen in any of the resources\n    }\n  }\n  // Add missing zero if needed\n  if (full_year.length === 3) {\n    full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');\n  }\n\n  // Extract month from TIN and normalize\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 50) {\n    month -= 50;\n  }\n  if (month > 20) {\n    // Month-plus-twenty was only introduced in 2004\n    if (parseInt(full_year, 10) < 2004) {\n      return false;\n    }\n    month -= 20;\n  }\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Verify divisibility by 11\n  if (tin.length === 10) {\n    if (parseInt(tin, 10) % 11 !== 0) {\n      // Some numbers up to and including 1985 are still valid if\n      // check (last) digit equals 0 and modulo of first 9 digits equals 10\n      var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;\n      if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {\n        if (parseInt(tin.slice(9), 10) !== 0) {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n/*\n * de-AT validation function\n * (Abgabenkontonummer, persons/entities)\n * Verify TIN validity by calling luhnCheck()\n */\nfunction deAtCheck(tin) {\n  return algorithms.luhnCheck(tin);\n}\n\n/*\n * de-DE validation function\n * (Steueridentifikationsnummer (Steuer-IdNr.), persons only)\n * Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit\n * Partial implementation of spec (same result with both algorithms always)\n */\nfunction deDeCheck(tin) {\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n\n  // Fill array with strings of number positions\n  var occurences = [];\n  for (var i = 0; i < digits.length - 1; i++) {\n    occurences.push('');\n    for (var j = 0; j < digits.length - 1; j++) {\n      if (digits[i] === digits[j]) {\n        occurences[i] += j;\n      }\n    }\n  }\n\n  // Remove digits with one occurence and test for only one duplicate/triplicate\n  occurences = occurences.filter(function (a) {\n    return a.length > 1;\n  });\n  if (occurences.length !== 2 && occurences.length !== 3) {\n    return false;\n  }\n\n  // In case of triplicate value only two digits are allowed next to each other\n  if (occurences[0].length === 3) {\n    var trip_locations = occurences[0].split('').map(function (a) {\n      return parseInt(a, 10);\n    });\n    var recurrent = 0; // Amount of neighbour occurences\n    for (var _i = 0; _i < trip_locations.length - 1; _i++) {\n      if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {\n        recurrent += 1;\n      }\n    }\n    if (recurrent === 2) {\n      return false;\n    }\n  }\n  return algorithms.iso7064Check(tin);\n}\n\n/*\n * dk-DK validation function\n * (CPR-nummer (personnummer), persons only)\n * Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,\n * and calculates check (last) digit\n */\nfunction dkDkCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n\n  // Extract year, check if valid for given century digit and add century\n  var year = parseInt(tin.slice(4, 6), 10);\n  var century_digit = tin.slice(6, 7);\n  switch (century_digit) {\n    case '0':\n    case '1':\n    case '2':\n    case '3':\n      year = \"19\".concat(year);\n      break;\n    case '4':\n    case '9':\n      if (year < 37) {\n        year = \"20\".concat(year);\n      } else {\n        year = \"19\".concat(year);\n      }\n      break;\n    default:\n      if (year < 37) {\n        year = \"20\".concat(year);\n      } else if (year > 58) {\n        year = \"18\".concat(year);\n      } else {\n        return false;\n      }\n      break;\n  }\n  // Add missing zero if needed\n  if (year.length === 3) {\n    year = [year.slice(0, 2), '0', year.slice(2)].join('');\n  }\n  // Check date validity\n  var date = \"\".concat(year, \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(0, 2));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  var weight = 4;\n  // Multiply by weight and add to checksum\n  for (var i = 0; i < 9; i++) {\n    checksum += digits[i] * weight;\n    weight -= 1;\n    if (weight === 1) {\n      weight = 7;\n    }\n  }\n  checksum %= 11;\n  if (checksum === 1) {\n    return false;\n  }\n  return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;\n}\n\n/*\n * el-CY validation function\n * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)\n * Verify TIN validity by calculating ASCII value of check (last) character\n */\nfunction elCyCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.slice(0, 8).split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  // add digits in even places\n  for (var i = 1; i < digits.length; i += 2) {\n    checksum += digits[i];\n  }\n\n  // add digits in odd places\n  for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {\n    if (digits[_i2] < 2) {\n      checksum += 1 - digits[_i2];\n    } else {\n      checksum += 2 * (digits[_i2] - 2) + 5;\n      if (digits[_i2] > 4) {\n        checksum += 2;\n      }\n    }\n  }\n  return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);\n}\n\n/*\n * el-GR validation function\n * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)\n * Verify TIN validity by calculating check (last) digit\n * Algorithm not in DG TAXUD document- sourced from:\n * - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`\n */\nfunction elGrCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  for (var i = 0; i < 8; i++) {\n    checksum += digits[i] * Math.pow(2, 8 - i);\n  }\n  return checksum % 11 % 10 === digits[8];\n}\n\n/*\n * en-GB validation function (should go here if needed)\n * (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),\n * persons/entities respectively)\n */\n\n/*\n * en-IE validation function\n * (Personal Public Service Number (PPS No), persons only)\n * Verify TIN validity by calculating check (second to last) character\n */\nfunction enIeCheck(tin) {\n  var checksum = algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {\n    return parseInt(a, 10);\n  }), 8);\n  if (tin.length === 9 && tin[8] !== 'W') {\n    checksum += (tin[8].charCodeAt(0) - 64) * 9;\n  }\n  checksum %= 23;\n  if (checksum === 0) {\n    return tin[7].toUpperCase() === 'W';\n  }\n  return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);\n}\n\n// Valid US IRS campus prefixes\nvar enUsCampusPrefix = {\n  andover: ['10', '12'],\n  atlanta: ['60', '67'],\n  austin: ['50', '53'],\n  brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],\n  cincinnati: ['30', '32', '35', '36', '37', '38', '61'],\n  fresno: ['15', '24'],\n  internet: ['20', '26', '27', '45', '46', '47'],\n  kansas: ['40', '44'],\n  memphis: ['94', '95'],\n  ogden: ['80', '90'],\n  philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],\n  sba: ['31']\n};\n\n// Return an array of all US IRS campus prefixes\nfunction enUsGetPrefixes() {\n  var prefixes = [];\n  for (var location in enUsCampusPrefix) {\n    // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n    // istanbul ignore else\n    if (enUsCampusPrefix.hasOwnProperty(location)) {\n      prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));\n    }\n  }\n  return prefixes;\n}\n\n/*\n * en-US validation function\n * Verify that the TIN starts with a valid IRS campus prefix\n */\nfunction enUsCheck(tin) {\n  return enUsGetPrefixes().indexOf(tin.slice(0, 2)) !== -1;\n}\n\n/*\n * es-AR validation function\n * Clave Única de Identificación Tributaria (CUIT/CUIL)\n * Sourced from:\n * - https://servicioscf.afip.gob.ar/publico/abc/ABCpaso2.aspx?id_nivel1=3036&id_nivel2=3040&p=Conceptos%20b%C3%A1sicos\n * - https://es.wikipedia.org/wiki/Clave_%C3%9Anica_de_Identificaci%C3%B3n_Tributaria\n */\n\nfunction esArCheck(tin) {\n  var accum = 0;\n  var digits = tin.split('');\n  var digit = parseInt(digits.pop(), 10);\n  for (var i = 0; i < digits.length; i++) {\n    accum += digits[9 - i] * (2 + i % 6);\n  }\n  var verif = 11 - accum % 11;\n  if (verif === 11) {\n    verif = 0;\n  } else if (verif === 10) {\n    verif = 9;\n  }\n  return digit === verif;\n}\n\n/*\n * es-ES validation function\n * (Documento Nacional de Identidad (DNI)\n * or Número de Identificación de Extranjero (NIE), persons only)\n * Verify TIN validity by calculating check (last) character\n */\nfunction esEsCheck(tin) {\n  // Split characters into an array for further processing\n  var chars = tin.toUpperCase().split('');\n\n  // Replace initial letter if needed\n  if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {\n    var lead_replace = 0;\n    switch (chars[0]) {\n      case 'Y':\n        lead_replace = 1;\n        break;\n      case 'Z':\n        lead_replace = 2;\n        break;\n      default:\n    }\n    chars.splice(0, 1, lead_replace);\n    // Fill with zeros if smaller than proper\n  } else {\n    while (chars.length < 9) {\n      chars.unshift(0);\n    }\n  }\n\n  // Calculate checksum and check according to lookup\n  var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];\n  chars = chars.join('');\n  var checksum = parseInt(chars.slice(0, 8), 10) % 23;\n  return chars[8] === lookup[checksum];\n}\n\n/*\n * et-EE validation function\n * (Isikukood (IK), persons only)\n * Checks if birth date (century digit and six following) is valid and calculates check (last) digit\n * Material not in DG TAXUD document sourced from:\n * - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`\n */\nfunction etEeCheck(tin) {\n  // Extract year and add century\n  var full_year = tin.slice(1, 3);\n  var century_digit = tin.slice(0, 1);\n  switch (century_digit) {\n    case '1':\n    case '2':\n      full_year = \"18\".concat(full_year);\n      break;\n    case '3':\n    case '4':\n      full_year = \"19\".concat(full_year);\n      break;\n    default:\n      full_year = \"20\".concat(full_year);\n      break;\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(tin.slice(3, 5), \"/\").concat(tin.slice(5, 7));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  var weight = 1;\n  // Multiply by weight and add to checksum\n  for (var i = 0; i < 10; i++) {\n    checksum += digits[i] * weight;\n    weight += 1;\n    if (weight === 10) {\n      weight = 1;\n    }\n  }\n  // Do again if modulo 11 of checksum is 10\n  if (checksum % 11 === 10) {\n    checksum = 0;\n    weight = 3;\n    for (var _i3 = 0; _i3 < 10; _i3++) {\n      checksum += digits[_i3] * weight;\n      weight += 1;\n      if (weight === 10) {\n        weight = 1;\n      }\n    }\n    if (checksum % 11 === 10) {\n      return digits[10] === 0;\n    }\n  }\n  return checksum % 11 === digits[10];\n}\n\n/*\n * fi-FI validation function\n * (Henkilötunnus (HETU), persons only)\n * Checks if birth date (first six digits plus century symbol) is valid\n * and calculates check (last) digit\n */\nfunction fiFiCheck(tin) {\n  // Extract year and add century\n  var full_year = tin.slice(4, 6);\n  var century_symbol = tin.slice(6, 7);\n  switch (century_symbol) {\n    case '+':\n      full_year = \"18\".concat(full_year);\n      break;\n    case '-':\n      full_year = \"19\".concat(full_year);\n      break;\n    default:\n      full_year = \"20\".concat(full_year);\n      break;\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(0, 2));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate check character\n  var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;\n  if (checksum < 10) {\n    return checksum === parseInt(tin.slice(10), 10);\n  }\n  checksum -= 10;\n  var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];\n  return letters_lookup[checksum] === tin.slice(10);\n}\n\n/*\n * fr/nl-BE validation function\n * (Numéro national (N.N.), persons only)\n * Checks if birth date (first six digits) is valid and calculates check (last two) digits\n */\nfunction frBeCheck(tin) {\n  // Zero month/day value is acceptable\n  if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {\n    // Extract date from first six digits of TIN\n    var date = \"\".concat(tin.slice(0, 2), \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(4, 6));\n    if (!isDate(date, 'YY/MM/DD')) {\n      return false;\n    }\n  }\n  var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;\n  var checkdigits = parseInt(tin.slice(9, 11), 10);\n  if (checksum !== checkdigits) {\n    checksum = 97 - parseInt(\"2\".concat(tin.slice(0, 9)), 10) % 97;\n    if (checksum !== checkdigits) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/*\n * fr-FR validation function\n * (Numéro fiscal de référence (numéro SPI), persons only)\n * Verify TIN validity by calculating check (last three) digits\n */\nfunction frFrCheck(tin) {\n  tin = tin.replace(/\\s/g, '');\n  var checksum = parseInt(tin.slice(0, 10), 10) % 511;\n  var checkdigits = parseInt(tin.slice(10, 13), 10);\n  return checksum === checkdigits;\n}\n\n/*\n * fr/lb-LU validation function\n * (numéro d’identification personnelle, persons only)\n * Verify birth date validity and run Luhn and Verhoeff checks\n */\nfunction frLuCheck(tin) {\n  // Extract date and check validity\n  var date = \"\".concat(tin.slice(0, 4), \"/\").concat(tin.slice(4, 6), \"/\").concat(tin.slice(6, 8));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Run Luhn check\n  if (!algorithms.luhnCheck(tin.slice(0, 12))) {\n    return false;\n  }\n  // Remove Luhn check digit and run Verhoeff check\n  return algorithms.verhoeffCheck(\"\".concat(tin.slice(0, 11)).concat(tin[12]));\n}\n\n/*\n * hr-HR validation function\n * (Osobni identifikacijski broj (OIB), persons/entities)\n * Verify TIN validity by calling iso7064Check(digits)\n */\nfunction hrHrCheck(tin) {\n  return algorithms.iso7064Check(tin);\n}\n\n/*\n * hu-HU validation function\n * (Adóazonosító jel, persons only)\n * Verify TIN validity by calculating check (last) digit\n */\nfunction huHuCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 8;\n  for (var i = 1; i < 9; i++) {\n    checksum += digits[i] * (i + 1);\n  }\n  return checksum % 11 === digits[9];\n}\n\n/*\n * lt-LT validation function (should go here if needed)\n * (Asmens kodas, persons/entities respectively)\n * Current validation check is alias of etEeCheck- same format applies\n */\n\n/*\n * it-IT first/last name validity check\n * Accepts it-IT TIN-encoded names as a three-element character array and checks their validity\n * Due to lack of clarity between resources (\"Are only Italian consonants used?\n * What happens if a person has X in their name?\" etc.) only two test conditions\n * have been implemented:\n * Vowels may only be followed by other vowels or an X character\n * and X characters after vowels may only be followed by other X characters.\n */\nfunction itItNameCheck(name) {\n  // true at the first occurence of a vowel\n  var vowelflag = false;\n\n  // true at the first occurence of an X AFTER vowel\n  // (to properly handle last names with X as consonant)\n  var xflag = false;\n  for (var i = 0; i < 3; i++) {\n    if (!vowelflag && /[AEIOU]/.test(name[i])) {\n      vowelflag = true;\n    } else if (!xflag && vowelflag && name[i] === 'X') {\n      xflag = true;\n    } else if (i > 0) {\n      if (vowelflag && !xflag) {\n        if (!/[AEIOU]/.test(name[i])) {\n          return false;\n        }\n      }\n      if (xflag) {\n        if (!/X/.test(name[i])) {\n          return false;\n        }\n      }\n    }\n  }\n  return true;\n}\n\n/*\n * it-IT validation function\n * (Codice fiscale (TIN-IT), persons only)\n * Verify name, birth date and codice catastale validity\n * and calculate check character.\n * Material not in DG-TAXUD document sourced from:\n * `https://en.wikipedia.org/wiki/Italian_fiscal_code`\n */\nfunction itItCheck(tin) {\n  // Capitalize and split characters into an array for further processing\n  var chars = tin.toUpperCase().split('');\n\n  // Check first and last name validity calling itItNameCheck()\n  if (!itItNameCheck(chars.slice(0, 3))) {\n    return false;\n  }\n  if (!itItNameCheck(chars.slice(3, 6))) {\n    return false;\n  }\n\n  // Convert letters in number spaces back to numbers if any\n  var number_locations = [6, 7, 9, 10, 12, 13, 14];\n  var number_replace = {\n    L: '0',\n    M: '1',\n    N: '2',\n    P: '3',\n    Q: '4',\n    R: '5',\n    S: '6',\n    T: '7',\n    U: '8',\n    V: '9'\n  };\n  for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {\n    var i = _number_locations[_i4];\n    if (chars[i] in number_replace) {\n      chars.splice(i, 1, number_replace[chars[i]]);\n    }\n  }\n\n  // Extract month and day, and check date validity\n  var month_replace = {\n    A: '01',\n    B: '02',\n    C: '03',\n    D: '04',\n    E: '05',\n    H: '06',\n    L: '07',\n    M: '08',\n    P: '09',\n    R: '10',\n    S: '11',\n    T: '12'\n  };\n  var month = month_replace[chars[8]];\n  var day = parseInt(chars[9] + chars[10], 10);\n  if (day > 40) {\n    day -= 40;\n  }\n  if (day < 10) {\n    day = \"0\".concat(day);\n  }\n  var date = \"\".concat(chars[6]).concat(chars[7], \"/\").concat(month, \"/\").concat(day);\n  if (!isDate(date, 'YY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate check character by adding up even and odd characters as numbers\n  var checksum = 0;\n  for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {\n    var char_to_int = parseInt(chars[_i5], 10);\n    if (isNaN(char_to_int)) {\n      char_to_int = chars[_i5].charCodeAt(0) - 65;\n    }\n    checksum += char_to_int;\n  }\n  var odd_convert = {\n    // Maps of characters at odd places\n    A: 1,\n    B: 0,\n    C: 5,\n    D: 7,\n    E: 9,\n    F: 13,\n    G: 15,\n    H: 17,\n    I: 19,\n    J: 21,\n    K: 2,\n    L: 4,\n    M: 18,\n    N: 20,\n    O: 11,\n    P: 3,\n    Q: 6,\n    R: 8,\n    S: 12,\n    T: 14,\n    U: 16,\n    V: 10,\n    W: 22,\n    X: 25,\n    Y: 24,\n    Z: 23,\n    0: 1,\n    1: 0\n  };\n  for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {\n    var _char_to_int = 0;\n    if (chars[_i6] in odd_convert) {\n      _char_to_int = odd_convert[chars[_i6]];\n    } else {\n      var multiplier = parseInt(chars[_i6], 10);\n      _char_to_int = 2 * multiplier + 1;\n      if (multiplier > 4) {\n        _char_to_int += 2;\n      }\n    }\n    checksum += _char_to_int;\n  }\n  if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {\n    return false;\n  }\n  return true;\n}\n\n/*\n * lv-LV validation function\n * (Personas kods (PK), persons only)\n * Check validity of birth date and calculate check (last) digit\n * Support only for old format numbers (not starting with '32', issued before 2017/07/01)\n * Material not in DG TAXUD document sourced from:\n * `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`\n */\nfunction lvLvCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n  // Extract date from TIN\n  var day = tin.slice(0, 2);\n  if (day !== '32') {\n    // No date/checksum check if new format\n    var month = tin.slice(2, 4);\n    if (month !== '00') {\n      // No date check if unknown month\n      var full_year = tin.slice(4, 6);\n      switch (tin[6]) {\n        case '0':\n          full_year = \"18\".concat(full_year);\n          break;\n        case '1':\n          full_year = \"19\".concat(full_year);\n          break;\n        default:\n          full_year = \"20\".concat(full_year);\n          break;\n      }\n      // Check date validity\n      var date = \"\".concat(full_year, \"/\").concat(tin.slice(2, 4), \"/\").concat(day);\n      if (!isDate(date, 'YYYY/MM/DD')) {\n        return false;\n      }\n    }\n\n    // Calculate check digit\n    var checksum = 1101;\n    var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n    for (var i = 0; i < tin.length - 1; i++) {\n      checksum -= parseInt(tin[i], 10) * multip_lookup[i];\n    }\n    return parseInt(tin[10], 10) === checksum % 11;\n  }\n  return true;\n}\n\n/*\n * mt-MT validation function\n * (Identity Card Number or Unique Taxpayer Reference, persons/entities)\n * Verify Identity Card Number structure (no other tests found)\n */\nfunction mtMtCheck(tin) {\n  if (tin.length !== 9) {\n    // No tests for UTR\n    var chars = tin.toUpperCase().split('');\n    // Fill with zeros if smaller than proper\n    while (chars.length < 8) {\n      chars.unshift(0);\n    }\n    // Validate format according to last character\n    switch (tin[7]) {\n      case 'A':\n      case 'P':\n        if (parseInt(chars[6], 10) === 0) {\n          return false;\n        }\n        break;\n      default:\n        {\n          var first_part = parseInt(chars.join('').slice(0, 5), 10);\n          if (first_part > 32000) {\n            return false;\n          }\n          var second_part = parseInt(chars.join('').slice(5, 7), 10);\n          if (first_part === second_part) {\n            return false;\n          }\n        }\n    }\n  }\n  return true;\n}\n\n/*\n * nl-NL validation function\n * (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),\n * persons/entities respectively)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction nlNlCheck(tin) {\n  return algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11 === parseInt(tin[8], 10);\n}\n\n/*\n * pl-PL validation function\n * (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)\n * or Numer identyfikacji podatkowej (NIP), persons/entities)\n * Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit\n */\nfunction plPlCheck(tin) {\n  // NIP\n  if (tin.length === 10) {\n    // Calculate last digit by multiplying with lookup\n    var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];\n    var _checksum = 0;\n    for (var i = 0; i < lookup.length; i++) {\n      _checksum += parseInt(tin[i], 10) * lookup[i];\n    }\n    _checksum %= 11;\n    if (_checksum === 10) {\n      return false;\n    }\n    return _checksum === parseInt(tin[9], 10);\n  }\n\n  // PESEL\n  // Extract full year using month\n  var full_year = tin.slice(0, 2);\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 80) {\n    full_year = \"18\".concat(full_year);\n    month -= 80;\n  } else if (month > 60) {\n    full_year = \"22\".concat(full_year);\n    month -= 60;\n  } else if (month > 40) {\n    full_year = \"21\".concat(full_year);\n    month -= 40;\n  } else if (month > 20) {\n    full_year = \"20\".concat(full_year);\n    month -= 20;\n  } else {\n    full_year = \"19\".concat(full_year);\n  }\n  // Add leading zero to month if needed\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate last digit by mulitplying with odd one-digit numbers except 5\n  var checksum = 0;\n  var multiplier = 1;\n  for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {\n    checksum += parseInt(tin[_i7], 10) * multiplier % 10;\n    multiplier += 2;\n    if (multiplier > 10) {\n      multiplier = 1;\n    } else if (multiplier === 5) {\n      multiplier += 2;\n    }\n  }\n  checksum = 10 - checksum % 10;\n  return checksum === parseInt(tin[10], 10);\n}\n\n/*\n* pt-BR validation function\n* (Cadastro de Pessoas Físicas (CPF, persons)\n* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)\n* Both inputs will be validated\n*/\n\nfunction ptBrCheck(tin) {\n  if (tin.length === 11) {\n    var _sum;\n    var remainder;\n    _sum = 0;\n    if (\n    // Reject known invalid CPFs\n    tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;\n    for (var i = 1; i <= 9; i++) _sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);\n    remainder = _sum * 10 % 11;\n    if (remainder === 10) remainder = 0;\n    if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;\n    _sum = 0;\n    for (var _i8 = 1; _i8 <= 10; _i8++) _sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);\n    remainder = _sum * 10 % 11;\n    if (remainder === 10) remainder = 0;\n    if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;\n    return true;\n  }\n  if (\n  // Reject know invalid CNPJs\n  tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {\n    return false;\n  }\n  var length = tin.length - 2;\n  var identifiers = tin.substring(0, length);\n  var verificators = tin.substring(length);\n  var sum = 0;\n  var pos = length - 7;\n  for (var _i9 = length; _i9 >= 1; _i9--) {\n    sum += identifiers.charAt(length - _i9) * pos;\n    pos -= 1;\n    if (pos < 2) {\n      pos = 9;\n    }\n  }\n  var result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n  if (result !== parseInt(verificators.charAt(0), 10)) {\n    return false;\n  }\n  length += 1;\n  identifiers = tin.substring(0, length);\n  sum = 0;\n  pos = length - 7;\n  for (var _i10 = length; _i10 >= 1; _i10--) {\n    sum += identifiers.charAt(length - _i10) * pos;\n    pos -= 1;\n    if (pos < 2) {\n      pos = 9;\n    }\n  }\n  result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n  if (result !== parseInt(verificators.charAt(1), 10)) {\n    return false;\n  }\n  return true;\n}\n\n/*\n * pt-PT validation function\n * (Número de identificação fiscal (NIF), persons/entities)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction ptPtCheck(tin) {\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11;\n  if (checksum > 9) {\n    return parseInt(tin[8], 10) === 0;\n  }\n  return checksum === parseInt(tin[8], 10);\n}\n\n/*\n * ro-RO validation function\n * (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),\n * persons only)\n * Verify CNP validity by calculating check (last) digit (test not found for CIF)\n * Material not in DG TAXUD document sourced from:\n * `https://en.wikipedia.org/wiki/National_identification_number#Romania`\n */\nfunction roRoCheck(tin) {\n  if (tin.slice(0, 4) !== '9000') {\n    // No test found for this format\n    // Extract full year using century digit if possible\n    var full_year = tin.slice(1, 3);\n    switch (tin[0]) {\n      case '1':\n      case '2':\n        full_year = \"19\".concat(full_year);\n        break;\n      case '3':\n      case '4':\n        full_year = \"18\".concat(full_year);\n        break;\n      case '5':\n      case '6':\n        full_year = \"20\".concat(full_year);\n        break;\n      default:\n    }\n\n    // Check date validity\n    var date = \"\".concat(full_year, \"/\").concat(tin.slice(3, 5), \"/\").concat(tin.slice(5, 7));\n    if (date.length === 8) {\n      if (!isDate(date, 'YY/MM/DD')) {\n        return false;\n      }\n    } else if (!isDate(date, 'YYYY/MM/DD')) {\n      return false;\n    }\n\n    // Calculate check digit\n    var digits = tin.split('').map(function (a) {\n      return parseInt(a, 10);\n    });\n    var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];\n    var checksum = 0;\n    for (var i = 0; i < multipliers.length; i++) {\n      checksum += digits[i] * multipliers[i];\n    }\n    if (checksum % 11 === 10) {\n      return digits[12] === 1;\n    }\n    return digits[12] === checksum % 11;\n  }\n  return true;\n}\n\n/*\n * sk-SK validation function\n * (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)\n * Checks validity of pre-1954 birth numbers (rodné číslo) only\n * Due to the introduction of the pseudo-random BIČ it is not possible to test\n * post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand\n */\nfunction skSkCheck(tin) {\n  if (tin.length === 9) {\n    tin = tin.replace(/\\W/, '');\n    if (tin.slice(6) === '000') {\n      return false;\n    } // Three-zero serial not assigned before 1954\n\n    // Extract full year from TIN length\n    var full_year = parseInt(tin.slice(0, 2), 10);\n    if (full_year > 53) {\n      return false;\n    }\n    if (full_year < 10) {\n      full_year = \"190\".concat(full_year);\n    } else {\n      full_year = \"19\".concat(full_year);\n    }\n\n    // Extract month from TIN and normalize\n    var month = parseInt(tin.slice(2, 4), 10);\n    if (month > 50) {\n      month -= 50;\n    }\n    if (month < 10) {\n      month = \"0\".concat(month);\n    }\n\n    // Check date validity\n    var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n    if (!isDate(date, 'YYYY/MM/DD')) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/*\n * sl-SI validation function\n * (Davčna številka, persons/entities)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction slSiCheck(tin) {\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {\n    return parseInt(a, 10);\n  }), 8) % 11;\n  if (checksum === 10) {\n    return parseInt(tin[7], 10) === 0;\n  }\n  return checksum === parseInt(tin[7], 10);\n}\n\n/*\n * sv-SE validation function\n * (Personnummer or samordningsnummer, persons only)\n * Checks validity of birth date and calls luhnCheck() to validate check (last) digit\n */\nfunction svSeCheck(tin) {\n  // Make copy of TIN and normalize to two-digit year form\n  var tin_copy = tin.slice(0);\n  if (tin.length > 11) {\n    tin_copy = tin_copy.slice(2);\n  }\n\n  // Extract date of birth\n  var full_year = '';\n  var month = tin_copy.slice(2, 4);\n  var day = parseInt(tin_copy.slice(4, 6), 10);\n  if (tin.length > 11) {\n    full_year = tin.slice(0, 4);\n  } else {\n    full_year = tin.slice(0, 2);\n    if (tin.length === 11 && day < 60) {\n      // Extract full year from centenarian symbol\n      // Should work just fine until year 10000 or so\n      var current_year = new Date().getFullYear().toString();\n      var current_century = parseInt(current_year.slice(0, 2), 10);\n      current_year = parseInt(current_year, 10);\n      if (tin[6] === '-') {\n        if (parseInt(\"\".concat(current_century).concat(full_year), 10) > current_year) {\n          full_year = \"\".concat(current_century - 1).concat(full_year);\n        } else {\n          full_year = \"\".concat(current_century).concat(full_year);\n        }\n      } else {\n        full_year = \"\".concat(current_century - 1).concat(full_year);\n        if (current_year - parseInt(full_year, 10) < 100) {\n          return false;\n        }\n      }\n    }\n  }\n\n  // Normalize day and check date validity\n  if (day > 60) {\n    day -= 60;\n  }\n  if (day < 10) {\n    day = \"0\".concat(day);\n  }\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(day);\n  if (date.length === 8) {\n    if (!isDate(date, 'YY/MM/DD')) {\n      return false;\n    }\n  } else if (!isDate(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n  return algorithms.luhnCheck(tin.replace(/\\W/, ''));\n}\n\n/**\n * uk-UA validation function\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction ukUaCheck(tin) {\n  // Calculate check digit\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var multipliers = [-1, 5, 7, 9, 4, 6, 10, 5, 7];\n  var checksum = 0;\n  for (var i = 0; i < multipliers.length; i++) {\n    checksum += digits[i] * multipliers[i];\n  }\n  return checksum % 11 === 10 ? digits[9] === 0 : digits[9] === checksum % 11;\n}\n\n// Locale lookup objects\n\n/*\n * Tax id regex formats for various locales\n *\n * Where not explicitly specified in DG-TAXUD document both\n * uppercase and lowercase letters are acceptable.\n */\nvar taxIdFormat = {\n  'bg-BG': /^\\d{10}$/,\n  'cs-CZ': /^\\d{6}\\/{0,1}\\d{3,4}$/,\n  'de-AT': /^\\d{9}$/,\n  'de-DE': /^[1-9]\\d{10}$/,\n  'dk-DK': /^\\d{6}-{0,1}\\d{4}$/,\n  'el-CY': /^[09]\\d{7}[A-Z]$/,\n  'el-GR': /^([0-4]|[7-9])\\d{8}$/,\n  'en-CA': /^\\d{9}$/,\n  'en-GB': /^\\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\\d{6}[ABCD ]$/i,\n  'en-IE': /^\\d{7}[A-W][A-IW]{0,1}$/i,\n  'en-US': /^\\d{2}[- ]{0,1}\\d{7}$/,\n  'es-AR': /(20|23|24|27|30|33|34)[0-9]{8}[0-9]/,\n  'es-ES': /^(\\d{0,8}|[XYZKLM]\\d{7})[A-HJ-NP-TV-Z]$/i,\n  'et-EE': /^[1-6]\\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\\d$/,\n  'fi-FI': /^\\d{6}[-+A]\\d{3}[0-9A-FHJ-NPR-Y]$/i,\n  'fr-BE': /^\\d{11}$/,\n  'fr-FR': /^[0-3]\\d{12}$|^[0-3]\\d\\s\\d{2}(\\s\\d{3}){3}$/,\n  // Conforms both to official spec and provided example\n  'fr-LU': /^\\d{13}$/,\n  'hr-HR': /^\\d{11}$/,\n  'hu-HU': /^8\\d{9}$/,\n  'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,\n  'lv-LV': /^\\d{6}-{0,1}\\d{5}$/,\n  // Conforms both to DG TAXUD spec and original research\n  'mt-MT': /^\\d{3,7}[APMGLHBZ]$|^([1-8])\\1\\d{7}$/i,\n  'nl-NL': /^\\d{9}$/,\n  'pl-PL': /^\\d{10,11}$/,\n  'pt-BR': /(?:^\\d{11}$)|(?:^\\d{14}$)/,\n  'pt-PT': /^\\d{9}$/,\n  'ro-RO': /^\\d{13}$/,\n  'sk-SK': /^\\d{6}\\/{0,1}\\d{3,4}$/,\n  'sl-SI': /^[1-9]\\d{7}$/,\n  'sv-SE': /^(\\d{6}[-+]{0,1}\\d{4}|(18|19|20)\\d{6}[-+]{0,1}\\d{4})$/,\n  'uk-UA': /^\\d{10}$/\n};\n// taxIdFormat locale aliases\ntaxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];\ntaxIdFormat['lt-LT'] = taxIdFormat['et-EE'];\ntaxIdFormat['nl-BE'] = taxIdFormat['fr-BE'];\ntaxIdFormat['fr-CA'] = taxIdFormat['en-CA'];\n\n// Algorithmic tax id check functions for various locales\nvar taxIdCheck = {\n  'bg-BG': bgBgCheck,\n  'cs-CZ': csCzCheck,\n  'de-AT': deAtCheck,\n  'de-DE': deDeCheck,\n  'dk-DK': dkDkCheck,\n  'el-CY': elCyCheck,\n  'el-GR': elGrCheck,\n  'en-CA': isCanadianSIN,\n  'en-IE': enIeCheck,\n  'en-US': enUsCheck,\n  'es-AR': esArCheck,\n  'es-ES': esEsCheck,\n  'et-EE': etEeCheck,\n  'fi-FI': fiFiCheck,\n  'fr-BE': frBeCheck,\n  'fr-FR': frFrCheck,\n  'fr-LU': frLuCheck,\n  'hr-HR': hrHrCheck,\n  'hu-HU': huHuCheck,\n  'it-IT': itItCheck,\n  'lv-LV': lvLvCheck,\n  'mt-MT': mtMtCheck,\n  'nl-NL': nlNlCheck,\n  'pl-PL': plPlCheck,\n  'pt-BR': ptBrCheck,\n  'pt-PT': ptPtCheck,\n  'ro-RO': roRoCheck,\n  'sk-SK': skSkCheck,\n  'sl-SI': slSiCheck,\n  'sv-SE': svSeCheck,\n  'uk-UA': ukUaCheck\n};\n// taxIdCheck locale aliases\ntaxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];\ntaxIdCheck['lt-LT'] = taxIdCheck['et-EE'];\ntaxIdCheck['nl-BE'] = taxIdCheck['fr-BE'];\ntaxIdCheck['fr-CA'] = taxIdCheck['en-CA'];\n\n// Regexes for locales where characters should be omitted before checking format\nvar allsymbols = /[-\\\\\\/!@#$%\\^&\\*\\(\\)\\+\\=\\[\\]]+/g;\nvar sanitizeRegexes = {\n  'de-AT': allsymbols,\n  'de-DE': /[\\/\\\\]/g,\n  'fr-BE': allsymbols\n};\n// sanitizeRegexes locale aliases\nsanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];\n\n/*\n * Validator function\n * Return true if the passed string is a valid tax identification number\n * for the specified locale.\n * Throw an error exception if the locale is not supported.\n */\nexport default function isTaxID(str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  assertString(str);\n  // Copy TIN to avoid replacement if sanitized\n  var strcopy = str.slice(0);\n  if (locale in taxIdFormat) {\n    if (locale in sanitizeRegexes) {\n      strcopy = strcopy.replace(sanitizeRegexes[locale], '');\n    }\n    if (!taxIdFormat[locale].test(strcopy)) {\n      return false;\n    }\n    if (locale in taxIdCheck) {\n      return taxIdCheck[locale](strcopy);\n    }\n    // Fallthrough; not all locales have algorithmic checks\n    return true;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}","import assertString from './util/assertString';\n\n/* eslint-disable max-len */\nvar phones = {\n  'am-AM': /^(\\+?374|0)(33|4[134]|55|77|88|9[13-689])\\d{6}$/,\n  'ar-AE': /^((\\+?971)|0)?5[024568]\\d{7}$/,\n  'ar-BH': /^(\\+?973)?(3|6)\\d{7}$/,\n  'ar-DZ': /^(\\+?213|0)(5|6|7)\\d{8}$/,\n  'ar-LB': /^(\\+?961)?((3|81)\\d{6}|7\\d{7})$/,\n  'ar-EG': /^((\\+?20)|0)?1[0125]\\d{8}$/,\n  'ar-IQ': /^(\\+?964|0)?7[0-9]\\d{8}$/,\n  'ar-JO': /^(\\+?962|0)?7[789]\\d{7}$/,\n  'ar-KW': /^(\\+?965)([569]\\d{7}|41\\d{6})$/,\n  'ar-LY': /^((\\+?218)|0)?(9[1-6]\\d{7}|[1-8]\\d{7,9})$/,\n  'ar-MA': /^(?:(?:\\+|00)212|0)[5-7]\\d{8}$/,\n  'ar-OM': /^((\\+|00)968)?(9[1-9])\\d{6}$/,\n  'ar-PS': /^(\\+?970|0)5[6|9](\\d{7})$/,\n  'ar-SA': /^(!?(\\+?966)|0)?5\\d{8}$/,\n  'ar-SD': /^((\\+?249)|0)?(9[012369]|1[012])\\d{7}$/,\n  'ar-SY': /^(!?(\\+?963)|0)?9\\d{8}$/,\n  'ar-TN': /^(\\+?216)?[2459]\\d{7}$/,\n  'az-AZ': /^(\\+994|0)(10|5[015]|7[07]|99)\\d{7}$/,\n  'bs-BA': /^((((\\+|00)3876)|06))((([0-3]|[5-6])\\d{6})|(4\\d{7}))$/,\n  'be-BY': /^(\\+?375)?(24|25|29|33|44)\\d{7}$/,\n  'bg-BG': /^(\\+?359|0)?8[789]\\d{7}$/,\n  'bn-BD': /^(\\+?880|0)1[13456789][0-9]{8}$/,\n  'ca-AD': /^(\\+376)?[346]\\d{5}$/,\n  'cs-CZ': /^(\\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,\n  'da-DK': /^(\\+?45)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'de-DE': /^((\\+49|0)1)(5[0-25-9]\\d|6([23]|0\\d?)|7([0-57-9]|6\\d))\\d{7,9}$/,\n  'de-AT': /^(\\+43|0)\\d{1,4}\\d{3,12}$/,\n  'de-CH': /^(\\+41|0)([1-9])\\d{1,9}$/,\n  'de-LU': /^(\\+352)?((6\\d1)\\d{6})$/,\n  'dv-MV': /^(\\+?960)?(7[2-9]|9[1-9])\\d{5}$/,\n  'el-GR': /^(\\+?30|0)?6(8[5-9]|9(?![26])[0-9])\\d{7}$/,\n  'el-CY': /^(\\+?357?)?(9(9|6)\\d{6})$/,\n  'en-AI': /^(\\+?1|0)264(?:2(35|92)|4(?:6[1-2]|76|97)|5(?:3[6-9]|8[1-4])|7(?:2(4|9)|72))\\d{4}$/,\n  'en-AU': /^(\\+?61|0)4\\d{8}$/,\n  'en-AG': /^(?:\\+1|1)268(?:464|7(?:1[3-9]|[28]\\d|3[0246]|64|7[0-689]))\\d{4}$/,\n  'en-BM': /^(\\+?1)?441(((3|7)\\d{6}$)|(5[0-3][0-9]\\d{4}$)|(59\\d{5}$))/,\n  'en-BS': /^(\\+?1[-\\s]?|0)?\\(?242\\)?[-\\s]?\\d{3}[-\\s]?\\d{4}$/,\n  'en-GB': /^(\\+?44|0)7\\d{9}$/,\n  'en-GG': /^(\\+?44|0)1481\\d{6}$/,\n  'en-GH': /^(\\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\\d{7}$/,\n  'en-GY': /^(\\+592|0)6\\d{6}$/,\n  'en-HK': /^(\\+?852[-\\s]?)?[456789]\\d{3}[-\\s]?\\d{4}$/,\n  'en-MO': /^(\\+?853[-\\s]?)?[6]\\d{3}[-\\s]?\\d{4}$/,\n  'en-IE': /^(\\+?353|0)8[356789]\\d{7}$/,\n  'en-IN': /^(\\+?91|0)?[6789]\\d{9}$/,\n  'en-JM': /^(\\+?876)?\\d{7}$/,\n  'en-KE': /^(\\+?254|0)(7|1)\\d{8}$/,\n  'fr-CF': /^(\\+?236| ?)(70|75|77|72|21|22)\\d{6}$/,\n  'en-SS': /^(\\+?211|0)(9[1257])\\d{7}$/,\n  'en-KI': /^((\\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,\n  'en-KN': /^(?:\\+1|1)869(?:46\\d|48[89]|55[6-8]|66\\d|76[02-7])\\d{4}$/,\n  'en-LS': /^(\\+?266)(22|28|57|58|59|27|52)\\d{6}$/,\n  'en-MT': /^(\\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,\n  'en-MU': /^(\\+?230|0)?\\d{8}$/,\n  'en-MW': /^(\\+?265|0)(((77|88|31|99|98|21)\\d{7})|(((111)|1)\\d{6})|(32000\\d{4}))$/,\n  'en-NA': /^(\\+?264|0)(6|8)\\d{7}$/,\n  'en-NG': /^(\\+?234|0)?[789]\\d{9}$/,\n  'en-NZ': /^(\\+?64|0)[28]\\d{7,9}$/,\n  'en-PG': /^(\\+?675|0)?(7\\d|8[18])\\d{6}$/,\n  'en-PK': /^((00|\\+)?92|0)3[0-6]\\d{8}$/,\n  'en-PH': /^(09|\\+639)\\d{9}$/,\n  'en-RW': /^(\\+?250|0)?[7]\\d{8}$/,\n  'en-SG': /^(\\+65)?[3689]\\d{7}$/,\n  'en-SL': /^(\\+?232|0)\\d{8}$/,\n  'en-TZ': /^(\\+?255|0)?[67]\\d{8}$/,\n  'en-UG': /^(\\+?256|0)?[7]\\d{8}$/,\n  'en-US': /^((\\+1|1)?( |-)?)?(\\([2-9][0-9]{2}\\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,\n  'en-ZA': /^(\\+?27|0)\\d{9}$/,\n  'en-ZM': /^(\\+?26)?09[567]\\d{7}$/,\n  'en-ZW': /^(\\+263)[0-9]{9}$/,\n  'en-BW': /^(\\+?267)?(7[1-8]{1})\\d{6}$/,\n  'es-AR': /^\\+?549(11|[2368]\\d)\\d{8}$/,\n  'es-BO': /^(\\+?591)?(6|7)\\d{7}$/,\n  'es-CO': /^(\\+?57)?3(0(0|1|2|4|5)|1\\d|2[0-4]|5(0|1))\\d{7}$/,\n  'es-CL': /^(\\+?56|0)[2-9]\\d{1}\\d{7}$/,\n  'es-CR': /^(\\+506)?[2-8]\\d{7}$/,\n  'es-CU': /^(\\+53|0053)?5\\d{7}$/,\n  'es-DO': /^(\\+?1)?8[024]9\\d{7}$/,\n  'es-HN': /^(\\+?504)?[9|8|3|2]\\d{7}$/,\n  'es-EC': /^(\\+?593|0)([2-7]|9[2-9])\\d{7}$/,\n  'es-ES': /^(\\+?34)?[6|7]\\d{8}$/,\n  'es-PE': /^(\\+?51)?9\\d{8}$/,\n  'es-MX': /^(\\+?52)?(1|01)?\\d{10,11}$/,\n  'es-NI': /^(\\+?505)\\d{7,8}$/,\n  'es-PA': /^(\\+?507)\\d{7,8}$/,\n  'es-PY': /^(\\+?595|0)9[9876]\\d{7}$/,\n  'es-SV': /^(\\+?503)?[67]\\d{7}$/,\n  'es-UY': /^(\\+598|0)9[1-9][\\d]{6}$/,\n  'es-VE': /^(\\+?58)?(2|4)\\d{9}$/,\n  'et-EE': /^(\\+?372)?\\s?(5|8[1-4])\\s?([0-9]\\s?){6,7}$/,\n  'fa-IR': /^(\\+?98[\\-\\s]?|0)9[0-39]\\d[\\-\\s]?\\d{3}[\\-\\s]?\\d{4}$/,\n  'fi-FI': /^(\\+?358|0)\\s?(4[0-6]|50)\\s?(\\d\\s?){4,8}$/,\n  'fj-FJ': /^(\\+?679)?\\s?\\d{3}\\s?\\d{4}$/,\n  'fo-FO': /^(\\+?298)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'fr-BF': /^(\\+226|0)[67]\\d{7}$/,\n  'fr-BJ': /^(\\+229)\\d{8}$/,\n  'fr-CD': /^(\\+?243|0)?(8|9)\\d{8}$/,\n  'fr-CM': /^(\\+?237)6[0-9]{8}$/,\n  'fr-FR': /^(\\+?33|0)[67]\\d{8}$/,\n  'fr-GF': /^(\\+?594|0|00594)[67]\\d{8}$/,\n  'fr-GP': /^(\\+?590|0|00590)[67]\\d{8}$/,\n  'fr-MQ': /^(\\+?596|0|00596)[67]\\d{8}$/,\n  'fr-PF': /^(\\+?689)?8[789]\\d{6}$/,\n  'fr-RE': /^(\\+?262|0|00262)[67]\\d{8}$/,\n  'fr-WF': /^(\\+681)?\\d{6}$/,\n  'he-IL': /^(\\+972|0)([23489]|5[012345689]|77)[1-9]\\d{6}$/,\n  'hu-HU': /^(\\+?36|06)(20|30|31|50|70)\\d{7}$/,\n  'id-ID': /^(\\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\\s?|\\d]{5,11})$/,\n  'ir-IR': /^(\\+98|0)?9\\d{9}$/,\n  'it-IT': /^(\\+?39)?\\s?3\\d{2} ?\\d{6,7}$/,\n  'it-SM': /^((\\+378)|(0549)|(\\+390549)|(\\+3780549))?6\\d{5,9}$/,\n  'ja-JP': /^(\\+81[ \\-]?(\\(0\\))?|0)[6789]0[ \\-]?\\d{4}[ \\-]?\\d{4}$/,\n  'ka-GE': /^(\\+?995)?(79\\d{7}|5\\d{8})$/,\n  'kk-KZ': /^(\\+?7|8)?7\\d{9}$/,\n  'kl-GL': /^(\\+?299)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'ko-KR': /^((\\+?82)[ \\-]?)?0?1([0|1|6|7|8|9]{1})[ \\-]?\\d{3,4}[ \\-]?\\d{4}$/,\n  'ky-KG': /^(\\+?7\\s?\\+?7|0)\\s?\\d{2}\\s?\\d{3}\\s?\\d{4}$/,\n  'lt-LT': /^(\\+370|8)\\d{8}$/,\n  'lv-LV': /^(\\+?371)2\\d{7}$/,\n  'mg-MG': /^((\\+?261|0)(2|3)\\d)?\\d{7}$/,\n  'mn-MN': /^(\\+|00|011)?976(77|81|88|91|94|95|96|99)\\d{6}$/,\n  'my-MM': /^(\\+?959|09|9)(2[5-7]|3[1-2]|4[0-5]|6[6-9]|7[5-9]|9[6-9])[0-9]{7}$/,\n  'ms-MY': /^(\\+?60|0)1(([0145](-|\\s)?\\d{7,8})|([236-9](-|\\s)?\\d{7}))$/,\n  'mz-MZ': /^(\\+?258)?8[234567]\\d{7}$/,\n  'nb-NO': /^(\\+?47)?[49]\\d{7}$/,\n  'ne-NP': /^(\\+?977)?9[78]\\d{8}$/,\n  'nl-BE': /^(\\+?32|0)4\\d{8}$/,\n  'nl-NL': /^(((\\+|00)?31\\(0\\))|((\\+|00)?31)|0)6{1}\\d{8}$/,\n  'nl-AW': /^(\\+)?297(56|59|64|73|74|99)\\d{5}$/,\n  'nn-NO': /^(\\+?47)?[49]\\d{7}$/,\n  'pl-PL': /^(\\+?48)? ?([5-8]\\d|45) ?\\d{3} ?\\d{2} ?\\d{2}$/,\n  'pt-BR': /^((\\+?55\\ ?[1-9]{2}\\ ?)|(\\+?55\\ ?\\([1-9]{2}\\)\\ ?)|(0[1-9]{2}\\ ?)|(\\([1-9]{2}\\)\\ ?)|([1-9]{2}\\ ?))((\\d{4}\\-?\\d{4})|(9[1-9]{1}\\d{3}\\-?\\d{4}))$/,\n  'pt-PT': /^(\\+?351)?9[1236]\\d{7}$/,\n  'pt-AO': /^(\\+244)\\d{9}$/,\n  'ro-MD': /^(\\+?373|0)((6(0|1|2|6|7|8|9))|(7(6|7|8|9)))\\d{6}$/,\n  'ro-RO': /^(\\+?40|0)\\s?7\\d{2}(\\/|\\s|\\.|-)?\\d{3}(\\s|\\.|-)?\\d{3}$/,\n  'ru-RU': /^(\\+?7|8)?9\\d{9}$/,\n  'si-LK': /^(?:0|94|\\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\\d{7}$/,\n  'sl-SI': /^(\\+386\\s?|0)(\\d{1}\\s?\\d{3}\\s?\\d{2}\\s?\\d{2}|\\d{2}\\s?\\d{3}\\s?\\d{3})$/,\n  'sk-SK': /^(\\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,\n  'so-SO': /^(\\+?252|0)((6[0-9])\\d{7}|(7[1-9])\\d{7})$/,\n  'sq-AL': /^(\\+355|0)6[789]\\d{6}$/,\n  'sr-RS': /^(\\+3816|06)[- \\d]{5,9}$/,\n  'sv-SE': /^(\\+?46|0)[\\s\\-]?7[\\s\\-]?[02369]([\\s\\-]?\\d){7}$/,\n  'tg-TJ': /^(\\+?992)?[5][5]\\d{7}$/,\n  'th-TH': /^(\\+66|66|0)\\d{9}$/,\n  'tr-TR': /^(\\+?90|0)?5\\d{9}$/,\n  'tk-TM': /^(\\+993|993|8)\\d{8}$/,\n  'uk-UA': /^(\\+?38|8)?0\\d{9}$/,\n  'uz-UZ': /^(\\+?998)?(6[125-79]|7[1-69]|88|9\\d)\\d{7}$/,\n  'vi-VN': /^((\\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,\n  'zh-CN': /^((\\+|00)86)?(1[3-9]|9[28])\\d{9}$/,\n  'zh-TW': /^(\\+?886\\-?|0)?9\\d{8}$/,\n  'dz-BT': /^(\\+?975|0)?(17|16|77|02)\\d{6}$/,\n  'ar-YE': /^(((\\+|00)9677|0?7)[0137]\\d{7}|((\\+|00)967|0)[1-7]\\d{6})$/,\n  'ar-EH': /^(\\+?212|0)[\\s\\-]?(5288|5289)[\\s\\-]?\\d{5}$/,\n  'fa-AF': /^(\\+93|0)?(2{1}[0-8]{1}|[3-5]{1}[0-4]{1})(\\d{7})$/\n};\n/* eslint-enable max-len */\n\n// aliases\nphones['en-CA'] = phones['en-US'];\nphones['fr-CA'] = phones['en-CA'];\nphones['fr-BE'] = phones['nl-BE'];\nphones['zh-HK'] = phones['en-HK'];\nphones['zh-MO'] = phones['en-MO'];\nphones['ga-IE'] = phones['en-IE'];\nphones['fr-CH'] = phones['de-CH'];\nphones['it-CH'] = phones['fr-CH'];\nexport default function isMobilePhone(str, locale, options) {\n  assertString(str);\n  if (options && options.strictMode && !str.startsWith('+')) {\n    return false;\n  }\n  if (Array.isArray(locale)) {\n    return locale.some(function (key) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (phones.hasOwnProperty(key)) {\n        var phone = phones[key];\n        if (phone.test(str)) {\n          return true;\n        }\n      }\n      return false;\n    });\n  } else if (locale in phones) {\n    return phones[locale].test(str);\n    // alias falsey locale as 'any'\n  } else if (!locale || locale === 'any') {\n    for (var key in phones) {\n      // istanbul ignore else\n      if (phones.hasOwnProperty(key)) {\n        var phone = phones[key];\n        if (phone.test(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nexport var locales = Object.keys(phones);","import assertString from './util/assertString';\nvar eth = /^(0x)[0-9a-f]{40}$/i;\nexport default function isEthereumAddress(str) {\n  assertString(str);\n  return eth.test(str);\n}","import merge from './util/merge';\nimport assertString from './util/assertString';\nfunction currencyRegex(options) {\n  var decimal_digits = \"\\\\d{\".concat(options.digits_after_decimal[0], \"}\");\n  options.digits_after_decimal.forEach(function (digit, index) {\n    if (index !== 0) decimal_digits = \"\".concat(decimal_digits, \"|\\\\d{\").concat(digit, \"}\");\n  });\n  var symbol = \"(\".concat(options.symbol.replace(/\\W/, function (m) {\n      return \"\\\\\".concat(m);\n    }), \")\").concat(options.require_symbol ? '' : '?'),\n    negative = '-?',\n    whole_dollar_amount_without_sep = '[1-9]\\\\d*',\n    whole_dollar_amount_with_sep = \"[1-9]\\\\d{0,2}(\\\\\".concat(options.thousands_separator, \"\\\\d{3})*\"),\n    valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],\n    whole_dollar_amount = \"(\".concat(valid_whole_dollar_amounts.join('|'), \")?\"),\n    decimal_amount = \"(\\\\\".concat(options.decimal_separator, \"(\").concat(decimal_digits, \"))\").concat(options.require_decimal ? '' : '?');\n  var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : '');\n\n  // default is negative sign before symbol, but there are two other options (besides parens)\n  if (options.allow_negatives && !options.parens_for_negatives) {\n    if (options.negative_sign_after_digits) {\n      pattern += negative;\n    } else if (options.negative_sign_before_digits) {\n      pattern = negative + pattern;\n    }\n  }\n\n  // South African Rand, for example, uses R 123 (space) and R-123 (no space)\n  if (options.allow_negative_sign_placeholder) {\n    pattern = \"( (?!\\\\-))?\".concat(pattern);\n  } else if (options.allow_space_after_symbol) {\n    pattern = \" ?\".concat(pattern);\n  } else if (options.allow_space_after_digits) {\n    pattern += '( (?!$))?';\n  }\n  if (options.symbol_after_digits) {\n    pattern += symbol;\n  } else {\n    pattern = symbol + pattern;\n  }\n  if (options.allow_negatives) {\n    if (options.parens_for_negatives) {\n      pattern = \"(\\\\(\".concat(pattern, \"\\\\)|\").concat(pattern, \")\");\n    } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {\n      pattern = negative + pattern;\n    }\n  }\n\n  // ensure there's a dollar and/or decimal amount, and that\n  // it doesn't start with a space or a negative sign followed by a space\n  return new RegExp(\"^(?!-? )(?=.*\\\\d)\".concat(pattern, \"$\"));\n}\nvar default_currency_options = {\n  symbol: '$',\n  require_symbol: false,\n  allow_space_after_symbol: false,\n  symbol_after_digits: false,\n  allow_negatives: true,\n  parens_for_negatives: false,\n  negative_sign_before_digits: false,\n  negative_sign_after_digits: false,\n  allow_negative_sign_placeholder: false,\n  thousands_separator: ',',\n  decimal_separator: '.',\n  allow_decimal: true,\n  require_decimal: false,\n  digits_after_decimal: [2],\n  allow_space_after_digits: false\n};\nexport default function isCurrency(str, options) {\n  assertString(str);\n  options = merge(options, default_currency_options);\n  return currencyRegex(options).test(str);\n}","import assertString from './util/assertString';\nvar bech32 = /^(bc1)[a-z0-9]{25,39}$/;\nvar base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;\nexport default function isBtcAddress(str) {\n  assertString(str);\n  return bech32.test(str) || base58.test(str);\n}","import assertString from './util/assertString';\n\n// https://en.wikipedia.org/wiki/ISO_6346\n// according to ISO6346 standard, checksum digit is mandatory for freight container but recommended\n// for other container types (J and Z)\nvar isISO6346Str = /^[A-Z]{3}(U[0-9]{7})|([J,Z][0-9]{6,7})$/;\nvar isDigit = /^[0-9]$/;\nexport function isISO6346(str) {\n  assertString(str);\n  str = str.toUpperCase();\n  if (!isISO6346Str.test(str)) return false;\n  if (str.length === 11) {\n    var sum = 0;\n    for (var i = 0; i < str.length - 1; i++) {\n      if (!isDigit.test(str[i])) {\n        var convertedCode = void 0;\n        var letterCode = str.charCodeAt(i) - 55;\n        if (letterCode < 11) convertedCode = letterCode;else if (letterCode >= 11 && letterCode <= 20) convertedCode = 12 + letterCode % 11;else if (letterCode >= 21 && letterCode <= 30) convertedCode = 23 + letterCode % 21;else convertedCode = 34 + letterCode % 31;\n        sum += convertedCode * Math.pow(2, i);\n      } else sum += str[i] * Math.pow(2, i);\n    }\n    var checkSumDigit = sum % 11;\n    return Number(str[str.length - 1]) === checkSumDigit;\n  }\n  return true;\n}\nexport var isFreightContainerID = isISO6346;","import assertString from './util/assertString';\nvar isISO6391Set = new Set(['aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu']);\nexport default function isISO6391(str) {\n  assertString(str);\n  return isISO6391Set.has(str);\n}","import assertString from './util/assertString';\n\n/* eslint-disable max-len */\n// from http://goo.gl/0ejHHW\nvar iso8601 = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\n// same as above, except with a strict 'T' separator between date and time\nvar iso8601StrictSeparator = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\n/* eslint-enable max-len */\nvar isValidDate = function isValidDate(str) {\n  // str must have passed the ISO8601 check\n  // this check is meant to catch invalid dates\n  // like 2009-02-31\n  // first check for ordinal dates\n  var ordinalMatch = str.match(/^(\\d{4})-?(\\d{3})([ T]{1}\\.*|$)/);\n  if (ordinalMatch) {\n    var oYear = Number(ordinalMatch[1]);\n    var oDay = Number(ordinalMatch[2]);\n    // if is leap year\n    if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;\n    return oDay <= 365;\n  }\n  var match = str.match(/(\\d{4})-?(\\d{0,2})-?(\\d*)/).map(Number);\n  var year = match[1];\n  var month = match[2];\n  var day = match[3];\n  var monthString = month ? \"0\".concat(month).slice(-2) : month;\n  var dayString = day ? \"0\".concat(day).slice(-2) : day;\n\n  // create a date object and compare\n  var d = new Date(\"\".concat(year, \"-\").concat(monthString || '01', \"-\").concat(dayString || '01'));\n  if (month && day) {\n    return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;\n  }\n  return true;\n};\nexport default function isISO8601(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  assertString(str);\n  var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);\n  if (check && options.strict) return isValidDate(str);\n  return check;\n}","import assertString from './util/assertString';\n\n/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */\n\nvar dateFullYear = /[0-9]{4}/;\nvar dateMonth = /(0[1-9]|1[0-2])/;\nvar dateMDay = /([12]\\d|0[1-9]|3[01])/;\nvar timeHour = /([01][0-9]|2[0-3])/;\nvar timeMinute = /[0-5][0-9]/;\nvar timeSecond = /([0-5][0-9]|60)/;\nvar timeSecFrac = /(\\.[0-9]+)?/;\nvar timeNumOffset = new RegExp(\"[-+]\".concat(timeHour.source, \":\").concat(timeMinute.source));\nvar timeOffset = new RegExp(\"([zZ]|\".concat(timeNumOffset.source, \")\"));\nvar partialTime = new RegExp(\"\".concat(timeHour.source, \":\").concat(timeMinute.source, \":\").concat(timeSecond.source).concat(timeSecFrac.source));\nvar fullDate = new RegExp(\"\".concat(dateFullYear.source, \"-\").concat(dateMonth.source, \"-\").concat(dateMDay.source));\nvar fullTime = new RegExp(\"\".concat(partialTime.source).concat(timeOffset.source));\nvar rfc3339 = new RegExp(\"^\".concat(fullDate.source, \"[ tT]\").concat(fullTime.source, \"$\"));\nexport default function isRFC3339(str) {\n  assertString(str);\n  return rfc3339.test(str);\n}","import assertString from './util/assertString';\n\n// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3\nvar validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);\nexport default function isISO31661Alpha3(str) {\n  assertString(str);\n  return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());\n}","import assertString from './util/assertString';\n\n// from https://en.wikipedia.org/wiki/ISO_4217\nvar validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLE', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);\nexport default function isISO4217(str) {\n  assertString(str);\n  return validISO4217CurrencyCodes.has(str.toUpperCase());\n}\nexport var CurrencyCodes = validISO4217CurrencyCodes;","import assertString from './util/assertString';\nimport merge from './util/merge';\nvar base32 = /^[A-Z2-7]+=*$/;\nvar crockfordBase32 = /^[A-HJKMNP-TV-Z0-9]+$/;\nvar defaultBase32Options = {\n  crockford: false\n};\nexport default function isBase32(str, options) {\n  assertString(str);\n  options = merge(options, defaultBase32Options);\n  if (options.crockford) {\n    return crockfordBase32.test(str);\n  }\n  var len = str.length;\n  if (len % 8 === 0 && base32.test(str)) {\n    return true;\n  }\n  return false;\n}","import assertString from './util/assertString';\n\n// Accepted chars - 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz\nvar base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;\nexport default function isBase58(str) {\n  assertString(str);\n  if (base58Reg.test(str)) {\n    return true;\n  }\n  return false;\n}","import assertString from './util/assertString';\nvar validMediaType = /^[a-z]+\\/[a-z0-9\\-\\+\\._]+$/i;\nvar validAttribute = /^[a-z\\-]+=[a-z0-9\\-]+$/i;\nvar validData = /^[a-z0-9!\\$&'\\(\\)\\*\\+,;=\\-\\._~:@\\/\\?%\\s]*$/i;\nexport default function isDataURI(str) {\n  assertString(str);\n  var data = str.split(',');\n  if (data.length < 2) {\n    return false;\n  }\n  var attributes = data.shift().trim().split(';');\n  var schemeAndMediaType = attributes.shift();\n  if (schemeAndMediaType.slice(0, 5) !== 'data:') {\n    return false;\n  }\n  var mediaType = schemeAndMediaType.slice(5);\n  if (mediaType !== '' && !validMediaType.test(mediaType)) {\n    return false;\n  }\n  for (var i = 0; i < attributes.length; i++) {\n    if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {\n      return false;\n    }\n  }\n  for (var _i = 0; _i < data.length; _i++) {\n    if (!validData.test(data[_i])) {\n      return false;\n    }\n  }\n  return true;\n}","import assertString from './util/assertString';\nvar magnetURIComponent = /(?:^magnet:\\?|[^?&]&)xt(?:\\.1)?=urn:(?:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?|btmh:1220[a-z0-9]{64})(?:$|&)/i;\nexport default function isMagnetURI(url) {\n  assertString(url);\n  if (url.indexOf('magnet:?') !== 0) {\n    return false;\n  }\n  return magnetURIComponent.test(url);\n}","import assertString from './util/assertString';\nexport default function rtrim(str, chars) {\n  assertString(str);\n  if (chars) {\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n    var pattern = new RegExp(\"[\".concat(chars.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), \"]+$\"), 'g');\n    return str.replace(pattern, '');\n  }\n  // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript\n  var strIndex = str.length - 1;\n  while (/\\s/.test(str.charAt(strIndex))) {\n    strIndex -= 1;\n  }\n  return str.slice(0, strIndex + 1);\n}","import assertString from './util/assertString';\nexport default function ltrim(str, chars) {\n  assertString(str);\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n  var pattern = chars ? new RegExp(\"^[\".concat(chars.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), \"]+\"), 'g') : /^\\s+/g;\n  return str.replace(pattern, '');\n}","import rtrim from './rtrim';\nimport ltrim from './ltrim';\nexport default function trim(str, chars) {\n  return rtrim(ltrim(str, chars), chars);\n}","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nimport trim from './trim';\nimport isEmail from './isEmail';\nimport assertString from './util/assertString';\nfunction parseMailtoQueryString(queryString) {\n  var allowedParams = new Set(['subject', 'body', 'cc', 'bcc']),\n    query = {\n      cc: '',\n      bcc: ''\n    };\n  var isParseFailed = false;\n  var queryParams = queryString.split('&');\n  if (queryParams.length > 4) {\n    return false;\n  }\n  var _iterator = _createForOfIteratorHelper(queryParams),\n    _step;\n  try {\n    for (_iterator.s(); !(_step = _iterator.n()).done;) {\n      var q = _step.value;\n      var _q$split = q.split('='),\n        _q$split2 = _slicedToArray(_q$split, 2),\n        key = _q$split2[0],\n        value = _q$split2[1];\n\n      // checked for invalid and duplicated query params\n      if (key && !allowedParams.has(key)) {\n        isParseFailed = true;\n        break;\n      }\n      if (value && (key === 'cc' || key === 'bcc')) {\n        query[key] = value;\n      }\n      if (key) {\n        allowedParams[\"delete\"](key);\n      }\n    }\n  } catch (err) {\n    _iterator.e(err);\n  } finally {\n    _iterator.f();\n  }\n  return isParseFailed ? false : query;\n}\nexport default function isMailtoURI(url, options) {\n  assertString(url);\n  if (url.indexOf('mailto:') !== 0) {\n    return false;\n  }\n  var _url$replace$split = url.replace('mailto:', '').split('?'),\n    _url$replace$split2 = _slicedToArray(_url$replace$split, 2),\n    to = _url$replace$split2[0],\n    _url$replace$split2$ = _url$replace$split2[1],\n    queryString = _url$replace$split2$ === void 0 ? '' : _url$replace$split2$;\n  if (!to && !queryString) {\n    return true;\n  }\n  var query = parseMailtoQueryString(queryString);\n  if (!query) {\n    return false;\n  }\n  return \"\".concat(to, \",\").concat(query.cc, \",\").concat(query.bcc).split(',').every(function (email) {\n    email = trim(email, ' ');\n    if (email) {\n      return isEmail(email, options);\n    }\n    return true;\n  });\n}","import assertString from './util/assertString';\n\n/*\n  Checks if the provided string matches to a correct Media type format (MIME type)\n\n  This function only checks is the string format follows the\n  etablished rules by the according RFC specifications.\n  This function supports 'charset' in textual media types\n  (https://tools.ietf.org/html/rfc6657).\n\n  This function does not check against all the media types listed\n  by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)\n  because of lightness purposes : it would require to include\n  all these MIME types in this librairy, which would weigh it\n  significantly. This kind of effort maybe is not worth for the use that\n  this function has in this entire librairy.\n\n  More informations in the RFC specifications :\n  - https://tools.ietf.org/html/rfc2045\n  - https://tools.ietf.org/html/rfc2046\n  - https://tools.ietf.org/html/rfc7231#section-3.1.1.1\n  - https://tools.ietf.org/html/rfc7231#section-3.1.1.5\n*/\n\n// Match simple MIME types\n// NB :\n//   Subtype length must not exceed 100 characters.\n//   This rule does not comply to the RFC specs (what is the max length ?).\nvar mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\\/[a-zA-Z0-9\\.\\-\\+_]{1,100}$/i; // eslint-disable-line max-len\n\n// Handle \"charset\" in \"text/*\"\nvar mimeTypeText = /^text\\/[a-zA-Z0-9\\.\\-\\+]{1,100};\\s?charset=(\"[a-zA-Z0-9\\.\\-\\+\\s]{0,70}\"|[a-zA-Z0-9\\.\\-\\+]{0,70})(\\s?\\([a-zA-Z0-9\\.\\-\\+\\s]{1,20}\\))?$/i; // eslint-disable-line max-len\n\n// Handle \"boundary\" in \"multipart/*\"\nvar mimeTypeMultipart = /^multipart\\/[a-zA-Z0-9\\.\\-\\+]{1,100}(;\\s?(boundary|charset)=(\"[a-zA-Z0-9\\.\\-\\+\\s]{0,70}\"|[a-zA-Z0-9\\.\\-\\+]{0,70})(\\s?\\([a-zA-Z0-9\\.\\-\\+\\s]{1,20}\\))?){0,2}$/i; // eslint-disable-line max-len\n\nexport default function isMimeType(str) {\n  assertString(str);\n  return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);\n}","import assertString from './util/assertString';\nimport merge from './util/merge';\nvar lat = /^\\(?[+-]?(90(\\.0+)?|[1-8]?\\d(\\.\\d+)?)$/;\nvar _long = /^\\s?[+-]?(180(\\.0+)?|1[0-7]\\d(\\.\\d+)?|\\d{1,2}(\\.\\d+)?)\\)?$/;\nvar latDMS = /^(([1-8]?\\d)\\D+([1-5]?\\d|60)\\D+([1-5]?\\d|60)(\\.\\d+)?|90\\D+0\\D+0)\\D+[NSns]?$/i;\nvar longDMS = /^\\s*([1-7]?\\d{1,2}\\D+([1-5]?\\d|60)\\D+([1-5]?\\d|60)(\\.\\d+)?|180\\D+0\\D+0)\\D+[EWew]?$/i;\nvar defaultLatLongOptions = {\n  checkDMS: false\n};\nexport default function isLatLong(str, options) {\n  assertString(str);\n  options = merge(options, defaultLatLongOptions);\n  if (!str.includes(',')) return false;\n  var pair = str.split(',');\n  if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;\n  if (options.checkDMS) {\n    return latDMS.test(pair[0]) && longDMS.test(pair[1]);\n  }\n  return lat.test(pair[0]) && _long.test(pair[1]);\n}","import assertString from './util/assertString';\n\n// common patterns\nvar threeDigit = /^\\d{3}$/;\nvar fourDigit = /^\\d{4}$/;\nvar fiveDigit = /^\\d{5}$/;\nvar sixDigit = /^\\d{6}$/;\nvar patterns = {\n  AD: /^AD\\d{3}$/,\n  AT: fourDigit,\n  AU: fourDigit,\n  AZ: /^AZ\\d{4}$/,\n  BA: /^([7-8]\\d{4}$)/,\n  BE: fourDigit,\n  BG: fourDigit,\n  BR: /^\\d{5}-\\d{3}$/,\n  BY: /^2[1-4]\\d{4}$/,\n  CA: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][\\s\\-]?\\d[ABCEGHJ-NPRSTV-Z]\\d$/i,\n  CH: fourDigit,\n  CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\\d{4}$/,\n  CZ: /^\\d{3}\\s?\\d{2}$/,\n  DE: fiveDigit,\n  DK: fourDigit,\n  DO: fiveDigit,\n  DZ: fiveDigit,\n  EE: fiveDigit,\n  ES: /^(5[0-2]{1}|[0-4]{1}\\d{1})\\d{3}$/,\n  FI: fiveDigit,\n  FR: /^\\d{2}\\s?\\d{3}$/,\n  GB: /^(gir\\s?0aa|[a-z]{1,2}\\d[\\da-z]?\\s?(\\d[a-z]{2})?)$/i,\n  GR: /^\\d{3}\\s?\\d{2}$/,\n  HR: /^([1-5]\\d{4}$)/,\n  HT: /^HT\\d{4}$/,\n  HU: fourDigit,\n  ID: fiveDigit,\n  IE: /^(?!.*(?:o))[A-Za-z]\\d[\\dw]\\s\\w{4}$/i,\n  IL: /^(\\d{5}|\\d{7})$/,\n  IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,\n  IR: /^(?!(\\d)\\1{3})[13-9]{4}[1346-9][013-9]{5}$/,\n  IS: threeDigit,\n  IT: fiveDigit,\n  JP: /^\\d{3}\\-\\d{4}$/,\n  KE: fiveDigit,\n  KR: /^(\\d{5}|\\d{6})$/,\n  LI: /^(948[5-9]|949[0-7])$/,\n  LT: /^LT\\-\\d{5}$/,\n  LU: fourDigit,\n  LV: /^LV\\-\\d{4}$/,\n  LK: fiveDigit,\n  MG: threeDigit,\n  MX: fiveDigit,\n  MT: /^[A-Za-z]{3}\\s{0,1}\\d{4}$/,\n  MY: fiveDigit,\n  NL: /^[1-9]\\d{3}\\s?(?!sa|sd|ss)[a-z]{2}$/i,\n  NO: fourDigit,\n  NP: /^(10|21|22|32|33|34|44|45|56|57)\\d{3}$|^(977)$/i,\n  NZ: fourDigit,\n  PL: /^\\d{2}\\-\\d{3}$/,\n  PR: /^00[679]\\d{2}([ -]\\d{4})?$/,\n  PT: /^\\d{4}\\-\\d{3}?$/,\n  RO: sixDigit,\n  RU: sixDigit,\n  SA: fiveDigit,\n  SE: /^[1-9]\\d{2}\\s?\\d{2}$/,\n  SG: sixDigit,\n  SI: fourDigit,\n  SK: /^\\d{3}\\s?\\d{2}$/,\n  TH: fiveDigit,\n  TN: fourDigit,\n  TW: /^\\d{3}(\\d{2})?$/,\n  UA: fiveDigit,\n  US: /^\\d{5}(-\\d{4})?$/,\n  ZA: fourDigit,\n  ZM: fiveDigit\n};\nexport var locales = Object.keys(patterns);\nexport default function isPostalCode(str, locale) {\n  assertString(str);\n  if (locale in patterns) {\n    return patterns[locale].test(str);\n  } else if (locale === 'any') {\n    for (var key in patterns) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (patterns.hasOwnProperty(key)) {\n        var pattern = patterns[key];\n        if (pattern.test(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}","import assertString from './util/assertString';\nexport default function blacklist(str, chars) {\n  assertString(str);\n  return str.replace(new RegExp(\"[\".concat(chars, \"]+\"), 'g'), '');\n}","import merge from './util/merge';\nvar default_normalize_email_options = {\n  // The following options apply to all email addresses\n  // Lowercases the local part of the email address.\n  // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).\n  // The domain is always lowercased, as per RFC 1035\n  all_lowercase: true,\n  // The following conversions are specific to GMail\n  // Lowercases the local part of the GMail address (known to be case-insensitive)\n  gmail_lowercase: true,\n  // Removes dots from the local part of the email address, as that's ignored by GMail\n  gmail_remove_dots: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  gmail_remove_subaddress: true,\n  // Conversts the googlemail.com domain to gmail.com\n  gmail_convert_googlemaildotcom: true,\n  // The following conversions are specific to Outlook.com / Windows Live / Hotmail\n  // Lowercases the local part of the Outlook.com address (known to be case-insensitive)\n  outlookdotcom_lowercase: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  outlookdotcom_remove_subaddress: true,\n  // The following conversions are specific to Yahoo\n  // Lowercases the local part of the Yahoo address (known to be case-insensitive)\n  yahoo_lowercase: true,\n  // Removes the subaddress (e.g. \"-foo\") from the email address\n  yahoo_remove_subaddress: true,\n  // The following conversions are specific to Yandex\n  // Lowercases the local part of the Yandex address (known to be case-insensitive)\n  yandex_lowercase: true,\n  // The following conversions are specific to iCloud\n  // Lowercases the local part of the iCloud address (known to be case-insensitive)\n  icloud_lowercase: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  icloud_remove_subaddress: true\n};\n\n// List of domains used by iCloud\nvar icloud_domains = ['icloud.com', 'me.com'];\n\n// List of domains used by Outlook.com and its predecessors\n// This list is likely incomplete.\n// Partial reference:\n// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/\nvar outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com'];\n\n// List of domains used by Yahoo Mail\n// This list is likely incomplete\nvar yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com'];\n\n// List of domains used by yandex.ru\nvar yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru'];\n\n// replace single dots, but not multiple consecutive dots\nfunction dotsReplacer(match) {\n  if (match.length > 1) {\n    return match;\n  }\n  return '';\n}\nexport default function normalizeEmail(email, options) {\n  options = merge(options, default_normalize_email_options);\n  var raw_parts = email.split('@');\n  var domain = raw_parts.pop();\n  var user = raw_parts.join('@');\n  var parts = [user, domain];\n\n  // The domain is always lowercased, as it's case-insensitive per RFC 1035\n  parts[1] = parts[1].toLowerCase();\n  if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {\n    // Address is GMail\n    if (options.gmail_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (options.gmail_remove_dots) {\n      // this does not replace consecutive dots like example..email@gmail.com\n      parts[0] = parts[0].replace(/\\.+/g, dotsReplacer);\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.gmail_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n    parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];\n  } else if (icloud_domains.indexOf(parts[1]) >= 0) {\n    // Address is iCloud\n    if (options.icloud_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.icloud_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {\n    // Address is Outlook.com\n    if (options.outlookdotcom_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.outlookdotcom_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (yahoo_domains.indexOf(parts[1]) >= 0) {\n    // Address is Yahoo\n    if (options.yahoo_remove_subaddress) {\n      var components = parts[0].split('-');\n      parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.yahoo_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (yandex_domains.indexOf(parts[1]) >= 0) {\n    if (options.all_lowercase || options.yandex_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n    parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred\n  } else if (options.all_lowercase) {\n    // Any other address\n    parts[0] = parts[0].toLowerCase();\n  }\n  return parts.join('@');\n}","import assertString from './util/assertString';\nvar charsetRegex = /^[^\\s-_](?!.*?[-_]{2,})[a-z0-9-\\\\][^\\s]*[^-_\\s]$/;\nexport default function isSlug(str) {\n  assertString(str);\n  return charsetRegex.test(str);\n}","import assertString from './util/assertString';\nvar validators = {\n  'cs-CZ': function csCZ(str) {\n    return /^(([ABCDEFHIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);\n  },\n  'de-DE': function deDE(str) {\n    return /^((A|AA|AB|AC|AE|AH|AK|AM|AN|AÖ|AP|AS|AT|AU|AW|AZ|B|BA|BB|BC|BE|BF|BH|BI|BK|BL|BM|BN|BO|BÖ|BS|BT|BZ|C|CA|CB|CE|CO|CR|CW|D|DA|DD|DE|DH|DI|DL|DM|DN|DO|DU|DW|DZ|E|EA|EB|ED|EE|EF|EG|EH|EI|EL|EM|EN|ER|ES|EU|EW|F|FB|FD|FF|FG|FI|FL|FN|FO|FR|FS|FT|FÜ|FW|FZ|G|GA|GC|GD|GE|GF|GG|GI|GK|GL|GM|GN|GÖ|GP|GR|GS|GT|GÜ|GV|GW|GZ|H|HA|HB|HC|HD|HE|HF|HG|HH|HI|HK|HL|HM|HN|HO|HP|HR|HS|HU|HV|HX|HY|HZ|IK|IL|IN|IZ|J|JE|JL|K|KA|KB|KC|KE|KF|KG|KH|KI|KK|KL|KM|KN|KO|KR|KS|KT|KU|KW|KY|L|LA|LB|LC|LD|LF|LG|LH|LI|LL|LM|LN|LÖ|LP|LR|LU|M|MA|MB|MC|MD|ME|MG|MH|MI|MK|ML|MM|MN|MO|MQ|MR|MS|MÜ|MW|MY|MZ|N|NB|ND|NE|NF|NH|NI|NK|NM|NÖ|NP|NR|NT|NU|NW|NY|NZ|OA|OB|OC|OD|OE|OF|OG|OH|OK|OL|OP|OS|OZ|P|PA|PB|PE|PF|PI|PL|PM|PN|PR|PS|PW|PZ|R|RA|RC|RD|RE|RG|RH|RI|RL|RM|RN|RO|RP|RS|RT|RU|RV|RW|RZ|S|SB|SC|SE|SG|SI|SK|SL|SM|SN|SO|SP|SR|ST|SU|SW|SY|SZ|TE|TF|TG|TO|TP|TR|TS|TT|TÜ|ÜB|UE|UH|UL|UM|UN|V|VB|VG|VK|VR|VS|W|WA|WB|WE|WF|WI|WK|WL|WM|WN|WO|WR|WS|WT|WÜ|WW|WZ|Z|ZE|ZI|ZP|ZR|ZW|ZZ)[- ]?[A-Z]{1,2}[- ]?\\d{1,4}|(ABG|ABI|AIB|AIC|ALF|ALZ|ANA|ANG|ANK|APD|ARN|ART|ASL|ASZ|AUR|AZE|BAD|BAR|BBG|BCH|BED|BER|BGD|BGL|BID|BIN|BIR|BIT|BIW|BKS|BLB|BLK|BNA|BOG|BOH|BOR|BOT|BRA|BRB|BRG|BRK|BRL|BRV|BSB|BSK|BTF|BÜD|BUL|BÜR|BÜS|BÜZ|CAS|CHA|CLP|CLZ|COC|COE|CUX|DAH|DAN|DAU|DBR|DEG|DEL|DGF|DIL|DIN|DIZ|DKB|DLG|DON|DUD|DÜW|EBE|EBN|EBS|ECK|EIC|EIL|EIN|EIS|EMD|EMS|ERB|ERH|ERK|ERZ|ESB|ESW|FDB|FDS|FEU|FFB|FKB|FLÖ|FOR|FRG|FRI|FRW|FTL|FÜS|GAN|GAP|GDB|GEL|GEO|GER|GHA|GHC|GLA|GMN|GNT|GOA|GOH|GRA|GRH|GRI|GRM|GRZ|GTH|GUB|GUN|GVM|HAB|HAL|HAM|HAS|HBN|HBS|HCH|HDH|HDL|HEB|HEF|HEI|HER|HET|HGN|HGW|HHM|HIG|HIP|HMÜ|HOG|HOH|HOL|HOM|HOR|HÖS|HOT|HRO|HSK|HST|HVL|HWI|IGB|ILL|JÜL|KEH|KEL|KEM|KIB|KLE|KLZ|KÖN|KÖT|KÖZ|KRU|KÜN|KUS|KYF|LAN|LAU|LBS|LBZ|LDK|LDS|LEO|LER|LEV|LIB|LIF|LIP|LÖB|LOS|LRO|LSZ|LÜN|LUP|LWL|MAB|MAI|MAK|MAL|MED|MEG|MEI|MEK|MEL|MER|MET|MGH|MGN|MHL|MIL|MKK|MOD|MOL|MON|MOS|MSE|MSH|MSP|MST|MTK|MTL|MÜB|MÜR|MYK|MZG|NAB|NAI|NAU|NDH|NEA|NEB|NEC|NEN|NES|NEW|NMB|NMS|NOH|NOL|NOM|NOR|NVP|NWM|OAL|OBB|OBG|OCH|OHA|ÖHR|OHV|OHZ|OPR|OSL|OVI|OVL|OVP|PAF|PAN|PAR|PCH|PEG|PIR|PLÖ|PRÜ|QFT|QLB|RDG|REG|REH|REI|RID|RIE|ROD|ROF|ROK|ROL|ROS|ROT|ROW|RSL|RÜD|RÜG|SAB|SAD|SAN|SAW|SBG|SBK|SCZ|SDH|SDL|SDT|SEB|SEE|SEF|SEL|SFB|SFT|SGH|SHA|SHG|SHK|SHL|SIG|SIM|SLE|SLF|SLK|SLN|SLS|SLÜ|SLZ|SMÜ|SOB|SOG|SOK|SÖM|SON|SPB|SPN|SRB|SRO|STA|STB|STD|STE|STL|SUL|SÜW|SWA|SZB|TBB|TDO|TET|TIR|TÖL|TUT|UEM|UER|UFF|USI|VAI|VEC|VER|VIB|VIE|VIT|VOH|WAF|WAK|WAN|WAR|WAT|WBS|WDA|WEL|WEN|WER|WES|WHV|WIL|WIS|WIT|WIZ|WLG|WMS|WND|WOB|WOH|WOL|WOR|WOS|WRN|WSF|WST|WSW|WTL|WTM|WUG|WÜM|WUN|WUR|WZL|ZEL|ZIG)[- ]?(([A-Z][- ]?\\d{1,4})|([A-Z]{2}[- ]?\\d{1,3})))[- ]?(E|H)?$/.test(str);\n  },\n  'de-LI': function deLI(str) {\n    return /^FL[- ]?\\d{1,5}[UZ]?$/.test(str);\n  },\n  'en-IN': function enIN(str) {\n    return /^[A-Z]{2}[ -]?[0-9]{1,2}(?:[ -]?[A-Z])(?:[ -]?[A-Z]*)?[ -]?[0-9]{4}$/.test(str);\n  },\n  'es-AR': function esAR(str) {\n    return /^(([A-Z]{2} ?[0-9]{3} ?[A-Z]{2})|([A-Z]{3} ?[0-9]{3}))$/.test(str);\n  },\n  'fi-FI': function fiFI(str) {\n    return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);\n  },\n  'hu-HU': function huHU(str) {\n    return /^((((?!AAA)(([A-NPRSTVZWXY]{1})([A-PR-Z]{1})([A-HJ-NPR-Z]))|(A[ABC]I)|A[ABC]O|A[A-W]Q|BPI|BPO|UCO|UDO|XAO)-(?!000)\\d{3})|(M\\d{6})|((CK|DT|CD|HC|H[ABEFIKLMNPRSTVX]|MA|OT|R[A-Z]) \\d{2}-\\d{2})|(CD \\d{3}-\\d{3})|(C-(C|X) \\d{4})|(X-(A|B|C) \\d{4})|(([EPVZ]-\\d{5}))|(S A[A-Z]{2} \\d{2})|(SP \\d{2}-\\d{2}))$/.test(str);\n  },\n  'pt-BR': function ptBR(str) {\n    return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);\n  },\n  'pt-PT': function ptPT(str) {\n    return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);\n  },\n  'sq-AL': function sqAL(str) {\n    return /^[A-Z]{2}[- ]?((\\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\\d{3}))$/.test(str);\n  },\n  'sv-SE': function svSE(str) {\n    return /^[A-HJ-PR-UW-Z]{3} ?[\\d]{2}[A-HJ-PR-UW-Z1-9]$|(^[A-ZÅÄÖ ]{2,7}$)/.test(str.trim());\n  },\n  'en-PK': function enPK(str) {\n    return /(^[A-Z]{2}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]{3}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]{4}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]((\\s|-){0,1})[0-9]{4}((\\s|-)[0-9]{2}){0,1}$)/.test(str.trim());\n  }\n};\nexport default function isLicensePlate(str, locale) {\n  assertString(str);\n  if (locale in validators) {\n    return validators[locale](str);\n  } else if (locale === 'any') {\n    for (var key in validators) {\n      /* eslint guard-for-in: 0 */\n      var validator = validators[key];\n      if (validator(str)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}","import merge from './util/merge';\nimport assertString from './util/assertString';\nvar upperCaseRegex = /^[A-Z]$/;\nvar lowerCaseRegex = /^[a-z]$/;\nvar numberRegex = /^[0-9]$/;\nvar symbolRegex = /^[-#!$@£%^&*()_+|~=`{}\\[\\]:\";'<>?,.\\/\\\\ ]$/;\nvar defaultOptions = {\n  minLength: 8,\n  minLowercase: 1,\n  minUppercase: 1,\n  minNumbers: 1,\n  minSymbols: 1,\n  returnScore: false,\n  pointsPerUnique: 1,\n  pointsPerRepeat: 0.5,\n  pointsForContainingLower: 10,\n  pointsForContainingUpper: 10,\n  pointsForContainingNumber: 10,\n  pointsForContainingSymbol: 10\n};\n\n/* Counts number of occurrences of each char in a string\n * could be moved to util/ ?\n*/\nfunction countChars(str) {\n  var result = {};\n  Array.from(str).forEach(function (_char) {\n    var curVal = result[_char];\n    if (curVal) {\n      result[_char] += 1;\n    } else {\n      result[_char] = 1;\n    }\n  });\n  return result;\n}\n\n/* Return information about a password */\nfunction analyzePassword(password) {\n  var charMap = countChars(password);\n  var analysis = {\n    length: password.length,\n    uniqueChars: Object.keys(charMap).length,\n    uppercaseCount: 0,\n    lowercaseCount: 0,\n    numberCount: 0,\n    symbolCount: 0\n  };\n  Object.keys(charMap).forEach(function (_char2) {\n    /* istanbul ignore else */\n    if (upperCaseRegex.test(_char2)) {\n      analysis.uppercaseCount += charMap[_char2];\n    } else if (lowerCaseRegex.test(_char2)) {\n      analysis.lowercaseCount += charMap[_char2];\n    } else if (numberRegex.test(_char2)) {\n      analysis.numberCount += charMap[_char2];\n    } else if (symbolRegex.test(_char2)) {\n      analysis.symbolCount += charMap[_char2];\n    }\n  });\n  return analysis;\n}\nfunction scorePassword(analysis, scoringOptions) {\n  var points = 0;\n  points += analysis.uniqueChars * scoringOptions.pointsPerUnique;\n  points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;\n  if (analysis.lowercaseCount > 0) {\n    points += scoringOptions.pointsForContainingLower;\n  }\n  if (analysis.uppercaseCount > 0) {\n    points += scoringOptions.pointsForContainingUpper;\n  }\n  if (analysis.numberCount > 0) {\n    points += scoringOptions.pointsForContainingNumber;\n  }\n  if (analysis.symbolCount > 0) {\n    points += scoringOptions.pointsForContainingSymbol;\n  }\n  return points;\n}\nexport default function isStrongPassword(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  assertString(str);\n  var analysis = analyzePassword(str);\n  options = merge(options || {}, defaultOptions);\n  if (options.returnScore) {\n    return scorePassword(analysis, options);\n  }\n  return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;\n}","import assertString from './util/assertString';\nimport * as algorithms from './util/algorithms';\nvar AU = function AU(str) {\n  var match = str.match(/^(AU)?(\\d{11})$/);\n  if (!match) {\n    return false;\n  }\n  // @see {@link https://abr.business.gov.au/Help/AbnFormat}\n  var weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];\n  str = str.replace(/^AU/, '');\n  var ABN = (parseInt(str.slice(0, 1), 10) - 1).toString() + str.slice(1);\n  var total = 0;\n  for (var i = 0; i < 11; i++) {\n    total += weights[i] * ABN.charAt(i);\n  }\n  return total !== 0 && total % 89 === 0;\n};\nvar CH = function CH(str) {\n  // @see {@link https://www.ech.ch/de/ech/ech-0097/5.2.0}\n  var hasValidCheckNumber = function hasValidCheckNumber(digits) {\n    var lastDigit = digits.pop(); // used as check number\n    var weights = [5, 4, 3, 2, 7, 6, 5, 4];\n    var calculatedCheckNumber = (11 - digits.reduce(function (acc, el, idx) {\n      return acc + el * weights[idx];\n    }, 0) % 11) % 11;\n    return lastDigit === calculatedCheckNumber;\n  };\n\n  // @see {@link https://www.estv.admin.ch/estv/de/home/mehrwertsteuer/uid/mwst-uid-nummer.html}\n  return /^(CHE[- ]?)?(\\d{9}|(\\d{3}\\.\\d{3}\\.\\d{3})|(\\d{3} \\d{3} \\d{3})) ?(TVA|MWST|IVA)?$/.test(str) && hasValidCheckNumber(str.match(/\\d/g).map(function (el) {\n    return +el;\n  }));\n};\nvar PT = function PT(str) {\n  var match = str.match(/^(PT)?(\\d{9})$/);\n  if (!match) {\n    return false;\n  }\n  var tin = match[2];\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11;\n  if (checksum > 9) {\n    return parseInt(tin[8], 10) === 0;\n  }\n  return checksum === parseInt(tin[8], 10);\n};\nexport var vatMatchers = {\n  /**\r\n   * European Union VAT identification numbers\r\n   */\n  AT: function AT(str) {\n    return /^(AT)?U\\d{8}$/.test(str);\n  },\n  BE: function BE(str) {\n    return /^(BE)?\\d{10}$/.test(str);\n  },\n  BG: function BG(str) {\n    return /^(BG)?\\d{9,10}$/.test(str);\n  },\n  HR: function HR(str) {\n    return /^(HR)?\\d{11}$/.test(str);\n  },\n  CY: function CY(str) {\n    return /^(CY)?\\w{9}$/.test(str);\n  },\n  CZ: function CZ(str) {\n    return /^(CZ)?\\d{8,10}$/.test(str);\n  },\n  DK: function DK(str) {\n    return /^(DK)?\\d{8}$/.test(str);\n  },\n  EE: function EE(str) {\n    return /^(EE)?\\d{9}$/.test(str);\n  },\n  FI: function FI(str) {\n    return /^(FI)?\\d{8}$/.test(str);\n  },\n  FR: function FR(str) {\n    return /^(FR)?\\w{2}\\d{9}$/.test(str);\n  },\n  DE: function DE(str) {\n    return /^(DE)?\\d{9}$/.test(str);\n  },\n  EL: function EL(str) {\n    return /^(EL)?\\d{9}$/.test(str);\n  },\n  HU: function HU(str) {\n    return /^(HU)?\\d{8}$/.test(str);\n  },\n  IE: function IE(str) {\n    return /^(IE)?\\d{7}\\w{1}(W)?$/.test(str);\n  },\n  IT: function IT(str) {\n    return /^(IT)?\\d{11}$/.test(str);\n  },\n  LV: function LV(str) {\n    return /^(LV)?\\d{11}$/.test(str);\n  },\n  LT: function LT(str) {\n    return /^(LT)?\\d{9,12}$/.test(str);\n  },\n  LU: function LU(str) {\n    return /^(LU)?\\d{8}$/.test(str);\n  },\n  MT: function MT(str) {\n    return /^(MT)?\\d{8}$/.test(str);\n  },\n  NL: function NL(str) {\n    return /^(NL)?\\d{9}B\\d{2}$/.test(str);\n  },\n  PL: function PL(str) {\n    return /^(PL)?(\\d{10}|(\\d{3}-\\d{3}-\\d{2}-\\d{2})|(\\d{3}-\\d{2}-\\d{2}-\\d{3}))$/.test(str);\n  },\n  PT: PT,\n  RO: function RO(str) {\n    return /^(RO)?\\d{2,10}$/.test(str);\n  },\n  SK: function SK(str) {\n    return /^(SK)?\\d{10}$/.test(str);\n  },\n  SI: function SI(str) {\n    return /^(SI)?\\d{8}$/.test(str);\n  },\n  ES: function ES(str) {\n    return /^(ES)?\\w\\d{7}[A-Z]$/.test(str);\n  },\n  SE: function SE(str) {\n    return /^(SE)?\\d{12}$/.test(str);\n  },\n  /**\r\n   * VAT numbers of non-EU countries\r\n   */\n  AL: function AL(str) {\n    return /^(AL)?\\w{9}[A-Z]$/.test(str);\n  },\n  MK: function MK(str) {\n    return /^(MK)?\\d{13}$/.test(str);\n  },\n  AU: AU,\n  BY: function BY(str) {\n    return /^(УНП )?\\d{9}$/.test(str);\n  },\n  CA: function CA(str) {\n    return /^(CA)?\\d{9}$/.test(str);\n  },\n  IS: function IS(str) {\n    return /^(IS)?\\d{5,6}$/.test(str);\n  },\n  IN: function IN(str) {\n    return /^(IN)?\\d{15}$/.test(str);\n  },\n  ID: function ID(str) {\n    return /^(ID)?(\\d{15}|(\\d{2}.\\d{3}.\\d{3}.\\d{1}-\\d{3}.\\d{3}))$/.test(str);\n  },\n  IL: function IL(str) {\n    return /^(IL)?\\d{9}$/.test(str);\n  },\n  KZ: function KZ(str) {\n    return /^(KZ)?\\d{12}$/.test(str);\n  },\n  NZ: function NZ(str) {\n    return /^(NZ)?\\d{9}$/.test(str);\n  },\n  NG: function NG(str) {\n    return /^(NG)?(\\d{12}|(\\d{8}-\\d{4}))$/.test(str);\n  },\n  NO: function NO(str) {\n    return /^(NO)?\\d{9}MVA$/.test(str);\n  },\n  PH: function PH(str) {\n    return /^(PH)?(\\d{12}|\\d{3} \\d{3} \\d{3} \\d{3})$/.test(str);\n  },\n  RU: function RU(str) {\n    return /^(RU)?(\\d{10}|\\d{12})$/.test(str);\n  },\n  SM: function SM(str) {\n    return /^(SM)?\\d{5}$/.test(str);\n  },\n  SA: function SA(str) {\n    return /^(SA)?\\d{15}$/.test(str);\n  },\n  RS: function RS(str) {\n    return /^(RS)?\\d{9}$/.test(str);\n  },\n  CH: CH,\n  TR: function TR(str) {\n    return /^(TR)?\\d{10}$/.test(str);\n  },\n  UA: function UA(str) {\n    return /^(UA)?\\d{12}$/.test(str);\n  },\n  GB: function GB(str) {\n    return /^GB((\\d{3} \\d{4} ([0-8][0-9]|9[0-6]))|(\\d{9} \\d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/.test(str);\n  },\n  UZ: function UZ(str) {\n    return /^(UZ)?\\d{9}$/.test(str);\n  },\n  /**\r\n   * VAT numbers of Latin American countries\r\n   */\n  AR: function AR(str) {\n    return /^(AR)?\\d{11}$/.test(str);\n  },\n  BO: function BO(str) {\n    return /^(BO)?\\d{7}$/.test(str);\n  },\n  BR: function BR(str) {\n    return /^(BR)?((\\d{2}.\\d{3}.\\d{3}\\/\\d{4}-\\d{2})|(\\d{3}.\\d{3}.\\d{3}-\\d{2}))$/.test(str);\n  },\n  CL: function CL(str) {\n    return /^(CL)?\\d{8}-\\d{1}$/.test(str);\n  },\n  CO: function CO(str) {\n    return /^(CO)?\\d{10}$/.test(str);\n  },\n  CR: function CR(str) {\n    return /^(CR)?\\d{9,12}$/.test(str);\n  },\n  EC: function EC(str) {\n    return /^(EC)?\\d{13}$/.test(str);\n  },\n  SV: function SV(str) {\n    return /^(SV)?\\d{4}-\\d{6}-\\d{3}-\\d{1}$/.test(str);\n  },\n  GT: function GT(str) {\n    return /^(GT)?\\d{7}-\\d{1}$/.test(str);\n  },\n  HN: function HN(str) {\n    return /^(HN)?$/.test(str);\n  },\n  MX: function MX(str) {\n    return /^(MX)?\\w{3,4}\\d{6}\\w{3}$/.test(str);\n  },\n  NI: function NI(str) {\n    return /^(NI)?\\d{3}-\\d{6}-\\d{4}\\w{1}$/.test(str);\n  },\n  PA: function PA(str) {\n    return /^(PA)?$/.test(str);\n  },\n  PY: function PY(str) {\n    return /^(PY)?\\d{6,8}-\\d{1}$/.test(str);\n  },\n  PE: function PE(str) {\n    return /^(PE)?\\d{11}$/.test(str);\n  },\n  DO: function DO(str) {\n    return /^(DO)?(\\d{11}|(\\d{3}-\\d{7}-\\d{1})|[1,4,5]{1}\\d{8}|([1,4,5]{1})-\\d{2}-\\d{5}-\\d{1})$/.test(str);\n  },\n  UY: function UY(str) {\n    return /^(UY)?\\d{12}$/.test(str);\n  },\n  VE: function VE(str) {\n    return /^(VE)?[J,G,V,E]{1}-(\\d{9}|(\\d{8}-\\d{1}))$/.test(str);\n  }\n};\nexport default function isVAT(str, countryCode) {\n  assertString(str);\n  assertString(countryCode);\n  if (countryCode in vatMatchers) {\n    return vatMatchers[countryCode](str);\n  }\n  throw new Error(\"Invalid country code: '\".concat(countryCode, \"'\"));\n}","import toDate from './lib/toDate';\nimport toFloat from './lib/toFloat';\nimport toInt from './lib/toInt';\nimport toBoolean from './lib/toBoolean';\nimport equals from './lib/equals';\nimport contains from './lib/contains';\nimport matches from './lib/matches';\nimport isEmail from './lib/isEmail';\nimport isURL from './lib/isURL';\nimport isMACAddress from './lib/isMACAddress';\nimport isIP from './lib/isIP';\nimport isIPRange from './lib/isIPRange';\nimport isFQDN from './lib/isFQDN';\nimport isDate from './lib/isDate';\nimport isTime from './lib/isTime';\nimport isBoolean from './lib/isBoolean';\nimport isLocale from './lib/isLocale';\nimport isAbaRouting from './lib/isAbaRouting';\nimport isAlpha, { locales as isAlphaLocales } from './lib/isAlpha';\nimport isAlphanumeric, { locales as isAlphanumericLocales } from './lib/isAlphanumeric';\nimport isNumeric from './lib/isNumeric';\nimport isPassportNumber from './lib/isPassportNumber';\nimport isPort from './lib/isPort';\nimport isLowercase from './lib/isLowercase';\nimport isUppercase from './lib/isUppercase';\nimport isIMEI from './lib/isIMEI';\nimport isAscii from './lib/isAscii';\nimport isFullWidth from './lib/isFullWidth';\nimport isHalfWidth from './lib/isHalfWidth';\nimport isVariableWidth from './lib/isVariableWidth';\nimport isMultibyte from './lib/isMultibyte';\nimport isSemVer from './lib/isSemVer';\nimport isSurrogatePair from './lib/isSurrogatePair';\nimport isInt from './lib/isInt';\nimport isFloat, { locales as isFloatLocales } from './lib/isFloat';\nimport isDecimal from './lib/isDecimal';\nimport isHexadecimal from './lib/isHexadecimal';\nimport isOctal from './lib/isOctal';\nimport isDivisibleBy from './lib/isDivisibleBy';\nimport isHexColor from './lib/isHexColor';\nimport isRgbColor from './lib/isRgbColor';\nimport isHSL from './lib/isHSL';\nimport isISRC from './lib/isISRC';\nimport isIBAN, { locales as ibanLocales } from './lib/isIBAN';\nimport isBIC from './lib/isBIC';\nimport isMD5 from './lib/isMD5';\nimport isHash from './lib/isHash';\nimport isJWT from './lib/isJWT';\nimport isJSON from './lib/isJSON';\nimport isEmpty from './lib/isEmpty';\nimport isLength from './lib/isLength';\nimport isByteLength from './lib/isByteLength';\nimport isUUID from './lib/isUUID';\nimport isMongoId from './lib/isMongoId';\nimport isAfter from './lib/isAfter';\nimport isBefore from './lib/isBefore';\nimport isIn from './lib/isIn';\nimport isLuhnNumber from './lib/isLuhnNumber';\nimport isCreditCard from './lib/isCreditCard';\nimport isIdentityCard from './lib/isIdentityCard';\nimport isEAN from './lib/isEAN';\nimport isISIN from './lib/isISIN';\nimport isISBN from './lib/isISBN';\nimport isISSN from './lib/isISSN';\nimport isTaxID from './lib/isTaxID';\nimport isMobilePhone, { locales as isMobilePhoneLocales } from './lib/isMobilePhone';\nimport isEthereumAddress from './lib/isEthereumAddress';\nimport isCurrency from './lib/isCurrency';\nimport isBtcAddress from './lib/isBtcAddress';\nimport { isISO6346, isFreightContainerID } from './lib/isISO6346';\nimport isISO6391 from './lib/isISO6391';\nimport isISO8601 from './lib/isISO8601';\nimport isRFC3339 from './lib/isRFC3339';\nimport isISO31661Alpha2 from './lib/isISO31661Alpha2';\nimport isISO31661Alpha3 from './lib/isISO31661Alpha3';\nimport isISO4217 from './lib/isISO4217';\nimport isBase32 from './lib/isBase32';\nimport isBase58 from './lib/isBase58';\nimport isBase64 from './lib/isBase64';\nimport isDataURI from './lib/isDataURI';\nimport isMagnetURI from './lib/isMagnetURI';\nimport isMailtoURI from './lib/isMailtoURI';\nimport isMimeType from './lib/isMimeType';\nimport isLatLong from './lib/isLatLong';\nimport isPostalCode, { locales as isPostalCodeLocales } from './lib/isPostalCode';\nimport ltrim from './lib/ltrim';\nimport rtrim from './lib/rtrim';\nimport trim from './lib/trim';\nimport escape from './lib/escape';\nimport unescape from './lib/unescape';\nimport stripLow from './lib/stripLow';\nimport whitelist from './lib/whitelist';\nimport blacklist from './lib/blacklist';\nimport isWhitelisted from './lib/isWhitelisted';\nimport normalizeEmail from './lib/normalizeEmail';\nimport isSlug from './lib/isSlug';\nimport isLicensePlate from './lib/isLicensePlate';\nimport isStrongPassword from './lib/isStrongPassword';\nimport isVAT from './lib/isVAT';\nvar version = '13.12.0';\nvar validator = {\n  version: version,\n  toDate: toDate,\n  toFloat: toFloat,\n  toInt: toInt,\n  toBoolean: toBoolean,\n  equals: equals,\n  contains: contains,\n  matches: matches,\n  isEmail: isEmail,\n  isURL: isURL,\n  isMACAddress: isMACAddress,\n  isIP: isIP,\n  isIPRange: isIPRange,\n  isFQDN: isFQDN,\n  isBoolean: isBoolean,\n  isIBAN: isIBAN,\n  isBIC: isBIC,\n  isAbaRouting: isAbaRouting,\n  isAlpha: isAlpha,\n  isAlphaLocales: isAlphaLocales,\n  isAlphanumeric: isAlphanumeric,\n  isAlphanumericLocales: isAlphanumericLocales,\n  isNumeric: isNumeric,\n  isPassportNumber: isPassportNumber,\n  isPort: isPort,\n  isLowercase: isLowercase,\n  isUppercase: isUppercase,\n  isAscii: isAscii,\n  isFullWidth: isFullWidth,\n  isHalfWidth: isHalfWidth,\n  isVariableWidth: isVariableWidth,\n  isMultibyte: isMultibyte,\n  isSemVer: isSemVer,\n  isSurrogatePair: isSurrogatePair,\n  isInt: isInt,\n  isIMEI: isIMEI,\n  isFloat: isFloat,\n  isFloatLocales: isFloatLocales,\n  isDecimal: isDecimal,\n  isHexadecimal: isHexadecimal,\n  isOctal: isOctal,\n  isDivisibleBy: isDivisibleBy,\n  isHexColor: isHexColor,\n  isRgbColor: isRgbColor,\n  isHSL: isHSL,\n  isISRC: isISRC,\n  isMD5: isMD5,\n  isHash: isHash,\n  isJWT: isJWT,\n  isJSON: isJSON,\n  isEmpty: isEmpty,\n  isLength: isLength,\n  isLocale: isLocale,\n  isByteLength: isByteLength,\n  isUUID: isUUID,\n  isMongoId: isMongoId,\n  isAfter: isAfter,\n  isBefore: isBefore,\n  isIn: isIn,\n  isLuhnNumber: isLuhnNumber,\n  isCreditCard: isCreditCard,\n  isIdentityCard: isIdentityCard,\n  isEAN: isEAN,\n  isISIN: isISIN,\n  isISBN: isISBN,\n  isISSN: isISSN,\n  isMobilePhone: isMobilePhone,\n  isMobilePhoneLocales: isMobilePhoneLocales,\n  isPostalCode: isPostalCode,\n  isPostalCodeLocales: isPostalCodeLocales,\n  isEthereumAddress: isEthereumAddress,\n  isCurrency: isCurrency,\n  isBtcAddress: isBtcAddress,\n  isISO6346: isISO6346,\n  isFreightContainerID: isFreightContainerID,\n  isISO6391: isISO6391,\n  isISO8601: isISO8601,\n  isRFC3339: isRFC3339,\n  isISO31661Alpha2: isISO31661Alpha2,\n  isISO31661Alpha3: isISO31661Alpha3,\n  isISO4217: isISO4217,\n  isBase32: isBase32,\n  isBase58: isBase58,\n  isBase64: isBase64,\n  isDataURI: isDataURI,\n  isMagnetURI: isMagnetURI,\n  isMailtoURI: isMailtoURI,\n  isMimeType: isMimeType,\n  isLatLong: isLatLong,\n  ltrim: ltrim,\n  rtrim: rtrim,\n  trim: trim,\n  escape: escape,\n  unescape: unescape,\n  stripLow: stripLow,\n  whitelist: whitelist,\n  blacklist: blacklist,\n  isWhitelisted: isWhitelisted,\n  normalizeEmail: normalizeEmail,\n  toString: toString,\n  isSlug: isSlug,\n  isStrongPassword: isStrongPassword,\n  isTaxID: isTaxID,\n  isDate: isDate,\n  isTime: isTime,\n  isLicensePlate: isLicensePlate,\n  isVAT: isVAT,\n  ibanLocales: ibanLocales\n};\nexport default validator;","import assertString from './util/assertString';\nexport default function toInt(str, radix) {\n  assertString(str);\n  return parseInt(str, radix || 10);\n}","import assertString from './util/assertString';\nexport default function toBoolean(str, strict) {\n  assertString(str);\n  if (strict) {\n    return str === '1' || /^true$/i.test(str);\n  }\n  return str !== '0' && !/^false$/i.test(str) && str !== '';\n}","import assertString from './util/assertString';\nexport default function equals(str, comparison) {\n  assertString(str);\n  return str === comparison;\n}","import assertString from './util/assertString';\nexport default function matches(str, pattern, modifiers) {\n  assertString(str);\n  if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {\n    pattern = new RegExp(pattern, modifiers);\n  }\n  return !!str.match(pattern);\n}","import isInt from './isInt';\nexport default function isPort(str) {\n  return isInt(str, {\n    allow_leading_zeroes: false,\n    min: 0,\n    max: 65535\n  });\n}","import assertString from './util/assertString';\nexport default function isLowercase(str) {\n  assertString(str);\n  return str === str.toLowerCase();\n}","import assertString from './util/assertString';\nexport default function isUppercase(str) {\n  assertString(str);\n  return str === str.toUpperCase();\n}","import assertString from './util/assertString';\nimport { fullWidth } from './isFullWidth';\nimport { halfWidth } from './isHalfWidth';\nexport default function isVariableWidth(str) {\n  assertString(str);\n  return fullWidth.test(str) && halfWidth.test(str);\n}","var includes = function includes(arr, val) {\n  return arr.some(function (arrVal) {\n    return val === arrVal;\n  });\n};\nexport default includes;","import assertString from './util/assertString';\nimport toFloat from './toFloat';\nexport default function isDivisibleBy(str, num) {\n  assertString(str);\n  return toFloat(str) % parseInt(num, 10) === 0;\n}","import assertString from './util/assertString';\nimport isBase64 from './isBase64';\nexport default function isJWT(str) {\n  assertString(str);\n  var dotSplit = str.split('.');\n  var len = dotSplit.length;\n  if (len !== 3) {\n    return false;\n  }\n  return dotSplit.reduce(function (acc, currElem) {\n    return acc && isBase64(currElem, {\n      urlSafe: true\n    });\n  }, true);\n}","import assertString from './util/assertString';\nimport isHexadecimal from './isHexadecimal';\nexport default function isMongoId(str) {\n  assertString(str);\n  return isHexadecimal(str) && str.length === 24;\n}","import toDate from './toDate';\nexport default function isAfter(date, options) {\n  // For backwards compatibility:\n  // isAfter(str [, date]), i.e. `options` could be used as argument for the legacy `date`\n  var comparisonDate = (options === null || options === void 0 ? void 0 : options.comparisonDate) || options || Date().toString();\n  var comparison = toDate(comparisonDate);\n  var original = toDate(date);\n  return !!(original && comparison && original > comparison);\n}","import assertString from './util/assertString';\nimport toDate from './toDate';\nexport default function isBefore(str) {\n  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());\n  assertString(str);\n  var comparison = toDate(date);\n  var original = toDate(str);\n  return !!(original && comparison && original < comparison);\n}","import assertString from './util/assertString';\nvar issn = '^\\\\d{4}-?\\\\d{3}[\\\\dX]$';\nexport default function isISSN(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  assertString(str);\n  var testIssn = issn;\n  testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;\n  testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');\n  if (!testIssn.test(str)) {\n    return false;\n  }\n  var digits = str.replace('-', '').toUpperCase();\n  var checksum = 0;\n  for (var i = 0; i < digits.length; i++) {\n    var digit = digits[i];\n    checksum += (digit === 'X' ? 10 : +digit) * (8 - i);\n  }\n  return checksum % 11 === 0;\n}","import assertString from './util/assertString';\nexport default function escape(str) {\n  assertString(str);\n  return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\\//g, '&#x2F;').replace(/\\\\/g, '&#x5C;').replace(/`/g, '&#96;');\n}","import assertString from './util/assertString';\nexport default function unescape(str) {\n  assertString(str);\n  return str.replace(/&quot;/g, '\"').replace(/&#x27;/g, \"'\").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\\\').replace(/&#96;/g, '`').replace(/&amp;/g, '&');\n  // &amp; replacement has to be the last one to prevent\n  // bugs with intermediate strings containing escape sequences\n  // See: https://github.com/validatorjs/validator.js/issues/1827\n}","import assertString from './util/assertString';\nimport blacklist from './blacklist';\nexport default function stripLow(str, keep_new_lines) {\n  assertString(str);\n  var chars = keep_new_lines ? '\\\\x00-\\\\x09\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F' : '\\\\x00-\\\\x1F\\\\x7F';\n  return blacklist(str, chars);\n}","import assertString from './util/assertString';\nexport default function whitelist(str, chars) {\n  assertString(str);\n  return str.replace(new RegExp(\"[^\".concat(chars, \"]+\"), 'g'), '');\n}","import assertString from './util/assertString';\nexport default function isWhitelisted(str, chars) {\n  assertString(str);\n  for (var i = str.length - 1; i >= 0; i--) {\n    if (chars.indexOf(str[i]) === -1) {\n      return false;\n    }\n  }\n  return true;\n}","\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _toDate = _interopRequireDefault(require(\"./lib/toDate\"));\nvar _toFloat = _interopRequireDefault(require(\"./lib/toFloat\"));\nvar _toInt = _interopRequireDefault(require(\"./lib/toInt\"));\nvar _toBoolean = _interopRequireDefault(require(\"./lib/toBoolean\"));\nvar _equals = _interopRequireDefault(require(\"./lib/equals\"));\nvar _contains = _interopRequireDefault(require(\"./lib/contains\"));\nvar _matches = _interopRequireDefault(require(\"./lib/matches\"));\nvar _isEmail = _interopRequireDefault(require(\"./lib/isEmail\"));\nvar _isURL = _interopRequireDefault(require(\"./lib/isURL\"));\nvar _isMACAddress = _interopRequireDefault(require(\"./lib/isMACAddress\"));\nvar _isIP = _interopRequireDefault(require(\"./lib/isIP\"));\nvar _isIPRange = _interopRequireDefault(require(\"./lib/isIPRange\"));\nvar _isFQDN = _interopRequireDefault(require(\"./lib/isFQDN\"));\nvar _isDate = _interopRequireDefault(require(\"./lib/isDate\"));\nvar _isTime = _interopRequireDefault(require(\"./lib/isTime\"));\nvar _isBoolean = _interopRequireDefault(require(\"./lib/isBoolean\"));\nvar _isLocale = _interopRequireDefault(require(\"./lib/isLocale\"));\nvar _isAbaRouting = _interopRequireDefault(require(\"./lib/isAbaRouting\"));\nvar _isAlpha = _interopRequireWildcard(require(\"./lib/isAlpha\"));\nvar _isAlphanumeric = _interopRequireWildcard(require(\"./lib/isAlphanumeric\"));\nvar _isNumeric = _interopRequireDefault(require(\"./lib/isNumeric\"));\nvar _isPassportNumber = _interopRequireDefault(require(\"./lib/isPassportNumber\"));\nvar _isPort = _interopRequireDefault(require(\"./lib/isPort\"));\nvar _isLowercase = _interopRequireDefault(require(\"./lib/isLowercase\"));\nvar _isUppercase = _interopRequireDefault(require(\"./lib/isUppercase\"));\nvar _isIMEI = _interopRequireDefault(require(\"./lib/isIMEI\"));\nvar _isAscii = _interopRequireDefault(require(\"./lib/isAscii\"));\nvar _isFullWidth = _interopRequireDefault(require(\"./lib/isFullWidth\"));\nvar _isHalfWidth = _interopRequireDefault(require(\"./lib/isHalfWidth\"));\nvar _isVariableWidth = _interopRequireDefault(require(\"./lib/isVariableWidth\"));\nvar _isMultibyte = _interopRequireDefault(require(\"./lib/isMultibyte\"));\nvar _isSemVer = _interopRequireDefault(require(\"./lib/isSemVer\"));\nvar _isSurrogatePair = _interopRequireDefault(require(\"./lib/isSurrogatePair\"));\nvar _isInt = _interopRequireDefault(require(\"./lib/isInt\"));\nvar _isFloat = _interopRequireWildcard(require(\"./lib/isFloat\"));\nvar _isDecimal = _interopRequireDefault(require(\"./lib/isDecimal\"));\nvar _isHexadecimal = _interopRequireDefault(require(\"./lib/isHexadecimal\"));\nvar _isOctal = _interopRequireDefault(require(\"./lib/isOctal\"));\nvar _isDivisibleBy = _interopRequireDefault(require(\"./lib/isDivisibleBy\"));\nvar _isHexColor = _interopRequireDefault(require(\"./lib/isHexColor\"));\nvar _isRgbColor = _interopRequireDefault(require(\"./lib/isRgbColor\"));\nvar _isHSL = _interopRequireDefault(require(\"./lib/isHSL\"));\nvar _isISRC = _interopRequireDefault(require(\"./lib/isISRC\"));\nvar _isIBAN = _interopRequireWildcard(require(\"./lib/isIBAN\"));\nvar _isBIC = _interopRequireDefault(require(\"./lib/isBIC\"));\nvar _isMD = _interopRequireDefault(require(\"./lib/isMD5\"));\nvar _isHash = _interopRequireDefault(require(\"./lib/isHash\"));\nvar _isJWT = _interopRequireDefault(require(\"./lib/isJWT\"));\nvar _isJSON = _interopRequireDefault(require(\"./lib/isJSON\"));\nvar _isEmpty = _interopRequireDefault(require(\"./lib/isEmpty\"));\nvar _isLength = _interopRequireDefault(require(\"./lib/isLength\"));\nvar _isByteLength = _interopRequireDefault(require(\"./lib/isByteLength\"));\nvar _isUUID = _interopRequireDefault(require(\"./lib/isUUID\"));\nvar _isMongoId = _interopRequireDefault(require(\"./lib/isMongoId\"));\nvar _isAfter = _interopRequireDefault(require(\"./lib/isAfter\"));\nvar _isBefore = _interopRequireDefault(require(\"./lib/isBefore\"));\nvar _isIn = _interopRequireDefault(require(\"./lib/isIn\"));\nvar _isLuhnNumber = _interopRequireDefault(require(\"./lib/isLuhnNumber\"));\nvar _isCreditCard = _interopRequireDefault(require(\"./lib/isCreditCard\"));\nvar _isIdentityCard = _interopRequireDefault(require(\"./lib/isIdentityCard\"));\nvar _isEAN = _interopRequireDefault(require(\"./lib/isEAN\"));\nvar _isISIN = _interopRequireDefault(require(\"./lib/isISIN\"));\nvar _isISBN = _interopRequireDefault(require(\"./lib/isISBN\"));\nvar _isISSN = _interopRequireDefault(require(\"./lib/isISSN\"));\nvar _isTaxID = _interopRequireDefault(require(\"./lib/isTaxID\"));\nvar _isMobilePhone = _interopRequireWildcard(require(\"./lib/isMobilePhone\"));\nvar _isEthereumAddress = _interopRequireDefault(require(\"./lib/isEthereumAddress\"));\nvar _isCurrency = _interopRequireDefault(require(\"./lib/isCurrency\"));\nvar _isBtcAddress = _interopRequireDefault(require(\"./lib/isBtcAddress\"));\nvar _isISO = require(\"./lib/isISO6346\");\nvar _isISO2 = _interopRequireDefault(require(\"./lib/isISO6391\"));\nvar _isISO3 = _interopRequireDefault(require(\"./lib/isISO8601\"));\nvar _isRFC = _interopRequireDefault(require(\"./lib/isRFC3339\"));\nvar _isISO31661Alpha = _interopRequireDefault(require(\"./lib/isISO31661Alpha2\"));\nvar _isISO31661Alpha2 = _interopRequireDefault(require(\"./lib/isISO31661Alpha3\"));\nvar _isISO4 = _interopRequireDefault(require(\"./lib/isISO4217\"));\nvar _isBase = _interopRequireDefault(require(\"./lib/isBase32\"));\nvar _isBase2 = _interopRequireDefault(require(\"./lib/isBase58\"));\nvar _isBase3 = _interopRequireDefault(require(\"./lib/isBase64\"));\nvar _isDataURI = _interopRequireDefault(require(\"./lib/isDataURI\"));\nvar _isMagnetURI = _interopRequireDefault(require(\"./lib/isMagnetURI\"));\nvar _isMailtoURI = _interopRequireDefault(require(\"./lib/isMailtoURI\"));\nvar _isMimeType = _interopRequireDefault(require(\"./lib/isMimeType\"));\nvar _isLatLong = _interopRequireDefault(require(\"./lib/isLatLong\"));\nvar _isPostalCode = _interopRequireWildcard(require(\"./lib/isPostalCode\"));\nvar _ltrim = _interopRequireDefault(require(\"./lib/ltrim\"));\nvar _rtrim = _interopRequireDefault(require(\"./lib/rtrim\"));\nvar _trim = _interopRequireDefault(require(\"./lib/trim\"));\nvar _escape = _interopRequireDefault(require(\"./lib/escape\"));\nvar _unescape = _interopRequireDefault(require(\"./lib/unescape\"));\nvar _stripLow = _interopRequireDefault(require(\"./lib/stripLow\"));\nvar _whitelist = _interopRequireDefault(require(\"./lib/whitelist\"));\nvar _blacklist = _interopRequireDefault(require(\"./lib/blacklist\"));\nvar _isWhitelisted = _interopRequireDefault(require(\"./lib/isWhitelisted\"));\nvar _normalizeEmail = _interopRequireDefault(require(\"./lib/normalizeEmail\"));\nvar _isSlug = _interopRequireDefault(require(\"./lib/isSlug\"));\nvar _isLicensePlate = _interopRequireDefault(require(\"./lib/isLicensePlate\"));\nvar _isStrongPassword = _interopRequireDefault(require(\"./lib/isStrongPassword\"));\nvar _isVAT = _interopRequireDefault(require(\"./lib/isVAT\"));\nfunction _getRequireWildcardCache(e) { if (\"function\" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }\nfunction _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if (\"default\" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar version = '13.12.0';\nvar validator = {\n  version: version,\n  toDate: _toDate.default,\n  toFloat: _toFloat.default,\n  toInt: _toInt.default,\n  toBoolean: _toBoolean.default,\n  equals: _equals.default,\n  contains: _contains.default,\n  matches: _matches.default,\n  isEmail: _isEmail.default,\n  isURL: _isURL.default,\n  isMACAddress: _isMACAddress.default,\n  isIP: _isIP.default,\n  isIPRange: _isIPRange.default,\n  isFQDN: _isFQDN.default,\n  isBoolean: _isBoolean.default,\n  isIBAN: _isIBAN.default,\n  isBIC: _isBIC.default,\n  isAbaRouting: _isAbaRouting.default,\n  isAlpha: _isAlpha.default,\n  isAlphaLocales: _isAlpha.locales,\n  isAlphanumeric: _isAlphanumeric.default,\n  isAlphanumericLocales: _isAlphanumeric.locales,\n  isNumeric: _isNumeric.default,\n  isPassportNumber: _isPassportNumber.default,\n  isPort: _isPort.default,\n  isLowercase: _isLowercase.default,\n  isUppercase: _isUppercase.default,\n  isAscii: _isAscii.default,\n  isFullWidth: _isFullWidth.default,\n  isHalfWidth: _isHalfWidth.default,\n  isVariableWidth: _isVariableWidth.default,\n  isMultibyte: _isMultibyte.default,\n  isSemVer: _isSemVer.default,\n  isSurrogatePair: _isSurrogatePair.default,\n  isInt: _isInt.default,\n  isIMEI: _isIMEI.default,\n  isFloat: _isFloat.default,\n  isFloatLocales: _isFloat.locales,\n  isDecimal: _isDecimal.default,\n  isHexadecimal: _isHexadecimal.default,\n  isOctal: _isOctal.default,\n  isDivisibleBy: _isDivisibleBy.default,\n  isHexColor: _isHexColor.default,\n  isRgbColor: _isRgbColor.default,\n  isHSL: _isHSL.default,\n  isISRC: _isISRC.default,\n  isMD5: _isMD.default,\n  isHash: _isHash.default,\n  isJWT: _isJWT.default,\n  isJSON: _isJSON.default,\n  isEmpty: _isEmpty.default,\n  isLength: _isLength.default,\n  isLocale: _isLocale.default,\n  isByteLength: _isByteLength.default,\n  isUUID: _isUUID.default,\n  isMongoId: _isMongoId.default,\n  isAfter: _isAfter.default,\n  isBefore: _isBefore.default,\n  isIn: _isIn.default,\n  isLuhnNumber: _isLuhnNumber.default,\n  isCreditCard: _isCreditCard.default,\n  isIdentityCard: _isIdentityCard.default,\n  isEAN: _isEAN.default,\n  isISIN: _isISIN.default,\n  isISBN: _isISBN.default,\n  isISSN: _isISSN.default,\n  isMobilePhone: _isMobilePhone.default,\n  isMobilePhoneLocales: _isMobilePhone.locales,\n  isPostalCode: _isPostalCode.default,\n  isPostalCodeLocales: _isPostalCode.locales,\n  isEthereumAddress: _isEthereumAddress.default,\n  isCurrency: _isCurrency.default,\n  isBtcAddress: _isBtcAddress.default,\n  isISO6346: _isISO.isISO6346,\n  isFreightContainerID: _isISO.isFreightContainerID,\n  isISO6391: _isISO2.default,\n  isISO8601: _isISO3.default,\n  isRFC3339: _isRFC.default,\n  isISO31661Alpha2: _isISO31661Alpha.default,\n  isISO31661Alpha3: _isISO31661Alpha2.default,\n  isISO4217: _isISO4.default,\n  isBase32: _isBase.default,\n  isBase58: _isBase2.default,\n  isBase64: _isBase3.default,\n  isDataURI: _isDataURI.default,\n  isMagnetURI: _isMagnetURI.default,\n  isMailtoURI: _isMailtoURI.default,\n  isMimeType: _isMimeType.default,\n  isLatLong: _isLatLong.default,\n  ltrim: _ltrim.default,\n  rtrim: _rtrim.default,\n  trim: _trim.default,\n  escape: _escape.default,\n  unescape: _unescape.default,\n  stripLow: _stripLow.default,\n  whitelist: _whitelist.default,\n  blacklist: _blacklist.default,\n  isWhitelisted: _isWhitelisted.default,\n  normalizeEmail: _normalizeEmail.default,\n  toString: toString,\n  isSlug: _isSlug.default,\n  isStrongPassword: _isStrongPassword.default,\n  isTaxID: _isTaxID.default,\n  isDate: _isDate.default,\n  isTime: _isTime.default,\n  isLicensePlate: _isLicensePlate.default,\n  isVAT: _isVAT.default,\n  ibanLocales: _isIBAN.locales\n};\nvar _default = exports.default = validator;\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.farsiLocales = exports.englishLocales = exports.dotDecimal = exports.decimal = exports.commaDecimal = exports.bengaliLocales = exports.arabicLocales = exports.alphanumeric = exports.alpha = void 0;\nvar alpha = exports.alpha = {\n  'en-US': /^[A-Z]+$/i,\n  'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,\n  'bg-BG': /^[А-Я]+$/i,\n  'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,\n  'da-DK': /^[A-ZÆØÅ]+$/i,\n  'de-DE': /^[A-ZÄÖÜß]+$/i,\n  'el-GR': /^[Α-ώ]+$/i,\n  'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,\n  'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,\n  'fi-FI': /^[A-ZÅÄÖ]+$/i,\n  'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,\n  'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,\n  'ja-JP': /^[ぁ-んァ-ヶｦ-ﾟ一-龠ー・。、]+$/i,\n  'nb-NO': /^[A-ZÆØÅ]+$/i,\n  'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,\n  'nn-NO': /^[A-ZÆØÅ]+$/i,\n  'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,\n  'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,\n  'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,\n  'ru-RU': /^[А-ЯЁ]+$/i,\n  'kk-KZ': /^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]+$/i,\n  'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,\n  'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,\n  'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,\n  'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,\n  'sv-SE': /^[A-ZÅÄÖ]+$/i,\n  'th-TH': /^[ก-๐\\s]+$/i,\n  'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,\n  'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,\n  'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,\n  'ko-KR': /^[ㄱ-ㅎㅏ-ㅣ가-힣]*$/,\n  'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,\n  ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,\n  he: /^[א-ת]+$/,\n  fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,\n  bn: /^['ঀঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣৰৱ৲৳৴৵৶৷৸৹৺৻']+$/,\n  eo: /^[ABCĈD-GĜHĤIJĴK-PRSŜTUŬVZ]+$/i,\n  'hi-IN': /^[\\u0900-\\u0961]+[\\u0972-\\u097F]*$/i,\n  'si-LK': /^[\\u0D80-\\u0DFF]+$/\n};\nvar alphanumeric = exports.alphanumeric = {\n  'en-US': /^[0-9A-Z]+$/i,\n  'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,\n  'bg-BG': /^[0-9А-Я]+$/i,\n  'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,\n  'da-DK': /^[0-9A-ZÆØÅ]+$/i,\n  'de-DE': /^[0-9A-ZÄÖÜß]+$/i,\n  'el-GR': /^[0-9Α-ω]+$/i,\n  'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,\n  'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,\n  'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,\n  'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,\n  'ja-JP': /^[0-9０-９ぁ-んァ-ヶｦ-ﾟ一-龠ー・。、]+$/i,\n  'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,\n  'nb-NO': /^[0-9A-ZÆØÅ]+$/i,\n  'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,\n  'nn-NO': /^[0-9A-ZÆØÅ]+$/i,\n  'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,\n  'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,\n  'ru-RU': /^[0-9А-ЯЁ]+$/i,\n  'kk-KZ': /^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]+$/i,\n  'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,\n  'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,\n  'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,\n  'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,\n  'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,\n  'th-TH': /^[ก-๙\\s]+$/i,\n  'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,\n  'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,\n  'ko-KR': /^[0-9ㄱ-ㅎㅏ-ㅣ가-힣]*$/,\n  'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,\n  'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,\n  ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,\n  he: /^[0-9א-ת]+$/,\n  fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,\n  bn: /^['ঀঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣ০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻']+$/,\n  eo: /^[0-9ABCĈD-GĜHĤIJĴK-PRSŜTUŬVZ]+$/i,\n  'hi-IN': /^[\\u0900-\\u0963]+[\\u0966-\\u097F]*$/i,\n  'si-LK': /^[0-9\\u0D80-\\u0DFF]+$/\n};\nvar decimal = exports.decimal = {\n  'en-US': '.',\n  ar: '٫'\n};\nvar englishLocales = exports.englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];\nfor (var locale, i = 0; i < englishLocales.length; i++) {\n  locale = \"en-\".concat(englishLocales[i]);\n  alpha[locale] = alpha['en-US'];\n  alphanumeric[locale] = alphanumeric['en-US'];\n  decimal[locale] = decimal['en-US'];\n}\n\n// Source: http://www.localeplanet.com/java/\nvar arabicLocales = exports.arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];\nfor (var _locale, _i = 0; _i < arabicLocales.length; _i++) {\n  _locale = \"ar-\".concat(arabicLocales[_i]);\n  alpha[_locale] = alpha.ar;\n  alphanumeric[_locale] = alphanumeric.ar;\n  decimal[_locale] = decimal.ar;\n}\nvar farsiLocales = exports.farsiLocales = ['IR', 'AF'];\nfor (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {\n  _locale2 = \"fa-\".concat(farsiLocales[_i2]);\n  alphanumeric[_locale2] = alphanumeric.fa;\n  decimal[_locale2] = decimal.ar;\n}\nvar bengaliLocales = exports.bengaliLocales = ['BD', 'IN'];\nfor (var _locale3, _i3 = 0; _i3 < bengaliLocales.length; _i3++) {\n  _locale3 = \"bn-\".concat(bengaliLocales[_i3]);\n  alpha[_locale3] = alpha.bn;\n  alphanumeric[_locale3] = alphanumeric.bn;\n  decimal[_locale3] = decimal['en-US'];\n}\n\n// Source: https://en.wikipedia.org/wiki/Decimal_mark\nvar dotDecimal = exports.dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];\nvar commaDecimal = exports.commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'eo', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'kk-KZ', 'si-LK', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];\nfor (var _i4 = 0; _i4 < dotDecimal.length; _i4++) {\n  decimal[dotDecimal[_i4]] = decimal['en-US'];\n}\nfor (var _i5 = 0; _i5 < commaDecimal.length; _i5++) {\n  decimal[commaDecimal[_i5]] = ',';\n}\nalpha['fr-CA'] = alpha['fr-FR'];\nalphanumeric['fr-CA'] = alphanumeric['fr-FR'];\nalpha['pt-BR'] = alpha['pt-PT'];\nalphanumeric['pt-BR'] = alphanumeric['pt-PT'];\ndecimal['pt-BR'] = decimal['pt-PT'];\n\n// see #862\nalpha['pl-Pl'] = alpha['pl-PL'];\nalphanumeric['pl-Pl'] = alphanumeric['pl-PL'];\ndecimal['pl-Pl'] = decimal['pl-PL'];\n\n// see #1455\nalpha['fa-AF'] = alpha.fa;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = blacklist;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction blacklist(str, chars) {\n  (0, _assertString.default)(str);\n  return str.replace(new RegExp(\"[\".concat(chars, \"]+\"), 'g'), '');\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = contains;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _toString = _interopRequireDefault(require(\"./util/toString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar defaulContainsOptions = {\n  ignoreCase: false,\n  minOccurrences: 1\n};\nfunction contains(str, elem, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, defaulContainsOptions);\n  if (options.ignoreCase) {\n    return str.toLowerCase().split((0, _toString.default)(elem).toLowerCase()).length > options.minOccurrences;\n  }\n  return str.split((0, _toString.default)(elem)).length > options.minOccurrences;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = equals;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction equals(str, comparison) {\n  (0, _assertString.default)(str);\n  return str === comparison;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = escape;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction escape(str) {\n  (0, _assertString.default)(str);\n  return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\\//g, '&#x2F;').replace(/\\\\/g, '&#x5C;').replace(/`/g, '&#96;');\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isAbaRouting;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// http://www.brainjar.com/js/validation/\n// https://www.aba.com/news-research/research-analysis/routing-number-policy-procedures\n// series reserved for future use are excluded\nvar isRoutingReg = /^(?!(1[3-9])|(20)|(3[3-9])|(4[0-9])|(5[0-9])|(60)|(7[3-9])|(8[1-9])|(9[0-2])|(9[3-9]))[0-9]{9}$/;\nfunction isAbaRouting(str) {\n  (0, _assertString.default)(str);\n  if (!isRoutingReg.test(str)) return false;\n  var checkSumVal = 0;\n  for (var i = 0; i < str.length; i++) {\n    if (i % 3 === 0) checkSumVal += str[i] * 3;else if (i % 3 === 1) checkSumVal += str[i] * 7;else checkSumVal += str[i] * 1;\n  }\n  return checkSumVal % 10 === 0;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isAfter;\nvar _toDate = _interopRequireDefault(require(\"./toDate\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isAfter(date, options) {\n  // For backwards compatibility:\n  // isAfter(str [, date]), i.e. `options` could be used as argument for the legacy `date`\n  var comparisonDate = (options === null || options === void 0 ? void 0 : options.comparisonDate) || options || Date().toString();\n  var comparison = (0, _toDate.default)(comparisonDate);\n  var original = (0, _toDate.default)(date);\n  return !!(original && comparison && original > comparison);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isAlpha;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _alpha = require(\"./alpha\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isAlpha(_str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  (0, _assertString.default)(_str);\n  var str = _str;\n  var ignore = options.ignore;\n  if (ignore) {\n    if (ignore instanceof RegExp) {\n      str = str.replace(ignore, '');\n    } else if (typeof ignore === 'string') {\n      str = str.replace(new RegExp(\"[\".concat(ignore.replace(/[-[\\]{}()*+?.,\\\\^$|#\\\\s]/g, '\\\\$&'), \"]\"), 'g'), ''); // escape regex for ignore\n    } else {\n      throw new Error('ignore should be instance of a String or RegExp');\n    }\n  }\n  if (locale in _alpha.alpha) {\n    return _alpha.alpha[locale].test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nvar locales = exports.locales = Object.keys(_alpha.alpha);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isAlphanumeric;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _alpha = require(\"./alpha\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isAlphanumeric(_str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  (0, _assertString.default)(_str);\n  var str = _str;\n  var ignore = options.ignore;\n  if (ignore) {\n    if (ignore instanceof RegExp) {\n      str = str.replace(ignore, '');\n    } else if (typeof ignore === 'string') {\n      str = str.replace(new RegExp(\"[\".concat(ignore.replace(/[-[\\]{}()*+?.,\\\\^$|#\\\\s]/g, '\\\\$&'), \"]\"), 'g'), ''); // escape regex for ignore\n    } else {\n      throw new Error('ignore should be instance of a String or RegExp');\n    }\n  }\n  if (locale in _alpha.alphanumeric) {\n    return _alpha.alphanumeric[locale].test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nvar locales = exports.locales = Object.keys(_alpha.alphanumeric);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isAscii;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/* eslint-disable no-control-regex */\nvar ascii = /^[\\x00-\\x7F]+$/;\n/* eslint-enable no-control-regex */\n\nfunction isAscii(str) {\n  (0, _assertString.default)(str);\n  return ascii.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBIC;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isISO31661Alpha = require(\"./isISO31661Alpha2\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// https://en.wikipedia.org/wiki/ISO_9362\nvar isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;\nfunction isBIC(str) {\n  (0, _assertString.default)(str);\n\n  // toUpperCase() should be removed when a new major version goes out that changes\n  // the regex to [A-Z] (per the spec).\n  var countryCode = str.slice(4, 6).toUpperCase();\n  if (!_isISO31661Alpha.CountryCodes.has(countryCode) && countryCode !== 'XK') {\n    return false;\n  }\n  return isBICReg.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBase32;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar base32 = /^[A-Z2-7]+=*$/;\nvar crockfordBase32 = /^[A-HJKMNP-TV-Z0-9]+$/;\nvar defaultBase32Options = {\n  crockford: false\n};\nfunction isBase32(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, defaultBase32Options);\n  if (options.crockford) {\n    return crockfordBase32.test(str);\n  }\n  var len = str.length;\n  if (len % 8 === 0 && base32.test(str)) {\n    return true;\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBase58;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// Accepted chars - 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz\nvar base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;\nfunction isBase58(str) {\n  (0, _assertString.default)(str);\n  if (base58Reg.test(str)) {\n    return true;\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBase64;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar notBase64 = /[^A-Z0-9+\\/=]/i;\nvar urlSafeBase64 = /^[A-Z0-9_\\-]*$/i;\nvar defaultBase64Options = {\n  urlSafe: false\n};\nfunction isBase64(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, defaultBase64Options);\n  var len = str.length;\n  if (options.urlSafe) {\n    return urlSafeBase64.test(str);\n  }\n  if (len % 4 !== 0 || notBase64.test(str)) {\n    return false;\n  }\n  var firstPaddingChar = str.indexOf('=');\n  return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBefore;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _toDate = _interopRequireDefault(require(\"./toDate\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isBefore(str) {\n  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());\n  (0, _assertString.default)(str);\n  var comparison = (0, _toDate.default)(date);\n  var original = (0, _toDate.default)(str);\n  return !!(original && comparison && original < comparison);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBoolean;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar defaultOptions = {\n  loose: false\n};\nvar strictBooleans = ['true', 'false', '1', '0'];\nvar looseBooleans = [].concat(strictBooleans, ['yes', 'no']);\nfunction isBoolean(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;\n  (0, _assertString.default)(str);\n  if (options.loose) {\n    return looseBooleans.includes(str.toLowerCase());\n  }\n  return strictBooleans.includes(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBtcAddress;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar bech32 = /^(bc1)[a-z0-9]{25,39}$/;\nvar base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;\nfunction isBtcAddress(str) {\n  (0, _assertString.default)(str);\n  return bech32.test(str) || base58.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isByteLength;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/* eslint-disable prefer-rest-params */\nfunction isByteLength(str, options) {\n  (0, _assertString.default)(str);\n  var min;\n  var max;\n  if (_typeof(options) === 'object') {\n    min = options.min || 0;\n    max = options.max;\n  } else {\n    // backwards compatibility: isByteLength(str, min [, max])\n    min = arguments[1];\n    max = arguments[2];\n  }\n  var len = encodeURI(str).split(/%..|./).length - 1;\n  return len >= min && (typeof max === 'undefined' || len <= max);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isCreditCard;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isLuhnNumber = _interopRequireDefault(require(\"./isLuhnNumber\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar cards = {\n  amex: /^3[47][0-9]{13}$/,\n  dinersclub: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,\n  discover: /^6(?:011|5[0-9][0-9])[0-9]{12,15}$/,\n  jcb: /^(?:2131|1800|35\\d{3})\\d{11}$/,\n  mastercard: /^5[1-5][0-9]{2}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/,\n  // /^[25][1-7][0-9]{14}$/;\n  unionpay: /^(6[27][0-9]{14}|^(81[0-9]{14,17}))$/,\n  visa: /^(?:4[0-9]{12})(?:[0-9]{3,6})?$/\n};\nvar allCards = function () {\n  var tmpCardsArray = [];\n  for (var cardProvider in cards) {\n    // istanbul ignore else\n    if (cards.hasOwnProperty(cardProvider)) {\n      tmpCardsArray.push(cards[cardProvider]);\n    }\n  }\n  return tmpCardsArray;\n}();\nfunction isCreditCard(card) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  (0, _assertString.default)(card);\n  var provider = options.provider;\n  var sanitized = card.replace(/[- ]+/g, '');\n  if (provider && provider.toLowerCase() in cards) {\n    // specific provider in the list\n    if (!cards[provider.toLowerCase()].test(sanitized)) {\n      return false;\n    }\n  } else if (provider && !(provider.toLowerCase() in cards)) {\n    /* specific provider not in the list */\n    throw new Error(\"\".concat(provider, \" is not a valid credit card provider.\"));\n  } else if (!allCards.some(function (cardProvider) {\n    return cardProvider.test(sanitized);\n  })) {\n    // no specific provider\n    return false;\n  }\n  return (0, _isLuhnNumber.default)(card);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isCurrency;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction currencyRegex(options) {\n  var decimal_digits = \"\\\\d{\".concat(options.digits_after_decimal[0], \"}\");\n  options.digits_after_decimal.forEach(function (digit, index) {\n    if (index !== 0) decimal_digits = \"\".concat(decimal_digits, \"|\\\\d{\").concat(digit, \"}\");\n  });\n  var symbol = \"(\".concat(options.symbol.replace(/\\W/, function (m) {\n      return \"\\\\\".concat(m);\n    }), \")\").concat(options.require_symbol ? '' : '?'),\n    negative = '-?',\n    whole_dollar_amount_without_sep = '[1-9]\\\\d*',\n    whole_dollar_amount_with_sep = \"[1-9]\\\\d{0,2}(\\\\\".concat(options.thousands_separator, \"\\\\d{3})*\"),\n    valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],\n    whole_dollar_amount = \"(\".concat(valid_whole_dollar_amounts.join('|'), \")?\"),\n    decimal_amount = \"(\\\\\".concat(options.decimal_separator, \"(\").concat(decimal_digits, \"))\").concat(options.require_decimal ? '' : '?');\n  var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : '');\n\n  // default is negative sign before symbol, but there are two other options (besides parens)\n  if (options.allow_negatives && !options.parens_for_negatives) {\n    if (options.negative_sign_after_digits) {\n      pattern += negative;\n    } else if (options.negative_sign_before_digits) {\n      pattern = negative + pattern;\n    }\n  }\n\n  // South African Rand, for example, uses R 123 (space) and R-123 (no space)\n  if (options.allow_negative_sign_placeholder) {\n    pattern = \"( (?!\\\\-))?\".concat(pattern);\n  } else if (options.allow_space_after_symbol) {\n    pattern = \" ?\".concat(pattern);\n  } else if (options.allow_space_after_digits) {\n    pattern += '( (?!$))?';\n  }\n  if (options.symbol_after_digits) {\n    pattern += symbol;\n  } else {\n    pattern = symbol + pattern;\n  }\n  if (options.allow_negatives) {\n    if (options.parens_for_negatives) {\n      pattern = \"(\\\\(\".concat(pattern, \"\\\\)|\").concat(pattern, \")\");\n    } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {\n      pattern = negative + pattern;\n    }\n  }\n\n  // ensure there's a dollar and/or decimal amount, and that\n  // it doesn't start with a space or a negative sign followed by a space\n  return new RegExp(\"^(?!-? )(?=.*\\\\d)\".concat(pattern, \"$\"));\n}\nvar default_currency_options = {\n  symbol: '$',\n  require_symbol: false,\n  allow_space_after_symbol: false,\n  symbol_after_digits: false,\n  allow_negatives: true,\n  parens_for_negatives: false,\n  negative_sign_before_digits: false,\n  negative_sign_after_digits: false,\n  allow_negative_sign_placeholder: false,\n  thousands_separator: ',',\n  decimal_separator: '.',\n  allow_decimal: true,\n  require_decimal: false,\n  digits_after_decimal: [2],\n  allow_space_after_digits: false\n};\nfunction isCurrency(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, default_currency_options);\n  return currencyRegex(options).test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isDataURI;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar validMediaType = /^[a-z]+\\/[a-z0-9\\-\\+\\._]+$/i;\nvar validAttribute = /^[a-z\\-]+=[a-z0-9\\-]+$/i;\nvar validData = /^[a-z0-9!\\$&'\\(\\)\\*\\+,;=\\-\\._~:@\\/\\?%\\s]*$/i;\nfunction isDataURI(str) {\n  (0, _assertString.default)(str);\n  var data = str.split(',');\n  if (data.length < 2) {\n    return false;\n  }\n  var attributes = data.shift().trim().split(';');\n  var schemeAndMediaType = attributes.shift();\n  if (schemeAndMediaType.slice(0, 5) !== 'data:') {\n    return false;\n  }\n  var mediaType = schemeAndMediaType.slice(5);\n  if (mediaType !== '' && !validMediaType.test(mediaType)) {\n    return false;\n  }\n  for (var i = 0; i < attributes.length; i++) {\n    if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {\n      return false;\n    }\n  }\n  for (var _i = 0; _i < data.length; _i++) {\n    if (!validData.test(data[_i])) {\n      return false;\n    }\n  }\n  return true;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isDate;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nvar default_date_options = {\n  format: 'YYYY/MM/DD',\n  delimiters: ['/', '-'],\n  strictMode: false\n};\nfunction isValidFormat(format) {\n  return /(^(y{4}|y{2})[.\\/-](m{1,2})[.\\/-](d{1,2})$)|(^(m{1,2})[.\\/-](d{1,2})[.\\/-]((y{4}|y{2})$))|(^(d{1,2})[.\\/-](m{1,2})[.\\/-]((y{4}|y{2})$))/gi.test(format);\n}\nfunction zip(date, format) {\n  var zippedArr = [],\n    len = Math.min(date.length, format.length);\n  for (var i = 0; i < len; i++) {\n    zippedArr.push([date[i], format[i]]);\n  }\n  return zippedArr;\n}\nfunction isDate(input, options) {\n  if (typeof options === 'string') {\n    // Allow backward compatibility for old format isDate(input [, format])\n    options = (0, _merge.default)({\n      format: options\n    }, default_date_options);\n  } else {\n    options = (0, _merge.default)(options, default_date_options);\n  }\n  if (typeof input === 'string' && isValidFormat(options.format)) {\n    var formatDelimiter = options.delimiters.find(function (delimiter) {\n      return options.format.indexOf(delimiter) !== -1;\n    });\n    var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {\n      return input.indexOf(delimiter) !== -1;\n    });\n    var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));\n    var dateObj = {};\n    var _iterator = _createForOfIteratorHelper(dateAndFormat),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var _step$value = _slicedToArray(_step.value, 2),\n          dateWord = _step$value[0],\n          formatWord = _step$value[1];\n        if (dateWord.length !== formatWord.length) {\n          return false;\n        }\n        dateObj[formatWord.charAt(0)] = dateWord;\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n    var fullYear = dateObj.y;\n\n    // Check if the year starts with a hyphen\n    if (fullYear.startsWith('-')) {\n      return false; // Hyphen before year is not allowed\n    }\n    if (dateObj.y.length === 2) {\n      var parsedYear = parseInt(dateObj.y, 10);\n      if (isNaN(parsedYear)) {\n        return false;\n      }\n      var currentYearLastTwoDigits = new Date().getFullYear() % 100;\n      if (parsedYear < currentYearLastTwoDigits) {\n        fullYear = \"20\".concat(dateObj.y);\n      } else {\n        fullYear = \"19\".concat(dateObj.y);\n      }\n    }\n    var month = dateObj.m;\n    if (dateObj.m.length === 1) {\n      month = \"0\".concat(dateObj.m);\n    }\n    var day = dateObj.d;\n    if (dateObj.d.length === 1) {\n      day = \"0\".concat(dateObj.d);\n    }\n    return new Date(\"\".concat(fullYear, \"-\").concat(month, \"-\").concat(day, \"T00:00:00.000Z\")).getUTCDate() === +dateObj.d;\n  }\n  if (!options.strictMode) {\n    return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isDecimal;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _includes = _interopRequireDefault(require(\"./util/includes\"));\nvar _alpha = require(\"./alpha\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction decimalRegExp(options) {\n  var regExp = new RegExp(\"^[-+]?([0-9]+)?(\\\\\".concat(_alpha.decimal[options.locale], \"[0-9]{\").concat(options.decimal_digits, \"})\").concat(options.force_decimal ? '' : '?', \"$\"));\n  return regExp;\n}\nvar default_decimal_options = {\n  force_decimal: false,\n  decimal_digits: '1,',\n  locale: 'en-US'\n};\nvar blacklist = ['', '-', '+'];\nfunction isDecimal(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, default_decimal_options);\n  if (options.locale in _alpha.decimal) {\n    return !(0, _includes.default)(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);\n  }\n  throw new Error(\"Invalid locale '\".concat(options.locale, \"'\"));\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isDivisibleBy;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _toFloat = _interopRequireDefault(require(\"./toFloat\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isDivisibleBy(str, num) {\n  (0, _assertString.default)(str);\n  return (0, _toFloat.default)(str) % parseInt(num, 10) === 0;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isEAN;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/**\n * The most commonly used EAN standard is\n * the thirteen-digit EAN-13, while the\n * less commonly used 8-digit EAN-8 barcode was\n * introduced for use on small packages.\n * Also EAN/UCC-14 is used for Grouping of individual\n * trade items above unit level(Intermediate, Carton or Pallet).\n * For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/\n * EAN consists of:\n * GS1 prefix, manufacturer code, product code and check digit\n * Reference: https://en.wikipedia.org/wiki/International_Article_Number\n * Reference: https://www.gtin.info/\n */\n\n/**\n * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14\n * and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),\n * with exact numberic matching of 8 or 13 or 14 digits [0-9]\n */\nvar LENGTH_EAN_8 = 8;\nvar LENGTH_EAN_14 = 14;\nvar validEanRegex = /^(\\d{8}|\\d{13}|\\d{14})$/;\n\n/**\n * Get position weight given:\n * EAN length and digit index/position\n *\n * @param {number} length\n * @param {number} index\n * @return {number}\n */\nfunction getPositionWeightThroughLengthAndIndex(length, index) {\n  if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {\n    return index % 2 === 0 ? 3 : 1;\n  }\n  return index % 2 === 0 ? 1 : 3;\n}\n\n/**\n * Calculate EAN Check Digit\n * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit\n *\n * @param {string} ean\n * @return {number}\n */\nfunction calculateCheckDigit(ean) {\n  var checksum = ean.slice(0, -1).split('').map(function (char, index) {\n    return Number(char) * getPositionWeightThroughLengthAndIndex(ean.length, index);\n  }).reduce(function (acc, partialSum) {\n    return acc + partialSum;\n  }, 0);\n  var remainder = 10 - checksum % 10;\n  return remainder < 10 ? remainder : 0;\n}\n\n/**\n * Check if string is valid EAN:\n * Matches EAN-8/EAN-13/EAN-14 regex\n * Has valid check digit.\n *\n * @param {string} str\n * @return {boolean}\n */\nfunction isEAN(str) {\n  (0, _assertString.default)(str);\n  var actualCheckDigit = Number(str.slice(-1));\n  return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isEmail;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isByteLength = _interopRequireDefault(require(\"./isByteLength\"));\nvar _isFQDN = _interopRequireDefault(require(\"./isFQDN\"));\nvar _isIP = _interopRequireDefault(require(\"./isIP\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar default_email_options = {\n  allow_display_name: false,\n  allow_underscores: false,\n  require_display_name: false,\n  allow_utf8_local_part: true,\n  require_tld: true,\n  blacklisted_chars: '',\n  ignore_max_length: false,\n  host_blacklist: [],\n  host_whitelist: []\n};\n\n/* eslint-disable max-len */\n/* eslint-disable no-control-regex */\nvar splitNameAddress = /^([^\\x00-\\x1F\\x7F-\\x9F\\cX]+)</i;\nvar emailUserPart = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]+$/i;\nvar gmailUserPart = /^[a-z\\d]+$/;\nvar quotedEmailUser = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]))*$/i;\nvar emailUserUtf8Part = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\u00A1-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+$/i;\nvar quotedEmailUserUtf8 = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))*$/i;\nvar defaultMaxEmailLength = 254;\n/* eslint-enable max-len */\n/* eslint-enable no-control-regex */\n\n/**\n * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2\n * @param {String} display_name\n */\nfunction validateDisplayName(display_name) {\n  var display_name_without_quotes = display_name.replace(/^\"(.+)\"$/, '$1');\n  // display name with only spaces is not valid\n  if (!display_name_without_quotes.trim()) {\n    return false;\n  }\n\n  // check whether display name contains illegal character\n  var contains_illegal = /[\\.\";<>]/.test(display_name_without_quotes);\n  if (contains_illegal) {\n    // if contains illegal characters,\n    // must to be enclosed in double-quotes, otherwise it's not a valid display name\n    if (display_name_without_quotes === display_name) {\n      return false;\n    }\n\n    // the quotes in display name must start with character symbol \\\n    var all_start_with_back_slash = display_name_without_quotes.split('\"').length === display_name_without_quotes.split('\\\\\"').length;\n    if (!all_start_with_back_slash) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction isEmail(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, default_email_options);\n  if (options.require_display_name || options.allow_display_name) {\n    var display_email = str.match(splitNameAddress);\n    if (display_email) {\n      var display_name = display_email[1];\n\n      // Remove display name and angle brackets to get email address\n      // Can be done in the regex but will introduce a ReDOS (See  #1597 for more info)\n      str = str.replace(display_name, '').replace(/(^<|>$)/g, '');\n\n      // sometimes need to trim the last space to get the display name\n      // because there may be a space between display name and email address\n      // eg. myname <address@gmail.com>\n      // the display name is `myname` instead of `myname `, so need to trim the last space\n      if (display_name.endsWith(' ')) {\n        display_name = display_name.slice(0, -1);\n      }\n      if (!validateDisplayName(display_name)) {\n        return false;\n      }\n    } else if (options.require_display_name) {\n      return false;\n    }\n  }\n  if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {\n    return false;\n  }\n  var parts = str.split('@');\n  var domain = parts.pop();\n  var lower_domain = domain.toLowerCase();\n  if (options.host_blacklist.includes(lower_domain)) {\n    return false;\n  }\n  if (options.host_whitelist.length > 0 && !options.host_whitelist.includes(lower_domain)) {\n    return false;\n  }\n  var user = parts.join('@');\n  if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {\n    /*\n      Previously we removed dots for gmail addresses before validating.\n      This was removed because it allows `multiple..dots@gmail.com`\n      to be reported as valid, but it is not.\n      Gmail only normalizes single dots, removing them from here is pointless,\n      should be done in normalizeEmail\n    */\n    user = user.toLowerCase();\n\n    // Removing sub-address from username before gmail validation\n    var username = user.split('+')[0];\n\n    // Dots are not included in gmail length restriction\n    if (!(0, _isByteLength.default)(username.replace(/\\./g, ''), {\n      min: 6,\n      max: 30\n    })) {\n      return false;\n    }\n    var _user_parts = username.split('.');\n    for (var i = 0; i < _user_parts.length; i++) {\n      if (!gmailUserPart.test(_user_parts[i])) {\n        return false;\n      }\n    }\n  }\n  if (options.ignore_max_length === false && (!(0, _isByteLength.default)(user, {\n    max: 64\n  }) || !(0, _isByteLength.default)(domain, {\n    max: 254\n  }))) {\n    return false;\n  }\n  if (!(0, _isFQDN.default)(domain, {\n    require_tld: options.require_tld,\n    ignore_max_length: options.ignore_max_length,\n    allow_underscores: options.allow_underscores\n  })) {\n    if (!options.allow_ip_domain) {\n      return false;\n    }\n    if (!(0, _isIP.default)(domain)) {\n      if (!domain.startsWith('[') || !domain.endsWith(']')) {\n        return false;\n      }\n      var noBracketdomain = domain.slice(1, -1);\n      if (noBracketdomain.length === 0 || !(0, _isIP.default)(noBracketdomain)) {\n        return false;\n      }\n    }\n  }\n  if (user[0] === '\"') {\n    user = user.slice(1, user.length - 1);\n    return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);\n  }\n  var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;\n  var user_parts = user.split('.');\n  for (var _i = 0; _i < user_parts.length; _i++) {\n    if (!pattern.test(user_parts[_i])) {\n      return false;\n    }\n  }\n  if (options.blacklisted_chars) {\n    if (user.search(new RegExp(\"[\".concat(options.blacklisted_chars, \"]+\"), 'g')) !== -1) return false;\n  }\n  return true;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isEmpty;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar default_is_empty_options = {\n  ignore_whitespace: false\n};\nfunction isEmpty(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, default_is_empty_options);\n  return (options.ignore_whitespace ? str.trim().length : str.length) === 0;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isEthereumAddress;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar eth = /^(0x)[0-9a-f]{40}$/i;\nfunction isEthereumAddress(str) {\n  (0, _assertString.default)(str);\n  return eth.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isFQDN;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar default_fqdn_options = {\n  require_tld: true,\n  allow_underscores: false,\n  allow_trailing_dot: false,\n  allow_numeric_tld: false,\n  allow_wildcard: false,\n  ignore_max_length: false\n};\nfunction isFQDN(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, default_fqdn_options);\n\n  /* Remove the optional trailing dot before checking validity */\n  if (options.allow_trailing_dot && str[str.length - 1] === '.') {\n    str = str.substring(0, str.length - 1);\n  }\n\n  /* Remove the optional wildcard before checking validity */\n  if (options.allow_wildcard === true && str.indexOf('*.') === 0) {\n    str = str.substring(2);\n  }\n  var parts = str.split('.');\n  var tld = parts[parts.length - 1];\n  if (options.require_tld) {\n    // disallow fqdns without tld\n    if (parts.length < 2) {\n      return false;\n    }\n    if (!options.allow_numeric_tld && !/^([a-z\\u00A1-\\u00A8\\u00AA-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {\n      return false;\n    }\n\n    // disallow spaces\n    if (/\\s/.test(tld)) {\n      return false;\n    }\n  }\n\n  // reject numeric TLDs\n  if (!options.allow_numeric_tld && /^\\d+$/.test(tld)) {\n    return false;\n  }\n  return parts.every(function (part) {\n    if (part.length > 63 && !options.ignore_max_length) {\n      return false;\n    }\n    if (!/^[a-z_\\u00a1-\\uffff0-9-]+$/i.test(part)) {\n      return false;\n    }\n\n    // disallow full-width chars\n    if (/[\\uff01-\\uff5e]/.test(part)) {\n      return false;\n    }\n\n    // disallow parts starting or ending with hyphen\n    if (/^-|-$/.test(part)) {\n      return false;\n    }\n    if (!options.allow_underscores && /_/.test(part)) {\n      return false;\n    }\n    return true;\n  });\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isFloat;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _alpha = require(\"./alpha\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isFloat(str, options) {\n  (0, _assertString.default)(str);\n  options = options || {};\n  var float = new RegExp(\"^(?:[-+])?(?:[0-9]+)?(?:\\\\\".concat(options.locale ? _alpha.decimal[options.locale] : '.', \"[0-9]*)?(?:[eE][\\\\+\\\\-]?(?:[0-9]+))?$\"));\n  if (str === '' || str === '.' || str === ',' || str === '-' || str === '+') {\n    return false;\n  }\n  var value = parseFloat(str.replace(',', '.'));\n  return float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);\n}\nvar locales = exports.locales = Object.keys(_alpha.decimal);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isFullWidth;\nexports.fullWidth = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar fullWidth = exports.fullWidth = /[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]/;\nfunction isFullWidth(str) {\n  (0, _assertString.default)(str);\n  return fullWidth.test(str);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isHSL;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar hslComma = /^hsla?\\(((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%){2}(,((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%?))?\\)$/i;\nvar hslSpace = /^hsla?\\(((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?))(deg|grad|rad|turn)?(\\s(\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%){2}\\s?(\\/\\s((\\+|\\-)?([0-9]+(\\.[0-9]+)?(e(\\+|\\-)?[0-9]+)?|\\.[0-9]+(e(\\+|\\-)?[0-9]+)?)%?)\\s?)?\\)$/i;\nfunction isHSL(str) {\n  (0, _assertString.default)(str);\n\n  // Strip duplicate spaces before calling the validation regex (See  #1598 for more info)\n  var strippedStr = str.replace(/\\s+/g, ' ').replace(/\\s?(hsla?\\(|\\)|,)\\s?/ig, '$1');\n  if (strippedStr.indexOf(',') !== -1) {\n    return hslComma.test(strippedStr);\n  }\n  return hslSpace.test(strippedStr);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isHalfWidth;\nexports.halfWidth = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar halfWidth = exports.halfWidth = /[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]/;\nfunction isHalfWidth(str) {\n  (0, _assertString.default)(str);\n  return halfWidth.test(str);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isHash;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar lengths = {\n  md5: 32,\n  md4: 32,\n  sha1: 40,\n  sha256: 64,\n  sha384: 96,\n  sha512: 128,\n  ripemd128: 32,\n  ripemd160: 40,\n  tiger128: 32,\n  tiger160: 40,\n  tiger192: 48,\n  crc32: 8,\n  crc32b: 8\n};\nfunction isHash(str, algorithm) {\n  (0, _assertString.default)(str);\n  var hash = new RegExp(\"^[a-fA-F0-9]{\".concat(lengths[algorithm], \"}$\"));\n  return hash.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isHexColor;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;\nfunction isHexColor(str) {\n  (0, _assertString.default)(str);\n  return hexcolor.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isHexadecimal;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;\nfunction isHexadecimal(str) {\n  (0, _assertString.default)(str);\n  return hexadecimal.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIBAN;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/**\n * List of country codes with\n * corresponding IBAN regular expression\n * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n */\nvar ibanRegexThroughCountryCode = {\n  AD: /^(AD[0-9]{2})\\d{8}[A-Z0-9]{12}$/,\n  AE: /^(AE[0-9]{2})\\d{3}\\d{16}$/,\n  AL: /^(AL[0-9]{2})\\d{8}[A-Z0-9]{16}$/,\n  AT: /^(AT[0-9]{2})\\d{16}$/,\n  AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  BA: /^(BA[0-9]{2})\\d{16}$/,\n  BE: /^(BE[0-9]{2})\\d{12}$/,\n  BG: /^(BG[0-9]{2})[A-Z]{4}\\d{6}[A-Z0-9]{8}$/,\n  BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,\n  BR: /^(BR[0-9]{2})\\d{23}[A-Z]{1}[A-Z0-9]{1}$/,\n  BY: /^(BY[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  CH: /^(CH[0-9]{2})\\d{5}[A-Z0-9]{12}$/,\n  CR: /^(CR[0-9]{2})\\d{18}$/,\n  CY: /^(CY[0-9]{2})\\d{8}[A-Z0-9]{16}$/,\n  CZ: /^(CZ[0-9]{2})\\d{20}$/,\n  DE: /^(DE[0-9]{2})\\d{18}$/,\n  DK: /^(DK[0-9]{2})\\d{14}$/,\n  DO: /^(DO[0-9]{2})[A-Z]{4}\\d{20}$/,\n  DZ: /^(DZ\\d{24})$/,\n  EE: /^(EE[0-9]{2})\\d{16}$/,\n  EG: /^(EG[0-9]{2})\\d{25}$/,\n  ES: /^(ES[0-9]{2})\\d{20}$/,\n  FI: /^(FI[0-9]{2})\\d{14}$/,\n  FO: /^(FO[0-9]{2})\\d{14}$/,\n  FR: /^(FR[0-9]{2})\\d{10}[A-Z0-9]{11}\\d{2}$/,\n  GB: /^(GB[0-9]{2})[A-Z]{4}\\d{14}$/,\n  GE: /^(GE[0-9]{2})[A-Z0-9]{2}\\d{16}$/,\n  GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,\n  GL: /^(GL[0-9]{2})\\d{14}$/,\n  GR: /^(GR[0-9]{2})\\d{7}[A-Z0-9]{16}$/,\n  GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,\n  HR: /^(HR[0-9]{2})\\d{17}$/,\n  HU: /^(HU[0-9]{2})\\d{24}$/,\n  IE: /^(IE[0-9]{2})[A-Z0-9]{4}\\d{14}$/,\n  IL: /^(IL[0-9]{2})\\d{19}$/,\n  IQ: /^(IQ[0-9]{2})[A-Z]{4}\\d{15}$/,\n  IR: /^(IR[0-9]{2})0\\d{2}0\\d{18}$/,\n  IS: /^(IS[0-9]{2})\\d{22}$/,\n  IT: /^(IT[0-9]{2})[A-Z]{1}\\d{10}[A-Z0-9]{12}$/,\n  JO: /^(JO[0-9]{2})[A-Z]{4}\\d{22}$/,\n  KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,\n  KZ: /^(KZ[0-9]{2})\\d{3}[A-Z0-9]{13}$/,\n  LB: /^(LB[0-9]{2})\\d{4}[A-Z0-9]{20}$/,\n  LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,\n  LI: /^(LI[0-9]{2})\\d{5}[A-Z0-9]{12}$/,\n  LT: /^(LT[0-9]{2})\\d{16}$/,\n  LU: /^(LU[0-9]{2})\\d{3}[A-Z0-9]{13}$/,\n  LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,\n  MA: /^(MA[0-9]{26})$/,\n  MC: /^(MC[0-9]{2})\\d{10}[A-Z0-9]{11}\\d{2}$/,\n  MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,\n  ME: /^(ME[0-9]{2})\\d{18}$/,\n  MK: /^(MK[0-9]{2})\\d{3}[A-Z0-9]{10}\\d{2}$/,\n  MR: /^(MR[0-9]{2})\\d{23}$/,\n  MT: /^(MT[0-9]{2})[A-Z]{4}\\d{5}[A-Z0-9]{18}$/,\n  MU: /^(MU[0-9]{2})[A-Z]{4}\\d{19}[A-Z]{3}$/,\n  MZ: /^(MZ[0-9]{2})\\d{21}$/,\n  NL: /^(NL[0-9]{2})[A-Z]{4}\\d{10}$/,\n  NO: /^(NO[0-9]{2})\\d{11}$/,\n  PK: /^(PK[0-9]{2})[A-Z0-9]{4}\\d{16}$/,\n  PL: /^(PL[0-9]{2})\\d{24}$/,\n  PS: /^(PS[0-9]{2})[A-Z0-9]{4}\\d{21}$/,\n  PT: /^(PT[0-9]{2})\\d{21}$/,\n  QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,\n  RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,\n  RS: /^(RS[0-9]{2})\\d{18}$/,\n  SA: /^(SA[0-9]{2})\\d{2}[A-Z0-9]{18}$/,\n  SC: /^(SC[0-9]{2})[A-Z]{4}\\d{20}[A-Z]{3}$/,\n  SE: /^(SE[0-9]{2})\\d{20}$/,\n  SI: /^(SI[0-9]{2})\\d{15}$/,\n  SK: /^(SK[0-9]{2})\\d{20}$/,\n  SM: /^(SM[0-9]{2})[A-Z]{1}\\d{10}[A-Z0-9]{12}$/,\n  SV: /^(SV[0-9]{2})[A-Z0-9]{4}\\d{20}$/,\n  TL: /^(TL[0-9]{2})\\d{19}$/,\n  TN: /^(TN[0-9]{2})\\d{20}$/,\n  TR: /^(TR[0-9]{2})\\d{5}[A-Z0-9]{17}$/,\n  UA: /^(UA[0-9]{2})\\d{6}[A-Z0-9]{19}$/,\n  VA: /^(VA[0-9]{2})\\d{18}$/,\n  VG: /^(VG[0-9]{2})[A-Z0-9]{4}\\d{16}$/,\n  XK: /^(XK[0-9]{2})\\d{16}$/\n};\n\n/**\n * Check if the country codes passed are valid using the\n * ibanRegexThroughCountryCode as a reference\n *\n * @param {array} countryCodeArray\n * @return {boolean}\n */\n\nfunction hasOnlyValidCountryCodes(countryCodeArray) {\n  var countryCodeArrayFilteredWithObjectIbanCode = countryCodeArray.filter(function (countryCode) {\n    return !(countryCode in ibanRegexThroughCountryCode);\n  });\n  if (countryCodeArrayFilteredWithObjectIbanCode.length > 0) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * Check whether string has correct universal IBAN format\n * The IBAN consists of up to 34 alphanumeric characters, as follows:\n * Country Code using ISO 3166-1 alpha-2, two letters\n * check digits, two digits and\n * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.\n * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]\n *\n * @param {string} str - string under validation\n * @param {object} options - object to pass the countries to be either whitelisted or blacklisted\n * @return {boolean}\n */\nfunction hasValidIbanFormat(str, options) {\n  // Strip white spaces and hyphens\n  var strippedStr = str.replace(/[\\s\\-]+/gi, '').toUpperCase();\n  var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();\n  var isoCountryCodeInIbanRegexCodeObject = (isoCountryCode in ibanRegexThroughCountryCode);\n  if (options.whitelist) {\n    if (!hasOnlyValidCountryCodes(options.whitelist)) {\n      return false;\n    }\n    var isoCountryCodeInWhiteList = options.whitelist.includes(isoCountryCode);\n    if (!isoCountryCodeInWhiteList) {\n      return false;\n    }\n  }\n  if (options.blacklist) {\n    var isoCountryCodeInBlackList = options.blacklist.includes(isoCountryCode);\n    if (isoCountryCodeInBlackList) {\n      return false;\n    }\n  }\n  return isoCountryCodeInIbanRegexCodeObject && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);\n}\n\n/**\n   * Check whether string has valid IBAN Checksum\n   * by performing basic mod-97 operation and\n   * the remainder should equal 1\n   * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string\n   * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35\n   * -- Interpret the string as a decimal integer and\n   * -- compute the remainder on division by 97 (mod 97)\n   * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n   *\n   * @param {string} str\n   * @return {boolean}\n   */\nfunction hasValidIbanChecksum(str) {\n  var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic\n  var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);\n  var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (char) {\n    return char.charCodeAt(0) - 55;\n  });\n  var remainder = alphaCapsReplacedWithDigits.match(/\\d{1,7}/g).reduce(function (acc, value) {\n    return Number(acc + value) % 97;\n  }, '');\n  return remainder === 1;\n}\nfunction isIBAN(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  (0, _assertString.default)(str);\n  return hasValidIbanFormat(str, options) && hasValidIbanChecksum(str);\n}\nvar locales = exports.locales = Object.keys(ibanRegexThroughCountryCode);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIMEI;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar imeiRegexWithoutHypens = /^[0-9]{15}$/;\nvar imeiRegexWithHypens = /^\\d{2}-\\d{6}-\\d{6}-\\d{1}$/;\nfunction isIMEI(str, options) {\n  (0, _assertString.default)(str);\n  options = options || {};\n\n  // default regex for checking imei is the one without hyphens\n\n  var imeiRegex = imeiRegexWithoutHypens;\n  if (options.allow_hyphens) {\n    imeiRegex = imeiRegexWithHypens;\n  }\n  if (!imeiRegex.test(str)) {\n    return false;\n  }\n  str = str.replace(/-/g, '');\n  var sum = 0,\n    mul = 2,\n    l = 14;\n  for (var i = 0; i < l; i++) {\n    var digit = str.substring(l - i - 1, l - i);\n    var tp = parseInt(digit, 10) * mul;\n    if (tp >= 10) {\n      sum += tp % 10 + 1;\n    } else {\n      sum += tp;\n    }\n    if (mul === 1) {\n      mul += 1;\n    } else {\n      mul -= 1;\n    }\n  }\n  var chk = (10 - sum % 10) % 10;\n  if (chk !== parseInt(str.substring(14, 15), 10)) {\n    return false;\n  }\n  return true;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIP;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/**\n11.3.  Examples\n\n   The following addresses\n\n             fe80::1234 (on the 1st link of the node)\n             ff02::5678 (on the 5th link of the node)\n             ff08::9abc (on the 10th organization of the node)\n\n   would be represented as follows:\n\n             fe80::1234%1\n             ff02::5678%5\n             ff08::9abc%10\n\n   (Here we assume a natural translation from a zone index to the\n   <zone_id> part, where the Nth zone of any scope is translated into\n   \"N\".)\n\n   If we use interface names as <zone_id>, those addresses could also be\n   represented as follows:\n\n            fe80::1234%ne0\n            ff02::5678%pvc1.3\n            ff08::9abc%interface10\n\n   where the interface \"ne0\" belongs to the 1st link, \"pvc1.3\" belongs\n   to the 5th link, and \"interface10\" belongs to the 10th organization.\n * * */\nvar IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';\nvar IPv4AddressFormat = \"(\".concat(IPv4SegmentFormat, \"[.]){3}\").concat(IPv4SegmentFormat);\nvar IPv4AddressRegExp = new RegExp(\"^\".concat(IPv4AddressFormat, \"$\"));\nvar IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';\nvar IPv6AddressRegExp = new RegExp('^(' + \"(?:\".concat(IPv6SegmentFormat, \":){7}(?:\").concat(IPv6SegmentFormat, \"|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){6}(?:\").concat(IPv4AddressFormat, \"|:\").concat(IPv6SegmentFormat, \"|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){5}(?::\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,2}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){4}(?:(:\").concat(IPv6SegmentFormat, \"){0,1}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,3}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){3}(?:(:\").concat(IPv6SegmentFormat, \"){0,2}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,4}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){2}(?:(:\").concat(IPv6SegmentFormat, \"){0,3}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,5}|:)|\") + \"(?:\".concat(IPv6SegmentFormat, \":){1}(?:(:\").concat(IPv6SegmentFormat, \"){0,4}:\").concat(IPv4AddressFormat, \"|(:\").concat(IPv6SegmentFormat, \"){1,6}|:)|\") + \"(?::((?::\".concat(IPv6SegmentFormat, \"){0,5}:\").concat(IPv4AddressFormat, \"|(?::\").concat(IPv6SegmentFormat, \"){1,7}|:))\") + ')(%[0-9a-zA-Z-.:]{1,})?$');\nfunction isIP(str) {\n  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  (0, _assertString.default)(str);\n  version = String(version);\n  if (!version) {\n    return isIP(str, 4) || isIP(str, 6);\n  }\n  if (version === '4') {\n    return IPv4AddressRegExp.test(str);\n  }\n  if (version === '6') {\n    return IPv6AddressRegExp.test(str);\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIPRange;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isIP = _interopRequireDefault(require(\"./isIP\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar subnetMaybe = /^\\d{1,3}$/;\nvar v4Subnet = 32;\nvar v6Subnet = 128;\nfunction isIPRange(str) {\n  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  (0, _assertString.default)(str);\n  var parts = str.split('/');\n\n  // parts[0] -> ip, parts[1] -> subnet\n  if (parts.length !== 2) {\n    return false;\n  }\n  if (!subnetMaybe.test(parts[1])) {\n    return false;\n  }\n\n  // Disallow preceding 0 i.e. 01, 02, ...\n  if (parts[1].length > 1 && parts[1].startsWith('0')) {\n    return false;\n  }\n  var isValidIP = (0, _isIP.default)(parts[0], version);\n  if (!isValidIP) {\n    return false;\n  }\n\n  // Define valid subnet according to IP's version\n  var expectedSubnet = null;\n  switch (String(version)) {\n    case '4':\n      expectedSubnet = v4Subnet;\n      break;\n    case '6':\n      expectedSubnet = v6Subnet;\n      break;\n    default:\n      expectedSubnet = (0, _isIP.default)(parts[0], '6') ? v6Subnet : v4Subnet;\n  }\n  return parts[1] <= expectedSubnet && parts[1] >= 0;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISBN;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar possibleIsbn10 = /^(?:[0-9]{9}X|[0-9]{10})$/;\nvar possibleIsbn13 = /^(?:[0-9]{13})$/;\nvar factor = [1, 3];\nfunction isISBN(isbn, options) {\n  (0, _assertString.default)(isbn);\n\n  // For backwards compatibility:\n  // isISBN(str [, version]), i.e. `options` could be used as argument for the legacy `version`\n  var version = String((options === null || options === void 0 ? void 0 : options.version) || options);\n  if (!(options !== null && options !== void 0 && options.version || options)) {\n    return isISBN(isbn, {\n      version: 10\n    }) || isISBN(isbn, {\n      version: 13\n    });\n  }\n  var sanitizedIsbn = isbn.replace(/[\\s-]+/g, '');\n  var checksum = 0;\n  if (version === '10') {\n    if (!possibleIsbn10.test(sanitizedIsbn)) {\n      return false;\n    }\n    for (var i = 0; i < version - 1; i++) {\n      checksum += (i + 1) * sanitizedIsbn.charAt(i);\n    }\n    if (sanitizedIsbn.charAt(9) === 'X') {\n      checksum += 10 * 10;\n    } else {\n      checksum += 10 * sanitizedIsbn.charAt(9);\n    }\n    if (checksum % 11 === 0) {\n      return true;\n    }\n  } else if (version === '13') {\n    if (!possibleIsbn13.test(sanitizedIsbn)) {\n      return false;\n    }\n    for (var _i = 0; _i < 12; _i++) {\n      checksum += factor[_i % 2] * sanitizedIsbn.charAt(_i);\n    }\n    if (sanitizedIsbn.charAt(12) - (10 - checksum % 10) % 10 === 0) {\n      return true;\n    }\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISIN;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;\n\n// this link details how the check digit is calculated:\n// https://www.isin.org/isin-format/. it is a little bit\n// odd in that it works with digits, not numbers. in order\n// to make only one pass through the ISIN characters, the\n// each alpha character is handled as 2 characters within\n// the loop.\n\nfunction isISIN(str) {\n  (0, _assertString.default)(str);\n  if (!isin.test(str)) {\n    return false;\n  }\n  var double = true;\n  var sum = 0;\n  // convert values\n  for (var i = str.length - 2; i >= 0; i--) {\n    if (str[i] >= 'A' && str[i] <= 'Z') {\n      var value = str[i].charCodeAt(0) - 55;\n      var lo = value % 10;\n      var hi = Math.trunc(value / 10);\n      // letters have two digits, so handle the low order\n      // and high order digits separately.\n      for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {\n        var digit = _arr[_i];\n        if (double) {\n          if (digit >= 5) {\n            sum += 1 + (digit - 5) * 2;\n          } else {\n            sum += digit * 2;\n          }\n        } else {\n          sum += digit;\n        }\n        double = !double;\n      }\n    } else {\n      var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);\n      if (double) {\n        if (_digit >= 5) {\n          sum += 1 + (_digit - 5) * 2;\n        } else {\n          sum += _digit * 2;\n        }\n      } else {\n        sum += _digit;\n      }\n      double = !double;\n    }\n  }\n  var check = Math.trunc((sum + 9) / 10) * 10 - sum;\n  return +str[str.length - 1] === check;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CountryCodes = void 0;\nexports.default = isISO31661Alpha2;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\nvar validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);\nfunction isISO31661Alpha2(str) {\n  (0, _assertString.default)(str);\n  return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());\n}\nvar CountryCodes = exports.CountryCodes = validISO31661Alpha2CountriesCodes;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISO31661Alpha3;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3\nvar validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);\nfunction isISO31661Alpha3(str) {\n  (0, _assertString.default)(str);\n  return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CurrencyCodes = void 0;\nexports.default = isISO4217;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// from https://en.wikipedia.org/wiki/ISO_4217\nvar validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLE', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);\nfunction isISO4217(str) {\n  (0, _assertString.default)(str);\n  return validISO4217CurrencyCodes.has(str.toUpperCase());\n}\nvar CurrencyCodes = exports.CurrencyCodes = validISO4217CurrencyCodes;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isFreightContainerID = void 0;\nexports.isISO6346 = isISO6346;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// https://en.wikipedia.org/wiki/ISO_6346\n// according to ISO6346 standard, checksum digit is mandatory for freight container but recommended\n// for other container types (J and Z)\nvar isISO6346Str = /^[A-Z]{3}(U[0-9]{7})|([J,Z][0-9]{6,7})$/;\nvar isDigit = /^[0-9]$/;\nfunction isISO6346(str) {\n  (0, _assertString.default)(str);\n  str = str.toUpperCase();\n  if (!isISO6346Str.test(str)) return false;\n  if (str.length === 11) {\n    var sum = 0;\n    for (var i = 0; i < str.length - 1; i++) {\n      if (!isDigit.test(str[i])) {\n        var convertedCode = void 0;\n        var letterCode = str.charCodeAt(i) - 55;\n        if (letterCode < 11) convertedCode = letterCode;else if (letterCode >= 11 && letterCode <= 20) convertedCode = 12 + letterCode % 11;else if (letterCode >= 21 && letterCode <= 30) convertedCode = 23 + letterCode % 21;else convertedCode = 34 + letterCode % 31;\n        sum += convertedCode * Math.pow(2, i);\n      } else sum += str[i] * Math.pow(2, i);\n    }\n    var checkSumDigit = sum % 11;\n    return Number(str[str.length - 1]) === checkSumDigit;\n  }\n  return true;\n}\nvar isFreightContainerID = exports.isFreightContainerID = isISO6346;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISO6391;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar isISO6391Set = new Set(['aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu']);\nfunction isISO6391(str) {\n  (0, _assertString.default)(str);\n  return isISO6391Set.has(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISO8601;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/* eslint-disable max-len */\n// from http://goo.gl/0ejHHW\nvar iso8601 = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\n// same as above, except with a strict 'T' separator between date and time\nvar iso8601StrictSeparator = /^([\\+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\n/* eslint-enable max-len */\nvar isValidDate = function isValidDate(str) {\n  // str must have passed the ISO8601 check\n  // this check is meant to catch invalid dates\n  // like 2009-02-31\n  // first check for ordinal dates\n  var ordinalMatch = str.match(/^(\\d{4})-?(\\d{3})([ T]{1}\\.*|$)/);\n  if (ordinalMatch) {\n    var oYear = Number(ordinalMatch[1]);\n    var oDay = Number(ordinalMatch[2]);\n    // if is leap year\n    if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;\n    return oDay <= 365;\n  }\n  var match = str.match(/(\\d{4})-?(\\d{0,2})-?(\\d*)/).map(Number);\n  var year = match[1];\n  var month = match[2];\n  var day = match[3];\n  var monthString = month ? \"0\".concat(month).slice(-2) : month;\n  var dayString = day ? \"0\".concat(day).slice(-2) : day;\n\n  // create a date object and compare\n  var d = new Date(\"\".concat(year, \"-\").concat(monthString || '01', \"-\").concat(dayString || '01'));\n  if (month && day) {\n    return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;\n  }\n  return true;\n};\nfunction isISO8601(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  (0, _assertString.default)(str);\n  var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);\n  if (check && options.strict) return isValidDate(str);\n  return check;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISRC;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// see http://isrc.ifpi.org/en/isrc-standard/code-syntax\nvar isrc = /^[A-Z]{2}[0-9A-Z]{3}\\d{2}\\d{5}$/;\nfunction isISRC(str) {\n  (0, _assertString.default)(str);\n  return isrc.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isISSN;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar issn = '^\\\\d{4}-?\\\\d{3}[\\\\dX]$';\nfunction isISSN(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  (0, _assertString.default)(str);\n  var testIssn = issn;\n  testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;\n  testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');\n  if (!testIssn.test(str)) {\n    return false;\n  }\n  var digits = str.replace('-', '').toUpperCase();\n  var checksum = 0;\n  for (var i = 0; i < digits.length; i++) {\n    var digit = digits[i];\n    checksum += (digit === 'X' ? 10 : +digit) * (8 - i);\n  }\n  return checksum % 11 === 0;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIdentityCard;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isInt = _interopRequireDefault(require(\"./isInt\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar validators = {\n  PL: function PL(str) {\n    (0, _assertString.default)(str);\n    var weightOfDigits = {\n      1: 1,\n      2: 3,\n      3: 7,\n      4: 9,\n      5: 1,\n      6: 3,\n      7: 7,\n      8: 9,\n      9: 1,\n      10: 3,\n      11: 0\n    };\n    if (str != null && str.length === 11 && (0, _isInt.default)(str, {\n      allow_leading_zeroes: true\n    })) {\n      var digits = str.split('').slice(0, -1);\n      var sum = digits.reduce(function (acc, digit, index) {\n        return acc + Number(digit) * weightOfDigits[index + 1];\n      }, 0);\n      var modulo = sum % 10;\n      var lastDigit = Number(str.charAt(str.length - 1));\n      if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {\n        return true;\n      }\n    }\n    return false;\n  },\n  ES: function ES(str) {\n    (0, _assertString.default)(str);\n    var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;\n    var charsValue = {\n      X: 0,\n      Y: 1,\n      Z: 2\n    };\n    var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];\n\n    // sanitize user input\n    var sanitized = str.trim().toUpperCase();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n\n    // validate the control digit\n    var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (char) {\n      return charsValue[char];\n    });\n    return sanitized.endsWith(controlDigits[number % 23]);\n  },\n  FI: function FI(str) {\n    // https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated\n    (0, _assertString.default)(str);\n    if (str.length !== 11) {\n      return false;\n    }\n    if (!str.match(/^\\d{6}[\\-A\\+]\\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {\n      return false;\n    }\n    var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';\n    var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);\n    var remainder = idAsNumber % 31;\n    var checkDigit = checkDigits[remainder];\n    return checkDigit === str.slice(10, 11);\n  },\n  IN: function IN(str) {\n    var DNI = /^[1-9]\\d{3}\\s?\\d{4}\\s?\\d{4}$/;\n\n    // multiplication table\n    var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];\n\n    // permutation table\n    var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]];\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    var c = 0;\n    var invertedArray = sanitized.replace(/\\s/g, '').split('').map(Number).reverse();\n    invertedArray.forEach(function (val, i) {\n      c = d[c][p[i % 8][val]];\n    });\n    return c === 0;\n  },\n  IR: function IR(str) {\n    if (!str.match(/^\\d{10}$/)) return false;\n    str = \"0000\".concat(str).slice(str.length - 6);\n    if (parseInt(str.slice(3, 9), 10) === 0) return false;\n    var lastNumber = parseInt(str.slice(9, 10), 10);\n    var sum = 0;\n    for (var i = 0; i < 9; i++) {\n      sum += parseInt(str.slice(i, i + 1), 10) * (10 - i);\n    }\n    sum %= 11;\n    return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;\n  },\n  IT: function IT(str) {\n    if (str.length !== 9) return false;\n    if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana\n    return str.search(/C[A-Z]\\d{5}[A-Z]{2}/i) > -1;\n  },\n  NO: function NO(str) {\n    var sanitized = str.trim();\n    if (isNaN(Number(sanitized))) return false;\n    if (sanitized.length !== 11) return false;\n    if (sanitized === '00000000000') return false;\n\n    // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer\n    var f = sanitized.split('').map(Number);\n    var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;\n    var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;\n    if (k1 !== f[9] || k2 !== f[10]) return false;\n    return true;\n  },\n  TH: function TH(str) {\n    if (!str.match(/^[1-8]\\d{12}$/)) return false;\n\n    // validate check digit\n    var sum = 0;\n    for (var i = 0; i < 12; i++) {\n      sum += parseInt(str[i], 10) * (13 - i);\n    }\n    return str[12] === ((11 - sum % 11) % 10).toString();\n  },\n  LK: function LK(str) {\n    var old_nic = /^[1-9]\\d{8}[vx]$/i;\n    var new_nic = /^[1-9]\\d{11}$/i;\n    if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;\n    return false;\n  },\n  'he-IL': function heIL(str) {\n    var DNI = /^\\d{9}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    var id = sanitized;\n    var sum = 0,\n      incNum;\n    for (var i = 0; i < id.length; i++) {\n      incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2\n      sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total\n    }\n    return sum % 10 === 0;\n  },\n  'ar-LY': function arLY(str) {\n    // Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2\n    var NIN = /^(1|2)\\d{11}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!NIN.test(sanitized)) {\n      return false;\n    }\n    return true;\n  },\n  'ar-TN': function arTN(str) {\n    var DNI = /^\\d{8}$/;\n\n    // sanitize user input\n    var sanitized = str.trim();\n\n    // validate the data structure\n    if (!DNI.test(sanitized)) {\n      return false;\n    }\n    return true;\n  },\n  'zh-CN': function zhCN(str) {\n    var provincesAndCities = ['11',\n    // 北京\n    '12',\n    // 天津\n    '13',\n    // 河北\n    '14',\n    // 山西\n    '15',\n    // 内蒙古\n    '21',\n    // 辽宁\n    '22',\n    // 吉林\n    '23',\n    // 黑龙江\n    '31',\n    // 上海\n    '32',\n    // 江苏\n    '33',\n    // 浙江\n    '34',\n    // 安徽\n    '35',\n    // 福建\n    '36',\n    // 江西\n    '37',\n    // 山东\n    '41',\n    // 河南\n    '42',\n    // 湖北\n    '43',\n    // 湖南\n    '44',\n    // 广东\n    '45',\n    // 广西\n    '46',\n    // 海南\n    '50',\n    // 重庆\n    '51',\n    // 四川\n    '52',\n    // 贵州\n    '53',\n    // 云南\n    '54',\n    // 西藏\n    '61',\n    // 陕西\n    '62',\n    // 甘肃\n    '63',\n    // 青海\n    '64',\n    // 宁夏\n    '65',\n    // 新疆\n    '71',\n    // 台湾\n    '81',\n    // 香港\n    '82',\n    // 澳门\n    '91' // 国外\n    ];\n    var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];\n    var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n    var checkAddressCode = function checkAddressCode(addressCode) {\n      return provincesAndCities.includes(addressCode);\n    };\n    var checkBirthDayCode = function checkBirthDayCode(birDayCode) {\n      var yyyy = parseInt(birDayCode.substring(0, 4), 10);\n      var mm = parseInt(birDayCode.substring(4, 6), 10);\n      var dd = parseInt(birDayCode.substring(6), 10);\n      var xdata = new Date(yyyy, mm - 1, dd);\n      if (xdata > new Date()) {\n        return false;\n        // eslint-disable-next-line max-len\n      } else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {\n        return true;\n      }\n      return false;\n    };\n    var getParityBit = function getParityBit(idCardNo) {\n      var id17 = idCardNo.substring(0, 17);\n      var power = 0;\n      for (var i = 0; i < 17; i++) {\n        power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);\n      }\n      var mod = power % 11;\n      return parityBit[mod];\n    };\n    var checkParityBit = function checkParityBit(idCardNo) {\n      return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();\n    };\n    var check15IdCardNo = function check15IdCardNo(idCardNo) {\n      var check = /^[1-9]\\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\\d{3}$/.test(idCardNo);\n      if (!check) return false;\n      var addressCode = idCardNo.substring(0, 2);\n      check = checkAddressCode(addressCode);\n      if (!check) return false;\n      var birDayCode = \"19\".concat(idCardNo.substring(6, 12));\n      check = checkBirthDayCode(birDayCode);\n      if (!check) return false;\n      return true;\n    };\n    var check18IdCardNo = function check18IdCardNo(idCardNo) {\n      var check = /^[1-9]\\d{5}[1-9]\\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\\d{3}(\\d|x|X)$/.test(idCardNo);\n      if (!check) return false;\n      var addressCode = idCardNo.substring(0, 2);\n      check = checkAddressCode(addressCode);\n      if (!check) return false;\n      var birDayCode = idCardNo.substring(6, 14);\n      check = checkBirthDayCode(birDayCode);\n      if (!check) return false;\n      return checkParityBit(idCardNo);\n    };\n    var checkIdCardNo = function checkIdCardNo(idCardNo) {\n      var check = /^\\d{15}|(\\d{17}(\\d|x|X))$/.test(idCardNo);\n      if (!check) return false;\n      if (idCardNo.length === 15) {\n        return check15IdCardNo(idCardNo);\n      }\n      return check18IdCardNo(idCardNo);\n    };\n    return checkIdCardNo(str);\n  },\n  'zh-HK': function zhHK(str) {\n    // sanitize user input\n    str = str.trim();\n\n    // HKID number starts with 1 or 2 letters, followed by 6 digits,\n    // then a checksum contained in square / round brackets or nothing\n    var regexHKID = /^[A-Z]{1,2}[0-9]{6}((\\([0-9A]\\))|(\\[[0-9A]\\])|([0-9A]))$/;\n    var regexIsDigit = /^[0-9]$/;\n\n    // convert the user input to all uppercase and apply regex\n    str = str.toUpperCase();\n    if (!regexHKID.test(str)) return false;\n    str = str.replace(/\\[|\\]|\\(|\\)/g, '');\n    if (str.length === 8) str = \"3\".concat(str);\n    var checkSumVal = 0;\n    for (var i = 0; i <= 7; i++) {\n      var convertedChar = void 0;\n      if (!regexIsDigit.test(str[i])) convertedChar = (str[i].charCodeAt(0) - 55) % 11;else convertedChar = str[i];\n      checkSumVal += convertedChar * (9 - i);\n    }\n    checkSumVal %= 11;\n    var checkSumConverted;\n    if (checkSumVal === 0) checkSumConverted = '0';else if (checkSumVal === 1) checkSumConverted = 'A';else checkSumConverted = String(11 - checkSumVal);\n    if (checkSumConverted === str[str.length - 1]) return true;\n    return false;\n  },\n  'zh-TW': function zhTW(str) {\n    var ALPHABET_CODES = {\n      A: 10,\n      B: 11,\n      C: 12,\n      D: 13,\n      E: 14,\n      F: 15,\n      G: 16,\n      H: 17,\n      I: 34,\n      J: 18,\n      K: 19,\n      L: 20,\n      M: 21,\n      N: 22,\n      O: 35,\n      P: 23,\n      Q: 24,\n      R: 25,\n      S: 26,\n      T: 27,\n      U: 28,\n      V: 29,\n      W: 32,\n      X: 30,\n      Y: 31,\n      Z: 33\n    };\n    var sanitized = str.trim().toUpperCase();\n    if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;\n    return Array.from(sanitized).reduce(function (sum, number, index) {\n      if (index === 0) {\n        var code = ALPHABET_CODES[number];\n        return code % 10 * 9 + Math.floor(code / 10);\n      }\n      if (index === 9) {\n        return (10 - sum % 10 - Number(number)) % 10 === 0;\n      }\n      return sum + Number(number) * (9 - index);\n    }, 0);\n  }\n};\nfunction isIdentityCard(str, locale) {\n  (0, _assertString.default)(str);\n  if (locale in validators) {\n    return validators[locale](str);\n  } else if (locale === 'any') {\n    for (var key in validators) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (validators.hasOwnProperty(key)) {\n        var validator = validators[key];\n        if (validator(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isIn;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _toString = _interopRequireDefault(require(\"./util/toString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction isIn(str, options) {\n  (0, _assertString.default)(str);\n  var i;\n  if (Object.prototype.toString.call(options) === '[object Array]') {\n    var array = [];\n    for (i in options) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if ({}.hasOwnProperty.call(options, i)) {\n        array[i] = (0, _toString.default)(options[i]);\n      }\n    }\n    return array.indexOf(str) >= 0;\n  } else if (_typeof(options) === 'object') {\n    return options.hasOwnProperty(str);\n  } else if (options && typeof options.indexOf === 'function') {\n    return options.indexOf(str) >= 0;\n  }\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isInt;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;\nvar intLeadingZeroes = /^[-+]?[0-9]+$/;\nfunction isInt(str, options) {\n  (0, _assertString.default)(str);\n  options = options || {};\n\n  // Get the regex to use for testing, based on whether\n  // leading zeroes are allowed or not.\n  var regex = options.allow_leading_zeroes === false ? int : intLeadingZeroes;\n\n  // Check min/max/lt/gt\n  var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;\n  var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;\n  var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;\n  var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;\n  return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isJSON;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar default_json_options = {\n  allow_primitives: false\n};\nfunction isJSON(str, options) {\n  (0, _assertString.default)(str);\n  try {\n    options = (0, _merge.default)(options, default_json_options);\n    var primitives = [];\n    if (options.allow_primitives) {\n      primitives = [null, false, true];\n    }\n    var obj = JSON.parse(str);\n    return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';\n  } catch (e) {/* ignore */}\n  return false;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isJWT;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isBase = _interopRequireDefault(require(\"./isBase64\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isJWT(str) {\n  (0, _assertString.default)(str);\n  var dotSplit = str.split('.');\n  var len = dotSplit.length;\n  if (len !== 3) {\n    return false;\n  }\n  return dotSplit.reduce(function (acc, currElem) {\n    return acc && (0, _isBase.default)(currElem, {\n      urlSafe: true\n    });\n  }, true);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLatLong;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar lat = /^\\(?[+-]?(90(\\.0+)?|[1-8]?\\d(\\.\\d+)?)$/;\nvar long = /^\\s?[+-]?(180(\\.0+)?|1[0-7]\\d(\\.\\d+)?|\\d{1,2}(\\.\\d+)?)\\)?$/;\nvar latDMS = /^(([1-8]?\\d)\\D+([1-5]?\\d|60)\\D+([1-5]?\\d|60)(\\.\\d+)?|90\\D+0\\D+0)\\D+[NSns]?$/i;\nvar longDMS = /^\\s*([1-7]?\\d{1,2}\\D+([1-5]?\\d|60)\\D+([1-5]?\\d|60)(\\.\\d+)?|180\\D+0\\D+0)\\D+[EWew]?$/i;\nvar defaultLatLongOptions = {\n  checkDMS: false\n};\nfunction isLatLong(str, options) {\n  (0, _assertString.default)(str);\n  options = (0, _merge.default)(options, defaultLatLongOptions);\n  if (!str.includes(',')) return false;\n  var pair = str.split(',');\n  if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;\n  if (options.checkDMS) {\n    return latDMS.test(pair[0]) && longDMS.test(pair[1]);\n  }\n  return lat.test(pair[0]) && long.test(pair[1]);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLength;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/* eslint-disable prefer-rest-params */\nfunction isLength(str, options) {\n  (0, _assertString.default)(str);\n  var min;\n  var max;\n  if (_typeof(options) === 'object') {\n    min = options.min || 0;\n    max = options.max;\n  } else {\n    // backwards compatibility: isLength(str, min [, max])\n    min = arguments[1] || 0;\n    max = arguments[2];\n  }\n  var presentationSequences = str.match(/(\\uFE0F|\\uFE0E)/g) || [];\n  var surrogatePairs = str.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g) || [];\n  var len = str.length - presentationSequences.length - surrogatePairs.length;\n  return len >= min && (typeof max === 'undefined' || len <= max);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLicensePlate;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar validators = {\n  'cs-CZ': function csCZ(str) {\n    return /^(([ABCDEFHIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);\n  },\n  'de-DE': function deDE(str) {\n    return /^((A|AA|AB|AC|AE|AH|AK|AM|AN|AÖ|AP|AS|AT|AU|AW|AZ|B|BA|BB|BC|BE|BF|BH|BI|BK|BL|BM|BN|BO|BÖ|BS|BT|BZ|C|CA|CB|CE|CO|CR|CW|D|DA|DD|DE|DH|DI|DL|DM|DN|DO|DU|DW|DZ|E|EA|EB|ED|EE|EF|EG|EH|EI|EL|EM|EN|ER|ES|EU|EW|F|FB|FD|FF|FG|FI|FL|FN|FO|FR|FS|FT|FÜ|FW|FZ|G|GA|GC|GD|GE|GF|GG|GI|GK|GL|GM|GN|GÖ|GP|GR|GS|GT|GÜ|GV|GW|GZ|H|HA|HB|HC|HD|HE|HF|HG|HH|HI|HK|HL|HM|HN|HO|HP|HR|HS|HU|HV|HX|HY|HZ|IK|IL|IN|IZ|J|JE|JL|K|KA|KB|KC|KE|KF|KG|KH|KI|KK|KL|KM|KN|KO|KR|KS|KT|KU|KW|KY|L|LA|LB|LC|LD|LF|LG|LH|LI|LL|LM|LN|LÖ|LP|LR|LU|M|MA|MB|MC|MD|ME|MG|MH|MI|MK|ML|MM|MN|MO|MQ|MR|MS|MÜ|MW|MY|MZ|N|NB|ND|NE|NF|NH|NI|NK|NM|NÖ|NP|NR|NT|NU|NW|NY|NZ|OA|OB|OC|OD|OE|OF|OG|OH|OK|OL|OP|OS|OZ|P|PA|PB|PE|PF|PI|PL|PM|PN|PR|PS|PW|PZ|R|RA|RC|RD|RE|RG|RH|RI|RL|RM|RN|RO|RP|RS|RT|RU|RV|RW|RZ|S|SB|SC|SE|SG|SI|SK|SL|SM|SN|SO|SP|SR|ST|SU|SW|SY|SZ|TE|TF|TG|TO|TP|TR|TS|TT|TÜ|ÜB|UE|UH|UL|UM|UN|V|VB|VG|VK|VR|VS|W|WA|WB|WE|WF|WI|WK|WL|WM|WN|WO|WR|WS|WT|WÜ|WW|WZ|Z|ZE|ZI|ZP|ZR|ZW|ZZ)[- ]?[A-Z]{1,2}[- ]?\\d{1,4}|(ABG|ABI|AIB|AIC|ALF|ALZ|ANA|ANG|ANK|APD|ARN|ART|ASL|ASZ|AUR|AZE|BAD|BAR|BBG|BCH|BED|BER|BGD|BGL|BID|BIN|BIR|BIT|BIW|BKS|BLB|BLK|BNA|BOG|BOH|BOR|BOT|BRA|BRB|BRG|BRK|BRL|BRV|BSB|BSK|BTF|BÜD|BUL|BÜR|BÜS|BÜZ|CAS|CHA|CLP|CLZ|COC|COE|CUX|DAH|DAN|DAU|DBR|DEG|DEL|DGF|DIL|DIN|DIZ|DKB|DLG|DON|DUD|DÜW|EBE|EBN|EBS|ECK|EIC|EIL|EIN|EIS|EMD|EMS|ERB|ERH|ERK|ERZ|ESB|ESW|FDB|FDS|FEU|FFB|FKB|FLÖ|FOR|FRG|FRI|FRW|FTL|FÜS|GAN|GAP|GDB|GEL|GEO|GER|GHA|GHC|GLA|GMN|GNT|GOA|GOH|GRA|GRH|GRI|GRM|GRZ|GTH|GUB|GUN|GVM|HAB|HAL|HAM|HAS|HBN|HBS|HCH|HDH|HDL|HEB|HEF|HEI|HER|HET|HGN|HGW|HHM|HIG|HIP|HMÜ|HOG|HOH|HOL|HOM|HOR|HÖS|HOT|HRO|HSK|HST|HVL|HWI|IGB|ILL|JÜL|KEH|KEL|KEM|KIB|KLE|KLZ|KÖN|KÖT|KÖZ|KRU|KÜN|KUS|KYF|LAN|LAU|LBS|LBZ|LDK|LDS|LEO|LER|LEV|LIB|LIF|LIP|LÖB|LOS|LRO|LSZ|LÜN|LUP|LWL|MAB|MAI|MAK|MAL|MED|MEG|MEI|MEK|MEL|MER|MET|MGH|MGN|MHL|MIL|MKK|MOD|MOL|MON|MOS|MSE|MSH|MSP|MST|MTK|MTL|MÜB|MÜR|MYK|MZG|NAB|NAI|NAU|NDH|NEA|NEB|NEC|NEN|NES|NEW|NMB|NMS|NOH|NOL|NOM|NOR|NVP|NWM|OAL|OBB|OBG|OCH|OHA|ÖHR|OHV|OHZ|OPR|OSL|OVI|OVL|OVP|PAF|PAN|PAR|PCH|PEG|PIR|PLÖ|PRÜ|QFT|QLB|RDG|REG|REH|REI|RID|RIE|ROD|ROF|ROK|ROL|ROS|ROT|ROW|RSL|RÜD|RÜG|SAB|SAD|SAN|SAW|SBG|SBK|SCZ|SDH|SDL|SDT|SEB|SEE|SEF|SEL|SFB|SFT|SGH|SHA|SHG|SHK|SHL|SIG|SIM|SLE|SLF|SLK|SLN|SLS|SLÜ|SLZ|SMÜ|SOB|SOG|SOK|SÖM|SON|SPB|SPN|SRB|SRO|STA|STB|STD|STE|STL|SUL|SÜW|SWA|SZB|TBB|TDO|TET|TIR|TÖL|TUT|UEM|UER|UFF|USI|VAI|VEC|VER|VIB|VIE|VIT|VOH|WAF|WAK|WAN|WAR|WAT|WBS|WDA|WEL|WEN|WER|WES|WHV|WIL|WIS|WIT|WIZ|WLG|WMS|WND|WOB|WOH|WOL|WOR|WOS|WRN|WSF|WST|WSW|WTL|WTM|WUG|WÜM|WUN|WUR|WZL|ZEL|ZIG)[- ]?(([A-Z][- ]?\\d{1,4})|([A-Z]{2}[- ]?\\d{1,3})))[- ]?(E|H)?$/.test(str);\n  },\n  'de-LI': function deLI(str) {\n    return /^FL[- ]?\\d{1,5}[UZ]?$/.test(str);\n  },\n  'en-IN': function enIN(str) {\n    return /^[A-Z]{2}[ -]?[0-9]{1,2}(?:[ -]?[A-Z])(?:[ -]?[A-Z]*)?[ -]?[0-9]{4}$/.test(str);\n  },\n  'es-AR': function esAR(str) {\n    return /^(([A-Z]{2} ?[0-9]{3} ?[A-Z]{2})|([A-Z]{3} ?[0-9]{3}))$/.test(str);\n  },\n  'fi-FI': function fiFI(str) {\n    return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);\n  },\n  'hu-HU': function huHU(str) {\n    return /^((((?!AAA)(([A-NPRSTVZWXY]{1})([A-PR-Z]{1})([A-HJ-NPR-Z]))|(A[ABC]I)|A[ABC]O|A[A-W]Q|BPI|BPO|UCO|UDO|XAO)-(?!000)\\d{3})|(M\\d{6})|((CK|DT|CD|HC|H[ABEFIKLMNPRSTVX]|MA|OT|R[A-Z]) \\d{2}-\\d{2})|(CD \\d{3}-\\d{3})|(C-(C|X) \\d{4})|(X-(A|B|C) \\d{4})|(([EPVZ]-\\d{5}))|(S A[A-Z]{2} \\d{2})|(SP \\d{2}-\\d{2}))$/.test(str);\n  },\n  'pt-BR': function ptBR(str) {\n    return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);\n  },\n  'pt-PT': function ptPT(str) {\n    return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);\n  },\n  'sq-AL': function sqAL(str) {\n    return /^[A-Z]{2}[- ]?((\\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\\d{3}))$/.test(str);\n  },\n  'sv-SE': function svSE(str) {\n    return /^[A-HJ-PR-UW-Z]{3} ?[\\d]{2}[A-HJ-PR-UW-Z1-9]$|(^[A-ZÅÄÖ ]{2,7}$)/.test(str.trim());\n  },\n  'en-PK': function enPK(str) {\n    return /(^[A-Z]{2}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]{3}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]{4}((\\s|-){0,1})[0-9]{3,4}((\\s|-)[0-9]{2}){0,1}$)|(^[A-Z]((\\s|-){0,1})[0-9]{4}((\\s|-)[0-9]{2}){0,1}$)/.test(str.trim());\n  }\n};\nfunction isLicensePlate(str, locale) {\n  (0, _assertString.default)(str);\n  if (locale in validators) {\n    return validators[locale](str);\n  } else if (locale === 'any') {\n    for (var key in validators) {\n      /* eslint guard-for-in: 0 */\n      var validator = validators[key];\n      if (validator(str)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLocale;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/*\n  = 3ALPHA              ; selected ISO 639 codes\n    *2(\"-\" 3ALPHA)      ; permanently reserved\n */\nvar extlang = '([A-Za-z]{3}(-[A-Za-z]{3}){0,2})';\n\n/*\n  = 2*3ALPHA            ; shortest ISO 639 code\n    [\"-\" extlang]       ; sometimes followed by\n                        ; extended language subtags\n  / 4ALPHA              ; or reserved for future use\n  / 5*8ALPHA            ; or registered language subtag\n */\nvar language = \"(([a-zA-Z]{2,3}(-\".concat(extlang, \")?)|([a-zA-Z]{5,8}))\");\n\n/*\n  = 4ALPHA              ; ISO 15924 code\n */\nvar script = '([A-Za-z]{4})';\n\n/*\n  = 2ALPHA              ; ISO 3166-1 code\n  / 3DIGIT              ; UN M.49 code\n */\nvar region = '([A-Za-z]{2}|\\\\d{3})';\n\n/*\n  = 5*8alphanum         ; registered variants\n  / (DIGIT 3alphanum)\n */\nvar variant = '([A-Za-z0-9]{5,8}|(\\\\d[A-Z-a-z0-9]{3}))';\n\n/*\n  = DIGIT               ; 0 - 9\n  / %x41-57             ; A - W\n  / %x59-5A             ; Y - Z\n  / %x61-77             ; a - w\n  / %x79-7A             ; y - z\n */\nvar singleton = '(\\\\d|[A-W]|[Y-Z]|[a-w]|[y-z])';\n\n/*\n  = singleton 1*(\"-\" (2*8alphanum))\n                        ; Single alphanumerics\n                        ; \"x\" reserved for private use\n */\nvar extension = \"(\".concat(singleton, \"(-[A-Za-z0-9]{2,8})+)\");\n\n/*\n  = \"x\" 1*(\"-\" (1*8alphanum))\n */\nvar privateuse = '(x(-[A-Za-z0-9]{1,8})+)';\n\n// irregular tags do not match the 'langtag' production and would not\n// otherwise be considered 'well-formed'. These tags are all valid, but\n// most are deprecated in favor of more modern subtags or subtag combination\n\nvar irregular = '((en-GB-oed)|(i-ami)|(i-bnn)|(i-default)|(i-enochian)|' + '(i-hak)|(i-klingon)|(i-lux)|(i-mingo)|(i-navajo)|(i-pwn)|(i-tao)|' + '(i-tay)|(i-tsu)|(sgn-BE-FR)|(sgn-BE-NL)|(sgn-CH-DE))';\n\n// regular tags match the 'langtag' production, but their subtags are not\n// extended language or variant subtags: their meaning is defined by\n// their registration and all of these are deprecated in favor of a more\n// modern subtag or sequence of subtags\n\nvar regular = '((art-lojban)|(cel-gaulish)|(no-bok)|(no-nyn)|(zh-guoyu)|' + '(zh-hakka)|(zh-min)|(zh-min-nan)|(zh-xiang))';\n\n/*\n  = irregular           ; non-redundant tags registered\n  / regular             ; during the RFC 3066 era\n\n */\nvar grandfathered = \"(\".concat(irregular, \"|\").concat(regular, \")\");\n\n/*\n  RFC 5646 defines delimitation of subtags via a hyphen:\n\n      \"Subtag\" refers to a specific section of a tag, delimited by a\n      hyphen, such as the subtags 'zh', 'Hant', and 'CN' in the tag \"zh-\n      Hant-CN\".  Examples of subtags in this document are enclosed in\n      single quotes ('Hant')\n\n  However, we need to add \"_\" to maintain the existing behaviour.\n */\nvar delimiter = '(-|_)';\n\n/*\n  = language\n    [\"-\" script]\n    [\"-\" region]\n    *(\"-\" variant)\n    *(\"-\" extension)\n    [\"-\" privateuse]\n */\nvar langtag = \"\".concat(language, \"(\").concat(delimiter).concat(script, \")?(\").concat(delimiter).concat(region, \")?(\").concat(delimiter).concat(variant, \")*(\").concat(delimiter).concat(extension, \")*(\").concat(delimiter).concat(privateuse, \")?\");\n\n/*\n  Regex implementation based on BCP RFC 5646\n  Tags for Identifying Languages\n  https://www.rfc-editor.org/rfc/rfc5646.html\n */\nvar languageTagRegex = new RegExp(\"(^\".concat(privateuse, \"$)|(^\").concat(grandfathered, \"$)|(^\").concat(langtag, \"$)\"));\nfunction isLocale(str) {\n  (0, _assertString.default)(str);\n  return languageTagRegex.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLowercase;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isLowercase(str) {\n  (0, _assertString.default)(str);\n  return str === str.toLowerCase();\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isLuhnNumber;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isLuhnNumber(str) {\n  (0, _assertString.default)(str);\n  var sanitized = str.replace(/[- ]+/g, '');\n  var sum = 0;\n  var digit;\n  var tmpNum;\n  var shouldDouble;\n  for (var i = sanitized.length - 1; i >= 0; i--) {\n    digit = sanitized.substring(i, i + 1);\n    tmpNum = parseInt(digit, 10);\n    if (shouldDouble) {\n      tmpNum *= 2;\n      if (tmpNum >= 10) {\n        sum += tmpNum % 10 + 1;\n      } else {\n        sum += tmpNum;\n      }\n    } else {\n      sum += tmpNum;\n    }\n    shouldDouble = !shouldDouble;\n  }\n  return !!(sum % 10 === 0 ? sanitized : false);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMACAddress;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar macAddress48 = /^(?:[0-9a-fA-F]{2}([-:\\s]))([0-9a-fA-F]{2}\\1){4}([0-9a-fA-F]{2})$/;\nvar macAddress48NoSeparators = /^([0-9a-fA-F]){12}$/;\nvar macAddress48WithDots = /^([0-9a-fA-F]{4}\\.){2}([0-9a-fA-F]{4})$/;\nvar macAddress64 = /^(?:[0-9a-fA-F]{2}([-:\\s]))([0-9a-fA-F]{2}\\1){6}([0-9a-fA-F]{2})$/;\nvar macAddress64NoSeparators = /^([0-9a-fA-F]){16}$/;\nvar macAddress64WithDots = /^([0-9a-fA-F]{4}\\.){3}([0-9a-fA-F]{4})$/;\nfunction isMACAddress(str, options) {\n  (0, _assertString.default)(str);\n  if (options !== null && options !== void 0 && options.eui) {\n    options.eui = String(options.eui);\n  }\n  /**\n   * @deprecated `no_colons` TODO: remove it in the next major\n  */\n  if (options !== null && options !== void 0 && options.no_colons || options !== null && options !== void 0 && options.no_separators) {\n    if (options.eui === '48') {\n      return macAddress48NoSeparators.test(str);\n    }\n    if (options.eui === '64') {\n      return macAddress64NoSeparators.test(str);\n    }\n    return macAddress48NoSeparators.test(str) || macAddress64NoSeparators.test(str);\n  }\n  if ((options === null || options === void 0 ? void 0 : options.eui) === '48') {\n    return macAddress48.test(str) || macAddress48WithDots.test(str);\n  }\n  if ((options === null || options === void 0 ? void 0 : options.eui) === '64') {\n    return macAddress64.test(str) || macAddress64WithDots.test(str);\n  }\n  return isMACAddress(str, {\n    eui: '48'\n  }) || isMACAddress(str, {\n    eui: '64'\n  });\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMD5;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar md5 = /^[a-f0-9]{32}$/;\nfunction isMD5(str) {\n  (0, _assertString.default)(str);\n  return md5.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMagnetURI;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar magnetURIComponent = /(?:^magnet:\\?|[^?&]&)xt(?:\\.1)?=urn:(?:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?|btmh:1220[a-z0-9]{64})(?:$|&)/i;\nfunction isMagnetURI(url) {\n  (0, _assertString.default)(url);\n  if (url.indexOf('magnet:?') !== 0) {\n    return false;\n  }\n  return magnetURIComponent.test(url);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMailtoURI;\nvar _trim = _interopRequireDefault(require(\"./trim\"));\nvar _isEmail = _interopRequireDefault(require(\"./isEmail\"));\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction parseMailtoQueryString(queryString) {\n  var allowedParams = new Set(['subject', 'body', 'cc', 'bcc']),\n    query = {\n      cc: '',\n      bcc: ''\n    };\n  var isParseFailed = false;\n  var queryParams = queryString.split('&');\n  if (queryParams.length > 4) {\n    return false;\n  }\n  var _iterator = _createForOfIteratorHelper(queryParams),\n    _step;\n  try {\n    for (_iterator.s(); !(_step = _iterator.n()).done;) {\n      var q = _step.value;\n      var _q$split = q.split('='),\n        _q$split2 = _slicedToArray(_q$split, 2),\n        key = _q$split2[0],\n        value = _q$split2[1];\n\n      // checked for invalid and duplicated query params\n      if (key && !allowedParams.has(key)) {\n        isParseFailed = true;\n        break;\n      }\n      if (value && (key === 'cc' || key === 'bcc')) {\n        query[key] = value;\n      }\n      if (key) {\n        allowedParams.delete(key);\n      }\n    }\n  } catch (err) {\n    _iterator.e(err);\n  } finally {\n    _iterator.f();\n  }\n  return isParseFailed ? false : query;\n}\nfunction isMailtoURI(url, options) {\n  (0, _assertString.default)(url);\n  if (url.indexOf('mailto:') !== 0) {\n    return false;\n  }\n  var _url$replace$split = url.replace('mailto:', '').split('?'),\n    _url$replace$split2 = _slicedToArray(_url$replace$split, 2),\n    to = _url$replace$split2[0],\n    _url$replace$split2$ = _url$replace$split2[1],\n    queryString = _url$replace$split2$ === void 0 ? '' : _url$replace$split2$;\n  if (!to && !queryString) {\n    return true;\n  }\n  var query = parseMailtoQueryString(queryString);\n  if (!query) {\n    return false;\n  }\n  return \"\".concat(to, \",\").concat(query.cc, \",\").concat(query.bcc).split(',').every(function (email) {\n    email = (0, _trim.default)(email, ' ');\n    if (email) {\n      return (0, _isEmail.default)(email, options);\n    }\n    return true;\n  });\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMimeType;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/*\n  Checks if the provided string matches to a correct Media type format (MIME type)\n\n  This function only checks is the string format follows the\n  etablished rules by the according RFC specifications.\n  This function supports 'charset' in textual media types\n  (https://tools.ietf.org/html/rfc6657).\n\n  This function does not check against all the media types listed\n  by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)\n  because of lightness purposes : it would require to include\n  all these MIME types in this librairy, which would weigh it\n  significantly. This kind of effort maybe is not worth for the use that\n  this function has in this entire librairy.\n\n  More informations in the RFC specifications :\n  - https://tools.ietf.org/html/rfc2045\n  - https://tools.ietf.org/html/rfc2046\n  - https://tools.ietf.org/html/rfc7231#section-3.1.1.1\n  - https://tools.ietf.org/html/rfc7231#section-3.1.1.5\n*/\n\n// Match simple MIME types\n// NB :\n//   Subtype length must not exceed 100 characters.\n//   This rule does not comply to the RFC specs (what is the max length ?).\nvar mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\\/[a-zA-Z0-9\\.\\-\\+_]{1,100}$/i; // eslint-disable-line max-len\n\n// Handle \"charset\" in \"text/*\"\nvar mimeTypeText = /^text\\/[a-zA-Z0-9\\.\\-\\+]{1,100};\\s?charset=(\"[a-zA-Z0-9\\.\\-\\+\\s]{0,70}\"|[a-zA-Z0-9\\.\\-\\+]{0,70})(\\s?\\([a-zA-Z0-9\\.\\-\\+\\s]{1,20}\\))?$/i; // eslint-disable-line max-len\n\n// Handle \"boundary\" in \"multipart/*\"\nvar mimeTypeMultipart = /^multipart\\/[a-zA-Z0-9\\.\\-\\+]{1,100}(;\\s?(boundary|charset)=(\"[a-zA-Z0-9\\.\\-\\+\\s]{0,70}\"|[a-zA-Z0-9\\.\\-\\+]{0,70})(\\s?\\([a-zA-Z0-9\\.\\-\\+\\s]{1,20}\\))?){0,2}$/i; // eslint-disable-line max-len\n\nfunction isMimeType(str) {\n  (0, _assertString.default)(str);\n  return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMobilePhone;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/* eslint-disable max-len */\nvar phones = {\n  'am-AM': /^(\\+?374|0)(33|4[134]|55|77|88|9[13-689])\\d{6}$/,\n  'ar-AE': /^((\\+?971)|0)?5[024568]\\d{7}$/,\n  'ar-BH': /^(\\+?973)?(3|6)\\d{7}$/,\n  'ar-DZ': /^(\\+?213|0)(5|6|7)\\d{8}$/,\n  'ar-LB': /^(\\+?961)?((3|81)\\d{6}|7\\d{7})$/,\n  'ar-EG': /^((\\+?20)|0)?1[0125]\\d{8}$/,\n  'ar-IQ': /^(\\+?964|0)?7[0-9]\\d{8}$/,\n  'ar-JO': /^(\\+?962|0)?7[789]\\d{7}$/,\n  'ar-KW': /^(\\+?965)([569]\\d{7}|41\\d{6})$/,\n  'ar-LY': /^((\\+?218)|0)?(9[1-6]\\d{7}|[1-8]\\d{7,9})$/,\n  'ar-MA': /^(?:(?:\\+|00)212|0)[5-7]\\d{8}$/,\n  'ar-OM': /^((\\+|00)968)?(9[1-9])\\d{6}$/,\n  'ar-PS': /^(\\+?970|0)5[6|9](\\d{7})$/,\n  'ar-SA': /^(!?(\\+?966)|0)?5\\d{8}$/,\n  'ar-SD': /^((\\+?249)|0)?(9[012369]|1[012])\\d{7}$/,\n  'ar-SY': /^(!?(\\+?963)|0)?9\\d{8}$/,\n  'ar-TN': /^(\\+?216)?[2459]\\d{7}$/,\n  'az-AZ': /^(\\+994|0)(10|5[015]|7[07]|99)\\d{7}$/,\n  'bs-BA': /^((((\\+|00)3876)|06))((([0-3]|[5-6])\\d{6})|(4\\d{7}))$/,\n  'be-BY': /^(\\+?375)?(24|25|29|33|44)\\d{7}$/,\n  'bg-BG': /^(\\+?359|0)?8[789]\\d{7}$/,\n  'bn-BD': /^(\\+?880|0)1[13456789][0-9]{8}$/,\n  'ca-AD': /^(\\+376)?[346]\\d{5}$/,\n  'cs-CZ': /^(\\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,\n  'da-DK': /^(\\+?45)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'de-DE': /^((\\+49|0)1)(5[0-25-9]\\d|6([23]|0\\d?)|7([0-57-9]|6\\d))\\d{7,9}$/,\n  'de-AT': /^(\\+43|0)\\d{1,4}\\d{3,12}$/,\n  'de-CH': /^(\\+41|0)([1-9])\\d{1,9}$/,\n  'de-LU': /^(\\+352)?((6\\d1)\\d{6})$/,\n  'dv-MV': /^(\\+?960)?(7[2-9]|9[1-9])\\d{5}$/,\n  'el-GR': /^(\\+?30|0)?6(8[5-9]|9(?![26])[0-9])\\d{7}$/,\n  'el-CY': /^(\\+?357?)?(9(9|6)\\d{6})$/,\n  'en-AI': /^(\\+?1|0)264(?:2(35|92)|4(?:6[1-2]|76|97)|5(?:3[6-9]|8[1-4])|7(?:2(4|9)|72))\\d{4}$/,\n  'en-AU': /^(\\+?61|0)4\\d{8}$/,\n  'en-AG': /^(?:\\+1|1)268(?:464|7(?:1[3-9]|[28]\\d|3[0246]|64|7[0-689]))\\d{4}$/,\n  'en-BM': /^(\\+?1)?441(((3|7)\\d{6}$)|(5[0-3][0-9]\\d{4}$)|(59\\d{5}$))/,\n  'en-BS': /^(\\+?1[-\\s]?|0)?\\(?242\\)?[-\\s]?\\d{3}[-\\s]?\\d{4}$/,\n  'en-GB': /^(\\+?44|0)7\\d{9}$/,\n  'en-GG': /^(\\+?44|0)1481\\d{6}$/,\n  'en-GH': /^(\\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\\d{7}$/,\n  'en-GY': /^(\\+592|0)6\\d{6}$/,\n  'en-HK': /^(\\+?852[-\\s]?)?[456789]\\d{3}[-\\s]?\\d{4}$/,\n  'en-MO': /^(\\+?853[-\\s]?)?[6]\\d{3}[-\\s]?\\d{4}$/,\n  'en-IE': /^(\\+?353|0)8[356789]\\d{7}$/,\n  'en-IN': /^(\\+?91|0)?[6789]\\d{9}$/,\n  'en-JM': /^(\\+?876)?\\d{7}$/,\n  'en-KE': /^(\\+?254|0)(7|1)\\d{8}$/,\n  'fr-CF': /^(\\+?236| ?)(70|75|77|72|21|22)\\d{6}$/,\n  'en-SS': /^(\\+?211|0)(9[1257])\\d{7}$/,\n  'en-KI': /^((\\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,\n  'en-KN': /^(?:\\+1|1)869(?:46\\d|48[89]|55[6-8]|66\\d|76[02-7])\\d{4}$/,\n  'en-LS': /^(\\+?266)(22|28|57|58|59|27|52)\\d{6}$/,\n  'en-MT': /^(\\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,\n  'en-MU': /^(\\+?230|0)?\\d{8}$/,\n  'en-MW': /^(\\+?265|0)(((77|88|31|99|98|21)\\d{7})|(((111)|1)\\d{6})|(32000\\d{4}))$/,\n  'en-NA': /^(\\+?264|0)(6|8)\\d{7}$/,\n  'en-NG': /^(\\+?234|0)?[789]\\d{9}$/,\n  'en-NZ': /^(\\+?64|0)[28]\\d{7,9}$/,\n  'en-PG': /^(\\+?675|0)?(7\\d|8[18])\\d{6}$/,\n  'en-PK': /^((00|\\+)?92|0)3[0-6]\\d{8}$/,\n  'en-PH': /^(09|\\+639)\\d{9}$/,\n  'en-RW': /^(\\+?250|0)?[7]\\d{8}$/,\n  'en-SG': /^(\\+65)?[3689]\\d{7}$/,\n  'en-SL': /^(\\+?232|0)\\d{8}$/,\n  'en-TZ': /^(\\+?255|0)?[67]\\d{8}$/,\n  'en-UG': /^(\\+?256|0)?[7]\\d{8}$/,\n  'en-US': /^((\\+1|1)?( |-)?)?(\\([2-9][0-9]{2}\\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,\n  'en-ZA': /^(\\+?27|0)\\d{9}$/,\n  'en-ZM': /^(\\+?26)?09[567]\\d{7}$/,\n  'en-ZW': /^(\\+263)[0-9]{9}$/,\n  'en-BW': /^(\\+?267)?(7[1-8]{1})\\d{6}$/,\n  'es-AR': /^\\+?549(11|[2368]\\d)\\d{8}$/,\n  'es-BO': /^(\\+?591)?(6|7)\\d{7}$/,\n  'es-CO': /^(\\+?57)?3(0(0|1|2|4|5)|1\\d|2[0-4]|5(0|1))\\d{7}$/,\n  'es-CL': /^(\\+?56|0)[2-9]\\d{1}\\d{7}$/,\n  'es-CR': /^(\\+506)?[2-8]\\d{7}$/,\n  'es-CU': /^(\\+53|0053)?5\\d{7}$/,\n  'es-DO': /^(\\+?1)?8[024]9\\d{7}$/,\n  'es-HN': /^(\\+?504)?[9|8|3|2]\\d{7}$/,\n  'es-EC': /^(\\+?593|0)([2-7]|9[2-9])\\d{7}$/,\n  'es-ES': /^(\\+?34)?[6|7]\\d{8}$/,\n  'es-PE': /^(\\+?51)?9\\d{8}$/,\n  'es-MX': /^(\\+?52)?(1|01)?\\d{10,11}$/,\n  'es-NI': /^(\\+?505)\\d{7,8}$/,\n  'es-PA': /^(\\+?507)\\d{7,8}$/,\n  'es-PY': /^(\\+?595|0)9[9876]\\d{7}$/,\n  'es-SV': /^(\\+?503)?[67]\\d{7}$/,\n  'es-UY': /^(\\+598|0)9[1-9][\\d]{6}$/,\n  'es-VE': /^(\\+?58)?(2|4)\\d{9}$/,\n  'et-EE': /^(\\+?372)?\\s?(5|8[1-4])\\s?([0-9]\\s?){6,7}$/,\n  'fa-IR': /^(\\+?98[\\-\\s]?|0)9[0-39]\\d[\\-\\s]?\\d{3}[\\-\\s]?\\d{4}$/,\n  'fi-FI': /^(\\+?358|0)\\s?(4[0-6]|50)\\s?(\\d\\s?){4,8}$/,\n  'fj-FJ': /^(\\+?679)?\\s?\\d{3}\\s?\\d{4}$/,\n  'fo-FO': /^(\\+?298)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'fr-BF': /^(\\+226|0)[67]\\d{7}$/,\n  'fr-BJ': /^(\\+229)\\d{8}$/,\n  'fr-CD': /^(\\+?243|0)?(8|9)\\d{8}$/,\n  'fr-CM': /^(\\+?237)6[0-9]{8}$/,\n  'fr-FR': /^(\\+?33|0)[67]\\d{8}$/,\n  'fr-GF': /^(\\+?594|0|00594)[67]\\d{8}$/,\n  'fr-GP': /^(\\+?590|0|00590)[67]\\d{8}$/,\n  'fr-MQ': /^(\\+?596|0|00596)[67]\\d{8}$/,\n  'fr-PF': /^(\\+?689)?8[789]\\d{6}$/,\n  'fr-RE': /^(\\+?262|0|00262)[67]\\d{8}$/,\n  'fr-WF': /^(\\+681)?\\d{6}$/,\n  'he-IL': /^(\\+972|0)([23489]|5[012345689]|77)[1-9]\\d{6}$/,\n  'hu-HU': /^(\\+?36|06)(20|30|31|50|70)\\d{7}$/,\n  'id-ID': /^(\\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\\s?|\\d]{5,11})$/,\n  'ir-IR': /^(\\+98|0)?9\\d{9}$/,\n  'it-IT': /^(\\+?39)?\\s?3\\d{2} ?\\d{6,7}$/,\n  'it-SM': /^((\\+378)|(0549)|(\\+390549)|(\\+3780549))?6\\d{5,9}$/,\n  'ja-JP': /^(\\+81[ \\-]?(\\(0\\))?|0)[6789]0[ \\-]?\\d{4}[ \\-]?\\d{4}$/,\n  'ka-GE': /^(\\+?995)?(79\\d{7}|5\\d{8})$/,\n  'kk-KZ': /^(\\+?7|8)?7\\d{9}$/,\n  'kl-GL': /^(\\+?299)?\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}$/,\n  'ko-KR': /^((\\+?82)[ \\-]?)?0?1([0|1|6|7|8|9]{1})[ \\-]?\\d{3,4}[ \\-]?\\d{4}$/,\n  'ky-KG': /^(\\+?7\\s?\\+?7|0)\\s?\\d{2}\\s?\\d{3}\\s?\\d{4}$/,\n  'lt-LT': /^(\\+370|8)\\d{8}$/,\n  'lv-LV': /^(\\+?371)2\\d{7}$/,\n  'mg-MG': /^((\\+?261|0)(2|3)\\d)?\\d{7}$/,\n  'mn-MN': /^(\\+|00|011)?976(77|81|88|91|94|95|96|99)\\d{6}$/,\n  'my-MM': /^(\\+?959|09|9)(2[5-7]|3[1-2]|4[0-5]|6[6-9]|7[5-9]|9[6-9])[0-9]{7}$/,\n  'ms-MY': /^(\\+?60|0)1(([0145](-|\\s)?\\d{7,8})|([236-9](-|\\s)?\\d{7}))$/,\n  'mz-MZ': /^(\\+?258)?8[234567]\\d{7}$/,\n  'nb-NO': /^(\\+?47)?[49]\\d{7}$/,\n  'ne-NP': /^(\\+?977)?9[78]\\d{8}$/,\n  'nl-BE': /^(\\+?32|0)4\\d{8}$/,\n  'nl-NL': /^(((\\+|00)?31\\(0\\))|((\\+|00)?31)|0)6{1}\\d{8}$/,\n  'nl-AW': /^(\\+)?297(56|59|64|73|74|99)\\d{5}$/,\n  'nn-NO': /^(\\+?47)?[49]\\d{7}$/,\n  'pl-PL': /^(\\+?48)? ?([5-8]\\d|45) ?\\d{3} ?\\d{2} ?\\d{2}$/,\n  'pt-BR': /^((\\+?55\\ ?[1-9]{2}\\ ?)|(\\+?55\\ ?\\([1-9]{2}\\)\\ ?)|(0[1-9]{2}\\ ?)|(\\([1-9]{2}\\)\\ ?)|([1-9]{2}\\ ?))((\\d{4}\\-?\\d{4})|(9[1-9]{1}\\d{3}\\-?\\d{4}))$/,\n  'pt-PT': /^(\\+?351)?9[1236]\\d{7}$/,\n  'pt-AO': /^(\\+244)\\d{9}$/,\n  'ro-MD': /^(\\+?373|0)((6(0|1|2|6|7|8|9))|(7(6|7|8|9)))\\d{6}$/,\n  'ro-RO': /^(\\+?40|0)\\s?7\\d{2}(\\/|\\s|\\.|-)?\\d{3}(\\s|\\.|-)?\\d{3}$/,\n  'ru-RU': /^(\\+?7|8)?9\\d{9}$/,\n  'si-LK': /^(?:0|94|\\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\\d{7}$/,\n  'sl-SI': /^(\\+386\\s?|0)(\\d{1}\\s?\\d{3}\\s?\\d{2}\\s?\\d{2}|\\d{2}\\s?\\d{3}\\s?\\d{3})$/,\n  'sk-SK': /^(\\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,\n  'so-SO': /^(\\+?252|0)((6[0-9])\\d{7}|(7[1-9])\\d{7})$/,\n  'sq-AL': /^(\\+355|0)6[789]\\d{6}$/,\n  'sr-RS': /^(\\+3816|06)[- \\d]{5,9}$/,\n  'sv-SE': /^(\\+?46|0)[\\s\\-]?7[\\s\\-]?[02369]([\\s\\-]?\\d){7}$/,\n  'tg-TJ': /^(\\+?992)?[5][5]\\d{7}$/,\n  'th-TH': /^(\\+66|66|0)\\d{9}$/,\n  'tr-TR': /^(\\+?90|0)?5\\d{9}$/,\n  'tk-TM': /^(\\+993|993|8)\\d{8}$/,\n  'uk-UA': /^(\\+?38|8)?0\\d{9}$/,\n  'uz-UZ': /^(\\+?998)?(6[125-79]|7[1-69]|88|9\\d)\\d{7}$/,\n  'vi-VN': /^((\\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,\n  'zh-CN': /^((\\+|00)86)?(1[3-9]|9[28])\\d{9}$/,\n  'zh-TW': /^(\\+?886\\-?|0)?9\\d{8}$/,\n  'dz-BT': /^(\\+?975|0)?(17|16|77|02)\\d{6}$/,\n  'ar-YE': /^(((\\+|00)9677|0?7)[0137]\\d{7}|((\\+|00)967|0)[1-7]\\d{6})$/,\n  'ar-EH': /^(\\+?212|0)[\\s\\-]?(5288|5289)[\\s\\-]?\\d{5}$/,\n  'fa-AF': /^(\\+93|0)?(2{1}[0-8]{1}|[3-5]{1}[0-4]{1})(\\d{7})$/\n};\n/* eslint-enable max-len */\n\n// aliases\nphones['en-CA'] = phones['en-US'];\nphones['fr-CA'] = phones['en-CA'];\nphones['fr-BE'] = phones['nl-BE'];\nphones['zh-HK'] = phones['en-HK'];\nphones['zh-MO'] = phones['en-MO'];\nphones['ga-IE'] = phones['en-IE'];\nphones['fr-CH'] = phones['de-CH'];\nphones['it-CH'] = phones['fr-CH'];\nfunction isMobilePhone(str, locale, options) {\n  (0, _assertString.default)(str);\n  if (options && options.strictMode && !str.startsWith('+')) {\n    return false;\n  }\n  if (Array.isArray(locale)) {\n    return locale.some(function (key) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (phones.hasOwnProperty(key)) {\n        var phone = phones[key];\n        if (phone.test(str)) {\n          return true;\n        }\n      }\n      return false;\n    });\n  } else if (locale in phones) {\n    return phones[locale].test(str);\n    // alias falsey locale as 'any'\n  } else if (!locale || locale === 'any') {\n    for (var key in phones) {\n      // istanbul ignore else\n      if (phones.hasOwnProperty(key)) {\n        var phone = phones[key];\n        if (phone.test(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nvar locales = exports.locales = Object.keys(phones);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMongoId;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isHexadecimal = _interopRequireDefault(require(\"./isHexadecimal\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isMongoId(str) {\n  (0, _assertString.default)(str);\n  return (0, _isHexadecimal.default)(str) && str.length === 24;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isMultibyte;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/* eslint-disable no-control-regex */\nvar multibyte = /[^\\x00-\\x7F]/;\n/* eslint-enable no-control-regex */\n\nfunction isMultibyte(str) {\n  (0, _assertString.default)(str);\n  return multibyte.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isNumeric;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _alpha = require(\"./alpha\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar numericNoSymbols = /^[0-9]+$/;\nfunction isNumeric(str, options) {\n  (0, _assertString.default)(str);\n  if (options && options.no_symbols) {\n    return numericNoSymbols.test(str);\n  }\n  return new RegExp(\"^[+-]?([0-9]*[\".concat((options || {}).locale ? _alpha.decimal[options.locale] : '.', \"])?[0-9]+$\")).test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isOctal;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar octal = /^(0o)?[0-7]+$/i;\nfunction isOctal(str) {\n  (0, _assertString.default)(str);\n  return octal.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isPassportNumber;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/**\n * Reference:\n * https://en.wikipedia.org/ -- Wikipedia\n * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number\n * https://countrycode.org/ -- Country Codes\n */\nvar passportRegexByCountryCode = {\n  AM: /^[A-Z]{2}\\d{7}$/,\n  // ARMENIA\n  AR: /^[A-Z]{3}\\d{6}$/,\n  // ARGENTINA\n  AT: /^[A-Z]\\d{7}$/,\n  // AUSTRIA\n  AU: /^[A-Z]\\d{7}$/,\n  // AUSTRALIA\n  AZ: /^[A-Z]{1}\\d{8}$/,\n  // AZERBAIJAN\n  BE: /^[A-Z]{2}\\d{6}$/,\n  // BELGIUM\n  BG: /^\\d{9}$/,\n  // BULGARIA\n  BR: /^[A-Z]{2}\\d{6}$/,\n  // BRAZIL\n  BY: /^[A-Z]{2}\\d{7}$/,\n  // BELARUS\n  CA: /^[A-Z]{2}\\d{6}$/,\n  // CANADA\n  CH: /^[A-Z]\\d{7}$/,\n  // SWITZERLAND\n  CN: /^G\\d{8}$|^E(?![IO])[A-Z0-9]\\d{7}$/,\n  // CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits\n  CY: /^[A-Z](\\d{6}|\\d{8})$/,\n  // CYPRUS\n  CZ: /^\\d{8}$/,\n  // CZECH REPUBLIC\n  DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,\n  // GERMANY\n  DK: /^\\d{9}$/,\n  // DENMARK\n  DZ: /^\\d{9}$/,\n  // ALGERIA\n  EE: /^([A-Z]\\d{7}|[A-Z]{2}\\d{7})$/,\n  // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits\n  ES: /^[A-Z0-9]{2}([A-Z0-9]?)\\d{6}$/,\n  // SPAIN\n  FI: /^[A-Z]{2}\\d{7}$/,\n  // FINLAND\n  FR: /^\\d{2}[A-Z]{2}\\d{5}$/,\n  // FRANCE\n  GB: /^\\d{9}$/,\n  // UNITED KINGDOM\n  GR: /^[A-Z]{2}\\d{7}$/,\n  // GREECE\n  HR: /^\\d{9}$/,\n  // CROATIA\n  HU: /^[A-Z]{2}(\\d{6}|\\d{7})$/,\n  // HUNGARY\n  IE: /^[A-Z0-9]{2}\\d{7}$/,\n  // IRELAND\n  IN: /^[A-Z]{1}-?\\d{7}$/,\n  // INDIA\n  ID: /^[A-C]\\d{7}$/,\n  // INDONESIA\n  IR: /^[A-Z]\\d{8}$/,\n  // IRAN\n  IS: /^(A)\\d{7}$/,\n  // ICELAND\n  IT: /^[A-Z0-9]{2}\\d{7}$/,\n  // ITALY\n  JM: /^[Aa]\\d{7}$/,\n  // JAMAICA\n  JP: /^[A-Z]{2}\\d{7}$/,\n  // JAPAN\n  KR: /^[MS]\\d{8}$/,\n  // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]\n  KZ: /^[a-zA-Z]\\d{7}$/,\n  // KAZAKHSTAN\n  LI: /^[a-zA-Z]\\d{5}$/,\n  // LIECHTENSTEIN\n  LT: /^[A-Z0-9]{8}$/,\n  // LITHUANIA\n  LU: /^[A-Z0-9]{8}$/,\n  // LUXEMBURG\n  LV: /^[A-Z0-9]{2}\\d{7}$/,\n  // LATVIA\n  LY: /^[A-Z0-9]{8}$/,\n  // LIBYA\n  MT: /^\\d{7}$/,\n  // MALTA\n  MZ: /^([A-Z]{2}\\d{7})|(\\d{2}[A-Z]{2}\\d{5})$/,\n  // MOZAMBIQUE\n  MY: /^[AHK]\\d{8}$/,\n  // MALAYSIA\n  MX: /^\\d{10,11}$/,\n  // MEXICO\n  NL: /^[A-Z]{2}[A-Z0-9]{6}\\d$/,\n  // NETHERLANDS\n  NZ: /^([Ll]([Aa]|[Dd]|[Ff]|[Hh])|[Ee]([Aa]|[Pp])|[Nn])\\d{6}$/,\n  // NEW ZEALAND\n  PH: /^([A-Z](\\d{6}|\\d{7}[A-Z]))|([A-Z]{2}(\\d{6}|\\d{7}))$/,\n  // PHILIPPINES\n  PK: /^[A-Z]{2}\\d{7}$/,\n  // PAKISTAN\n  PL: /^[A-Z]{2}\\d{7}$/,\n  // POLAND\n  PT: /^[A-Z]\\d{6}$/,\n  // PORTUGAL\n  RO: /^\\d{8,9}$/,\n  // ROMANIA\n  RU: /^\\d{9}$/,\n  // RUSSIAN FEDERATION\n  SE: /^\\d{8}$/,\n  // SWEDEN\n  SL: /^(P)[A-Z]\\d{7}$/,\n  // SLOVENIA\n  SK: /^[0-9A-Z]\\d{7}$/,\n  // SLOVAKIA\n  TH: /^[A-Z]{1,2}\\d{6,7}$/,\n  // THAILAND\n  TR: /^[A-Z]\\d{8}$/,\n  // TURKEY\n  UA: /^[A-Z]{2}\\d{6}$/,\n  // UKRAINE\n  US: /^\\d{9}$/,\n  // UNITED STATES\n  ZA: /^[TAMD]\\d{8}$/ // SOUTH AFRICA\n};\n\n/**\n * Check if str is a valid passport number\n * relative to provided ISO Country Code.\n *\n * @param {string} str\n * @param {string} countryCode\n * @return {boolean}\n */\nfunction isPassportNumber(str, countryCode) {\n  (0, _assertString.default)(str);\n  /** Remove All Whitespaces, Convert to UPPERCASE */\n  var normalizedStr = str.replace(/\\s/g, '').toUpperCase();\n  return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isPort;\nvar _isInt = _interopRequireDefault(require(\"./isInt\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isPort(str) {\n  return (0, _isInt.default)(str, {\n    allow_leading_zeroes: false,\n    min: 0,\n    max: 65535\n  });\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isPostalCode;\nexports.locales = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n// common patterns\nvar threeDigit = /^\\d{3}$/;\nvar fourDigit = /^\\d{4}$/;\nvar fiveDigit = /^\\d{5}$/;\nvar sixDigit = /^\\d{6}$/;\nvar patterns = {\n  AD: /^AD\\d{3}$/,\n  AT: fourDigit,\n  AU: fourDigit,\n  AZ: /^AZ\\d{4}$/,\n  BA: /^([7-8]\\d{4}$)/,\n  BE: fourDigit,\n  BG: fourDigit,\n  BR: /^\\d{5}-\\d{3}$/,\n  BY: /^2[1-4]\\d{4}$/,\n  CA: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][\\s\\-]?\\d[ABCEGHJ-NPRSTV-Z]\\d$/i,\n  CH: fourDigit,\n  CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\\d{4}$/,\n  CZ: /^\\d{3}\\s?\\d{2}$/,\n  DE: fiveDigit,\n  DK: fourDigit,\n  DO: fiveDigit,\n  DZ: fiveDigit,\n  EE: fiveDigit,\n  ES: /^(5[0-2]{1}|[0-4]{1}\\d{1})\\d{3}$/,\n  FI: fiveDigit,\n  FR: /^\\d{2}\\s?\\d{3}$/,\n  GB: /^(gir\\s?0aa|[a-z]{1,2}\\d[\\da-z]?\\s?(\\d[a-z]{2})?)$/i,\n  GR: /^\\d{3}\\s?\\d{2}$/,\n  HR: /^([1-5]\\d{4}$)/,\n  HT: /^HT\\d{4}$/,\n  HU: fourDigit,\n  ID: fiveDigit,\n  IE: /^(?!.*(?:o))[A-Za-z]\\d[\\dw]\\s\\w{4}$/i,\n  IL: /^(\\d{5}|\\d{7})$/,\n  IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,\n  IR: /^(?!(\\d)\\1{3})[13-9]{4}[1346-9][013-9]{5}$/,\n  IS: threeDigit,\n  IT: fiveDigit,\n  JP: /^\\d{3}\\-\\d{4}$/,\n  KE: fiveDigit,\n  KR: /^(\\d{5}|\\d{6})$/,\n  LI: /^(948[5-9]|949[0-7])$/,\n  LT: /^LT\\-\\d{5}$/,\n  LU: fourDigit,\n  LV: /^LV\\-\\d{4}$/,\n  LK: fiveDigit,\n  MG: threeDigit,\n  MX: fiveDigit,\n  MT: /^[A-Za-z]{3}\\s{0,1}\\d{4}$/,\n  MY: fiveDigit,\n  NL: /^[1-9]\\d{3}\\s?(?!sa|sd|ss)[a-z]{2}$/i,\n  NO: fourDigit,\n  NP: /^(10|21|22|32|33|34|44|45|56|57)\\d{3}$|^(977)$/i,\n  NZ: fourDigit,\n  PL: /^\\d{2}\\-\\d{3}$/,\n  PR: /^00[679]\\d{2}([ -]\\d{4})?$/,\n  PT: /^\\d{4}\\-\\d{3}?$/,\n  RO: sixDigit,\n  RU: sixDigit,\n  SA: fiveDigit,\n  SE: /^[1-9]\\d{2}\\s?\\d{2}$/,\n  SG: sixDigit,\n  SI: fourDigit,\n  SK: /^\\d{3}\\s?\\d{2}$/,\n  TH: fiveDigit,\n  TN: fourDigit,\n  TW: /^\\d{3}(\\d{2})?$/,\n  UA: fiveDigit,\n  US: /^\\d{5}(-\\d{4})?$/,\n  ZA: fourDigit,\n  ZM: fiveDigit\n};\nvar locales = exports.locales = Object.keys(patterns);\nfunction isPostalCode(str, locale) {\n  (0, _assertString.default)(str);\n  if (locale in patterns) {\n    return patterns[locale].test(str);\n  } else if (locale === 'any') {\n    for (var key in patterns) {\n      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n      // istanbul ignore else\n      if (patterns.hasOwnProperty(key)) {\n        var pattern = patterns[key];\n        if (pattern.test(str)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isRFC3339;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */\n\nvar dateFullYear = /[0-9]{4}/;\nvar dateMonth = /(0[1-9]|1[0-2])/;\nvar dateMDay = /([12]\\d|0[1-9]|3[01])/;\nvar timeHour = /([01][0-9]|2[0-3])/;\nvar timeMinute = /[0-5][0-9]/;\nvar timeSecond = /([0-5][0-9]|60)/;\nvar timeSecFrac = /(\\.[0-9]+)?/;\nvar timeNumOffset = new RegExp(\"[-+]\".concat(timeHour.source, \":\").concat(timeMinute.source));\nvar timeOffset = new RegExp(\"([zZ]|\".concat(timeNumOffset.source, \")\"));\nvar partialTime = new RegExp(\"\".concat(timeHour.source, \":\").concat(timeMinute.source, \":\").concat(timeSecond.source).concat(timeSecFrac.source));\nvar fullDate = new RegExp(\"\".concat(dateFullYear.source, \"-\").concat(dateMonth.source, \"-\").concat(dateMDay.source));\nvar fullTime = new RegExp(\"\".concat(partialTime.source).concat(timeOffset.source));\nvar rfc3339 = new RegExp(\"^\".concat(fullDate.source, \"[ tT]\").concat(fullTime.source, \"$\"));\nfunction isRFC3339(str) {\n  (0, _assertString.default)(str);\n  return rfc3339.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isRgbColor;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar rgbColor = /^rgb\\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\)$/;\nvar rgbaColor = /^rgba\\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\\.\\d|1(\\.0)?|0(\\.0)?)\\)$/;\nvar rgbColorPercent = /^rgb\\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\\)$/;\nvar rgbaColorPercent = /^rgba\\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\\.\\d|1(\\.0)?|0(\\.0)?)\\)$/;\nfunction isRgbColor(str) {\n  var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  (0, _assertString.default)(str);\n  if (!includePercentValues) {\n    return rgbColor.test(str) || rgbaColor.test(str);\n  }\n  return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isSemVer;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _multilineRegex = _interopRequireDefault(require(\"./util/multilineRegex\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n/**\n * Regular Expression to match\n * semantic versioning (SemVer)\n * built from multi-line, multi-parts regexp\n * Reference: https://semver.org/\n */\nvar semanticVersioningRegex = (0, _multilineRegex.default)(['^(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)', '(?:-((?:0|[1-9]\\\\d*|\\\\d*[a-z-][0-9a-z-]*)(?:\\\\.(?:0|[1-9]\\\\d*|\\\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\\\+([0-9a-z-]+(?:\\\\.[0-9a-z-]+)*))?$'], 'i');\nfunction isSemVer(str) {\n  (0, _assertString.default)(str);\n  return semanticVersioningRegex.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isSlug;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar charsetRegex = /^[^\\s-_](?!.*?[-_]{2,})[a-z0-9-\\\\][^\\s]*[^-_\\s]$/;\nfunction isSlug(str) {\n  (0, _assertString.default)(str);\n  return charsetRegex.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isStrongPassword;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar upperCaseRegex = /^[A-Z]$/;\nvar lowerCaseRegex = /^[a-z]$/;\nvar numberRegex = /^[0-9]$/;\nvar symbolRegex = /^[-#!$@£%^&*()_+|~=`{}\\[\\]:\";'<>?,.\\/\\\\ ]$/;\nvar defaultOptions = {\n  minLength: 8,\n  minLowercase: 1,\n  minUppercase: 1,\n  minNumbers: 1,\n  minSymbols: 1,\n  returnScore: false,\n  pointsPerUnique: 1,\n  pointsPerRepeat: 0.5,\n  pointsForContainingLower: 10,\n  pointsForContainingUpper: 10,\n  pointsForContainingNumber: 10,\n  pointsForContainingSymbol: 10\n};\n\n/* Counts number of occurrences of each char in a string\n * could be moved to util/ ?\n*/\nfunction countChars(str) {\n  var result = {};\n  Array.from(str).forEach(function (char) {\n    var curVal = result[char];\n    if (curVal) {\n      result[char] += 1;\n    } else {\n      result[char] = 1;\n    }\n  });\n  return result;\n}\n\n/* Return information about a password */\nfunction analyzePassword(password) {\n  var charMap = countChars(password);\n  var analysis = {\n    length: password.length,\n    uniqueChars: Object.keys(charMap).length,\n    uppercaseCount: 0,\n    lowercaseCount: 0,\n    numberCount: 0,\n    symbolCount: 0\n  };\n  Object.keys(charMap).forEach(function (char) {\n    /* istanbul ignore else */\n    if (upperCaseRegex.test(char)) {\n      analysis.uppercaseCount += charMap[char];\n    } else if (lowerCaseRegex.test(char)) {\n      analysis.lowercaseCount += charMap[char];\n    } else if (numberRegex.test(char)) {\n      analysis.numberCount += charMap[char];\n    } else if (symbolRegex.test(char)) {\n      analysis.symbolCount += charMap[char];\n    }\n  });\n  return analysis;\n}\nfunction scorePassword(analysis, scoringOptions) {\n  var points = 0;\n  points += analysis.uniqueChars * scoringOptions.pointsPerUnique;\n  points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;\n  if (analysis.lowercaseCount > 0) {\n    points += scoringOptions.pointsForContainingLower;\n  }\n  if (analysis.uppercaseCount > 0) {\n    points += scoringOptions.pointsForContainingUpper;\n  }\n  if (analysis.numberCount > 0) {\n    points += scoringOptions.pointsForContainingNumber;\n  }\n  if (analysis.symbolCount > 0) {\n    points += scoringOptions.pointsForContainingSymbol;\n  }\n  return points;\n}\nfunction isStrongPassword(str) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  (0, _assertString.default)(str);\n  var analysis = analyzePassword(str);\n  options = (0, _merge.default)(options || {}, defaultOptions);\n  if (options.returnScore) {\n    return scorePassword(analysis, options);\n  }\n  return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isSurrogatePair;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar surrogatePair = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nfunction isSurrogatePair(str) {\n  (0, _assertString.default)(str);\n  return surrogatePair.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isTaxID;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar algorithms = _interopRequireWildcard(require(\"./util/algorithms\"));\nvar _isDate = _interopRequireDefault(require(\"./isDate\"));\nfunction _getRequireWildcardCache(e) { if (\"function\" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }\nfunction _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if (\"default\" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n/**\n * TIN Validation\n * Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.\n *\n * EU-UK:\n * National TIN validity is calculated using public algorithms as made available by DG TAXUD.\n *\n * See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.\n *\n * US:\n * An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,\n *  is used to identify a business entity.\n *\n * NOTES:\n *  - Prefix 47 is being reserved for future use\n *  - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.\n *\n * See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`\n * for more information.\n */\n\n// Locale functions\n\n/*\n * bg-BG validation function\n * (Edinen graždanski nomer (EGN/ЕГН), persons only)\n * Checks if birth date (first six digits) is valid and calculates check (last) digit\n */\nfunction bgBgCheck(tin) {\n  // Extract full year, normalize month and check birth date validity\n  var century_year = tin.slice(0, 2);\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 40) {\n    month -= 40;\n    century_year = \"20\".concat(century_year);\n  } else if (month > 20) {\n    month -= 20;\n    century_year = \"18\".concat(century_year);\n  } else {\n    century_year = \"19\".concat(century_year);\n  }\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n  var date = \"\".concat(century_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n\n  // Calculate checksum by multiplying digits with fixed values\n  var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n  var checksum = 0;\n  for (var i = 0; i < multip_lookup.length; i++) {\n    checksum += digits[i] * multip_lookup[i];\n  }\n  checksum = checksum % 11 === 10 ? 0 : checksum % 11;\n  return checksum === digits[9];\n}\n\n/**\n * Check if an input is a valid Canadian SIN (Social Insurance Number)\n *\n * The Social Insurance Number (SIN) is a 9 digit number that\n * you need to work in Canada or to have access to government programs and benefits.\n *\n * https://en.wikipedia.org/wiki/Social_Insurance_Number\n * https://www.canada.ca/en/employment-social-development/services/sin.html\n * https://www.codercrunch.com/challenge/819302488/sin-validator\n *\n * @param {string} input\n * @return {boolean}\n */\nfunction isCanadianSIN(input) {\n  var digitsArray = input.split('');\n  var even = digitsArray.filter(function (_, idx) {\n    return idx % 2;\n  }).map(function (i) {\n    return Number(i) * 2;\n  }).join('').split('');\n  var total = digitsArray.filter(function (_, idx) {\n    return !(idx % 2);\n  }).concat(even).map(function (i) {\n    return Number(i);\n  }).reduce(function (acc, cur) {\n    return acc + cur;\n  });\n  return total % 10 === 0;\n}\n\n/*\n * cs-CZ validation function\n * (Rodné číslo (RČ), persons only)\n * Checks if birth date (first six digits) is valid and divisibility by 11\n * Material not in DG TAXUD document sourced from:\n * -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`\n * -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`\n */\nfunction csCzCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n\n  // Extract full year from TIN length\n  var full_year = parseInt(tin.slice(0, 2), 10);\n  if (tin.length === 10) {\n    if (full_year < 54) {\n      full_year = \"20\".concat(full_year);\n    } else {\n      full_year = \"19\".concat(full_year);\n    }\n  } else {\n    if (tin.slice(6) === '000') {\n      return false;\n    } // Three-zero serial not assigned before 1954\n    if (full_year < 54) {\n      full_year = \"19\".concat(full_year);\n    } else {\n      return false; // No 18XX years seen in any of the resources\n    }\n  }\n  // Add missing zero if needed\n  if (full_year.length === 3) {\n    full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');\n  }\n\n  // Extract month from TIN and normalize\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 50) {\n    month -= 50;\n  }\n  if (month > 20) {\n    // Month-plus-twenty was only introduced in 2004\n    if (parseInt(full_year, 10) < 2004) {\n      return false;\n    }\n    month -= 20;\n  }\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Verify divisibility by 11\n  if (tin.length === 10) {\n    if (parseInt(tin, 10) % 11 !== 0) {\n      // Some numbers up to and including 1985 are still valid if\n      // check (last) digit equals 0 and modulo of first 9 digits equals 10\n      var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;\n      if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {\n        if (parseInt(tin.slice(9), 10) !== 0) {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n/*\n * de-AT validation function\n * (Abgabenkontonummer, persons/entities)\n * Verify TIN validity by calling luhnCheck()\n */\nfunction deAtCheck(tin) {\n  return algorithms.luhnCheck(tin);\n}\n\n/*\n * de-DE validation function\n * (Steueridentifikationsnummer (Steuer-IdNr.), persons only)\n * Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit\n * Partial implementation of spec (same result with both algorithms always)\n */\nfunction deDeCheck(tin) {\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n\n  // Fill array with strings of number positions\n  var occurences = [];\n  for (var i = 0; i < digits.length - 1; i++) {\n    occurences.push('');\n    for (var j = 0; j < digits.length - 1; j++) {\n      if (digits[i] === digits[j]) {\n        occurences[i] += j;\n      }\n    }\n  }\n\n  // Remove digits with one occurence and test for only one duplicate/triplicate\n  occurences = occurences.filter(function (a) {\n    return a.length > 1;\n  });\n  if (occurences.length !== 2 && occurences.length !== 3) {\n    return false;\n  }\n\n  // In case of triplicate value only two digits are allowed next to each other\n  if (occurences[0].length === 3) {\n    var trip_locations = occurences[0].split('').map(function (a) {\n      return parseInt(a, 10);\n    });\n    var recurrent = 0; // Amount of neighbour occurences\n    for (var _i = 0; _i < trip_locations.length - 1; _i++) {\n      if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {\n        recurrent += 1;\n      }\n    }\n    if (recurrent === 2) {\n      return false;\n    }\n  }\n  return algorithms.iso7064Check(tin);\n}\n\n/*\n * dk-DK validation function\n * (CPR-nummer (personnummer), persons only)\n * Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,\n * and calculates check (last) digit\n */\nfunction dkDkCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n\n  // Extract year, check if valid for given century digit and add century\n  var year = parseInt(tin.slice(4, 6), 10);\n  var century_digit = tin.slice(6, 7);\n  switch (century_digit) {\n    case '0':\n    case '1':\n    case '2':\n    case '3':\n      year = \"19\".concat(year);\n      break;\n    case '4':\n    case '9':\n      if (year < 37) {\n        year = \"20\".concat(year);\n      } else {\n        year = \"19\".concat(year);\n      }\n      break;\n    default:\n      if (year < 37) {\n        year = \"20\".concat(year);\n      } else if (year > 58) {\n        year = \"18\".concat(year);\n      } else {\n        return false;\n      }\n      break;\n  }\n  // Add missing zero if needed\n  if (year.length === 3) {\n    year = [year.slice(0, 2), '0', year.slice(2)].join('');\n  }\n  // Check date validity\n  var date = \"\".concat(year, \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(0, 2));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  var weight = 4;\n  // Multiply by weight and add to checksum\n  for (var i = 0; i < 9; i++) {\n    checksum += digits[i] * weight;\n    weight -= 1;\n    if (weight === 1) {\n      weight = 7;\n    }\n  }\n  checksum %= 11;\n  if (checksum === 1) {\n    return false;\n  }\n  return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;\n}\n\n/*\n * el-CY validation function\n * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)\n * Verify TIN validity by calculating ASCII value of check (last) character\n */\nfunction elCyCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.slice(0, 8).split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  // add digits in even places\n  for (var i = 1; i < digits.length; i += 2) {\n    checksum += digits[i];\n  }\n\n  // add digits in odd places\n  for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {\n    if (digits[_i2] < 2) {\n      checksum += 1 - digits[_i2];\n    } else {\n      checksum += 2 * (digits[_i2] - 2) + 5;\n      if (digits[_i2] > 4) {\n        checksum += 2;\n      }\n    }\n  }\n  return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);\n}\n\n/*\n * el-GR validation function\n * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)\n * Verify TIN validity by calculating check (last) digit\n * Algorithm not in DG TAXUD document- sourced from:\n * - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`\n */\nfunction elGrCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  for (var i = 0; i < 8; i++) {\n    checksum += digits[i] * Math.pow(2, 8 - i);\n  }\n  return checksum % 11 % 10 === digits[8];\n}\n\n/*\n * en-GB validation function (should go here if needed)\n * (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),\n * persons/entities respectively)\n */\n\n/*\n * en-IE validation function\n * (Personal Public Service Number (PPS No), persons only)\n * Verify TIN validity by calculating check (second to last) character\n */\nfunction enIeCheck(tin) {\n  var checksum = algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {\n    return parseInt(a, 10);\n  }), 8);\n  if (tin.length === 9 && tin[8] !== 'W') {\n    checksum += (tin[8].charCodeAt(0) - 64) * 9;\n  }\n  checksum %= 23;\n  if (checksum === 0) {\n    return tin[7].toUpperCase() === 'W';\n  }\n  return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);\n}\n\n// Valid US IRS campus prefixes\nvar enUsCampusPrefix = {\n  andover: ['10', '12'],\n  atlanta: ['60', '67'],\n  austin: ['50', '53'],\n  brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],\n  cincinnati: ['30', '32', '35', '36', '37', '38', '61'],\n  fresno: ['15', '24'],\n  internet: ['20', '26', '27', '45', '46', '47'],\n  kansas: ['40', '44'],\n  memphis: ['94', '95'],\n  ogden: ['80', '90'],\n  philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],\n  sba: ['31']\n};\n\n// Return an array of all US IRS campus prefixes\nfunction enUsGetPrefixes() {\n  var prefixes = [];\n  for (var location in enUsCampusPrefix) {\n    // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes\n    // istanbul ignore else\n    if (enUsCampusPrefix.hasOwnProperty(location)) {\n      prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));\n    }\n  }\n  return prefixes;\n}\n\n/*\n * en-US validation function\n * Verify that the TIN starts with a valid IRS campus prefix\n */\nfunction enUsCheck(tin) {\n  return enUsGetPrefixes().indexOf(tin.slice(0, 2)) !== -1;\n}\n\n/*\n * es-AR validation function\n * Clave Única de Identificación Tributaria (CUIT/CUIL)\n * Sourced from:\n * - https://servicioscf.afip.gob.ar/publico/abc/ABCpaso2.aspx?id_nivel1=3036&id_nivel2=3040&p=Conceptos%20b%C3%A1sicos\n * - https://es.wikipedia.org/wiki/Clave_%C3%9Anica_de_Identificaci%C3%B3n_Tributaria\n */\n\nfunction esArCheck(tin) {\n  var accum = 0;\n  var digits = tin.split('');\n  var digit = parseInt(digits.pop(), 10);\n  for (var i = 0; i < digits.length; i++) {\n    accum += digits[9 - i] * (2 + i % 6);\n  }\n  var verif = 11 - accum % 11;\n  if (verif === 11) {\n    verif = 0;\n  } else if (verif === 10) {\n    verif = 9;\n  }\n  return digit === verif;\n}\n\n/*\n * es-ES validation function\n * (Documento Nacional de Identidad (DNI)\n * or Número de Identificación de Extranjero (NIE), persons only)\n * Verify TIN validity by calculating check (last) character\n */\nfunction esEsCheck(tin) {\n  // Split characters into an array for further processing\n  var chars = tin.toUpperCase().split('');\n\n  // Replace initial letter if needed\n  if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {\n    var lead_replace = 0;\n    switch (chars[0]) {\n      case 'Y':\n        lead_replace = 1;\n        break;\n      case 'Z':\n        lead_replace = 2;\n        break;\n      default:\n    }\n    chars.splice(0, 1, lead_replace);\n    // Fill with zeros if smaller than proper\n  } else {\n    while (chars.length < 9) {\n      chars.unshift(0);\n    }\n  }\n\n  // Calculate checksum and check according to lookup\n  var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];\n  chars = chars.join('');\n  var checksum = parseInt(chars.slice(0, 8), 10) % 23;\n  return chars[8] === lookup[checksum];\n}\n\n/*\n * et-EE validation function\n * (Isikukood (IK), persons only)\n * Checks if birth date (century digit and six following) is valid and calculates check (last) digit\n * Material not in DG TAXUD document sourced from:\n * - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`\n */\nfunction etEeCheck(tin) {\n  // Extract year and add century\n  var full_year = tin.slice(1, 3);\n  var century_digit = tin.slice(0, 1);\n  switch (century_digit) {\n    case '1':\n    case '2':\n      full_year = \"18\".concat(full_year);\n      break;\n    case '3':\n    case '4':\n      full_year = \"19\".concat(full_year);\n      break;\n    default:\n      full_year = \"20\".concat(full_year);\n      break;\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(tin.slice(3, 5), \"/\").concat(tin.slice(5, 7));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 0;\n  var weight = 1;\n  // Multiply by weight and add to checksum\n  for (var i = 0; i < 10; i++) {\n    checksum += digits[i] * weight;\n    weight += 1;\n    if (weight === 10) {\n      weight = 1;\n    }\n  }\n  // Do again if modulo 11 of checksum is 10\n  if (checksum % 11 === 10) {\n    checksum = 0;\n    weight = 3;\n    for (var _i3 = 0; _i3 < 10; _i3++) {\n      checksum += digits[_i3] * weight;\n      weight += 1;\n      if (weight === 10) {\n        weight = 1;\n      }\n    }\n    if (checksum % 11 === 10) {\n      return digits[10] === 0;\n    }\n  }\n  return checksum % 11 === digits[10];\n}\n\n/*\n * fi-FI validation function\n * (Henkilötunnus (HETU), persons only)\n * Checks if birth date (first six digits plus century symbol) is valid\n * and calculates check (last) digit\n */\nfunction fiFiCheck(tin) {\n  // Extract year and add century\n  var full_year = tin.slice(4, 6);\n  var century_symbol = tin.slice(6, 7);\n  switch (century_symbol) {\n    case '+':\n      full_year = \"18\".concat(full_year);\n      break;\n    case '-':\n      full_year = \"19\".concat(full_year);\n      break;\n    default:\n      full_year = \"20\".concat(full_year);\n      break;\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(0, 2));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate check character\n  var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;\n  if (checksum < 10) {\n    return checksum === parseInt(tin.slice(10), 10);\n  }\n  checksum -= 10;\n  var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];\n  return letters_lookup[checksum] === tin.slice(10);\n}\n\n/*\n * fr/nl-BE validation function\n * (Numéro national (N.N.), persons only)\n * Checks if birth date (first six digits) is valid and calculates check (last two) digits\n */\nfunction frBeCheck(tin) {\n  // Zero month/day value is acceptable\n  if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {\n    // Extract date from first six digits of TIN\n    var date = \"\".concat(tin.slice(0, 2), \"/\").concat(tin.slice(2, 4), \"/\").concat(tin.slice(4, 6));\n    if (!(0, _isDate.default)(date, 'YY/MM/DD')) {\n      return false;\n    }\n  }\n  var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;\n  var checkdigits = parseInt(tin.slice(9, 11), 10);\n  if (checksum !== checkdigits) {\n    checksum = 97 - parseInt(\"2\".concat(tin.slice(0, 9)), 10) % 97;\n    if (checksum !== checkdigits) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/*\n * fr-FR validation function\n * (Numéro fiscal de référence (numéro SPI), persons only)\n * Verify TIN validity by calculating check (last three) digits\n */\nfunction frFrCheck(tin) {\n  tin = tin.replace(/\\s/g, '');\n  var checksum = parseInt(tin.slice(0, 10), 10) % 511;\n  var checkdigits = parseInt(tin.slice(10, 13), 10);\n  return checksum === checkdigits;\n}\n\n/*\n * fr/lb-LU validation function\n * (numéro d’identification personnelle, persons only)\n * Verify birth date validity and run Luhn and Verhoeff checks\n */\nfunction frLuCheck(tin) {\n  // Extract date and check validity\n  var date = \"\".concat(tin.slice(0, 4), \"/\").concat(tin.slice(4, 6), \"/\").concat(tin.slice(6, 8));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Run Luhn check\n  if (!algorithms.luhnCheck(tin.slice(0, 12))) {\n    return false;\n  }\n  // Remove Luhn check digit and run Verhoeff check\n  return algorithms.verhoeffCheck(\"\".concat(tin.slice(0, 11)).concat(tin[12]));\n}\n\n/*\n * hr-HR validation function\n * (Osobni identifikacijski broj (OIB), persons/entities)\n * Verify TIN validity by calling iso7064Check(digits)\n */\nfunction hrHrCheck(tin) {\n  return algorithms.iso7064Check(tin);\n}\n\n/*\n * hu-HU validation function\n * (Adóazonosító jel, persons only)\n * Verify TIN validity by calculating check (last) digit\n */\nfunction huHuCheck(tin) {\n  // split digits into an array for further processing\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var checksum = 8;\n  for (var i = 1; i < 9; i++) {\n    checksum += digits[i] * (i + 1);\n  }\n  return checksum % 11 === digits[9];\n}\n\n/*\n * lt-LT validation function (should go here if needed)\n * (Asmens kodas, persons/entities respectively)\n * Current validation check is alias of etEeCheck- same format applies\n */\n\n/*\n * it-IT first/last name validity check\n * Accepts it-IT TIN-encoded names as a three-element character array and checks their validity\n * Due to lack of clarity between resources (\"Are only Italian consonants used?\n * What happens if a person has X in their name?\" etc.) only two test conditions\n * have been implemented:\n * Vowels may only be followed by other vowels or an X character\n * and X characters after vowels may only be followed by other X characters.\n */\nfunction itItNameCheck(name) {\n  // true at the first occurence of a vowel\n  var vowelflag = false;\n\n  // true at the first occurence of an X AFTER vowel\n  // (to properly handle last names with X as consonant)\n  var xflag = false;\n  for (var i = 0; i < 3; i++) {\n    if (!vowelflag && /[AEIOU]/.test(name[i])) {\n      vowelflag = true;\n    } else if (!xflag && vowelflag && name[i] === 'X') {\n      xflag = true;\n    } else if (i > 0) {\n      if (vowelflag && !xflag) {\n        if (!/[AEIOU]/.test(name[i])) {\n          return false;\n        }\n      }\n      if (xflag) {\n        if (!/X/.test(name[i])) {\n          return false;\n        }\n      }\n    }\n  }\n  return true;\n}\n\n/*\n * it-IT validation function\n * (Codice fiscale (TIN-IT), persons only)\n * Verify name, birth date and codice catastale validity\n * and calculate check character.\n * Material not in DG-TAXUD document sourced from:\n * `https://en.wikipedia.org/wiki/Italian_fiscal_code`\n */\nfunction itItCheck(tin) {\n  // Capitalize and split characters into an array for further processing\n  var chars = tin.toUpperCase().split('');\n\n  // Check first and last name validity calling itItNameCheck()\n  if (!itItNameCheck(chars.slice(0, 3))) {\n    return false;\n  }\n  if (!itItNameCheck(chars.slice(3, 6))) {\n    return false;\n  }\n\n  // Convert letters in number spaces back to numbers if any\n  var number_locations = [6, 7, 9, 10, 12, 13, 14];\n  var number_replace = {\n    L: '0',\n    M: '1',\n    N: '2',\n    P: '3',\n    Q: '4',\n    R: '5',\n    S: '6',\n    T: '7',\n    U: '8',\n    V: '9'\n  };\n  for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {\n    var i = _number_locations[_i4];\n    if (chars[i] in number_replace) {\n      chars.splice(i, 1, number_replace[chars[i]]);\n    }\n  }\n\n  // Extract month and day, and check date validity\n  var month_replace = {\n    A: '01',\n    B: '02',\n    C: '03',\n    D: '04',\n    E: '05',\n    H: '06',\n    L: '07',\n    M: '08',\n    P: '09',\n    R: '10',\n    S: '11',\n    T: '12'\n  };\n  var month = month_replace[chars[8]];\n  var day = parseInt(chars[9] + chars[10], 10);\n  if (day > 40) {\n    day -= 40;\n  }\n  if (day < 10) {\n    day = \"0\".concat(day);\n  }\n  var date = \"\".concat(chars[6]).concat(chars[7], \"/\").concat(month, \"/\").concat(day);\n  if (!(0, _isDate.default)(date, 'YY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate check character by adding up even and odd characters as numbers\n  var checksum = 0;\n  for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {\n    var char_to_int = parseInt(chars[_i5], 10);\n    if (isNaN(char_to_int)) {\n      char_to_int = chars[_i5].charCodeAt(0) - 65;\n    }\n    checksum += char_to_int;\n  }\n  var odd_convert = {\n    // Maps of characters at odd places\n    A: 1,\n    B: 0,\n    C: 5,\n    D: 7,\n    E: 9,\n    F: 13,\n    G: 15,\n    H: 17,\n    I: 19,\n    J: 21,\n    K: 2,\n    L: 4,\n    M: 18,\n    N: 20,\n    O: 11,\n    P: 3,\n    Q: 6,\n    R: 8,\n    S: 12,\n    T: 14,\n    U: 16,\n    V: 10,\n    W: 22,\n    X: 25,\n    Y: 24,\n    Z: 23,\n    0: 1,\n    1: 0\n  };\n  for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {\n    var _char_to_int = 0;\n    if (chars[_i6] in odd_convert) {\n      _char_to_int = odd_convert[chars[_i6]];\n    } else {\n      var multiplier = parseInt(chars[_i6], 10);\n      _char_to_int = 2 * multiplier + 1;\n      if (multiplier > 4) {\n        _char_to_int += 2;\n      }\n    }\n    checksum += _char_to_int;\n  }\n  if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {\n    return false;\n  }\n  return true;\n}\n\n/*\n * lv-LV validation function\n * (Personas kods (PK), persons only)\n * Check validity of birth date and calculate check (last) digit\n * Support only for old format numbers (not starting with '32', issued before 2017/07/01)\n * Material not in DG TAXUD document sourced from:\n * `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`\n */\nfunction lvLvCheck(tin) {\n  tin = tin.replace(/\\W/, '');\n  // Extract date from TIN\n  var day = tin.slice(0, 2);\n  if (day !== '32') {\n    // No date/checksum check if new format\n    var month = tin.slice(2, 4);\n    if (month !== '00') {\n      // No date check if unknown month\n      var full_year = tin.slice(4, 6);\n      switch (tin[6]) {\n        case '0':\n          full_year = \"18\".concat(full_year);\n          break;\n        case '1':\n          full_year = \"19\".concat(full_year);\n          break;\n        default:\n          full_year = \"20\".concat(full_year);\n          break;\n      }\n      // Check date validity\n      var date = \"\".concat(full_year, \"/\").concat(tin.slice(2, 4), \"/\").concat(day);\n      if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n        return false;\n      }\n    }\n\n    // Calculate check digit\n    var checksum = 1101;\n    var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n    for (var i = 0; i < tin.length - 1; i++) {\n      checksum -= parseInt(tin[i], 10) * multip_lookup[i];\n    }\n    return parseInt(tin[10], 10) === checksum % 11;\n  }\n  return true;\n}\n\n/*\n * mt-MT validation function\n * (Identity Card Number or Unique Taxpayer Reference, persons/entities)\n * Verify Identity Card Number structure (no other tests found)\n */\nfunction mtMtCheck(tin) {\n  if (tin.length !== 9) {\n    // No tests for UTR\n    var chars = tin.toUpperCase().split('');\n    // Fill with zeros if smaller than proper\n    while (chars.length < 8) {\n      chars.unshift(0);\n    }\n    // Validate format according to last character\n    switch (tin[7]) {\n      case 'A':\n      case 'P':\n        if (parseInt(chars[6], 10) === 0) {\n          return false;\n        }\n        break;\n      default:\n        {\n          var first_part = parseInt(chars.join('').slice(0, 5), 10);\n          if (first_part > 32000) {\n            return false;\n          }\n          var second_part = parseInt(chars.join('').slice(5, 7), 10);\n          if (first_part === second_part) {\n            return false;\n          }\n        }\n    }\n  }\n  return true;\n}\n\n/*\n * nl-NL validation function\n * (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),\n * persons/entities respectively)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction nlNlCheck(tin) {\n  return algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11 === parseInt(tin[8], 10);\n}\n\n/*\n * pl-PL validation function\n * (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)\n * or Numer identyfikacji podatkowej (NIP), persons/entities)\n * Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit\n */\nfunction plPlCheck(tin) {\n  // NIP\n  if (tin.length === 10) {\n    // Calculate last digit by multiplying with lookup\n    var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];\n    var _checksum = 0;\n    for (var i = 0; i < lookup.length; i++) {\n      _checksum += parseInt(tin[i], 10) * lookup[i];\n    }\n    _checksum %= 11;\n    if (_checksum === 10) {\n      return false;\n    }\n    return _checksum === parseInt(tin[9], 10);\n  }\n\n  // PESEL\n  // Extract full year using month\n  var full_year = tin.slice(0, 2);\n  var month = parseInt(tin.slice(2, 4), 10);\n  if (month > 80) {\n    full_year = \"18\".concat(full_year);\n    month -= 80;\n  } else if (month > 60) {\n    full_year = \"22\".concat(full_year);\n    month -= 60;\n  } else if (month > 40) {\n    full_year = \"21\".concat(full_year);\n    month -= 40;\n  } else if (month > 20) {\n    full_year = \"20\".concat(full_year);\n    month -= 20;\n  } else {\n    full_year = \"19\".concat(full_year);\n  }\n  // Add leading zero to month if needed\n  if (month < 10) {\n    month = \"0\".concat(month);\n  }\n  // Check date validity\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n\n  // Calculate last digit by mulitplying with odd one-digit numbers except 5\n  var checksum = 0;\n  var multiplier = 1;\n  for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {\n    checksum += parseInt(tin[_i7], 10) * multiplier % 10;\n    multiplier += 2;\n    if (multiplier > 10) {\n      multiplier = 1;\n    } else if (multiplier === 5) {\n      multiplier += 2;\n    }\n  }\n  checksum = 10 - checksum % 10;\n  return checksum === parseInt(tin[10], 10);\n}\n\n/*\n* pt-BR validation function\n* (Cadastro de Pessoas Físicas (CPF, persons)\n* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)\n* Both inputs will be validated\n*/\n\nfunction ptBrCheck(tin) {\n  if (tin.length === 11) {\n    var _sum;\n    var remainder;\n    _sum = 0;\n    if (\n    // Reject known invalid CPFs\n    tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;\n    for (var i = 1; i <= 9; i++) _sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);\n    remainder = _sum * 10 % 11;\n    if (remainder === 10) remainder = 0;\n    if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;\n    _sum = 0;\n    for (var _i8 = 1; _i8 <= 10; _i8++) _sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);\n    remainder = _sum * 10 % 11;\n    if (remainder === 10) remainder = 0;\n    if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;\n    return true;\n  }\n  if (\n  // Reject know invalid CNPJs\n  tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {\n    return false;\n  }\n  var length = tin.length - 2;\n  var identifiers = tin.substring(0, length);\n  var verificators = tin.substring(length);\n  var sum = 0;\n  var pos = length - 7;\n  for (var _i9 = length; _i9 >= 1; _i9--) {\n    sum += identifiers.charAt(length - _i9) * pos;\n    pos -= 1;\n    if (pos < 2) {\n      pos = 9;\n    }\n  }\n  var result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n  if (result !== parseInt(verificators.charAt(0), 10)) {\n    return false;\n  }\n  length += 1;\n  identifiers = tin.substring(0, length);\n  sum = 0;\n  pos = length - 7;\n  for (var _i10 = length; _i10 >= 1; _i10--) {\n    sum += identifiers.charAt(length - _i10) * pos;\n    pos -= 1;\n    if (pos < 2) {\n      pos = 9;\n    }\n  }\n  result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n  if (result !== parseInt(verificators.charAt(1), 10)) {\n    return false;\n  }\n  return true;\n}\n\n/*\n * pt-PT validation function\n * (Número de identificação fiscal (NIF), persons/entities)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction ptPtCheck(tin) {\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11;\n  if (checksum > 9) {\n    return parseInt(tin[8], 10) === 0;\n  }\n  return checksum === parseInt(tin[8], 10);\n}\n\n/*\n * ro-RO validation function\n * (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),\n * persons only)\n * Verify CNP validity by calculating check (last) digit (test not found for CIF)\n * Material not in DG TAXUD document sourced from:\n * `https://en.wikipedia.org/wiki/National_identification_number#Romania`\n */\nfunction roRoCheck(tin) {\n  if (tin.slice(0, 4) !== '9000') {\n    // No test found for this format\n    // Extract full year using century digit if possible\n    var full_year = tin.slice(1, 3);\n    switch (tin[0]) {\n      case '1':\n      case '2':\n        full_year = \"19\".concat(full_year);\n        break;\n      case '3':\n      case '4':\n        full_year = \"18\".concat(full_year);\n        break;\n      case '5':\n      case '6':\n        full_year = \"20\".concat(full_year);\n        break;\n      default:\n    }\n\n    // Check date validity\n    var date = \"\".concat(full_year, \"/\").concat(tin.slice(3, 5), \"/\").concat(tin.slice(5, 7));\n    if (date.length === 8) {\n      if (!(0, _isDate.default)(date, 'YY/MM/DD')) {\n        return false;\n      }\n    } else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n      return false;\n    }\n\n    // Calculate check digit\n    var digits = tin.split('').map(function (a) {\n      return parseInt(a, 10);\n    });\n    var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];\n    var checksum = 0;\n    for (var i = 0; i < multipliers.length; i++) {\n      checksum += digits[i] * multipliers[i];\n    }\n    if (checksum % 11 === 10) {\n      return digits[12] === 1;\n    }\n    return digits[12] === checksum % 11;\n  }\n  return true;\n}\n\n/*\n * sk-SK validation function\n * (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)\n * Checks validity of pre-1954 birth numbers (rodné číslo) only\n * Due to the introduction of the pseudo-random BIČ it is not possible to test\n * post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand\n */\nfunction skSkCheck(tin) {\n  if (tin.length === 9) {\n    tin = tin.replace(/\\W/, '');\n    if (tin.slice(6) === '000') {\n      return false;\n    } // Three-zero serial not assigned before 1954\n\n    // Extract full year from TIN length\n    var full_year = parseInt(tin.slice(0, 2), 10);\n    if (full_year > 53) {\n      return false;\n    }\n    if (full_year < 10) {\n      full_year = \"190\".concat(full_year);\n    } else {\n      full_year = \"19\".concat(full_year);\n    }\n\n    // Extract month from TIN and normalize\n    var month = parseInt(tin.slice(2, 4), 10);\n    if (month > 50) {\n      month -= 50;\n    }\n    if (month < 10) {\n      month = \"0\".concat(month);\n    }\n\n    // Check date validity\n    var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(tin.slice(4, 6));\n    if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/*\n * sl-SI validation function\n * (Davčna številka, persons/entities)\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction slSiCheck(tin) {\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {\n    return parseInt(a, 10);\n  }), 8) % 11;\n  if (checksum === 10) {\n    return parseInt(tin[7], 10) === 0;\n  }\n  return checksum === parseInt(tin[7], 10);\n}\n\n/*\n * sv-SE validation function\n * (Personnummer or samordningsnummer, persons only)\n * Checks validity of birth date and calls luhnCheck() to validate check (last) digit\n */\nfunction svSeCheck(tin) {\n  // Make copy of TIN and normalize to two-digit year form\n  var tin_copy = tin.slice(0);\n  if (tin.length > 11) {\n    tin_copy = tin_copy.slice(2);\n  }\n\n  // Extract date of birth\n  var full_year = '';\n  var month = tin_copy.slice(2, 4);\n  var day = parseInt(tin_copy.slice(4, 6), 10);\n  if (tin.length > 11) {\n    full_year = tin.slice(0, 4);\n  } else {\n    full_year = tin.slice(0, 2);\n    if (tin.length === 11 && day < 60) {\n      // Extract full year from centenarian symbol\n      // Should work just fine until year 10000 or so\n      var current_year = new Date().getFullYear().toString();\n      var current_century = parseInt(current_year.slice(0, 2), 10);\n      current_year = parseInt(current_year, 10);\n      if (tin[6] === '-') {\n        if (parseInt(\"\".concat(current_century).concat(full_year), 10) > current_year) {\n          full_year = \"\".concat(current_century - 1).concat(full_year);\n        } else {\n          full_year = \"\".concat(current_century).concat(full_year);\n        }\n      } else {\n        full_year = \"\".concat(current_century - 1).concat(full_year);\n        if (current_year - parseInt(full_year, 10) < 100) {\n          return false;\n        }\n      }\n    }\n  }\n\n  // Normalize day and check date validity\n  if (day > 60) {\n    day -= 60;\n  }\n  if (day < 10) {\n    day = \"0\".concat(day);\n  }\n  var date = \"\".concat(full_year, \"/\").concat(month, \"/\").concat(day);\n  if (date.length === 8) {\n    if (!(0, _isDate.default)(date, 'YY/MM/DD')) {\n      return false;\n    }\n  } else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {\n    return false;\n  }\n  return algorithms.luhnCheck(tin.replace(/\\W/, ''));\n}\n\n/**\n * uk-UA validation function\n * Verify TIN validity by calculating check (last) digit (variant of MOD 11)\n */\nfunction ukUaCheck(tin) {\n  // Calculate check digit\n  var digits = tin.split('').map(function (a) {\n    return parseInt(a, 10);\n  });\n  var multipliers = [-1, 5, 7, 9, 4, 6, 10, 5, 7];\n  var checksum = 0;\n  for (var i = 0; i < multipliers.length; i++) {\n    checksum += digits[i] * multipliers[i];\n  }\n  return checksum % 11 === 10 ? digits[9] === 0 : digits[9] === checksum % 11;\n}\n\n// Locale lookup objects\n\n/*\n * Tax id regex formats for various locales\n *\n * Where not explicitly specified in DG-TAXUD document both\n * uppercase and lowercase letters are acceptable.\n */\nvar taxIdFormat = {\n  'bg-BG': /^\\d{10}$/,\n  'cs-CZ': /^\\d{6}\\/{0,1}\\d{3,4}$/,\n  'de-AT': /^\\d{9}$/,\n  'de-DE': /^[1-9]\\d{10}$/,\n  'dk-DK': /^\\d{6}-{0,1}\\d{4}$/,\n  'el-CY': /^[09]\\d{7}[A-Z]$/,\n  'el-GR': /^([0-4]|[7-9])\\d{8}$/,\n  'en-CA': /^\\d{9}$/,\n  'en-GB': /^\\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\\d{6}[ABCD ]$/i,\n  'en-IE': /^\\d{7}[A-W][A-IW]{0,1}$/i,\n  'en-US': /^\\d{2}[- ]{0,1}\\d{7}$/,\n  'es-AR': /(20|23|24|27|30|33|34)[0-9]{8}[0-9]/,\n  'es-ES': /^(\\d{0,8}|[XYZKLM]\\d{7})[A-HJ-NP-TV-Z]$/i,\n  'et-EE': /^[1-6]\\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\\d$/,\n  'fi-FI': /^\\d{6}[-+A]\\d{3}[0-9A-FHJ-NPR-Y]$/i,\n  'fr-BE': /^\\d{11}$/,\n  'fr-FR': /^[0-3]\\d{12}$|^[0-3]\\d\\s\\d{2}(\\s\\d{3}){3}$/,\n  // Conforms both to official spec and provided example\n  'fr-LU': /^\\d{13}$/,\n  'hr-HR': /^\\d{11}$/,\n  'hu-HU': /^8\\d{9}$/,\n  'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,\n  'lv-LV': /^\\d{6}-{0,1}\\d{5}$/,\n  // Conforms both to DG TAXUD spec and original research\n  'mt-MT': /^\\d{3,7}[APMGLHBZ]$|^([1-8])\\1\\d{7}$/i,\n  'nl-NL': /^\\d{9}$/,\n  'pl-PL': /^\\d{10,11}$/,\n  'pt-BR': /(?:^\\d{11}$)|(?:^\\d{14}$)/,\n  'pt-PT': /^\\d{9}$/,\n  'ro-RO': /^\\d{13}$/,\n  'sk-SK': /^\\d{6}\\/{0,1}\\d{3,4}$/,\n  'sl-SI': /^[1-9]\\d{7}$/,\n  'sv-SE': /^(\\d{6}[-+]{0,1}\\d{4}|(18|19|20)\\d{6}[-+]{0,1}\\d{4})$/,\n  'uk-UA': /^\\d{10}$/\n};\n// taxIdFormat locale aliases\ntaxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];\ntaxIdFormat['lt-LT'] = taxIdFormat['et-EE'];\ntaxIdFormat['nl-BE'] = taxIdFormat['fr-BE'];\ntaxIdFormat['fr-CA'] = taxIdFormat['en-CA'];\n\n// Algorithmic tax id check functions for various locales\nvar taxIdCheck = {\n  'bg-BG': bgBgCheck,\n  'cs-CZ': csCzCheck,\n  'de-AT': deAtCheck,\n  'de-DE': deDeCheck,\n  'dk-DK': dkDkCheck,\n  'el-CY': elCyCheck,\n  'el-GR': elGrCheck,\n  'en-CA': isCanadianSIN,\n  'en-IE': enIeCheck,\n  'en-US': enUsCheck,\n  'es-AR': esArCheck,\n  'es-ES': esEsCheck,\n  'et-EE': etEeCheck,\n  'fi-FI': fiFiCheck,\n  'fr-BE': frBeCheck,\n  'fr-FR': frFrCheck,\n  'fr-LU': frLuCheck,\n  'hr-HR': hrHrCheck,\n  'hu-HU': huHuCheck,\n  'it-IT': itItCheck,\n  'lv-LV': lvLvCheck,\n  'mt-MT': mtMtCheck,\n  'nl-NL': nlNlCheck,\n  'pl-PL': plPlCheck,\n  'pt-BR': ptBrCheck,\n  'pt-PT': ptPtCheck,\n  'ro-RO': roRoCheck,\n  'sk-SK': skSkCheck,\n  'sl-SI': slSiCheck,\n  'sv-SE': svSeCheck,\n  'uk-UA': ukUaCheck\n};\n// taxIdCheck locale aliases\ntaxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];\ntaxIdCheck['lt-LT'] = taxIdCheck['et-EE'];\ntaxIdCheck['nl-BE'] = taxIdCheck['fr-BE'];\ntaxIdCheck['fr-CA'] = taxIdCheck['en-CA'];\n\n// Regexes for locales where characters should be omitted before checking format\nvar allsymbols = /[-\\\\\\/!@#$%\\^&\\*\\(\\)\\+\\=\\[\\]]+/g;\nvar sanitizeRegexes = {\n  'de-AT': allsymbols,\n  'de-DE': /[\\/\\\\]/g,\n  'fr-BE': allsymbols\n};\n// sanitizeRegexes locale aliases\nsanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];\n\n/*\n * Validator function\n * Return true if the passed string is a valid tax identification number\n * for the specified locale.\n * Throw an error exception if the locale is not supported.\n */\nfunction isTaxID(str) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';\n  (0, _assertString.default)(str);\n  // Copy TIN to avoid replacement if sanitized\n  var strcopy = str.slice(0);\n  if (locale in taxIdFormat) {\n    if (locale in sanitizeRegexes) {\n      strcopy = strcopy.replace(sanitizeRegexes[locale], '');\n    }\n    if (!taxIdFormat[locale].test(strcopy)) {\n      return false;\n    }\n    if (locale in taxIdCheck) {\n      return taxIdCheck[locale](strcopy);\n    }\n    // Fallthrough; not all locales have algorithmic checks\n    return true;\n  }\n  throw new Error(\"Invalid locale '\".concat(locale, \"'\"));\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isTime;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar default_time_options = {\n  hourFormat: 'hour24',\n  mode: 'default'\n};\nvar formats = {\n  hour24: {\n    default: /^([01]?[0-9]|2[0-3]):([0-5][0-9])$/,\n    withSeconds: /^([01]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/\n  },\n  hour12: {\n    default: /^(0?[1-9]|1[0-2]):([0-5][0-9]) (A|P)M$/,\n    withSeconds: /^(0?[1-9]|1[0-2]):([0-5][0-9]):([0-5][0-9]) (A|P)M$/\n  }\n};\nfunction isTime(input, options) {\n  options = (0, _merge.default)(options, default_time_options);\n  if (typeof input !== 'string') return false;\n  return formats[options.hourFormat][options.mode].test(input);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isURL;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isFQDN = _interopRequireDefault(require(\"./isFQDN\"));\nvar _isIP = _interopRequireDefault(require(\"./isIP\"));\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n/*\noptions for isURL method\n\nrequire_protocol - if set as true isURL will return false if protocol is not present in the URL\nrequire_valid_protocol - isURL will check if the URL's protocol is present in the protocols option\nprotocols - valid protocols can be modified with this option\nrequire_host - if set as false isURL will not check if host is present in the URL\nrequire_port - if set as true isURL will check if port is present in the URL\nallow_protocol_relative_urls - if set as true protocol relative URLs will be allowed\nvalidate_length - if set as false isURL will skip string length validation (IE maximum is 2083)\n\n*/\n\nvar default_url_options = {\n  protocols: ['http', 'https', 'ftp'],\n  require_tld: true,\n  require_protocol: false,\n  require_host: true,\n  require_port: false,\n  require_valid_protocol: true,\n  allow_underscores: false,\n  allow_trailing_dot: false,\n  allow_protocol_relative_urls: false,\n  allow_fragments: true,\n  allow_query_components: true,\n  validate_length: true\n};\nvar wrapped_ipv6 = /^\\[([^\\]]+)\\](?::([0-9]+))?$/;\nfunction isRegExp(obj) {\n  return Object.prototype.toString.call(obj) === '[object RegExp]';\n}\nfunction checkHost(host, matches) {\n  for (var i = 0; i < matches.length; i++) {\n    var match = matches[i];\n    if (host === match || isRegExp(match) && match.test(host)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction isURL(url, options) {\n  (0, _assertString.default)(url);\n  if (!url || /[\\s<>]/.test(url)) {\n    return false;\n  }\n  if (url.indexOf('mailto:') === 0) {\n    return false;\n  }\n  options = (0, _merge.default)(options, default_url_options);\n  if (options.validate_length && url.length >= 2083) {\n    return false;\n  }\n  if (!options.allow_fragments && url.includes('#')) {\n    return false;\n  }\n  if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {\n    return false;\n  }\n  var protocol, auth, host, hostname, port, port_str, split, ipv6;\n  split = url.split('#');\n  url = split.shift();\n  split = url.split('?');\n  url = split.shift();\n  split = url.split('://');\n  if (split.length > 1) {\n    protocol = split.shift().toLowerCase();\n    if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {\n      return false;\n    }\n  } else if (options.require_protocol) {\n    return false;\n  } else if (url.slice(0, 2) === '//') {\n    if (!options.allow_protocol_relative_urls) {\n      return false;\n    }\n    split[0] = url.slice(2);\n  }\n  url = split.join('://');\n  if (url === '') {\n    return false;\n  }\n  split = url.split('/');\n  url = split.shift();\n  if (url === '' && !options.require_host) {\n    return true;\n  }\n  split = url.split('@');\n  if (split.length > 1) {\n    if (options.disallow_auth) {\n      return false;\n    }\n    if (split[0] === '') {\n      return false;\n    }\n    auth = split.shift();\n    if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {\n      return false;\n    }\n    var _auth$split = auth.split(':'),\n      _auth$split2 = _slicedToArray(_auth$split, 2),\n      user = _auth$split2[0],\n      password = _auth$split2[1];\n    if (user === '' && password === '') {\n      return false;\n    }\n  }\n  hostname = split.join('@');\n  port_str = null;\n  ipv6 = null;\n  var ipv6_match = hostname.match(wrapped_ipv6);\n  if (ipv6_match) {\n    host = '';\n    ipv6 = ipv6_match[1];\n    port_str = ipv6_match[2] || null;\n  } else {\n    split = hostname.split(':');\n    host = split.shift();\n    if (split.length) {\n      port_str = split.join(':');\n    }\n  }\n  if (port_str !== null && port_str.length > 0) {\n    port = parseInt(port_str, 10);\n    if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {\n      return false;\n    }\n  } else if (options.require_port) {\n    return false;\n  }\n  if (options.host_whitelist) {\n    return checkHost(host, options.host_whitelist);\n  }\n  if (host === '' && !options.require_host) {\n    return true;\n  }\n  if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {\n    return false;\n  }\n  host = host || ipv6;\n  if (options.host_blacklist && checkHost(host, options.host_blacklist)) {\n    return false;\n  }\n  return true;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isUUID;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar uuid = {\n  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  7: /^[0-9A-F]{8}-[0-9A-F]{4}-7[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n  all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i\n};\nfunction isUUID(str, version) {\n  (0, _assertString.default)(str);\n  var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];\n  return !!pattern && pattern.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isUppercase;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isUppercase(str) {\n  (0, _assertString.default)(str);\n  return str === str.toUpperCase();\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isVAT;\nexports.vatMatchers = void 0;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar algorithms = _interopRequireWildcard(require(\"./util/algorithms\"));\nfunction _getRequireWildcardCache(e) { if (\"function\" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }\nfunction _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if (\"default\" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar AU = function AU(str) {\n  var match = str.match(/^(AU)?(\\d{11})$/);\n  if (!match) {\n    return false;\n  }\n  // @see {@link https://abr.business.gov.au/Help/AbnFormat}\n  var weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];\n  str = str.replace(/^AU/, '');\n  var ABN = (parseInt(str.slice(0, 1), 10) - 1).toString() + str.slice(1);\n  var total = 0;\n  for (var i = 0; i < 11; i++) {\n    total += weights[i] * ABN.charAt(i);\n  }\n  return total !== 0 && total % 89 === 0;\n};\nvar CH = function CH(str) {\n  // @see {@link https://www.ech.ch/de/ech/ech-0097/5.2.0}\n  var hasValidCheckNumber = function hasValidCheckNumber(digits) {\n    var lastDigit = digits.pop(); // used as check number\n    var weights = [5, 4, 3, 2, 7, 6, 5, 4];\n    var calculatedCheckNumber = (11 - digits.reduce(function (acc, el, idx) {\n      return acc + el * weights[idx];\n    }, 0) % 11) % 11;\n    return lastDigit === calculatedCheckNumber;\n  };\n\n  // @see {@link https://www.estv.admin.ch/estv/de/home/mehrwertsteuer/uid/mwst-uid-nummer.html}\n  return /^(CHE[- ]?)?(\\d{9}|(\\d{3}\\.\\d{3}\\.\\d{3})|(\\d{3} \\d{3} \\d{3})) ?(TVA|MWST|IVA)?$/.test(str) && hasValidCheckNumber(str.match(/\\d/g).map(function (el) {\n    return +el;\n  }));\n};\nvar PT = function PT(str) {\n  var match = str.match(/^(PT)?(\\d{9})$/);\n  if (!match) {\n    return false;\n  }\n  var tin = match[2];\n  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {\n    return parseInt(a, 10);\n  }), 9) % 11;\n  if (checksum > 9) {\n    return parseInt(tin[8], 10) === 0;\n  }\n  return checksum === parseInt(tin[8], 10);\n};\nvar vatMatchers = exports.vatMatchers = {\n  /**\r\n   * European Union VAT identification numbers\r\n   */\n  AT: function AT(str) {\n    return /^(AT)?U\\d{8}$/.test(str);\n  },\n  BE: function BE(str) {\n    return /^(BE)?\\d{10}$/.test(str);\n  },\n  BG: function BG(str) {\n    return /^(BG)?\\d{9,10}$/.test(str);\n  },\n  HR: function HR(str) {\n    return /^(HR)?\\d{11}$/.test(str);\n  },\n  CY: function CY(str) {\n    return /^(CY)?\\w{9}$/.test(str);\n  },\n  CZ: function CZ(str) {\n    return /^(CZ)?\\d{8,10}$/.test(str);\n  },\n  DK: function DK(str) {\n    return /^(DK)?\\d{8}$/.test(str);\n  },\n  EE: function EE(str) {\n    return /^(EE)?\\d{9}$/.test(str);\n  },\n  FI: function FI(str) {\n    return /^(FI)?\\d{8}$/.test(str);\n  },\n  FR: function FR(str) {\n    return /^(FR)?\\w{2}\\d{9}$/.test(str);\n  },\n  DE: function DE(str) {\n    return /^(DE)?\\d{9}$/.test(str);\n  },\n  EL: function EL(str) {\n    return /^(EL)?\\d{9}$/.test(str);\n  },\n  HU: function HU(str) {\n    return /^(HU)?\\d{8}$/.test(str);\n  },\n  IE: function IE(str) {\n    return /^(IE)?\\d{7}\\w{1}(W)?$/.test(str);\n  },\n  IT: function IT(str) {\n    return /^(IT)?\\d{11}$/.test(str);\n  },\n  LV: function LV(str) {\n    return /^(LV)?\\d{11}$/.test(str);\n  },\n  LT: function LT(str) {\n    return /^(LT)?\\d{9,12}$/.test(str);\n  },\n  LU: function LU(str) {\n    return /^(LU)?\\d{8}$/.test(str);\n  },\n  MT: function MT(str) {\n    return /^(MT)?\\d{8}$/.test(str);\n  },\n  NL: function NL(str) {\n    return /^(NL)?\\d{9}B\\d{2}$/.test(str);\n  },\n  PL: function PL(str) {\n    return /^(PL)?(\\d{10}|(\\d{3}-\\d{3}-\\d{2}-\\d{2})|(\\d{3}-\\d{2}-\\d{2}-\\d{3}))$/.test(str);\n  },\n  PT: PT,\n  RO: function RO(str) {\n    return /^(RO)?\\d{2,10}$/.test(str);\n  },\n  SK: function SK(str) {\n    return /^(SK)?\\d{10}$/.test(str);\n  },\n  SI: function SI(str) {\n    return /^(SI)?\\d{8}$/.test(str);\n  },\n  ES: function ES(str) {\n    return /^(ES)?\\w\\d{7}[A-Z]$/.test(str);\n  },\n  SE: function SE(str) {\n    return /^(SE)?\\d{12}$/.test(str);\n  },\n  /**\r\n   * VAT numbers of non-EU countries\r\n   */\n  AL: function AL(str) {\n    return /^(AL)?\\w{9}[A-Z]$/.test(str);\n  },\n  MK: function MK(str) {\n    return /^(MK)?\\d{13}$/.test(str);\n  },\n  AU: AU,\n  BY: function BY(str) {\n    return /^(УНП )?\\d{9}$/.test(str);\n  },\n  CA: function CA(str) {\n    return /^(CA)?\\d{9}$/.test(str);\n  },\n  IS: function IS(str) {\n    return /^(IS)?\\d{5,6}$/.test(str);\n  },\n  IN: function IN(str) {\n    return /^(IN)?\\d{15}$/.test(str);\n  },\n  ID: function ID(str) {\n    return /^(ID)?(\\d{15}|(\\d{2}.\\d{3}.\\d{3}.\\d{1}-\\d{3}.\\d{3}))$/.test(str);\n  },\n  IL: function IL(str) {\n    return /^(IL)?\\d{9}$/.test(str);\n  },\n  KZ: function KZ(str) {\n    return /^(KZ)?\\d{12}$/.test(str);\n  },\n  NZ: function NZ(str) {\n    return /^(NZ)?\\d{9}$/.test(str);\n  },\n  NG: function NG(str) {\n    return /^(NG)?(\\d{12}|(\\d{8}-\\d{4}))$/.test(str);\n  },\n  NO: function NO(str) {\n    return /^(NO)?\\d{9}MVA$/.test(str);\n  },\n  PH: function PH(str) {\n    return /^(PH)?(\\d{12}|\\d{3} \\d{3} \\d{3} \\d{3})$/.test(str);\n  },\n  RU: function RU(str) {\n    return /^(RU)?(\\d{10}|\\d{12})$/.test(str);\n  },\n  SM: function SM(str) {\n    return /^(SM)?\\d{5}$/.test(str);\n  },\n  SA: function SA(str) {\n    return /^(SA)?\\d{15}$/.test(str);\n  },\n  RS: function RS(str) {\n    return /^(RS)?\\d{9}$/.test(str);\n  },\n  CH: CH,\n  TR: function TR(str) {\n    return /^(TR)?\\d{10}$/.test(str);\n  },\n  UA: function UA(str) {\n    return /^(UA)?\\d{12}$/.test(str);\n  },\n  GB: function GB(str) {\n    return /^GB((\\d{3} \\d{4} ([0-8][0-9]|9[0-6]))|(\\d{9} \\d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/.test(str);\n  },\n  UZ: function UZ(str) {\n    return /^(UZ)?\\d{9}$/.test(str);\n  },\n  /**\r\n   * VAT numbers of Latin American countries\r\n   */\n  AR: function AR(str) {\n    return /^(AR)?\\d{11}$/.test(str);\n  },\n  BO: function BO(str) {\n    return /^(BO)?\\d{7}$/.test(str);\n  },\n  BR: function BR(str) {\n    return /^(BR)?((\\d{2}.\\d{3}.\\d{3}\\/\\d{4}-\\d{2})|(\\d{3}.\\d{3}.\\d{3}-\\d{2}))$/.test(str);\n  },\n  CL: function CL(str) {\n    return /^(CL)?\\d{8}-\\d{1}$/.test(str);\n  },\n  CO: function CO(str) {\n    return /^(CO)?\\d{10}$/.test(str);\n  },\n  CR: function CR(str) {\n    return /^(CR)?\\d{9,12}$/.test(str);\n  },\n  EC: function EC(str) {\n    return /^(EC)?\\d{13}$/.test(str);\n  },\n  SV: function SV(str) {\n    return /^(SV)?\\d{4}-\\d{6}-\\d{3}-\\d{1}$/.test(str);\n  },\n  GT: function GT(str) {\n    return /^(GT)?\\d{7}-\\d{1}$/.test(str);\n  },\n  HN: function HN(str) {\n    return /^(HN)?$/.test(str);\n  },\n  MX: function MX(str) {\n    return /^(MX)?\\w{3,4}\\d{6}\\w{3}$/.test(str);\n  },\n  NI: function NI(str) {\n    return /^(NI)?\\d{3}-\\d{6}-\\d{4}\\w{1}$/.test(str);\n  },\n  PA: function PA(str) {\n    return /^(PA)?$/.test(str);\n  },\n  PY: function PY(str) {\n    return /^(PY)?\\d{6,8}-\\d{1}$/.test(str);\n  },\n  PE: function PE(str) {\n    return /^(PE)?\\d{11}$/.test(str);\n  },\n  DO: function DO(str) {\n    return /^(DO)?(\\d{11}|(\\d{3}-\\d{7}-\\d{1})|[1,4,5]{1}\\d{8}|([1,4,5]{1})-\\d{2}-\\d{5}-\\d{1})$/.test(str);\n  },\n  UY: function UY(str) {\n    return /^(UY)?\\d{12}$/.test(str);\n  },\n  VE: function VE(str) {\n    return /^(VE)?[J,G,V,E]{1}-(\\d{9}|(\\d{8}-\\d{1}))$/.test(str);\n  }\n};\nfunction isVAT(str, countryCode) {\n  (0, _assertString.default)(str);\n  (0, _assertString.default)(countryCode);\n  if (countryCode in vatMatchers) {\n    return vatMatchers[countryCode](str);\n  }\n  throw new Error(\"Invalid country code: '\".concat(countryCode, \"'\"));\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isVariableWidth;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _isFullWidth = require(\"./isFullWidth\");\nvar _isHalfWidth = require(\"./isHalfWidth\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isVariableWidth(str) {\n  (0, _assertString.default)(str);\n  return _isFullWidth.fullWidth.test(str) && _isHalfWidth.halfWidth.test(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isWhitelisted;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction isWhitelisted(str, chars) {\n  (0, _assertString.default)(str);\n  for (var i = str.length - 1; i >= 0; i--) {\n    if (chars.indexOf(str[i]) === -1) {\n      return false;\n    }\n  }\n  return true;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ltrim;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction ltrim(str, chars) {\n  (0, _assertString.default)(str);\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n  var pattern = chars ? new RegExp(\"^[\".concat(chars.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), \"]+\"), 'g') : /^\\s+/g;\n  return str.replace(pattern, '');\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = matches;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction matches(str, pattern, modifiers) {\n  (0, _assertString.default)(str);\n  if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {\n    pattern = new RegExp(pattern, modifiers);\n  }\n  return !!str.match(pattern);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = normalizeEmail;\nvar _merge = _interopRequireDefault(require(\"./util/merge\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nvar default_normalize_email_options = {\n  // The following options apply to all email addresses\n  // Lowercases the local part of the email address.\n  // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).\n  // The domain is always lowercased, as per RFC 1035\n  all_lowercase: true,\n  // The following conversions are specific to GMail\n  // Lowercases the local part of the GMail address (known to be case-insensitive)\n  gmail_lowercase: true,\n  // Removes dots from the local part of the email address, as that's ignored by GMail\n  gmail_remove_dots: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  gmail_remove_subaddress: true,\n  // Conversts the googlemail.com domain to gmail.com\n  gmail_convert_googlemaildotcom: true,\n  // The following conversions are specific to Outlook.com / Windows Live / Hotmail\n  // Lowercases the local part of the Outlook.com address (known to be case-insensitive)\n  outlookdotcom_lowercase: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  outlookdotcom_remove_subaddress: true,\n  // The following conversions are specific to Yahoo\n  // Lowercases the local part of the Yahoo address (known to be case-insensitive)\n  yahoo_lowercase: true,\n  // Removes the subaddress (e.g. \"-foo\") from the email address\n  yahoo_remove_subaddress: true,\n  // The following conversions are specific to Yandex\n  // Lowercases the local part of the Yandex address (known to be case-insensitive)\n  yandex_lowercase: true,\n  // The following conversions are specific to iCloud\n  // Lowercases the local part of the iCloud address (known to be case-insensitive)\n  icloud_lowercase: true,\n  // Removes the subaddress (e.g. \"+foo\") from the email address\n  icloud_remove_subaddress: true\n};\n\n// List of domains used by iCloud\nvar icloud_domains = ['icloud.com', 'me.com'];\n\n// List of domains used by Outlook.com and its predecessors\n// This list is likely incomplete.\n// Partial reference:\n// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/\nvar outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com'];\n\n// List of domains used by Yahoo Mail\n// This list is likely incomplete\nvar yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com'];\n\n// List of domains used by yandex.ru\nvar yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru'];\n\n// replace single dots, but not multiple consecutive dots\nfunction dotsReplacer(match) {\n  if (match.length > 1) {\n    return match;\n  }\n  return '';\n}\nfunction normalizeEmail(email, options) {\n  options = (0, _merge.default)(options, default_normalize_email_options);\n  var raw_parts = email.split('@');\n  var domain = raw_parts.pop();\n  var user = raw_parts.join('@');\n  var parts = [user, domain];\n\n  // The domain is always lowercased, as it's case-insensitive per RFC 1035\n  parts[1] = parts[1].toLowerCase();\n  if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {\n    // Address is GMail\n    if (options.gmail_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (options.gmail_remove_dots) {\n      // this does not replace consecutive dots like example..email@gmail.com\n      parts[0] = parts[0].replace(/\\.+/g, dotsReplacer);\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.gmail_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n    parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];\n  } else if (icloud_domains.indexOf(parts[1]) >= 0) {\n    // Address is iCloud\n    if (options.icloud_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.icloud_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {\n    // Address is Outlook.com\n    if (options.outlookdotcom_remove_subaddress) {\n      parts[0] = parts[0].split('+')[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.outlookdotcom_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (yahoo_domains.indexOf(parts[1]) >= 0) {\n    // Address is Yahoo\n    if (options.yahoo_remove_subaddress) {\n      var components = parts[0].split('-');\n      parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];\n    }\n    if (!parts[0].length) {\n      return false;\n    }\n    if (options.all_lowercase || options.yahoo_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n  } else if (yandex_domains.indexOf(parts[1]) >= 0) {\n    if (options.all_lowercase || options.yandex_lowercase) {\n      parts[0] = parts[0].toLowerCase();\n    }\n    parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred\n  } else if (options.all_lowercase) {\n    // Any other address\n    parts[0] = parts[0].toLowerCase();\n  }\n  return parts.join('@');\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = rtrim;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction rtrim(str, chars) {\n  (0, _assertString.default)(str);\n  if (chars) {\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n    var pattern = new RegExp(\"[\".concat(chars.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), \"]+$\"), 'g');\n    return str.replace(pattern, '');\n  }\n  // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript\n  var strIndex = str.length - 1;\n  while (/\\s/.test(str.charAt(strIndex))) {\n    strIndex -= 1;\n  }\n  return str.slice(0, strIndex + 1);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = stripLow;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nvar _blacklist = _interopRequireDefault(require(\"./blacklist\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction stripLow(str, keep_new_lines) {\n  (0, _assertString.default)(str);\n  var chars = keep_new_lines ? '\\\\x00-\\\\x09\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F' : '\\\\x00-\\\\x1F\\\\x7F';\n  return (0, _blacklist.default)(str, chars);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = toBoolean;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction toBoolean(str, strict) {\n  (0, _assertString.default)(str);\n  if (strict) {\n    return str === '1' || /^true$/i.test(str);\n  }\n  return str !== '0' && !/^false$/i.test(str) && str !== '';\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = toDate;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction toDate(date) {\n  (0, _assertString.default)(date);\n  date = Date.parse(date);\n  return !isNaN(date) ? new Date(date) : null;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = toFloat;\nvar _isFloat = _interopRequireDefault(require(\"./isFloat\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction toFloat(str) {\n  if (!(0, _isFloat.default)(str)) return NaN;\n  return parseFloat(str);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = toInt;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction toInt(str, radix) {\n  (0, _assertString.default)(str);\n  return parseInt(str, radix || 10);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = trim;\nvar _rtrim = _interopRequireDefault(require(\"./rtrim\"));\nvar _ltrim = _interopRequireDefault(require(\"./ltrim\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction trim(str, chars) {\n  return (0, _rtrim.default)((0, _ltrim.default)(str, chars), chars);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = unescape;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction unescape(str) {\n  (0, _assertString.default)(str);\n  return str.replace(/&quot;/g, '\"').replace(/&#x27;/g, \"'\").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\\\').replace(/&#96;/g, '`').replace(/&amp;/g, '&');\n  // &amp; replacement has to be the last one to prevent\n  // bugs with intermediate strings containing escape sequences\n  // See: https://github.com/validatorjs/validator.js/issues/1827\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.iso7064Check = iso7064Check;\nexports.luhnCheck = luhnCheck;\nexports.reverseMultiplyAndSum = reverseMultiplyAndSum;\nexports.verhoeffCheck = verhoeffCheck;\n/**\n * Algorithmic validation functions\n * May be used as is or implemented in the workflow of other validators.\n */\n\n/*\n * ISO 7064 validation function\n * Called with a string of numbers (incl. check digit)\n * to validate according to ISO 7064 (MOD 11, 10).\n */\nfunction iso7064Check(str) {\n  var checkvalue = 10;\n  for (var i = 0; i < str.length - 1; i++) {\n    checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;\n  }\n  checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;\n  return checkvalue === parseInt(str[10], 10);\n}\n\n/*\n * Luhn (mod 10) validation function\n * Called with a string of numbers (incl. check digit)\n * to validate according to the Luhn algorithm.\n */\nfunction luhnCheck(str) {\n  var checksum = 0;\n  var second = false;\n  for (var i = str.length - 1; i >= 0; i--) {\n    if (second) {\n      var product = parseInt(str[i], 10) * 2;\n      if (product > 9) {\n        // sum digits of product and add to checksum\n        checksum += product.toString().split('').map(function (a) {\n          return parseInt(a, 10);\n        }).reduce(function (a, b) {\n          return a + b;\n        }, 0);\n      } else {\n        checksum += product;\n      }\n    } else {\n      checksum += parseInt(str[i], 10);\n    }\n    second = !second;\n  }\n  return checksum % 10 === 0;\n}\n\n/*\n * Reverse TIN multiplication and summation helper function\n * Called with an array of single-digit integers and a base multiplier\n * to calculate the sum of the digits multiplied in reverse.\n * Normally used in variations of MOD 11 algorithmic checks.\n */\nfunction reverseMultiplyAndSum(digits, base) {\n  var total = 0;\n  for (var i = 0; i < digits.length; i++) {\n    total += digits[i] * (base - i);\n  }\n  return total;\n}\n\n/*\n * Verhoeff validation helper function\n * Called with a string of numbers\n * to validate according to the Verhoeff algorithm.\n */\nfunction verhoeffCheck(str) {\n  var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];\n  var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]];\n\n  // Copy (to prevent replacement) and reverse\n  var str_copy = str.split('').reverse().join('');\n  var checksum = 0;\n  for (var i = 0; i < str_copy.length; i++) {\n    checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];\n  }\n  return checksum === 0;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assertString;\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction assertString(input) {\n  var isString = typeof input === 'string' || input instanceof String;\n  if (!isString) {\n    var invalidType = _typeof(input);\n    if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;\n    throw new TypeError(\"Expected a string but received a \".concat(invalidType));\n  }\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar includes = function includes(arr, val) {\n  return arr.some(function (arrVal) {\n    return val === arrVal;\n  });\n};\nvar _default = exports.default = includes;\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = merge;\nfunction merge() {\n  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var defaults = arguments.length > 1 ? arguments[1] : undefined;\n  for (var key in defaults) {\n    if (typeof obj[key] === 'undefined') {\n      obj[key] = defaults[key];\n    }\n  }\n  return obj;\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = multilineRegexp;\n/**\n * Build RegExp object from an array\n * of multiple/multi-line regexp parts\n *\n * @param {string[]} parts\n * @param {string} flags\n * @return {object} - RegExp object\n */\nfunction multilineRegexp(parts, flags) {\n  var regexpAsStringLiteral = parts.join('');\n  return new RegExp(regexpAsStringLiteral, flags);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = toString;\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction toString(input) {\n  if (_typeof(input) === 'object' && input !== null) {\n    if (typeof input.toString === 'function') {\n      input = input.toString();\n    } else {\n      input = '[object Object]';\n    }\n  } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {\n    input = '';\n  }\n  return String(input);\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = whitelist;\nvar _assertString = _interopRequireDefault(require(\"./util/assertString\"));\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction whitelist(str, chars) {\n  (0, _assertString.default)(str);\n  return str.replace(new RegExp(\"[^\".concat(chars, \"]+\"), 'g'), '');\n}\nmodule.exports = exports.default;\nmodule.exports.default = exports.default;","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\n\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdBreadcrumbsStyles = css`\n  /* Style the list */\n  ul.breadcrumb {\n    list-style: none;\n    margin-bottom: 0px;\n    margin-top: 0px;\n    margin-left: 55px;\n    padding-inline-start: 0px;\n    display: inline-flex;\n  }\n  /* Display list items side by side */\n  ul.breadcrumb li {\n    font-size: 18px;\n    color: ${unsafeCSS(_THEME.colors.primary_text_color)}\n    cursor: pointer;\n    text-transform: uppercase;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    max-width: 300px;\n\n  }\n  /* Add a slash symbol (/) before/behind each list item */\n  ul.breadcrumb li+li:before {\n    padding: 8px;\n    color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n    content: \"/\\\\00a0\";\n  }\n  /* Add a color to all links inside the list */\n  ul.breadcrumb li a {\n    color: ${unsafeCSS(_THEME.colors.breadcrumb_main_color)};\n    text-decoration: none;\n    cursor: pointer;\n  }\n\n  ul.breadcrumb li:last-child a {\n    color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n    font-weight: bold;\n  }\n  /* Add a color on mouse-over */\n  ul.breadcrumb li a:hover {\n    color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n  }\n  \n`;\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {CSSResultArray, html, LitElement, property, TemplateResult} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {IFBreadCrumbConfigObject, IFBreadcrumbObject} from '../../../js/interfaces';\nimport {linkForward} from '../../../js/LdGlobal';\nimport {\n  clearBreadCrumbConfig,\n  getBreadCrumbConfig,\n  setBreadCrumbConfig,\n} from '../../ld-redux/actions/breadcrumb-actions';\nimport {loadUserSetting,} from '../../ld-redux/actions/ld-users-actions';\nimport {store} from '../../ld-redux/ld-redux-store';\nimport {LdI18NextMixin} from '../i18n/ld-i18next';\nimport {LdBreadcrumbsStyles} from './styles';\n\nexport class LdBreadCrumb extends connect(store)<any>(LdI18NextMixin(LitElement)) {\n\n  @property({type: Array, hasChanged: () => true}) breadCrumbConfig: Array<IFBreadCrumbConfigObject> = [];\n  @property({type: Array, hasChanged: () => true}) breadCrumbs: Array<IFBreadcrumbObject> = [];\n  @property({type: Array, hasChanged: () => true}) crumbNodes: Array<TemplateResult> = [];\n  @property({type: Object, hasChanged: () => true}) subModules: any;\n  @property({type: Boolean, hasChanged: () => true}) _breadcrumbVisible: boolean | null = false;\n  @property({type: Object}) _defaultBreadcrumbAdministration: IFBreadCrumbConfigObject = {\n    assetType: null,\n    activeLastCrumb: true,\n    assetID: null,\n    backButtonLink: null,\n    customBreadcrumbElements: null,\n  };\n  @property({type: Boolean, hasChanged: () => true}) _breadcrumbVisibleSet: boolean = false;\n\n  // --------------------------------------------------------------------------------------\n  static get styles(): CSSResultArray {\n    return [LdBreadcrumbsStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this._breadcrumbVisible = JSON.parse(localStorage.getItem('breadcrumb')!);\n  }\n\n  // --------------------------------------------------------------------------------------\n  static setBreadcrumb(breadcrumbConfig: IFBreadCrumbConfigObject): void {\n    if (breadcrumbConfig.assetType != null && breadcrumbConfig.assetID != null) {\n      store.dispatch(setBreadCrumbConfig(breadcrumbConfig));\n      store.dispatch(getBreadCrumbConfig(breadcrumbConfig.assetType, breadcrumbConfig.assetID));\n    } else if (breadcrumbConfig.customBreadcrumbElements == null) {\n      store.dispatch(clearBreadCrumbConfig());\n    } else {\n      store.dispatch(setBreadCrumbConfig(breadcrumbConfig));\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    this._checkBreadcrumbVisible();\n    this.setBreadCrumb();\n\n    return html`\n      <div id='breadcrumb'>\n        <ul class='breadcrumb'>\n          ${this.crumbNodes}\n        </ul>\n      </div>\n    `;\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  stateChanged(state: any) {\n    const {breadCrumb, breadCrumbConfig} = state.BreadCrumbReducer;\n    const {settings} = state.LdUsersReducer;\n    if (settings?.breadcrumb != null && this._breadcrumbVisible == null) {\n      this._breadcrumbVisible = settings.breadcrumb;\n      this._breadcrumbVisibleSet = true;\n      this.render();\n    }\n\n    this.breadCrumbConfig = breadCrumbConfig;\n    this.breadCrumbs = breadCrumb;\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  public setBreadCrumb(): void {\n    this.crumbNodes = [];\n    const breadCrumbConfig = {...this._defaultBreadcrumbAdministration, ...this.breadCrumbConfig};\n    if (this.breadCrumbConfig != null && this.breadCrumbConfig.length === 0) {\n      return;\n    }\n    if (breadCrumbConfig.backButtonLink != null || breadCrumbConfig.backButtonNetcfg != null) {\n      this.crumbNodes.push(html`\n        <ld-assets-backbutton .parent='${breadCrumbConfig}'></ld-assets-backbutton>`);\n    }\n\n    this._generateBreadCrumb(breadCrumbConfig)\n\n  }\n\n  _generateBreadCrumb(breadCrumbConfig: IFBreadCrumbConfigObject) {\n    if (this._breadcrumbVisible == null || this._breadcrumbVisible) {\n      // if Standard breadcrumb is desired\n      if (this.breadCrumbs != null && this.breadCrumbs.length === 0) {\n        return;\n      }\n      if (breadCrumbConfig.customBreadcrumbElements == null) {\n        this._setAssetBreadCrumb();\n      } else {\n        this._setCustomBreadCrumb(breadCrumbConfig);\n      }\n    }\n  }\n\n  _setAssetBreadCrumb() {\n    this.breadCrumbs?.forEach((item: any, index: number) => {\n\n      if (index !== this.breadCrumbs?.length - 1) {\n        this.crumbNodes.push(html`\n          <li @click='${() => linkForward(item.uri)}'><a>${item.name}</a></li>`);\n      } else {\n        this.crumbNodes.push(html`\n          <li>${item.name}</li>`);\n      }\n    });\n    if (this.breadCrumbs != null) {\n      localStorage.setItem('breadcrumbList', JSON.stringify(this.breadCrumbs));\n    }\n  }\n\n  _setCustomBreadCrumb(breadCrumbConfig: IFBreadCrumbConfigObject) {\n    for (const value of breadCrumbConfig.customBreadcrumbElements!) {\n      if (value.link) {\n        this.crumbNodes.push(html`\n          <li @click=\"${() => linkForward(value.link)}\"><a>${value.title}</a></li>`);\n      } else {\n        this.crumbNodes.push(html`\n          <li>${value.title}</li>`);\n      }\n    }\n  }\n  _checkBreadcrumbVisible(): void {\n    if (localStorage.getItem('breadcrumb') == null) {\n      if (!this._breadcrumbVisibleSet) {\n        store.dispatch(loadUserSetting(`breadcrumb`));\n      }\n    } else {\n      this._breadcrumbVisible = JSON.parse(localStorage.getItem('breadcrumb')!);\n    }\n    this._breadcrumbVisibleSet = true;\n  }\n}\n\ncustomElements.define('ld-breadcrumb', LdBreadCrumb as unknown as CustomElementConstructor);\n","import {UiElementConfig} from \"..\";\nimport {LdTranslate} from \"../../i18n/ld-i18next\";\nimport moment from 'moment';\n\ninterface CanSync {\n  syncGroup?: string\n}\n\ntype ZoomSetContext = {\n  messageBus: EventTarget,\n  currentZoom: { min: number, max: number },\n  previousZoom: { min: number, max: number },\n  chart: Highcharts.Chart\n};\nexport const createSetZoomToDatepickerButton: (host: HTMLElement & CanSync) => UiElementConfig<ZoomSetContext> = (host) => {\n  return {\n    type: \"button\",\n    id: \"set-zoom-to-datepicker\",\n    testid: \"set-zoom-to-datepicker\",\n    destroy: () => {\n    },\n    label: LdTranslate(\"modules.charts.setZoomToDatepicker\"),\n    style: {\n      left: 20,\n      top: 15\n    },\n    onCreation: (ctx, uiElement) => {\n      if (!host.isConnected) {\n        return;\n      }\n      const messageBusRequest = new CustomEvent(\"request-messageBus\", {\n        bubbles: true,\n        composed: true,\n        detail: {messageBus: null, requester: host.tagName}\n      })\n      uiElement.attr(\"class\", \"hidden\");\n\n      host.dispatchEvent(messageBusRequest);\n      const messageBus = messageBusRequest.detail.messageBus;\n      if (!messageBus) return console.error(new Error(\"no message bus found\"));\n      ctx.messageBus = messageBus;\n    },\n    onSelectionChange: (ctx: ZoomSetContext, event: CustomEventInit, uiElement) => {\n      if (!ctx.messageBus) return console.error(new Error(\"No message bus. Can't work.\"))\n      uiElement.attr(\"class\", \"\");\n      if (event.detail?.resetSelection) {\n        uiElement.attr(\"class\", \"hidden\");\n\n        if (event.detail?.e?.trigger === 'zoom') {\n          ctx.currentZoom = ctx.previousZoom;\n        }\n        (ctx.chart as any).resetZoomButton?.hide?.();\n\n      } else {\n        (ctx.chart as any).resetZoomButton?.show?.();\n        ctx.currentZoom = {\n          min: event.detail?.xAxis?.[0]?.min ?? 0,\n          max: event.detail?.xAxis?.[0]?.max ?? 0,\n        };\n      }\n\n      if (!ctx.previousZoom) {\n        ctx.previousZoom = {\n          min: ctx.chart.xAxis[0].min ?? 0,\n          max: ctx.chart.xAxis[0].max ?? 0,\n        }\n      }\n    },\n    onClick: (ctx: ZoomSetContext, _event, uiElement) => {\n\n      const requestEvent = new CustomEvent(\"request-datepicker-set\", {\n        detail: {...ctx.currentZoom, syncGroup: host.syncGroup, handled: null},\n        bubbles: true,\n        composed: true\n      })\n      ctx.messageBus.dispatchEvent(requestEvent);\n      if (!requestEvent.detail.handled) {\n        console.error(`There does not seem to be a event handler for ${requestEvent.type}`);\n        uiElement.attr(\"class\", \"hidden\");\n      } else {\n        (ctx.chart as any).resetZoomButton?.hide?.();\n        uiElement.attr(\"class\", \"hidden\");\n        ctx.previousZoom = ctx.currentZoom;\n      }\n      dispatchEvent(new CustomEvent('changed', {\n        detail: {\n          start: moment(ctx.currentZoom.min).format('YYYYMMDDTHHmm'),\n          end: moment(ctx.currentZoom.max).format('YYYYMMDDTHHmm')\n        }\n      }));\n    }\n  }\n}\n\nexport interface HasGlobalDate {\n  _preselectedDate: string;\n  syncGroup: string;\n  chartId: string;\n}\n\nexport interface HasSetupAndTearDownHooks {\n  addDisconnectTask(fn: Function): void;\n\n  addConnectTask(fn: Function): void;\n}\n","/* *\n *\n *  Plugin for displaying a message when there is no data visible in chart.\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  Author: Oystein Moseng\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * @optionparent lang\n */\nconst lang = {\n    /**\n     * The text to display when the chart contains no data.\n     *\n     * @see [noData](#noData)\n     *\n     * @sample highcharts/no-data-to-display/no-data-line\n     *         No-data text\n     *\n     * @since    3.0.8\n     * @product  highcharts highstock\n     * @requires modules/no-data-to-display\n     */\n    noData: 'No data to display'\n};\n/**\n * Options for displaying a message like \"No data to display\".\n * This feature requires the file no-data-to-display.js to be loaded in the\n * page. The actual text to display is set in the lang.noData option.\n *\n * @sample highcharts/no-data-to-display/no-data-line\n *         Line chart with no-data module\n * @sample highcharts/no-data-to-display/no-data-pie\n *         Pie chart with no-data module\n *\n * @product      highcharts highstock gantt\n * @requires     modules/no-data-to-display\n * @optionparent noData\n */\nconst noData = {\n    /**\n     * An object of additional SVG attributes for the no-data label.\n     *\n     * @type      {Highcharts.SVGAttributes}\n     * @since     3.0.8\n     * @product   highcharts highstock gantt\n     * @apioption noData.attr\n     */\n    attr: {\n        zIndex: 1\n    },\n    /**\n     * Whether to insert the label as HTML, or as pseudo-HTML rendered with\n     * SVG.\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     4.1.10\n     * @product   highcharts highstock gantt\n     * @apioption noData.useHTML\n     */\n    /**\n     * The position of the no-data label, relative to the plot area.\n     *\n     * @type  {Highcharts.AlignObject}\n     * @since 3.0.8\n     */\n    position: {\n        /**\n         * Horizontal offset of the label, in pixels.\n         */\n        x: 0,\n        /**\n         * Vertical offset of the label, in pixels.\n         */\n        y: 0,\n        /**\n         * Horizontal alignment of the label.\n         *\n         * @type {Highcharts.AlignValue}\n         */\n        align: 'center',\n        /**\n         * Vertical alignment of the label.\n         *\n         * @type {Highcharts.VerticalAlignValue}\n         */\n        verticalAlign: 'middle'\n    },\n    /**\n     * CSS styles for the no-data label.\n     *\n     * @sample highcharts/no-data-to-display/no-data-line\n     *         Styled no-data text\n     *\n     * @type {Highcharts.CSSObject}\n     */\n    style: {\n        /** @ignore */\n        fontWeight: 'bold',\n        /** @ignore */\n        fontSize: '0.8em',\n        /** @ignore */\n        color: \"#666666\" /* Palette.neutralColor60 */\n    }\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst NoDataDefaults = {\n    lang,\n    noData\n};\nexport default NoDataDefaults;\n","/* *\n *\n *  Plugin for displaying a message when there is no data visible in chart.\n *\n *  (c) 2010-2024 Highsoft AS\n *\n *  Author: Oystein Moseng\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../../Core/Renderer/HTML/AST.js';\nimport NoDataDefaults from './NoDataDefaults.js';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, extend, merge } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Returns true if there are data points within the plot area now.\n *\n * @private\n * @function Highcharts.Chart#hasData\n * @return {boolean|undefined}\n * True, if there are data points.\n * @requires modules/no-data-to-display\n */\nfunction chartHasData() {\n    const chart = this, series = chart.series || [];\n    let i = series.length;\n    while (i--) {\n        if (series[i].hasData() && !series[i].options.isInternal) {\n            return true;\n        }\n    }\n    return chart.loadingShown; // #4588\n}\n/**\n * Hide no-data message.\n *\n * @private\n * @function Highcharts.Chart#hideNoData\n * @return {void}\n * @requires modules/no-data-to-display\n */\nfunction chartHideNoData() {\n    const chart = this;\n    if (chart.noDataLabel) {\n        chart.noDataLabel = chart.noDataLabel.destroy();\n    }\n}\n/**\n * Display a no-data message.\n * @private\n * @function Highcharts.Chart#showNoData\n * @param {string} [str]\n * An optional message to show in place of the default one\n * @return {void}\n * @requires modules/no-data-to-display\n */\nfunction chartShowNoData(str) {\n    const chart = this, options = chart.options, text = str || (options && options.lang.noData) || '', noDataOptions = options && (options.noData || {});\n    if (chart.renderer) { // Meaning chart is not destroyed\n        if (!chart.noDataLabel) {\n            chart.noDataLabel = chart.renderer\n                .label(text, 0, 0, void 0, void 0, void 0, noDataOptions.useHTML, void 0, 'no-data')\n                .add();\n        }\n        if (!chart.styledMode) {\n            chart.noDataLabel\n                .attr(AST.filterUserAttributes(noDataOptions.attr || {}))\n                .css(noDataOptions.style || {});\n        }\n        chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position || {}), false, 'plotBox');\n    }\n}\n/** @private */\nfunction compose(ChartClass, highchartsDefaultOptions) {\n    const chartProto = ChartClass.prototype;\n    if (!chartProto.showNoData) {\n        chartProto.hasData = chartHasData;\n        chartProto.hideNoData = chartHideNoData;\n        chartProto.showNoData = chartShowNoData;\n        addEvent(ChartClass, 'render', onChartRender);\n        merge(true, highchartsDefaultOptions, NoDataDefaults);\n    }\n}\n/**\n * Add event listener to handle automatic show or hide no-data message.\n * @private\n */\nfunction onChartRender() {\n    const chart = this;\n    if (chart.hasData()) {\n        chart.hideNoData();\n    }\n    else {\n        chart.showNoData();\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst NoDataToDisplay = {\n    compose\n};\nexport default NoDataToDisplay;\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/modules/no-data-to-display\n * @requires highcharts\n *\n * Plugin for displaying a message when there is no data visible in chart.\n *\n * (c) 2010-2024 Highsoft AS\n * Author: Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport NoDataToDisplay from '../../Extensions/NoDataToDisplay/NoDataToDisplay.js';\nconst G = Highcharts;\nNoDataToDisplay.compose(G.Chart, G.defaultOptions);\nexport default Highcharts;\n","/**\n *\n *  (c) 2010-2024 Paweł Fus\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Composition\n *\n * */\nvar ChartNavigationComposition;\n(function (ChartNavigationComposition) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * @private\n     */\n    function compose(chart) {\n        if (!chart.navigation) {\n            chart.navigation = new Additions(chart);\n        }\n        return chart;\n    }\n    ChartNavigationComposition.compose = compose;\n    /* *\n     *\n     *  Class\n     *\n     * */\n    /**\n     * Initializes `chart.navigation` object which delegates `update()` methods\n     * to all other common classes (used in exporting and navigationBindings).\n     * @private\n     */\n    class Additions {\n        /* *\n         *\n         *  Constructor\n         *\n         * */\n        constructor(chart) {\n            this.updates = [];\n            this.chart = chart;\n        }\n        /* *\n         *\n         *  Functions\n         *\n         * */\n        /**\n         * Registers an `update()` method in the `chart.navigation` object.\n         *\n         * @private\n         * @param {UpdateFunction} updateFn\n         * The `update()` method that will be called in `chart.update()`.\n         */\n        addUpdate(updateFn) {\n            this.chart.navigation.updates.push(updateFn);\n        }\n        /**\n         * @private\n         */\n        update(options, redraw) {\n            this.updates.forEach((updateFn) => {\n                updateFn.call(this.chart, options, redraw);\n            });\n        }\n    }\n    ChartNavigationComposition.Additions = Additions;\n})(ChartNavigationComposition || (ChartNavigationComposition = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default ChartNavigationComposition;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport H from '../../Core/Globals.js';\nconst { isTouchDevice } = H;\n/* *\n *\n *  API Options\n *\n * */\n// Add the export related options\n/**\n * Options for the exporting module. For an overview on the matter, see\n * [the docs](https://www.highcharts.com/docs/export-module/export-module-overview).\n *\n * @requires     modules/exporting\n * @optionparent exporting\n */\nconst exporting = {\n    /**\n     * Experimental setting to allow HTML inside the chart (added through\n     * the `useHTML` options), directly in the exported image. This allows\n     * you to preserve complicated HTML structures like tables or bi-directional\n     * text in exported charts.\n     *\n     * Disclaimer: The HTML is rendered in a `foreignObject` tag in the\n     * generated SVG. The official export server is based on PhantomJS,\n     * which supports this, but other SVG clients, like Batik, does not\n     * support it. This also applies to downloaded SVG that you want to\n     * open in a desktop client.\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     4.1.8\n     * @apioption exporting.allowHTML\n     */\n    /**\n     * Allows the end user to sort the data table by clicking on column headers.\n     *\n     * @since 10.3.3\n     * @apioption exporting.allowTableSorting\n     */\n    allowTableSorting: true,\n    /**\n     * Additional chart options to be merged into the chart before exporting to\n     * an image format. This does not apply to printing the chart via the export\n     * menu.\n     *\n     * For example, a common use case is to add data labels to improve\n     * readability of the exported chart, or to add a printer-friendly color\n     * scheme to exported PDFs.\n     *\n     * @sample {highcharts} highcharts/exporting/chartoptions-data-labels/\n     *         Added data labels\n     * @sample {highstock} highcharts/exporting/chartoptions-data-labels/\n     *         Added data labels\n     *\n     * @type      {Highcharts.Options}\n     * @apioption exporting.chartOptions\n     */\n    /**\n     * Whether to enable the exporting module. Disabling the module will\n     * hide the context button, but API methods will still be available.\n     *\n     * @sample {highcharts} highcharts/exporting/enabled-false/\n     *         Exporting module is loaded but disabled\n     * @sample {highstock} highcharts/exporting/enabled-false/\n     *         Exporting module is loaded but disabled\n     *\n     * @type      {boolean}\n     * @default   true\n     * @since     2.0\n     * @apioption exporting.enabled\n     */\n    /**\n     * Function to call if the offline-exporting module fails to export\n     * a chart on the client side, and [fallbackToExportServer](\n     * #exporting.fallbackToExportServer) is disabled. If left undefined, an\n     * exception is thrown instead. Receives two parameters, the exporting\n     * options, and the error from the module.\n     *\n     * @see [fallbackToExportServer](#exporting.fallbackToExportServer)\n     *\n     * @type      {Highcharts.ExportingErrorCallbackFunction}\n     * @since     5.0.0\n     * @requires  modules/exporting\n     * @requires  modules/offline-exporting\n     * @apioption exporting.error\n     */\n    /**\n     * Whether or not to fall back to the export server if the offline-exporting\n     * module is unable to export the chart on the client side. This happens for\n     * certain browsers, and certain features (e.g.\n     * [allowHTML](#exporting.allowHTML)), depending on the image type exporting\n     * to. For very complex charts, it is possible that export can fail in\n     * browsers that don't support Blob objects, due to data URL length limits.\n     * It is recommended to define the [exporting.error](#exporting.error)\n     * handler if disabling fallback, in order to notify users in case export\n     * fails.\n     *\n     * @type      {boolean}\n     * @default   true\n     * @since     4.1.8\n     * @requires  modules/exporting\n     * @requires  modules/offline-exporting\n     * @apioption exporting.fallbackToExportServer\n     */\n    /**\n     * The filename, without extension, to use for the exported chart.\n     *\n     * @sample {highcharts} highcharts/exporting/filename/\n     *         Custom file name\n     * @sample {highstock} highcharts/exporting/filename/\n     *         Custom file name\n     *\n     * @type      {string}\n     * @default   chart\n     * @since     2.0\n     * @apioption exporting.filename\n     */\n    /**\n     * Highcharts v11.2.0 and older. An object containing additional key value\n     * data for the POST form that sends the SVG to the export server. For\n     * example, a `target` can be set to make sure the generated image is\n     * received in another frame, or a custom `enctype` or `encoding` can be\n     * set.\n     *\n     * With Highcharts v11.3.0, the `fetch` API replaced the old HTML form. To\n     * modify the request, now use [fetchOptions](#exporting.fetchOptions)\n     * instead.\n     *\n     * @deprecated\n     * @type      {Highcharts.HTMLAttributes}\n     * @since     3.0.8\n     * @apioption exporting.formAttributes\n     */\n    /**\n     * Options for the fetch request used when sending the SVG to the export\n     * server.\n     *\n     * See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/fetch)\n     * for more information\n     *\n     * @type {Object}\n     * @since 11.3.0\n     * @apioption exporting.fetchOptions\n     */\n    /**\n     * Path where Highcharts will look for export module dependencies to\n     * load on demand if they don't already exist on `window`. Should currently\n     * point to location of [CanVG](https://github.com/canvg/canvg) library,\n     * [jsPDF](https://github.com/parallax/jsPDF) and\n     * [svg2pdf.js](https://github.com/yWorks/svg2pdf.js), required for client\n     * side export in certain browsers.\n     *\n     * @type      {string}\n     * @default   https://code.highcharts.com/{version}/lib\n     * @since     5.0.0\n     * @apioption exporting.libURL\n     */\n    /**\n     * Analogous to [sourceWidth](#exporting.sourceWidth).\n     *\n     * @type      {number}\n     * @since     3.0\n     * @apioption exporting.sourceHeight\n     */\n    /**\n     * The width of the original chart when exported, unless an explicit\n     * [chart.width](#chart.width) is set, or a pixel width is set on the\n     * container. The width exported raster image is then multiplied by\n     * [scale](#exporting.scale).\n     *\n     * @sample {highcharts} highcharts/exporting/sourcewidth/\n     *         Source size demo\n     * @sample {highstock} highcharts/exporting/sourcewidth/\n     *         Source size demo\n     * @sample {highmaps} maps/exporting/sourcewidth/\n     *         Source size demo\n     *\n     * @type      {number}\n     * @since     3.0\n     * @apioption exporting.sourceWidth\n     */\n    /**\n     * The pixel width of charts exported to PNG or JPG. As of Highcharts\n     * 3.0, the default pixel width is a function of the [chart.width](\n     * #chart.width) or [exporting.sourceWidth](#exporting.sourceWidth) and the\n     * [exporting.scale](#exporting.scale).\n     *\n     * @sample {highcharts} highcharts/exporting/width/\n     *         Export to 200px wide images\n     * @sample {highstock} highcharts/exporting/width/\n     *         Export to 200px wide images\n     *\n     * @type      {number}\n     * @since     2.0\n     * @apioption exporting.width\n     */\n    /**\n     * Default MIME type for exporting if `chart.exportChart()` is called\n     * without specifying a `type` option. Possible values are `image/png`,\n     *  `image/jpeg`, `application/pdf` and `image/svg+xml`.\n     *\n     * @type  {Highcharts.ExportingMimeTypeValue}\n     * @since 2.0\n     */\n    type: 'image/png',\n    /**\n     * The URL for the server module converting the SVG string to an image\n     * format. By default this points to Highchart's free web service.\n     *\n     * @since 2.0\n     */\n    url: 'https://export.highcharts.com/',\n    /**\n     * Settings for a custom font for the exported PDF, when using the\n     * `offline-exporting` module. This is used for languages containing\n     * non-ASCII characters, like Chinese, Russian, Japanese etc.\n     *\n     * As described in the [jsPDF\n     * docs](https://github.com/parallax/jsPDF#use-of-unicode-characters--utf-8),\n     * the 14 standard fonts in PDF are limited to the ASCII-codepage.\n     * Therefore, in order to support other text in the exported PDF, one or\n     * more TTF font files have to be passed on to the exporting module.\n     *\n     * See more in [the\n     * docs](https://www.highcharts.com/docs/export-module/client-side-export).\n     *\n     * @sample {highcharts} highcharts/exporting/offline-download-pdffont/\n     *         Download PDF in a language containing non-Latin characters.\n     *\n     * @since 10.0.0\n     * @requires modules/offline-exporting\n     */\n    pdfFont: {\n        /**\n         * The TTF font file for normal `font-style`. If font variations like\n         * `bold` or `italic` are not defined, the `normal` font will be used\n         * for those too.\n         *\n         * @type string|undefined\n         */\n        normal: void 0,\n        /**\n         * The TTF font file for bold text.\n         *\n         * @type string|undefined\n         */\n        bold: void 0,\n        /**\n         * The TTF font file for bold and italic text.\n         *\n         * @type string|undefined\n         */\n        bolditalic: void 0,\n        /**\n         * The TTF font file for italic text.\n         *\n         * @type string|undefined\n         */\n        italic: void 0\n    },\n    /**\n     * When printing the chart from the menu item in the burger menu, if\n     * the on-screen chart exceeds this width, it is resized. After printing\n     * or cancelled, it is restored. The default width makes the chart\n     * fit into typical paper format. Note that this does not affect the\n     * chart when printing the web page as a whole.\n     *\n     * @since 4.2.5\n     */\n    printMaxWidth: 780,\n    /**\n     * Defines the scale or zoom factor for the exported image compared\n     * to the on-screen display. While for instance a 600px wide chart\n     * may look good on a website, it will look bad in print. The default\n     * scale of 2 makes this chart export to a 1200px PNG or JPG.\n     *\n     * @see [chart.width](#chart.width)\n     * @see [exporting.sourceWidth](#exporting.sourceWidth)\n     *\n     * @sample {highcharts} highcharts/exporting/scale/\n     *         Scale demonstrated\n     * @sample {highstock} highcharts/exporting/scale/\n     *         Scale demonstrated\n     * @sample {highmaps} maps/exporting/scale/\n     *         Scale demonstrated\n     *\n     * @since 3.0\n     */\n    scale: 2,\n    /**\n     * Options for the export related buttons, print and export. In addition\n     * to the default buttons listed here, custom buttons can be added.\n     * See [navigation.buttonOptions](#navigation.buttonOptions) for general\n     * options.\n     *\n     * @type     {Highcharts.Dictionary<*>}\n     * @requires modules/exporting\n     */\n    buttons: {\n        /**\n         * Options for the export button.\n         *\n         * In styled mode, export button styles can be applied with the\n         * `.highcharts-contextbutton` class.\n         *\n         * @declare  Highcharts.ExportingButtonsOptionsObject\n         * @extends  navigation.buttonOptions\n         * @requires modules/exporting\n         */\n        contextButton: {\n            /**\n             * A click handler callback to use on the button directly instead of\n             * the popup menu.\n             *\n             * @sample highcharts/exporting/buttons-contextbutton-onclick/\n             *         Skip the menu and export the chart directly\n             *\n             * @type      {Function}\n             * @since     2.0\n             * @apioption exporting.buttons.contextButton.onclick\n             */\n            /**\n             * See [navigation.buttonOptions.symbolFill](\n             * #navigation.buttonOptions.symbolFill).\n             *\n             * @type      {Highcharts.ColorString}\n             * @default   #666666\n             * @since     2.0\n             * @apioption exporting.buttons.contextButton.symbolFill\n             */\n            /**\n             * The horizontal position of the button relative to the `align`\n             * option.\n             *\n             * @type      {number}\n             * @default   -10\n             * @since     2.0\n             * @apioption exporting.buttons.contextButton.x\n             */\n            /**\n             * The class name of the context button.\n             */\n            className: 'highcharts-contextbutton',\n            /**\n             * The class name of the menu appearing from the button.\n             */\n            menuClassName: 'highcharts-contextmenu',\n            /**\n             * The symbol for the button. Points to a definition function in\n             * the `Highcharts.Renderer.symbols` collection. The default\n             * `menu` function is part of the exporting module. Possible\n             * values are \"circle\", \"square\", \"diamond\", \"triangle\",\n             * \"triangle-down\", \"menu\", \"menuball\" or custom shape.\n             *\n             * @sample highcharts/exporting/buttons-contextbutton-symbol/\n             *         Use a circle for symbol\n             * @sample highcharts/exporting/buttons-contextbutton-symbol-custom/\n             *         Custom shape as symbol\n             *\n             * @type  {Highcharts.SymbolKeyValue|\"menu\"|\"menuball\"|string}\n             * @since 2.0\n             */\n            symbol: 'menu',\n            /**\n             * The key to a [lang](#lang) option setting that is used for the\n             * button's title tooltip. When the key is `contextButtonTitle`, it\n             * refers to [lang.contextButtonTitle](#lang.contextButtonTitle)\n             * that defaults to \"Chart context menu\".\n             *\n             * @since 6.1.4\n             */\n            titleKey: 'contextButtonTitle',\n            /**\n             * This option is deprecated, use\n             * [titleKey](#exporting.buttons.contextButton.titleKey) instead.\n             *\n             * @deprecated\n             * @type      {string}\n             * @apioption exporting.buttons.contextButton._titleKey\n             */\n            /**\n             * A collection of strings pointing to config options for the menu\n             * items. The config options are defined in the\n             * `menuItemDefinitions` option.\n             *\n             * By default, there is the \"View in full screen\" and \"Print\" menu\n             * items, plus one menu item for each of the available export types.\n             *\n             * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             *\n             * @type    {Array<string>}\n             * @default [\"viewFullscreen\", \"printChart\", \"separator\", \"downloadPNG\", \"downloadJPEG\", \"downloadPDF\", \"downloadSVG\"]\n             * @since   2.0\n             */\n            menuItems: [\n                'viewFullscreen',\n                'printChart',\n                'separator',\n                'downloadPNG',\n                'downloadJPEG',\n                'downloadPDF',\n                'downloadSVG'\n            ]\n        }\n    },\n    /**\n     * An object consisting of definitions for the menu items in the context\n     * menu. Each key value pair has a `key` that is referenced in the\n     * [menuItems](#exporting.buttons.contextButton.menuItems) setting,\n     * and a `value`, which is an object with the following properties:\n     *\n     * - **onclick:** The click handler for the menu item\n     *\n     * - **text:** The text for the menu item\n     *\n     * - **textKey:** If internationalization is required, the key to a language\n     *   string\n     *\n     * Custom text for the \"exitFullScreen\" can be set only in lang options\n     * (it is not a separate button).\n     *\n     * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n     *         Menu item definitions\n     * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n     *         Menu item definitions\n     * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n     *         Menu item definitions\n     *\n     *\n     * @type    {Highcharts.Dictionary<Highcharts.ExportingMenuObject>}\n     * @default {\"viewFullscreen\": {}, \"printChart\": {}, \"separator\": {}, \"downloadPNG\": {}, \"downloadJPEG\": {}, \"downloadPDF\": {}, \"downloadSVG\": {}}\n     * @since   5.0.13\n     */\n    menuItemDefinitions: {\n        /**\n         * @ignore\n         */\n        viewFullscreen: {\n            textKey: 'viewFullscreen',\n            onclick: function () {\n                if (this.fullscreen) {\n                    this.fullscreen.toggle();\n                }\n            }\n        },\n        /**\n         * @ignore\n         */\n        printChart: {\n            textKey: 'printChart',\n            onclick: function () {\n                this.print();\n            }\n        },\n        /**\n         * @ignore\n         */\n        separator: {\n            separator: true\n        },\n        /**\n         * @ignore\n         */\n        downloadPNG: {\n            textKey: 'downloadPNG',\n            onclick: function () {\n                this.exportChart();\n            }\n        },\n        /**\n         * @ignore\n         */\n        downloadJPEG: {\n            textKey: 'downloadJPEG',\n            onclick: function () {\n                this.exportChart({\n                    type: 'image/jpeg'\n                });\n            }\n        },\n        /**\n         * @ignore\n         */\n        downloadPDF: {\n            textKey: 'downloadPDF',\n            onclick: function () {\n                this.exportChart({\n                    type: 'application/pdf'\n                });\n            }\n        },\n        /**\n         * @ignore\n         */\n        downloadSVG: {\n            textKey: 'downloadSVG',\n            onclick: function () {\n                this.exportChart({\n                    type: 'image/svg+xml'\n                });\n            }\n        }\n    }\n};\n// Add language\n/**\n * @optionparent lang\n */\nconst lang = {\n    /**\n     * Exporting module only. The text for the menu item to view the chart\n     * in full screen.\n     *\n     * @since 8.0.1\n     */\n    viewFullscreen: 'View in full screen',\n    /**\n     * Exporting module only. The text for the menu item to exit the chart\n     * from full screen.\n     *\n     * @since 8.0.1\n     */\n    exitFullscreen: 'Exit from full screen',\n    /**\n     * Exporting module only. The text for the menu item to print the chart.\n     *\n     * @since    3.0.1\n     * @requires modules/exporting\n     */\n    printChart: 'Print chart',\n    /**\n     * Exporting module only. The text for the PNG download menu item.\n     *\n     * @since    2.0\n     * @requires modules/exporting\n     */\n    downloadPNG: 'Download PNG image',\n    /**\n     * Exporting module only. The text for the JPEG download menu item.\n     *\n     * @since    2.0\n     * @requires modules/exporting\n     */\n    downloadJPEG: 'Download JPEG image',\n    /**\n     * Exporting module only. The text for the PDF download menu item.\n     *\n     * @since    2.0\n     * @requires modules/exporting\n     */\n    downloadPDF: 'Download PDF document',\n    /**\n     * Exporting module only. The text for the SVG download menu item.\n     *\n     * @since    2.0\n     * @requires modules/exporting\n     */\n    downloadSVG: 'Download SVG vector image',\n    /**\n     * Exporting module menu. The tooltip title for the context menu holding\n     * print and export menu items.\n     *\n     * @since    3.0\n     * @requires modules/exporting\n     */\n    contextButtonTitle: 'Chart context menu'\n};\n/**\n * A collection of options for buttons and menus appearing in the exporting\n * module or in Stock Tools.\n *\n * @requires     modules/exporting\n * @optionparent navigation\n */\nconst navigation = {\n    /**\n     * A collection of options for buttons appearing in the exporting\n     * module.\n     *\n     * In styled mode, the buttons are styled with the\n     * `.highcharts-contextbutton` and `.highcharts-button-symbol` classes.\n     *\n     * @requires modules/exporting\n     */\n    buttonOptions: {\n        /**\n         * Whether to enable buttons.\n         *\n         * @sample highcharts/navigation/buttonoptions-enabled/\n         *         Exporting module loaded but buttons disabled\n         *\n         * @type      {boolean}\n         * @default   true\n         * @since     2.0\n         * @apioption navigation.buttonOptions.enabled\n         */\n        /**\n         * The pixel size of the symbol on the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        symbolSize: 14,\n        /**\n         * The x position of the center of the symbol inside the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        symbolX: 14.5,\n        /**\n         * The y position of the center of the symbol inside the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        symbolY: 13.5,\n        /**\n         * Alignment for the buttons.\n         *\n         * @sample highcharts/navigation/buttonoptions-align/\n         *         Center aligned\n         *\n         * @type  {Highcharts.AlignValue}\n         * @since 2.0\n         */\n        align: 'right',\n        /**\n         * The pixel spacing between buttons.\n         *\n         * @since 2.0\n         */\n        buttonSpacing: 3,\n        /**\n         * Pixel height of the buttons.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        height: 28,\n        /**\n         * A text string to add to the individual button.\n         *\n         * @sample highcharts/exporting/buttons-text/\n         *         Full text button\n         * @sample highcharts/exporting/buttons-text-usehtml/\n         *         Icon using CSS font in text\n         * @sample highcharts/exporting/buttons-text-symbol/\n         *         Combined symbol and text\n         *\n         * @type      {string}\n         * @default   null\n         * @since     3.0\n         * @apioption navigation.buttonOptions.text\n         */\n        /**\n         * Whether to use HTML for rendering the button. HTML allows for things\n         * like inline CSS or image-based icons.\n         *\n         * @sample highcharts/exporting/buttons-text-usehtml/\n         *         Icon using CSS font in text\n         *\n         * @type      boolean\n         * @default   false\n         * @since 10.3.0\n         * @apioption navigation.buttonOptions.useHTML\n         */\n        /**\n         * The vertical offset of the button's position relative to its\n         * `verticalAlign`.\n         *\n         * @sample highcharts/navigation/buttonoptions-verticalalign/\n         *         Buttons at lower right\n         *\n         * @type      {number}\n         * @default   0\n         * @since     2.0\n         * @apioption navigation.buttonOptions.y\n         */\n        /**\n         * The vertical alignment of the buttons. Can be one of `\"top\"`,\n         * `\"middle\"` or `\"bottom\"`.\n         *\n         * @sample highcharts/navigation/buttonoptions-verticalalign/\n         *         Buttons at lower right\n         *\n         * @type  {Highcharts.VerticalAlignValue}\n         * @since 2.0\n         */\n        verticalAlign: 'top',\n        /**\n         * The pixel width of the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        width: 28,\n        /**\n         * Fill color for the symbol within the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-symbolfill/\n         *         Blue symbol stroke for one of the buttons\n         *\n         * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @since 2.0\n         */\n        symbolFill: \"#666666\" /* Palette.neutralColor60 */,\n        /**\n         * The color of the symbol's stroke or line.\n         *\n         * @sample highcharts/navigation/buttonoptions-symbolstroke/\n         *         Blue symbol stroke\n         *\n         * @type  {Highcharts.ColorString}\n         * @since 2.0\n         */\n        symbolStroke: \"#666666\" /* Palette.neutralColor60 */,\n        /**\n         * The pixel stroke width of the symbol on the button.\n         *\n         * @sample highcharts/navigation/buttonoptions-height/\n         *         Bigger buttons\n         *\n         * @since 2.0\n         */\n        symbolStrokeWidth: 3,\n        /**\n         * A configuration object for the button theme. The object accepts\n         * SVG properties like `stroke-width`, `stroke` and `fill`.\n         * Tri-state button styles are supported by the `states.hover` and\n         * `states.select` objects.\n         *\n         * @sample highcharts/navigation/buttonoptions-theme/\n         *         Theming the buttons\n         *\n         * @requires modules/exporting\n         *\n         * @since 3.0\n         */\n        theme: {\n            /**\n             * The default fill exists only to capture hover events.\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             */\n            fill: \"#ffffff\" /* Palette.backgroundColor */,\n            /**\n             * Padding for the button.\n             */\n            padding: 5,\n            /**\n             * Default stroke for the buttons.\n             *\n             * @type      {Highcharts.ColorString}\n             */\n            stroke: 'none',\n            /**\n             * Default stroke linecap for the buttons.\n             */\n            'stroke-linecap': 'round'\n        }\n    },\n    /**\n     * CSS styles for the popup menu appearing by default when the export\n     * icon is clicked. This menu is rendered in HTML.\n     *\n     * @see In styled mode, the menu is styled with the `.highcharts-menu`\n     *      class.\n     *\n     * @sample highcharts/navigation/menustyle/\n     *         Light gray menu background\n     *\n     * @type    {Highcharts.CSSObject}\n     * @default {\"background\": \"#ffffff\", \"borderRadius\": \"3px\", \"padding\": \"0.5em\"}\n     * @since   2.0\n     */\n    menuStyle: {\n        /** @ignore-option */\n        border: 'none',\n        /** @ignore-option */\n        borderRadius: '3px',\n        /** @ignore-option */\n        background: \"#ffffff\" /* Palette.backgroundColor */,\n        /** @ignore-option */\n        padding: '0.5em'\n    },\n    /**\n     * CSS styles for the individual items within the popup menu appearing\n     * by default when the export icon is clicked. The menu items are\n     * rendered in HTML. Font size defaults to `11px` on desktop and `14px`\n     * on touch devices.\n     *\n     * @see In styled mode, the menu items are styled with the\n     *      `.highcharts-menu-item` class.\n     *\n     * @sample {highcharts} highcharts/navigation/menuitemstyle/\n     *         Add a grey stripe to the left\n     *\n     * @type    {Highcharts.CSSObject}\n     * @default {\"padding\": \"0.5em\", \"color\": \"#333333\", \"background\": \"none\", \"borderRadius\": \"3px\", \"fontSize\": \"0.8em\", \"transition\": \"background 250ms, color 250ms\"}\n     * @since   2.0\n     */\n    menuItemStyle: {\n        /** @ignore-option */\n        background: 'none',\n        /** @ignore-option */\n        borderRadius: '3px',\n        /** @ignore-option */\n        color: \"#333333\" /* Palette.neutralColor80 */,\n        /** @ignore-option */\n        padding: '0.5em',\n        /** @ignore-option */\n        fontSize: isTouchDevice ? '0.9em' : '0.8em',\n        /** @ignore-option */\n        transition: 'background 250ms, color 250ms'\n    },\n    /**\n     * CSS styles for the hover state of the individual items within the\n     * popup menu appearing by default when the export icon is clicked. The\n     * menu items are rendered in HTML.\n     *\n     * @see In styled mode, the menu items are styled with the\n     *      `.highcharts-menu-item` class.\n     *\n     * @sample highcharts/navigation/menuitemhoverstyle/\n     *         Bold text on hover\n     *\n     * @type    {Highcharts.CSSObject}\n     * @default {\"background\": \"#f2f2f2\" }\n     * @since   2.0\n     */\n    menuItemHoverStyle: {\n        /** @ignore-option */\n        background: \"#f2f2f2\" /* Palette.neutralColor5 */\n    }\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst ExportingDefaults = {\n    exporting,\n    lang,\n    navigation\n};\nexport default ExportingDefaults;\n","/* *\n *\n *  Exporting module\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Composition\n *\n * */\nvar ExportingSymbols;\n(function (ExportingSymbols) {\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    const modifiedClasses = [];\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * @private\n     */\n    function compose(SVGRendererClass) {\n        if (modifiedClasses.indexOf(SVGRendererClass) === -1) {\n            modifiedClasses.push(SVGRendererClass);\n            const symbols = SVGRendererClass.prototype.symbols;\n            symbols.menu = menu;\n            symbols.menuball = menuball.bind(symbols);\n        }\n    }\n    ExportingSymbols.compose = compose;\n    /**\n     * @private\n     */\n    function menu(x, y, width, height) {\n        const arr = [\n            ['M', x, y + 2.5],\n            ['L', x + width, y + 2.5],\n            ['M', x, y + height / 2 + 0.5],\n            ['L', x + width, y + height / 2 + 0.5],\n            ['M', x, y + height - 1.5],\n            ['L', x + width, y + height - 1.5]\n        ];\n        return arr;\n    }\n    /**\n     * @private\n     */\n    function menuball(x, y, width, height) {\n        const h = (height / 3) - 2;\n        let path = [];\n        path = path.concat(this.circle(width - h, y, h, h), this.circle(width - h, y + h + 4, h, h), this.circle(width - h, y + 2 * (h + 4), h, h));\n        return path;\n    }\n})(ExportingSymbols || (ExportingSymbols = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default ExportingSymbols;\n","/* *\n *\n *  (c) 2009-2024 Rafal Sebestjanski\n *\n *  Full screen for Highcharts\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n/**\n * The module allows user to enable display chart in full screen mode.\n * Used in StockTools too.\n * Based on default solutions in browsers.\n */\n'use strict';\nimport AST from '../../Core/Renderer/HTML/AST.js';\nimport H from '../../Core/Globals.js';\nconst { composed } = H;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, fireEvent, pushUnique } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction onChartBeforeRender() {\n    /**\n     * @name Highcharts.Chart#fullscreen\n     * @type {Highcharts.Fullscreen}\n     * @requires modules/full-screen\n     */\n    this.fullscreen = new Fullscreen(this);\n}\n/* *\n *\n *  Class\n *\n * */\n/**\n * Handles displaying chart's container in the fullscreen mode.\n *\n * **Note**: Fullscreen is not supported on iPhone due to iOS limitations.\n *\n * @class\n * @name Highcharts.Fullscreen\n *\n * @requires modules/exporting\n */\nclass Fullscreen {\n    /* *\n     *\n     *  Static Functions\n     *\n     * */\n    /**\n     * Prepares the chart class to support fullscreen.\n     *\n     * @param {typeof_Highcharts.Chart} ChartClass\n     * The chart class to decorate with fullscreen support.\n     */\n    static compose(ChartClass) {\n        if (pushUnique(composed, 'Fullscreen')) {\n            // Initialize fullscreen\n            addEvent(ChartClass, 'beforeRender', onChartBeforeRender);\n        }\n    }\n    /* *\n     *\n     *  Constructors\n     *\n     * */\n    constructor(chart) {\n        /**\n         * Chart managed by the fullscreen controller.\n         * @name Highcharts.Fullscreen#chart\n         * @type {Highcharts.Chart}\n         */\n        this.chart = chart;\n        /**\n         * The flag is set to `true` when the chart is displayed in\n         * the fullscreen mode.\n         *\n         * @name Highcharts.Fullscreen#isOpen\n         * @type {boolean|undefined}\n         * @since 8.0.1\n         */\n        this.isOpen = false;\n        const container = chart.renderTo;\n        // Hold event and methods available only for a current browser.\n        if (!this.browserProps) {\n            if (typeof container.requestFullscreen === 'function') {\n                this.browserProps = {\n                    fullscreenChange: 'fullscreenchange',\n                    requestFullscreen: 'requestFullscreen',\n                    exitFullscreen: 'exitFullscreen'\n                };\n            }\n            else if (container.mozRequestFullScreen) {\n                this.browserProps = {\n                    fullscreenChange: 'mozfullscreenchange',\n                    requestFullscreen: 'mozRequestFullScreen',\n                    exitFullscreen: 'mozCancelFullScreen'\n                };\n            }\n            else if (container.webkitRequestFullScreen) {\n                this.browserProps = {\n                    fullscreenChange: 'webkitfullscreenchange',\n                    requestFullscreen: 'webkitRequestFullScreen',\n                    exitFullscreen: 'webkitExitFullscreen'\n                };\n            }\n            else if (container.msRequestFullscreen) {\n                this.browserProps = {\n                    fullscreenChange: 'MSFullscreenChange',\n                    requestFullscreen: 'msRequestFullscreen',\n                    exitFullscreen: 'msExitFullscreen'\n                };\n            }\n        }\n    }\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Stops displaying the chart in fullscreen mode.\n     * Exporting module required.\n     *\n     * @since       8.0.1\n     *\n     * @function    Highcharts.Fullscreen#close\n     * @return      {void}\n     * @requires    modules/full-screen\n     */\n    close() {\n        const fullscreen = this, chart = fullscreen.chart, optionsChart = chart.options.chart;\n        fireEvent(chart, 'fullscreenClose', null, function () {\n            // Don't fire exitFullscreen() when user exited\n            // using 'Escape' button.\n            if (fullscreen.isOpen &&\n                fullscreen.browserProps &&\n                chart.container.ownerDocument instanceof Document) {\n                chart.container.ownerDocument[fullscreen.browserProps.exitFullscreen]();\n            }\n            // Unbind event as it's necessary only before exiting\n            // from fullscreen.\n            if (fullscreen.unbindFullscreenEvent) {\n                fullscreen.unbindFullscreenEvent = fullscreen\n                    .unbindFullscreenEvent();\n            }\n            chart.setSize(fullscreen.origWidth, fullscreen.origHeight, false);\n            fullscreen.origWidth = void 0;\n            fullscreen.origHeight = void 0;\n            optionsChart.width = fullscreen.origWidthOption;\n            optionsChart.height = fullscreen.origHeightOption;\n            fullscreen.origWidthOption = void 0;\n            fullscreen.origHeightOption = void 0;\n            fullscreen.isOpen = false;\n            fullscreen.setButtonText();\n        });\n    }\n    /**\n     * Displays the chart in fullscreen mode.\n     * When fired customly by user before exporting context button is created,\n     * button's text will not be replaced - it's on the user side.\n     * Exporting module required.\n     *\n     * @since       8.0.1\n     *\n     * @function Highcharts.Fullscreen#open\n     * @return      {void}\n     * @requires    modules/full-screen\n     */\n    open() {\n        const fullscreen = this, chart = fullscreen.chart, optionsChart = chart.options.chart;\n        fireEvent(chart, 'fullscreenOpen', null, function () {\n            if (optionsChart) {\n                fullscreen.origWidthOption = optionsChart.width;\n                fullscreen.origHeightOption = optionsChart.height;\n            }\n            fullscreen.origWidth = chart.chartWidth;\n            fullscreen.origHeight = chart.chartHeight;\n            // Handle exitFullscreen() method when user clicks 'Escape' button.\n            if (fullscreen.browserProps) {\n                const unbindChange = addEvent(chart.container.ownerDocument, // Chart's document\n                fullscreen.browserProps.fullscreenChange, function () {\n                    // Handle lack of async of browser's\n                    // fullScreenChange event.\n                    if (fullscreen.isOpen) {\n                        fullscreen.isOpen = false;\n                        fullscreen.close();\n                    }\n                    else {\n                        chart.setSize(null, null, false);\n                        fullscreen.isOpen = true;\n                        fullscreen.setButtonText();\n                    }\n                });\n                const unbindDestroy = addEvent(chart, 'destroy', unbindChange);\n                fullscreen.unbindFullscreenEvent = () => {\n                    unbindChange();\n                    unbindDestroy();\n                };\n                const promise = chart.renderTo[fullscreen.browserProps.requestFullscreen]();\n                if (promise) {\n                    promise['catch'](function () {\n                        alert(// eslint-disable-line no-alert\n                        'Full screen is not supported inside a frame.');\n                    });\n                }\n            }\n        });\n    }\n    /**\n     * Replaces the exporting context button's text when toogling the\n     * fullscreen mode.\n     *\n     * @private\n     *\n     * @since 8.0.1\n     *\n     * @requires modules/full-screen\n     */\n    setButtonText() {\n        const chart = this.chart, exportDivElements = chart.exportDivElements, exportingOptions = chart.options.exporting, menuItems = (exportingOptions &&\n            exportingOptions.buttons &&\n            exportingOptions.buttons.contextButton.menuItems), lang = chart.options.lang;\n        if (exportingOptions &&\n            exportingOptions.menuItemDefinitions &&\n            lang &&\n            lang.exitFullscreen &&\n            lang.viewFullscreen &&\n            menuItems &&\n            exportDivElements) {\n            const exportDivElement = exportDivElements[menuItems.indexOf('viewFullscreen')];\n            if (exportDivElement) {\n                AST.setElementHTML(exportDivElement, !this.isOpen ?\n                    (exportingOptions.menuItemDefinitions.viewFullscreen\n                        .text ||\n                        lang.viewFullscreen) : lang.exitFullscreen);\n            }\n        }\n    }\n    /**\n     * Toggles displaying the chart in fullscreen mode.\n     * By default, when the exporting module is enabled, a context button with\n     * a drop down menu in the upper right corner accesses this function.\n     * Exporting module required.\n     *\n     * @since 8.0.1\n     *\n     * @sample      highcharts/members/chart-togglefullscreen/\n     *              Toggle fullscreen mode from a HTML button\n     *\n     * @function Highcharts.Fullscreen#toggle\n     * @requires    modules/full-screen\n     */\n    toggle() {\n        const fullscreen = this;\n        if (!fullscreen.isOpen) {\n            fullscreen.open();\n        }\n        else {\n            fullscreen.close();\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nexport default Fullscreen;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Gets fired when closing the fullscreen\n *\n * @callback Highcharts.FullScreenfullscreenCloseCallbackFunction\n *\n * @param {Highcharts.Chart} chart\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Gets fired when opening the fullscreen\n *\n * @callback Highcharts.FullScreenfullscreenOpenCallbackFunction\n *\n * @param {Highcharts.Chart} chart\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n(''); // Keeps doclets above separated from following code\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Fires when a fullscreen is closed through the context menu item,\n * or a fullscreen is closed on the `Escape` button click,\n * or the `Chart.fullscreen.close` method.\n *\n * @sample highcharts/chart/events-fullscreen\n *         Title size change on fullscreen open\n *\n * @type      {Highcharts.FullScreenfullscreenCloseCallbackFunction}\n * @since     10.1.0\n * @context   Highcharts.Chart\n * @requires  modules/full-screen\n * @apioption chart.events.fullscreenClose\n */\n/**\n * Fires when a fullscreen is opened through the context menu item,\n * or the `Chart.fullscreen.open` method.\n *\n * @sample highcharts/chart/events-fullscreen\n *         Title size change on fullscreen open\n *\n * @type      {Highcharts.FullScreenfullscreenOpenCallbackFunction}\n * @since     10.1.0\n * @context   Highcharts.Chart\n * @requires  modules/full-screen\n * @apioption chart.events.fullscreenOpen\n */\n(''); // Keeps doclets above in transpiled file\n","/* *\n *\n *  (c) 2010-2024 Christer Vasseng, Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport G from '../Core/Globals.js';\nconst { win } = G;\nimport U from '../Core/Utilities.js';\nconst { discardElement, objectEach } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Perform an Ajax call.\n *\n * @function Highcharts.ajax\n *\n * @param {Highcharts.AjaxSettingsObject} settings\n *        The Ajax settings to use.\n *\n * @return {false|undefined}\n *         Returns false, if error occurred.\n */\nfunction ajax(settings) {\n    const headers = {\n        json: 'application/json',\n        xml: 'application/xml',\n        text: 'text/plain',\n        octet: 'application/octet-stream'\n    }, r = new XMLHttpRequest();\n    /**\n     * Private error handler.\n     * @private\n     * @param {XMLHttpRequest} xhr\n     * Internal request object.\n     * @param {string|Error} err\n     * Occurred error.\n     */\n    function handleError(xhr, err) {\n        if (settings.error) {\n            settings.error(xhr, err);\n        }\n        else {\n            // @todo Maybe emit a highcharts error event here\n        }\n    }\n    if (!settings.url) {\n        return false;\n    }\n    r.open((settings.type || 'get').toUpperCase(), settings.url, true);\n    if (!settings.headers || !settings.headers['Content-Type']) {\n        r.setRequestHeader('Content-Type', headers[settings.dataType || 'json'] || headers.text);\n    }\n    objectEach(settings.headers, function (val, key) {\n        r.setRequestHeader(key, val);\n    });\n    if (settings.responseType) {\n        r.responseType = settings.responseType;\n    }\n    // @todo lacking timeout handling\n    r.onreadystatechange = function () {\n        let res;\n        if (r.readyState === 4) {\n            if (r.status === 200) {\n                if (settings.responseType !== 'blob') {\n                    res = r.responseText;\n                    if (settings.dataType === 'json') {\n                        try {\n                            res = JSON.parse(res);\n                        }\n                        catch (e) {\n                            if (e instanceof Error) {\n                                return handleError(r, e);\n                            }\n                        }\n                    }\n                }\n                return settings.success && settings.success(res, r);\n            }\n            handleError(r, r.responseText);\n        }\n    };\n    if (settings.data && typeof settings.data !== 'string') {\n        settings.data = JSON.stringify(settings.data);\n    }\n    r.send(settings.data);\n}\n/**\n * Get a JSON resource over XHR, also supporting CORS without preflight.\n *\n * @function Highcharts.getJSON\n * @param {string} url\n *        The URL to load.\n * @param {Function} success\n *        The success callback. For error handling, use the `Highcharts.ajax`\n *        function instead.\n */\nfunction getJSON(url, success) {\n    HttpUtilities.ajax({\n        url: url,\n        success: success,\n        dataType: 'json',\n        headers: {\n            // Override the Content-Type to avoid preflight problems with CORS\n            // in the Highcharts demos\n            'Content-Type': 'text/plain'\n        }\n    });\n}\n/**\n * The post utility\n *\n * @private\n * @function Highcharts.post\n *\n * @param {string} url\n * Post URL\n *\n * @param {Object} data\n * Post data\n *\n * @param {RequestInit} [fetchOptions]\n * Additional attributes for the post request\n */\n/**\n *\n */\nfunction post(url, data, fetchOptions) {\n    const formData = new win.FormData();\n    // Add the data\n    objectEach(data, function (val, name) {\n        formData.append(name, val);\n    });\n    formData.append('b64', 'true');\n    const { filename, type } = data;\n    return win.fetch(url, {\n        method: 'POST',\n        body: formData,\n        ...fetchOptions\n    }).then((res) => {\n        if (res.ok) {\n            res.text().then((text) => {\n                const link = document.createElement('a');\n                link.href = `data:${type};base64,${text}`;\n                link.download = filename;\n                link.click();\n                discardElement(link);\n            });\n        }\n    });\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst HttpUtilities = {\n    ajax,\n    getJSON,\n    post\n};\nexport default HttpUtilities;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * @interface Highcharts.AjaxSettingsObject\n */ /**\n* The payload to send.\n*\n* @name Highcharts.AjaxSettingsObject#data\n* @type {string|Highcharts.Dictionary<any>|undefined}\n*/ /**\n* The data type expected.\n* @name Highcharts.AjaxSettingsObject#dataType\n* @type {\"json\"|\"xml\"|\"text\"|\"octet\"|undefined}\n*/ /**\n* Function to call on error.\n* @name Highcharts.AjaxSettingsObject#error\n* @type {Function|undefined}\n*/ /**\n* The headers; keyed on header name.\n* @name Highcharts.AjaxSettingsObject#headers\n* @type {Highcharts.Dictionary<string>|undefined}\n*/ /**\n* Function to call on success.\n* @name Highcharts.AjaxSettingsObject#success\n* @type {Function|undefined}\n*/ /**\n* The HTTP method to use. For example GET or POST.\n* @name Highcharts.AjaxSettingsObject#type\n* @type {string|undefined}\n*/ /**\n* The URL to call.\n* @name Highcharts.AjaxSettingsObject#url\n* @type {string}\n*/\n(''); // Keeps doclets above in JS file\n","/* *\n *\n *  Exporting module\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../../Core/Renderer/HTML/AST.js';\nimport Chart from '../../Core/Chart/Chart.js';\nimport ChartNavigationComposition from '../../Core/Chart/ChartNavigationComposition.js';\nimport D from '../../Core/Defaults.js';\nconst { defaultOptions } = D;\nimport ExportingDefaults from './ExportingDefaults.js';\nimport ExportingSymbols from './ExportingSymbols.js';\nimport Fullscreen from './Fullscreen.js';\nimport G from '../../Core/Globals.js';\nconst { doc, SVG_NS, win } = G;\nimport HU from '../../Core/HttpUtilities.js';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, css, createElement, discardElement, extend, find, fireEvent, isObject, merge, objectEach, pick, removeEvent, uniqueKey } = U;\n/* *\n *\n *  Composition\n *\n * */\nvar Exporting;\n(function (Exporting) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    // These CSS properties are not inlined. Remember camelCase.\n    const inlineDenylist = [\n        /-/, // In Firefox, both hyphened and camelCased names are listed\n        /^(clipPath|cssText|d|height|width)$/, // Full words\n        /^font$/, // More specific props are set\n        /[lL]ogical(Width|Height)$/,\n        /^parentRule$/,\n        /^(cssRules|ownerRules)$/, // #19516 read-only properties\n        /perspective/,\n        /TapHighlightColor/,\n        /^transition/,\n        /^length$/, // #7700\n        /^\\d+$/ // #17538\n    ];\n    // These ones are translated to attributes rather than styles\n    const inlineToAttributes = [\n        'fill',\n        'stroke',\n        'strokeLinecap',\n        'strokeLinejoin',\n        'strokeWidth',\n        'textAnchor',\n        'x',\n        'y'\n    ];\n    Exporting.inlineAllowlist = [];\n    const unstyledElements = [\n        'clipPath',\n        'defs',\n        'desc'\n    ];\n    /* *\n     *\n     *  Variables\n     *\n     * */\n    let printingChart;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Add the export button to the chart, with options.\n     *\n     * @private\n     * @function Highcharts.Chart#addButton\n     * @param {Highcharts.NavigationButtonOptions} options\n     * @requires modules/exporting\n     */\n    function addButton(options) {\n        const chart = this, renderer = chart.renderer, btnOptions = merge(chart.options.navigation.buttonOptions, options), onclick = btnOptions.onclick, menuItems = btnOptions.menuItems, symbolSize = btnOptions.symbolSize || 12;\n        let symbol;\n        if (!chart.btnCount) {\n            chart.btnCount = 0;\n        }\n        // Keeps references to the button elements\n        if (!chart.exportDivElements) {\n            chart.exportDivElements = [];\n            chart.exportSVGElements = [];\n        }\n        if (btnOptions.enabled === false || !btnOptions.theme) {\n            return;\n        }\n        const theme = chart.styledMode ? {} : btnOptions.theme;\n        let callback;\n        if (onclick) {\n            callback = function (e) {\n                if (e) {\n                    e.stopPropagation();\n                }\n                onclick.call(chart, e);\n            };\n        }\n        else if (menuItems) {\n            callback = function (e) {\n                // Consistent with onclick call (#3495)\n                if (e) {\n                    e.stopPropagation();\n                }\n                chart.contextMenu(button.menuClassName, menuItems, button.translateX || 0, button.translateY || 0, button.width || 0, button.height || 0, button);\n                button.setState(2);\n            };\n        }\n        if (btnOptions.text && btnOptions.symbol) {\n            theme.paddingLeft = pick(theme.paddingLeft, 30);\n        }\n        else if (!btnOptions.text) {\n            extend(theme, {\n                width: btnOptions.width,\n                height: btnOptions.height,\n                padding: 0\n            });\n        }\n        const button = renderer\n            .button(btnOptions.text, 0, 0, callback, theme, void 0, void 0, void 0, void 0, btnOptions.useHTML)\n            .addClass(options.className)\n            .attr({\n            title: pick(chart.options.lang[btnOptions._titleKey || btnOptions.titleKey], '')\n        });\n        button.menuClassName = (options.menuClassName ||\n            'highcharts-menu-' + chart.btnCount++);\n        if (btnOptions.symbol) {\n            symbol = renderer\n                .symbol(btnOptions.symbol, Math.round((btnOptions.symbolX || 0) - (symbolSize / 2)), Math.round((btnOptions.symbolY || 0) - (symbolSize / 2)), symbolSize, symbolSize\n            // If symbol is an image, scale it (#7957)\n            , {\n                width: symbolSize,\n                height: symbolSize\n            })\n                .addClass('highcharts-button-symbol')\n                .attr({\n                zIndex: 1\n            })\n                .add(button);\n            if (!chart.styledMode) {\n                symbol.attr({\n                    stroke: btnOptions.symbolStroke,\n                    fill: btnOptions.symbolFill,\n                    'stroke-width': btnOptions.symbolStrokeWidth || 1\n                });\n            }\n        }\n        button\n            .add(chart.exportingGroup)\n            .align(extend(btnOptions, {\n            width: button.width,\n            x: pick(btnOptions.x, chart.buttonOffset) // #1654\n        }), true, 'spacingBox');\n        chart.buttonOffset += (((button.width || 0) + btnOptions.buttonSpacing) *\n            (btnOptions.align === 'right' ? -1 : 1));\n        chart.exportSVGElements.push(button, symbol);\n    }\n    /**\n     * Clean up after printing a chart.\n     *\n     * @function Highcharts#afterPrint\n     *\n     * @private\n     *\n     * @param {Highcharts.Chart} chart\n     *        Chart that was (or suppose to be) printed\n     *\n     * @emits Highcharts.Chart#event:afterPrint\n     */\n    function afterPrint() {\n        const chart = this;\n        if (!chart.printReverseInfo) {\n            return void 0;\n        }\n        const { childNodes, origDisplay, resetParams } = chart.printReverseInfo;\n        // Put the chart back in\n        chart.moveContainers(chart.renderTo);\n        // Restore all body content\n        [].forEach.call(childNodes, function (node, i) {\n            if (node.nodeType === 1) {\n                node.style.display = (origDisplay[i] || '');\n            }\n        });\n        chart.isPrinting = false;\n        // Reset printMaxWidth\n        if (resetParams) {\n            chart.setSize.apply(chart, resetParams);\n        }\n        delete chart.printReverseInfo;\n        printingChart = void 0;\n        fireEvent(chart, 'afterPrint');\n    }\n    /**\n     * Prepare chart and document before printing a chart.\n     *\n     * @function Highcharts#beforePrint\n     *\n     * @private\n     *\n     *\n     * @emits Highcharts.Chart#event:beforePrint\n     */\n    function beforePrint() {\n        const chart = this, body = doc.body, printMaxWidth = chart.options.exporting.printMaxWidth, printReverseInfo = {\n            childNodes: body.childNodes,\n            origDisplay: [],\n            resetParams: void 0\n        };\n        chart.isPrinting = true;\n        chart.pointer?.reset(void 0, 0);\n        fireEvent(chart, 'beforePrint');\n        // Handle printMaxWidth\n        const handleMaxWidth = printMaxWidth &&\n            chart.chartWidth > printMaxWidth;\n        if (handleMaxWidth) {\n            printReverseInfo.resetParams = [\n                chart.options.chart.width,\n                void 0,\n                false\n            ];\n            chart.setSize(printMaxWidth, void 0, false);\n        }\n        // Hide all body content\n        [].forEach.call(printReverseInfo.childNodes, function (node, i) {\n            if (node.nodeType === 1) {\n                printReverseInfo.origDisplay[i] = node.style.display;\n                node.style.display = 'none';\n            }\n        });\n        // Pull out the chart\n        chart.moveContainers(body);\n        // Storage details for undo action after printing\n        chart.printReverseInfo = printReverseInfo;\n    }\n    /**\n     * @private\n     */\n    function chartCallback(chart) {\n        const composition = chart;\n        composition.renderExporting();\n        addEvent(chart, 'redraw', composition.renderExporting);\n        // Destroy the export elements at chart destroy\n        addEvent(chart, 'destroy', composition.destroyExport);\n        // Uncomment this to see a button directly below the chart, for quick\n        // testing of export\n        /*\n        let button, viewImage, viewSource;\n        if (!chart.renderer.forExport) {\n            viewImage = function () {\n                let div = doc.createElement('div');\n                div.innerHTML = chart.getSVGForExport();\n                chart.renderTo.parentNode.appendChild(div);\n            };\n\n            viewSource = function () {\n                let pre = doc.createElement('pre');\n                pre.innerHTML = chart.getSVGForExport()\n                    .replace(/</g, '\\n&lt;')\n                    .replace(/>/g, '&gt;');\n                chart.renderTo.parentNode.appendChild(pre);\n            };\n\n            viewImage();\n\n            // View SVG Image\n            button = doc.createElement('button');\n            button.innerHTML = 'View SVG Image';\n            chart.renderTo.parentNode.appendChild(button);\n            button.onclick = viewImage;\n\n            // View SVG Source\n            button = doc.createElement('button');\n            button.innerHTML = 'View SVG Source';\n            chart.renderTo.parentNode.appendChild(button);\n            button.onclick = viewSource;\n        }\n        //*/\n    }\n    /**\n     * @private\n     */\n    function compose(ChartClass, SVGRendererClass) {\n        ExportingSymbols.compose(SVGRendererClass);\n        Fullscreen.compose(ChartClass);\n        const chartProto = ChartClass.prototype;\n        if (!chartProto.exportChart) {\n            chartProto.afterPrint = afterPrint;\n            chartProto.exportChart = exportChart;\n            chartProto.inlineStyles = inlineStyles;\n            chartProto.print = print;\n            chartProto.sanitizeSVG = sanitizeSVG;\n            chartProto.getChartHTML = getChartHTML;\n            chartProto.getSVG = getSVG;\n            chartProto.getSVGForExport = getSVGForExport;\n            chartProto.getFilename = getFilename;\n            chartProto.moveContainers = moveContainers;\n            chartProto.beforePrint = beforePrint;\n            chartProto.contextMenu = contextMenu;\n            chartProto.addButton = addButton;\n            chartProto.destroyExport = destroyExport;\n            chartProto.renderExporting = renderExporting;\n            chartProto.callbacks.push(chartCallback);\n            addEvent(ChartClass, 'init', onChartInit);\n            if (G.isSafari) {\n                win.matchMedia('print').addListener(function (mqlEvent) {\n                    if (!printingChart) {\n                        return void 0;\n                    }\n                    if (mqlEvent.matches) {\n                        printingChart.beforePrint();\n                    }\n                    else {\n                        printingChart.afterPrint();\n                    }\n                });\n            }\n            defaultOptions.exporting = merge(ExportingDefaults.exporting, defaultOptions.exporting);\n            defaultOptions.lang = merge(ExportingDefaults.lang, defaultOptions.lang);\n            // Buttons and menus are collected in a separate config option set\n            // called 'navigation'. This can be extended later to add control\n            // buttons like zoom and pan right click menus.\n            defaultOptions.navigation = merge(ExportingDefaults.navigation, defaultOptions.navigation);\n        }\n    }\n    Exporting.compose = compose;\n    /**\n     * Display a popup menu for choosing the export type.\n     *\n     * @private\n     * @function Highcharts.Chart#contextMenu\n     * @param {string} className\n     *        An identifier for the menu.\n     * @param {Array<string|Highcharts.ExportingMenuObject>} items\n     *        A collection with text and onclicks for the items.\n     * @param {number} x\n     *        The x position of the opener button\n     * @param {number} y\n     *        The y position of the opener button\n     * @param {number} width\n     *        The width of the opener button\n     * @param {number} height\n     *        The height of the opener button\n     * @requires modules/exporting\n     */\n    function contextMenu(className, items, x, y, width, height, button) {\n        const chart = this, navOptions = chart.options.navigation, chartWidth = chart.chartWidth, chartHeight = chart.chartHeight, cacheName = 'cache-' + className, \n        // For mouse leave detection\n        menuPadding = Math.max(width, height);\n        let innerMenu, menu = chart[cacheName];\n        // Create the menu only the first time\n        if (!menu) {\n            // Create a HTML element above the SVG\n            chart.exportContextMenu = chart[cacheName] = menu =\n                createElement('div', {\n                    className: className\n                }, {\n                    position: 'absolute',\n                    zIndex: 1000,\n                    padding: menuPadding + 'px',\n                    pointerEvents: 'auto',\n                    ...chart.renderer.style\n                }, chart.scrollablePlotArea?.fixedDiv || chart.container);\n            innerMenu = createElement('ul', { className: 'highcharts-menu' }, chart.styledMode ? {} : {\n                listStyle: 'none',\n                margin: 0,\n                padding: 0\n            }, menu);\n            // Presentational CSS\n            if (!chart.styledMode) {\n                css(innerMenu, extend({\n                    MozBoxShadow: '3px 3px 10px #888',\n                    WebkitBoxShadow: '3px 3px 10px #888',\n                    boxShadow: '3px 3px 10px #888'\n                }, navOptions.menuStyle));\n            }\n            // Hide on mouse out\n            menu.hideMenu = function () {\n                css(menu, { display: 'none' });\n                if (button) {\n                    button.setState(0);\n                }\n                chart.openMenu = false;\n                // #10361, #9998\n                css(chart.renderTo, { overflow: 'hidden' });\n                css(chart.container, { overflow: 'hidden' });\n                U.clearTimeout(menu.hideTimer);\n                fireEvent(chart, 'exportMenuHidden');\n            };\n            // Hide the menu some time after mouse leave (#1357)\n            chart.exportEvents.push(addEvent(menu, 'mouseleave', function () {\n                menu.hideTimer = win.setTimeout(menu.hideMenu, 500);\n            }), addEvent(menu, 'mouseenter', function () {\n                U.clearTimeout(menu.hideTimer);\n            }), \n            // Hide it on clicking or touching outside the menu (#2258,\n            // #2335, #2407)\n            addEvent(doc, 'mouseup', function (e) {\n                if (!chart.pointer?.inClass(e.target, className)) {\n                    menu.hideMenu();\n                }\n            }), addEvent(menu, 'click', function () {\n                if (chart.openMenu) {\n                    menu.hideMenu();\n                }\n            }));\n            // Create the items\n            items.forEach(function (item) {\n                if (typeof item === 'string') {\n                    item = chart.options.exporting\n                        .menuItemDefinitions[item];\n                }\n                if (isObject(item, true)) {\n                    let element;\n                    if (item.separator) {\n                        element = createElement('hr', void 0, void 0, innerMenu);\n                    }\n                    else {\n                        // When chart initialized with the table, wrong button\n                        // text displayed, #14352.\n                        if (item.textKey === 'viewData' &&\n                            chart.isDataTableVisible) {\n                            item.textKey = 'hideData';\n                        }\n                        element = createElement('li', {\n                            className: 'highcharts-menu-item',\n                            onclick: function (e) {\n                                if (e) { // IE7\n                                    e.stopPropagation();\n                                }\n                                menu.hideMenu();\n                                if (typeof item !== 'string' && item.onclick) {\n                                    item.onclick.apply(chart, arguments);\n                                }\n                            }\n                        }, void 0, innerMenu);\n                        AST.setElementHTML(element, item.text ||\n                            chart.options.lang[item.textKey]);\n                        if (!chart.styledMode) {\n                            element.onmouseover = function () {\n                                css(this, navOptions.menuItemHoverStyle);\n                            };\n                            element.onmouseout = function () {\n                                css(this, navOptions.menuItemStyle);\n                            };\n                            css(element, extend({\n                                cursor: 'pointer'\n                            }, navOptions.menuItemStyle || {}));\n                        }\n                    }\n                    // Keep references to menu divs to be able to destroy them\n                    chart.exportDivElements.push(element);\n                }\n            });\n            // Keep references to menu and innerMenu div to be able to destroy\n            // them\n            chart.exportDivElements.push(innerMenu, menu);\n            chart.exportMenuWidth = menu.offsetWidth;\n            chart.exportMenuHeight = menu.offsetHeight;\n        }\n        const menuStyle = { display: 'block' };\n        // If outside right, right align it\n        if (x + (chart.exportMenuWidth || 0) > chartWidth) {\n            menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';\n        }\n        else {\n            menuStyle.left = (x - menuPadding) + 'px';\n        }\n        // If outside bottom, bottom align it\n        if (y + height + (chart.exportMenuHeight || 0) > chartHeight &&\n            button.alignOptions?.verticalAlign !== 'top') {\n            menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';\n        }\n        else {\n            menuStyle.top = (y + height - menuPadding) + 'px';\n        }\n        css(menu, menuStyle);\n        // #10361, #9998\n        css(chart.renderTo, { overflow: '' });\n        css(chart.container, { overflow: '' });\n        chart.openMenu = true;\n        fireEvent(chart, 'exportMenuShown');\n    }\n    /**\n     * Destroy the export buttons.\n     * @private\n     * @function Highcharts.Chart#destroyExport\n     * @param {global.Event} [e]\n     * @requires modules/exporting\n     */\n    function destroyExport(e) {\n        const chart = e ? e.target : this, exportSVGElements = chart.exportSVGElements, exportDivElements = chart.exportDivElements, exportEvents = chart.exportEvents;\n        let cacheName;\n        // Destroy the extra buttons added\n        if (exportSVGElements) {\n            exportSVGElements.forEach((elem, i) => {\n                // Destroy and null the svg elements\n                if (elem) { // #1822\n                    elem.onclick = elem.ontouchstart = null;\n                    cacheName = 'cache-' + elem.menuClassName;\n                    if (chart[cacheName]) {\n                        delete chart[cacheName];\n                    }\n                    exportSVGElements[i] = elem.destroy();\n                }\n            });\n            exportSVGElements.length = 0;\n        }\n        // Destroy the exporting group\n        if (chart.exportingGroup) {\n            chart.exportingGroup.destroy();\n            delete chart.exportingGroup;\n        }\n        // Destroy the divs for the menu\n        if (exportDivElements) {\n            exportDivElements.forEach(function (elem, i) {\n                if (elem) {\n                    // Remove the event handler\n                    U.clearTimeout(elem.hideTimer); // #5427\n                    removeEvent(elem, 'mouseleave');\n                    // Remove inline events\n                    // (chart.exportDivElements as any)[i] =\n                    exportDivElements[i] =\n                        elem.onmouseout =\n                            elem.onmouseover =\n                                elem.ontouchstart =\n                                    elem.onclick = null;\n                    // Destroy the div by moving to garbage bin\n                    discardElement(elem);\n                }\n            });\n            exportDivElements.length = 0;\n        }\n        if (exportEvents) {\n            exportEvents.forEach(function (unbind) {\n                unbind();\n            });\n            exportEvents.length = 0;\n        }\n    }\n    /**\n     * Exporting module required. Submit an SVG version of the chart to a server\n     * along with some parameters for conversion.\n     *\n     * @sample highcharts/members/chart-exportchart/\n     *         Export with no options\n     * @sample highcharts/members/chart-exportchart-filename/\n     *         PDF type and custom filename\n     * @sample highcharts/members/chart-exportchart-custom-background/\n     *         Different chart background in export\n     * @sample stock/members/chart-exportchart/\n     *         Export with Highcharts Stock\n     *\n     * @function Highcharts.Chart#exportChart\n     *\n     * @param {Highcharts.ExportingOptions} exportingOptions\n     *        Exporting options in addition to those defined in\n     *        [exporting](https://api.highcharts.com/highcharts/exporting).\n     *\n     * @param {Highcharts.Options} chartOptions\n     *        Additional chart options for the exported chart. For example a\n     *        different background color can be added here, or `dataLabels` for\n     *        export only.\n     *\n     * @requires modules/exporting\n     */\n    function exportChart(exportingOptions, chartOptions) {\n        const svg = this.getSVGForExport(exportingOptions, chartOptions);\n        // Merge the options\n        exportingOptions = merge(this.options.exporting, exportingOptions);\n        // Do the post\n        HU.post(exportingOptions.url, {\n            filename: exportingOptions.filename ?\n                exportingOptions.filename.replace(/\\//g, '-') :\n                this.getFilename(),\n            type: exportingOptions.type,\n            width: exportingOptions.width,\n            scale: exportingOptions.scale,\n            svg: svg\n        }, exportingOptions.fetchOptions);\n    }\n    /**\n     * Return the unfiltered innerHTML of the chart container. Used as hook for\n     * plugins. In styled mode, it also takes care of inlining CSS style rules.\n     *\n     * @see Chart#getSVG\n     *\n     * @function Highcharts.Chart#getChartHTML\n     *\n     * @return {string}\n     * The unfiltered SVG of the chart.\n     *\n     * @requires modules/exporting\n     */\n    function getChartHTML() {\n        if (this.styledMode) {\n            this.inlineStyles();\n        }\n        return this.container.innerHTML;\n    }\n    /**\n     * Get the default file name used for exported charts. By default it creates\n     * a file name based on the chart title.\n     *\n     * @function Highcharts.Chart#getFilename\n     *\n     * @return {string} A file name without extension.\n     *\n     * @requires modules/exporting\n     */\n    function getFilename() {\n        const s = this.userOptions.title && this.userOptions.title.text;\n        let filename = this.options.exporting.filename;\n        if (filename) {\n            return filename.replace(/\\//g, '-');\n        }\n        if (typeof s === 'string') {\n            filename = s\n                .toLowerCase()\n                .replace(/<\\/?[^>]+(>|$)/g, '') // Strip HTML tags\n                .replace(/[\\s_]+/g, '-')\n                .replace(/[^a-z\\d\\-]/g, '') // Preserve only latin\n                .replace(/^[\\-]+/g, '') // Dashes in the start\n                .replace(/[\\-]+/g, '-') // Dashes in a row\n                .substr(0, 24)\n                .replace(/[\\-]+$/g, ''); // Dashes in the end;\n        }\n        if (!filename || filename.length < 5) {\n            filename = 'chart';\n        }\n        return filename;\n    }\n    /**\n     * Return an SVG representation of the chart.\n     *\n     * @sample highcharts/members/chart-getsvg/\n     *         View the SVG from a button\n     *\n     * @function Highcharts.Chart#getSVG\n     *\n     * @param {Highcharts.Options} [chartOptions]\n     *        Additional chart options for the generated SVG representation. For\n     *        collections like `xAxis`, `yAxis` or `series`, the additional\n     *        options is either merged in to the original item of the same\n     *        `id`, or to the first item if a common id is not found.\n     *\n     * @return {string}\n     *         The SVG representation of the rendered chart.\n     *\n     * @emits Highcharts.Chart#event:getSVG\n     *\n     * @requires modules/exporting\n     */\n    function getSVG(chartOptions) {\n        const chart = this;\n        let svg, seriesOptions, \n        // Copy the options and add extra options\n        options = merge(chart.options, chartOptions);\n        // Use userOptions to make the options chain in series right (#3881)\n        options.plotOptions = merge(chart.userOptions.plotOptions, chartOptions && chartOptions.plotOptions);\n        // ... and likewise with time, avoid that undefined time properties are\n        // merged over legacy global time options\n        options.time = merge(chart.userOptions.time, chartOptions && chartOptions.time);\n        // Create a sandbox where a new chart will be generated\n        const sandbox = createElement('div', null, {\n            position: 'absolute',\n            top: '-9999em',\n            width: chart.chartWidth + 'px',\n            height: chart.chartHeight + 'px'\n        }, doc.body);\n        // Get the source size\n        const cssWidth = chart.renderTo.style.width, cssHeight = chart.renderTo.style.height, sourceWidth = options.exporting.sourceWidth ||\n            options.chart.width ||\n            (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n            (options.isGantt ? 800 : 600), sourceHeight = options.exporting.sourceHeight ||\n            options.chart.height ||\n            (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n            400;\n        // Override some options\n        extend(options.chart, {\n            animation: false,\n            renderTo: sandbox,\n            forExport: true,\n            renderer: 'SVGRenderer',\n            width: sourceWidth,\n            height: sourceHeight\n        });\n        options.exporting.enabled = false; // Hide buttons in print\n        delete options.data; // #3004\n        // prepare for replicating the chart\n        options.series = [];\n        chart.series.forEach(function (serie) {\n            seriesOptions = merge(serie.userOptions, {\n                animation: false, // Turn off animation\n                enableMouseTracking: false,\n                showCheckbox: false,\n                visible: serie.visible\n            });\n            // Used for the navigator series that has its own option set\n            if (!seriesOptions.isInternal) {\n                options.series.push(seriesOptions);\n            }\n        });\n        const colls = {};\n        chart.axes.forEach(function (axis) {\n            // Assign an internal key to ensure a one-to-one mapping (#5924)\n            if (!axis.userOptions.internalKey) { // #6444\n                axis.userOptions.internalKey = uniqueKey();\n            }\n            if (!axis.options.isInternal) {\n                if (!colls[axis.coll]) {\n                    colls[axis.coll] = true;\n                    options[axis.coll] = [];\n                }\n                options[axis.coll].push(merge(axis.userOptions, {\n                    visible: axis.visible,\n                    // Force some options that could have be set directly on\n                    // the axis while missing in the userOptions or options.\n                    type: axis.type,\n                    uniqueNames: axis.uniqueNames\n                }));\n            }\n        });\n        // Make sure the `colorAxis` object of the `defaultOptions` isn't used\n        // in the chart copy's user options, because a color axis should only be\n        // added when the user actually applies it.\n        options.colorAxis = chart.userOptions.colorAxis;\n        // Generate the chart copy\n        const chartCopy = new chart.constructor(options, chart.callback);\n        // Axis options and series options  (#2022, #3900, #5982)\n        if (chartOptions) {\n            ['xAxis', 'yAxis', 'series'].forEach(function (coll) {\n                const collOptions = {};\n                if (chartOptions[coll]) {\n                    collOptions[coll] = chartOptions[coll];\n                    chartCopy.update(collOptions);\n                }\n            });\n        }\n        // Reflect axis extremes in the export (#5924)\n        chart.axes.forEach(function (axis) {\n            const axisCopy = find(chartCopy.axes, function (copy) {\n                return copy.options.internalKey ===\n                    axis.userOptions.internalKey;\n            }), extremes = axis.getExtremes(), userMin = extremes.userMin, userMax = extremes.userMax;\n            if (axisCopy &&\n                ((typeof userMin !== 'undefined' &&\n                    userMin !== axisCopy.min) || (typeof userMax !== 'undefined' &&\n                    userMax !== axisCopy.max))) {\n                axisCopy.setExtremes(userMin, userMax, true, false);\n            }\n        });\n        // Get the SVG from the container's innerHTML\n        svg = chartCopy.getChartHTML();\n        fireEvent(this, 'getSVG', { chartCopy: chartCopy });\n        svg = chart.sanitizeSVG(svg, options);\n        // Free up memory\n        options = null;\n        chartCopy.destroy();\n        discardElement(sandbox);\n        return svg;\n    }\n    /**\n     * @private\n     * @function Highcharts.Chart#getSVGForExport\n     */\n    function getSVGForExport(options, chartOptions) {\n        const chartExportingOptions = this.options.exporting;\n        return this.getSVG(merge({ chart: { borderRadius: 0 } }, chartExportingOptions.chartOptions, chartOptions, {\n            exporting: {\n                sourceWidth: ((options && options.sourceWidth) ||\n                    chartExportingOptions.sourceWidth),\n                sourceHeight: ((options && options.sourceHeight) ||\n                    chartExportingOptions.sourceHeight)\n            }\n        }));\n    }\n    /**\n     * Make hyphenated property names out of camelCase\n     * @private\n     * @param {string} prop\n     * Property name in camelCase\n     * @return {string}\n     * Hyphenated property name\n     */\n    function hyphenate(prop) {\n        return prop.replace(/[A-Z]/g, function (match) {\n            return '-' + match.toLowerCase();\n        });\n    }\n    /**\n     * Analyze inherited styles from stylesheets and add them inline\n     *\n     * @private\n     * @function Highcharts.Chart#inlineStyles\n     *\n     * @todo What are the border styles for text about? In general, text has a\n     *       lot of properties.\n     *\n     * @todo Make it work with IE9 and IE10.\n     *\n     * @requires modules/exporting\n     */\n    function inlineStyles() {\n        const denylist = inlineDenylist, allowlist = Exporting.inlineAllowlist, // For IE\n        defaultStyles = {};\n        let dummySVG;\n        // Create an iframe where we read default styles without pollution from\n        // this body\n        const iframe = doc.createElement('iframe');\n        css(iframe, {\n            width: '1px',\n            height: '1px',\n            visibility: 'hidden'\n        });\n        doc.body.appendChild(iframe);\n        const iframeDoc = (iframe.contentWindow && iframe.contentWindow.document);\n        if (iframeDoc) {\n            iframeDoc.body.appendChild(iframeDoc.createElementNS(SVG_NS, 'svg'));\n        }\n        /**\n         * Call this on all elements and recurse to children\n         * @private\n         * @param {Highcharts.HTMLDOMElement} node\n         *        Element child\n             */\n        function recurse(node) {\n            const filteredStyles = {};\n            let styles, parentStyles, dummy, denylisted, allowlisted, i;\n            /**\n             * Check computed styles and whether they are in the allow/denylist\n             * for styles or attributes.\n             * @private\n             * @param {string} val\n             *        Style value\n             * @param {string} prop\n             *        Style property name\n                     */\n            function filterStyles(val, prop) {\n                // Check against allowlist & denylist\n                denylisted = allowlisted = false;\n                if (allowlist.length) {\n                    // Styled mode in IE has a allowlist instead. Exclude all\n                    // props not in this list.\n                    i = allowlist.length;\n                    while (i-- && !allowlisted) {\n                        allowlisted = allowlist[i].test(prop);\n                    }\n                    denylisted = !allowlisted;\n                }\n                // Explicitly remove empty transforms\n                if (prop === 'transform' && val === 'none') {\n                    denylisted = true;\n                }\n                i = denylist.length;\n                while (i-- && !denylisted) {\n                    if (prop.length > 1000 /* RegexLimits.shortLimit */) {\n                        throw new Error('Input too long');\n                    }\n                    denylisted = (denylist[i].test(prop) ||\n                        typeof val === 'function');\n                }\n                if (!denylisted) {\n                    // If parent node has the same style, it gets inherited, no\n                    // need to inline it. Top-level props should be diffed\n                    // against parent (#7687).\n                    if ((parentStyles[prop] !== val ||\n                        node.nodeName === 'svg') &&\n                        defaultStyles[node.nodeName][prop] !== val) {\n                        // Attributes\n                        if (!inlineToAttributes ||\n                            inlineToAttributes.indexOf(prop) !== -1) {\n                            if (val) {\n                                node.setAttribute(hyphenate(prop), val);\n                            }\n                            // Styles\n                        }\n                        else {\n                            filteredStyles[prop] = val;\n                        }\n                    }\n                }\n            }\n            if (iframeDoc &&\n                node.nodeType === 1 &&\n                unstyledElements.indexOf(node.nodeName) === -1) {\n                styles = win.getComputedStyle(node, null);\n                parentStyles = node.nodeName === 'svg' ?\n                    {} :\n                    win.getComputedStyle(node.parentNode, null);\n                // Get default styles from the browser so that we don't have to\n                // add these\n                if (!defaultStyles[node.nodeName]) {\n                    /*\n                    If (!dummySVG) {\n                        dummySVG = doc.createElementNS(H.SVG_NS, 'svg');\n                        dummySVG.setAttribute('version', '1.1');\n                        doc.body.appendChild(dummySVG);\n                    }\n                    */\n                    dummySVG = iframeDoc.getElementsByTagName('svg')[0];\n                    dummy = iframeDoc.createElementNS(node.namespaceURI, node.nodeName);\n                    dummySVG.appendChild(dummy);\n                    // Get the defaults into a standard object (simple merge\n                    // won't do)\n                    const s = win.getComputedStyle(dummy, null), defaults = {};\n                    for (const key in s) {\n                        if (key.length < 1000 /* RegexLimits.shortLimit */ &&\n                            typeof s[key] === 'string' &&\n                            !/^\\d+$/.test(key)) {\n                            defaults[key] = s[key];\n                        }\n                    }\n                    defaultStyles[node.nodeName] = defaults;\n                    // Remove default fill, otherwise text disappears when\n                    // exported\n                    if (node.nodeName === 'text') {\n                        delete defaultStyles.text.fill;\n                    }\n                    dummySVG.removeChild(dummy);\n                }\n                // Loop through all styles and add them inline if they are ok\n                for (const p in styles) {\n                    if (\n                    // Some browsers put lots of styles on the prototype...\n                    G.isFirefox ||\n                        G.isMS ||\n                        G.isSafari || // #16902\n                        // ... Chrome puts them on the instance\n                        Object.hasOwnProperty.call(styles, p)) {\n                        filterStyles(styles[p], p);\n                    }\n                }\n                // Apply styles\n                css(node, filteredStyles);\n                // Set default stroke width (needed at least for IE)\n                if (node.nodeName === 'svg') {\n                    node.setAttribute('stroke-width', '1px');\n                }\n                if (node.nodeName === 'text') {\n                    return;\n                }\n                // Recurse\n                [].forEach.call(node.children || node.childNodes, recurse);\n            }\n        }\n        /**\n         * Remove the dummy objects used to get defaults\n         * @private\n         */\n        function tearDown() {\n            dummySVG.parentNode.removeChild(dummySVG);\n            // Remove trash from DOM that stayed after each exporting\n            iframe.parentNode.removeChild(iframe);\n        }\n        recurse(this.container.querySelector('svg'));\n        tearDown();\n    }\n    /**\n     * Move the chart container(s) to another div.\n     *\n     * @function Highcharts#moveContainers\n     *\n     * @private\n     *\n     * @param {Highcharts.HTMLDOMElement} moveTo\n     *        Move target\n     */\n    function moveContainers(moveTo) {\n        const { scrollablePlotArea } = this;\n        (\n        // When scrollablePlotArea is active (#9533)\n        scrollablePlotArea ?\n            [\n                scrollablePlotArea.fixedDiv,\n                scrollablePlotArea.scrollingContainer\n            ] :\n            [this.container]).forEach(function (div) {\n            moveTo.appendChild(div);\n        });\n    }\n    /**\n     * Add update methods to handle chart.update and chart.exporting.update and\n     * chart.navigation.update. These must be added to the chart instance rather\n     * than the Chart prototype in order to use the chart instance inside the\n     * update function.\n     * @private\n     */\n    function onChartInit() {\n        const chart = this, \n        /**\n         * @private\n         * @param {\"exporting\"|\"navigation\"} prop\n         *        Property name in option root\n         * @param {Highcharts.ExportingOptions|Highcharts.NavigationOptions} options\n         *        Options to update\n         * @param {boolean} [redraw=true]\n         *        Whether to redraw\n                 */\n        update = (prop, options, redraw) => {\n            chart.isDirtyExporting = true;\n            merge(true, chart.options[prop], options);\n            if (pick(redraw, true)) {\n                chart.redraw();\n            }\n        };\n        chart.exporting = {\n            update: function (options, redraw) {\n                update('exporting', options, redraw);\n            }\n        };\n        // Register update() method for navigation. Cannot be set the same way\n        // as for exporting, because navigation options are shared with bindings\n        // which has separate update() logic.\n        ChartNavigationComposition\n            .compose(chart).navigation\n            .addUpdate((options, redraw) => {\n            update('navigation', options, redraw);\n        });\n    }\n    /**\n     * Exporting module required. Clears away other elements in the page and\n     * prints the chart as it is displayed. By default, when the exporting\n     * module is enabled, a context button with a drop down menu in the upper\n     * right corner accesses this function.\n     *\n     * @sample highcharts/members/chart-print/\n     *         Print from a HTML button\n     *\n     * @function Highcharts.Chart#print\n     *\n     *\n     * @emits Highcharts.Chart#event:beforePrint\n     * @emits Highcharts.Chart#event:afterPrint\n     *\n     * @requires modules/exporting\n     */\n    function print() {\n        const chart = this;\n        if (chart.isPrinting) { // Block the button while in printing mode\n            return;\n        }\n        printingChart = chart;\n        if (!G.isSafari) {\n            chart.beforePrint();\n        }\n        // Give the browser time to draw WebGL content, an issue that randomly\n        // appears (at least) in Chrome ~67 on the Mac (#8708).\n        setTimeout(() => {\n            win.focus(); // #1510\n            win.print();\n            // Allow the browser to prepare before reverting\n            if (!G.isSafari) {\n                setTimeout(() => {\n                    chart.afterPrint();\n                }, 1000);\n            }\n        }, 1);\n    }\n    /**\n     * Add the buttons on chart load\n     * @private\n     * @function Highcharts.Chart#renderExporting\n     * @requires modules/exporting\n     */\n    function renderExporting() {\n        const chart = this, exportingOptions = chart.options.exporting, buttons = exportingOptions.buttons, isDirty = chart.isDirtyExporting || !chart.exportSVGElements;\n        chart.buttonOffset = 0;\n        if (chart.isDirtyExporting) {\n            chart.destroyExport();\n        }\n        if (isDirty && exportingOptions.enabled !== false) {\n            chart.exportEvents = [];\n            chart.exportingGroup = chart.exportingGroup ||\n                chart.renderer.g('exporting-group').attr({\n                    zIndex: 3 // #4955, // #8392\n                }).add();\n            objectEach(buttons, function (button) {\n                chart.addButton(button);\n            });\n            chart.isDirtyExporting = false;\n        }\n    }\n    /**\n     * Exporting module only. A collection of fixes on the produced SVG to\n     * account for expand properties, browser bugs.\n     * Returns a cleaned SVG.\n     *\n     * @private\n     * @function Highcharts.Chart#sanitizeSVG\n     * @param {string} svg\n     *        SVG code to sanitize\n     * @param {Highcharts.Options} options\n     *        Chart options to apply\n     * @return {string}\n     *         Sanitized SVG code\n     * @requires modules/exporting\n     */\n    function sanitizeSVG(svg, options) {\n        const split = svg.indexOf('</svg>') + 6;\n        let html = svg.substr(split);\n        // Remove any HTML added to the container after the SVG (#894, #9087)\n        svg = svg.substr(0, split);\n        // Move HTML into a foreignObject\n        if (options && options.exporting && options.exporting.allowHTML) {\n            if (html) {\n                html = '<foreignObject x=\"0\" y=\"0\" ' +\n                    'width=\"' + options.chart.width + '\" ' +\n                    'height=\"' + options.chart.height + '\">' +\n                    '<body xmlns=\"http://www.w3.org/1999/xhtml\">' +\n                    // Some tags needs to be closed in xhtml (#13726)\n                    html.replace(/(<(?:img|br).*?(?=\\>))>/g, '$1 />') +\n                    '</body>' +\n                    '</foreignObject>';\n                svg = svg.replace('</svg>', html + '</svg>');\n            }\n        }\n        svg = svg\n            .replace(/zIndex=\"[^\"]+\"/g, '')\n            .replace(/symbolName=\"[^\"]+\"/g, '')\n            .replace(/jQuery\\d+=\"[^\"]+\"/g, '')\n            .replace(/url\\((\"|&quot;)(.*?)(\"|&quot;)\\;?\\)/g, 'url($2)')\n            .replace(/url\\([^#]+#/g, 'url(#')\n            .replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n            .replace(/ (NS\\d+\\:)?href=/g, ' xlink:href=') // #3567\n            .replace(/\\n+/g, ' ')\n            // Batik doesn't support rgba fills and strokes (#3095)\n            .replace(/(fill|stroke)=\"rgba\\(([ \\d]+,[ \\d]+,[ \\d]+),([ \\d\\.]+)\\)\"/g, // eslint-disable-line max-len\n        '$1=\"rgb($2)\" $1-opacity=\"$3\"')\n            // Replace HTML entities, issue #347\n            .replace(/&nbsp;/g, '\\u00A0') // No-break space\n            .replace(/&shy;/g, '\\u00AD'); // Soft hyphen\n        return svg;\n    }\n})(Exporting || (Exporting = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default Exporting;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Gets fired after a chart is printed through the context menu item or the\n * Chart.print method.\n *\n * @callback Highcharts.ExportingAfterPrintCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Gets fired before a chart is printed through the context menu item or the\n * Chart.print method.\n *\n * @callback Highcharts.ExportingBeforePrintCallbackFunction\n *\n * @param {Highcharts.Chart} this\n *        The chart on which the event occurred.\n *\n * @param {global.Event} event\n *        The event that occurred.\n */\n/**\n * Function to call if the offline-exporting module fails to export a chart on\n * the client side.\n *\n * @callback Highcharts.ExportingErrorCallbackFunction\n *\n * @param {Highcharts.ExportingOptions} options\n *        The exporting options.\n *\n * @param {global.Error} err\n *        The error from the module.\n */\n/**\n * Definition for a menu item in the context menu.\n *\n * @interface Highcharts.ExportingMenuObject\n */ /**\n* The text for the menu item.\n*\n* @name Highcharts.ExportingMenuObject#text\n* @type {string|undefined}\n*/ /**\n* If internationalization is required, the key to a language string.\n*\n* @name Highcharts.ExportingMenuObject#textKey\n* @type {string|undefined}\n*/ /**\n* The click handler for the menu item.\n*\n* @name Highcharts.ExportingMenuObject#onclick\n* @type {Highcharts.EventCallbackFunction<Highcharts.Chart>|undefined}\n*/ /**\n* Indicates a separator line instead of an item.\n*\n* @name Highcharts.ExportingMenuObject#separator\n* @type {boolean|undefined}\n*/\n/**\n * Possible MIME types for exporting.\n *\n * @typedef {\"image/png\"|\"image/jpeg\"|\"application/pdf\"|\"image/svg+xml\"} Highcharts.ExportingMimeTypeValue\n */\n(''); // Keeps doclets above in transpiled file\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Fires after a chart is printed through the context menu item or the\n * `Chart.print` method.\n *\n * @sample highcharts/chart/events-beforeprint-afterprint/\n *         Rescale the chart to print\n *\n * @type      {Highcharts.ExportingAfterPrintCallbackFunction}\n * @since     4.1.0\n * @context   Highcharts.Chart\n * @requires  modules/exporting\n * @apioption chart.events.afterPrint\n */\n/**\n * Fires before a chart is printed through the context menu item or\n * the `Chart.print` method.\n *\n * @sample highcharts/chart/events-beforeprint-afterprint/\n *         Rescale the chart to print\n *\n * @type      {Highcharts.ExportingBeforePrintCallbackFunction}\n * @since     4.1.0\n * @context   Highcharts.Chart\n * @requires  modules/exporting\n * @apioption chart.events.beforePrint\n */\n(''); // Keeps doclets above in transpiled file\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/modules/exporting\n * @requires highcharts\n *\n * Exporting module\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport Exporting from '../../Extensions/Exporting/Exporting.js';\nimport HttpUtilities from '../../Core/HttpUtilities.js';\nconst G = Highcharts;\nG.HttpUtilities = G.HttpUtilities || HttpUtilities;\nG.ajax = G.HttpUtilities.ajax;\nG.getJSON = G.HttpUtilities.getJSON;\nG.post = G.HttpUtilities.post;\nExporting.compose(G.Chart, G.Renderer);\nexport default Highcharts;\n","/* *\n *\n *  (c) 2015-2024 Oystein Moseng\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n *  Mixin for downloading content in the browser\n *\n * */\n'use strict';\n/* *\n *\n *  Imports\n *\n * */\nimport H from '../Core/Globals.js';\nconst { isSafari, win, win: { document: doc } } = H;\n/* *\n *\n *  Constants\n *\n * */\nconst domurl = win.URL || win.webkitURL || win;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Convert base64 dataURL to Blob if supported, otherwise returns undefined.\n * @private\n * @function Highcharts.dataURLtoBlob\n * @param {string} dataURL\n *        URL to convert\n * @return {string|undefined}\n *         Blob\n */\nfunction dataURLtoBlob(dataURL) {\n    const parts = dataURL\n        .replace(/filename=.*;/, '')\n        .match(/data:([^;]*)(;base64)?,([A-Z+\\d\\/]+)/i);\n    if (parts &&\n        parts.length > 3 &&\n        (win.atob) &&\n        win.ArrayBuffer &&\n        win.Uint8Array &&\n        win.Blob &&\n        (domurl.createObjectURL)) {\n        // Try to convert data URL to Blob\n        const binStr = win.atob(parts[3]), buf = new win.ArrayBuffer(binStr.length), binary = new win.Uint8Array(buf);\n        for (let i = 0; i < binary.length; ++i) {\n            binary[i] = binStr.charCodeAt(i);\n        }\n        return domurl\n            .createObjectURL(new win.Blob([binary], { 'type': parts[1] }));\n    }\n}\n/**\n * Download a data URL in the browser. Can also take a blob as first param.\n *\n * @private\n * @function Highcharts.downloadURL\n * @param {string|global.URL} dataURL\n *        The dataURL/Blob to download\n * @param {string} filename\n *        The name of the resulting file (w/extension)\n * @return {void}\n */\nfunction downloadURL(dataURL, filename) {\n    const nav = win.navigator, a = doc.createElement('a');\n    // IE specific blob implementation\n    // Don't use for normal dataURLs\n    if (typeof dataURL !== 'string' &&\n        !(dataURL instanceof String) &&\n        nav.msSaveOrOpenBlob) {\n        nav.msSaveOrOpenBlob(dataURL, filename);\n        return;\n    }\n    dataURL = '' + dataURL;\n    if (nav.userAgent.length > 1000 /* RegexLimits.shortLimit */) {\n        throw new Error('Input too long');\n    }\n    const // Some browsers have limitations for data URL lengths. Try to convert\n    // to Blob or fall back. Edge always needs that blob.\n    isOldEdgeBrowser = /Edge\\/\\d+/.test(nav.userAgent), \n    // Safari on iOS needs Blob in order to download PDF\n    safariBlob = (isSafari &&\n        typeof dataURL === 'string' &&\n        dataURL.indexOf('data:application/pdf') === 0);\n    if (safariBlob || isOldEdgeBrowser || dataURL.length > 2000000) {\n        dataURL = dataURLtoBlob(dataURL) || '';\n        if (!dataURL) {\n            throw new Error('Failed to convert to blob');\n        }\n    }\n    // Try HTML5 download attr if supported\n    if (typeof a.download !== 'undefined') {\n        a.href = dataURL;\n        a.download = filename; // HTML5 download attribute\n        doc.body.appendChild(a);\n        a.click();\n        doc.body.removeChild(a);\n    }\n    else {\n        // No download attr, just opening data URI\n        try {\n            if (!win.open(dataURL, 'chart')) {\n                throw new Error('Failed to open window');\n            }\n        }\n        catch {\n            // If window.open failed, try location.href\n            win.location.href = dataURL;\n        }\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst DownloadURL = {\n    dataURLtoBlob,\n    downloadURL\n};\nexport default DownloadURL;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n * Declarations\n *\n * */\nconst OfflineExportingDefaults = {\n    libURL: 'https://code.highcharts.com/@product.version@/lib/',\n    // When offline-exporting is loaded, redefine the menu item definitions\n    // related to download.\n    menuItemDefinitions: {\n        downloadPNG: {\n            textKey: 'downloadPNG',\n            onclick: function () {\n                this.exportChartLocal();\n            }\n        },\n        downloadJPEG: {\n            textKey: 'downloadJPEG',\n            onclick: function () {\n                this.exportChartLocal({\n                    type: 'image/jpeg'\n                });\n            }\n        },\n        downloadSVG: {\n            textKey: 'downloadSVG',\n            onclick: function () {\n                this.exportChartLocal({\n                    type: 'image/svg+xml'\n                });\n            }\n        },\n        downloadPDF: {\n            textKey: 'downloadPDF',\n            onclick: function () {\n                this.exportChartLocal({\n                    type: 'application/pdf'\n                });\n            }\n        }\n    }\n};\n/* *\n *\n *  Default Export\n *\n * */\nexport default OfflineExportingDefaults;\n","/* *\n *\n *  Client side exporting module\n *\n *  (c) 2015 Torstein Honsi / Oystein Moseng\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport AST from '../../Core/Renderer/HTML/AST.js';\nimport Chart from '../../Core/Chart/Chart.js';\nimport D from '../../Core/Defaults.js';\nconst { defaultOptions } = D;\nimport DownloadURL from '../DownloadURL.js';\nconst { downloadURL } = DownloadURL;\nimport Exporting from '../Exporting/Exporting.js';\nimport H from '../../Core/Globals.js';\nconst { doc, win } = H;\nimport HU from '../../Core/HttpUtilities.js';\nconst { ajax } = HU;\nimport OfflineExportingDefaults from './OfflineExportingDefaults.js';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, error, extend, fireEvent, merge } = U;\nAST.allowedAttributes.push('data-z-index', 'fill-opacity', 'filter', 'rx', 'ry', 'stroke-dasharray', 'stroke-linejoin', 'stroke-opacity', 'text-anchor', 'transform', 'version', 'viewBox', 'visibility', 'xmlns', 'xmlns:xlink');\nAST.allowedTags.push('desc', 'clippath', 'g');\n/* *\n *\n *  Composition\n *\n * */\nvar OfflineExporting;\n(function (OfflineExporting) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Constants\n     *\n     * */\n    // Dummy object so we can reuse our canvas-tools.js without errors\n    OfflineExporting.CanVGRenderer = {}, OfflineExporting.domurl = win.URL || win.webkitURL || win, \n    // Milliseconds to defer image load event handlers to offset IE bug\n    OfflineExporting.loadEventDeferDelay = H.isMS ? 150 : 0;\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Extends OfflineExporting with Chart.\n     * @private\n     */\n    function compose(ChartClass) {\n        const chartProto = ChartClass.prototype;\n        if (!chartProto.exportChartLocal) {\n            chartProto.getSVGForLocalExport = getSVGForLocalExport;\n            chartProto.exportChartLocal = exportChartLocal;\n            // Extend the default options to use the local exporter logic\n            merge(true, defaultOptions.exporting, OfflineExportingDefaults);\n        }\n        return ChartClass;\n    }\n    OfflineExporting.compose = compose;\n    /**\n     * Get data URL to an image of an SVG and call download on it options\n     * object:\n     * - **filename:** Name of resulting downloaded file without extension.\n     * Default is `chart`.\n     *\n     * - **type:** File type of resulting download. Default is `image/png`.\n     *\n     * - **scale:** Scaling factor of downloaded image compared to source.\n     * Default is `1`.\n     *\n     * - **libURL:** URL pointing to location of dependency scripts to download\n     * on demand. Default is the exporting.libURL option of the global\n     * Highcharts options pointing to our server.\n     *\n     * @function Highcharts.downloadSVGLocal\n     *\n     * @param {string} svg\n     * The generated SVG\n     *\n     * @param {Highcharts.ExportingOptions} options\n     * The exporting options\n     *\n     * @param {Function} failCallback\n     * The callback function in case of errors\n     *\n     * @param {Function} [successCallback]\n     * The callback function in case of success\n     *\n     */\n    function downloadSVGLocal(svg, options, failCallback, successCallback) {\n        const dummySVGContainer = doc.createElement('div'), imageType = options.type || 'image/png', filename = ((options.filename || 'chart') +\n            '.' +\n            (imageType === 'image/svg+xml' ?\n                'svg' : imageType.split('/')[1])), scale = options.scale || 1;\n        let svgurl, blob, finallyHandler, libURL = (options.libURL || defaultOptions.exporting.libURL), objectURLRevoke = true, pdfFont = options.pdfFont;\n        // Allow libURL to end with or without fordward slash\n        libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL;\n        /*\n         * Detect if we need to load TTF fonts for the PDF, then load them and\n         * proceed.\n         *\n         * @private\n         */\n        const loadPdfFonts = (svgElement, callback) => {\n            const hasNonASCII = (s) => (\n            // eslint-disable-next-line no-control-regex\n            /[^\\u0000-\\u007F\\u200B]+/.test(s));\n            // Register an event in order to add the font once jsPDF is\n            // initialized\n            const addFont = (variant, base64) => {\n                win.jspdf.jsPDF.API.events.push([\n                    'initialized',\n                    function () {\n                        this.addFileToVFS(variant, base64);\n                        this.addFont(variant, 'HighchartsFont', variant);\n                        if (!this.getFontList().HighchartsFont) {\n                            this.setFont('HighchartsFont');\n                        }\n                    }\n                ]);\n            };\n            // If there are no non-ASCII characters in the SVG, do not use\n            // bother downloading the font files\n            if (pdfFont && !hasNonASCII(svgElement.textContent || '')) {\n                pdfFont = void 0;\n            }\n            // Add new font if the URL is declared, #6417.\n            const variants = ['normal', 'italic', 'bold', 'bolditalic'];\n            // Shift the first element off the variants and add as a font.\n            // Then asynchronously trigger the next variant until calling the\n            // callback when the variants are empty.\n            let normalBase64;\n            const shiftAndLoadVariant = () => {\n                const variant = variants.shift();\n                // All variants shifted and possibly loaded, proceed\n                if (!variant) {\n                    return callback();\n                }\n                const url = pdfFont && pdfFont[variant];\n                if (url) {\n                    ajax({\n                        url,\n                        responseType: 'blob',\n                        success: (data, xhr) => {\n                            const reader = new FileReader();\n                            reader.onloadend = function () {\n                                if (typeof this.result === 'string') {\n                                    const base64 = this.result.split(',')[1];\n                                    addFont(variant, base64);\n                                    if (variant === 'normal') {\n                                        normalBase64 = base64;\n                                    }\n                                }\n                                shiftAndLoadVariant();\n                            };\n                            reader.readAsDataURL(xhr.response);\n                        },\n                        error: shiftAndLoadVariant\n                    });\n                }\n                else {\n                    // For other variants, fall back to normal text weight/style\n                    if (normalBase64) {\n                        addFont(variant, normalBase64);\n                    }\n                    shiftAndLoadVariant();\n                }\n            };\n            shiftAndLoadVariant();\n        };\n        /*\n         * @private\n         */\n        const downloadPDF = () => {\n            AST.setElementHTML(dummySVGContainer, svg);\n            const textElements = dummySVGContainer.getElementsByTagName('text'), \n            // Copy style property to element from parents if it's not\n            // there. Searches up hierarchy until it finds prop, or hits the\n            // chart container.\n            setStylePropertyFromParents = function (el, propName) {\n                let curParent = el;\n                while (curParent && curParent !== dummySVGContainer) {\n                    if (curParent.style[propName]) {\n                        let value = curParent.style[propName];\n                        if (propName === 'fontSize' && /em$/.test(value)) {\n                            value = Math.round(parseFloat(value) * 16) + 'px';\n                        }\n                        el.style[propName] = value;\n                        break;\n                    }\n                    curParent = curParent.parentNode;\n                }\n            };\n            let titleElements, outlineElements;\n            // Workaround for the text styling. Making sure it does pick up\n            // settings for parent elements.\n            [].forEach.call(textElements, function (el) {\n                // Workaround for the text styling. making sure it does pick up\n                // the root element\n                ['fontFamily', 'fontSize']\n                    .forEach((property) => {\n                    setStylePropertyFromParents(el, property);\n                });\n                el.style.fontFamily = pdfFont && pdfFont.normal ?\n                    // Custom PDF font\n                    'HighchartsFont' :\n                    // Generic font (serif, sans-serif etc)\n                    String(el.style.fontFamily &&\n                        el.style.fontFamily.split(' ').splice(-1));\n                // Workaround for plotband with width, removing title from text\n                // nodes\n                titleElements = el.getElementsByTagName('title');\n                [].forEach.call(titleElements, function (titleElement) {\n                    el.removeChild(titleElement);\n                });\n                // Remove all .highcharts-text-outline elements, #17170\n                outlineElements =\n                    el.getElementsByClassName('highcharts-text-outline');\n                while (outlineElements.length > 0) {\n                    const outline = outlineElements[0];\n                    if (outline.parentNode) {\n                        outline.parentNode.removeChild(outline);\n                    }\n                }\n            });\n            const svgNode = dummySVGContainer.querySelector('svg');\n            if (svgNode) {\n                loadPdfFonts(svgNode, () => {\n                    svgToPdf(svgNode, 0, scale, (pdfData) => {\n                        try {\n                            downloadURL(pdfData, filename);\n                            if (successCallback) {\n                                successCallback();\n                            }\n                        }\n                        catch (e) {\n                            failCallback(e);\n                        }\n                    });\n                });\n            }\n        };\n        // Initiate download depending on file type\n        if (imageType === 'image/svg+xml') {\n            // SVG download. In this case, we want to use Microsoft specific\n            // Blob if available\n            try {\n                if (typeof win.MSBlobBuilder !== 'undefined') {\n                    blob = new win.MSBlobBuilder();\n                    blob.append(svg);\n                    svgurl = blob.getBlob('image/svg+xml');\n                }\n                else {\n                    svgurl = svgToDataUrl(svg);\n                }\n                downloadURL(svgurl, filename);\n                if (successCallback) {\n                    successCallback();\n                }\n            }\n            catch (e) {\n                failCallback(e);\n            }\n        }\n        else if (imageType === 'application/pdf') {\n            if (win.jspdf && win.jspdf.jsPDF) {\n                downloadPDF();\n            }\n            else {\n                // Must load pdf libraries first. // Don't destroy the object\n                // URL yet since we are doing things asynchronously. A cleaner\n                // solution would be nice, but this will do for now.\n                objectURLRevoke = true;\n                getScript(libURL + 'jspdf.js', function () {\n                    getScript(libURL + 'svg2pdf.js', downloadPDF);\n                });\n            }\n        }\n        else {\n            // PNG/JPEG download - create bitmap from SVG\n            svgurl = svgToDataUrl(svg);\n            finallyHandler = function () {\n                try {\n                    OfflineExporting.domurl.revokeObjectURL(svgurl);\n                }\n                catch (e) {\n                    // Ignore\n                }\n            };\n            // First, try to get PNG by rendering on canvas\n            imageToDataUrl(svgurl, imageType, {}, scale, function (imageURL) {\n                // Success\n                try {\n                    downloadURL(imageURL, filename);\n                    if (successCallback) {\n                        successCallback();\n                    }\n                }\n                catch (e) {\n                    failCallback(e);\n                }\n            }, function () {\n                if (svg.length > 100000000 /* RegexLimits.svgLimit */) {\n                    throw new Error('Input too long');\n                }\n                // Failed due to tainted canvas\n                // Create new and untainted canvas\n                const canvas = doc.createElement('canvas'), ctx = canvas.getContext('2d'), matchedImageWidth = svg.match(\n                // eslint-disable-next-line max-len\n                /^<svg[^>]*\\s{,1000}width\\s{,1000}=\\s{,1000}\\\"?(\\d+)\\\"?[^>]*>/), matchedImageHeight = svg.match(\n                // eslint-disable-next-line max-len\n                /^<svg[^>]*\\s{0,1000}height\\s{,1000}=\\s{,1000}\\\"?(\\d+)\\\"?[^>]*>/);\n                if (ctx && matchedImageWidth && matchedImageHeight) {\n                    const imageWidth = +matchedImageWidth[1] * scale, imageHeight = +matchedImageHeight[1] * scale, downloadWithCanVG = () => {\n                        const v = win.canvg.Canvg.fromString(ctx, svg);\n                        v.start();\n                        try {\n                            downloadURL(win.navigator.msSaveOrOpenBlob ?\n                                canvas.msToBlob() :\n                                canvas.toDataURL(imageType), filename);\n                            if (successCallback) {\n                                successCallback();\n                            }\n                        }\n                        catch (e) {\n                            failCallback(e);\n                        }\n                        finally {\n                            finallyHandler();\n                        }\n                    };\n                    canvas.width = imageWidth;\n                    canvas.height = imageHeight;\n                    if (win.canvg) {\n                        // Use preloaded canvg\n                        downloadWithCanVG();\n                    }\n                    else {\n                        // Must load canVG first.\n                        // Don't destroy the object URL yet since we are\n                        // doing things asynchronously. A cleaner solution\n                        // would be nice, but this will do for now.\n                        objectURLRevoke = true;\n                        getScript(libURL + 'canvg.js', downloadWithCanVG);\n                    }\n                }\n            }, \n            // No canvas support\n            failCallback, \n            // Failed to load image\n            failCallback, \n            // Finally\n            function () {\n                if (objectURLRevoke) {\n                    finallyHandler();\n                }\n            });\n        }\n    }\n    OfflineExporting.downloadSVGLocal = downloadSVGLocal;\n    /* eslint-disable valid-jsdoc */\n    /**\n     * Exporting and offline-exporting modules required. Export a chart to\n     * an image locally in the user's browser.\n     *\n     * @function Highcharts.Chart#exportChartLocal\n     *\n     * @param  {Highcharts.ExportingOptions} [exportingOptions]\n     *         Exporting options, the same as in\n     *         {@link Highcharts.Chart#exportChart}.\n     *\n     * @param  {Highcharts.Options} [chartOptions]\n     *         Additional chart options for the exported chart. For example\n     *         a different background color can be added here, or\n     *         `dataLabels` for export only.\n     *\n     *\n     * @requires modules/exporting\n     * @requires modules/offline-exporting\n     */\n    function exportChartLocal(exportingOptions, chartOptions) {\n        const chart = this, options = merge(chart.options.exporting, exportingOptions), fallbackToExportServer = function (err) {\n            if (options.fallbackToExportServer === false) {\n                if (options.error) {\n                    options.error(options, err);\n                }\n                else {\n                    error(28, true); // Fallback disabled\n                }\n            }\n            else {\n                chart.exportChart(options);\n            }\n        }, svgSuccess = function (svg) {\n            // If SVG contains foreignObjects PDF fails in all browsers\n            // and all exports except SVG will fail in IE, as both CanVG\n            // and svg2pdf choke on this. Gracefully fall back.\n            if (svg.indexOf('<foreignObject') > -1 &&\n                options.type !== 'image/svg+xml' &&\n                (H.isMS || options.type === 'application/pdf')) {\n                fallbackToExportServer(new Error('Image type not supported for charts with embedded HTML'));\n            }\n            else {\n                OfflineExporting.downloadSVGLocal(svg, extend({ filename: chart.getFilename() }, options), fallbackToExportServer, () => fireEvent(chart, 'exportChartLocalSuccess'));\n            }\n        }, \n        // Return true if the SVG contains images with external data. With\n        // the boost module there are `image` elements with encoded PNGs,\n        // these are supported by svg2pdf and should pass (#10243).\n        hasExternalImages = function () {\n            return [].some.call(chart.container.getElementsByTagName('image'), function (image) {\n                const href = image.getAttribute('href');\n                return (href !== '' &&\n                    typeof href === 'string' &&\n                    href.indexOf('data:') !== 0);\n            });\n        };\n        // If we are on IE and in styled mode, add an allowlist to the renderer\n        // for inline styles that we want to pass through. There are so many\n        // styles by default in IE that we don't want to denylist them all.\n        if (H.isMS && chart.styledMode && !Exporting.inlineAllowlist.length) {\n            Exporting.inlineAllowlist.push(/^blockSize/, /^border/, /^caretColor/, /^color/, /^columnRule/, /^columnRuleColor/, /^cssFloat/, /^cursor/, /^fill$/, /^fillOpacity/, /^font/, /^inlineSize/, /^length/, /^lineHeight/, /^opacity/, /^outline/, /^parentRule/, /^rx$/, /^ry$/, /^stroke/, /^textAlign/, /^textAnchor/, /^textDecoration/, /^transform/, /^vectorEffect/, /^visibility/, /^x$/, /^y$/);\n        }\n        // Always fall back on:\n        // - MS browsers: Embedded images JPEG/PNG, or any PDF\n        // - Embedded images and PDF\n        if ((H.isMS &&\n            (options.type === 'application/pdf' ||\n                chart.container.getElementsByTagName('image').length &&\n                    options.type !== 'image/svg+xml')) || (options.type === 'application/pdf' &&\n            hasExternalImages())) {\n            fallbackToExportServer(new Error('Image type not supported for this chart/browser.'));\n            return;\n        }\n        chart.getSVGForLocalExport(options, chartOptions || {}, fallbackToExportServer, svgSuccess);\n    }\n    /**\n     * Downloads a script and executes a callback when done.\n     *\n     * @private\n     * @function getScript\n     * @param {string} scriptLocation\n     * @param {Function} callback\n     */\n    function getScript(scriptLocation, callback) {\n        const head = doc.getElementsByTagName('head')[0], script = doc.createElement('script');\n        script.type = 'text/javascript';\n        script.src = scriptLocation;\n        script.onload = callback;\n        script.onerror = function () {\n            error('Error loading script ' + scriptLocation);\n        };\n        head.appendChild(script);\n    }\n    OfflineExporting.getScript = getScript;\n    /**\n     * Get SVG of chart prepared for client side export. This converts\n     * embedded images in the SVG to data URIs. It requires the regular\n     * exporting module. The options and chartOptions arguments are passed\n     * to the getSVGForExport function.\n     *\n     * @private\n     * @function Highcharts.Chart#getSVGForLocalExport\n     * @param {Highcharts.ExportingOptions} options\n     * @param {Highcharts.Options} chartOptions\n     * @param {Function} failCallback\n     * @param {Function} successCallback\n     */\n    function getSVGForLocalExport(options, chartOptions, failCallback, successCallback) {\n        const chart = this, \n        // After grabbing the SVG of the chart's copy container we need\n        // to do sanitation on the SVG\n        sanitize = (svg) => chart.sanitizeSVG(svg, chartCopyOptions), \n        // When done with last image we have our SVG\n        checkDone = () => {\n            if (images && imagesEmbedded === imagesLength) {\n                successCallback(sanitize(chartCopyContainer.innerHTML));\n            }\n        }, \n        // Success handler, we converted image to base64!\n        embeddedSuccess = (imageURL, imageType, callbackArgs) => {\n            ++imagesEmbedded;\n            // Change image href in chart copy\n            callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);\n            checkDone();\n        };\n        let el, chartCopyContainer, chartCopyOptions, href = null, images, imagesLength = 0, imagesEmbedded = 0;\n        // Hook into getSVG to get a copy of the chart copy's\n        // container (#8273)\n        chart.unbindGetSVG = addEvent(chart, 'getSVG', (e) => {\n            chartCopyOptions = e.chartCopy.options;\n            chartCopyContainer = e.chartCopy.container.cloneNode(true);\n            images = chartCopyContainer && chartCopyContainer\n                .getElementsByTagName('image') || [];\n            imagesLength = images.length;\n        });\n        // Trigger hook to get chart copy\n        chart.getSVGForExport(options, chartOptions);\n        try {\n            // If there are no images to embed, the SVG is okay now.\n            if (!images || !images.length) {\n                // Use SVG of chart copy\n                successCallback(sanitize(chartCopyContainer.innerHTML));\n                return;\n            }\n            // Go through the images we want to embed\n            for (let i = 0; i < images.length; i++) {\n                el = images[i];\n                href = el.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n                if (href) {\n                    OfflineExporting.imageToDataUrl(href, 'image/png', { imageElement: el }, options.scale, embeddedSuccess, \n                    // Tainted canvas\n                    failCallback, \n                    // No canvas support\n                    failCallback, \n                    // Failed to load source\n                    failCallback);\n                    // Hidden, boosted series have blank href (#10243)\n                }\n                else {\n                    imagesEmbedded++;\n                    el.parentNode.removeChild(el);\n                    i--;\n                    checkDone();\n                }\n            }\n        }\n        catch (e) {\n            failCallback(e);\n        }\n        // Clean up\n        chart.unbindGetSVG();\n    }\n    /**\n     * Get data:URL from image URL. Pass in callbacks to handle results.\n     *\n     * @private\n     * @function Highcharts.imageToDataUrl\n     *\n     * @param {string} imageURL\n     *\n     * @param {string} imageType\n     *\n     * @param {*} callbackArgs\n     *        callbackArgs is used only by callbacks.\n     *\n     * @param {number} scale\n     *\n     * @param {Function} successCallback\n     *        Receives four arguments: imageURL, imageType, callbackArgs,\n     *        and scale.\n     *\n     * @param {Function} taintedCallback\n     *        Receives four arguments: imageURL, imageType, callbackArgs,\n     *        and scale.\n     *\n     * @param {Function} noCanvasSupportCallback\n     *        Receives four arguments: imageURL, imageType, callbackArgs,\n     *        and scale.\n     *\n     * @param {Function} failedLoadCallback\n     *        Receives four arguments: imageURL, imageType, callbackArgs,\n     *        and scale.\n     *\n     * @param {Function} [finallyCallback]\n     *        finallyCallback is always called at the end of the process. All\n     *        callbacks receive four arguments: imageURL, imageType,\n     *        callbackArgs, and scale.\n     */\n    function imageToDataUrl(imageURL, imageType, callbackArgs, scale, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {\n        let img = new win.Image(), taintedHandler;\n        const loadHandler = () => {\n            setTimeout(function () {\n                const canvas = doc.createElement('canvas'), ctx = canvas.getContext && canvas.getContext('2d');\n                let dataURL;\n                try {\n                    if (!ctx) {\n                        noCanvasSupportCallback(imageURL, imageType, callbackArgs, scale);\n                    }\n                    else {\n                        canvas.height = img.height * scale;\n                        canvas.width = img.width * scale;\n                        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n                        // Now we try to get the contents of the canvas.\n                        try {\n                            dataURL = canvas.toDataURL(imageType);\n                            successCallback(dataURL, imageType, callbackArgs, scale);\n                        }\n                        catch (e) {\n                            taintedHandler(imageURL, imageType, callbackArgs, scale);\n                        }\n                    }\n                }\n                finally {\n                    if (finallyCallback) {\n                        finallyCallback(imageURL, imageType, callbackArgs, scale);\n                    }\n                }\n                // IE bug where image is not always ready despite calling load\n                // event.\n            }, OfflineExporting.loadEventDeferDelay);\n        }, \n        // Image load failed (e.g. invalid URL)\n        errorHandler = () => {\n            failedLoadCallback(imageURL, imageType, callbackArgs, scale);\n            if (finallyCallback) {\n                finallyCallback(imageURL, imageType, callbackArgs, scale);\n            }\n        };\n        // This is called on load if the image drawing to canvas failed with a\n        // security error. We retry the drawing with crossOrigin set to\n        // Anonymous.\n        taintedHandler = () => {\n            img = new win.Image();\n            taintedHandler = taintedCallback;\n            // Must be set prior to loading image source\n            img.crossOrigin = 'Anonymous';\n            img.onload = loadHandler;\n            img.onerror = errorHandler;\n            img.src = imageURL;\n        };\n        img.onload = loadHandler;\n        img.onerror = errorHandler;\n        img.src = imageURL;\n    }\n    OfflineExporting.imageToDataUrl = imageToDataUrl;\n    /**\n     * Get blob URL from SVG code. Falls back to normal data URI.\n     *\n     * @private\n     * @function Highcharts.svgToDataURL\n     */\n    function svgToDataUrl(svg) {\n        // Webkit and not chrome\n        const userAgent = win.navigator.userAgent;\n        const webKit = (userAgent.indexOf('WebKit') > -1 &&\n            userAgent.indexOf('Chrome') < 0);\n        try {\n            // Safari requires data URI since it doesn't allow navigation to\n            // blob URLs. ForeignObjects also don't work well in Blobs in Chrome\n            // (#14780).\n            if (!webKit && svg.indexOf('<foreignObject') === -1) {\n                return OfflineExporting.domurl.createObjectURL(new win.Blob([svg], {\n                    type: 'image/svg+xml;charset-utf-16'\n                }));\n            }\n        }\n        catch (e) {\n            // Ignore\n        }\n        return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);\n    }\n    OfflineExporting.svgToDataUrl = svgToDataUrl;\n    /* eslint-disable valid-jsdoc */\n    /**\n     * @private\n     */\n    function svgToPdf(svgElement, margin, scale, callback) {\n        const width = (Number(svgElement.getAttribute('width')) + 2 * margin) *\n            scale, height = (Number(svgElement.getAttribute('height')) + 2 * margin) *\n            scale, pdfDoc = new win.jspdf.jsPDF(// eslint-disable-line new-cap\n        // setting orientation to portrait if height exceeds width\n        height > width ? 'p' : 'l', 'pt', [width, height]);\n        // Workaround for #7090, hidden elements were drawn anyway. It comes\n        // down to https://github.com/yWorks/svg2pdf.js/issues/28. Check this\n        // later.\n        [].forEach.call(svgElement.querySelectorAll('*[visibility=\"hidden\"]'), function (node) {\n            node.parentNode.removeChild(node);\n        });\n        // Workaround for #13948, multiple stops in linear gradient set to 0\n        // causing error in Acrobat\n        const gradients = svgElement.querySelectorAll('linearGradient');\n        for (let index = 0; index < gradients.length; index++) {\n            const gradient = gradients[index];\n            const stops = gradient.querySelectorAll('stop');\n            let i = 0;\n            while (i < stops.length &&\n                stops[i].getAttribute('offset') === '0' &&\n                stops[i + 1].getAttribute('offset') === '0') {\n                stops[i].remove();\n                i++;\n            }\n        }\n        // Workaround for #15135, zero width spaces, which Highcharts uses\n        // to break lines, are not correctly rendered in PDF. Replace it\n        // with a regular space and offset by some pixels to compensate.\n        [].forEach.call(svgElement.querySelectorAll('tspan'), (tspan) => {\n            if (tspan.textContent === '\\u200B') {\n                tspan.textContent = ' ';\n                tspan.setAttribute('dx', -5);\n            }\n        });\n        pdfDoc.svg(svgElement, {\n            x: 0,\n            y: 0,\n            width,\n            height,\n            removeInvalid: true\n        }).then(() => callback(pdfDoc.output('datauristring')));\n    }\n    OfflineExporting.svgToPdf = svgToPdf;\n})(OfflineExporting || (OfflineExporting = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default OfflineExporting;\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/modules/offline-exporting\n * @requires highcharts\n * @requires highcharts/modules/exporting\n *\n * Client side exporting module\n *\n * (c) 2015-2024 Torstein Honsi / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport DownloadURL from '../../Extensions/DownloadURL.js';\nimport OfflineExporting from '../../Extensions/OfflineExporting/OfflineExporting.js';\nconst G = Highcharts;\n// Compatibility\nG.dataURLtoBlob = G.dataURLtoBlob || DownloadURL.dataURLtoBlob;\nG.downloadSVGLocal = OfflineExporting.downloadSVGLocal;\nG.downloadURL = G.downloadURL || DownloadURL.downloadURL;\n// Compose\nOfflineExporting.compose(G.Chart);\nexport default Highcharts;\n","/* *\n *\n *  Experimental data export module for Highcharts\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  Constants\n *\n * */\n/**\n * @optionparent exporting\n * @private\n */\nconst exporting = {\n    /**\n     * Caption for the data table. Same as chart title by default. Set to\n     * `false` to disable.\n     *\n     * @sample highcharts/export-data/multilevel-table\n     *         Multiple table headers\n     *\n     * @type      {boolean|string}\n     * @since     6.0.4\n     * @requires  modules/export-data\n     * @apioption exporting.tableCaption\n     */\n    /**\n     * Options for exporting data to CSV or ExCel, or displaying the data\n     * in a HTML table or a JavaScript structure.\n     *\n     * This module adds data export options to the export menu and provides\n     * functions like `Chart.getCSV`, `Chart.getTable`, `Chart.getDataRows`\n     * and `Chart.viewData`.\n     *\n     * The XLS converter is limited and only creates a HTML string that is\n     * passed for download, which works but creates a warning before\n     * opening. The workaround for this is to use a third party XLSX\n     * converter, as demonstrated in the sample below.\n     *\n     * @sample  highcharts/export-data/categorized/ Categorized data\n     * @sample  highcharts/export-data/stock-timeaxis/ Highcharts Stock time axis\n     * @sample  highcharts/export-data/xlsx/\n     *          Using a third party XLSX converter\n     *\n     * @since    6.0.0\n     * @requires modules/export-data\n     */\n    csv: {\n        /**\n         *\n         * Options for annotations in the export-data table.\n         *\n         * @since 8.2.0\n         * @requires modules/export-data\n         * @requires modules/annotations\n         *\n         *\n         */\n        annotations: {\n            /**\n            * The way to mark the separator for annotations\n            * combined in one export-data table cell.\n            *\n            * @since 8.2.0\n            * @requires modules/annotations\n            */\n            itemDelimiter: '; ',\n            /**\n            * When several labels are assigned to a specific point,\n            * they will be displayed in one field in the table.\n            *\n            * @sample highcharts/export-data/join-annotations/\n            *         Concatenate point annotations with itemDelimiter set.\n            *\n            * @since 8.2.0\n            * @requires modules/annotations\n            */\n            join: false\n        },\n        /**\n         * Formatter callback for the column headers. Parameters are:\n         * - `item` - The series or axis object)\n         * - `key` -  The point key, for example y or z\n         * - `keyLength` - The amount of value keys for this item, for\n         *   example a range series has the keys `low` and `high` so the\n         *   key length is 2.\n         *\n         * If [useMultiLevelHeaders](#exporting.useMultiLevelHeaders) is\n         * true, columnHeaderFormatter by default returns an object with\n         * columnTitle and topLevelColumnTitle for each key. Columns with\n         * the same topLevelColumnTitle have their titles merged into a\n         * single cell with colspan for table/Excel export.\n         *\n         * If `useMultiLevelHeaders` is false, or for CSV export, it returns\n         * the series name, followed by the key if there is more than one\n         * key.\n         *\n         * For the axis it returns the axis title or \"Category\" or\n         * \"DateTime\" by default.\n         *\n         * Return `false` to use Highcharts' proposed header.\n         *\n         * @sample highcharts/export-data/multilevel-table\n         *         Multiple table headers\n         *\n         * @type {Function|null}\n         */\n        columnHeaderFormatter: null,\n        /**\n         * Which date format to use for exported dates on a datetime X axis.\n         * See `Highcharts.dateFormat`.\n         */\n        dateFormat: '%Y-%m-%d %H:%M:%S',\n        /**\n         * Which decimal point to use for exported CSV. Defaults to the same\n         * as the browser locale, typically `.` (English) or `,` (German,\n         * French etc).\n         *\n         * @type  {string|null}\n         * @since 6.0.4\n         */\n        decimalPoint: null,\n        /**\n         * The item delimiter in the exported data. Use `;` for direct\n         * exporting to Excel. Defaults to a best guess based on the browser\n         * locale. If the locale _decimal point_ is `,`, the `itemDelimiter`\n         * defaults to `;`, otherwise the `itemDelimiter` defaults to `,`.\n         *\n         * @type {string|null}\n         */\n        itemDelimiter: null,\n        /**\n         * The line delimiter in the exported data, defaults to a newline.\n         */\n        lineDelimiter: '\\n'\n    },\n    /**\n     * Show a HTML table below the chart with the chart's current data.\n     *\n     * @sample highcharts/export-data/showtable/\n     *         Show the table\n     * @sample highcharts/studies/exporting-table-html\n     *         Experiment with putting the table inside the subtitle to\n     *         allow exporting it.\n     *\n     * @since    6.0.0\n     * @requires modules/export-data\n     */\n    showTable: false,\n    /**\n     * Use multi level headers in data table. If [csv.columnHeaderFormatter\n     * ](#exporting.csv.columnHeaderFormatter) is defined, it has to return\n     * objects in order for multi level headers to work.\n     *\n     * @sample highcharts/export-data/multilevel-table\n     *         Multiple table headers\n     *\n     * @since    6.0.4\n     * @requires modules/export-data\n     */\n    useMultiLevelHeaders: true,\n    /**\n     * If using multi level table headers, use rowspans for headers that\n     * have only one level.\n     *\n     * @sample highcharts/export-data/multilevel-table\n     *         Multiple table headers\n     *\n     * @since    6.0.4\n     * @requires modules/export-data\n     */\n    useRowspanHeaders: true,\n    /**\n     * Display a message when export is in progress.\n     * Uses [Chart.setLoading()](/class-reference/Highcharts.Chart#setLoading)\n     *\n     * The message can be altered by changing [](#lang.exporting.exportInProgress)\n     *\n     * @since 11.3.0\n     * @requires modules/export-data\n     */\n    showExportInProgress: true\n};\n/**\n * @optionparent lang\n * @private\n */\nconst lang = {\n    /**\n     * The text for the menu item.\n     *\n     * @since    6.0.0\n     * @requires modules/export-data\n     */\n    downloadCSV: 'Download CSV',\n    /**\n     * The text for the menu item.\n     *\n     * @since    6.0.0\n     * @requires modules/export-data\n     */\n    downloadXLS: 'Download XLS',\n    /**\n     * The text for exported table.\n     *\n     * @since 8.1.0\n     * @requires modules/export-data\n     */\n    exportData: {\n        /**\n         * The annotation column title.\n         */\n        annotationHeader: 'Annotations',\n        /**\n         * The category column title.\n         */\n        categoryHeader: 'Category',\n        /**\n         * The category column title when axis type set to \"datetime\".\n         */\n        categoryDatetimeHeader: 'DateTime'\n    },\n    /**\n     * The text for the menu item.\n     *\n     * @since    6.0.0\n     * @requires modules/export-data\n     */\n    viewData: 'View data table',\n    /**\n     * The text for the menu item.\n     *\n     * @since 8.2.0\n     * @requires modules/export-data\n     */\n    hideData: 'Hide data table',\n    /**\n     * Text to show when export is in progress.\n     *\n     * @since 11.3.0\n     * @requires modules/export-data\n     */\n    exportInProgress: 'Exporting...'\n};\n/* *\n *\n *  Default Export\n *\n * */\nconst ExportDataDefaults = {\n    exporting,\n    lang\n};\nexport default ExportDataDefaults;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * Callback that fires while exporting data. This allows the modification of\n * data rows before processed into the final format.\n *\n * @type      {Highcharts.ExportDataCallbackFunction}\n * @context   Highcharts.Chart\n * @requires  modules/export-data\n * @apioption chart.events.exportData\n */\n/**\n * When set to `false` will prevent the series data from being included in\n * any form of data export.\n *\n * Since version 6.0.0 until 7.1.0 the option was existing undocumented\n * as `includeInCSVExport`.\n *\n * @type      {boolean}\n * @since     7.1.0\n * @requires  modules/export-data\n * @apioption plotOptions.series.includeInDataExport\n */\n(''); // Keep doclets above in JS file\n","/* *\n *\n *  Experimental data export module for Highcharts\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n// @todo\n// - Set up systematic tests for all series types, paired with tests of the data\n//   module importing the same data.\n'use strict';\nimport AST from '../../Core/Renderer/HTML/AST.js';\nimport D from '../../Core/Defaults.js';\nconst { getOptions, setOptions } = D;\nimport DownloadURL from '../DownloadURL.js';\nconst { downloadURL } = DownloadURL;\nimport ExportDataDefaults from './ExportDataDefaults.js';\nimport H from '../../Core/Globals.js';\nconst { doc, win } = H;\nimport U from '../../Core/Utilities.js';\nconst { addEvent, defined, extend, find, fireEvent, isNumber, pick } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Wrapper function for the download functions, which handles showing and hiding\n * the loading message\n *\n * @private\n *\n */\nfunction wrapLoading(fn) {\n    const showMessage = Boolean(this.options.exporting?.showExportInProgress);\n    // Prefer requestAnimationFrame if available\n    const timeoutFn = win.requestAnimationFrame || setTimeout;\n    // Outer timeout avoids menu freezing on click\n    timeoutFn(() => {\n        showMessage && this.showLoading(this.options.lang.exportInProgress);\n        timeoutFn(() => {\n            try {\n                fn.call(this);\n            }\n            finally {\n                showMessage && this.hideLoading();\n            }\n        });\n    });\n}\n/**\n * Generates a data URL of CSV for local download in the browser. This is the\n * default action for a click on the 'Download CSV' button.\n *\n * See {@link Highcharts.Chart#getCSV} to get the CSV data itself.\n *\n * @function Highcharts.Chart#downloadCSV\n *\n * @requires modules/exporting\n */\nfunction chartDownloadCSV() {\n    wrapLoading.call(this, () => {\n        const csv = this.getCSV(true);\n        downloadURL(getBlobFromContent(csv, 'text/csv') ||\n            'data:text/csv,\\uFEFF' + encodeURIComponent(csv), this.getFilename() + '.csv');\n    });\n}\n/**\n * Generates a data URL of an XLS document for local download in the browser.\n * This is the default action for a click on the 'Download XLS' button.\n *\n * See {@link Highcharts.Chart#getTable} to get the table data itself.\n *\n * @function Highcharts.Chart#downloadXLS\n *\n * @requires modules/exporting\n */\nfunction chartDownloadXLS() {\n    wrapLoading.call(this, () => {\n        const uri = 'data:application/vnd.ms-excel;base64,', template = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" ' +\n            'xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ' +\n            'xmlns=\"http://www.w3.org/TR/REC-html40\">' +\n            '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook>' +\n            '<x:ExcelWorksheets><x:ExcelWorksheet>' +\n            '<x:Name>Ark1</x:Name>' +\n            '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions>' +\n            '</x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook>' +\n            '</xml><![endif]-->' +\n            '<style>td{border:none;font-family: Calibri, sans-serif;} ' +\n            '.number{mso-number-format:\"0.00\";} ' +\n            '.text{ mso-number-format:\"\\@\";}</style>' +\n            '<meta name=ProgId content=Excel.Sheet>' +\n            '<meta charset=UTF-8>' +\n            '</head><body>' +\n            this.getTable(true) +\n            '</body></html>', base64 = function (s) {\n            return win.btoa(unescape(encodeURIComponent(s))); // #50\n        };\n        downloadURL(getBlobFromContent(template, 'application/vnd.ms-excel') ||\n            uri + base64(template), this.getFilename() + '.xls');\n    });\n}\n/**\n * Export-data module required. Returns the current chart data as a CSV string.\n *\n * @function Highcharts.Chart#getCSV\n *\n * @param {boolean} [useLocalDecimalPoint]\n *        Whether to use the local decimal point as detected from the browser.\n *        This makes it easier to export data to Excel in the same locale as the\n *        user is.\n *\n * @return {string}\n *         CSV representation of the data\n */\nfunction chartGetCSV(useLocalDecimalPoint) {\n    let csv = '';\n    const rows = this.getDataRows(), csvOptions = this.options.exporting.csv, decimalPoint = pick(csvOptions.decimalPoint, csvOptions.itemDelimiter !== ',' && useLocalDecimalPoint ?\n        (1.1).toLocaleString()[1] :\n        '.'), \n    // Use ';' for direct to Excel\n    itemDelimiter = pick(csvOptions.itemDelimiter, decimalPoint === ',' ? ';' : ','), \n    // '\\n' isn't working with the js csv data extraction\n    lineDelimiter = csvOptions.lineDelimiter;\n    // Transform the rows to CSV\n    rows.forEach((row, i) => {\n        let val = '', j = row.length;\n        while (j--) {\n            val = row[j];\n            if (typeof val === 'string') {\n                val = `\"${val}\"`;\n            }\n            if (typeof val === 'number') {\n                if (decimalPoint !== '.') {\n                    val = val.toString().replace('.', decimalPoint);\n                }\n            }\n            row[j] = val;\n        }\n        // The first row is the header - it defines the number of columns.\n        // Empty columns between not-empty cells are covered in the getDataRows\n        // method.\n        // Now add empty values only to the end of the row so all rows have\n        // the same number of columns, #17186\n        row.length = rows.length ? rows[0].length : 0;\n        // Add the values\n        csv += row.join(itemDelimiter);\n        // Add the line delimiter\n        if (i < rows.length - 1) {\n            csv += lineDelimiter;\n        }\n    });\n    return csv;\n}\n/**\n * Export-data module required. Returns a two-dimensional array containing the\n * current chart data.\n *\n * @function Highcharts.Chart#getDataRows\n *\n * @param {boolean} [multiLevelHeaders]\n *        Use multilevel headers for the rows by default. Adds an extra row with\n *        top level headers. If a custom columnHeaderFormatter is defined, this\n *        can override the behavior.\n *\n * @return {Array<Array<(number|string)>>}\n *         The current chart data\n *\n * @emits Highcharts.Chart#event:exportData\n */\nfunction chartGetDataRows(multiLevelHeaders) {\n    const hasParallelCoords = this.hasParallelCoordinates, time = this.time, csvOptions = ((this.options.exporting && this.options.exporting.csv) || {}), xAxes = this.xAxis, rows = {}, rowArr = [], topLevelColumnTitles = [], columnTitles = [], langOptions = this.options.lang, exportDataOptions = langOptions.exportData, categoryHeader = exportDataOptions.categoryHeader, categoryDatetimeHeader = exportDataOptions.categoryDatetimeHeader, \n    // Options\n    columnHeaderFormatter = function (item, key, keyLength) {\n        if (csvOptions.columnHeaderFormatter) {\n            const s = csvOptions.columnHeaderFormatter(item, key, keyLength);\n            if (s !== false) {\n                return s;\n            }\n        }\n        if (!item) {\n            return categoryHeader;\n        }\n        if (!item.bindAxes) {\n            return (item.options.title &&\n                item.options.title.text) || (item.dateTime ?\n                categoryDatetimeHeader :\n                categoryHeader);\n        }\n        if (multiLevelHeaders) {\n            return {\n                columnTitle: keyLength > 1 ?\n                    key :\n                    item.name,\n                topLevelColumnTitle: item.name\n            };\n        }\n        return item.name + (keyLength > 1 ? ' (' + key + ')' : '');\n    }, \n    // Map the categories for value axes\n    getCategoryAndDateTimeMap = function (series, pointArrayMap, pIdx) {\n        const categoryMap = {}, dateTimeValueAxisMap = {};\n        pointArrayMap.forEach(function (prop) {\n            const axisName = ((series.keyToAxis && series.keyToAxis[prop]) ||\n                prop) + 'Axis', \n            // Points in parallel coordinates refers to all yAxis\n            // not only `series.yAxis`\n            axis = isNumber(pIdx) ?\n                series.chart[axisName][pIdx] :\n                series[axisName];\n            categoryMap[prop] = (axis && axis.categories) || [];\n            dateTimeValueAxisMap[prop] = (axis && axis.dateTime);\n        });\n        return {\n            categoryMap: categoryMap,\n            dateTimeValueAxisMap: dateTimeValueAxisMap\n        };\n    }, \n    // Create point array depends if xAxis is category\n    // or point.name is defined #13293\n    getPointArray = function (series, xAxis) {\n        const pointArrayMap = series.pointArrayMap || ['y'], namedPoints = series.data.some((d) => (typeof d.y !== 'undefined') && d.name);\n        // If there are points with a name, we also want the x value in the\n        // table\n        if (namedPoints &&\n            xAxis &&\n            !xAxis.categories &&\n            series.exportKey !== 'name') {\n            return ['x', ...pointArrayMap];\n        }\n        return pointArrayMap;\n    }, xAxisIndices = [];\n    let xAxis, dataRows, columnTitleObj, i = 0, // Loop the series and index values\n    x, xTitle;\n    this.series.forEach(function (series) {\n        const keys = series.options.keys, xAxis = series.xAxis, pointArrayMap = keys || getPointArray(series, xAxis), valueCount = pointArrayMap.length, xTaken = !series.requireSorting && {}, xAxisIndex = xAxes.indexOf(xAxis);\n        let categoryAndDatetimeMap = getCategoryAndDateTimeMap(series, pointArrayMap), mockSeries, j;\n        if (series.options.includeInDataExport !== false &&\n            !series.options.isInternal &&\n            series.visible !== false // #55\n        ) {\n            // Build a lookup for X axis index and the position of the first\n            // series that belongs to that X axis. Includes -1 for non-axis\n            // series types like pies.\n            if (!find(xAxisIndices, function (index) {\n                return index[0] === xAxisIndex;\n            })) {\n                xAxisIndices.push([xAxisIndex, i]);\n            }\n            // Compute the column headers and top level headers, usually the\n            // same as series names\n            j = 0;\n            while (j < valueCount) {\n                columnTitleObj = columnHeaderFormatter(series, pointArrayMap[j], pointArrayMap.length);\n                columnTitles.push(columnTitleObj.columnTitle || columnTitleObj);\n                if (multiLevelHeaders) {\n                    topLevelColumnTitles.push(columnTitleObj.topLevelColumnTitle ||\n                        columnTitleObj);\n                }\n                j++;\n            }\n            mockSeries = {\n                chart: series.chart,\n                autoIncrement: series.autoIncrement,\n                options: series.options,\n                pointArrayMap: series.pointArrayMap,\n                index: series.index\n            };\n            // Export directly from options.data because we need the uncropped\n            // data (#7913), and we need to support Boost (#7026).\n            series.options.data.forEach(function eachData(options, pIdx) {\n                const mockPoint = { series: mockSeries };\n                let key, prop, val;\n                // In parallel coordinates chart, each data point is connected\n                // to a separate yAxis, conform this\n                if (hasParallelCoords) {\n                    categoryAndDatetimeMap = getCategoryAndDateTimeMap(series, pointArrayMap, pIdx);\n                }\n                series.pointClass.prototype.applyOptions.apply(mockPoint, [options]);\n                const name = series.data[pIdx] && series.data[pIdx].name;\n                key = (mockPoint.x ?? '') + ',' + name;\n                j = 0;\n                // Pies, funnels, geo maps etc. use point name in X row\n                if (!xAxis ||\n                    series.exportKey === 'name' ||\n                    (!hasParallelCoords && xAxis && xAxis.hasNames) && name) {\n                    key = name;\n                }\n                if (xTaken) {\n                    if (xTaken[key]) {\n                        key += '|' + pIdx;\n                    }\n                    xTaken[key] = true;\n                }\n                if (!rows[key]) {\n                    rows[key] = [];\n                    rows[key].xValues = [];\n                    // ES5 replacement for Array.from / fill.\n                    const arr = [];\n                    for (let i = 0; i < series.chart.series.length; i++) {\n                        arr[i] = 0;\n                    }\n                    // Create pointers array, holding information how many\n                    // duplicates of specific x occurs in each series.\n                    // Used for creating rows with duplicates.\n                    rows[key].pointers = arr;\n                    rows[key].pointers[series.index] = 1;\n                }\n                else {\n                    // Handle duplicates (points with the same x), by creating\n                    // extra rows based on pointers for better performance.\n                    const modifiedKey = `${key},${rows[key].pointers[series.index]}`, originalKey = key;\n                    if (rows[key].pointers[series.index]) {\n                        if (!rows[modifiedKey]) {\n                            rows[modifiedKey] = [];\n                            rows[modifiedKey].xValues = [];\n                            rows[modifiedKey].pointers = [];\n                        }\n                        key = modifiedKey;\n                    }\n                    rows[originalKey].pointers[series.index] += 1;\n                }\n                rows[key].x = mockPoint.x;\n                rows[key].name = name;\n                rows[key].xValues[xAxisIndex] = mockPoint.x;\n                while (j < valueCount) {\n                    prop = pointArrayMap[j]; // `y`, `z` etc\n                    val = mockPoint[prop];\n                    rows[key][i + j] = pick(\n                    // Y axis category if present\n                    categoryAndDatetimeMap.categoryMap[prop][val], \n                    // Datetime yAxis\n                    categoryAndDatetimeMap.dateTimeValueAxisMap[prop] ?\n                        time.dateFormat(csvOptions.dateFormat, val) :\n                        null, \n                    // Linear/log yAxis\n                    val);\n                    j++;\n                }\n            });\n            i = i + j;\n        }\n    });\n    // Make a sortable array\n    for (x in rows) {\n        if (Object.hasOwnProperty.call(rows, x)) {\n            rowArr.push(rows[x]);\n        }\n    }\n    let xAxisIndex, column;\n    // Add computed column headers and top level headers to final row set\n    dataRows = multiLevelHeaders ? [topLevelColumnTitles, columnTitles] :\n        [columnTitles];\n    i = xAxisIndices.length;\n    while (i--) { // Start from end to splice in\n        xAxisIndex = xAxisIndices[i][0];\n        column = xAxisIndices[i][1];\n        xAxis = xAxes[xAxisIndex];\n        // Sort it by X values\n        rowArr.sort(function (// eslint-disable-line no-loop-func\n        a, b) {\n            return a.xValues[xAxisIndex] - b.xValues[xAxisIndex];\n        });\n        // Add header row\n        xTitle = columnHeaderFormatter(xAxis);\n        dataRows[0].splice(column, 0, xTitle);\n        if (multiLevelHeaders && dataRows[1]) {\n            // If using multi level headers, we just added top level header.\n            // Also add for sub level\n            dataRows[1].splice(column, 0, xTitle);\n        }\n        // Add the category column\n        rowArr.forEach(function (// eslint-disable-line no-loop-func\n        row) {\n            let category = row.name;\n            if (xAxis && !defined(category)) {\n                if (xAxis.dateTime) {\n                    if (row.x instanceof Date) {\n                        row.x = row.x.getTime();\n                    }\n                    category = time.dateFormat(csvOptions.dateFormat, row.x);\n                }\n                else if (xAxis.categories) {\n                    category = pick(xAxis.names[row.x], xAxis.categories[row.x], row.x);\n                }\n                else {\n                    category = row.x;\n                }\n            }\n            // Add the X/date/category\n            row.splice(column, 0, category);\n        });\n    }\n    dataRows = dataRows.concat(rowArr);\n    fireEvent(this, 'exportData', { dataRows: dataRows });\n    return dataRows;\n}\n/**\n * Export-data module required. Build a HTML table with the chart's current\n * data.\n *\n * @sample highcharts/export-data/viewdata/\n *         View the data from the export menu\n *\n * @function Highcharts.Chart#getTable\n *\n * @param {boolean} [useLocalDecimalPoint]\n *        Whether to use the local decimal point as detected from the browser.\n *        This makes it easier to export data to Excel in the same locale as the\n *        user is.\n *\n * @return {string}\n *         HTML representation of the data.\n *\n * @emits Highcharts.Chart#event:afterGetTable\n */\nfunction chartGetTable(useLocalDecimalPoint) {\n    const serialize = (node) => {\n        if (!node.tagName || node.tagName === '#text') {\n            // Text node\n            return node.textContent || '';\n        }\n        const attributes = node.attributes;\n        let html = `<${node.tagName}`;\n        if (attributes) {\n            Object.keys(attributes)\n                .forEach((key) => {\n                const value = attributes[key];\n                html += ` ${key}=\"${value}\"`;\n            });\n        }\n        html += '>';\n        html += node.textContent || '';\n        (node.children || []).forEach((child) => {\n            html += serialize(child);\n        });\n        html += `</${node.tagName}>`;\n        return html;\n    };\n    const tree = this.getTableAST(useLocalDecimalPoint);\n    return serialize(tree);\n}\n/**\n * Get the AST of a HTML table representing the chart data.\n *\n * @private\n *\n * @function Highcharts.Chart#getTableAST\n *\n * @param {boolean} [useLocalDecimalPoint]\n *        Whether to use the local decimal point as detected from the browser.\n *        This makes it easier to export data to Excel in the same locale as the\n *        user is.\n *\n * @return {Highcharts.ASTNode}\n *         The abstract syntax tree\n */\nfunction chartGetTableAST(useLocalDecimalPoint) {\n    let rowLength = 0;\n    const treeChildren = [];\n    const options = this.options, decimalPoint = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.', useMultiLevelHeaders = pick(options.exporting.useMultiLevelHeaders, true), rows = this.getDataRows(useMultiLevelHeaders), topHeaders = useMultiLevelHeaders ? rows.shift() : null, subHeaders = rows.shift(), \n    // Compare two rows for equality\n    isRowEqual = function (row1, row2) {\n        let i = row1.length;\n        if (row2.length === i) {\n            while (i--) {\n                if (row1[i] !== row2[i]) {\n                    return false;\n                }\n            }\n        }\n        else {\n            return false;\n        }\n        return true;\n    }, \n    // Get table cell HTML from value\n    getCellHTMLFromValue = function (tagName, classes, attributes, value) {\n        let textContent = pick(value, ''), className = 'highcharts-text' + (classes ? ' ' + classes : '');\n        // Convert to string if number\n        if (typeof textContent === 'number') {\n            textContent = textContent.toString();\n            if (decimalPoint === ',') {\n                textContent = textContent.replace('.', decimalPoint);\n            }\n            className = 'highcharts-number';\n        }\n        else if (!value) {\n            className = 'highcharts-empty';\n        }\n        attributes = extend({ 'class': className }, attributes);\n        return {\n            tagName,\n            attributes,\n            textContent\n        };\n    }, \n    // Get table header markup from row data\n    getTableHeaderHTML = function (topheaders, subheaders, rowLength) {\n        const theadChildren = [];\n        let i = 0, len = rowLength || subheaders && subheaders.length, next, cur, curColspan = 0, rowspan;\n        // Clean up multiple table headers. Chart.getDataRows() returns two\n        // levels of headers when using multilevel, not merged. We need to\n        // merge identical headers, remove redundant headers, and keep it\n        // all marked up nicely.\n        if (useMultiLevelHeaders &&\n            topheaders &&\n            subheaders &&\n            !isRowEqual(topheaders, subheaders)) {\n            const trChildren = [];\n            for (; i < len; ++i) {\n                cur = topheaders[i];\n                next = topheaders[i + 1];\n                if (cur === next) {\n                    ++curColspan;\n                }\n                else if (curColspan) {\n                    // Ended colspan\n                    // Add cur to HTML with colspan.\n                    trChildren.push(getCellHTMLFromValue('th', 'highcharts-table-topheading', {\n                        scope: 'col',\n                        colspan: curColspan + 1\n                    }, cur));\n                    curColspan = 0;\n                }\n                else {\n                    // Cur is standalone. If it is same as sublevel,\n                    // remove sublevel and add just toplevel.\n                    if (cur === subheaders[i]) {\n                        if (options.exporting.useRowspanHeaders) {\n                            rowspan = 2;\n                            delete subheaders[i];\n                        }\n                        else {\n                            rowspan = 1;\n                            subheaders[i] = '';\n                        }\n                    }\n                    else {\n                        rowspan = 1;\n                    }\n                    const cell = getCellHTMLFromValue('th', 'highcharts-table-topheading', { scope: 'col' }, cur);\n                    if (rowspan > 1 && cell.attributes) {\n                        cell.attributes.valign = 'top';\n                        cell.attributes.rowspan = rowspan;\n                    }\n                    trChildren.push(cell);\n                }\n            }\n            theadChildren.push({\n                tagName: 'tr',\n                children: trChildren\n            });\n        }\n        // Add the subheaders (the only headers if not using multilevels)\n        if (subheaders) {\n            const trChildren = [];\n            for (i = 0, len = subheaders.length; i < len; ++i) {\n                if (typeof subheaders[i] !== 'undefined') {\n                    trChildren.push(getCellHTMLFromValue('th', null, { scope: 'col' }, subheaders[i]));\n                }\n            }\n            theadChildren.push({\n                tagName: 'tr',\n                children: trChildren\n            });\n        }\n        return {\n            tagName: 'thead',\n            children: theadChildren\n        };\n    };\n    // Add table caption\n    if (options.exporting.tableCaption !== false) {\n        treeChildren.push({\n            tagName: 'caption',\n            attributes: {\n                'class': 'highcharts-table-caption'\n            },\n            textContent: pick(options.exporting.tableCaption, (options.title.text ?\n                options.title.text :\n                'Chart'))\n        });\n    }\n    // Find longest row\n    for (let i = 0, len = rows.length; i < len; ++i) {\n        if (rows[i].length > rowLength) {\n            rowLength = rows[i].length;\n        }\n    }\n    // Add header\n    treeChildren.push(getTableHeaderHTML(topHeaders, subHeaders, Math.max(rowLength, subHeaders.length)));\n    // Transform the rows to HTML\n    const trs = [];\n    rows.forEach(function (row) {\n        const trChildren = [];\n        for (let j = 0; j < rowLength; j++) {\n            // Make first column a header too. Especially important for\n            // category axes, but also might make sense for datetime? Should\n            // await user feedback on this.\n            trChildren.push(getCellHTMLFromValue(j ? 'td' : 'th', null, j ? {} : { scope: 'row' }, row[j]));\n        }\n        trs.push({\n            tagName: 'tr',\n            children: trChildren\n        });\n    });\n    treeChildren.push({\n        tagName: 'tbody',\n        children: trs\n    });\n    const e = {\n        tree: {\n            tagName: 'table',\n            id: `highcharts-data-table-${this.index}`,\n            children: treeChildren\n        }\n    };\n    fireEvent(this, 'aftergetTableAST', e);\n    return e.tree;\n}\n/**\n * Export-data module required. Hide the data table when visible.\n *\n * @function Highcharts.Chart#hideData\n */\nfunction chartHideData() {\n    this.toggleDataTable(false);\n}\n/**\n * @private\n */\nfunction chartToggleDataTable(show) {\n    show = pick(show, !this.isDataTableVisible);\n    // Create the div\n    const createContainer = show && !this.dataTableDiv;\n    if (createContainer) {\n        this.dataTableDiv = doc.createElement('div');\n        this.dataTableDiv.className = 'highcharts-data-table';\n        // Insert after the chart container\n        this.renderTo.parentNode.insertBefore(this.dataTableDiv, this.renderTo.nextSibling);\n    }\n    // Toggle the visibility\n    if (this.dataTableDiv) {\n        const style = this.dataTableDiv.style, oldDisplay = style.display;\n        style.display = show ? 'block' : 'none';\n        // Generate the data table\n        if (show) {\n            this.dataTableDiv.innerHTML = AST.emptyHTML;\n            const ast = new AST([this.getTableAST()]);\n            ast.addToDOM(this.dataTableDiv);\n            fireEvent(this, 'afterViewData', {\n                element: this.dataTableDiv,\n                wasHidden: createContainer || oldDisplay !== style.display\n            });\n        }\n        else {\n            fireEvent(this, 'afterHideData');\n        }\n    }\n    // Set the flag\n    this.isDataTableVisible = show;\n    // Change the menu item text\n    const exportDivElements = this.exportDivElements, options = this.options.exporting, menuItems = options &&\n        options.buttons &&\n        options.buttons.contextButton.menuItems, lang = this.options.lang;\n    if (options &&\n        options.menuItemDefinitions &&\n        lang &&\n        lang.viewData &&\n        lang.hideData &&\n        menuItems &&\n        exportDivElements) {\n        const exportDivElement = exportDivElements[menuItems.indexOf('viewData')];\n        if (exportDivElement) {\n            AST.setElementHTML(exportDivElement, this.isDataTableVisible ? lang.hideData : lang.viewData);\n        }\n    }\n}\n/**\n * Export-data module required. View the data in a table below the chart.\n *\n * @function Highcharts.Chart#viewData\n *\n * @emits Highcharts.Chart#event:afterViewData\n */\nfunction chartViewData() {\n    this.toggleDataTable(true);\n}\n/**\n * @private\n */\nfunction compose(ChartClass, SeriesClass) {\n    const chartProto = ChartClass.prototype;\n    if (!chartProto.getCSV) {\n        const exportingOptions = getOptions().exporting;\n        // Add an event listener to handle the showTable option\n        addEvent(ChartClass, 'afterViewData', onChartAfterViewData);\n        addEvent(ChartClass, 'render', onChartRenderer);\n        addEvent(ChartClass, 'destroy', onChartDestroy);\n        chartProto.downloadCSV = chartDownloadCSV;\n        chartProto.downloadXLS = chartDownloadXLS;\n        chartProto.getCSV = chartGetCSV;\n        chartProto.getDataRows = chartGetDataRows;\n        chartProto.getTable = chartGetTable;\n        chartProto.getTableAST = chartGetTableAST;\n        chartProto.hideData = chartHideData;\n        chartProto.toggleDataTable = chartToggleDataTable;\n        chartProto.viewData = chartViewData;\n        // Add \"Download CSV\" to the exporting menu.\n        // @todo consider move to defaults\n        if (exportingOptions) {\n            extend(exportingOptions.menuItemDefinitions, {\n                downloadCSV: {\n                    textKey: 'downloadCSV',\n                    onclick: function () {\n                        this.downloadCSV();\n                    }\n                },\n                downloadXLS: {\n                    textKey: 'downloadXLS',\n                    onclick: function () {\n                        this.downloadXLS();\n                    }\n                },\n                viewData: {\n                    textKey: 'viewData',\n                    onclick: function () {\n                        wrapLoading.call(this, this.toggleDataTable);\n                    }\n                }\n            });\n            if (exportingOptions.buttons &&\n                exportingOptions.buttons.contextButton.menuItems) {\n                exportingOptions.buttons.contextButton.menuItems.push('separator', 'downloadCSV', 'downloadXLS', 'viewData');\n            }\n        }\n        setOptions(ExportDataDefaults);\n        const { arearange: AreaRangeSeries, gantt: GanttSeries, map: MapSeries, mapbubble: MapBubbleSeries, treemap: TreemapSeries, xrange: XRangeSeries } = SeriesClass.types;\n        if (AreaRangeSeries) {\n            AreaRangeSeries.prototype.keyToAxis = {\n                low: 'y',\n                high: 'y'\n            };\n        }\n        if (GanttSeries) {\n            GanttSeries.prototype.exportKey = 'name';\n            GanttSeries.prototype.keyToAxis = {\n                start: 'x',\n                end: 'x'\n            };\n        }\n        if (MapSeries) {\n            MapSeries.prototype.exportKey = 'name';\n        }\n        if (MapBubbleSeries) {\n            MapBubbleSeries.prototype.exportKey = 'name';\n        }\n        if (TreemapSeries) {\n            TreemapSeries.prototype.exportKey = 'name';\n        }\n        if (XRangeSeries) {\n            XRangeSeries.prototype.keyToAxis = {\n                x2: 'x'\n            };\n        }\n    }\n}\n/**\n * Get a blob object from content, if blob is supported\n *\n * @private\n * @param {string} content\n *        The content to create the blob from.\n * @param {string} type\n *        The type of the content.\n * @return {string|undefined}\n *         The blob object, or undefined if not supported.\n */\nfunction getBlobFromContent(content, type) {\n    const nav = win.navigator, domurl = win.URL || win.webkitURL || win;\n    try {\n        // MS specific\n        if ((nav.msSaveOrOpenBlob) && win.MSBlobBuilder) {\n            const blob = new win.MSBlobBuilder();\n            blob.append(content);\n            return blob.getBlob('image/svg+xml');\n        }\n        return domurl.createObjectURL(new win.Blob(['\\uFEFF' + content], // #7084\n        { type: type }));\n    }\n    catch (e) {\n        // Ignore\n    }\n}\n/**\n * @private\n */\nfunction onChartAfterViewData() {\n    const chart = this, dataTableDiv = chart.dataTableDiv, getCellValue = (tr, index) => tr.children[index].textContent, comparer = (index, ascending) => (a, b) => {\n        const sort = (v1, v2) => (v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ?\n            v1 - v2 :\n            v1.toString().localeCompare(v2));\n        return sort(getCellValue(ascending ? a : b, index), getCellValue(ascending ? b : a, index));\n    };\n    if (dataTableDiv &&\n        chart.options.exporting &&\n        chart.options.exporting.allowTableSorting) {\n        const row = dataTableDiv.querySelector('thead tr');\n        if (row) {\n            row.childNodes.forEach((th) => {\n                const table = th.closest('table');\n                th.addEventListener('click', function () {\n                    const rows = [...dataTableDiv.querySelectorAll('tr:not(thead tr)')], headers = [...th.parentNode.children];\n                    rows.sort(comparer(headers.indexOf(th), chart.ascendingOrderInTable =\n                        !chart.ascendingOrderInTable)).forEach((tr) => {\n                        table.appendChild(tr);\n                    });\n                    headers.forEach((th) => {\n                        [\n                            'highcharts-sort-ascending',\n                            'highcharts-sort-descending'\n                        ].forEach((className) => {\n                            if (th.classList.contains(className)) {\n                                th.classList.remove(className);\n                            }\n                        });\n                    });\n                    th.classList.add(chart.ascendingOrderInTable ?\n                        'highcharts-sort-ascending' :\n                        'highcharts-sort-descending');\n                });\n            });\n        }\n    }\n}\n/**\n * Handle the showTable option\n * @private\n */\nfunction onChartRenderer() {\n    if (this.options &&\n        this.options.exporting &&\n        this.options.exporting.showTable &&\n        !this.options.chart.forExport) {\n        this.viewData();\n    }\n}\n/**\n * Clean up\n * @private\n */\nfunction onChartDestroy() {\n    this.dataTableDiv?.remove();\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst ExportData = {\n    compose\n};\nexport default ExportData;\n/* *\n *\n *  API Declarations\n *\n * */\n/**\n * Function callback to execute while data rows are processed for exporting.\n * This allows the modification of data rows before processed into the final\n * format.\n *\n * @callback Highcharts.ExportDataCallbackFunction\n * @extends Highcharts.EventCallbackFunction<Highcharts.Chart>\n *\n * @param {Highcharts.Chart} this\n * Chart context where the event occurred.\n *\n * @param {Highcharts.ExportDataEventObject} event\n * Event object with data rows that can be modified.\n */\n/**\n * Contains information about the export data event.\n *\n * @interface Highcharts.ExportDataEventObject\n */ /**\n* Contains the data rows for the current export task and can be modified.\n* @name Highcharts.ExportDataEventObject#dataRows\n* @type {Array<Array<string>>}\n*/\n(''); // Keeps doclets above in JS file\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/modules/export-data\n * @requires highcharts\n * @requires highcharts/modules/exporting\n *\n * Exporting module\n *\n * (c) 2010-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport DownloadURL from '../../Extensions/DownloadURL.js';\nimport ExportData from '../../Extensions/ExportData/ExportData.js';\nconst G = Highcharts;\n// Compatibility\nG.dataURLtoBlob = G.dataURLtoBlob || DownloadURL.dataURLtoBlob;\nG.downloadURL = G.downloadURL || DownloadURL.downloadURL;\n// Compose\nExportData.compose(G.Chart, G.Series);\nexport default Highcharts;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport Color from '../../Color/Color.js';\nconst { parse: color } = Color;\nimport U from '../../Utilities.js';\nconst { merge } = U;\n/* *\n *\n *  Namespace\n *\n * */\nvar ColorAxisLike;\n(function (ColorAxisLike) {\n    /* *\n     *\n     *  Declarations\n     *\n     * */\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    /**\n     * Initialize defined data classes.\n     * @private\n     */\n    function initDataClasses(userOptions) {\n        const axis = this, chart = axis.chart, legendItem = axis.legendItem = axis.legendItem || {}, options = axis.options, userDataClasses = userOptions.dataClasses || [];\n        let dataClass, dataClasses, colorCount = chart.options.chart.colorCount, colorCounter = 0, colors;\n        axis.dataClasses = dataClasses = [];\n        legendItem.labels = [];\n        for (let i = 0, iEnd = userDataClasses.length; i < iEnd; ++i) {\n            dataClass = userDataClasses[i];\n            dataClass = merge(dataClass);\n            dataClasses.push(dataClass);\n            if (!chart.styledMode && dataClass.color) {\n                continue;\n            }\n            if (options.dataClassColor === 'category') {\n                if (!chart.styledMode) {\n                    colors = chart.options.colors || [];\n                    colorCount = colors.length;\n                    dataClass.color = colors[colorCounter];\n                }\n                dataClass.colorIndex = colorCounter;\n                // Loop back to zero\n                colorCounter++;\n                if (colorCounter === colorCount) {\n                    colorCounter = 0;\n                }\n            }\n            else {\n                dataClass.color = color(options.minColor).tweenTo(color(options.maxColor), iEnd < 2 ? 0.5 : i / (iEnd - 1) // #3219\n                );\n            }\n        }\n    }\n    ColorAxisLike.initDataClasses = initDataClasses;\n    /**\n     * Create initial color stops.\n     * @private\n     */\n    function initStops() {\n        const axis = this, options = axis.options, stops = axis.stops = options.stops || [\n            [0, options.minColor || ''],\n            [1, options.maxColor || '']\n        ];\n        for (let i = 0, iEnd = stops.length; i < iEnd; ++i) {\n            stops[i].color = color(stops[i][1]);\n        }\n    }\n    ColorAxisLike.initStops = initStops;\n    /**\n     * Normalize logarithmic values.\n     * @private\n     */\n    function normalizedValue(value) {\n        const axis = this, max = axis.max || 0, min = axis.min || 0;\n        if (axis.logarithmic) {\n            value = axis.logarithmic.log2lin(value);\n        }\n        return 1 - ((max - value) /\n            ((max - min) || 1));\n    }\n    ColorAxisLike.normalizedValue = normalizedValue;\n    /**\n     * Translate from a value to a color.\n     * @private\n     */\n    function toColor(value, point) {\n        const axis = this;\n        const dataClasses = axis.dataClasses;\n        const stops = axis.stops;\n        let pos, from, to, color, dataClass, i;\n        if (dataClasses) {\n            i = dataClasses.length;\n            while (i--) {\n                dataClass = dataClasses[i];\n                from = dataClass.from;\n                to = dataClass.to;\n                if ((typeof from === 'undefined' || value >= from) &&\n                    (typeof to === 'undefined' || value <= to)) {\n                    color = dataClass.color;\n                    if (point) {\n                        point.dataClass = i;\n                        point.colorIndex = dataClass.colorIndex;\n                    }\n                    break;\n                }\n            }\n        }\n        else {\n            pos = axis.normalizedValue(value);\n            i = stops.length;\n            while (i--) {\n                if (pos > stops[i][0]) {\n                    break;\n                }\n            }\n            from = stops[i] || stops[i + 1];\n            to = stops[i + 1] || from;\n            // The position within the gradient\n            pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);\n            color = from.color.tweenTo(to.color, pos);\n        }\n        return color;\n    }\n    ColorAxisLike.toColor = toColor;\n})(ColorAxisLike || (ColorAxisLike = {}));\n/* *\n *\n *  Default Export\n *\n * */\nexport default ColorAxisLike;\n","/* *\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport ColorAxisLike from './Color/ColorAxisLike.js';\nimport U from '../Utilities.js';\nconst { extend } = U;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nfunction init(axis) {\n    extend(axis, ColorAxisLike);\n}\n/* *\n *\n *  Default export\n *\n * */\nconst SolidGaugeAxis = {\n    init\n};\nexport default SolidGaugeAxis;\n","/* *\n *\n *  Solid angular gauge module\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport BorderRadius from '../../Extensions/BorderRadius.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nconst { gauge: GaugeSeries, pie: PieSeries } = SeriesRegistry.seriesTypes;\nimport SolidGaugeAxis from '../../Core/Axis/SolidGaugeAxis.js';\nimport SolidGaugeSeriesDefaults from './SolidGaugeSeriesDefaults.js';\nimport U from '../../Core/Utilities.js';\nconst { clamp, extend, isNumber, merge, pick, pInt } = U;\n/* *\n *\n *  Class\n *\n * */\n/**\n * SolidGauge series type.\n *\n * @private\n * @class\n * @name Highcharts.seriesTypes.solidgauge\n *\n * @augments Highcarts.Series\n */\nclass SolidGaugeSeries extends GaugeSeries {\n    /* *\n     *\n     *  Functions\n     *\n     * */\n    // Extend the translate function to extend the Y axis with the necessary\n    // decoration (#5895).\n    translate() {\n        const axis = this.yAxis;\n        SolidGaugeAxis.init(axis);\n        // Prepare data classes\n        if (!axis.dataClasses && axis.options.dataClasses) {\n            axis.initDataClasses(axis.options);\n        }\n        axis.initStops();\n        // Generate points and inherit data label position\n        GaugeSeries.prototype.translate.call(this);\n    }\n    // Draw the points where each point is one needle.\n    drawPoints() {\n        const series = this, yAxis = series.yAxis, center = yAxis.center, options = series.options, renderer = series.chart.renderer, overshoot = options.overshoot, rounded = options.rounded && options.borderRadius === void 0, overshootVal = isNumber(overshoot) ?\n            overshoot / 180 * Math.PI :\n            0;\n        let thresholdAngleRad;\n        // Handle the threshold option\n        if (isNumber(options.threshold)) {\n            thresholdAngleRad = yAxis.startAngleRad + yAxis.translate(options.threshold, void 0, void 0, void 0, true);\n        }\n        this.thresholdAngleRad = pick(thresholdAngleRad, yAxis.startAngleRad);\n        for (const point of series.points) {\n            // #10630 null point should not be draw\n            if (!point.isNull) { // Condition like in pie chart\n                const radius = ((pInt(pick(point.options.radius, options.radius, 100 // %\n                )) * center[2]) / 200), innerRadius = ((pInt(pick(point.options.innerRadius, options.innerRadius, 60 // %\n                )) * center[2]) / 200), axisMinAngle = Math.min(yAxis.startAngleRad, yAxis.endAngleRad), axisMaxAngle = Math.max(yAxis.startAngleRad, yAxis.endAngleRad);\n                let graphic = point.graphic, rotation = (yAxis.startAngleRad +\n                    yAxis.translate(point.y, void 0, void 0, void 0, true)), shapeArgs, d, toColor = yAxis.toColor(point.y, point);\n                if (toColor === 'none') { // #3708\n                    toColor = point.color || series.color || 'none';\n                }\n                if (toColor !== 'none') {\n                    point.color = toColor;\n                }\n                // Handle overshoot and clipping to axis max/min\n                rotation = clamp(rotation, axisMinAngle - overshootVal, axisMaxAngle + overshootVal);\n                // Handle the wrap option\n                if (options.wrap === false) {\n                    rotation = clamp(rotation, axisMinAngle, axisMaxAngle);\n                }\n                const angleOfRounding = rounded ?\n                    ((radius - innerRadius) / 2) / radius :\n                    0, start = Math.min(rotation, series.thresholdAngleRad) -\n                    angleOfRounding;\n                let end = Math.max(rotation, series.thresholdAngleRad) +\n                    angleOfRounding;\n                if (end - start > 2 * Math.PI) {\n                    end = start + 2 * Math.PI;\n                }\n                let borderRadius = rounded ? '50%' : 0;\n                if (options.borderRadius) {\n                    borderRadius = BorderRadius.optionsToObject(options.borderRadius).radius;\n                }\n                point.shapeArgs = shapeArgs = {\n                    x: center[0],\n                    y: center[1],\n                    r: radius,\n                    innerR: innerRadius,\n                    start,\n                    end,\n                    borderRadius\n                };\n                point.startR = radius; // For PieSeries.animate\n                if (graphic) {\n                    d = shapeArgs.d;\n                    graphic.animate(extend({ fill: toColor }, shapeArgs));\n                    if (d) {\n                        shapeArgs.d = d; // Animate alters it\n                    }\n                }\n                else {\n                    point.graphic = graphic = renderer.arc(shapeArgs)\n                        .attr({\n                        fill: toColor,\n                        'sweep-flag': 0\n                    })\n                        .add(series.group);\n                }\n                if (!series.chart.styledMode) {\n                    if (options.linecap !== 'square') {\n                        graphic.attr({\n                            'stroke-linecap': 'round',\n                            'stroke-linejoin': 'round'\n                        });\n                    }\n                    graphic.attr({\n                        stroke: options.borderColor || 'none',\n                        'stroke-width': options.borderWidth || 0\n                    });\n                }\n                if (graphic) {\n                    graphic.addClass(point.getClassName(), true);\n                }\n            }\n        }\n    }\n    // Extend the pie slice animation by animating from start angle and up.\n    animate(init) {\n        if (!init) {\n            this.startAngleRad = this.thresholdAngleRad;\n            PieSeries.prototype.animate.call(this, init);\n        }\n    }\n}\n/* *\n *\n *  Static Properties\n *\n * */\nSolidGaugeSeries.defaultOptions = merge(GaugeSeries.defaultOptions, SolidGaugeSeriesDefaults);\nSeriesRegistry.registerSeriesType('solidgauge', SolidGaugeSeries);\n/* *\n *\n *  Default Export\n *\n * */\nexport default SolidGaugeSeries;\n","/* *\n *\n *  Solid angular gauge module\n *\n *  (c) 2010-2024 Torstein Honsi\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\n/* *\n *\n *  API Options\n *\n * */\n/**\n * A solid gauge is a circular gauge where the value is indicated by a filled\n * arc, and the color of the arc may variate with the value.\n *\n * @sample highcharts/demo/gauge-solid/\n *         Solid gauges\n *\n * @extends      plotOptions.gauge\n * @excluding    dial, pivot, wrap\n * @product      highcharts\n * @requires     modules/solid-gauge\n * @optionparent plotOptions.solidgauge\n */\nconst SolidGaugeSeriesDefaults = {\n    /**\n     * The inner radius for points in a solid gauge. Can be given only in\n     * percentage, either as a number or a string like `\"50%\"`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/solidgauge-radius/\n     *         Individual radius and innerRadius\n     *\n     * @type      {string}\n     * @default   \"60%\"\n     * @since     4.1.6\n     * @product   highcharts\n     * @apioption plotOptions.solidgauge.innerRadius\n     */\n    /**\n     * Whether the strokes of the solid gauge should be `round` or `square`.\n     *\n     * @sample {highcharts} highcharts/demo/gauge-multiple-kpi/\n     *         Rounded gauge\n     *\n     * @type       {string}\n     * @default    round\n     * @since      4.2.2\n     * @product    highcharts\n     * @validvalue [\"square\", \"round\"]\n     * @apioption  plotOptions.solidgauge.linecap\n     */\n    /**\n     * Allow the gauge to overshoot the end of the perimeter axis by this\n     * many degrees. Say if the gauge axis goes from 0 to 60, a value of\n     * 100, or 1000, will show 5 degrees beyond the end of the axis when this\n     * option is set to 5.\n     *\n     * @type      {number}\n     * @default   0\n     * @since     3.0.10\n     * @product   highcharts\n     * @apioption plotOptions.solidgauge.overshoot\n     */\n    /**\n     * The outer radius for points in a solid gauge. Can be given only in\n     * percentage, either as a number or a string like `\"100%\"`.\n     *\n     * @sample {highcharts} highcharts/plotoptions/solidgauge-radius/\n     *         Individual radius and innerRadius\n     *\n     * @type      {string}\n     * @default   \"100%\"\n     * @since     4.1.6\n     * @product   highcharts\n     * @apioption plotOptions.solidgauge.radius\n     */\n    /**\n     * Whether to draw rounded edges on the gauge. This options adds the radius\n     * of the rounding to the ends of the arc, so it extends past the actual\n     * values. When `borderRadius` is set, it takes precedence over `rounded`. A\n     * `borderRadius` of 50% behaves like `rounded`, except the shape is not\n     * extended past its value.\n     *\n     * @sample {highcharts} highcharts/demo/gauge-multiple-kpi/\n     *         Gauge showing multiple KPIs\n     *\n     * @type      {boolean}\n     * @default   false\n     * @since     5.0.8\n     * @product   highcharts\n     * @apioption plotOptions.solidgauge.rounded\n     */\n    /**\n     * The threshold or base level for the gauge.\n     *\n     * @sample {highcharts} highcharts/plotoptions/solidgauge-threshold/\n     *         Zero threshold with negative and positive values\n     *\n     * @type      {number|null}\n     * @since     5.0.3\n     * @product   highcharts\n     * @apioption plotOptions.solidgauge.threshold\n     */\n    /**\n     * Whether to give each point an individual color.\n     */\n    colorByPoint: true,\n    dataLabels: {\n        y: 0\n    }\n};\n/**\n * A `solidgauge` series. If the [type](#series.solidgauge.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n *\n * @extends   series,plotOptions.solidgauge\n * @excluding animationLimit, boostThreshold, connectEnds, connectNulls,\n *            cropThreshold, dashStyle, dataParser, dataURL, dial,\n *            findNearestPointBy, getExtremesFromAll, marker, negativeColor,\n *            pointPlacement, pivot, shadow, softThreshold, stack, stacking,\n *            states, step, threshold, turboThreshold, wrap, zoneAxis, zones,\n *            dataSorting, boostBlending\n * @product   highcharts\n * @requires  modules/solid-gauge\n * @apioption series.solidgauge\n */\n/**\n * An array of data points for the series. For the `solidgauge` series\n * type, points can be given in the following ways:\n *\n * 1. An array of numerical values. In this case, the numerical values will be\n *    interpreted as `y` options. Example:\n *    ```js\n *    data: [0, 5, 3, 5]\n *    ```\n *\n * 2. An array of objects with named values. The following snippet shows only a\n *    few settings, see the complete options set below. If the total number of\n *    data points exceeds the series'\n *    [turboThreshold](#series.solidgauge.turboThreshold), this option is not\n *    available.\n *    ```js\n *    data: [{\n *        y: 5,\n *        name: \"Point2\",\n *        color: \"#00FF00\"\n *    }, {\n *        y: 7,\n *        name: \"Point1\",\n *        color: \"#FF00FF\"\n *    }]\n *    ```\n *\n * The typical gauge only contains a single data value.\n *\n * @sample {highcharts} highcharts/chart/reflow-true/\n *         Numerical values\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n *         Config objects\n *\n * @type      {Array<number|null|*>}\n * @extends   series.gauge.data\n * @product   highcharts\n * @apioption series.solidgauge.data\n */\n/**\n * The inner radius of an individual point in a solid gauge. Can be given only\n * in percentage, either as a number or a string like `\"50%\"`.\n *\n * @sample {highcharts} highcharts/plotoptions/solidgauge-radius/\n *         Individual radius and innerRadius\n *\n * @type      {string}\n * @since     4.1.6\n * @product   highcharts\n * @apioption series.solidgauge.data.innerRadius\n */\n/**\n * The outer radius of an individual point in a solid gauge. Can be\n * given only in percentage, either as a number or a string like `\"100%\"`.\n *\n * @sample {highcharts} highcharts/plotoptions/solidgauge-radius/\n *         Individual radius and innerRadius\n *\n * @type      {string}\n * @since     4.1.6\n * @product   highcharts\n * @apioption series.solidgauge.data.radius\n */\n''; // Keeps doclets above separate\n/* *\n *\n *  Default Export\n *\n * */\nexport default SolidGaugeSeriesDefaults;\n","export const addEventToFormatter = function (config) {\n  let lastMessage;\n  const currentFormatter = config.tooltip.formatter;\n  const newFormatter = function(tooltip) {\n    const theMessage = (currentFormatter.bind(this))(tooltip);\n    this.series.chart.container.dispatchEvent(new CustomEvent(\"tooltip-changed\", {bubbles: true, composed: true, detail: {message: theMessage, lastMessage}}))\n    lastMessage = theMessage;\n    return theMessage;\n  }\n  config.tooltip.formatter = newFormatter;\n  return config;\n}","/* *\n *\n *  (c) 2009-2024 Highsoft, Black Label\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../../Core/Utilities.js';\nconst { defined, isNumber, pick } = U;\n/* *\n *\n *  Constants\n *\n * */\n/**\n * Define types for editable fields per annotation. There is no need to define\n * numbers, because they won't change their type to string.\n * @private\n */\nconst annotationsFieldsTypes = {\n    backgroundColor: 'string',\n    borderColor: 'string',\n    borderRadius: 'string',\n    color: 'string',\n    fill: 'string',\n    fontSize: 'string',\n    labels: 'string',\n    name: 'string',\n    stroke: 'string',\n    title: 'string'\n};\n/* *\n *\n *  Functions\n *\n * */\n/**\n * Returns the first xAxis or yAxis that was clicked with its value.\n *\n * @private\n *\n * @param {Array<Highcharts.PointerAxisCoordinateObject>} coords\n *        All the chart's x or y axes with a current pointer's axis value.\n *\n * @return {Highcharts.PointerAxisCoordinateObject}\n *         Object with a first found axis and its value that pointer\n *         is currently pointing.\n */\nfunction getAssignedAxis(coords) {\n    return coords.filter((coord) => {\n        const extremes = coord.axis.getExtremes(), axisMin = extremes.min, axisMax = extremes.max, \n        // Correct axis edges when axis has series\n        // with pointRange (like column)\n        minPointOffset = pick(coord.axis.minPointOffset, 0);\n        return isNumber(axisMin) && isNumber(axisMax) &&\n            coord.value >= (axisMin - minPointOffset) &&\n            coord.value <= (axisMax + minPointOffset) &&\n            // Don't count navigator axis\n            !coord.axis.options.isInternal;\n    })[0]; // If the axes overlap, return the first axis that was found.\n}\n/**\n * Get field type according to value\n *\n * @private\n *\n * @param {'boolean'|'number'|'string'} value\n * Atomic type (one of: string, number, boolean)\n *\n * @return {'checkbox'|'number'|'text'}\n * Field type (one of: text, number, checkbox)\n */\nfunction getFieldType(key, value) {\n    const predefinedType = annotationsFieldsTypes[key];\n    let fieldType = typeof value;\n    if (defined(predefinedType)) {\n        fieldType = predefinedType;\n    }\n    return {\n        'string': 'text',\n        'number': 'number',\n        'boolean': 'checkbox'\n    }[fieldType];\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst NavigationBindingUtilities = {\n    annotationsFieldsTypes,\n    getAssignedAxis,\n    getFieldType\n};\nexport default NavigationBindingUtilities;\n","/* *\n *\n *  (c) 2023 Torstein Honsi, Askel Eirik Johansson\n *\n *  License: www.highcharts.com/license\n *\n *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n *\n * */\n'use strict';\nimport U from '../../Core/Utilities.js';\nconst { addEvent, isObject, pick, defined, merge } = U;\nimport NBU from '../Annotations/NavigationBindingsUtilities.js';\nconst { getAssignedAxis } = NBU;\n/* *\n *\n *  Constants\n *\n * */\nconst composedClasses = [], defaultOptions = {\n    enabled: true,\n    sensitivity: 1.1\n};\nlet wheelTimer;\n/* *\n *\n *  Functions\n *\n * */\n/**\n * @private\n */\nconst optionsToObject = (options) => {\n    if (!isObject(options)) {\n        options = {\n            enabled: options ?? true\n        };\n    }\n    return merge(defaultOptions, options);\n};\n/**\n * @private\n */\nconst zoomBy = function (chart, howMuch, xAxis, yAxis, mouseX, mouseY, options) {\n    const type = pick(options.type, chart.zooming.type, '');\n    let axes = [];\n    if (type === 'x') {\n        axes = xAxis;\n    }\n    else if (type === 'y') {\n        axes = yAxis;\n    }\n    else if (type === 'xy') {\n        axes = chart.axes;\n    }\n    const hasZoomed = chart.transform({\n        axes,\n        // Create imaginary reference and target rectangles around the mouse\n        // point that scales up or down with `howMuch`;\n        to: {\n            x: mouseX - 5,\n            y: mouseY - 5,\n            // Must use 10 to get passed the limit for too small reference.\n            // Below this, the transform will default to a pan.\n            width: 10,\n            height: 10\n        },\n        from: {\n            x: mouseX - 5 * howMuch,\n            y: mouseY - 5 * howMuch,\n            width: 10 * howMuch,\n            height: 10 * howMuch\n        },\n        trigger: 'mousewheel'\n    });\n    if (hasZoomed) {\n        if (defined(wheelTimer)) {\n            clearTimeout(wheelTimer);\n        }\n        // Some time after the last mousewheel event, run drop. In case any of\n        // the affected axes had `startOnTick` or `endOnTick`, they will be\n        // re-adjusted now.\n        wheelTimer = setTimeout(() => {\n            chart.pointer?.drop();\n        }, 400);\n    }\n    return hasZoomed;\n};\n/**\n * @private\n */\nfunction onAfterGetContainer() {\n    const wheelZoomOptions = optionsToObject(this.zooming.mouseWheel);\n    if (wheelZoomOptions.enabled) {\n        addEvent(this.container, 'wheel', (e) => {\n            e = this.pointer?.normalize(e) || e;\n            const { pointer } = this, allowZoom = pointer && !pointer.inClass(e.target, 'highcharts-no-mousewheel');\n            // Firefox uses e.detail, WebKit and IE uses deltaX, deltaY, deltaZ.\n            if (this.isInsidePlot(e.chartX - this.plotLeft, e.chartY - this.plotTop) && allowZoom) {\n                const wheelSensitivity = wheelZoomOptions.sensitivity || 1.1, delta = e.detail || ((e.deltaY || 0) / 120), xAxisCoords = getAssignedAxis(pointer.getCoordinates(e).xAxis), yAxisCoords = getAssignedAxis(pointer.getCoordinates(e).yAxis);\n                const hasZoomed = zoomBy(this, Math.pow(wheelSensitivity, delta), xAxisCoords ? [xAxisCoords.axis] : this.xAxis, yAxisCoords ? [yAxisCoords.axis] : this.yAxis, e.chartX, e.chartY, wheelZoomOptions);\n                // Prevent page scroll\n                if (hasZoomed) {\n                    e.preventDefault?.();\n                }\n            }\n        });\n    }\n}\n/**\n * @private\n */\nfunction compose(ChartClass) {\n    if (composedClasses.indexOf(ChartClass) === -1) {\n        composedClasses.push(ChartClass);\n        addEvent(ChartClass, 'afterGetContainer', onAfterGetContainer);\n    }\n}\n/* *\n *\n *  Default Export\n *\n * */\nconst MouseWheelZoomComposition = {\n    compose\n};\nexport default MouseWheelZoomComposition;\n/* *\n *\n *  API Options\n *\n * */\n/**\n * The mouse wheel zoom is a feature included in Highcharts Stock, but is also\n * available for Highcharts Core as a module. Zooming with the mouse wheel is\n * enabled by default in Highcharts Stock. In Highcharts Core it is enabled if\n * [chart.zooming.type](chart.zooming.type) is set. It can be disabled by\n * setting this option to `false`.\n *\n * @type      {boolean|object}\n * @since 11.1.0\n * @requires  modules/mouse-wheel-zoom\n * @sample    {highcharts} highcharts/mouse-wheel-zoom/enabled\n *            Enable or disable\n * @sample    {highstock} stock/mouse-wheel-zoom/enabled\n *            Enable or disable\n * @apioption chart.zooming.mouseWheel\n */\n/**\n * Zooming with the mouse wheel can be disabled by setting this option to\n * `false`.\n *\n * @type      {boolean}\n * @default   true\n * @since 11.1.0\n * @requires  modules/mouse-wheel-zoom\n * @apioption chart.zooming.mouseWheel.enabled\n */\n/**\n * Adjust the sensitivity of the zoom. Sensitivity of mouse wheel or trackpad\n * scrolling. `1` is no sensitivity, while with `2`, one mouse wheel delta will\n * zoom in `50%`.\n *\n * @type      {number}\n * @default   1.1\n * @since 11.1.0\n * @requires  modules/mouse-wheel-zoom\n * @sample    {highcharts} highcharts/mouse-wheel-zoom/sensitivity\n *            Change mouse wheel zoom sensitivity\n * @sample    {highstock} stock/mouse-wheel-zoom/sensitivity\n *            Change mouse wheel zoom sensitivity\n * @apioption chart.zooming.mouseWheel.sensitivity\n */\n/**\n * Decides in what dimensions the user can zoom scrolling the wheel. Can be one\n * of `x`, `y` or `xy`. In Highcharts Core, if not specified here, it will\n * inherit the type from [chart.zooming.type](chart.zooming.type). In Highcharts\n * Stock, it defaults to `x`.\n *\n * Note that particularly with mouse wheel in the y direction, the zoom is\n * affected by the default [yAxis.startOnTick](#yAxis.startOnTick) and\n * [endOnTick]((#yAxis.endOnTick)) settings. In order to respect these settings,\n * the zoom level will adjust after the user has stopped zooming. To prevent\n * this, consider setting `startOnTick` and `endOnTick` to `false`.\n *\n * @type      {string}\n * @default   {highcharts} undefined\n * @default   {highstock} x\n * @validvalue [\"x\", \"y\", \"xy\"]\n * @since 11.1.0\n * @requires  modules/mouse-wheel-zoom\n * @apioption chart.zooming.mouseWheel.type\n */\n(''); // Keeps doclets above in JS file\n","/**\n * @license Highcharts JS v@product.version@ (@product.date@)\n * @module highcharts/modules/mouse-wheel-zoom\n * @requires highcharts\n *\n * Mousewheel zoom module\n *\n * (c) 2023 Askel Eirik Johansson\n *\n * License: www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport MouseWheelZoom from '../../Extensions/MouseWheelZoom/MouseWheelZoom.js';\nconst G = Highcharts;\nG.MouseWheelZoom = G.MouseWheelZoom || MouseWheelZoom;\nG.MouseWheelZoom.compose(G.Chart);\nexport default Highcharts;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '../../ld-loading-spinner/ld-loading-spinner-inline';\nimport {LdI18NextMixin} from '../i18n/ld-i18next';\nimport {LdChartStyles} from './styles';\nimport {html, LitElement, property} from 'lit-element';\n\nimport Highcharts from 'highcharts/es-modules/masters/highcharts.src';\nimport 'highcharts/es-modules/masters/highcharts-more.src';\nimport 'highcharts/es-modules/masters/modules/no-data-to-display.src';\nimport 'highcharts/es-modules/masters/modules/exporting.src';\nimport 'highcharts/es-modules/masters/modules/offline-exporting.src';\nimport 'highcharts/es-modules/masters/modules/export-data.src';\nimport 'highcharts/es-modules/masters/modules/solid-gauge.src';\nimport {addEventToFormatter} from './utils/TooltipMessageFormatterDecorator';\nimport {\n  AxisExtremes,\n  ChartSize\n} from '../../ld-platform/modules/assets/machine/single-view/sub-views/technology/technology-view-types';\nimport {ChartDataExporter} from '../../ld-platform/modules/assets/assets-charts/chartDataExporter';\nimport {IdsHighchartsOptions} from '../../../../typings/highcharts-extensions';\nimport {SelectDataObject} from 'highcharts/highcharts.src';\nimport 'highcharts/es-modules/masters/modules/mouse-wheel-zoom.src';\n\nconst {addEvent} = Highcharts;\n\ntype Axis = \"x\" | \"y\"\ntype UiElement = \"button\";\n\ninterface SelectionChangedEvent {\n  resetSelection?: boolean;\n  target: Highcharts.Chart;\n  xAxis?: Array<SelectDataObject>;\n}\n\nexport interface UiElementConfig<ContextType> {\n  type: UiElement;\n  chart?: Highcharts.Chart;\n  created?: boolean;\n  destroy: () => void;\n  id: string;\n  testid: string;\n  label: string;\n  style: {\n    left: number;\n    top: number;\n  };\n  onCreation: (ctx: ContextType, uiElement: Highcharts.SVGElement) => void;\n  onSelectionChange: (ctx: ContextType, event: CustomEventInit<SelectionChangedEvent>, uiElement: Highcharts.SVGElement) => void;\n  onClick: (ctx: ContextType, event: any, uiElement: Highcharts.SVGElement) => void;\n}\n\nclass LdChart extends LdI18NextMixin(LitElement) {\n\n  @property({type: Object})\n  chartConfig: IdsHighchartsOptions | Highcharts.Options | null;\n  @property({type: Object})\n  chartSize: ChartSize = {height: 0, width: 0};\n  @property({attribute: false})\n  data: unknown[] = [];\n  @property({type: Boolean})\n  extendData = false\n  @property({type: Object})\n  extremes: AxisExtremes = {animation: false, redraw: false, min: \"0\", max: \"0\"};\n  @property({type: String})\n  extremesAxis: Axis = \"x\"\n  @property({type: Number}) startMin: number = 0;\n  @property({type: Object})\n  exporter: ChartDataExporter | undefined;\n  @property({type: Boolean})\n  loading = false;\n  @property({type: String})\n  syncGroup: string | null = null;\n  @property({type: Boolean}) initializeOnStart: boolean = false;\n  @property({type: Boolean})\n  useUtc = false;\n  @property({type: Boolean})\n  lightConfig = false;\n  @property({type: Boolean})\n  yAxisOffset = false;\n  @property({type: Object})\n  _chart: Highcharts.Chart | undefined;\n  @property({type: Object})\n  _chartContainer: HTMLElement | undefined;\n  @property({type: Object})\n  _chartBaseConfig: IdsHighchartsOptions | Highcharts.Options;\n  @property({type: Object})\n  _chartBaseConfigLight: IdsHighchartsOptions | Highcharts.Options;\n  @property({type: Boolean}) dontSynctooltip = false;\n  customUI = new Map();\n  @property({type: String}) selectionChanged: string = 'selectionChanged';\n\n  renderCustomUi(event: unknown) {\n    if (!(<IdsHighchartsOptions>this.chartConfig)?.customUi) return;\n    if (!this.isConnected) return;\n\n    const chart = this.extractChartFromEvent(event);\n    if (!chart) return;\n\n    const PADDING_INLINE = 30;\n    const reservedAreaXFromRight = this.setupResetZoomButton(PADDING_INLINE);\n\n    this.renderCustomUIElements(chart, reservedAreaXFromRight, PADDING_INLINE);\n    this.dispatchEvent(new CustomEvent(\"render-done\", {bubbles: true, composed: true}));\n  }\n\n  private extractChartFromEvent(event: unknown): Highcharts.Chart | undefined {\n    if ((<any>event).target instanceof Highcharts.Chart) {\n      return (<any>event).target as Highcharts.Chart;\n    }\n    console.error('render event did not have chart on it', event);\n    return undefined;\n  }\n\n  private setupResetZoomButton(paddingInline: number): number {\n    let reservedAreaXFromRight = 0;\n    const highchartsResetZoomButton = this.shadowRoot?.querySelectorAll(\".highcharts-reset-zoom\");\n\n    highchartsResetZoomButton?.forEach((item) => {\n      item?.setAttribute(\"data-testid\", \"reset-zoom\");\n      if (item) {\n        reservedAreaXFromRight = item.getBoundingClientRect().width + paddingInline;\n        localStorage.setItem('reservedAreaXFromRight', String(reservedAreaXFromRight));\n      }\n    });\n\n    return reservedAreaXFromRight;\n  }\n\n  private renderCustomUIElements(\n    chart: Highcharts.Chart,\n    reservedAreaXFromRight: number,\n    paddingInline: number\n  ): void {\n    for (const elementDefinition of (<IdsHighchartsOptions>this.chartConfig)?.customUi ?? []) {\n      if (elementDefinition.type === 'button') {\n        this.renderButtonElement(chart, elementDefinition, reservedAreaXFromRight, paddingInline);\n      }\n    }\n  }\n\n  private renderButtonElement(\n    chart: Highcharts.Chart,\n    elementDefinition: UiElementConfig<any>,\n    reservedAreaXFromRight: number,\n    paddingInline: number\n  ): void {\n    let elementInstance = this.getOrCreateButtonInstance(chart, elementDefinition);\n    const uiElement = elementInstance.uiElement;\n\n    this.positionButtonElement(uiElement, elementDefinition, reservedAreaXFromRight, paddingInline, chart);\n  }\n\n  private getOrCreateButtonInstance(\n    chart: Highcharts.Chart,\n    elementDefinition: UiElementConfig<any>\n  ): any {\n    if (!this.customUI.has(elementDefinition.id)) {\n      return this.createNewButtonInstance(chart, elementDefinition);\n    }\n\n    const elementInstance = this.customUI.get(elementDefinition.id);\n    elementInstance.chart = chart;\n    return elementInstance;\n  }\n\n  private createNewButtonInstance( chart: Highcharts.Chart,elementDefinition: UiElementConfig<any>) {\n    const elementInstance: any = {...elementDefinition};\n    const uiElement = chart.renderer.button(elementDefinition.label, 0, 0, () => {});\n\n    const handler = (e: Event) => elementInstance.onSelectionChange(elementInstance, e, uiElement);\n    this.addEventListener(this.selectionChanged, handler);\n\n    elementInstance.destroy = () => {\n      this.removeEventListener(this.selectionChanged, handler);\n      this.customUI.delete(elementInstance.id);\n      elementInstance.created = false;\n    };\n\n    uiElement.attr({\n      \"data-testid\": elementInstance.testid,\n      id: elementInstance.id,\n    });\n\n    uiElement.on('click', (e: Event) => elementInstance.onClick(elementInstance, e, uiElement)).add();\n\n    elementInstance.chart = chart;\n    elementInstance.onCreation(elementInstance, uiElement);\n    elementInstance.created = true;\n    elementInstance.uiElement = uiElement;\n\n    this.customUI.set(elementInstance.id, elementInstance);\n\n    return elementInstance;\n  }\n\n  private positionButtonElement(\n    uiElement: Highcharts.SVGElement,\n    elementDefinition: UiElementConfig<any>,\n    reservedAreaXFromRight: number,\n    paddingInline: number,\n    chart: Highcharts.Chart\n  ): void {\n    const reservedAreaWidth = this.getStoredNumber('reservedAreaXFromRight', reservedAreaXFromRight);\n    const elementWidth = uiElement.getBBox().width;\n    const totalRightOffset = reservedAreaWidth + elementWidth + paddingInline + elementDefinition.style.left;\n\n    uiElement.attr({\n      x: chart.renderer.box.clientWidth - totalRightOffset,\n      y: elementDefinition.style.top,\n    });\n  }\n\n  getStoredNumber(key: string, fallback: number): number {\n    const stored = localStorage.getItem(key);\n    const parsed = stored ? Number.parseInt(stored) : Number.NaN;\n    return Number.isNaN(parsed) ? fallback : parsed;\n  }\n\n// --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n\n    this.chartConfig = null;\n    window.addEventListener('resize', e => {\n      Highcharts.charts.forEach(chart => {\n        if (typeof chart !== 'undefined') {\n          if (typeof chart.options.chart?.renderTo === \"object\") {\n            chart.setSize(Number(chart.options.chart?.renderTo?.clientWidth), Number(chart.options.chart.renderTo.clientHeight));\n          }\n        }\n      });\n    });\n\n    const that = this;\n    const baseConfig: Highcharts.Options = {\n      chart: {\n        style: {\n          color: '#666666',\n          fontFamily: '\\'Calibri\\', \\'Roboto\\', \\'Helvetica\\',sans-serif',\n        },\n        events: {\n          load() {\n            const chart = this;\n            addEvent(this.container, 'wheel', () => {\n              that.dispatchEvent(new CustomEvent(that.selectionChanged, {detail: chart}));\n              return undefined;\n            });\n          },\n          selection: (e) => {\n            this.dispatchEvent(new CustomEvent(this.selectionChanged, {detail: e}));\n            return undefined;\n          },\n          render: (e) => {\n            this.renderCustomUi(e);\n          },\n        },\n\n      },\n      legend: {\n        enabled: true,\n        itemStyle: {\n          fontWeight: 'bold',\n        },\n      },\n      xAxis: {\n        crosshair: true,\n        events: {\n          setExtremes(e) {\n            const thisChart = this.chart;\n            if (\n              e.trigger !== 'syncExtremes'\n              && (<IdsHighchartsOptions>thisChart.userOptions).syncGroup\n            ) {\n              Highcharts.charts?.filter(\n                chart => (\n                  chart !== thisChart\n                  && chart != null\n                  && (<IdsHighchartsOptions>chart.userOptions).syncGroup\n                  === (<IdsHighchartsOptions>thisChart.userOptions).syncGroup\n                )\n              )?.filter(syncedChart => syncedChart?.xAxis[0].setExtremes)?.forEach(item => {\n                if (item && !item.inverted) {\n                  item.xAxis[0].setExtremes(\n                    e.min,\n                    e.max,\n                    undefined,\n                    false,\n                    {trigger: 'syncExtremes'},\n                  );\n                } else if (item) {\n                  item.yAxis[0].setExtremes(\n                    e.min,\n                    e.max,\n                    undefined,\n                    false,\n                    {trigger: 'syncExtremes'},\n                  );\n                }\n              });\n            }\n          },\n          afterSetExtremes: function (e: Highcharts.AxisSetExtremesEventObject) {\n            const thisChart = this.chart;\n            that.handleResetZoom(thisChart, e);\n          },\n        },\n      },\n      exporting: {\n        fallbackToExportServer: false,\n        filename: `SWCP-chart`,\n        menuItemDefinitions: {\n          downloadJSON: {\n            onclick: () => {\n              this.exporter?.exportJSON(Number(this.extremes.min), Number(this.extremes.max));\n            },\n            text: 'Download JSON',\n          },\n          downloadCSV: {\n            onclick: () => {\n              this.exporter?.exportCSV(Number(this.extremes.min), Number(this.extremes.max));\n            },\n            text: 'Download CSV',\n          },\n          downloadEXCEL: {\n            onclick: () => {\n                this.exporter?.exportEXCEL(Number(this.extremes.min), Number(this.extremes.max));\n            },\n            text: 'Download EXCEL',\n          },\n        },\n        buttons: {\n          contextButton: {\n            menuItems: [\n              'downloadPNG',\n              'downloadJPEG',\n              'downloadCSV',\n              'downloadJSON',\n            ],\n            theme: {\n              fill: 'transparent',\n            },\n          },\n        },\n      },\n    };\n\n    this._chartBaseConfig = {\n      ...baseConfig,\n      colors: [\n        '#7E761A',\n        '#1E6FB5',\n        '#B55535',\n        '#A2816C',\n        '#CFB968',\n        '#7C933D',\n        '#D88736',\n        '#CE5169',\n        '#EEBA3D',\n      ],\n      chart: {\n        ...baseConfig.chart,\n        animation: false,\n        type: 'line',\n        marginTop: 50,\n        zooming: {\n          type: 'x',\n          resetButton: {\n            position: {\n              x: -30,\n              y: -35,\n            },\n          },\n        },\n        marginLeft: 75,\n        backgroundColor: '#FFF',\n        panning: {enabled: true, type: \"x\"},\n        panKey: 'shift',\n        height: 250,\n      },\n      boost: {\n        useGPUTranslations: true,\n        enabled: true,\n      },\n      title: {\n        text: undefined,\n      },\n      xAxis: {\n        ...baseConfig.xAxis,\n        type: 'datetime',\n        dateTimeLabelFormats: {\n          second: '%e. %b<br />%H:%M:%S',\n          minute: '%e. %b<br />%H:%M',\n          hour: '%e. %b<br />%H:%M',\n        },\n        title: {text: \"time\"},\n        gridLineWidth: 1,\n        gridLineColor: '#fff',\n        minRange: 1000,\n        startOnTick: false,\n        endOnTick: false,\n        minTickInterval: 1000,\n      },\n      yAxis: {\n        title: {\n          offset: 0,\n          x: -50,\n        },\n        min: 0,\n        minRange: 1,\n        startOnTick: true,\n        endOnTick: true,\n        labels: {\n          x: -5,\n        },\n      },\n      credits: {\n        enabled: false,\n      },\n      noData: {\n        position: {\n          align: 'center',\n          verticalAlign: 'middle',\n          y: -20,\n        },\n      },\n      tooltip: {\n        shape: 'rect',\n        outside: true,\n        shared: true,\n        positioner: function () {\n          return {\n            x: 10,\n            y: -40,\n          };\n        },\n        animation: false,\n        followPointer: false,\n        formatter: function (this, tooltip) {\n          if (tooltip.options.enabled) {\n            return `${this.point.x} : ${this.point.y}`;\n          }\n          return false;\n        },\n      },\n      plotOptions: {\n        series: {\n          animation: true,\n          marker: {\n            enabled: true,\n            radius: 3,\n          },\n          states: {\n            hover: {\n              enabled: true,\n            },\n          }\n        },\n      },\n      series: [],\n    };\n    this._chartBaseConfigLight = {\n      ...baseConfig,\n      chart: {\n        ...baseConfig.chart,\n      },\n    };\n\n    // according to https://github.com/highcharts/highcharts/issues/5543\n    // and https://www.highcharts.com/forum/viewtopic.php?p=142414#p142414\n    // eslint-disable-next-line func-names\n    (function (H) {\n      H.wrap(H.Series.prototype, 'hasData', function (this: Highcharts.Series, proceed) {\n        return this.visible && this.dataMax != null && this.dataMin != null\n      });\n    }(Highcharts));\n\n    // Plugin to export timestamp\n    (function (H) {\n      H.wrap(H.Chart.prototype, 'getDataRows', function (this: Highcharts.Chart, proceed, multiLevelHeaders) {\n        let rows: Array<any> = proceed.call(this, multiLevelHeaders);\n        rows = rows.map(row => {\n          if (row.x || row.x === 0) {\n            row[0] = row.x;\n          }\n          return row;\n        });\n        rows = rows.filter(row => row.x !== 0);\n        return rows;\n      });\n    }(Highcharts));\n\n    (function (H) {\n      H.wrap(H.Chart.prototype, 'getDataRows', function (this: Highcharts.Chart, proceed, multiLevelHeaders) {\n        let rows: Array<any> = proceed.call(this, multiLevelHeaders);\n        rows = rows.map(row => {\n          if (row.x) {\n            row[0] = Highcharts.dateFormat(that.LdTranslate('modules.charts.exporting.datetimeformat'), row.x);\n          }\n          return row;\n        });\n        return rows;\n      });\n    }(Highcharts));\n\n    Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (this: Highcharts.Axis, proceed) {\n      proceed.call(this);\n    });\n\n    this.addEventListener(\"chart-reset\", (e: CustomEventInit) => {\n      const chart = e.detail.chart as Highcharts.Chart | undefined;\n      if (!chart) return;\n\n      for (const element of this.customUI.values()) {\n        element.destroy();\n      }\n    })\n\n  }\n\n// --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdChartStyles];\n  }\n\n\n// --------------------------------------------------------------------------------------\n  firstUpdated() {\n    this._chartContainer = this.shadowRoot?.querySelector('#chart-container') ?? undefined;\n    this._setGlobalConfig();\n    this._enableChart();\n\n    if (!this.dontSynctooltip) {\n      this.addEventListeners();\n    }\n  }\n\n  addEventListeners(): void {\n    const containers = this.shadowRoot?.querySelectorAll(`#chart-container`);\n    if (containers) {\n      for (const container of Array.from(containers)) {\n        if (container instanceof HTMLElement) {\n          container.addEventListener('mousemove', this.syncTooltip);\n          container.addEventListener('mouseout', this.mouseOutDetected);\n\n        }\n      }\n\n    }\n  }\n\n  handleResetZoom(chart: any, event: any) {\n    const xAxis = chart.xAxis[0];\n    const yAxis = chart.yAxis[0];\n\n    this.initializeStartMinIfNeeded(xAxis);\n\n    const isZoomed = this.checkIfZoomed(xAxis, yAxis);\n\n    if (isZoomed && !chart.resetZoomButton && this.initializeOnStart) {\n      chart.showResetZoom();\n    }\n\n    this.handleResetZoomButton(chart, event);\n    this.checkAndHandleFullReset(chart, xAxis, yAxis, event);\n  }\n\n  private initializeStartMinIfNeeded(xAxis: any): void {\n    if (xAxis.eventArgs != null && !this.initializeOnStart) {\n      this.startMin = xAxis.eventArgs?.min;\n      this.initializeOnStart = true;\n    }\n  }\n\n  private checkIfZoomed(xAxis: any, yAxis: any): boolean {\n    const xZoomed =\n      (typeof xAxis.min === \"number\" && xAxis.min !== this.startMin) ||\n      (typeof xAxis.max === \"number\" && xAxis.max < xAxis.getExtremes().max);\n\n    const yZoomed =\n      (typeof yAxis.min === \"number\" && yAxis.min > yAxis.getExtremes().min) ||\n      (typeof yAxis.max === \"number\" && yAxis.max < yAxis.getExtremes().max);\n\n    return xZoomed || yZoomed;\n  }\n\n  private handleResetZoomButton(chart: any, event: any): void {\n    if (chart.resetZoomButton == null) {\n      setTimeout(() => {\n        this.dispatchEvent(new CustomEvent(this.selectionChanged, {\n          detail: {\n            resetSelection: true,\n            event\n          }\n        }));\n      }, 50);\n    }\n  }\n\n  private checkAndHandleFullReset(chart: any, xAxis: any, yAxis: any, event: any): void {\n    setTimeout(() => {\n      const xReset = xAxis.min <= this.startMin && xAxis.max >= xAxis.dataMax;\n      const yReset = yAxis.min <= yAxis.dataMin && yAxis.max >= yAxis.dataMax;\n\n      if (xReset && yReset) {\n        chart.resetZoomButton?.hide?.();\n        this.dispatchEvent(new CustomEvent(this.selectionChanged, {\n          detail: {\n            resetSelection: true,\n            event\n          }\n        }));\n        return undefined;\n      }\n    }, 50);\n  }\n\n  mouseOutDetected(): void {\n    for (const chart of Highcharts.charts.filter(Boolean)) {\n      if (!chart) continue;\n\n      if ((chart as any).renderTo?.getAttribute('dontsynctooltip') === 'false') {\n        chart.tooltip.hide();\n\n        for (const series of chart.series) {\n          for (const point of series.points) {\n            point.setState();\n          }\n        }\n      }\n    }\n  }\n\n  syncTooltip(e: MouseEvent): void {\n    for (const chart of Highcharts.charts.filter(Boolean)) {\n      if (!chart) continue;\n      if ((chart as any).renderTo?.getAttribute('dontsynctooltip') === 'false') {\n        const event = chart.pointer?.normalize(e);\n        if (!event) continue;\n\n        const points =  chart.series.reduce((acc, series) => {\n          const point = series.searchPoint(event, true);\n          if (point) {\n            acc.push(point);\n          }\n          return acc;\n        }, [] as Highcharts.Point[]);\n\n        for (const series of chart.series) {\n          for (const point of series.points) {\n            point.setState();\n          }\n        }\n\n        for (const point of points) {\n          point.setState('hover');\n        }\n\n        if (points.length > 0) {\n          chart.tooltip.refresh(points);\n        }\n      }\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  updated(changedProperties: Map<string, unknown>) {\n    if (changedProperties.has('data')) {\n      if (changedProperties.get('data') !== this.data && this.data != null) {\n        this._chartContainer = this.shadowRoot?.querySelector('#chart-container') ?? undefined;\n        this._setGlobalConfig();\n        this._enableChart();\n        this._updateChartSeriesData();\n        this.loading = false;\n      }\n    }\n    if (changedProperties.has('chartConfig') && Object.entries(this.chartConfig ?? {}).length !== 0) {\n      this._updateChartConfiguration();\n    }\n    if (changedProperties.has('chartSize') && this.chartSize?.width !== 0) {\n      const chartSize = changedProperties.get(\"chartSize\") as ChartSize;\n      if (chartSize && chartSize.width !== this.chartSize.width || chartSize && chartSize.height !== this.chartSize.height) {\n        this.chartSize.width = this.shadowRoot?.querySelector<HTMLElement>('.chart-wrapper')?.offsetWidth ?? 0;\n        this._resizeChart();\n      }\n    }\n\n    if (changedProperties.has('extremes') && Object.entries(this.extremes).length !== 0) {\n      this._adjustExtremes();\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  _updateChartSeriesData() {\n    if (this._chart && this.data != null) {\n      this._deleteAllSeries();\n      this._addSeries();\n      this._adjustExtremes();\n\n      if (this.extendData) {\n        this.handleDataExtension();\n      }\n\n      if (this.yAxisOffset) {\n        this._chart.yAxis[0].update({\n          offset: -this._chart.xAxis[0].toPixels(0),\n        });\n      }\n\n      this._chart.redraw();\n    }\n  }\n\n  private handleDataExtension(): void {\n    if (this.shouldExtendData(this.data)) {\n      this._addDataPointToRightExtreme();\n    }\n  }\n\n  private shouldExtendData(data: unknown): boolean {\n    if (typeof data === 'object' && data != null) {\n      if ('type' in data) {\n        return data.type !== 'column';\n      }\n      return true;\n    }\n\n    if (Array.isArray(data) && data != null) {\n      return data.some(item => {\n        if (typeof item === 'object' && item != null) {\n          return !('type' in item) || (item as Record<string, any>).type !== 'column';\n        }\n        return false;\n      });\n    }\n\n    return false;\n  }\n\n// --------------------------------------------------------------------------------------\n  _updateChartConfiguration() {\n    if (this._chart) {\n      const _baseConfig = this.lightConfig ? this._chartBaseConfigLight : this._chartBaseConfig;\n      const mergedConfig = Highcharts.merge(_baseConfig, this.chartConfig ?? {});\n      const configWithFormatterEvent = addEventToFormatter(mergedConfig);\n      this._chart.update(configWithFormatterEvent, true);\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  _deleteAllSeries() {\n    while ((this._chart?.series?.length ?? 0) > 0) {\n      this._chart?.series[0].remove(true);\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  _adjustExtremes() {\n    if (this._chart && this.extremes && Object.keys(this.extremes).length !== 0) {\n      if (this.extremesAxis === 'y') {\n        this.adjustYAxisExtremes();\n      } else {\n        this.adjustXAxisExtremes();\n      }\n    }\n  }\n\n  private adjustYAxisExtremes(): void {\n    if (!this._chart) return;\n\n    this._chart.yAxis[0].options.startOnTick = false;\n    this._chart.yAxis[0].options.endOnTick = false;\n    this._chart.yAxis[0].setExtremes(\n      Number(this.extremes.min),\n      Number(this.extremes.max),\n      this.extremes.redraw,\n      this.extremes.animation,\n    );\n\n    this._chart.yAxis[0].update({\n      min: Number(this.extremes.min),\n      max: Number(this.extremes.max),\n    });\n  }\n\n  private adjustXAxisExtremes(): void {\n    if (!this._chart) return;\n\n    this._chart.xAxis[0].options.startOnTick = false;\n    this._chart.xAxis[0].options.endOnTick = false;\n    this.initializeOnStart = false;\n    this._chart.xAxis[0].setExtremes(\n      Number(this.extremes.min),\n      Number(this.extremes.max),\n      this.extremes.redraw,\n      this.extremes.animation,\n    );\n\n    this._chart.xAxis[0].update({\n      min: Number(this.extremes.min),\n      max: Number(this.extremes.max),\n    });\n  }\n\n// --------------------------------------------------------------------------------------\n  _addDataPointToRightExtreme() {\n    this._chart?.series.forEach(series => {\n      if (series.data.length > 0) {\n        const ext = series.chart.xAxis[0].getExtremes();\n        const x = ext.max;\n        const {y} = series.data[series.data.length - 1];\n        series.addPoint({\n          x,\n          y,\n          marker: {enabled: false},\n          custom: {\n            noTooltip: true\n          }\n        });\n      }\n    });\n  }\n\n// --------------------------------------------------------------------------------------\n  _addSeries() {\n    if (Array.isArray(this.data)) {\n      for (let data of this.data) {\n        this._chart?.addSeries(data as Highcharts.SeriesOptionsType, true);\n      }\n    } else {\n      this._chart?.addSeries(this.data as Highcharts.SeriesOptionsType, true);\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  _setGlobalConfig() {\n    const options: IdsHighchartsOptions = {\n      time: {\n        useUTC: this.useUtc,\n      },\n      lang: {\n        noData: this.LdTranslate('modules.charts.globalSettings.lang.noData'),\n        loading: this.LdTranslate('modules.charts.globalSettings.lang.loading'),\n        resetZoom: this.LdTranslate('modules.charts.globalSettings.lang.resetZoom'),\n        months: this.LdGetArray('modules.charts.globalSettings.lang.months'),\n        shortMonths: this.LdGetArray('modules.charts.globalSettings.lang.shortMonths'),\n        weekdays: this.LdGetArray('modules.charts.globalSettings.lang.weekdays'),\n        shortWeekdays: this.LdGetArray('modules.charts.globalSettings.lang.shortWeekdays'),\n      },\n      chart: {\n        backgroundColor: '#fff',\n        panning: {enabled: true},\n        panKey: 'shift',\n      },\n      boost: {\n        useGPUTranslations: false,\n        enabled: true,\n        allowForce: false,\n      },\n      exporting: {\n        fallbackToExportServer: false,\n        buttons: {\n          contextButton: {\n            menuItems: [\n              'downloadPNG',\n              'downloadJPEG',\n            ],\n            theme: {\n              fill: 'transparent',\n            },\n          },\n        },\n      },\n    };\n    Highcharts.setOptions(options);\n\n    // eslint-disable-next-line func-names\n    Highcharts.SVGRenderer.prototype.symbols.warning = function (\n      x: number,\n      y: number,\n      w: number,\n      h: number,\n    ) {\n      y -= 5;\n      return [\n        'M',\n        x + w / 2,\n        y,\n        'L',\n        x + w,\n        y + h,\n        'L',\n        x,\n        y + h,\n        'z',\n        'M',\n        x + w / 2,\n        y + h / 4,\n        'L',\n        x + w / 2,\n        y + h / 1.5,\n        'z',\n        'M',\n        x + w / 2,\n        y + h / 1.3,\n        'L',\n        x + w / 2,\n        y + h / 1.1,\n        'z',\n      ];\n    };\n    (<IdsHighchartsOptions>this._chartBaseConfig).syncGroup = this.syncGroup ?? \"none\";\n    (<IdsHighchartsOptions>this._chartBaseConfigLight).syncGroup = this.syncGroup ?? \"none\";\n\n  }\n\n\n// --------------------------------------------------------------------------------------\n  _enableChart() {\n    const _baseConfig = this.lightConfig ? this._chartBaseConfigLight : this._chartBaseConfig;\n    if (this.dontSynctooltip) {\n      if (_baseConfig.tooltip) {\n        _baseConfig.tooltip.shared = false;\n      }\n    }\n    Highcharts.charts.forEach((chart, index) => {\n      if (chart && chart.container === this._chartContainer) {\n        chart.destroy();\n        Highcharts.charts.splice(index, 1);\n      }\n    });\n\n    const mergedConfig = Highcharts.merge(_baseConfig, this.chartConfig ?? {});\n    const configWithFormatterEvent = addEventToFormatter(mergedConfig);\n    if (!this._chartContainer) return console.error(new Error(\"No chart container\"));\n\n    this._chart = Highcharts.chart(this._chartContainer, configWithFormatterEvent, (chart) => {\n      this.dispatchEvent(new CustomEvent(\"chart-reset\", {detail: {chart}}))\n    });\n  }\n\n// --------------------------------------------------------------------------------------\n  _resizeChart() {\n    if (this._chart && typeof this.chartSize !== 'undefined' && this.chartSize !== null) {\n      this._chart.setSize(Number(this.chartSize.width), Number(this.chartSize.height), false);\n    }\n  }\n\n// --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <div class='chart-wrapper'>\n        <div id='chart-container' dontSynctooltip='${this.dontSynctooltip}'></div>\n      </div>\n      <ld-loading-spinner-inline ?loading='${this.loading}'></ld-loading-spinner-inline>\n    `;\n  }\n}\n\ncustomElements.define('ld-chart', LdChart);\n","import LdI18Next from '../i18n/ld-i18next';\n\nexport const LdMessages: any = {\n    '400': {\n        'error': true,\n        'http_status_code': 400,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_400.message'),\n    },\n    '401': {\n        'error': true,\n        'http_status_code': 401,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_401.message'),\n    },\n    '403': {\n        'error': true,\n        'http_status_code': 403,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_403.message'),\n    },\n    '404': {\n        'error': true,\n        'http_status_code': 404,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_404.message'),\n    },\n    '405': {\n        'error': true,\n        'http_status_code': 405,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_405.message'),\n    },\n    '406': {\n        'error': true,\n        'http_status_code': 406,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_406.message'),\n    },\n    '409': {\n        'error': true,\n        'http_status_code': 409,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_409.message'),\n    },\n    '415': {\n        'error': true,\n        'http_status_code': 415,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_0.message'),\n    },\n    '418': {\n        'error': true,\n        'http_status_code': 418,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_418.message'),\n    },\n    '422': {\n        'error': true,\n        'http_status_code': 422,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_422.message'),\n    },\n    '500': {\n        'error': true,\n        'http_status_code': 500,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_500.message'),\n    },\n  '504': {\n    'error': true,\n    'http_status_code': 504,\n    'internal_status_code': null,\n    'toast_duration': 0,\n    'highlight_input': false,\n    'disable_input': false,\n    'message': LdI18Next.t('modules.errors.statusCodes.e_10500.message'),\n  },\n    'asset_create_error': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10900,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_900.message'),\n    },\n    'cancel_current_new_asset_action': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10901,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_901.message'),\n    },\n    'cancel_service_request': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10902,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_902.message'),\n    },\n    'asset_409': {\n        'error': true,\n        'http_status_code': 409,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_409_asset.message'),\n    },\n  'variables_409': {\n    'error': true,\n    'http_status_code': 409,\n    'internal_status_code': null,\n    'toast_duration': 0,\n    'highlight_input': false,\n    'disable_input': false,\n    'message': LdI18Next.t('modules.errors.statusCodes.e_409_variables.message'),\n  },\n    'service_request_error': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10903,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_903.message'),\n    },\n    'asset_insert_success': {\n      'error': false,\n        'http_status_code': null,\n        'internal_status_code': 10904,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_904.message'),\n    },\n    'cancel_current_edit_asset_action': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10905,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_905.message'),\n    },\n    'insert_error': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10910,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_910.message'),\n    },\n    'cancel_current_user_action': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10911,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_911.message'),\n    },\n    'asset_update_error': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10912,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_912.message'),\n    },\n    'cancel_current_action': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10920,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_920.message'),\n    },\n    'unspecified': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10921,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_921.message'),\n    },\n    'wrong_credentials': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10922,\n        'toast_duration': 0,\n        'highlight_input': true,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_922.message'),\n    },\n    'no_credentials': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10923,\n        'toast_duration': 0,\n        'highlight_input': true,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_923.message'),\n    },\n    'session_timeout': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10924,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_924.message'),\n    },\n    'policy_not_accepted': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10925,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_925.message'),\n    },\n    'locked': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10926,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_926.message'),\n    },\n    'password_change_successful': {\n        'error': false,\n        'http_status_code': 201,\n        'internal_status_code': 10927,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_927.message'),\n    },\n    'cancel_upload_file': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10928,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_928.message'),\n    },\n    'upload_file_error': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10929,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_929.message'),\n    },\n    'no_connection': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10500,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_10500.message'),\n    },\n    '502': {\n      'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10500,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_10500.message'),\n    },\n    'not_supported_browser': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10501,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_10501.message'),\n    },\n    'add_line_to_dashboard': {\n        'error': false,\n        'http_status_code': null,\n        'internal_status_code': 10502,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.success.message.add_line_to_dashboard'),\n    },\n    'duplication_deleted': {\n        'error': false,\n        'http_status_code': null,\n        'internal_status_code': 10503,\n        'toast_duration': 5000,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.success.message.duplication_deleted'),\n    },\n    'enrollment_code_409': {\n        'error': true,\n        'http_status_code': null,\n        'internal_status_code': 10504,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': true,\n        'message': LdI18Next.t('modules.error.message.enrollment_code_409'),\n    },\n    'NotAuthorizedException': {\n        'error': true,\n        'http_status_code': 400,\n        'message': 'Your old password is incorrect. Please try again.',\n    },\n    'change_pw_required': {\n        'message': 'Before your first login, you need to change your temporary password.',\n    },\n    'force_change_password_success': {\n        'error': false,\n        'toast_duration': 5000,\n        'message_type': 'SUCCESS',\n        'message': 'Your password has been changed successfully.',\n        'link_text': 'Please click here to continue',\n    },\n    'force_change_password_error': {\n        'error': true,\n        'toast_duration': 0,\n        'message_type': 'ERROR',\n        'message': 'Your password could not be changed. Please try again.',\n    },\n    'verify_email': {\n        'message': 'Please enter the verification code that has been sent to your e-mail address.',\n    },\n    'UserNotConfirmedException': {\n        'error': true,\n        'http_status_code': 401,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': true,\n        'disable_input': false,\n        'message': 'You first need to verify your account. Therefore an verification code has been sent to your e-mail account.',\n    },\n    'forgot_password_code_sent': {\n        'message': 'A verification code has been sent to your e-mail address. Please use this code to set a new password.',\n    },\n    'no_verification_code_entered': {\n        'message': 'You need to enter the verification code sent to your e-mail address.',\n    },\n    'limit_change_failed': {\n        'message': LdI18Next.t('modules.error.message.limit_change_failed'),\n        'error': true,\n        'http_status_code': \"-\",\n    },\n  'custom_date_fail': {\n    'error': true,\n    'http_status_code': null,\n    'internal_status_code': 10931,\n    'toast_duration': 0,\n    'highlight_input': false,\n    'disable_input': true,\n    'message': LdI18Next.t('modules.errors.statusCodes.e_931.message'),\n  },\n    'assets_409': {\n        'error': true,\n        'http_status_code': 409,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_932.message'),\n    },\n    'assets_500': {\n        'error': true,\n        'http_status_code': 500,\n        'internal_status_code': null,\n        'toast_duration': 0,\n        'highlight_input': false,\n        'disable_input': false,\n        'message': LdI18Next.t('modules.errors.statusCodes.e_935.message'),\n    }\n};\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport { html, LitElement, PropertyValues, TemplateResult } from 'lit';\nimport { customElement, state }                             from 'lit/decorators.js';\nimport { showToast }                                        from '../../js/LdNotificationHandler';\nimport { LdLoginStyles }                                    from './styles';\nimport { PaperToastElement }                                from '@polymer/paper-toast';\nimport { baseConfig }                                       from '../../auto-generated/config';\nimport { PaperDialogElement }                               from '@polymer/paper-dialog';\nimport '@polymer/paper-input/paper-input';\nimport '@polymer/paper-button/paper-button';\nimport '@polymer/paper-toast/paper-toast';\nimport '@polymer/paper-dialog/paper-dialog';\nimport '@polymer/paper-dialog-scrollable/paper-dialog-scrollable';\nimport '@lifedata/ld-markdown-element/ld-markdown-element.js';\n\nimport '../../views/login/login-view';\nimport '../../views/forgot-password/forgot-password-view';\nimport '../../views/change-password/change-password-view';\n\n@customElement('ld-login-application')\nexport class LdLoginApplication extends LitElement {\n\n  @state() private _privacyPolicyUrl: string = baseConfig.privacyPolicy.baseUrl + baseConfig.privacyPolicy.documentUrls.en;\n\n  static styles = LdLoginStyles;\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.addEventListener('event', (e: CustomEventInit) => {\n      if (e.detail.eventType === 'request-url-params') {\n        const queryString  = window.location.search;\n        e.detail.processed = true;\n        e.detail.value     = new Map(Array.from(new URLSearchParams(queryString).entries()));\n      } else if (e.detail.eventType === 'notification-requested') {\n        showToast(e.detail.message);\n      }\n    });\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected firstUpdated(_changedProperties: PropertyValues) {\n    super.firstUpdated(_changedProperties);\n\n    if (window.location.pathname === '/login' && !window.location.search.includes('wc-ce&wc-shadydom&wc-shimcssproperties')) {\n      window.location.href = `${window.location.pathname}?wc-ce&wc-shadydom&wc-shimcssproperties${document.location.search.replace('?', '&')}`;\n    }\n\n    const queryString = window.location.search;\n    const urlParams   = new URLSearchParams(queryString);\n\n    if (urlParams.has('message')) {\n      const message = urlParams.get('message');\n      showToast(message!);\n    }\n\n    if (urlParams.has('logout')) {\n      this.clearToken();\n    }\n  }\n\n  clearToken() {\n    const tokenKey = baseConfig.localstorage.token_key;\n    localStorage.removeItem(tokenKey);\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n\n    return html`\n\n      <paper-toast id='ld-login-toast' duration='0' class='fit-bottom'>\n        <span class='ld-login-toast-message'>This is a test. This is a test. This is a test.</span>\n        <paper-button @click='${() => this._onLoginToastCloseClick()}'>Close</paper-button>\n      </paper-toast>\n\n      <paper-dialog id='privacyPolicyDialog' no-cancel-on-esc-key='true' .modal='${true}'\n                    no-cancel-on-outside-click='true'>\n        <h2>Privacy Policy</h2>\n        <div class='privacy-language'><a @click='${(e: Event) => this._onPrivacyLanguageChange(e)}'\n                                         data-lng='en'\n                                         href='javascript:;'>ENGLISH VERSION</a> | <a\n          @click='${(e: Event) => this._onPrivacyLanguageChange(e)}' data-lng='de' href='javascript:;'>DEUTSCHE\n          VERSION</a></div>\n        <paper-dialog-scrollable id='scrollabledialog'>\n          <ld-markdown-element>\n            <div slot='markdown-html'></div>\n            <script\n              slot='markdown-src'\n              type='text/markdown'\n              src='${this._privacyPolicyUrl}'\n            ></script>\n          </ld-markdown-element>\n        </paper-dialog-scrollable>\n        <div class='buttons'>\n          <paper-button @click='${() => this._onPrivacyDialogToggle()}'>Close</paper-button>\n        </div>\n      </paper-dialog>\n\n      <div id='sw-stripe'></div>\n      <div id='sw-logo'></div>\n      <div id='lifedata-logo'></div>\n      <div style=\"margin-top:22%; margin-left: 7%;color: orange;\"><b>Old links will be DISABLED</b> <br> <br> https://login.sw-machines.io <br>https://platform.sw-machines.io <br><br><b>Please use the NEW LINK</b> <br><br>https://platform.prod.sw-machines.io</div>\n\n      <section class='ld-login-area'>\n        <slot></slot>\n      </section>\n      <footer>\n        <ul class='flex'>\n          <li><a tabindex='-1' href='https://www.sw-machines.com/en/' target='_blank'>SW Homepage</a></li>\n          <li><a tabindex='-1' href='https://sw-machines.com/en/imprint/' target='_blank'>Imprint</a></li>\n          <li><a tabindex='-1' href='https://sw-machines.com/en/gtc/' target='_blank'>GTCT / Standards</a>\n          </li>\n          <li><a tabindex='-1' @click='${() => this._onPrivacyDialogToggle()}'>Privacy</a></li>\n          <li><a tabindex='-1' href='mailto:lifedata@sw-machines.com'>Contact Us</a></li>\n        </ul>\n      </footer>\n\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onLoginToastCloseClick() {\n    const _toastElement = <PaperToastElement>this.shadowRoot!.querySelector('paper-toast#ld-login-toast');\n    _toastElement.close();\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onPrivacyLanguageChange(e: Event) {\n    // @ts-ignore\n    const language: string = e.target!.dataset!.lng;\n    // @ts-ignore\n    this._privacyPolicyUrl = baseConfig.privacyPolicy.baseUrl + baseConfig.privacyPolicy.documentUrls[language.toLowerCase()];\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onPrivacyDialogToggle(): void {\n    const _el = <PaperDialogElement>this.shadowRoot!.querySelector('#privacyPolicyDialog');\n    if (_el.opened === true) {\n      _el.close();\n      return;\n    }\n    _el.open();\n  }\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport {css} from 'lit';\n\n\nexport const LdLoginStyles = css`\n  :host {\n    width: 100%;\n    height: 95%;\n    margin: 0 auto;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    overflow: auto;\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 100;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#001935', endColorstr='#000111',GradientType=0);\n  }\n  body {\n    font-family: Calibri, Roboto, Helvetica, sans-serif;\n    width:100%;\n    min-height:100vh;\n    height:100%;\n    margin:0;\n    padding:0;\n  }\n\n  .ld-login-area {\n    width: 40%;\n  }\n\n  .title {\n    font-family: 'Roboto', 'Noto', sans-serif;\n    color: #949494;\n    font-size:12px;\n  }\n  login-view paper-button, forgot-password-view paper-button, change-password-view paper-button {\n    box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2) !important;\n    margin: 12px 0 !important;\n    background-color: #fafafa !important;\n    color: #E4002B !important;\n    font-weight: 700 !important;\n  }\n  .paper-button:hover {\n    box-shadow: 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12), 0 5px 5px -3px rgba(0,0,0,.4) !important;\n    margin: 12px 0 !important;\n    background-color: rgba(228,0,43,.25) !important;\n    background-image: none !important;\n    -o-animation: fadeIt 0.5s ease-in-out;\n    animation: fadeIt 0.5s ease-in-out;\n    color: #E4002B !important;\n    font-weight: 700 !important;\n  }\n  login-view input:focus {\n    border: 2px solid #d9d9d9 !important;\n    outline: 0 !important;\n    box-shadow: 0 0 3px #d9d9d9 !important;\n  }\n  @-o-keyframes fadeIt {\n    0%   { background-color: #fafafa; }\n    100%  { background-color: rgba(228,0,43,.25); }\n  }\n  @keyframes fadeIt {\n    0%   { background-color: #fafafa; }\n    100%  { background-color: rgba(228,0,43,.25); }\n  }\n  paper-input {\n    color: var(--paper-grey-600) !important;\n  }\n\n  paper-button[disabled] {\n    opacity: 0.7;\n  }\n\n  #signInButton, #changePasswordButton {\n    width: 100%;\n    margin: 12px 0;\n    background-color: var(--paper-grey-100);\n    color: var(--login-button-text-color, var(--sw-primary-highlight-color, #eb0028));\n    font-weight: bold;\n  }\n\n  paper-button[raised].keyboard-focus {\n    background-color: var(--paper-grey-50);\n    box-shadow: 0 0 8px #004da3,\n    0 0 20px #004da3dd;\n  }\n\n  .paper-spinner-lite-1 .spinner-layer.paper-spinner-lite {\n    color: red !important;\n  }\n\n  :not(#ld-login-toast) paper-button.red {\n    text-transform: none;\n    background-color: var(--paper-grey-800);\n    color: white;\n  }\n\n  iron-icon {\n    color: #949494;\n    cursor: pointer;\n    margin: 4px;\n    margin-top: -2px;\n  }\n\n  iron-input > input {\n    position: var(--paper-input-container-shared-input-style_-_position);\n    outline: var(--paper-input-container-shared-input-style_-_outline);\n    box-shadow: var(--paper-input-container-shared-input-style_-_box-shadow);\n    padding: var(--paper-input-container-shared-input-style_-_padding);\n    margin: var(--paper-input-container-shared-input-style_-_margin);\n    width: var(--paper-input-container-shared-input-style_-_width);\n    max-width: var(--paper-input-container-shared-input-style_-_max-width);\n    background: var(--paper-input-container-shared-input-style_-_background);\n    border: var(--paper-input-container-shared-input-style_-_border);\n    color: #757575 !important;\n    -webkit-appearance: var(--paper-input-container-shared-input-style_-_-webkit-appearance);\n    text-align: var(--paper-input-container-shared-input-style_-_text-align);\n    vertical-align: var(--paper-input-container-shared-input-style_-_vertical-align);\n    font-family: var(--paper-input-container-shared-input-style_-_font-family);\n    -webkit-font-smoothing: var(--paper-input-container-shared-input-style_-_-webkit-font-smoothing);\n    font-size: var(--paper-input-container-shared-input-style_-_font-size);\n    font-weight: var(--paper-input-container-shared-input-style_-_font-weight);\n    line-height: var(--paper-input-container-shared-input-style_-_line-height);\n    font-family: inherit;\n    font-weight: inherit;\n    font-size: inherit;\n    letter-spacing: inherit;\n    word-spacing: inherit;\n    line-height: inherit;\n    text-shadow: inherit;\n    color: inherit;\n    cursor: inherit;\n  }\n  \n \n\n  input::-webkit-input-placeholder {\n    color: var(--paper-input-container-color, var(--secondary-text-color));\n  }\n\n  input:-moz-placeholder {\n    color: var(--paper-input-container-color, var(--secondary-text-color));\n  }\n\n  input::-moz-placeholder {\n    color: var(--paper-input-container-color, var(--secondary-text-color));\n  }\n\n  input:-ms-input-placeholder {\n    color: var(--paper-input-container-color, var(--secondary-text-color));\n  }\n\n  footer {\n    display: -webkit-flex;\n    display: flex;\n    position: fixed;\n    bottom: 0;\n    right: 0;\n    -ms-flex-direction: column;\n    -webkit-flex-direction: column;\n    flex-direction: column;\n    -ms-flex-align: end;\n    -webkit-align-items: flex-end;\n    align-items: flex-end;\n    font-size: 12px;\n    -ms-flex: 1 1 0px;\n    -webkit-flex: 1;\n    flex: 1;\n    -webkit-flex-basis: 0px;\n    flex-basis: 0px;\n    margin-right: 10px;\n    max-height: 50px;\n  }\n\n  footer ul {\n    margin: 16px 25px;\n    height: 20px;\n    list-style: none;\n  }\n\n  footer ul>li {\n    display: inline;\n    margin-right: 15px;\n  }\n\n  footer ul>li>a {\n    color: #949494;\n    text-decoration: none;\n  }\n\n  .flex {\n    -ms-flex: 1 1 0px;\n    -webkit-flex: 1;\n    flex: 1;\n    -webkit-flex-basis: 0px;\n    flex-basis: 0px;\n  }\n\n  .passwordForgot {\n    font-family: 'Roboto', 'Noto', sans-serif;\n    color: var(--platform-legal-text-color, var(--sw-secondary-note-color, #949494));\n    cursor: pointer;\n    text-align: right;\n    font-size: 12px;\n  }\n\n  #sw-stripe {\n    position: absolute;\n    top: 0;\n    left: 390px;\n    width: 6px;\n    height: 100%;\n    background-color: var(--login-stripe-background-color, var(--sw-primary-highlight-color, #eb0028));\n  }\n\n  #sw-logo {\n    font-family: 'Roboto', 'Noto', sans-serif;\n    position: absolute;\n    top: 220px;\n    left: 45px;\n    width: 301px;\n    height: 162px;\n    background-image: url(/images/sw.png);\n    background-size: 301px 162px;\n  }\n\n  #lifedata-logo {\n    position: absolute;\n    top: 220px;\n    left: 460px;\n    width: 339px;\n    height: 119px;\n    background-image: url(/images/lifedata.png);\n  }\n\n  section.announcement {\n    font-family: Calibri, Roboto, Helvetica, sans-serif;\n    color: #856404;\n    background-color: #fff3cd;\n    border: 1px #ffeeba solid;\n    border-radius: 5px;\n    padding: 10px;\n    margin-bottom: 5px;\n  }\n\n  section.message-success {\n    background-color: #cdffce;\n    border-color: #3f8000;\n    color: #3f8000;\n  }\n\n  section.message-success a {\n    color: #3f8000;\n    font-weight: bold;\n    text-decoration: none;\n    display: block;\n  }\n\n  section.message-success a::before {\n    content: \"» \";\n  }\n\n  section.message-error {\n    background-color: rgb(255, 189, 189);\n    border-color: rgb(180, 0, 0);\n    color: rgb(180, 0, 0);\n  }\n\n  section.maintenance-announcement p {\n    font-weight: bold;\n    margin: 0 0 5px 0;\n  }\n\n  .ld-login-area {\n    position: absolute;\n    top: 395px;\n    left: 460px;\n    width: 340px;\n  }\n\n  #privacyPolicyDialog {\n    width: 40%;\n    min-height: 95%;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language {\n    margin: 0 0 0 20px;\n    padding: 15px 5px 0 5px;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language a {\n    padding: 0 5px;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language a:first-child {\n    padding-left: 0;\n  }\n\n  paper-toast {\n    border-top: 3px var(--login-stripe-background-color, var(--sw-primary-highlight-color, #eb0028)) solid;\n  }\n\n  password-compliance-feedback-element {\n    position: absolute;\n    top: -10%;\n    left: 0;\n    margin-top: 100px;\n    margin-left: 350px;\n    height: 200px;\n    width: auto;\n    min-width: 400px;\n  }\n\n  /** TABLET **/\n  /** ------------------------------------------------------------------------- **/\n  @media (min-width: 768px) and (max-width: 1000px) {\n    #sw-stripe {\n      left: 190px;\n    }\n\n    .ld-login-area {\n      width: 50%;\n      position: absolute;\n      top: 400px;\n      left: 250px;\n    }\n\n    #sw-logo {\n      position: absolute;\n      top: 30px;\n      left: 250px;\n    }\n\n    #lifedata-logo {\n      position: absolute;\n      top: 220px;\n      left: 250px;\n    }\n  }\n  /** SMARTPHONE **/\n  /** ------------------------------------------------------------------------- **/\n  @media (max-width: 767px) {\n    #sw-stripe {\n      display: none;\n    }\n\n    .ld-login-area {\n      position: static;\n      width: 80%;\n      margin: 50px auto 0 auto;\n    }\n\n    #sw-logo {\n      position: static;\n      margin: 60px auto 0 auto;\n      text-align: center;\n    }\n\n    #lifedata-logo {\n      position: static;\n      margin: 30px auto 0 auto;\n      text-align: center;\n    }\n  }\n`;\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/paper-tabs/paper-tab';\nimport '@polymer/paper-tabs/paper-tabs';\nimport {customElement, html, LitElement, property, TemplateResult} from 'lit-element';\nimport LdPlatformModulesAssetsStyles from '../modules/assets/styles';\n\n/**\n * LdDialogs module which handles all LdDialogs-management actions\n * @extends LitElement\n */\n@customElement('ld-dialogs')\nexport class LdDialogs extends (LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  @property({ type: Boolean, hasChanged: () => true }) opened: boolean        = false;\n  @property({ type: Boolean, hasChanged: () => true }) acceptDecline: boolean = false;\n  @property({ type: String, hasChanged: () => true }) titleText: string       = '';\n  @property({ type: String, hasChanged: () => true }) name: string            = '';\n  @property({ type: String, hasChanged: () => true }) dismissText: string     = '';\n  @property({ type: String, hasChanged: () => true }) confirmText: string     = '';\n  @property({ type: Boolean, hasChanged: () => true }) bigPopup: boolean = false;\n\n\n  // --------------------------------------------------------------------------------------\n  static styles = [LdPlatformModulesAssetsStyles];\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    const button = [];\n    if (this.dismissText !== '') {\n      button.push(html`\n        <paper-button data-testid=\"dismiss-button\" @click='${() => this.decline()}' value='cancel' raised\n                      class='secondary-action'>\n          ${this.dismissText}\n        </paper-button>`);\n    }\n\n    if (this.confirmText !== '') {\n      button.push(html`\n        <paper-button data-testid=\"accept-button\" @click='${() => this.accept()}' value='default' raised\n                      class='primary-action'>\n          ${this.confirmText}\n        </paper-button>`);\n    }\n\n    return html`\n      <dialog id='delete-dialog' class='${this.bigPopup ? `biggerDialog` : `` }'>\n        <div class='modal-title'>${this.titleText}\n          ${this.name}\n        </div>\n        <slot part='tab'></slot>\n        <form method='dialog'>\n          <div class='form-actions'>\n            <div class='primary-and-secondary-form-actions'>\n              ${button}\n            </div>\n          </div>\n        </form>\n      </dialog>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  accept(): void {\n    this.dispatchEvent(new CustomEvent('accept-clicked'));\n  }\n\n  // --------------------------------------------------------------------------------------\n  decline(): void {\n    this.dispatchEvent(new CustomEvent('decline-clicked'));\n  }\n\n  // --------------------------------------------------------------------------------------\n  openDialog(): void {\n    const deleteDialog: HTMLDialogElement = this.shadowRoot?.querySelector('#delete-dialog')!;\n    if (!deleteDialog) {\n      return;\n    }\n    deleteDialog.showModal();\n  }\n\n  // --------------------------------------------------------------------------------------\n  closeDialog(): void {\n    const deleteDialog: HTMLDialogElement = this.shadowRoot?.querySelector('#delete-dialog')!;\n    if (!deleteDialog) {\n      return;\n    }\n    deleteDialog.close();\n  }\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@lifedata/ld-elements/dist/atoms/ld-dropdown';\nimport '@lifedata/ld-elements/dist/atoms/ld-dropdown-search';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-button/paper-button';\nimport '@polymer/paper-checkbox/paper-checkbox';\n\nimport '@polymer/paper-input/paper-input';\nimport '@polymer/paper-input/paper-textarea';\nimport '@polymer/paper-item/paper-item';\nimport '@polymer/paper-listbox/paper-listbox';\nimport '@polymer/paper-toggle-button/paper-toggle-button';\nimport {html, LitElement, TemplateResult} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {ifDefined} from 'lit/directives/if-defined.js';\n\nimport moment from 'moment';\nimport {sortByName, valuesHaveNameProperty} from '../../../js/LdGlobal';\nimport {DropdownValue, FormElement} from '../../../typesAndInterfaces/Forms';\nimport {LdI18NextMixin} from '../../ld-application/i18n/ld-i18next';\nimport '../ld-datepicker-config';\n\nimport {LdFormStyles} from './styles';\nimport {IFDropdownValue, IFLdSearchableDropdown} from \"../../../js/interfaces\";\n\n/**\n * @extends LitElement\n */\nclass LdFormWrapper extends LdI18NextMixin(LitElement) {\n\n  @property({type: Object, hasChanged: () => true})\n  formInputs: any;\n\n  @property({type: Boolean, hasChanged: () => true})\n  loading: boolean = false;\n\n  @property({type: Object, hasChanged: () => true})\n  _settings: any;\n\n  @property({type: String, hasChanged: () => true})\n  _value: string = \"\";\n\n  // --------------------------------------------------------------------------------------\n  static styles = [LdFormStyles];\n\n  handleInputChange(e: InputEvent, item: FormElement, type: string = \"form-data-changed\") {\n    const eventTarget = e.target as HTMLInputElement;\n    if(eventTarget.getAttribute('cid') != null){\n      eventTarget.value = eventTarget.getAttribute('cid')!;\n    }\n    this.dispatchEvent(new CustomEvent(type, {\n          composed: true,\n          bubbles: true,\n          detail: {\n            data: eventTarget.value,\n            id: item.id\n          }\n        }\n      )\n    )\n  }\n\n\n  onChangeHandler(item: FormElement) {\n    return (e: InputEvent) => this.handleInputChange(e, item,)\n  }\n\n  toggleHandler(item: FormElement) {\n    return (e: InputEvent) => this.handleInputChange(e, item, 'toggle-changed')\n  }\n\n  onChangeHandlerDropdown(item: FormElement) {\n    return (e: InputEvent) => this.handleInputChange(e, item, 'dropdown-changed')\n  }\n  // --------------------------------------------------------------------------------------\n  render() {\n    const formInputs: Array<TemplateResult> = [];\n    if (typeof this.formInputs !== 'undefined') {\n      this.formInputs.forEach((item: FormElement) => {\n        if (!item.hidden) {\n          /**\n           * create input fields\n           */\n          switch (item.type) {\n            case 'input':\n              formInputs.push(html`\n                <paper-input\n                    id='${item.id}'\n                    tabindex='${item.tabIndex}'\n                    @change=\"${this.onChangeHandler(item)}\"\n                    label='${item.label}'\n                    ?disabled='${item.disabled}'\n                    ?auto-validate='${item.pattern != null}'\n                    pattern='${item.pattern ?? ''}'\n                    value='${item.value ?? ''}'\n                    ?readonly='${item.readonly}'\n                    error-message='${item.errorMessage ?? ''}'>\n                  ${item.readonly === true ? html`\n                    <iron-icon icon='block' slot=\"suffix\"></iron-icon>` : ''}\n                </paper-input>\n              `);\n              break;\n\n            case 'hidden':\n              formInputs.push(html`\n                <paper-input\n                    id='${item.id}'\n                    value='${item.value ?? ''}'\n                    style='display:none;'\n                ></paper-input>\n              `);\n              break;\n\n            case 'textarea':\n              formInputs.push(html`\n                <paper-textarea\n                    id='${item.id}'\n                    tabindex='${item.tabIndex}'\n                    label='${item.label}'\n                    value='${item.value ?? ''}'\n                    ?disabled='${item.disabled}'\n                    error-message='${item.errorMessage ?? ''}'>\n                  ${item.readonly === true ? html`\n                    <iron-icon icon='block' slot=\"suffix\"></iron-icon>` : ''}\n                  >\n                </paper-textarea>\n              `);\n              break;\n\n            case 'toggle':\n              formInputs.push(html`\n                <paper-toggle-button\n                    id='${item.id}'\n                    class='red'\n                    @click=\"${this.toggleHandler(item)}\"\n                    tabindex='${item.tabIndex}'\n                    ?checked='${item.checked ?? ''}'\n                    value='${item.value ?? ''}'\n                    ?disabled='${item.disabled}'\n                    error-message='${item.errorMessage ?? ''}'>${item.label}\n                </paper-toggle-button>\n              `);\n              break;\n\n            case 'dropdown': {\n              const values = item.value as unknown as Array<DropdownValue>;\n              formInputs.push(html`\n              <paper-dropdown-menu \n                tabindex='${item.tabIndex}'\n                id='${item.id}'\n                label='${item.label}'\n                error-message='${item.errorMessage ?? ''}'>\n                <paper-listbox\n                  label='${item.labelListBox}' \n                  slot='dropdown-content'\n                  @click=\"${this.onChangeHandlerDropdown(item)}\"\n                  selected='${item.selected ?? ''}' \n                  class='${item.class}' \n                  attr-for-selected='cid'\n                  >\n                    ${this._loadPaperItemValue(values)}\n                  </paper-listbox>\n                </paper-dropdown-menu>\n              `);\n              break;\n            }\n\n            case 'file':\n              formInputs.push(html`\n                <paper-input\n                    type='file'\n                    accept='${item.accept || '*'}'\n                    id='${item.id}'\n                    label='${item.label}'\n                    value='${item.value ?? ''}'\n                    ?disabled='${item.disabled}'\n                    error-message='${item.errorMessage ?? ''}'\n                ></paper-input>\n              `);\n              break;\n\n            case 'datepicker':\n              formInputs.push(html`\n              <ld-datepicker-config \n                id='${item.id}'\n                ?noTimeSelect='${item.noTimeSelect}'\n                ?singleDaySelect='${item.singleDaySelect}' \n                ?noPresets='${item.noPresets}'  \n                ?blockFutureDates='${item.blockFutureDates}' \n                ?usePredefinedDate='${item.usePredefinedDate}'\n                ?disabledCustomButton='${item.disabledCustomButton}'\n                ?disabledMaxInformation=\"${true}\"\n                addTitle='${item.label}'\n                date='${ifDefined(item.value)}'\n                value='${item.value != null ? moment(item.value).format('YYYY-MM-DD') : ''}'\n                @changed='${(evt: InputEvent) => this._dateChanged(evt)}'\n              ></ld-datepicker-config>\n            `);\n              break;\n\n            case 'lit-html': {\n              const result = item.value as unknown as Function;\n              formInputs.push(result());\n              break;\n            }\n\n            case 'dropdown-search': {\n              const valuesSearch = item.value as unknown as Array<IFDropdownValue>;\n              const dropdownConfig: IFLdSearchableDropdown = {\n                id: item.id,\n                label: item.label,\n                placeholder: item.placeholder,\n                searchPlaceholder: item.searchPlaceholder || this.LdTranslate('modules.generic.search'),\n                required: item.validation?.includes('isNotEmpty') || false,\n                clearable: !item.readonly,\n                readonly: item.readonly || false,\n                invalid: false,\n                errorMessage: item.errorMessage ?? '',\n                tabindex: item.tabIndex,\n                selected: item.selected,\n                value: valuesSearch.map(val => ({\n                  key: val.id!,\n                  value: val.name!,\n                  name: val.name!,\n                  title: val.name!\n                })),\n                maxHeight: '300px'\n              };\n              formInputs.push(html`\n                <ld-searchable-dropdown\n                    class=\"search ${item.class || ''}\"\n                    .dropdown=\"${dropdownConfig}\"\n                    ?invalid=\"${item.invalid || false}\"\n                    id=\"${item.id}\"\n                    cid=\"${item.cid || ''}\"\n                    @value-changed=\"${(e: CustomEvent) => this.updateItemSelectionValue(e, item)}\"\n                ></ld-searchable-dropdown>\n              `);\n              break;\n            }\n          }\n        }\n      });\n    }\n\n    return html`\n      ${formInputs}\n    `;\n  }\n\n\n  private updateItemSelectionValue(evt: CustomEvent, item: unknown | Array<IFDropdownValue>): void {\n    const newValue = evt.detail.value || evt.detail;\n    if (item && typeof item === 'object' && !Array.isArray(item)) {\n      const itemObj = item as Record<string, any>;\n      itemObj.cid = newValue;\n    }\n    this.requestUpdate();\n  }\n\n\n  /**\n   * Create the Dropdowns for a dropdown field the array must have id and name\n   * @param values\n   */\n  // --------------------------------------------------------------------------------------\n  _loadPaperItemValue(value: Array<DropdownValue>) {\n    const paperItem: TemplateResult[] = [];\n\n    if (valuesHaveNameProperty(value)) value.sort(sortByName);\n\n    if (typeof value !== 'undefined') {\n      value.forEach((item) => {\n        paperItem.push(html`\n          <paper-item\n              cid='${item.id}'>\n            ${this._truncateFullName(item)}\n          </paper-item>\n        `);\n      });\n    }\n    return paperItem;\n  }\n\n  /**\n   * @param  {} name\n   */\n  // --------------------------------------------------------------------------------------\n  /* eslint-disable */\n  _truncateFullName(item: DropdownValue) {\n    let name;\n    if (typeof item.name !== 'undefined') {\n      name = item.name;\n    } else if (item.title) {\n      name = item.title;\n    } else {\n      throw new Error(\"item with unknown structure provided: \" + JSON.stringify(item))\n    }\n    return (name.length > 80) ? `${name.substr(0, 80)}\\u2026` : name;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _dateChanged(evt: InputEvent) {\n    const eventTarget = evt.target as unknown as HTMLElement;\n    const detail = evt.detail as unknown as { start: string };\n    this.shadowRoot?.querySelector(`ld-datepicker-config#${eventTarget.getAttribute('id')}`)!.setAttribute('value', moment(detail.start).format('YYYY-MM-DD'))\n  }\n\n}\n\ncustomElements.define('ld-form-wrapper', LdFormWrapper as unknown as CustomElementConstructor);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css, unsafeCSS } from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdStateIndicatorStyles = css`\n  :host {\n    display: inline;\n    font-size:16px;\n    text-transform: none;\n    margin-left: 50px;\n    vertical-align: middle;\n  }\n  \n  .circle {\n    margin: 0;\n    padding: 0;\n    display: inline-block;\n    border-width: 2px;\n    border-style: solid;\n    width: 10px;\n    height: 10px;\n    -webkit-border-radius: 10px;\n    -moz-border-radius: 10px;\n    border-radius: 10px;\n  }\n  .green {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_green)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_green)};\n  }\n  .red {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_red)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_red)};\n  }\n  .yellow {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_yellow)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_yellow)};\n  }\n\n  .gray {\n    background-color: ${unsafeCSS(_THEME.colors.trafficlight_gray)};\n    border-color: ${unsafeCSS(_THEME.colors.trafficlight_gray)};\n  }\n  .prefix {\n    display:inline-block;\n    margin-right:10px;\n  }\n  .suffix {\n    display:inline-block;\n    margin-left:10px;\n    font-weight:normal;\n  }\n  .tooltip {\n    display: inline-block;\n  }\n`;\n\nexport default LdStateIndicatorStyles;\n","/**\n * Copyright 2024 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { customElement, html, LitElement, property, PropertyValues } from 'lit-element';\nimport { connect }                                                   from 'pwa-helpers/connect-mixin';\nimport { store }                                                     from '../../ld-redux/ld-redux-store';\n\nimport { LdI18NextMixin }                                     from '../../ld-application/i18n/ld-i18next';\nimport { LdStateIndicatorStyles } from './styles';\n\nimport '@polymer/paper-fab/paper-fab';\nimport '@polymer/iron-icons/iron-icons';\n\n/**\n * @extends LitElement\n */\n@customElement('ld-state-indicator')\nexport class LdStateIndicator extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  @property({ type: String, hasChanged: () => true }) prefixText: string = '';\n  @property({ type: String, hasChanged: () => true }) suffixText: string = '';\n  @property({ type: String, hasChanged: () => true }) id: string         = '';\n  @property({ type: String, hasChanged: () => true }) label: string        = '';\n  @property({ type: String, hasChanged: () => true }) color: string        = '';\n  @property({ type: String, hasChanged: () => true }) title: string = '';\n\n\n  // ---------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdStateIndicatorStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    const prefix = [];\n    const suffix = [];\n\n    if (this.prefixText !== '') {\n      prefix.push(html`\n        <span class='prefix'>${this.prefixText}</span>\n      `);\n    }\n\n    if (this.suffixText !== '') {\n      suffix.push(html`\n        <span class='suffix'>${this.suffixText}</span>\n      `);\n    }\n\n    return html`\n      <div title='${this.title}' id='${this.id}' class='tooltip'>\n        ${prefix}\n        <span class='circle ${this.color}'></span>\n        ${suffix}\n      </div>\n    `;\n  }\n}\n\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport {css, unsafeCSS} from 'lit-element';\nimport '@polymer/iron-flex-layout/iron-flex-layout-classes';\n\nimport {_THEME} from '../../../../../themes/styles';\n\nexport const LdAssetsBackbuttonStyles = css`\n    :host {\n        cursor: pointer;\n    }\n\n    iron-icon {\n        fill: ${unsafeCSS(_THEME.colors.primary_color)};\n        background-color: #001935;\n        margin-top: -3px;\n    }\n`;\n\nexport default LdAssetsBackbuttonStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {customElement, html, LitElement, property} from 'lit-element';\nimport '@polymer/iron-icon/iron-icon';\nimport '@polymer/iron-icons/iron-icons';\nimport {forward, linkForward} from '../../../../../js/LdGlobal';\nimport {LdAssetsBackbuttonStyles} from './styles';\nimport {IFBreadCrumbConfigObject} from \"../../../../../js/interfaces\";\nimport {LdI18NextMixin} from \"../../../../ld-application/i18n/ld-i18next\";\n\n@customElement('ld-assets-backbutton')\nexport class LdAssetsBackbutton extends LdI18NextMixin(LitElement) {\n\n  @property({type: String}) parent!: IFBreadCrumbConfigObject;\n\n  static readonly styles = [LdAssetsBackbuttonStyles];\n\n  override render() {\n    return html`\n      <iron-icon\n          class=\"backbutton\"\n          @click=${this._onBackButtonClicked}\n          icon=\"chevron-left\">\n      </iron-icon>\n    `;\n  }\n\n  private _onBackButtonClicked(): void {\n    if (this.parent.backButtonLink) {\n      forward(`/assets/${this.parent.backButtonLink}`);\n    } else if (this.parent.backButtonNetcfg) {\n      linkForward(this.parent.backButtonNetcfg);\n    }\n  }\n}\n\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/paper-tabs/paper-tab';\nimport '@polymer/paper-tabs/paper-tabs';\nimport { html, LitElement, TemplateResult, property, customElement } from 'lit-element';\nimport LdPlatformModulesAssetsStyles                                                 from '../../styles';\n\n/**\n * LdDialogs module which handles all LdDelete-management actions\n * @extends LitElement\n */\n@customElement('ld-delete')\nexport class LdDelete extends (LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  @property({ type: String, hasChanged: () => true }) titleText: string       = '';\n  @property({ type: String, hasChanged: () => true }) innerText: string            = '';\n\n  // --------------------------------------------------------------------------------------\n  static styles = [LdPlatformModulesAssetsStyles];\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n\n    return html`\n         <paper-button\n        tabindex='11'\n        id='deleteButton'\n        class='tertiary-action'\n        title='${this.titleText}'\n        raised\n        @click='${() => this.showDeleteModal()}'>\n        <iron-icon icon='icons:delete'></iron-icon>\n        ${this.innerText}\n      </paper-button>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  showDeleteModal(): void {\n    this.dispatchEvent(new CustomEvent('delete-clicked'));\n  }\n\n}\n\n\n\n\n\n","import LdI18Next from \"../../../../../../ld-application/i18n/ld-i18next\";\n\nexport interface UiTextProvider {\n  getText(key: string): string | undefined;\n  onLanguageChanged(callback: ()=>void): void;\n  computeKey(fn: (key: string)=>string): void;\n}\n\nexport class SimpleUiTextProvider implements UiTextProvider {\n  private texts: Map<string, string> = new Map();\n  private keyComputeFunction: (key: string) => string = (key: string) => key;\n\n  constructor(texts: Map<string, string>) {\n    this.texts = texts;\n  }\n\n  computeKey(fn: (key: string) => string): void {\n    this.keyComputeFunction = fn;\n  }\n\n  onLanguageChanged(callback: () => void): void {\n    return \n  }\n\n  getText(key: string): string|undefined {\n    const computedKey = this.keyComputeFunction(key);\n    const text =  this.texts.get(computedKey);\n    if (text) return text;\n    return `__no-text-for-key_${computedKey};`\n  }\n  \n}\n\nexport class LdI18NextUiTextProvider implements UiTextProvider {\n  private languageChangedCallbacks: Array<()=>void> = [];\n  private ldI18NextInstance: typeof LdI18Next;\n  private keyComputeFunction: (key: string) => string = (key: string) => key;\n\n  constructor(ldI18NextInstance: typeof LdI18Next) {\n    this.ldI18NextInstance = ldI18NextInstance;\n\n    this.ldI18NextInstance.on('languageChanged', () => {\n      for (const callback of this.languageChangedCallbacks) {\n        callback();\n      }\n    });\n  }\n\n  computeKey(fn: (key: string) => string): void {\n    this.keyComputeFunction = fn;\n  }\n\n  onLanguageChanged(callback: () => void): void {\n    this.languageChangedCallbacks.push(callback);\n  }\n  \n  getText(key: string): string | undefined {\n    const computedKey = this.keyComputeFunction(key);\n    return this.ldI18NextInstance.t(computedKey);\n  }\n  \n}","export const texts_en: string[][] = [\n  [\"intro_heading\", \"Information regarding the location\"],\n  [\"intro_text\", \"The CloudPlatform displays the company on a map, using latitude and longitude.\"],\n  [\"location_name\", \"Name of the location:\"],\n  [\"button_set_custom_coordinates\", \"Set custom coordinates\"],\n  [\"label_latitude\", \"Latitude\"],\n  [\"label_longitude\", \"Longitude\"],\n  [\"button_define_coordinates\", \"Define coordinates yourself\"],\n  [\"text_specify_coordinates_yourself\", \"You can specify the coordinates yourself.\"],\n  [\"text_no_coordinates_found\", \"No coordinates were found for the data you entered.\"],\n  [\"text_coordinates_success_set\", \"Coordinates successfully set.\"],\n  [\"text_fallback_info\", \"If not, the default coordinates will be used.\"],\n  [\"text_success_location\", \"We have set the following information based on your input:\"],\n  [\"text_location_found\", \"A location was found.\"],\n  [\"text_location_entered\", \"The location was entered.\"]\n]","import { css } from \"lit\";\n\nexport const styles = css`\n* {\n  color: #333333;\n  font-family: var(--paper-font-common-base_-_font-family);\n}\n\n.info {\n  font-size: 0.875rem;\n  font-weight: 500;\n  text-transform: uppercase;\n}\n\n.wrapper-edit {\n  display: flex;\n  flex-direction: column;\n}\n\n.location-form {\n  display: flex;\n  flex-direction: column;\n}\n\n.location-form input {\n  display: flex;\n}\n\n.location-form paper-button {\n  margin-top: 10px;\n}\n\n.hidden {\n  display: none;\n}\n\n.loading-indicator progress{\n  width: 100%;\n}\n\n.font-bold {\n  font-weight: bold;\n}\n\np {\n  margin: 4px 0 0px 0;\n}\n\n.intro-text {\n  margin-bottom: 6px;\n}\n\n.mt-m {\n  margin-top: 6px;\n}\n\n.mb-m {\n  margin-bottom: 6px;\n}\n\n`;","import {css, unsafeCSS} from 'lit';\nimport {themeColors} from \"../../themes/lifedata\";\n\nexport const formElementStyles = css`\n  paper-button {\n    margin:                 12px 0px;\n    background-color:       var(--paper-grey-50);\n    color: var(--platform-button-text-color, var(--sw-primary-highlight-color, ${unsafeCSS(themeColors.button_thirdBackground_color)}));\n    font-weight:            bold;\n  }\n`\n","import { html, LitElement, TemplateResult } from \"lit\";\nimport { texts_en } from \"./texts_en\";\nimport { UiTextProvider, SimpleUiTextProvider } from \"./UiTextProvider\";\nimport { styles } from \"./location-selection-element.styles\";\n\nimport '@polymer/paper-input/paper-input';\nimport '@polymer/paper-button/paper-button'\nimport { formElementStyles } from \"../../../../../../_base-styles/form-elements.styles\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\nexport const defaultLocationValue = {\n  location: {\n    coordinates: {\n      latitude: -1,\n      longitude: -1,\n    },\n    displayName: \"-\"\n  },\n  default: true\n};\n\n\n@customElement(\"location-selection-element\")\nexport class LocationSelectionElement extends LitElement {\n\n  private _apiLocationData:  ApiData | undefined;\n\n  @property({hasChanged: () => true})\n  get apiLocationData(): ApiData | undefined {\n    return this._apiLocationData\n  }\n\n  set apiLocationData(val: ApiData | undefined) {\n    this._apiLocationData = val;\n    this.reactToNewApiData();\n    this.requestUpdate();\n  }\n\n  @state()\n  showInputs = false;\n\n  @property()\n  coordinatesSet = false;\n\n  @property()\n  userSetCoordinates = false;\n\n  @property()\n  loading = false;\n\n  @property()\n  shown = false;\n\n  @property()\n  uiTextProvider: UiTextProvider = new SimpleUiTextProvider(\n    new Map(texts_en.map(([key, val]) => [key, val] as [string, string]))\n  );\n\n  @property({ type: Object })\n  value: Result = {...this.getDefaultValue()};\n\n  static styles = [styles, formElementStyles];\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.uiTextProvider.onLanguageChanged(()=>{\n      this.requestUpdate();\n    })\n  }\n\n  // --------------------------------------------------------------------------------------\n  reactToNewApiData(): void {\n\n    if (!this.apiLocationData) {\n      if (this.value.location.coordinates.latitude === -1 && this.shown === false) {\n        this.userSetCoordinates = false;\n        this.coordinatesSet = false;\n      } else if (this.value.location.coordinates.latitude === -1 && this.shown === true) {\n        this.userSetCoordinates = true;\n        this.coordinatesSet = true;\n      }\n      return;\n    }\n\n    const {type, location} = this.apiLocationData;\n\n    if (type !== \"osm\") throw new Error(\"unsupported API: \" + type);\n    const apiLocation = location as Array<OSMResponse>;\n\n    if (apiLocation?.length > 0) {\n      this.value.location = {\n        coordinates: {\n          latitude: parseFloat(apiLocation[0].lat),\n          longitude: parseFloat(apiLocation[0].lon)\n        },\n        displayName: apiLocation[0].display_name\n      };\n      this.value.default = false;\n      this.userSetCoordinates = false;\n      this.coordinatesSet = true;\n    } else if (apiLocation?.length === 0) {\n      this.userSetCoordinates = false;\n      this.coordinatesSet = false;\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  reset(): void {\n    this.value = {...this.getDefaultValue()};\n    this.showInputs = false;\n    this.coordinatesSet = false;\n    this.userSetCoordinates = false;\n    this.apiLocationData = undefined;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getDefaultValue(): Result {\n    return {\n      location: {\n        coordinates: {\n          latitude: -1,\n          longitude: -1,\n        },\n        displayName: \"-\"\n      },\n      default: true\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private isElementVisible(locationCheckResult: LocationResult) {\n    if (this.shown) return true;\n    return this.coordinatesSet || locationCheckResult.status !== \"data-missing\";\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    const locationCheckResult = this.getLocationCheckResult(this.apiLocationData);\n    let isVisible = this.isElementVisible(locationCheckResult);\n    return html`\n    <div class=\"loading-indicator ${!this.loading ? \"hidden\" : \"\"}\">\n      <progress></progress>\n    </div>\n    <div data-testing-id=\"main-element\" class=\"lit-custom-field address_geo-feedback ${isVisible ? \"\" : \"hidden\"}\">\n      ${this.generateMarkup(locationCheckResult)}\n    </div>\n  `\n  }\n\n  // --------------------------------------------------------------------------------------\n  generateMarkup(result: LocationResult): TemplateResult {\n    let markup;\n    if (result.status === \"found\" || result.status === \"set\") markup = this.generateSuccessMarkup(result);\n    else if (result.status === \"not-found\") markup = this.generateFailureMarkup();\n    else markup = html``;\n\n    return html`\n      <div class=\"info\">${this.uiTextProvider.getText(\"intro_heading\")}</div>\n      <p class=\"intro-text\">${this.uiTextProvider.getText(\"intro_text\")}</p>\n      ${markup}\n    ` ;\n  }\n\n  // --------------------------------------------------------------------------------------\n  generateSuccessMarkup(result: LocationResult): TemplateResult {\n    const displayName = result.location.displayName !== \"-\" ?\n      html`<li>${this.uiTextProvider.getText(\"location_name\")} ${result.location.displayName}</li>`\n      : \"\";\n\n    let successFeedbackText = html``;\n    if (result.status === \"found\")\n      successFeedbackText = html`<p class=\"font-bold\">${this.uiTextProvider.getText(\"text_location_found\")}</p>`\n    else if (result.status === \"set\")\n      successFeedbackText = html`<p class=\"font-bold\">${this.uiTextProvider.getText(\"text_location_entered\")}</p>`\n\n    return html`\n      <div>\n        ${successFeedbackText}\n        <p>${this.uiTextProvider.getText(\"text_success_location\")}</p>\n          <ul>\n            <li>${this.uiTextProvider.getText(\"label_latitude\")}: ${result.location.coordinates.latitude}</li>\n            <li>${this.uiTextProvider.getText(\"label_longitude\")}: ${result.location.coordinates.longitude}</li>\n            ${displayName}\n          </ul>\n      </div>\n      \n      <p>\n      ${this.uiTextProvider.getText(\"text_specify_coordinates_yourself\")}\n      </p>\n      \n      ${this.getMarkupForCustomCoordinatesButton()}\n      ${this.getMarkupForCustomCoordinates()}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  generateFailureMarkup(): TemplateResult {\n    return html`\n      <div class=\"wrapper-edit\">\n        ${this.generateLocationFetchFeedback()}\n        ${this.getMarkupForCustomCoordinatesButton()}\n        ${this.getMarkupForCustomCoordinates()}\n        <p class=\"${this.showInputs ? \"hidden\" : \"\"}\">\n          ${this.uiTextProvider.getText(\"text_fallback_info\")}\n        </p>\n      </div>\n    `\n  }\n\n  // --------------------------------------------------------------------------------------\n  generateLocationFetchFeedback(): TemplateResult {\n    return html`\n      <p class=\"font-bold\">\n        ${this.uiTextProvider.getText(\"text_no_coordinates_found\")}\n      </p> \n      <p>\n        ${this.uiTextProvider.getText(\"text_specify_coordinates_yourself\")}\n      </p>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  getMarkupForCustomCoordinatesButton(): TemplateResult {\n    return html`\n      <div class=\"mb-m mt-m\">\n        <paper-button \n          id=\"button-showCoordinateForm\"\n          raised \n          elevation=\"1\" \n          class=\"${this.showInputs ? \" hidden\" : \"\"}\" \n          @click=\"${() => this.showInputs = true}\">\n          ${this.uiTextProvider.getText(\"button_define_coordinates\")}\n        </paper-button>\n      </div>`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  getMarkupForCustomCoordinates(): TemplateResult {\n    return html`\n      <div data-testing-id=\"location-form\" class=\"location-form ${!this.showInputs ? \" hidden\" : \"\"}\">\n        <label>${this.uiTextProvider.getText(\"label_latitude\")}<paper-input id=\"coordinates_latitude\" type=\"text\" /></label>\n        <label>${this.uiTextProvider.getText(\"label_longitude\")}<paper-input id=\"coordinates_longitude\" type=\"text\" /></label>\n        <paper-button \n          id=\"button-saveCoordinates\" \n          raised elevation=\"1\" \n          @click=\"${this.setCustomCoordinates}\">\n          ${this.uiTextProvider.getText(\"button_set_custom_coordinates\")}\n        </paper-button>\n      </div>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  coordiantesAreEqual(firstCoordinates: Coordinates, secondCoordinates: Coordinates): boolean {\n    return firstCoordinates.latitude === secondCoordinates.latitude &&\n      firstCoordinates.longitude === secondCoordinates.longitude;\n  }\n\n  // --------------------------------------------------------------------------------------\n  getLocationCheckResult(apiLocationData: any): LocationResult {\n\n    if (this.coordinatesSet) {\n      return {\n        location: this.value.location,\n        status: this.userSetCoordinates ? \"set\" : \"found\"\n      }\n    }\n\n    let result: LocationResult = {\n      status: \"data-missing\",\n      location: {\n        coordinates: {\n          latitude: -1,\n          longitude: -1\n        },\n        displayName: \"\"\n      }\n    };\n    const location = apiLocationData?.location as Array<OSMResponse>;\n\n    if (!location) result.status = \"data-missing\";\n    else if (location.length === 0) {\n      result.status = \"not-found\";\n      if (!this.isLocationValid(this.value.location.coordinates)) this.value.default = true;\n    }\n    else if (location.length > 0) {\n      result.status = \"found\";\n      result.location = {\n        coordinates: {\n          latitude: parseFloat(location[0].lat),\n          longitude: parseFloat(location[0].lon),\n        },\n        displayName: location[0].display_name\n      };\n    }\n\n    return result;\n  }\n\n  // --------------------------------------------------------------------------------------\n  isLocationValid(coordinates: Coordinates): boolean {\n    return coordinates.latitude !== -1 && coordinates.longitude !== -1;\n  }\n\n  // --------------------------------------------------------------------------------------\n  setCustomCoordinates(): void {\n    const coordinates_latitude_input = this.shadowRoot?.querySelector(\"#coordinates_latitude\") as HTMLInputElement;\n    const coordinates_longitude_input = this.shadowRoot?.querySelector(\"#coordinates_longitude\") as HTMLInputElement;\n\n    if (!coordinates_latitude_input || !coordinates_longitude_input) return;\n\n    const coordinates_latitude = coordinates_latitude_input.value;\n    const coordinates_longitude = coordinates_longitude_input.value;\n\n    const result = {\n      latitude: parseFloat(coordinates_latitude),\n      longitude: parseFloat(coordinates_longitude)\n    }\n\n    this.value.location.coordinates = result;\n    this.value.location.displayName = \"-\";\n    this.value.default = false;\n\n    this.showInputs = false;\n    this.coordinatesSet = true;\n    this.userSetCoordinates = true;\n  }\n}\n\ntype LocationResult = {\n  status: \"data-missing\" | \"not-found\" | \"found\" | \"set\",\n  location: Location\n}\n\ntype Coordinates = {\n  longitude: number,\n  latitude: number,\n}\n\ntype Location = {\n  coordinates: Coordinates\n  displayName: string\n}\n\ntype Result = {\n  location: Location,\n  default: boolean\n}\n\ntype OSMResponse = {\n  display_name: string\n  lat: string\n  lon: string\n}\n\ntype ApiData = {\n  type : string\n  location: unknown\n}\n","/**\n * Copyright 2018 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, html, LitElement, property, unsafeCSS } from 'lit-element';\nimport { TemplateResult }                             from 'lit-html';\nimport _THEME                                         from '../../../themes/styles';\nimport { LdI18NextMixin, LdTranslate } from '../../ld-application/i18n/ld-i18next';\n\n\n/**\n * @extends LitElement\n */\nexport class LdProgressBar extends (LitElement) {\n\n  // --------------------------------------------------------------------------------------\n  @property({ type: String }) max: number                                      = 0;\n  @property({ type: String }) current: number                                  = 0;\n  @property({ type: String }) suffixHeader: string                                  = '';\n\n\n  // ---------------------------------------------------------------------------------------\n  static get styles() {\n    return [css`\n      :host {\n        --progress-color: ${unsafeCSS(_THEME.colors.primary_color)};\n        --progress-background: #e3e3e3;\n      }\n      .progress-text {\n        font-size: 0.8rem;\n      }\n      progress[value] {\n        appearance: none;\n        border: none;\n        width: 100%;\n        height: 20px;\n        border-radius: 3px;\n      }\n      progress[value]::-webkit-progress-bar {\n        background-color: var(--progress-background);\n        border-radius: 8px;\n        padding: .3rem;\n      }\n      progress[value]::-moz-progress-bar {\n        background: var(--progress-color);\n        border-radius: 8px;\n      }\n      progress::-webkit-progress-value {\n        background: var(--progress-color);\n        border-radius: 8px;\n      }\n    `];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <p>${LdTranslate(this.suffixHeader)}</p>\n      <progress id=\"progress\" max=\"100\" value='${this.current*(100/this.max)}'></progress>\n      <p>${this.current} ${LdTranslate('modules.generic.of')} ${this.max} ${LdTranslate('modules.generic.downloaded')}</p>\n    `;\n  }\n}\n\ncustomElements.define('ld-progress-bar', LdProgressBar as unknown as CustomElementConstructor);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { css, unsafeCSS } from 'lit-element';\nimport { displayFlex, endJustified, horizontal, startJustified } from 'lit-flexbox-literals';\nimport { _THEME } from '../../../../themes/styles';\n\nexport const LdSettingsViewStyles = css`\n\n  ld-datepicker-config {\n    --ld-datepicker-show-component-border-bottom: none;\n  }\n  \n  .ld-variables-content-wrapper {\n    ${displayFlex}\n  }\n\n  .ld-variables-list-view {\n    width: 450px;\n    min-height: 155px;\n    margin-right: 5px;\n    ${horizontal}\n  }\n\n  .ld-variables-content-view {\n    ${horizontal}\n    width: 100%;\n  }\n\n  .ld-variables-content-view .no-selected-content {\n    text-align: center;\n    background-color: #FFFFFF;\n    padding: 16px;\n  }\n\n  .ld-variables-content-view .no-selected-content p {\n    color: #000;\n  }\n\n  .ld-variables-content-view .ld-variables-content-chart-container {\n    background-color: #FFFFFF;\n    text-align: center;\n    margin-bottom: 5px;\n    color: #000;\n  }\n\n  ld-buttonlist {\n    width: 25%;\n  }\n\n  ld-button {\n    display: block;\n    margin-top: 5px;\n  }\n\n  ::part(ld-part-button) {\n    display: block;\n    margin: 12px 0px;\n    background-color: ${unsafeCSS(_THEME.colors.button_background_color)};\n    color: ${unsafeCSS(_THEME.colors.primary_color)};\n    font-weight: bold;\n    text-align: center;\n  }\n  \n  .ld-collections-content-wrapper {\n    ${displayFlex}\n  }\n\n  .ld-collections-list-view {\n    width: 450px;\n    max-height: 500px;\n    margin-right: 5px;\n    ${horizontal}\n  }\n\n  .ld-collections-content-view {\n    ${horizontal}\n    width: 100%;\n  }\n\n  .ld-collections-content-view .no-selected-content {\n    text-align: center;\n    background-color: #FFFFFF;\n    padding: 16px;\n  }\n\n  .ld-collections-content-view .no-selected-content p {\n    color: #000;\n  }\n\n  .ld-collections-content-view .ld-collections-content-chart-container {\n    background-color: #FFFFFF;\n    text-align: center;\n    height: 460px;\n    margin-bottom: 5px;\n    color: #000;\n  }\n  \n  .ld-maintenance-content-wrapper {\n    ${displayFlex}\n  }\n\n  .ld-maintenance-list-view {\n    width: 350px;\n    max-height: 500px;\n    margin-right: 5px;\n    ${horizontal}\n  }\n\n  .ld-maintenance-content-view {\n    ${horizontal}\n    width: 100%;\n  }\n\n  .ld-maintenance-content-view .no-selected-content {\n    text-align: center;\n    background-color: #FFFFFF;\n    padding: 16px;\n  }\n\n  .ld-maintenance-content-view .no-selected-content p {\n    color: #000;\n  }\n\n  .ld-maintenance-content-view .ld-maintenance-content-chart-container {\n    background-color: #FFFFFF;\n    text-align: center;\n    height: 400px;\n    margin-bottom: 5px;\n    color: #000;\n  }\n\n    .ld-list-wrapper .headline {\n        background-color: #fff;\n        height: auto;\n        padding: 2px 5px;\n        ${displayFlex}\n        ${horizontal}\n        ${startJustified}\n        margin-bottom: 5px;\n        margin-right: 0px;\n    }\n\n    .ld-list-wrapper .headline > * {\n        -webkit-flex: 0 1 auto;\n        -ms-flex: 0 1 auto;\n        flex: 0 1 auto;\n        -webkit-align-self: auto;\n        -ms-flex-item-align: auto;\n        align-self: auto;\n    }\n\n    .ld-list-wrapper .headline h3 {\n        text-transform: uppercase;\n        font-size: 18px;\n        margin: 10px 15px;\n        color: ${unsafeCSS(_THEME.colors.primary_header_color)};\n    }\n\n    .ld-list-wrapper .headline h3::before {\n        content: \"/ \";\n        font-weight: 800;\n        color: ${unsafeCSS(_THEME.colors.primary_highlight_color)};\n    }\n\n    .ld-list-wrapper .headline ld-datepicker-config {\n        display: block;\n        margin-left: auto;\n        padding-top: 8px;\n        width: 600px !important;\n        max-width: 600px !important;\n        ${endJustified}\n    }\n\n    .ld-list-wrapper .headline .heading-icons {\n        ${endJustified}\n        margin-left: 20px;\n        margin-right: 20px;\n        padding-left: 20px;\n        padding-top: 6px;\n        border-left: 1px ${unsafeCSS(_THEME.colors.icons_color)} solid;\n    }\n\n  .description .head {\n    height: auto;\n    padding: 2px 5px;\n    ${displayFlex}\n    ${horizontal}\n    ${startJustified}\n    margin-bottom: 5px;\n    margin-right: 0px;\n  }\n\n  .description .head > * {\n    -webkit-flex: 0 1 auto;\n    -ms-flex: 0 1 auto;\n    flex: 0 1 auto;\n    -webkit-align-self: auto;\n    -ms-flex-item-align: auto;\n    align-self: auto;\n  }\n\n  #uploadForImport {\n    margin-bottom: 20px;\n    margin-top: 20px;\n    font-size: 20px;\n  }\n\n    #uploadForImport:before {\n        content: '1';\n    }\n\n    #selectMachinesForImport {\n        margin-bottom: 20px;\n        margin-top: 20px;\n        font-size: 20px;\n    }\n\n    #selectMachinesForImport:before {\n        content: '2';\n    }\n\n    .detail-container {\n        width: calc(100% - 50px);\n        height: auto;\n        padding: 0;\n        margin: 0 0 20px 0;\n        color: #000;\n    }\n\n    .description-container {\n        border: 1px solid #e0e0e0;\n        border-radius: 4px;\n        padding: 15px;\n        margin-bottom: 15px;\n        background-color: #f9f9f9;\n    }\n\n    .description-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 10px;\n    }\n\n    .description-title {\n        font-size: 14px;\n        font-weight: 500;\n        color: #555;\n    }\n\n    .remove-description-button {\n        background-color: #f44336;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        padding: 6px 12px;\n        cursor: pointer;\n        font-size: 12px;\n        transition: background-color 0.3s;\n    }\n\n    .remove-description-button:hover {\n        background-color: #d32f2f;\n    }\n\n    .descriptions-section {\n        margin: 20px 0;\n    }\n\n    .section-title {\n        font-size: 16px;\n        font-weight: 500;\n        color: #333;\n        margin-bottom: 15px;\n    }\n\n    .add-description-button:disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n    }\n\n\n    #selectMachinesForImport:before, #uploadForImport:before {\n        display: inline-block;\n        width: 20px;\n        height: 27px;\n        margin-right: 10px;\n        padding-left: 9px;\n        padding-top: 2px;\n        -moz-border-radius: 20px;\n        -webkit-border-radius: 20px;\n        border-radius: 20px;\n        color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n        background-color: ${unsafeCSS(_THEME.colors.primary_color)};\n    }\n\n    .description .head h3 {\n      text-transform: uppercase;\n      font-size: 18px;\n      margin: 10px 15px;\n      color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n    }\n\n    .actions .head {\n      height: auto;\n      padding: 2px 5px;\n      ${displayFlex}\n      ${horizontal}\n      ${startJustified}\n      margin-bottom: 5px;\n      margin-right: 0px;\n    }\n\n    .actions .head > * {\n      -webkit-flex: 0 1 auto;\n      -ms-flex: 0 1 auto;\n      flex: 0 1 auto;\n      -webkit-align-self: auto;\n      -ms-flex-item-align: auto;\n      align-self: auto;\n    }\n  \n  .space{\n    margin-top: 60px;\n  }\n\n    .actions .head h3 {\n      text-transform: uppercase;\n      font-size: 18px;\n      margin: 10px 15px;\n      color: ${unsafeCSS(_THEME.colors.primary_header_color)};\n    }\n\n    .ld-wrapper {\n        color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n        background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n        margin-bottom: 5px;\n        padding: 25px;\n        display: flex;\n        margin-right: 0px;\n    }\n\n    .description {\n      flex: 0 1 auto;\n      width: 45%;\n      margin-right: 10px;\n      background-color: ${unsafeCSS(_THEME.colors.app_drawer_background_color)};\n      color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n    }\n\n    .description p {\n      height: auto;\n      padding: 2px 5px;\n      ${displayFlex}\n      ${horizontal}\n      ${startJustified}\n      -webkit-flex: 0 1 auto;\n      -ms-flex: 0 1 auto;\n      flex: 0 1 auto;\n      -webkit-align-self: auto;\n      -ms-flex-item-align: auto;\n      align-self: auto;\n      font-size: 16px;\n      margin: 10px 15px;\n      color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n    }\n\n    .actions {\n      flex-direction: row;\n      width: 60%;\n    }\n\n    .actions p {\n      height: auto;\n      padding: 2px 5px;\n      ${displayFlex}\n      ${horizontal}\n      ${startJustified}\n      -webkit-flex: 0 1 auto;\n      -ms-flex: 0 1 auto;\n      flex: 0 1 auto;\n      -webkit-align-self: auto;\n      -ms-flex-item-align: auto;\n      align-self: auto;\n      font-size: 16px;\n      margin: 10px 15px;\n    }\n\n    paper-button {\n      right: 30px;\n      float: right;\n      display: block;\n      margin-top: 5px;\n      width: 25%;\n      display: block;\n      margin: 12px 0px;\n      background-color: ${unsafeCSS(_THEME.colors.button_background_color)};\n      color: ${unsafeCSS(_THEME.colors.primary_color)};\n      font-weight: bold;\n      text-align: center;\n    }\n\n    .report {\n      overflow-y: scroll;\n      height: 45%;\n    }\n\n    @media only screen and (min-width: 600px ) {\n      .disabledOnPad {\n        display: none;\n      }\n    }\n    @media only screen and (min-width: 1260px ) {\n      .disabledOnPad {\n        display: inline;\n      }\n    }\n`;\n\nexport default LdSettingsViewStyles;\n\n","/**\n * Copyright 2021 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@lifedata/ld-report';\nimport { html, LitElement, property }                               from 'lit-element';\nimport { TemplateResult }                                           from 'lit-html';\nimport { connect }                                                  from 'pwa-helpers/connect-mixin';\nimport { baseConfig as CONFIG, baseConfig }                         from '../../../../../auto-generated/config';\nimport { IFMachines, IFMachinesList }                               from '../../../../../js/interfaces';\nimport { extractUuidFromURI, forward, isUserSwEmployee, remapList } from '../../../../../js/LdGlobal';\nimport { BrowserFileProvider }                                      from '../../../../../js/services/FileProvider';\nimport { BrowserFormValidator }                                     from '../../../../../js/services/Validator';\nimport { LdTranslate }                                              from '../../../../ld-application/i18n/ld-i18next';\nimport {\n  clearSubmitRequest,\n  fileUpload,\n}                                                                   from '../../../../ld-redux/actions/ld-application-actions';\nimport {\n  emptyAssets,\n  loadAssets,\n}                                                                   from '../../../../ld-redux/actions/ld-assets-actions';\nimport {\n  downloadCSV,\n}                                                                   from '../../../../ld-redux/actions/ld-files-actions';\nimport {\n  loadUserInformation,\n}                                                                   from '../../../../ld-redux/actions/ld-users-actions';\nimport { store }                                                    from '../../../../ld-redux/ld-redux-store';\nimport { LdDialogs }                                                from '../../../ld-dialog/ld-dialogs';\nimport '../../../ld-dialog/ld-dialogs';\nimport '../../../ld-form/ld-form-wrapper';\nimport '../../../ld-progress-bar/progressbar';\nimport '../../../ld-tabs/ld-tabs';\nimport { LdSettingsViewStyles }                                     from '../styles';\n\nexport class LdSettingsList extends connect(store)(LitElement) {\n\n  fileProvider                                                                             = new BrowserFileProvider();\n  formValidator                                                                            = new BrowserFormValidator();\n  // --------------------------------------------------------------------------------------\n  @property({ type: Object, hasChanged: () => true }) _subModules: Array<Object>           = [];\n  @property({ type: Object, hasChanged: () => true }) _innerTabSelected: Array<Object>     = ['machine'];\n  @property({ type: Object, hasChanged: () => true }) dialog: TemplateResult               = html``;\n  @property({ type: String, hasChanged: () => true }) searchInput: string                  = '';\n  @property({ type: Object }) _userInformation: any                                        = null;\n  @property({ type: Object }) _formInputs: TemplateResult                                  = html``;\n  @property({ type: Object }) _formUploadFile: Array<Object>                               = [{\n    id: 'file',\n    type: 'file',\n    tabindex: 11,\n    accept: '.csv',\n    label: LdTranslate('modules.assets.machine.elements.service.upload.fields.file'),\n    validation: ['isNotEmpty', 'fileSizeLimit'],\n    errorMessage: LdTranslate('modules.assets.machine.elements.service.upload.error_messages.file_not_valid'),\n  }];\n  @property({ type: Object }) _checkboxInputs: TemplateResult                              = html``;\n  @property({ type: Object, hasChanged: () => true }) _machinesList: Array<IFMachinesList> = [];\n  @property({ type: Boolean, hasChanged: () => true }) _upload: boolean                    = false;\n  @property({ type: String, hasChanged: () => true }) selectedTab: string                  = '';\n  @property({ type: Object }) _innerTabs: Array<Object>                                    = [\n    {\n      key: '?machine',\n      title: LdTranslate(`modules.limit.tabs.machine`),\n      link: '/settings/limit/list?machine',\n    },\n    {\n      key: '?type',\n      title: LdTranslate('modules.limit.tabs.type'),\n      link: '/settings/limit/list?type',\n    },\n  ];\n  @property({ type: Object }) requestVariablesSuccess: Array<Object>                       = [];\n  @property({ type: Object }) requestVariablesError: Array<Object>                         = [];\n  @property({ type: Number }) numberOfRequest: number                                      = 0;\n  @property({ type: Number }) numberOfRequestSuccess: number                               = 0;\n  @property({ type: Number }) numberOfRequestError: number                                 = 0;\n  @property({ type: Number }) progressLength: number                                       = 0;\n  @property({ type: Object }) downloadQueue: Array<any>                                    = [];\n  @property({ type: Object }) finishedDownloads: Array<any>                                = [];\n  @property({ type: Object }) errorDownloads: Array<any>                          = [];\n  @property({ type: Boolean, hasChanged: () => true }) showUploadState: boolean            = false;\n  @property({ type: Boolean, hasChanged: () => true }) showDownloadState: boolean = false;\n\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdSettingsViewStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    if (this._userInformation != null) {\n      if (!isUserSwEmployee(this._userInformation)) {\n        forward(`/dashboard`);\n        return;\n      }\n    }\n    store.dispatch(loadUserInformation());\n    window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n\n  }\n\n  sendRequest(upload: boolean) {\n    store.dispatch(loadAssets(`${baseConfig.backend.services.assets.endpoints.machine_types}`, 'machineTypes'));\n    store.dispatch(loadAssets(`${baseConfig.backend.services.assets.endpoints.machines}`, 'machines'));\n    window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    this._upload = upload;\n  }\n\n  /**\n   * Template rendering method\n   *\n   * @returns {*}\n   */\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    this._createDialogHTMLOutput(this._upload, this.showUploadState);\n    return html`\n      <div class='ld-list-wrapper grid-container'>\n        <div class='headline'>\n          <h3>${LdTranslate(`modules.${this.selectedTab}.tabs.list`)}</h3>\n        </div>\n        <div class='ld-wrapper'>\n          <div class='description'>\n            <div class='head'>\n              <h3>${LdTranslate(`modules.${this.selectedTab}.text.title`)}</h3>\n            </div>\n            <p>${LdTranslate(`modules.${this.selectedTab}.text.text`)}</p>\n          </div>\n          <div class='actions'>\n            <div class='head'>\n              <h3>${LdTranslate(`modules.${this.selectedTab}.export.title`)}</h3>\n            </div>\n            <p>${LdTranslate(`modules.${this.selectedTab}.export.text`)}</p>\n            <paper-button id='startExport' @click='${() => this.sendRequest(false)}' raised>\n              ${LdTranslate(`modules.generic.buttons.export.${this.selectedTab}`)}\n            </paper-button>\n            <div class='head space'>\n              <h3>${LdTranslate(`modules.${this.selectedTab}.import.title`)}</h3>\n            </div>\n            <p>${LdTranslate(`modules.${this.selectedTab}.import.text`)}</p>\n\n            <paper-button id='startImport' @click='${() => this.sendRequest(true)}' raised>\n              ${LdTranslate(`modules.generic.buttons.import.${this.selectedTab}`)}\n            </paper-button>\n          </div>\n        </div>\n      </div>\n      ${this.dialog}\n    `;\n  }\n\n  /**\n   * Redux state management, handles what happens when the state changes\n   *\n   * @param state\n   */\n  // --------------------------------------------------------------------------------------\n  stateChanged(state: any) {\n    this._userInformation                                               = state.LdUsersReducer.info;\n    const { machineTypes, machines, finishedDownloads, errorDownloads } = state.LdAssetsReducer;\n    const { successUpload, resultError, errorId, successId }            = state.LdApplicationReducer;\n\n    if (machineTypes) {\n      this._createPaperDropdownMenu(machineTypes);\n    }\n\n    if (machines && this._machinesList !== remapList(machines)) {\n      this._machinesList = remapList(machines)!;\n      this._deselectParentElements();\n      this._createCheckboxesButton(this._machinesList);\n      this.showModal();\n      window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n    }\n\n    if (successUpload) {\n      this.numberOfRequestSuccess++;\n      if (!this.requestVariablesSuccess.includes(successId)) {\n        this.requestVariablesSuccess.push(successId);\n      }\n      this._checkIfAllRequestDone(this.numberOfRequestSuccess, this.numberOfRequestError, this.numberOfRequest);\n\n    }\n    if (resultError) {\n      this.numberOfRequestError++;\n      if (!this.requestVariablesError.includes(errorId)) {\n        this.requestVariablesError.push(errorId);\n      }\n      this._checkIfAllRequestDone(this.numberOfRequestSuccess, this.numberOfRequestError, this.numberOfRequest);\n    }\n\n    if (this.downloadQueue.length > 0) {\n      this._checkDownloads(finishedDownloads, errorDownloads);\n    }\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  createDialogHtml(_contentRenderViews: Array<TemplateResult>, confirmButtonText: string, upload: boolean) {\n    return html`\n      <ld-dialogs\n        dismissText='${LdTranslate('modules.settings.button.dismiss')}'\n        confirmText='${confirmButtonText}'\n        name=''\n        bigPopup\n        @accept-clicked='${() => upload ? this.uploadFiles() : this.downloadFiles()}'\n        @decline-clicked='${() => this.closeModal()}'\n      >\n        <h3>\n          ${upload ? LdTranslate(`modules.${this.selectedTab}.tabs.listImport`) : LdTranslate(`modules.${this.selectedTab}.tabs.listDownload`)}</h3>\n        ${_contentRenderViews}\n      </ld-dialogs>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  closeModal() {\n    const deleteDialog: LdDialogs = this.shadowRoot?.querySelector('ld-dialogs')!;\n    deleteDialog?.closeDialog();\n    this._resetValues();\n  }\n\n  // --------------------------------------------------------------------------------------\n  showModal() {\n    const dialog: LdDialogs | null | undefined = this.shadowRoot?.querySelector('ld-dialogs');\n    if (dialog?.shadowRoot?.querySelector('dialog')?.getAttribute('open') == null) {\n      dialog?.openDialog();\n    }\n  }\n\n\n  /**\n   * Creates the paper-dropdown-menu for the machineType selection\n   *\n   * @param {array} machineTypes\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _createPaperDropdownMenu(machineTypes: Array<string>) {\n    this._formInputs = html`\n      <paper-dropdown-menu tabindex='1' id='formFieldMachineType' label='Machine type'>\n        <paper-listbox\n          label='Machine type'\n          id='machine-type-selection-list'\n          slot='dropdown-content'\n          class='dropdown-content'\n          attr-for-selected='mid'\n          @click='${() => this._selectedDropdown()}'>\n          ${this._injectMachineTypePaperItemValues(machineTypes)}\n        </paper-listbox>\n      </paper-dropdown-menu>\n    `;\n  }\n\n  /**\n   * Create the Dropdowns for a dropdown field the array must have id and name\n   * @param {object} value\n   * @return {array} paperItems\n   */\n  // --------------------------------------------------------------------------------------\n  _injectMachineTypePaperItemValues(value: Array<string>) {\n    const paperItems = [];\n    if (value != null && value.length > 0) {\n      value.sort();\n\n      value.forEach(item => {\n        paperItems.push(html`\n          <paper-item mid='${item}'>${this._truncateFullName(item)}</paper-item>`);\n      });\n    } else {\n      paperItems.push(html`\n        <paper-item selected mid='nodata'>${LdTranslate('modules.generic.noData')}</paper-item>`);\n    }\n    return paperItems;\n  }\n\n  /**\n   * Truncates the full string to a maximum length of 80 characters\n   * @param item\n   * @returns {string|*}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _truncateFullName(item: string): string {\n    let name: string;\n    name = item;\n    return (name.length > 80) ? `${name.substring(0, 80)}\\u2026` : name;\n  }\n\n  /**\n   * if child Checkbox ist selected\n   * @protected\n   * @param {CustomEvent | null} evt\n   * @returns void\n   */\n  // --------------------------------------------------------------------------------------\n  protected _deselectParentElements(): void {\n    const form             = this.shadowRoot?.querySelector('ld-report')?.shadowRoot?.querySelector('ld-form');\n    const allChildCheckbox = form?.shadowRoot?.querySelectorAll(`paper-checkbox`);\n\n    allChildCheckbox?.forEach(item => {\n      item.removeAttribute('checked');\n    });\n  }\n\n  /**\n   * create checkboxes and show only that wich are matching with the searchInput\n   * @returns {void}\n   * @private\n   * @param _machinesList\n   * @param searchInput\n   */\n  // --------------------------------------------------------------------------------------\n  _createCheckboxesButton(_machinesList: Array<IFMachinesList>) {\n    const searchInput: HTMLInputElement = this.shadowRoot?.querySelector('#Search')!;\n    let columnInputs: Array<object> = [];\n    const selectedFields                = this._checkForClickedCheckboxes();\n\n    const checkedInputs = this._createCheckedCheckbox(_machinesList, selectedFields, searchInput);\n    if (checkedInputs != null) {\n      columnInputs = checkedInputs;\n    }\n    _machinesList.forEach((item: IFMachinesList, num: number) => {\n      const [inputs, space] = this._createCheckbox(selectedFields, item, num, searchInput);\n      if (inputs != null) {\n        columnInputs.push(inputs, space);\n      }\n    });\n    this._checkboxInputs = html``;\n    setTimeout(() => {\n      this._checkboxInputs = html`\n        <ld-report class='report' .columnInputs='${columnInputs}'></ld-report>`;\n\n      if (searchInput != null) {\n        this._createDialogHTMLOutput(this._upload);\n      }\n    }, 1);\n  }\n\n  /**\n   * get all ids of Checked checkbox\n   * @returns {string|any}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _checkForClickedCheckboxes(): Array<IFMachines> {\n    const _reportForm: Element | null | undefined = this.shadowRoot?.querySelector('ld-report');\n    let _selectedFields                           = [];\n    if (_reportForm != null) {\n      //@ts-ignore\n      const _receivedFields = _reportForm.onButtonShowClick();\n      _selectedFields       = _receivedFields?.filter((obj: any) => obj.id !== 'space' && obj.value === true);\n\n    }\n    const uniqueFields = _selectedFields?.filter((selectedFields: IFMachines, index: number, self: any) => index === self.findIndex((p: IFMachines) => p.id === selectedFields.id));\n    return uniqueFields;\n  }\n\n  /**\n   * get id of the selected element from dropdown\n   * @returns {string| any}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _selectedDropdown(): string {\n    return this.shadowRoot?.querySelector('paper-item[aria-selected=\"true\"]')?.textContent!;\n  }\n\n  /**\n   * add new checkbox\n   * @param item\n   * @param num\n   * @returns {object}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _addCheckbox(item: IFMachinesList, num: number, checked: boolean = false): Object {\n    return {\n      type: 'checkbox',\n      id: `MachineVAR_${extractUuidFromURI(item.uri)}`,\n      label: item.name,\n      tabindex: num,\n      value: checked,\n      checked: checked,\n    };\n  }\n\n  /**\n   * create all need checkbox for the list\n   * @param selectedFields\n   * @param item\n   * @param num\n   * @param searchInput\n   * @returns {Array<Object>}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _createCheckedCheckbox(_machinesList: Array<IFMachinesList>, selectedFields: Array<IFMachines>, searchInput: HTMLInputElement | null): Array<Object> {\n    const element: HTMLInputElement = searchInput!;\n    let properties: Array<Object>   = [];\n    if (selectedFields != null && selectedFields?.length != 0 && searchInput != null) {\n      _machinesList.forEach((item: IFMachinesList, num: number) => {\n        selectedFields?.forEach((selection: IFMachines) => {\n          if (selection.id === `MachineVAR_${extractUuidFromURI(item.uri)}`) {\n            properties.push(this._addCheckbox(item, num, true), { type: 'space', id: 'space' });\n          }\n        });\n      });\n    }\n    return properties;\n  }\n\n\n  /**\n   * create all need checkbox for the list\n   * @param selectedFields\n   * @param item\n   * @param num\n   * @param searchInput\n   * @returns {Array<Object>}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _createCheckbox(selectedFields: Array<IFMachines>, item: IFMachinesList, num: number, searchInput: HTMLInputElement | null): Array<Object> {\n    const element: HTMLInputElement = searchInput!;\n    let found                       = false;\n    let properties: Array<Object>   = [];\n    if (selectedFields != null && selectedFields?.length != 0 && searchInput != null) {\n      selectedFields?.forEach((selection: IFMachines) => {\n        if (found) {\n          return;\n        }\n        if (selection.id === `MachineVAR_${extractUuidFromURI(item.uri)}`) {\n          found = true;\n        } else if (item.name.toLowerCase().includes(element.value.toLowerCase())) {\n          properties = [this._addCheckbox(item, num), { type: 'space', id: 'space' }];\n        }\n      });\n    } else if (searchInput != null && element.value !== '') {\n      if (item.name.toLowerCase().includes(element.value.toLowerCase())) {\n        properties = [this._addCheckbox(item, num), { type: 'space', id: 'space' }];\n      }\n    } else {\n      properties = [this._addCheckbox(item, num), { type: 'space', id: 'space' }];\n    }\n\n    return properties;\n  }\n\n  /**\n   * Download a selected file\n   * @returns {void}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  downloadFiles(): void {\n    let selectedFields;\n    this.downloadQueue     = [];\n    this.finishedDownloads = [];\n    this.errorDownloads = [];\n    const endpoint = this._selectEndpoint();\n    if (window.location.search === '?type') {\n      if (this._selectedDropdown() != null) {\n        this._toggleButton();\n        this.downloadQueue = [...this.downloadQueue, this._selectedDropdown()];\n        store.dispatch(downloadCSV(`${CONFIG.backend.services.limits.base_url}${CONFIG.backend.services.limits.endpoints.machine_types}/${this._selectedDropdown()}${endpoint}`, null, 'text/csv', this._selectedDropdown()));\n      }\n    } else {\n      selectedFields = this._checkForClickedCheckboxes();\n      if (selectedFields.length !== 0) {\n        this._toggleButton();\n        selectedFields?.forEach((item: any) => {\n          const machineId    = item.id.replace('MachineVAR_', '');\n          this.downloadQueue = [...this.downloadQueue, machineId];\n\n          store.dispatch(downloadCSV(`${CONFIG.backend.services.limits.base_url}${CONFIG.backend.services.limits.endpoints.machines}/${machineId}${endpoint}`, null, 'text/csv', machineId));\n        });\n      }\n    }\n  }\n\n  protected _toggleButton() {\n    const dialogs: LdDialogs = this.shadowRoot?.querySelector('ld-dialogs')!;\n    const startButton        = dialogs?.shadowRoot?.querySelector('paper-button.primary-action')!;\n    startButton.toggleAttribute('disabled');\n  }\n\n  /**\n   * Creates the html output for the dialog\n   * @returns {void}\n   * @private\n   * @param upload\n   * @param showUploadState\n   */\n  // --------------------------------------------------------------------------------------\n  _createDialogHTMLOutput(upload: boolean = false, showUploadState: boolean = false): void {\n    let _contentRenderViews = [];\n    if (showUploadState) {\n      this.dialog = this._showRequestSuccessMessage();\n    } else {\n      _contentRenderViews.push(this._createUploadForm(upload));\n\n      _contentRenderViews.push(html`\n        <ld-tabs innerTab .selected='${window.location.search != '' ? window.location.search : '?machine'}'\n                 .tabs='${this._innerTabs}' fallbackSelection='machine'></ld-tabs>\n      `);\n\n      switch (window.location.search) {\n        case '?type':\n          // Dropdown\n          _contentRenderViews.push(html`${this._formInputs}`);\n          break;\n        case '?machine':\n        default:\n          // Search\n          _contentRenderViews.push(this._createSearchFieldHTML());\n          //Checkbox\n          _contentRenderViews.push(html`${this._checkboxInputs}`);\n\n          if (this.downloadQueue.length > 0) {\n            _contentRenderViews.push(html`\n              <ld-progress-bar suffixHeader='modules.generic.download.file'\n                               current='${this.finishedDownloads.length}'\n                               max='${this.downloadQueue.length}'></ld-progress-bar>\n            `);\n          }\n          break;\n      }\n      this.dialog = this.createDialogHtml(_contentRenderViews, upload ? LdTranslate('modules.settings.button.import') : LdTranslate('modules.settings.button.download'), upload);\n    }\n  }\n\n  /**\n   * upload the file and check if the inputs are valid\n   * @returns {void}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  uploadFiles(): void {\n    let requestBody = '';\n    const endpoint = this._selectEndpoint();\n\n    const form       = this.shadowRoot?.querySelector('ld-form-wrapper#upload-form');\n    /**\n     * get form data\n     */\n    const formFields = this._formUploadFile.map((field: any) => {\n      const _domNode: HTMLInputElement = form?.shadowRoot?.querySelector(`#${field.id}`)!;\n      let _value;\n\n      if (field.type === 'file') {\n        //@ts-ignore\n        _value = _domNode.inputElement.inputElement.files[0];\n      }\n\n      return {\n        id: field.id,\n        key: field.key,\n        fieldDefinition: field,\n        domNode: _domNode,\n        value: _value,\n      };\n    });\n\n    const invalidFields = this.formValidator.validate(formFields);\n    if (invalidFields.length === 0 && (this._checkForClickedCheckboxes().length !== 0 || this._selectedDropdown() != null)) {\n      this.numberOfRequestSuccess = 0;\n      this.numberOfRequestError   = 0;\n      const { file }              = this.fileProvider.getFile(formFields);\n      let selectedFields;\n\n      if ((window.location.search === '?type')) {\n        const id             = this._selectedDropdown();\n        this.numberOfRequest = 1;\n        store.dispatch(fileUpload(`${CONFIG.backend.services.limits.base_url}${CONFIG.backend.services.limits.endpoints.machine_types}/${this._selectedDropdown()}${endpoint}`, file, id));\n      } else {\n        selectedFields       = this._checkForClickedCheckboxes();\n        this.numberOfRequest = selectedFields?.length;\n        selectedFields?.forEach((item: any, number: number) => {\n          store.dispatch(fileUpload(`${CONFIG.backend.services.limits.base_url}${CONFIG.backend.services.limits.endpoints.machines}/${item.id.replace('MachineVAR_', '')}${endpoint}`, file, item.id.replace('MachineVAR_', '')));\n        });\n      }\n      this.closeModal();\n      window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n\n    }\n  }\n\n  /**\n   * create upload form\n   * @returns {TemplateResult}\n   * @private\n   * @param upload\n   */\n  // --------------------------------------------------------------------------------------\n  _createUploadForm(upload: boolean): TemplateResult {\n    if (upload) {\n      return html`\n        <div id='uploadForImport'>${LdTranslate(`modules.${this.selectedTab}.upload.fields.file`)}</div>\n        <ld-form-wrapper id='upload-form' .formInputs='${this._formUploadFile}'></ld-form-wrapper>\n        <div\n          id='selectMachinesForImport'>\n          ${LdTranslate(`modules.${this.selectedTab}.import.machines.title`)}\n        </div>`;\n    } else {\n      return html``;\n    }\n  }\n\n  /**\n   * create a searchfield\n   * @returns {TemplateResult}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _createSearchFieldHTML(): TemplateResult {\n    return html`\n      <paper-input @keyup='${this.handleKeyup}'\n                   tab-index='1'\n                   name='search'\n                   id='Search'\n                   label='${LdTranslate('modules.search.callToAction')}'\n                   value='${this.searchInput}'\n                   class='red'></paper-input>`;\n\n  }\n\n  typeTimeout: any;\n\n  handleKeyup() {\n    clearTimeout(this.typeTimeout);\n    this.typeTimeout = setTimeout(() => {\n      this._createCheckboxesButton(this._machinesList);\n    }, 250);\n  }\n\n  /**\n   * Check if all upload request are done and create a dialog window\n   * @returns {void}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _checkIfAllRequestDone(numberOfRequestSuccess: number, numberOfRequestError: number, numberOfRequest: number): void {\n\n    if (numberOfRequestSuccess + numberOfRequestError === numberOfRequest) {\n      if (this.showDownloadState) {\n        this._toggleButton();\n      }      this.showUploadState = true;\n      this.downloadQueue = [];\n      window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n      setTimeout(() => {\n        this._upload = false;\n        this.showModal();\n        store.dispatch(clearSubmitRequest());\n      }, 50);\n    }\n  }\n\n  /**\n   * Dialog window for Success upload\n   * @returns {TemplateResult}\n   * @private\n   */\n  // --------------------------------------------------------------------------------------\n  _showRequestSuccessMessage(): TemplateResult {\n    const contentText = [];\n    contentText.push(html`<h3>\n      ${this.showDownloadState ? LdTranslate('modules.success.downloads') : LdTranslate('modules.success.upload')}</h3>`);\n    contentText.push(this._getNamesOfIds(this.showDownloadState ? this.finishedDownloads : this.requestVariablesSuccess, true));\n\n    contentText.push(html`<h3>\n      ${this.showDownloadState ? LdTranslate('modules.error.download') : LdTranslate('modules.error.upload')}</h3>`);\n    contentText.push(this._getNamesOfIds(this.showDownloadState ? this.errorDownloads : this.requestVariablesError, false));\n\n    return html`\n      <ld-dialogs\n        confirmText='${LdTranslate('modules.settings.button.ok')}'\n        name=''\n        bigPopup\n        @decline-clicked='${() => this.closeModal()}'\n        @accept-clicked='${() => this.closeModal()}'\n      >\n        ${contentText}\n      </ld-dialogs>\n    `;\n  }\n\n  protected _getNamesOfIds(requestVariables: Array<Object>, success: boolean): Array<Object> {\n    const contentText: Array<Object> = [];\n\n    if (window.location.search === '?type') {\n      requestVariables.forEach((item: any) => {\n        contentText.push(html`<p id='${success ? 'success' : 'error'}'>${item}</p>`);\n      });\n    } else {\n      requestVariables.forEach((item: any) => {\n        this._machinesList?.forEach((value: any) => {\n          if (extractUuidFromURI(value.uri) === item) {\n            contentText.push(html`<p id='${success ? 'success' : 'error'}'>${value.name}</p>`);\n          }\n        });\n      });\n    }\n    return contentText;\n  }\n\n  private _resetValues() {\n    this.downloadQueue                  = [];\n    this.finishedDownloads              = [];\n    this.errorDownloads = [];\n    this.requestVariablesSuccess        = [];\n    this.requestVariablesError          = [];\n    const searchInput: HTMLInputElement = this.shadowRoot?.querySelector('#Search')!;\n    if (searchInput != null) {\n      searchInput.value = '';\n    }\n    store.dispatch(emptyAssets());\n    store.dispatch(clearSubmitRequest());\n    this._deselectParentElements();\n    this.showUploadState   = false;\n    this.showDownloadState = false;\n  }\n\n  private _checkDownloads(finishedDownloads: any, errorDownloads: any) {\n    for (const pendingDownload of this.downloadQueue) {\n      const done  = finishedDownloads?.find((id: string) => id === pendingDownload);\n      const error = errorDownloads?.find((id: string) => id === pendingDownload);\n      const alreadyTrackedSuccess = this.finishedDownloads.find((id: string) => id === done);\n      const alreadyTrackedError   = this.errorDownloads.find((id: string) => id === error);\n\n      if (done && !alreadyTrackedSuccess) {\n        this.finishedDownloads = [...this.finishedDownloads, done];\n      }\n      if (error && !alreadyTrackedError) {\n        this.errorDownloads = [...this.errorDownloads, error];\n      }\n    }\n\n    this.showDownloadState = true;\n    this._checkIfAllRequestDone(this.finishedDownloads.length, this.errorDownloads.length, this.downloadQueue.length);\n  }\n\n  private _selectEndpoint(): string {\n    if (this.selectedTab === 'limit') {\n      return `${CONFIG.backend.services.limits.endpoints.table.limit}`;\n    } else {\n      return `${CONFIG.backend.services.limits.endpoints.table.alarms}`;\n    }\n  }\n}\n\ncustomElements.define('ld-settings-list', LdSettingsList as unknown as CustomElementConstructor);\n","import {css, customElement, html, LitElement, property, state} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {store} from '../../../../ld-redux/ld-redux-store';\nimport {forward, isUserSwEmployee} from '../../../../../js/LdGlobal';\nimport {LdTranslate} from '../../../../ld-application/i18n/ld-i18next';\nimport {LdPlatformModulesAssetsStyles} from '../../assets/styles';\nimport '@polymer/paper-fab/paper-fab';\nimport '@polymer/iron-icons/iron-icons';\nimport '../../../ld-grid/ld-grid';\nimport '../../../ld-tabs/ld-tabs';\nimport '../../assets/assets-map';\nimport '../../assets/assets-backbutton';\nimport '../../assets/assets-header';\nimport {LdBreadCrumb} from '../../../../ld-application/ld-breadcrumb';\nimport {emptyActiveVariable, loadVariables} from \"../../../../ld-redux/actions/ld-timeseries-actions\";\nimport {IFGridColumns, IFUserInformation, IFVariables} from \"../../../../../js/interfaces\";\n\n/**\n * @extends LitElement\n */\n@customElement('ld-variables-list')\nexport class LdVariablesList extends connect(store)(LitElement) {\n    @property({type: Boolean}) isSw: boolean = false;\n    @property({type: Object}) userInformation!: IFUserInformation;\n    @state() _variablesList: Array<IFVariables> | null = null;\n    @state() _isVariablesListLoading!: boolean;\n    @state() _gridColumns: Array<IFGridColumns> = [\n        {\n            id: 'namePrefix',\n            title: LdTranslate('modules.settings.variables.grid.name'),\n            filter: true,\n            sort: true,\n            initialSort: 'asc',\n        },\n        {\n            id: 'displayName',\n            title: LdTranslate('modules.settings.variables.grid.displayName'),\n            filter: true,\n            sort: true,\n            column_width: '8%',\n        },\n        {\n            id: 'dataType',\n            title: LdTranslate('modules.settings.variables.grid.datatype'),\n            filter: true,\n            sort: true,\n        },\n        {\n            id: 'chartType',\n            title: LdTranslate('modules.settings.variables.grid.chartType'),\n            filter: true,\n            sort: true,\n        },\n        {\n            id: 'icon',\n            title: '',\n            icon: {\n                title: LdTranslate('modules.variable.edit_form_title'),\n                src: 'create',\n                style: 'width:16px',\n            },\n            column_align: 'right',\n            visible_for_user_group: ['DEVELOPER', 'SUPERUSER'],\n            link: {\n                prefix: `/settings/variables/edit/`,\n                field: 'id',\n            },\n        },\n    ];\n    @state() _subModules: Array<Object> = [];\n\n    static get styles() {\n        return [LdPlatformModulesAssetsStyles, css`\n            :host {\n                display: flex;\n                flex-direction: row;\n                flex: auto;\n            }\n\n            .container {\n                flex: auto;\n                display: flex;\n                flex-direction: column;\n                margin-right: 50px;\n            }\n\n            .grid-container {\n                display: flex;\n                flex-direction: column;\n                flex: auto;\n            }\n\n            ld-assets-header {\n                margin: 20px 0;\n            }\n        `];\n    }\n\n\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        LdBreadCrumb.setBreadcrumb({\n            assetType: null,\n            assetID: null,\n            backButtonLink: null,\n        });\n        store.dispatch(emptyActiveVariable());\n    }\n\n    firstUpdated() {\n        if (this.userInformation != null) {\n            this.isSw = isUserSwEmployee(this.userInformation);\n        }\n        store.dispatch(loadVariables('', this.userInformation.role, 'visibilityType=ALL'));\n    }\n\n    constructor() {\n        super();\n        window.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    }\n\n    render() {\n        const addNew = [];\n        const show = [];\n\n        if (this.isSw) {\n            addNew.push(html`\n                <paper-fab class='fab-item-left'\n                           @click='${() => this._onAddNewVariablesButtonClick()}'\n                           icon='add'\n                           title='${LdTranslate('modules.variables.fab_title')}'>\n                </paper-fab>\n            `);\n        }\n\n        if (this._gridColumns != null && this._variablesList != null) {\n            show.push(html`\n                <ld-grid .userInformation='${this.userInformation}'\n                         .gridItems='${this._variablesList}'\n                         .gridColumns='${this._gridColumns}'\n                         ?loading='${this._isVariablesListLoading}'\n                         gridTitle='Variables list'\n                >\n                </ld-grid>\n            `);\n        }\n        return html`\n            ${addNew}\n            <div class='container'>\n                <div class='headline'>\n                    <h3>${LdTranslate(`modules.variables.tabs.list`)}</h3>\n                </div>\n                <div class='grid-container'>\n                    ${show}\n                </div>\n            </div>\n        `;\n    }\n\n    stateChanged(state: ReturnType<typeof store.getState>) {\n        const {\n            variablesList,\n            isVariablesListLoading,\n        } = state.LdTimeseriesReducer;\n        this._subModules = state.LdApplicationReducer.subModules;\n        this._isVariablesListLoading = isVariablesListLoading;\n\n        if (!isVariablesListLoading && variablesList && this._variablesList !== variablesList) {\n            this._variablesList = variablesList;\n\n            if (this._gridColumns) {\n                this._gridColumns?.forEach((item) => {\n                    if (item?.id === 'icon' && item.link) {\n                        item.link.prefix = `/settings/variables/edit/`;\n                    }\n                });\n            }\n\n            window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n        }\n    }\n\n    _onAddNewVariablesButtonClick() {\n        forward(`/settings/variables/new`);\n    }\n}","import {LdTranslate} from \"../../../../../ld-application/i18n/ld-i18next\";\n\n/**\n * Interface for field configuration\n */\nexport interface IFieldConfig {\n  /** Unique name of the field (used as ID) */\n  name: string;\n\n  /** Form field type */\n  type: 'input' | 'dropdown' | 'toggle';\n\n  /** Display label for the field */\n  label: string;\n\n  /** Options for dropdown fields */\n  options?: string[];\n\n  /** Validation rules (e.g. 'isNotEmpty', 'isInt', 'isEmail') */\n  validation?: string[];\n\n  /** Regex pattern for input validation */\n  pattern?: string;\n\n  /** Default value for the field */\n  defaultValue?: string | number | boolean;\n\n  /** Minimum value for numeric fields */\n  min?: number;\n\n  /** Maximum value for numeric fields */\n  max?: number;\n\n  /** Placeholder text for input fields */\n  placeholder?: string;\n\n  /** Whether the field is required */\n  required?: boolean;\n\n  /** Help text or description */\n  helpText?: string;\n\n  /** Whether the field should be disabled */\n  disabled?: boolean;\n}\n\n/**\n * Interface for data type-specific configurations\n */\nexport interface IDataTypeConfig {\n  nc_common?: IFieldConfig[];\n  nc_block?: IFieldConfig[];\n  plc?: IFieldConfig[];\n}\n\n/**\n * Interface for machine-type-specific configurations\n */\nexport interface IMachineTypeConfig {\n  [machineType: string]: IDataTypeConfig;\n}\n\n/**\n * Mapping of internal data types to backend 'type' values\n */\nexport const DATA_TYPE_TO_BACKEND_TYPE: { [key: string]: string } = {\n  'nc_common': 'nc',\n  'nc_block': 'nc',\n  'plc': 'plc'\n};\n\n/**\n * Configuration for all machine types and their data types\n */\nexport const MACHINE_TYPE_FIELD_CONFIGS: IMachineTypeConfig = {\n  '840dsl': {\n    nc_common: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: ['NckBool', 'NckUInt16', 'NckUInt32', 'NckInt16', 'NckInt32', 'NckFloat', 'NckDouble', 'NckUByte', 'NckByte', 'NckString'],\n        validation: ['isNotEmpty'],\n        defaultValue: 'NckBool',\n        required: true,\n        helpText: 'Select the broker data type for NC common'\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: ['BOOL', 'UWORD', 'WORD', 'DWORD', 'REAL', 'STRING', 'DOUBLE', 'FLOAT', 'CHAR', 'BYTE', 'SHORT', 'SIGNED_WORD', 'LONG', 'UNSIGNED_DWORD', 'SIGNED_DWORD'],\n        validation: ['isNotEmpty'],\n        defaultValue: 'BOOL',\n        required: true\n      },\n      {\n        name: 'address',\n        type: 'input',\n        label: 'Address',\n        validation: ['isNotEmpty'],\n        required: true,\n        placeholder: 'Enter address (State, opcmode)',\n        helpText: 'NC address path'\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        max: 10000,\n        validation: ['isInt'],\n        placeholder: '0'\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 0,\n        min: 0,\n        max: 3600,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '0'\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true,\n        helpText: 'Enable change detection'\n      }\n    ],\n    nc_block: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: [\"NckBool\",\"NckUByte\",\"NckByte\",\"NckInt16\",\"NckUInt16\",\"NckInt32\",\"NckUInt32\",\"NckDouble\",\"NckFloat\",\"NckString\"],\n        validation: ['isNotEmpty'],\n        defaultValue: 'NckFloat',\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: [\"BOOL\",\"CHAR\",\"BYTE\",\"WORD\",\"UWORD\",\"SHORT\",\"SIGNED_WORD\",\"DWORD\",\"UNSIGNED_DWORD\",\"LONG\",\"SIGNED_DWORD\",\"FLOAT\",\"REAL\",\"DOUBLE\",\"STRING\"],\n        validation: ['isNotEmpty'],\n        defaultValue: 'REAL',\n        required: true\n      },\n      {\n        name: 'nckArea',\n        type: 'input',\n        label: 'NCK Area',\n        placeholder: 'MainDrive',\n        validation: ['isNotEmpty'],\n        required: true,\n        helpText: 'Enter the NCK area (e.g., MainDrive)'\n      },\n      {\n        name: 'nckBlock',\n        type: 'input',\n        label: 'NCK Block',\n        placeholder: 'M',\n        validation: ['isNotEmpty'],\n        pattern: '^[A-Z]+$',\n        required: true,\n        helpText: 'Enter the NCK block identifier (uppercase letters only)'\n      },\n      {\n        name: 'unit',\n        type: 'input',\n        label: 'Unit',\n        defaultValue: 5,\n        min: 0,\n        max: 100,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '5'\n      },\n      {\n        name: 'row',\n        type: 'input',\n        label: 'Row',\n        defaultValue: 1,\n        min: 0,\n        max: 1000,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '1'\n      },\n      {\n        name: 'column',\n        type: 'input',\n        label: 'Column',\n        defaultValue: 37,\n        min: 0,\n        max: 1000,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '37'\n      },\n      {\n        name: 'rowCount',\n        type: 'input',\n        label: 'Row Count',\n        defaultValue: 1,\n        min: 1,\n        max: 100,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '1'\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        max: 10000,\n        validation: ['isInt'],\n        placeholder: '0'\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 0,\n        min: 0,\n        max: 3600,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '0'\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: 'size'\n      },\n\n    ],\n    plc: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: [\"PlcBool\",\"PlcUByte\",\"PlcByte\",\"PlcChar\",\"PlcInt16\",\"PlcUInt16\",\"PlcInt32\",\"PlcUInt32\",\"PlcFloat\",\"PlcString\"],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: [\"BOOL\",\"CHAR\",\"BYTE\",\"WORD\",\"UWORD\",\"SHORT\",\"SIGNED_WORD\",\"DWORD\",\"UNSIGNED_DWORD\",\"LONG\",\"SIGNED_DWORD\",\"FLOAT\",\"REAL\",\"DOUBLE\",\"STRING\"],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'address',\n        type: 'input',\n        label: 'Address',\n        placeholder: 'DB182.DBD2712',\n        validation: ['isNotEmpty'],\n        required: true,\n        helpText: 'Enter the PLC address (e.g., DB182.DBD2712)'\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 1,\n        min: 1,\n        max: 3600,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '1'\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ]\n  },\n  'sinumerikOne': {\n    nc_common: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: ['NckBool', 'NckUInt16', 'NckUInt32', 'NckInt16', 'NckInt32', 'NckFloat', 'NckDouble', 'NckUByte', 'NckByte', 'NckString'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: ['BOOL', 'UWORD', 'WORD', 'DWORD', 'REAL', 'STRING', 'DOUBLE', 'FLOAT', 'CHAR', 'BYTE', 'SHORT', 'SIGNED_WORD', 'LONG', 'UNSIGNED_DWORD', 'SIGNED_DWORD'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'address',\n        type: 'input',\n        label: 'Address',\n        validation: ['isNotEmpty'],\n        required: true,\n        placeholder: 'Enter address (State, opcmode)',\n        helpText: 'NC address path'\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt']\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 1,\n        min: 1,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ],\n    nc_block: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: ['NckBool', 'NckUInt16', 'NckUInt32', 'NckInt16', 'NckInt32', 'NckFloat', 'NckDouble', 'NckUByte', 'NckByte', 'NckString'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: ['BOOL', 'UWORD', 'WORD', 'DWORD', 'REAL', 'STRING', 'DOUBLE', 'FLOAT', 'CHAR', 'BYTE', 'SHORT', 'SIGNED_WORD', 'LONG', 'UNSIGNED_DWORD', 'SIGNED_DWORD'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'nckArea',\n        type: 'input',\n        label: 'NCK Area',\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'nckBlock',\n        type: 'input',\n        label: 'NCK Block',\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'unit',\n        type: 'input',\n        label: 'Unit',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'row',\n        type: 'input',\n        label: 'Row',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'column',\n        type: 'input',\n        label: 'Column',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'rowCount',\n        type: 'input',\n        label: 'Row Count',\n        defaultValue: 1,\n        min: 1,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt']\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 1,\n        min: 1,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ],\n    plc: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: ['PlcBool', 'PlcUInt16', 'PlcUInt32', 'PlcInt16', 'PlcInt32','PlcChar', 'PlcFloat', 'PlcUByte', 'PlcByte', 'PlcString'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: ['BOOL', 'UWORD', 'WORD', 'DWORD', 'REAL', 'STRING', 'DOUBLE', 'FLOAT', 'BYTE', 'SHORT', 'SIGNED_WORD', 'LONG', 'UNSIGNED_DWORD', 'SIGNED_DWORD'],\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'classicAddress',\n        type: 'input',\n        label: 'Address',\n        validation: ['isNotEmpty'],\n        required: true\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt']\n      },\n      {\n        name: 'symbolicAddress',\n        type: 'input',\n        label: 'Address',\n        required: false\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 1,\n        min: 1,\n        validation: ['isInt'],\n        required: true\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ],\n  },\n  's7-300': {\n    plc: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: [\"PlcUInt8\",\"PlcUInt16\",\"PlcUInt32\",\"PlcUInt64\",\"PlcInt8\",\"PlcInt16\",\"PlcInt32\",\"PlcInt64\",\"PlcFloat32\",\"PlcFloat64\",\"PlcChar8\",\"PlcChar16\",\"PlcString8\",\"PlcString16\"],        validation: ['isNotEmpty'],\n        defaultValue: 'PlcUInt8',\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: [\"BOOL\",\"CHAR\",\"BYTE\",\"WORD\",\"UWORD\",\"SHORT\",\"SIGNED_WORD\",\"DWORD\",\"UNSIGNED_DWORD\",\"LONG\",\"SIGNED_DWORD\",\"FLOAT\",\"REAL\",\"DOUBLE\",\"STRING\"],\n        validation: ['isNotEmpty'],\n        defaultValue: 'BOOL',\n        required: true\n      },\n      {\n        name: 'address',\n        type: 'input',\n        label: 'Address',\n        validation: ['isNotEmpty'],\n        required: true,\n        placeholder: 'DB182.DBD2712'\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '0'\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ]\n  },\n  's7-1500': {\n    plc: [\n      {\n        name: 'brokerDataType',\n        type: 'dropdown',\n        label: 'Broker Data Type',\n        options: ['PlcUInt8', 'PlcUInt16', 'PlcUInt32', 'PlcUInt64', 'PlcInt8','PlcInt16','PlcInt32', \"PlcInt64\",\"PlcFloat32\",\"PlcFloat64\",\"PlcChar8\",\"PlcChar16\",\"PlcString8\",\"PlcString16\"],\n        validation: ['isNotEmpty'],\n        defaultValue: 'PlcUInt8',\n        required: true\n      },\n      {\n        name: 'machineDataType',\n        type: 'dropdown',\n        label: 'Machine Data Type',\n        options: ['BOOL',\"CHAR\",\"BYTE\",\"WORD\",\"UWORD\",\"SHORT\",\"SIGNED_WORD\",\"DWORD\",\"UNSIGNED_DWORD\",\"LONG\",\"SIGNED_DWORD\",\"FLOAT\",\"REAL\",\"DOUBLE\",\"STRING\"],\n        validation: ['isNotEmpty'],\n        defaultValue: 'BOOL',\n        required: true\n      },\n      {\n        name: 'classicAddress',\n        type: 'input',\n        label: 'classicAddress',\n        required: false,\n        placeholder: 'DB182.DBD2712'\n      },\n      {\n        name: 'bufferSize',\n        type: 'input',\n        label: 'Buffer Size',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt']\n      },\n      {\n        name: 'symbolicAddress',\n        type: 'input',\n        label: 'symbolicAddress',\n        validation: ['isNotEmpty'],\n        required: true,\n        placeholder: 'DB182.DBD2712'\n      },\n      {\n        name: 'intervalInS',\n        type: 'input',\n        label: 'Interval (seconds)',\n        defaultValue: 0,\n        min: 0,\n        validation: ['isInt'],\n        required: true,\n        placeholder: '0'\n      },\n      {\n        name: 'onChange',\n        type: 'toggle',\n        label: 'On Change',\n        defaultValue: true\n      }\n    ]\n  },\n};\n\n\nexport function getFieldConfig(machineType: string, dataType: 'nc_common' | 'nc_block' | 'plc'): IFieldConfig[] | undefined {\n  return MACHINE_TYPE_FIELD_CONFIGS[machineType]?.[dataType];\n}\n\n\nexport function getAvailableMachineTypes(): string[] {\n  return Object.keys(MACHINE_TYPE_FIELD_CONFIGS);\n}\n\n\nexport function getAvailableDataTypes(machineType: string): string[] {\n  const config = MACHINE_TYPE_FIELD_CONFIGS[machineType];\n  return config ? Object.keys(config) : [];\n}\n\n\nexport function getBackendType(dataType: 'nc_common' | 'nc_block' | 'plc'): string {\n  return DATA_TYPE_TO_BACKEND_TYPE[dataType] || dataType;\n}\n\nexport function determineInternalDataType(machineData: any): 'nc_common' | 'nc_block' | 'plc' {\n  if (!machineData || typeof machineData !== 'object') {\n    return 'nc_common';\n  }\n\n  const backendType = machineData.type;\n\n  if (backendType === 'plc') {\n    return 'plc';\n  }\n\n  if (backendType === 'nc') {\n    if ('column' in machineData || 'nckArea' in machineData || 'nckBlock' in machineData) {\n      return 'nc_block';\n    }\n    return 'nc_common';\n  }\n  return 'nc_common';\n}\n","import {css} from \"lit\";\n\nexport const LdCommonStyles = css`\n    :host {\n        flex-direction: column;\n    }\n\n    .detail-container {\n        width: calc(100% - 50px);\n        height: auto;\n        padding: 0;\n        margin: 0 0 20px 0;\n        color: #000;\n    }\n\n    .description-container {\n        border: 1px solid #e0e0e0;\n        border-radius: 4px;\n        padding: 15px;\n        margin-bottom: 15px;\n        background-color: #f9f9f9;\n    }\n\n    .description-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 10px;\n    }\n\n    .description-title {\n        font-size: 14px;\n        font-weight: 500;\n        color: #555;\n    }\n\n    .remove-description-button {\n        background-color: #f44336;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        padding: 6px 12px;\n        cursor: pointer;\n        font-size: 12px;\n        transition: background-color 0.3s;\n    }\n\n    .remove-description-button:hover {\n        background-color: #d32f2f;\n    }\n\n    .descriptions-section {\n        margin: 20px 0;\n    }\n\n    .section-title {\n        font-size: 16px;\n        font-weight: 500;\n        color: #333;\n        margin-bottom: 15px;\n    }\n\n    .add-description-button:disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n    }\n\n`","import {store} from \"../../../ld-redux/ld-redux-store\";\nimport {clearSubmitRequest, deleteItem, newItem} from \"../../../ld-redux/actions/ld-application-actions\";\nimport {ThunkDispatch} from \"redux-thunk\";\nimport {Action} from \"redux\";\nimport {\n    IFDeployment,\n    IFDescriptionField,\n    IFFormFieldLocation,\n    IFLocationObject,\n    IFPageModules,\n    IFResponse\n} from \"../../../../js/interfaces\";\nimport {LdTranslate} from \"../../../ld-application/i18n/ld-i18next\";\nimport {LdDialogs} from \"../../ld-dialog/ld-dialogs\";\nimport {html, LitElement} from \"lit-element\";\nimport {baseConfig} from \"../../../../auto-generated/config\";\nimport {emptyActiveCollection, emptyActiveVariable} from \"../../../ld-redux/actions/ld-timeseries-actions\";\nimport {CONFIG, forward} from \"../../../../js/LdGlobal\";\nimport LdErrorHandler from \"../../../../js/LdErrorHandler\";\nimport {PaperInputElement} from \"@polymer/paper-input/paper-input\";\nimport {PaperDropdownMenuElement} from \"@polymer/paper-dropdown-menu/paper-dropdown-menu\";\nimport {nothing} from \"lit\";\nimport {IFieldConfig} from \"./ld-variables/configs\";\n\n\ntype LocalDispatch = ThunkDispatch<any, any, Action>;\n\nexport function handleErrors(that: any, result: IFDeployment, valueType: string, module: string) {\n    if (result != null && !that.successValue) {\n        let message = '';\n        if (result.status === 409 && valueType === 'new') {\n            setTimeout(() => {\n                const _replaceValue = `${that.itemFromForm?.displayName}`;\n                message = LdTranslate(`modules.errors.statusCodes.e_409_${module}.message`).replace('%replaceValue', _replaceValue);\n                that.notificationHandler.notify('error', message, 0);\n            }, 50)\n        }\n        that.successValue = true;\n        if (valueType === 'edit') {\n            message = LdTranslate(`modules.${module}.editError.message`);\n        } else if (valueType === 'new') {\n            message = LdTranslate(`modules.${module}.error.message`);\n        } else {\n            closeDeleteModal(that);\n            message = LdTranslate(`modules.errors.statusCodes.e_934.message_${module}`);\n            closeDeleteModal(that);\n        }\n        that.formIsBusy = false;\n        handleDeleteError(that, message);\n        store.dispatch(clearSubmitRequest());\n        that.successValue = null;\n    }\n}\n\nexport function showChangeModal(that: LitElement) {\n    const changeDialog = that.shadowRoot?.querySelector<LdDialogs>('#changeDialog');\n    changeDialog?.openDialog();\n}\n\nexport function closeDeleteModal(that: LitElement) {\n    const deleteDialog = that.shadowRoot?.querySelector<LdDialogs>('ld-dialogs');\n    deleteDialog?.closeDialog();\n}\n\nexport function showDeleteModal(that: LitElement) {\n    const deleteDialog = that.shadowRoot?.querySelector<LdDialogs>('ld-dialogs');\n    deleteDialog?.openDialog();\n}\n\nexport function closeChangeModal(that: any, shadowRoot: ShadowRoot | null) {\n    const changeDialog = shadowRoot?.querySelector<LdDialogs>('#changeDialog');\n    changeDialog?.closeDialog();\n    that.formIsBusy = false;\n}\n\nfunction handleDeleteError(that: any, message: string) {\n    that.notificationHandler.notify('error', message, 0, false);\n    store.dispatch(clearSubmitRequest());\n}\n\nexport function renderDescriptionInstance(that: any, description: IFDescriptionField, index: number) {\n    const availableLocales = getAvailableLocalesForInstance(that, description.locale);\n    const currentLocaleTitle = getLocalizedLocales().find((language: any) => language.id === description.locale)?.title || description.locale;\n\n    const formInputs: IFFormFieldLocation[] = [\n        {\n            id: 'locale',\n            type: 'dropdown',\n            tabindex: 100 + (index * 2),\n            label: LdTranslate('modules.common.new.fields.language'),\n            selected: description.locale,\n            class: 'dropdown-content',\n            value: availableLocales.map((language: any) => ({id: language.id, name: language.title})),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.common.new.error_messages.language'),\n        },\n        {\n            id: 'description',\n            type: 'input',\n            tabindex: 101 + (index * 2),\n            label: LdTranslate('modules.common.new.fields.descriptionText'),\n            value: description.value,\n            errorMessage: LdTranslate('modules.common.new.error_messages.descriptionText'),\n        }\n    ];\n\n    return html`\n        <div class=\"description-container\" data-description-id=\"${description.id}\">\n            <div class=\"description-header\">\n                \"description-title\">\n                ${LdTranslate('modules.common.new.fields.descriptions')} ${index + 1} - ${currentLocaleTitle}\n                </span>\n                ${that.descriptionInstances.length >= 1 ? html`\n                    <button class=\"remove-description-button\"\n                            @click=\"${() => removeDescriptionInstance(that, description.id)}\">\n                        ${LdTranslate('modules.common.new.buttons.removeDescription')}\n                    </button>\n                ` : ''}\n            </div>\n\n            <ld-form-wrapper\n                    id=\"descriptionWrapper-${description.id}\"\n                    @dropdown-changed='${(event: CustomEvent) => handleDescriptionDropdownChange(that, event, description.id)}'\n                    .formInputs='${formInputs}'>\n            </ld-form-wrapper>\n        </div>\n    `;\n}\n\nfunction removeDescriptionInstance(that: any, instanceId: string) {\n    that.descriptionInstances = that.descriptionInstances.filter((desc: any) => desc.id !== instanceId);\n}\n\nfunction getAvailableLocalesForInstance(that: any, currentLocale: string): Array<{ id: string, title: string }> {\n    const allLocales = getLocalizedLocales();\n    const usedLocales = new Set(\n        that.descriptionInstances\n            .map((description: any) => description.locale)\n            .filter((language: any) => language !== currentLocale));\n\n    return allLocales.filter((language: any) => !usedLocales.has(language.id));\n}\n\nfunction handleDescriptionDropdownChange(that: any, event: CustomEvent, descriptionId: string) {\n    const detail = event.detail;\n\n    if (detail.id === 'locale') {\n        const description = that.descriptionInstances.find((description: any) => description.id === descriptionId);\n        if (description) {\n            description.locale = detail.data;\n            that.requestUpdate();\n        }\n    }\n}\n\nfunction getLocalizedLocales() {\n    const _locales = baseConfig.i18n.availableLanguages;\n    const _translatedLocales: Array<{ id: string, title: string }> = [];\n\n    _locales.forEach(locale => {\n        _translatedLocales.push({\n            id: locale.id,\n            title: LdTranslate(`modules.locales.languages.${locale.id}`)\n        });\n    });\n\n    return _translatedLocales;\n}\n\nexport function hasAvailableLocales(that: any): boolean {\n    const allLocales = getLocalizedLocales();\n    const usedLocales = new Set(that.descriptionInstances.map((description: any) => description.locale));\n\n    const unusedLocales = allLocales.filter(l => !usedLocales.has(l.id));\n\n    return unusedLocales.length > 0;\n}\n\nexport function addDescriptionInstance(that: any) {\n    const instanceId = `desc-${that.nextDescriptionId++}`;\n    const availableLocales = getLocalizedLocales();\n\n    const usedLocales = new Set(that.descriptionInstances.map((description: any) => description.locale).filter(Boolean));\n    const unusedLocale = availableLocales.find(locale => !usedLocales.has(locale.id));\n\n    if (!unusedLocale && that.descriptionInstances.length > 0) {\n        that.notificationHandler.notify('warning', LdTranslate('modules.common.new.error_messages.allLocalesUsed'));\n        return;\n    }\n\n    const newDescription: IFDescriptionField = {\n        id: instanceId,\n        locale: '',\n        value: ''\n    };\n\n    that.descriptionInstances = [...that.descriptionInstances, newDescription];\n}\n\nexport function createDropdownList(list: Array<string>, module: string): Array<IFPageModules> {\n    const values: Array<IFPageModules> = [];\n\n    for (const item of list) {\n        values.push({\n            id: item,\n            name: LdTranslate(`modules.${module}.${item.toLowerCase()}`) || item\n        });\n    }\n    return values;\n}\n\nexport function newSuccess(that: any, addValue: IFLocationObject, isNewLoading: boolean, module: string) {\n    if (!isNewLoading && addValue) {\n        handleNewSuccess(that, that.itemFromForm.displayName, module);\n    }\n}\n\nfunction handleNewSuccess(that: any, displayName: string, module: string) {\n    that.formIsBusy = false;\n    if (that.successValue == null && !that._multiAdd) {\n        let message = LdTranslate(`modules.${module}.success.message`);\n        let notificationType = 'success';\n        that.notificationHandler.notify(notificationType, message);\n        savedData(that, module);\n        that._multiAdd = false;\n    } else if (that.successValue == null && that._multiAdd) {\n        that.successValue = true;\n        let message = LdTranslate(`modules.errors.statusCodes.e_933.message_${module}`).replace('%replaceValue', displayName);\n        let notificationType = 'success';\n        that.notificationHandler.notify(notificationType, message);\n        setTimeout(() => {\n            store.dispatch(clearSubmitRequest());\n            that.successValue = null;\n            that.nextInstanceId = 1;\n            that.descriptionInstances = [];\n            that.nextDescriptionId = 1;\n            that.showItemIdField = false;\n            that._multiAdd = false;\n            that.displayName = '';\n            that.machineTypeInstances = [];//nachschen wegen auch collections ob das probleme gibt\n\n            const baseForm = that.shadowRoot?.querySelector('#baseFieldsWrapper');\n            const formRoot = baseForm?.shadowRoot || baseForm;\n\n            if (formRoot) {\n                // If the ld-form-wrapper or an inner element contains a real <form>:\n                const nativeForm = formRoot.querySelector('form') as HTMLFormElement;\n                if (nativeForm) {\n                    nativeForm.reset();\n                }\n\n                // clear all text fields\n                const inputs = formRoot.querySelectorAll('paper-input, paper-input-element, input');\n                inputs.forEach((input: any) => {\n                    input.value = '';\n                    input.dispatchEvent(new Event('input', {bubbles: true, composed: true}));\n                    input.dispatchEvent(new Event('change', {bubbles: true, composed: true}));\n                });\n\n                // empty dropdown fields\n                const dropdowns = formRoot.querySelectorAll('paper-dropdown-menu, paper-listbox, vaadin-select, select');\n                dropdowns.forEach((dropdown: any) => {\n                    if ('selected' in dropdown) dropdown.selected = null;\n                    if ('value' in dropdown) dropdown.value = '';\n                    if ('selectedIndex' in dropdown) dropdown.selectedIndex = -1;\n\n                    dropdown.dispatchEvent(new Event('change', {bubbles: true, composed: true}));\n                });\n\n                // reset switchboxes\n                const checkboxes = formRoot.querySelectorAll('paper-checkbox, vaadin-checkbox, input[type=\"checkbox\"], paper-toggle-button');\n                checkboxes.forEach((cb: any) => {\n                    cb.checked = false;\n                    cb.dispatchEvent(new Event('change', {bubbles: true, composed: true}));\n                });\n            }\n            that.requestUpdate();\n        }, 10);\n    }\n}\n\nexport function editSuccess(that: any, editValue: IFLocationObject, isEditLoading: boolean, module: string) {\n    if (!isEditLoading && editValue) {\n        handleEditSuccess(that, module);\n    }\n}\n\nexport function handleEditSuccess(that: any, module: string) {\n    that.formIsBusy = false;\n\n    if (that.successValue == null) {\n        let message = LdTranslate(`modules.${module}.editSuccess.message`);\n        that.notificationHandler.notify('success', message);\n        that.successValue = true;\n        savedData(that, module);\n    }\n}\n\nexport function savedData(that: any, module: string) {\n    that.successValue = null;\n    jumpToLine(that, module);\n}\n\nexport function jumpToLine(that: any, module: string) {\n    (store.dispatch as LocalDispatch)(clearSubmitRequest());\n\n    if (module === 'collection' || module === 'collections') {\n        (store.dispatch as LocalDispatch)(emptyActiveCollection());\n    } else if (module === 'variable' || module === 'variables') {\n        (store.dispatch as LocalDispatch)(emptyActiveVariable());\n    } else {\n        console.warn(`Unknown module: ${module}`);\n    }\n    that.successValue = null;\n    forward(`/settings/${module}/list`);\n}\n\nexport function handleDelete(that: any, module: string, itemDelete: IFResponse) {\n    if (itemDelete && that.successValue == null) {\n        that.successValue = true;\n        let message = LdTranslate(`modules.success.statusCodes.s_936.message_${module}`).replace('%replaceValue', that.displayName); //ld noch bei en und default hinzufügen\n        let notificationType = 'success';\n        that.notificationHandler.notify(notificationType, message);\n        closeDeleteModal(that);\n        jumpToLine(that, module);\n    }\n}\n\nexport function onFormButtonCancel(that: any, module: string) {\n    (store.dispatch as LocalDispatch)(clearSubmitRequest());\n    LdErrorHandler._handleError('cancel_current_action');\n    that.informationLoaded = false;\n    jumpToLine(that, module);\n}\n\nexport function renderDescriptionSection(that: any) {\n    const isLocaleAvailable = hasAvailableLocales(that);\n\n    return html`\n        <div class=\"descriptions-section\">\n            <div class=\"section-title\">\n                ${LdTranslate('modules.common.new.fields.descriptions')}\n            </div>\n\n            ${that.descriptionInstances.map((desc: any, index: number) => renderDescriptionInstance(that, desc, index))}\n\n            <button\n                    class=\"add-description-button\"\n                    ?disabled=\"${!isLocaleAvailable}\"\n                    @click=\"${() => addDescriptionInstance(that)}\"\n            >\n                <iron-icon icon=\"add\"></iron-icon>\n                ${LdTranslate('modules.common.new.buttons.addDescription')}\n            </button>\n        </div>\n    `;\n}\n\nexport function getVisibilityTypeField(isEdit: boolean, item: any, tabindex: number, module: string): IFFormFieldLocation {\n    return {\n        id: 'visibilityType',\n        type: 'dropdown',\n        tabindex: tabindex,\n        label: LdTranslate('modules.common.new.fields.visibilityType'),\n        selected: isEdit && item ? item.visibilityType : '',\n        class: 'dropdown-content',\n        value: createDropdownList(['INTERNAL', 'EXTERNAL'], module),\n        validation: ['isNotEmpty'],\n        errorMessage: LdTranslate('modules.common.new.error_messages.visibilityType'),\n    };\n}\n\nexport function renderDeleteButtonIfNeeded(that: any, module: string) {\n    if (that.editForm) {\n        return html`\n            <ld-delete\n                    titleText='${LdTranslate(`modules.${module}.new.buttons.delete`)}'\n                    @delete-clicked='${() => showDeleteModal(that)}'\n                    innerText='${LdTranslate(`modules.${module}.new.buttons.delete`)}'>\n            </ld-delete>\n        `;\n    }\n    return null;\n}\n\nexport function getButtons(that: any) {\n    if (that.editForm) {\n        return html`\n            <paper-button ?disabled='${that.formIsBusy}'\n                          tabindex='7'\n                          id='saveButton'\n                          @tap='${() => that.onFormButtonSave()}' raised>\n                ${LdTranslate('modules.assets.generic.new.buttons.save')}\n            </paper-button>\n        `;\n    } else {\n        return html`\n            <paper-button ?disabled=\"${that.formIsBusy}\"\n                          tabindex='7'\n                          id='saveButton'\n                          @tap='${() => that.onFormButtonSave()}' raised>\n                ${LdTranslate('modules.assets.generic.new.buttons.add')}\n            </paper-button>\n            <paper-button ?disabled='${that.formIsBusy}'\n                          tabindex='8'\n                          id='addMultipleButton'\n                          class='primary-action'\n                          @tap='${() => _onFormButtonSaveAndAdd(that)}'\n                          raised>\n                ${LdTranslate('modules.assets.generic.new.buttons.addMultiple')}\n            </paper-button>\n        `;\n    }\n}\n\nfunction _onFormButtonSaveAndAdd(that: any) {\n    that._multiAdd = true;\n    that.onFormButtonSave();\n}\n\nexport function getTagsSetFromForm(form: any): Set<string> {\n    const tagsField = form.shadowRoot?.querySelector('#tags') as PaperInputElement;\n    if (!tagsField?.value) return new Set<string>();\n\n    const tagsArray = tagsField.value\n        .split(',')\n        .map(tag => tag.trim())\n        .filter(tag => tag.length > 0);\n\n    return new Set<string>(tagsArray);\n}\n\nexport function getToggleValue(form: any, id: string): boolean {\n    const toggle = form.shadowRoot?.querySelector(`#${id}`);\n    return toggle?.hasAttribute('checked') || false;\n}\n\nexport function getDescriptionValues(that: any): { [key: string]: string } {\n    const instances = that.descriptionInstances || [];\n\n    return instances.reduce((acc: any, desc: any) => {\n        const descForm = that.shadowRoot?.querySelector(`#descriptionWrapper-${desc.id}`);\n\n        if (descForm) {\n            const locale = getDropdownValue(descForm, 'locale');\n            const value = getInputValue(descForm, 'description');\n\n            if (locale && value) {\n                acc[locale] = value;\n            }\n        }\n\n        return acc;\n    }, {} as { [key: string]: string });\n}\n\nexport function getDropdownValue(form: any, id: string): string {\n    const field = getField(form, id) as PaperDropdownMenuElement;\n    return field?.querySelector('paper-listbox .iron-selected')?.getAttribute('cid') ?? '';\n}\n\nexport function getInputValue(form: any, id: string): string {\n    const field = getField(form, id) as PaperInputElement;\n    return field?.value?.trim() || '';\n}\n\nexport function getField(form: any, id: string): PaperInputElement | PaperDropdownMenuElement {\n    return form.shadowRoot?.querySelector(`#${id}`) as PaperInputElement | PaperDropdownMenuElement;\n}\n\nexport function handleFormUpdate(that: any, e: CustomEvent, itemId: string, module: string) {\n    if (!that.editForm && e.detail.id === 'checkboxShowId') {\n        const baseForm = that.shadowRoot?.querySelector('#baseFieldsWrapper');\n        if (!baseForm) return;\n\n        const indexOfItemId = baseForm.formInputs.findIndex((item: any) => item.id === itemId);\n        const lastIndex = baseForm.formInputs.length - 1;\n\n        if (indexOfItemId >= 0) {\n            that.showItemIdField = false;\n            baseForm.formInputs.splice(indexOfItemId, 2, {\n                id: 'checkboxShowId',\n                type: 'toggle',\n                tabindex: lastIndex,\n                checked: false,\n                label: LdTranslate(`modules.${module}.new.fields.showId`),\n            });\n        } else {\n            that.showItemIdField = true;\n            baseForm.formInputs.splice(lastIndex, 1, {\n                id: itemId,\n                type: 'input',\n                tabindex: lastIndex - 1,\n                label: LdTranslate(`modules.${module}.new.fields.${itemId}`),\n                value: '',\n                errorMessage: LdTranslate('modules.common.new.error_messages.invalidId'),\n            }, {\n                id: 'checkboxShowId',\n                type: 'toggle',\n                tabindex: lastIndex,\n                checked: true,\n                label: LdTranslate(`modules.${module}.new.fields.showId`),\n            });\n        }\n        baseForm.formInputs = [...baseForm.formInputs];\n    }\n}\n\nexport function getDeleteDialog(that: any, module: string, itemId: string) {\n    if (that.editForm) {\n        return html`\n            <ld-dialogs\n                    titleText='${LdTranslate('modules.asset.delete.confirmation.title').replace('%replaceValue', that.displayName)}'\n                    dismissText='${LdTranslate('modules.asset.delete.confirmation.dismiss')}'\n                    confirmText='${LdTranslate('modules.asset.delete.confirmation.confirm')}'\n                    name=''\n                    @accept-clicked='${() => deleteItemRequest(module, itemId)}'\n                    @decline-clicked='${() => closeDeleteModal(that)}'\n            ></ld-dialogs>\n        `;\n    } else {\n        return html``;\n    }\n}\n\nfunction deleteItemRequest(module: string, itemId: string) {\n    const multiTimelineEndpoints = CONFIG.backend.services.timeseries.endpoints.multi_timeline as any;\n    const moduleEndpointPath = multiTimelineEndpoints[module];\n    const baseUrl = `${moduleEndpointPath}/${itemId}`;\n    store.dispatch(deleteItem(baseUrl));\n}\n\nexport function getChangeDialog(that: any) {\n    if (that.editForm) {\n        return html`\n            <ld-dialogs\n                    id=\"changeDialog\"\n                    titleText='${LdTranslate('modules.asset.changes.confirmation.title')}'\n                    dismissText='${LdTranslate('modules.asset.delete.confirmation.dismiss')}'\n                    confirmText='${LdTranslate('modules.assets.generic.new.buttons.save')}'\n                    name=''\n                    @accept-clicked='${() => that.saveData(that.itemFromForm)}'\n                    @decline-clicked='${() => closeChangeModal(that, that.shadowRoot)}'\n            ></ld-dialogs>\n        `;\n    } else {\n        return html``;\n    }\n}\n\nexport function inputFieldDisplayName(that: any, getLabel: Function, getError: Function) {\n    return {\n        id: 'displayName',\n        type: 'input',\n        tabindex: 1,\n        label: getLabel('displayName'),\n        value: that.editForm && that.item ? that.item.displayName || '' : '',\n        errorMessage: getError('displayName'),\n    };\n}\n\nexport function toggleUiRelevant(that: any, getLabel: Function) {\n    return {\n        id: 'uiRelevant',\n        type: 'toggle',\n        tabindex: 8,\n        label: getLabel('uiRelevant'),\n        checked: that.editForm && that.item ? that.item.uiRelevant || false : false,\n    }\n}\n\nexport function inputFieldTags(that: any, getLabel: Function) {\n    return {\n        id: 'tags',\n        type: 'input',\n        tabindex: 10,\n        label: getLabel('tags'),\n        value: that.editForm && that.item?.tags ? Array.from(that.item.tags).join(', ') : '',\n        placeholder: getLabel('tagsPlaceholder'),\n    }\n}\n\nexport function checkAddCustomId(that: any, getLabel: Function, id: string, baseFields: IFFormFieldLocation[], getError: Function) {\n    if (!that.editForm) {\n        if (that.showItemIdField) {\n            baseFields.push({\n                id: id,\n                type: 'input',\n                tabindex: 11,\n                label: getLabel(id),\n                value: '',\n                errorMessage: getError(id),\n            });\n        }\n\n        baseFields.push({\n            id: 'checkboxShowId',\n            type: 'toggle',\n            tabindex: 12,\n            label: getLabel('showId'),\n            checked: that.showItemIdField,\n        });\n    }\n}\n\nexport function renderBaseFieldsOfItem(that: any, baseFields: IFFormFieldLocation[], itemId: string, module: string, isItemLoading: boolean) {\n    return html`\n        <ld-form-wrapper\n                id=\"baseFieldsWrapper\"\n                @toggle-changed='${(e: CustomEvent) => handleFormUpdate(that, e, itemId, module)}'\n                .formInputs='${baseFields}'\n                ?loading='${isItemLoading}'>\n        </ld-form-wrapper>\n\n        ${renderDescriptionSection(that)}\n    `;\n}\n\nexport function renderContent(that: any, module: string, itemId: string, renderMachineData: Function | undefined) {\n    const button = getButtons(that);\n    const dialog = getDeleteDialog(that, module, itemId);\n    const criticalChangeDialog = getChangeDialog(that);\n\n    return html`\n        <div class='detail-container'>\n            <ld-assets-header .headline='${that.headerTitle}' arrowDisabled='${true}'></ld-assets-header>\n        </div>\n\n        <div class='outer-container'>\n            <div class='inner-container'>\n                ${that.renderBaseFields()}\n\n\n                ${renderMachineData ? renderMachineData() : nothing}\n\n                <div class='button-alignment'>\n                    <div class='tertiary-form-actions'>\n                        ${renderDeleteButtonIfNeeded(that, module)}\n                    </div>\n                    <div class='primary-and-secondary-form-actions'>\n                        <paper-button tabindex='8' id='cancelButton'\n                                      @tap='${() => onFormButtonCancel(that, module)}' raised>\n                            ${LdTranslate('modules.users.new.buttons.cancel')}\n                        </paper-button>\n                        ${button}\n                    </div>\n                </div>\n            </div>\n        </div>\n        ${dialog}\n        ${criticalChangeDialog}\n    `;\n}\n\nexport function populateFieldByType(that: any, field: IFFormFieldLocation, config: IFieldConfig, value: any): void {\n    switch (config.type) {\n        case 'input':\n            that.populateInputField(field, config, value);\n            break;\n        case 'dropdown':\n            that.populateDropdownField(field, config, value);\n            break;\n        case 'toggle':\n            that.populateToggleField(field, config, value);\n            break;\n    }\n}\n\nexport function addNewItem(that: any, item: any, idParam: string, module: string) {\n    const baseForm = that.shadowRoot?.querySelector('#baseFieldsWrapper');\n    if (!baseForm) return;\n\n    const getField = (id: string) => baseForm.shadowRoot?.querySelector(`#${id}`) as PaperInputElement;\n    const itemIdField = getField(idParam);\n\n    // Prepare variable for backend\n    const preparedItem = that.prepareItemForBackend(item);\n\n    const multiTimelineEndpoints = CONFIG.backend.services.timeseries.endpoints.multi_timeline as any;\n    const moduleEndpointPath = multiTimelineEndpoints[module];\n    const baseUrl = `${CONFIG.backend.services.timeseries.base_url}${moduleEndpointPath}`;\n\n    if (itemIdField?.value?.trim()) {\n        const itemId = itemIdField.value.trim();\n\n        store.dispatch(newItem(\n            `${baseUrl}/${itemId}`,\n            preparedItem,\n            'new'\n        ));\n    } else {\n        store.dispatch(newItem(\n            baseUrl,\n            [preparedItem],\n            'new'\n        ));\n    }\n}","import {css, customElement, html, LitElement, property} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {store} from '../../../../../ld-redux/ld-redux-store';\nimport {CONFIG} from '../../../../../../js/LdGlobal';\nimport {LdTranslate} from '../../../../../ld-application/i18n/ld-i18next';\nimport {LdPlatformModulesAssetsStyles} from '../../../assets/styles';\nimport '../../../../ld-form/ld-form-wrapper';\nimport '../../../assets/assets-header';\nimport '@polymer/paper-toast/paper-toast';\nimport '../../../assets/assets-buttonlist/delete-button/ld-delete';\nimport validator from 'validator';\nimport {PaperInputElement} from \"@polymer/paper-input/paper-input\";\nimport {\n    IFDescriptionField,\n    IFFormFieldLocation,\n    IFLdReduxState,\n    IFMachineDataType,\n    IFMachineTypeInstance,\n    IFUserInformation,\n    IFVariables\n} from \"../../../../../../js/interfaces\";\nimport {emptyActiveVariable, loadVariableWithId} from \"../../../../../ld-redux/actions/ld-timeseries-actions\";\nimport {PaperDropdownMenuElement} from \"@polymer/paper-dropdown-menu/paper-dropdown-menu\";\nimport {ToastNotificationHandler} from \"../../../../../../js/services/Notifications\";\nimport {\n    editItem\n} from \"../../../../../ld-redux/actions/ld-application-actions\";\nimport {\n    determineInternalDataType,\n    getAvailableDataTypes,\n    getAvailableMachineTypes,\n    getBackendType,\n    getFieldConfig,\n    IFieldConfig\n} from '../configs';\nimport {LdCommonStyles} from \"../../common-styles\";\nimport {\n    checkAddCustomId,\n    closeChangeModal,\n    createDropdownList,\n    editSuccess,\n    getDescriptionValues,\n    getDropdownValue,\n    getInputValue,\n    getTagsSetFromForm,\n    getToggleValue,\n    getVisibilityTypeField,\n    handleDelete,\n    handleErrors,\n    inputFieldDisplayName,\n    inputFieldTags,\n    newSuccess,\n    renderBaseFieldsOfItem,\n    getField,\n    toggleUiRelevant,\n    renderContent,\n    populateFieldByType,\n    addNewItem,\n    showChangeModal\n} from \"../../common-func\";\n\nexport const PATTERN_EXISTING_ENTRY = '^[0-9A-Za-z_]+$';\nexport const PATTERN_NEW_ENTRY = '^[0-9A-Z_]+$';\n\n@customElement('ld-variable-form')\nexport class LdVariableFormView extends connect(store)(LitElement) {\n\n    @property({type: String}) variableId!: string;\n    @property({type: String}) displayName!: string;\n    @property({type: Boolean}) formIsBusy = false;\n    @property({type: Boolean}) editForm = false;\n    @property({type: String}) headerTitle!: string;\n    @property({type: Boolean}) isSingleVariableLoading = false;\n    @property({type: Object}) userInformation!: IFUserInformation;\n    @property({type: Object}) item: IFVariables | null = null;\n    @property({type: Object}) itemFromForm!: IFVariables;\n    @property({type: Boolean}) informationLoaded = false;\n    @property({type: Object}) notificationHandler!: ToastNotificationHandler;\n    @property({type: Array}) machineTypeInstances: IFMachineTypeInstance[] = [];\n    @property({type: Number}) nextInstanceId: number = 1;\n    @property({type: Array}) descriptionInstances: IFDescriptionField[] = [];\n    @property({type: Number}) nextDescriptionId: number = 1;\n    @property({type: Boolean}) showItemIdField: boolean = false;\n    @property({type: Boolean}) _multiAdd: boolean = false;\n\n    constructor() {\n        super();\n        dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    }\n\n    static get styles() {\n        return [LdPlatformModulesAssetsStyles, LdCommonStyles, css`\n\n            .machine-type-container {\n                border: 1px solid #e0e0e0;\n                border-radius: 4px;\n                padding: 20px;\n                margin-bottom: 20px;\n                position: relative;\n                background-color: #fafafa;\n            }\n\n            .machine-type-header {\n                display: flex;\n                justify-content: space-between;\n                align-items: center;\n                margin-bottom: 15px;\n            }\n\n            .machine-type-title {\n                font-size: 16px;\n                font-weight: 500;\n                color: #333;\n            }\n\n            .remove-machine-button {\n                background-color: #f44336;\n                color: white;\n                border: none;\n                border-radius: 4px;\n                padding: 8px 16px;\n                cursor: pointer;\n                font-size: 14px;\n                transition: background-color 0.3s;\n            }\n\n            .remove-machine-button:hover {\n                background-color: #d32f2f;\n            }\n\n            .add-machine-button, .add-description-button {\n                background-color: #4CAF50;\n                color: white;\n                border: none;\n                border-radius: 4px;\n                padding: 12px 24px;\n                cursor: pointer;\n                font-size: 14px;\n                margin: 20px 0;\n                display: flex;\n                align-items: center;\n                gap: 8px;\n                transition: background-color 0.3s;\n            }\n\n            .add-machine-button:hover, .add-description-button:hover {\n                background-color: #45a049;\n            }\n\n            .add-machine-button iron-icon, .add-description-button iron-icon {\n                --iron-icon-height: 20px;\n                --iron-icon-width: 20px;\n            }\n\n            .add-machine-button:disabled {\n                opacity: 0.5;\n                cursor: not-allowed;\n            }\n        `];\n    }\n\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        store.dispatch(emptyActiveVariable());\n    }\n\n    firstUpdated() {\n        if (this.editForm) {\n            store.dispatch(loadVariableWithId(`${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.variables}/${this.variableId}`, this.userInformation.role));\n        }\n    }\n\n    render() {\n        return renderContent(this, \"variables\", this.variableId, () => this.renderMachineTypeInstances());\n    }\n\n    // used trough that/this in common-func.ts, do not remove\n    renderBaseFields() {\n        const getLabel = (key: string) => LdTranslate(`modules.variables.new.fields.${key}`);\n        const getError = (key: string) => LdTranslate(`modules.variables.new.error_messages.${key}`);\n\n        const baseFields: IFFormFieldLocation[] = [\n            inputFieldDisplayName(this, getLabel, getError),\n            {\n                id: 'namePrefix',\n                type: 'input',\n                tabindex: 2,\n                pattern: this.editForm ? PATTERN_EXISTING_ENTRY : PATTERN_NEW_ENTRY,\n                value: this.editForm && this.item ? this.item.namePrefix || '' : '',\n                label: this.getNamePrefixLabel(this.editForm),\n                errorMessage: this.editForm ? LdTranslate('modules.variables.new.error_messages.namePrefixEdit') : LdTranslate('modules.variables.new.error_messages.namePrefix')\n            },\n            this.getChartTypeField(this.editForm, this.item, 3),\n            this.getMaxTimeField(this.editForm, this.item, 4),\n            this.getDataTypeField(this.editForm, this.item, 5),\n            getVisibilityTypeField(this.editForm, this.item, 6, \"common\"),\n            this.getShowInitialField(this.editForm, this.item, 7),\n            toggleUiRelevant(this, getLabel),\n            {\n                id: 'unit',\n                type: 'input',\n                tabindex: 9,\n                label: getLabel('unit'),\n                value: this.editForm && this.item ? this.item.unit || '' : '',\n                placeholder: getLabel('unitPlaceholder'),\n            },\n            inputFieldTags(this, getLabel)\n        ];\n\n        checkAddCustomId(this, getLabel, \"variableId\", baseFields, getError)\n        return renderBaseFieldsOfItem(this, baseFields, \"variableId\", \"variables\", this.isSingleVariableLoading)\n    }\n\n    getMachineTypeDisplayName(machineKey: string): string {\n        const keyToDisplayMap: { [key: string]: string } = {\n            '840dsl': 'SINUMERIK 840D SL',\n            'sinumerikOne': 'SINUMERIK ONE',\n            's7300': 'S7-300',\n            's71500': 'S7-1500',\n        };\n        return keyToDisplayMap[machineKey] || machineKey;\n    }\n\n    createBaseField(config: IFieldConfig, tabindex: number): IFFormFieldLocation {\n        const getLabel = (key: string) => LdTranslate(`modules.variables.new.fields.${key}`) || config.label;\n\n        const baseField: IFFormFieldLocation = {\n            id: config.name,\n            type: config.type,\n            tabindex: tabindex,\n            label: getLabel(config.name),\n        };\n\n        if (config.validation && config.validation.length > 0) {\n            baseField.validation = config.validation;\n        }\n\n        return baseField;\n    }\n\n    populateInputField(field: IFFormFieldLocation, config: IFieldConfig, value: any): void {\n        const getError = (key: string) => LdTranslate(`modules.variables.new.error_messages.${key}`) || `${config.label} is required`;\n\n        field.value = value !== undefined ? String(value) : String(config.defaultValue ?? '');\n        field.errorMessage = field.validation != null ? getError(config.name) : '';\n\n        if (config.pattern) {\n            field.pattern = config.pattern;\n        }\n        if (config.placeholder) {\n            field.placeholder = config.placeholder;\n        }\n    }\n\n    populateDropdownField(field: IFFormFieldLocation, config: IFieldConfig, value: any): void {\n        const getError = (key: string) => LdTranslate(`modules.variables.new.error_messages.${key}`) || `${config.label} is required`;\n\n        field.selected = value !== undefined ? String(value) : String(config.defaultValue ?? '');\n        field.class = 'dropdown-content';\n        field.value = createDropdownList(config.options || [], \"variables\");\n        field.errorMessage = getError(config.name);\n\n        if (config.disabled) {\n            field.disabled = true;\n        }\n    }\n\n    populateToggleField(field: IFFormFieldLocation, config: IFieldConfig, value: any): void {\n        field.checked = value !== undefined ? Boolean(value) : Boolean(config.defaultValue ?? false);\n    }\n\n    convertConfigToFormField(config: IFieldConfig, tabindex: number): IFFormFieldLocation {\n        const baseField = this.createBaseField(config, tabindex);\n        populateFieldByType(this, baseField, config, undefined);\n\n        return baseField;\n    }\n\n    renderMachineTypeInstances() {\n        const hasAvailableMachineTypes = this.hasAvailableMachineTypes();\n\n        return html`\n            ${this.machineTypeInstances.map((instance, index) => this.renderMachineTypeInstance(instance, index))}\n\n            <button\n                    class=\"add-machine-button\"\n                    ?disabled=\"${!hasAvailableMachineTypes}\"\n                    @click=\"${() => this.addMachineTypeInstance()}\"\n            >\n                <iron-icon icon=\"add\"></iron-icon>\n                ${LdTranslate('modules.variables.new.buttons.addMachineType')}\n            </button>\n        `;\n    }\n\n    private hasAvailableMachineTypes(): boolean {\n        const availableMachineTypes = getAvailableMachineTypes();\n\n        const usedMachineTypes = this.machineTypeInstances\n            .map(instance => instance.machineType)\n            .filter(type => type);\n\n        const unusedMachineTypes = availableMachineTypes.filter(\n            type => !usedMachineTypes.includes(type)\n        );\n\n        return unusedMachineTypes.length > 0;\n    }\n\n    removeMachineTypeInstance(instanceId: string) {\n        this.machineTypeInstances = this.machineTypeInstances.filter(\n            instance => instance.id !== instanceId\n        );\n\n        // Force explicit update\n        this.requestUpdate('machineTypeInstances');\n    }\n\n    stateChanged(state: IFLdReduxState) {\n        const {\n            result,\n            isEditLoading,\n            itemDelete,\n            addValue,\n            isNewLoading,\n            editValue,\n            valueType\n        } = state.LdApplicationReducer;\n        const {activeVariable, isSingleVariableLoading} = state.LdTimeseriesReducer;\n\n        handleErrors(this, result, valueType, \"variables\");\n        this.updateVariable(activeVariable, isSingleVariableLoading);\n        handleDelete(this, \"variables\", itemDelete);\n        newSuccess(this, addValue, isNewLoading, \"variables\");\n        editSuccess(this, editValue, isEditLoading, \"variables\");\n\n        // Important: Only close when we are no longer loading.\n        if (!isSingleVariableLoading && !isNewLoading && !isEditLoading) {\n            dispatchEvent(new Event('LdCloseLoadingSpinner'));\n        }\n    }\n\n    updateVariable(variable: IFVariables, isVariableLoading: boolean) {\n        this.isSingleVariableLoading = isVariableLoading;\n\n        if (!this.editForm || !variable) {\n            if (!this.editForm) {\n                this.informationLoaded = true;\n            }\n            dispatchEvent(new Event('LdCloseLoadingSpinner'));\n            return;\n        }\n\n        if (!this.itemFromForm && !this.informationLoaded && variable) {\n            this.informationLoaded = true;\n\n            // Convert tags array to Set if it exists\n            if (variable.tags && Array.isArray(variable.tags)) {\n                variable.tags = new Set(variable.tags);\n            }\n\n            this.item = variable;\n\n            this.loadMachineTypeInstancesFromVariable(variable);\n\n            if (variable.description) {\n                this.descriptionInstances = Object.entries(variable.description).map(([locale, value], index) => ({\n                    id: `desc-${index + 1}`,\n                    locale: locale,\n                    value: value\n                }));\n                this.nextDescriptionId = this.descriptionInstances.length + 1;\n            }\n\n            this.displayName = variable?.displayName ?? '';\n\n            this.requestUpdate();\n        }\n\n        dispatchEvent(new Event('LdCloseLoadingSpinner'));\n    }\n\n    prepareItemForBackend(variable: IFVariables): any {\n        // Create a deep copy to avoid mutating the original\n        const prepared: any = JSON.parse(JSON.stringify({\n            ...variable,\n            tags: variable.tags instanceof Set ? Array.from(variable.tags) : (variable.tags || [])\n        }));\n\n        // Remove internal fields\n        delete prepared.variableId;\n        delete prepared.id;\n\n        return prepared;\n    }\n\n    // used trough that/this in common-func.ts, do not remove\n    onFormButtonSave() {\n        this.formIsBusy = true;\n        const _allFieldsValid = this.validateForm();\n\n        if (_allFieldsValid) {\n            this.itemFromForm = this.getFormValues();\n            if (this.editForm) {\n\n                if (this.itemFromForm.namePrefix !== this.item?.namePrefix ||\n                    this.item?.dataType !== this.itemFromForm.dataType) {\n                    showChangeModal(this);\n                } else {\n                    this.saveData(this.itemFromForm);\n                }\n            } else {\n                addNewItem(this, this.itemFromForm, \"variableId\", \"variables\");\n            }\n        } else {\n            this.formIsBusy = false;\n        }\n    }\n\n    validateFormWrapper(form: any, isBaseForm: boolean): boolean {\n        if (!form) return false;\n\n        return isBaseForm\n            ? this.validateBaseForm(form)\n            : this.validateMachineForm(form);\n    }\n\n    validateBaseForm(form: any): boolean {\n        const fields = {\n            displayName: getField(form, 'displayName') as PaperInputElement,\n            namePrefix: getField(form, 'namePrefix') as PaperInputElement,\n            chartType: getField(form, 'chartType') as PaperDropdownMenuElement,\n            maxTime: getField(form, 'maxTime') as PaperDropdownMenuElement,\n            dataType: getField(form, 'dataType') as PaperDropdownMenuElement,\n            visibilityType: getField(form, 'visibilityType') as PaperDropdownMenuElement,\n            showInitial: getField(form, 'showInitial') as PaperDropdownMenuElement,\n            variableId: getField(form, 'variableId') as PaperInputElement\n        };\n\n        fields.displayName.invalid = validator.isEmpty(fields.displayName.value?.trim() || '');\n        fields.namePrefix.invalid = this.validateNamePrefix(fields.namePrefix.value?.trim() || '');\n        if (fields.chartType) fields.chartType.invalid = validator.isEmpty(getDropdownValue(form, \"chartType\"));\n        if (fields.maxTime) fields.maxTime.invalid = validator.isEmpty(getDropdownValue(form, \"maxTime\"));\n        if (fields.dataType) fields.dataType.invalid = validator.isEmpty(getDropdownValue(form, \"dataType\"));\n        if (fields.visibilityType) fields.visibilityType.invalid = validator.isEmpty(getDropdownValue(form, \"visibilityType\"));\n        if (fields.showInitial) fields.showInitial.invalid = !validator.isBoolean(getDropdownValue(form, \"showInitial\"));\n\n        let allValid = !fields.displayName.invalid &&\n            !fields.namePrefix.invalid &&\n            !fields.chartType.invalid &&\n            !fields.maxTime.invalid &&\n            !fields.dataType.invalid &&\n            !fields.visibilityType.invalid &&\n            !fields.showInitial.invalid;\n\n        if (fields.variableId && fields.variableId.value?.trim()) {\n            fields.variableId.invalid = !validator.isUUID(fields.variableId.value.trim());\n            allValid = allValid && !fields.variableId.invalid;\n        }\n\n        return allValid;\n    }\n\n    validateNamePrefix(value: string): boolean {\n        if (validator.isEmpty(value)) return true;\n\n        const pattern = this.editForm ? PATTERN_EXISTING_ENTRY : PATTERN_NEW_ENTRY;\n        return !validator.matches(value, pattern);\n    }\n\n    validateMachineForm(form: any): boolean {\n        const machineType = getField(form, 'machineType') as PaperDropdownMenuElement;\n        const machineTypeValue = getDropdownValue(form, 'machineType');\n\n        if (machineType) {\n            machineType.invalid = false;\n        }\n\n        if (!machineTypeValue) {\n            return true;\n        }\n\n        const customGetField = (id: string) => getField(form, id);\n        const customGetDropdownValue = (field: PaperDropdownMenuElement) => {\n            return field ? getDropdownValue(form, field.id) : '';\n        };\n        return this.validateMachineTypeFields(machineTypeValue, customGetField, customGetDropdownValue);\n    }\n\n    validateMachineTypeFields(\n        machineTypeValue: string,\n        getField: (id: string) => PaperInputElement | PaperDropdownMenuElement,\n        getDropdownValue: (field: PaperDropdownMenuElement) => string\n    ): boolean {\n        const dataTypeSelection = getField('dataTypeSelection') as PaperDropdownMenuElement;\n\n        if (!dataTypeSelection) {\n            return true;\n        }\n\n        dataTypeSelection.invalid = validator.isEmpty(getDropdownValue(dataTypeSelection));\n\n        if (dataTypeSelection.invalid) {\n            return false;\n        }\n\n        const dataTypeValue = getDropdownValue(dataTypeSelection) as 'nc_common' | 'nc_block' | 'plc';\n\n        const fieldConfigs = getFieldConfig(machineTypeValue, dataTypeValue);\n\n        if (!fieldConfigs) {\n            return true;\n        }\n\n        return this.validateConfigFields(fieldConfigs, getField, getDropdownValue);\n    }\n\n    validateConfigFields(fieldConfigs: IFieldConfig[], getField: (id: string) => PaperInputElement | PaperDropdownMenuElement, getDropdownValue: (field: PaperDropdownMenuElement) => string): boolean {\n        let allValid = true;\n\n        fieldConfigs.forEach((config: IFieldConfig) => {\n            const field = getField(config.name);\n            if (!field) return;\n\n            if (!config.validation || config.validation.length === 0) {\n                return;\n            }\n\n            const isValid = config.type === 'input'\n                ? this.validateInputField(field as PaperInputElement, config)\n                : this.validateDropdownField(field as PaperDropdownMenuElement, config, getDropdownValue);\n\n            allValid = allValid && isValid;\n        });\n\n        return allValid;\n    }\n\n    validateInputField(field: PaperInputElement, config: IFieldConfig): boolean {\n        const value = field.value?.trim() || '';\n        let isInvalid = false;\n\n        // Skip validation if field has no validation rules\n        if (!config.validation || config.validation.length === 0) {\n            field.invalid = false;\n            return true;\n        }\n\n        // Only validate if field is required OR has a value\n        const shouldValidate = config.required || value.length > 0;\n\n        if (!shouldValidate) {\n            field.invalid = false;\n            return true;\n        }\n\n        if (config.validation.includes('isNotEmpty')) {\n            isInvalid = validator.isEmpty(value);\n        }\n\n        if (config.validation.includes('isInt') && !isInvalid && value) {\n            const min = config.min == null ? Number.MIN_SAFE_INTEGER : config.min;\n            const max = config.max == null ? Number.MAX_SAFE_INTEGER : config.max;\n            isInvalid = !validator.isInt(value, {min, max});\n        }\n\n        if (config.pattern && !isInvalid && value) {\n            isInvalid = !validator.matches(value, new RegExp(config.pattern));\n        }\n\n        field.invalid = isInvalid;\n        return !isInvalid;\n    }\n\n    validateDropdownField(field: PaperDropdownMenuElement, config: IFieldConfig, getDropdownValue: (field: PaperDropdownMenuElement) => string): boolean {\n        const value = getDropdownValue(field);\n\n        // Skip validation if field has no validation rules\n        if (!config.validation || config.validation.length === 0) {\n            field.invalid = false;\n            return true;\n        }\n\n        // Only validate if field is required OR has a value\n        const shouldValidate = config.required || value.length > 0;\n\n        if (!shouldValidate) {\n            field.invalid = false;\n            return true;\n        }\n\n        const isInvalid = config.validation.includes('isNotEmpty') && validator.isEmpty(value);\n\n        field.invalid = isInvalid;\n        return !isInvalid;\n    }\n\n    getNamePrefixLabel(isEdit: boolean): string {\n        const label = LdTranslate('modules.variables.new.fields.namePrefix');\n        return isEdit ? `${label} ${LdTranslate('modules.variables.new.fields.hint')}` : label;\n    }\n\n    getChartTypeField(isEdit: boolean, variablesList: IFVariables | null, tabindex: number): IFFormFieldLocation {\n        return {\n            id: 'chartType',\n            type: 'dropdown',\n            tabindex: tabindex,\n            label: LdTranslate('modules.variables.new.fields.chartType'),\n            selected: isEdit && variablesList ? variablesList.chartType : '',\n            class: 'dropdown-content',\n            value: createDropdownList(['LINE', 'RECTANGLE', 'CATEGORICAL', 'AREA', 'BAR'], \"variables\"),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.variables.new.error_messages.chartType'),\n        };\n    }\n\n    getMaxTimeField(isEdit: boolean, variablesList: IFVariables | null, tabindex: number): IFFormFieldLocation {\n        return {\n            id: 'maxTime',\n            type: 'dropdown',\n            tabindex: tabindex,\n            label: LdTranslate('modules.variables.new.fields.maxTime'),\n            selected: isEdit && variablesList ? variablesList.maxTime : '',\n            class: 'dropdown-content',\n            value: createDropdownList(['TWO_WEEKS', 'ONE_MONTH', 'SIX_MONTHS', 'ONE_YEAR', 'TEN_YEARS'], \"variables\"),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.variables.new.error_messages.maxTime'),\n        };\n    }\n\n    getDataTypeField(isEdit: boolean, variablesList: IFVariables | null, tabindex: number): IFFormFieldLocation {\n        return {\n            id: 'dataType',\n            type: 'dropdown',\n            tabindex: tabindex,\n            label: isEdit\n                ? `${LdTranslate('modules.variables.new.fields.dataType')} ${LdTranslate('modules.variables.new.fields.hint')}`\n                : LdTranslate('modules.variables.new.fields.dataType'),\n            selected: isEdit && variablesList ? variablesList.dataType : '',\n            class: 'dropdown-content',\n            value: createDropdownList(['BOOLEAN', 'DOUBLE', 'FLOAT', 'INTEGER', 'LONG', 'STRING'], \"variables\"),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.variables.new.error_messages.dataType'),\n        };\n    }\n\n    getShowInitialField(isEdit: boolean, variablesList: IFVariables | null, tabindex: number): IFFormFieldLocation {\n        return {\n            id: 'showInitial',\n            type: 'dropdown',\n            tabindex: tabindex,\n            label: LdTranslate('modules.variables.new.fields.showInitial'),\n            selected: isEdit && variablesList ? variablesList.showInitial : '',\n            class: 'dropdown-content',\n            value: createDropdownList(['true', 'false'], \"variables\"),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.variables.new.error_messages.showInitial'),\n        };\n    }\n\n    validateForm(): boolean {\n        const baseFormValid = this.validateBaseFormWrapper();\n        const descriptionsValid = this.validateDescriptions();\n        const machineTypesValid = this.validateMachineTypes();\n\n        return baseFormValid && descriptionsValid && machineTypesValid;\n    }\n\n    validateBaseFormWrapper(): boolean {\n        const baseForm = this.shadowRoot?.querySelector('#baseFieldsWrapper') as any;\n        return baseForm ? this.validateFormWrapper(baseForm, true) : true;\n    }\n\n    validateDescriptions(): boolean {\n        const hasAnyDescription = this.hasAnyDescriptionContent();\n\n        if (hasAnyDescription) {\n            return this.validateFilledDescriptions();\n        } else {\n            this.clearDescriptionValidation();\n            return true;\n        }\n    }\n\n    hasAnyDescriptionContent(): boolean {\n        return this.descriptionInstances.some(desc => {\n            const descriptionData = this.getDescriptionData(desc.id);\n            return descriptionData.locale || descriptionData.description;\n        });\n    }\n\n    getDescriptionData(descriptionId: string): { locale: string; description: string } {\n        const descForm = this.shadowRoot?.querySelector(`#descriptionWrapper-${descriptionId}`) as any;\n\n        if (!descForm) {\n            return {locale: '', description: ''};\n        }\n\n        return {\n            locale: getDropdownValue(descForm, 'locale'),\n            description: getInputValue(descForm, 'description')\n        };\n    }\n\n    validateFilledDescriptions(): boolean {\n        let allValid = true;\n\n        this.descriptionInstances.forEach(desc => {\n            const isValid = this.validateSingleDescription(desc.id);\n            allValid = allValid && isValid;\n        });\n\n        return allValid;\n    }\n\n    validateSingleDescription(descriptionId: string): boolean {\n        const descForm = this.shadowRoot?.querySelector(`#descriptionWrapper-${descriptionId}`) as any;\n\n        if (!descForm) {\n            return true;\n        }\n\n        const localeField = getField(descForm, 'locale') as PaperDropdownMenuElement;\n        const descriptionField = getField(descForm, 'description') as PaperInputElement;\n\n        const locale = getDropdownValue(descForm, 'locale');\n        const description = getInputValue(descForm, 'description');\n\n        if (locale || description) {\n            localeField.invalid = validator.isEmpty(locale);\n            descriptionField.invalid = validator.isEmpty(description);\n            return !(localeField?.invalid ?? true) && !(descriptionField?.invalid ?? true);\n\n        } else {\n            if (localeField) localeField.invalid = false;\n            if (descriptionField) descriptionField.invalid = false;\n\n            return true;\n        }\n    }\n\n    clearDescriptionValidation(): void {\n        this.descriptionInstances.forEach(desc => {\n            const descForm = this.shadowRoot?.querySelector(`#descriptionWrapper-${desc.id}`) as any;\n\n            if (descForm) {\n                const localeField = getField(descForm, 'locale') as PaperDropdownMenuElement;\n                const descriptionField = getField(descForm, 'description') as PaperInputElement;\n\n                if (localeField) localeField.invalid = false;\n                if (descriptionField) descriptionField.invalid = false;\n            }\n        });\n    }\n\n    validateMachineTypes(): boolean {\n        if (this.machineTypeInstances.length === 0) {\n            return true;\n        }\n\n        let allValid = true;\n\n        this.machineTypeInstances.forEach((instance) => {\n            const machineForm = this.shadowRoot?.querySelector(`#machineWrapper-${instance.id}`) as any;\n\n            if (machineForm) {\n                const isValid = this.validateFormWrapper(machineForm, false);\n                allValid = allValid && isValid;\n            }\n        });\n\n        return allValid;\n    }\n\n    getFormValues(): IFVariables {\n        const baseForm = this.shadowRoot?.querySelector('#baseFieldsWrapper') as any;\n\n        if (!baseForm) {\n            return {} as IFVariables;\n        }\n\n        return {\n            ...this.getBaseFormValues(baseForm),\n            description: getDescriptionValues(this),\n            machine: this.getMachineValues()\n        } as IFVariables;\n    }\n\n    getBaseFormValues(baseForm: any): Partial<IFVariables> {\n        return {\n            displayName: getInputValue(baseForm, 'displayName'),\n            namePrefix: getInputValue(baseForm, 'namePrefix'),\n            chartType: getDropdownValue(baseForm, 'chartType'),\n            maxTime: getDropdownValue(baseForm, 'maxTime'),\n            dataType: getDropdownValue(baseForm, 'dataType'),\n            visibilityType: getDropdownValue(baseForm, 'visibilityType'),\n            showInitial: getDropdownValue(baseForm, 'showInitial') !== 'false',\n            uiRelevant: getToggleValue(baseForm, 'uiRelevant'),\n            unit: getInputValue(baseForm, 'unit'),\n            tags: getTagsSetFromForm(baseForm)\n        };\n    }\n\n    getMachineValues(): { [key: string]: any } {\n        return this.machineTypeInstances.reduce((acc, instance) => {\n            const machineForm = this.shadowRoot?.querySelector(`#machineWrapper-${instance.id}`) as any;\n\n            if (machineForm && instance.machineType && instance.dataType) {\n                const machineData = this.extractMachineData(machineForm, instance);\n\n                if (machineData) {\n                    if (acc[instance.machineType]) {\n                        if (!Array.isArray(acc[instance.machineType])) {\n                            acc[instance.machineType] = [acc[instance.machineType]];\n                        }\n                        acc[instance.machineType].push(machineData);\n                    } else {\n                        acc[instance.machineType] = machineData;\n                    }\n                }\n            }\n\n            return acc;\n        }, {} as { [key: string]: any });\n    }\n\n    extractMachineData(form: any, instance: IFMachineTypeInstance): any | null {\n        if (!instance.dataType) {\n            return null;\n        }\n\n        const fieldConfigs = getFieldConfig(\n            instance.machineType,\n            instance.dataType as 'nc_common' | 'nc_block' | 'plc'\n        );\n\n        if (!fieldConfigs) {\n            return null;\n        }\n\n        const machineData = fieldConfigs.reduce((acc: { [key: string]: any }, config: IFieldConfig) => {\n            const value = this.getConfigFieldValue(form, config);\n\n            if (value !== null) {\n                acc[config.name] = value;\n            }\n\n            return acc;\n        }, {});\n\n        machineData.type = getBackendType(instance.dataType as 'nc_common' | 'nc_block' | 'plc');\n\n        return machineData;\n    }\n\n    getConfigFieldValue(form: any, config: IFieldConfig): any {\n        switch (config.type) {\n            case 'input': {\n                const inputValue = getInputValue(form, config.name);\n                return config.validation?.includes('isInt')\n                    ? parseInt(inputValue) || config.defaultValue || 0\n                    : inputValue || config.defaultValue || '';\n            }\n            case 'dropdown':\n                return getDropdownValue(form, config.name) || config.defaultValue || '';\n\n            case 'toggle':\n                return getToggleValue(form, config.name);\n\n            default:\n                return null;\n        }\n    }\n\n    saveData(variables: IFVariables) {\n        if (this.editForm) {\n            closeChangeModal(this, this.shadowRoot);\n\n            // Prepare variable for backend\n            const preparedVariables = this.prepareItemForBackend(variables);\n\n            store.dispatch(editItem(\n                `${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.variables}/${this.variableId}`,\n                preparedVariables,\n                'edit'\n            ));\n        } else {\n            addNewItem(this, variables, \"variableId\", \"variables\")\n        }\n    }\n\n    getAvailableMachineTypesForInstance(currentMachineType: string): string[] {\n        const allMachineTypes = getAvailableMachineTypes();\n        const usedMachineTypes = this.machineTypeInstances\n            .map(instance => instance.machineType)\n            .filter(type => type && type !== currentMachineType);\n\n        return allMachineTypes.filter(type => !usedMachineTypes.includes(type));\n    }\n\n    updated(changedProperties: Map<string | number | symbol, unknown>) {\n        super.updated(changedProperties);\n\n        if (changedProperties.has('machineTypeInstances')) {\n            // Wait until the DOM is fully updated\n            this.updateComplete.then(() => {\n                requestAnimationFrame(() => {\n                    this.machineTypeInstances.forEach((instance, index) => {\n                        const wrapper = this.shadowRoot?.querySelector(`#machineWrapper-${instance.id}`) as any;\n                        if (wrapper) {\n                            const newInputs = this.getMachineTypeFormInputsForInstance(\n                                instance,\n                                100 * (index + 1)\n                            );\n\n                            // Only update if something has changed.\n                            if (JSON.stringify(wrapper.formInputs) !== JSON.stringify(newInputs)) {\n                                wrapper.formInputs = [...newInputs];\n                                wrapper.requestUpdate();\n                            }\n                        }\n                    });\n                });\n            });\n        }\n    }\n\n    addMachineTypeInstance(): void {\n        const availableMachineTypes = getAvailableMachineTypes();\n\n        const usedMachineTypes = this.machineTypeInstances\n            .map(instance => instance.machineType)\n            .filter(type => type);\n\n        const unusedMachineTypes = availableMachineTypes.filter(\n            type => !usedMachineTypes.includes(type)\n        );\n\n        if (unusedMachineTypes.length === 0) {\n            this.notificationHandler.notify(\n                'warning',\n                LdTranslate('modules.variables.new.error_messages.allMachineTypesUsed')\n            );\n            return;\n        }\n\n        const instanceId = `instance-${this.nextInstanceId++}`;\n        const newInstance: IFMachineTypeInstance = {\n            id: instanceId,\n            machineType: '',\n            dataType: '',\n            formInputs: [],\n            machineData: undefined\n        };\n\n        // Existing instances retain their data.\n        this.machineTypeInstances = [\n            ...this.machineTypeInstances.map(inst => ({...inst})),\n            newInstance\n        ];\n    }\n\n    renderMachineTypeInstance(instance: IFMachineTypeInstance, index: number) {\n        // Always generate fresh fields\n        const formInputs = this.getMachineTypeFormInputsForInstance(\n            instance,\n            100 * (index + 1)\n        );\n        const displayName = this.getMachineTypeDisplayName(instance.machineType);\n\n        return html`\n            <div class=\"machine-type-container\" data-instance-id=\"${instance.id}\">\n                <div class=\"machine-type-header\">\n        <span class=\"machine-type-title\">\n          ${LdTranslate('modules.variables.new.machineTypeInstance')} ${index + 1}\n          ${instance.machineType ? ` - ${displayName}` : ''}\n          ${instance.dataType ? ` (${instance.dataType})` : ''}\n        </span>\n                    ${this.machineTypeInstances.length >= 1 ? html`\n                        <button class=\"remove-machine-button\"\n                                @click=\"${() => this.removeMachineTypeInstance(instance.id)}\">\n                            ${LdTranslate('modules.variables.new.buttons.removeMachineType')}\n                        </button>\n                    ` : ''}\n                </div>\n\n                <ld-form-wrapper\n                        id=\"machineWrapper-${instance.id}\"\n                        @dropdown-changed='${(e: CustomEvent) => this.handleDropdownChange(e, instance.id)}'\n                        .formInputs='${[...formInputs]}'\n                        ?loading='${this.isSingleVariableLoading}'\n                        .key=\"${instance.id}-${instance.machineType}-${instance.dataType}\">\n                </ld-form-wrapper>\n            </div>\n        `;\n    }\n\n    handleDropdownChange(e: CustomEvent, instanceId: string | null) {\n        const detail = e.detail;\n\n        if (!instanceId) return;\n\n        const instanceIndex = this.machineTypeInstances.findIndex(inst => inst.id === instanceId);\n        if (instanceIndex === -1) return;\n\n        // Create a copy of the instance\n        const instance = {...this.machineTypeInstances[instanceIndex]};\n\n        if (detail.id === 'machineType') {\n            const newMachineType = detail.data;\n\n            const isAlreadyUsed = this.machineTypeInstances.some(\n                inst => inst.id !== instanceId && inst.machineType === newMachineType\n            );\n\n            if (isAlreadyUsed) {\n                this.notificationHandler.notify(\n                    'warning',\n                    LdTranslate('modules.variables.new.error_messages.machineTypeAlreadyUsed')\n                );\n\n                instance.machineType = '';\n                instance.dataType = '';\n                if (!this.editForm) {\n                    instance.machineData = undefined;\n                }\n\n                // Replace instance in array\n                this.machineTypeInstances = [\n                    ...this.machineTypeInstances.slice(0, instanceIndex),\n                    instance,\n                    ...this.machineTypeInstances.slice(instanceIndex + 1)\n                ];\n                return;\n            }\n\n            instance.machineType = newMachineType;\n            instance.dataType = '';\n            if (!this.editForm) {\n                instance.machineData = undefined;\n            }\n\n            // Replace instance in array\n            this.machineTypeInstances = [\n                ...this.machineTypeInstances.slice(0, instanceIndex),\n                instance,\n                ...this.machineTypeInstances.slice(instanceIndex + 1)\n            ];\n\n        } else if (detail.id === 'dataTypeSelection') {\n            instance.dataType = detail.data as IFMachineDataType;\n\n            // Replace instance in array\n            this.machineTypeInstances = [\n                ...this.machineTypeInstances.slice(0, instanceIndex),\n                instance,\n                ...this.machineTypeInstances.slice(instanceIndex + 1)\n            ];\n        }\n    }\n\n    loadMachineTypeInstancesFromVariable(variable: IFVariables) {\n        if (!variable?.machine || Object.keys(variable.machine).length === 0) {\n            this.machineTypeInstances = [];\n            return;\n        }\n\n        const machineData = variable.machine;\n        const machineKeys = Object.keys(machineData);\n        const instances: IFMachineTypeInstance[] = [];\n\n        machineKeys.forEach((machineKey) => {\n            const data = machineData[machineKey];\n            const dataType = determineInternalDataType(data);\n\n            const instanceId = `instance-${this.nextInstanceId++}`;\n\n            // Important: Save machineData as a copy\n            instances.push({\n                id: instanceId,\n                machineType: machineKey,\n                dataType: dataType,\n                formInputs: [],\n                machineData: JSON.parse(JSON.stringify(data)) // Deep copy\n            });\n        });\n\n        this.machineTypeInstances = instances;\n    }\n\n    convertConfigToFormFieldWithData(config: IFieldConfig, machineData: any, tabindex: number): IFFormFieldLocation {\n        const baseField = this.createBaseField(config, tabindex);\n\n        // Ensure that machineData exists\n        const value = machineData?.[config.name];\n\n        populateFieldByType(this, baseField, config, value);\n\n        return baseField;\n    }\n\n    getMachineTypeFormInputsForInstance(instance: IFMachineTypeInstance, startTabIndex: number): IFFormFieldLocation[] {\n        const fields: IFFormFieldLocation[] = [];\n        let tabIndex = startTabIndex;\n\n        const availableMachineTypes = this.getAvailableMachineTypesForInstance(instance.machineType);\n\n        fields.push({\n            id: 'machineType',\n            type: 'dropdown',\n            tabindex: tabIndex++,\n            label: LdTranslate('modules.variables.new.fields.machineType'),\n            selected: instance.machineType || '',\n            class: 'dropdown-content',\n            value: createDropdownList(availableMachineTypes, \"variables\"),\n            validation: ['isNotEmpty'],\n            errorMessage: LdTranslate('modules.variables.new.error_messages.machineType'),\n        });\n\n        if (instance.machineType) {\n            const availableDataTypes = getAvailableDataTypes(instance.machineType);\n\n            fields.push({\n                id: 'dataTypeSelection',\n                type: 'dropdown',\n                tabindex: tabIndex++,\n                label: LdTranslate('modules.variables.new.fields.dataTypeSelection'),\n                selected: instance.dataType || '',\n                class: 'dropdown-content',\n                value: createDropdownList(availableDataTypes, \"variables\"),\n                validation: ['isNotEmpty'],\n                errorMessage: LdTranslate('modules.variables.new.error_messages.dataTypeSelection'),\n            });\n\n            if (instance.dataType) {\n                const fieldConfigs = getFieldConfig(instance.machineType, instance.dataType as 'nc_common' | 'nc_block' | 'plc');\n\n                if (fieldConfigs) {\n                    // Always work with machineData in edit mode, if available.\n                    if (instance.machineData) {\n                        fieldConfigs.forEach((config: IFieldConfig) => {\n                            const field = this.convertConfigToFormFieldWithData(config, instance.machineData, tabIndex++);\n                            fields.push(field);\n                        });\n                    } else {\n                        fieldConfigs.forEach((config: IFieldConfig) => {\n                            const field = this.convertConfigToFormField(config, tabIndex++);\n                            fields.push(field);\n                        });\n                    }\n                }\n            }\n        }\n\n        return fields;\n    }\n}","import {css, customElement, html, LitElement, property, state} from \"lit-element\";\nimport {connect} from \"pwa-helpers/connect-mixin\";\nimport {store} from '../../../../ld-redux/ld-redux-store';\nimport {IFCollections, IFGridColumns, IFUserInformation, VisibilityType} from '../../../../../js/interfaces';\nimport {LdTranslate} from \"../../../../ld-application/i18n/ld-i18next\";\nimport {LdBreadCrumb} from \"../../../../ld-application/ld-breadcrumb\";\nimport {\n    emptyActiveCollection,\n    loadCollections,\n} from \"../../../../ld-redux/actions/ld-timeseries-actions\";\nimport {forward, isUserSwEmployee} from \"../../../../../js/LdGlobal\";\nimport LdPlatformModulesAssetsStyles from \"../../assets/styles\";\n\n@customElement(\"ld-collections-list\")\nexport class LdCollectionsList extends connect(store)(LitElement) {\n    @property({type: Boolean}) isSw: boolean = false;\n    @property({type: Object}) userInformation!: IFUserInformation;\n    @state() _collectionsList: Array<IFCollections> | null = null;\n    @state() _isCollectionListLoading!: boolean;\n    @state() _subModules: Array<Object> = [];\n    @state() _gridColumns: Array<IFGridColumns> = [\n        {\n            id: 'collectionName',\n            title: LdTranslate('modules.settings.collections.grid.collectionName'),\n            filter: true,\n            sort: true,\n            initialSort: 'asc'\n        },\n        {\n            id: 'displayName',\n            title: LdTranslate('modules.settings.collections.grid.displayName'),\n            filter: true,\n            sort: true\n        },\n        {\n            id: 'icon',\n            title: '',\n            icon: {\n                title: LdTranslate('modules.collections.edit_form_title'),\n                src: 'create',\n                style: 'width:16px'\n            },\n            column_align: 'right',\n            visible_for_user_group: ['DEVELOPER', 'SUPERUSER'],\n            link: {\n                prefix: `/settings/collections/edit/`,\n                field: 'id'\n            }\n        }\n    ]\n\n    static get styles() {\n        return [LdPlatformModulesAssetsStyles, css`\n            :host {\n                display: flex;\n                flex-direction: row;\n                flex: auto;\n            }\n\n            .container {\n                flex: auto;\n                display: flex;\n                flex-direction: column;\n                margin-right: 50px;\n            }\n\n            .grid-container {\n                display: flex;\n                flex-direction: column;\n                flex: auto;\n            }\n        `];\n    }\n\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        LdBreadCrumb.setBreadcrumb({\n            assetType: null,\n            assetID: null,\n            backButtonLink: null,\n        });\n        store.dispatch(emptyActiveCollection());\n\n    }\n\n    firstUpdated() {\n        if (this.userInformation != null) {\n            this.isSw = isUserSwEmployee(this.userInformation);\n        }\n        store.dispatch(loadCollections(this.userInformation.role, VisibilityType.All));\n    }\n\n    constructor() {\n        super();\n        globalThis.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    }\n\n    render() {\n        const addNewCollection = [];\n        const show = [];\n\n        if (this.isSw) {\n            addNewCollection.push(html`\n                <paper-fab class='fab-item-left'\n                           @click='${() => this._addNewCollectionButtonOnClick()}'\n                           icon='add'\n                           title='${LdTranslate('modules.collections.add_new_title')}'>\n                </paper-fab>\n            `);\n        }\n\n        if (this._gridColumns != null && this._collectionsList != null) {\n            show.push(html`\n                <ld-grid .userInformation='${this.userInformation}'\n                         .gridItems='${this._collectionsList}'\n                         .gridColumns='${this._gridColumns}'\n                         ?loading='${this._isCollectionListLoading}'\n                         gridTitle='Collections list'\n                >\n                </ld-grid>\n            `);\n        }\n        return html`\n            ${addNewCollection}\n            <div class='container'>\n                <div class='headline'>\n                    <h3>${LdTranslate(`modules.collections.tabs.list`)}</h3>\n                </div>\n                <div class='grid-container'>\n                    ${show}\n                </div>\n            </div>\n        `;\n    }\n\n    stateChanged(state: ReturnType<typeof store.getState>) {\n        const {\n            collectionsList,\n            isCollectionsListLoading,\n        } = state.LdTimeseriesReducer;\n        this._subModules = state.LdApplicationReducer.subModules;\n        this._isCollectionListLoading = isCollectionsListLoading;\n\n        const hasCollectionsLoaded = !isCollectionsListLoading && collectionsList;\n        const isNewCollectionsList = this._collectionsList !== collectionsList;\n\n\n        if (hasCollectionsLoaded && isNewCollectionsList) {\n            this._collectionsList = collectionsList;\n\n            if (this._gridColumns) {\n                this._gridColumns?.forEach((item) => {\n                    if (item?.id === 'icon' && item.link) {\n                        item.link.prefix = `/settings/collections/edit/`;\n                    }\n                });\n            }\n\n            globalThis.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n        }\n    }\n\n    _addNewCollectionButtonOnClick() {\n        forward('/settings/collections/new');\n    }\n}\n","import {css, customElement, LitElement, property} from \"lit-element\";\nimport {connect} from \"pwa-helpers/connect-mixin\";\nimport {store} from \"../../../../../ld-redux/ld-redux-store\";\nimport {\n    emptyActiveCollection, loadCollectionWithId\n} from \"../../../../../ld-redux/actions/ld-timeseries-actions\";\nimport {CONFIG} from \"../../../../../../js/LdGlobal\";\nimport {\n    IFCollections, IFDescriptionField, IFFormFieldLocation, IFLdReduxState,\n    IFUserInformation\n} from \"../../../../../../js/interfaces\";\nimport {LdTranslate} from \"../../../../../ld-application/i18n/ld-i18next\";\nimport {editItem} from \"../../../../../ld-redux/actions/ld-application-actions\";\nimport {ToastNotificationHandler} from \"../../../../../../js/services/Notifications\";\nimport {PaperInputElement} from \"@polymer/paper-input/paper-input\";\nimport {PaperDropdownMenuElement} from \"@polymer/paper-dropdown-menu/paper-dropdown-menu\";\nimport validator from \"validator\";\nimport LdPlatformModulesAssetsStyles from \"../../../assets/styles\";\nimport {\n    handleErrors,\n    editSuccess,\n    newSuccess,\n    handleDelete,\n    getVisibilityTypeField,\n    closeChangeModal,\n    getTagsSetFromForm,\n    getToggleValue,\n    getDescriptionValues,\n    getInputValue,\n    getDropdownValue,\n    inputFieldDisplayName,\n    toggleUiRelevant,\n    inputFieldTags,\n    checkAddCustomId,\n    renderBaseFieldsOfItem,\n    renderContent,\n    addNewItem, getField\n} from \"../../common-func\";\nimport {LdCommonStyles} from \"../../common-styles\";\n\n\n@customElement('ld-collection-form')\nexport class LdCollectionFormView extends connect(store)(LitElement) {\n    @property({type: String}) collectionId!: string;\n    @property({type: Boolean}) editForm = false;\n    @property({type: Object}) userInformation!: IFUserInformation;\n    @property({type: Boolean}) formIsBusy = false;\n    @property({type: Object}) itemFromForm!: IFCollections;\n    @property({type: Object}) item!: IFCollections;\n    @property({type: String}) displayName!: string;\n    @property({type: String}) headerTitle!: string;\n    @property({type: Boolean}) informationLoaded = false;\n    @property({type: Boolean}) isSingleCollectionLoading = false;\n    @property({type: Object}) notificationHandler!: ToastNotificationHandler;\n    @property({type: Array}) descriptionInstances: IFDescriptionField[] = [];\n    @property({type: Boolean}) showItemIdField: boolean = false;\n    @property({type: Number}) nextDescriptionId: number = 1;\n\n    static get styles() {\n        return [LdPlatformModulesAssetsStyles, LdCommonStyles, css`\n\n            .add-description-button {\n                background-color: #4CAF50;\n                color: white;\n                border: none;\n                border-radius: 4px;\n                padding: 12px 24px;\n                cursor: pointer;\n                font-size: 14px;\n                margin: 20px 0;\n                display: flex;\n                align-items: center;\n                gap: 8px;\n                transition: background-color 0.3s;\n            }\n\n            .add-description-button:hover {\n                background-color: #45a049;\n            }\n\n            .add-description-button iron-icon {\n                --iron-icon-height: 20px;\n                --iron-icon-width: 20px;\n            }\n        `];\n    }\n\n    constructor() {\n        super();\n        dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    }\n\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        store.dispatch(emptyActiveCollection());\n    }\n\n    firstUpdated() {\n        if (this.editForm) {\n            store.dispatch(loadCollectionWithId(`${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.collections}/${this.collectionId}?modelVersion=V2`, this.userInformation.role));\n        }\n    }\n\n    render() {\n        return renderContent(this, \"collections\", this.collectionId, undefined);\n    }\n\n    stateChanged(state: IFLdReduxState) {\n        const {\n            result,\n            isEditLoading,\n            itemDelete,\n            addValue,\n            isNewLoading,\n            editValue,\n            valueType\n        } = state.LdApplicationReducer;\n        const {activeCollection, isSingleCollectionLoading} = state.LdTimeseriesCollectionsReducer;\n\n        handleErrors(this, result, valueType, \"collections\");\n        this.updateCollection(activeCollection, isSingleCollectionLoading);\n        handleDelete(this, \"collections\", itemDelete);\n        newSuccess(this, addValue, isNewLoading, \"collections\");\n        editSuccess(this, editValue, isEditLoading, \"collections\");\n\n        // Important: Only close when we are no longer loading.\n        if (!isSingleCollectionLoading && !isNewLoading && !isEditLoading) {\n            dispatchEvent(new Event('LdCloseLoadingSpinner'));\n        }\n    }\n\n    updateCollection(collection: IFCollections, isCollectionLoading: boolean) {\n        this.isSingleCollectionLoading = isCollectionLoading;\n\n        if (!this.editForm || !collection) {\n            if (!this.editForm) {\n                this.informationLoaded = true;\n            }\n            dispatchEvent(new Event('LdCloseLoadingSpinner'));\n            return;\n        }\n\n        if (!this.informationLoaded && collection) {\n            this.informationLoaded = true;\n\n            // Convert tags array to Set if it exists\n            if (collection.tags && Array.isArray(collection.tags)) {\n                collection.tags = new Set(collection.tags);\n            }\n\n            this.item = collection;\n\n            if (collection.description) {\n                this.descriptionInstances = Object.entries(collection.description).map(([locale, value], index) => ({\n                    id: `desc-${index + 1}`,\n                    locale: locale,\n                    value: value\n                }));\n                this.nextDescriptionId = this.descriptionInstances.length + 1;\n            }\n            this.displayName = collection?.displayName ?? '';\n\n            this.requestUpdate();\n        }\n\n        dispatchEvent(new Event('LdCloseLoadingSpinner'));\n    }\n\n    // used trough that/this in common-func.ts, do not remove\n    renderBaseFields() {\n        const getLabel = (key: string) => LdTranslate(`modules.collections.new.fields.${key}`);\n        const getError = (key: string) => LdTranslate(`modules.collections.new.error_messages.${key}`);\n\n        const baseFields: IFFormFieldLocation[] = [\n            inputFieldDisplayName(this, getLabel, getError),\n            {\n                id: 'collectionName',\n                type: 'input',\n                tabindex: 2,\n                value: this.editForm && this.item ? this.item.collectionName || '' : '',\n                label: getLabel('collectionName'),\n                errorMessage: getError('collectionName'),\n            },\n            getVisibilityTypeField(this.editForm, this.item, 3, \"common\"),\n            toggleUiRelevant(this, getLabel),\n            inputFieldTags(this, getLabel)\n        ];\n\n        checkAddCustomId(this, getLabel, \"collectionId\", baseFields, getError)\n        return renderBaseFieldsOfItem(this, baseFields, \"collectionId\", \"collections\", this.isSingleCollectionLoading)\n    }\n\n    prepareItemForBackend(collection: IFCollections): any {\n        // Create a deep copy to avoid mutating the original\n        const prepared: any = structuredClone({\n            ...collection,\n            tags: collection.tags instanceof Set ? Array.from(collection.tags) : (collection.tags ?? [])\n        });\n\n        // Remove internal fields\n        delete prepared.collectionId;\n        delete prepared.id;\n\n        return prepared;\n    }\n\n    saveData(collection: IFCollections) {\n        if (this.editForm) {\n            closeChangeModal(this, this.shadowRoot);\n\n            const collectionVariables = this.item?.variables || [];\n            const flatVariableIds = collectionVariables.map((v: any) => {\n                return (v && typeof v === 'object') ? v.id : String(v);\n            }).filter(id => id && id !== 'undefined');\n            const updatedCollectionWithVariables = {\n                ...collection,\n                variables: flatVariableIds\n            };\n\n            // Prepare collection for backend\n            const preparedCollection = this.prepareItemForBackend(updatedCollectionWithVariables);\n\n            store.dispatch(editItem(\n                `${CONFIG.backend.services.timeseries.base_url}${CONFIG.backend.services.timeseries.endpoints.multi_timeline.collections}/${this.collectionId}`,\n                preparedCollection,\n                'edit'\n            ));\n        } else {\n            addNewItem(this, collection, \"collectionId\", \"collections\")\n        }\n    }\n\n    validateForm(): boolean {\n        const baseForm = this.shadowRoot?.querySelector('#baseFieldsWrapper');\n        return this.validateBaseForm(baseForm);\n    }\n\n    validateBaseForm(form: any): boolean {\n        const fields = {\n            displayName: getField(form, 'displayName') as PaperInputElement,\n            collectionName: getField(form, 'collectionName') as PaperInputElement,\n            visibilityType: getField(form, 'visibilityType') as PaperDropdownMenuElement,\n            collectionId: getField(form, 'collectionId') as PaperInputElement,\n        };\n\n        if (fields.displayName) fields.displayName.invalid = validator.isEmpty(fields.displayName.value?.trim() || '');\n        if (fields.collectionName) fields.collectionName.invalid = validator.isEmpty(fields.collectionName.value?.trim() || '');\n        if (fields.visibilityType) fields.visibilityType.invalid = validator.isEmpty(getDropdownValue(form, \"visibilityType\"));\n\n\n        let allValid = !fields.displayName.invalid && !fields.collectionName.invalid && !fields.visibilityType.invalid;\n\n        if (fields.collectionId?.value?.trim()) {\n            fields.collectionId.invalid = !validator.isUUID(fields.collectionId.value.trim());\n            allValid = allValid && !fields.collectionId.invalid;\n        }\n\n        return allValid;\n    }\n\n    getFormValues(): IFCollections {\n        const baseForm = this.shadowRoot?.querySelector('#baseFieldsWrapper');\n\n        if (!baseForm) {\n            return {} as IFCollections;\n        }\n\n        return {\n            ...this.getBaseFormValues(baseForm),\n            description: getDescriptionValues(this),\n        } as IFCollections;\n    }\n\n    getBaseFormValues(baseForm: any): Partial<IFCollections> {\n        return {\n            displayName: getInputValue(baseForm, 'displayName'),\n            collectionName: getInputValue(baseForm, 'collectionName'),\n            visibilityType: getDropdownValue(baseForm, 'visibilityType'),\n            uiRelevant: getToggleValue(baseForm, 'uiRelevant'),\n            tags: getTagsSetFromForm(baseForm)\n        };\n    }\n\n    // used trough that/this in common-func.ts, do not remove\n    onFormButtonSave() {\n        this.formIsBusy = true;\n        const _allFieldsValid = this.validateForm();\n\n        if (_allFieldsValid) {\n            this.itemFromForm = this.getFormValues();\n            if (this.editForm) {\n\n                this.itemFromForm = this.getFormValues();\n                this.saveData(this.itemFromForm);\n            } else {\n                addNewItem(this, this.itemFromForm, \"collectionId\", \"collections\");\n            }\n        } else {\n            this.formIsBusy = false;\n        }\n    }\n}","import {css, customElement, html, LitElement, property} from \"lit-element\";\nimport {connect} from \"pwa-helpers/connect-mixin\";\nimport {IFFormFieldLocation, IFPageModules, IFUserInformation} from \"../../../../../js/interfaces\";\nimport {forward, isUserSwEmployee} from \"../../../../../js/LdGlobal\";\nimport {LdTranslate} from \"../../../../ld-application/i18n/ld-i18next\";\nimport {loadUserInformation} from '../../../../ld-redux/actions/ld-users-actions';\nimport LdSettingsViewStyles from \"../styles\";\nimport store from \"../../../../ld-redux/ld-redux-store\";\nimport '../../../ld-form/ld-form-wrapper';\nimport {exportDatawarehouseData} from \"../../../../ld-redux/actions/ld-timeseries-actions\";\nimport {LdDialogs} from \"../../../ld-dialog/ld-dialogs\";\n\n@customElement('ld-data-warehouse-export')\nexport class LdDataWarehouseExport extends connect(store)(LitElement) {\n    @property({type: Object}) userInformation!: IFUserInformation;\n    @property({type: Object}) formInputs: IFFormFieldLocation[] = [];\n    @property({type: String}) selectedExportType: string = '';\n    @property({type: Boolean}) showErrorDialog: boolean = false;\n    @property({type: Boolean}) isExporting: boolean = false;\n\n    static get styles() {\n        return [LdSettingsViewStyles, css`\n\n            .export-section {\n                display: flex;\n                flex-direction: column;\n            }\n\n            .dropdown {\n                width: 25%;\n                float: right;\n                margin: 12px 0 12px 0;\n                align-self: flex-end;\n                padding-right: 30px;\n\n            }\n\n            #startExport {\n                align-self: flex-end;\n            }\n        `];\n\n    }\n\n    firstUpdated(): void {\n        if (this.userInformation != null) {\n            if (!isUserSwEmployee(this.userInformation)) {\n                forward(`/dashboard`);\n                return;\n            }\n        }\n        store.dispatch(loadUserInformation());\n        globalThis.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n\n    }\n\n    constructor() {\n        super();\n        globalThis.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n    }\n\n    sendRequestExport() {\n        if (this.selectedExportType) {\n            this.isExporting = true;\n            globalThis.dispatchEvent(new Event('LdOpenLoadingSpinner'));\n            store.dispatch(exportDatawarehouseData(this.selectedExportType))\n        } else {\n            this.showErrorDialog = true;\n        }\n\n\n    }\n\n    missingExportTypeDialog() {\n        return html`\n            <ld-dialogs\n                    ?opened=\"${this.showErrorDialog}\"\n                    titleText='${LdTranslate('modules.data_warehouse.missing.selected.export_type')}'\n                    confirmText='${LdTranslate('modules.data_warehouse.confirm.missing.export_type')}'\n                    name=''\n                    @accept-clicked='${() => this.closeModal()}'\n            ></ld-dialogs>\n        `;\n    }\n\n    closeModal() {\n        this.showErrorDialog = false;\n        const dialog = this.shadowRoot?.querySelector<LdDialogs>('ld-dialogs');\n        dialog?.closeDialog();\n    }\n\n    createDropdownList(list: Array<string>): Array<IFPageModules> {\n        const values: Array<IFPageModules> = [];\n\n        for (const item of list) {\n            values.push({\n                id: item,\n                name: LdTranslate(`modules.data_warehouse.export.${item.toLowerCase()}`) || item\n            });\n        }\n        return values;\n    }\n\n    handelSelected(e: CustomEvent) {\n        const detail = e.detail;\n        this.selectedExportType = detail.data;\n    }\n\n    renderDropdown() {\n        const selectExportTypeDropdown = {\n            id: 'export-type',\n            type: 'dropdown',\n            label: LdTranslate('modules.data_warehouse.select.export.type'),\n            class: 'dropdown-content',\n            value: this.createDropdownList(['CSV', 'JSON', 'EXCEL']),\n            validation: ['isNotEmpty'],\n            selected: this.selectedExportType\n        }\n\n        return html`\n            <ld-form-wrapper\n                    class='dropdown'\n                    @dropdown-changed='${(e: CustomEvent) => this.handelSelected(e)}'\n                    id=\"baseFieldsWrapper\"\n                    .formInputs='${[selectExportTypeDropdown]}'>\n            </ld-form-wrapper>\n\n        `;\n    }\n\n    updated(changedProperties: Map<string | number | symbol, unknown>) {\n        if (changedProperties.has('showErrorDialog') && this.showErrorDialog) {\n            setTimeout(() => {\n                const dialog = this.shadowRoot?.querySelector('ld-dialogs') as LdDialogs;\n                dialog.openDialog();\n            }, 50);\n        }\n    }\n\n    render() {\n        return html`\n            <div class='ld-list-wrapper grid-container'>\n                <div class='headline'>\n                    <h3>${LdTranslate(`modules.data_warehouse.tabs.list`)}</h3>\n                </div>\n                <div class='ld-wrapper'>\n                    <div class='description'>\n                        <div class='head'>\n                            <h3>${LdTranslate(`modules.data_warehouse.text.title`)}</h3>\n                        </div>\n                    </div>\n                    <div class='actions'>\n                        <div class='head'>\n                            <h3>${LdTranslate(`modules.data_warehouse.export.title`)}</h3>\n                        </div>\n                        <div class=\"export-section\">\n                            <p>${LdTranslate(`modules.data_warehouse.export.text`)}</p>\n                            ${this.renderDropdown()}\n                            <paper-button id='startExport' @click='${() => this.sendRequestExport()}' raised>\n                                ${this.selectedExportType\n                                        ? LdTranslate(`modules.generic.buttons.export.data_warehouse_${this.selectedExportType.toLowerCase()}`)\n                                        : LdTranslate('modules.generic.buttons.export.data_warehouse')\n                                }\n                            </paper-button>\n                        </div>\n                        ${this.showErrorDialog ? this.missingExportTypeDialog() : ''}\n                    </div>\n                </div>\n            </div>\n        `;\n    }\n\n    stateChanged(state: any) {\n        this.userInformation = state.LdUsersReducer.info;\n        if (this.isExporting) {\n            globalThis.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n            this.isExporting = false;\n            this.selectedExportType = '';\n        }\n    }\n}","import '@polymer/paper-button/paper-button';\nimport { css, customElement, html, LitElement, property, unsafeCSS } from 'lit-element';\nimport {\n  clearBackendServiceUrlOverrides,\n  getEffectiveBackendServiceUrls,\n  isDevServiceUrlOverridesEnabled,\n  saveBackendServiceUrlOverrides,\n} from '../../../../../js/LdServiceUrlOverrides';\nimport _THEME from '../../../../../themes/styles';\nimport LdPlatformModulesAssetsStyles from '../../assets/styles';\nimport { displayNotification } from '../../../../../js/LdNotificationHandler';\nimport { LdTranslate } from '../../../../ld-application/i18n/ld-i18next';\n\n@customElement('ld-backend-links-dev-settings')\nexport class LdBackendLinksDevSettings extends LitElement {\n  @property({ type: Object }) private values: Record<string, Record<string, string>> = {};\n  @property({ type: String }) private infoMessage = '';\n\n  static get styles() {\n    return [LdPlatformModulesAssetsStyles,css`\n      :host {\n        display: block;\n      }\n        \n\n        paper-button {\n            float: right;\n            display: block;\n        }\n        \n      .wrapper {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .service-card {\n        border: 1px solid #ddd;\n        border-radius: 6px;\n        padding: 16px;\n          background: white;\n      }\n\n      .service-title {\n        margin: 0 0 12px 0;\n        text-transform: uppercase;\n        font-size: 14px;\n      }\n\n      .field-row {\n        display: grid;\n        grid-template-columns: 180px 1fr;\n        align-items: center;\n        gap: 12px;\n        margin-bottom: 10px;\n      }\n\n      .field-row:last-child {\n        margin-bottom: 0;\n      }\n\n      .field-row label {\n        font-size: 13px;\n        color: #555;\n      }\n\n      .field-row input {\n        width: 100%;\n        box-sizing: border-box;\n        padding: 8px 10px;\n      }\n\n      .actions {\n        display: flex;\n        gap: 10px;\n      }\n\n      .info {\n        margin: 0;\n        color: #008000;\n      }\n        .ld-wrapper {\n            color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n            background-color: ${unsafeCSS(_THEME.colors.primary_background_color)};\n            margin-bottom: 5px;\n            padding: 25px;\n            margin-right: 0px;\n        }\n    `];\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this.reloadValues();\n  }\n\n  private reloadValues() {\n    if (!isDevServiceUrlOverridesEnabled()) {\n      this.values = {};\n      return;\n    }\n\n    this.values = getEffectiveBackendServiceUrls();\n  }\n\n  private onInputChange(serviceName: string, fieldName: string, event: Event) {\n    const target = event.target as HTMLInputElement;\n    this.values = {\n      ...this.values,\n      [serviceName]: {\n        ...this.values[serviceName],\n        [fieldName]: target.value,\n      },\n    };\n  }\n\n  private save() {\n    saveBackendServiceUrlOverrides(this.values);\n    this.infoMessage = LdTranslate('modules.backend.links.success');\n    let notificationType = 'success';\n    displayNotification(notificationType, this.infoMessage);\n\n  }\n\n  private reset() {\n    clearBackendServiceUrlOverrides();\n    this.reloadValues();\n    this.infoMessage = LdTranslate('modules.backend.links.reset');\n    let notificationType = 'success';\n    displayNotification(notificationType, this.infoMessage);\n\n  }\n\n  render() {\n    if (!isDevServiceUrlOverridesEnabled()) {\n      return html``;\n    }\n\n    return html`\n      <div class='wrapper'>\n        <div class=\"headline\">\n          <h3>${LdTranslate(\"modules.backend.links.tile\")} | ${LdTranslate(\"modules.backend.links.description\")}</h3>\n        </div>\n        <div class=\"ld-wrapper\">\n        ${Object.keys(this.values).map((serviceName) => html`\n          <div class='service-card'>\n            <h4 class='service-title'>${serviceName}</h4>\n            ${Object.keys(this.values[serviceName]).map((fieldName) => html`\n              <div class='field-row'>\n                <label for='${serviceName}-${fieldName}'>${fieldName}</label>\n                <input\n                  id='${serviceName}-${fieldName}'\n                  type='url'\n                  .value=${this.values[serviceName][fieldName] || ''}\n                  @input=${(event: Event) => this.onInputChange(serviceName, fieldName, event)}\n                />\n              </div>\n            `)}\n          </div>\n        `)}\n        \n\n        \n          <paper-button raised @click='${() => this.save()}'>${LdTranslate(\"modules.assets.generic.new.buttons.save\")}</paper-button>\n          <paper-button raised @click='${() => this.reset()}'>${LdTranslate('modules.generic.buttons.refreshConfig')}</paper-buttonraised>\n        \n        </div>\n      </div>\n    `;\n  }\n}\n\n\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-fab/paper-fab';\nimport {css, html, LitElement, property, state} from 'lit-element';\nimport {TemplateResult} from 'lit-html';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {BasicRouter, Router} from '../../../../js/services/routingConfig';\nimport {checkUserHasAMatchingRole, isUserSwEmployee} from '../../../../js/LdGlobal';\nimport {BrowserFileProvider} from '../../../../js/services/FileProvider';\nimport {BrowserFormValidator} from '../../../../js/services/Validator';\nimport {LdTranslate} from '../../../ld-application/i18n/ld-i18next';\nimport {LdBreadCrumb} from '../../../ld-application/ld-breadcrumb';\nimport {emptyAssets} from '../../../ld-redux/actions/ld-assets-actions';\nimport {store} from '../../../ld-redux/ld-redux-store';\n\nimport './ld-download-upload';\nimport {LdSettingsViewStyles} from './styles';\nimport './ld-variables';\nimport './ld-variables/form';\nimport './ld-collections';\nimport './ld-collections/form';\nimport './ld-data-warehouse-export';\nimport './ld-backend-links';\nimport {ToastNotificationHandler} from \"../../../../js/services/Notifications\";\nimport {isDevServiceUrlOverridesEnabled} from '../../../../js/LdServiceUrlOverrides';\n\n/**\n * @extends LitElement\n */\nexport class LdSettingsView extends connect(store)(LitElement) {\n  // --------------------------------------------------------------------------------------\n  fileProvider                                                                   = new BrowserFileProvider();\n  formValidator                                                                  = new BrowserFormValidator();\n  notificationHandler = new ToastNotificationHandler();\n  @property({ type: Object, hasChanged: () => true }) _subModules: Array<Object> = [];\n  @property({ type: Object, hasChanged: () => true }) _userInformation: Object   = {};\n  @property({ type: Object, hasChanged: () => true }) _baseTabs: Array<Object>       = [\n    {\n      key: 'limit',\n      title: LdTranslate('modules.limit.tabs.list'),\n      link: 'settings/limit/list',\n    },\n    {\n      key: 'alarms',\n      title: LdTranslate('modules.limit.tabs.alarms'),\n      link: 'settings/alarms/list',\n    },\n    {\n         key: 'variables',\n         title: LdTranslate('modules.limit.tabs.variables'),\n         link: 'settings/variables/list',\n    },\n    {\n      key: 'collections',\n      title: LdTranslate('modules.collections.tabs.collections'),\n      link: 'settings/collections/list',\n    },\n    {\n      key: 'datawarehouse',\n      title: LdTranslate('modules.limit.tabs.data_warehouse'),\n      link: 'settings/datawarehouse',\n    },\n  ];\n  @property({ type: Object }) _innerTabsLimits: Array<Object> = [\n    {\n      key: '?machine',\n      title: LdTranslate(`modules.limit.tabs.machine`),\n      link: '/settings/limit/list?machine',\n    },\n    {\n      key: '?type',\n      title: LdTranslate('modules.limit.tabs.type'),\n      link: '/settings/limit/list?type',\n    },\n  ];\n  @property({ type: Object }) _innerTabsAlarms: Array<Object> = [\n    {\n      key: '?machine',\n      title: LdTranslate(`modules.alarms.tabs.machine`),\n      link: '/settings/alarms/list?machine',\n    },\n    {\n      key: '?type',\n      title: LdTranslate('modules.alarms.tabs.type'),\n      link: '/settings/alarms/list?type',\n    },\n  ];\n  @state() private router: Router                                                = new BasicRouter();\n\n  private canShowBackendLinksTab() {\n    return isDevServiceUrlOverridesEnabled() && isUserSwEmployee(this._userInformation);\n  }\n\n  private getTabs(): Array<Object> {\n    if (!this.canShowBackendLinksTab()) {\n      return this._baseTabs;\n    }\n\n    return [\n      ...this._baseTabs,\n      {\n        key: 'backend-links',\n        title: 'Backend Links (Dev)',\n        link: 'settings/backend-links',\n      },\n    ];\n  }\n\n    // --------------------------------------------------------------------------------------\n    static get styles() {\n        return [LdSettingsViewStyles, css`\n            :host {\n                display: flex;\n                flex-direction: column;\n                flex: auto;\n            }\n\n            .container {\n                flex: auto;\n                display: flex;\n                flex-direction: column;\n                margin-right: 50px;\n            }\n\n            .grid-container {\n                display: flex;\n                flex-direction: column;\n                flex: auto;\n            }\n\n            ld-assets-header {\n                margin: 20px 0;\n            }`];\n    }\n\n    /**\n     * @returns void\n     */\n    // --------------------------------------------------------------------------------------\n    connectedCallback() {\n        super.connectedCallback();\n        store.dispatch(emptyAssets());\n        LdBreadCrumb.setBreadcrumb({\n            assetType: null,\n            assetID: null,\n            backButtonLink: null,\n        });\n    }\n\n\n    /**\n     * to prevent memory leaks\n     * @returns void\n     */\n    // --------------------------------------------------------------------------------------\n    disconnectedCallback() {\n        super.disconnectedCallback();\n        LdBreadCrumb.setBreadcrumb({\n            assetType: null,\n            assetID: null,\n            backButtonLink: null,\n        });\n    }\n\n\n    // --------------------------------------------------------------------------------------\n    render(): TemplateResult {\n        let _contentRenderViews = [];\n        const tabs = this.getTabs();\n\n        if (this._userInformation != null) {\n            if (!isUserSwEmployee(this._userInformation)) {\n                this.router.changeView(`/dashboard`, {useSpinner: true});\n            }\n        }\n\n        _contentRenderViews.push(html`\n            <ld-tabs .selected='${this._subModules[1]}' .tabs='${tabs}' fallbackSelection='limit'></ld-tabs>\n        `);\n\n    switch (this._subModules[1]) {\n      case 'limit':\n        _contentRenderViews.push(html`\n          <ld-settings-list\n            .fileProvider='${this.fileProvider}'\n            .formValidator='${this.formValidator}'\n            ._subModules='${this._subModules}'\n            ._userInformation='${this._userInformation}'\n            selectedTab='limit'\n            ._innerTabs='${this._innerTabsLimits}'>\n          </ld-settings-list>`);\n        break;\n      case 'alarms':\n        _contentRenderViews.push(html`\n          <ld-settings-list\n            .fileProvider='${this.fileProvider}'\n            .formValidator='${this.formValidator}'\n            ._subModules='${this._subModules}'\n            ._userInformation='${this._userInformation}'\n            selectedTab='alarms'\n            ._innerTabs='${this._innerTabsAlarms}'>\n          </ld-settings-list>`);\n        break;\n     case 'datawarehouse':\n        _contentRenderViews.push(html`\n                <ld-data-warehouse-export\n                        .fileProvider='${this.fileProvider}'\n                        .formValidator='${this.formValidator}'\n                        ._subModules='${this._subModules}'\n                        ._userInformation='${this._userInformation}'>\n                </ld-data-warehouse-export>`);\n        break;\n      case 'variables':\n        switch (this._subModules[2]) {\n          case 'new':\n            checkUserHasAMatchingRole(isUserSwEmployee(this._userInformation));\n            _contentRenderViews.push(html`\n              <ld-variable-form .variableId='${this._subModules[3]}'\n                                .headerTitle='${LdTranslate('modules.variables.new_form_title')}'\n                                .editForm='${false}'\n                                .notificationHandler='${this.notificationHandler}'\n                                .userInformation='${this._userInformation}'></ld-variable-form>`);\n            break;\n          case 'edit':\n            checkUserHasAMatchingRole(isUserSwEmployee(this._userInformation));\n            _contentRenderViews.push(html`\n              <ld-variable-form .variableId='${this._subModules[3]}'\n                                .headerTitle='${LdTranslate('modules.variables.edit_form_title')}'\n                                .locationId='${this._subModules[4]}'\n                                .notificationHandler='${this.notificationHandler}'\n                                .editForm='${true}'\n                                .userInformation='${this._userInformation}'></ld-variable-form>`);\n            break;\n          default:\n            _contentRenderViews.push(html`\n              <ld-variables-list\n                  ._subModules='${this._subModules}'\n                  .userInformation='${this._userInformation}'\n              >\n              </ld-variables-list>`);\n            break;\n        }\n        break;\n      case 'backend-links':\n        if (!this.canShowBackendLinksTab()) {\n          this.router.changeView(`/dashboard`, {useSpinner: true});\n          break;\n        }\n        _contentRenderViews.push(html`\n          <ld-backend-links-dev-settings></ld-backend-links-dev-settings>\n        `);\n        break;\n        case 'collections':\n            switch (this._subModules[2]) {\n                case 'new':\n                    checkUserHasAMatchingRole(isUserSwEmployee(this._userInformation));\n                    _contentRenderViews.push(html`\n                            <ld-collection-form .collectionId='${this._subModules[3]}'\n                                                 .headerTitle='${LdTranslate('modules.collections.new_form_title')}'\n                                                 .editForm='${false}'\n                                                 .notificationHandler='${this.notificationHandler}'\n                                                 .userInformation='${this._userInformation}'></ld-collection-form>`);\n                    break;\n                case 'edit':\n                    checkUserHasAMatchingRole(isUserSwEmployee(this._userInformation));\n                    _contentRenderViews.push(html`\n                            <ld-collection-form .collectionId='${this._subModules[3]}'\n                                                 .headerTitle='${LdTranslate('modules.collections.edit_form_title')}'\n                                                 .locationId='${this._subModules[4]}'\n                                                 .notificationHandler='${this.notificationHandler}'\n                                                 .editForm='${true}'\n                                                 .userInformation='${this._userInformation}'></ld-collection-form>`);\n                    break;\n                default:\n                    _contentRenderViews.push(html`\n                            <ld-collections-list\n                                    ._subModules='${this._subModules}'\n                                    .userInformation='${this._userInformation}'\n                            >\n                            </ld-collections-list>`);\n                    break;\n            }\n            break;\n\n    }\n\n        return html`\n            <div class='container'>\n                <div class='grid-container '>\n                    ${_contentRenderViews}\n                </div>\n            </div>\n        `;\n\n    }\n}\n\ncustomElements.define('ld-settings', LdSettingsView as unknown as CustomElementConstructor);\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\nimport { IFBreadCrumbConfigObject } from '../../../js/interfaces';\nimport LdFetch                      from '../../../js/LdFetch';\nimport { CONFIG }                   from '../../../js/LdGlobal';\n\nexport const START_LOADING_BREADCRUMB_CONFIG  = 'START_LOADING_BREADCRUMB_CONFIG';\nexport const FINISH_LOADING_BREADCRUMB_CONFIG = 'FINISH_LOADING_BREADCRUMB_CONFIG';\nexport const ERROR_LOADING_BREADCRUMB_CONFIG  = 'ERROR_LOADING_BREADCRUMB_CONFIG';\nexport const BREADCRUMB_CONFIG = 'BREADCRUMB_CONFIG';\nexport const CLEAR_SUBMIT_BREADCRUMB = 'CLEAR_SUBMIT_BREADCRUMB';\n// --------------------------------------------------------------------------------------\nconst receiveSetBreadCrumbConfig = (breadcrumbList: object) => ({\n  type: FINISH_LOADING_BREADCRUMB_CONFIG,\n  breadcrumbList,\n});\n\n// --------------------------------------------------------------------------------------\nconst errorSetBreadCrumbConfig = (error: object) => ({\n  type: ERROR_LOADING_BREADCRUMB_CONFIG,\n  error,\n});\n\n// --------------------------------------------------------------------------------------\nexport const getBreadCrumbConfig = (assetType: string, assetID: string) => (dispatch: any) => {\n  dispatch({ type: START_LOADING_BREADCRUMB_CONFIG });\n  return LdFetch.get(`${CONFIG.backend.services.assets.base_url}${CONFIG.backend.services.assets.endpoints.breadcrumb}/${assetType}/${assetID}`, (breadcrumbList: object) => {\n    dispatch(receiveSetBreadCrumbConfig(breadcrumbList));\n  }, (error: object) => {\n    dispatch(errorSetBreadCrumbConfig(error));\n  });\n};\n\nexport const setBreadCrumbConfig = (breadCrumbConfig: IFBreadCrumbConfigObject) => (dispatch: any) => {\n  dispatch({ type: BREADCRUMB_CONFIG, breadCrumbConfig });\n};\n\n\n// --------------------------------------------------------------------------------------\nexport const clearBreadCrumbConfig = () => (dispatch: any) => {\n  dispatch({ type: CLEAR_SUBMIT_BREADCRUMB });\n};\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\n\nimport { PaperToastElement } from '@polymer/paper-toast';\nimport { LdMessages }        from '../components/ld-application/ld-messages/ld-error-messages';\n\n\nexport const displayNotification = (type: string, message: string, duration: number = 5000, dismissable: boolean = true): void => {\n  if (message === 'unspecified') {\n    return;\n  }\n\n  const parent: Element | null | undefined = window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') != null ?\n    window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') : window.document.querySelector('ld-platform');\n  if(!parent){\n    return;\n  }\n  const _toastElement          = parent?.shadowRoot?.querySelector<PaperToastElement>('paper-toast#ld-toast');\n  if (!_toastElement) {\n    throw new Error('toast could not be found!');\n  }\n\n  if (type === 'success') {\n    _toastElement.setAttribute('data-notification-type', 'success');\n  } else if (type === 'releaseNotes') {\n    _toastElement.setAttribute('data-notification-type', 'release');\n  } else {\n    _toastElement.removeAttribute('data-notification-type');\n  }\n\n  const _toastMessageElement: Element = _toastElement.querySelector('.ld-toast-message')!;\n\n  _toastMessageElement.innerHTML = `\n     ${message}\n  `;\n\n  if (dismissable) {\n    _toastElement.duration = duration;\n  }\n\n  _toastElement.open();\n};\n\n\n/**\n * Handles the click event on the close button inside the toast\n *\n *\n */\n             // --------------------------------------------------------------------------------------\nexport const closeDisplayNotification = (): void => {\n               const parent: Element | null = window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform') != null ?\n                 window.document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-platform')! : window.document.querySelector('ld-platform')!;\n               const _toastElement          = parent?.shadowRoot?.querySelector<PaperToastElement>('paper-toast#ld-toast');\n               if (!_toastElement) {\n                 throw new Error('toast could not be found!');\n               }\n               const releaseNotes: string = _toastElement?.getAttribute('data-notification-type')!;\n               if (releaseNotes === 'release') {\n                 window.dispatchEvent(new CustomEvent('closedRelease', {}));\n               }\n               _toastElement.close();\n             };\n\n\n// --------------------------------------------------------------------------------------\nexport const showToast = (message: string, toastElement?: PaperToastElement): void => {\n\n  setTimeout(() => {\n    let _toastElement: PaperToastElement;\n    if (<PaperToastElement>document.querySelector('ld-application')) {\n      _toastElement = toastElement ?? <PaperToastElement>document.querySelector('ld-application')?.shadowRoot?.querySelector('ld-login-application')!.shadowRoot!.querySelector('paper-toast#ld-login-toast');\n    } else {\n      _toastElement = toastElement ?? <PaperToastElement>document?.querySelector('ld-login-application')!.shadowRoot!.querySelector('paper-toast#ld-login-toast');\n    }\n\n\n    const _toastMessageElement         = _toastElement!.querySelector('.ld-login-toast-message');\n    const _error                       = LdMessages[message];\n    _toastElement.style.borderTopColor = _error.error ? '#E4002B' : '#00e43d';\n\n    _toastMessageElement!.innerHTML = _error.message;\n\n    if (_error.toast_duration !== 0) {\n      _toastElement.duration = _error.toast_duration;\n    }\n\n    _toastElement!.open();\n  }, 500);\n\n};\n","/**\n * Copyright 2023 Schwäbische Werkzeugmaschinen GmbH\n */\nimport {TemplateResult} from 'lit-element';\nimport {PaperInputElement} from \"@polymer/paper-input/paper-input\";\nimport {PaperDropdownMenuElement} from \"@polymer/paper-dropdown-menu/paper-dropdown-menu\";\n\n\ninterface IFBreadcrumbObject {\n  parent?: string,\n  label?: string,\n  uri?: string,\n  title?: string,\n  link?: string,\n  name?: string,\n}\n\nexport interface ImageDimensions {\n  width: number;\n  height: number;\n  naturalWidth: number;\n  naturalHeight: number;\n}\n\nexport interface PositionScaling {\n  scaleX: number;\n  scaleY: number;\n}\n\nexport interface ShopfloorState {\n  dataLoaded: boolean;\n  positionsLoaded: boolean;\n  runtimeDataLoaded: boolean;\n  imageLoaded: boolean;\n}\n\ninterface IFBreadCrumbReducer {\n  breadCrumbConfig: IFBreadCrumbConfigObject;\n}\n\ninterface IFManuals {\n  url: string,\n  fields: any,\n\n}\n\ninterface IFUserPrivacyPolicyStatus {\n  status: string,\n  version: string\n}\n\ninterface IFTvObject {\n  id: string,\n  sessionType: string,\n  COnePanel: boolean,\n}\n\ninterface IFUserInformation {\n  'id': string,\n  'gender': string,\n  'phone_number': string,\n  'company': string,\n  'locale': string,\n  'given_name': string,\n  'family_name': string,\n  'role': string,\n  'email': string,\n  user_id?: string,\n  'meta': {\n    'creation_date': number,\n    'modification_date': number,\n    'status': string,\n    'enabled': boolean | string,\n    active: boolean;\n\n  },\n}\n\ninterface IFtvLinks {\n  link: string;\n}\n\ninterface IFMulitValue {\n  chartId: number,\n  multiCurrentValueList: [number][number]\n}\n\ninterface IFBreadCrumbConfigObject {\n  customBreadcrumbElements?: Array<IFBreadcrumbObject> | null,\n  assetType?: string | null,\n  activeLastCrumb?: boolean,\n  assetID?: string | null,\n  backButtonLink?: string | null,\n  backButtonNetcfg?: string\n}\n\n\ninterface IFTreeNode {\n  key: string;\n  icon: string | null;\n  children: IFTreeNode[] | any[];\n  isFirst?: boolean;\n}\n\nexport const VisibilityType = {\n  External: 'EXTERNAL',\n  Internal: 'INTERNAL',\n  All: 'ALL',\n};\n\nexport enum DataTypeName {\n  ACTIVE_G_FUNCTION = 'active G function',\n  ACTUAL_TOOL_IDENT = 'actual tool ident',\n  P8_TOOLMON_ERROR_STATUS = 'P8 ToolMon Error Status'\n}\n\nexport enum NcFileType {\n  NcState = 'nc_data',\n  NcComparison = 'nc_comp',\n  NcTrace = 'trace',\n  NCHmi = 'flight_recorder',\n  ToolMon = 'tool_mon',\n  All = 'all'\n}\n\nexport enum chartType {\n  GMode = 'GMode',\n  ActiveTool = 'ActiveTool',\n  Analyzer = 'Analyzer',\n  Table = 'Table',\n  ToolChange = 'ToolChange'\n}\n\nexport enum TimeFilter {\n  box_time = 'box_time',\n  machine_time = 'machine_time',\n  controller_time = 'controller_time'\n}\n\nexport const ERROR_STATUS_MAP: Record<number, string> = {\n  [-1]: 'no reference found',\n  [-2]: 'no data collected',\n  [-3]: 'data length not ok',\n  [-4]: 'invalid value',\n  [-5]: 'invalid score',\n  [-6]: 'unknown exception',\n  [-7]: 'no tool detected',\n} as const;\n\ninterface IFNcStateFileData {\n  creationDate: number,\n  event_type: string,\n  trigger: string,\n  machine_id: string,\n  timestamp: number,\n}\n\ninterface IFMachineTypes {\n  name: string\n}\n\ninterface IFTvUrl {\n  link: string\n}\n\ninterface IFReleaseNotesFeature {\n  title: string;\n  description: string;\n  imageUrl?: string;\n  roles: string[];\n}\n\ninterface IFReleaseNotesItem {\n  version: string;\n  features: Array<IFReleaseNotesFeature>;\n}\n\ninterface IFReleaseNotesData {\n  items: IFReleaseNotesItem[];\n}\n\ninterface IFSeries {\n  name: string,\n  type?: string,\n  lineWidth?: number,\n  data: Array<IFAlarmsOptions>,\n  box_time?: string,\n  details?: string,\n  marker?: {\n    enabled: boolean,\n    symbol: string,\n    radius: number,\n    lineColor: string,\n    fillColor: string,\n    lineWidth: number,\n  },\n  custom?: Array<IFAlarmsOptions>,\n  turboThreshold?: number,\n  alarm_number?: string,\n}\n\ninterface IFAlarmsValue {\n  timelineData?: Array<IFSeries>\n  alarmsId: string\n  alarm_number: string,\n  categoryText?: string,\n  details?: string,\n  machineTimeFormatted?: string,\n  leftTimeFormatted?: string,\n  durationFormatted?: string,\n  machine_time?: string,\n  box_time?: string,\n  duration?: string,\n  left_time?: string,\n  category?: number,\n  trend?: TemplateResult,\n  countBeforehandTimeRange?: number,\n  countSelectedTimeRange?: number,\n  count?: number\n  chartId: string\n}\n\ninterface IFPageModules {\n  id: string,\n  name: string,\n  icon?: string,\n  href?: string,\n}\n\ninterface IFAlarmsOptions {\n  x?: string,\n  y?: number,\n  alarmMessage?: string,\n  alarmNumber?: string,\n  custom?: IFAlarmsArrayOptions\n}\n\ninterface IFAlarmsArrayOptions {\n  alarmMessage?: string,\n  alarmNumber?: string,\n}\n\ninterface IFTVList {\n  device_id: string,\n  group_name: string,\n  is_member: boolean\n}\n\ninterface IFLdAssetsReducerState {\n  coordinates: Array<IFCoordinates> | null;\n  isAssetsCoordinatesByAddressLoading: boolean;\n  location: IFLocationObject;\n  company: IFLocationObject,\n  result: IFDeployment\n  loadingCountries: boolean,\n  assetDelete: object | null,\n  isAssetsEditLoading: boolean,\n  isAssetDeleteLoading: boolean,\n  loadingLine: boolean,\n  line: IFLineObject,\n  loadingHall: boolean,\n  hall: IFHallObject,\n  industrySectors: string[],\n  countries: string[],\n  addAssetValue: IFLocationObject\n}\n\ninterface IFFormFieldLocationWithTemplate extends Omit<IFFormFieldLocation, 'value'> {\n  value: string | (() => TemplateResult);\n}\n\ninterface IFCoordinatesElement extends HTMLElement {\n  reset: () => void;\n}\n\ninterface IFFormFieldLocation {\n  id: string;\n  type: string;\n  tabindex: number;\n  label?: string;\n  value?: unknown;\n  errorMessage?: string;\n  class?: string;\n  selected?: unknown;\n  pattern?: string;\n  renderFunction?: () => any;\n  disabled?: boolean,\n  checked?: boolean,\n  validation?: string[],\n  options?: string[],\n  placeholder?: string\n  inputType?: number | string;\n}\n\ninterface IFVariables {\n    displayName: string;\n    namePrefix: string;\n    chartType: string;\n    maxTime: string;\n    dataType: string;\n    visibilityType: string;\n    showInitial: boolean;\n    variableId?: string\n    checkboxShowId?: string\n}\n\ninterface IFFormFieldsVariables {\n    displayName: PaperInputElement;\n    namePrefix: PaperInputElement;\n    chartType: PaperDropdownMenuElement;\n    maxTime: PaperDropdownMenuElement;\n    dataType: PaperDropdownMenuElement;\n    visibilityType: PaperDropdownMenuElement;\n    showInitial: PaperDropdownMenuElement;\n    machineType: PaperDropdownMenuElement\n}\n\ninterface IFLdUsersReducerState {\n  settings: IFUserSettings,\n  info: IFUserInformation,\n}\n\ninterface IFLdApplicationReducer {\n    serviceManuals: IFUserSettings,\n    loadingManuals: boolean,\n    result: IFDeployment\n    itemDelete: IFResponse,\n    isEditLoading: boolean,\n    isDeleteLoading: boolean,\n    isNewLoading: boolean,\n    addValue: IFLocationObject\n    editValue: IFLocationObject,\n    valueType: string\n    releaseNotes: IFReleaseNotesData,\n    loadingReleaseNotes: boolean,\n}\n\ninterface IFLdTimeseriesReducer {\n    activeVariable: IFVariables;\n    isSingleVariableLoading: boolean;\n    result: []\n}\n\ninterface IFLdTimeseriesCollectionsReducer {\n    activeCollection: IFCollections;\n    isSingleCollectionLoading: boolean;\n    result: []\n}\n\ninterface IFLdReduxState {\n    LdAssetsReducer: IFLdAssetsReducerState\n    LdUsersReducer: IFLdUsersReducerState\n    LdApplicationReducer: IFLdApplicationReducer\n    LdTimeseriesReducer: IFLdTimeseriesReducer\n    LdTimeseriesCollectionsReducer: IFLdTimeseriesCollectionsReducer\n}\n\ninterface IFDeployment {\n  device_id: string,\n  status: string | number,\n  deployments: Array<IFDeploymentList>\n}\n\ninterface IFDeploymentList {\n  name: string,\n  status: string,\n  reason: string,\n  creation_timestamp: string,\n  modified_timestamp: string\n}\n\ninterface IFMachinesList {\n  cell_position: string,\n  controller: string,\n  dates: {\n    start_of_production: number,\n    shipping: number,\n    startup: number,\n    swcp_portal: number,\n    swcp_support: number,\n    swmp_api: number,\n    swsp_line_mon: number,\n    swsp_trace: number\n  }\n  deleted: boolean,\n  machine_identifier_customer: string,\n  machine_type: string,\n  name: string\n  parent: string\n  uri: string\n  version_information: string\n  version_information_box: string\n}\n\ntype IFType = string | null | number;\n\ninterface IFAlarms extends Record<string, any> {\n  alarm_number: string,\n  categoryText?: string,\n  details?: string,\n  machineTimeFormatted?: string,\n  leftTimeFormatted?: string,\n  durationFormatted?: string,\n  machine_time?: string,\n  box_time?: string,\n  duration?: string,\n  left_time?: string,\n  category?: number,\n  trend?: TemplateResult,\n  countBeforehandTimeRange?: number,\n  countSelectedTimeRange?: number,\n  count?: number\n  alarmsId?: string\n}\n\ninterface IFGridColumns {\n  selection?: boolean;\n  assetId?: string,\n  column_align?: string,\n  column_width?: string,\n  disable_title?: boolean,\n  event?: string,\n  secondEvent?: string,\n  filter?: boolean,\n  hidden?: boolean,\n  icon?: IFIcon,\n  input?: IFInput,\n  id?: string,\n  initialSort?: string,\n  trafficLight?: IFTrafficLight,\n  status?: IFTrafficLight,\n  link?: IFLink,\n  sort?: boolean,\n  sortPath?: string,\n  filterPath?: string,\n  src?: string,\n  style?: string,\n  subKey?: string,\n  title?: string,\n  edit?: boolean,\n  visible_for_user_group?: Array<string> | null,\n  details?: boolean,\n  checkbox_label?: string,\n  groupStart?: boolean,\n  groupEnd?: boolean,\n  groupName?: string,\n  contextMenuOptions?: IFcontextMenuOptions,\n  tooltip?: string,\n  firstInArrayStyle?: string,\n  iot?: IFLIot,\n  renderOptions?: { clampLinesTo: number; }\n}\n\ninterface IFcontextMenuOptions {\n  link: Array<IFLink>,\n  inputOptions: Array<string>\n}\n\ninterface IFIcon {\n  style?: string,\n  src?: string,\n  srcLink?: string,\n  title?: string,\n  secondSrc?: string,\n  secondTitle?: string,\n  text?: string,\n  visible?: string\n}\n\ninterface IFInput {\n  min?: number,\n  max?: number,\n  value?: number,\n  hasContorl?: boolean,\n  field: string\n  id?: string\n}\n\ninterface IFTrafficLight {\n  color?: string,\n  text?: string,\n  icon?: boolean\n}\n\ninterface IFLink {\n  field?: string,\n  prefix?: string,\n  suffix?: string\n}\n\ninterface IFLIot {\n  color?: string,\n  onlineTime?: string,\n}\n\ninterface IFMachines {\n  machine_identifier_customer: string,\n  machine_type: string,\n  dates: {\n    swcp_portal?: number | null | string,\n    swcp_portal_new?: number | null | string,\n    warranty_start?: number,\n    swmp_api?: number,\n    shipping?: number,\n    swcp_support?: number,\n    swsp_trace?: number,\n    startup?: number,\n    start_of_production?: number,\n    warranty_end?: number,\n    swsp_line_mon?: number\n  },\n  references: {\n    s3: string,\n    ssm: string,\n    greengrass: string,\n    iot: string\n  },\n  version_information: {\n    nc_version: string,\n    plc_version: string,\n    plc_user_program_version: string,\n    plc_toolbox_version: string,\n    operating_system: string,\n    hmi_version: string,\n    compile_cycles: [\n      {\n        name: string,\n        version: string\n      },\n      {\n        name: string,\n        version: string\n      }\n    ]\n  },\n  uri: string,\n  parent: string,\n  cell_position: string,\n  name: string,\n  controller: string,\n  id: string,\n  sendingLabel?: string,\n  sendingColor?: string,\n  sendingTime?: string,\n}\n\ninterface IFUser {\n  id: string,\n  company: string,\n  locale: string,\n  given_name: string,\n  phone_number: string,\n  family_name: string,\n  role: string,\n  email: string,\n  user_id: string,\n}\n\n\n\ninterface IFDatesThat {\n  _preselectedDate: string,\n  _dateRange: { from: string | number, to: string | number }\n  selectedTimeFilter: string;\n}\n\ninterface IFResult {\n  status: string;\n}\n\n\ninterface IFCoordinates {\n  latitude?: number;\n  longitude?: number;\n  default?: boolean;\n  lat?: string;\n  lon?: string;\n}\n\ninterface IFAddress {\n  city: string;\n  coordinates: IFCoordinates;\n  country: string;\n  state: string;\n  street: string;\n  zipcode: string;\n}\n\ninterface IFCompany {\n  name: string;\n  description: string;\n  customer_number: string;\n  address: IFAddress;\n  industry_sector: string;\n  legal_form: string;\n  email: string;\n  website: string;\n}\n\ninterface IFLocation {\n  name: string;\n  description: string;\n  customer_number: string;\n  address: IFAddress;\n  language: string;\n  email: string;\n  website: string;\n}\n\ninterface IFHallObject {\n  coordinates?: IFCoordinates;\n  description: string;\n  name: string;\n  parent: string;\n  uri?: string;\n}\n\ninterface IFLineObject {\n  description: string;\n  name: string;\n  parent: string;\n  uri?: string;\n}\n\ninterface IFUserSettings {\n  releaseNote?: {\n    readInfo: boolean;\n    release_number: string;\n  };\n  readInfo?: boolean;\n  release_number?: number\n  releaseNotesNumber?: {\n    readInfo: boolean;\n    release_number: string;\n  }\n  breadcrumb: boolean;\n}\n\ninterface IFPageModule {\n  id: string;\n  name: string;\n  icon?: string;\n  href: string;\n  swOnly?: boolean;\n  restrictedTo?: string[];\n  show?: boolean;\n}\n\ninterface IFArrayOfPageModules extends Array<IFPageModule> {\n}\n\ninterface IFReleaseInfo {\n  release_number: string\n  readInfo: boolean\n  start: number,\n  end: number\n}\n\ninterface IFLocationObject {\n  address: {\n    city: string;\n    coordinates: IFCoordinates;\n    country: string;\n    state: string;\n    street: string;\n    zipcode: string;\n  };\n  description: string;\n  customer_number: string;\n  email?: string;\n  language?: string;\n  name: string;\n  parent?: string;\n  website?: string;\n  uri?: string\n  legal_form?: string,\n  industry_sector?: string,\n}\n\ninterface IFMachineTypeInstance {\n  id: string;\n  machineType: string;\n  dataType: IFMachineDataType | '';\n  formInputs: IFFormFieldLocation[];\n  machineData?: any;\n}\n\ntype IFMachineDataType = 'nc_common' | 'nc_block' | 'plc';\n\ninterface IFDescriptionField {\n  id: string;\n  locale: string;\n  value: string;\n}\n\ninterface IFCollections {\n    collectionName: string;\n    displayName: string;\n    id: string;\n    visibilityType: string;\n    tags?: Set<string>;\n    uiRelevant?: boolean;\n    variables?: IFVariables[] | string[];\n    description?: { [key: string]: string };\n}\n\ninterface IFVariables {\n  displayName: string;\n  namePrefix: string;\n  chartType: string;\n  maxTime: string;\n  dataType: string;\n  visibilityType: string;\n  machineType?: string;\n  showInitial: boolean;\n  uiRelevant?: boolean;\n  collections?: string;\n  description?: {[key: string]: string};\n  unit?: string;\n  tags?: Set<string>; // Defined as Set to match backend\n  variableId?: string;\n  id?: string;\n  machine?: {\n    [machineKey: string]: {\n      brokerDataType?: string;\n      machineDataType?: string;\n      type?: string;\n      address?: string;\n      bufferSize?: number | string;\n      intervalInS?: number;\n      onChange?: boolean | string;\n      classicAddress?: string;\n      symbolicAddress?: string;\n      nckArea?: string;\n      nckBlock?: number;\n      nckLine?: number;\n      nckColumn?: number;\n      row?: number;\n      column?: number;\n      rowCount?: number;\n      [key: string]: string | number | boolean | undefined;\n    };\n  };\n}\n\ninterface IFFormFieldsVariables {\n    displayName: PaperInputElement;\n    namePrefix: PaperInputElement;\n    chartType: PaperDropdownMenuElement;\n    maxTime: PaperDropdownMenuElement;\n    dataType: PaperDropdownMenuElement;\n    visibilityType: PaperDropdownMenuElement;\n    showInitial: PaperDropdownMenuElement;\n    machineType: PaperDropdownMenuElement\n}\n\ninterface IFCoordinatesElementValue {\n  location: {\n    coordinates: {\n      latitude: number;\n      longitude: number;\n    };\n    displayName: string;\n  };\n  default: boolean;\n}\n\n\ninterface IFCompanyInfo {\n  id: string;\n  name: string;\n  uri: string;\n}\n\ninterface IFFormInput {\n  id: string;\n  key: string;\n  tabIndex: number;\n  type: string;\n  label: string;\n  errorMessage?: string;\n  value: string | Array<{ id: string; name?: string; title?: string }>;\n  validation?: string[];\n  readonly?: boolean;\n  pattern?: string;\n  class?: string;\n  placeholder?: string;\n  searchPlaceholder?: string;\n  selected?: string;\n}\n\n\ninterface IFUserRequestResult {\n  response?: {\n    status: number;\n    ok: boolean;\n  };\n  ok?: boolean;\n  status?: number;\n}\n\ninterface IFReduxState {\n  LdUserManagementReducer: {\n    companyInfo?: IFCompanyInfo;\n    userInfoId?: IFUserInformation;\n    isUserInfoIdLoading: boolean;\n    userRequestResult?: IFUserRequestResult | boolean;\n    userRequestType?: string;\n    isUserRequestLoading: boolean;\n    result?: { status: string };\n    deletedUser?: IFUserRequestResult | Error;\n    userMail?: IFUserRequestResult | Error;\n  };\n  LdAssetsReducer: {\n    companies?: IFCompanyInfo[];\n    loadingCompanies: boolean;\n  };\n}\n\ninterface IFDropdownValue {\n  id?: string;\n  key?: string;\n  value?: string;\n  name?: string;\n  title?: string;\n}\n\ninterface IFLdSearchableDropdown {\n  id: string;\n  label?: string;\n  errorMessage?: string;\n  name?: string;\n  noLabelFloat?: boolean;\n  invalid?: boolean;\n  readonly?: boolean;\n  required?: boolean;\n  tabindex?: number;\n  placeholder?: string;\n  searchPlaceholder?: string;\n  selected?: boolean;\n  value?: IFLdDropdownListboxItemSearch[];\n  clearable?: boolean;\n  maxHeight?: string;\n}\n\ninterface IFLdDropdownListboxItemSearch {\n  key: string;\n  value: string;\n  id?: string;\n  name?: string;\n  title?: string;\n  metadata?: Record<string, unknown>;\n}\n\ninterface IFChartConfiguration {\n  key: string,\n  url: string,\n  id: string,\n  title: string,\n  chartTitleIcon?: boolean,\n  chartTitleIconText?: TemplateResult,\n  machineId: string,\n  vars: [string],\n  dontSynctooltip: boolean\n  chartSize?: { width: number, height: number }\n}\n\ninterface IFResponse {\n  response: IFGroupResponse\n}\n\ninterface IFGroupResponse {\n  status: number;\n  data: {\n    groupId: string;\n    groupName: string;\n    members: {\n      userId: string;\n      userName: string;\n    }[];\n    createdAt: string;\n    updatedAt: string;\n  } | null;\n  error?: {\n    code: number;\n    message: string;\n  };\n}\n\ninterface IFFormField {\n  errorMessage?: string;\n  id: string;\n  label?: string;\n  type?: string;\n  value: string;\n  key?: string;\n  isValidField?: boolean;\n  fieldDefinition?: IFFormInput;\n  domNode?: HTMLElement;\n}\n\ninterface IFSelection {\n  id: string;\n  displayName: string;\n  showDatepicker: boolean;\n}\n\ninterface IFShopfloorValue {\n  asset_id: string;\n  x_position: number;\n  y_position: number;\n}\n\ninterface IFAsset {\n  id: string;\n  name: string;\n  machine_identifier_customer: string;\n  dates?: {\n    swcp_portal?: string;\n  };\n}\n\ninterface IFMultiCurrentValue {\n  chartId: string;\n  multiCurrentValueList: Record<string, Array<{ value: [number, number] }>>;\n}\n\ninterface IFLoadingState {\n  chartId: string;\n  loading: boolean;\n}\n\ninterface ShopfloorItem {\n  position: {\n      top: number;\n      left: number;\n  };\n  active:{\n     left: string | null;\n     center: string | null;\n     right: string | null\n  };\n  id: string;\n  title: string;\n  href: string;\n  type: string;\n}\n\ninterface ShopfloorConfiguration{\n  positionUnit: string,\n  floatingPositions: boolean,\n  items: {\n    type: string,\n    colors: Array<string>;\n    allowMultiple: boolean,\n  },\n}\n\ninterface IFAxisTest {\n  testType: string;\n  testAxisType: string;\n  measurementSeries: string;\n  [key: string]: any;\n}\n\ninterface IFGroupedData {\n  [key: string]: IFGroupedData | IFAxisTest[];\n}\n\n\ninterface IFAxisSelectedEvent extends CustomEvent {\n  detail: {\n    axis: string;\n    testType: string;\n    measurementSeries: string[];\n    selectedSeries: string;\n  };\n}\n\ninterface IFResultSelectedEvent extends CustomEvent {\n  detail: IFAxisTest;\n}\n\ninterface IFAxisSelectedDetail {\n  axis: string;\n  testType: string;\n  measurementSeries: string[];\n  selectedSeries: string;\n}\n\ninterface IFGroupedResults {\n  [measurementSeries: string]: IFAxisTest[];\n}\n\nexport interface IFTreeNodeData {\n  key: string;\n  icon: string | null;\n  children: IFTreeNodeData[] | IFAxisTest[];\n}\nexport {\n    IFGroupedResults,\n    IFResultSelectedEvent,\n    IFAxisSelectedEvent,\n    IFAxisSelectedDetail,\n    IFGroupedData,\n    IFAxisTest,\n    IFCollections,\n    IFMachineTypeInstance,\n    IFMachineDataType,\n    IFDescriptionField,\n    IFLoadingState,\n    IFMultiCurrentValue,\n    IFAsset,\n    IFShopfloorValue,\n    IFSelection,\n    IFGridColumns,\n    IFcontextMenuOptions,\n    IFIcon,\n    IFInput,\n    IFLink,\n    IFLIot,\n    IFAlarmsValue,\n    IFTrafficLight,\n    IFBreadcrumbObject,\n    IFBreadCrumbReducer,\n    IFBreadCrumbConfigObject,\n    IFChartConfiguration,\n    IFDeploymentList,\n    IFDeployment,\n    IFDatesThat,\n    IFNcStateFileData,\n    IFManuals,\n    IFAlarms,\n    IFMulitValue,\n    IFMachineTypes,\n    IFMachinesList,\n    IFMachines,\n    IFUser,\n    IFType,\n    IFTvObject,\n    IFSeries,\n    IFAlarmsOptions,\n    IFTVList,\n    IFUserInformation,\n    IFFormFieldsVariables,\n    IFTvUrl,\n    IFtvLinks,\n    IFResult,\n    IFHallObject,\n    IFCoordinates,\n    IFLineObject,\n    IFLocationObject,\n    IFCoordinatesElementValue,\n    IFUserSettings,\n    IFLdAssetsReducerState,\n    IFLdReduxState,\n    IFAddress,\n    IFCompany,\n    IFLocation,\n    IFGroupResponse,\n    IFPageModules,\n    IFPageModule,\n    IFResponse,\n    IFFormField,\n    IFFormFieldLocation,\n    IFCoordinatesElement,\n    IFFormFieldLocationWithTemplate,\n    IFVariables,\n    IFUserPrivacyPolicyStatus,\n    IFReleaseInfo,\n    IFArrayOfPageModules,\n    IFReleaseNotesItem,\n    IFReleaseNotesData,\n    IFReleaseNotesFeature,\n    IFDropdownValue,\n    IFLdSearchableDropdown,\n    IFLdDropdownListboxItemSearch,\n    IFCompanyInfo,\n    IFFormInput,\n    IFUserRequestResult,\n    IFReduxState,\n  IFTreeNode,\n  ShopfloorItem,\n  ShopfloorConfiguration\n};\n","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/** @class */\nvar AuthenticationDetails = /*#__PURE__*/function () {\n  /**\n   * Constructs a new AuthenticationDetails object\n   * @param {object=} data Creation options.\n   * @param {string} data.Username User being authenticated.\n   * @param {string} data.Password Plain-text password to authenticate with.\n   * @param {(AttributeArg[])?} data.ValidationData Application extra metadata.\n   * @param {(AttributeArg[])?} data.AuthParamaters Authentication paramaters for custom auth.\n   */\n  function AuthenticationDetails(data) {\n    var _ref = data || {},\n      ValidationData = _ref.ValidationData,\n      Username = _ref.Username,\n      Password = _ref.Password,\n      AuthParameters = _ref.AuthParameters,\n      ClientMetadata = _ref.ClientMetadata;\n    this.validationData = ValidationData || {};\n    this.authParameters = AuthParameters || {};\n    this.clientMetadata = ClientMetadata || {};\n    this.username = Username;\n    this.password = Password;\n  }\n\n  /**\n   * @returns {string} the record's username\n   */\n  var _proto = AuthenticationDetails.prototype;\n  _proto.getUsername = function getUsername() {\n    return this.username;\n  }\n\n  /**\n   * @returns {string} the record's password\n   */;\n  _proto.getPassword = function getPassword() {\n    return this.password;\n  }\n\n  /**\n   * @returns {Array} the record's validationData\n   */;\n  _proto.getValidationData = function getValidationData() {\n    return this.validationData;\n  }\n\n  /**\n   * @returns {Array} the record's authParameters\n   */;\n  _proto.getAuthParameters = function getAuthParameters() {\n    return this.authParameters;\n  }\n\n  /**\n   * @returns {ClientMetadata} the clientMetadata for a Lambda trigger\n   */;\n  _proto.getClientMetadata = function getClientMetadata() {\n    return this.clientMetadata;\n  };\n  return AuthenticationDetails;\n}();\nexport { AuthenticationDetails as default };","var crypto;\n\n// Native crypto from window (Browser)\nif (typeof window !== 'undefined' && window.crypto) {\n  crypto = window.crypto;\n}\n\n// Native (experimental IE 11) crypto from window (Browser)\nif (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n  crypto = window.msCrypto;\n}\n\n// Native crypto from global (NodeJS)\nif (!crypto && typeof global !== 'undefined' && global.crypto) {\n  crypto = global.crypto;\n}\n\n// Native crypto import via require (NodeJS)\nif (!crypto && typeof require === 'function') {\n  try {\n    crypto = require('crypto');\n  } catch (err) {}\n}\n\n/*\n * Cryptographically secure pseudorandom number generator\n * As Math.random() is cryptographically not safe to use\n */\nexport default function cryptoSecureRandomInt() {\n  if (crypto) {\n    // Use getRandomValues method (Browser)\n    if (typeof crypto.getRandomValues === 'function') {\n      try {\n        return crypto.getRandomValues(new Uint32Array(1))[0];\n      } catch (err) {}\n    }\n\n    // Use randomBytes method (NodeJS)\n    if (typeof crypto.randomBytes === 'function') {\n      try {\n        return crypto.randomBytes(4).readInt32LE();\n      } catch (err) {}\n    }\n  }\n  throw new Error('Native crypto module could not be used to get secure random number.');\n}","import cryptoSecureRandomInt from './cryptoSecureRandomInt';\n\n/**\n * Hex encoding strategy.\n * Converts a word array to a hex string.\n * @param {WordArray} wordArray The word array.\n * @return {string} The hex string.\n * @static\n */\nfunction hexStringify(wordArray) {\n  // Shortcuts\n  var words = wordArray.words;\n  var sigBytes = wordArray.sigBytes;\n\n  // Convert\n  var hexChars = [];\n  for (var i = 0; i < sigBytes; i++) {\n    var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 0xff;\n    hexChars.push((bite >>> 4).toString(16));\n    hexChars.push((bite & 0x0f).toString(16));\n  }\n  return hexChars.join('');\n}\nvar WordArray = /*#__PURE__*/function () {\n  function WordArray(words, sigBytes) {\n    words = this.words = words || [];\n    if (sigBytes != undefined) {\n      this.sigBytes = sigBytes;\n    } else {\n      this.sigBytes = words.length * 4;\n    }\n  }\n  var _proto = WordArray.prototype;\n  _proto.random = function random(nBytes) {\n    var words = [];\n    for (var i = 0; i < nBytes; i += 4) {\n      words.push(cryptoSecureRandomInt());\n    }\n    return new WordArray(words, nBytes);\n  };\n  _proto.toString = function toString() {\n    return hexStringify(this);\n  };\n  return WordArray;\n}();\nexport { WordArray as default };","// A small implementation of BigInteger based on http://www-cs-students.stanford.edu/~tjw/jsbn/\n//\n// All public methods have been removed except the following:\n//   new BigInteger(a, b) (only radix 2, 4, 8, 16 and 32 supported)\n//   toString (only radix 2, 4, 8, 16 and 32 supported)\n//   negate\n//   abs\n//   compareTo\n//   bitLength\n//   mod\n//   equals\n//   add\n//   subtract\n//   multiply\n//   divide\n//   modPow\n\nexport default BigInteger;\n\n/*\n * Copyright (c) 2003-2005  Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\n// (public) Constructor\nfunction BigInteger(a, b) {\n  if (a != null) this.fromString(a, b);\n}\n\n// return new, unset BigInteger\nfunction nbi() {\n  return new BigInteger(null);\n}\n\n// Bits per digit\nvar dbits;\n\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = (canary & 0xffffff) == 0xefcafe;\n\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i, x, w, j, c, n) {\n  while (--n >= 0) {\n    var v = x * this[i++] + w[j] + c;\n    c = Math.floor(v / 0x4000000);\n    w[j++] = v & 0x3ffffff;\n  }\n  return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i, x, w, j, c, n) {\n  var xl = x & 0x7fff,\n    xh = x >> 15;\n  while (--n >= 0) {\n    var l = this[i] & 0x7fff;\n    var h = this[i++] >> 15;\n    var m = xh * l + h * xl;\n    l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\n    c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\n    w[j++] = l & 0x3fffffff;\n  }\n  return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i, x, w, j, c, n) {\n  var xl = x & 0x3fff,\n    xh = x >> 14;\n  while (--n >= 0) {\n    var l = this[i] & 0x3fff;\n    var h = this[i++] >> 14;\n    var m = xh * l + h * xl;\n    l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\n    c = (l >> 28) + (m >> 14) + xh * h;\n    w[j++] = l & 0xfffffff;\n  }\n  return c;\n}\nvar inBrowser = typeof navigator !== 'undefined';\nif (inBrowser && j_lm && navigator.appName == 'Microsoft Internet Explorer') {\n  BigInteger.prototype.am = am2;\n  dbits = 30;\n} else if (inBrowser && j_lm && navigator.appName != 'Netscape') {\n  BigInteger.prototype.am = am1;\n  dbits = 26;\n} else {\n  // Mozilla/Netscape seems to prefer am3\n  BigInteger.prototype.am = am3;\n  dbits = 28;\n}\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = (1 << dbits) - 1;\nBigInteger.prototype.DV = 1 << dbits;\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2, BI_FP);\nBigInteger.prototype.F1 = BI_FP - dbits;\nBigInteger.prototype.F2 = 2 * dbits - BI_FP;\n\n// Digit conversions\nvar BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz';\nvar BI_RC = new Array();\nvar rr, vv;\nrr = '0'.charCodeAt(0);\nfor (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = 'a'.charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = 'A'.charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nfunction int2char(n) {\n  return BI_RM.charAt(n);\n}\nfunction intAt(s, i) {\n  var c = BI_RC[s.charCodeAt(i)];\n  return c == null ? -1 : c;\n}\n\n// (protected) copy this to r\nfunction bnpCopyTo(r) {\n  for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];\n  r.t = this.t;\n  r.s = this.s;\n}\n\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x) {\n  this.t = 1;\n  this.s = x < 0 ? -1 : 0;\n  if (x > 0) this[0] = x;else if (x < -1) this[0] = x + this.DV;else this.t = 0;\n}\n\n// return bigint initialized to value\nfunction nbv(i) {\n  var r = nbi();\n  r.fromInt(i);\n  return r;\n}\n\n// (protected) set from string and radix\nfunction bnpFromString(s, b) {\n  var k;\n  if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else throw new Error('Only radix 2, 4, 8, 16, 32 are supported');\n  this.t = 0;\n  this.s = 0;\n  var i = s.length,\n    mi = false,\n    sh = 0;\n  while (--i >= 0) {\n    var x = intAt(s, i);\n    if (x < 0) {\n      if (s.charAt(i) == '-') mi = true;\n      continue;\n    }\n    mi = false;\n    if (sh == 0) this[this.t++] = x;else if (sh + k > this.DB) {\n      this[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh;\n      this[this.t++] = x >> this.DB - sh;\n    } else this[this.t - 1] |= x << sh;\n    sh += k;\n    if (sh >= this.DB) sh -= this.DB;\n  }\n  this.clamp();\n  if (mi) BigInteger.ZERO.subTo(this, this);\n}\n\n// (protected) clamp off excess high words\nfunction bnpClamp() {\n  var c = this.s & this.DM;\n  while (this.t > 0 && this[this.t - 1] == c) --this.t;\n}\n\n// (public) return string representation in given radix\nfunction bnToString(b) {\n  if (this.s < 0) return '-' + this.negate().toString(b);\n  var k;\n  if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else throw new Error('Only radix 2, 4, 8, 16, 32 are supported');\n  var km = (1 << k) - 1,\n    d,\n    m = false,\n    r = '',\n    i = this.t;\n  var p = this.DB - i * this.DB % k;\n  if (i-- > 0) {\n    if (p < this.DB && (d = this[i] >> p) > 0) {\n      m = true;\n      r = int2char(d);\n    }\n    while (i >= 0) {\n      if (p < k) {\n        d = (this[i] & (1 << p) - 1) << k - p;\n        d |= this[--i] >> (p += this.DB - k);\n      } else {\n        d = this[i] >> (p -= k) & km;\n        if (p <= 0) {\n          p += this.DB;\n          --i;\n        }\n      }\n      if (d > 0) m = true;\n      if (m) r += int2char(d);\n    }\n  }\n  return m ? r : '0';\n}\n\n// (public) -this\nfunction bnNegate() {\n  var r = nbi();\n  BigInteger.ZERO.subTo(this, r);\n  return r;\n}\n\n// (public) |this|\nfunction bnAbs() {\n  return this.s < 0 ? this.negate() : this;\n}\n\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a) {\n  var r = this.s - a.s;\n  if (r != 0) return r;\n  var i = this.t;\n  r = i - a.t;\n  if (r != 0) return this.s < 0 ? -r : r;\n  while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;\n  return 0;\n}\n\n// returns bit length of the integer x\nfunction nbits(x) {\n  var r = 1,\n    t;\n  if ((t = x >>> 16) != 0) {\n    x = t;\n    r += 16;\n  }\n  if ((t = x >> 8) != 0) {\n    x = t;\n    r += 8;\n  }\n  if ((t = x >> 4) != 0) {\n    x = t;\n    r += 4;\n  }\n  if ((t = x >> 2) != 0) {\n    x = t;\n    r += 2;\n  }\n  if ((t = x >> 1) != 0) {\n    x = t;\n    r += 1;\n  }\n  return r;\n}\n\n// (public) return the number of bits in \"this\"\nfunction bnBitLength() {\n  if (this.t <= 0) return 0;\n  return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM);\n}\n\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n, r) {\n  var i;\n  for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];\n  for (i = n - 1; i >= 0; --i) r[i] = 0;\n  r.t = this.t + n;\n  r.s = this.s;\n}\n\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n, r) {\n  for (var i = n; i < this.t; ++i) r[i - n] = this[i];\n  r.t = Math.max(this.t - n, 0);\n  r.s = this.s;\n}\n\n// (protected) r = this << n\nfunction bnpLShiftTo(n, r) {\n  var bs = n % this.DB;\n  var cbs = this.DB - bs;\n  var bm = (1 << cbs) - 1;\n  var ds = Math.floor(n / this.DB),\n    c = this.s << bs & this.DM,\n    i;\n  for (i = this.t - 1; i >= 0; --i) {\n    r[i + ds + 1] = this[i] >> cbs | c;\n    c = (this[i] & bm) << bs;\n  }\n  for (i = ds - 1; i >= 0; --i) r[i] = 0;\n  r[ds] = c;\n  r.t = this.t + ds + 1;\n  r.s = this.s;\n  r.clamp();\n}\n\n// (protected) r = this >> n\nfunction bnpRShiftTo(n, r) {\n  r.s = this.s;\n  var ds = Math.floor(n / this.DB);\n  if (ds >= this.t) {\n    r.t = 0;\n    return;\n  }\n  var bs = n % this.DB;\n  var cbs = this.DB - bs;\n  var bm = (1 << bs) - 1;\n  r[0] = this[ds] >> bs;\n  for (var i = ds + 1; i < this.t; ++i) {\n    r[i - ds - 1] |= (this[i] & bm) << cbs;\n    r[i - ds] = this[i] >> bs;\n  }\n  if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;\n  r.t = this.t - ds;\n  r.clamp();\n}\n\n// (protected) r = this - a\nfunction bnpSubTo(a, r) {\n  var i = 0,\n    c = 0,\n    m = Math.min(a.t, this.t);\n  while (i < m) {\n    c += this[i] - a[i];\n    r[i++] = c & this.DM;\n    c >>= this.DB;\n  }\n  if (a.t < this.t) {\n    c -= a.s;\n    while (i < this.t) {\n      c += this[i];\n      r[i++] = c & this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  } else {\n    c += this.s;\n    while (i < a.t) {\n      c -= a[i];\n      r[i++] = c & this.DM;\n      c >>= this.DB;\n    }\n    c -= a.s;\n  }\n  r.s = c < 0 ? -1 : 0;\n  if (c < -1) r[i++] = this.DV + c;else if (c > 0) r[i++] = c;\n  r.t = i;\n  r.clamp();\n}\n\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a, r) {\n  var x = this.abs(),\n    y = a.abs();\n  var i = x.t;\n  r.t = i + y.t;\n  while (--i >= 0) r[i] = 0;\n  for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\n  r.s = 0;\n  r.clamp();\n  if (this.s != a.s) BigInteger.ZERO.subTo(r, r);\n}\n\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r) {\n  var x = this.abs();\n  var i = r.t = 2 * x.t;\n  while (--i >= 0) r[i] = 0;\n  for (i = 0; i < x.t - 1; ++i) {\n    var c = x.am(i, x[i], r, 2 * i, 0, 1);\n    if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\n      r[i + x.t] -= x.DV;\n      r[i + x.t + 1] = 1;\n    }\n  }\n  if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\n  r.s = 0;\n  r.clamp();\n}\n\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m.  q or r may be null.\nfunction bnpDivRemTo(m, q, r) {\n  var pm = m.abs();\n  if (pm.t <= 0) return;\n  var pt = this.abs();\n  if (pt.t < pm.t) {\n    if (q != null) q.fromInt(0);\n    if (r != null) this.copyTo(r);\n    return;\n  }\n  if (r == null) r = nbi();\n  var y = nbi(),\n    ts = this.s,\n    ms = m.s;\n  var nsh = this.DB - nbits(pm[pm.t - 1]);\n  // normalize modulus\n  if (nsh > 0) {\n    pm.lShiftTo(nsh, y);\n    pt.lShiftTo(nsh, r);\n  } else {\n    pm.copyTo(y);\n    pt.copyTo(r);\n  }\n  var ys = y.t;\n  var y0 = y[ys - 1];\n  if (y0 == 0) return;\n  var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0);\n  var d1 = this.FV / yt,\n    d2 = (1 << this.F1) / yt,\n    e = 1 << this.F2;\n  var i = r.t,\n    j = i - ys,\n    t = q == null ? nbi() : q;\n  y.dlShiftTo(j, t);\n  if (r.compareTo(t) >= 0) {\n    r[r.t++] = 1;\n    r.subTo(t, r);\n  }\n  BigInteger.ONE.dlShiftTo(ys, t);\n  t.subTo(y, y);\n  // \"negative\" y so we can replace sub with am later\n  while (y.t < ys) y[y.t++] = 0;\n  while (--j >= 0) {\n    // Estimate quotient digit\n    var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\n    if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) {\n      // Try it out\n      y.dlShiftTo(j, t);\n      r.subTo(t, r);\n      while (r[i] < --qd) r.subTo(t, r);\n    }\n  }\n  if (q != null) {\n    r.drShiftTo(ys, q);\n    if (ts != ms) BigInteger.ZERO.subTo(q, q);\n  }\n  r.t = ys;\n  r.clamp();\n  if (nsh > 0) r.rShiftTo(nsh, r);\n  // Denormalize remainder\n  if (ts < 0) BigInteger.ZERO.subTo(r, r);\n}\n\n// (public) this mod a\nfunction bnMod(a) {\n  var r = nbi();\n  this.abs().divRemTo(a, null, r);\n  if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);\n  return r;\n}\n\n// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n// justification:\n//         xy == 1 (mod m)\n//         xy =  1+km\n//   xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply \"overflows\" differently from C/C++, so care is needed here.\nfunction bnpInvDigit() {\n  if (this.t < 1) return 0;\n  var x = this[0];\n  if ((x & 1) == 0) return 0;\n  var y = x & 3;\n  // y == 1/x mod 2^2\n  y = y * (2 - (x & 0xf) * y) & 0xf;\n  // y == 1/x mod 2^4\n  y = y * (2 - (x & 0xff) * y) & 0xff;\n  // y == 1/x mod 2^8\n  y = y * (2 - ((x & 0xffff) * y & 0xffff)) & 0xffff;\n  // y == 1/x mod 2^16\n  // last step - calculate inverse mod DV directly;\n  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n  y = y * (2 - x * y % this.DV) % this.DV;\n  // y == 1/x mod 2^dbits\n  // we really want the negative inverse, and -DV < y < DV\n  return y > 0 ? this.DV - y : -y;\n}\nfunction bnEquals(a) {\n  return this.compareTo(a) == 0;\n}\n\n// (protected) r = this + a\nfunction bnpAddTo(a, r) {\n  var i = 0,\n    c = 0,\n    m = Math.min(a.t, this.t);\n  while (i < m) {\n    c += this[i] + a[i];\n    r[i++] = c & this.DM;\n    c >>= this.DB;\n  }\n  if (a.t < this.t) {\n    c += a.s;\n    while (i < this.t) {\n      c += this[i];\n      r[i++] = c & this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  } else {\n    c += this.s;\n    while (i < a.t) {\n      c += a[i];\n      r[i++] = c & this.DM;\n      c >>= this.DB;\n    }\n    c += a.s;\n  }\n  r.s = c < 0 ? -1 : 0;\n  if (c > 0) r[i++] = c;else if (c < -1) r[i++] = this.DV + c;\n  r.t = i;\n  r.clamp();\n}\n\n// (public) this + a\nfunction bnAdd(a) {\n  var r = nbi();\n  this.addTo(a, r);\n  return r;\n}\n\n// (public) this - a\nfunction bnSubtract(a) {\n  var r = nbi();\n  this.subTo(a, r);\n  return r;\n}\n\n// (public) this * a\nfunction bnMultiply(a) {\n  var r = nbi();\n  this.multiplyTo(a, r);\n  return r;\n}\n\n// (public) this / a\nfunction bnDivide(a) {\n  var r = nbi();\n  this.divRemTo(a, r, null);\n  return r;\n}\n\n// Montgomery reduction\nfunction Montgomery(m) {\n  this.m = m;\n  this.mp = m.invDigit();\n  this.mpl = this.mp & 0x7fff;\n  this.mph = this.mp >> 15;\n  this.um = (1 << m.DB - 15) - 1;\n  this.mt2 = 2 * m.t;\n}\n\n// xR mod m\nfunction montConvert(x) {\n  var r = nbi();\n  x.abs().dlShiftTo(this.m.t, r);\n  r.divRemTo(this.m, null, r);\n  if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);\n  return r;\n}\n\n// x/R mod m\nfunction montRevert(x) {\n  var r = nbi();\n  x.copyTo(r);\n  this.reduce(r);\n  return r;\n}\n\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x) {\n  while (x.t <= this.mt2)\n  // pad x so am has enough room later\n  x[x.t++] = 0;\n  for (var i = 0; i < this.m.t; ++i) {\n    // faster way of calculating u0 = x[i]*mp mod DV\n    var j = x[i] & 0x7fff;\n    var u0 = j * this.mpl + ((j * this.mph + (x[i] >> 15) * this.mpl & this.um) << 15) & x.DM;\n    // use am to combine the multiply-shift-add into one call\n    j = i + this.m.t;\n    x[j] += this.m.am(0, u0, x, i, 0, this.m.t);\n    // propagate carry\n    while (x[j] >= x.DV) {\n      x[j] -= x.DV;\n      x[++j]++;\n    }\n  }\n  x.clamp();\n  x.drShiftTo(this.m.t, x);\n  if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\n}\n\n// r = \"x^2/R mod m\"; x != r\nfunction montSqrTo(x, r) {\n  x.squareTo(r);\n  this.reduce(r);\n}\n\n// r = \"xy/R mod m\"; x,y != r\nfunction montMulTo(x, y, r) {\n  x.multiplyTo(y, r);\n  this.reduce(r);\n}\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n\n// (public) this^e % m (HAC 14.85)\nfunction bnModPow(e, m, callback) {\n  var i = e.bitLength(),\n    k,\n    r = nbv(1),\n    z = new Montgomery(m);\n  if (i <= 0) return r;else if (i < 18) k = 1;else if (i < 48) k = 3;else if (i < 144) k = 4;else if (i < 768) k = 5;else k = 6;\n\n  // precomputation\n  var g = new Array(),\n    n = 3,\n    k1 = k - 1,\n    km = (1 << k) - 1;\n  g[1] = z.convert(this);\n  if (k > 1) {\n    var g2 = nbi();\n    z.sqrTo(g[1], g2);\n    while (n <= km) {\n      g[n] = nbi();\n      z.mulTo(g2, g[n - 2], g[n]);\n      n += 2;\n    }\n  }\n  var j = e.t - 1,\n    w,\n    is1 = true,\n    r2 = nbi(),\n    t;\n  i = nbits(e[j]) - 1;\n  while (j >= 0) {\n    if (i >= k1) w = e[j] >> i - k1 & km;else {\n      w = (e[j] & (1 << i + 1) - 1) << k1 - i;\n      if (j > 0) w |= e[j - 1] >> this.DB + i - k1;\n    }\n    n = k;\n    while ((w & 1) == 0) {\n      w >>= 1;\n      --n;\n    }\n    if ((i -= n) < 0) {\n      i += this.DB;\n      --j;\n    }\n    if (is1) {\n      // ret == 1, don't bother squaring or multiplying it\n      g[w].copyTo(r);\n      is1 = false;\n    } else {\n      while (n > 1) {\n        z.sqrTo(r, r2);\n        z.sqrTo(r2, r);\n        n -= 2;\n      }\n      if (n > 0) z.sqrTo(r, r2);else {\n        t = r;\n        r = r2;\n        r2 = t;\n      }\n      z.mulTo(r2, g[w], r);\n    }\n    while (j >= 0 && (e[j] & 1 << i) == 0) {\n      z.sqrTo(r, r2);\n      t = r;\n      r = r2;\n      r2 = t;\n      if (--i < 0) {\n        i = this.DB - 1;\n        --j;\n      }\n    }\n  }\n  var result = z.revert(r);\n  callback(null, result);\n  return result;\n}\n\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.addTo = bnpAddTo;\n\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.modPow = bnModPow;\n\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Buffer } from 'buffer';\nimport WordArray from './utils/WordArray';\nimport { Sha256 } from '@aws-crypto/sha256-js';\n\n/**\n * Returns a Buffer with a sequence of random nBytes\n *\n * @param {number} nBytes\n * @returns {Buffer} fixed-length sequence of random bytes\n */\n\nfunction randomBytes(nBytes) {\n  return Buffer.from(new WordArray().random(nBytes).toString(), 'hex');\n}\nimport BigInteger from './BigInteger';\n\n/**\n * Tests if a hex string has it most significant bit set (case-insensitive regex)\n */\nvar HEX_MSB_REGEX = /^[89a-f]/i;\nvar initN = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1' + '29024E088A67CC74020BBEA63B139B22514A08798E3404DD' + 'EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245' + 'E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D' + 'C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F' + '83655D23DCA3AD961C62F356208552BB9ED529077096966D' + '670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9' + 'DE2BCBF6955817183995497CEA956AE515D2261898FA0510' + '15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64' + 'ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' + 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B' + 'F12FFA06D98A0864D87602733EC86A64521F2B18177B200C' + 'BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31' + '43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF';\nvar newPasswordRequiredChallengeUserAttributePrefix = 'userAttributes.';\n\n/** @class */\nvar AuthenticationHelper = /*#__PURE__*/function () {\n  /**\n   * Constructs a new AuthenticationHelper object\n   * @param {string} PoolName Cognito user pool name.\n   */\n  function AuthenticationHelper(PoolName) {\n    this.N = new BigInteger(initN, 16);\n    this.g = new BigInteger('2', 16);\n    this.k = new BigInteger(this.hexHash(\"\" + this.padHex(this.N) + this.padHex(this.g)), 16);\n    this.smallAValue = this.generateRandomSmallA();\n    this.getLargeAValue(function () {});\n    this.infoBits = Buffer.from('Caldera Derived Key', 'utf8');\n    this.poolName = PoolName;\n  }\n\n  /**\n   * @returns {BigInteger} small A, a random number\n   */\n  var _proto = AuthenticationHelper.prototype;\n  _proto.getSmallAValue = function getSmallAValue() {\n    return this.smallAValue;\n  }\n\n  /**\n   * @param {nodeCallback<BigInteger>} callback Called with (err, largeAValue)\n   * @returns {void}\n   */;\n  _proto.getLargeAValue = function getLargeAValue(callback) {\n    var _this = this;\n    if (this.largeAValue) {\n      callback(null, this.largeAValue);\n    } else {\n      this.calculateA(this.smallAValue, function (err, largeAValue) {\n        if (err) {\n          callback(err, null);\n        }\n        _this.largeAValue = largeAValue;\n        callback(null, _this.largeAValue);\n      });\n    }\n  }\n\n  /**\n   * helper function to generate a random big integer\n   * @returns {BigInteger} a random value.\n   * @private\n   */;\n  _proto.generateRandomSmallA = function generateRandomSmallA() {\n    // This will be interpreted as a postive 128-bit integer\n    var hexRandom = randomBytes(128).toString('hex');\n    var randomBigInt = new BigInteger(hexRandom, 16);\n\n    // There is no need to do randomBigInt.mod(this.N - 1) as N (3072-bit) is > 128 bytes (1024-bit)\n\n    return randomBigInt;\n  }\n\n  /**\n   * helper function to generate a random string\n   * @returns {string} a random value.\n   * @private\n   */;\n  _proto.generateRandomString = function generateRandomString() {\n    return randomBytes(40).toString('base64');\n  }\n\n  /**\n   * @returns {string} Generated random value included in password hash.\n   */;\n  _proto.getRandomPassword = function getRandomPassword() {\n    return this.randomPassword;\n  }\n\n  /**\n   * @returns {string} Generated random value included in devices hash.\n   */;\n  _proto.getSaltDevices = function getSaltDevices() {\n    return this.SaltToHashDevices;\n  }\n\n  /**\n   * @returns {string} Value used to verify devices.\n   */;\n  _proto.getVerifierDevices = function getVerifierDevices() {\n    return this.verifierDevices;\n  }\n\n  /**\n   * Generate salts and compute verifier.\n   * @param {string} deviceGroupKey Devices to generate verifier for.\n   * @param {string} username User to generate verifier for.\n   * @param {nodeCallback<null>} callback Called with (err, null)\n   * @returns {void}\n   */;\n  _proto.generateHashDevice = function generateHashDevice(deviceGroupKey, username, callback) {\n    var _this2 = this;\n    this.randomPassword = this.generateRandomString();\n    var combinedString = \"\" + deviceGroupKey + username + \":\" + this.randomPassword;\n    var hashedString = this.hash(combinedString);\n    var hexRandom = randomBytes(16).toString('hex');\n\n    // The random hex will be unambiguously represented as a postive integer\n    this.SaltToHashDevices = this.padHex(new BigInteger(hexRandom, 16));\n    this.g.modPow(new BigInteger(this.hexHash(this.SaltToHashDevices + hashedString), 16), this.N, function (err, verifierDevicesNotPadded) {\n      if (err) {\n        callback(err, null);\n      }\n      _this2.verifierDevices = _this2.padHex(verifierDevicesNotPadded);\n      callback(null, null);\n    });\n  }\n\n  /**\n   * Calculate the client's public value A = g^a%N\n   * with the generated random number a\n   * @param {BigInteger} a Randomly generated small A.\n   * @param {nodeCallback<BigInteger>} callback Called with (err, largeAValue)\n   * @returns {void}\n   * @private\n   */;\n  _proto.calculateA = function calculateA(a, callback) {\n    var _this3 = this;\n    this.g.modPow(a, this.N, function (err, A) {\n      if (err) {\n        callback(err, null);\n      }\n      if (A.mod(_this3.N).equals(BigInteger.ZERO)) {\n        callback(new Error('Illegal paramater. A mod N cannot be 0.'), null);\n      }\n      callback(null, A);\n    });\n  }\n\n  /**\n   * Calculate the client's value U which is the hash of A and B\n   * @param {BigInteger} A Large A value.\n   * @param {BigInteger} B Server B value.\n   * @returns {BigInteger} Computed U value.\n   * @private\n   */;\n  _proto.calculateU = function calculateU(A, B) {\n    this.UHexHash = this.hexHash(this.padHex(A) + this.padHex(B));\n    var finalU = new BigInteger(this.UHexHash, 16);\n    return finalU;\n  }\n\n  /**\n   * Calculate a hash from a bitArray\n   * @param {Buffer} buf Value to hash.\n   * @returns {String} Hex-encoded hash.\n   * @private\n   */;\n  _proto.hash = function hash(buf) {\n    var awsCryptoHash = new Sha256();\n    awsCryptoHash.update(buf);\n    var resultFromAWSCrypto = awsCryptoHash.digestSync();\n    var hashHex = Buffer.from(resultFromAWSCrypto).toString('hex');\n    return new Array(64 - hashHex.length).join('0') + hashHex;\n  }\n\n  /**\n   * Calculate a hash from a hex string\n   * @param {String} hexStr Value to hash.\n   * @returns {String} Hex-encoded hash.\n   * @private\n   */;\n  _proto.hexHash = function hexHash(hexStr) {\n    return this.hash(Buffer.from(hexStr, 'hex'));\n  }\n\n  /**\n   * Standard hkdf algorithm\n   * @param {Buffer} ikm Input key material.\n   * @param {Buffer} salt Salt value.\n   * @returns {Buffer} Strong key material.\n   * @private\n   */;\n  _proto.computehkdf = function computehkdf(ikm, salt) {\n    var infoBitsBuffer = Buffer.concat([this.infoBits, Buffer.from(String.fromCharCode(1), 'utf8')]);\n    var awsCryptoHash = new Sha256(salt);\n    awsCryptoHash.update(ikm);\n    var resultFromAWSCryptoPrk = awsCryptoHash.digestSync();\n    var awsCryptoHashHmac = new Sha256(resultFromAWSCryptoPrk);\n    awsCryptoHashHmac.update(infoBitsBuffer);\n    var resultFromAWSCryptoHmac = awsCryptoHashHmac.digestSync();\n    var hashHexFromAWSCrypto = resultFromAWSCryptoHmac;\n    var currentHex = hashHexFromAWSCrypto.slice(0, 16);\n    return currentHex;\n  }\n\n  /**\n   * Calculates the final hkdf based on computed S value, and computed U value and the key\n   * @param {String} username Username.\n   * @param {String} password Password.\n   * @param {BigInteger} serverBValue Server B value.\n   * @param {BigInteger} salt Generated salt.\n   * @param {nodeCallback<Buffer>} callback Called with (err, hkdfValue)\n   * @returns {void}\n   */;\n  _proto.getPasswordAuthenticationKey = function getPasswordAuthenticationKey(username, password, serverBValue, salt, callback) {\n    var _this4 = this;\n    if (serverBValue.mod(this.N).equals(BigInteger.ZERO)) {\n      throw new Error('B cannot be zero.');\n    }\n    this.UValue = this.calculateU(this.largeAValue, serverBValue);\n    if (this.UValue.equals(BigInteger.ZERO)) {\n      throw new Error('U cannot be zero.');\n    }\n    var usernamePassword = \"\" + this.poolName + username + \":\" + password;\n    var usernamePasswordHash = this.hash(usernamePassword);\n    var xValue = new BigInteger(this.hexHash(this.padHex(salt) + usernamePasswordHash), 16);\n    this.calculateS(xValue, serverBValue, function (err, sValue) {\n      if (err) {\n        callback(err, null);\n      }\n      var hkdf = _this4.computehkdf(Buffer.from(_this4.padHex(sValue), 'hex'), Buffer.from(_this4.padHex(_this4.UValue), 'hex'));\n      callback(null, hkdf);\n    });\n  }\n\n  /**\n   * Calculates the S value used in getPasswordAuthenticationKey\n   * @param {BigInteger} xValue Salted password hash value.\n   * @param {BigInteger} serverBValue Server B value.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.calculateS = function calculateS(xValue, serverBValue, callback) {\n    var _this5 = this;\n    this.g.modPow(xValue, this.N, function (err, gModPowXN) {\n      if (err) {\n        callback(err, null);\n      }\n      var intValue2 = serverBValue.subtract(_this5.k.multiply(gModPowXN));\n      intValue2.modPow(_this5.smallAValue.add(_this5.UValue.multiply(xValue)), _this5.N, function (err2, result) {\n        if (err2) {\n          callback(err2, null);\n        }\n        callback(null, result.mod(_this5.N));\n      });\n    });\n  }\n\n  /**\n   * Return constant newPasswordRequiredChallengeUserAttributePrefix\n   * @return {newPasswordRequiredChallengeUserAttributePrefix} constant prefix value\n   */;\n  _proto.getNewPasswordRequiredChallengeUserAttributePrefix = function getNewPasswordRequiredChallengeUserAttributePrefix() {\n    return newPasswordRequiredChallengeUserAttributePrefix;\n  }\n\n  /**\n   * Returns an unambiguous, even-length hex string of the two's complement encoding of an integer.\n   *\n   * It is compatible with the hex encoding of Java's BigInteger's toByteArray(), wich returns a\n   * byte array containing the two's-complement representation of a BigInteger. The array contains\n   * the minimum number of bytes required to represent the BigInteger, including at least one sign bit.\n   *\n   * Examples showing how ambiguity is avoided by left padding with:\n   * \t\"00\" (for positive values where the most-significant-bit is set)\n   *  \"FF\" (for negative values where the most-significant-bit is set)\n   *\n   * padHex(bigInteger.fromInt(-236))  === \"FF14\"\n   * padHex(bigInteger.fromInt(20))    === \"14\"\n   *\n   * padHex(bigInteger.fromInt(-200))  === \"FF38\"\n   * padHex(bigInteger.fromInt(56))    === \"38\"\n   *\n   * padHex(bigInteger.fromInt(-20))   === \"EC\"\n   * padHex(bigInteger.fromInt(236))   === \"00EC\"\n   *\n   * padHex(bigInteger.fromInt(-56))   === \"C8\"\n   * padHex(bigInteger.fromInt(200))   === \"00C8\"\n   *\n   * @param {BigInteger} bigInt Number to encode.\n   * @returns {String} even-length hex string of the two's complement encoding.\n   */;\n  _proto.padHex = function padHex(bigInt) {\n    if (!(bigInt instanceof BigInteger)) {\n      throw new Error('Not a BigInteger');\n    }\n    var isNegative = bigInt.compareTo(BigInteger.ZERO) < 0;\n\n    /* Get a hex string for abs(bigInt) */\n    var hexStr = bigInt.abs().toString(16);\n\n    /* Pad hex to even length if needed */\n    hexStr = hexStr.length % 2 !== 0 ? \"0\" + hexStr : hexStr;\n\n    /* Prepend \"00\" if the most significant bit is set */\n    hexStr = HEX_MSB_REGEX.test(hexStr) ? \"00\" + hexStr : hexStr;\n    if (isNegative) {\n      /* Flip the bits of the representation */\n      var invertedNibbles = hexStr.split('').map(function (x) {\n        var invertedNibble = ~parseInt(x, 16) & 0xf;\n        return '0123456789ABCDEF'.charAt(invertedNibble);\n      }).join('');\n\n      /* After flipping the bits, add one to get the 2's complement representation */\n      var flippedBitsBI = new BigInteger(invertedNibbles, 16).add(BigInteger.ONE);\n      hexStr = flippedBitsBI.toString(16);\n\n      /*\n      For hex strings starting with 'FF8', 'FF' can be dropped, e.g. 0xFFFF80=0xFF80=0x80=-128\n      \t\tAny sequence of '1' bits on the left can always be substituted with a single '1' bit\n      without changing the represented value.\n      \t\tThis only happens in the case when the input is 80...00\n      */\n      if (hexStr.toUpperCase().startsWith('FF8')) {\n        hexStr = hexStr.substring(2);\n      }\n    }\n    return hexStr;\n  };\n  return AuthenticationHelper;\n}();\nexport { AuthenticationHelper as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Buffer } from 'buffer';\n\n/** @class */\nvar CognitoJwtToken = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoJwtToken object\n   * @param {string=} token The JWT token.\n   */\n  function CognitoJwtToken(token) {\n    // Assign object\n    this.jwtToken = token || '';\n    this.payload = this.decodePayload();\n  }\n\n  /**\n   * @returns {string} the record's token.\n   */\n  var _proto = CognitoJwtToken.prototype;\n  _proto.getJwtToken = function getJwtToken() {\n    return this.jwtToken;\n  }\n\n  /**\n   * @returns {int} the token's expiration (exp member).\n   */;\n  _proto.getExpiration = function getExpiration() {\n    return this.payload.exp;\n  }\n\n  /**\n   * @returns {int} the token's \"issued at\" (iat member).\n   */;\n  _proto.getIssuedAt = function getIssuedAt() {\n    return this.payload.iat;\n  }\n\n  /**\n   * @returns {object} the token's payload.\n   */;\n  _proto.decodePayload = function decodePayload() {\n    var payload = this.jwtToken.split('.')[1];\n    try {\n      return JSON.parse(Buffer.from(payload, 'base64').toString('utf8'));\n    } catch (err) {\n      return {};\n    }\n  };\n  return CognitoJwtToken;\n}();\nexport { CognitoJwtToken as default };","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport CognitoJwtToken from './CognitoJwtToken';\n\n/** @class */\nvar CognitoAccessToken = /*#__PURE__*/function (_CognitoJwtToken) {\n  _inheritsLoose(CognitoAccessToken, _CognitoJwtToken);\n  /**\n   * Constructs a new CognitoAccessToken object\n   * @param {string=} AccessToken The JWT access token.\n   */\n  function CognitoAccessToken(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n      AccessToken = _ref.AccessToken;\n    return _CognitoJwtToken.call(this, AccessToken || '') || this;\n  }\n  return CognitoAccessToken;\n}(CognitoJwtToken);\nexport { CognitoAccessToken as default };","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport CognitoJwtToken from './CognitoJwtToken';\n\n/** @class */\nvar CognitoIdToken = /*#__PURE__*/function (_CognitoJwtToken) {\n  _inheritsLoose(CognitoIdToken, _CognitoJwtToken);\n  /**\n   * Constructs a new CognitoIdToken object\n   * @param {string=} IdToken The JWT Id token\n   */\n  function CognitoIdToken(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n      IdToken = _ref.IdToken;\n    return _CognitoJwtToken.call(this, IdToken || '') || this;\n  }\n  return CognitoIdToken;\n}(CognitoJwtToken);\nexport { CognitoIdToken as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { version } from './version';\nvar BASE_USER_AGENT = \"aws-amplify/\" + version;\nexport var Platform = {\n  userAgent: BASE_USER_AGENT,\n  isReactNative: typeof navigator !== 'undefined' && navigator.product === 'ReactNative'\n};\nexport var getUserAgent = function getUserAgent() {\n  return Platform.userAgent;\n};\n\n/**\n * @deprecated use named import\n */\nexport default Platform;","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/** @class */\nvar CognitoRefreshToken = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoRefreshToken object\n   * @param {string=} RefreshToken The JWT refresh token.\n   */\n  function CognitoRefreshToken(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n      RefreshToken = _ref.RefreshToken;\n    // Assign object\n    this.token = RefreshToken || '';\n  }\n\n  /**\n   * @returns {string} the record's token.\n   */\n  var _proto = CognitoRefreshToken.prototype;\n  _proto.getToken = function getToken() {\n    return this.token;\n  };\n  return CognitoRefreshToken;\n}();\nexport { CognitoRefreshToken as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/** @class */\nvar CognitoUserSession = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoUserSession object\n   * @param {CognitoIdToken} IdToken The session's Id token.\n   * @param {CognitoRefreshToken=} RefreshToken The session's refresh token.\n   * @param {CognitoAccessToken} AccessToken The session's access token.\n   * @param {int} ClockDrift The saved computer's clock drift or undefined to force calculation.\n   */\n  function CognitoUserSession(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n      IdToken = _ref.IdToken,\n      RefreshToken = _ref.RefreshToken,\n      AccessToken = _ref.AccessToken,\n      ClockDrift = _ref.ClockDrift;\n    if (AccessToken == null || IdToken == null) {\n      throw new Error('Id token and Access Token must be present.');\n    }\n    this.idToken = IdToken;\n    this.refreshToken = RefreshToken;\n    this.accessToken = AccessToken;\n    this.clockDrift = ClockDrift === undefined ? this.calculateClockDrift() : ClockDrift;\n  }\n\n  /**\n   * @returns {CognitoIdToken} the session's Id token\n   */\n  var _proto = CognitoUserSession.prototype;\n  _proto.getIdToken = function getIdToken() {\n    return this.idToken;\n  }\n\n  /**\n   * @returns {CognitoRefreshToken} the session's refresh token\n   */;\n  _proto.getRefreshToken = function getRefreshToken() {\n    return this.refreshToken;\n  }\n\n  /**\n   * @returns {CognitoAccessToken} the session's access token\n   */;\n  _proto.getAccessToken = function getAccessToken() {\n    return this.accessToken;\n  }\n\n  /**\n   * @returns {int} the session's clock drift\n   */;\n  _proto.getClockDrift = function getClockDrift() {\n    return this.clockDrift;\n  }\n\n  /**\n   * @returns {int} the computer's clock drift\n   */;\n  _proto.calculateClockDrift = function calculateClockDrift() {\n    var now = Math.floor(new Date() / 1000);\n    var iat = Math.min(this.accessToken.getIssuedAt(), this.idToken.getIssuedAt());\n    return now - iat;\n  }\n\n  /**\n   * Checks to see if the session is still valid based on session expiry information found\n   * in tokens and the current time (adjusted with clock drift)\n   * @returns {boolean} if the session is still valid\n   */;\n  _proto.isValid = function isValid() {\n    var now = Math.floor(new Date() / 1000);\n    var adjusted = now - this.clockDrift;\n    return adjusted < this.accessToken.getExpiration() && adjusted < this.idToken.getExpiration();\n  };\n  return CognitoUserSession;\n}();\nexport { CognitoUserSession as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nvar monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nvar weekNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/** @class */\nvar DateHelper = /*#__PURE__*/function () {\n  function DateHelper() {}\n  var _proto = DateHelper.prototype;\n  /**\n   * @returns {string} The current time in \"ddd MMM D HH:mm:ss UTC YYYY\" format.\n   */\n  _proto.getNowString = function getNowString() {\n    var now = new Date();\n    var weekDay = weekNames[now.getUTCDay()];\n    var month = monthNames[now.getUTCMonth()];\n    var day = now.getUTCDate();\n    var hours = now.getUTCHours();\n    if (hours < 10) {\n      hours = \"0\" + hours;\n    }\n    var minutes = now.getUTCMinutes();\n    if (minutes < 10) {\n      minutes = \"0\" + minutes;\n    }\n    var seconds = now.getUTCSeconds();\n    if (seconds < 10) {\n      seconds = \"0\" + seconds;\n    }\n    var year = now.getUTCFullYear();\n\n    // ddd MMM D HH:mm:ss UTC YYYY\n    var dateNow = weekDay + \" \" + month + \" \" + day + \" \" + hours + \":\" + minutes + \":\" + seconds + \" UTC \" + year;\n    return dateNow;\n  };\n  return DateHelper;\n}();\nexport { DateHelper as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/** @class */\nvar CognitoUserAttribute = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoUserAttribute object\n   * @param {string=} Name The record's name\n   * @param {string=} Value The record's value\n   */\n  function CognitoUserAttribute(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n      Name = _ref.Name,\n      Value = _ref.Value;\n    this.Name = Name || '';\n    this.Value = Value || '';\n  }\n\n  /**\n   * @returns {string} the record's value.\n   */\n  var _proto = CognitoUserAttribute.prototype;\n  _proto.getValue = function getValue() {\n    return this.Value;\n  }\n\n  /**\n   * Sets the record's value.\n   * @param {string} value The new value.\n   * @returns {CognitoUserAttribute} The record for method chaining.\n   */;\n  _proto.setValue = function setValue(value) {\n    this.Value = value;\n    return this;\n  }\n\n  /**\n   * @returns {string} the record's name.\n   */;\n  _proto.getName = function getName() {\n    return this.Name;\n  }\n\n  /**\n   * Sets the record's name\n   * @param {string} name The new name.\n   * @returns {CognitoUserAttribute} The record for method chaining.\n   */;\n  _proto.setName = function setName(name) {\n    this.Name = name;\n    return this;\n  }\n\n  /**\n   * @returns {string} a string representation of the record.\n   */;\n  _proto.toString = function toString() {\n    return JSON.stringify(this);\n  }\n\n  /**\n   * @returns {object} a flat object representing the record.\n   */;\n  _proto.toJSON = function toJSON() {\n    return {\n      Name: this.Name,\n      Value: this.Value\n    };\n  };\n  return CognitoUserAttribute;\n}();\nexport { CognitoUserAttribute as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nvar dataMemory = {};\n\n/** @class */\nexport var MemoryStorage = /*#__PURE__*/function () {\n  function MemoryStorage() {}\n  /**\n   * This is used to set a specific item in storage\n   * @param {string} key - the key for the item\n   * @param {object} value - the value\n   * @returns {string} value that was set\n   */\n  MemoryStorage.setItem = function setItem(key, value) {\n    dataMemory[key] = value;\n    return dataMemory[key];\n  }\n\n  /**\n   * This is used to get a specific key from storage\n   * @param {string} key - the key for the item\n   * This is used to clear the storage\n   * @returns {string} the data item\n   */;\n  MemoryStorage.getItem = function getItem(key) {\n    return Object.prototype.hasOwnProperty.call(dataMemory, key) ? dataMemory[key] : undefined;\n  }\n\n  /**\n   * This is used to remove an item from storage\n   * @param {string} key - the key being set\n   * @returns {boolean} return true\n   */;\n  MemoryStorage.removeItem = function removeItem(key) {\n    return delete dataMemory[key];\n  }\n\n  /**\n   * This is used to clear the storage\n   * @returns {string} nothing\n   */;\n  MemoryStorage.clear = function clear() {\n    dataMemory = {};\n    return dataMemory;\n  };\n  return MemoryStorage;\n}();\n\n/** @class */\nvar StorageHelper = /*#__PURE__*/function () {\n  /**\n   * This is used to get a storage object\n   * @returns {object} the storage\n   */\n  function StorageHelper() {\n    try {\n      this.storageWindow = window.localStorage;\n      this.storageWindow.setItem('aws.cognito.test-ls', 1);\n      this.storageWindow.removeItem('aws.cognito.test-ls');\n    } catch (exception) {\n      this.storageWindow = MemoryStorage;\n    }\n  }\n\n  /**\n   * This is used to return the storage\n   * @returns {object} the storage\n   */\n  var _proto = StorageHelper.prototype;\n  _proto.getStorage = function getStorage() {\n    return this.storageWindow;\n  };\n  return StorageHelper;\n}();\nexport { StorageHelper as default };","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Buffer } from 'buffer';\nimport { Sha256 } from '@aws-crypto/sha256-js';\nimport { Platform } from './Platform';\nimport BigInteger from './BigInteger';\nimport AuthenticationHelper from './AuthenticationHelper';\nimport CognitoAccessToken from './CognitoAccessToken';\nimport CognitoIdToken from './CognitoIdToken';\nimport CognitoRefreshToken from './CognitoRefreshToken';\nimport CognitoUserSession from './CognitoUserSession';\nimport DateHelper from './DateHelper';\nimport CognitoUserAttribute from './CognitoUserAttribute';\nimport StorageHelper from './StorageHelper';\n\n/**\n * @callback nodeCallback\n * @template T result\n * @param {*} err The operation failure reason, or null.\n * @param {T} result The operation result.\n */\n\n/**\n * @callback onFailure\n * @param {*} err Failure reason.\n */\n\n/**\n * @callback onSuccess\n * @template T result\n * @param {T} result The operation result.\n */\n\n/**\n * @callback mfaRequired\n * @param {*} details MFA challenge details.\n */\n\n/**\n * @callback customChallenge\n * @param {*} details Custom challenge details.\n */\n\n/**\n * @callback inputVerificationCode\n * @param {*} data Server response.\n */\n\n/**\n * @callback authSuccess\n * @param {CognitoUserSession} session The new session.\n * @param {bool=} userConfirmationNecessary User must be confirmed.\n */\n\nvar isNavigatorAvailable = typeof navigator !== 'undefined';\nvar userAgent = isNavigatorAvailable ? Platform.isReactNative ? 'react-native' : navigator.userAgent : 'nodejs';\n\n/** @class */\nvar CognitoUser = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoUser object\n   * @param {object} data Creation options\n   * @param {string} data.Username The user's username.\n   * @param {CognitoUserPool} data.Pool Pool containing the user.\n   * @param {object} data.Storage Optional storage object.\n   */\n  function CognitoUser(data) {\n    if (data == null || data.Username == null || data.Pool == null) {\n      throw new Error('Username and Pool information are required.');\n    }\n    this.username = data.Username || '';\n    this.pool = data.Pool;\n    this.Session = null;\n    this.client = data.Pool.client;\n    this.signInUserSession = null;\n    this.authenticationFlowType = 'USER_SRP_AUTH';\n    this.storage = data.Storage || new StorageHelper().getStorage();\n    this.keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId();\n    this.userDataKey = this.keyPrefix + \".\" + this.username + \".userData\";\n  }\n\n  /**\n   * Sets the session for this user\n   * @param {CognitoUserSession} signInUserSession the session\n   * @returns {void}\n   */\n  var _proto = CognitoUser.prototype;\n  _proto.setSignInUserSession = function setSignInUserSession(signInUserSession) {\n    this.clearCachedUserData();\n    this.signInUserSession = signInUserSession;\n    this.cacheTokens();\n  }\n\n  /**\n   * @returns {CognitoUserSession} the current session for this user\n   */;\n  _proto.getSignInUserSession = function getSignInUserSession() {\n    return this.signInUserSession;\n  }\n\n  /**\n   * @returns {string} the user's username\n   */;\n  _proto.getUsername = function getUsername() {\n    return this.username;\n  }\n\n  /**\n   * @returns {String} the authentication flow type\n   */;\n  _proto.getAuthenticationFlowType = function getAuthenticationFlowType() {\n    return this.authenticationFlowType;\n  }\n\n  /**\n   * sets authentication flow type\n   * @param {string} authenticationFlowType New value.\n   * @returns {void}\n   */;\n  _proto.setAuthenticationFlowType = function setAuthenticationFlowType(authenticationFlowType) {\n    this.authenticationFlowType = authenticationFlowType;\n  }\n\n  /**\n   * This is used for authenticating the user through the custom authentication flow.\n   * @param {AuthenticationDetails} authDetails Contains the authentication data\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {customChallenge} callback.customChallenge Custom challenge\n   *        response required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @returns {void}\n   */;\n  _proto.initiateAuth = function initiateAuth(authDetails, callback) {\n    var _this = this;\n    var authParameters = authDetails.getAuthParameters();\n    authParameters.USERNAME = this.username;\n    var clientMetaData = Object.keys(authDetails.getValidationData()).length !== 0 ? authDetails.getValidationData() : authDetails.getClientMetadata();\n    var jsonReq = {\n      AuthFlow: 'CUSTOM_AUTH',\n      ClientId: this.pool.getClientId(),\n      AuthParameters: authParameters,\n      ClientMetadata: clientMetaData\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('InitiateAuth', jsonReq, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      var challengeName = data.ChallengeName;\n      var challengeParameters = data.ChallengeParameters;\n      if (challengeName === 'CUSTOM_CHALLENGE') {\n        _this.Session = data.Session;\n        return callback.customChallenge(challengeParameters);\n      }\n      _this.signInUserSession = _this.getCognitoUserSession(data.AuthenticationResult);\n      _this.cacheTokens();\n      return callback.onSuccess(_this.signInUserSession);\n    });\n  }\n\n  /**\n   * This is used for authenticating the user.\n   * stuff\n   * @param {AuthenticationDetails} authDetails Contains the authentication data\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {newPasswordRequired} callback.newPasswordRequired new\n   *        password and any required attributes are required to continue\n   * @param {mfaRequired} callback.mfaRequired MFA code\n   *        required to continue.\n   * @param {customChallenge} callback.customChallenge Custom challenge\n   *        response required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @returns {void}\n   */;\n  _proto.authenticateUser = function authenticateUser(authDetails, callback) {\n    if (this.authenticationFlowType === 'USER_PASSWORD_AUTH') {\n      return this.authenticateUserPlainUsernamePassword(authDetails, callback);\n    } else if (this.authenticationFlowType === 'USER_SRP_AUTH' || this.authenticationFlowType === 'CUSTOM_AUTH') {\n      return this.authenticateUserDefaultAuth(authDetails, callback);\n    }\n    return callback.onFailure(new Error('Authentication flow type is invalid.'));\n  }\n\n  /**\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   * It calls the AuthenticationHelper for SRP related\n   * stuff\n   * @param {AuthenticationDetails} authDetails Contains the authentication data\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {newPasswordRequired} callback.newPasswordRequired new\n   *        password and any required attributes are required to continue\n   * @param {mfaRequired} callback.mfaRequired MFA code\n   *        required to continue.\n   * @param {customChallenge} callback.customChallenge Custom challenge\n   *        response required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @returns {void}\n   */;\n  _proto.authenticateUserDefaultAuth = function authenticateUserDefaultAuth(authDetails, callback) {\n    var _this2 = this;\n    var authenticationHelper = new AuthenticationHelper(this.pool.getUserPoolName());\n    var dateHelper = new DateHelper();\n    var serverBValue;\n    var salt;\n    var authParameters = {};\n    if (this.deviceKey != null) {\n      authParameters.DEVICE_KEY = this.deviceKey;\n    }\n    authParameters.USERNAME = this.username;\n    authenticationHelper.getLargeAValue(function (errOnAValue, aValue) {\n      // getLargeAValue callback start\n      if (errOnAValue) {\n        callback.onFailure(errOnAValue);\n      }\n      authParameters.SRP_A = aValue.toString(16);\n      if (_this2.authenticationFlowType === 'CUSTOM_AUTH') {\n        authParameters.CHALLENGE_NAME = 'SRP_A';\n      }\n      var clientMetaData = Object.keys(authDetails.getValidationData()).length !== 0 ? authDetails.getValidationData() : authDetails.getClientMetadata();\n      var jsonReq = {\n        AuthFlow: _this2.authenticationFlowType,\n        ClientId: _this2.pool.getClientId(),\n        AuthParameters: authParameters,\n        ClientMetadata: clientMetaData\n      };\n      if (_this2.getUserContextData(_this2.username)) {\n        jsonReq.UserContextData = _this2.getUserContextData(_this2.username);\n      }\n      _this2.client.request('InitiateAuth', jsonReq, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        var challengeParameters = data.ChallengeParameters;\n        _this2.username = challengeParameters.USER_ID_FOR_SRP;\n        _this2.userDataKey = _this2.keyPrefix + \".\" + _this2.username + \".userData\";\n        serverBValue = new BigInteger(challengeParameters.SRP_B, 16);\n        salt = new BigInteger(challengeParameters.SALT, 16);\n        _this2.getCachedDeviceKeyAndPassword();\n        authenticationHelper.getPasswordAuthenticationKey(_this2.username, authDetails.getPassword(), serverBValue, salt, function (errOnHkdf, hkdf) {\n          // getPasswordAuthenticationKey callback start\n          if (errOnHkdf) {\n            callback.onFailure(errOnHkdf);\n          }\n          var dateNow = dateHelper.getNowString();\n          var concatBuffer = Buffer.concat([Buffer.from(_this2.pool.getUserPoolName(), 'utf8'), Buffer.from(_this2.username, 'utf8'), Buffer.from(challengeParameters.SECRET_BLOCK, 'base64'), Buffer.from(dateNow, 'utf8')]);\n          var awsCryptoHash = new Sha256(hkdf);\n          awsCryptoHash.update(concatBuffer);\n          var resultFromAWSCrypto = awsCryptoHash.digestSync();\n          var signatureString = Buffer.from(resultFromAWSCrypto).toString('base64');\n          var challengeResponses = {};\n          challengeResponses.USERNAME = _this2.username;\n          challengeResponses.PASSWORD_CLAIM_SECRET_BLOCK = challengeParameters.SECRET_BLOCK;\n          challengeResponses.TIMESTAMP = dateNow;\n          challengeResponses.PASSWORD_CLAIM_SIGNATURE = signatureString;\n          if (_this2.deviceKey != null) {\n            challengeResponses.DEVICE_KEY = _this2.deviceKey;\n          }\n          var respondToAuthChallenge = function respondToAuthChallenge(challenge, challengeCallback) {\n            return _this2.client.request('RespondToAuthChallenge', challenge, function (errChallenge, dataChallenge) {\n              if (errChallenge && errChallenge.code === 'ResourceNotFoundException' && errChallenge.message.toLowerCase().indexOf('device') !== -1) {\n                challengeResponses.DEVICE_KEY = null;\n                _this2.deviceKey = null;\n                _this2.randomPassword = null;\n                _this2.deviceGroupKey = null;\n                _this2.clearCachedDeviceKeyAndPassword();\n                return respondToAuthChallenge(challenge, challengeCallback);\n              }\n              return challengeCallback(errChallenge, dataChallenge);\n            });\n          };\n          var jsonReqResp = {\n            ChallengeName: 'PASSWORD_VERIFIER',\n            ClientId: _this2.pool.getClientId(),\n            ChallengeResponses: challengeResponses,\n            Session: data.Session,\n            ClientMetadata: clientMetaData\n          };\n          if (_this2.getUserContextData()) {\n            jsonReqResp.UserContextData = _this2.getUserContextData();\n          }\n          respondToAuthChallenge(jsonReqResp, function (errAuthenticate, dataAuthenticate) {\n            if (errAuthenticate) {\n              return callback.onFailure(errAuthenticate);\n            }\n            return _this2.authenticateUserInternal(dataAuthenticate, authenticationHelper, callback);\n          });\n          return undefined;\n          // getPasswordAuthenticationKey callback end\n        });\n        return undefined;\n      });\n      // getLargeAValue callback end\n    });\n  }\n\n  /**\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   * @param {AuthenticationDetails} authDetails Contains the authentication data.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {mfaRequired} callback.mfaRequired MFA code\n   *        required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @returns {void}\n   */;\n  _proto.authenticateUserPlainUsernamePassword = function authenticateUserPlainUsernamePassword(authDetails, callback) {\n    var _this3 = this;\n    var authParameters = {};\n    authParameters.USERNAME = this.username;\n    authParameters.PASSWORD = authDetails.getPassword();\n    if (!authParameters.PASSWORD) {\n      callback.onFailure(new Error('PASSWORD parameter is required'));\n      return;\n    }\n    var authenticationHelper = new AuthenticationHelper(this.pool.getUserPoolName());\n    this.getCachedDeviceKeyAndPassword();\n    if (this.deviceKey != null) {\n      authParameters.DEVICE_KEY = this.deviceKey;\n    }\n    var clientMetaData = Object.keys(authDetails.getValidationData()).length !== 0 ? authDetails.getValidationData() : authDetails.getClientMetadata();\n    var jsonReq = {\n      AuthFlow: 'USER_PASSWORD_AUTH',\n      ClientId: this.pool.getClientId(),\n      AuthParameters: authParameters,\n      ClientMetadata: clientMetaData\n    };\n    if (this.getUserContextData(this.username)) {\n      jsonReq.UserContextData = this.getUserContextData(this.username);\n    }\n    // USER_PASSWORD_AUTH happens in a single round-trip: client sends userName and password,\n    // Cognito UserPools verifies password and returns tokens.\n    this.client.request('InitiateAuth', jsonReq, function (err, authResult) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return _this3.authenticateUserInternal(authResult, authenticationHelper, callback);\n    });\n  }\n\n  /**\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   * @param {object} dataAuthenticate authentication data\n   * @param {object} authenticationHelper helper created\n   * @param {callback} callback passed on from caller\n   * @returns {void}\n   */;\n  _proto.authenticateUserInternal = function authenticateUserInternal(dataAuthenticate, authenticationHelper, callback) {\n    var _this4 = this;\n    var challengeName = dataAuthenticate.ChallengeName;\n    var challengeParameters = dataAuthenticate.ChallengeParameters;\n    if (challengeName === 'SMS_MFA') {\n      this.Session = dataAuthenticate.Session;\n      return callback.mfaRequired(challengeName, challengeParameters);\n    }\n    if (challengeName === 'SELECT_MFA_TYPE') {\n      this.Session = dataAuthenticate.Session;\n      return callback.selectMFAType(challengeName, challengeParameters);\n    }\n    if (challengeName === 'MFA_SETUP') {\n      this.Session = dataAuthenticate.Session;\n      return callback.mfaSetup(challengeName, challengeParameters);\n    }\n    if (challengeName === 'SOFTWARE_TOKEN_MFA') {\n      this.Session = dataAuthenticate.Session;\n      return callback.totpRequired(challengeName, challengeParameters);\n    }\n    if (challengeName === 'CUSTOM_CHALLENGE') {\n      this.Session = dataAuthenticate.Session;\n      return callback.customChallenge(challengeParameters);\n    }\n    if (challengeName === 'NEW_PASSWORD_REQUIRED') {\n      this.Session = dataAuthenticate.Session;\n      var userAttributes = null;\n      var rawRequiredAttributes = null;\n      var requiredAttributes = [];\n      var userAttributesPrefix = authenticationHelper.getNewPasswordRequiredChallengeUserAttributePrefix();\n      if (challengeParameters) {\n        userAttributes = JSON.parse(dataAuthenticate.ChallengeParameters.userAttributes);\n        rawRequiredAttributes = JSON.parse(dataAuthenticate.ChallengeParameters.requiredAttributes);\n      }\n      if (rawRequiredAttributes) {\n        for (var i = 0; i < rawRequiredAttributes.length; i++) {\n          requiredAttributes[i] = rawRequiredAttributes[i].substr(userAttributesPrefix.length);\n        }\n      }\n      return callback.newPasswordRequired(userAttributes, requiredAttributes);\n    }\n    if (challengeName === 'DEVICE_SRP_AUTH') {\n      this.Session = dataAuthenticate.Session;\n      this.getDeviceResponse(callback);\n      return undefined;\n    }\n    this.signInUserSession = this.getCognitoUserSession(dataAuthenticate.AuthenticationResult);\n    this.challengeName = challengeName;\n    this.cacheTokens();\n    var newDeviceMetadata = dataAuthenticate.AuthenticationResult.NewDeviceMetadata;\n    if (newDeviceMetadata == null) {\n      return callback.onSuccess(this.signInUserSession);\n    }\n    authenticationHelper.generateHashDevice(dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceGroupKey, dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey, function (errGenHash) {\n      if (errGenHash) {\n        return callback.onFailure(errGenHash);\n      }\n      var deviceSecretVerifierConfig = {\n        Salt: Buffer.from(authenticationHelper.getSaltDevices(), 'hex').toString('base64'),\n        PasswordVerifier: Buffer.from(authenticationHelper.getVerifierDevices(), 'hex').toString('base64')\n      };\n      _this4.verifierDevices = deviceSecretVerifierConfig.PasswordVerifier;\n      _this4.deviceGroupKey = newDeviceMetadata.DeviceGroupKey;\n      _this4.randomPassword = authenticationHelper.getRandomPassword();\n      _this4.client.request('ConfirmDevice', {\n        DeviceKey: newDeviceMetadata.DeviceKey,\n        AccessToken: _this4.signInUserSession.getAccessToken().getJwtToken(),\n        DeviceSecretVerifierConfig: deviceSecretVerifierConfig,\n        DeviceName: userAgent\n      }, function (errConfirm, dataConfirm) {\n        if (errConfirm) {\n          return callback.onFailure(errConfirm);\n        }\n        _this4.deviceKey = dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey;\n        _this4.cacheDeviceKeyAndPassword();\n        if (dataConfirm.UserConfirmationNecessary === true) {\n          return callback.onSuccess(_this4.signInUserSession, dataConfirm.UserConfirmationNecessary);\n        }\n        return callback.onSuccess(_this4.signInUserSession);\n      });\n      return undefined;\n    });\n    return undefined;\n  }\n\n  /**\n   * This method is user to complete the NEW_PASSWORD_REQUIRED challenge.\n   * Pass the new password with any new user attributes to be updated.\n   * User attribute keys must be of format userAttributes.<attribute_name>.\n   * @param {string} newPassword new password for this user\n   * @param {object} requiredAttributeData map with values for all required attributes\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {mfaRequired} callback.mfaRequired MFA code required to continue.\n   * @param {customChallenge} callback.customChallenge Custom challenge\n   *         response required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.completeNewPasswordChallenge = function completeNewPasswordChallenge(newPassword, requiredAttributeData, callback, clientMetadata) {\n    var _this5 = this;\n    if (!newPassword) {\n      return callback.onFailure(new Error('New password is required.'));\n    }\n    var authenticationHelper = new AuthenticationHelper(this.pool.getUserPoolName());\n    var userAttributesPrefix = authenticationHelper.getNewPasswordRequiredChallengeUserAttributePrefix();\n    var finalUserAttributes = {};\n    if (requiredAttributeData) {\n      Object.keys(requiredAttributeData).forEach(function (key) {\n        finalUserAttributes[userAttributesPrefix + key] = requiredAttributeData[key];\n      });\n    }\n    finalUserAttributes.NEW_PASSWORD = newPassword;\n    finalUserAttributes.USERNAME = this.username;\n    var jsonReq = {\n      ChallengeName: 'NEW_PASSWORD_REQUIRED',\n      ClientId: this.pool.getClientId(),\n      ChallengeResponses: finalUserAttributes,\n      Session: this.Session,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('RespondToAuthChallenge', jsonReq, function (errAuthenticate, dataAuthenticate) {\n      if (errAuthenticate) {\n        return callback.onFailure(errAuthenticate);\n      }\n      return _this5.authenticateUserInternal(dataAuthenticate, authenticationHelper, callback);\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to get a session using device authentication. It is called at the end of user\n   * authentication\n   *\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   * @private\n   */;\n  _proto.getDeviceResponse = function getDeviceResponse(callback, clientMetadata) {\n    var _this6 = this;\n    var authenticationHelper = new AuthenticationHelper(this.deviceGroupKey);\n    var dateHelper = new DateHelper();\n    var authParameters = {};\n    authParameters.USERNAME = this.username;\n    authParameters.DEVICE_KEY = this.deviceKey;\n    authenticationHelper.getLargeAValue(function (errAValue, aValue) {\n      // getLargeAValue callback start\n      if (errAValue) {\n        callback.onFailure(errAValue);\n      }\n      authParameters.SRP_A = aValue.toString(16);\n      var jsonReq = {\n        ChallengeName: 'DEVICE_SRP_AUTH',\n        ClientId: _this6.pool.getClientId(),\n        ChallengeResponses: authParameters,\n        ClientMetadata: clientMetadata,\n        Session: _this6.Session\n      };\n      if (_this6.getUserContextData()) {\n        jsonReq.UserContextData = _this6.getUserContextData();\n      }\n      _this6.client.request('RespondToAuthChallenge', jsonReq, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        var challengeParameters = data.ChallengeParameters;\n        var serverBValue = new BigInteger(challengeParameters.SRP_B, 16);\n        var salt = new BigInteger(challengeParameters.SALT, 16);\n        authenticationHelper.getPasswordAuthenticationKey(_this6.deviceKey, _this6.randomPassword, serverBValue, salt, function (errHkdf, hkdf) {\n          // getPasswordAuthenticationKey callback start\n          if (errHkdf) {\n            return callback.onFailure(errHkdf);\n          }\n          var dateNow = dateHelper.getNowString();\n          var concatBuffer = Buffer.concat([Buffer.from(_this6.deviceGroupKey, 'utf8'), Buffer.from(_this6.deviceKey, 'utf8'), Buffer.from(challengeParameters.SECRET_BLOCK, 'base64'), Buffer.from(dateNow, 'utf8')]);\n          var awsCryptoHash = new Sha256(hkdf);\n          awsCryptoHash.update(concatBuffer);\n          var resultFromAWSCrypto = awsCryptoHash.digestSync();\n          var signatureString = Buffer.from(resultFromAWSCrypto).toString('base64');\n          var challengeResponses = {};\n          challengeResponses.USERNAME = _this6.username;\n          challengeResponses.PASSWORD_CLAIM_SECRET_BLOCK = challengeParameters.SECRET_BLOCK;\n          challengeResponses.TIMESTAMP = dateNow;\n          challengeResponses.PASSWORD_CLAIM_SIGNATURE = signatureString;\n          challengeResponses.DEVICE_KEY = _this6.deviceKey;\n          var jsonReqResp = {\n            ChallengeName: 'DEVICE_PASSWORD_VERIFIER',\n            ClientId: _this6.pool.getClientId(),\n            ChallengeResponses: challengeResponses,\n            Session: data.Session\n          };\n          if (_this6.getUserContextData()) {\n            jsonReqResp.UserContextData = _this6.getUserContextData();\n          }\n          _this6.client.request('RespondToAuthChallenge', jsonReqResp, function (errAuthenticate, dataAuthenticate) {\n            if (errAuthenticate) {\n              return callback.onFailure(errAuthenticate);\n            }\n            _this6.signInUserSession = _this6.getCognitoUserSession(dataAuthenticate.AuthenticationResult);\n            _this6.cacheTokens();\n            return callback.onSuccess(_this6.signInUserSession);\n          });\n          return undefined;\n          // getPasswordAuthenticationKey callback end\n        });\n        return undefined;\n      });\n      // getLargeAValue callback end\n    });\n  }\n\n  /**\n   * This is used for a certain user to confirm the registration by using a confirmation code\n   * @param {string} confirmationCode Code entered by user.\n   * @param {bool} forceAliasCreation Allow migrating from an existing email / phone number.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.confirmRegistration = function confirmRegistration(confirmationCode, forceAliasCreation, callback, clientMetadata) {\n    var jsonReq = {\n      ClientId: this.pool.getClientId(),\n      ConfirmationCode: confirmationCode,\n      Username: this.username,\n      ForceAliasCreation: forceAliasCreation,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('ConfirmSignUp', jsonReq, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, 'SUCCESS');\n    });\n  }\n\n  /**\n   * This is used by the user once he has the responses to a custom challenge\n   * @param {string} answerChallenge The custom challenge answer.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {customChallenge} callback.customChallenge\n   *    Custom challenge response required to continue.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.sendCustomChallengeAnswer = function sendCustomChallengeAnswer(answerChallenge, callback, clientMetadata) {\n    var _this7 = this;\n    var challengeResponses = {};\n    challengeResponses.USERNAME = this.username;\n    challengeResponses.ANSWER = answerChallenge;\n    var authenticationHelper = new AuthenticationHelper(this.pool.getUserPoolName());\n    this.getCachedDeviceKeyAndPassword();\n    if (this.deviceKey != null) {\n      challengeResponses.DEVICE_KEY = this.deviceKey;\n    }\n    var jsonReq = {\n      ChallengeName: 'CUSTOM_CHALLENGE',\n      ChallengeResponses: challengeResponses,\n      ClientId: this.pool.getClientId(),\n      Session: this.Session,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('RespondToAuthChallenge', jsonReq, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return _this7.authenticateUserInternal(data, authenticationHelper, callback);\n    });\n  }\n\n  /**\n   * This is used by the user once he has an MFA code\n   * @param {string} confirmationCode The MFA code entered by the user.\n   * @param {object} callback Result callback map.\n   * @param {string} mfaType The mfa we are replying to.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {authSuccess} callback.onSuccess Called on success with the new session.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.sendMFACode = function sendMFACode(confirmationCode, callback, mfaType, clientMetadata) {\n    var _this8 = this;\n    var challengeResponses = {};\n    challengeResponses.USERNAME = this.username;\n    challengeResponses.SMS_MFA_CODE = confirmationCode;\n    var mfaTypeSelection = mfaType || 'SMS_MFA';\n    if (mfaTypeSelection === 'SOFTWARE_TOKEN_MFA') {\n      challengeResponses.SOFTWARE_TOKEN_MFA_CODE = confirmationCode;\n    }\n    if (this.deviceKey != null) {\n      challengeResponses.DEVICE_KEY = this.deviceKey;\n    }\n    var jsonReq = {\n      ChallengeName: mfaTypeSelection,\n      ChallengeResponses: challengeResponses,\n      ClientId: this.pool.getClientId(),\n      Session: this.Session,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('RespondToAuthChallenge', jsonReq, function (err, dataAuthenticate) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      var challengeName = dataAuthenticate.ChallengeName;\n      if (challengeName === 'DEVICE_SRP_AUTH') {\n        _this8.getDeviceResponse(callback);\n        return undefined;\n      }\n      _this8.signInUserSession = _this8.getCognitoUserSession(dataAuthenticate.AuthenticationResult);\n      _this8.cacheTokens();\n      if (dataAuthenticate.AuthenticationResult.NewDeviceMetadata == null) {\n        return callback.onSuccess(_this8.signInUserSession);\n      }\n      var authenticationHelper = new AuthenticationHelper(_this8.pool.getUserPoolName());\n      authenticationHelper.generateHashDevice(dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceGroupKey, dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey, function (errGenHash) {\n        if (errGenHash) {\n          return callback.onFailure(errGenHash);\n        }\n        var deviceSecretVerifierConfig = {\n          Salt: Buffer.from(authenticationHelper.getSaltDevices(), 'hex').toString('base64'),\n          PasswordVerifier: Buffer.from(authenticationHelper.getVerifierDevices(), 'hex').toString('base64')\n        };\n        _this8.verifierDevices = deviceSecretVerifierConfig.PasswordVerifier;\n        _this8.deviceGroupKey = dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceGroupKey;\n        _this8.randomPassword = authenticationHelper.getRandomPassword();\n        _this8.client.request('ConfirmDevice', {\n          DeviceKey: dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey,\n          AccessToken: _this8.signInUserSession.getAccessToken().getJwtToken(),\n          DeviceSecretVerifierConfig: deviceSecretVerifierConfig,\n          DeviceName: userAgent\n        }, function (errConfirm, dataConfirm) {\n          if (errConfirm) {\n            return callback.onFailure(errConfirm);\n          }\n          _this8.deviceKey = dataAuthenticate.AuthenticationResult.NewDeviceMetadata.DeviceKey;\n          _this8.cacheDeviceKeyAndPassword();\n          if (dataConfirm.UserConfirmationNecessary === true) {\n            return callback.onSuccess(_this8.signInUserSession, dataConfirm.UserConfirmationNecessary);\n          }\n          return callback.onSuccess(_this8.signInUserSession);\n        });\n        return undefined;\n      });\n      return undefined;\n    });\n  }\n\n  /**\n   * This is used by an authenticated user to change the current password\n   * @param {string} oldUserPassword The current password.\n   * @param {string} newUserPassword The requested new password.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.changePassword = function changePassword(oldUserPassword, newUserPassword, callback, clientMetadata) {\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('ChangePassword', {\n      PreviousPassword: oldUserPassword,\n      ProposedPassword: newUserPassword,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      ClientMetadata: clientMetadata\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, 'SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by an authenticated user to enable MFA for itself\n   * @deprecated\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.enableMFA = function enableMFA(callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    var mfaOptions = [];\n    var mfaEnabled = {\n      DeliveryMedium: 'SMS',\n      AttributeName: 'phone_number'\n    };\n    mfaOptions.push(mfaEnabled);\n    this.client.request('SetUserSettings', {\n      MFAOptions: mfaOptions,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, 'SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by an authenticated user to enable MFA for itself\n   * @param {IMfaSettings} smsMfaSettings the sms mfa settings\n   * @param {IMFASettings} softwareTokenMfaSettings the software token mfa settings\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.setUserMfaPreference = function setUserMfaPreference(smsMfaSettings, softwareTokenMfaSettings, callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('SetUserMFAPreference', {\n      SMSMfaSettings: smsMfaSettings,\n      SoftwareTokenMfaSettings: softwareTokenMfaSettings,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, 'SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by an authenticated user to disable MFA for itself\n   * @deprecated\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.disableMFA = function disableMFA(callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    var mfaOptions = [];\n    this.client.request('SetUserSettings', {\n      MFAOptions: mfaOptions,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, 'SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by an authenticated user to delete itself\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.deleteUser = function deleteUser(callback, clientMetadata) {\n    var _this9 = this;\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('DeleteUser', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      ClientMetadata: clientMetadata\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n      _this9.clearCachedUser();\n      return callback(null, 'SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * @typedef {CognitoUserAttribute | { Name:string, Value:string }} AttributeArg\n   */\n  /**\n   * This is used by an authenticated user to change a list of attributes\n   * @param {AttributeArg[]} attributes A list of the new user attributes.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.updateAttributes = function updateAttributes(attributes, callback, clientMetadata) {\n    var _this10 = this;\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('UpdateUserAttributes', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      UserAttributes: attributes,\n      ClientMetadata: clientMetadata\n    }, function (err, result) {\n      if (err) {\n        return callback(err, null);\n      }\n\n      // update cached user\n      return _this10.getUserData(function () {\n        return callback(null, 'SUCCESS', result);\n      }, {\n        bypassCache: true\n      });\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by an authenticated user to get a list of attributes\n   * @param {nodeCallback<CognitoUserAttribute[]>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.getUserAttributes = function getUserAttributes(callback) {\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('GetUser', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err, userData) {\n      if (err) {\n        return callback(err, null);\n      }\n      var attributeList = [];\n      for (var i = 0; i < userData.UserAttributes.length; i++) {\n        var attribute = {\n          Name: userData.UserAttributes[i].Name,\n          Value: userData.UserAttributes[i].Value\n        };\n        var userAttribute = new CognitoUserAttribute(attribute);\n        attributeList.push(userAttribute);\n      }\n      return callback(null, attributeList);\n    });\n    return undefined;\n  }\n\n  /**\n   * This was previously used by an authenticated user to get MFAOptions,\n   * but no longer returns a meaningful response. Refer to the documentation for\n   * how to setup and use MFA: https://docs.amplify.aws/lib/auth/mfa/q/platform/js\n   * @deprecated\n   * @param {nodeCallback<MFAOptions>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.getMFAOptions = function getMFAOptions(callback) {\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('GetUser', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err, userData) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, userData.MFAOptions);\n    });\n    return undefined;\n  }\n\n  /**\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   */;\n  _proto.createGetUserRequest = function createGetUserRequest() {\n    return this.client.promisifyRequest('GetUser', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    });\n  }\n\n  /**\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   */;\n  _proto.refreshSessionIfPossible = function refreshSessionIfPossible(options) {\n    var _this11 = this;\n    if (options === void 0) {\n      options = {};\n    }\n    // best effort, if not possible\n    return new Promise(function (resolve) {\n      var refresh = _this11.signInUserSession.getRefreshToken();\n      if (refresh && refresh.getToken()) {\n        _this11.refreshSession(refresh, resolve, options.clientMetadata);\n      } else {\n        resolve();\n      }\n    });\n  }\n\n  /**\n   * @typedef {Object} GetUserDataOptions\n   * @property {boolean} bypassCache - force getting data from Cognito service\n   * @property {Record<string, string>} clientMetadata - clientMetadata for getSession\n   */\n\n  /**\n   * This is used by an authenticated users to get the userData\n   * @param {nodeCallback<UserData>} callback Called on success or error.\n   * @param {GetUserDataOptions} params\n   * @returns {void}\n   */;\n  _proto.getUserData = function getUserData(callback, params) {\n    var _this12 = this;\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      this.clearCachedUserData();\n      return callback(new Error('User is not authenticated'), null);\n    }\n    var userData = this.getUserDataFromCache();\n    if (!userData) {\n      this.fetchUserData().then(function (data) {\n        callback(null, data);\n      })[\"catch\"](callback);\n      return;\n    }\n    if (this.isFetchUserDataAndTokenRequired(params)) {\n      this.fetchUserData().then(function (data) {\n        return _this12.refreshSessionIfPossible(params).then(function () {\n          return data;\n        });\n      }).then(function (data) {\n        return callback(null, data);\n      })[\"catch\"](callback);\n      return;\n    }\n    try {\n      callback(null, JSON.parse(userData));\n      return;\n    } catch (err) {\n      this.clearCachedUserData();\n      callback(err, null);\n      return;\n    }\n  }\n\n  /**\n   *\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   */;\n  _proto.getUserDataFromCache = function getUserDataFromCache() {\n    var userData = this.storage.getItem(this.userDataKey);\n    return userData;\n  }\n\n  /**\n   *\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   */;\n  _proto.isFetchUserDataAndTokenRequired = function isFetchUserDataAndTokenRequired(params) {\n    var _ref = params || {},\n      _ref$bypassCache = _ref.bypassCache,\n      bypassCache = _ref$bypassCache === void 0 ? false : _ref$bypassCache;\n    return bypassCache;\n  }\n  /**\n   *\n   * PRIVATE ONLY: This is an internal only method and should not\n   * be directly called by the consumers.\n   */;\n  _proto.fetchUserData = function fetchUserData() {\n    var _this13 = this;\n    return this.createGetUserRequest().then(function (data) {\n      _this13.cacheUserData(data);\n      return data;\n    });\n  }\n\n  /**\n   * This is used by an authenticated user to delete a list of attributes\n   * @param {string[]} attributeList Names of the attributes to delete.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.deleteAttributes = function deleteAttributes(attributeList, callback) {\n    var _this14 = this;\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      return callback(new Error('User is not authenticated'), null);\n    }\n    this.client.request('DeleteUserAttributes', {\n      UserAttributeNames: attributeList,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback(err, null);\n      }\n\n      // update cached user\n      return _this14.getUserData(function () {\n        return callback(null, 'SUCCESS');\n      }, {\n        bypassCache: true\n      });\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used by a user to resend a confirmation code\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.resendConfirmationCode = function resendConfirmationCode(callback, clientMetadata) {\n    var jsonReq = {\n      ClientId: this.pool.getClientId(),\n      Username: this.username,\n      ClientMetadata: clientMetadata\n    };\n    this.client.request('ResendConfirmationCode', jsonReq, function (err, result) {\n      if (err) {\n        return callback(err, null);\n      }\n      return callback(null, result);\n    });\n  }\n\n  /**\n   * @typedef {Object} GetSessionOptions\n   * @property {Record<string, string>} clientMetadata - clientMetadata for getSession\n   */\n\n  /**\n   * This is used to get a session, either from the session object\n   * or from  the local storage, or by using a refresh token\n   *\n   * @param {nodeCallback<CognitoUserSession>} callback Called on success or error.\n   * @param {GetSessionOptions} options\n   * @returns {void}\n   */;\n  _proto.getSession = function getSession(callback, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (this.username == null) {\n      return callback(new Error('Username is null. Cannot retrieve a new session'), null);\n    }\n    if (this.signInUserSession != null && this.signInUserSession.isValid()) {\n      return callback(null, this.signInUserSession);\n    }\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId() + \".\" + this.username;\n    var idTokenKey = keyPrefix + \".idToken\";\n    var accessTokenKey = keyPrefix + \".accessToken\";\n    var refreshTokenKey = keyPrefix + \".refreshToken\";\n    var clockDriftKey = keyPrefix + \".clockDrift\";\n    if (this.storage.getItem(idTokenKey)) {\n      var idToken = new CognitoIdToken({\n        IdToken: this.storage.getItem(idTokenKey)\n      });\n      var accessToken = new CognitoAccessToken({\n        AccessToken: this.storage.getItem(accessTokenKey)\n      });\n      var refreshToken = new CognitoRefreshToken({\n        RefreshToken: this.storage.getItem(refreshTokenKey)\n      });\n      var clockDrift = parseInt(this.storage.getItem(clockDriftKey), 0) || 0;\n      var sessionData = {\n        IdToken: idToken,\n        AccessToken: accessToken,\n        RefreshToken: refreshToken,\n        ClockDrift: clockDrift\n      };\n      var cachedSession = new CognitoUserSession(sessionData);\n      if (cachedSession.isValid()) {\n        this.signInUserSession = cachedSession;\n        return callback(null, this.signInUserSession);\n      }\n      if (!refreshToken.getToken()) {\n        return callback(new Error('Cannot retrieve a new session. Please authenticate.'), null);\n      }\n      this.refreshSession(refreshToken, callback, options.clientMetadata);\n    } else {\n      callback(new Error('Local storage is missing an ID Token, Please authenticate'), null);\n    }\n    return undefined;\n  }\n\n  /**\n   * This uses the refreshToken to retrieve a new session\n   * @param {CognitoRefreshToken} refreshToken A previous session's refresh token.\n   * @param {nodeCallback<CognitoUserSession>} callback Called on success or error.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.refreshSession = function refreshSession(refreshToken, callback, clientMetadata) {\n    var _this15 = this;\n    var wrappedCallback = this.pool.wrapRefreshSessionCallback ? this.pool.wrapRefreshSessionCallback(callback) : callback;\n    var authParameters = {};\n    authParameters.REFRESH_TOKEN = refreshToken.getToken();\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId();\n    var lastUserKey = keyPrefix + \".LastAuthUser\";\n    if (this.storage.getItem(lastUserKey)) {\n      this.username = this.storage.getItem(lastUserKey);\n      var deviceKeyKey = keyPrefix + \".\" + this.username + \".deviceKey\";\n      this.deviceKey = this.storage.getItem(deviceKeyKey);\n      authParameters.DEVICE_KEY = this.deviceKey;\n    }\n    var jsonReq = {\n      ClientId: this.pool.getClientId(),\n      AuthFlow: 'REFRESH_TOKEN_AUTH',\n      AuthParameters: authParameters,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('InitiateAuth', jsonReq, function (err, authResult) {\n      if (err) {\n        if (err.code === 'NotAuthorizedException') {\n          _this15.clearCachedUser();\n        }\n        return wrappedCallback(err, null);\n      }\n      if (authResult) {\n        var authenticationResult = authResult.AuthenticationResult;\n        if (!Object.prototype.hasOwnProperty.call(authenticationResult, 'RefreshToken')) {\n          authenticationResult.RefreshToken = refreshToken.getToken();\n        }\n        _this15.signInUserSession = _this15.getCognitoUserSession(authenticationResult);\n        _this15.cacheTokens();\n        return wrappedCallback(null, _this15.signInUserSession);\n      }\n      return undefined;\n    });\n  }\n\n  /**\n   * This is used to save the session tokens to local storage\n   * @returns {void}\n   */;\n  _proto.cacheTokens = function cacheTokens() {\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId();\n    var idTokenKey = keyPrefix + \".\" + this.username + \".idToken\";\n    var accessTokenKey = keyPrefix + \".\" + this.username + \".accessToken\";\n    var refreshTokenKey = keyPrefix + \".\" + this.username + \".refreshToken\";\n    var clockDriftKey = keyPrefix + \".\" + this.username + \".clockDrift\";\n    var lastUserKey = keyPrefix + \".LastAuthUser\";\n    this.storage.setItem(idTokenKey, this.signInUserSession.getIdToken().getJwtToken());\n    this.storage.setItem(accessTokenKey, this.signInUserSession.getAccessToken().getJwtToken());\n    this.storage.setItem(refreshTokenKey, this.signInUserSession.getRefreshToken().getToken());\n    this.storage.setItem(clockDriftKey, \"\" + this.signInUserSession.getClockDrift());\n    this.storage.setItem(lastUserKey, this.username);\n  }\n\n  /**\n   * This is to cache user data\n   */;\n  _proto.cacheUserData = function cacheUserData(userData) {\n    this.storage.setItem(this.userDataKey, JSON.stringify(userData));\n  }\n\n  /**\n   * This is to remove cached user data\n   */;\n  _proto.clearCachedUserData = function clearCachedUserData() {\n    this.storage.removeItem(this.userDataKey);\n  };\n  _proto.clearCachedUser = function clearCachedUser() {\n    this.clearCachedTokens();\n    this.clearCachedUserData();\n  }\n\n  /**\n   * This is used to cache the device key and device group and device password\n   * @returns {void}\n   */;\n  _proto.cacheDeviceKeyAndPassword = function cacheDeviceKeyAndPassword() {\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId() + \".\" + this.username;\n    var deviceKeyKey = keyPrefix + \".deviceKey\";\n    var randomPasswordKey = keyPrefix + \".randomPasswordKey\";\n    var deviceGroupKeyKey = keyPrefix + \".deviceGroupKey\";\n    this.storage.setItem(deviceKeyKey, this.deviceKey);\n    this.storage.setItem(randomPasswordKey, this.randomPassword);\n    this.storage.setItem(deviceGroupKeyKey, this.deviceGroupKey);\n  }\n\n  /**\n   * This is used to get current device key and device group and device password\n   * @returns {void}\n   */;\n  _proto.getCachedDeviceKeyAndPassword = function getCachedDeviceKeyAndPassword() {\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId() + \".\" + this.username;\n    var deviceKeyKey = keyPrefix + \".deviceKey\";\n    var randomPasswordKey = keyPrefix + \".randomPasswordKey\";\n    var deviceGroupKeyKey = keyPrefix + \".deviceGroupKey\";\n    if (this.storage.getItem(deviceKeyKey)) {\n      this.deviceKey = this.storage.getItem(deviceKeyKey);\n      this.randomPassword = this.storage.getItem(randomPasswordKey);\n      this.deviceGroupKey = this.storage.getItem(deviceGroupKeyKey);\n    }\n  }\n\n  /**\n   * This is used to clear the device key info from local storage\n   * @returns {void}\n   */;\n  _proto.clearCachedDeviceKeyAndPassword = function clearCachedDeviceKeyAndPassword() {\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId() + \".\" + this.username;\n    var deviceKeyKey = keyPrefix + \".deviceKey\";\n    var randomPasswordKey = keyPrefix + \".randomPasswordKey\";\n    var deviceGroupKeyKey = keyPrefix + \".deviceGroupKey\";\n    this.storage.removeItem(deviceKeyKey);\n    this.storage.removeItem(randomPasswordKey);\n    this.storage.removeItem(deviceGroupKeyKey);\n  }\n\n  /**\n   * This is used to clear the session tokens from local storage\n   * @returns {void}\n   */;\n  _proto.clearCachedTokens = function clearCachedTokens() {\n    var keyPrefix = \"CognitoIdentityServiceProvider.\" + this.pool.getClientId();\n    var idTokenKey = keyPrefix + \".\" + this.username + \".idToken\";\n    var accessTokenKey = keyPrefix + \".\" + this.username + \".accessToken\";\n    var refreshTokenKey = keyPrefix + \".\" + this.username + \".refreshToken\";\n    var lastUserKey = keyPrefix + \".LastAuthUser\";\n    var clockDriftKey = keyPrefix + \".\" + this.username + \".clockDrift\";\n    this.storage.removeItem(idTokenKey);\n    this.storage.removeItem(accessTokenKey);\n    this.storage.removeItem(refreshTokenKey);\n    this.storage.removeItem(lastUserKey);\n    this.storage.removeItem(clockDriftKey);\n  }\n\n  /**\n   * This is used to build a user session from tokens retrieved in the authentication result\n   * @param {object} authResult Successful auth response from server.\n   * @returns {CognitoUserSession} The new user session.\n   * @private\n   */;\n  _proto.getCognitoUserSession = function getCognitoUserSession(authResult) {\n    var idToken = new CognitoIdToken(authResult);\n    var accessToken = new CognitoAccessToken(authResult);\n    var refreshToken = new CognitoRefreshToken(authResult);\n    var sessionData = {\n      IdToken: idToken,\n      AccessToken: accessToken,\n      RefreshToken: refreshToken\n    };\n    return new CognitoUserSession(sessionData);\n  }\n\n  /**\n   * This is used to initiate a forgot password request\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {inputVerificationCode?} callback.inputVerificationCode\n   *    Optional callback raised instead of onSuccess with response data.\n   * @param {onSuccess} callback.onSuccess Called on success.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.forgotPassword = function forgotPassword(callback, clientMetadata) {\n    var jsonReq = {\n      ClientId: this.pool.getClientId(),\n      Username: this.username,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('ForgotPassword', jsonReq, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      if (typeof callback.inputVerificationCode === 'function') {\n        return callback.inputVerificationCode(data);\n      }\n      return callback.onSuccess(data);\n    });\n  }\n\n  /**\n   * This is used to confirm a new password using a confirmationCode\n   * @param {string} confirmationCode Code entered by user.\n   * @param {string} newPassword Confirm new password.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<void>} callback.onSuccess Called on success.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.confirmPassword = function confirmPassword(confirmationCode, newPassword, callback, clientMetadata) {\n    var jsonReq = {\n      ClientId: this.pool.getClientId(),\n      Username: this.username,\n      ConfirmationCode: confirmationCode,\n      Password: newPassword,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('ConfirmForgotPassword', jsonReq, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n  }\n\n  /**\n   * This is used to initiate an attribute confirmation request\n   * @param {string} attributeName User attribute that needs confirmation.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {inputVerificationCode} callback.inputVerificationCode Called on success.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.getAttributeVerificationCode = function getAttributeVerificationCode(attributeName, callback, clientMetadata) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('GetUserAttributeVerificationCode', {\n      AttributeName: attributeName,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      ClientMetadata: clientMetadata\n    }, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      if (typeof callback.inputVerificationCode === 'function') {\n        return callback.inputVerificationCode(data);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to confirm an attribute using a confirmation code\n   * @param {string} attributeName Attribute being confirmed.\n   * @param {string} confirmationCode Code entered by user.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.verifyAttribute = function verifyAttribute(attributeName, confirmationCode, callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('VerifyUserAttribute', {\n      AttributeName: attributeName,\n      Code: confirmationCode,\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to get the device information using the current device key\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<*>} callback.onSuccess Called on success with device data.\n   * @returns {void}\n   */;\n  _proto.getDevice = function getDevice(callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('GetDevice', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      DeviceKey: this.deviceKey\n    }, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess(data);\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to forget a specific device\n   * @param {string} deviceKey Device key.\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.forgetSpecificDevice = function forgetSpecificDevice(deviceKey, callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('ForgetDevice', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      DeviceKey: deviceKey\n    }, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to forget the current device\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.forgetDevice = function forgetDevice(callback) {\n    var _this16 = this;\n    this.forgetSpecificDevice(this.deviceKey, {\n      onFailure: callback.onFailure,\n      onSuccess: function onSuccess(result) {\n        _this16.deviceKey = null;\n        _this16.deviceGroupKey = null;\n        _this16.randomPassword = null;\n        _this16.clearCachedDeviceKeyAndPassword();\n        return callback.onSuccess(result);\n      }\n    });\n  }\n\n  /**\n   * This is used to set the device status as remembered\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.setDeviceStatusRemembered = function setDeviceStatusRemembered(callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('UpdateDeviceStatus', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      DeviceKey: this.deviceKey,\n      DeviceRememberedStatus: 'remembered'\n    }, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to set the device status as not remembered\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.setDeviceStatusNotRemembered = function setDeviceStatusNotRemembered(callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('UpdateDeviceStatus', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      DeviceKey: this.deviceKey,\n      DeviceRememberedStatus: 'not_remembered'\n    }, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to list all devices for a user\n   *\n   * @param {int} limit the number of devices returned in a call\n   * @param {string | null} paginationToken the pagination token in case any was returned before\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<*>} callback.onSuccess Called on success with device list.\n   * @returns {void}\n   */;\n  _proto.listDevices = function listDevices(limit, paginationToken, callback) {\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    var requestParams = {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n      Limit: limit\n    };\n    if (paginationToken) {\n      requestParams.PaginationToken = paginationToken;\n    }\n    this.client.request('ListDevices', requestParams, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      return callback.onSuccess(data);\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used to globally revoke all tokens issued to a user\n   * @param {object} callback Result callback map.\n   * @param {onFailure} callback.onFailure Called on any error.\n   * @param {onSuccess<string>} callback.onSuccess Called on success.\n   * @returns {void}\n   */;\n  _proto.globalSignOut = function globalSignOut(callback) {\n    var _this17 = this;\n    if (this.signInUserSession == null || !this.signInUserSession.isValid()) {\n      return callback.onFailure(new Error('User is not authenticated'));\n    }\n    this.client.request('GlobalSignOut', {\n      AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n    }, function (err) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      _this17.clearCachedUser();\n      return callback.onSuccess('SUCCESS');\n    });\n    return undefined;\n  }\n\n  /**\n   * This is used for the user to signOut of the application and clear the cached tokens.\n   * @returns {void}\n   */;\n  _proto.signOut = function signOut(revokeTokenCallback) {\n    var _this18 = this;\n    // If tokens won't be revoked, we just clean the client data.\n    if (!revokeTokenCallback || typeof revokeTokenCallback !== 'function') {\n      this.cleanClientData();\n      return;\n    }\n    this.getSession(function (error, _session) {\n      if (error) {\n        return revokeTokenCallback(error);\n      }\n      _this18.revokeTokens(function (err) {\n        _this18.cleanClientData();\n        revokeTokenCallback(err);\n      });\n    });\n  };\n  _proto.revokeTokens = function revokeTokens(revokeTokenCallback) {\n    if (revokeTokenCallback === void 0) {\n      revokeTokenCallback = function revokeTokenCallback() {};\n    }\n    if (typeof revokeTokenCallback !== 'function') {\n      throw new Error('Invalid revokeTokenCallback. It should be a function.');\n    }\n    var tokensToBeRevoked = [];\n    if (!this.signInUserSession) {\n      var error = new Error('User is not authenticated');\n      return revokeTokenCallback(error);\n    }\n    if (!this.signInUserSession.getAccessToken()) {\n      var _error = new Error('No Access token available');\n      return revokeTokenCallback(_error);\n    }\n    var refreshToken = this.signInUserSession.getRefreshToken().getToken();\n    var accessToken = this.signInUserSession.getAccessToken();\n    if (this.isSessionRevocable(accessToken)) {\n      if (refreshToken) {\n        return this.revokeToken({\n          token: refreshToken,\n          callback: revokeTokenCallback\n        });\n      }\n    }\n    revokeTokenCallback();\n  };\n  _proto.isSessionRevocable = function isSessionRevocable(token) {\n    if (token && typeof token.decodePayload === 'function') {\n      try {\n        var _token$decodePayload = token.decodePayload(),\n          origin_jti = _token$decodePayload.origin_jti;\n        return !!origin_jti;\n      } catch (err) {\n        // Nothing to do, token doesnt have origin_jti claim\n      }\n    }\n    return false;\n  };\n  _proto.cleanClientData = function cleanClientData() {\n    this.signInUserSession = null;\n    this.clearCachedUser();\n  };\n  _proto.revokeToken = function revokeToken(_ref2) {\n    var token = _ref2.token,\n      callback = _ref2.callback;\n    this.client.requestWithRetry('RevokeToken', {\n      Token: token,\n      ClientId: this.pool.getClientId()\n    }, function (err) {\n      if (err) {\n        return callback(err);\n      }\n      callback();\n    });\n  }\n\n  /**\n   * This is used by a user trying to select a given MFA\n   * @param {string} answerChallenge the mfa the user wants\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.sendMFASelectionAnswer = function sendMFASelectionAnswer(answerChallenge, callback) {\n    var _this19 = this;\n    var challengeResponses = {};\n    challengeResponses.USERNAME = this.username;\n    challengeResponses.ANSWER = answerChallenge;\n    var jsonReq = {\n      ChallengeName: 'SELECT_MFA_TYPE',\n      ChallengeResponses: challengeResponses,\n      ClientId: this.pool.getClientId(),\n      Session: this.Session\n    };\n    if (this.getUserContextData()) {\n      jsonReq.UserContextData = this.getUserContextData();\n    }\n    this.client.request('RespondToAuthChallenge', jsonReq, function (err, data) {\n      if (err) {\n        return callback.onFailure(err);\n      }\n      _this19.Session = data.Session;\n      if (answerChallenge === 'SMS_MFA') {\n        return callback.mfaRequired(data.ChallengeName, data.ChallengeParameters);\n      }\n      if (answerChallenge === 'SOFTWARE_TOKEN_MFA') {\n        return callback.totpRequired(data.ChallengeName, data.ChallengeParameters);\n      }\n      return undefined;\n    });\n  }\n\n  /**\n   * This returns the user context data for advanced security feature.\n   * @returns {string} the user context data from CognitoUserPool\n   */;\n  _proto.getUserContextData = function getUserContextData() {\n    var pool = this.pool;\n    return pool.getUserContextData(this.username);\n  }\n\n  /**\n   * This is used by an authenticated or a user trying to authenticate to associate a TOTP MFA\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.associateSoftwareToken = function associateSoftwareToken(callback) {\n    var _this20 = this;\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      this.client.request('AssociateSoftwareToken', {\n        Session: this.Session\n      }, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        _this20.Session = data.Session;\n        return callback.associateSecretCode(data.SecretCode);\n      });\n    } else {\n      this.client.request('AssociateSoftwareToken', {\n        AccessToken: this.signInUserSession.getAccessToken().getJwtToken()\n      }, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        return callback.associateSecretCode(data.SecretCode);\n      });\n    }\n  }\n\n  /**\n   * This is used by an authenticated or a user trying to authenticate to verify a TOTP MFA\n   * @param {string} totpCode The MFA code entered by the user.\n   * @param {string} friendlyDeviceName The device name we are assigning to the device.\n   * @param {nodeCallback<string>} callback Called on success or error.\n   * @returns {void}\n   */;\n  _proto.verifySoftwareToken = function verifySoftwareToken(totpCode, friendlyDeviceName, callback) {\n    var _this21 = this;\n    if (!(this.signInUserSession != null && this.signInUserSession.isValid())) {\n      this.client.request('VerifySoftwareToken', {\n        Session: this.Session,\n        UserCode: totpCode,\n        FriendlyDeviceName: friendlyDeviceName\n      }, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        _this21.Session = data.Session;\n        var challengeResponses = {};\n        challengeResponses.USERNAME = _this21.username;\n        var jsonReq = {\n          ChallengeName: 'MFA_SETUP',\n          ClientId: _this21.pool.getClientId(),\n          ChallengeResponses: challengeResponses,\n          Session: _this21.Session\n        };\n        if (_this21.getUserContextData()) {\n          jsonReq.UserContextData = _this21.getUserContextData();\n        }\n        _this21.client.request('RespondToAuthChallenge', jsonReq, function (errRespond, dataRespond) {\n          if (errRespond) {\n            return callback.onFailure(errRespond);\n          }\n          _this21.signInUserSession = _this21.getCognitoUserSession(dataRespond.AuthenticationResult);\n          _this21.cacheTokens();\n          return callback.onSuccess(_this21.signInUserSession);\n        });\n        return undefined;\n      });\n    } else {\n      this.client.request('VerifySoftwareToken', {\n        AccessToken: this.signInUserSession.getAccessToken().getJwtToken(),\n        UserCode: totpCode,\n        FriendlyDeviceName: friendlyDeviceName\n      }, function (err, data) {\n        if (err) {\n          return callback.onFailure(err);\n        }\n        return callback.onSuccess(data);\n      });\n    }\n  };\n  return CognitoUser;\n}();\nexport { CognitoUser as default };","import { getUserAgent } from './Platform';\nimport { AUTH_CATEGORY } from './Platform/constants';\n\n// constructor\nfunction UserAgent() {}\n// public\nUserAgent.prototype.userAgent = getUserAgent();\nexport var appendToCognitoUserAgent = function appendToCognitoUserAgent(content) {\n  if (!content) {\n    return;\n  }\n  if (UserAgent.prototype.userAgent && !UserAgent.prototype.userAgent.includes(content)) {\n    UserAgent.prototype.userAgent = UserAgent.prototype.userAgent.concat(' ', content);\n  }\n  if (!UserAgent.prototype.userAgent || UserAgent.prototype.userAgent === '') {\n    UserAgent.prototype.userAgent = content;\n  }\n};\nexport var addAuthCategoryToCognitoUserAgent = function addAuthCategoryToCognitoUserAgent() {\n  UserAgent.category = AUTH_CATEGORY;\n};\nexport var addFrameworkToCognitoUserAgent = function addFrameworkToCognitoUserAgent(framework) {\n  UserAgent.framework = framework;\n};\nexport var getAmplifyUserAgent = function getAmplifyUserAgent(action) {\n  var uaCategoryAction = UserAgent.category ? \" \" + UserAgent.category : '';\n  var uaFramework = UserAgent.framework ? \" framework/\" + UserAgent.framework : '';\n  var userAgent = \"\" + UserAgent.prototype.userAgent + uaCategoryAction + uaFramework;\n  return userAgent;\n};\n\n// class for defining the amzn user-agent\nexport default UserAgent;","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; } catch (e) { return typeof fn === \"function\"; } }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nimport 'isomorphic-unfetch';\nimport { getAmplifyUserAgent } from './UserAgent';\nvar CognitoError = /*#__PURE__*/function (_Error) {\n  _inheritsLoose(CognitoError, _Error);\n  function CognitoError(message, code, name, statusCode) {\n    var _this;\n    _this = _Error.call(this, message) || this;\n    _this.code = code;\n    _this.name = name;\n    _this.statusCode = statusCode;\n    return _this;\n  }\n  return CognitoError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n/** @class */\nvar Client = /*#__PURE__*/function () {\n  /**\n   * Constructs a new AWS Cognito Identity Provider client object\n   * @param {string} region AWS region\n   * @param {string} endpoint endpoint\n   * @param {object} fetchOptions options for fetch API (only credentials is supported)\n   */\n  function Client(region, endpoint, fetchOptions) {\n    this.endpoint = endpoint || \"https://cognito-idp.\" + region + \".amazonaws.com/\";\n    var _ref = fetchOptions || {},\n      credentials = _ref.credentials;\n    this.fetchOptions = credentials ? {\n      credentials: credentials\n    } : {};\n  }\n\n  /**\n   * Makes an unauthenticated request on AWS Cognito Identity Provider API\n   * using fetch\n   * @param {string} operation API operation\n   * @param {object} params Input parameters\n   * @returns Promise<object>\n   */\n  var _proto = Client.prototype;\n  _proto.promisifyRequest = function promisifyRequest(operation, params) {\n    var _this2 = this;\n    return new Promise(function (resolve, reject) {\n      _this2.request(operation, params, function (err, data) {\n        if (err) {\n          reject(new CognitoError(err.message, err.code, err.name, err.statusCode));\n        } else {\n          resolve(data);\n        }\n      });\n    });\n  };\n  _proto.requestWithRetry = function requestWithRetry(operation, params, callback) {\n    var _this3 = this;\n    var MAX_DELAY_IN_MILLIS = 5 * 1000;\n    jitteredExponentialRetry(function (p) {\n      return new Promise(function (res, rej) {\n        _this3.request(operation, p, function (error, result) {\n          if (error) {\n            rej(error);\n          } else {\n            res(result);\n          }\n        });\n      });\n    }, [params], MAX_DELAY_IN_MILLIS).then(function (result) {\n      return callback(null, result);\n    })[\"catch\"](function (error) {\n      return callback(error);\n    });\n  }\n\n  /**\n   * Makes an unauthenticated request on AWS Cognito Identity Provider API\n   * using fetch\n   * @param {string} operation API operation\n   * @param {object} params Input parameters\n   * @param {function} callback Callback called when a response is returned\n   * @returns {void}\n   */;\n  _proto.request = function request(operation, params, callback) {\n    var headers = {\n      'Content-Type': 'application/x-amz-json-1.1',\n      'X-Amz-Target': \"AWSCognitoIdentityProviderService.\" + operation,\n      'X-Amz-User-Agent': getAmplifyUserAgent(),\n      'Cache-Control': 'no-store'\n    };\n    var options = Object.assign({}, this.fetchOptions, {\n      headers: headers,\n      method: 'POST',\n      mode: 'cors',\n      body: JSON.stringify(params)\n    });\n    var response;\n    var responseJsonData;\n    fetch(this.endpoint, options).then(function (resp) {\n      response = resp;\n      return resp;\n    }, function (err) {\n      // If error happens here, the request failed\n      // if it is TypeError throw network error\n      if (err instanceof TypeError) {\n        throw new Error('Network error');\n      }\n      throw err;\n    }).then(function (resp) {\n      return resp.json()[\"catch\"](function () {\n        return {};\n      });\n    }).then(function (data) {\n      // return parsed body stream\n      if (response.ok) return callback(null, data);\n      responseJsonData = data;\n\n      // Taken from aws-sdk-js/lib/protocol/json.js\n      // eslint-disable-next-line no-underscore-dangle\n      var code = (data.__type || data.code).split('#').pop();\n      var error = new Error(data.message || data.Message || null);\n      error.name = code;\n      error.code = code;\n      return callback(error);\n    })[\"catch\"](function (err) {\n      // first check if we have a service error\n      if (response && response.headers && response.headers.get('x-amzn-errortype')) {\n        try {\n          var code = response.headers.get('x-amzn-errortype').split(':')[0];\n          var error = new Error(response.status ? response.status.toString() : null);\n          error.code = code;\n          error.name = code;\n          error.statusCode = response.status;\n          return callback(error);\n        } catch (ex) {\n          return callback(err);\n        }\n        // otherwise check if error is Network error\n      } else if (err instanceof Error && err.message === 'Network error') {\n        err.code = 'NetworkError';\n      }\n      return callback(err);\n    });\n  };\n  return Client;\n}();\nexport { Client as default };\nvar logger = {\n  debug: function debug() {\n    // Intentionally blank. This package doesn't have logging\n  }\n};\n\n/**\n * For now, all errors are retryable.\n */\nvar NonRetryableError = /*#__PURE__*/function (_Error2) {\n  _inheritsLoose(NonRetryableError, _Error2);\n  function NonRetryableError(message) {\n    var _this4;\n    _this4 = _Error2.call(this, message) || this;\n    _this4.nonRetryable = true;\n    return _this4;\n  }\n  return NonRetryableError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nvar isNonRetryableError = function isNonRetryableError(obj) {\n  var key = 'nonRetryable';\n  return obj && obj[key];\n};\nfunction retry(functionToRetry, args, delayFn, attempt) {\n  if (attempt === void 0) {\n    attempt = 1;\n  }\n  if (typeof functionToRetry !== 'function') {\n    throw Error('functionToRetry must be a function');\n  }\n  logger.debug(functionToRetry.name + \" attempt #\" + attempt + \" with args: \" + JSON.stringify(args));\n  return functionToRetry.apply(void 0, args)[\"catch\"](function (err) {\n    logger.debug(\"error on \" + functionToRetry.name, err);\n    if (isNonRetryableError(err)) {\n      logger.debug(functionToRetry.name + \" non retryable error\", err);\n      throw err;\n    }\n    var retryIn = delayFn(attempt, args, err);\n    logger.debug(functionToRetry.name + \" retrying in \" + retryIn + \" ms\");\n    if (retryIn !== false) {\n      return new Promise(function (res) {\n        return setTimeout(res, retryIn);\n      }).then(function () {\n        return retry(functionToRetry, args, delayFn, attempt + 1);\n      });\n    } else {\n      throw err;\n    }\n  });\n}\nfunction jitteredBackoff(maxDelayMs) {\n  var BASE_TIME_MS = 100;\n  var JITTER_FACTOR = 100;\n  return function (attempt) {\n    var delay = Math.pow(2, attempt) * BASE_TIME_MS + JITTER_FACTOR * Math.random();\n    return delay > maxDelayMs ? false : delay;\n  };\n}\nvar MAX_DELAY_MS = 5 * 60 * 1000;\nfunction jitteredExponentialRetry(functionToRetry, args, maxDelayMs) {\n  if (maxDelayMs === void 0) {\n    maxDelayMs = MAX_DELAY_MS;\n  }\n  return retry(functionToRetry, args, jitteredBackoff(maxDelayMs));\n}","/*!\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport Client from './Client';\nimport CognitoUser from './CognitoUser';\nimport StorageHelper from './StorageHelper';\nvar USER_POOL_ID_MAX_LENGTH = 55;\n\n/** @class */\nvar CognitoUserPool = /*#__PURE__*/function () {\n  /**\n   * Constructs a new CognitoUserPool object\n   * @param {object} data Creation options.\n   * @param {string} data.UserPoolId Cognito user pool id.\n   * @param {string} data.ClientId User pool application client id.\n   * @param {string} data.endpoint Optional custom service endpoint.\n   * @param {object} data.fetchOptions Optional options for fetch API.\n   *        (only credentials option is supported)\n   * @param {object} data.Storage Optional storage object.\n   * @param {boolean} data.AdvancedSecurityDataCollectionFlag Optional:\n   *        boolean flag indicating if the data collection is enabled\n   *        to support cognito advanced security features. By default, this\n   *        flag is set to true.\n   */\n  function CognitoUserPool(data, wrapRefreshSessionCallback) {\n    var _ref = data || {},\n      UserPoolId = _ref.UserPoolId,\n      ClientId = _ref.ClientId,\n      endpoint = _ref.endpoint,\n      fetchOptions = _ref.fetchOptions,\n      AdvancedSecurityDataCollectionFlag = _ref.AdvancedSecurityDataCollectionFlag;\n    if (!UserPoolId || !ClientId) {\n      throw new Error('Both UserPoolId and ClientId are required.');\n    }\n    if (UserPoolId.length > USER_POOL_ID_MAX_LENGTH || !/^[\\w-]+_[0-9a-zA-Z]+$/.test(UserPoolId)) {\n      throw new Error('Invalid UserPoolId format.');\n    }\n    var region = UserPoolId.split('_')[0];\n    this.userPoolId = UserPoolId;\n    this.clientId = ClientId;\n    this.client = new Client(region, endpoint, fetchOptions);\n\n    /**\n     * By default, AdvancedSecurityDataCollectionFlag is set to true,\n     * if no input value is provided.\n     */\n    this.advancedSecurityDataCollectionFlag = AdvancedSecurityDataCollectionFlag !== false;\n    this.storage = data.Storage || new StorageHelper().getStorage();\n    if (wrapRefreshSessionCallback) {\n      this.wrapRefreshSessionCallback = wrapRefreshSessionCallback;\n    }\n  }\n\n  /**\n   * @returns {string} the user pool id\n   */\n  var _proto = CognitoUserPool.prototype;\n  _proto.getUserPoolId = function getUserPoolId() {\n    return this.userPoolId;\n  }\n\n  /**\n   * @returns {string} the user pool name\n   */;\n  _proto.getUserPoolName = function getUserPoolName() {\n    return this.getUserPoolId().split('_')[1];\n  }\n\n  /**\n   * @returns {string} the client id\n   */;\n  _proto.getClientId = function getClientId() {\n    return this.clientId;\n  }\n\n  /**\n   * @typedef {object} SignUpResult\n   * @property {CognitoUser} user New user.\n   * @property {bool} userConfirmed If the user is already confirmed.\n   */\n  /**\n   * method for signing up a user\n   * @param {string} username User's username.\n   * @param {string} password Plain-text initial password entered by user.\n   * @param {(AttributeArg[])=} userAttributes New user attributes.\n   * @param {(AttributeArg[])=} validationData Application metadata.\n   * @param {(AttributeArg[])=} clientMetadata Client metadata.\n   * @param {nodeCallback<SignUpResult>} callback Called on error or with the new user.\n   * @param {ClientMetadata} clientMetadata object which is passed from client to Cognito Lambda trigger\n   * @returns {void}\n   */;\n  _proto.signUp = function signUp(username, password, userAttributes, validationData, callback, clientMetadata) {\n    var _this = this;\n    var jsonReq = {\n      ClientId: this.clientId,\n      Username: username,\n      Password: password,\n      UserAttributes: userAttributes,\n      ValidationData: validationData,\n      ClientMetadata: clientMetadata\n    };\n    if (this.getUserContextData(username)) {\n      jsonReq.UserContextData = this.getUserContextData(username);\n    }\n    this.client.request('SignUp', jsonReq, function (err, data) {\n      if (err) {\n        return callback(err, null);\n      }\n      var cognitoUser = {\n        Username: username,\n        Pool: _this,\n        Storage: _this.storage\n      };\n      var returnData = {\n        user: new CognitoUser(cognitoUser),\n        userConfirmed: data.UserConfirmed,\n        userSub: data.UserSub,\n        codeDeliveryDetails: data.CodeDeliveryDetails\n      };\n      return callback(null, returnData);\n    });\n  }\n\n  /**\n   * method for getting the current user of the application from the local storage\n   *\n   * @returns {CognitoUser} the user retrieved from storage\n   */;\n  _proto.getCurrentUser = function getCurrentUser() {\n    var lastUserKey = \"CognitoIdentityServiceProvider.\" + this.clientId + \".LastAuthUser\";\n    var lastAuthUser = this.storage.getItem(lastUserKey);\n    if (lastAuthUser) {\n      var cognitoUser = {\n        Username: lastAuthUser,\n        Pool: this,\n        Storage: this.storage\n      };\n      return new CognitoUser(cognitoUser);\n    }\n    return null;\n  }\n\n  /**\n   * This method returns the encoded data string used for cognito advanced security feature.\n   * This would be generated only when developer has included the JS used for collecting the\n   * data on their client. Please refer to documentation to know more about using AdvancedSecurity\n   * features\n   * @param {string} username the username for the context data\n   * @returns {string} the user context data\n   **/;\n  _proto.getUserContextData = function getUserContextData(username) {\n    if (typeof AmazonCognitoAdvancedSecurityData === 'undefined') {\n      return undefined;\n    }\n    /* eslint-disable */\n    var amazonCognitoAdvancedSecurityDataConst = AmazonCognitoAdvancedSecurityData;\n    /* eslint-enable */\n\n    if (this.advancedSecurityDataCollectionFlag) {\n      var advancedSecurityData = amazonCognitoAdvancedSecurityDataConst.getData(username, this.userPoolId, this.clientId);\n      if (advancedSecurityData) {\n        var userContextData = {\n          EncodedData: advancedSecurityData\n        };\n        return userContextData;\n      }\n    }\n    return {};\n  };\n  return CognitoUserPool;\n}();\nexport { CognitoUserPool as default };","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\n\nimport { AuthenticationDetails, CognitoUser, CognitoUserPool } from 'amazon-cognito-identity-js';\n\n/**\n * A simple factory for creating a user object with AWS Cognito\n * @param userData\n * @returns\n */\n// --------------------------------------------------------------------------------------\nexport function createUser(userData: { Username: string, Pool: CognitoUserPool }) {\n    return new CognitoUser(userData);\n}\n\n/**\n * A simple factory for creating a user pool with AWS Cognito\n * @param userPoolId\n * @param clientId\n * @returns\n */\n// --------------------------------------------------------------------------------------\nexport function createUserPool(userPoolId: string, clientId: string): CognitoUserPool {\n    return new CognitoUserPool({\n        UserPoolId: userPoolId,\n        ClientId: clientId\n    });\n}\n\n/**\n * A simple factory for creating authentication details with AWS Cognito\n * @param username\n * @param password\n * @returns\n */\n// --------------------------------------------------------------------------------------\nexport function createAuthenticationDetails(username: string, password: string) {\n    return new AuthenticationDetails({\n        Username: username,\n        Password: password\n    });\n}\n","import {IFManuals} from '../interfaces';\n\nexport interface FileProvider {\n  prepareFile(data: IFManuals, file: File): {\n    formData: FormData | string,\n    mainUrl: string\n  };\n  getFile(formFields: Array<any>): {file: File};\n\n}\n\nexport class BrowserFileProvider {\n\n\n  getFile(formFields: Array<any>) {\n    const file = formFields.find(field => field.id === 'file').value;\n    return {file};\n  }\n\n  prepareFile(data: IFManuals, file: File) {\n    const formData = new FormData();\n    const mainUrl = data.url;\n    formData.append('key', data.fields.key);\n    formData.append('x-amz-algorithm', data.fields['x-amz-algorithm']);\n    formData.append('x-amz-credential', data.fields['x-amz-credential']);\n    formData.append('x-amz-date', data.fields['x-amz-date']);\n    formData.append('x-amz-security-token', data.fields['x-amz-security-token']);\n    formData.append('policy', data.fields.policy);\n    formData.append('x-amz-signature', data.fields['x-amz-signature']);\n    formData.append('file', file);\n    return { formData, mainUrl };\n  }\n}\n\nexport class DummyFileProvider {\n\n  content = 'This is dummy content for a file';\n\n  setFileContent(content: string) {\n    this.content = content;\n  }\n\n  prepareFile(data: IFManuals, files: File) {\n      const file = 'test.pdf';\n      const formData = \"This is dummy content for a file\";\n      const mainUrl = data.url;\n      return { formData, mainUrl };\n\n  }\n\n  getFile(formFields: Array<any>) {\n    const blob = new Blob([this.content]);\n    const fileName = formFields.find(field => field.id === 'file').value;\n\n    const file = new File([blob], fileName, {\n      type: 'application/plain',\n    });\n    return {file};\n  }\n\n}\n","import { displayNotification } from \"../LdNotificationHandler\";\n\nexport interface NotificationHandler {\n  notify(type: string, message: string, duration: number, dismissable: boolean): void;\n\n}\n\nexport class ToastNotificationHandler implements NotificationHandler {\n  notify(type: string, message: string, duration: number = 5000, dismissable: boolean = true) {\n    displayNotification(type, message, duration , dismissable);\n  }\n}\n","import { CONFIG } from \"../LdGlobal\";\n\nexport interface Validator {\n  validate(formFields: Array<any>): Array<boolean>;\n}\n\nexport class BrowserFormValidator {\n\n  validate(formFields: any[]) {\n    /**\n     * validate form data\n     */\n    formFields.forEach((field, index) => {\n      if (typeof field.fieldDefinition.validation !== 'undefined') {\n\n        const fieldValue = (typeof field.value === 'undefined') ? '' : field.value;\n        let isValid = true;\n\n        field.fieldDefinition.validation.forEach((rule: string) => {\n          if (rule === 'isNotEmpty') {\n            isValid = !!fieldValue;\n          } else if (rule === 'fileSizeLimit') {\n            if (fieldValue !== '') {\n              const maxSizeInMB = CONFIG.backend.services.service.maxUploadSizeInMB;\n              const maxSizeInB = maxSizeInMB * 1048576;\n              isValid = fieldValue.size != null ? fieldValue.size < maxSizeInB : true;\n            }\n          }\n        });\n\n        formFields[index].isValid = isValid;\n      }\n    });\n\n    formFields.forEach(field => {\n      field.domNode.invalid = typeof field.isValid !== 'undefined' && field.isValid !== null && !field.isValid;\n    });\n\n    return formFields.filter(field => !field.isValid);\n  }\n\n}\n\nexport class PermissiveFormValidator {\n\n  validate(formFields: any[]) {\n    /**\n     * validate form data\n     */\n    formFields.forEach((field, index) => {\n      if (typeof field.fieldDefinition.validation !== 'undefined') {\n\n        formFields[index].isValid = true;\n      }\n    });\n\n    formFields.forEach(field => {\n      field.domNode.invalid = !field.isValid;\n    });\n\n    return [];\n  }\n\n}\n","import { forward, goToUrl } from '../LdGlobal';\n\ntype RouteChangeConfig = {\n  useSpinner: boolean;\n};\n\nexport interface Router {\n  /**\n   * Changes URL without reload of page.\n   * @param path\n   * @param options\n   */\n  changeView(path: string, options?: RouteChangeConfig): void;\n\n  /**\n   * Changes URL with reload of page.\n   * @param path\n   */\n  changeLocation(path: string): void;\n}\n\nexport class BasicRouter implements Router {\n\n  changeView(path: string, options: RouteChangeConfig = { useSpinner: true }): void {\n    if (options.useSpinner) {\n      forward(path);\n    } else {\n      goToUrl.assign(path);\n    }\n  }\n\n  changeLocation(path: string): void {\n    window.location.assign(path);\n  }\n}\n","import { baseConfig } from \"../auto-generated/config\";\n\nexport const clearToken = () => {\n  const prefix = \"\"; // CONFIG.localstorage.storage_key --> let's see if we do it like this.\n  const tokenKey = baseConfig.localstorage.token_key;\n  const computedKey = prefix + tokenKey;\n  localStorage.removeItem(computedKey);\n  localStorage.removeItem('breadcrumb');\n\n  return;\n}\n","\nimport { css } from \"lit\";\n\nexport const styles = css`\n:host {\n    display: flex;\n    width: 100%;\n    height: 100%;\n}\n.wrapper {\n    display: flex;\n    flex-direction: column;\n    flex: auto;\n    background-color: #fff;\n    color: #000;\n    padding: 5px 0;\n    z-index: 1;\n    font-size: 13px;\n    -webkit-animation: fadein-password-rules-view 1s;\n    -moz-animation: fadein-password-rules-view 1s;\n    -ms-animation: fadein-password-rules-view 1s;\n    -o-animation: fadein-password-rules-view 1s;\n    animation: fadein-password-rules-view 1s;\n}\n\n/* This is the pointer */\n.wrapper.pointer-left::after {\n    content: \" \";\n    position: absolute;\n    top: 50%;\n    right: 100%;\n    margin-top: -5px;\n    border-width: 5px;\n    border-style: solid;\n    border-color: transparent white transparent transparent;\n}\n\n/* This is the pointer */\n.wrapper.pointer-right::after {\n    content: \" \";\n    transform: rotate(180deg);\n    position: absolute;\n    top: 50%;\n    left: 100%;\n    margin-top: -5px;\n    border-width: 5px;\n    border-style: solid;\n    border-color: transparent white transparent transparent;\n}\n\n.wrapper ul {\n    margin: 0;\n    padding: 0 0 0 10px;\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n    justify-content: space-evenly;\n}\n\n.wrapper li {\n    list-style: none;\n}\n\n*[data-pass='true'] {\n    color: forestgreen;\n}\n\n@keyframes fadein-password-rules-view {\n    from {\n    opacity: 0;\n    }\n    to {\n    opacity: 1;\n    }\n}\n@-webkit-keyframes fadein-password-rules-view {\n    from {\n    opacity: 0;\n    }\n    to {\n    opacity: 1;\n    }\n}\n@-moz-keyframes fadein-password-rules-view {\n    from {\n    opacity: 0;\n    }\n    to {\n    opacity: 1;\n    }\n}\n@-ms-keyframes fadein-password-rules-view {\n    from {\n    opacity: 0;\n    }\n    to {\n    opacity: 1;\n    }\n}\n@-o-keyframes fadein-password-rules-view {\n    from {\n    opacity: 0;\n    }\n    to {\n    opacity: 1;\n    }\n}\n\n/* utility */\n.rounded {border-radius: 0.25rem; /* 4px */}\n.text-sm {\n    font-size: 0.875rem; \n    line-height: 1.25rem; \n}\n.text-base {\n    font-size: 1rem; \n    line-height: 1.5rem;\n}\n`;\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\n\nimport { html, LitElement, TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PasswordValidationResult, PasswordValidationResults } from '../../js/services/PasswordValidator';\nimport { styles } from './styles';\n\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/iron-icon/iron-icon';\n\n/**\n * Custom element for rendering password validation results of type `PasswordValidationResults`\n */\n@customElement(\"password-compliance-feedback-element\")\nexport class PasswordComplianceFeedbackElement extends LitElement {\n    static styles = styles\n\n    /**\n     * The results of the validation that should be rendered.\n     */\n    @property({type: Object}) validationResults: PasswordValidationResults|undefined = undefined;\n    /**\n     * The direction of the little arrow next to the element that points towards the form that is validated.\n     */\n    @property({type: String}) pointerDirection: \"left\"|\"right\" = \"left\";\n\n    // --------------------------------------------------------------------------------------\n    renderValidationResults(): TemplateResult {\n        if (!this.validationResults) return html``;\n        const renderListItem = (aResult: PasswordValidationResult) => html`\n            <li data-result data-rulename=\"${aResult.ruleName}\" data-pass=\"${aResult.pass}\">\n            ${PasswordComplianceFeedbackElement.getIcon(aResult.pass)}\n            <span class=\"text-base\">${aResult.message}</span>\n        </li>`;\n        return html`<div class=\"wrapper ${this.computePointerDirection()} rounded\"><ul>${this.validationResults?.results.map((aResult) => renderListItem(aResult))}</ul></div>`\n    }\n    // --------------------------------------------------------------------------------------\n    static getIcon(isPass: boolean) {\n        const iconName =  isPass ? \"done\" : \"clear\"\n        return html`<iron-icon .icon=\"${iconName}\"></iron-icon>`;\n    }\n    // --------------------------------------------------------------------------------------\n    private computePointerDirection() {\n        switch (this.pointerDirection) {\n            case \"left\":\n                return \"pointer-left\"\n            case \"right\":\n                return \"pointer-right\"\n        }\n    }\n    // --------------------------------------------------------------------------------------\n    render() {\n        return html`\n            ${this.renderValidationResults()}\n        `;\n    }\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\n// --------------------------------------------------------------------------------------\nexport interface PasswordValidator {\n    /**\n     * Validates the password against the set rules.\n     * @param password\n     */\n    validate(password: string): PasswordValidationResults;\n    /**\n     * Sets the old password to check the new one against, if a rule for checking the old password for non-identity exists.\n     * @param oldPassword\n     */\n    setOldPassword(oldPassword: string): void;\n    /**\n     * Sets the retyped password to check wheter it matches with the desired password, if such a rule exists.\n     * @param confirmationPassword\n     */\n    setConfirmationPassword(confirmationPassword: string): void;\n    /**\n     * Removes a rule from the provided rules, if the rule is found.\n     * @param ruleName\n     */\n    removeValidationRule(ruleName: string): PasswordValidationRule|null;\n    /**\n     * Adds a validation rule to the set of rules.\n     * @param key The name of the rule.\n     * @param rule The rule itself.\n     */\n    addValidationRule(key: string, rule: PasswordValidationRule): void;\n    /**\n     * Sets a verification code if there is a rule to check whether one should be entered.\n     * @param code\n     */\n    setVerificationCode(code: string): void;\n}\n// --------------------------------------------------------------------------------------\nexport type PasswordValidationResults = {\n    valid: boolean;\n    results: Array<PasswordValidationResult>;\n}\n// --------------------------------------------------------------------------------------\nexport type PasswordValidationResult = {\n    ruleName: string;\n    pass: boolean;\n    message: string;\n}\n// --------------------------------------------------------------------------------------\nexport type PasswordValidationRules = Record<string, PasswordValidationRule>;\n// --------------------------------------------------------------------------------------\nexport type PasswordValidationRule = {\n    title: string,\n    pattern: string\n}\n// --------------------------------------------------------------------------------------\nexport class BasicPasswordValidator implements PasswordValidator {\n    oldPassword: string | undefined;\n    verificationCode = \"\";\n    confirmationPassword: string | undefined;\n    validationRules: PasswordValidationRules;\n\n    constructor(validationRules: PasswordValidationRules) {\n        this.validationRules = validationRules;\n    }\n    // --------------------------------------------------------------------------------------\n    addValidationRule(key: string, rule: PasswordValidationRule): void {\n        this.validationRules[key] = rule;\n    }\n    // --------------------------------------------------------------------------------------\n    setVerificationCode(code: string): void {\n        this.verificationCode = code;\n    }\n    // --------------------------------------------------------------------------------------\n    removeValidationRule(ruleName: string): PasswordValidationRule|null {\n        const toBeRemovedRule = this.validationRules[ruleName];\n        if (!toBeRemovedRule) return null;\n        delete this.validationRules[ruleName];\n        return toBeRemovedRule\n    }\n    // --------------------------------------------------------------------------------------\n    setConfirmationPassword(confirmationPassword: string): void {\n        this.confirmationPassword = confirmationPassword;\n    }\n    // --------------------------------------------------------------------------------------\n    validate(password: string): PasswordValidationResults {\n        const results: Array<PasswordValidationResult> = [];\n\n        for (const [name, rule] of Object.entries(this.validationRules)) {\n            if (name === \"dontMatchOld\") {\n                results.push({ruleName: name, pass :(typeof this.oldPassword !== \"undefined\" && this.oldPassword !== \"\" && password !== this.oldPassword), message: rule.title})\n            } else if (name === \"matchConfirmationPassword\") {\n                results.push({ruleName: name, pass : password === this.confirmationPassword, message: rule.title})\n            } else if (name === \"enterValidationCode\") {\n                results.push({ruleName: name, pass : this.verificationCode.length > 0, message: rule.title})\n            }\n            else  {\n                results.push({ruleName: name, pass: password.match(rule.pattern) !== null, message: rule.title})\n            }\n        }\n\n        return {\n            valid: results.every((result) => result.pass === true),\n            results\n        }\n    }\n    // --------------------------------------------------------------------------------------\n    setOldPassword(oldPassword: string): void {\n        this.oldPassword = oldPassword;\n    }\n}\n\n/**\n * A basic factory for creating a password validator.\n * @param type\n * @param rules\n * @returns\n */\n// --------------------------------------------------------------------------------------\nexport const createValidator = (type: string, rules: PasswordValidationRules) => {\n    if (type === \"basic\")\n        return new BasicPasswordValidator(rules);\n    else throw new Error(\"No such type of validator: \"+type)\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport { html, LitElement, PropertyValues, TemplateResult } from 'lit';\nimport { customElement, property, state }                   from 'lit/decorators.js';\n\nimport '@polymer/paper-button/paper-button';\nimport '@polymer/paper-input/paper-input';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/iron-icon/iron-icon';\nimport { baseConfig }                                       from '../../auto-generated/config';\nimport type {\n  PaperInputElement,\n}                                                           from '@polymer/paper-input/paper-input';\nimport {\n  LdLoginStyles,\n}                                                           from '../../components/ld-login-application/styles';\nimport { storeLoginCredentials, requestUrlParams } from '../../js/LdGlobal';\nimport {\n  LdMessages,\n}                                                           from '../../components/ld-application/ld-messages/ld-error-messages';\nimport type { CognitoUserPool, CognitoUserSession }         from 'amazon-cognito-identity-js';\nimport { showToast }                                        from '../../js/LdNotificationHandler';\nimport {\n  BasicRouter, Router,\n}                                                           from '../../js/services/routingConfig';\nimport {\n  forceChangePasswordStatus,\n  formFieldPasswordVisibility,\n}                                                           from './change-password-view-types';\n\nimport '@polymer/paper-spinner/paper-spinner-lite';\nimport '../../components/password-compliance-feedback-element';\nimport {\n  createValidator,\n}                                                           from '../../js/services/PasswordValidator';\nimport {\n  PasswordComplianceFeedbackElement,\n}                                                           from '../../components/password-compliance-feedback-element/password-compliance-feedback-element';\nimport {\n  createAuthenticationDetails,\n  createUser,\n  createUserPool,\n}                                                           from '../../js/services/Authentication';\n\n\n@customElement('change-password-view')\nexport class ChangePasswordView extends LitElement {\n\n  @state() private _formFieldsInvalid: boolean                                                         = false;\n  @state() private _formChangePasswordButtonDisabled: boolean                                          = true;\n  @state() private _showChangePasswordForm: boolean                                                    = true;\n  @state() private _loading: boolean                                                                   = false;\n  @state({ hasChanged: () => true }) private _forceChangePasswordSuccess: forceChangePasswordStatus    = {\n    success: false,\n    message: '',\n  };\n  @state({ hasChanged: () => true }) private _forceChangePasswordError: forceChangePasswordStatus      = {\n    success: true,\n    message: '',\n  };\n  @state({ hasChanged: () => true }) private _formFieldPasswordVisibility: formFieldPasswordVisibility = {\n    newPassword: {\n      icon: 'visibility',\n      type: 'password',\n    },\n    newPasswordRetype: {\n      icon: 'visibility',\n      type: 'password',\n    },\n  };\n  @state() private _awsUserPool: CognitoUserPool                                                       = createUserPool(baseConfig.aws.cognito.userPool.userPoolIdLogin, baseConfig.aws.cognito.userPool.clientId);\n  @state() private router: Router                                                                      = new BasicRouter();\n  @property({ type: Boolean })\n  setNewPassword: boolean                                                                              = false;\n  @property() message: string | null                                                                   = null;\n  @property() username: string                                                                         = '';\n\n  static styles = LdLoginStyles;\n\n  // --------------------------------------------------------------------------------------\n  protected firstUpdated(_changedProperties: PropertyValues) {\n    super.firstUpdated(_changedProperties);\n\n    const urlParams = requestUrlParams(this);\n\n    if (urlParams.has('user')) {\n      this.username = decodeURI(<string>urlParams.get('user')).toLowerCase();\n    }\n\n    if (urlParams.has('msg')) {\n      this.message = urlParams.get('msg')!;\n    }\n\n    if (this.userIsUsingPasswordRecovery()) {\n      this.message = 'forgot_password_code_sent';\n    }\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n\n    let _messageSection: TemplateResult[] = [];\n    if (this.message != null && LdMessages[this.message] != null && LdMessages[this.message].message_type != 'SUCCESS') {\n\n      _messageSection.push(html`\n        <section data-test-locator='announcement' class='announcement message-announcement'>\n          ${LdMessages[this.message].message}\n        </section>`);\n    }\n\n    if (this._forceChangePasswordSuccess.success) {\n      this._showChangePasswordForm = false;\n      this.router.changeView(`/login`, { useSpinner: false });\n    }\n\n    if (!this._forceChangePasswordError.success) {\n      showToast('force_change_password_error');\n    }\n\n    const _changePasswordForm = [];\n\n    const _oldPasswordItem = this.userIsUsingPasswordRecovery() ? html`` : html`\n      <paper-input tab-index='1'\n                   name='oldPassword'\n                   id='oldPassword'\n                   label='old password'\n                   ?invalid='${this._formFieldsInvalid}'\n                   type='password'\n                   @keyup='${(e: KeyboardEvent) => this._onKeyUpValidateAsUserTypes(e)}'\n                   @input='${() => this.handleInputEvent()}'\n                   class='red'></paper-input>`;\n\n    const _usernameItem = this.userIsChangingInitialPassword() ? html`` : html`\n      <paper-input tab-index='1'\n                   name='swLoginUsername'\n                   id='verifyEmailUsernameField'\n                   type='email'\n                   label='E-Mail'\n                   value='${this.username.toLowerCase()}'\n                   auto-validate\n                   ?invalid='${this._formFieldsInvalid}'\n                   ?disabled='${this._showChangePasswordForm}'\n                   class='red'></paper-input>\n    `;\n\n    const _verificationCodeItem = this.userIsChangingInitialPassword() ? html`` : html`\n      <paper-input tab-index='4'\n                   name='verificationCode'\n                   id='verificationCode'\n                   label='Verification Code'\n                   ?invalid='${this._formFieldsInvalid}'\n                   type='text'\n                   @keyup='${(e: KeyboardEvent) => this._onKeyUpValidateAsUserTypes(e)}'\n                   @input='${() => this.handleInputEvent()}'\n                   class='red'></paper-input>`;\n\n    const _submitBtnLabel = this.userIsChangingInitialPassword() ? html`Change Password` : html`Set new Password`;\n\n    if (this._showChangePasswordForm) {\n      _changePasswordForm.push(html`\n        <form id='change-password-form'>\n\n          ${_oldPasswordItem}\n\n          ${_usernameItem}\n\n          <paper-input tab-index='2'\n                       name='newPassword'\n                       id='newPassword'\n                       label='new password'\n                       ?invalid='${this._formFieldsInvalid}'\n                       type='${this._formFieldPasswordVisibility.newPassword.type}'\n                       class='red'\n                       @keyup='${(e: KeyboardEvent) => this._onKeyUpValidateAsUserTypes(e)}'\n                       @input='${() => this.handleInputEvent()}'>\n            <iron-icon icon='help-outline' slot='suffix' @click='${this.validatePassword}'></iron-icon>\n            <iron-icon icon='${this._formFieldPasswordVisibility.newPassword.icon}' slot='suffix'\n                       @click='${() => this._onPasswordVisibilityIconClick('newPassword')}'></iron-icon>\n          </paper-input>\n\n          <paper-input tab-index='3'\n                       name='newPasswordRetype'\n                       id='newPasswordRetype'\n                       label='re-type new password'\n                       ?invalid='${this._formFieldsInvalid}'\n                       type='${this._formFieldPasswordVisibility.newPasswordRetype.type}'\n                       class='red'\n                       @keyup='${(e: KeyboardEvent) => this._onKeyUpValidateAsUserTypes(e)}'\n                       @input='${() => this.handleInputEvent()}'>\n            <iron-icon icon='${this._formFieldPasswordVisibility.newPasswordRetype.icon}' slot='suffix'\n                       @click='${() => this._onPasswordVisibilityIconClick('newPasswordRetype')}'></iron-icon>\n          </paper-input>\n\n          ${_verificationCodeItem}\n\n          <paper-button tab-index='5'\n                        id='changePasswordButton'\n                        ?disabled='${this._formChangePasswordButtonDisabled}'\n                        @click='${() => this._loading ? null : this._onChangePassword()}'\n                        raised>\n            ${this._loading ? html`\n              <paper-spinner-lite active></paper-spinner-lite>` : _submitBtnLabel}\n          </paper-button>\n\n          <password-compliance-feedback-element></password-compliance-feedback-element>\n        </form>`,\n      );\n    }\n\n    return html`\n      ${_messageSection}\n      ${_changePasswordForm}\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onPasswordVisibilityIconClick(clickedField: 'newPassword' | 'newPasswordRetype'): void {\n\n    const _savedFieldState: formFieldPasswordVisibility = this._formFieldPasswordVisibility;\n    const currentFieldState                             = this._formFieldPasswordVisibility[clickedField];\n\n    _savedFieldState[clickedField].icon = currentFieldState.icon === 'visibility' ? 'visibility-off' : 'visibility';\n    _savedFieldState[clickedField].type = currentFieldState.type === 'password' ? 'text' : 'password';\n\n    this._formFieldPasswordVisibility = _savedFieldState;\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onKeyUpValidateAsUserTypes(e: KeyboardEvent): void {\n\n    this.validatePassword();\n\n    if (e.key === 'Enter' && !this._formFieldsInvalid) {\n      this._onChangePassword();\n    }\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  handleInputEvent() {\n    this.validatePassword();\n  }\n\n  // --------------------------------------------------------------------------------------\n  validatePassword() {\n    const validator = createValidator('basic', baseConfig.passwordCriteria);\n\n    const _newPassword       = (<PaperInputElement>this.shadowRoot!.querySelector('#newPassword')).value;\n    const _newPasswordRetype = (<PaperInputElement>this.shadowRoot!.querySelector('#newPasswordRetype')).value;\n\n    if (this.userIsChangingInitialPassword()) {\n      const initialPassword = this.getPasswordFieldValue();\n      validator.setOldPassword(initialPassword);\n      validator.removeValidationRule('enterValidationCode');\n    } else if (this.userIsUsingPasswordRecovery()) {\n      validator.removeValidationRule('dontMatchOld');\n      const verificationCode = (<PaperInputElement>this.shadowRoot!.querySelector('#verificationCode')).value;\n      validator.setVerificationCode(verificationCode!);\n    }\n\n    validator.setConfirmationPassword(_newPasswordRetype!);\n    const validationResult = validator.validate(_newPassword!);\n    const feedbackElement  = this.shadowRoot?.querySelector('password-compliance-feedback-element') as PasswordComplianceFeedbackElement;\n    if (feedbackElement) {\n      feedbackElement.validationResults = validationResult;\n    }\n\n    if (validationResult.valid) {\n      this._formFieldsInvalid                = false;\n      this._formChangePasswordButtonDisabled = false;\n    } else {\n      this._formFieldsInvalid                = true;\n      this._formChangePasswordButtonDisabled = true;\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onChangePassword() {\n\n    const _userData = {\n      Username: this.username.toLowerCase(),\n      Pool: this._awsUserPool,\n    };\n\n    const _awsCognitoUser = createUser(_userData);\n\n    const _newPassword = (<PaperInputElement>this.shadowRoot!.querySelector('#newPassword')).value;\n    if (this.userIsUsingPasswordRecovery()) {\n\n      const _verificationCode = (<PaperInputElement>this.shadowRoot!.querySelector('#verificationCode')).value;\n      this._loading           = true;\n      _awsCognitoUser.confirmPassword(_verificationCode!, _newPassword!, {\n        onSuccess: (data) => {\n          this._loading = false;\n          this._onChangePasswordSuccess(data);\n        },\n        onFailure: (error) => {\n          this._loading = false;\n          this._onChangePasswordError(error);\n        },\n      });\n\n    } else {\n\n      const _oldPassword           = this.getPasswordFieldValue();\n      const _authenticationDetails = createAuthenticationDetails(this.username.toLowerCase(), _oldPassword);\n      this._loading                = true;\n\n      _awsCognitoUser.authenticateUser(_authenticationDetails, {\n        onSuccess: (result: CognitoUserSession) => {\n          this._loading = false;\n          storeLoginCredentials(result).then(() => {\n            this.router.changeView(baseConfig.defaultRedirectUrl, { useSpinner: false });\n          });\n        },\n        newPasswordRequired: (userAttributes) => {\n          delete userAttributes.email_verified;\n          delete userAttributes.email;\n\n          _awsCognitoUser.completeNewPasswordChallenge(_newPassword!, {}, {\n            onSuccess: (result) => {\n              this._loading = false;\n              this._onChangePasswordSuccess(result);\n            },\n            onFailure: (error) => {\n              this._loading = false;\n              this._onChangePasswordError(error);\n            },\n          });\n        },\n        onFailure: (err => {\n          this._loading = false;\n          this.dispatchEvent(new CustomEvent('event', {\n            bubbles: true,\n            composed: true,\n            detail: {\n              message: err.message,\n              code: err.code,\n              eventType: 'notification-requested',\n              duration: undefined,\n            },\n          }));\n        }),\n      });\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onChangePasswordSuccess(result?: CognitoUserSession | string): void {\n    this._showChangePasswordForm = false;\n    this.showSuccessMessage();\n    if (result != null) {\n      storeLoginCredentials(result).then(() => null);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected showSuccessMessage() {\n    this._forceChangePasswordSuccess       = {\n      success: true,\n      message: 'force_change_password_success',\n    };\n    this._forceChangePasswordError.success = true;\n\n    showToast('force_change_password_success');\n\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onChangePasswordError(error?: any): void {\n    this._forceChangePasswordError.success   = false;\n    this._forceChangePasswordSuccess.success = false;\n    this._forceChangePasswordError.message   = error ? error.toString() : '-';\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected userIsChangingInitialPassword() {\n    return this.setNewPassword === false;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected userIsUsingPasswordRecovery() {\n    return this.setNewPassword === true;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected getPasswordFieldValue() {\n    const value = (<PaperInputElement>this.shadowRoot!.querySelector('#oldPassword')).value;\n    return !value ? '' : value;\n  }\n\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport { html, LitElement } from 'lit';\nimport { customElement }    from 'lit/decorators.js';\n\nimport '../change-password/change-password-view';\nimport { LdLoginStyles }    from '../../components/ld-login-application/styles';\n\n\n@customElement('create-new-password-view')\nexport class CreateNewPasswordView extends LitElement {\n  static styles = LdLoginStyles;\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <change-password-view setNewPassword></change-password-view>\n\n    `;\n  }\n\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport { customElement, property, state }                   from 'lit/decorators.js';\nimport { html, LitElement, PropertyValues, TemplateResult } from 'lit';\nimport type { CognitoUserPool }                             from 'amazon-cognito-identity-js';\nimport { baseConfig }                                       from '../../auto-generated/config';\nimport {\n  PaperInputElement,\n}                                                           from '@polymer/paper-input/paper-input';\nimport {\n  LdLoginStyles,\n}                                                           from '../../components/ld-login-application/styles';\nimport { requestUrlParams, isValidEmailAddress }   from '../../js/LdGlobal';\nimport {\n  LdMessages,\n}                                                           from '../../components/ld-application/ld-messages/ld-error-messages';\n\nimport '@polymer/paper-spinner/paper-spinner-lite';\nimport { createUser, createUserPool }                       from '../../js/services/Authentication';\nimport { BasicRouter, Router }                              from '../../js/services/routingConfig';\n\n\n@customElement('forgot-password-view')\nexport class ForgotPasswordView extends LitElement {\n\n  @state() private _formFieldsInvalid: boolean   = false;\n  @state() private _loading: boolean             = false;\n  @state() private _awsUserPool: CognitoUserPool = createUserPool(baseConfig.aws.cognito.userPool.userPoolIdLogin, baseConfig.aws.cognito.userPool.clientId);\n  @state() private router: Router                = new BasicRouter();\n  @property() username: string                   = '';\n  @property() message: string | null             = null;\n\n  static styles = LdLoginStyles;\n\n  // --------------------------------------------------------------------------------------\n  protected firstUpdated(_changedProperties: PropertyValues) {\n    super.firstUpdated(_changedProperties);\n\n    const urlParams = requestUrlParams(this);\n\n    if (urlParams.has('msg')) {\n      this.message = urlParams.get('msg')!;\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    const _messageSection: TemplateResult[] = [];\n    if (this.message != null && LdMessages[this.message] != null && LdMessages[this.message].message_type != 'SUCCESS') {\n      _messageSection.push(html`\n        <section class='announcement message-announcement'>\n          ${LdMessages[this.message].message}\n        </section>`);\n    }\n\n    return html`\n\n      ${_messageSection}\n\n      <paper-input\n        tab-index='1'\n        name='swLoginUsername'\n        id='forgotPasswordUsernameField'\n        type='email'\n        label='E-Mail'\n        auto-validate\n        ?invalid='${this._formFieldsInvalid}'\n        @input='${(e: KeyboardEvent) => this.handleUsernameInput(e)}'\n        @keyup='${(e: KeyboardEvent) => this.handleUsernameInput(e)}'\n        class='red'></paper-input>\n\n      <paper-button tab-index='3' id='signInButton'\n                    @click='${() => this._loading ? null : this._onForgotPasswordBtnClick()}'\n                    disabled raised>\n        ${this._loading ? html`\n          <paper-spinner-lite active></paper-spinner-lite>` : html`Forgot Password`}\n      </paper-button>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private handleUsernameInput(e: KeyboardEvent) {\n\n    if (e.key === 'Enter' && !this._formFieldsInvalid) {\n      this._onForgotPasswordBtnClick();\n    }\n    const usernameField = this.getUsernameField();\n    if (!usernameField) {\n      return;\n    }\n    if (this.hasEmailAddress()) {\n      this.getSigninButton().removeAttribute('disabled');\n    } else {\n      this.getSigninButton().setAttribute('disabled', 'disabled');\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private hasEmailAddress() {\n    const usernameField = this.getUsernameField();\n    if (!usernameField) {\n      return false;\n    }\n    const emailAddress = usernameField.value.toLowerCase();\n    const value        = emailAddress && isValidEmailAddress(emailAddress) ? emailAddress : '';\n    return value.length > 0;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getUsernameField() {\n    return this.shadowRoot?.querySelector('#forgotPasswordUsernameField') as HTMLInputElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getSigninButton() {\n    return this.shadowRoot?.querySelector('#signInButton') as HTMLInputElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onForgotPasswordBtnClick() {\n    const _usernameField = <PaperInputElement>this.shadowRoot!.querySelector('#forgotPasswordUsernameField');\n    this.username        = _usernameField.value!.toLowerCase();\n\n    const _userData = {\n      Username: this.username,\n      Pool: this._awsUserPool,\n    };\n\n    this._loading = true;\n\n    const _awsCognitoUser = createUser(_userData);\n    _awsCognitoUser.forgotPassword({\n      onSuccess: () => {\n        this._loading = false;\n        this.router.changeView(`/new-password?wc-ce&wc-shadydom&wc-shimcssproperties&user=${encodeURIComponent(<string>this.username).toLowerCase()}`, { useSpinner: false });\n      },\n      onFailure: (error) => {\n        this._loading = false;\n        this.dispatchEvent(new CustomEvent('event', {\n          bubbles: true,\n          composed: true,\n          detail: {\n            message: error.message,\n            eventType: 'notification-requested',\n            duration: undefined,\n          },\n        }));\n        console.error(error);\n      },\n    });\n\n    return this;\n\n  }\n\n}\n","/**\n * Copyright (c) 2023 Schwäbische Werkzeugmaschinen GmbH\n *\n * @author Max Zelger\n */\nimport {customElement, state} from 'lit/decorators.js';\nimport {html, LitElement} from 'lit';\nimport {baseConfig} from '../../auto-generated/config';\nimport {PaperInputElement} from '@polymer/paper-input/paper-input';\nimport type {CognitoUserPool, CognitoUserSession} from 'amazon-cognito-identity-js';\nimport {LdMessages,} from '../../components/ld-application/ld-messages/ld-error-messages';\nimport {LdLoginStyles} from '../../components/ld-login-application/styles';\nimport {isValidEmailAddress, requestUrlParams, storeLoginCredentials,} from '../../js/LdGlobal';\n\nimport '@polymer/paper-spinner/paper-spinner-lite';\nimport {createAuthenticationDetails, createUser, createUserPool} from '../../js/services/Authentication';\nimport {BasicRouter, Router} from '../../js/services/routingConfig';\n\n\n@customElement('login-view')\nexport class LoginView extends LitElement {\n\n  @state() private _username: string | null | undefined = null;\n  @state() private _password: string | null | undefined = null;\n  @state() private _formFieldsInvalid: boolean          = false;\n  @state() private _loading: boolean                    = false;\n  @state() private _awsUserPool: CognitoUserPool        = createUserPool(baseConfig.aws.cognito.userPool.userPoolIdLogin, baseConfig.aws.cognito.userPool.clientId);\n  @state() private router: Router                       = new BasicRouter();\n\n  static styles = LdLoginStyles;\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <form>\n\n        <paper-input @keydown='${(e: KeyboardEvent) => this._onInputKeyDown(e)}'\n                     tab-index='1'\n                     name='swLoginUsername'\n                     id='signInUserInput'\n                     label='E-Mail'\n                     ?invalid='${this._formFieldsInvalid}'\n                     .value='${this._username}'\n                     @input='${() => this.handleUsernameInput()}'\n                     @keyup='${() => this.handleUsernameInput()}'\n                     class='red'></paper-input>\n        <paper-input @keydown='${(e: KeyboardEvent) => this._onInputKeyDown(e)}'\n                     tab-index='2'\n                     name='swLoginPassword'\n                     id='signInPasswordInput'\n                     label='Password'\n                     ?invalid='${this._formFieldsInvalid}'\n                     .value='${this._password}'\n                     @input='${() => this.handleUsernameInput()}'\n                     @change='${() => this.handleUsernameInput()}'\n                     type='password'\n                     class='red'></paper-input>\n\n        <div class='passwordForgot' @click='${() => this.router.changeView('/forgot-password?wc-ce&wc-shadydom&wc-shimcssproperties',{ useSpinner: false })}'>Forgot Password?</div>\n        <paper-button tab-index='3' id='signInButton'\n                      @click='${() => this._loading ? null : this._onSignInButtonClick()}'\n                      disabled raised>\n          ${this._loading ? html`\n            <paper-spinner-lite class=\"ld-loading-spinner\" active></paper-spinner-lite>` : html`Sign In`}\n        </paper-button>\n      </form>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private handleUsernameInput() {\n    setTimeout(() => {\n      const usernameField = this.getUsernameField();\n      const passwordField = this.getPasswordField();\n      if (!usernameField || !passwordField) {\n        return;\n      }\n      if (this.hasEmailAddress() && this.hasPassword()) {\n        this.getSigninButton().removeAttribute('disabled');\n      } else {\n        this.getSigninButton().setAttribute('disabled', 'disabled');\n      }\n    }, 100);\n  }\n\n  // --------------------------------------------------------------------------------------\n  private hasEmailAddress() {\n    const usernameField = this.getUsernameField();\n    if (!usernameField) {\n      return false;\n    }\n    const value = usernameField.value && isValidEmailAddress(usernameField.value) ? (usernameField.value) : '';\n    return value.length > 0;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private hasPassword() {\n    const passwordField = this.getPasswordField();\n    if (!passwordField) {\n      return false;\n    }\n    const value = passwordField.value ? passwordField.value : '';\n    return value.length > 0;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getUsernameField() {\n    return this.shadowRoot?.querySelector('#signInUserInput') as HTMLInputElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  private getPasswordField() {\n    return this.shadowRoot?.querySelector('#signInPasswordInput') as HTMLInputElement;\n  }\n\n  private getSigninButton() {\n    return this.shadowRoot?.querySelector('#signInButton') as HTMLInputElement;\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onInputKeyDown(e: KeyboardEvent) {\n    if (e.key === 'Enter') {\n      this._onSignInButtonClick();\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  protected _onSignInButtonClick(): boolean {\n\n    this._username = (<PaperInputElement>this.shadowRoot!.querySelector('#signInUserInput')).value?.toLowerCase();\n    this._password = (<PaperInputElement>this.shadowRoot!.querySelector('#signInPasswordInput')).value;\n\n    if (this._username == null || this._username.trim() === '' || this._password == null || this._password.trim() === '') {\n      this._handleError('no_credentials');\n      return false;\n    }\n    this._loading = true;\n\n    const _authenticationDetails = createAuthenticationDetails(this._username, this._password);\n\n    const _userData = {\n      Username: this._username,\n      Pool: this._awsUserPool,\n    };\n\n    const _awsCognitoUser = createUser(_userData);\n    _awsCognitoUser.authenticateUser(_authenticationDetails, {\n      onSuccess: (result: CognitoUserSession) => {\n        this._loading = false;\n        storeLoginCredentials(result).then(() => {\n          const defaultTarget = baseConfig.defaultRedirectUrl;\n          const urlParams     = requestUrlParams(this);\n          const target        = this.getRedirectTarget(defaultTarget, urlParams);\n          this.router.changeView(target, { useSpinner: false });\n        });\n\n      },\n      newPasswordRequired: () => {\n        this._loading = false;\n        this.router.changeView(`/change-password?user=${encodeURIComponent(<string>this._username).toLowerCase()}&msg=change_pw_required&wc-ce&wc-shadydom&wc-shimcssproperties`, { useSpinner: false });\n      },\n      onFailure: (err => {\n        this._loading = false;\n        let _message;\n        switch (err.code) {\n          case 'UserNotConfirmedException':\n            _message = 'UserNotConfirmedException';\n            break;\n          case 'NotAuthorizedException':\n          default:\n            _message = 'wrong_credentials';\n            break;\n        }\n        this._handleError(_message);\n      }),\n    });\n    return true;\n  }\n\n  private getRedirectTarget(defaultTarget: string, urlParams: Map<string, string>): string {\n    let target = defaultTarget + '?loggedIn';\n    if (urlParams?.has('redirect')) {\n      target = urlParams.get('redirect') + '?loggedIn'!;\n    }\n    return target;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _handleError(message: string): void {\n    if (message === null || typeof LdMessages[message] === 'undefined' || LdMessages[message] === null) {\n      throw new Error('An unknown error occured: ' + message);\n    }\n    const _error = LdMessages[message];\n\n    this.dispatchEvent(new CustomEvent('event', {\n      bubbles: true,\n      composed: true,\n      detail: {\n        message: message,\n        eventType: 'notification-requested',\n      },\n    }));\n\n    if (_error.highlight_input) {\n      this._formFieldsInvalid = true;\n    }\n  }\n\n}\n","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, _typeof(o);\n}\nexport { _typeof as default };","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\nimport { DisabledMixin } from '@vaadin/component-base/src/disabled-mixin.js';\nimport { isElementFocused } from '@vaadin/component-base/src/focus-utils.js';\nimport { DelegateStateMixin } from './delegate-state-mixin.js';\nimport { InputMixin } from './input-mixin.js';\n\n/**\n * A mixin to manage the checked state.\n *\n * @polymerMixin\n * @mixes DelegateStateMixin\n * @mixes DisabledMixin\n * @mixes InputMixin\n */\nexport const CheckedMixin = dedupingMixin(\n  (superclass) =>\n    class CheckedMixinClass extends DelegateStateMixin(DisabledMixin(InputMixin(superclass))) {\n      static get properties() {\n        return {\n          /**\n           * True if the element is checked.\n           * @type {boolean}\n           */\n          checked: {\n            type: Boolean,\n            value: false,\n            notify: true,\n            reflectToAttribute: true,\n          },\n        };\n      }\n\n      static get delegateProps() {\n        return [...super.delegateProps, 'checked'];\n      }\n\n      /**\n       * @param {Event} event\n       * @protected\n       * @override\n       */\n      _onChange(event) {\n        const input = event.target;\n\n        this._toggleChecked(input.checked);\n\n        // Clicking the checkbox or radio-button in Safari\n        // does not make it focused, so we do it manually.\n        if (!isElementFocused(input)) {\n          input.focus();\n        }\n      }\n\n      /** @protected */\n      _toggleChecked(checked) {\n        this.checked = checked;\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * A controller to copy the content from a source slot to a target element.\n */\nexport class SlotTargetController {\n  constructor(sourceSlot, targetFactory, callback) {\n    /**\n     * The source `<slot>` element to copy nodes from.\n     */\n    this.sourceSlot = sourceSlot;\n\n    /**\n     * Function used to get a reference to slot target.\n     */\n    this.targetFactory = targetFactory;\n\n    /**\n     * Function called after copying nodes to target.\n     */\n    this.copyCallback = callback;\n\n    if (sourceSlot) {\n      sourceSlot.addEventListener('slotchange', () => {\n        // Copy in progress, ignore this event.\n        if (this.__copying) {\n          this.__copying = false;\n        } else {\n          this.__checkAndCopyNodesToSlotTarget();\n        }\n      });\n    }\n  }\n\n  hostConnected() {\n    this.__sourceSlotObserver = new MutationObserver(() => this.__checkAndCopyNodesToSlotTarget());\n\n    // Ensure the content is up to date when host is connected\n    // to handle e.g. mutating text content while disconnected.\n    // Note, `hostConnected()` is called twice if the controller\n    // is initialized in `ready()` when using `ControllerMixin`.\n    if (!this.__copying) {\n      this.__checkAndCopyNodesToSlotTarget();\n    }\n  }\n\n  /**\n   * Copies every node from the source slot to the target element\n   * once the source slot' content is changed.\n   *\n   * @private\n   */\n  __checkAndCopyNodesToSlotTarget() {\n    this.__sourceSlotObserver.disconnect();\n\n    // Ensure slot target element is up to date.\n    const slotTarget = this.targetFactory();\n\n    if (!slotTarget) {\n      return;\n    }\n\n    // Remove any existing clones from the slot target\n    if (this.__slotTargetClones) {\n      this.__slotTargetClones.forEach((node) => {\n        if (node.parentElement === slotTarget) {\n          slotTarget.removeChild(node);\n        }\n      });\n      delete this.__slotTargetClones;\n    }\n\n    // Exclude whitespace text nodes\n    const nodes = this.sourceSlot\n      .assignedNodes({ flatten: true })\n      .filter((node) => !(node.nodeType === Node.TEXT_NODE && node.textContent.trim() === ''));\n\n    if (nodes.length > 0) {\n      slotTarget.innerHTML = '';\n\n      // Ignore next slotchange\n      this.__copying = true;\n\n      this.__copyNodesToSlotTarget(nodes, slotTarget);\n    }\n  }\n\n  /**\n   * Copies the nodes to the target element.\n   *\n   * @param {!Array<!Node>} nodes\n   * @param {HTMLElement} slotTarget\n   * @private\n   */\n  __copyNodesToSlotTarget(nodes, slotTarget) {\n    this.__slotTargetClones = this.__slotTargetClones || [];\n\n    nodes.forEach((node) => {\n      // Clone the nodes and append the clones to the target\n      const clone = node.cloneNode(true);\n      this.__slotTargetClones.push(clone);\n\n      slotTarget.appendChild(clone);\n\n      // Observe all changes to the source node to have the clones updated\n      this.__sourceSlotObserver.observe(node, {\n        attributes: true,\n        childList: true,\n        subtree: true,\n        characterData: true,\n      });\n    });\n\n    // Run callback e.g. to show a deprecation warning\n    if (typeof this.copyCallback === 'function') {\n      this.copyCallback(nodes);\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { ActiveMixin } from '@vaadin/component-base/src/active-mixin.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';\nimport { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';\nimport { CheckedMixin } from '@vaadin/field-base/src/checked-mixin.js';\nimport { DelegateFocusMixin } from '@vaadin/field-base/src/delegate-focus-mixin.js';\nimport { InputController } from '@vaadin/field-base/src/input-controller.js';\nimport { LabelMixin } from '@vaadin/field-base/src/label-mixin.js';\nimport { LabelledInputController } from '@vaadin/field-base/src/labelled-input-controller.js';\nimport { SlotTargetController } from '@vaadin/field-base/src/slot-target-controller.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\n/**\n * `<vaadin-checkbox>` is an input field representing a binary choice.\n *\n * ```html\n * <vaadin-checkbox label=\"I accept the terms and conditions\"></vaadin-checkbox>\n * ```\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name   | Description\n * ------------|----------------\n * `checkbox`  | The wrapper element that contains slotted <input type=\"checkbox\">.\n *\n * The following state attributes are available for styling:\n *\n * Attribute       | Description | Part name\n * ----------------|-------------|--------------\n * `active`        | Set when the checkbox is pressed down, either with mouse, touch or the keyboard. | `:host`\n * `disabled`      | Set when the checkbox is disabled. | `:host`\n * `focus-ring`    | Set when the checkbox is focused using the keyboard. | `:host`\n * `focused`       | Set when the checkbox is focused. | `:host`\n * `indeterminate` | Set when the checkbox is in the indeterminate state. | `:host`\n * `checked`       | Set when the checkbox is checked. | `:host`\n * `has-label`     | Set when the checkbox has a label. | `:host`\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @fires {CustomEvent} checked-changed - Fired when the `checked` property changes.\n * @fires {CustomEvent} indeterminate-changed - Fired when the `indeterminate` property changes.\n *\n * @extends HTMLElement\n * @mixes ControllerMixin\n * @mixes ThemableMixin\n * @mixes ElementMixin\n * @mixes ActiveMixin\n * @mixes DelegateFocusMixin\n * @mixes CheckedMixin\n * @mixes LabelMixin\n */\nclass Checkbox extends LabelMixin(\n  CheckedMixin(DelegateFocusMixin(ActiveMixin(ElementMixin(ThemableMixin(ControllerMixin(PolymerElement)))))),\n) {\n  static get is() {\n    return 'vaadin-checkbox';\n  }\n\n  static get template() {\n    return html`\n      <style>\n        :host {\n          display: inline-block;\n        }\n\n        :host([hidden]) {\n          display: none !important;\n        }\n\n        :host([disabled]) {\n          -webkit-tap-highlight-color: transparent;\n        }\n\n        .vaadin-checkbox-container {\n          display: grid;\n          grid-template-columns: auto 1fr;\n          align-items: baseline;\n        }\n\n        [part='checkbox'],\n        ::slotted(input),\n        ::slotted(label) {\n          grid-row: 1;\n        }\n\n        [part='checkbox'],\n        ::slotted(input) {\n          grid-column: 1;\n        }\n\n        [part='checkbox'] {\n          width: var(--vaadin-checkbox-size, 1em);\n          height: var(--vaadin-checkbox-size, 1em);\n        }\n\n        [part='checkbox']::before {\n          display: block;\n          content: '\\\\202F';\n          line-height: var(--vaadin-checkbox-size, 1em);\n          contain: paint;\n        }\n\n        /* visually hidden */\n        ::slotted(input) {\n          opacity: 0;\n          cursor: inherit;\n          margin: 0;\n          align-self: stretch;\n          -webkit-appearance: none;\n          width: initial;\n          height: initial;\n        }\n      </style>\n      <div class=\"vaadin-checkbox-container\">\n        <div part=\"checkbox\"></div>\n        <slot name=\"input\"></slot>\n        <slot name=\"label\"></slot>\n\n        <div style=\"display: none !important\">\n          <slot id=\"noop\"></slot>\n        </div>\n      </div>\n      <slot name=\"tooltip\"></slot>\n    `;\n  }\n\n  static get properties() {\n    return {\n      /**\n       * True if the checkbox is in the indeterminate state which means\n       * it is not possible to say whether it is checked or unchecked.\n       * The state is reset once the user switches the checkbox by hand.\n       *\n       * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#Indeterminate_state_checkboxes\n       *\n       * @type {boolean}\n       */\n      indeterminate: {\n        type: Boolean,\n        notify: true,\n        value: false,\n        reflectToAttribute: true,\n      },\n\n      /**\n       * The name of the checkbox.\n       *\n       * @type {string}\n       */\n      name: {\n        type: String,\n        value: '',\n      },\n    };\n  }\n\n  /** @override */\n  static get delegateProps() {\n    return [...super.delegateProps, 'indeterminate'];\n  }\n\n  /** @override */\n  static get delegateAttrs() {\n    return [...super.delegateAttrs, 'name'];\n  }\n\n  constructor() {\n    super();\n\n    this._setType('checkbox');\n\n    // Set the string \"on\" as the default value for the checkbox following the HTML specification:\n    // https://html.spec.whatwg.org/multipage/input.html#dom-input-value-default-on\n    this.value = 'on';\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.addController(\n      new InputController(this, (input) => {\n        this._setInputElement(input);\n        this._setFocusElement(input);\n        this.stateTarget = input;\n        this.ariaTarget = input;\n      }),\n    );\n    this.addController(new LabelledInputController(this.inputElement, this._labelController));\n    this.addController(\n      new SlotTargetController(\n        this.$.noop,\n        () => this._labelController.node,\n        () => this.__warnDeprecated(),\n      ),\n    );\n    this._tooltipController = new TooltipController(this);\n    this.addController(this._tooltipController);\n  }\n\n  /** @private */\n  __warnDeprecated() {\n    console.warn(\n      `WARNING: Since Vaadin 22, placing the label as a direct child of a <vaadin-checkbox> is deprecated.\nPlease use <label slot=\"label\"> wrapper or the label property instead.`,\n    );\n  }\n\n  /**\n   * Extends the method from `ActiveMixin` in order to\n   * prevent setting the `active` attribute when interacting with a link inside the label.\n   *\n   * @param {Event} event\n   * @return {boolean}\n   * @protected\n   * @override\n   */\n  _shouldSetActive(event) {\n    if (event.target.localName === 'a') {\n      return false;\n    }\n\n    return super._shouldSetActive(event);\n  }\n\n  /**\n   * Extends the method from `CheckedMixin` in order to\n   * reset the indeterminate state once the user switches the checkbox.\n   *\n   * @param {boolean} checked\n   * @protected\n   * @override\n   */\n  _toggleChecked(checked) {\n    if (this.indeterminate) {\n      this.indeterminate = false;\n    }\n\n    super._toggleChecked(checked);\n  }\n}\n\ncustomElements.define(Checkbox.is, Checkbox);\n\nexport { Checkbox };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/font-icons.js';\nimport '@vaadin/vaadin-lumo-styles/sizing.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/typography.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-checkbox',\n  css`\n    :host {\n      color: var(--lumo-body-text-color);\n      font-size: var(--lumo-font-size-m);\n      font-family: var(--lumo-font-family);\n      line-height: var(--lumo-line-height-s);\n      -webkit-font-smoothing: antialiased;\n      -moz-osx-font-smoothing: grayscale;\n      -webkit-tap-highlight-color: transparent;\n      -webkit-user-select: none;\n      -moz-user-select: none;\n      user-select: none;\n      cursor: default;\n      outline: none;\n      --_checkbox-size: var(--vaadin-checkbox-size, calc(var(--lumo-size-m) / 2));\n    }\n\n    :host([has-label]) ::slotted(label) {\n      padding-block: var(--lumo-space-xs);\n      padding-inline: var(--lumo-space-xs) var(--lumo-space-s);\n    }\n\n    [part='checkbox'] {\n      width: var(--_checkbox-size);\n      height: var(--_checkbox-size);\n      margin: var(--lumo-space-xs);\n      position: relative;\n      border-radius: var(--lumo-border-radius-s);\n      background-color: var(--lumo-contrast-20pct);\n      transition: transform 0.2s cubic-bezier(0.12, 0.32, 0.54, 2), background-color 0.15s;\n      cursor: var(--lumo-clickable-cursor);\n    }\n\n    :host([indeterminate]) [part='checkbox'],\n    :host([checked]) [part='checkbox'] {\n      background-color: var(--lumo-primary-color);\n    }\n\n    /* Checkmark */\n    [part='checkbox']::after {\n      pointer-events: none;\n      font-family: 'lumo-icons';\n      content: var(--lumo-icons-checkmark);\n      color: var(--lumo-primary-contrast-color);\n      font-size: calc(var(--_checkbox-size) + 2px);\n      line-height: 1;\n      position: absolute;\n      top: -1px;\n      left: -1px;\n      contain: content;\n      opacity: 0;\n    }\n\n    :host([checked]) [part='checkbox']::after {\n      opacity: 1;\n    }\n\n    /* Indeterminate checkmark */\n    :host([indeterminate]) [part='checkbox']::after {\n      content: '';\n      opacity: 1;\n      top: 45%;\n      height: 10%;\n      left: 22%;\n      right: 22%;\n      width: auto;\n      border: 0;\n      background-color: var(--lumo-primary-contrast-color);\n    }\n\n    /* Focus ring */\n    :host([focus-ring]) [part='checkbox'] {\n      box-shadow: 0 0 0 1px var(--lumo-base-color), 0 0 0 3px var(--lumo-primary-color-50pct);\n    }\n\n    /* Disabled */\n    :host([disabled]) {\n      pointer-events: none;\n      color: var(--lumo-disabled-text-color);\n    }\n\n    :host([disabled]) ::slotted(label) {\n      color: inherit;\n    }\n\n    :host([disabled]) [part='checkbox'] {\n      background-color: var(--lumo-contrast-10pct);\n    }\n\n    :host([disabled]) [part='checkbox']::after {\n      color: var(--lumo-contrast-30pct);\n    }\n\n    :host([indeterminate][disabled]) [part='checkbox']::after {\n      background-color: var(--lumo-contrast-30pct);\n    }\n\n    /* RTL specific styles */\n    :host([dir='rtl'][has-label]) ::slotted(label) {\n      padding: var(--lumo-space-xs) var(--lumo-space-xs) var(--lumo-space-xs) var(--lumo-space-s);\n    }\n\n    /* Used for activation \"halo\" */\n    [part='checkbox']::before {\n      pointer-events: none;\n      color: transparent;\n      width: 100%;\n      height: 100%;\n      line-height: var(--_checkbox-size);\n      border-radius: inherit;\n      background-color: inherit;\n      transform: scale(1.4);\n      opacity: 0;\n      transition: transform 0.1s, opacity 0.8s;\n    }\n\n    /* Hover */\n    :host(:not([checked]):not([indeterminate]):not([disabled]):hover) [part='checkbox'] {\n      background-color: var(--lumo-contrast-30pct);\n    }\n\n    /* Disable hover for touch devices */\n    @media (pointer: coarse) {\n      :host(:not([checked]):not([indeterminate]):not([disabled]):hover) [part='checkbox'] {\n        background-color: var(--lumo-contrast-20pct);\n      }\n    }\n\n    /* Active */\n    :host([active]) [part='checkbox'] {\n      transform: scale(0.9);\n      transition-duration: 0.05s;\n    }\n\n    :host([active][checked]) [part='checkbox'] {\n      transform: scale(1.1);\n    }\n\n    :host([active]:not([checked])) [part='checkbox']::before {\n      transition-duration: 0.01s, 0.01s;\n      transform: scale(0);\n      opacity: 0.4;\n    }\n  `,\n  { moduleId: 'lumo-checkbox' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { DisabledMixin } from './disabled-mixin.js';\nimport { addListener } from './gestures.js';\nimport { KeyboardMixin } from './keyboard-mixin.js';\n\n/**\n * A mixin to toggle the `active` attribute.\n *\n * The attribute is set whenever the user activates the element by a pointer\n * or presses an activation key on the element from the keyboard.\n *\n * The attribute is removed as soon as the element is deactivated\n * by the pointer or by releasing the activation key.\n *\n * @polymerMixin\n */\nexport const ActiveMixin = (superclass) =>\n  class ActiveMixinClass extends DisabledMixin(KeyboardMixin(superclass)) {\n    /**\n     * An array of activation keys.\n     *\n     * See possible values here:\n     * https://developer.mozilla.org/ru/docs/Web/API/KeyboardEvent/key/Key_Values\n     *\n     * @protected\n     * @return {!Array<!string>}\n     */\n    get _activeKeys() {\n      return [' '];\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      addListener(this, 'down', (event) => {\n        if (this._shouldSetActive(event)) {\n          this._setActive(true);\n        }\n      });\n\n      addListener(this, 'up', () => {\n        this._setActive(false);\n      });\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n\n      // When the element is disconnecting from the DOM at the moment being active,\n      // the `active` attribute needs to be manually removed from the element.\n      // Otherwise, it will preserve on the element until the element is activated once again.\n      // The case reproduces for `<vaadin-date-picker>` when closing on `Cancel` or `Today` click.\n      this._setActive(false);\n    }\n\n    /**\n     * @param {KeyboardEvent | MouseEvent} _event\n     * @protected\n     */\n    _shouldSetActive(_event) {\n      return !this.disabled;\n    }\n\n    /**\n     * Sets the `active` attribute on the element if an activation key is pressed.\n     *\n     * @param {KeyboardEvent} event\n     * @protected\n     * @override\n     */\n    _onKeyDown(event) {\n      super._onKeyDown(event);\n\n      if (this._shouldSetActive(event) && this._activeKeys.includes(event.key)) {\n        this._setActive(true);\n\n        // Element can become hidden before the `keyup` event, e.g. on button click.\n        // Use document listener to ensure `active` attribute is removed correctly.\n        document.addEventListener(\n          'keyup',\n          (e) => {\n            if (this._activeKeys.includes(e.key)) {\n              this._setActive(false);\n            }\n          },\n          { once: true },\n        );\n      }\n    }\n\n    /**\n     * Toggles the `active` attribute on the element.\n     *\n     * @param {boolean} active\n     * @protected\n     */\n    _setActive(active) {\n      this.toggleAttribute('active', active);\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @fileoverview\n *\n * This module provides a number of strategies for enqueuing asynchronous\n * tasks. Each sub-module provides a standard `run(fn)` interface that returns a\n * handle, and a `cancel(handle)` interface for canceling async tasks before\n * they run.\n *\n * @summary Module that provides a number of strategies for enqueuing\n * asynchronous tasks.\n */\n\n// Microtask implemented using Mutation Observer\nlet microtaskCurrHandle = 0;\nlet microtaskLastHandle = 0;\nconst microtaskCallbacks = [];\nlet microtaskNodeContent = 0;\nlet microtaskScheduled = false;\nconst microtaskNode = document.createTextNode('');\nnew window.MutationObserver(microtaskFlush).observe(microtaskNode, { characterData: true });\n\nfunction microtaskFlush() {\n  microtaskScheduled = false;\n  const len = microtaskCallbacks.length;\n  for (let i = 0; i < len; i++) {\n    const cb = microtaskCallbacks[i];\n    if (cb) {\n      try {\n        cb();\n      } catch (e) {\n        setTimeout(() => {\n          throw e;\n        });\n      }\n    }\n  }\n  microtaskCallbacks.splice(0, len);\n  microtaskLastHandle += len;\n}\n\n/**\n * Async interface wrapper around `setTimeout`.\n *\n * @namespace\n * @summary Async interface wrapper around `setTimeout`.\n */\nconst timeOut = {\n  /**\n   * Returns a sub-module with the async interface providing the provided\n   * delay.\n   *\n   * @memberof timeOut\n   * @param {number=} delay Time to wait before calling callbacks in ms\n   * @return {!AsyncInterface} An async timeout interface\n   */\n  after(delay) {\n    return {\n      run(fn) {\n        return window.setTimeout(fn, delay);\n      },\n      cancel(handle) {\n        window.clearTimeout(handle);\n      },\n    };\n  },\n  /**\n   * Enqueues a function called in the next task.\n   *\n   * @memberof timeOut\n   * @param {!Function} fn Callback to run\n   * @param {number=} delay Delay in milliseconds\n   * @return {number} Handle used for canceling task\n   */\n  run(fn, delay) {\n    return window.setTimeout(fn, delay);\n  },\n  /**\n   * Cancels a previously enqueued `timeOut` callback.\n   *\n   * @memberof timeOut\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    window.clearTimeout(handle);\n  },\n};\nexport { timeOut };\n\n/**\n * Async interface wrapper around `requestAnimationFrame`.\n *\n * @namespace\n * @summary Async interface wrapper around `requestAnimationFrame`.\n */\nconst animationFrame = {\n  /**\n   * Enqueues a function called at `requestAnimationFrame` timing.\n   *\n   * @memberof animationFrame\n   * @param {function(number):void} fn Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(fn) {\n    return window.requestAnimationFrame(fn);\n  },\n  /**\n   * Cancels a previously enqueued `animationFrame` callback.\n   *\n   * @memberof animationFrame\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    window.cancelAnimationFrame(handle);\n  },\n};\nexport { animationFrame };\n\n/**\n * Async interface wrapper around `requestIdleCallback`.  Falls back to\n * `setTimeout` on browsers that do not support `requestIdleCallback`.\n *\n * @namespace\n * @summary Async interface wrapper around `requestIdleCallback`.\n */\nconst idlePeriod = {\n  /**\n   * Enqueues a function called at `requestIdleCallback` timing.\n   *\n   * @memberof idlePeriod\n   * @param {function(!IdleDeadline):void} fn Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(fn) {\n    return window.requestIdleCallback ? window.requestIdleCallback(fn) : window.setTimeout(fn, 16);\n  },\n  /**\n   * Cancels a previously enqueued `idlePeriod` callback.\n   *\n   * @memberof idlePeriod\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    if (window.cancelIdleCallback) {\n      window.cancelIdleCallback(handle);\n    } else {\n      window.clearTimeout(handle);\n    }\n  },\n};\nexport { idlePeriod };\n\n/**\n * Async interface for enqueuing callbacks that run at microtask timing.\n *\n * Note that microtask timing is achieved via a single `MutationObserver`,\n * and thus callbacks enqueued with this API will all run in a single\n * batch, and not interleaved with other microtasks such as promises.\n * Promises are avoided as an implementation choice for the time being\n * due to Safari bugs that cause Promises to lack microtask guarantees.\n *\n * @namespace\n * @summary Async interface for enqueuing callbacks that run at microtask\n *   timing.\n */\nconst microTask = {\n  /**\n   * Enqueues a function called at microtask timing.\n   *\n   * @memberof microTask\n   * @param {!Function=} callback Callback to run\n   * @return {number} Handle used for canceling task\n   */\n  run(callback) {\n    if (!microtaskScheduled) {\n      microtaskScheduled = true;\n      microtaskNode.textContent = microtaskNodeContent;\n      microtaskNodeContent += 1;\n    }\n    microtaskCallbacks.push(callback);\n    const result = microtaskCurrHandle;\n    microtaskCurrHandle += 1;\n    return result;\n  },\n\n  /**\n   * Cancels a previously enqueued `microTask` callback.\n   *\n   * @memberof microTask\n   * @param {number} handle Handle returned from `run` of callback to cancel\n   * @return {void}\n   */\n  cancel(handle) {\n    const idx = handle - microtaskLastHandle;\n    if (idx >= 0) {\n      if (!microtaskCallbacks[idx]) {\n        throw new Error(`invalid async handle: ${handle}`);\n      }\n      microtaskCallbacks[idx] = null;\n    }\n  },\n};\nexport { microTask };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\nconst testUserAgent = (regexp) => regexp.test(navigator.userAgent);\n\nconst testPlatform = (regexp) => regexp.test(navigator.platform);\n\nconst testVendor = (regexp) => regexp.test(navigator.vendor);\n\nexport const isAndroid = testUserAgent(/Android/);\n\nexport const isChrome = testUserAgent(/Chrome/) && testVendor(/Google Inc/);\n\nexport const isFirefox = testUserAgent(/Firefox/);\n\n// IPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.\nexport const isIPad = testPlatform(/^iPad/) || (testPlatform(/^Mac/) && navigator.maxTouchPoints > 1);\n\nexport const isIPhone = testPlatform(/^iPhone/);\n\nexport const isIOS = isIPhone || isIPad;\n\nexport const isSafari = testUserAgent(/^((?!chrome|android).)*safari/i);\n\nexport const isTouch = (() => {\n  try {\n    document.createEvent('TouchEvent');\n    return true;\n  } catch (e) {\n    return false;\n  }\n})();\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * @typedef ReactiveController\n * @type {import('lit').ReactiveController}\n */\n\n/**\n * A mixin for connecting controllers to the element.\n *\n * @polymerMixin\n */\nexport const ControllerMixin = dedupingMixin(\n  (superClass) =>\n    class ControllerMixinClass extends superClass {\n      constructor() {\n        super();\n\n        /**\n         * @type {Set<ReactiveController>}\n         */\n        this.__controllers = new Set();\n      }\n\n      /** @protected */\n      connectedCallback() {\n        super.connectedCallback();\n\n        this.__controllers.forEach((c) => {\n          if (c.hostConnected) {\n            c.hostConnected();\n          }\n        });\n      }\n\n      /** @protected */\n      disconnectedCallback() {\n        super.disconnectedCallback();\n\n        this.__controllers.forEach((c) => {\n          if (c.hostDisconnected) {\n            c.hostDisconnected();\n          }\n        });\n      }\n\n      /**\n       * Registers a controller to participate in the element update cycle.\n       *\n       * @param {ReactiveController} controller\n       * @protected\n       */\n      addController(controller) {\n        this.__controllers.add(controller);\n        // Call hostConnected if a controller is added after the element is attached.\n        if (this.$ !== undefined && this.isConnected && controller.hostConnected) {\n          controller.hostConnected();\n        }\n      }\n\n      /**\n       * Removes a controller from the element.\n       *\n       * @param {ReactiveController} controller\n       * @protected\n       */\n      removeController(controller) {\n        this.__controllers.delete(controller);\n      }\n    },\n);\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * @summary Collapse multiple callbacks into one invocation after a timer.\n */\nexport class Debouncer {\n  /**\n   * Creates a debouncer if no debouncer is passed as a parameter\n   * or it cancels an active debouncer otherwise. The following\n   * example shows how a debouncer can be called multiple times within a\n   * microtask and \"debounced\" such that the provided callback function is\n   * called once. Add this method to a custom element:\n   *\n   * ```js\n   * import {microTask} from '@vaadin/component-base/src/async.js';\n   * import {Debouncer} from '@vaadin/component-base/src/debounce.js';\n   * // ...\n   *\n   * _debounceWork() {\n   *   this._debounceJob = Debouncer.debounce(this._debounceJob,\n   *       microTask, () => this._doWork());\n   * }\n   * ```\n   *\n   * If the `_debounceWork` method is called multiple times within the same\n   * microtask, the `_doWork` function will be called only once at the next\n   * microtask checkpoint.\n   *\n   * Note: In testing it is often convenient to avoid asynchrony. To accomplish\n   * this with a debouncer, you can use `enqueueDebouncer` and\n   * `flush`. For example, extend the above example by adding\n   * `enqueueDebouncer(this._debounceJob)` at the end of the\n   * `_debounceWork` method. Then in a test, call `flush` to ensure\n   * the debouncer has completed.\n   *\n   * @param {Debouncer?} debouncer Debouncer object.\n   * @param {!AsyncInterface} asyncModule Object with Async interface\n   * @param {function()} callback Callback to run.\n   * @return {!Debouncer} Returns a debouncer object.\n   */\n  static debounce(debouncer, asyncModule, callback) {\n    if (debouncer instanceof Debouncer) {\n      // Cancel the async callback, but leave in debouncerQueue if it was\n      // enqueued, to maintain 1.x flush order\n      debouncer._cancelAsync();\n    } else {\n      debouncer = new Debouncer();\n    }\n    debouncer.setConfig(asyncModule, callback);\n    return debouncer;\n  }\n\n  constructor() {\n    this._asyncModule = null;\n    this._callback = null;\n    this._timer = null;\n  }\n\n  /**\n   * Sets the scheduler; that is, a module with the Async interface,\n   * a callback and optional arguments to be passed to the run function\n   * from the async module.\n   *\n   * @param {!AsyncInterface} asyncModule Object with Async interface.\n   * @param {function()} callback Callback to run.\n   * @return {void}\n   */\n  setConfig(asyncModule, callback) {\n    this._asyncModule = asyncModule;\n    this._callback = callback;\n    this._timer = this._asyncModule.run(() => {\n      this._timer = null;\n      debouncerQueue.delete(this);\n      this._callback();\n    });\n  }\n\n  /**\n   * Cancels an active debouncer and returns a reference to itself.\n   *\n   * @return {void}\n   */\n  cancel() {\n    if (this.isActive()) {\n      this._cancelAsync();\n      // Canceling a debouncer removes its spot from the flush queue,\n      // so if a debouncer is manually canceled and re-debounced, it\n      // will reset its flush order (this is a very minor difference from 1.x)\n      // Re-debouncing via the `debounce` API retains the 1.x FIFO flush order\n      debouncerQueue.delete(this);\n    }\n  }\n\n  /**\n   * Cancels a debouncer's async callback.\n   *\n   * @return {void}\n   */\n  _cancelAsync() {\n    if (this.isActive()) {\n      this._asyncModule.cancel(/** @type {number} */ (this._timer));\n      this._timer = null;\n    }\n  }\n\n  /**\n   * Flushes an active debouncer and returns a reference to itself.\n   *\n   * @return {void}\n   */\n  flush() {\n    if (this.isActive()) {\n      this.cancel();\n      this._callback();\n    }\n  }\n\n  /**\n   * Returns true if the debouncer is active.\n   *\n   * @return {boolean} True if active.\n   */\n  isActive() {\n    return this._timer != null;\n  }\n}\n\nlet debouncerQueue = new Set();\n\n/**\n * Adds a `Debouncer` to a list of globally flushable tasks.\n *\n * @param {!Debouncer} debouncer Debouncer to enqueue\n * @return {void}\n */\nexport function enqueueDebouncer(debouncer) {\n  debouncerQueue.add(debouncer);\n}\n\n/**\n * Flushes any enqueued debouncers\n *\n * @return {boolean} Returns whether any debouncers were flushed\n */\nexport function flushDebouncers() {\n  const didFlush = Boolean(debouncerQueue.size);\n  // If new debouncers are added while flushing, Set.forEach will ensure\n  // newly added ones are also flushed\n  debouncerQueue.forEach((debouncer) => {\n    try {\n      debouncer.flush();\n    } catch (e) {\n      setTimeout(() => {\n        throw e;\n      });\n    }\n  });\n  return didFlush;\n}\n\nexport const flush = () => {\n  let debouncers;\n  do {\n    debouncers = flushDebouncers();\n  } while (debouncers);\n};\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * Helper that provides a set of functions for RTL.\n */\nclass DirHelper {\n  /**\n   * Get the scroll type in the current browser view.\n   *\n   * @return {string} the scroll type. Possible values are `default|reverse|negative`\n   */\n  static detectScrollType() {\n    const dummy = document.createElement('div');\n    dummy.textContent = 'ABCD';\n    dummy.dir = 'rtl';\n    dummy.style.fontSize = '14px';\n    dummy.style.width = '4px';\n    dummy.style.height = '1px';\n    dummy.style.position = 'absolute';\n    dummy.style.top = '-1000px';\n    dummy.style.overflow = 'scroll';\n    document.body.appendChild(dummy);\n\n    let cachedType = 'reverse';\n    if (dummy.scrollLeft > 0) {\n      cachedType = 'default';\n    } else {\n      dummy.scrollLeft = 2;\n      if (dummy.scrollLeft < 2) {\n        cachedType = 'negative';\n      }\n    }\n    document.body.removeChild(dummy);\n    return cachedType;\n  }\n\n  /**\n   * Get the scrollLeft value of the element relative to the direction\n   *\n   * @param {string} scrollType type of the scroll detected with `detectScrollType`\n   * @param {string} direction current direction of the element\n   * @param {Element} element\n   * @return {number} the scrollLeft value.\n   */\n  static getNormalizedScrollLeft(scrollType, direction, element) {\n    const { scrollLeft } = element;\n    if (direction !== 'rtl' || !scrollType) {\n      return scrollLeft;\n    }\n\n    switch (scrollType) {\n      case 'negative':\n        return element.scrollWidth - element.clientWidth + scrollLeft;\n      case 'reverse':\n        return element.scrollWidth - element.clientWidth - scrollLeft;\n      default:\n        return scrollLeft;\n    }\n  }\n\n  /**\n   * Set the scrollLeft value of the element relative to the direction\n   *\n   * @param {string} scrollType type of the scroll detected with `detectScrollType`\n   * @param {string} direction current direction of the element\n   * @param {Element} element\n   * @param {number} scrollLeft the scrollLeft value to be set\n   */\n  static setNormalizedScrollLeft(scrollType, direction, element, scrollLeft) {\n    if (direction !== 'rtl' || !scrollType) {\n      element.scrollLeft = scrollLeft;\n      return;\n    }\n\n    switch (scrollType) {\n      case 'negative':\n        element.scrollLeft = element.clientWidth - element.scrollWidth + scrollLeft;\n        break;\n      case 'reverse':\n        element.scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;\n        break;\n      default:\n        element.scrollLeft = scrollLeft;\n        break;\n    }\n  }\n}\n\nexport { DirHelper };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { DirHelper } from './dir-helper.js';\n\n/**\n * Array of Vaadin custom element classes that have been subscribed to the dir changes.\n */\nconst directionSubscribers = [];\n\nfunction directionUpdater() {\n  const documentDir = getDocumentDir();\n  directionSubscribers.forEach((element) => {\n    alignDirs(element, documentDir);\n  });\n}\n\nlet scrollType;\n\nconst directionObserver = new MutationObserver(directionUpdater);\ndirectionObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['dir'] });\n\nfunction alignDirs(element, documentDir, elementDir = element.getAttribute('dir')) {\n  if (documentDir) {\n    element.setAttribute('dir', documentDir);\n  } else if (elementDir != null) {\n    element.removeAttribute('dir');\n  }\n}\n\nfunction getDocumentDir() {\n  return document.documentElement.getAttribute('dir');\n}\n\n/**\n * A mixin to handle `dir` attribute based on the one set on the `<html>` element.\n *\n * @polymerMixin\n */\nexport const DirMixin = (superClass) =>\n  class VaadinDirMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * @protected\n         */\n        dir: {\n          type: String,\n          value: '',\n          reflectToAttribute: true,\n          converter: {\n            fromAttribute: (attr) => {\n              return !attr ? '' : attr;\n            },\n            toAttribute: (prop) => {\n              return prop === '' ? null : prop;\n            },\n          },\n        },\n      };\n    }\n\n    /** @protected */\n    static finalize() {\n      super.finalize();\n\n      if (!scrollType) {\n        scrollType = DirHelper.detectScrollType();\n      }\n    }\n\n    /** @protected */\n    connectedCallback() {\n      super.connectedCallback();\n\n      if (!this.hasAttribute('dir') || this.__restoreSubscription) {\n        this.__subscribe();\n        alignDirs(this, getDocumentDir(), null);\n      }\n    }\n\n    /** @protected */\n    attributeChangedCallback(name, oldValue, newValue) {\n      super.attributeChangedCallback(name, oldValue, newValue);\n      if (name !== 'dir') {\n        return;\n      }\n\n      const documentDir = getDocumentDir();\n\n      // New value equals to the document direction and the element is not subscribed to the changes\n      const newValueEqlDocDir = newValue === documentDir && directionSubscribers.indexOf(this) === -1;\n      // Value was emptied and the element is not subscribed to the changes\n      const newValueEmptied = !newValue && oldValue && directionSubscribers.indexOf(this) === -1;\n      // New value is different and the old equals to document direction and the element is not subscribed to the changes\n      const newDiffValue = newValue !== documentDir && oldValue === documentDir;\n\n      if (newValueEqlDocDir || newValueEmptied) {\n        this.__subscribe();\n        alignDirs(this, documentDir, newValue);\n      } else if (newDiffValue) {\n        this.__unsubscribe();\n      }\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n      this.__restoreSubscription = directionSubscribers.includes(this);\n      this.__unsubscribe();\n    }\n\n    /** @protected */\n    _valueToNodeAttribute(node, value, attribute) {\n      // Override default Polymer attribute reflection to match native behavior of HTMLElement.dir property\n      // If the property contains an empty string then it should not create an empty attribute\n      if (attribute === 'dir' && value === '' && !node.hasAttribute('dir')) {\n        return;\n      }\n      super._valueToNodeAttribute(node, value, attribute);\n    }\n\n    /** @protected */\n    _attributeToProperty(attribute, value, type) {\n      // Override default Polymer attribute reflection to match native behavior of HTMLElement.dir property\n      // If the attribute is removed, then the dir property should contain an empty string instead of null\n      if (attribute === 'dir' && !value) {\n        this.dir = '';\n      } else {\n        super._attributeToProperty(attribute, value, type);\n      }\n    }\n\n    /** @private */\n    __subscribe() {\n      if (!directionSubscribers.includes(this)) {\n        directionSubscribers.push(this);\n      }\n    }\n\n    /** @private */\n    __unsubscribe() {\n      if (directionSubscribers.includes(this)) {\n        directionSubscribers.splice(directionSubscribers.indexOf(this), 1);\n      }\n    }\n\n    /**\n     * @param {Element} element\n     * @return {number}\n     * @protected\n     */\n    __getNormalizedScrollLeft(element) {\n      return DirHelper.getNormalizedScrollLeft(scrollType, this.getAttribute('dir') || 'ltr', element);\n    }\n\n    /**\n     * @param {Element} element\n     * @param {number} scrollLeft\n     * @protected\n     */\n    __setNormalizedScrollLeft(element, scrollLeft) {\n      return DirHelper.setNormalizedScrollLeft(scrollType, this.getAttribute('dir') || 'ltr', element, scrollLeft);\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * A mixin to provide disabled property for field components.\n *\n * @polymerMixin\n */\nexport const DisabledMixin = dedupingMixin(\n  (superclass) =>\n    class DisabledMixinClass extends superclass {\n      static get properties() {\n        return {\n          /**\n           * If true, the user cannot interact with this element.\n           */\n          disabled: {\n            type: Boolean,\n            value: false,\n            observer: '_disabledChanged',\n            reflectToAttribute: true,\n          },\n        };\n      }\n\n      /**\n       * @param {boolean} disabled\n       * @protected\n       */\n      _disabledChanged(disabled) {\n        this._setAriaDisabled(disabled);\n      }\n\n      /**\n       * @param {boolean} disabled\n       * @protected\n       */\n      _setAriaDisabled(disabled) {\n        if (disabled) {\n          this.setAttribute('aria-disabled', 'true');\n        } else {\n          this.removeAttribute('aria-disabled');\n        }\n      }\n\n      /**\n       * Overrides the default element `click` method in order to prevent\n       * firing the `click` event when the element is disabled.\n       * @protected\n       * @override\n       */\n      click() {\n        if (!this.disabled) {\n          super.click();\n        }\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * Returns an array of ancestor root nodes for the given node.\n *\n * A root node is either a document node or a document fragment node (Shadow Root).\n * The array is collected by a bottom-up DOM traversing that starts with the given node\n * and involves both the light DOM and ancestor shadow DOM trees.\n *\n * @param {Node} node\n * @return {Node[]}\n */\nexport function getAncestorRootNodes(node) {\n  const result = [];\n\n  while (node) {\n    if (node.nodeType === Node.DOCUMENT_NODE) {\n      result.push(node);\n      break;\n    }\n\n    if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      result.push(node);\n      node = node.host;\n      continue;\n    }\n\n    if (node.assignedSlot) {\n      node = node.assignedSlot;\n      continue;\n    }\n\n    node = node.parentNode;\n  }\n\n  return result;\n}\n\n/**\n * @param {string} value\n * @return {Set<string>}\n */\nfunction deserializeAttributeValue(value) {\n  if (!value) {\n    return new Set();\n  }\n\n  return new Set(value.split(' '));\n}\n\n/**\n * @param {Set<string>} values\n * @return {string}\n */\nfunction serializeAttributeValue(values) {\n  return [...values].join(' ');\n}\n\n/**\n * Adds a value to an attribute containing space-delimited values.\n *\n * @param {HTMLElement} element\n * @param {string} attr\n * @param {string} value\n */\nexport function addValueToAttribute(element, attr, value) {\n  const values = deserializeAttributeValue(element.getAttribute(attr));\n  values.add(value);\n  element.setAttribute(attr, serializeAttributeValue(values));\n}\n\n/**\n * Removes a value from an attribute containing space-delimited values.\n * If the value is the last one, the whole attribute is removed.\n *\n * @param {HTMLElement} element\n * @param {string} attr\n * @param {string} value\n */\nexport function removeValueFromAttribute(element, attr, value) {\n  const values = deserializeAttributeValue(element.getAttribute(attr));\n  values.delete(value);\n  if (values.size === 0) {\n    element.removeAttribute(attr);\n    return;\n  }\n  element.setAttribute(attr, serializeAttributeValue(values));\n}\n\n/**\n * Returns true if the given node is an empty text node, false otherwise.\n *\n * @param {Node} node\n * @return {boolean}\n */\nexport function isEmptyTextNode(node) {\n  return node.nodeType === Node.TEXT_NODE && node.textContent.trim() === '';\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { setCancelSyntheticClickEvents } from '@polymer/polymer/lib/utils/settings.js';\nimport { usageStatistics } from '@vaadin/vaadin-usage-statistics/vaadin-usage-statistics.js';\nimport { idlePeriod } from './async.js';\nimport { Debouncer, enqueueDebouncer } from './debounce.js';\nimport { DirMixin } from './dir-mixin.js';\n\n// This setting affects the legacy Polymer gestures which get activated\n// once you import any iron component e.g iron-icon.\n// It has to be explicitly disabled to prevent click issues in iOS + VoiceOver\n// for buttons that are based on `[role=button]` e.g vaadin-button.\nsetCancelSyntheticClickEvents(false);\n\nwindow.Vaadin = window.Vaadin || {};\n\n/**\n * Array of Vaadin custom element classes that have been finalized.\n */\nwindow.Vaadin.registrations = window.Vaadin.registrations || [];\n\nwindow.Vaadin.developmentModeCallback = window.Vaadin.developmentModeCallback || {};\n\nwindow.Vaadin.developmentModeCallback['vaadin-usage-statistics'] = function () {\n  usageStatistics();\n};\n\nlet statsJob;\n\nconst registered = new Set();\n\n/**\n * @polymerMixin\n * @mixes DirMixin\n */\nexport const ElementMixin = (superClass) =>\n  class VaadinElementMixin extends DirMixin(superClass) {\n    static get version() {\n      return '23.5.11';\n    }\n\n    /** @protected */\n    static finalize() {\n      super.finalize();\n\n      const { is } = this;\n\n      // Registers a class prototype for telemetry purposes.\n      if (is && !registered.has(is)) {\n        window.Vaadin.registrations.push(this);\n        registered.add(is);\n\n        if (window.Vaadin.developmentModeCallback) {\n          statsJob = Debouncer.debounce(statsJob, idlePeriod, () => {\n            window.Vaadin.developmentModeCallback['vaadin-usage-statistics']();\n          });\n          enqueueDebouncer(statsJob);\n        }\n      }\n    }\n\n    constructor() {\n      super();\n\n      if (document.doctype === null) {\n        console.warn(\n          'Vaadin components require the \"standards mode\" declaration. Please add <!DOCTYPE html> to the HTML document.',\n        );\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\nimport { isKeyboardActive } from './focus-utils.js';\n\n/**\n * A mixin to handle `focused` and `focus-ring` attributes based on focus.\n *\n * @polymerMixin\n */\nexport const FocusMixin = dedupingMixin(\n  (superclass) =>\n    class FocusMixinClass extends superclass {\n      /**\n       * @protected\n       * @return {boolean}\n       */\n      get _keyboardActive() {\n        return isKeyboardActive();\n      }\n\n      /** @protected */\n      ready() {\n        this.addEventListener('focusin', (e) => {\n          if (this._shouldSetFocus(e)) {\n            this._setFocused(true);\n          }\n        });\n\n        this.addEventListener('focusout', (e) => {\n          if (this._shouldRemoveFocus(e)) {\n            this._setFocused(false);\n          }\n        });\n\n        // In super.ready() other 'focusin' and 'focusout' listeners might be\n        // added, so we call it after our own ones to ensure they execute first.\n        // Issue to watch out: when incorrect, <vaadin-combo-box> refocuses the\n        // input field on iOS after “Done” is pressed.\n        super.ready();\n      }\n\n      /** @protected */\n      disconnectedCallback() {\n        super.disconnectedCallback();\n\n        // In non-Chrome browsers, blur does not fire on the element when it is disconnected.\n        // reproducible in `<vaadin-date-picker>` when closing on `Cancel` or `Today` click.\n        if (this.hasAttribute('focused')) {\n          this._setFocused(false);\n        }\n      }\n\n      /**\n       * Override to change how focused and focus-ring attributes are set.\n       *\n       * @param {boolean} focused\n       * @protected\n       */\n      _setFocused(focused) {\n        this.toggleAttribute('focused', focused);\n\n        // Focus-ring is true when the element was focused from the keyboard.\n        // Focus Ring [A11ycasts]: https://youtu.be/ilj2P5-5CjI\n        this.toggleAttribute('focus-ring', focused && this._keyboardActive);\n      }\n\n      /**\n       * Override to define if the field receives focus based on the event.\n       *\n       * @param {FocusEvent} _event\n       * @return {boolean}\n       * @protected\n       */\n      _shouldSetFocus(_event) {\n        return true;\n      }\n\n      /**\n       * Override to define if the field loses focus based on the event.\n       *\n       * @param {FocusEvent} _event\n       * @return {boolean}\n       * @protected\n       */\n      _shouldRemoveFocus(_event) {\n        return true;\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n// We consider the keyboard to be active if the window has received a keydown\n// event since the last mousedown event.\nlet keyboardActive = false;\n\n// Listen for top-level keydown and mousedown events.\n// Use capture phase so we detect events even if they're handled.\nwindow.addEventListener(\n  'keydown',\n  () => {\n    keyboardActive = true;\n  },\n  { capture: true },\n);\n\nwindow.addEventListener(\n  'mousedown',\n  () => {\n    keyboardActive = false;\n  },\n  { capture: true },\n);\n\n/**\n * Returns true if the window has received a keydown\n * event since the last mousedown event.\n *\n * @return {boolean}\n */\nexport function isKeyboardActive() {\n  return keyboardActive;\n}\n\n/**\n * Returns true if the element is hidden directly with `display: none` or `visibility: hidden`,\n * false otherwise.\n *\n * The method doesn't traverse the element's ancestors, it only checks for the CSS properties\n * set directly to or inherited by the element.\n *\n * @param {HTMLElement} element\n * @return {boolean}\n */\nfunction isElementHiddenDirectly(element) {\n  // Check inline style first to save a re-flow.\n  const style = element.style;\n  if (style.visibility === 'hidden' || style.display === 'none') {\n    return true;\n  }\n\n  const computedStyle = window.getComputedStyle(element);\n  if (computedStyle.visibility === 'hidden' || computedStyle.display === 'none') {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Returns the normalized element tabindex. If not focusable, returns -1.\n * It checks for the attribute \"tabindex\" instead of the element property\n * `tabIndex` since browsers assign different values to it.\n * e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`\n *\n * @param {HTMLElement} element\n * @return {number}\n */\nfunction normalizeTabIndex(element) {\n  if (!isElementFocusable(element)) {\n    return -1;\n  }\n\n  const tabIndex = element.getAttribute('tabindex') || 0;\n  return Number(tabIndex);\n}\n\n/**\n * Returns if element `a` has lower tab order compared to element `b`\n * (both elements are assumed to be focusable and tabbable).\n * Elements with tabindex = 0 have lower tab order compared to elements\n * with tabindex > 0.\n * If both have same tabindex, it returns false.\n *\n * @param {HTMLElement} a\n * @param {HTMLElement} b\n * @return {boolean}\n */\nfunction hasLowerTabOrder(a, b) {\n  // Normalize tabIndexes\n  // e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`\n  const ati = Math.max(a.tabIndex, 0);\n  const bti = Math.max(b.tabIndex, 0);\n  return ati === 0 || bti === 0 ? bti > ati : ati > bti;\n}\n\n/**\n * Merge sort iterator, merges the two arrays into one, sorted by tabindex.\n *\n * @param {HTMLElement[]} left\n * @param {HTMLElement[]} right\n * @return {HTMLElement[]}\n */\nfunction mergeSortByTabIndex(left, right) {\n  const result = [];\n  while (left.length > 0 && right.length > 0) {\n    if (hasLowerTabOrder(left[0], right[0])) {\n      result.push(right.shift());\n    } else {\n      result.push(left.shift());\n    }\n  }\n\n  return result.concat(left, right);\n}\n\n/**\n * Sorts an array of elements by tabindex. Returns a new array.\n *\n * @param {HTMLElement[]} elements\n * @return {HTMLElement[]}\n */\nfunction sortElementsByTabIndex(elements) {\n  // Implement a merge sort as Array.prototype.sort does a non-stable sort\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n  const len = elements.length;\n  if (len < 2) {\n    return elements;\n  }\n  const pivot = Math.ceil(len / 2);\n  const left = sortElementsByTabIndex(elements.slice(0, pivot));\n  const right = sortElementsByTabIndex(elements.slice(pivot));\n\n  return mergeSortByTabIndex(left, right);\n}\n\n/**\n * Searches for nodes that are tabbable and adds them to the `result` array.\n * Returns if the `result` array needs to be sorted by tabindex.\n *\n * @param {Node} node The starting point for the search; added to `result` if tabbable.\n * @param {HTMLElement[]} result\n * @return {boolean}\n * @private\n */\nfunction collectFocusableNodes(node, result) {\n  if (node.nodeType !== Node.ELEMENT_NODE || isElementHiddenDirectly(node)) {\n    // Don't traverse children if the node is not an HTML element or not visible.\n    return false;\n  }\n\n  const element = /** @type {HTMLElement} */ (node);\n  const tabIndex = normalizeTabIndex(element);\n  let needsSort = tabIndex > 0;\n  if (tabIndex >= 0) {\n    result.push(element);\n  }\n\n  let children = [];\n  if (element.localName === 'slot') {\n    children = element.assignedNodes({ flatten: true });\n  } else {\n    // Use shadow root if possible, will check for distributed nodes.\n    children = (element.shadowRoot || element).children;\n  }\n  [...children].forEach((child) => {\n    // Ensure method is always invoked to collect focusable children.\n    needsSort = collectFocusableNodes(child, result) || needsSort;\n  });\n  return needsSort;\n}\n\n/**\n * Returns true if the element is hidden, false otherwise.\n *\n * An element is treated as hidden when any of the following conditions are met:\n * - the element itself or one of its ancestors has `display: none`.\n * - the element has or inherits `visibility: hidden`.\n *\n * @param {HTMLElement} element\n * @return {boolean}\n */\nexport function isElementHidden(element) {\n  // `offsetParent` is `null` when the element itself\n  // or one of its ancestors is hidden with `display: none`.\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n  // However `offsetParent` is also null when the element is using fixed\n  // positioning, so additionally check if the element takes up layout space.\n  if (element.offsetParent === null && element.clientWidth === 0 && element.clientHeight === 0) {\n    return true;\n  }\n\n  return isElementHiddenDirectly(element);\n}\n\n/**\n * Returns true if the element is focusable, otherwise false.\n *\n * The list of focusable elements is taken from http://stackoverflow.com/a/1600194/4228703.\n * However, there isn't a definite list, it's up to the browser.\n * The only standard we have is DOM Level 2 HTML https://www.w3.org/TR/DOM-Level-2-HTML/html.html,\n * according to which the only elements that have a `focus()` method are:\n * - HTMLInputElement\n * - HTMLSelectElement\n * - HTMLTextAreaElement\n * - HTMLAnchorElement\n *\n * This notably omits HTMLButtonElement and HTMLAreaElement.\n * Referring to these tests with tabbables in different browsers\n * http://allyjs.io/data-tables/focusable.html\n *\n * @param {HTMLElement} element\n * @return {boolean}\n */\nexport function isElementFocusable(element) {\n  // The element cannot be focused if its `tabindex` attribute is set to `-1`.\n  if (element.matches('[tabindex=\"-1\"]')) {\n    return false;\n  }\n\n  // Elements that cannot be focused if they have a `disabled` attribute.\n  if (element.matches('input, select, textarea, button, object')) {\n    return element.matches(':not([disabled])');\n  }\n\n  // Elements that can be focused even if they have a `disabled` attribute.\n  return element.matches('a[href], area[href], iframe, [tabindex], [contentEditable]');\n}\n\n/**\n * Returns true if the element is focused, false otherwise.\n *\n * @param {HTMLElement} element\n * @return {boolean}\n */\nexport function isElementFocused(element) {\n  return element.getRootNode().activeElement === element;\n}\n\n/**\n * Returns a tab-ordered array of focusable elements for a root element.\n * The resulting array will include the root element if it is focusable.\n *\n * The method traverses nodes in shadow DOM trees too if any.\n *\n * @param {HTMLElement} element\n * @return {HTMLElement[]}\n */\nexport function getFocusableElements(element) {\n  const focusableElements = [];\n  const needsSortByTabIndex = collectFocusableNodes(element, focusableElements);\n  // If there is at least one element with tabindex > 0, we need to sort\n  // the final array by tabindex.≈\n  if (needsSortByTabIndex) {\n    return sortElementsByTabIndex(focusableElements);\n  }\n  return focusableElements;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * @fileoverview\n *\n * Module for adding listeners to a node for the following normalized\n * cross-platform \"gesture\" events:\n * - `down` - mouse or touch went down\n * - `up` - mouse or touch went up\n * - `tap` - mouse click or finger tap\n * - `track` - mouse drag or touch move\n *\n * @summary Module for adding cross-platform gesture event listeners.\n */\n\nimport { microTask } from './async.js';\n\nconst passiveTouchGestures = false;\nconst wrap = (node) => node;\n\n// Detect native touch action support\nconst HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';\nconst GESTURE_KEY = '__polymerGestures';\nconst HANDLED_OBJ = '__polymerGesturesHandled';\nconst TOUCH_ACTION = '__polymerGesturesTouchAction';\n// Radius for tap and track\nconst TAP_DISTANCE = 25;\nconst TRACK_DISTANCE = 5;\n// Number of last N track positions to keep\nconst TRACK_LENGTH = 2;\n\nconst MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'click'];\n// An array of bitmask values for mapping MouseEvent.which to MouseEvent.buttons\nconst MOUSE_WHICH_TO_BUTTONS = [0, 1, 4, 2];\nconst MOUSE_HAS_BUTTONS = (function () {\n  try {\n    return new MouseEvent('test', { buttons: 1 }).buttons === 1;\n  } catch (e) {\n    return false;\n  }\n})();\n\n/**\n * @param {string} name Possible mouse event name\n * @return {boolean} true if mouse event, false if not\n */\nfunction isMouseEvent(name) {\n  return MOUSE_EVENTS.indexOf(name) > -1;\n}\n\n/* eslint no-empty: [\"error\", { \"allowEmptyCatch\": true }] */\n// check for passive event listeners\nlet supportsPassive = false;\n(function () {\n  try {\n    const opts = Object.defineProperty({}, 'passive', {\n      // eslint-disable-next-line getter-return\n      get() {\n        supportsPassive = true;\n      },\n    });\n    window.addEventListener('test', null, opts);\n    window.removeEventListener('test', null, opts);\n  } catch (e) {}\n})();\n\n/**\n * Generate settings for event listeners, dependant on `passiveTouchGestures`\n *\n * @param {string} eventName Event name to determine if `{passive}` option is\n *   needed\n * @return {{passive: boolean} | undefined} Options to use for addEventListener\n *   and removeEventListener\n */\nfunction PASSIVE_TOUCH(eventName) {\n  if (isMouseEvent(eventName) || eventName === 'touchend') {\n    return;\n  }\n  if (HAS_NATIVE_TA && supportsPassive && passiveTouchGestures) {\n    return { passive: true };\n  }\n}\n\n// Check for touch-only devices\nconst IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);\n\n// Defined at https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#enabling-and-disabling-form-controls:-the-disabled-attribute\n/** @type {!Object<boolean>} */\nconst canBeDisabled = {\n  button: true,\n  command: true,\n  fieldset: true,\n  input: true,\n  keygen: true,\n  optgroup: true,\n  option: true,\n  select: true,\n  textarea: true,\n};\n\n/**\n * @param {MouseEvent} ev event to test for left mouse button down\n * @return {boolean} has left mouse button down\n */\nfunction hasLeftMouseButton(ev) {\n  const type = ev.type;\n  // Exit early if the event is not a mouse event\n  if (!isMouseEvent(type)) {\n    return false;\n  }\n  // Ev.button is not reliable for mousemove (0 is overloaded as both left button and no buttons)\n  // instead we use ev.buttons (bitmask of buttons) or fall back to ev.which (deprecated, 0 for no buttons, 1 for left button)\n  if (type === 'mousemove') {\n    // Allow undefined for testing events\n    let buttons = ev.buttons === undefined ? 1 : ev.buttons;\n    if (ev instanceof window.MouseEvent && !MOUSE_HAS_BUTTONS) {\n      buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;\n    }\n    // Buttons is a bitmask, check that the left button bit is set (1)\n    return Boolean(buttons & 1);\n  }\n  // Allow undefined for testing events\n  const button = ev.button === undefined ? 0 : ev.button;\n  // Ev.button is 0 in mousedown/mouseup/click for left button activation\n  return button === 0;\n}\n\nfunction isSyntheticClick(ev) {\n  if (ev.type === 'click') {\n    // Ev.detail is 0 for HTMLElement.click in most browsers\n    if (ev.detail === 0) {\n      return true;\n    }\n    // In the worst case, check that the x/y position of the click is within\n    // the bounding box of the target of the event\n    // Thanks IE 10 >:(\n    const t = _findOriginalTarget(ev);\n    // Make sure the target of the event is an element so we can use getBoundingClientRect,\n    // if not, just assume it is a synthetic click\n    if (!t.nodeType || /** @type {Element} */ (t).nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    const bcr = /** @type {Element} */ (t).getBoundingClientRect();\n    // Use page x/y to account for scrolling\n    const x = ev.pageX,\n      y = ev.pageY;\n    // Ev is a synthetic click if the position is outside the bounding box of the target\n    return !(x >= bcr.left && x <= bcr.right && y >= bcr.top && y <= bcr.bottom);\n  }\n  return false;\n}\n\nconst POINTERSTATE = {\n  mouse: {\n    target: null,\n    mouseIgnoreJob: null,\n  },\n  touch: {\n    x: 0,\n    y: 0,\n    id: -1,\n    scrollDecided: false,\n  },\n};\n\nfunction firstTouchAction(ev) {\n  let ta = 'auto';\n  const path = getComposedPath(ev);\n  for (let i = 0, n; i < path.length; i++) {\n    n = path[i];\n    if (n[TOUCH_ACTION]) {\n      ta = n[TOUCH_ACTION];\n      break;\n    }\n  }\n  return ta;\n}\n\nfunction trackDocument(stateObj, movefn, upfn) {\n  stateObj.movefn = movefn;\n  stateObj.upfn = upfn;\n  document.addEventListener('mousemove', movefn);\n  document.addEventListener('mouseup', upfn);\n}\n\nfunction untrackDocument(stateObj) {\n  document.removeEventListener('mousemove', stateObj.movefn);\n  document.removeEventListener('mouseup', stateObj.upfn);\n  stateObj.movefn = null;\n  stateObj.upfn = null;\n}\n\n/**\n * Returns the composedPath for the given event.\n * @param {Event} event to process\n * @return {!Array<!EventTarget>} Path of the event\n */\nconst getComposedPath =\n  window.ShadyDOM && window.ShadyDOM.noPatch\n    ? window.ShadyDOM.composedPath\n    : (event) => (event.composedPath && event.composedPath()) || [];\n\n/** @type {!Object<string, !GestureRecognizer>} */\nexport const gestures = {};\n\n/** @type {!Array<!GestureRecognizer>} */\nexport const recognizers = [];\n\n/**\n * Finds the element rendered on the screen at the provided coordinates.\n *\n * Similar to `document.elementFromPoint`, but pierces through\n * shadow roots.\n *\n * @param {number} x Horizontal pixel coordinate\n * @param {number} y Vertical pixel coordinate\n * @return {Element} Returns the deepest shadowRoot inclusive element\n * found at the screen position given.\n */\nexport function deepTargetFind(x, y) {\n  let node = document.elementFromPoint(x, y);\n  let next = node;\n  // This code path is only taken when native ShadowDOM is used\n  // if there is a shadowroot, it may have a node at x/y\n  // if there is not a shadowroot, exit the loop\n  while (next && next.shadowRoot && !window.ShadyDOM) {\n    // If there is a node at x/y in the shadowroot, look deeper\n    const oldNext = next;\n    next = next.shadowRoot.elementFromPoint(x, y);\n    // On Safari, elementFromPoint may return the shadowRoot host\n    if (oldNext === next) {\n      break;\n    }\n    if (next) {\n      node = next;\n    }\n  }\n  return node;\n}\n\n/**\n * A cheaper check than ev.composedPath()[0];\n *\n * @private\n * @param {Event|Touch} ev Event.\n * @return {EventTarget} Returns the event target.\n */\nfunction _findOriginalTarget(ev) {\n  const path = getComposedPath(/** @type {?Event} */ (ev));\n  // It shouldn't be, but sometimes path is empty (window on Safari).\n  return path.length > 0 ? path[0] : ev.target;\n}\n\n/**\n * @private\n * @param {Event} ev Event.\n * @return {void}\n */\nfunction _handleNative(ev) {\n  const type = ev.type;\n  const node = ev.currentTarget;\n  const gobj = node[GESTURE_KEY];\n  if (!gobj) {\n    return;\n  }\n  const gs = gobj[type];\n  if (!gs) {\n    return;\n  }\n  if (!ev[HANDLED_OBJ]) {\n    ev[HANDLED_OBJ] = {};\n    if (type.startsWith('touch')) {\n      const t = ev.changedTouches[0];\n      if (type === 'touchstart') {\n        // Only handle the first finger\n        if (ev.touches.length === 1) {\n          POINTERSTATE.touch.id = t.identifier;\n        }\n      }\n      if (POINTERSTATE.touch.id !== t.identifier) {\n        return;\n      }\n      if (!HAS_NATIVE_TA) {\n        if (type === 'touchstart' || type === 'touchmove') {\n          _handleTouchAction(ev);\n        }\n      }\n    }\n  }\n  const handled = ev[HANDLED_OBJ];\n  // Used to ignore synthetic mouse events\n  if (handled.skip) {\n    return;\n  }\n  // Reset recognizer state\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    if (gs[r.name] && !handled[r.name]) {\n      if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {\n        r.reset();\n      }\n    }\n  }\n  // Enforce gesture recognizer order\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    if (gs[r.name] && !handled[r.name]) {\n      handled[r.name] = true;\n      r[type](ev);\n    }\n  }\n}\n\n/**\n * @private\n * @param {TouchEvent} ev Event.\n * @return {void}\n */\nfunction _handleTouchAction(ev) {\n  const t = ev.changedTouches[0];\n  const type = ev.type;\n  if (type === 'touchstart') {\n    POINTERSTATE.touch.x = t.clientX;\n    POINTERSTATE.touch.y = t.clientY;\n    POINTERSTATE.touch.scrollDecided = false;\n  } else if (type === 'touchmove') {\n    if (POINTERSTATE.touch.scrollDecided) {\n      return;\n    }\n    POINTERSTATE.touch.scrollDecided = true;\n    const ta = firstTouchAction(ev);\n    let shouldPrevent = false;\n    const dx = Math.abs(POINTERSTATE.touch.x - t.clientX);\n    const dy = Math.abs(POINTERSTATE.touch.y - t.clientY);\n    if (!ev.cancelable) {\n      // Scrolling is happening\n    } else if (ta === 'none') {\n      shouldPrevent = true;\n    } else if (ta === 'pan-x') {\n      shouldPrevent = dy > dx;\n    } else if (ta === 'pan-y') {\n      shouldPrevent = dx > dy;\n    }\n    if (shouldPrevent) {\n      ev.preventDefault();\n    } else {\n      prevent('track');\n    }\n  }\n}\n\n/**\n * Adds an event listener to a node for the given gesture type.\n *\n * @param {!EventTarget} node Node to add listener on\n * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`\n * @param {!function(!Event):void} handler Event listener function to call\n * @return {boolean} Returns true if a gesture event listener was added.\n */\nexport function addListener(node, evType, handler) {\n  if (gestures[evType]) {\n    _add(node, evType, handler);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Removes an event listener from a node for the given gesture type.\n *\n * @param {!EventTarget} node Node to remove listener from\n * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`\n * @param {!function(!Event):void} handler Event listener function previously passed to\n *  `addListener`.\n * @return {boolean} Returns true if a gesture event listener was removed.\n */\nexport function removeListener(node, evType, handler) {\n  if (gestures[evType]) {\n    _remove(node, evType, handler);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Automate the event listeners for the native events\n *\n * @private\n * @param {!EventTarget} node Node on which to add the event.\n * @param {string} evType Event type to add.\n * @param {function(!Event)} handler Event handler function.\n * @return {void}\n */\nfunction _add(node, evType, handler) {\n  const recognizer = gestures[evType];\n  const deps = recognizer.deps;\n  const name = recognizer.name;\n  let gobj = node[GESTURE_KEY];\n  if (!gobj) {\n    node[GESTURE_KEY] = gobj = {};\n  }\n  for (let i = 0, dep, gd; i < deps.length; i++) {\n    dep = deps[i];\n    // Don't add mouse handlers on iOS because they cause gray selection overlays\n    if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {\n      continue;\n    }\n    gd = gobj[dep];\n    if (!gd) {\n      gobj[dep] = gd = { _count: 0 };\n    }\n    if (gd._count === 0) {\n      node.addEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));\n    }\n    gd[name] = (gd[name] || 0) + 1;\n    gd._count = (gd._count || 0) + 1;\n  }\n  node.addEventListener(evType, handler);\n  if (recognizer.touchAction) {\n    setTouchAction(node, recognizer.touchAction);\n  }\n}\n\n/**\n * Automate event listener removal for native events\n *\n * @private\n * @param {!EventTarget} node Node on which to remove the event.\n * @param {string} evType Event type to remove.\n * @param {function(!Event): void} handler Event handler function.\n * @return {void}\n */\nfunction _remove(node, evType, handler) {\n  const recognizer = gestures[evType];\n  const deps = recognizer.deps;\n  const name = recognizer.name;\n  const gobj = node[GESTURE_KEY];\n  if (gobj) {\n    for (let i = 0, dep, gd; i < deps.length; i++) {\n      dep = deps[i];\n      gd = gobj[dep];\n      if (gd && gd[name]) {\n        gd[name] = (gd[name] || 1) - 1;\n        gd._count = (gd._count || 1) - 1;\n        if (gd._count === 0) {\n          node.removeEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));\n        }\n      }\n    }\n  }\n  node.removeEventListener(evType, handler);\n}\n\n/**\n * Registers a new gesture event recognizer for adding new custom\n * gesture event types.\n *\n * @param {!GestureRecognizer} recog Gesture recognizer descriptor\n * @return {void}\n */\nexport function register(recog) {\n  recognizers.push(recog);\n  for (let i = 0; i < recog.emits.length; i++) {\n    gestures[recog.emits[i]] = recog;\n  }\n}\n\n/**\n * @private\n * @param {string} evName Event name.\n * @return {Object} Returns the gesture for the given event name.\n */\nfunction _findRecognizerByEvent(evName) {\n  for (let i = 0, r; i < recognizers.length; i++) {\n    r = recognizers[i];\n    for (let j = 0, n; j < r.emits.length; j++) {\n      n = r.emits[j];\n      if (n === evName) {\n        return r;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * Sets scrolling direction on node.\n *\n * This value is checked on first move, thus it should be called prior to\n * adding event listeners.\n *\n * @param {!EventTarget} node Node to set touch action setting on\n * @param {string} value Touch action value\n * @return {void}\n */\nexport function setTouchAction(node, value) {\n  if (HAS_NATIVE_TA && node instanceof HTMLElement) {\n    // NOTE: add touchAction async so that events can be added in\n    // custom element constructors. Otherwise we run afoul of custom\n    // elements restriction against settings attributes (style) in the\n    // constructor.\n    microTask.run(() => {\n      node.style.touchAction = value;\n    });\n  }\n  node[TOUCH_ACTION] = value;\n}\n\n/**\n * Dispatches an event on the `target` element of `type` with the given\n * `detail`.\n * @private\n * @param {!EventTarget} target The element on which to fire an event.\n * @param {string} type The type of event to fire.\n * @param {!Object=} detail The detail object to populate on the event.\n * @return {void}\n */\nfunction _fire(target, type, detail) {\n  const ev = new Event(type, { bubbles: true, cancelable: true, composed: true });\n  ev.detail = detail;\n  wrap(/** @type {!Node} */ (target)).dispatchEvent(ev);\n  // Forward `preventDefault` in a clean way\n  if (ev.defaultPrevented) {\n    const preventer = detail.preventer || detail.sourceEvent;\n    if (preventer && preventer.preventDefault) {\n      preventer.preventDefault();\n    }\n  }\n}\n\n/**\n * Prevents the dispatch and default action of the given event name.\n *\n * @param {string} evName Event name.\n * @return {void}\n */\nexport function prevent(evName) {\n  const recognizer = _findRecognizerByEvent(evName);\n  if (recognizer.info) {\n    recognizer.info.prevent = true;\n  }\n}\n\nregister({\n  name: 'downup',\n  deps: ['mousedown', 'touchstart', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['mouseup', 'touchend'],\n  },\n  emits: ['down', 'up'],\n\n  info: {\n    movefn: null,\n    upfn: null,\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset() {\n    untrackDocument(this.info);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown(e) {\n    if (!hasLeftMouseButton(e)) {\n      return;\n    }\n    const t = _findOriginalTarget(e);\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    const movefn = (e) => {\n      if (!hasLeftMouseButton(e)) {\n        downupFire('up', t, e);\n        untrackDocument(self.info);\n      }\n    };\n    const upfn = (e) => {\n      if (hasLeftMouseButton(e)) {\n        downupFire('up', t, e);\n      }\n      untrackDocument(self.info);\n    };\n    trackDocument(this.info, movefn, upfn);\n    downupFire('down', t, e);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart(e) {\n    downupFire('down', _findOriginalTarget(e), e.changedTouches[0], e);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend(e) {\n    downupFire('up', _findOriginalTarget(e), e.changedTouches[0], e);\n  },\n});\n\n/**\n * @param {string} type\n * @param {EventTarget} target\n * @param {Event|Touch} event\n * @param {Event=} preventer\n * @return {void}\n */\nfunction downupFire(type, target, event, preventer) {\n  if (!target) {\n    return;\n  }\n  _fire(target, type, {\n    x: event.clientX,\n    y: event.clientY,\n    sourceEvent: event,\n    preventer,\n    prevent(e) {\n      return prevent(e);\n    },\n  });\n}\n\nregister({\n  name: 'track',\n  touchAction: 'none',\n  deps: ['mousedown', 'touchstart', 'touchmove', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['mouseup', 'touchend'],\n  },\n  emits: ['track'],\n\n  info: {\n    x: 0,\n    y: 0,\n    state: 'start',\n    started: false,\n    moves: [],\n    /** @this {GestureInfo} */\n    addMove(move) {\n      if (this.moves.length > TRACK_LENGTH) {\n        this.moves.shift();\n      }\n      this.moves.push(move);\n    },\n    movefn: null,\n    upfn: null,\n    prevent: false,\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset() {\n    this.info.state = 'start';\n    this.info.started = false;\n    this.info.moves = [];\n    this.info.x = 0;\n    this.info.y = 0;\n    this.info.prevent = false;\n    untrackDocument(this.info);\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown(e) {\n    if (!hasLeftMouseButton(e)) {\n      return;\n    }\n    const t = _findOriginalTarget(e);\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    const movefn = (e) => {\n      const x = e.clientX,\n        y = e.clientY;\n      if (trackHasMovedEnough(self.info, x, y)) {\n        // First move is 'start', subsequent moves are 'move', mouseup is 'end'\n        self.info.state = self.info.started ? (e.type === 'mouseup' ? 'end' : 'track') : 'start';\n        if (self.info.state === 'start') {\n          // If and only if tracking, always prevent tap\n          prevent('tap');\n        }\n        self.info.addMove({ x, y });\n        if (!hasLeftMouseButton(e)) {\n          // Always fire \"end\"\n          self.info.state = 'end';\n          untrackDocument(self.info);\n        }\n        if (t) {\n          trackFire(self.info, t, e);\n        }\n        self.info.started = true;\n      }\n    };\n    const upfn = (e) => {\n      if (self.info.started) {\n        movefn(e);\n      }\n\n      // Remove the temporary listeners\n      untrackDocument(self.info);\n    };\n    // Add temporary document listeners as mouse retargets\n    trackDocument(this.info, movefn, upfn);\n    this.info.x = e.clientX;\n    this.info.y = e.clientY;\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart(e) {\n    const ct = e.changedTouches[0];\n    this.info.x = ct.clientX;\n    this.info.y = ct.clientY;\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchmove(e) {\n    const t = _findOriginalTarget(e);\n    const ct = e.changedTouches[0];\n    const x = ct.clientX,\n      y = ct.clientY;\n    if (trackHasMovedEnough(this.info, x, y)) {\n      if (this.info.state === 'start') {\n        // If and only if tracking, always prevent tap\n        prevent('tap');\n      }\n      this.info.addMove({ x, y });\n      trackFire(this.info, t, ct);\n      this.info.state = 'track';\n      this.info.started = true;\n    }\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend(e) {\n    const t = _findOriginalTarget(e);\n    const ct = e.changedTouches[0];\n    // Only trackend if track was started and not aborted\n    if (this.info.started) {\n      // Reset started state on up\n      this.info.state = 'end';\n      this.info.addMove({ x: ct.clientX, y: ct.clientY });\n      trackFire(this.info, t, ct);\n    }\n  },\n});\n\n/**\n * @param {!GestureInfo} info\n * @param {number} x\n * @param {number} y\n * @return {boolean}\n */\nfunction trackHasMovedEnough(info, x, y) {\n  if (info.prevent) {\n    return false;\n  }\n  if (info.started) {\n    return true;\n  }\n  const dx = Math.abs(info.x - x);\n  const dy = Math.abs(info.y - y);\n  return dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE;\n}\n\n/**\n * @param {!GestureInfo} info\n * @param {?EventTarget} target\n * @param {Touch} touch\n * @return {void}\n */\nfunction trackFire(info, target, touch) {\n  if (!target) {\n    return;\n  }\n  const secondlast = info.moves[info.moves.length - 2];\n  const lastmove = info.moves[info.moves.length - 1];\n  const dx = lastmove.x - info.x;\n  const dy = lastmove.y - info.y;\n  let ddx,\n    ddy = 0;\n  if (secondlast) {\n    ddx = lastmove.x - secondlast.x;\n    ddy = lastmove.y - secondlast.y;\n  }\n  _fire(target, 'track', {\n    state: info.state,\n    x: touch.clientX,\n    y: touch.clientY,\n    dx,\n    dy,\n    ddx,\n    ddy,\n    sourceEvent: touch,\n    hover() {\n      return deepTargetFind(touch.clientX, touch.clientY);\n    },\n  });\n}\n\nregister({\n  name: 'tap',\n  deps: ['mousedown', 'click', 'touchstart', 'touchend'],\n  flow: {\n    start: ['mousedown', 'touchstart'],\n    end: ['click', 'touchend'],\n  },\n  emits: ['tap'],\n  info: {\n    x: NaN,\n    y: NaN,\n    prevent: false,\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @return {void}\n   */\n  reset() {\n    this.info.x = NaN;\n    this.info.y = NaN;\n    this.info.prevent = false;\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  mousedown(e) {\n    if (hasLeftMouseButton(e)) {\n      this.info.x = e.clientX;\n      this.info.y = e.clientY;\n    }\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {MouseEvent} e\n   * @return {void}\n   */\n  click(e) {\n    if (hasLeftMouseButton(e)) {\n      trackForward(this.info, e);\n    }\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchstart(e) {\n    const touch = e.changedTouches[0];\n    this.info.x = touch.clientX;\n    this.info.y = touch.clientY;\n  },\n\n  /**\n   * @this {GestureRecognizer}\n   * @param {TouchEvent} e\n   * @return {void}\n   */\n  touchend(e) {\n    trackForward(this.info, e.changedTouches[0], e);\n  },\n});\n\n/**\n * @param {!GestureInfo} info\n * @param {Event | Touch} e\n * @param {Event=} preventer\n * @return {void}\n */\nfunction trackForward(info, e, preventer) {\n  const dx = Math.abs(e.clientX - info.x);\n  const dy = Math.abs(e.clientY - info.y);\n  // Find original target from `preventer` for TouchEvents, or `e` for MouseEvents\n  const t = _findOriginalTarget(preventer || e);\n  if (!t || (canBeDisabled[/** @type {!HTMLElement} */ (t).localName] && t.hasAttribute('disabled'))) {\n    return;\n  }\n  // Dx,dy can be NaN if `click` has been simulated and there was no `down` for `start`\n  if (isNaN(dx) || isNaN(dy) || (dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) || isSyntheticClick(e)) {\n    // Prevent taps from being generated if an event has canceled them\n    if (!info.prevent) {\n      _fire(t, 'tap', {\n        x: e.clientX,\n        y: e.clientY,\n        sourceEvent: e,\n        preventer,\n      });\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * A mixin that manages keyboard handling.\n * The mixin subscribes to the keyboard events while an actual implementation\n * for the event handlers is left to the client (a component or another mixin).\n *\n * @polymerMixin\n */\nexport const KeyboardMixin = dedupingMixin(\n  (superclass) =>\n    class KeyboardMixinClass extends superclass {\n      /** @protected */\n      ready() {\n        super.ready();\n\n        this.addEventListener('keydown', (event) => {\n          this._onKeyDown(event);\n        });\n\n        this.addEventListener('keyup', (event) => {\n          this._onKeyUp(event);\n        });\n      }\n\n      /**\n       * A handler for the `keydown` event. By default, it calls\n       * separate methods for handling \"Enter\" and \"Escape\" keys.\n       * Override the method to implement your own behavior.\n       *\n       * @param {KeyboardEvent} event\n       * @protected\n       */\n      _onKeyDown(event) {\n        switch (event.key) {\n          case 'Enter':\n            this._onEnter(event);\n            break;\n          case 'Escape':\n            this._onEscape(event);\n            break;\n          default:\n            break;\n        }\n      }\n\n      /**\n       * A handler for the `keyup` event. By default, it does nothing.\n       * Override the method to implement your own behavior.\n       *\n       * @param {KeyboardEvent} _event\n       * @protected\n       */\n      _onKeyUp(_event) {\n        // To be implemented.\n      }\n\n      /**\n       * A handler for the \"Enter\" key. By default, it does nothing.\n       * Override the method to implement your own behavior.\n       *\n       * @param {KeyboardEvent} _event\n       * @protected\n       */\n      _onEnter(_event) {\n        // To be implemented.\n      }\n\n      /**\n       * A handler for the \"Escape\" key. By default, it does nothing.\n       * Override the method to implement your own behavior.\n       *\n       * @param {KeyboardEvent} _event\n       * @protected\n       */\n      _onEscape(_event) {\n        // To be implemented.\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\nlet uniqueId = 0;\n\n/**\n * Resets the unique id counter.\n *\n * @return {void}\n */\nexport function resetUniqueId() {\n  uniqueId = 0;\n}\n\n/**\n * Returns a unique integer id.\n *\n * @return {number}\n */\nexport function generateUniqueId() {\n  // eslint-disable-next-line no-plusplus\n  return uniqueId++;\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { generateUniqueId } from './unique-id-utils.js';\n\n/**\n * A controller for providing content to slot element and observing changes.\n */\nexport class SlotController extends EventTarget {\n  /**\n   * Ensure that every instance has unique ID.\n   *\n   * @param {string} slotName\n   * @param {HTMLElement} host\n   * @return {string}\n   * @protected\n   */\n  static generateId(slotName, host) {\n    const prefix = slotName || 'default';\n    return `${prefix}-${host.localName}-${generateUniqueId()}`;\n  }\n\n  constructor(host, slotName, slotFactory, slotInitializer, useUniqueId) {\n    super();\n\n    this.host = host;\n    this.slotName = slotName;\n    this.slotFactory = slotFactory;\n    this.slotInitializer = slotInitializer;\n\n    // Only generate the default ID if requested by the controller.\n    if (useUniqueId) {\n      this.defaultId = SlotController.generateId(slotName, host);\n    }\n  }\n\n  hostConnected() {\n    if (!this.initialized) {\n      let node = this.getSlotChild();\n\n      if (!node) {\n        node = this.attachDefaultNode();\n      } else {\n        this.node = node;\n        this.initCustomNode(node);\n      }\n\n      this.initNode(node);\n\n      // TODO: Consider making this behavior opt-in to improve performance.\n      this.observe();\n\n      this.initialized = true;\n    }\n  }\n\n  /**\n   * Create and attach default node using the slot factory.\n   * @return {Node | undefined}\n   * @protected\n   */\n  attachDefaultNode() {\n    const { host, slotName, slotFactory } = this;\n\n    // Check if the node was created previously and if so, reuse it.\n    let node = this.defaultNode;\n\n    // Slot factory is optional, some slots don't have default content.\n    if (!node && slotFactory) {\n      node = slotFactory(host);\n      if (node instanceof Element) {\n        if (slotName !== '') {\n          node.setAttribute('slot', slotName);\n        }\n        this.node = node;\n        this.defaultNode = node;\n      }\n    }\n\n    if (node) {\n      host.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * Return a reference to the node managed by the controller.\n   * @return {Node}\n   */\n  getSlotChild() {\n    const { slotName } = this;\n    return Array.from(this.host.childNodes).find((node) => {\n      // Either an element (any slot) or a text node (only un-named slot).\n      return (\n        (node.nodeType === Node.ELEMENT_NODE && node.slot === slotName) ||\n        (node.nodeType === Node.TEXT_NODE && node.textContent.trim() && slotName === '')\n      );\n    });\n  }\n\n  /**\n   * @param {Node} node\n   * @protected\n   */\n  initNode(node) {\n    const { slotInitializer } = this;\n    // Don't try to bind `this` to initializer (normally it's arrow function).\n    // Instead, pass the host as a first argument to access component's state.\n    if (slotInitializer) {\n      slotInitializer(this.host, node);\n    }\n  }\n\n  /**\n   * Override to initialize the newly added custom node.\n   *\n   * @param {Node} _node\n   * @protected\n   */\n  initCustomNode(_node) {}\n\n  /**\n   * Override to teardown slotted node when it's removed.\n   *\n   * @param {Node} _node\n   * @protected\n   */\n  teardownNode(_node) {}\n\n  /**\n   * Setup the observer to manage slot content changes.\n   * @protected\n   */\n  observe() {\n    const { slotName } = this;\n    const selector = slotName === '' ? 'slot:not([name])' : `slot[name=${slotName}]`;\n    const slot = this.host.shadowRoot.querySelector(selector);\n\n    this.__slotObserver = new FlattenedNodesObserver(slot, (info) => {\n      // TODO: support default slot with multiple nodes (e.g. confirm-dialog)\n      const current = this.node;\n      const newNode = info.addedNodes.find((node) => node !== current);\n\n      if (info.removedNodes.length) {\n        info.removedNodes.forEach((node) => {\n          this.teardownNode(node);\n        });\n      }\n\n      if (newNode) {\n        // Custom node is added, remove the current one.\n        if (current && current.isConnected) {\n          this.host.removeChild(current);\n        }\n\n        this.node = newNode;\n\n        if (newNode !== this.defaultNode) {\n          this.initCustomNode(newNode);\n\n          this.initNode(newNode);\n        }\n      }\n    });\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { DisabledMixin } from './disabled-mixin.js';\n\n/**\n * A mixin to toggle the `tabindex` attribute.\n *\n * The attribute is set to -1 whenever the user disables the element\n * and restored with the last known value once the element is enabled.\n *\n * @polymerMixin\n * @mixes DisabledMixin\n */\nexport const TabindexMixin = (superclass) =>\n  class TabindexMixinClass extends DisabledMixin(superclass) {\n    static get properties() {\n      return {\n        /**\n         * Indicates whether the element can be focused and where it participates in sequential keyboard navigation.\n         *\n         * @protected\n         */\n        tabindex: {\n          type: Number,\n          reflectToAttribute: true,\n          observer: '_tabindexChanged',\n        },\n\n        /**\n         * Stores the last known tabindex since the element has been disabled.\n         *\n         * @protected\n         */\n        _lastTabIndex: {\n          type: Number,\n        },\n      };\n    }\n\n    /**\n     * When the element gets disabled, the observer saves the last known tabindex\n     * and makes the element not focusable by setting tabindex to -1.\n     * As soon as the element gets enabled, the observer restores the last known tabindex\n     * so that the element can be focusable again.\n     *\n     * @protected\n     * @override\n     */\n    _disabledChanged(disabled, oldDisabled) {\n      super._disabledChanged(disabled, oldDisabled);\n\n      if (disabled) {\n        if (this.tabindex !== undefined) {\n          this._lastTabIndex = this.tabindex;\n        }\n        this.tabindex = -1;\n      } else if (oldDisabled) {\n        this.tabindex = this._lastTabIndex;\n      }\n    }\n\n    /**\n     * When the user has changed tabindex while the element is disabled,\n     * the observer reverts tabindex to -1 and rather saves the new tabindex value to apply it later.\n     * The new value will be applied as soon as the element becomes enabled.\n     *\n     * @protected\n     */\n    _tabindexChanged(tabindex) {\n      if (this.disabled && tabindex !== -1) {\n        this._lastTabIndex = tabindex;\n        this.tabindex = -1;\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * Passes the component to the template renderer callback if the template renderer is imported.\n * Otherwise, if there is a template, it warns that the template renderer needs to be imported.\n *\n * @param {HTMLElement} component\n */\nexport function processTemplates(component) {\n  if (window.Vaadin && window.Vaadin.templateRendererCallback) {\n    window.Vaadin.templateRendererCallback(component);\n    return;\n  }\n\n  if (component.querySelector('template')) {\n    console.warn(\n      `WARNING: <template> inside <${component.localName}> is no longer supported. Import @vaadin/polymer-legacy-adapter/template-renderer.js to enable compatibility.`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { SlotController } from './slot-controller.js';\n\n/**\n * A controller that manages the slotted tooltip element.\n */\nexport class TooltipController extends SlotController {\n  constructor(host) {\n    // Do not provide slot factory to create tooltip lazily.\n    super(host, 'tooltip');\n\n    this.setTarget(host);\n  }\n\n  /**\n   * Override to initialize the newly added custom tooltip.\n   *\n   * @param {Node} tooltipNode\n   * @protected\n   * @override\n   */\n  initCustomNode(tooltipNode) {\n    tooltipNode.target = this.target;\n\n    if (this.context !== undefined) {\n      tooltipNode.context = this.context;\n    }\n\n    if (this.manual !== undefined) {\n      tooltipNode.manual = this.manual;\n    }\n\n    if (this.opened !== undefined) {\n      tooltipNode.opened = this.opened;\n    }\n\n    if (this.position !== undefined) {\n      tooltipNode._position = this.position;\n    }\n\n    if (this.shouldShow !== undefined) {\n      tooltipNode.shouldShow = this.shouldShow;\n    }\n  }\n\n  /**\n   * Set a context object to be used by generator.\n   * @param {object} context\n   */\n  setContext(context) {\n    this.context = context;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode.context = context;\n    }\n  }\n\n  /**\n   * Toggle manual state on the slotted tooltip.\n   * @param {boolean} manual\n   */\n  setManual(manual) {\n    this.manual = manual;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode.manual = manual;\n    }\n  }\n\n  /**\n   * Toggle opened state on the slotted tooltip.\n   * @param {boolean} opened\n   */\n  setOpened(opened) {\n    this.opened = opened;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode.opened = opened;\n    }\n  }\n\n  /**\n   * Set default position for the slotted tooltip.\n   * This can be overridden by setting the position\n   * using corresponding property or attribute.\n   * @param {string} position\n   */\n  setPosition(position) {\n    this.position = position;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode._position = position;\n    }\n  }\n\n  /**\n   * Set function used to detect whether to show\n   * the tooltip based on a condition.\n   * @param {Function} shouldShow\n   */\n  setShouldShow(shouldShow) {\n    this.shouldShow = shouldShow;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode.shouldShow = shouldShow;\n    }\n  }\n\n  /**\n   * Set an HTML element to attach the tooltip to.\n   * @param {HTMLElement} target\n   */\n  setTarget(target) {\n    this.target = target;\n\n    const tooltipNode = this.node;\n    if (tooltipNode) {\n      tooltipNode.target = target;\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\nimport { FocusMixin } from '@vaadin/component-base/src/focus-mixin.js';\nimport { TabindexMixin } from '@vaadin/component-base/src/tabindex-mixin.js';\n\n/**\n * A mixin to forward focus to an element in the light DOM.\n *\n * @polymerMixin\n * @mixes FocusMixin\n * @mixes TabindexMixin\n */\nexport const DelegateFocusMixin = dedupingMixin(\n  (superclass) =>\n    class DelegateFocusMixinClass extends FocusMixin(TabindexMixin(superclass)) {\n      static get properties() {\n        return {\n          /**\n           * Specify that this control should have input focus when the page loads.\n           */\n          autofocus: {\n            type: Boolean,\n          },\n\n          /**\n           * A reference to the focusable element controlled by the mixin.\n           * It can be an input, textarea, button or any element with tabindex > -1.\n           *\n           * Any component implementing this mixin is expected to provide it\n           * by using `this._setFocusElement(input)` Polymer API.\n           *\n           * Toggling `tabindex` attribute on the host element propagates its value to `focusElement`.\n           *\n           * @protected\n           * @type {!HTMLElement}\n           */\n          focusElement: {\n            type: Object,\n            readOnly: true,\n            observer: '_focusElementChanged',\n          },\n\n          /**\n           * Override the property from `TabIndexMixin`\n           * to ensure the `tabindex` attribute of the focus element\n           * will be restored to `0` after re-enabling the element.\n           *\n           * @protected\n           * @override\n           */\n          _lastTabIndex: {\n            value: 0,\n          },\n        };\n      }\n\n      constructor() {\n        super();\n\n        this._boundOnBlur = this._onBlur.bind(this);\n        this._boundOnFocus = this._onFocus.bind(this);\n      }\n\n      /** @protected */\n      ready() {\n        super.ready();\n\n        if (this.autofocus && !this.disabled) {\n          requestAnimationFrame(() => {\n            this.focus();\n            this.setAttribute('focus-ring', '');\n          });\n        }\n      }\n\n      /**\n       * @protected\n       * @override\n       */\n      focus() {\n        if (!this.focusElement || this.disabled) {\n          return;\n        }\n\n        this.focusElement.focus();\n        this._setFocused(true);\n      }\n\n      /**\n       * @protected\n       * @override\n       */\n      blur() {\n        if (!this.focusElement) {\n          return;\n        }\n        this.focusElement.blur();\n        this._setFocused(false);\n      }\n\n      /**\n       * @protected\n       * @override\n       */\n      click() {\n        if (this.focusElement && !this.disabled) {\n          this.focusElement.click();\n        }\n      }\n\n      /** @protected */\n      _focusElementChanged(element, oldElement) {\n        if (element) {\n          element.disabled = this.disabled;\n          this._addFocusListeners(element);\n          this.__forwardTabIndex(this.tabindex);\n        } else if (oldElement) {\n          this._removeFocusListeners(oldElement);\n        }\n      }\n\n      /**\n       * @param {HTMLElement} element\n       * @protected\n       */\n      _addFocusListeners(element) {\n        element.addEventListener('blur', this._boundOnBlur);\n        element.addEventListener('focus', this._boundOnFocus);\n      }\n\n      /**\n       * @param {HTMLElement} element\n       * @protected\n       */\n      _removeFocusListeners(element) {\n        element.removeEventListener('blur', this._boundOnBlur);\n        element.removeEventListener('focus', this._boundOnFocus);\n      }\n\n      /**\n       * Focus event does not bubble, so we dispatch it manually\n       * on the host element to support adding focus listeners\n       * when the focusable element is placed in light DOM.\n       * @param {FocusEvent} event\n       * @protected\n       */\n      _onFocus(event) {\n        event.stopPropagation();\n        this.dispatchEvent(new Event('focus'));\n      }\n\n      /**\n       * Blur event does not bubble, so we dispatch it manually\n       * on the host element to support adding blur listeners\n       * when the focusable element is placed in light DOM.\n       * @param {FocusEvent} event\n       * @protected\n       */\n      _onBlur(event) {\n        event.stopPropagation();\n        this.dispatchEvent(new Event('blur'));\n      }\n\n      /**\n       * @param {Event} event\n       * @return {boolean}\n       * @protected\n       * @override\n       */\n      _shouldSetFocus(event) {\n        return event.target === this.focusElement;\n      }\n\n      /**\n       * @param {boolean} disabled\n       * @param {boolean} oldDisabled\n       * @protected\n       * @override\n       */\n      _disabledChanged(disabled, oldDisabled) {\n        super._disabledChanged(disabled, oldDisabled);\n\n        if (this.focusElement) {\n          this.focusElement.disabled = disabled;\n        }\n\n        if (disabled) {\n          this.blur();\n        }\n      }\n\n      /**\n       * Override an observer from `TabindexMixin`.\n       * Do not call super to remove tabindex attribute\n       * from the host after it has been forwarded.\n       * @param {string} tabindex\n       * @protected\n       * @override\n       */\n      _tabindexChanged(tabindex) {\n        this.__forwardTabIndex(tabindex);\n      }\n\n      /** @private */\n      __forwardTabIndex(tabindex) {\n        if (tabindex !== undefined && this.focusElement) {\n          this.focusElement.tabIndex = tabindex;\n\n          // Preserve tabindex=\"-1\" on the host element\n          if (tabindex !== -1) {\n            this.tabindex = undefined;\n          }\n        }\n\n        if (this.disabled && tabindex) {\n          // If tabindex attribute was changed while component was disabled\n          if (tabindex !== -1) {\n            this._lastTabIndex = tabindex;\n          }\n          this.tabindex = undefined;\n        }\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * A mixin to delegate properties and attributes to a target element.\n *\n * @polymerMixin\n */\nexport const DelegateStateMixin = dedupingMixin(\n  (superclass) =>\n    class DelegateStateMixinClass extends superclass {\n      static get properties() {\n        return {\n          /**\n           * A target element to which attributes and properties are delegated.\n           * @protected\n           */\n          stateTarget: {\n            type: Object,\n            observer: '_stateTargetChanged',\n          },\n        };\n      }\n\n      /**\n       * An array of the host attributes to delegate to the target element.\n       */\n      static get delegateAttrs() {\n        return [];\n      }\n\n      /**\n       * An array of the host properties to delegate to the target element.\n       */\n      static get delegateProps() {\n        return [];\n      }\n\n      /** @protected */\n      ready() {\n        super.ready();\n\n        this._createDelegateAttrsObserver();\n        this._createDelegatePropsObserver();\n      }\n\n      /** @protected */\n      _stateTargetChanged(target) {\n        if (target) {\n          this._ensureAttrsDelegated();\n          this._ensurePropsDelegated();\n        }\n      }\n\n      /** @protected */\n      _createDelegateAttrsObserver() {\n        this._createMethodObserver(`_delegateAttrsChanged(${this.constructor.delegateAttrs.join(', ')})`);\n      }\n\n      /** @protected */\n      _createDelegatePropsObserver() {\n        this._createMethodObserver(`_delegatePropsChanged(${this.constructor.delegateProps.join(', ')})`);\n      }\n\n      /** @protected */\n      _ensureAttrsDelegated() {\n        this.constructor.delegateAttrs.forEach((name) => {\n          this._delegateAttribute(name, this[name]);\n        });\n      }\n\n      /** @protected */\n      _ensurePropsDelegated() {\n        this.constructor.delegateProps.forEach((name) => {\n          this._delegateProperty(name, this[name]);\n        });\n      }\n\n      /** @protected */\n      _delegateAttrsChanged(...values) {\n        this.constructor.delegateAttrs.forEach((name, index) => {\n          this._delegateAttribute(name, values[index]);\n        });\n      }\n\n      /** @protected */\n      _delegatePropsChanged(...values) {\n        this.constructor.delegateProps.forEach((name, index) => {\n          this._delegateProperty(name, values[index]);\n        });\n      }\n\n      /** @protected */\n      _delegateAttribute(name, value) {\n        if (!this.stateTarget) {\n          return;\n        }\n\n        if (name === 'invalid') {\n          this._delegateAttribute('aria-invalid', value ? 'true' : false);\n        }\n\n        if (typeof value === 'boolean') {\n          this.stateTarget.toggleAttribute(name, value);\n        } else if (value) {\n          this.stateTarget.setAttribute(name, value);\n        } else {\n          this.stateTarget.removeAttribute(name);\n        }\n      }\n\n      /** @protected */\n      _delegateProperty(name, value) {\n        if (!this.stateTarget) {\n          return;\n        }\n\n        this.stateTarget[name] = value;\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { SlotController } from '@vaadin/component-base/src/slot-controller.js';\n\n/**\n * A controller to create and initialize slotted `<input>` element.\n */\nexport class InputController extends SlotController {\n  constructor(host, callback) {\n    super(\n      host,\n      'input',\n      () => document.createElement('input'),\n      (host, node) => {\n        if (host.value) {\n          node.value = host.value;\n        }\n        if (host.type) {\n          node.setAttribute('type', host.type);\n        }\n\n        // Ensure every instance has unique ID\n        node.id = this.defaultId;\n\n        if (typeof callback === 'function') {\n          callback(node);\n        }\n      },\n      true,\n    );\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\n/**\n * A mixin to store the reference to an input element\n * and add input and change event listeners to it.\n *\n * @polymerMixin\n */\nexport const InputMixin = dedupingMixin(\n  (superclass) =>\n    class InputMixinClass extends superclass {\n      static get properties() {\n        return {\n          /**\n           * A reference to the input element controlled by the mixin.\n           * Any component implementing this mixin is expected to provide it\n           * by using `this._setInputElement(input)` Polymer API.\n           *\n           * A typical case is using `InputController` that does this automatically.\n           * However, the input element does not have to always be native <input>:\n           * as an example, <vaadin-combo-box-light> accepts other components.\n           *\n           * @protected\n           * @type {!HTMLElement}\n           */\n          inputElement: {\n            type: Object,\n            readOnly: true,\n            observer: '_inputElementChanged',\n          },\n\n          /**\n           * String used to define input type.\n           * @protected\n           */\n          type: {\n            type: String,\n            readOnly: true,\n          },\n\n          /**\n           * The value of the field.\n           */\n          value: {\n            type: String,\n            value: '',\n            observer: '_valueChanged',\n            notify: true,\n          },\n\n          /**\n           * When true, the input element has a non-empty value entered by the user.\n           * @protected\n           */\n          _hasInputValue: {\n            type: Boolean,\n            value: false,\n            observer: '_hasInputValueChanged',\n          },\n        };\n      }\n\n      constructor() {\n        super();\n\n        this._boundOnInput = this.__onInput.bind(this);\n        this._boundOnChange = this._onChange.bind(this);\n      }\n\n      /**\n       * Clear the value of the field.\n       */\n      clear() {\n        this.value = '';\n      }\n\n      /**\n       * Add event listeners to the input element instance.\n       * Override this method to add custom listeners.\n       * @param {!HTMLElement} input\n       * @protected\n       */\n      _addInputListeners(input) {\n        input.addEventListener('input', this._boundOnInput);\n        input.addEventListener('change', this._boundOnChange);\n      }\n\n      /**\n       * Remove event listeners from the input element instance.\n       * @param {!HTMLElement} input\n       * @protected\n       */\n      _removeInputListeners(input) {\n        input.removeEventListener('input', this._boundOnInput);\n        input.removeEventListener('change', this._boundOnChange);\n      }\n\n      /**\n       * A method to forward the value property set on the field\n       * programmatically back to the input element value.\n       * Override this method to perform additional checks,\n       * for example to skip this in certain conditions.\n       * @param {string} value\n       * @protected\n       */\n      _forwardInputValue(value) {\n        // Value might be set before an input element is initialized.\n        // This case should be handled separately by a component that\n        // implements this mixin, for example in `connectedCallback`.\n        if (!this.inputElement) {\n          return;\n        }\n\n        if (value != null) {\n          this.inputElement.value = value;\n        } else {\n          this.inputElement.value = '';\n        }\n      }\n\n      /**\n       * @param {HTMLElement | undefined} input\n       * @param {HTMLElement | undefined} oldInput\n       * @protected\n       */\n      _inputElementChanged(input, oldInput) {\n        if (input) {\n          this._addInputListeners(input);\n        } else if (oldInput) {\n          this._removeInputListeners(oldInput);\n        }\n      }\n\n      /**\n       * Observer to notify about the change of private property.\n       *\n       * @private\n       */\n      _hasInputValueChanged(hasValue, oldHasValue) {\n        if (hasValue || oldHasValue) {\n          this.dispatchEvent(new CustomEvent('has-input-value-changed'));\n        }\n      }\n\n      /**\n       * An input event listener used to update `_hasInputValue` property.\n       * Do not override this method.\n       *\n       * @param {Event} event\n       * @private\n       */\n      __onInput(event) {\n        this._setHasInputValue(event);\n        this._onInput(event);\n      }\n\n      /**\n       * An input event listener used to update the field value.\n       *\n       * @param {Event} event\n       * @protected\n       */\n      _onInput(event) {\n        // In the case a custom web component is passed as `inputElement`,\n        // the actual native input element, on which the event occurred,\n        // can be inside shadow trees.\n        const target = event.composedPath()[0];\n        // Ignore fake input events e.g. used by clear button.\n        this.__userInput = event.isTrusted;\n        this.value = target.value;\n        this.__userInput = false;\n      }\n\n      /**\n       * A change event listener.\n       * Override this method with an actual implementation.\n       * @param {Event} _event\n       * @protected\n       */\n      _onChange(_event) {}\n\n      /**\n       * Toggle the has-value attribute based on the value property.\n       *\n       * @param {boolean} hasValue\n       * @protected\n       */\n      _toggleHasValue(hasValue) {\n        this.toggleAttribute('has-value', hasValue);\n      }\n\n      /**\n       * Observer called when a value property changes.\n       * @param {string | undefined} newVal\n       * @param {string | undefined} oldVal\n       * @protected\n       */\n      _valueChanged(newVal, oldVal) {\n        this._toggleHasValue(this._hasValue);\n\n        // Setting initial value to empty string, do nothing.\n        if (newVal === '' && oldVal === undefined) {\n          return;\n        }\n\n        // Value is set by the user, no need to sync it back to input.\n        if (this.__userInput) {\n          return;\n        }\n\n        // Setting a value programmatically, sync it to input element.\n        this._forwardInputValue(newVal);\n      }\n\n      /**\n       * Indicates whether the value is different from the default one.\n       * Override if the `value` property has a type other than `string`.\n       *\n       * @protected\n       */\n      get _hasValue() {\n        return this.value != null && this.value !== '';\n      }\n\n      /**\n       * Sets the `_hasInputValue` property based on the `input` event.\n       *\n       * @param {InputEvent} event\n       * @protected\n       */\n      _setHasInputValue(event) {\n        // In the case a custom web component is passed as `inputElement`,\n        // the actual native input element, on which the event occurred,\n        // can be inside shadow trees.\n        const target = event.composedPath()[0];\n        this._hasInputValue = target.value.length > 0;\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { SlotController } from '@vaadin/component-base/src/slot-controller.js';\n\n/**\n * A controller to manage the label element.\n */\nexport class LabelController extends SlotController {\n  constructor(host) {\n    super(\n      host,\n      'label',\n      () => document.createElement('label'),\n      (_host, node) => {\n        // Set ID attribute or use the existing one.\n        this.__updateLabelId(node);\n\n        // Set text content for the default label.\n        this.__updateDefaultLabel(this.label);\n\n        this.__observeLabel(node);\n      },\n      true,\n    );\n  }\n\n  /**\n   * @return {string}\n   */\n  get labelId() {\n    return this.node.id;\n  }\n\n  /**\n   * Override to initialize the newly added custom label.\n   *\n   * @param {Node} labelNode\n   * @protected\n   * @override\n   */\n  initCustomNode(labelNode) {\n    this.__updateLabelId(labelNode);\n\n    const hasLabel = this.__hasLabel(labelNode);\n    this.__toggleHasLabel(hasLabel);\n  }\n\n  /**\n   * Override to cleanup label node when it's removed.\n   *\n   * @param {Node} node\n   * @protected\n   * @override\n   */\n  teardownNode(node) {\n    if (this.__labelObserver) {\n      this.__labelObserver.disconnect();\n    }\n\n    let labelNode = this.getSlotChild();\n\n    // If custom label was removed, restore the default one.\n    if (!labelNode && node !== this.defaultNode) {\n      labelNode = this.attachDefaultNode();\n\n      // Run initializer to update default label and ID.\n      this.initNode(labelNode);\n    }\n\n    const hasLabel = this.__hasLabel(labelNode);\n    this.__toggleHasLabel(hasLabel);\n  }\n\n  /**\n   * Set label based on corresponding host property.\n   *\n   * @param {string} label\n   */\n  setLabel(label) {\n    this.label = label;\n\n    this.__updateDefaultLabel(label);\n  }\n\n  /**\n   * @param {HTMLElement} labelNode\n   * @return {boolean}\n   * @private\n   */\n  __hasLabel(labelNode) {\n    if (!labelNode) {\n      return false;\n    }\n\n    return labelNode.children.length > 0 || this.__isNotEmpty(labelNode.textContent);\n  }\n\n  /**\n   * @param {string} label\n   * @private\n   */\n  __isNotEmpty(label) {\n    return Boolean(label && label.trim() !== '');\n  }\n\n  /**\n   * @param {HTMLElement} labelNode\n   * @private\n   */\n  __observeLabel(labelNode) {\n    this.__labelObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        const target = mutation.target;\n\n        // Ensure the mutation target is the currently connected label\n        // to ignore async mutations dispatched for removed element.\n        const isLabelMutation = target === this.node;\n\n        if (mutation.type === 'attributes') {\n          // We use attributeFilter to only observe ID mutation,\n          // no need to check for attribute name separately.\n          if (isLabelMutation && target.id !== this.defaultId) {\n            this.__updateLabelId(target);\n          }\n        } else if (isLabelMutation || target.parentElement === this.node) {\n          // Update has-label when textContent changes\n          const hasLabel = this.__hasLabel(this.node);\n          this.__toggleHasLabel(hasLabel);\n        }\n      });\n    });\n\n    // Observe changes to label ID attribute, text content and children.\n    this.__labelObserver.observe(labelNode, {\n      attributes: true,\n      attributeFilter: ['id'],\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n  }\n\n  /**\n   * @param {boolean} hasLabel\n   * @private\n   */\n  __toggleHasLabel(hasLabel) {\n    this.host.toggleAttribute('has-label', hasLabel);\n\n    // Make it possible for other mixins to observe change\n    this.dispatchEvent(\n      new CustomEvent('label-changed', {\n        detail: {\n          hasLabel,\n          node: this.node,\n        },\n      }),\n    );\n  }\n\n  /**\n   * @param {string} label\n   * @private\n   */\n  __updateDefaultLabel(label) {\n    if (this.defaultNode) {\n      this.defaultNode.textContent = label;\n\n      // Update has-label if default label is used\n      if (this.defaultNode === this.node) {\n        const hasLabel = this.__isNotEmpty(label);\n        this.__toggleHasLabel(hasLabel);\n      }\n    }\n  }\n\n  /**\n   * @param {HTMLElement} labelNode\n   * @private\n   */\n  __updateLabelId(labelNode) {\n    if (!labelNode.id) {\n      labelNode.id = this.defaultId;\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { LabelController } from './label-controller.js';\n\n/**\n * A mixin to provide label via corresponding property or named slot.\n *\n * @polymerMixin\n * @mixes ControllerMixin\n */\nexport const LabelMixin = dedupingMixin(\n  (superclass) =>\n    class LabelMixinClass extends ControllerMixin(superclass) {\n      static get properties() {\n        return {\n          /**\n           * The label text for the input node.\n           * When no light dom defined via [slot=label], this value will be used.\n           */\n          label: {\n            type: String,\n            observer: '_labelChanged',\n          },\n        };\n      }\n\n      /** @protected */\n      get _labelId() {\n        return this._labelController.labelId;\n      }\n\n      /** @protected */\n      get _labelNode() {\n        return this._labelController.node;\n      }\n\n      constructor() {\n        super();\n\n        this._labelController = new LabelController(this);\n      }\n\n      /** @protected */\n      ready() {\n        super.ready();\n\n        this.addController(this._labelController);\n      }\n\n      /** @protected */\n      _labelChanged(label) {\n        this._labelController.setLabel(label);\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * A controller for linking a `<label>` element with an `<input>` element.\n */\nexport class LabelledInputController {\n  constructor(input, labelController) {\n    this.input = input;\n    this.__preventDuplicateLabelClick = this.__preventDuplicateLabelClick.bind(this);\n\n    labelController.addEventListener('label-changed', (event) => {\n      this.__initLabel(event.detail.node);\n    });\n\n    // Initialize the default label element\n    this.__initLabel(labelController.node);\n  }\n\n  /**\n   * @param {HTMLElement} label\n   * @private\n   */\n  __initLabel(label) {\n    if (label) {\n      label.addEventListener('click', this.__preventDuplicateLabelClick);\n\n      if (this.input) {\n        label.setAttribute('for', this.input.id);\n      }\n    }\n  }\n\n  /**\n   * The native platform fires an event for both the click on the label, and also\n   * the subsequent click on the native input element caused by label click.\n   * This results in two click events arriving at the host, but we only want one.\n   * This method prevents the duplicate click and ensures the correct isTrusted event\n   * with the correct event.target arrives at the host.\n   * @private\n   */\n  __preventDuplicateLabelClick() {\n    const inputClickHandler = (e) => {\n      e.stopImmediatePropagation();\n      this.input.removeEventListener('click', inputClickHandler);\n    };\n    this.input.addEventListener('click', inputClickHandler);\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const ActiveItemMixin = (superClass) =>\n  class ActiveItemMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * The item user has last interacted with. Turns to `null` after user deactivates\n         * the item by re-interacting with the currently active item.\n         * @type {GridItem}\n         */\n        activeItem: {\n          type: Object,\n          notify: true,\n          value: null,\n        },\n      };\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      this.$.scroller.addEventListener('click', this._onClick.bind(this));\n      this.addEventListener('cell-activate', this._activateItem.bind(this));\n      this.addEventListener('row-activate', this._activateItem.bind(this));\n    }\n\n    /** @private */\n    _activateItem(e) {\n      const model = e.detail.model;\n      const clickedItem = model ? model.item : null;\n\n      if (clickedItem) {\n        this.activeItem = !this._itemsEqual(this.activeItem, clickedItem) ? clickedItem : null;\n      }\n    }\n\n    /**\n     * We need to listen to click instead of tap because on mobile safari, the\n     * document.activeElement has not been updated (focus has not been shifted)\n     * yet at the point when tap event is being executed.\n     * @param {!MouseEvent} e\n     * @protected\n     */\n    _onClick(e) {\n      if (e.defaultPrevented) {\n        // Something has handled this click already, e. g., <vaadin-grid-sorter>\n        return;\n      }\n\n      const path = e.composedPath();\n      const cell = path[path.indexOf(this.$.table) - 3];\n      if (!cell || cell.getAttribute('part').indexOf('details-cell') > -1) {\n        return;\n      }\n      const cellContent = cell._content;\n\n      const activeElement = this.getRootNode().activeElement;\n      const cellContentHasFocus = cellContent.contains(activeElement);\n      if (!cellContentHasFocus && !this._isFocusable(e.target) && !(e.target instanceof HTMLLabelElement)) {\n        this.dispatchEvent(\n          new CustomEvent('cell-activate', {\n            detail: {\n              model: this.__getRowModel(cell.parentElement),\n            },\n          }),\n        );\n      }\n    }\n\n    /**\n     * @param {!Element} target\n     * @return {boolean}\n     * @protected\n     */\n    _isFocusable(target) {\n      return isFocusable(target);\n    }\n\n    /**\n     * Fired when the `activeItem` property changes.\n     *\n     * @event active-item-changed\n     */\n\n    /**\n     * Fired when the cell is activated with click or keyboard.\n     *\n     * @event cell-activate\n     */\n  };\n\n/**\n * @param {!Element} target\n * @return {boolean}\n * @protected\n */\nexport const isFocusable = (target) => {\n  if (!target.parentNode) {\n    return false;\n  }\n  const focusables = Array.from(\n    target.parentNode.querySelectorAll(\n      '[tabindex], button, input, select, textarea, object, iframe, a[href], area[href]',\n    ),\n  ).filter((element) => {\n    const part = element.getAttribute('part');\n    return !(part && part.includes('body-cell'));\n  });\n\n  const isFocusableElement = focusables.includes(target);\n  return (\n    !target.disabled && isFocusableElement && target.offsetParent && getComputedStyle(target).visibility !== 'hidden'\n  );\n};\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { animationFrame } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';\nimport { processTemplates } from '@vaadin/component-base/src/templates.js';\n\n/**\n * @polymerMixin\n */\nexport const ColumnBaseMixin = (superClass) =>\n  class ColumnBaseMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * When set to true, the column is user-resizable.\n         * @default false\n         */\n        resizable: {\n          type: Boolean,\n          value() {\n            if (this.localName === 'vaadin-grid-column-group') {\n              return;\n            }\n\n            const parent = this.parentNode;\n            if (parent && parent.localName === 'vaadin-grid-column-group') {\n              return parent.resizable || false;\n            }\n            return false;\n          },\n        },\n\n        /**\n         * When true, the column is frozen. When a column inside of a column group is frozen,\n         * all of the sibling columns inside the group will get frozen also.\n         * @type {boolean}\n         */\n        frozen: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * When true, the column is frozen to end of grid.\n         *\n         * When a column inside of a column group is frozen to end, all of the sibling columns\n         * inside the group will get frozen to end also.\n         *\n         * Column can not be set as `frozen` and `frozenToEnd` at the same time.\n         * @attr {boolean} frozen-to-end\n         * @type {boolean}\n         */\n        frozenToEnd: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * When set to true, the cells for this column are hidden.\n         */\n        hidden: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * Text content to display in the header cell of the column.\n         */\n        header: {\n          type: String,\n        },\n\n        /**\n         * Aligns the columns cell content horizontally.\n         * Supported values: \"start\", \"center\" and \"end\".\n         * @attr {start|center|end} text-align\n         * @type {GridColumnTextAlign | null | undefined}\n         */\n        textAlign: {\n          type: String,\n        },\n\n        /**\n         * @type {boolean}\n         * @protected\n         */\n        _lastFrozen: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * @type {boolean}\n         * @protected\n         */\n        _firstFrozenToEnd: {\n          type: Boolean,\n          value: false,\n        },\n\n        /** @protected */\n        _order: Number,\n\n        /** @private */\n        _reorderStatus: Boolean,\n\n        /**\n         * @type {Array<!HTMLElement>}\n         * @protected\n         */\n        _emptyCells: Array,\n\n        /** @private */\n        _headerCell: Object,\n\n        /** @private */\n        _footerCell: Object,\n\n        /** @protected */\n        _grid: Object,\n\n        /**\n         * By default, the Polymer doesn't invoke the observer\n         * during initialization if all of its dependencies are `undefined`.\n         * This internal property can be used to force initial invocation of an observer\n         * even the other dependencies of the observer are `undefined`.\n         *\n         * @private\n         */\n        __initialized: {\n          type: Boolean,\n          value: true,\n        },\n\n        /**\n         * Custom function for rendering the header content.\n         * Receives two arguments:\n         *\n         * - `root` The header cell content DOM element. Append your content to it.\n         * - `column` The `<vaadin-grid-column>` element.\n         *\n         * @type {GridHeaderFooterRenderer | null | undefined}\n         */\n        headerRenderer: Function,\n\n        /**\n         * Represents the final header renderer computed on the set of observable arguments.\n         * It is supposed to be used internally when rendering the header cell content.\n         *\n         * @protected\n         * @type {GridHeaderFooterRenderer | undefined}\n         */\n        _headerRenderer: {\n          type: Function,\n          computed: '_computeHeaderRenderer(headerRenderer, header, __initialized)',\n        },\n\n        /**\n         * Custom function for rendering the footer content.\n         * Receives two arguments:\n         *\n         * - `root` The footer cell content DOM element. Append your content to it.\n         * - `column` The `<vaadin-grid-column>` element.\n         *\n         * @type {GridHeaderFooterRenderer | null | undefined}\n         */\n        footerRenderer: Function,\n\n        /**\n         * Represents the final footer renderer computed on the set of observable arguments.\n         * It is supposed to be used internally when rendering the footer cell content.\n         *\n         * @protected\n         * @type {GridHeaderFooterRenderer | undefined}\n         */\n        _footerRenderer: {\n          type: Function,\n          computed: '_computeFooterRenderer(footerRenderer, __initialized)',\n        },\n\n        /**\n         * An internal property that is mainly used by `vaadin-template-renderer`\n         * to identify grid column elements.\n         *\n         * @private\n         */\n        __gridColumnElement: {\n          type: Boolean,\n          value: true,\n        },\n      };\n    }\n\n    static get observers() {\n      return [\n        '_widthChanged(width, _headerCell, _footerCell, _cells.*)',\n        '_frozenChanged(frozen, _headerCell, _footerCell, _cells.*)',\n        '_frozenToEndChanged(frozenToEnd, _headerCell, _footerCell, _cells.*)',\n        '_flexGrowChanged(flexGrow, _headerCell, _footerCell, _cells.*)',\n        '_textAlignChanged(textAlign, _cells.*, _headerCell, _footerCell)',\n        '_orderChanged(_order, _headerCell, _footerCell, _cells.*)',\n        '_lastFrozenChanged(_lastFrozen)',\n        '_firstFrozenToEndChanged(_firstFrozenToEnd)',\n        '_onRendererOrBindingChanged(_renderer, _cells, _cells.*, path)',\n        '_onHeaderRendererOrBindingChanged(_headerRenderer, _headerCell, path, header)',\n        '_onFooterRendererOrBindingChanged(_footerRenderer, _footerCell)',\n        '_resizableChanged(resizable, _headerCell)',\n        '_reorderStatusChanged(_reorderStatus, _headerCell, _footerCell, _cells.*)',\n        '_hiddenChanged(hidden, _headerCell, _footerCell, _cells.*)',\n      ];\n    }\n\n    /** @protected */\n    connectedCallback() {\n      super.connectedCallback();\n\n      // Adds the column cells to the grid after the column is attached\n      requestAnimationFrame(() => {\n        // Skip if the column has been detached\n        if (!this._grid) {\n          return;\n        }\n\n        this._allCells.forEach((cell) => {\n          if (!cell._content.parentNode) {\n            this._grid.appendChild(cell._content);\n          }\n        });\n      });\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n\n      // Removes the column cells from the grid after the column is detached\n      requestAnimationFrame(() => {\n        // Skip if the column has been attached again\n        if (this._grid) {\n          return;\n        }\n\n        this._allCells.forEach((cell) => {\n          if (cell._content.parentNode) {\n            cell._content.parentNode.removeChild(cell._content);\n          }\n        });\n      });\n\n      this._gridValue = undefined;\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      processTemplates(this);\n    }\n\n    /**\n     * @return {!Grid | undefined}\n     * @protected\n     */\n    _findHostGrid() {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\n      let el = this;\n      // Custom elements extending grid must have a specific localName\n      while (el && !/^vaadin.*grid(-pro)?$/.test(el.localName)) {\n        el = el.assignedSlot ? el.assignedSlot.parentNode : el.parentNode;\n      }\n      return el || undefined;\n    }\n\n    /**\n     * @return {!Grid | undefined}\n     * @protected\n     */\n    get _grid() {\n      if (!this._gridValue) {\n        this._gridValue = this._findHostGrid();\n      }\n      return this._gridValue;\n    }\n\n    /**\n     * @return {!Array<!HTMLElement>}\n     * @protected\n     */\n    get _allCells() {\n      return []\n        .concat(this._cells || [])\n        .concat(this._emptyCells || [])\n        .concat(this._headerCell)\n        .concat(this._footerCell)\n        .filter((cell) => cell);\n    }\n\n    /** @protected */\n    _renderHeaderAndFooter() {\n      this._renderHeaderCellContent(this._headerRenderer, this._headerCell);\n      this._renderFooterCellContent(this._footerRenderer, this._footerCell);\n    }\n\n    /** @private */\n    _flexGrowChanged(flexGrow) {\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._columnPropChanged('flexGrow');\n      }\n\n      this._allCells.forEach((cell) => {\n        cell.style.flexGrow = flexGrow;\n      });\n    }\n\n    /** @private */\n    _orderChanged(order) {\n      this._allCells.forEach((cell) => {\n        cell.style.order = order;\n      });\n    }\n\n    /** @private */\n    _widthChanged(width) {\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._columnPropChanged('width');\n      }\n\n      this._allCells.forEach((cell) => {\n        cell.style.width = width;\n      });\n    }\n\n    /** @private */\n    _frozenChanged(frozen) {\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._columnPropChanged('frozen', frozen);\n      }\n\n      this._allCells.forEach((cell) => cell.toggleAttribute('frozen', frozen));\n\n      if (this._grid && this._grid._frozenCellsChanged) {\n        this._grid._frozenCellsChanged();\n      }\n    }\n\n    /** @private */\n    _frozenToEndChanged(frozenToEnd) {\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._columnPropChanged('frozenToEnd', frozenToEnd);\n      }\n\n      this._allCells.forEach((cell) => {\n        // Skip sizer cells to keep correct scrollWidth.\n        if (this._grid && cell.parentElement === this._grid.$.sizer) {\n          return;\n        }\n        cell.toggleAttribute('frozen-to-end', frozenToEnd);\n      });\n\n      if (this._grid && this._grid._frozenCellsChanged) {\n        this._grid._frozenCellsChanged();\n      }\n    }\n\n    /** @private */\n    _lastFrozenChanged(lastFrozen) {\n      this._allCells.forEach((cell) => cell.toggleAttribute('last-frozen', lastFrozen));\n\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._lastFrozen = lastFrozen;\n      }\n    }\n\n    /** @private */\n    _firstFrozenToEndChanged(firstFrozenToEnd) {\n      this._allCells.forEach((cell) => {\n        // Skip sizer cells to keep correct scrollWidth.\n        if (this._grid && cell.parentElement === this._grid.$.sizer) {\n          return;\n        }\n\n        cell.toggleAttribute('first-frozen-to-end', firstFrozenToEnd);\n      });\n\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._firstFrozenToEnd = firstFrozenToEnd;\n      }\n    }\n\n    /**\n     * @param {string} path\n     * @return {string}\n     * @protected\n     */\n    _generateHeader(path) {\n      return path\n        .substr(path.lastIndexOf('.') + 1)\n        .replace(/([A-Z])/g, '-$1')\n        .toLowerCase()\n        .replace(/-/g, ' ')\n        .replace(/^./, (match) => match.toUpperCase());\n    }\n\n    /** @private */\n    _reorderStatusChanged(reorderStatus) {\n      this._allCells.forEach((cell) => cell.setAttribute('reorder-status', reorderStatus));\n    }\n\n    /** @private */\n    _resizableChanged(resizable, headerCell) {\n      if (resizable === undefined || headerCell === undefined) {\n        return;\n      }\n\n      if (headerCell) {\n        [headerCell].concat(this._emptyCells).forEach((cell) => {\n          if (cell) {\n            const existingHandle = cell.querySelector('[part~=\"resize-handle\"]');\n            if (existingHandle) {\n              cell.removeChild(existingHandle);\n            }\n\n            if (resizable) {\n              const handle = document.createElement('div');\n              handle.setAttribute('part', 'resize-handle');\n              cell.appendChild(handle);\n            }\n          }\n        });\n      }\n    }\n\n    /** @private */\n    _textAlignChanged(textAlign) {\n      if (textAlign === undefined || this._grid === undefined) {\n        return;\n      }\n      if (['start', 'end', 'center'].indexOf(textAlign) === -1) {\n        console.warn('textAlign can only be set as \"start\", \"end\" or \"center\"');\n        return;\n      }\n\n      let textAlignFallback;\n      if (getComputedStyle(this._grid).direction === 'ltr') {\n        if (textAlign === 'start') {\n          textAlignFallback = 'left';\n        } else if (textAlign === 'end') {\n          textAlignFallback = 'right';\n        }\n      } else if (textAlign === 'start') {\n        textAlignFallback = 'right';\n      } else if (textAlign === 'end') {\n        textAlignFallback = 'left';\n      }\n\n      this._allCells.forEach((cell) => {\n        cell._content.style.textAlign = textAlign;\n        if (getComputedStyle(cell._content).textAlign !== textAlign) {\n          cell._content.style.textAlign = textAlignFallback;\n        }\n      });\n    }\n\n    /** @private */\n    _hiddenChanged(hidden) {\n      if (this.parentElement && this.parentElement._columnPropChanged) {\n        this.parentElement._columnPropChanged('hidden', hidden);\n      }\n\n      if (!!hidden !== !!this._previousHidden && this._grid) {\n        if (hidden === true) {\n          this._allCells.forEach((cell) => {\n            if (cell._content.parentNode) {\n              cell._content.parentNode.removeChild(cell._content);\n            }\n          });\n        }\n        this._grid._debouncerHiddenChanged = Debouncer.debounce(\n          this._grid._debouncerHiddenChanged,\n          animationFrame,\n          () => {\n            if (this._grid && this._grid._renderColumnTree) {\n              this._grid._renderColumnTree(this._grid._columnTree);\n            }\n          },\n        );\n\n        if (this._grid._debounceUpdateFrozenColumn) {\n          this._grid._debounceUpdateFrozenColumn();\n        }\n\n        if (this._grid._resetKeyboardNavigation) {\n          this._grid._resetKeyboardNavigation();\n        }\n      }\n      this._previousHidden = hidden;\n    }\n\n    /** @protected */\n    _runRenderer(renderer, cell, model) {\n      const args = [cell._content, this];\n      if (model && model.item) {\n        args.push(model);\n      }\n\n      renderer.apply(this, args);\n    }\n\n    /**\n     * Renders the content to the given cells using a renderer.\n     *\n     * @private\n     */\n    __renderCellsContent(renderer, cells) {\n      // Skip if the column is hidden or not attached to a grid.\n      if (this.hidden || !this._grid) {\n        return;\n      }\n\n      cells.forEach((cell) => {\n        if (!cell.parentElement) {\n          return;\n        }\n\n        const model = this._grid.__getRowModel(cell.parentElement);\n\n        if (!renderer) {\n          return;\n        }\n\n        if (cell._renderer !== renderer) {\n          this._clearCellContent(cell);\n        }\n\n        cell._renderer = renderer;\n\n        if (model.item || renderer === this._headerRenderer || renderer === this._footerRenderer) {\n          this._runRenderer(renderer, cell, model);\n        }\n      });\n    }\n\n    /**\n     * Clears the content of a cell.\n     *\n     * @protected\n     */\n    _clearCellContent(cell) {\n      cell._content.innerHTML = '';\n      // Whenever a Lit-based renderer is used, it assigns a Lit part to the node it was rendered into.\n      // When clearing the rendered content, this part needs to be manually disposed of.\n      // Otherwise, using a Lit-based renderer on the same node will throw an exception or render nothing afterward.\n      delete cell._content._$litPart$;\n    }\n\n    /**\n     * Renders the header cell content using a renderer,\n     * and then updates the visibility of the parent row depending on\n     * whether all its children cells are empty or not.\n     *\n     * @protected\n     */\n    _renderHeaderCellContent(headerRenderer, headerCell) {\n      if (!headerCell || !headerRenderer) {\n        return;\n      }\n\n      this.__renderCellsContent(headerRenderer, [headerCell]);\n      if (this._grid && headerCell.parentElement) {\n        this._grid.__debounceUpdateHeaderFooterRowVisibility(headerCell.parentElement);\n      }\n    }\n\n    /** @protected */\n    _onHeaderRendererOrBindingChanged(headerRenderer, headerCell, ..._bindings) {\n      this._renderHeaderCellContent(headerRenderer, headerCell);\n    }\n\n    /**\n     * Renders the content of body cells using a renderer.\n     *\n     * @protected\n     */\n    _renderBodyCellsContent(renderer, cells) {\n      if (!cells || !renderer) {\n        return;\n      }\n\n      this.__renderCellsContent(renderer, cells);\n    }\n\n    /** @protected */\n    _onRendererOrBindingChanged(renderer, cells, ..._bindings) {\n      this._renderBodyCellsContent(renderer, cells);\n    }\n\n    /**\n     * Renders the footer cell content using a renderer\n     * and then updates the visibility of the parent row depending on\n     * whether all its children cells are empty or not.\n     *\n     * @protected\n     */\n    _renderFooterCellContent(footerRenderer, footerCell) {\n      if (!footerCell || !footerRenderer) {\n        return;\n      }\n\n      this.__renderCellsContent(footerRenderer, [footerCell]);\n      if (this._grid && footerCell.parentElement) {\n        this._grid.__debounceUpdateHeaderFooterRowVisibility(footerCell.parentElement);\n      }\n    }\n\n    /** @protected */\n    _onFooterRendererOrBindingChanged(footerRenderer, footerCell) {\n      this._renderFooterCellContent(footerRenderer, footerCell);\n    }\n\n    /** @private */\n    __setTextContent(node, textContent) {\n      if (node.textContent !== textContent) {\n        node.textContent = textContent;\n      }\n    }\n\n    /**\n     * Renders the text header to the header cell.\n     *\n     * @private\n     */\n    __textHeaderRenderer() {\n      this.__setTextContent(this._headerCell._content, this.header);\n    }\n\n    /**\n     * Computes the property name based on the path and renders it to the header cell.\n     * If the path is not defined, then nothing is rendered.\n     *\n     * @protected\n     */\n    _defaultHeaderRenderer() {\n      if (!this.path) {\n        return;\n      }\n\n      this.__setTextContent(this._headerCell._content, this._generateHeader(this.path));\n    }\n\n    /**\n     * Computes the item property value based on the path and renders it to the body cell.\n     * If the path is not defined, then nothing is rendered.\n     *\n     * @protected\n     */\n    _defaultRenderer(root, _owner, { item }) {\n      if (!this.path) {\n        return;\n      }\n\n      this.__setTextContent(root, this.get(this.path, item));\n    }\n\n    /**\n     * By default, nothing is rendered to the footer cell.\n     *\n     * @protected\n     */\n    _defaultFooterRenderer() {}\n\n    /**\n     * Computes the final header renderer for the `_headerRenderer` computed property.\n     * All the arguments are observable by the Polymer, it re-calls the method\n     * once an argument is changed to update the property value.\n     *\n     * @protected\n     * @return {GridHeaderFooterRenderer | undefined}\n     */\n    _computeHeaderRenderer(headerRenderer, header) {\n      if (headerRenderer) {\n        return headerRenderer;\n      }\n\n      if (header !== undefined && header !== null) {\n        return this.__textHeaderRenderer;\n      }\n\n      return this._defaultHeaderRenderer;\n    }\n\n    /**\n     * Computes the final renderer for the `_renderer` property.\n     * All the arguments are observable by the Polymer, it re-calls the method\n     * once an argument is changed to update the property value.\n     *\n     * @protected\n     * @return {GridBodyRenderer | undefined}\n     */\n    _computeRenderer(renderer) {\n      if (renderer) {\n        return renderer;\n      }\n\n      return this._defaultRenderer;\n    }\n\n    /**\n     * Computes the final footer renderer for the `_footerRenderer` property.\n     * All the arguments are observable by the Polymer, it re-calls the method\n     * once an argument is changed to update the property value.\n     *\n     * @protected\n     * @return {GridHeaderFooterRenderer | undefined}\n     */\n    _computeFooterRenderer(footerRenderer) {\n      if (footerRenderer) {\n        return footerRenderer;\n      }\n\n      return this._defaultFooterRenderer;\n    }\n  };\n\n/**\n * A `<vaadin-grid-column>` is used to configure how a column in `<vaadin-grid>`\n * should look like.\n *\n * See [`<vaadin-grid>`](#/elements/vaadin-grid) documentation for instructions on how\n * to configure the `<vaadin-grid-column>`.\n *\n * @extends HTMLElement\n * @mixes ColumnBaseMixin\n */\nclass GridColumn extends ColumnBaseMixin(DirMixin(PolymerElement)) {\n  static get is() {\n    return 'vaadin-grid-column';\n  }\n\n  static get properties() {\n    return {\n      /**\n       * Width of the cells for this column.\n       */\n      width: {\n        type: String,\n        value: '100px',\n      },\n\n      /**\n       * Flex grow ratio for the cell widths. When set to 0, cell width is fixed.\n       * @attr {number} flex-grow\n       * @type {number}\n       */\n      flexGrow: {\n        type: Number,\n        value: 1,\n      },\n\n      /**\n       * Custom function for rendering the cell content.\n       * Receives three arguments:\n       *\n       * - `root` The cell content DOM element. Append your content to it.\n       * - `column` The `<vaadin-grid-column>` element.\n       * - `model` The object with the properties related with\n       *   the rendered item, contains:\n       *   - `model.index` The index of the item.\n       *   - `model.item` The item.\n       *   - `model.expanded` Sublevel toggle state.\n       *   - `model.level` Level of the tree represented with a horizontal offset of the toggle button.\n       *   - `model.selected` Selected state.\n       *   - `model.detailsOpened` Details opened state.\n       *\n       * @type {GridBodyRenderer | null | undefined}\n       */\n      renderer: Function,\n\n      /**\n       * Represents the final renderer computed on the set of observable arguments.\n       * It is supposed to be used internally when rendering the content of a body cell.\n       *\n       * @protected\n       * @type {GridBodyRenderer | undefined}\n       */\n      _renderer: {\n        type: Function,\n        computed: '_computeRenderer(renderer, __initialized)',\n      },\n\n      /**\n       * Path to an item sub-property whose value gets displayed in the column body cells.\n       * The property name is also shown in the column header if an explicit header or renderer isn't defined.\n       */\n      path: {\n        type: String,\n      },\n\n      /**\n       * Automatically sets the width of the column based on the column contents when this is set to `true`.\n       *\n       * For performance reasons the column width is calculated automatically only once when the grid items\n       * are rendered for the first time and the calculation only considers the rows which are currently\n       * rendered in DOM (a bit more than what is currently visible). If the grid is scrolled, or the cell\n       * content changes, the column width might not match the contents anymore.\n       *\n       * Hidden columns are ignored in the calculation and their widths are not automatically updated when\n       * you show a column that was initially hidden.\n       *\n       * You can manually trigger the auto sizing behavior again by calling `grid.recalculateColumnWidths()`.\n       *\n       * The column width may still grow larger when `flexGrow` is not 0.\n       * @attr {boolean} auto-width\n       * @type {boolean}\n       */\n      autoWidth: {\n        type: Boolean,\n        value: false,\n      },\n\n      /**\n       * When true, wraps the cell's slot into an element with role=\"button\", and sets\n       * the tabindex attribute on the button element, instead of the cell itself.\n       * This is needed to keep focus in sync with VoiceOver cursor when navigating\n       * with Control + Option + arrow keys: focusing the `<td>` element does not fire\n       * a focus event, but focusing an element with role=\"button\" inside a cell fires it.\n       * @protected\n       */\n      _focusButtonMode: {\n        type: Boolean,\n        value: false,\n      },\n\n      /**\n       * @type {Array<!HTMLElement>}\n       * @protected\n       */\n      _cells: Array,\n    };\n  }\n}\n\ncustomElements.define(GridColumn.is, GridColumn);\n\nexport { GridColumn };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @param {Array<Object>} columns array of columns to be modified\n * @param {number} scope multiplier added to base order for each column\n * @param {number} baseOrder base number used for order\n */\nexport function updateColumnOrders(columns, scope, baseOrder) {\n  let c = 1;\n  columns.forEach((column) => {\n    // Avoid multiples of 10 because they introduce and extra zero and\n    // causes the underlying calculations for child order goes wrong\n    if (c % 10 === 0) {\n      c += 1;\n    }\n    column._order = baseOrder + c * scope;\n    c += 1;\n  });\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-grid',\n  css`\n    @keyframes vaadin-grid-appear {\n      to {\n        opacity: 1;\n      }\n    }\n\n    :host {\n      display: block;\n      animation: 1ms vaadin-grid-appear;\n      height: 400px;\n      flex: 1 1 auto;\n      align-self: stretch;\n      position: relative;\n    }\n\n    :host([hidden]) {\n      display: none !important;\n    }\n\n    :host([disabled]) {\n      pointer-events: none;\n    }\n\n    #scroller {\n      display: block;\n      transform: translateY(0);\n      width: auto;\n      height: auto;\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n    }\n\n    :host([all-rows-visible]) {\n      height: auto;\n      align-self: flex-start;\n      flex-grow: 0;\n      width: 100%;\n    }\n\n    :host([all-rows-visible]) #scroller {\n      width: 100%;\n      height: 100%;\n      position: relative;\n    }\n\n    :host([all-rows-visible]) #items {\n      min-height: 1px;\n    }\n\n    #table {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      height: 100%;\n      overflow: auto;\n      position: relative;\n      outline: none;\n      /* Workaround for a Desktop Safari bug: new stacking context here prevents the scrollbar from getting hidden */\n      z-index: 0;\n    }\n\n    #header,\n    #footer {\n      display: block;\n      position: -webkit-sticky;\n      position: sticky;\n      left: 0;\n      overflow: visible;\n      width: 100%;\n      z-index: 1;\n    }\n\n    #header {\n      top: 0;\n    }\n\n    th {\n      text-align: inherit;\n    }\n\n    /* Safari doesn't work with \"inherit\" */\n    [safari] th {\n      text-align: initial;\n    }\n\n    #footer {\n      bottom: 0;\n    }\n\n    #items {\n      flex-grow: 1;\n      flex-shrink: 0;\n      display: block;\n      position: -webkit-sticky;\n      position: sticky;\n      width: 100%;\n      left: 0;\n      overflow: visible;\n    }\n\n    [part~='row'] {\n      display: flex;\n      width: 100%;\n      box-sizing: border-box;\n      margin: 0;\n    }\n\n    [part~='row'][loading] [part~='body-cell'] ::slotted(vaadin-grid-cell-content) {\n      opacity: 0;\n    }\n\n    #items [part~='row'] {\n      position: absolute;\n    }\n\n    #items [part~='row']:empty {\n      height: 100%;\n    }\n\n    [part~='cell']:not([part~='details-cell']) {\n      flex-shrink: 0;\n      flex-grow: 1;\n      box-sizing: border-box;\n      display: flex;\n      width: 100%;\n      position: relative;\n      align-items: center;\n      padding: 0;\n      white-space: nowrap;\n    }\n\n    [part~='cell'] > [tabindex] {\n      display: flex;\n      align-items: inherit;\n      outline: none;\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      left: 0;\n      right: 0;\n    }\n\n    [part~='details-cell'] {\n      position: absolute;\n      bottom: 0;\n      width: 100%;\n      box-sizing: border-box;\n      padding: 0;\n    }\n\n    [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      display: block;\n      width: 100%;\n      box-sizing: border-box;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    [hidden] {\n      display: none !important;\n    }\n\n    [frozen],\n    [frozen-to-end] {\n      z-index: 2;\n      will-change: transform;\n    }\n\n    [no-scrollbars][safari] #table,\n    [no-scrollbars][firefox] #table {\n      overflow: hidden;\n    }\n\n    /* Reordering styles */\n    :host([reordering]) [part~='cell'] ::slotted(vaadin-grid-cell-content),\n    :host([reordering]) [part~='resize-handle'],\n    #scroller[no-content-pointer-events] [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      pointer-events: none;\n    }\n\n    [part~='reorder-ghost'] {\n      visibility: hidden;\n      position: fixed;\n      pointer-events: none;\n      opacity: 0.5;\n\n      /* Prevent overflowing the grid in Firefox */\n      top: 0;\n      left: 0;\n    }\n\n    :host([reordering]) {\n      -moz-user-select: none;\n      -webkit-user-select: none;\n      user-select: none;\n    }\n\n    /* Resizing styles */\n    [part~='resize-handle'] {\n      position: absolute;\n      top: 0;\n      right: 0;\n      height: 100%;\n      cursor: col-resize;\n      z-index: 1;\n    }\n\n    [part~='resize-handle']::before {\n      position: absolute;\n      content: '';\n      height: 100%;\n      width: 35px;\n      transform: translateX(-50%);\n    }\n\n    [last-column] [part~='resize-handle']::before,\n    [last-frozen] [part~='resize-handle']::before {\n      width: 18px;\n      transform: none;\n      right: 0;\n    }\n\n    [frozen-to-end] [part~='resize-handle'] {\n      left: 0;\n      right: auto;\n    }\n\n    [frozen-to-end] [part~='resize-handle']::before {\n      left: 0;\n      right: auto;\n    }\n\n    [first-frozen-to-end] [part~='resize-handle']::before {\n      width: 18px;\n      transform: none;\n    }\n\n    [first-frozen-to-end] {\n      margin-inline-start: auto;\n    }\n\n    /* Hide resize handle if scrolled to end */\n    :host(:not([overflow~='end'])) [first-frozen-to-end] [part~='resize-handle'] {\n      display: none;\n    }\n\n    #scroller[column-resizing] {\n      -ms-user-select: none;\n      -moz-user-select: none;\n      -webkit-user-select: none;\n      user-select: none;\n    }\n\n    /* Sizer styles */\n    #sizer {\n      display: flex;\n      position: absolute;\n      visibility: hidden;\n    }\n\n    #sizer [part~='details-cell'] {\n      display: none !important;\n    }\n\n    #sizer [part~='cell'][hidden] {\n      display: none !important;\n    }\n\n    #sizer [part~='cell'] {\n      display: block;\n      flex-shrink: 0;\n      line-height: 0;\n      height: 0 !important;\n      min-height: 0 !important;\n      max-height: 0 !important;\n      padding: 0 !important;\n      border: none !important;\n    }\n\n    #sizer [part~='cell']::before {\n      content: '-';\n    }\n\n    #sizer [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      display: none !important;\n    }\n\n    /* RTL specific styles */\n\n    :host([dir='rtl']) #items,\n    :host([dir='rtl']) #header,\n    :host([dir='rtl']) #footer {\n      left: auto;\n    }\n\n    :host([dir='rtl']) [part~='reorder-ghost'] {\n      left: auto;\n      right: 0;\n    }\n\n    :host([dir='rtl']) [part~='resize-handle'] {\n      left: 0;\n      right: auto;\n    }\n\n    :host([dir='rtl']) [part~='resize-handle']::before {\n      transform: translateX(50%);\n    }\n\n    :host([dir='rtl']) [last-column] [part~='resize-handle']::before,\n    :host([dir='rtl']) [last-frozen] [part~='resize-handle']::before {\n      left: 0;\n      right: auto;\n    }\n\n    :host([dir='rtl']) [frozen-to-end] [part~='resize-handle'] {\n      right: 0;\n      left: auto;\n    }\n\n    :host([dir='rtl']) [frozen-to-end] [part~='resize-handle']::before {\n      right: 0;\n      left: auto;\n    }\n  `,\n  { moduleId: 'vaadin-grid-styles' },\n);\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nimport { animationFrame, idlePeriod, microTask } from './async.js';\nimport { Debouncer, enqueueDebouncer, flush } from './debounce.js';\n\nconst IOS = navigator.userAgent.match(/iP(?:hone|ad;(?: U;)? CPU) OS (\\d+)/);\nconst IOS_TOUCH_SCROLLING = IOS && IOS[1] >= 8;\nconst DEFAULT_PHYSICAL_COUNT = 3;\n\n/**\n * DO NOT EDIT THIS FILE!\n *\n * This file includes the iron-list scrolling engine copied from\n * https://github.com/PolymerElements/iron-list/blob/master/iron-list.js\n *\n * If something in the scrolling engine needs to be changed\n * for the virtualizer's purposes, override a function\n * in virtualizer-iron-list-adapter.js instead of changing it here.\n * If a function on this file is no longer needed, the code can be safely deleted.\n *\n * This will allow us to keep the iron-list code here as close to\n * the original as possible.\n */\nexport const ironList = {\n  /**\n   * The ratio of hidden tiles that should remain in the scroll direction.\n   * Recommended value ~0.5, so it will distribute tiles evenly in both\n   * directions.\n   */\n  _ratio: 0.5,\n\n  /**\n   * The padding-top value for the list.\n   */\n  _scrollerPaddingTop: 0,\n\n  /**\n   * This value is a cached value of `scrollTop` from the last `scroll` event.\n   */\n  _scrollPosition: 0,\n\n  /**\n   * The sum of the heights of all the tiles in the DOM.\n   */\n  _physicalSize: 0,\n\n  /**\n   * The average `offsetHeight` of the tiles observed till now.\n   */\n  _physicalAverage: 0,\n\n  /**\n   * The number of tiles which `offsetHeight` > 0 observed until now.\n   */\n  _physicalAverageCount: 0,\n\n  /**\n   * The Y position of the item rendered in the `_physicalStart`\n   * tile relative to the scrolling list.\n   */\n  _physicalTop: 0,\n\n  /**\n   * The number of items in the list.\n   */\n  _virtualCount: 0,\n\n  /**\n   * The estimated scroll height based on `_physicalAverage`\n   */\n  _estScrollHeight: 0,\n\n  /**\n   * The scroll height of the dom node\n   */\n  _scrollHeight: 0,\n\n  /**\n   * The height of the list. This is referred as the viewport in the context of\n   * list.\n   */\n  _viewportHeight: 0,\n\n  /**\n   * The width of the list. This is referred as the viewport in the context of\n   * list.\n   */\n  _viewportWidth: 0,\n\n  /**\n   * An array of DOM nodes that are currently in the tree\n   * @type {?Array<!HTMLElement>}\n   */\n  _physicalItems: null,\n\n  /**\n   * An array of heights for each item in `_physicalItems`\n   * @type {?Array<number>}\n   */\n  _physicalSizes: null,\n\n  /**\n   * A cached value for the first visible index.\n   * See `firstVisibleIndex`\n   * @type {?number}\n   */\n  _firstVisibleIndexVal: null,\n\n  /**\n   * A cached value for the last visible index.\n   * See `lastVisibleIndex`\n   * @type {?number}\n   */\n  _lastVisibleIndexVal: null,\n\n  /**\n   * The max number of pages to render. One page is equivalent to the height of\n   * the list.\n   */\n  _maxPages: 2,\n\n  /**\n   * The cost of stamping a template in ms.\n   */\n  _templateCost: 0,\n\n  /**\n   * The bottom of the physical content.\n   */\n  get _physicalBottom() {\n    return this._physicalTop + this._physicalSize;\n  },\n\n  /**\n   * The bottom of the scroll.\n   */\n  get _scrollBottom() {\n    return this._scrollPosition + this._viewportHeight;\n  },\n\n  /**\n   * The n-th item rendered in the last physical item.\n   */\n  get _virtualEnd() {\n    return this._virtualStart + this._physicalCount - 1;\n  },\n\n  /**\n   * The height of the physical content that isn't on the screen.\n   */\n  get _hiddenContentSize() {\n    return this._physicalSize - this._viewportHeight;\n  },\n\n  /**\n   * The maximum scroll top value.\n   */\n  get _maxScrollTop() {\n    return this._estScrollHeight - this._viewportHeight + this._scrollOffset;\n  },\n\n  /**\n   * The largest n-th value for an item such that it can be rendered in\n   * `_physicalStart`.\n   */\n  get _maxVirtualStart() {\n    const virtualCount = this._virtualCount;\n    return Math.max(0, virtualCount - this._physicalCount);\n  },\n\n  get _virtualStart() {\n    return this._virtualStartVal || 0;\n  },\n\n  set _virtualStart(val) {\n    val = this._clamp(val, 0, this._maxVirtualStart);\n    this._virtualStartVal = val;\n  },\n\n  get _physicalStart() {\n    return this._physicalStartVal || 0;\n  },\n\n  /**\n   * The k-th tile that is at the top of the scrolling list.\n   */\n  set _physicalStart(val) {\n    val %= this._physicalCount;\n    if (val < 0) {\n      val = this._physicalCount + val;\n    }\n    this._physicalStartVal = val;\n  },\n\n  /**\n   * The k-th tile that is at the bottom of the scrolling list.\n   */\n  get _physicalEnd() {\n    return (this._physicalStart + this._physicalCount - 1) % this._physicalCount;\n  },\n\n  get _physicalCount() {\n    return this._physicalCountVal || 0;\n  },\n\n  set _physicalCount(val) {\n    this._physicalCountVal = val;\n  },\n\n  /**\n   * An optimal physical size such that we will have enough physical items\n   * to fill up the viewport and recycle when the user scrolls.\n   *\n   * This default value assumes that we will at least have the equivalent\n   * to a viewport of physical items above and below the user's viewport.\n   */\n  get _optPhysicalSize() {\n    return this._viewportHeight === 0 ? Infinity : this._viewportHeight * this._maxPages;\n  },\n\n  /**\n   * True if the current list is visible.\n   */\n  get _isVisible() {\n    return Boolean(this.offsetWidth || this.offsetHeight);\n  },\n\n  /**\n   * Gets the index of the first visible item in the viewport.\n   *\n   * @type {number}\n   */\n  get firstVisibleIndex() {\n    let idx = this._firstVisibleIndexVal;\n    if (idx == null) {\n      let physicalOffset = this._physicalTop + this._scrollOffset;\n\n      idx =\n        this._iterateItems((pidx, vidx) => {\n          physicalOffset += this._getPhysicalSizeIncrement(pidx);\n\n          if (physicalOffset > this._scrollPosition) {\n            return vidx;\n          }\n        }) || 0;\n      this._firstVisibleIndexVal = idx;\n    }\n    return idx;\n  },\n\n  /**\n   * Gets the index of the last visible item in the viewport.\n   *\n   * @type {number}\n   */\n  get lastVisibleIndex() {\n    let idx = this._lastVisibleIndexVal;\n    if (idx == null) {\n      let physicalOffset = this._physicalTop + this._scrollOffset;\n      this._iterateItems((pidx, vidx) => {\n        if (physicalOffset < this._scrollBottom) {\n          idx = vidx;\n        }\n        physicalOffset += this._getPhysicalSizeIncrement(pidx);\n      });\n\n      this._lastVisibleIndexVal = idx;\n    }\n    return idx;\n  },\n\n  get _scrollOffset() {\n    return this._scrollerPaddingTop + this.scrollOffset;\n  },\n\n  /**\n   * Recycles the physical items when needed.\n   */\n  _scrollHandler() {\n    const scrollTop = Math.max(0, Math.min(this._maxScrollTop, this._scrollTop));\n    let delta = scrollTop - this._scrollPosition;\n    const isScrollingDown = delta >= 0;\n    // Track the current scroll position.\n    this._scrollPosition = scrollTop;\n    // Clear indexes for first and last visible indexes.\n    this._firstVisibleIndexVal = null;\n    this._lastVisibleIndexVal = null;\n    // Random access.\n    if (Math.abs(delta) > this._physicalSize && this._physicalSize > 0) {\n      delta -= this._scrollOffset;\n      const idxAdjustment = Math.round(delta / this._physicalAverage);\n      this._virtualStart += idxAdjustment;\n      this._physicalStart += idxAdjustment;\n      // Estimate new physical offset based on the virtual start index.\n      // adjusts the physical start position to stay in sync with the clamped\n      // virtual start index. It's critical not to let this value be\n      // more than the scroll position however, since that would result in\n      // the physical items not covering the viewport, and leading to\n      // _increasePoolIfNeeded to run away creating items to try to fill it.\n      this._physicalTop = Math.min(Math.floor(this._virtualStart) * this._physicalAverage, this._scrollPosition);\n      this._update();\n    } else if (this._physicalCount > 0) {\n      const reusables = this._getReusables(isScrollingDown);\n      if (isScrollingDown) {\n        this._physicalTop = reusables.physicalTop;\n        this._virtualStart += reusables.indexes.length;\n        this._physicalStart += reusables.indexes.length;\n      } else {\n        this._virtualStart -= reusables.indexes.length;\n        this._physicalStart -= reusables.indexes.length;\n      }\n      this._update(reusables.indexes, isScrollingDown ? null : reusables.indexes);\n      this._debounce('_increasePoolIfNeeded', this._increasePoolIfNeeded.bind(this, 0), microTask);\n    }\n  },\n\n  /**\n   * Returns an object that contains the indexes of the physical items\n   * that might be reused and the physicalTop.\n   *\n   * @param {boolean} fromTop If the potential reusable items are above the scrolling region.\n   */\n  _getReusables(fromTop) {\n    let ith, offsetContent, physicalItemHeight;\n    const idxs = [];\n    const protectedOffsetContent = this._hiddenContentSize * this._ratio;\n    const virtualStart = this._virtualStart;\n    const virtualEnd = this._virtualEnd;\n    const physicalCount = this._physicalCount;\n    let top = this._physicalTop + this._scrollOffset;\n    const bottom = this._physicalBottom + this._scrollOffset;\n    // This may be called outside of a scrollHandler, so use last cached position\n    const scrollTop = this._scrollPosition;\n    const scrollBottom = this._scrollBottom;\n\n    if (fromTop) {\n      ith = this._physicalStart;\n      offsetContent = scrollTop - top;\n    } else {\n      ith = this._physicalEnd;\n      offsetContent = bottom - scrollBottom;\n    }\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      physicalItemHeight = this._getPhysicalSizeIncrement(ith);\n      offsetContent -= physicalItemHeight;\n      if (idxs.length >= physicalCount || offsetContent <= protectedOffsetContent) {\n        break;\n      }\n      if (fromTop) {\n        // Check that index is within the valid range.\n        if (virtualEnd + idxs.length + 1 >= this._virtualCount) {\n          break;\n        }\n        // Check that the index is not visible.\n        if (top + physicalItemHeight >= scrollTop - this._scrollOffset) {\n          break;\n        }\n        idxs.push(ith);\n        top += physicalItemHeight;\n        ith = (ith + 1) % physicalCount;\n      } else {\n        // Check that index is within the valid range.\n        if (virtualStart - idxs.length <= 0) {\n          break;\n        }\n        // Check that the index is not visible.\n        if (top + this._physicalSize - physicalItemHeight <= scrollBottom) {\n          break;\n        }\n        idxs.push(ith);\n        top -= physicalItemHeight;\n        ith = ith === 0 ? physicalCount - 1 : ith - 1;\n      }\n    }\n    return { indexes: idxs, physicalTop: top - this._scrollOffset };\n  },\n\n  /**\n   * Update the list of items, starting from the `_virtualStart` item.\n   * @param {!Array<number>=} itemSet\n   * @param {!Array<number>=} movingUp\n   */\n  _update(itemSet, movingUp) {\n    if ((itemSet && itemSet.length === 0) || this._physicalCount === 0) {\n      return;\n    }\n    this._assignModels(itemSet);\n    this._updateMetrics(itemSet);\n    // Adjust offset after measuring.\n    if (movingUp) {\n      while (movingUp.length) {\n        const idx = movingUp.pop();\n        this._physicalTop -= this._getPhysicalSizeIncrement(idx);\n      }\n    }\n    this._positionItems();\n    this._updateScrollerSize();\n  },\n\n  _isClientFull() {\n    return (\n      this._scrollBottom !== 0 &&\n      this._physicalBottom - 1 >= this._scrollBottom &&\n      this._physicalTop <= this._scrollPosition\n    );\n  },\n\n  /**\n   * Increases the pool size.\n   */\n  _increasePoolIfNeeded(count) {\n    const nextPhysicalCount = this._clamp(\n      this._physicalCount + count,\n      DEFAULT_PHYSICAL_COUNT,\n      this._virtualCount - this._virtualStart,\n    );\n    const delta = nextPhysicalCount - this._physicalCount;\n    let nextIncrease = Math.round(this._physicalCount * 0.5);\n\n    if (delta < 0) {\n      return;\n    }\n    if (delta > 0) {\n      const ts = window.performance.now();\n      // Concat arrays in place.\n      [].push.apply(this._physicalItems, this._createPool(delta));\n      // Push 0s into physicalSizes. Can't use Array.fill because IE11 doesn't\n      // support it.\n      for (let i = 0; i < delta; i++) {\n        this._physicalSizes.push(0);\n      }\n      this._physicalCount += delta;\n      // Update the physical start if it needs to preserve the model of the\n      // focused item. In this situation, the focused item is currently rendered\n      // and its model would have changed after increasing the pool if the\n      // physical start remained unchanged.\n      if (\n        this._physicalStart > this._physicalEnd &&\n        this._isIndexRendered(this._focusedVirtualIndex) &&\n        this._getPhysicalIndex(this._focusedVirtualIndex) < this._physicalEnd\n      ) {\n        this._physicalStart += delta;\n      }\n      this._update();\n      this._templateCost = (window.performance.now() - ts) / delta;\n      nextIncrease = Math.round(this._physicalCount * 0.5);\n    }\n    if (this._virtualEnd >= this._virtualCount - 1 || nextIncrease === 0) {\n      // Do nothing.\n    } else if (!this._isClientFull()) {\n      this._debounce('_increasePoolIfNeeded', this._increasePoolIfNeeded.bind(this, nextIncrease), microTask);\n    } else if (this._physicalSize < this._optPhysicalSize) {\n      // Yield and increase the pool during idle time until the physical size is\n      // optimal.\n      this._debounce(\n        '_increasePoolIfNeeded',\n        this._increasePoolIfNeeded.bind(this, this._clamp(Math.round(50 / this._templateCost), 1, nextIncrease)),\n        idlePeriod,\n      );\n    }\n  },\n\n  /**\n   * Renders the a new list.\n   */\n  _render() {\n    if (!this.isAttached || !this._isVisible) {\n      return;\n    }\n    if (this._physicalCount !== 0) {\n      const reusables = this._getReusables(true);\n      this._physicalTop = reusables.physicalTop;\n      this._virtualStart += reusables.indexes.length;\n      this._physicalStart += reusables.indexes.length;\n      this._update(reusables.indexes);\n      this._update();\n      this._increasePoolIfNeeded(0);\n    } else if (this._virtualCount > 0) {\n      // Initial render\n      this.updateViewportBoundaries();\n      this._increasePoolIfNeeded(DEFAULT_PHYSICAL_COUNT);\n    }\n  },\n\n  /**\n   * Called when the items have changed. That is, reassignments\n   * to `items`, splices or updates to a single item.\n   */\n  _itemsChanged(change) {\n    if (change.path === 'items') {\n      this._virtualStart = 0;\n      this._physicalTop = 0;\n      this._virtualCount = this.items ? this.items.length : 0;\n      this._physicalIndexForKey = {};\n      this._firstVisibleIndexVal = null;\n      this._lastVisibleIndexVal = null;\n      this._physicalCount = this._physicalCount || 0;\n      this._physicalItems = this._physicalItems || [];\n      this._physicalSizes = this._physicalSizes || [];\n      this._physicalStart = 0;\n      if (this._scrollTop > this._scrollOffset) {\n        this._resetScrollPosition(0);\n      }\n      this._debounce('_render', this._render, animationFrame);\n    }\n  },\n\n  /**\n   * Executes a provided function per every physical index in `itemSet`\n   * `itemSet` default value is equivalent to the entire set of physical\n   * indexes.\n   *\n   * @param {!function(number, number)} fn\n   * @param {!Array<number>=} itemSet\n   */\n  _iterateItems(fn, itemSet) {\n    let pidx, vidx, rtn, i;\n\n    if (arguments.length === 2 && itemSet) {\n      for (i = 0; i < itemSet.length; i++) {\n        pidx = itemSet[i];\n        vidx = this._computeVidx(pidx);\n        if ((rtn = fn.call(this, pidx, vidx)) != null) {\n          return rtn;\n        }\n      }\n    } else {\n      pidx = this._physicalStart;\n      vidx = this._virtualStart;\n      for (; pidx < this._physicalCount; pidx++, vidx++) {\n        if ((rtn = fn.call(this, pidx, vidx)) != null) {\n          return rtn;\n        }\n      }\n      for (pidx = 0; pidx < this._physicalStart; pidx++, vidx++) {\n        if ((rtn = fn.call(this, pidx, vidx)) != null) {\n          return rtn;\n        }\n      }\n    }\n  },\n\n  /**\n   * Returns the virtual index for a given physical index\n   *\n   * @param {number} pidx Physical index\n   * @return {number}\n   */\n  _computeVidx(pidx) {\n    if (pidx >= this._physicalStart) {\n      return this._virtualStart + (pidx - this._physicalStart);\n    }\n    return this._virtualStart + (this._physicalCount - this._physicalStart) + pidx;\n  },\n\n  /**\n   * Updates the position of the physical items.\n   */\n  _positionItems() {\n    this._adjustScrollPosition();\n\n    let y = this._physicalTop;\n\n    this._iterateItems((pidx) => {\n      this.translate3d(0, `${y}px`, 0, this._physicalItems[pidx]);\n      y += this._physicalSizes[pidx];\n    });\n  },\n\n  _getPhysicalSizeIncrement(pidx) {\n    return this._physicalSizes[pidx];\n  },\n\n  /**\n   * Adjusts the scroll position when it was overestimated.\n   */\n  _adjustScrollPosition() {\n    const deltaHeight =\n      this._virtualStart === 0 ? this._physicalTop : Math.min(this._scrollPosition + this._physicalTop, 0);\n    // Note: the delta can be positive or negative.\n    if (deltaHeight !== 0) {\n      this._physicalTop -= deltaHeight;\n      // This may be called outside of a scrollHandler, so use last cached position\n      const scrollTop = this._scrollPosition;\n      // Juking scroll position during interial scrolling on iOS is no bueno\n      if (!IOS_TOUCH_SCROLLING && scrollTop > 0) {\n        this._resetScrollPosition(scrollTop - deltaHeight);\n      }\n    }\n  },\n\n  /**\n   * Sets the position of the scroll.\n   */\n  _resetScrollPosition(pos) {\n    if (this.scrollTarget && pos >= 0) {\n      this._scrollTop = pos;\n      this._scrollPosition = this._scrollTop;\n    }\n  },\n\n  /**\n   * Sets the scroll height, that's the height of the content,\n   *\n   * @param {boolean=} forceUpdate If true, updates the height no matter what.\n   */\n  _updateScrollerSize(forceUpdate) {\n    this._estScrollHeight =\n      this._physicalBottom +\n      Math.max(this._virtualCount - this._physicalCount - this._virtualStart, 0) * this._physicalAverage;\n\n    forceUpdate = forceUpdate || this._scrollHeight === 0;\n    forceUpdate = forceUpdate || this._scrollPosition >= this._estScrollHeight - this._physicalSize;\n    // Amortize height adjustment, so it won't trigger large repaints too often.\n    if (forceUpdate || Math.abs(this._estScrollHeight - this._scrollHeight) >= this._viewportHeight) {\n      this.$.items.style.height = `${this._estScrollHeight}px`;\n      this._scrollHeight = this._estScrollHeight;\n    }\n  },\n\n  /**\n   * Scroll to a specific index in the virtual list regardless\n   * of the physical items in the DOM tree.\n   *\n   * @method scrollToIndex\n   * @param {number} idx The index of the item\n   */\n  scrollToIndex(idx) {\n    if (typeof idx !== 'number' || idx < 0 || idx > this.items.length - 1) {\n      return;\n    }\n    flush();\n    // Items should have been rendered prior scrolling to an index.\n    if (this._physicalCount === 0) {\n      return;\n    }\n    idx = this._clamp(idx, 0, this._virtualCount - 1);\n    // Update the virtual start only when needed.\n    if (!this._isIndexRendered(idx) || idx >= this._maxVirtualStart) {\n      this._virtualStart = idx - 1;\n    }\n    this._assignModels();\n    this._updateMetrics();\n    // Estimate new physical offset.\n    this._physicalTop = this._virtualStart * this._physicalAverage;\n\n    let currentTopItem = this._physicalStart;\n    let currentVirtualItem = this._virtualStart;\n    let targetOffsetTop = 0;\n    const hiddenContentSize = this._hiddenContentSize;\n    // Scroll to the item as much as we can.\n    while (currentVirtualItem < idx && targetOffsetTop <= hiddenContentSize) {\n      targetOffsetTop += this._getPhysicalSizeIncrement(currentTopItem);\n      currentTopItem = (currentTopItem + 1) % this._physicalCount;\n      currentVirtualItem += 1;\n    }\n    this._updateScrollerSize(true);\n    this._positionItems();\n    this._resetScrollPosition(this._physicalTop + this._scrollOffset + targetOffsetTop);\n    this._increasePoolIfNeeded(0);\n    // Clear cached visible index.\n    this._firstVisibleIndexVal = null;\n    this._lastVisibleIndexVal = null;\n  },\n\n  /**\n   * Reset the physical average and the average count.\n   */\n  _resetAverage() {\n    this._physicalAverage = 0;\n    this._physicalAverageCount = 0;\n  },\n\n  /**\n   * A handler for the `iron-resize` event triggered by `IronResizableBehavior`\n   * when the element is resized.\n   */\n  _resizeHandler() {\n    this._debounce(\n      '_render',\n      () => {\n        // Clear cached visible index.\n        this._firstVisibleIndexVal = null;\n        this._lastVisibleIndexVal = null;\n        if (this._isVisible) {\n          this.updateViewportBoundaries();\n          // Reinstall the scroll event listener.\n          this.toggleScrollListener(true);\n          this._resetAverage();\n          this._render();\n        } else {\n          // Uninstall the scroll event listener.\n          this.toggleScrollListener(false);\n        }\n      },\n      animationFrame,\n    );\n  },\n\n  _isIndexRendered(idx) {\n    return idx >= this._virtualStart && idx <= this._virtualEnd;\n  },\n\n  _getPhysicalIndex(vidx) {\n    return (this._physicalStart + (vidx - this._virtualStart)) % this._physicalCount;\n  },\n\n  _clamp(v, min, max) {\n    return Math.min(max, Math.max(min, v));\n  },\n\n  _debounce(name, cb, asyncModule) {\n    this._debouncers = this._debouncers || {};\n    this._debouncers[name] = Debouncer.debounce(this._debouncers[name], asyncModule, cb.bind(this));\n    enqueueDebouncer(this._debouncers[name]);\n  },\n};\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { animationFrame, timeOut } from './async.js';\nimport { isSafari } from './browser-utils.js';\nimport { Debouncer, flush } from './debounce.js';\nimport { ironList } from './iron-list-core.js';\n\n// Iron-list can by default handle sizes up to around 100000.\n// When the size is larger than MAX_VIRTUAL_COUNT _vidxOffset is used\nconst MAX_VIRTUAL_COUNT = 100000;\nconst OFFSET_ADJUST_MIN_THRESHOLD = 1000;\n\nexport class IronListAdapter {\n  constructor({ createElements, updateElement, scrollTarget, scrollContainer, elementsContainer, reorderElements }) {\n    this.isAttached = true;\n    this._vidxOffset = 0;\n    this.createElements = createElements;\n    this.updateElement = updateElement;\n    this.scrollTarget = scrollTarget;\n    this.scrollContainer = scrollContainer;\n    this.elementsContainer = elementsContainer || scrollContainer;\n    this.reorderElements = reorderElements;\n    // Iron-list uses this value to determine how many pages of elements to render\n    this._maxPages = 1.3;\n\n    // Placeholder height (used for sizing elements that have intrinsic 0 height after update)\n    this.__placeholderHeight = 200;\n    // A queue of 10 previous element heights\n    this.__elementHeightQueue = Array(10);\n\n    this.timeouts = {\n      SCROLL_REORDER: 500,\n      IGNORE_WHEEL: 500,\n      FIX_INVALID_ITEM_POSITIONING: 100,\n    };\n\n    this.__resizeObserver = new ResizeObserver(() => this._resizeHandler());\n\n    if (getComputedStyle(this.scrollTarget).overflow === 'visible') {\n      this.scrollTarget.style.overflow = 'auto';\n    }\n\n    if (getComputedStyle(this.scrollContainer).position === 'static') {\n      this.scrollContainer.style.position = 'relative';\n    }\n\n    this.__resizeObserver.observe(this.scrollTarget);\n    this.scrollTarget.addEventListener('scroll', () => this._scrollHandler());\n\n    this._scrollLineHeight = this._getScrollLineHeight();\n    this.scrollTarget.addEventListener('wheel', (e) => this.__onWheel(e));\n\n    if (this.reorderElements) {\n      // Reordering the physical elements cancels the user's grab of the scroll bar handle on Safari.\n      // Need to defer reordering until the user lets go of the scroll bar handle.\n      this.scrollTarget.addEventListener('mousedown', () => {\n        this.__mouseDown = true;\n      });\n      this.scrollTarget.addEventListener('mouseup', () => {\n        this.__mouseDown = false;\n        if (this.__pendingReorder) {\n          this.__reorderElements();\n        }\n      });\n    }\n  }\n\n  get scrollOffset() {\n    return 0;\n  }\n\n  get adjustedFirstVisibleIndex() {\n    return this.firstVisibleIndex + this._vidxOffset;\n  }\n\n  get adjustedLastVisibleIndex() {\n    return this.lastVisibleIndex + this._vidxOffset;\n  }\n\n  scrollToIndex(index) {\n    if (typeof index !== 'number' || isNaN(index) || this.size === 0 || !this.scrollTarget.offsetHeight) {\n      return;\n    }\n    index = this._clamp(index, 0, this.size - 1);\n\n    const visibleElementCount = this.__getVisibleElements().length;\n    let targetVirtualIndex = Math.floor((index / this.size) * this._virtualCount);\n    if (this._virtualCount - targetVirtualIndex < visibleElementCount) {\n      targetVirtualIndex = this._virtualCount - (this.size - index);\n      this._vidxOffset = this.size - this._virtualCount;\n    } else if (targetVirtualIndex < visibleElementCount) {\n      if (index < OFFSET_ADJUST_MIN_THRESHOLD) {\n        targetVirtualIndex = index;\n        this._vidxOffset = 0;\n      } else {\n        targetVirtualIndex = OFFSET_ADJUST_MIN_THRESHOLD;\n        this._vidxOffset = index - targetVirtualIndex;\n      }\n    } else {\n      this._vidxOffset = index - targetVirtualIndex;\n    }\n\n    this.__skipNextVirtualIndexAdjust = true;\n    super.scrollToIndex(targetVirtualIndex);\n\n    if (this.adjustedFirstVisibleIndex !== index && this._scrollTop < this._maxScrollTop && !this.grid) {\n      // Workaround an iron-list issue by manually adjusting the scroll position\n      this._scrollTop -= this.__getIndexScrollOffset(index) || 0;\n    }\n    this._scrollHandler();\n  }\n\n  flush() {\n    // The scroll target is hidden.\n    if (this.scrollTarget.offsetHeight === 0) {\n      return;\n    }\n\n    this._resizeHandler();\n    flush();\n    this._scrollHandler();\n    if (this.__fixInvalidItemPositioningDebouncer) {\n      this.__fixInvalidItemPositioningDebouncer.flush();\n    }\n    if (this.__scrollReorderDebouncer) {\n      this.__scrollReorderDebouncer.flush();\n    }\n    if (this.__debouncerWheelAnimationFrame) {\n      this.__debouncerWheelAnimationFrame.flush();\n    }\n  }\n\n  update(startIndex = 0, endIndex = this.size - 1) {\n    this.__getVisibleElements().forEach((el) => {\n      if (el.__virtualIndex >= startIndex && el.__virtualIndex <= endIndex) {\n        this.__updateElement(el, el.__virtualIndex, true);\n      }\n    });\n  }\n\n  /**\n   * Updates the height for a given set of items.\n   *\n   * @param {!Array<number>=} itemSet\n   */\n  _updateMetrics(itemSet) {\n    // Make sure we distributed all the physical items\n    // so we can measure them.\n    flush();\n\n    let newPhysicalSize = 0;\n    let oldPhysicalSize = 0;\n    const prevAvgCount = this._physicalAverageCount;\n    const prevPhysicalAvg = this._physicalAverage;\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    this._iterateItems((pidx, vidx) => {\n      oldPhysicalSize += this._physicalSizes[pidx];\n      this._physicalSizes[pidx] = Math.ceil(this.__getBorderBoxHeight(this._physicalItems[pidx]));\n      newPhysicalSize += this._physicalSizes[pidx];\n      this._physicalAverageCount += this._physicalSizes[pidx] ? 1 : 0;\n    }, itemSet);\n\n    this._physicalSize = this._physicalSize + newPhysicalSize - oldPhysicalSize;\n\n    // Update the average if it measured something.\n    if (this._physicalAverageCount !== prevAvgCount) {\n      this._physicalAverage = Math.round(\n        (prevPhysicalAvg * prevAvgCount + newPhysicalSize) / this._physicalAverageCount,\n      );\n    }\n  }\n\n  __getBorderBoxHeight(el) {\n    const style = getComputedStyle(el);\n\n    const itemHeight = parseFloat(style.height) || 0;\n\n    if (style.boxSizing === 'border-box') {\n      return itemHeight;\n    }\n\n    const paddingBottom = parseFloat(style.paddingBottom) || 0;\n    const paddingTop = parseFloat(style.paddingTop) || 0;\n    const borderBottomWidth = parseFloat(style.borderBottomWidth) || 0;\n    const borderTopWidth = parseFloat(style.borderTopWidth) || 0;\n\n    return itemHeight + paddingBottom + paddingTop + borderBottomWidth + borderTopWidth;\n  }\n\n  __updateElement(el, index, forceSameIndexUpdates) {\n    // Clean up temporary placeholder sizing\n    if (el.style.paddingTop) {\n      el.style.paddingTop = '';\n    }\n\n    if (!this.__preventElementUpdates && (el.__lastUpdatedIndex !== index || forceSameIndexUpdates)) {\n      this.updateElement(el, index);\n      el.__lastUpdatedIndex = index;\n    }\n\n    const elementHeight = el.offsetHeight;\n    if (elementHeight === 0) {\n      // If the elements have 0 height after update (for example due to lazy rendering),\n      // it results in iron-list requesting to create an unlimited count of elements.\n      // Assign a temporary placeholder sizing to elements that would otherwise end up having\n      // no height.\n      el.style.paddingTop = `${this.__placeholderHeight}px`;\n\n      // Manually schedule the resize handler to make sure the placeholder padding is\n      // cleared in case the resize observer never triggers.\n      requestAnimationFrame(() => this._resizeHandler());\n    } else {\n      // Add element height to the queue\n      this.__elementHeightQueue.push(elementHeight);\n      this.__elementHeightQueue.shift();\n\n      // Calcualte new placeholder height based on the average of the defined values in the\n      // element height queue\n      const filteredHeights = this.__elementHeightQueue.filter((h) => h !== undefined);\n      this.__placeholderHeight = Math.round(filteredHeights.reduce((a, b) => a + b, 0) / filteredHeights.length);\n    }\n  }\n\n  __getIndexScrollOffset(index) {\n    const element = this.__getVisibleElements().find((el) => el.__virtualIndex === index);\n    return element ? this.scrollTarget.getBoundingClientRect().top - element.getBoundingClientRect().top : undefined;\n  }\n\n  get size() {\n    return this.__size;\n  }\n\n  set size(size) {\n    if (size === this.size) {\n      return;\n    }\n    // Cancel active debouncers\n    if (this.__fixInvalidItemPositioningDebouncer) {\n      this.__fixInvalidItemPositioningDebouncer.cancel();\n    }\n    if (this._debouncers && this._debouncers._increasePoolIfNeeded) {\n      // Avoid creating unnecessary elements on the following flush()\n      this._debouncers._increasePoolIfNeeded.cancel();\n    }\n\n    // Prevent element update while the scroll position is being restored\n    this.__preventElementUpdates = true;\n\n    // Record the scroll position before changing the size\n    let fvi; // First visible index\n    let fviOffsetBefore; // Scroll offset of the first visible index\n    if (size > 0) {\n      fvi = this.adjustedFirstVisibleIndex;\n      fviOffsetBefore = this.__getIndexScrollOffset(fvi);\n    }\n\n    // Change the size\n    this.__size = size;\n\n    this._itemsChanged({\n      path: 'items',\n    });\n    flush();\n\n    // Try to restore the scroll position if the new size is larger than 0\n    if (size > 0) {\n      fvi = Math.min(fvi, size - 1);\n      this.scrollToIndex(fvi);\n\n      const fviOffsetAfter = this.__getIndexScrollOffset(fvi);\n      if (fviOffsetBefore !== undefined && fviOffsetAfter !== undefined) {\n        this._scrollTop += fviOffsetBefore - fviOffsetAfter;\n      }\n    }\n\n    if (!this.elementsContainer.children.length) {\n      requestAnimationFrame(() => this._resizeHandler());\n    }\n\n    this.__preventElementUpdates = false;\n    // Schedule and flush a resize handler\n    this._resizeHandler();\n    flush();\n  }\n\n  /** @private */\n  get _scrollTop() {\n    return this.scrollTarget.scrollTop;\n  }\n\n  /** @private */\n  set _scrollTop(top) {\n    this.scrollTarget.scrollTop = top;\n  }\n\n  /** @private */\n  get items() {\n    return {\n      length: Math.min(this.size, MAX_VIRTUAL_COUNT),\n    };\n  }\n\n  /** @private */\n  get offsetHeight() {\n    return this.scrollTarget.offsetHeight;\n  }\n\n  /** @private */\n  get $() {\n    return {\n      items: this.scrollContainer,\n    };\n  }\n\n  /** @private */\n  updateViewportBoundaries() {\n    const styles = window.getComputedStyle(this.scrollTarget);\n    this._scrollerPaddingTop = this.scrollTarget === this ? 0 : parseInt(styles['padding-top'], 10);\n    this._isRTL = Boolean(styles.direction === 'rtl');\n    this._viewportWidth = this.elementsContainer.offsetWidth;\n    this._viewportHeight = this.scrollTarget.offsetHeight;\n    this._scrollPageHeight = this._viewportHeight - this._scrollLineHeight;\n    if (this.grid) {\n      this._updateGridMetrics();\n    }\n  }\n\n  /** @private */\n  setAttribute() {}\n\n  /** @private */\n  _createPool(size) {\n    const physicalItems = this.createElements(size);\n    const fragment = document.createDocumentFragment();\n    physicalItems.forEach((el) => {\n      el.style.position = 'absolute';\n      fragment.appendChild(el);\n      this.__resizeObserver.observe(el);\n    });\n    this.elementsContainer.appendChild(fragment);\n    return physicalItems;\n  }\n\n  /** @private */\n  _assignModels(itemSet) {\n    this._iterateItems((pidx, vidx) => {\n      const el = this._physicalItems[pidx];\n      el.hidden = vidx >= this.size;\n      if (!el.hidden) {\n        el.__virtualIndex = vidx + (this._vidxOffset || 0);\n        this.__updateElement(el, el.__virtualIndex);\n      } else {\n        delete el.__lastUpdatedIndex;\n      }\n    }, itemSet);\n  }\n\n  /** @private */\n  _isClientFull() {\n    // Workaround an issue in iron-list that can cause it to freeze on fast scroll\n    setTimeout(() => {\n      this.__clientFull = true;\n    });\n    return this.__clientFull || super._isClientFull();\n  }\n\n  /** @private */\n  translate3d(_x, y, _z, el) {\n    el.style.transform = `translateY(${y})`;\n  }\n\n  /** @private */\n  toggleScrollListener() {}\n\n  _scrollHandler() {\n    // The scroll target is hidden.\n    if (this.scrollTarget.offsetHeight === 0) {\n      return;\n    }\n\n    this._adjustVirtualIndexOffset(this._scrollTop - (this.__previousScrollTop || 0));\n    const delta = this.scrollTarget.scrollTop - this._scrollPosition;\n\n    super._scrollHandler();\n\n    if (this._physicalCount !== 0) {\n      const isScrollingDown = delta >= 0;\n      const reusables = this._getReusables(!isScrollingDown);\n\n      if (reusables.indexes.length) {\n        // After running super._scrollHandler, fix internal properties to workaround an iron-list issue.\n        // See https://github.com/vaadin/web-components/issues/1691\n        this._physicalTop = reusables.physicalTop;\n\n        if (isScrollingDown) {\n          this._virtualStart -= reusables.indexes.length;\n          this._physicalStart -= reusables.indexes.length;\n        } else {\n          this._virtualStart += reusables.indexes.length;\n          this._physicalStart += reusables.indexes.length;\n        }\n        this._resizeHandler();\n      }\n    }\n\n    if (delta) {\n      // There was a change in scroll top. Schedule a check for invalid item positioning.\n      this.__fixInvalidItemPositioningDebouncer = Debouncer.debounce(\n        this.__fixInvalidItemPositioningDebouncer,\n        timeOut.after(this.timeouts.FIX_INVALID_ITEM_POSITIONING),\n        () => this.__fixInvalidItemPositioning(),\n      );\n    }\n\n    if (this.reorderElements) {\n      this.__scrollReorderDebouncer = Debouncer.debounce(\n        this.__scrollReorderDebouncer,\n        timeOut.after(this.timeouts.SCROLL_REORDER),\n        () => this.__reorderElements(),\n      );\n    }\n\n    this.__previousScrollTop = this._scrollTop;\n\n    // If the first visible index is not 0 when scrolled to the top,\n    // scroll to index 0 to fix the issue.\n    if (this._scrollTop === 0 && this.firstVisibleIndex !== 0 && Math.abs(delta) > 0) {\n      this.scrollToIndex(0);\n    }\n  }\n\n  /**\n   * Work around an iron-list issue with invalid item positioning.\n   * See https://github.com/vaadin/flow-components/issues/4306\n   * @private\n   */\n  __fixInvalidItemPositioning() {\n    if (!this.scrollTarget.isConnected) {\n      return;\n    }\n\n    // Check if the first physical item element is below the top of the viewport\n    const physicalTopBelowTop = this._physicalTop > this._scrollTop;\n    // Check if the last physical item element is above the bottom of the viewport\n    const physicalBottomAboveBottom = this._physicalBottom < this._scrollBottom;\n\n    // Check if the first index is visible\n    const firstIndexVisible = this.adjustedFirstVisibleIndex === 0;\n    // Check if the last index is visible\n    const lastIndexVisible = this.adjustedLastVisibleIndex === this.size - 1;\n\n    if ((physicalTopBelowTop && !firstIndexVisible) || (physicalBottomAboveBottom && !lastIndexVisible)) {\n      // Invalid state! Try to recover.\n\n      const isScrollingDown = physicalBottomAboveBottom;\n      // Set the \"_ratio\" property temporarily to 0 to make iron-list's _getReusables\n      // place all the free physical items on one side of the viewport.\n      const originalRatio = this._ratio;\n      this._ratio = 0;\n      // Fake a scroll change to make _scrollHandler place the physical items\n      // on the desired side.\n      this._scrollPosition = this._scrollTop + (isScrollingDown ? -1 : 1);\n      this._scrollHandler();\n      // Restore the original \"_ratio\" value.\n      this._ratio = originalRatio;\n    }\n  }\n\n  /** @private */\n  __onWheel(e) {\n    if (e.ctrlKey || this._hasScrolledAncestor(e.target, e.deltaX, e.deltaY)) {\n      return;\n    }\n\n    let deltaY = e.deltaY;\n    if (e.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n      // Scrolling by \"lines of text\" instead of pixels\n      deltaY *= this._scrollLineHeight;\n    } else if (e.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      // Scrolling by \"pages\" instead of pixels\n      deltaY *= this._scrollPageHeight;\n    }\n\n    this._deltaYAcc = this._deltaYAcc || 0;\n\n    if (this._wheelAnimationFrame) {\n      // Accumulate wheel delta while a frame is being processed\n      this._deltaYAcc += deltaY;\n      e.preventDefault();\n      return;\n    }\n\n    deltaY += this._deltaYAcc;\n    this._deltaYAcc = 0;\n\n    this._wheelAnimationFrame = true;\n    this.__debouncerWheelAnimationFrame = Debouncer.debounce(\n      this.__debouncerWheelAnimationFrame,\n      animationFrame,\n      () => {\n        this._wheelAnimationFrame = false;\n      },\n    );\n\n    const momentum = Math.abs(e.deltaX) + Math.abs(deltaY);\n\n    if (this._canScroll(this.scrollTarget, e.deltaX, deltaY)) {\n      e.preventDefault();\n      this.scrollTarget.scrollTop += deltaY;\n      this.scrollTarget.scrollLeft += e.deltaX;\n\n      this._hasResidualMomentum = true;\n\n      this._ignoreNewWheel = true;\n      this._debouncerIgnoreNewWheel = Debouncer.debounce(\n        this._debouncerIgnoreNewWheel,\n        timeOut.after(this.timeouts.IGNORE_WHEEL),\n        () => {\n          this._ignoreNewWheel = false;\n        },\n      );\n    } else if ((this._hasResidualMomentum && momentum <= this._previousMomentum) || this._ignoreNewWheel) {\n      e.preventDefault();\n    } else if (momentum > this._previousMomentum) {\n      this._hasResidualMomentum = false;\n    }\n    this._previousMomentum = momentum;\n  }\n\n  /**\n   * Determines if the element has an ancestor that handles the scroll delta prior to this\n   *\n   * @private\n   */\n  _hasScrolledAncestor(el, deltaX, deltaY) {\n    if (el === this.scrollTarget || el === this.scrollTarget.getRootNode().host) {\n      return false;\n    } else if (\n      this._canScroll(el, deltaX, deltaY) &&\n      ['auto', 'scroll'].indexOf(getComputedStyle(el).overflow) !== -1\n    ) {\n      return true;\n    } else if (el !== this && el.parentElement) {\n      return this._hasScrolledAncestor(el.parentElement, deltaX, deltaY);\n    }\n  }\n\n  _canScroll(el, deltaX, deltaY) {\n    return (\n      (deltaY > 0 && el.scrollTop < el.scrollHeight - el.offsetHeight) ||\n      (deltaY < 0 && el.scrollTop > 0) ||\n      (deltaX > 0 && el.scrollLeft < el.scrollWidth - el.offsetWidth) ||\n      (deltaX < 0 && el.scrollLeft > 0)\n    );\n  }\n\n  /**\n   * An optimal physical size such that we will have enough physical items\n   * to fill up the viewport and recycle when the user scrolls.\n   *\n   * This default value assumes that we will at least have the equivalent\n   * to a viewport of physical items above and below the user's viewport.\n   * @override\n   */\n  get _optPhysicalSize() {\n    const optPhysicalSize = super._optPhysicalSize;\n    // No need to adjust\n    if (optPhysicalSize <= 0) {\n      return optPhysicalSize;\n    }\n    // Item height buffer accounts for the cases where some items are much larger than the average.\n    // This can lead to some items not being rendered and leaving empty space in the viewport.\n    // https://github.com/vaadin/flow-components/issues/6651\n    return optPhysicalSize + this.__getItemHeightBuffer();\n  }\n\n  /**\n   * Extra item height buffer used when calculating optimal physical size.\n   *\n   * The iron list core uses the optimal physical size when determining whether to increase the item pool.\n   * For the cases where some items are much larger than the average, the iron list core might not increase item pool.\n   * This can lead to the large item not being rendered.\n   *\n   * @returns {Number} - Extra item height buffer\n   * @private\n   */\n  __getItemHeightBuffer() {\n    // No need for a buffer with no items\n    if (this._physicalCount === 0) {\n      return 0;\n    }\n    // The regular buffer zone height for either top or bottom\n    const bufferZoneHeight = Math.ceil((this._viewportHeight * (this._maxPages - 1)) / 2);\n    // The maximum height of the currently rendered items\n    const maxItemHeight = Math.max(...this._physicalSizes);\n    // Only add buffer if the item is larger that the other items\n    if (maxItemHeight > Math.min(...this._physicalSizes)) {\n      // Add a buffer height since the large item can still be in the viewport and out of the original buffer\n      return Math.max(0, maxItemHeight - bufferZoneHeight);\n    }\n    return 0;\n  }\n\n  /**\n   * @returns {Number|undefined} - The browser's default font-size in pixels\n   * @private\n   */\n  _getScrollLineHeight() {\n    const el = document.createElement('div');\n    el.style.fontSize = 'initial';\n    el.style.display = 'none';\n    document.body.appendChild(el);\n    const fontSize = window.getComputedStyle(el).fontSize;\n    document.body.removeChild(el);\n    return fontSize ? window.parseInt(fontSize) : undefined;\n  }\n\n  __getVisibleElements() {\n    return Array.from(this.elementsContainer.children).filter((element) => !element.hidden);\n  }\n\n  /** @private */\n  __reorderElements() {\n    if (this.__mouseDown) {\n      this.__pendingReorder = true;\n      return;\n    }\n    this.__pendingReorder = false;\n\n    const adjustedVirtualStart = this._virtualStart + (this._vidxOffset || 0);\n\n    // Which row to use as a target?\n    const visibleElements = this.__getVisibleElements();\n\n    const elementWithFocus = visibleElements.find(\n      (element) =>\n        element.contains(this.elementsContainer.getRootNode().activeElement) ||\n        element.contains(this.scrollTarget.getRootNode().activeElement),\n    );\n    const targetElement = elementWithFocus || visibleElements[0];\n    if (!targetElement) {\n      // All elements are hidden, don't reorder\n      return;\n    }\n\n    // Where the target row should be?\n    const targetPhysicalIndex = targetElement.__virtualIndex - adjustedVirtualStart;\n\n    // Reodrer the DOM elements to keep the target row at the target physical index\n    const delta = visibleElements.indexOf(targetElement) - targetPhysicalIndex;\n    if (delta > 0) {\n      for (let i = 0; i < delta; i++) {\n        this.elementsContainer.appendChild(visibleElements[i]);\n      }\n    } else if (delta < 0) {\n      for (let i = visibleElements.length + delta; i < visibleElements.length; i++) {\n        this.elementsContainer.insertBefore(visibleElements[i], visibleElements[0]);\n      }\n    }\n\n    // Due to a rendering bug, reordering the rows can make parts of the scroll target disappear\n    // on Safari when using sticky positioning in case the scroll target is inside a flexbox.\n    // This issue manifests with grid (the header can disappear if grid is used inside a flexbox)\n    if (isSafari) {\n      const { transform } = this.scrollTarget.style;\n      this.scrollTarget.style.transform = 'translateZ(0)';\n      setTimeout(() => {\n        this.scrollTarget.style.transform = transform;\n      });\n    }\n  }\n\n  /** @private */\n  _adjustVirtualIndexOffset(delta) {\n    if (this._virtualCount >= this.size) {\n      this._vidxOffset = 0;\n    } else if (this.__skipNextVirtualIndexAdjust) {\n      this.__skipNextVirtualIndexAdjust = false;\n    } else if (Math.abs(delta) > 10000) {\n      // Process a large scroll position change\n      const scale = this._scrollTop / (this.scrollTarget.scrollHeight - this.scrollTarget.offsetHeight);\n      const offset = scale * this.size;\n      this._vidxOffset = Math.round(offset - scale * this._virtualCount);\n    } else {\n      // Make sure user can always swipe/wheel scroll to the start and end\n      const oldOffset = this._vidxOffset;\n      const threshold = OFFSET_ADJUST_MIN_THRESHOLD;\n      const maxShift = 100;\n\n      // Near start\n      if (this._scrollTop === 0) {\n        this._vidxOffset = 0;\n        if (oldOffset !== this._vidxOffset) {\n          super.scrollToIndex(0);\n        }\n      } else if (this.firstVisibleIndex < threshold && this._vidxOffset > 0) {\n        this._vidxOffset -= Math.min(this._vidxOffset, maxShift);\n        super.scrollToIndex(this.firstVisibleIndex + (oldOffset - this._vidxOffset));\n      }\n\n      // Near end\n      const maxOffset = this.size - this._virtualCount;\n      if (this._scrollTop >= this._maxScrollTop && this._maxScrollTop > 0) {\n        this._vidxOffset = maxOffset;\n        if (oldOffset !== this._vidxOffset) {\n          super.scrollToIndex(this._virtualCount - 1);\n        }\n      } else if (this.firstVisibleIndex > this._virtualCount - threshold && this._vidxOffset < maxOffset) {\n        this._vidxOffset += Math.min(maxOffset - this._vidxOffset, maxShift);\n        super.scrollToIndex(this.firstVisibleIndex - (this._vidxOffset - oldOffset));\n      }\n    }\n  }\n}\n\nObject.setPrototypeOf(IronListAdapter.prototype, ironList);\n","import { IronListAdapter } from './virtualizer-iron-list-adapter.js';\n\nexport class Virtualizer {\n  /**\n   * @typedef {Object} VirtualizerConfig\n   * @property {Function} createElements Function that returns the given number of new elements\n   * @property {Function} updateElement Function that updates the element at a specific index\n   * @property {HTMLElement} scrollTarget Reference to the scrolling element\n   * @property {HTMLElement} scrollContainer Reference to a wrapper for the item elements (or a slot) inside the scrollTarget\n   * @property {HTMLElement | undefined} elementsContainer Reference to the container in which the item elements are placed, defaults to scrollContainer\n   * @property {boolean | undefined} reorderElements Determines whether the physical item elements should be kept in order in the DOM\n   * @param {VirtualizerConfig} config Configuration for the virtualizer\n   */\n  constructor(config) {\n    this.__adapter = new IronListAdapter(config);\n  }\n\n  /**\n   * The size of the virtualizer\n   * @return {number | undefined} The size of the virtualizer\n   */\n  get size() {\n    return this.__adapter.size;\n  }\n\n  /**\n   * The size of the virtualizer\n   * @param {number} size The size of the virtualizer\n   */\n  set size(size) {\n    this.__adapter.size = size;\n  }\n\n  /**\n   * Scroll to a specific index in the virtual list\n   *\n   * @method scrollToIndex\n   * @param {number} index The index of the item\n   */\n  scrollToIndex(index) {\n    this.__adapter.scrollToIndex(index);\n  }\n\n  /**\n   * Requests the virtualizer to re-render the item elements on an index range, if currently in the DOM\n   *\n   * @method update\n   * @param {number | undefined} startIndex The start index of the range\n   * @param {number | undefined} endIndex The end index of the range\n   */\n  update(startIndex = 0, endIndex = this.size - 1) {\n    this.__adapter.update(startIndex, endIndex);\n  }\n\n  /**\n   * Flushes active asynchronous tasks so that the component and the DOM end up in a stable state\n   *\n   * @method update\n   * @param {number | undefined} startIndex The start index of the range\n   * @param {number | undefined} endIndex The end index of the range\n   */\n  flush() {\n    this.__adapter.flush();\n  }\n\n  /**\n   * Gets the index of the first visible item in the viewport.\n   *\n   * @return {number}\n   */\n  get firstVisibleIndex() {\n    return this.__adapter.adjustedFirstVisibleIndex;\n  }\n\n  /**\n   * Gets the index of the last visible item in the viewport.\n   *\n   * @return {number}\n   */\n  get lastVisibleIndex() {\n    return this.__adapter.adjustedLastVisibleIndex;\n  }\n}\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const A11yMixin = (superClass) =>\n  class A11yMixin extends superClass {\n    static get observers() {\n      return ['_a11yUpdateGridSize(size, _columnTree, _columnTree.*)'];\n    }\n\n    /** @private */\n    _a11yGetHeaderRowCount(_columnTree) {\n      return _columnTree.filter((level) => level.some((col) => col.headerRenderer || col.path || col.header)).length;\n    }\n\n    /** @private */\n    _a11yGetFooterRowCount(_columnTree) {\n      return _columnTree.filter((level) => level.some((col) => col.headerRenderer)).length;\n    }\n\n    /** @private */\n    _a11yUpdateGridSize(size, _columnTree) {\n      if (size === undefined || _columnTree === undefined) {\n        return;\n      }\n\n      const bodyColumns = _columnTree[_columnTree.length - 1];\n      this.$.table.setAttribute(\n        'aria-rowcount',\n        size + this._a11yGetHeaderRowCount(_columnTree) + this._a11yGetFooterRowCount(_columnTree),\n      );\n      this.$.table.setAttribute('aria-colcount', (bodyColumns && bodyColumns.length) || 0);\n\n      this._a11yUpdateHeaderRows();\n      this._a11yUpdateFooterRows();\n    }\n\n    /** @protected */\n    _a11yUpdateHeaderRows() {\n      Array.from(this.$.header.children).forEach((headerRow, index) =>\n        headerRow.setAttribute('aria-rowindex', index + 1),\n      );\n    }\n\n    /** @protected */\n    _a11yUpdateFooterRows() {\n      Array.from(this.$.footer.children).forEach((footerRow, index) =>\n        footerRow.setAttribute('aria-rowindex', this._a11yGetHeaderRowCount(this._columnTree) + this.size + index + 1),\n      );\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {number} index\n     * @protected\n     */\n    _a11yUpdateRowRowindex(row, index) {\n      row.setAttribute('aria-rowindex', index + this._a11yGetHeaderRowCount(this._columnTree) + 1);\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {boolean} selected\n     * @protected\n     */\n    _a11yUpdateRowSelected(row, selected) {\n      // Jaws reads selection only for rows, NVDA only for cells\n      row.setAttribute('aria-selected', Boolean(selected));\n      Array.from(row.children).forEach((cell) => cell.setAttribute('aria-selected', Boolean(selected)));\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @protected\n     */\n    _a11yUpdateRowExpanded(row) {\n      if (this.__isRowExpandable(row)) {\n        row.setAttribute('aria-expanded', 'false');\n      } else if (this.__isRowCollapsible(row)) {\n        row.setAttribute('aria-expanded', 'true');\n      } else {\n        row.removeAttribute('aria-expanded');\n      }\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {number} level\n     * @protected\n     */\n    _a11yUpdateRowLevel(row, level) {\n      // Set level for the expandable rows itself, and all the nested rows.\n      if (level > 0 || this.__isRowCollapsible(row) || this.__isRowExpandable(row)) {\n        row.setAttribute('aria-level', level + 1);\n      } else {\n        row.removeAttribute('aria-level');\n      }\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {!HTMLElement} detailsCell\n     * @protected\n     */\n    _a11ySetRowDetailsCell(row, detailsCell) {\n      Array.from(row.children).forEach((cell) => {\n        if (cell !== detailsCell) {\n          cell.setAttribute('aria-controls', detailsCell.id);\n        }\n      });\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {number} colspan\n     * @protected\n     */\n    _a11yUpdateCellColspan(cell, colspan) {\n      cell.setAttribute('aria-colspan', Number(colspan));\n    }\n\n    /** @protected */\n    _a11yUpdateSorters() {\n      Array.from(this.querySelectorAll('vaadin-grid-sorter')).forEach((sorter) => {\n        let cellContent = sorter.parentNode;\n        while (cellContent && cellContent.localName !== 'vaadin-grid-cell-content') {\n          cellContent = cellContent.parentNode;\n        }\n        if (cellContent && cellContent.assignedSlot) {\n          const cell = cellContent.assignedSlot.parentNode;\n          cell.setAttribute(\n            'aria-sort',\n            {\n              asc: 'ascending',\n              desc: 'descending',\n            }[String(sorter.direction)] || 'none',\n          );\n        }\n      });\n    }\n  };\n","/**\n * Returns a sub-property of an object\n *\n * @param {string} path dot-separated path to the sub property\n * @param {*} object\n * @returns {*}\n */\nfunction get(path, object) {\n  return path.split('.').reduce((obj, property) => obj[property], object);\n}\n\n/**\n * Check array of filters/sorters for paths validity, console.warn invalid items\n * @param {!Array<!GridFilterDefinition | !GridSorterDefinition>} arrayToCheck The array of filters/sorters to check\n * @param {string} action The name of action to include in warning (filtering, sorting)\n * @param {!Array<!GridItem>} items\n */\nfunction checkPaths(arrayToCheck, action, items) {\n  if (items.length === 0) {\n    return false;\n  }\n\n  let result = true;\n\n  arrayToCheck.forEach(({ path }) => {\n    // Skip simple paths\n    if (!path || path.indexOf('.') === -1) {\n      return;\n    }\n\n    const parentProperty = path.replace(/\\.[^.]*$/, ''); // A.b.c -> a.b\n    if (get(parentProperty, items[0]) === undefined) {\n      console.warn(`Path \"${path}\" used for ${action} does not exist in all of the items, ${action} is disabled.`);\n      result = false;\n    }\n  });\n\n  return result;\n}\n\n/**\n * Sorts the given array of items based on the sorting rules and returns the result.\n *\n * @param {Array<any>} items\n * @param {Array<GridSorterDefinition>} items\n * @return {Array<any>}\n */\nfunction multiSort(items, sortOrders) {\n  return items.sort((a, b) => {\n    return sortOrders\n      .map((sortOrder) => {\n        if (sortOrder.direction === 'asc') {\n          return compare(get(sortOrder.path, a), get(sortOrder.path, b));\n        } else if (sortOrder.direction === 'desc') {\n          return compare(get(sortOrder.path, b), get(sortOrder.path, a));\n        }\n        return 0;\n      })\n      .reduce((p, n) => {\n        return p !== 0 ? p : n;\n      }, 0);\n  });\n}\n\n/**\n * @param {unknown} value\n * @return {string}\n */\nfunction normalizeEmptyValue(value) {\n  if ([undefined, null].indexOf(value) >= 0) {\n    return '';\n  } else if (isNaN(value)) {\n    return value.toString();\n  }\n  return value;\n}\n\n/**\n * @param {unknown} a\n * @param {unknown} b\n * @return {number}\n */\nfunction compare(a, b) {\n  a = normalizeEmptyValue(a);\n  b = normalizeEmptyValue(b);\n\n  if (a < b) {\n    return -1;\n  }\n  if (a > b) {\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * @param {!Array<!GridItem>} items\n * @return {!Array<!GridItem>}\n */\nfunction filter(items, filters) {\n  return items.filter((item) => {\n    return filters.every((filter) => {\n      const value = normalizeEmptyValue(get(filter.path, item));\n      const filterValueLowercase = normalizeEmptyValue(filter.value).toString().toLowerCase();\n      return value.toString().toLowerCase().includes(filterValueLowercase);\n    });\n  });\n}\n\n/**\n * WARNING: This API is still intended for internal purposes only and\n * may change any time.\n *\n * Creates a new grid compatible data provider that serves the items\n * from the given array as data when requested by the grid.\n *\n * @param {Array<any>} items\n * @return {GridDataProvider<any>}\n */\nexport const createArrayDataProvider = (allItems) => {\n  return (params, callback) => {\n    let items = allItems ? [...allItems] : [];\n\n    if (params.filters && checkPaths(params.filters, 'filtering', items)) {\n      items = filter(items, params.filters);\n    }\n\n    if (\n      Array.isArray(params.sortOrders) &&\n      params.sortOrders.length &&\n      checkPaths(params.sortOrders, 'sorting', items)\n    ) {\n      items = multiSort(items, params.sortOrders);\n    }\n\n    const count = Math.min(items.length, params.pageSize);\n    const start = params.page * count;\n    const end = start + count;\n    const slice = items.slice(start, end);\n    callback(slice, items.length);\n  };\n};\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { createArrayDataProvider } from './array-data-provider.js';\n\n/**\n * @polymerMixin\n */\nexport const ArrayDataProviderMixin = (superClass) =>\n  class ArrayDataProviderMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * An array containing the items which will be passed to renderer functions.\n         *\n         * @type {Array<!GridItem> | undefined}\n         */\n        items: Array,\n      };\n    }\n\n    static get observers() {\n      return ['__dataProviderOrItemsChanged(dataProvider, items, isAttached, items.*, _filters, _sorters)'];\n    }\n\n    /** @private */\n    __setArrayDataProvider(items) {\n      const arrayDataProvider = createArrayDataProvider(this.items, {});\n      arrayDataProvider.__items = items;\n      this.setProperties({\n        _arrayDataProvider: arrayDataProvider,\n        size: items.length,\n        dataProvider: arrayDataProvider,\n      });\n    }\n\n    /** @private */\n    __dataProviderOrItemsChanged(dataProvider, items, isAttached) {\n      if (!isAttached) {\n        return;\n      }\n\n      if (this._arrayDataProvider) {\n        // Has an items array data provider beforehand\n\n        if (dataProvider !== this._arrayDataProvider) {\n          // A custom data provider was set externally\n          this.setProperties({\n            _arrayDataProvider: undefined,\n            items: undefined,\n          });\n        } else if (!items) {\n          // The items array was unset\n          this.setProperties({\n            _arrayDataProvider: undefined,\n            dataProvider: undefined,\n            size: 0,\n          });\n          this.clearCache();\n        } else if (this._arrayDataProvider.__items === items) {\n          // The items array was modified\n          this.clearCache();\n          this.size = this._effectiveSize;\n        } else {\n          // The items array was replaced\n          this.__setArrayDataProvider(items);\n        }\n      } else if (items) {\n        // There was no array data provider before items was set\n        this.__setArrayDataProvider(items);\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { isTouch } from '@vaadin/component-base/src/browser-utils.js';\nimport { addListener } from '@vaadin/component-base/src/gestures.js';\nimport { updateColumnOrders } from './vaadin-grid-helpers.js';\n\n/**\n * @polymerMixin\n */\nexport const ColumnReorderingMixin = (superClass) =>\n  class ColumnReorderingMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * Set to true to allow column reordering.\n         * @attr {boolean} column-reordering-allowed\n         * @type {boolean}\n         */\n        columnReorderingAllowed: {\n          type: Boolean,\n          value: false,\n        },\n\n        /** @private */\n        _orderBaseScope: {\n          type: Number,\n          value: 10000000,\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_updateOrders(_columnTree)'];\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n      addListener(this, 'track', this._onTrackEvent);\n      this._reorderGhost = this.shadowRoot.querySelector('[part=\"reorder-ghost\"]');\n\n      this.addEventListener('touchstart', this._onTouchStart.bind(this));\n      this.addEventListener('touchmove', this._onTouchMove.bind(this));\n      this.addEventListener('touchend', this._onTouchEnd.bind(this));\n      this.addEventListener('contextmenu', this._onContextMenu.bind(this));\n    }\n\n    /** @private */\n    _onContextMenu(e) {\n      if (this.hasAttribute('reordering')) {\n        e.preventDefault();\n\n        // A contextmenu event is fired on mobile Chrome on long-press\n        // (which should start reordering). Don't end the reorder on touch devices.\n        if (!isTouch) {\n          // Context menu cancels the track gesture on desktop without firing an end event.\n          // End the reorder manually.\n          this._onTrackEnd();\n        }\n      }\n    }\n\n    /** @private */\n    _onTouchStart(e) {\n      // Touch event, delay activation by 100ms\n      this._startTouchReorderTimeout = setTimeout(() => {\n        this._onTrackStart({\n          detail: {\n            x: e.touches[0].clientX,\n            y: e.touches[0].clientY,\n          },\n        });\n      }, 100);\n    }\n\n    /** @private */\n    _onTouchMove(e) {\n      if (this._draggedColumn) {\n        e.preventDefault();\n      }\n      clearTimeout(this._startTouchReorderTimeout);\n    }\n\n    /** @private */\n    _onTouchEnd() {\n      clearTimeout(this._startTouchReorderTimeout);\n      this._onTrackEnd();\n    }\n\n    /** @private */\n    _onTrackEvent(e) {\n      if (e.detail.state === 'start') {\n        const path = e.composedPath();\n        const headerCell = path[path.indexOf(this.$.header) - 2];\n        if (!headerCell || !headerCell._content) {\n          // Not a header column\n          return;\n        }\n\n        if (headerCell._content.contains(this.getRootNode().activeElement)) {\n          // Something was focused inside the cell\n          return;\n        }\n\n        if (this.$.scroller.hasAttribute('column-resizing')) {\n          // Resizing is in progress\n          return;\n        }\n\n        if (!this._touchDevice) {\n          // Not a touch device\n          this._onTrackStart(e);\n        }\n      } else if (e.detail.state === 'track') {\n        this._onTrack(e);\n      } else if (e.detail.state === 'end') {\n        this._onTrackEnd(e);\n      }\n    }\n\n    /** @private */\n    _onTrackStart(e) {\n      if (!this.columnReorderingAllowed) {\n        return;\n      }\n\n      // Cancel reordering if there are draggable nodes on the event path\n      const path = e.composedPath && e.composedPath();\n      if (path && path.some((node) => node.hasAttribute && node.hasAttribute('draggable'))) {\n        return;\n      }\n\n      const headerCell = this._cellFromPoint(e.detail.x, e.detail.y);\n      if (!headerCell || !headerCell.getAttribute('part').includes('header-cell')) {\n        return;\n      }\n\n      this.toggleAttribute('reordering', true);\n      this._draggedColumn = headerCell._column;\n      while (this._draggedColumn.parentElement.childElementCount === 1) {\n        // This is the only column in the group, drag the whole group instead\n        this._draggedColumn = this._draggedColumn.parentElement;\n      }\n      this._setSiblingsReorderStatus(this._draggedColumn, 'allowed');\n      this._draggedColumn._reorderStatus = 'dragging';\n\n      this._updateGhost(headerCell);\n      this._reorderGhost.style.visibility = 'visible';\n      this._updateGhostPosition(e.detail.x, this._touchDevice ? e.detail.y - 50 : e.detail.y);\n      this._autoScroller();\n    }\n\n    /** @private */\n    _onTrack(e) {\n      if (!this._draggedColumn) {\n        // Reordering didn’t start. Skip this event.\n        return;\n      }\n\n      const targetCell = this._cellFromPoint(e.detail.x, e.detail.y);\n      if (!targetCell) {\n        return;\n      }\n\n      const targetColumn = this._getTargetColumn(targetCell, this._draggedColumn);\n      if (\n        this._isSwapAllowed(this._draggedColumn, targetColumn) &&\n        this._isSwappableByPosition(targetColumn, e.detail.x)\n      ) {\n        // Get the header level of the target column (and the dragged column)\n        const columnTreeLevel = this._columnTree.findIndex((level) => level.includes(targetColumn));\n        // Get the columns on that level in visual order\n        const levelColumnsInOrder = this._getColumnsInOrder(columnTreeLevel);\n\n        // Index of the column being dragged\n        const startIndex = levelColumnsInOrder.indexOf(this._draggedColumn);\n        // Index of the column being dragged over\n        const endIndex = levelColumnsInOrder.indexOf(targetColumn);\n\n        // Direction of iteration\n        const direction = startIndex < endIndex ? 1 : -1;\n\n        // Iteratively swap all the columns from the dragged column to the target column\n        for (let i = startIndex; i !== endIndex; i += direction) {\n          this._swapColumnOrders(this._draggedColumn, levelColumnsInOrder[i + direction]);\n        }\n      }\n\n      this._updateGhostPosition(e.detail.x, this._touchDevice ? e.detail.y - 50 : e.detail.y);\n      this._lastDragClientX = e.detail.x;\n    }\n\n    /** @private */\n    _onTrackEnd() {\n      if (!this._draggedColumn) {\n        // Reordering didn’t start. Skip this event.\n        return;\n      }\n\n      this.toggleAttribute('reordering', false);\n      this._draggedColumn._reorderStatus = '';\n      this._setSiblingsReorderStatus(this._draggedColumn, '');\n      this._draggedColumn = null;\n      this._lastDragClientX = null;\n      this._reorderGhost.style.visibility = 'hidden';\n\n      this.dispatchEvent(\n        new CustomEvent('column-reorder', {\n          detail: {\n            columns: this._getColumnsInOrder(),\n          },\n        }),\n      );\n    }\n\n    /**\n     * Returns the columns (or column groups) on the specified header level in visual order.\n     * By default, the bottom level is used.\n     *\n     * @return {!Array<!GridColumn>}\n     * @protected\n     */\n    _getColumnsInOrder(headerLevel = this._columnTree.length - 1) {\n      return this._columnTree[headerLevel].filter((c) => !c.hidden).sort((b, a) => b._order - a._order);\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @return {HTMLElement | undefined}\n     * @protected\n     */\n    _cellFromPoint(x, y) {\n      x = x || 0;\n      y = y || 0;\n      if (!this._draggedColumn) {\n        this.$.scroller.toggleAttribute('no-content-pointer-events', true);\n      }\n      const cell = this.shadowRoot.elementFromPoint(x, y);\n      this.$.scroller.toggleAttribute('no-content-pointer-events', false);\n\n      // Make sure the element is actually a cell\n      if (cell && cell._column) {\n        return cell;\n      }\n    }\n\n    /**\n     * @param {number} eventClientX\n     * @param {number} eventClientY\n     * @protected\n     */\n    _updateGhostPosition(eventClientX, eventClientY) {\n      const ghostRect = this._reorderGhost.getBoundingClientRect();\n      // // This is where we want to position the ghost\n      const targetLeft = eventClientX - ghostRect.width / 2;\n      const targetTop = eventClientY - ghostRect.height / 2;\n      // Current position\n      const _left = parseInt(this._reorderGhost._left || 0);\n      const _top = parseInt(this._reorderGhost._top || 0);\n      // Reposition the ghost\n      this._reorderGhost._left = _left - (ghostRect.left - targetLeft);\n      this._reorderGhost._top = _top - (ghostRect.top - targetTop);\n      this._reorderGhost.style.transform = `translate(${this._reorderGhost._left}px, ${this._reorderGhost._top}px)`;\n    }\n\n    /**\n     * @param {!HTMLElement} cell\n     * @return {!HTMLElement}\n     * @protected\n     */\n    _updateGhost(cell) {\n      const ghost = this._reorderGhost;\n      ghost.textContent = cell._content.innerText;\n      const style = window.getComputedStyle(cell);\n      [\n        'boxSizing',\n        'display',\n        'width',\n        'height',\n        'background',\n        'alignItems',\n        'padding',\n        'border',\n        'flex-direction',\n        'overflow',\n      ].forEach((propertyName) => {\n        ghost.style[propertyName] = style[propertyName];\n      });\n      return ghost;\n    }\n\n    /** @private */\n    _updateOrders(columnTree) {\n      if (columnTree === undefined) {\n        return;\n      }\n\n      // Reset all column orders\n      columnTree[0].forEach((column) => {\n        column._order = 0;\n      });\n      // Set order numbers to top-level columns\n      updateColumnOrders(columnTree[0], this._orderBaseScope, 0);\n    }\n\n    /**\n     * @param {!GridColumn} column\n     * @param {string} status\n     * @protected\n     */\n    _setSiblingsReorderStatus(column, status) {\n      Array.from(column.parentNode.children)\n        .filter((child) => /column/.test(child.localName) && this._isSwapAllowed(child, column))\n        .forEach((sibling) => {\n          sibling._reorderStatus = status;\n        });\n    }\n\n    /** @protected */\n    _autoScroller() {\n      if (this._lastDragClientX) {\n        const rightDiff = this._lastDragClientX - this.getBoundingClientRect().right + 50;\n        const leftDiff = this.getBoundingClientRect().left - this._lastDragClientX + 50;\n\n        if (rightDiff > 0) {\n          this.$.table.scrollLeft += rightDiff / 10;\n        } else if (leftDiff > 0) {\n          this.$.table.scrollLeft -= leftDiff / 10;\n        }\n      }\n\n      if (this._draggedColumn) {\n        setTimeout(() => this._autoScroller(), 10);\n      }\n    }\n\n    /**\n     * @param {GridColumn | undefined} column1\n     * @param {GridColumn | undefined} column2\n     * @return {boolean | undefined}\n     * @protected\n     */\n    _isSwapAllowed(column1, column2) {\n      if (column1 && column2) {\n        const differentColumns = column1 !== column2;\n        const sameParent = column1.parentElement === column2.parentElement;\n        const sameFrozen =\n          (column1.frozen && column2.frozen) || // Both columns are frozen\n          (column1.frozenToEnd && column2.frozenToEnd) || // Both columns are frozen to end\n          (!column1.frozen && !column1.frozenToEnd && !column2.frozen && !column2.frozenToEnd);\n        return differentColumns && sameParent && sameFrozen;\n      }\n    }\n\n    /**\n     * @param {!GridColumn} targetColumn\n     * @param {number} clientX\n     * @return {boolean}\n     * @protected\n     */\n    _isSwappableByPosition(targetColumn, clientX) {\n      const targetCell = Array.from(this.$.header.querySelectorAll('tr:not([hidden]) [part~=\"cell\"]')).find((cell) =>\n        targetColumn.contains(cell._column),\n      );\n      const sourceCellRect = this.$.header\n        .querySelector('tr:not([hidden]) [reorder-status=dragging]')\n        .getBoundingClientRect();\n      const targetRect = targetCell.getBoundingClientRect();\n      if (targetRect.left > sourceCellRect.left) {\n        return clientX > targetRect.right - sourceCellRect.width;\n      }\n      return clientX < targetRect.left + sourceCellRect.width;\n    }\n\n    /**\n     * @param {!GridColumn} column1\n     * @param {!GridColumn} column2\n     * @protected\n     */\n    _swapColumnOrders(column1, column2) {\n      [column1._order, column2._order] = [column2._order, column1._order];\n      this._debounceUpdateFrozenColumn();\n      this._updateFirstAndLastColumn();\n    }\n\n    /**\n     * @param {HTMLElement | undefined} targetCell\n     * @param {GridColumn} draggedColumn\n     * @return {GridColumn | undefined}\n     * @protected\n     */\n    _getTargetColumn(targetCell, draggedColumn) {\n      if (targetCell && draggedColumn) {\n        let candidate = targetCell._column;\n        while (candidate.parentElement !== draggedColumn.parentElement && candidate !== this) {\n          candidate = candidate.parentElement;\n        }\n        if (candidate.parentElement === draggedColumn.parentElement) {\n          return candidate;\n        }\n        return targetCell._column;\n      }\n    }\n\n    /**\n     * Fired when the columns in the grid are reordered.\n     *\n     * @event column-reorder\n     * @param {Object} detail\n     * @param {Object} detail.columns the columns in the new order\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { addListener } from '@vaadin/component-base/src/gestures.js';\n\n/**\n * @polymerMixin\n */\nexport const ColumnResizingMixin = (superClass) =>\n  class ColumnResizingMixin extends superClass {\n    /** @protected */\n    ready() {\n      super.ready();\n      const scroller = this.$.scroller;\n      addListener(scroller, 'track', this._onHeaderTrack.bind(this));\n\n      // Disallow scrolling while resizing\n      scroller.addEventListener('touchmove', (e) => scroller.hasAttribute('column-resizing') && e.preventDefault());\n\n      // Disable contextmenu on any resize separator.\n      scroller.addEventListener(\n        'contextmenu',\n        (e) => e.target.getAttribute('part') === 'resize-handle' && e.preventDefault(),\n      );\n\n      // Disable native cell focus when resizing\n      scroller.addEventListener(\n        'mousedown',\n        (e) => e.target.getAttribute('part') === 'resize-handle' && e.preventDefault(),\n      );\n    }\n\n    /** @private */\n    _onHeaderTrack(e) {\n      const handle = e.target;\n      if (handle.getAttribute('part') === 'resize-handle') {\n        const cell = handle.parentElement;\n        let column = cell._column;\n\n        this.$.scroller.toggleAttribute('column-resizing', true);\n\n        // Get the target column to resize\n        while (column.localName === 'vaadin-grid-column-group') {\n          column = column._childColumns\n            .slice(0)\n            .sort((a, b) => a._order - b._order)\n            .filter((column) => !column.hidden)\n            .pop();\n        }\n\n        const eventX = e.detail.x;\n        const columnRowCells = Array.from(this.$.header.querySelectorAll('[part~=\"row\"]:last-child [part~=\"cell\"]'));\n        const targetCell = columnRowCells.find((cell) => cell._column === column);\n        // Resize the target column\n        if (targetCell.offsetWidth) {\n          const style = getComputedStyle(targetCell._content);\n          const minWidth =\n            10 +\n            parseInt(style.paddingLeft) +\n            parseInt(style.paddingRight) +\n            parseInt(style.borderLeftWidth) +\n            parseInt(style.borderRightWidth) +\n            parseInt(style.marginLeft) +\n            parseInt(style.marginRight);\n\n          let maxWidth;\n\n          const cellWidth = targetCell.offsetWidth;\n          const cellRect = targetCell.getBoundingClientRect();\n\n          // For cells frozen to end, resize handle is flipped horizontally.\n          if (targetCell.hasAttribute('frozen-to-end')) {\n            maxWidth = cellWidth + (this.__isRTL ? eventX - cellRect.right : cellRect.left - eventX);\n          } else {\n            maxWidth = cellWidth + (this.__isRTL ? cellRect.left - eventX : eventX - cellRect.right);\n          }\n\n          column.width = `${Math.max(minWidth, maxWidth)}px`;\n          column.flexGrow = 0;\n        }\n        // Fix width and flex-grow for all preceding columns\n        columnRowCells\n          .sort((a, b) => a._column._order - b._column._order)\n          .forEach((cell, index, array) => {\n            if (index < array.indexOf(targetCell)) {\n              cell._column.width = `${cell.offsetWidth}px`;\n              cell._column.flexGrow = 0;\n            }\n          });\n\n        const cellFrozenToEnd = this._frozenToEndCells[0];\n\n        // When handle moves below the cell frozen to end, scroll into view.\n        if (cellFrozenToEnd && this.$.table.scrollWidth > this.$.table.offsetWidth) {\n          const frozenRect = cellFrozenToEnd.getBoundingClientRect();\n          const offset = eventX - (this.__isRTL ? frozenRect.right : frozenRect.left);\n\n          if ((this.__isRTL && offset <= 0) || (!this.__isRTL && offset >= 0)) {\n            this.$.table.scrollLeft += offset;\n          }\n        }\n\n        if (e.detail.state === 'end') {\n          this.$.scroller.toggleAttribute('column-resizing', false);\n          this.dispatchEvent(\n            new CustomEvent('column-resize', {\n              detail: { resizedColumn: column },\n            }),\n          );\n        }\n\n        // Notify resize\n        this._resizeHandler();\n      }\n    }\n\n    /**\n     * Fired when a column in the grid is resized by the user.\n     *\n     * @event column-resize\n     * @param {Object} detail\n     * @param {Object} detail.resizedColumn the column that was resized\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\n\n/**\n * @private\n */\nexport const ItemCache = class ItemCache {\n  /**\n   * @param {!HTMLElement} grid\n   * @param {!ItemCache | undefined} parentCache\n   * @param {!GridItem | undefined} parentItem\n   */\n  constructor(grid, parentCache, parentItem) {\n    /** @type {!HTMLElement} */\n    this.grid = grid;\n    /** @type {!ItemCache | undefined} */\n    this.parentCache = parentCache;\n    /** @type {!GridItem | undefined} */\n    this.parentItem = parentItem;\n    /** @type {object} */\n    this.itemCaches = {};\n    /** @type {object} */\n    this.items = {};\n    /** @type {number} */\n    this.effectiveSize = 0;\n    /** @type {number} */\n    this.size = 0;\n    /** @type {object} */\n    this.pendingRequests = {};\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isLoading() {\n    return Boolean(\n      Object.keys(this.pendingRequests).length ||\n        Object.keys(this.itemCaches).filter((index) => {\n          return this.itemCaches[index].isLoading();\n        })[0],\n    );\n  }\n\n  /**\n   * @param {number} index\n   * @return {!GridItem | undefined}\n   */\n  getItemForIndex(index) {\n    const { cache, scaledIndex } = this.getCacheAndIndex(index);\n    return cache.items[scaledIndex];\n  }\n\n  updateSize() {\n    this.effectiveSize =\n      !this.parentItem || this.grid._isExpanded(this.parentItem)\n        ? this.size +\n          Object.keys(this.itemCaches).reduce((prev, curr) => {\n            const subCache = this.itemCaches[curr];\n            subCache.updateSize();\n            return prev + subCache.effectiveSize;\n          }, 0)\n        : 0;\n  }\n\n  /**\n   * @param {number} scaledIndex\n   */\n  ensureSubCacheForScaledIndex(scaledIndex) {\n    if (!this.itemCaches[scaledIndex]) {\n      const subCache = new ItemCache(this.grid, this, this.items[scaledIndex]);\n      this.itemCaches[scaledIndex] = subCache;\n      this.grid._loadPage(0, subCache);\n    }\n  }\n\n  /**\n   * @param {number} index\n   * @return {{cache: !ItemCache, scaledIndex: number}}\n   */\n  getCacheAndIndex(index) {\n    let thisLevelIndex = index;\n    const keys = Object.keys(this.itemCaches);\n    for (let i = 0; i < keys.length; i++) {\n      const expandedIndex = Number(keys[i]);\n      const subCache = this.itemCaches[expandedIndex];\n      if (thisLevelIndex <= expandedIndex) {\n        return { cache: this, scaledIndex: thisLevelIndex };\n      } else if (thisLevelIndex <= expandedIndex + subCache.effectiveSize) {\n        return subCache.getCacheAndIndex(thisLevelIndex - expandedIndex - 1);\n      }\n      thisLevelIndex -= subCache.effectiveSize;\n    }\n    return { cache: this, scaledIndex: thisLevelIndex };\n  }\n};\n\n/**\n * @polymerMixin\n */\nexport const DataProviderMixin = (superClass) =>\n  class DataProviderMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * The number of root-level items in the grid.\n         * @attr {number} size\n         * @type {number}\n         */\n        size: {\n          type: Number,\n          notify: true,\n        },\n\n        /**\n         * Number of items fetched at a time from the dataprovider.\n         * @attr {number} page-size\n         * @type {number}\n         */\n        pageSize: {\n          type: Number,\n          value: 50,\n          observer: '_pageSizeChanged',\n        },\n\n        /**\n         * Function that provides items lazily. Receives arguments `params`, `callback`\n         *\n         * `params.page` Requested page index\n         *\n         * `params.pageSize` Current page size\n         *\n         * `params.filters` Currently applied filters\n         *\n         * `params.sortOrders` Currently applied sorting orders\n         *\n         * `params.parentItem` When tree is used, and sublevel items\n         * are requested, reference to parent item of the requested sublevel.\n         * Otherwise `undefined`.\n         *\n         * `callback(items, size)` Callback function with arguments:\n         *   - `items` Current page of items\n         *   - `size` Total number of items. When tree sublevel items\n         *     are requested, total number of items in the requested sublevel.\n         *     Optional when tree is not used, required for tree.\n         *\n         * @type {GridDataProvider | null | undefined}\n         */\n        dataProvider: {\n          type: Object,\n          notify: true,\n          observer: '_dataProviderChanged',\n        },\n\n        /**\n         * `true` while data is being requested from the data provider.\n         */\n        loading: {\n          type: Boolean,\n          notify: true,\n          readOnly: true,\n          reflectToAttribute: true,\n        },\n\n        /**\n         * @type {!ItemCache}\n         * @protected\n         */\n        _cache: {\n          type: Object,\n          value() {\n            const cache = new ItemCache(this);\n            return cache;\n          },\n        },\n\n        /**\n         * @protected\n         */\n        _hasData: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * Path to an item sub-property that indicates whether the item has child items.\n         * @attr {string} item-has-children-path\n         */\n        itemHasChildrenPath: {\n          type: String,\n          value: 'children',\n        },\n\n        /**\n         * Path to an item sub-property that identifies the item.\n         * @attr {string} item-id-path\n         */\n        itemIdPath: {\n          type: String,\n          value: null,\n        },\n\n        /**\n         * An array that contains the expanded items.\n         * @type {!Array<!GridItem>}\n         */\n        expandedItems: {\n          type: Object,\n          notify: true,\n          value: () => [],\n        },\n\n        /**\n         * @private\n         */\n        __expandedKeys: {\n          type: Object,\n          computed: '__computeExpandedKeys(itemIdPath, expandedItems.*)',\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_sizeChanged(size)', '_expandedItemsChanged(expandedItems.*)'];\n    }\n\n    /** @private */\n    _sizeChanged(size) {\n      const delta = size - this._cache.size;\n      this._cache.size += delta;\n      this._cache.effectiveSize += delta;\n      this._effectiveSize = this._cache.effectiveSize;\n    }\n\n    /**\n     * @param {number} index\n     * @param {HTMLElement} el\n     * @protected\n     */\n    _getItem(index, el) {\n      if (index >= this._effectiveSize) {\n        return;\n      }\n\n      el.index = index;\n      const { cache, scaledIndex } = this._cache.getCacheAndIndex(index);\n      const item = cache.items[scaledIndex];\n      if (item) {\n        el.toggleAttribute('loading', false);\n        this._updateItem(el, item);\n        if (this._isExpanded(item)) {\n          cache.ensureSubCacheForScaledIndex(scaledIndex);\n        }\n      } else {\n        el.toggleAttribute('loading', true);\n        this._loadPage(this._getPageForIndex(scaledIndex), cache);\n      }\n    }\n\n    /**\n     * Returns a value that identifies the item. Uses `itemIdPath` if available.\n     * Can be customized by overriding.\n     * @param {!GridItem} item\n     * @return {!GridItem | !unknown}\n     */\n    getItemId(item) {\n      return this.itemIdPath ? this.get(this.itemIdPath, item) : item;\n    }\n\n    /**\n     * @param {!GridItem} item\n     * @return {boolean}\n     * @protected\n     */\n    _isExpanded(item) {\n      return this.__expandedKeys.has(this.getItemId(item));\n    }\n\n    /** @private */\n    _expandedItemsChanged() {\n      this._cache.updateSize();\n      this._effectiveSize = this._cache.effectiveSize;\n      this.__updateVisibleRows();\n    }\n\n    /** @private */\n    __computeExpandedKeys(itemIdPath, expandedItems) {\n      const expanded = expandedItems.base || [];\n      const expandedKeys = new Set();\n      expanded.forEach((item) => {\n        expandedKeys.add(this.getItemId(item));\n      });\n\n      return expandedKeys;\n    }\n\n    /**\n     * Expands the given item tree.\n     * @param {!GridItem} item\n     */\n    expandItem(item) {\n      if (!this._isExpanded(item)) {\n        this.expandedItems = [...this.expandedItems, item];\n      }\n    }\n\n    /**\n     * Collapses the given item tree.\n     * @param {!GridItem} item\n     */\n    collapseItem(item) {\n      if (this._isExpanded(item)) {\n        this.expandedItems = this.expandedItems.filter((i) => !this._itemsEqual(i, item));\n      }\n    }\n\n    /**\n     * @param {number} index\n     * @return {number}\n     * @protected\n     */\n    _getIndexLevel(index) {\n      let { cache } = this._cache.getCacheAndIndex(index);\n      let level = 0;\n      while (cache.parentCache) {\n        cache = cache.parentCache;\n        level += 1;\n      }\n      return level;\n    }\n\n    /**\n     * @param {number} page\n     * @param {ItemCache} cache\n     * @protected\n     */\n    _loadPage(page, cache) {\n      // Make sure same page isn't requested multiple times.\n      if (!cache.pendingRequests[page] && this.dataProvider) {\n        this._setLoading(true);\n        cache.pendingRequests[page] = true;\n        const params = {\n          page,\n          pageSize: this.pageSize,\n          sortOrders: this._mapSorters(),\n          filters: this._mapFilters(),\n          parentItem: cache.parentItem,\n        };\n\n        this.dataProvider(params, (items, size) => {\n          if (size !== undefined) {\n            cache.size = size;\n          } else if (params.parentItem) {\n            cache.size = items.length;\n          }\n\n          const currentItems = Array.from(this.$.items.children).map((row) => row._item);\n\n          // Populate the cache with new items\n          items.forEach((item, itemsIndex) => {\n            const itemIndex = page * this.pageSize + itemsIndex;\n            cache.items[itemIndex] = item;\n            if (this._isExpanded(item) && currentItems.indexOf(item) > -1) {\n              // Force synchronous data request for expanded item sub-cache\n              cache.ensureSubCacheForScaledIndex(itemIndex);\n            }\n          });\n\n          this._hasData = true;\n\n          delete cache.pendingRequests[page];\n\n          this._debouncerApplyCachedData = Debouncer.debounce(this._debouncerApplyCachedData, timeOut.after(0), () => {\n            this._setLoading(false);\n            this._cache.updateSize();\n            this._effectiveSize = this._cache.effectiveSize;\n\n            Array.from(this.$.items.children)\n              .filter((row) => !row.hidden)\n              .forEach((row) => {\n                const cachedItem = this._cache.getItemForIndex(row.index);\n                if (cachedItem) {\n                  this._getItem(row.index, row);\n                }\n              });\n\n            this.__scrollToPendingIndex();\n            this.__dispatchPendingBodyCellFocus();\n          });\n\n          if (!this._cache.isLoading()) {\n            this._debouncerApplyCachedData.flush();\n          }\n\n          this.__itemsReceived();\n        });\n      }\n    }\n\n    /**\n     * @param {number} index\n     * @return {number}\n     * @private\n     */\n    _getPageForIndex(index) {\n      return Math.floor(index / this.pageSize);\n    }\n\n    /**\n     * Clears the cached pages and reloads data from dataprovider when needed.\n     */\n    clearCache() {\n      this._cache = new ItemCache(this);\n      this._cache.size = this.size || 0;\n      this._cache.updateSize();\n      this._hasData = false;\n      this.__updateVisibleRows();\n\n      if (!this._effectiveSize) {\n        this._loadPage(0, this._cache);\n      }\n    }\n\n    /** @private */\n    _pageSizeChanged(pageSize, oldPageSize) {\n      if (oldPageSize !== undefined && pageSize !== oldPageSize) {\n        this.clearCache();\n      }\n    }\n\n    /** @protected */\n    _checkSize() {\n      if (this.size === undefined && this._effectiveSize === 0) {\n        console.warn(\n          'The <vaadin-grid> needs the total number of items' +\n            ' in order to display rows. Set the total number of items' +\n            ' to the `size` property, or provide the total number of items' +\n            ' in the second argument of the `dataProvider`’s `callback` call.',\n        );\n      }\n    }\n\n    /** @private */\n    _dataProviderChanged(dataProvider, oldDataProvider) {\n      if (oldDataProvider !== undefined) {\n        this.clearCache();\n      }\n\n      this._ensureFirstPageLoaded();\n\n      this._debouncerCheckSize = Debouncer.debounce(\n        this._debouncerCheckSize,\n        timeOut.after(2000),\n        this._checkSize.bind(this),\n      );\n    }\n\n    /** @protected */\n    _ensureFirstPageLoaded() {\n      if (!this._hasData) {\n        // Load data before adding rows to make sure they have content when\n        // rendered for the first time.\n        this._loadPage(0, this._cache);\n      }\n    }\n\n    /**\n     * @param {!GridItem} item1\n     * @param {!GridItem} item2\n     * @return {boolean}\n     * @protected\n     */\n    _itemsEqual(item1, item2) {\n      return this.getItemId(item1) === this.getItemId(item2);\n    }\n\n    /**\n     * @param {!GridItem} item\n     * @param {!Array<!GridItem>} array\n     * @return {number}\n     * @protected\n     */\n    _getItemIndexInArray(item, array) {\n      let result = -1;\n      array.forEach((i, idx) => {\n        if (this._itemsEqual(i, item)) {\n          result = idx;\n        }\n      });\n      return result;\n    }\n\n    scrollToIndex(index) {\n      super.scrollToIndex(index);\n      if (!isNaN(index) && (this._cache.isLoading() || !this.clientHeight)) {\n        this.__pendingScrollToIndex = index;\n      }\n    }\n\n    /** @private */\n    __scrollToPendingIndex() {\n      if (this.__pendingScrollToIndex && this.$.items.children.length) {\n        const index = this.__pendingScrollToIndex;\n        delete this.__pendingScrollToIndex;\n        this.scrollToIndex(index);\n      }\n    }\n\n    /**\n     * Fired when the `expandedItems` property changes.\n     *\n     * @event expanded-items-changed\n     */\n\n    /**\n     * Fired when the `loading` property changes.\n     *\n     * @event loading-changed\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nconst DropMode = {\n  BETWEEN: 'between',\n  ON_TOP: 'on-top',\n  ON_TOP_OR_BETWEEN: 'on-top-or-between',\n  ON_GRID: 'on-grid',\n};\n\nconst DropLocation = {\n  ON_TOP: 'on-top',\n  ABOVE: 'above',\n  BELOW: 'below',\n  EMPTY: 'empty',\n};\n\n// Detects if the browser doesn't support HTML5 Drag & Drop API (and falls back to the @vaadin/vaadin-mobile-drag-drop polyfill)\nconst usesDnDPolyfill = !('draggable' in document.createElement('div'));\n\n/**\n * @polymerMixin\n */\nexport const DragAndDropMixin = (superClass) =>\n  class DragAndDropMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * Defines the locations within the Grid row where an element can be dropped.\n         *\n         * Possible values are:\n         * - `between`: The drop event can happen between Grid rows.\n         * - `on-top`: The drop event can happen on top of Grid rows.\n         * - `on-top-or-between`: The drop event can happen either on top of or between Grid rows.\n         * - `on-grid`: The drop event will not happen on any specific row, it will show the drop target outline around the whole grid.\n         * @attr {between|on-top|on-top-or-between|on-grid} drop-mode\n         * @type {GridDropMode | null | undefined}\n         */\n        dropMode: String,\n\n        /**\n         * Marks the grid's rows to be available for dragging.\n         * @attr {boolean} rows-draggable\n         */\n        rowsDraggable: Boolean,\n\n        /**\n         * A function that filters dragging of specific grid rows. The return value should be false\n         * if dragging of the row should be disabled.\n         *\n         * Receives one argument:\n         * - `model` The object with the properties related with\n         *   the rendered item, contains:\n         *   - `model.index` The index of the item.\n         *   - `model.item` The item.\n         *   - `model.expanded` Sublevel toggle state.\n         *   - `model.level` Level of the tree represented with a horizontal offset of the toggle button.\n         *   - `model.selected` Selected state.\n         *\n         * @type {GridDragAndDropFilter | null | undefined}\n         */\n        dragFilter: Function,\n\n        /**\n         * A function that filters dropping on specific grid rows. The return value should be false\n         * if dropping on the row should be disabled.\n         *\n         * Receives one argument:\n         * - `model` The object with the properties related with\n         *   the rendered item, contains:\n         *   - `model.index` The index of the item.\n         *   - `model.item` The item.\n         *   - `model.expanded` Sublevel toggle state.\n         *   - `model.level` Level of the tree represented with a horizontal offset of the toggle button.\n         *   - `model.selected` Selected state.\n         *\n         * @type {GridDragAndDropFilter | null | undefined}\n         */\n        dropFilter: Function,\n\n        /** @private */\n        __dndAutoScrollThreshold: {\n          value: 50,\n        },\n      };\n    }\n\n    static get observers() {\n      return ['_dragDropAccessChanged(rowsDraggable, dropMode, dragFilter, dropFilter, loading)'];\n    }\n\n    constructor() {\n      super();\n      this.__onDocumentDragStart = this.__onDocumentDragStart.bind(this);\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n      this.$.table.addEventListener('dragstart', this._onDragStart.bind(this));\n      this.$.table.addEventListener('dragend', this._onDragEnd.bind(this));\n      this.$.table.addEventListener('dragover', this._onDragOver.bind(this));\n      this.$.table.addEventListener('dragleave', this._onDragLeave.bind(this));\n      this.$.table.addEventListener('drop', this._onDrop.bind(this));\n      this.$.table.addEventListener('dragenter', (e) => {\n        if (this.dropMode) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    /** @protected */\n    connectedCallback() {\n      super.connectedCallback();\n      // Chromium based browsers cannot properly generate drag images for elements\n      // that have children with massive heights. This workaround prevents crashes\n      // and performance issues by excluding the items from the drag image.\n      // https://github.com/vaadin/web-components/issues/7985\n      document.addEventListener('dragstart', this.__onDocumentDragStart, { capture: true });\n    }\n\n    /** @protected */\n    disconnectedCallback() {\n      super.disconnectedCallback();\n      document.removeEventListener('dragstart', this.__onDocumentDragStart, { capture: true });\n    }\n\n    /** @private */\n    _onDragStart(e) {\n      if (this.rowsDraggable) {\n        let row = e.target;\n        if (row.localName === 'vaadin-grid-cell-content') {\n          // The draggable node is the cell content element on browsers that support native shadow\n          row = row.assignedSlot.parentNode.parentNode;\n        }\n        if (row.parentNode !== this.$.items) {\n          return;\n        }\n\n        e.stopPropagation();\n        this.toggleAttribute('dragging-rows', true);\n\n        if (this._safari) {\n          // Safari doesn't position drag images from transformed\n          // elements properly so we need to switch to use top temporarily\n          const transform = row.style.transform;\n          row.style.top = /translateY\\((.*)\\)/.exec(transform)[1];\n          row.style.transform = 'none';\n          requestAnimationFrame(() => {\n            row.style.top = '';\n            row.style.transform = transform;\n          });\n        }\n\n        const rowRect = row.getBoundingClientRect();\n\n        if (usesDnDPolyfill) {\n          // The polyfill drag image is automatically centered so there is no need to adjust the position\n          e.dataTransfer.setDragImage(row);\n        } else {\n          // The native drag image needs to be shifted manually to compensate for the touch position offset\n          e.dataTransfer.setDragImage(row, e.clientX - rowRect.left, e.clientY - rowRect.top);\n        }\n\n        let rows = [row];\n        if (this._isSelected(row._item)) {\n          rows = this.__getViewportRows()\n            .filter((row) => this._isSelected(row._item))\n            .filter((row) => !this.dragFilter || this.dragFilter(this.__getRowModel(row)));\n        }\n\n        // Set the default transfer data\n        e.dataTransfer.setData('text', this.__formatDefaultTransferData(rows));\n\n        row.setAttribute('dragstart', rows.length > 1 ? rows.length : '');\n        this.style.setProperty('--_grid-drag-start-x', `${e.clientX - rowRect.left + 20}px`);\n        this.style.setProperty('--_grid-drag-start-y', `${e.clientY - rowRect.top + 10}px`);\n\n        requestAnimationFrame(() => {\n          row.removeAttribute('dragstart');\n          this.updateStyles({ '--_grid-drag-start-x': '', '--_grid-drag-start-y': '' });\n        });\n\n        const event = new CustomEvent('grid-dragstart', {\n          detail: {\n            draggedItems: rows.map((row) => row._item),\n            setDragData: (type, data) => e.dataTransfer.setData(type, data),\n            setDraggedItemsCount: (count) => row.setAttribute('dragstart', count),\n          },\n        });\n        event.originalEvent = e;\n        this.dispatchEvent(event);\n      }\n    }\n\n    /** @private */\n    _onDragEnd(e) {\n      this.toggleAttribute('dragging-rows', false);\n      e.stopPropagation();\n      const event = new CustomEvent('grid-dragend');\n      event.originalEvent = e;\n      this.dispatchEvent(event);\n    }\n\n    /** @private */\n    _onDragLeave(e) {\n      e.stopPropagation();\n      this._clearDragStyles();\n    }\n\n    /** @private */\n    _onDragOver(e) {\n      if (this.dropMode) {\n        this._dropLocation = undefined;\n        this._dragOverItem = undefined;\n\n        if (this.__dndAutoScroll(e.clientY)) {\n          this._clearDragStyles();\n          return;\n        }\n\n        let row = e.composedPath().find((node) => node.localName === 'tr');\n\n        if (!this._effectiveSize || this.dropMode === DropMode.ON_GRID) {\n          // The grid is empty or \"on-grid\" drop mode was used, always default to \"empty\"\n          this._dropLocation = DropLocation.EMPTY;\n        } else if (!row || row.parentNode !== this.$.items) {\n          // The dragover didn't occur on a body row but the grid has items\n          if (row) {\n            // The dragover occurred over a header/footer row\n            return;\n          } else if (this.dropMode === DropMode.BETWEEN || this.dropMode === DropMode.ON_TOP_OR_BETWEEN) {\n            // The drop mode allows setting the last row as the drag over item\n            row = Array.from(this.$.items.children)\n              .filter((row) => !row.hidden)\n              .pop();\n            this._dropLocation = DropLocation.BELOW;\n          } else {\n            // Drop mode on-top used but the dragover didn't occur over one of the existing rows\n            return;\n          }\n        } else {\n          // The dragover occurred on a body row, determine the drop location from coordinates\n          const rowRect = row.getBoundingClientRect();\n\n          this._dropLocation = DropLocation.ON_TOP;\n\n          if (this.dropMode === DropMode.BETWEEN) {\n            const dropAbove = e.clientY - rowRect.top < rowRect.bottom - e.clientY;\n            this._dropLocation = dropAbove ? DropLocation.ABOVE : DropLocation.BELOW;\n          } else if (this.dropMode === DropMode.ON_TOP_OR_BETWEEN) {\n            if (e.clientY - rowRect.top < rowRect.height / 3) {\n              this._dropLocation = DropLocation.ABOVE;\n            } else if (e.clientY - rowRect.top > (rowRect.height / 3) * 2) {\n              this._dropLocation = DropLocation.BELOW;\n            }\n          }\n        }\n\n        if (row && row.hasAttribute('drop-disabled')) {\n          this._dropLocation = undefined;\n          return;\n        }\n\n        e.stopPropagation();\n        e.preventDefault();\n\n        if (this._dropLocation === DropLocation.EMPTY) {\n          this.toggleAttribute('dragover', true);\n        } else if (row) {\n          this._dragOverItem = row._item;\n          if (row.getAttribute('dragover') !== this._dropLocation) {\n            row.setAttribute('dragover', this._dropLocation);\n          }\n        } else {\n          this._clearDragStyles();\n        }\n      }\n    }\n\n    /** @private */\n    __onDocumentDragStart(e) {\n      // The dragged element can be the element itself or a parent of the element\n      if (!e.target.contains(this)) {\n        return;\n      }\n      // The threshold value 20000 provides a buffer to both\n      //   - avoid the crash and the performance issues\n      //   - unnecessarily avoid excluding items from the drag image\n      if (this.$.items.offsetHeight > 20000) {\n        const initialItemsMaxHeight = this.$.items.style.maxHeight;\n        const initialTableOverflow = this.$.table.style.overflow;\n        // Momentarily hides the items until the browser starts generating the\n        // drag image.\n        this.$.items.style.maxHeight = '0';\n        this.$.table.style.overflow = 'hidden';\n        requestAnimationFrame(() => {\n          this.$.items.style.maxHeight = initialItemsMaxHeight;\n          this.$.table.style.overflow = initialTableOverflow;\n        });\n      }\n    }\n\n    /** @private */\n    __dndAutoScroll(clientY) {\n      if (this.__dndAutoScrolling) {\n        return true;\n      }\n\n      const headerBottom = this.$.header.getBoundingClientRect().bottom;\n      const footerTop = this.$.footer.getBoundingClientRect().top;\n      const topDiff = headerBottom - clientY + this.__dndAutoScrollThreshold;\n      const bottomDiff = clientY - footerTop + this.__dndAutoScrollThreshold;\n      let scrollTopDelta = 0;\n\n      if (bottomDiff > 0) {\n        scrollTopDelta = bottomDiff * 2;\n      } else if (topDiff > 0) {\n        scrollTopDelta = -topDiff * 2;\n      }\n\n      if (scrollTopDelta) {\n        const scrollTop = this.$.table.scrollTop;\n        this.$.table.scrollTop += scrollTopDelta;\n        const scrollTopChanged = scrollTop !== this.$.table.scrollTop;\n        if (scrollTopChanged) {\n          this.__dndAutoScrolling = true;\n          // Disallow more auto-scrolls within 20ms\n          setTimeout(() => {\n            this.__dndAutoScrolling = false;\n          }, 20);\n          return true;\n        }\n      }\n    }\n\n    /** @private */\n    __getViewportRows() {\n      const headerBottom = this.$.header.getBoundingClientRect().bottom;\n      const footerTop = this.$.footer.getBoundingClientRect().top;\n      return Array.from(this.$.items.children).filter((row) => {\n        const rowRect = row.getBoundingClientRect();\n        return rowRect.bottom > headerBottom && rowRect.top < footerTop;\n      });\n    }\n\n    /** @protected */\n    _clearDragStyles() {\n      this.removeAttribute('dragover');\n      Array.from(this.$.items.children).forEach((row) => row.removeAttribute('dragover'));\n    }\n\n    /** @private */\n    _onDrop(e) {\n      if (this.dropMode) {\n        e.stopPropagation();\n        e.preventDefault();\n\n        const dragData =\n          e.dataTransfer.types &&\n          Array.from(e.dataTransfer.types).map((type) => {\n            return {\n              type,\n              data: e.dataTransfer.getData(type),\n            };\n          });\n\n        this._clearDragStyles();\n\n        const event = new CustomEvent('grid-drop', {\n          bubbles: e.bubbles,\n          cancelable: e.cancelable,\n          detail: {\n            dropTargetItem: this._dragOverItem,\n            dropLocation: this._dropLocation,\n            dragData,\n          },\n        });\n        event.originalEvent = e;\n        this.dispatchEvent(event);\n      }\n    }\n\n    /** @private */\n    __formatDefaultTransferData(rows) {\n      return rows\n        .map((row) => {\n          return Array.from(row.children)\n            .filter((cell) => !cell.hidden && cell.getAttribute('part').indexOf('details-cell') === -1)\n            .sort((a, b) => {\n              return a._column._order > b._column._order ? 1 : -1;\n            })\n            .map((cell) => cell._content.textContent.trim())\n            .filter((content) => content)\n            .join('\\t');\n        })\n        .join('\\n');\n    }\n\n    /** @private */\n    _dragDropAccessChanged() {\n      this.filterDragAndDrop();\n    }\n\n    /**\n     * Runs the `dragFilter` and `dropFilter` hooks for the visible cells.\n     * If the filter depends on varying conditions, you may need to\n     * call this function manually in order to update the draggability when\n     * the conditions change.\n     */\n    filterDragAndDrop() {\n      Array.from(this.$.items.children)\n        .filter((row) => !row.hidden)\n        .forEach((row) => {\n          this._filterDragAndDrop(row, this.__getRowModel(row));\n        });\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {!GridItemModel} model\n     * @protected\n     */\n    _filterDragAndDrop(row, model) {\n      const loading = this.loading || row.hasAttribute('loading');\n      const dragDisabled = !this.rowsDraggable || loading || (this.dragFilter && !this.dragFilter(model));\n      const dropDisabled = !this.dropMode || loading || (this.dropFilter && !this.dropFilter(model));\n\n      const draggableElements = Array.from(row.children).map((cell) => cell._content);\n\n      draggableElements.forEach((e) => {\n        if (dragDisabled) {\n          e.removeAttribute('draggable');\n        } else {\n          e.setAttribute('draggable', true);\n        }\n      });\n\n      row.toggleAttribute('drag-disabled', !!dragDisabled);\n      row.toggleAttribute('drop-disabled', !!dropDisabled);\n    }\n\n    /**\n     * Fired when starting to drag grid rows.\n     *\n     * @event grid-dragstart\n     * @param {Object} originalEvent The native dragstart event\n     * @param {Object} detail\n     * @param {Object} detail.draggedItems the items in the visible viewport that are dragged\n     * @param {Function} detail.setDraggedItemsCount Overrides the default number shown in the drag image on multi row drag.\n     * Parameter is of type number.\n     * @param {Function} detail.setDragData Sets dataTransfer data for the drag operation.\n     * Note that \"text\" is the only data type supported by all the browsers the grid currently supports (including IE11).\n     * The function takes two parameters:\n     * - type:string The type of the data\n     * - data:string The data\n     */\n\n    /**\n     * Fired when the dragging of the rows ends.\n     *\n     * @event grid-dragend\n     * @param {Object} originalEvent The native dragend event\n     */\n\n    /**\n     * Fired when a drop occurs on top of the grid.\n     *\n     * @event grid-drop\n     * @param {Object} originalEvent The native drop event\n     * @param {Object} detail\n     * @param {Object} detail.dropTargetItem The item of the grid row on which the drop occurred.\n     * @param {string} detail.dropLocation The position at which the drop event took place relative to a row.\n     * Depending on the dropMode value, the drop location can be one of the following\n     * - `on-top`: when the drop occurred on top of the row\n     * - `above`: when the drop occurred above the row\n     * - `below`: when the drop occurred below the row\n     * - `empty`: when the drop occurred over the grid, not relative to any specific row\n     * @param {string} detail.dragData An array of items with the payload as a string representation as the\n     * `data` property and the type of the data as `type` property.\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';\nimport { PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\n\nfunction arrayEquals(arr1, arr2) {\n  if (!arr1 || !arr2 || arr1.length !== arr2.length) {\n    return false;\n  }\n\n  for (let i = 0, l = arr1.length; i < l; i++) {\n    // Check if we have nested arrays\n    if (arr1[i] instanceof Array && arr2[i] instanceof Array) {\n      // Recurse into the nested arrays\n      if (!arrayEquals(arr1[i], arr2[i])) {\n        return false;\n      }\n    } else if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @polymerMixin\n */\nexport const DynamicColumnsMixin = (superClass) =>\n  class DynamicColumnsMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * @protected\n         */\n        _columnTree: Object,\n      };\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n      this._addNodeObserver();\n    }\n\n    /** @private */\n    _hasColumnGroups(columns) {\n      for (let i = 0; i < columns.length; i++) {\n        if (columns[i].localName === 'vaadin-grid-column-group') {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * @param {!GridColumnGroup} el\n     * @return {!Array<!GridColumn>}\n     * @protected\n     */\n    _getChildColumns(el) {\n      return FlattenedNodesObserver.getFlattenedNodes(el).filter(this._isColumnElement);\n    }\n\n    /** @private */\n    _flattenColumnGroups(columns) {\n      return columns\n        .map((col) => {\n          if (col.localName === 'vaadin-grid-column-group') {\n            return this._getChildColumns(col);\n          }\n          return [col];\n        })\n        .reduce((prev, curr) => {\n          return prev.concat(curr);\n        }, []);\n    }\n\n    /** @private */\n    _getColumnTree() {\n      const rootColumns = FlattenedNodesObserver.getFlattenedNodes(this).filter(this._isColumnElement);\n      const columnTree = [rootColumns];\n\n      let c = rootColumns;\n      while (this._hasColumnGroups(c)) {\n        c = this._flattenColumnGroups(c);\n        columnTree.push(c);\n      }\n\n      return columnTree;\n    }\n\n    /** @protected */\n    _updateColumnTree() {\n      const columnTree = this._getColumnTree();\n      if (!arrayEquals(columnTree, this._columnTree)) {\n        this._columnTree = columnTree;\n      }\n    }\n\n    /** @private */\n    _addNodeObserver() {\n      this._observer = new FlattenedNodesObserver(this, (info) => {\n        const hasColumnElements = (nodeCollection) => nodeCollection.filter(this._isColumnElement).length > 0;\n        if (hasColumnElements(info.addedNodes) || hasColumnElements(info.removedNodes)) {\n          const allRemovedCells = info.removedNodes.flatMap((c) => c._allCells);\n          const filterNotConnected = (element) =>\n            allRemovedCells.filter((cell) => cell && cell._content.contains(element)).length;\n\n          this.__removeSorters(this._sorters.filter(filterNotConnected));\n          this.__removeFilters(this._filters.filter(filterNotConnected));\n          this._updateColumnTree();\n        }\n\n        this._debouncerCheckImports = Debouncer.debounce(\n          this._debouncerCheckImports,\n          timeOut.after(2000),\n          this._checkImports.bind(this),\n        );\n\n        this._ensureFirstPageLoaded();\n      });\n    }\n\n    /** @protected */\n    _checkImports() {\n      [\n        'vaadin-grid-column-group',\n        'vaadin-grid-filter',\n        'vaadin-grid-filter-column',\n        'vaadin-grid-tree-toggle',\n        'vaadin-grid-selection-column',\n        'vaadin-grid-sort-column',\n        'vaadin-grid-sorter',\n      ].forEach((elementName) => {\n        const element = this.querySelector(elementName);\n        if (element && !(element instanceof PolymerElement)) {\n          console.warn(`Make sure you have imported the required module for <${elementName}> element.`);\n        }\n      });\n    }\n\n    /** @protected */\n    _updateFirstAndLastColumn() {\n      Array.from(this.shadowRoot.querySelectorAll('tr')).forEach((row) => this._updateFirstAndLastColumnForRow(row));\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @protected\n     */\n    _updateFirstAndLastColumnForRow(row) {\n      Array.from(row.querySelectorAll('[part~=\"cell\"]:not([part~=\"details-cell\"])'))\n        .sort((a, b) => {\n          return a._column._order - b._column._order;\n        })\n        .forEach((cell, cellIndex, children) => {\n          cell.toggleAttribute('first-column', cellIndex === 0);\n          cell.toggleAttribute('last-column', cellIndex === children.length - 1);\n        });\n    }\n\n    /**\n     * @param {!Node} node\n     * @return {boolean}\n     * @protected\n     */\n    _isColumnElement(node) {\n      return node.nodeType === Node.ELEMENT_NODE && /\\bcolumn\\b/.test(node.localName);\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const EventContextMixin = (superClass) =>\n  class EventContextMixin extends superClass {\n    /**\n     * Returns an object with context information about the event target:\n     * - `item`: the data object corresponding to the targeted row (not specified when targeting header or footer)\n     * - `column`: the column element corresponding to the targeted cell (not specified when targeting row details)\n     * - `section`: whether the event targeted the body, header, footer or details of the grid\n     *\n     * These additional properties are included when `item` is specified:\n     * - `index`: the index of the item\n     * - `selected`: the selected state of the item\n     * - `detailsOpened`: whether the row details are open for the item\n     * - `expanded`: the expanded state of the tree toggle\n     * - `level`: the tree hierarchy level\n     *\n     * The returned object is populated only when a grid cell, header, footer or row details is found in `event.composedPath()`.\n     * This means mostly mouse and keyboard events. If such a grid part is not found in the path, an empty object is returned.\n     * This may be the case eg. if the event is fired on the `<vaadin-grid>` element and not any deeper in the DOM, or if\n     * the event targets the empty part of the grid body.\n     *\n     * @param {!Event} event\n     * @return {GridEventContext}\n     */\n    getEventContext(event) {\n      const context = {};\n\n      // Use `composedPath()` stored by vaadin-context-menu gesture\n      // to avoid problem when accessing it after a timeout on iOS\n      const path = event.__composedPath || event.composedPath();\n      const cell = path[path.indexOf(this.$.table) - 3];\n\n      if (!cell) {\n        return context;\n      }\n\n      context.section = ['body', 'header', 'footer', 'details'].find(\n        (section) => cell.getAttribute('part').indexOf(section) > -1,\n      );\n\n      if (cell._column) {\n        context.column = cell._column;\n      }\n\n      if (context.section === 'body' || context.section === 'details') {\n        Object.assign(context, this.__getRowModel(cell.parentElement));\n      }\n\n      return context;\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const FilterMixin = (superClass) =>\n  class FilterMixin extends superClass {\n    static get properties() {\n      return {\n        /** @private */\n        _filters: {\n          type: Array,\n          value: () => [],\n        },\n      };\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n      this.addEventListener('filter-changed', this._filterChanged.bind(this));\n    }\n\n    /** @private */\n    _filterChanged(e) {\n      e.stopPropagation();\n\n      this.__addFilter(e.target);\n      this.__applyFilters();\n    }\n\n    /** @private */\n    __removeFilters(filtersToRemove) {\n      if (filtersToRemove.length === 0) {\n        return;\n      }\n\n      this._filters = this._filters.filter((filter) => filtersToRemove.indexOf(filter) < 0);\n      this.__applyFilters();\n    }\n\n    /** @private */\n    __addFilter(filter) {\n      const filterIndex = this._filters.indexOf(filter);\n\n      if (filterIndex === -1) {\n        this._filters.push(filter);\n      }\n    }\n\n    /** @private */\n    __applyFilters() {\n      if (this.dataProvider && this.isAttached) {\n        this.clearCache();\n      }\n    }\n\n    /**\n     * @return {!Array<!GridFilterDefinition>}\n     * @protected\n     */\n    _mapFilters() {\n      return this._filters.map((filter) => {\n        return {\n          path: filter.path,\n          value: filter.value,\n        };\n      });\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { addValueToAttribute, removeValueFromAttribute } from '@vaadin/component-base/src/dom-utils.js';\nimport { isKeyboardActive } from '@vaadin/component-base/src/focus-utils.js';\n\n/**\n * @polymerMixin\n */\nexport const KeyboardNavigationMixin = (superClass) =>\n  class KeyboardNavigationMixin extends superClass {\n    static get properties() {\n      return {\n        /** @private */\n        _headerFocusable: {\n          type: Object,\n          observer: '_focusableChanged',\n        },\n\n        /**\n         * @type {!HTMLElement | undefined}\n         * @protected\n         */\n        _itemsFocusable: {\n          type: Object,\n          observer: '_focusableChanged',\n        },\n\n        /** @private */\n        _footerFocusable: {\n          type: Object,\n          observer: '_focusableChanged',\n        },\n\n        /** @private */\n        _navigatingIsHidden: Boolean,\n\n        /**\n         * @type {number}\n         * @protected\n         */\n        _focusedItemIndex: {\n          type: Number,\n          value: 0,\n        },\n\n        /** @private */\n        _focusedColumnOrder: Number,\n\n        /** @private */\n        _focusedCell: {\n          type: Object,\n          observer: '_focusedCellChanged',\n        },\n\n        /**\n         * Indicates whether the grid is currently in interaction mode.\n         * In interaction mode the user is currently interacting with a control,\n         * such as an input or a select, within a cell.\n         * In interaction mode keyboard navigation between cells is disabled.\n         * Interaction mode also prevents the focus target cell of that section of\n         * the grid from receiving focus, allowing the user to switch focus to\n         * controls in adjacent cells, rather than focussing the outer cell\n         * itself.\n         * @type {boolean}\n         * @private\n         */\n        interacting: {\n          type: Boolean,\n          value: false,\n          reflectToAttribute: true,\n          readOnly: true,\n          observer: '_interactingChanged',\n        },\n      };\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      if (this._ios || this._android) {\n        // Disable keyboard navigation on mobile devices\n        return;\n      }\n\n      this.addEventListener('keydown', this._onKeyDown);\n      this.addEventListener('keyup', this._onKeyUp);\n\n      this.addEventListener('focusin', this._onFocusIn);\n      this.addEventListener('focusout', this._onFocusOut);\n\n      // When focus goes from cell to another cell, focusin/focusout events do\n      // not escape the grid’s shadowRoot, thus listening inside the shadowRoot.\n      this.$.table.addEventListener('focusin', this._onContentFocusIn.bind(this));\n\n      this.addEventListener('mousedown', () => {\n        this.toggleAttribute('navigating', false);\n        this._isMousedown = true;\n\n        // Reset stored order when moving focus with mouse.\n        this._focusedColumnOrder = undefined;\n      });\n      this.addEventListener('mouseup', () => {\n        this._isMousedown = false;\n      });\n    }\n\n    /** @private */\n    get __rowFocusMode() {\n      return (\n        this.__isRow(this._itemsFocusable) || this.__isRow(this._headerFocusable) || this.__isRow(this._footerFocusable)\n      );\n    }\n\n    set __rowFocusMode(value) {\n      ['_itemsFocusable', '_footerFocusable', '_headerFocusable'].forEach((prop) => {\n        const focusable = this[prop];\n        if (value) {\n          const parent = focusable && focusable.parentElement;\n          if (this.__isCell(focusable)) {\n            // Cell itself focusable (default)\n            this[prop] = parent;\n          } else if (this.__isCell(parent)) {\n            // Focus button mode is enabled for the column,\n            // button element inside the cell is focusable.\n            this[prop] = parent.parentElement;\n          }\n        } else if (!value && this.__isRow(focusable)) {\n          const cell = focusable.firstElementChild;\n          this[prop] = cell._focusButton || cell;\n        }\n      });\n    }\n\n    /** @private */\n    _focusableChanged(focusable, oldFocusable) {\n      if (oldFocusable) {\n        oldFocusable.setAttribute('tabindex', '-1');\n      }\n      if (focusable) {\n        this._updateGridSectionFocusTarget(focusable);\n      }\n    }\n\n    /** @private */\n    _focusedCellChanged(focusedCell, oldFocusedCell) {\n      if (oldFocusedCell) {\n        removeValueFromAttribute(oldFocusedCell, 'part', 'focused-cell');\n      }\n\n      if (focusedCell) {\n        addValueToAttribute(focusedCell, 'part', 'focused-cell');\n      }\n    }\n\n    /** @private */\n    _interactingChanged() {\n      // Update focus targets when entering / exiting interaction mode\n      this._updateGridSectionFocusTarget(this._headerFocusable);\n      this._updateGridSectionFocusTarget(this._itemsFocusable);\n      this._updateGridSectionFocusTarget(this._footerFocusable);\n    }\n\n    /**\n     * Since the focused cell/row state is stored as an element reference, the reference may get\n     * out of sync when the virtual indexes for elements update due to effective size change.\n     * This function updates the reference to the correct element after a possible index change.\n     * @private\n     */\n    __updateItemsFocusable() {\n      if (!this._itemsFocusable) {\n        return;\n      }\n\n      const wasFocused = this.shadowRoot.activeElement === this._itemsFocusable;\n\n      this._getVisibleRows().forEach((row) => {\n        if (row.index === this._focusedItemIndex) {\n          if (this.__rowFocusMode) {\n            // Row focus mode\n            this._itemsFocusable = row;\n          } else {\n            // Cell focus mode\n            let parent = this._itemsFocusable.parentElement;\n            let cell = this._itemsFocusable;\n\n            if (parent) {\n              // Focus button mode is enabled for the column,\n              // button element inside the cell is focusable.\n              if (this.__isCell(parent)) {\n                cell = parent;\n                parent = parent.parentElement;\n              }\n\n              const cellIndex = [...parent.children].indexOf(cell);\n              this._itemsFocusable = this.__getFocusable(row, row.children[cellIndex]);\n            }\n          }\n        }\n      });\n\n      if (wasFocused) {\n        this._itemsFocusable.focus();\n      }\n    }\n\n    /**\n     * @param {!KeyboardEvent} e\n     * @protected\n     */\n    _onKeyDown(e) {\n      const key = e.key;\n\n      let keyGroup;\n      switch (key) {\n        case 'ArrowUp':\n        case 'ArrowDown':\n        case 'ArrowLeft':\n        case 'ArrowRight':\n        case 'PageUp':\n        case 'PageDown':\n        case 'Home':\n        case 'End':\n          keyGroup = 'Navigation';\n          break;\n        case 'Enter':\n        case 'Escape':\n        case 'F2':\n          keyGroup = 'Interaction';\n          break;\n        case 'Tab':\n          keyGroup = 'Tab';\n          break;\n        case ' ':\n          keyGroup = 'Space';\n          break;\n        default:\n          break;\n      }\n\n      this._detectInteracting(e);\n      if (this.interacting && keyGroup !== 'Interaction') {\n        // When in the interacting mode, only the “Interaction” keys are handled.\n        keyGroup = undefined;\n      }\n\n      if (keyGroup) {\n        this[`_on${keyGroup}KeyDown`](e, key);\n      }\n    }\n\n    /** @private */\n    _ensureScrolledToIndex(index) {\n      const targetRowInDom = [...this.$.items.children].find((child) => child.index === index);\n      if (!targetRowInDom) {\n        this.scrollToIndex(index);\n      } else {\n        this.__scrollIntoViewport(index);\n      }\n    }\n\n    /** @private */\n    __isRowExpandable(row) {\n      if (this.itemHasChildrenPath) {\n        const item = row._item;\n        return item && this.get(this.itemHasChildrenPath, item) && !this._isExpanded(item);\n      }\n    }\n\n    /** @private */\n    __isRowCollapsible(row) {\n      return this._isExpanded(row._item);\n    }\n\n    /** @private */\n    __isDetailsCell(element) {\n      return element.matches('[part~=\"details-cell\"]');\n    }\n\n    /** @private */\n    __isCell(element) {\n      return element instanceof HTMLTableCellElement;\n    }\n\n    /** @private */\n    __isRow(element) {\n      return element instanceof HTMLTableRowElement;\n    }\n\n    /** @private */\n    __getIndexOfChildElement(el) {\n      return Array.prototype.indexOf.call(el.parentNode.children, el);\n    }\n\n    /** @private */\n    _onNavigationKeyDown(e, key) {\n      e.preventDefault();\n\n      const visibleItemsCount = this._lastVisibleIndex - this._firstVisibleIndex - 1;\n\n      // Handle keyboard interaction as defined in:\n      // https://w3c.github.io/aria-practices/#keyboard-interaction-24\n\n      let dx = 0,\n        dy = 0;\n      switch (key) {\n        case 'ArrowRight':\n          dx = this.__isRTL ? -1 : 1;\n          break;\n        case 'ArrowLeft':\n          dx = this.__isRTL ? 1 : -1;\n          break;\n        case 'Home':\n          if (this.__rowFocusMode) {\n            // \"If focus is on a row, moves focus to the first row. If focus is in the first row, focus does not move.\"\n            dy = -Infinity;\n          } else if (e.ctrlKey) {\n            // \"If focus is on a cell, moves focus to the first cell in the column. If focus is in the first row, focus does not move.\"\n            dy = -Infinity;\n          } else {\n            // \"If focus is on a cell, moves focus to the first cell in the row. If focus is in the first cell of the row, focus does not move.\"\n            dx = -Infinity;\n          }\n          break;\n        case 'End':\n          if (this.__rowFocusMode) {\n            // \"If focus is on a row, moves focus to the last row. If focus is in the last row, focus does not move.\"\n            dy = Infinity;\n          } else if (e.ctrlKey) {\n            // \"If focus is on a cell, moves focus to the last cell in the column. If focus is in the last row, focus does not move.\"\n            dy = Infinity;\n          } else {\n            // \"If focus is on a cell, moves focus to the last cell in the row. If focus is in the last cell of the row, focus does not move.\"\n            dx = Infinity;\n          }\n          break;\n        case 'ArrowDown':\n          dy = 1;\n          break;\n        case 'ArrowUp':\n          dy = -1;\n          break;\n        case 'PageDown':\n          dy = visibleItemsCount;\n          break;\n        case 'PageUp':\n          dy = -visibleItemsCount;\n          break;\n        default:\n          break;\n      }\n\n      const activeRow = e.composedPath().find((el) => this.__isRow(el));\n      const activeCell = e.composedPath().find((el) => this.__isCell(el));\n\n      if ((this.__rowFocusMode && !activeRow) || (!this.__rowFocusMode && !activeCell)) {\n        // When using a screen reader, it's possible that neither a cell nor a row is focused.\n        return;\n      }\n\n      const forwardsKey = this.__isRTL ? 'ArrowLeft' : 'ArrowRight';\n      const backwardsKey = this.__isRTL ? 'ArrowRight' : 'ArrowLeft';\n      if (key === forwardsKey) {\n        // \"Right Arrow:\"\n        if (this.__rowFocusMode) {\n          // In row focus mode\n          if (this.__isRowExpandable(activeRow)) {\n            // \"If focus is on a collapsed row, expands the row.\"\n            this.expandItem(activeRow._item);\n            return;\n          }\n          // \"If focus is on an expanded row or is on a row that does not have child rows,\n          // moves focus to the first cell in the row.\"\n          this.__rowFocusMode = false;\n          this._onCellNavigation(activeRow.firstElementChild, 0, 0);\n          return;\n        }\n      } else if (key === backwardsKey) {\n        // \"Left Arrow:\"\n        if (this.__rowFocusMode) {\n          // In row focus mode\n          if (this.__isRowCollapsible(activeRow)) {\n            // \"If focus is on an expanded row, collapses the row.\"\n            this.collapseItem(activeRow._item);\n            return;\n          }\n        } else {\n          // In cell focus mode\n          const activeRowCells = [...activeRow.children].sort((a, b) => a._order - b._order);\n          if (activeCell === activeRowCells[0] || this.__isDetailsCell(activeCell)) {\n            // \"If focus is on the first cell in a row and row focus is supported, moves focus to the row.\"\n            this.__rowFocusMode = true;\n            this._onRowNavigation(activeRow, 0);\n            return;\n          }\n        }\n      }\n\n      // Navigate\n      if (this.__rowFocusMode) {\n        // Navigate the rows\n        this._onRowNavigation(activeRow, dy);\n      } else {\n        // Navigate the cells\n        this._onCellNavigation(activeCell, dx, dy);\n      }\n    }\n\n    /**\n     * Focuses the target row after navigating by the given dy offset.\n     * If the row is not in the viewport, it is first scrolled to.\n     * @private\n     */\n    _onRowNavigation(activeRow, dy) {\n      const { dstRow } = this.__navigateRows(dy, activeRow);\n\n      if (dstRow) {\n        dstRow.focus();\n      }\n    }\n\n    /** @private */\n    __getIndexInGroup(row, bodyFallbackIndex) {\n      const rowGroup = row.parentNode;\n      // Body rows have index property, otherwise DOM child index of the row is used.\n      if (rowGroup === this.$.items) {\n        return bodyFallbackIndex !== undefined ? bodyFallbackIndex : row.index;\n      }\n      return this.__getIndexOfChildElement(row);\n    }\n\n    /**\n     * Returns the target row after navigating by the given dy offset.\n     * Also returns information whether the details cell should be the target on the target row.\n     * If the row is not in the viewport, it is first scrolled to.\n     * @private\n     */\n    __navigateRows(dy, activeRow, activeCell) {\n      const currentRowIndex = this.__getIndexInGroup(activeRow, this._focusedItemIndex);\n      const activeRowGroup = activeRow.parentNode;\n      const maxRowIndex = (activeRowGroup === this.$.items ? this._effectiveSize : activeRowGroup.children.length) - 1;\n\n      // Index of the destination row\n      let dstRowIndex = Math.max(0, Math.min(currentRowIndex + dy, maxRowIndex));\n\n      if (activeRowGroup !== this.$.items) {\n        // Navigating header/footer rows\n\n        // Header and footer could have hidden rows, e. g., if none of the columns\n        // or groups on the given column tree level define template. Skip them\n        // in vertical keyboard navigation.\n        if (dstRowIndex > currentRowIndex) {\n          while (dstRowIndex < maxRowIndex && activeRowGroup.children[dstRowIndex].hidden) {\n            dstRowIndex += 1;\n          }\n        } else if (dstRowIndex < currentRowIndex) {\n          while (dstRowIndex > 0 && activeRowGroup.children[dstRowIndex].hidden) {\n            dstRowIndex -= 1;\n          }\n        }\n\n        this.toggleAttribute('navigating', true);\n\n        return { dstRow: activeRowGroup.children[dstRowIndex] };\n      }\n      // Navigating body rows\n\n      let dstIsRowDetails = false;\n      if (activeCell) {\n        const isRowDetails = this.__isDetailsCell(activeCell);\n        // Row details navigation logic\n        if (activeRowGroup === this.$.items) {\n          const item = activeRow._item;\n          const dstItem = this._cache.getItemForIndex(dstRowIndex);\n          // Should we navigate to row details?\n          if (isRowDetails) {\n            dstIsRowDetails = dy === 0;\n          } else {\n            dstIsRowDetails =\n              (dy === 1 && this._isDetailsOpened(item)) ||\n              (dy === -1 && dstRowIndex !== currentRowIndex && this._isDetailsOpened(dstItem));\n          }\n          // Should we navigate between details and regular cells of the same row?\n          if (dstIsRowDetails !== isRowDetails && ((dy === 1 && dstIsRowDetails) || (dy === -1 && !dstIsRowDetails))) {\n            dstRowIndex = currentRowIndex;\n          }\n        }\n      }\n\n      // Ensure correct vertical scroll position, destination row is visible\n      this._ensureScrolledToIndex(dstRowIndex);\n\n      // When scrolling with repeated keydown, sometimes FocusEvent listeners\n      // are too late to update _focusedItemIndex. Ensure next keydown\n      // listener invocation gets updated _focusedItemIndex value.\n      this._focusedItemIndex = dstRowIndex;\n\n      // This has to be set after scrolling, otherwise it can be removed by\n      // `_preventScrollerRotatingCellFocus(row, index)` during scrolling.\n      this.toggleAttribute('navigating', true);\n\n      return {\n        dstRow: [...activeRowGroup.children].find((el) => !el.hidden && el.index === dstRowIndex),\n        dstIsRowDetails,\n      };\n    }\n\n    /**\n     * Focuses the target cell after navigating by the given dx and dy offset.\n     * If the cell is not in the viewport, it is first scrolled to.\n     * @private\n     */\n    _onCellNavigation(activeCell, dx, dy) {\n      const activeRow = activeCell.parentNode;\n      const { dstRow, dstIsRowDetails } = this.__navigateRows(dy, activeRow, activeCell);\n      if (!dstRow) {\n        return;\n      }\n\n      const columnIndex = this.__getIndexOfChildElement(activeCell);\n      const isCurrentCellRowDetails = this.__isDetailsCell(activeCell);\n      const activeRowGroup = activeRow.parentNode;\n      const currentRowIndex = this.__getIndexInGroup(activeRow, this._focusedItemIndex);\n\n      // _focusedColumnOrder is memoized — this is to ensure predictable\n      // navigation when entering and leaving detail and column group cells.\n      if (this._focusedColumnOrder === undefined) {\n        if (isCurrentCellRowDetails) {\n          this._focusedColumnOrder = 0;\n        } else {\n          this._focusedColumnOrder = this._getColumns(activeRowGroup, currentRowIndex).filter((c) => !c.hidden)[\n            columnIndex\n          ]._order;\n        }\n      }\n\n      if (dstIsRowDetails) {\n        // Focusing a row details cell on the destination row\n        const dstCell = [...dstRow.children].find((el) => this.__isDetailsCell(el));\n        dstCell.focus();\n      } else {\n        // Focusing a regular cell on the destination row\n\n        // Find orderedColumnIndex — the index of order closest matching the\n        // original _focusedColumnOrder in the sorted array of orders\n        // of the visible columns on the destination row.\n        const dstRowIndex = this.__getIndexInGroup(dstRow, this._focusedItemIndex);\n        const dstColumns = this._getColumns(activeRowGroup, dstRowIndex).filter((c) => !c.hidden);\n        const dstSortedColumnOrders = dstColumns.map((c) => c._order).sort((b, a) => b - a);\n        const maxOrderedColumnIndex = dstSortedColumnOrders.length - 1;\n        const orderedColumnIndex = dstSortedColumnOrders.indexOf(\n          dstSortedColumnOrders\n            .slice(0)\n            .sort((b, a) => Math.abs(b - this._focusedColumnOrder) - Math.abs(a - this._focusedColumnOrder))[0],\n        );\n\n        // Index of the destination column order\n        const dstOrderedColumnIndex =\n          dy === 0 && isCurrentCellRowDetails\n            ? orderedColumnIndex\n            : Math.max(0, Math.min(orderedColumnIndex + dx, maxOrderedColumnIndex));\n\n        if (dstOrderedColumnIndex !== orderedColumnIndex) {\n          // Horizontal movement invalidates stored _focusedColumnOrder\n          this._focusedColumnOrder = undefined;\n        }\n\n        const columnIndexByOrder = dstColumns.reduce((acc, col, i) => {\n          acc[col._order] = i;\n          return acc;\n        }, {});\n        const dstColumnIndex = columnIndexByOrder[dstSortedColumnOrders[dstOrderedColumnIndex]];\n        const dstCell = dstRow.children[dstColumnIndex];\n\n        this._scrollHorizontallyToCell(dstCell);\n        dstCell.focus();\n      }\n    }\n\n    /** @private */\n    _onInteractionKeyDown(e, key) {\n      const localTarget = e.composedPath()[0];\n      const localTargetIsTextInput =\n        localTarget.localName === 'input' &&\n        !/^(button|checkbox|color|file|image|radio|range|reset|submit)$/i.test(localTarget.type);\n\n      let wantInteracting;\n      switch (key) {\n        case 'Enter':\n          wantInteracting = this.interacting ? !localTargetIsTextInput : true;\n          break;\n        case 'Escape':\n          wantInteracting = false;\n          break;\n        case 'F2':\n          wantInteracting = !this.interacting;\n          break;\n        default:\n          break;\n      }\n\n      const { cell } = this._getGridEventLocation(e);\n\n      if (this.interacting !== wantInteracting && cell !== null) {\n        if (wantInteracting) {\n          const focusTarget =\n            cell._content.querySelector('[focus-target]') ||\n            // If a child element hasn't been explicitly marked as a focus target,\n            // fall back to any focusable element inside the cell.\n            [...cell._content.querySelectorAll('*')].find((node) => this._isFocusable(node));\n          if (focusTarget) {\n            e.preventDefault();\n            focusTarget.focus();\n            this._setInteracting(true);\n            this.toggleAttribute('navigating', false);\n          }\n        } else {\n          e.preventDefault();\n          this._focusedColumnOrder = undefined;\n          cell.focus();\n          this._setInteracting(false);\n          this.toggleAttribute('navigating', true);\n        }\n      }\n\n      if (key === 'Escape') {\n        this._hideTooltip(true);\n      }\n    }\n\n    /** @private */\n    _predictFocusStepTarget(srcElement, step) {\n      const tabOrder = [\n        this.$.table,\n        this._headerFocusable,\n        this._itemsFocusable,\n        this._footerFocusable,\n        this.$.focusexit,\n      ];\n\n      let index = tabOrder.indexOf(srcElement);\n\n      index += step;\n      while (index >= 0 && index <= tabOrder.length - 1) {\n        let rowElement = tabOrder[index];\n        if (rowElement && !this.__rowFocusMode) {\n          rowElement = tabOrder[index].parentNode;\n        }\n\n        if (!rowElement || rowElement.hidden) {\n          index += step;\n        } else {\n          break;\n        }\n      }\n\n      let focusStepTarget = tabOrder[index];\n\n      // If the target focusable is tied to a column that is not visible,\n      // find the first visible column and update the target in order to\n      // prevent scrolling to the start of the row.\n      if (focusStepTarget && !this.__isHorizontallyInViewport(focusStepTarget)) {\n        const firstVisibleColumn = this._getColumnsInOrder().find((column) => this.__isColumnInViewport(column));\n        if (firstVisibleColumn) {\n          if (focusStepTarget === this._headerFocusable) {\n            focusStepTarget = firstVisibleColumn._headerCell;\n          } else if (focusStepTarget === this._itemsFocusable) {\n            const rowIndex = focusStepTarget._column._cells.indexOf(focusStepTarget);\n            focusStepTarget = firstVisibleColumn._cells[rowIndex];\n          } else if (focusStepTarget === this._footerFocusable) {\n            focusStepTarget = firstVisibleColumn._footerCell;\n          }\n        }\n      }\n\n      return focusStepTarget;\n    }\n\n    /**\n     * Returns true if the given column is horizontally inside the viewport.\n     * @private\n     */\n    __isColumnInViewport(column) {\n      if (column.frozen || column.frozenToEnd) {\n        // Assume frozen columns to always be inside the viewport\n        return true;\n      }\n      return this.__isHorizontallyInViewport(column._sizerCell);\n    }\n\n    /** @private */\n    __isHorizontallyInViewport(element) {\n      return (\n        element.offsetLeft + element.offsetWidth >= this._scrollLeft &&\n        element.offsetLeft <= this._scrollLeft + this.clientWidth\n      );\n    }\n\n    /** @private */\n    _onTabKeyDown(e) {\n      const focusTarget = this._predictFocusStepTarget(e.composedPath()[0], e.shiftKey ? -1 : 1);\n\n      // Can be undefined if grid has tabindex\n      if (!focusTarget) {\n        return;\n      }\n\n      // Prevent focus-trap logic from intercepting the event.\n      e.stopPropagation();\n\n      if (focusTarget === this.$.table) {\n        // The focus is about to exit the grid to the top.\n        this.$.table.focus();\n      } else if (focusTarget === this.$.focusexit) {\n        // The focus is about to exit the grid to the bottom.\n        this.$.focusexit.focus();\n      } else if (focusTarget === this._itemsFocusable) {\n        let itemsFocusTarget = focusTarget;\n        const targetRow = this.__isRow(focusTarget) ? focusTarget : focusTarget.parentNode;\n        this._ensureScrolledToIndex(this._focusedItemIndex);\n        if (targetRow.index !== this._focusedItemIndex && this.__isCell(focusTarget)) {\n          // The target row, which is about to be focused next, has been\n          // assigned with a new index since last focus, probably because of\n          // scrolling. Focus the row for the stored focused item index instead.\n          const columnIndex = Array.from(targetRow.children).indexOf(this._itemsFocusable);\n          const focusedItemRow = Array.from(this.$.items.children).find(\n            (row) => !row.hidden && row.index === this._focusedItemIndex,\n          );\n          if (focusedItemRow) {\n            itemsFocusTarget = focusedItemRow.children[columnIndex];\n          }\n        }\n        e.preventDefault();\n        itemsFocusTarget.focus();\n      } else {\n        e.preventDefault();\n        focusTarget.focus();\n      }\n\n      this.toggleAttribute('navigating', true);\n    }\n\n    /** @private */\n    _onSpaceKeyDown(e) {\n      e.preventDefault();\n\n      const element = e.composedPath()[0];\n      const isRow = this.__isRow(element);\n      if (isRow || !element._content || !element._content.firstElementChild) {\n        this.dispatchEvent(\n          new CustomEvent(isRow ? 'row-activate' : 'cell-activate', {\n            detail: {\n              model: this.__getRowModel(isRow ? element : element.parentElement),\n            },\n          }),\n        );\n      }\n    }\n\n    /** @private */\n    _onKeyUp(e) {\n      if (!/^( |SpaceBar)$/.test(e.key) || this.interacting) {\n        return;\n      }\n\n      e.preventDefault();\n\n      const cell = e.composedPath()[0];\n      if (cell._content && cell._content.firstElementChild) {\n        const wasNavigating = this.hasAttribute('navigating');\n        cell._content.firstElementChild.dispatchEvent(\n          new MouseEvent('click', {\n            shiftKey: e.shiftKey,\n            bubbles: true,\n            composed: true,\n            cancelable: true,\n          }),\n        );\n        this.toggleAttribute('navigating', wasNavigating);\n      }\n    }\n\n    /**\n     * @param {!FocusEvent} e\n     * @protected\n     */\n    _onFocusIn(e) {\n      if (!this._isMousedown) {\n        this.toggleAttribute('navigating', true);\n      }\n\n      const rootTarget = e.composedPath()[0];\n\n      if (rootTarget === this.$.table || rootTarget === this.$.focusexit) {\n        if (!this._isMousedown) {\n          // The focus enters the top (bottom) of the grid, meaning that user has\n          // tabbed (shift-tabbed) into the grid. Move the focus to\n          // the first (the last) focusable.\n          this._predictFocusStepTarget(rootTarget, rootTarget === this.$.table ? 1 : -1).focus();\n        }\n        this._setInteracting(false);\n      } else {\n        this._detectInteracting(e);\n      }\n    }\n\n    /**\n     * @param {!FocusEvent} e\n     * @protected\n     */\n    _onFocusOut(e) {\n      this.toggleAttribute('navigating', false);\n      this._detectInteracting(e);\n      this._hideTooltip();\n      this._focusedCell = null;\n    }\n\n    /** @private */\n    _onContentFocusIn(e) {\n      const { section, cell, row } = this._getGridEventLocation(e);\n\n      if (!cell && !this.__rowFocusMode) {\n        return;\n      }\n\n      this._detectInteracting(e);\n\n      if (section && (cell || row)) {\n        this._activeRowGroup = section;\n        if (this.$.header === section) {\n          this._headerFocusable = this.__getFocusable(row, cell);\n        } else if (this.$.items === section) {\n          this._itemsFocusable = this.__getFocusable(row, cell);\n        } else if (this.$.footer === section) {\n          this._footerFocusable = this.__getFocusable(row, cell);\n        }\n\n        if (cell) {\n          const context = this.getEventContext(e);\n          this.__pendingBodyCellFocus = this.loading && context.section === 'body';\n          if (!this.__pendingBodyCellFocus) {\n            // Fire a cell-focus event for the cell\n            cell.dispatchEvent(new CustomEvent('cell-focus', { bubbles: true, composed: true, detail: { context } }));\n          }\n          this._focusedCell = cell._focusButton || cell;\n\n          if (isKeyboardActive() && e.target === cell) {\n            this._showTooltip(e);\n          }\n        } else {\n          this._focusedCell = null;\n        }\n      }\n\n      this._detectFocusedItemIndex(e);\n    }\n\n    /**\n     * @private\n     */\n    __dispatchPendingBodyCellFocus() {\n      // If the body cell focus was pending, dispatch the event once loading is done\n      if (this.__pendingBodyCellFocus && this.shadowRoot.activeElement === this._itemsFocusable) {\n        this._itemsFocusable.dispatchEvent(new Event('focusin', { bubbles: true, composed: true }));\n      }\n    }\n\n    /**\n     * Get the focusable element depending on the current focus mode.\n     * It can be a row, a cell, or a focusable div inside a cell.\n     *\n     * @param {HTMLElement} row\n     * @param {HTMLElement} cell\n     * @return {HTMLElement}\n     * @private\n     */\n    __getFocusable(row, cell) {\n      return this.__rowFocusMode ? row : cell._focusButton || cell;\n    }\n\n    /**\n     * Enables interaction mode if a cells descendant receives focus or keyboard\n     * input. Disables it if the event is not related to cell content.\n     * @param {!KeyboardEvent|!FocusEvent} e\n     * @private\n     */\n    _detectInteracting(e) {\n      const isInteracting = e.composedPath().some((el) => el.localName === 'vaadin-grid-cell-content');\n      this._setInteracting(isInteracting);\n      this.__updateHorizontalScrollPosition();\n    }\n\n    /** @private */\n    _detectFocusedItemIndex(e) {\n      const { section, row } = this._getGridEventLocation(e);\n      if (section === this.$.items) {\n        this._focusedItemIndex = row.index;\n      }\n    }\n\n    /**\n     * Enables or disables the focus target of the containing section of the\n     * grid from receiving focus, based on whether the user is interacting with\n     * that section of the grid.\n     * @param {HTMLElement} focusTarget\n     * @private\n     */\n    _updateGridSectionFocusTarget(focusTarget) {\n      if (!focusTarget) {\n        return;\n      }\n\n      const section = this._getGridSectionFromFocusTarget(focusTarget);\n      const isInteractingWithinActiveSection = this.interacting && section === this._activeRowGroup;\n\n      focusTarget.tabIndex = isInteractingWithinActiveSection ? -1 : 0;\n    }\n\n    /**\n     * @param {!HTMLTableRowElement} row\n     * @param {number} index\n     * @protected\n     */\n    _preventScrollerRotatingCellFocus(row, index) {\n      if (\n        row.index === this._focusedItemIndex &&\n        this.hasAttribute('navigating') &&\n        this._activeRowGroup === this.$.items\n      ) {\n        // Focused item has went, hide navigation mode\n        this._navigatingIsHidden = true;\n        this.toggleAttribute('navigating', false);\n      }\n      if (index === this._focusedItemIndex && this._navigatingIsHidden) {\n        // Focused item is back, restore navigation mode\n        this._navigatingIsHidden = false;\n        this.toggleAttribute('navigating', true);\n      }\n    }\n\n    /**\n     * @param {HTMLTableSectionElement=} rowGroup\n     * @param {number=} rowIndex\n     * @return {!Array<!GridColumn>}\n     * @protected\n     */\n    _getColumns(rowGroup, rowIndex) {\n      let columnTreeLevel = this._columnTree.length - 1;\n      if (rowGroup === this.$.header) {\n        columnTreeLevel = rowIndex;\n      } else if (rowGroup === this.$.footer) {\n        columnTreeLevel = this._columnTree.length - 1 - rowIndex;\n      }\n      return this._columnTree[columnTreeLevel];\n    }\n\n    /** @private */\n    __isValidFocusable(element) {\n      return this.$.table.contains(element) && element.offsetHeight;\n    }\n\n    /** @protected */\n    _resetKeyboardNavigation() {\n      // Header / footer\n      ['header', 'footer'].forEach((section) => {\n        if (!this.__isValidFocusable(this[`_${section}Focusable`])) {\n          const firstVisibleRow = [...this.$[section].children].find((row) => row.offsetHeight);\n          const firstVisibleCell = firstVisibleRow ? [...firstVisibleRow.children].find((cell) => !cell.hidden) : null;\n          if (firstVisibleRow && firstVisibleCell) {\n            this[`_${section}Focusable`] = this.__getFocusable(firstVisibleRow, firstVisibleCell);\n          }\n        }\n      });\n\n      // Body\n      if (!this.__isValidFocusable(this._itemsFocusable) && this.$.items.firstElementChild) {\n        const firstVisibleRow = this.__getFirstVisibleItem();\n        const firstVisibleCell = firstVisibleRow ? [...firstVisibleRow.children].find((cell) => !cell.hidden) : null;\n\n        if (firstVisibleCell && firstVisibleRow) {\n          // Reset memoized column\n          delete this._focusedColumnOrder;\n          this._itemsFocusable = this.__getFocusable(firstVisibleRow, firstVisibleCell);\n        }\n      } else {\n        this.__updateItemsFocusable();\n      }\n    }\n\n    /**\n     * @param {!HTMLElement} dstCell\n     * @protected\n     */\n    _scrollHorizontallyToCell(dstCell) {\n      if (dstCell.hasAttribute('frozen') || dstCell.hasAttribute('frozen-to-end') || this.__isDetailsCell(dstCell)) {\n        // These cells are, by design, always visible, no need to scroll.\n        return;\n      }\n\n      const dstCellRect = dstCell.getBoundingClientRect();\n      const dstRow = dstCell.parentNode;\n      const dstCellIndex = Array.from(dstRow.children).indexOf(dstCell);\n      const tableRect = this.$.table.getBoundingClientRect();\n      let leftBoundary = tableRect.left,\n        rightBoundary = tableRect.right;\n      for (let i = dstCellIndex - 1; i >= 0; i--) {\n        const cell = dstRow.children[i];\n        if (cell.hasAttribute('hidden') || this.__isDetailsCell(cell)) {\n          continue;\n        }\n        if (cell.hasAttribute('frozen') || cell.hasAttribute('frozen-to-end')) {\n          leftBoundary = cell.getBoundingClientRect().right;\n          break;\n        }\n      }\n      for (let i = dstCellIndex + 1; i < dstRow.children.length; i++) {\n        const cell = dstRow.children[i];\n        if (cell.hasAttribute('hidden') || this.__isDetailsCell(cell)) {\n          continue;\n        }\n        if (cell.hasAttribute('frozen') || cell.hasAttribute('frozen-to-end')) {\n          rightBoundary = cell.getBoundingClientRect().left;\n          break;\n        }\n      }\n\n      if (dstCellRect.left < leftBoundary) {\n        this.$.table.scrollLeft += Math.round(dstCellRect.left - leftBoundary);\n      }\n      if (dstCellRect.right > rightBoundary) {\n        this.$.table.scrollLeft += Math.round(dstCellRect.right - rightBoundary);\n      }\n    }\n\n    /**\n     * @typedef {Object} GridEventLocation\n     * @property {HTMLTableSectionElement | null} section - The table section element that the event occurred in (header, body, or footer), or null if the event did not occur in a section\n     * @property {HTMLTableRowElement | null} row - The row element that the event occurred in, or null if the event did not occur in a row\n     * @property {HTMLTableCellElement | null} cell - The cell element that the event occurred in, or null if the event did not occur in a cell\n     * @private\n     */\n    /**\n     * Takes an event and returns a location object describing in which part of the grid the event occurred.\n     * The event may either target table section, a row, a cell or contents of a cell.\n     * @param {Event} e\n     * @returns {GridEventLocation}\n     * @private\n     */\n    _getGridEventLocation(e) {\n      const path = e.composedPath();\n      const tableIndex = path.indexOf(this.$.table);\n      // Assuming ascending path to table is: [...,] th|td, tr, thead|tbody, table [,...]\n      const section = tableIndex >= 1 ? path[tableIndex - 1] : null;\n      const row = tableIndex >= 2 ? path[tableIndex - 2] : null;\n      const cell = tableIndex >= 3 ? path[tableIndex - 3] : null;\n\n      return {\n        section,\n        row,\n        cell,\n      };\n    }\n\n    /**\n     * Helper method that maps a focus target cell to the containing grid section\n     * @param {HTMLElement} focusTarget\n     * @returns {HTMLTableSectionElement | null}\n     * @private\n     */\n    _getGridSectionFromFocusTarget(focusTarget) {\n      if (focusTarget === this._headerFocusable) {\n        return this.$.header;\n      }\n      if (focusTarget === this._itemsFocusable) {\n        return this.$.items;\n      }\n      if (focusTarget === this._footerFocusable) {\n        return this.$.footer;\n      }\n      return null;\n    }\n\n    /**\n     * Fired when a cell is focused with click or keyboard navigation.\n     *\n     * Use context property of @see {@link GridCellFocusEvent} to get detail information about the event.\n     *\n     * @event cell-focus\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const RowDetailsMixin = (superClass) =>\n  class RowDetailsMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * An array containing references to items with open row details.\n         * @type {!Array<!GridItem>}\n         */\n        detailsOpenedItems: {\n          type: Array,\n          value: () => [],\n        },\n\n        /**\n         * Custom function for rendering the content of the row details.\n         * Receives three arguments:\n         *\n         * - `root` The row details content DOM element. Append your content to it.\n         * - `grid` The `<vaadin-grid>` element.\n         * - `model` The object with the properties related with\n         *   the rendered item, contains:\n         *   - `model.index` The index of the item.\n         *   - `model.item` The item.\n         *   - `model.level` The number of the item's tree sublevel, starts from 0.\n         *   - `model.expanded` True if the item's tree sublevel is expanded.\n         *   - `model.selected` True if the item is selected.\n         *\n         * @type {GridRowDetailsRenderer | null | undefined}\n         */\n        rowDetailsRenderer: Function,\n\n        /**\n         * @type {!Array<!HTMLElement> | undefined}\n         * @protected\n         */\n        _detailsCells: {\n          type: Array,\n        },\n      };\n    }\n\n    static get observers() {\n      return [\n        '_detailsOpenedItemsChanged(detailsOpenedItems.*, rowDetailsRenderer)',\n        '_rowDetailsRendererChanged(rowDetailsRenderer)',\n      ];\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      this._detailsCellResizeObserver = new ResizeObserver((entries) => {\n        entries.forEach(({ target: cell }) => {\n          this._updateDetailsCellHeight(cell.parentElement);\n        });\n\n        // This workaround is needed until Safari also supports\n        // ResizeObserver.observe with {box: 'border-box'}\n        this.__virtualizer.__adapter._resizeHandler();\n      });\n    }\n\n    /** @private */\n    _rowDetailsRendererChanged(rowDetailsRenderer) {\n      if (!rowDetailsRenderer) {\n        return;\n      }\n\n      if (this._columnTree) {\n        // Only update the rows if the column tree has already been initialized\n        Array.from(this.$.items.children).forEach((row) => {\n          if (!row.querySelector('[part~=details-cell]')) {\n            this._updateRow(row, this._columnTree[this._columnTree.length - 1]);\n            const isDetailsOpened = this._isDetailsOpened(row._item);\n            this._toggleDetailsCell(row, isDetailsOpened);\n          }\n        });\n      }\n    }\n\n    /** @private */\n    _detailsOpenedItemsChanged(changeRecord, rowDetailsRenderer) {\n      // Skip to avoid duplicate work of both “.splices” and “.length” updates.\n      if (changeRecord.path === 'detailsOpenedItems.length' || !changeRecord.value) {\n        return;\n      }\n\n      [...this.$.items.children].forEach((row) => {\n        // Re-renders the row to possibly close the previously opened details.\n        if (row.hasAttribute('details-opened')) {\n          this._updateItem(row, row._item);\n          return;\n        }\n\n        // Re-renders the row to open the details when a row details renderer is provided.\n        if (rowDetailsRenderer && this._isDetailsOpened(row._item)) {\n          this._updateItem(row, row._item);\n        }\n      });\n    }\n\n    /**\n     * @param {!HTMLElement} cell\n     * @protected\n     */\n    _configureDetailsCell(cell) {\n      cell.setAttribute('part', 'cell details-cell');\n      // Freeze the details cell, so that it does not scroll horizontally\n      // with the normal cells. This way it looks less weird.\n      cell.toggleAttribute('frozen', true);\n\n      this._detailsCellResizeObserver.observe(cell);\n    }\n\n    /**\n     * @param {!HTMLElement} row\n     * @param {!GridItem} item\n     * @protected\n     */\n    _toggleDetailsCell(row, detailsOpened) {\n      const cell = row.querySelector('[part~=\"details-cell\"]');\n      if (!cell) {\n        return;\n      }\n\n      cell.hidden = !detailsOpened;\n\n      if (cell.hidden) {\n        return;\n      }\n\n      // Assigns a renderer when the details cell is opened.\n      // The details cell content is rendered later in the `_updateItem` method.\n      if (this.rowDetailsRenderer) {\n        cell._renderer = this.rowDetailsRenderer;\n      }\n    }\n\n    /** @protected */\n    _updateDetailsCellHeight(row) {\n      const cell = row.querySelector('[part~=\"details-cell\"]');\n      if (!cell) {\n        return;\n      }\n\n      this.__updateDetailsRowPadding(row, cell);\n      // Ensure the row has correct padding after frame (the resize observer might miss it)\n      requestAnimationFrame(() => this.__updateDetailsRowPadding(row, cell));\n    }\n\n    /** @private */\n    __updateDetailsRowPadding(row, cell) {\n      if (cell.hidden) {\n        row.style.removeProperty('padding-bottom');\n      } else {\n        row.style.setProperty('padding-bottom', `${cell.offsetHeight}px`);\n      }\n    }\n\n    /** @protected */\n    _updateDetailsCellHeights() {\n      [...this.$.items.children].forEach((row) => {\n        this._updateDetailsCellHeight(row);\n      });\n    }\n\n    /**\n     * @param {!GridItem} item\n     * @return {boolean}\n     * @protected\n     */\n    _isDetailsOpened(item) {\n      return this.detailsOpenedItems && this._getItemIndexInArray(item, this.detailsOpenedItems) !== -1;\n    }\n\n    /**\n     * Open the details row of a given item.\n     * @param {!GridItem} item\n     */\n    openItemDetails(item) {\n      if (!this._isDetailsOpened(item)) {\n        this.detailsOpenedItems = [...this.detailsOpenedItems, item];\n      }\n    }\n\n    /**\n     * Close the details row of a given item.\n     * @param {!GridItem} item\n     */\n    closeItemDetails(item) {\n      if (this._isDetailsOpened(item)) {\n        this.detailsOpenedItems = this.detailsOpenedItems.filter((i) => !this._itemsEqual(i, item));\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';\n\nconst observer = new ResizeObserver((entries) => {\n  setTimeout(() => {\n    entries.forEach((entry) => {\n      // Notify child resizables, if any\n      if (entry.target.resizables) {\n        entry.target.resizables.forEach((resizable) => {\n          resizable._onResize(entry.contentRect);\n        });\n      } else {\n        entry.target._onResize(entry.contentRect);\n      }\n    });\n  });\n});\n\n/**\n * A mixin that uses a ResizeObserver to listen to host size changes.\n *\n * @polymerMixin\n */\nexport const ResizeMixin = dedupingMixin(\n  (superclass) =>\n    class ResizeMixinClass extends superclass {\n      /** @protected */\n      connectedCallback() {\n        super.connectedCallback();\n        observer.observe(this);\n\n        if (this._observeParent) {\n          const parent = this.parentNode instanceof ShadowRoot ? this.parentNode.host : this.parentNode;\n\n          if (!parent.resizables) {\n            parent.resizables = new Set();\n            observer.observe(parent);\n          }\n\n          parent.resizables.add(this);\n          this.__parent = parent;\n        }\n      }\n\n      /** @protected */\n      disconnectedCallback() {\n        super.disconnectedCallback();\n        observer.unobserve(this);\n\n        const parent = this.__parent;\n        if (this._observeParent && parent) {\n          const resizables = parent.resizables;\n\n          if (resizables) {\n            resizables.delete(this);\n\n            if (resizables.size === 0) {\n              observer.unobserve(parent);\n            }\n          }\n\n          this.__parent = null;\n        }\n      }\n\n      /**\n       * When true, the parent element resize will be also observed.\n       * Override this getter and return `true` to enable this.\n       *\n       * @protected\n       */\n      get _observeParent() {\n        return false;\n      }\n\n      /**\n       * A handler invoked on host resize. By default, it does nothing.\n       * Override the method to implement your own behavior.\n       *\n       * @protected\n       */\n      _onResize(_contentRect) {\n        // To be implemented.\n      }\n\n      /**\n       * @deprecated Since Vaadin 23, `notifyResize()` is deprecated. The component uses a\n       * ResizeObserver internally and doesn't need to be explicitly notified of resizes.\n       */\n      notifyResize() {\n        console.warn(\n          `WARNING: Since Vaadin 23, notifyResize() is deprecated. The component uses a ResizeObserver internally and doesn't need to be explicitly notified of resizes.`,\n        );\n      }\n    },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { animationFrame, microTask, timeOut } from '@vaadin/component-base/src/async.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { isElementHidden } from '@vaadin/component-base/src/focus-utils.js';\nimport { ResizeMixin } from '@vaadin/component-base/src/resize-mixin.js';\n\nconst timeouts = {\n  SCROLLING: 500,\n};\n\n/**\n * @polymerMixin\n */\nexport const ScrollMixin = (superClass) =>\n  class ScrollMixin extends ResizeMixin(superClass) {\n    static get properties() {\n      return {\n        /**\n         * Cached array of frozen cells\n         * @private\n         */\n        _frozenCells: {\n          type: Array,\n          value: () => [],\n        },\n\n        /**\n         * Cached array of cells frozen to end\n         * @private\n         */\n        _frozenToEndCells: {\n          type: Array,\n          value: () => [],\n        },\n\n        /** @private */\n        _rowWithFocusedElement: Element,\n      };\n    }\n\n    /** @private */\n    get _scrollTop() {\n      return this.$.table.scrollTop;\n    }\n\n    /**\n     * Override (from iron-scroll-target-behavior) to avoid document scroll\n     * @private\n     */\n    set _scrollTop(top) {\n      this.$.table.scrollTop = top;\n    }\n\n    /** @private */\n    get _scrollLeft() {\n      return this.$.table.scrollLeft;\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n\n      this.scrollTarget = this.$.table;\n\n      this.$.items.addEventListener('focusin', (e) => {\n        const itemsIndex = e.composedPath().indexOf(this.$.items);\n        this._rowWithFocusedElement = e.composedPath()[itemsIndex - 1];\n      });\n      this.$.items.addEventListener('focusout', () => {\n        this._rowWithFocusedElement = undefined;\n      });\n\n      this.$.table.addEventListener('scroll', () => this._afterScroll());\n    }\n\n    /**\n     * @protected\n     * @override\n     */\n    _onResize() {\n      this._updateOverflow();\n      this.__updateHorizontalScrollPosition();\n\n      // For Firefox, manually restore last scroll position when grid becomes\n      // visible again. This solves an issue where switching visibility of two\n      // grids causes Firefox trying to synchronize the scroll positions between\n      // the two grid's table elements.\n      // See https://github.com/vaadin/web-components/issues/5796\n      if (this._firefox) {\n        const isVisible = !isElementHidden(this);\n        if (isVisible && this.__previousVisible === false) {\n          this._scrollTop = this.__memorizedScrollTop || 0;\n        }\n        this.__previousVisible = isVisible;\n      }\n    }\n\n    /**\n     * Scroll to a specific row index in the virtual list. Note that the row index is\n     * not always the same for any particular item. For example, sorting/filtering/expanding\n     * or collapsing hierarchical items can affect the row index related to an item.\n     *\n     * @param {number} index Row index to scroll to\n     */\n    scrollToIndex(index) {\n      index = Math.min(this._effectiveSize - 1, Math.max(0, index));\n      this.__virtualizer.scrollToIndex(index);\n      this.__scrollIntoViewport(index);\n    }\n\n    /**\n     * Makes sure the row with the given index (if found in the DOM) is fully\n     * inside the visible viewport, taking header/footer into account.\n     * @private\n     */\n    __scrollIntoViewport(index) {\n      const rowElement = [...this.$.items.children].find((child) => child.index === index);\n      if (rowElement) {\n        const dstRect = rowElement.getBoundingClientRect();\n        const footerTop = this.$.footer.getBoundingClientRect().top;\n        const headerBottom = this.$.header.getBoundingClientRect().bottom;\n        if (dstRect.bottom > footerTop) {\n          this.$.table.scrollTop += dstRect.bottom - footerTop;\n        } else if (dstRect.top < headerBottom) {\n          this.$.table.scrollTop -= headerBottom - dstRect.top;\n        }\n      }\n    }\n\n    /** @private */\n    _scheduleScrolling() {\n      if (!this._scrollingFrame) {\n        // Defer setting state attributes to avoid Edge hiccups\n        this._scrollingFrame = requestAnimationFrame(() => this.$.scroller.toggleAttribute('scrolling', true));\n      }\n      this._debounceScrolling = Debouncer.debounce(this._debounceScrolling, timeOut.after(timeouts.SCROLLING), () => {\n        cancelAnimationFrame(this._scrollingFrame);\n        delete this._scrollingFrame;\n        this.$.scroller.toggleAttribute('scrolling', false);\n      });\n    }\n\n    /** @private */\n    _afterScroll() {\n      this.__updateHorizontalScrollPosition();\n\n      if (!this.hasAttribute('reordering')) {\n        this._scheduleScrolling();\n      }\n      if (!this.hasAttribute('navigating')) {\n        this._hideTooltip(true);\n      }\n\n      this._updateOverflow();\n\n      // Memorize last scroll position in Firefox\n      if (this._firefox) {\n        const isVisible = !isElementHidden(this);\n        if (isVisible && this.__previousVisible !== false) {\n          this.__memorizedScrollTop = this._scrollTop;\n        }\n      }\n    }\n\n    /** @private */\n    _updateOverflow() {\n      // Set overflow styling attributes\n      let overflow = '';\n      const table = this.$.table;\n      if (table.scrollTop < table.scrollHeight - table.clientHeight) {\n        overflow += ' bottom';\n      }\n\n      if (table.scrollTop > 0) {\n        overflow += ' top';\n      }\n\n      const scrollLeft = this.__getNormalizedScrollLeft(table);\n      if (scrollLeft > 0) {\n        overflow += ' start';\n      }\n\n      if (scrollLeft < table.scrollWidth - table.clientWidth) {\n        overflow += ' end';\n      }\n\n      if (this.__isRTL) {\n        overflow = overflow.replace(/start|end/gi, (matched) => {\n          return matched === 'start' ? 'end' : 'start';\n        });\n      }\n\n      // TODO: Remove \"right\" and \"left\" values in the next major.\n      if (table.scrollLeft < table.scrollWidth - table.clientWidth) {\n        overflow += ' right';\n      }\n\n      if (table.scrollLeft > 0) {\n        overflow += ' left';\n      }\n\n      this._debounceOverflow = Debouncer.debounce(this._debounceOverflow, animationFrame, () => {\n        const value = overflow.trim();\n        if (value.length > 0 && this.getAttribute('overflow') !== value) {\n          this.setAttribute('overflow', value);\n        } else if (value.length === 0 && this.hasAttribute('overflow')) {\n          this.removeAttribute('overflow');\n        }\n      });\n    }\n\n    /** @protected */\n    _frozenCellsChanged() {\n      this._debouncerCacheElements = Debouncer.debounce(this._debouncerCacheElements, microTask, () => {\n        Array.from(this.shadowRoot.querySelectorAll('[part~=\"cell\"]')).forEach((cell) => {\n          cell.style.transform = '';\n        });\n        this._frozenCells = Array.prototype.slice.call(this.$.table.querySelectorAll('[frozen]'));\n        this._frozenToEndCells = Array.prototype.slice.call(this.$.table.querySelectorAll('[frozen-to-end]'));\n        this.__updateHorizontalScrollPosition();\n      });\n      this._debounceUpdateFrozenColumn();\n    }\n\n    /** @protected */\n    _debounceUpdateFrozenColumn() {\n      this.__debounceUpdateFrozenColumn = Debouncer.debounce(this.__debounceUpdateFrozenColumn, microTask, () =>\n        this._updateFrozenColumn(),\n      );\n    }\n\n    /** @private */\n    _updateFrozenColumn() {\n      if (!this._columnTree) {\n        return;\n      }\n\n      const columnsRow = this._columnTree[this._columnTree.length - 1].slice(0);\n      columnsRow.sort((a, b) => {\n        return a._order - b._order;\n      });\n\n      let lastFrozen;\n      let firstFrozenToEnd;\n\n      // Use for loop to only iterate columns once\n      for (let i = 0; i < columnsRow.length; i++) {\n        const col = columnsRow[i];\n\n        col._lastFrozen = false;\n        col._firstFrozenToEnd = false;\n\n        if (firstFrozenToEnd === undefined && col.frozenToEnd && !col.hidden) {\n          firstFrozenToEnd = i;\n        }\n\n        if (col.frozen && !col.hidden) {\n          lastFrozen = i;\n        }\n      }\n\n      if (lastFrozen !== undefined) {\n        columnsRow[lastFrozen]._lastFrozen = true;\n      }\n\n      if (firstFrozenToEnd !== undefined) {\n        columnsRow[firstFrozenToEnd]._firstFrozenToEnd = true;\n      }\n    }\n\n    /** @private */\n    __updateHorizontalScrollPosition() {\n      const scrollWidth = this.$.table.scrollWidth;\n      const clientWidth = this.$.table.clientWidth;\n      const scrollLeft = Math.max(0, this.$.table.scrollLeft);\n      const normalizedScrollLeft = this.__getNormalizedScrollLeft(this.$.table);\n\n      // Position header, footer and items container\n      const transform = `translate(${-scrollLeft}px, 0)`;\n      this.$.header.style.transform = transform;\n      this.$.footer.style.transform = transform;\n      this.$.items.style.transform = transform;\n\n      // Position frozen cells\n      const x = this.__isRTL ? normalizedScrollLeft + clientWidth - scrollWidth : scrollLeft;\n      const transformFrozen = `translate(${x}px, 0)`;\n      for (let i = 0; i < this._frozenCells.length; i++) {\n        this._frozenCells[i].style.transform = transformFrozen;\n      }\n\n      // Position cells frozen to end\n      const remaining = this.__isRTL ? normalizedScrollLeft : scrollLeft + clientWidth - scrollWidth;\n      const transformFrozenToEnd = `translate(${remaining}px, 0)`;\n      for (let i = 0; i < this._frozenToEndCells.length; i++) {\n        this._frozenToEndCells[i].style.transform = transformFrozenToEnd;\n      }\n\n      // Only update the --_grid-horizontal-scroll-position custom property when navigating\n      // on row focus mode to avoid performance issues.\n      if (this.hasAttribute('navigating') && this.__rowFocusMode) {\n        this.$.table.style.setProperty('--_grid-horizontal-scroll-position', `${-x}px`);\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const SelectionMixin = (superClass) =>\n  class SelectionMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * An array that contains the selected items.\n         * @type {!Array<!GridItem>}\n         */\n        selectedItems: {\n          type: Object,\n          notify: true,\n          value: () => [],\n        },\n\n        /**\n         * Set of selected item ids\n         * @private\n         */\n        __selectedKeys: {\n          type: Object,\n          computed: '__computeSelectedKeys(itemIdPath, selectedItems.*)',\n        },\n      };\n    }\n\n    static get observers() {\n      return ['__selectedItemsChanged(itemIdPath, selectedItems.*)'];\n    }\n\n    /**\n     * @param {!GridItem} item\n     * @return {boolean}\n     * @protected\n     */\n    _isSelected(item) {\n      return this.__selectedKeys.has(this.getItemId(item));\n    }\n\n    /**\n     * Selects the given item.\n     *\n     * @method selectItem\n     * @param {!GridItem} item The item object\n     */\n    selectItem(item) {\n      if (!this._isSelected(item)) {\n        this.selectedItems = [...this.selectedItems, item];\n      }\n    }\n\n    /**\n     * Deselects the given item if it is already selected.\n     *\n     * @method deselect\n     * @param {!GridItem} item The item object\n     */\n    deselectItem(item) {\n      if (this._isSelected(item)) {\n        this.selectedItems = this.selectedItems.filter((i) => !this._itemsEqual(i, item));\n      }\n    }\n\n    /**\n     * Toggles the selected state of the given item.\n     *\n     * @method toggle\n     * @param {!GridItem} item The item object\n     * @protected\n     */\n    _toggleItem(item) {\n      if (!this._isSelected(item)) {\n        this.selectItem(item);\n      } else {\n        this.deselectItem(item);\n      }\n    }\n\n    /** @private */\n    __selectedItemsChanged() {\n      this.requestContentUpdate();\n    }\n\n    /** @private */\n    __computeSelectedKeys(itemIdPath, selectedItems) {\n      const selected = selectedItems.base || [];\n      const selectedKeys = new Set();\n      selected.forEach((item) => {\n        selectedKeys.add(this.getItemId(item));\n      });\n\n      return selectedKeys;\n    }\n\n    /**\n     * Fired when the `selectedItems` property changes.\n     *\n     * @event selected-items-changed\n     */\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\nlet defaultMultiSortPriority = 'prepend';\n\n/**\n * @polymerMixin\n */\nexport const SortMixin = (superClass) =>\n  class SortMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * When `true`, all `<vaadin-grid-sorter>` are applied for sorting.\n         * @attr {boolean} multi-sort\n         * @type {boolean}\n         */\n        multiSort: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * Controls how columns are added to the sort order when using multi-sort.\n         * The sort order is visually indicated by numbers in grid sorters placed in column headers.\n         *\n         * By default, whenever an unsorted column is sorted, or the sort-direction of a column is\n         * changed, that column gets sort priority 1, thus affecting the priority for all the other\n         * sorted columns. This is identical to using `multi-sort-priority=\"prepend\"`.\n         *\n         * Using this property allows to change this behavior so that sorting an unsorted column\n         * would add it to the \"end\" of the sort, and changing column's sort direction would retain\n         * it's previous priority. To set this, use `multi-sort-priority=\"append\"`.\n         *\n         * @attr {string} multi-sort-priority\n         */\n        multiSortPriority: {\n          type: String,\n          value: () => defaultMultiSortPriority,\n        },\n\n        /**\n         * When `true`, Shift-clicking an unsorted column's sorter adds it to the multi-sort.\n         * Shift + Space does the same action via keyboard. This property has precedence over the\n         * `multiSort` property. If `multiSortOnShiftClick` is true, the multiSort property is effectively ignored.\n         *\n         * @attr {boolean} multi-sort-on-shift-click\n         * @type {boolean}\n         */\n        multiSortOnShiftClick: {\n          type: Boolean,\n          value: false,\n        },\n\n        /**\n         * @type {!Array<!GridSorterDefinition>}\n         * @protected\n         */\n        _sorters: {\n          type: Array,\n          value: () => [],\n        },\n\n        /** @private */\n        _previousSorters: {\n          type: Array,\n          value: () => [],\n        },\n      };\n    }\n\n    /**\n     * Sets the default multi-sort priority to use for all grid instances.\n     * This method should be called before creating any grid instances.\n     * Changing this setting does not affect the default for existing grids.\n     *\n     * @param {string} priority\n     */\n    static setDefaultMultiSortPriority(priority) {\n      defaultMultiSortPriority = ['append', 'prepend'].includes(priority) ? priority : 'prepend';\n    }\n\n    /** @protected */\n    ready() {\n      super.ready();\n      this.addEventListener('sorter-changed', this._onSorterChanged);\n    }\n\n    /** @private */\n    _onSorterChanged(e) {\n      const sorter = e.target;\n      e.stopPropagation();\n      sorter._grid = this;\n      this.__updateSorter(sorter, e.detail.shiftClick, e.detail.fromSorterClick);\n      this.__applySorters();\n    }\n\n    /** @private */\n    __removeSorters(sortersToRemove) {\n      if (sortersToRemove.length === 0) {\n        return;\n      }\n\n      this._sorters = this._sorters.filter((sorter) => sortersToRemove.indexOf(sorter) < 0);\n      if (this.multiSort) {\n        this.__updateSortOrders();\n      }\n      this.__applySorters();\n    }\n\n    /** @private */\n    __updateSortOrders() {\n      this._sorters.forEach((sorter, index) => {\n        sorter._order = this._sorters.length > 1 ? index : null;\n      });\n    }\n\n    /** @private */\n    __appendSorter(sorter) {\n      if (!sorter.direction) {\n        this._removeArrayItem(this._sorters, sorter);\n      } else if (!this._sorters.includes(sorter)) {\n        this._sorters.push(sorter);\n      }\n\n      this.__updateSortOrders();\n    }\n\n    /** @private */\n    __prependSorter(sorter) {\n      this._removeArrayItem(this._sorters, sorter);\n      if (sorter.direction) {\n        this._sorters.unshift(sorter);\n      }\n      this.__updateSortOrders();\n    }\n\n    /** @private */\n    __updateSorter(sorter, shiftClick, fromSorterClick) {\n      if (!sorter.direction && this._sorters.indexOf(sorter) === -1) {\n        return;\n      }\n\n      sorter._order = null;\n\n      if (\n        (this.multiSort && (!this.multiSortOnShiftClick || !fromSorterClick)) ||\n        (this.multiSortOnShiftClick && shiftClick)\n      ) {\n        if (this.multiSortPriority === 'append') {\n          this.__appendSorter(sorter);\n        } else {\n          this.__prependSorter(sorter);\n        }\n      } else if (sorter.direction || this.multiSortOnShiftClick) {\n        const otherSorters = this._sorters.filter((s) => s !== sorter);\n        this._sorters = sorter.direction ? [sorter] : [];\n        otherSorters.forEach((sorter) => {\n          sorter._order = null;\n          sorter.direction = null;\n        });\n      }\n    }\n\n    /** @private */\n    __applySorters() {\n      if (\n        this.dataProvider &&\n        // No need to clear cache if sorters didn't change and grid is attached\n        this.isAttached &&\n        JSON.stringify(this._previousSorters) !== JSON.stringify(this._mapSorters())\n      ) {\n        this.clearCache();\n      }\n\n      this._a11yUpdateSorters();\n\n      this._previousSorters = this._mapSorters();\n    }\n\n    /**\n     * @return {!Array<!GridSorterDefinition>}\n     * @protected\n     */\n    _mapSorters() {\n      return this._sorters.map((sorter) => {\n        return {\n          path: sorter.path,\n          direction: sorter.direction,\n        };\n      });\n    }\n\n    /** @private */\n    _removeArrayItem(array, item) {\n      const index = array.indexOf(item);\n      if (index > -1) {\n        array.splice(index, 1);\n      }\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * @polymerMixin\n */\nexport const StylingMixin = (superClass) =>\n  class StylingMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * A function that allows generating CSS class names for grid cells\n         * based on their row and column. The return value should be the generated\n         * class name as a string, or multiple class names separated by whitespace\n         * characters.\n         *\n         * Receives two arguments:\n         * - `column` The `<vaadin-grid-column>` element (`undefined` for details-cell).\n         * - `model` The object with the properties related with\n         *   the rendered item, contains:\n         *   - `model.index` The index of the item.\n         *   - `model.item` The item.\n         *   - `model.expanded` Sublevel toggle state.\n         *   - `model.level` Level of the tree represented with a horizontal offset of the toggle button.\n         *   - `model.selected` Selected state.\n         *\n         * @type {GridCellClassNameGenerator | null | undefined}\n         */\n        cellClassNameGenerator: Function,\n      };\n    }\n\n    static get observers() {\n      return ['__cellClassNameGeneratorChanged(cellClassNameGenerator)'];\n    }\n\n    /** @private */\n    __cellClassNameGeneratorChanged() {\n      this.generateCellClassNames();\n    }\n\n    /**\n     * Runs the `cellClassNameGenerator` for the visible cells.\n     * If the generator depends on varying conditions, you need to\n     * call this function manually in order to update the styles when\n     * the conditions change.\n     */\n    generateCellClassNames() {\n      Array.from(this.$.items.children)\n        .filter((row) => !row.hidden && !row.hasAttribute('loading'))\n        .forEach((row) => this._generateCellClassNames(row, this.__getRowModel(row)));\n    }\n\n    /** @private */\n    _generateCellClassNames(row, model) {\n      Array.from(row.children).forEach((cell) => {\n        if (cell.__generatedClasses) {\n          cell.__generatedClasses.forEach((className) => cell.classList.remove(className));\n        }\n        if (this.cellClassNameGenerator) {\n          const result = this.cellClassNameGenerator(cell._column, model);\n          cell.__generatedClasses = result && result.split(' ').filter((className) => className.length > 0);\n          if (cell.__generatedClasses) {\n            cell.__generatedClasses.forEach((className) => cell.classList.add(className));\n          }\n        }\n      });\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './vaadin-grid-column.js';\nimport './vaadin-grid-styles.js';\nimport { beforeNextRender } from '@polymer/polymer/lib/utils/render-status.js';\nimport { html, PolymerElement } from '@polymer/polymer/polymer-element.js';\nimport { microTask } from '@vaadin/component-base/src/async.js';\nimport { isAndroid, isChrome, isFirefox, isIOS, isSafari, isTouch } from '@vaadin/component-base/src/browser-utils.js';\nimport { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';\nimport { Debouncer } from '@vaadin/component-base/src/debounce.js';\nimport { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';\nimport { isElementHidden } from '@vaadin/component-base/src/focus-utils.js';\nimport { TabindexMixin } from '@vaadin/component-base/src/tabindex-mixin.js';\nimport { processTemplates } from '@vaadin/component-base/src/templates.js';\nimport { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';\nimport { Virtualizer } from '@vaadin/component-base/src/virtualizer.js';\nimport { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\nimport { A11yMixin } from './vaadin-grid-a11y-mixin.js';\nimport { ActiveItemMixin } from './vaadin-grid-active-item-mixin.js';\nimport { ArrayDataProviderMixin } from './vaadin-grid-array-data-provider-mixin.js';\nimport { ColumnReorderingMixin } from './vaadin-grid-column-reordering-mixin.js';\nimport { ColumnResizingMixin } from './vaadin-grid-column-resizing-mixin.js';\nimport { DataProviderMixin } from './vaadin-grid-data-provider-mixin.js';\nimport { DragAndDropMixin } from './vaadin-grid-drag-and-drop-mixin.js';\nimport { DynamicColumnsMixin } from './vaadin-grid-dynamic-columns-mixin.js';\nimport { EventContextMixin } from './vaadin-grid-event-context-mixin.js';\nimport { FilterMixin } from './vaadin-grid-filter-mixin.js';\nimport { KeyboardNavigationMixin } from './vaadin-grid-keyboard-navigation-mixin.js';\nimport { RowDetailsMixin } from './vaadin-grid-row-details-mixin.js';\nimport { ScrollMixin } from './vaadin-grid-scroll-mixin.js';\nimport { SelectionMixin } from './vaadin-grid-selection-mixin.js';\nimport { SortMixin } from './vaadin-grid-sort-mixin.js';\nimport { StylingMixin } from './vaadin-grid-styling-mixin.js';\n\n/**\n * `<vaadin-grid>` is a free, high quality data grid / data table Web Component. The content of the\n * the grid can be populated by using renderer callback function.\n *\n * ### Quick Start\n *\n * Start with an assigning an array to the [`items`](#/elements/vaadin-grid#property-items) property to visualize your data.\n *\n * Use the [`<vaadin-grid-column>`](#/elements/vaadin-grid-column) element to configure the grid columns. Set `path` and `header`\n * shorthand properties for the columns to define what gets rendered in the cells of the column.\n *\n * #### Example:\n * ```html\n * <vaadin-grid>\n *   <vaadin-grid-column path=\"name.first\" header=\"First name\"></vaadin-grid-column>\n *   <vaadin-grid-column path=\"name.last\" header=\"Last name\"></vaadin-grid-column>\n *   <vaadin-grid-column path=\"email\"></vaadin-grid-column>\n * </vaadin-grid>\n * ```\n *\n * For custom content `vaadin-grid-column` element provides you with three types of `renderer` callback functions: `headerRenderer`,\n * `renderer` and `footerRenderer`.\n *\n * Each of those renderer functions provides `root`, `column`, `model` arguments when applicable.\n * Generate DOM content, append it to the `root` element and control the state\n * of the host element by accessing `column`. Before generating new content,\n * users are able to check if there is already content in `root` for reusing it.\n *\n * Renderers are called on initialization of new column cells and each time the\n * related row model is updated. DOM generated during the renderer call can be reused\n * in the next renderer call and will be provided with the `root` argument.\n * On first call it will be empty.\n *\n * #### Example:\n * ```html\n * <vaadin-grid>\n *   <vaadin-grid-column></vaadin-grid-column>\n *   <vaadin-grid-column></vaadin-grid-column>\n *   <vaadin-grid-column></vaadin-grid-column>\n * </vaadin-grid>\n * ```\n * ```js\n * const grid = document.querySelector('vaadin-grid');\n * grid.items = [{'name': 'John', 'surname': 'Lennon', 'role': 'singer'},\n *               {'name': 'Ringo', 'surname': 'Starr', 'role': 'drums'}];\n *\n * const columns = grid.querySelectorAll('vaadin-grid-column');\n *\n * columns[0].headerRenderer = function(root) {\n *   root.textContent = 'Name';\n * };\n * columns[0].renderer = function(root, column, model) {\n *   root.textContent = model.item.name;\n * };\n *\n * columns[1].headerRenderer = function(root) {\n *   root.textContent = 'Surname';\n * };\n * columns[1].renderer = function(root, column, model) {\n *   root.textContent = model.item.surname;\n * };\n *\n * columns[2].headerRenderer = function(root) {\n *   root.textContent = 'Role';\n * };\n * columns[2].renderer = function(root, column, model) {\n *   root.textContent = model.item.role;\n * };\n * ```\n *\n * The following properties are available in the `model` argument:\n *\n * Property name | Type | Description\n * --------------|------|------------\n * `index`| Number | The index of the item.\n * `item` | String or Object | The item.\n * `level` | Number | Number of the item's tree sublevel, starts from 0.\n * `expanded` | Boolean | True if the item's tree sublevel is expanded.\n * `selected` | Boolean | True if the item is selected.\n * `detailsOpened` | Boolean | True if the item's row details are open.\n *\n * The following helper elements can be used for further customization:\n * - [`<vaadin-grid-column-group>`](#/elements/vaadin-grid-column-group)\n * - [`<vaadin-grid-filter>`](#/elements/vaadin-grid-filter)\n * - [`<vaadin-grid-sorter>`](#/elements/vaadin-grid-sorter)\n * - [`<vaadin-grid-selection-column>`](#/elements/vaadin-grid-selection-column)\n * - [`<vaadin-grid-tree-toggle>`](#/elements/vaadin-grid-tree-toggle)\n *\n * __Note that the helper elements must be explicitly imported.__\n * If you want to import everything at once you can use the `all-imports.html` bundle.\n *\n * ### Lazy Loading with Function Data Provider\n *\n * In addition to assigning an array to the items property, you can alternatively\n * provide the `<vaadin-grid>` data through the\n * [`dataProvider`](#/elements/vaadin-grid#property-dataProvider) function property.\n * The `<vaadin-grid>` calls this function lazily, only when it needs more data\n * to be displayed.\n *\n * See the [`dataProvider`](#/elements/vaadin-grid#property-dataProvider) in\n * the API reference below for the detailed data provider arguments description,\n * and the “Assigning Data” page in the demos.\n *\n * __Note that expanding the tree grid's item will trigger a call to the `dataProvider`.__\n *\n * __Also, note that when using function data providers, the total number of items\n * needs to be set manually. The total number of items can be returned\n * in the second argument of the data provider callback:__\n *\n * ```javascript\n * grid.dataProvider = ({page, pageSize}, callback) => {\n *   // page: the requested page index\n *   // pageSize: number of items on one page\n *   const url = `https://api.example/data?page=${page}&per_page=${pageSize}`;\n *\n *   fetch(url)\n *     .then((res) => res.json())\n *     .then(({ employees, totalSize }) => {\n *       callback(employees, totalSize);\n *     });\n * };\n * ```\n *\n * __Alternatively, you can use the `size` property to set the total number of items:__\n *\n * ```javascript\n * grid.size = 200; // The total number of items\n * grid.dataProvider = ({page, pageSize}, callback) => {\n *   const url = `https://api.example/data?page=${page}&per_page=${pageSize}`;\n *\n *   fetch(url)\n *     .then((res) => res.json())\n *     .then((resJson) => callback(resJson.employees));\n * };\n * ```\n *\n * ### Styling\n *\n * The following shadow DOM parts are available for styling:\n *\n * Part name | Description\n * ----------------|----------------\n * `row` | Row in the internal table\n * `cell` | Cell in the internal table\n * `header-cell` | Header cell in the internal table\n * `body-cell` | Body cell in the internal table\n * `footer-cell` | Footer cell in the internal table\n * `details-cell` | Row details cell in the internal table\n * `focused-cell` | Focused cell in the internal table\n * `resize-handle` | Handle for resizing the columns\n * `reorder-ghost` | Ghost element of the header cell being dragged\n *\n * The following state attributes are available for styling:\n *\n * Attribute             | Description                                                                                       | Part name\n * ----------------------|---------------------------------------------------------------------------------------------------|-----------\n * `loading`             | Set when the grid is loading data from data provider                                              | :host\n * `interacting`         | Keyboard navigation in interaction mode                                                           | :host\n * `navigating`          | Keyboard navigation in navigation mode                                                            | :host\n * `overflow`            | Set when rows are overflowing the grid viewport. Possible values: `top`, `bottom`, `start`, `end` | :host\n * `reordering`          | Set when the grid's columns are being reordered                                                   | :host\n * `dragover`            | Set when the grid (not a specific row) is dragged over                                            | :host\n * `dragging-rows`       | Set when grid rows are dragged                                                                    | :host\n * `reorder-status`      | Reflects the status of a cell while columns are being reordered                                   | cell\n * `frozen`              | Frozen cell                                                                                       | cell\n * `frozen-to-end`       | Cell frozen to end                                                                                | cell\n * `last-frozen`         | Last frozen cell                                                                                  | cell\n * `first-frozen-to-end` | First cell frozen to end                                                                          | cell\n * `first-column`        | First visible cell on a row                                                                       | cell\n * `last-column`         | Last visible cell on a row                                                                        | cell\n * `selected`            | Selected row                                                                                      | row\n * `expanded`            | Expanded row                                                                                      | row\n * `details-opened`      | Row with details open                                                                             | row\n * `loading`             | Row that is waiting for data from data provider                                                   | row\n * `odd`                 | Odd row                                                                                           | row\n * `first`               | The first body row                                                                                | row\n * `last`                | The last body row                                                                                 | row\n * `dragstart`           | Set for one frame when starting to drag a row. The value is a number when dragging multiple rows  | row\n * `dragover`            | Set when the row is dragged over                                                                  | row\n * `drag-disabled`       | Set to a row that isn't available for dragging                                                    | row\n * `drop-disabled`       | Set to a row that can't be dropped on top of                                                      | row\n *\n * See [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n *\n * @fires {CustomEvent} active-item-changed - Fired when the `activeItem` property changes.\n * @fires {CustomEvent} cell-activate - Fired when the cell is activated with click or keyboard.\n * @fires {CustomEvent} cell-focus - Fired when a cell is focused with click or keyboard navigation.\n * @fires {CustomEvent} column-reorder - Fired when the columns in the grid are reordered.\n * @fires {CustomEvent} column-resize - Fired when the grid column resize is finished.\n * @fires {CustomEvent} data-provider-changed - Fired when the `dataProvider` property changes.\n * @fires {CustomEvent} expanded-items-changed - Fired when the `expandedItems` property changes.\n * @fires {CustomEvent} grid-dragstart - Fired when starting to drag grid rows.\n * @fires {CustomEvent} grid-dragend - Fired when the dragging of the rows ends.\n * @fires {CustomEvent} grid-drop - Fired when a drop occurs on top of the grid.\n * @fires {CustomEvent} loading-changed - Fired when the `loading` property changes.\n * @fires {CustomEvent} selected-items-changed - Fired when the `selectedItems` property changes.\n * @fires {CustomEvent} size-changed - Fired when the `size` property changes.\n *\n * @extends HTMLElement\n * @mixes ElementMixin\n * @mixes ThemableMixin\n * @mixes A11yMixin\n * @mixes ActiveItemMixin\n * @mixes ArrayDataProviderMixin\n * @mixes ColumnResizingMixin\n * @mixes DataProviderMixin\n * @mixes DynamicColumnsMixin\n * @mixes FilterMixin\n * @mixes RowDetailsMixin\n * @mixes ScrollMixin\n * @mixes SelectionMixin\n * @mixes SortMixin\n * @mixes KeyboardNavigationMixin\n * @mixes ColumnReorderingMixin\n * @mixes EventContextMixin\n * @mixes StylingMixin\n * @mixes DragAndDropMixin\n */\nclass Grid extends ElementMixin(\n  ThemableMixin(\n    DataProviderMixin(\n      ArrayDataProviderMixin(\n        DynamicColumnsMixin(\n          ActiveItemMixin(\n            ScrollMixin(\n              SelectionMixin(\n                SortMixin(\n                  RowDetailsMixin(\n                    KeyboardNavigationMixin(\n                      A11yMixin(\n                        FilterMixin(\n                          ColumnReorderingMixin(\n                            ColumnResizingMixin(\n                              ControllerMixin(\n                                EventContextMixin(DragAndDropMixin(StylingMixin(TabindexMixin(PolymerElement)))),\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    ),\n  ),\n) {\n  static get template() {\n    return html`\n      <div\n        id=\"scroller\"\n        safari$=\"[[_safari]]\"\n        ios$=\"[[_ios]]\"\n        loading$=\"[[loading]]\"\n        column-reordering-allowed$=\"[[columnReorderingAllowed]]\"\n      >\n        <table id=\"table\" role=\"treegrid\" aria-multiselectable=\"true\" tabindex=\"0\">\n          <caption id=\"sizer\" part=\"row\"></caption>\n          <thead id=\"header\" role=\"rowgroup\"></thead>\n          <tbody id=\"items\" role=\"rowgroup\"></tbody>\n          <tfoot id=\"footer\" role=\"rowgroup\"></tfoot>\n        </table>\n\n        <div part=\"reorder-ghost\"></div>\n      </div>\n\n      <slot name=\"tooltip\"></slot>\n\n      <div id=\"focusexit\" tabindex=\"0\"></div>\n    `;\n  }\n\n  static get is() {\n    return 'vaadin-grid';\n  }\n\n  static get observers() {\n    return [\n      '_columnTreeChanged(_columnTree, _columnTree.*)',\n      '_effectiveSizeChanged(_effectiveSize, __virtualizer, _hasData, _columnTree)',\n    ];\n  }\n\n  static get properties() {\n    return {\n      /** @private */\n      _safari: {\n        type: Boolean,\n        value: isSafari,\n      },\n\n      /** @private */\n      _ios: {\n        type: Boolean,\n        value: isIOS,\n      },\n\n      /** @private */\n      _firefox: {\n        type: Boolean,\n        value: isFirefox,\n      },\n\n      /** @private */\n      _android: {\n        type: Boolean,\n        value: isAndroid,\n      },\n\n      /** @private */\n      _touchDevice: {\n        type: Boolean,\n        value: isTouch,\n      },\n\n      /**\n       * If true, the grid's height is defined by its rows.\n       *\n       * Effectively, this disables the grid's virtual scrolling so that all the rows are rendered in the DOM at once.\n       * If the grid has a large number of items, using the feature is discouraged to avoid performance issues.\n       * @attr {boolean} all-rows-visible\n       * @type {boolean}\n       */\n      allRowsVisible: {\n        type: Boolean,\n        value: false,\n        reflectToAttribute: true,\n      },\n\n      /** @private */\n      _recalculateColumnWidthOnceLoadingFinished: {\n        type: Boolean,\n        value: true,\n      },\n\n      /** @private */\n      isAttached: {\n        value: false,\n      },\n\n      /**\n       * An internal property that is mainly used by `vaadin-template-renderer`\n       * to identify grid elements.\n       *\n       * @private\n       */\n      __gridElement: {\n        type: Boolean,\n        value: true,\n      },\n    };\n  }\n\n  constructor() {\n    super();\n    this.addEventListener('animationend', this._onAnimationEnd);\n  }\n\n  /** @protected */\n  connectedCallback() {\n    super.connectedCallback();\n    this.isAttached = true;\n    this.recalculateColumnWidths();\n  }\n\n  /** @protected */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.isAttached = false;\n    this._hideTooltip(true);\n  }\n\n  /** @private */\n  __getFirstVisibleItem() {\n    return this._getVisibleRows().find((row) => this._isInViewport(row));\n  }\n\n  /** @private */\n  get _firstVisibleIndex() {\n    const firstVisibleItem = this.__getFirstVisibleItem();\n    return firstVisibleItem ? firstVisibleItem.index : undefined;\n  }\n\n  /** @private */\n  __getLastVisibleItem() {\n    return this._getVisibleRows()\n      .reverse()\n      .find((row) => this._isInViewport(row));\n  }\n\n  /** @private */\n  get _lastVisibleIndex() {\n    const lastVisibleItem = this.__getLastVisibleItem();\n    return lastVisibleItem ? lastVisibleItem.index : undefined;\n  }\n\n  /** @private */\n  _isInViewport(item) {\n    const scrollTargetRect = this.$.table.getBoundingClientRect();\n    const itemRect = item.getBoundingClientRect();\n    const headerHeight = this.$.header.getBoundingClientRect().height;\n    const footerHeight = this.$.footer.getBoundingClientRect().height;\n    return (\n      itemRect.bottom > scrollTargetRect.top + headerHeight && itemRect.top < scrollTargetRect.bottom - footerHeight\n    );\n  }\n\n  /** @private */\n  _getVisibleRows() {\n    return Array.from(this.$.items.children)\n      .filter((item) => !item.hidden)\n      .sort((a, b) => a.index - b.index);\n  }\n\n  /** @protected */\n  ready() {\n    super.ready();\n\n    this.__virtualizer = new Virtualizer({\n      createElements: this._createScrollerRows.bind(this),\n      updateElement: this._updateScrollerItem.bind(this),\n      scrollContainer: this.$.items,\n      scrollTarget: this.$.table,\n      reorderElements: true,\n    });\n\n    new ResizeObserver(() =>\n      setTimeout(() => {\n        this.__updateFooterPositioning();\n        if (this._recalculateColumnWidthOnceVisible) {\n          this._recalculateColumnWidthOnceVisible = false;\n          this.recalculateColumnWidths();\n        }\n      }),\n    ).observe(this.$.table);\n\n    processTemplates(this);\n\n    this._tooltipController = new TooltipController(this);\n    this.addController(this._tooltipController);\n    this._tooltipController.setManual(true);\n  }\n\n  /**\n   * @param {string} name\n   * @param {?string} oldValue\n   * @param {?string} newValue\n   * @protected\n   */\n  attributeChangedCallback(name, oldValue, newValue) {\n    super.attributeChangedCallback(name, oldValue, newValue);\n    if (name === 'dir') {\n      this.__isRTL = newValue === 'rtl';\n    }\n  }\n\n  /** @private */\n  __getBodyCellCoordinates(cell) {\n    if (this.$.items.contains(cell) && cell.localName === 'td') {\n      return {\n        item: cell.parentElement._item,\n        column: cell._column,\n      };\n    }\n  }\n\n  /** @private */\n  __focusBodyCell({ item, column }) {\n    const row = this._getVisibleRows().find((row) => row._item === item);\n    const cell = row && [...row.children].find((cell) => cell._column === column);\n    if (cell) {\n      cell.focus();\n    }\n  }\n\n  /** @private */\n  _effectiveSizeChanged(effectiveSize, virtualizer, hasData, columnTree) {\n    if (virtualizer && hasData && columnTree) {\n      // Changing the virtualizer size may result in the row with focus getting hidden\n      const cell = this.shadowRoot.activeElement;\n      const cellCoordinates = this.__getBodyCellCoordinates(cell);\n\n      virtualizer.size = effectiveSize;\n      virtualizer.update();\n      virtualizer.flush();\n\n      // If the focused cell's parent row got hidden by the size change, focus the corresponding new cell\n      if (cellCoordinates && cell.parentElement.hidden) {\n        this.__focusBodyCell(cellCoordinates);\n      }\n\n      // Make sure the body has a tabbable element\n      this._resetKeyboardNavigation();\n    }\n  }\n\n  /** @protected */\n  __itemsReceived() {\n    if (!this._recalculateColumnWidthOnceLoadingFinished || this._cache.isLoading()) {\n      return;\n    }\n\n    // Delay recalculation if any rows are missing an index.\n    // This can happen during the grid's initialization if the recalculation is triggered\n    // as a result of the data provider responding synchronously to a page request created\n    // in the middle of the virtualizer update loop. In this case, rows after the one that\n    // triggered the page request may not have an index property yet. The lack of index\n    // prevents _onDataProviderPageReceived from requesting children for these rows,\n    // resulting in loading state being set to false and the recalculation beginning\n    // before all the data is loaded. Note, rows without index get updated in later iterations\n    // of the virtualizer update loop, ensuring the grid eventually reaches a stable state.\n    const hasRowsWithUndefinedIndex = [...this.$.items.children].some((row) => row.index === undefined);\n    if (hasRowsWithUndefinedIndex) {\n      return;\n    }\n\n    const hasRowsWithClientHeight = [...this.$.items.children].some((row) => row.clientHeight > 0);\n    if (hasRowsWithClientHeight) {\n      this._recalculateColumnWidthOnceLoadingFinished = false;\n      this.recalculateColumnWidths();\n    }\n  }\n\n  /** @private */\n  __getIntrinsicWidth(col) {\n    if (this.__intrinsicWidthCache.has(col)) {\n      return this.__intrinsicWidthCache.get(col);\n    }\n\n    const width = this.__calculateIntrinsicWidth(col);\n    this.__intrinsicWidthCache.set(col, width);\n\n    return width;\n  }\n\n  /** @private */\n  __calculateIntrinsicWidth(col) {\n    const initialWidth = col.width;\n    const initialFlexGrow = col.flexGrow;\n\n    col.width = 'auto';\n    col.flexGrow = 0;\n\n    // Note: _allCells only contains cells which are currently rendered in DOM\n    const width = col._allCells\n      .filter((cell) => {\n        // Exclude body cells that are out of the visible viewport\n        return !this.$.items.contains(cell) || this._isInViewport(cell.parentElement);\n      })\n      .reduce((width, cell) => {\n        // Add 1px buffer to the offset width to avoid too narrow columns (sub-pixel rendering)\n        return Math.max(width, cell.offsetWidth + 1);\n      }, 0);\n\n    col.flexGrow = initialFlexGrow;\n    col.width = initialWidth;\n\n    return width;\n  }\n\n  /** @private */\n  __getDistributedWidth(col, innerColumn) {\n    if (col == null || col === this) {\n      return 0;\n    }\n\n    const columnWidth = Math.max(\n      this.__getIntrinsicWidth(col),\n      this.__getDistributedWidth((col.assignedSlot || col).parentElement, col),\n    );\n\n    // We're processing a regular grid-column and not a grid-column-group\n    if (!innerColumn) {\n      return columnWidth;\n    }\n\n    // At the end, the width of each vaadin-grid-column-group is determined by the sum of the width of its children.\n    // Here we determine how much space the vaadin-grid-column-group actually needs to render properly and then we distribute that space\n    // to its children, so when we actually do the summation it will be rendered properly.\n    // Check out vaadin-grid-column-group:_updateFlexAndWidth\n    const columnGroup = col;\n    const columnGroupWidth = columnWidth;\n    const sumOfWidthOfAllChildColumns = columnGroup._visibleChildColumns\n      .map((col) => this.__getIntrinsicWidth(col))\n      .reduce((sum, curr) => sum + curr, 0);\n\n    const extraNecessarySpaceForGridColumnGroup = Math.max(0, columnGroupWidth - sumOfWidthOfAllChildColumns);\n\n    // The distribution of the extra necessary space is done according to the intrinsic width of each child column.\n    // Lets say we need 100 pixels of extra space for the grid-column-group to render properly\n    // it has two grid-column children, |100px|300px| in total 400px\n    // the first column gets 25px of the additional space (100/400)*100 = 25\n    // the second column gets the 75px of the additional space (300/400)*100 = 75\n    const proportionOfExtraSpace = this.__getIntrinsicWidth(innerColumn) / sumOfWidthOfAllChildColumns;\n    const shareOfInnerColumnFromNecessaryExtraSpace = proportionOfExtraSpace * extraNecessarySpaceForGridColumnGroup;\n\n    return this.__getIntrinsicWidth(innerColumn) + shareOfInnerColumnFromNecessaryExtraSpace;\n  }\n\n  /**\n   * @param {!Array<!GridColumn>} cols the columns to auto size based on their content width\n   * @private\n   */\n  _recalculateColumnWidths(cols) {\n    // Flush to make sure DOM is up-to-date when measuring the column widths\n    this.__virtualizer.flush();\n    [...this.$.header.children, ...this.$.footer.children].forEach((row) => {\n      if (row.__debounceUpdateHeaderFooterRowVisibility) {\n        row.__debounceUpdateHeaderFooterRowVisibility.flush();\n      }\n    });\n\n    // Flush to account for any changes to the visibility of the columns\n    if (this._debouncerHiddenChanged) {\n      this._debouncerHiddenChanged.flush();\n    }\n\n    this.__intrinsicWidthCache = new Map();\n\n    cols.forEach((col) => {\n      col.width = `${this.__getDistributedWidth(col)}px`;\n    });\n  }\n\n  /**\n   * Updates the `width` of all columns which have `autoWidth` set to `true`.\n   */\n  recalculateColumnWidths() {\n    if (!this._columnTree) {\n      return; // No columns\n    }\n    if (isElementHidden(this)) {\n      this._recalculateColumnWidthOnceVisible = true;\n      return;\n    }\n    if (this._cache.isLoading()) {\n      this._recalculateColumnWidthOnceLoadingFinished = true;\n      return;\n    }\n    const cols = this._getColumns().filter((col) => !col.hidden && col.autoWidth);\n    this._recalculateColumnWidths(cols);\n  }\n\n  /** @private */\n  _createScrollerRows(count) {\n    const rows = [];\n    for (let i = 0; i < count; i++) {\n      const row = document.createElement('tr');\n      row.setAttribute('part', 'row');\n      row.setAttribute('role', 'row');\n      row.setAttribute('tabindex', '-1');\n      if (this._columnTree) {\n        this._updateRow(row, this._columnTree[this._columnTree.length - 1], 'body', false, true);\n      }\n      rows.push(row);\n    }\n\n    if (this._columnTree) {\n      this._columnTree[this._columnTree.length - 1].forEach(\n        (c) => c.isConnected && c.notifyPath && c.notifyPath('_cells.*', c._cells),\n      );\n    }\n\n    beforeNextRender(this, () => {\n      this._updateFirstAndLastColumn();\n      this._resetKeyboardNavigation();\n      this._afterScroll();\n      this.__itemsReceived();\n    });\n    return rows;\n  }\n\n  /** @private */\n  _createCell(tagName, column) {\n    const contentId = (this._contentIndex = this._contentIndex + 1 || 0);\n    const slotName = `vaadin-grid-cell-content-${contentId}`;\n\n    const cellContent = document.createElement('vaadin-grid-cell-content');\n    cellContent.setAttribute('slot', slotName);\n\n    const cell = document.createElement(tagName);\n    cell.id = slotName.replace('-content-', '-');\n    cell.setAttribute('role', tagName === 'td' ? 'gridcell' : 'columnheader');\n\n    // For now we only support tooltip on desktop\n    if (!isAndroid && !isIOS) {\n      cell.addEventListener('mouseenter', (event) => {\n        if (!this.$.scroller.hasAttribute('scrolling')) {\n          this._showTooltip(event);\n        }\n      });\n\n      cell.addEventListener('mouseleave', () => {\n        this._hideTooltip();\n      });\n\n      cell.addEventListener('mousedown', () => {\n        this._hideTooltip(true);\n      });\n    }\n\n    const slot = document.createElement('slot');\n    slot.setAttribute('name', slotName);\n\n    if (column && column._focusButtonMode) {\n      const div = document.createElement('div');\n      div.setAttribute('role', 'button');\n      div.setAttribute('tabindex', '-1');\n      cell.appendChild(div);\n\n      // Patch `focus()` to use the button\n      cell._focusButton = div;\n      cell.focus = function () {\n        cell._focusButton.focus();\n      };\n\n      div.appendChild(slot);\n    } else {\n      cell.setAttribute('tabindex', '-1');\n      cell.appendChild(slot);\n    }\n\n    cell._content = cellContent;\n\n    // With native Shadow DOM, mousedown on slotted element does not focus\n    // focusable slot wrapper, that is why cells are not focused with\n    // mousedown. Workaround: listen for mousedown and focus manually.\n    cellContent.addEventListener('mousedown', () => {\n      if (isChrome) {\n        // Chrome bug: focusing before mouseup prevents text selection, see http://crbug.com/771903\n        const mouseUpListener = (event) => {\n          // If focus is on element within the cell content — respect it, do not change\n          const contentContainsFocusedElement = cellContent.contains(this.getRootNode().activeElement);\n          // Only focus if mouse is released on cell content itself\n          const mouseUpWithinCell = event.composedPath().includes(cellContent);\n          if (!contentContainsFocusedElement && mouseUpWithinCell) {\n            cell.focus();\n          }\n          document.removeEventListener('mouseup', mouseUpListener, true);\n        };\n        document.addEventListener('mouseup', mouseUpListener, true);\n      } else {\n        // Focus on mouseup, on the other hand, removes selection on Safari.\n        // Watch out sync focus removal issue, only async focus works here.\n        setTimeout(() => {\n          if (!cellContent.contains(this.getRootNode().activeElement)) {\n            cell.focus();\n          }\n        });\n      }\n    });\n\n    return cell;\n  }\n\n  /**\n   * @param {!HTMLTableRowElement} row\n   * @param {!Array<!GridColumn>} columns\n   * @param {?string} section\n   * @param {boolean} isColumnRow\n   * @param {boolean} noNotify\n   * @protected\n   */\n  // eslint-disable-next-line max-params\n  _updateRow(row, columns, section, isColumnRow, noNotify) {\n    section = section || 'body';\n\n    const contentsFragment = document.createDocumentFragment();\n\n    Array.from(row.children).forEach((cell) => {\n      cell._vacant = true;\n    });\n    row.innerHTML = '';\n\n    columns\n      .filter((column) => !column.hidden)\n      .forEach((column, index, cols) => {\n        let cell;\n\n        if (section === 'body') {\n          // Body\n          column._cells = column._cells || [];\n          cell = column._cells.find((cell) => cell._vacant);\n          if (!cell) {\n            cell = this._createCell('td', column);\n            column._cells.push(cell);\n          }\n          cell.setAttribute('part', 'cell body-cell');\n          row.appendChild(cell);\n\n          if (row === this.$.sizer) {\n            column._sizerCell = cell;\n          }\n\n          if (index === cols.length - 1 && this.rowDetailsRenderer) {\n            // Add details cell as last cell to body rows\n            this._detailsCells = this._detailsCells || [];\n            const detailsCell = this._detailsCells.find((cell) => cell._vacant) || this._createCell('td');\n            if (this._detailsCells.indexOf(detailsCell) === -1) {\n              this._detailsCells.push(detailsCell);\n            }\n            if (!detailsCell._content.parentElement) {\n              contentsFragment.appendChild(detailsCell._content);\n            }\n            this._configureDetailsCell(detailsCell);\n            row.appendChild(detailsCell);\n            this._a11ySetRowDetailsCell(row, detailsCell);\n            detailsCell._vacant = false;\n          }\n\n          if (column.notifyPath && !noNotify) {\n            column.notifyPath('_cells.*', column._cells);\n          }\n        } else {\n          // Header & footer\n          const tagName = section === 'header' ? 'th' : 'td';\n          if (isColumnRow || column.localName === 'vaadin-grid-column-group') {\n            cell = column[`_${section}Cell`] || this._createCell(tagName);\n            cell._column = column;\n            row.appendChild(cell);\n            column[`_${section}Cell`] = cell;\n          } else {\n            column._emptyCells = column._emptyCells || [];\n            cell = column._emptyCells.find((cell) => cell._vacant) || this._createCell(tagName);\n            cell._column = column;\n            row.appendChild(cell);\n            if (column._emptyCells.indexOf(cell) === -1) {\n              column._emptyCells.push(cell);\n            }\n          }\n          cell.setAttribute('part', `cell ${section}-cell`);\n        }\n\n        if (!cell._content.parentElement) {\n          contentsFragment.appendChild(cell._content);\n        }\n        cell._vacant = false;\n        cell._column = column;\n      });\n\n    if (section !== 'body') {\n      this.__debounceUpdateHeaderFooterRowVisibility(row);\n    }\n\n    // Might be empty if only cache was used\n    this.appendChild(contentsFragment);\n\n    this._frozenCellsChanged();\n    this._updateFirstAndLastColumnForRow(row);\n  }\n\n  /**\n   * @param {HTMLTableRowElement} row\n   * @protected\n   */\n  __debounceUpdateHeaderFooterRowVisibility(row) {\n    row.__debounceUpdateHeaderFooterRowVisibility = Debouncer.debounce(\n      row.__debounceUpdateHeaderFooterRowVisibility,\n      microTask,\n      () => this.__updateHeaderFooterRowVisibility(row),\n    );\n  }\n\n  /**\n   * @param {HTMLTableRowElement} row\n   * @protected\n   */\n  __updateHeaderFooterRowVisibility(row) {\n    if (!row) {\n      return;\n    }\n\n    const visibleRowCells = Array.from(row.children).filter((cell) => {\n      const column = cell._column;\n      if (column._emptyCells && column._emptyCells.indexOf(cell) > -1) {\n        // The cell is an \"empty cell\"  -> doesn't block hiding the row\n        return false;\n      }\n      if (row.parentElement === this.$.header) {\n        if (column.headerRenderer) {\n          // The cell is the header cell of a column that has a header renderer\n          // -> row should be visible\n          return true;\n        }\n        if (column.header === null) {\n          // The column header is explicilty set to null -> doesn't block hiding the row\n          return false;\n        }\n        if (column.path || column.header !== undefined) {\n          // The column has an explicit non-null header or a path that generates a header\n          // -> row should be visible\n          return true;\n        }\n      } else if (column.footerRenderer) {\n        // The cell is the footer cell of a column that has a footer renderer\n        // -> row should be visible\n        return true;\n      }\n      return false;\n    });\n\n    if (row.hidden !== !visibleRowCells.length) {\n      row.hidden = !visibleRowCells.length;\n    }\n\n    // Make sure the section has a tabbable element\n    this._resetKeyboardNavigation();\n  }\n\n  /** @private */\n  _updateScrollerItem(row, index) {\n    this._preventScrollerRotatingCellFocus(row, index);\n\n    if (!this._columnTree) {\n      return;\n    }\n\n    row.toggleAttribute('first', index === 0);\n    row.toggleAttribute('last', index === this._effectiveSize - 1);\n    row.toggleAttribute('odd', index % 2);\n    this._a11yUpdateRowRowindex(row, index);\n    this._getItem(index, row);\n  }\n\n  /** @private */\n  _columnTreeChanged(columnTree) {\n    this._renderColumnTree(columnTree);\n    this.recalculateColumnWidths();\n  }\n\n  /**\n   * @param {!Array<!GridColumn>} columnTree\n   * @protected\n   */\n  _renderColumnTree(columnTree) {\n    Array.from(this.$.items.children).forEach((row) =>\n      this._updateRow(row, columnTree[columnTree.length - 1], null, false, true),\n    );\n\n    while (this.$.header.children.length < columnTree.length) {\n      const headerRow = document.createElement('tr');\n      headerRow.setAttribute('part', 'row');\n      headerRow.setAttribute('role', 'row');\n      headerRow.setAttribute('tabindex', '-1');\n      this.$.header.appendChild(headerRow);\n\n      const footerRow = document.createElement('tr');\n      footerRow.setAttribute('part', 'row');\n      footerRow.setAttribute('role', 'row');\n      footerRow.setAttribute('tabindex', '-1');\n      this.$.footer.appendChild(footerRow);\n    }\n    while (this.$.header.children.length > columnTree.length) {\n      this.$.header.removeChild(this.$.header.firstElementChild);\n      this.$.footer.removeChild(this.$.footer.firstElementChild);\n    }\n\n    Array.from(this.$.header.children).forEach((headerRow, index) =>\n      this._updateRow(headerRow, columnTree[index], 'header', index === columnTree.length - 1),\n    );\n\n    Array.from(this.$.footer.children).forEach((footerRow, index) =>\n      this._updateRow(footerRow, columnTree[columnTree.length - 1 - index], 'footer', index === 0),\n    );\n\n    // Sizer rows\n    this._updateRow(this.$.sizer, columnTree[columnTree.length - 1]);\n\n    this._resizeHandler();\n    this._frozenCellsChanged();\n    this._updateFirstAndLastColumn();\n    this._resetKeyboardNavigation();\n    this._a11yUpdateHeaderRows();\n    this._a11yUpdateFooterRows();\n    this.__updateFooterPositioning();\n    this.generateCellClassNames();\n    this.__updateHeaderAndFooter();\n  }\n\n  /** @private */\n  __updateFooterPositioning() {\n    // TODO: fixed in Firefox 99, remove when we can drop Firefox ESR 91 support\n    if (this._firefox && parseFloat(navigator.userAgent.match(/Firefox\\/(\\d{2,3}.\\d)/)[1]) < 99) {\n      // Sticky (or translated) footer in a flexbox host doesn't get included in\n      // the scroll height calculation on FF. This is a workaround for the issue.\n      this.$.items.style.paddingBottom = 0;\n      if (!this.allRowsVisible) {\n        this.$.items.style.paddingBottom = `${this.$.footer.offsetHeight}px`;\n      }\n    }\n  }\n\n  /**\n   * @param {!HTMLElement} row\n   * @param {GridItem} item\n   * @protected\n   */\n  _updateItem(row, item) {\n    row._item = item;\n    const model = this.__getRowModel(row);\n\n    this._toggleDetailsCell(row, model.detailsOpened);\n\n    this._a11yUpdateRowLevel(row, model.level);\n    this._a11yUpdateRowSelected(row, model.selected);\n\n    row.toggleAttribute('expanded', model.expanded);\n    row.toggleAttribute('selected', model.selected);\n    row.toggleAttribute('details-opened', model.detailsOpened);\n\n    this._generateCellClassNames(row, model);\n    this._filterDragAndDrop(row, model);\n\n    Array.from(row.children).forEach((cell) => {\n      if (cell._renderer) {\n        const owner = cell._column || this;\n        cell._renderer.call(owner, cell._content, owner, model);\n      }\n    });\n\n    this._updateDetailsCellHeight(row);\n\n    this._a11yUpdateRowExpanded(row, model.expanded);\n  }\n\n  /** @private */\n  _resizeHandler() {\n    this._updateDetailsCellHeights();\n    this.__updateFooterPositioning();\n    this.__updateHorizontalScrollPosition();\n  }\n\n  /** @private */\n  _onAnimationEnd(e) {\n    // ShadyCSS applies scoping suffixes to animation names\n    if (e.animationName.indexOf('vaadin-grid-appear') === 0) {\n      e.stopPropagation();\n      this.__itemsReceived();\n\n      requestAnimationFrame(() => {\n        this.__scrollToPendingIndex();\n      });\n    }\n  }\n\n  /**\n   * @param {!HTMLTableRowElement} row\n   * @return {!GridItemModel}\n   * @protected\n   */\n  __getRowModel(row) {\n    return {\n      index: row.index,\n      item: row._item,\n      level: this._getIndexLevel(row.index),\n      expanded: this._isExpanded(row._item),\n      selected: this._isSelected(row._item),\n      detailsOpened: !!this.rowDetailsRenderer && this._isDetailsOpened(row._item),\n    };\n  }\n\n  /**\n   * @param {Event} event\n   * @protected\n   */\n  _showTooltip(event) {\n    // Check if there is a slotted vaadin-tooltip element.\n    const tooltip = this._tooltipController.node;\n    if (tooltip && tooltip.isConnected) {\n      this._tooltipController.setTarget(event.target);\n      this._tooltipController.setContext(this.getEventContext(event));\n\n      // Trigger opening using the corresponding delay.\n      tooltip._stateController.open({\n        focus: event.type === 'focusin',\n        hover: event.type === 'mouseenter',\n      });\n    }\n  }\n\n  /** @protected */\n  _hideTooltip(immediate) {\n    const tooltip = this._tooltipController.node;\n    if (tooltip) {\n      tooltip._stateController.close(immediate);\n    }\n  }\n\n  /**\n   * Requests an update for the content of cells.\n   *\n   * While performing the update, the following renderers are invoked:\n   * - `Grid.rowDetailsRenderer`\n   * - `GridColumn.renderer`\n   * - `GridColumn.headerRenderer`\n   * - `GridColumn.footerRenderer`\n   *\n   * It is not guaranteed that the update happens immediately (synchronously) after it is requested.\n   */\n  requestContentUpdate() {\n    // Header and footer renderers\n    this.__updateHeaderAndFooter();\n\n    // Body and row details renderers\n    this.__updateVisibleRows();\n  }\n\n  /** @private */\n  __updateHeaderAndFooter() {\n    (this._columnTree || []).forEach((level) => {\n      level.forEach((column) => {\n        if (column._renderHeaderAndFooter) {\n          column._renderHeaderAndFooter();\n        }\n      });\n    });\n  }\n\n  /** @protected */\n  __updateVisibleRows(start, end) {\n    if (this.__virtualizer) {\n      this.__virtualizer.update(start, end);\n    }\n  }\n\n  /**\n   * Updates the computed metrics and positioning of internal grid parts\n   * (row/details cell positioning etc). Needs to be invoked whenever the sizing of grid\n   * content changes asynchronously to ensure consistent appearance (e.g. when a\n   * contained image whose bounds aren't known beforehand finishes loading).\n   *\n   * @deprecated Since Vaadin 22, `notifyResize()` is deprecated. The component uses a\n   * ResizeObserver internally and doesn't need to be explicitly notified of resizes.\n   */\n  notifyResize() {\n    console.warn(\n      `WARNING: Since Vaadin 22, notifyResize() is deprecated. The component uses a ResizeObserver internally and doesn't need to be explicitly notified of resizes.`,\n    );\n  }\n}\n\ncustomElements.define(Grid.is, Grid);\n\nexport { Grid };\n","import '@vaadin/vaadin-lumo-styles/color.js';\nimport '@vaadin/vaadin-lumo-styles/font-icons.js';\nimport '@vaadin/vaadin-lumo-styles/sizing.js';\nimport '@vaadin/vaadin-lumo-styles/spacing.js';\nimport '@vaadin/vaadin-lumo-styles/style.js';\nimport '@vaadin/vaadin-lumo-styles/typography.js';\nimport '@vaadin/checkbox/theme/lumo/vaadin-checkbox.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nregisterStyles(\n  'vaadin-grid',\n  css`\n    :host {\n      font-family: var(--lumo-font-family);\n      font-size: var(--lumo-font-size-m);\n      line-height: var(--lumo-line-height-s);\n      color: var(--lumo-body-text-color);\n      background-color: var(--lumo-base-color);\n      box-sizing: border-box;\n      -webkit-text-size-adjust: 100%;\n      -webkit-tap-highlight-color: transparent;\n      -webkit-font-smoothing: antialiased;\n      -moz-osx-font-smoothing: grayscale;\n\n      /* For internal use only */\n      --_lumo-grid-border-color: var(--lumo-contrast-20pct);\n      --_lumo-grid-secondary-border-color: var(--lumo-contrast-10pct);\n      --_lumo-grid-border-width: 1px;\n      --_lumo-grid-selected-row-color: var(--lumo-primary-color-10pct);\n    }\n\n    /* No (outer) border */\n\n    :host(:not([theme~='no-border'])) {\n      border: var(--_lumo-grid-border-width) solid var(--_lumo-grid-border-color);\n    }\n\n    :host([disabled]) {\n      opacity: 0.7;\n    }\n\n    /* Cell styles */\n\n    [part~='cell'] {\n      min-height: var(--lumo-size-m);\n      background-color: var(--lumo-base-color);\n    }\n\n    [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      cursor: default;\n      padding: var(--lumo-space-xs) var(--lumo-space-m);\n    }\n\n    /* Apply row borders by default and introduce the \"no-row-borders\" variant */\n    :host(:not([theme~='no-row-borders'])) [part~='cell']:not([part~='details-cell']) {\n      border-top: var(--_lumo-grid-border-width) solid var(--_lumo-grid-secondary-border-color);\n    }\n\n    /* Hide first body row top border */\n    :host(:not([theme~='no-row-borders'])) [part='row'][first] [part~='cell']:not([part~='details-cell']) {\n      border-top: 0;\n      min-height: calc(var(--lumo-size-m) - var(--_lumo-grid-border-width));\n    }\n\n    /* Focus-ring */\n\n    [part~='row'] {\n      position: relative;\n    }\n\n    [part~='row']:focus,\n    [part~='focused-cell']:focus {\n      outline: none;\n    }\n\n    :host([navigating]) [part~='row']:focus::before,\n    :host([navigating]) [part~='focused-cell']:focus::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      pointer-events: none;\n      box-shadow: inset 0 0 0 2px var(--lumo-primary-color-50pct);\n    }\n\n    :host([navigating]) [part~='row']:focus::before {\n      transform: translateX(calc(-1 * var(--_grid-horizontal-scroll-position)));\n      z-index: 3;\n    }\n\n    /* Drag and Drop styles */\n    :host([dragover])::after {\n      content: '';\n      position: absolute;\n      z-index: 100;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      pointer-events: none;\n      box-shadow: inset 0 0 0 2px var(--lumo-primary-color-50pct);\n    }\n\n    [part~='row'][dragover] {\n      z-index: 100 !important;\n    }\n\n    [part~='row'][dragover] [part~='cell'] {\n      overflow: visible;\n    }\n\n    [part~='row'][dragover] [part~='cell']::after {\n      content: '';\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      height: calc(var(--_lumo-grid-border-width) + 2px);\n      pointer-events: none;\n      background: var(--lumo-primary-color-50pct);\n    }\n\n    [part~='row'][dragover] [part~='cell'][last-frozen]::after {\n      right: -1px;\n    }\n\n    :host([theme~='no-row-borders']) [dragover] [part~='cell']::after {\n      height: 2px;\n    }\n\n    [part~='row'][dragover='below'] [part~='cell']::after {\n      top: 100%;\n      bottom: auto;\n      margin-top: -1px;\n    }\n\n    :host([all-rows-visible]) [part~='row'][last][dragover='below'] [part~='cell']::after {\n      height: 1px;\n    }\n\n    [part~='row'][dragover='above'] [part~='cell']::after {\n      top: auto;\n      bottom: 100%;\n      margin-bottom: -1px;\n    }\n\n    [part~='row'][details-opened][dragover='below'] [part~='cell']:not([part~='details-cell'])::after,\n    [part~='row'][details-opened][dragover='above'] [part~='details-cell']::after {\n      display: none;\n    }\n\n    [part~='row'][dragover][dragover='on-top'] [part~='cell']::after {\n      height: 100%;\n      opacity: 0.5;\n    }\n\n    [part~='row'][dragstart] [part~='cell'] {\n      border: none !important;\n      box-shadow: none !important;\n    }\n\n    [part~='row'][dragstart] [part~='cell'][last-column] {\n      border-radius: 0 var(--lumo-border-radius-s) var(--lumo-border-radius-s) 0;\n    }\n\n    [part~='row'][dragstart] [part~='cell'][first-column] {\n      border-radius: var(--lumo-border-radius-s) 0 0 var(--lumo-border-radius-s);\n    }\n\n    #scroller [part~='row'][dragstart]:not([dragstart=''])::after {\n      display: block;\n      position: absolute;\n      left: var(--_grid-drag-start-x);\n      top: var(--_grid-drag-start-y);\n      z-index: 100;\n      content: attr(dragstart);\n      align-items: center;\n      justify-content: center;\n      box-sizing: border-box;\n      padding: calc(var(--lumo-space-xs) * 0.8);\n      color: var(--lumo-error-contrast-color);\n      background-color: var(--lumo-error-color);\n      border-radius: var(--lumo-border-radius-m);\n      font-family: var(--lumo-font-family);\n      font-size: var(--lumo-font-size-xxs);\n      line-height: 1;\n      font-weight: 500;\n      text-transform: initial;\n      letter-spacing: initial;\n      min-width: calc(var(--lumo-size-s) * 0.7);\n      text-align: center;\n    }\n\n    /* Headers and footers */\n\n    [part~='header-cell'] ::slotted(vaadin-grid-cell-content),\n    [part~='footer-cell'] ::slotted(vaadin-grid-cell-content),\n    [part~='reorder-ghost'] {\n      font-size: var(--lumo-font-size-s);\n      font-weight: 500;\n    }\n\n    [part~='footer-cell'] ::slotted(vaadin-grid-cell-content) {\n      font-weight: 400;\n    }\n\n    [part='row']:only-child [part~='header-cell'] {\n      min-height: var(--lumo-size-xl);\n    }\n\n    /* Header borders */\n\n    /* Hide first header row top border */\n    :host(:not([theme~='no-row-borders'])) [part='row']:first-child [part~='header-cell'] {\n      border-top: 0;\n    }\n\n    [part='row']:last-child [part~='header-cell'] {\n      border-bottom: var(--_lumo-grid-border-width) solid transparent;\n    }\n\n    :host(:not([theme~='no-row-borders'])) [part='row']:last-child [part~='header-cell'] {\n      border-bottom-color: var(--_lumo-grid-secondary-border-color);\n    }\n\n    /* Overflow uses a stronger border color */\n    :host([overflow~='top']) [part='row']:last-child [part~='header-cell'] {\n      border-bottom-color: var(--_lumo-grid-border-color);\n    }\n\n    /* Footer borders */\n\n    [part='row']:first-child [part~='footer-cell'] {\n      border-top: var(--_lumo-grid-border-width) solid transparent;\n    }\n\n    :host(:not([theme~='no-row-borders'])) [part='row']:first-child [part~='footer-cell'] {\n      border-top-color: var(--_lumo-grid-secondary-border-color);\n    }\n\n    /* Overflow uses a stronger border color */\n    :host([overflow~='bottom']) [part='row']:first-child [part~='footer-cell'] {\n      border-top-color: var(--_lumo-grid-border-color);\n    }\n\n    /* Column reordering */\n\n    :host([reordering]) [part~='cell'] {\n      background: linear-gradient(var(--lumo-shade-20pct), var(--lumo-shade-20pct)) var(--lumo-base-color);\n    }\n\n    :host([reordering]) [part~='cell'][reorder-status='allowed'] {\n      background: var(--lumo-base-color);\n    }\n\n    :host([reordering]) [part~='cell'][reorder-status='dragging'] {\n      background: linear-gradient(var(--lumo-contrast-5pct), var(--lumo-contrast-5pct)) var(--lumo-base-color);\n    }\n\n    [part~='reorder-ghost'] {\n      opacity: 0.85;\n      box-shadow: var(--lumo-box-shadow-s);\n      /* TODO Use the same styles as for the cell element (reorder-ghost copies styles from the cell element) */\n      padding: var(--lumo-space-s) var(--lumo-space-m) !important;\n    }\n\n    /* Column resizing */\n\n    [part='resize-handle'] {\n      width: 3px;\n      background-color: var(--lumo-primary-color-50pct);\n      opacity: 0;\n      transition: opacity 0.2s;\n    }\n\n    :host(:not([reordering])) *:not([column-resizing]) [part~='cell']:hover [part='resize-handle'],\n    [part='resize-handle']:active {\n      opacity: 1;\n      transition-delay: 0.15s;\n    }\n\n    /* Column borders */\n\n    :host([theme~='column-borders']) [part~='cell']:not([last-column]):not([part~='details-cell']) {\n      border-right: var(--_lumo-grid-border-width) solid var(--_lumo-grid-secondary-border-color);\n    }\n\n    /* Frozen columns */\n\n    [last-frozen] {\n      border-right: var(--_lumo-grid-border-width) solid transparent;\n      overflow: hidden;\n    }\n\n    :host([overflow~='start']) [part~='cell'][last-frozen]:not([part~='details-cell']) {\n      border-right-color: var(--_lumo-grid-border-color);\n    }\n\n    [first-frozen-to-end] {\n      border-left: var(--_lumo-grid-border-width) solid transparent;\n    }\n\n    :host([overflow~='end']) [part~='cell'][first-frozen-to-end]:not([part~='details-cell']) {\n      border-left-color: var(--_lumo-grid-border-color);\n    }\n\n    /* Row stripes */\n\n    :host([theme~='row-stripes']) [part~='row']:not([odd]) [part~='body-cell'],\n    :host([theme~='row-stripes']) [part~='row']:not([odd]) [part~='details-cell'] {\n      background-image: linear-gradient(var(--lumo-contrast-5pct), var(--lumo-contrast-5pct));\n      background-repeat: repeat-x;\n    }\n\n    /* Selected row */\n\n    /* Raise the selected rows above unselected rows (so that box-shadow can cover unselected rows) */\n    :host(:not([reordering])) [part~='row'][selected] {\n      z-index: 1;\n    }\n\n    :host(:not([reordering])) [part~='row'][selected] [part~='body-cell']:not([part~='details-cell']) {\n      background-image: linear-gradient(var(--_lumo-grid-selected-row-color), var(--_lumo-grid-selected-row-color));\n      background-repeat: repeat;\n    }\n\n    /* Cover the border of an unselected row */\n    :host(:not([theme~='no-row-borders'])) [part~='row'][selected] [part~='cell']:not([part~='details-cell']) {\n      box-shadow: 0 var(--_lumo-grid-border-width) 0 0 var(--_lumo-grid-selected-row-color);\n    }\n\n    /* Compact */\n\n    :host([theme~='compact']) [part='row']:only-child [part~='header-cell'] {\n      min-height: var(--lumo-size-m);\n    }\n\n    :host([theme~='compact']) [part~='cell'] {\n      min-height: var(--lumo-size-s);\n    }\n\n    :host([theme~='compact']) [part='row'][first] [part~='cell']:not([part~='details-cell']) {\n      min-height: calc(var(--lumo-size-s) - var(--_lumo-grid-border-width));\n    }\n\n    :host([theme~='compact']) [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      padding: var(--lumo-space-xs) var(--lumo-space-s);\n    }\n\n    /* Wrap cell contents */\n\n    :host([theme~='wrap-cell-content']) [part~='cell'] ::slotted(vaadin-grid-cell-content) {\n      white-space: normal;\n    }\n\n    /* RTL specific styles */\n\n    :host([dir='rtl']) [part~='row'][dragstart] [part~='cell'][last-column] {\n      border-radius: var(--lumo-border-radius-s) 0 0 var(--lumo-border-radius-s);\n    }\n\n    :host([dir='rtl']) [part~='row'][dragstart] [part~='cell'][first-column] {\n      border-radius: 0 var(--lumo-border-radius-s) var(--lumo-border-radius-s) 0;\n    }\n\n    :host([dir='rtl'][theme~='column-borders']) [part~='cell']:not([last-column]):not([part~='details-cell']) {\n      border-right: none;\n      border-left: var(--_lumo-grid-border-width) solid var(--_lumo-grid-secondary-border-color);\n    }\n\n    :host([dir='rtl']) [last-frozen] {\n      border-right: none;\n      border-left: var(--_lumo-grid-border-width) solid transparent;\n    }\n\n    :host([dir='rtl']) [first-frozen-to-end] {\n      border-left: none;\n      border-right: var(--_lumo-grid-border-width) solid transparent;\n    }\n\n    :host([dir='rtl'][overflow~='start']) [part~='cell'][last-frozen]:not([part~='details-cell']) {\n      border-left-color: var(--_lumo-grid-border-color);\n    }\n\n    :host([dir='rtl'][overflow~='end']) [part~='cell'][first-frozen-to-end]:not([part~='details-cell']) {\n      border-right-color: var(--_lumo-grid-border-color);\n    }\n  `,\n  { moduleId: 'lumo-grid' },\n);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst colorBase = css`\n  :host {\n    /* Base (background) */\n    --lumo-base-color: #fff;\n\n    /* Tint */\n    --lumo-tint-5pct: hsla(0, 0%, 100%, 0.3);\n    --lumo-tint-10pct: hsla(0, 0%, 100%, 0.37);\n    --lumo-tint-20pct: hsla(0, 0%, 100%, 0.44);\n    --lumo-tint-30pct: hsla(0, 0%, 100%, 0.5);\n    --lumo-tint-40pct: hsla(0, 0%, 100%, 0.57);\n    --lumo-tint-50pct: hsla(0, 0%, 100%, 0.64);\n    --lumo-tint-60pct: hsla(0, 0%, 100%, 0.7);\n    --lumo-tint-70pct: hsla(0, 0%, 100%, 0.77);\n    --lumo-tint-80pct: hsla(0, 0%, 100%, 0.84);\n    --lumo-tint-90pct: hsla(0, 0%, 100%, 0.9);\n    --lumo-tint: #fff;\n\n    /* Shade */\n    --lumo-shade-5pct: hsla(214, 61%, 25%, 0.05);\n    --lumo-shade-10pct: hsla(214, 57%, 24%, 0.1);\n    --lumo-shade-20pct: hsla(214, 53%, 23%, 0.16);\n    --lumo-shade-30pct: hsla(214, 50%, 22%, 0.26);\n    --lumo-shade-40pct: hsla(214, 47%, 21%, 0.38);\n    --lumo-shade-50pct: hsla(214, 45%, 20%, 0.52);\n    --lumo-shade-60pct: hsla(214, 43%, 19%, 0.6);\n    --lumo-shade-70pct: hsla(214, 42%, 18%, 0.69);\n    --lumo-shade-80pct: hsla(214, 41%, 17%, 0.83);\n    --lumo-shade-90pct: hsla(214, 40%, 16%, 0.94);\n    --lumo-shade: hsl(214, 35%, 15%);\n\n    /* Contrast */\n    --lumo-contrast-5pct: var(--lumo-shade-5pct);\n    --lumo-contrast-10pct: var(--lumo-shade-10pct);\n    --lumo-contrast-20pct: var(--lumo-shade-20pct);\n    --lumo-contrast-30pct: var(--lumo-shade-30pct);\n    --lumo-contrast-40pct: var(--lumo-shade-40pct);\n    --lumo-contrast-50pct: var(--lumo-shade-50pct);\n    --lumo-contrast-60pct: var(--lumo-shade-60pct);\n    --lumo-contrast-70pct: var(--lumo-shade-70pct);\n    --lumo-contrast-80pct: var(--lumo-shade-80pct);\n    --lumo-contrast-90pct: var(--lumo-shade-90pct);\n    --lumo-contrast: var(--lumo-shade);\n\n    /* Text */\n    --lumo-header-text-color: var(--lumo-contrast);\n    --lumo-body-text-color: var(--lumo-contrast-90pct);\n    --lumo-secondary-text-color: var(--lumo-contrast-70pct);\n    --lumo-tertiary-text-color: var(--lumo-contrast-50pct);\n    --lumo-disabled-text-color: var(--lumo-contrast-30pct);\n\n    /* Primary */\n    --lumo-primary-color: hsl(214, 100%, 48%);\n    --lumo-primary-color-50pct: hsla(214, 100%, 49%, 0.76);\n    --lumo-primary-color-10pct: hsla(214, 100%, 60%, 0.13);\n    --lumo-primary-text-color: hsl(214, 100%, 43%);\n    --lumo-primary-contrast-color: #fff;\n\n    /* Error */\n    --lumo-error-color: hsl(3, 85%, 48%);\n    --lumo-error-color-50pct: hsla(3, 85%, 49%, 0.5);\n    --lumo-error-color-10pct: hsla(3, 85%, 49%, 0.1);\n    --lumo-error-text-color: hsl(3, 89%, 42%);\n    --lumo-error-contrast-color: #fff;\n\n    /* Success */\n    --lumo-success-color: hsl(145, 72%, 30%);\n    --lumo-success-color-50pct: hsla(145, 72%, 31%, 0.5);\n    --lumo-success-color-10pct: hsla(145, 72%, 31%, 0.1);\n    --lumo-success-text-color: hsl(145, 85%, 25%);\n    --lumo-success-contrast-color: #fff;\n  }\n`;\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${colorBase.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nconst color = css`\n  [theme~='dark'] {\n    /* Base (background) */\n    --lumo-base-color: hsl(214, 35%, 21%);\n\n    /* Tint */\n    --lumo-tint-5pct: hsla(214, 65%, 85%, 0.06);\n    --lumo-tint-10pct: hsla(214, 60%, 80%, 0.14);\n    --lumo-tint-20pct: hsla(214, 64%, 82%, 0.23);\n    --lumo-tint-30pct: hsla(214, 69%, 84%, 0.32);\n    --lumo-tint-40pct: hsla(214, 73%, 86%, 0.41);\n    --lumo-tint-50pct: hsla(214, 78%, 88%, 0.5);\n    --lumo-tint-60pct: hsla(214, 82%, 90%, 0.58);\n    --lumo-tint-70pct: hsla(214, 87%, 92%, 0.69);\n    --lumo-tint-80pct: hsla(214, 91%, 94%, 0.8);\n    --lumo-tint-90pct: hsla(214, 96%, 96%, 0.9);\n    --lumo-tint: hsl(214, 100%, 98%);\n\n    /* Shade */\n    --lumo-shade-5pct: hsla(214, 0%, 0%, 0.07);\n    --lumo-shade-10pct: hsla(214, 4%, 2%, 0.15);\n    --lumo-shade-20pct: hsla(214, 8%, 4%, 0.23);\n    --lumo-shade-30pct: hsla(214, 12%, 6%, 0.32);\n    --lumo-shade-40pct: hsla(214, 16%, 8%, 0.41);\n    --lumo-shade-50pct: hsla(214, 20%, 10%, 0.5);\n    --lumo-shade-60pct: hsla(214, 24%, 12%, 0.6);\n    --lumo-shade-70pct: hsla(214, 28%, 13%, 0.7);\n    --lumo-shade-80pct: hsla(214, 32%, 13%, 0.8);\n    --lumo-shade-90pct: hsla(214, 33%, 13%, 0.9);\n    --lumo-shade: hsl(214, 33%, 13%);\n\n    /* Contrast */\n    --lumo-contrast-5pct: var(--lumo-tint-5pct);\n    --lumo-contrast-10pct: var(--lumo-tint-10pct);\n    --lumo-contrast-20pct: var(--lumo-tint-20pct);\n    --lumo-contrast-30pct: var(--lumo-tint-30pct);\n    --lumo-contrast-40pct: var(--lumo-tint-40pct);\n    --lumo-contrast-50pct: var(--lumo-tint-50pct);\n    --lumo-contrast-60pct: var(--lumo-tint-60pct);\n    --lumo-contrast-70pct: var(--lumo-tint-70pct);\n    --lumo-contrast-80pct: var(--lumo-tint-80pct);\n    --lumo-contrast-90pct: var(--lumo-tint-90pct);\n    --lumo-contrast: var(--lumo-tint);\n\n    /* Text */\n    --lumo-header-text-color: var(--lumo-contrast);\n    --lumo-body-text-color: var(--lumo-contrast-90pct);\n    --lumo-secondary-text-color: var(--lumo-contrast-70pct);\n    --lumo-tertiary-text-color: var(--lumo-contrast-50pct);\n    --lumo-disabled-text-color: var(--lumo-contrast-30pct);\n\n    /* Primary */\n    --lumo-primary-color: hsl(214, 90%, 48%);\n    --lumo-primary-color-50pct: hsla(214, 90%, 70%, 0.69);\n    --lumo-primary-color-10pct: hsla(214, 90%, 55%, 0.13);\n    --lumo-primary-text-color: hsl(214, 90%, 77%);\n    --lumo-primary-contrast-color: #fff;\n\n    /* Error */\n    --lumo-error-color: hsl(3, 79%, 49%);\n    --lumo-error-color-50pct: hsla(3, 75%, 62%, 0.5);\n    --lumo-error-color-10pct: hsla(3, 75%, 62%, 0.14);\n    --lumo-error-text-color: hsl(3, 100%, 80%);\n\n    /* Success */\n    --lumo-success-color: hsl(145, 72%, 30%);\n    --lumo-success-color-50pct: hsla(145, 92%, 51%, 0.5);\n    --lumo-success-color-10pct: hsla(145, 92%, 51%, 0.1);\n    --lumo-success-text-color: hsl(145, 85%, 46%);\n  }\n\n  html {\n    color: var(--lumo-body-text-color);\n    background-color: var(--lumo-base-color);\n    color-scheme: light;\n  }\n\n  [theme~='dark'] {\n    color: var(--lumo-body-text-color);\n    background-color: var(--lumo-base-color);\n    color-scheme: dark;\n  }\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    color: var(--lumo-header-text-color);\n  }\n\n  a:where(:any-link) {\n    color: var(--lumo-primary-text-color);\n  }\n\n  a:not(:any-link) {\n    color: var(--lumo-disabled-text-color);\n  }\n\n  blockquote {\n    color: var(--lumo-secondary-text-color);\n  }\n\n  code,\n  pre {\n    background-color: var(--lumo-contrast-10pct);\n    border-radius: var(--lumo-border-radius-m);\n  }\n`;\n\nregisterStyles('', color, { moduleId: 'lumo-color' });\n\nconst colorLegacy = css`\n  :host {\n    color: var(--lumo-body-text-color) !important;\n    background-color: var(--lumo-base-color) !important;\n  }\n`;\n\nregisterStyles('', [color, colorLegacy], { moduleId: 'lumo-color-legacy' });\n\nexport { colorBase, color, colorLegacy };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = `\n  <style>\n    @font-face {\n      font-family: 'lumo-icons';\n      src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n      font-weight: normal;\n      font-style: normal;\n    }\n\n    html {\n      --lumo-icons-align-center: \"\\\\ea01\";\n      --lumo-icons-align-left: \"\\\\ea02\";\n      --lumo-icons-align-right: \"\\\\ea03\";\n      --lumo-icons-angle-down: \"\\\\ea04\";\n      --lumo-icons-angle-left: \"\\\\ea05\";\n      --lumo-icons-angle-right: \"\\\\ea06\";\n      --lumo-icons-angle-up: \"\\\\ea07\";\n      --lumo-icons-arrow-down: \"\\\\ea08\";\n      --lumo-icons-arrow-left: \"\\\\ea09\";\n      --lumo-icons-arrow-right: \"\\\\ea0a\";\n      --lumo-icons-arrow-up: \"\\\\ea0b\";\n      --lumo-icons-bar-chart: \"\\\\ea0c\";\n      --lumo-icons-bell: \"\\\\ea0d\";\n      --lumo-icons-calendar: \"\\\\ea0e\";\n      --lumo-icons-checkmark: \"\\\\ea0f\";\n      --lumo-icons-chevron-down: \"\\\\ea10\";\n      --lumo-icons-chevron-left: \"\\\\ea11\";\n      --lumo-icons-chevron-right: \"\\\\ea12\";\n      --lumo-icons-chevron-up: \"\\\\ea13\";\n      --lumo-icons-clock: \"\\\\ea14\";\n      --lumo-icons-cog: \"\\\\ea15\";\n      --lumo-icons-cross: \"\\\\ea16\";\n      --lumo-icons-download: \"\\\\ea17\";\n      --lumo-icons-dropdown: \"\\\\ea18\";\n      --lumo-icons-edit: \"\\\\ea19\";\n      --lumo-icons-error: \"\\\\ea1a\";\n      --lumo-icons-eye: \"\\\\ea1b\";\n      --lumo-icons-eye-disabled: \"\\\\ea1c\";\n      --lumo-icons-menu: \"\\\\ea1d\";\n      --lumo-icons-minus: \"\\\\ea1e\";\n      --lumo-icons-ordered-list: \"\\\\ea1f\";\n      --lumo-icons-phone: \"\\\\ea20\";\n      --lumo-icons-photo: \"\\\\ea21\";\n      --lumo-icons-play: \"\\\\ea22\";\n      --lumo-icons-plus: \"\\\\ea23\";\n      --lumo-icons-redo: \"\\\\ea24\";\n      --lumo-icons-reload: \"\\\\ea25\";\n      --lumo-icons-search: \"\\\\ea26\";\n      --lumo-icons-undo: \"\\\\ea27\";\n      --lumo-icons-unordered-list: \"\\\\ea28\";\n      --lumo-icons-upload: \"\\\\ea29\";\n      --lumo-icons-user: \"\\\\ea2a\";\n    }\n  </style>\n`;\n\ndocument.head.appendChild(template.content);\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst sizing = css`\n  :host {\n    --lumo-size-xs: 1.625rem;\n    --lumo-size-s: 1.875rem;\n    --lumo-size-m: 2.25rem;\n    --lumo-size-l: 2.75rem;\n    --lumo-size-xl: 3.5rem;\n\n    /* Icons */\n    --lumo-icon-size-s: 1.25em;\n    --lumo-icon-size-m: 1.5em;\n    --lumo-icon-size-l: 2.25em;\n    /* For backwards compatibility */\n    --lumo-icon-size: var(--lumo-icon-size-m);\n  }\n`;\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${sizing.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { sizing };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst spacing = css`\n  :host {\n    /* Square */\n    --lumo-space-xs: 0.25rem;\n    --lumo-space-s: 0.5rem;\n    --lumo-space-m: 1rem;\n    --lumo-space-l: 1.5rem;\n    --lumo-space-xl: 2.5rem;\n\n    /* Wide */\n    --lumo-space-wide-xs: calc(var(--lumo-space-xs) / 2) var(--lumo-space-xs);\n    --lumo-space-wide-s: calc(var(--lumo-space-s) / 2) var(--lumo-space-s);\n    --lumo-space-wide-m: calc(var(--lumo-space-m) / 2) var(--lumo-space-m);\n    --lumo-space-wide-l: calc(var(--lumo-space-l) / 2) var(--lumo-space-l);\n    --lumo-space-wide-xl: calc(var(--lumo-space-xl) / 2) var(--lumo-space-xl);\n\n    /* Tall */\n    --lumo-space-tall-xs: var(--lumo-space-xs) calc(var(--lumo-space-xs) / 2);\n    --lumo-space-tall-s: var(--lumo-space-s) calc(var(--lumo-space-s) / 2);\n    --lumo-space-tall-m: var(--lumo-space-m) calc(var(--lumo-space-m) / 2);\n    --lumo-space-tall-l: var(--lumo-space-l) calc(var(--lumo-space-l) / 2);\n    --lumo-space-tall-xl: var(--lumo-space-xl) calc(var(--lumo-space-xl) / 2);\n  }\n`;\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${spacing.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { spacing };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst style = css`\n  :host {\n    /* Border radius */\n    --lumo-border-radius-s: 0.25em; /* Checkbox, badge, date-picker year indicator, etc */\n    --lumo-border-radius-m: var(--lumo-border-radius, 0.25em); /* Button, text field, menu overlay, etc */\n    --lumo-border-radius-l: 0.5em; /* Dialog, notification, etc */\n    --lumo-border-radius: 0.25em; /* Deprecated */\n\n    /* Shadow */\n    --lumo-box-shadow-xs: 0 1px 4px -1px var(--lumo-shade-50pct);\n    --lumo-box-shadow-s: 0 2px 4px -1px var(--lumo-shade-20pct), 0 3px 12px -1px var(--lumo-shade-30pct);\n    --lumo-box-shadow-m: 0 2px 6px -1px var(--lumo-shade-20pct), 0 8px 24px -4px var(--lumo-shade-40pct);\n    --lumo-box-shadow-l: 0 3px 18px -2px var(--lumo-shade-20pct), 0 12px 48px -6px var(--lumo-shade-40pct);\n    --lumo-box-shadow-xl: 0 4px 24px -3px var(--lumo-shade-20pct), 0 18px 64px -8px var(--lumo-shade-40pct);\n\n    /* Clickable element cursor */\n    --lumo-clickable-cursor: default;\n  }\n`;\n\n/**\n * Default values for component-specific custom properties.\n */\nconst globals = css`\n  html {\n    --vaadin-checkbox-size: calc(var(--lumo-size-m) / 2);\n    --vaadin-radio-button-size: calc(var(--lumo-size-m) / 2);\n  }\n`;\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${style.toString().replace(':host', 'html')}$</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { globals, style };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport './version.js';\nimport { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';\n\nconst font = css`\n  :host {\n    /* prettier-ignore */\n    --lumo-font-family: -apple-system, BlinkMacSystemFont, 'Roboto', 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\n\n    /* Font sizes */\n    --lumo-font-size-xxs: 0.75rem;\n    --lumo-font-size-xs: 0.8125rem;\n    --lumo-font-size-s: 0.875rem;\n    --lumo-font-size-m: 1rem;\n    --lumo-font-size-l: 1.125rem;\n    --lumo-font-size-xl: 1.375rem;\n    --lumo-font-size-xxl: 1.75rem;\n    --lumo-font-size-xxxl: 2.5rem;\n\n    /* Line heights */\n    --lumo-line-height-xs: 1.25;\n    --lumo-line-height-s: 1.375;\n    --lumo-line-height-m: 1.625;\n  }\n`;\n\nconst typography = css`\n  html,\n  :host {\n    font-family: var(--lumo-font-family);\n    font-size: var(--lumo-font-size, var(--lumo-font-size-m));\n    line-height: var(--lumo-line-height-m);\n    -webkit-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n  small,\n  [theme~='font-size-s'] {\n    font-size: var(--lumo-font-size-s);\n    line-height: var(--lumo-line-height-s);\n  }\n\n  [theme~='font-size-xs'] {\n    font-size: var(--lumo-font-size-xs);\n    line-height: var(--lumo-line-height-xs);\n  }\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    font-weight: 600;\n    line-height: var(--lumo-line-height-xs);\n    margin-top: 1.25em;\n  }\n\n  h1 {\n    font-size: var(--lumo-font-size-xxxl);\n    margin-bottom: 0.75em;\n  }\n\n  h2 {\n    font-size: var(--lumo-font-size-xxl);\n    margin-bottom: 0.5em;\n  }\n\n  h3 {\n    font-size: var(--lumo-font-size-xl);\n    margin-bottom: 0.5em;\n  }\n\n  h4 {\n    font-size: var(--lumo-font-size-l);\n    margin-bottom: 0.5em;\n  }\n\n  h5 {\n    font-size: var(--lumo-font-size-m);\n    margin-bottom: 0.25em;\n  }\n\n  h6 {\n    font-size: var(--lumo-font-size-xs);\n    margin-bottom: 0;\n    text-transform: uppercase;\n    letter-spacing: 0.03em;\n  }\n\n  p,\n  blockquote {\n    margin-top: 0.5em;\n    margin-bottom: 0.75em;\n  }\n\n  a {\n    text-decoration: none;\n  }\n\n  a:where(:any-link):hover {\n    text-decoration: underline;\n  }\n\n  hr {\n    display: block;\n    align-self: stretch;\n    height: 1px;\n    border: 0;\n    padding: 0;\n    margin: var(--lumo-space-s) calc(var(--lumo-border-radius-m) / 2);\n    background-color: var(--lumo-contrast-10pct);\n  }\n\n  blockquote {\n    border-left: 2px solid var(--lumo-contrast-30pct);\n  }\n\n  b,\n  strong {\n    font-weight: 600;\n  }\n\n  /* RTL specific styles */\n  blockquote[dir='rtl'] {\n    border-left: none;\n    border-right: 2px solid var(--lumo-contrast-30pct);\n  }\n`;\n\nregisterStyles('', typography, { moduleId: 'lumo-typography' });\n\nconst $tpl = document.createElement('template');\n$tpl.innerHTML = `<style>${font.toString().replace(':host', 'html')}</style>`;\ndocument.head.appendChild($tpl.content);\n\nexport { font, typography };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n\n/**\n * Dummy custom element used for collecting\n * development time usage statistics.\n *\n * @private\n */\nclass Lumo extends HTMLElement {\n  static get version() {\n    return '23.5.11';\n  }\n}\n\ncustomElements.define('vaadin-lumo-styles', Lumo);\n\nexport { Lumo };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\nimport { css, CSSResult, unsafeCSS } from 'lit';\nimport { ThemePropertyMixin } from './vaadin-theme-property-mixin.js';\n\nexport { css, unsafeCSS };\n\n/**\n * @typedef {Object} Theme\n * @property {string} themeFor\n * @property {CSSResult[]} styles\n * @property {string | string[]} [include]\n * @property {string} [moduleId]\n *\n * @typedef {CSSResult[] | CSSResult} CSSResultGroup\n */\n\n/**\n * @type {Theme[]}\n */\nconst themeRegistry = [];\n\n/**\n * Registers CSS styles for a component type. Make sure to register the styles before\n * the first instance of a component of the type is attached to DOM.\n *\n * @param {string} themeFor The local/tag name of the component type to register the styles for\n * @param {CSSResultGroup} styles The CSS style rules to be registered for the component type\n * matching themeFor and included in the local scope of each component instance\n * @param {{moduleId?: string, include?: string | string[]}} options Additional options\n * @return {void}\n */\nexport function registerStyles(themeFor, styles, options = {}) {\n  if (themeFor) {\n    if (hasThemes(themeFor)) {\n      console.warn(`The custom element definition for \"${themeFor}\"\n      was finalized before a style module was registered.\n      Make sure to add component specific style modules before\n      importing the corresponding custom element.`);\n    }\n  }\n\n  styles = flattenStyles(styles);\n\n  if (window.Vaadin && window.Vaadin.styleModules) {\n    window.Vaadin.styleModules.registerStyles(themeFor, styles, options);\n  } else {\n    themeRegistry.push({\n      themeFor,\n      styles,\n      include: options.include,\n      moduleId: options.moduleId,\n    });\n  }\n}\n\n/**\n * Returns all registered themes. By default the themeRegistry is returned as is.\n * In case the style-modules adapter is imported, the themes are obtained from there instead\n * @returns {Theme[]}\n */\nfunction getAllThemes() {\n  if (window.Vaadin && window.Vaadin.styleModules) {\n    return window.Vaadin.styleModules.getAllThemes();\n  }\n  return themeRegistry;\n}\n\n/**\n * Returns true if the themeFor string matches the tag name\n * @param {string} themeFor\n * @param {string} tagName\n * @returns {boolean}\n */\nfunction matchesThemeFor(themeFor, tagName) {\n  return (themeFor || '').split(' ').some((themeForToken) => {\n    return new RegExp(`^${themeForToken.split('*').join('.*')}$`).test(tagName);\n  });\n}\n\n/**\n * Maps the moduleName to an include priority number which is used for\n * determining the order in which styles are applied.\n * @param {string} moduleName\n * @returns {number}\n */\nfunction getIncludePriority(moduleName = '') {\n  let includePriority = 0;\n  if (moduleName.startsWith('lumo-') || moduleName.startsWith('material-')) {\n    includePriority = 1;\n  } else if (moduleName.startsWith('vaadin-')) {\n    includePriority = 2;\n  }\n  return includePriority;\n}\n\n/**\n * Flattens the styles into a single array of styles.\n * @param {CSSResultGroup} styles\n * @param {CSSResult[]} result\n * @returns {CSSResult[]}\n */\nfunction flattenStyles(styles = []) {\n  return [styles].flat(Infinity).filter((style) => {\n    if (style instanceof CSSResult) {\n      return true;\n    }\n    console.warn('An item in styles is not of type CSSResult. Use `unsafeCSS` or `css`.');\n    return false;\n  });\n}\n\n/**\n * Gets an array of CSSResults matching the include property of the theme.\n * @param {Theme} theme\n * @returns {CSSResult[]}\n */\nfunction getIncludedStyles(theme) {\n  const includedStyles = [];\n  if (theme.include) {\n    [].concat(theme.include).forEach((includeModuleId) => {\n      const includedTheme = getAllThemes().find((s) => s.moduleId === includeModuleId);\n      if (includedTheme) {\n        includedStyles.push(...getIncludedStyles(includedTheme), ...includedTheme.styles);\n      } else {\n        console.warn(`Included moduleId ${includeModuleId} not found in style registry`);\n      }\n    }, theme.styles);\n  }\n  return includedStyles;\n}\n\n/**\n * Includes the styles to the template.\n * @param {CSSResult[]} styles\n * @param {HTMLTemplateElement} template\n */\nfunction addStylesToTemplate(styles, template) {\n  const styleEl = document.createElement('style');\n  styleEl.innerHTML = styles.map((style) => style.cssText).join('\\n');\n  template.content.appendChild(styleEl);\n}\n\n/**\n * Returns an array of themes that should be used for styling a component matching\n * the tag name. The array is sorted by the include order.\n * @param {string} tagName\n * @returns {Theme[]}\n */\nfunction getThemes(tagName) {\n  const defaultModuleName = `${tagName}-default-theme`;\n\n  const themes = getAllThemes()\n    // Filter by matching themeFor properties\n    .filter((theme) => theme.moduleId !== defaultModuleName && matchesThemeFor(theme.themeFor, tagName))\n    .map((theme) => ({\n      ...theme,\n      // Prepend styles from included themes\n      styles: [...getIncludedStyles(theme), ...theme.styles],\n      // Map moduleId to includePriority\n      includePriority: getIncludePriority(theme.moduleId),\n    }))\n    // Sort by includePriority\n    .sort((themeA, themeB) => themeB.includePriority - themeA.includePriority);\n\n  if (themes.length > 0) {\n    return themes;\n  }\n  // No theme modules found, return the default module if it exists\n  return getAllThemes().filter((theme) => theme.moduleId === defaultModuleName);\n}\n\n/**\n * Check if the custom element type has themes applied.\n * @param {string} tagName\n * @returns {boolean}\n */\nfunction hasThemes(tagName) {\n  return classHasThemes(customElements.get(tagName));\n}\n\n/**\n * Check if the custom element type has themes applied.\n * @param {Function} elementClass\n * @returns {boolean}\n */\nfunction classHasThemes(elementClass) {\n  return elementClass && Object.prototype.hasOwnProperty.call(elementClass, '__themes');\n}\n\n/**\n * @polymerMixin\n * @mixes ThemePropertyMixin\n */\nexport const ThemableMixin = (superClass) =>\n  class VaadinThemableMixin extends ThemePropertyMixin(superClass) {\n    /**\n     * Covers PolymerElement based component styling\n     * @protected\n     */\n    static finalize() {\n      super.finalize();\n\n      // Make sure not to run the logic intended for PolymerElement when LitElement is used.\n      if (this.elementStyles) {\n        return;\n      }\n\n      const template = this.prototype._template;\n      if (!template || classHasThemes(this)) {\n        return;\n      }\n\n      addStylesToTemplate(this.getStylesForThis(), template);\n    }\n\n    /**\n     * Covers LitElement based component styling\n     *\n     * @protected\n     */\n    static finalizeStyles(styles) {\n      // The \"styles\" object originates from the \"static get styles()\" function of\n      // a LitElement based component. The theme styles are added after it\n      // so that they can override the component styles.\n      const themeStyles = this.getStylesForThis();\n      return styles ? [...super.finalizeStyles(styles), ...themeStyles] : themeStyles;\n    }\n\n    /**\n     * Get styles for the component type\n     *\n     * @private\n     */\n    static getStylesForThis() {\n      const parent = Object.getPrototypeOf(this.prototype);\n      const inheritedThemes = (parent ? parent.constructor.__themes : []) || [];\n      this.__themes = [...inheritedThemes, ...getThemes(this.is)];\n      const themeStyles = this.__themes.flatMap((theme) => theme.styles);\n      // Remove duplicates\n      return themeStyles.filter((style, index) => index === themeStyles.lastIndexOf(style));\n    }\n  };\n\nexport { themeRegistry as __themeRegistry };\n","/**\n * @license\n * Copyright (c) 2000 - 2024 Vaadin Ltd.\n *\n * This program is available under Vaadin Commercial License and Service Terms.\n *\n *\n * See https://vaadin.com/commercial-license-and-service-terms for the full\n * license.\n */\n/**\n * @polymerMixin\n */\nexport const ThemePropertyMixin = (superClass) =>\n  class VaadinThemePropertyMixin extends superClass {\n    static get properties() {\n      return {\n        /**\n         * Helper property with theme attribute value facilitating propagation\n         * in shadow DOM.\n         *\n         * Enables the component implementation to propagate the `theme`\n         * attribute value to the sub-components in Shadow DOM by binding\n         * the sub-component’s \"theme\" attribute to the `theme` property of\n         * the host.\n         *\n         * **NOTE:** Extending the mixin only provides the property for binding,\n         * and does not make the propagation alone.\n         *\n         * See [Styling Components: Sub-components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components/#sub-components).\n         * page for more information.\n         *\n         * @deprecated The `theme` property is not supposed for public use and will be dropped in Vaadin 24.\n         * Please, use the `theme` attribute instead.\n         * @protected\n         */\n        theme: {\n          type: String,\n          reflectToAttribute: true,\n          observer: '__deprecatedThemePropertyChanged',\n        },\n\n        /**\n         * Helper property with theme attribute value facilitating propagation\n         * in shadow DOM.\n         *\n         * Enables the component implementation to propagate the `theme`\n         * attribute value to the sub-components in Shadow DOM by binding\n         * the sub-component’s \"theme\" attribute to the `theme` property of\n         * the host.\n         *\n         * **NOTE:** Extending the mixin only provides the property for binding,\n         * and does not make the propagation alone.\n         *\n         * See [Styling Components: Sub-components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components/#sub-components).\n         * page for more information.\n         *\n         * @protected\n         */\n        _theme: {\n          type: String,\n          readOnly: true,\n        },\n      };\n    }\n\n    /** @private */\n    __deprecatedThemePropertyChanged(theme) {\n      this._set_theme(theme);\n    }\n  };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {isTemplatePartActive, Template, TemplatePart} from './template.js';\n\nconst walkerNodeFilter = 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */;\n\n/**\n * Removes the list of nodes from a Template safely. In addition to removing\n * nodes from the Template, the Template part indices are updated to match\n * the mutated Template DOM.\n *\n * As the template is walked the removal state is tracked and\n * part indices are adjusted as needed.\n *\n * div\n *   div#1 (remove) <-- start removing (removing node is div#1)\n *     div\n *       div#2 (remove)  <-- continue removing (removing node is still div#1)\n *         div\n * div <-- stop removing since previous sibling is the removing node (div#1,\n * removed 4 nodes)\n */\nexport function removeNodesFromTemplate(\n    template: Template, nodesToRemove: Set<Node>) {\n  const {element: {content}, parts} = template;\n  const walker =\n      document.createTreeWalker(content, walkerNodeFilter, null, false);\n  let partIndex = nextActiveIndexInTemplateParts(parts);\n  let part = parts[partIndex];\n  let nodeIndex = -1;\n  let removeCount = 0;\n  const nodesToRemoveInTemplate = [];\n  let currentRemovingNode: Node|null = null;\n  while (walker.nextNode()) {\n    nodeIndex++;\n    const node = walker.currentNode as Element;\n    // End removal if stepped past the removing node\n    if (node.previousSibling === currentRemovingNode) {\n      currentRemovingNode = null;\n    }\n    // A node to remove was found in the template\n    if (nodesToRemove.has(node)) {\n      nodesToRemoveInTemplate.push(node);\n      // Track node we're removing\n      if (currentRemovingNode === null) {\n        currentRemovingNode = node;\n      }\n    }\n    // When removing, increment count by which to adjust subsequent part indices\n    if (currentRemovingNode !== null) {\n      removeCount++;\n    }\n    while (part !== undefined && part.index === nodeIndex) {\n      // If part is in a removed node deactivate it by setting index to -1 or\n      // adjust the index as needed.\n      part.index = currentRemovingNode !== null ? -1 : part.index - removeCount;\n      // go to the next active part.\n      partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n      part = parts[partIndex];\n    }\n  }\n  nodesToRemoveInTemplate.forEach((n) => n.parentNode!.removeChild(n));\n}\n\nconst countNodes = (node: Node) => {\n  let count = (node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? 0 : 1;\n  const walker = document.createTreeWalker(node, walkerNodeFilter, null, false);\n  while (walker.nextNode()) {\n    count++;\n  }\n  return count;\n};\n\nconst nextActiveIndexInTemplateParts =\n    (parts: TemplatePart[], startIndex = -1) => {\n      for (let i = startIndex + 1; i < parts.length; i++) {\n        const part = parts[i];\n        if (isTemplatePartActive(part)) {\n          return i;\n        }\n      }\n      return -1;\n    };\n\n/**\n * Inserts the given node into the Template, optionally before the given\n * refNode. In addition to inserting the node into the Template, the Template\n * part indices are updated to match the mutated Template DOM.\n */\nexport function insertNodeIntoTemplate(\n    template: Template, node: Node, refNode: Node|null = null) {\n  const {element: {content}, parts} = template;\n  // If there's no refNode, then put node at end of template.\n  // No part indices need to be shifted in this case.\n  if (refNode === null || refNode === undefined) {\n    content.appendChild(node);\n    return;\n  }\n  const walker =\n      document.createTreeWalker(content, walkerNodeFilter, null, false);\n  let partIndex = nextActiveIndexInTemplateParts(parts);\n  let insertCount = 0;\n  let walkerIndex = -1;\n  while (walker.nextNode()) {\n    walkerIndex++;\n    const walkerNode = walker.currentNode as Element;\n    if (walkerNode === refNode) {\n      insertCount = countNodes(node);\n      refNode.parentNode!.insertBefore(node, refNode);\n    }\n    while (partIndex !== -1 && parts[partIndex].index === walkerIndex) {\n      // If we've inserted the node, simply adjust all subsequent parts\n      if (insertCount > 0) {\n        while (partIndex !== -1) {\n          parts[partIndex].index += insertCount;\n          partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n        }\n        return;\n      }\n      partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Module to add shady DOM/shady CSS polyfill support to lit-html template\n * rendering. See the [[render]] method for details.\n *\n * @packageDocumentation\n */\n\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\nimport {removeNodes} from './dom.js';\nimport {insertNodeIntoTemplate, removeNodesFromTemplate} from './modify-template.js';\nimport {RenderOptions} from './render-options.js';\nimport {parts, render as litRender} from './render.js';\nimport {templateCaches} from './template-factory.js';\nimport {TemplateInstance} from './template-instance.js';\nimport {TemplateResult} from './template-result.js';\nimport {marker, Template} from './template.js';\n\nexport {html, svg, TemplateResult} from '../lit-html.js';\n\n// Get a key to lookup in `templateCaches`.\nconst getTemplateCacheKey = (type: string, scopeName: string) =>\n    `${type}--${scopeName}`;\n\nlet compatibleShadyCSSVersion = true;\n\nif (typeof window.ShadyCSS === 'undefined') {\n  compatibleShadyCSSVersion = false;\n} else if (typeof window.ShadyCSS.prepareTemplateDom === 'undefined') {\n  console.warn(\n      `Incompatible ShadyCSS version detected. ` +\n      `Please update to at least @webcomponents/webcomponentsjs@2.0.2 and ` +\n      `@webcomponents/shadycss@1.3.1.`);\n  compatibleShadyCSSVersion = false;\n}\n\n/**\n * Template factory which scopes template DOM using ShadyCSS.\n * @param scopeName {string}\n */\nexport const shadyTemplateFactory = (scopeName: string) =>\n    (result: TemplateResult) => {\n      const cacheKey = getTemplateCacheKey(result.type, scopeName);\n      let templateCache = templateCaches.get(cacheKey);\n      if (templateCache === undefined) {\n        templateCache = {\n          stringsArray: new WeakMap<TemplateStringsArray, Template>(),\n          keyString: new Map<string, Template>()\n        };\n        templateCaches.set(cacheKey, templateCache);\n      }\n\n      let template = templateCache.stringsArray.get(result.strings);\n      if (template !== undefined) {\n        return template;\n      }\n\n      const key = result.strings.join(marker);\n      template = templateCache.keyString.get(key);\n      if (template === undefined) {\n        const element = result.getTemplateElement();\n        if (compatibleShadyCSSVersion) {\n          window.ShadyCSS!.prepareTemplateDom(element, scopeName);\n        }\n        template = new Template(result, element);\n        templateCache.keyString.set(key, template);\n      }\n      templateCache.stringsArray.set(result.strings, template);\n      return template;\n    };\n\nconst TEMPLATE_TYPES = ['html', 'svg'];\n\n/**\n * Removes all style elements from Templates for the given scopeName.\n */\nconst removeStylesFromLitTemplates = (scopeName: string) => {\n  TEMPLATE_TYPES.forEach((type) => {\n    const templates = templateCaches.get(getTemplateCacheKey(type, scopeName));\n    if (templates !== undefined) {\n      templates.keyString.forEach((template) => {\n        const {element: {content}} = template;\n        // IE 11 doesn't support the iterable param Set constructor\n        const styles = new Set<Element>();\n        Array.from(content.querySelectorAll('style')).forEach((s: Element) => {\n          styles.add(s);\n        });\n        removeNodesFromTemplate(template, styles);\n      });\n    }\n  });\n};\n\nconst shadyRenderSet = new Set<string>();\n\n/**\n * For the given scope name, ensures that ShadyCSS style scoping is performed.\n * This is done just once per scope name so the fragment and template cannot\n * be modified.\n * (1) extracts styles from the rendered fragment and hands them to ShadyCSS\n * to be scoped and appended to the document\n * (2) removes style elements from all lit-html Templates for this scope name.\n *\n * Note, <style> elements can only be placed into templates for the\n * initial rendering of the scope. If <style> elements are included in templates\n * dynamically rendered to the scope (after the first scope render), they will\n * not be scoped and the <style> will be left in the template and rendered\n * output.\n */\nconst prepareTemplateStyles =\n    (scopeName: string, renderedDOM: DocumentFragment, template?: Template) => {\n      shadyRenderSet.add(scopeName);\n      // If `renderedDOM` is stamped from a Template, then we need to edit that\n      // Template's underlying template element. Otherwise, we create one here\n      // to give to ShadyCSS, which still requires one while scoping.\n      const templateElement =\n          !!template ? template.element : document.createElement('template');\n      // Move styles out of rendered DOM and store.\n      const styles = renderedDOM.querySelectorAll('style');\n      const {length} = styles;\n      // If there are no styles, skip unnecessary work\n      if (length === 0) {\n        // Ensure prepareTemplateStyles is called to support adding\n        // styles via `prepareAdoptedCssText` since that requires that\n        // `prepareTemplateStyles` is called.\n        //\n        // ShadyCSS will only update styles containing @apply in the template\n        // given to `prepareTemplateStyles`. If no lit Template was given,\n        // ShadyCSS will not be able to update uses of @apply in any relevant\n        // template. However, this is not a problem because we only create the\n        // template for the purpose of supporting `prepareAdoptedCssText`,\n        // which doesn't support @apply at all.\n        window.ShadyCSS!.prepareTemplateStyles(templateElement, scopeName);\n        return;\n      }\n      const condensedStyle = document.createElement('style');\n      // Collect styles into a single style. This helps us make sure ShadyCSS\n      // manipulations will not prevent us from being able to fix up template\n      // part indices.\n      // NOTE: collecting styles is inefficient for browsers but ShadyCSS\n      // currently does this anyway. When it does not, this should be changed.\n      for (let i = 0; i < length; i++) {\n        const style = styles[i];\n        style.parentNode!.removeChild(style);\n        condensedStyle.textContent! += style.textContent;\n      }\n      // Remove styles from nested templates in this scope.\n      removeStylesFromLitTemplates(scopeName);\n      // And then put the condensed style into the \"root\" template passed in as\n      // `template`.\n      const content = templateElement.content;\n      if (!!template) {\n        insertNodeIntoTemplate(template, condensedStyle, content.firstChild);\n      } else {\n        content.insertBefore(condensedStyle, content.firstChild);\n      }\n      // Note, it's important that ShadyCSS gets the template that `lit-html`\n      // will actually render so that it can update the style inside when\n      // needed (e.g. @apply native Shadow DOM case).\n      window.ShadyCSS!.prepareTemplateStyles(templateElement, scopeName);\n      const style = content.querySelector('style');\n      if (window.ShadyCSS!.nativeShadow && style !== null) {\n        // When in native Shadow DOM, ensure the style created by ShadyCSS is\n        // included in initially rendered output (`renderedDOM`).\n        renderedDOM.insertBefore(style.cloneNode(true), renderedDOM.firstChild);\n      } else if (!!template) {\n        // When no style is left in the template, parts will be broken as a\n        // result. To fix this, we put back the style node ShadyCSS removed\n        // and then tell lit to remove that node from the template.\n        // There can be no style in the template in 2 cases (1) when Shady DOM\n        // is in use, ShadyCSS removes all styles, (2) when native Shadow DOM\n        // is in use ShadyCSS removes the style if it contains no content.\n        // NOTE, ShadyCSS creates its own style so we can safely add/remove\n        // `condensedStyle` here.\n        content.insertBefore(condensedStyle, content.firstChild);\n        const removes = new Set<Node>();\n        removes.add(condensedStyle);\n        removeNodesFromTemplate(template, removes);\n      }\n    };\n\nexport interface ShadyRenderOptions extends Partial<RenderOptions> {\n  scopeName: string;\n}\n\n/**\n * Extension to the standard `render` method which supports rendering\n * to ShadowRoots when the ShadyDOM (https://github.com/webcomponents/shadydom)\n * and ShadyCSS (https://github.com/webcomponents/shadycss) polyfills are used\n * or when the webcomponentsjs\n * (https://github.com/webcomponents/webcomponentsjs) polyfill is used.\n *\n * Adds a `scopeName` option which is used to scope element DOM and stylesheets\n * when native ShadowDOM is unavailable. The `scopeName` will be added to\n * the class attribute of all rendered DOM. In addition, any style elements will\n * be automatically re-written with this `scopeName` selector and moved out\n * of the rendered DOM and into the document `<head>`.\n *\n * It is common to use this render method in conjunction with a custom element\n * which renders a shadowRoot. When this is done, typically the element's\n * `localName` should be used as the `scopeName`.\n *\n * In addition to DOM scoping, ShadyCSS also supports a basic shim for css\n * custom properties (needed only on older browsers like IE11) and a shim for\n * a deprecated feature called `@apply` that supports applying a set of css\n * custom properties to a given location.\n *\n * Usage considerations:\n *\n * * Part values in `<style>` elements are only applied the first time a given\n * `scopeName` renders. Subsequent changes to parts in style elements will have\n * no effect. Because of this, parts in style elements should only be used for\n * values that will never change, for example parts that set scope-wide theme\n * values or parts which render shared style elements.\n *\n * * Note, due to a limitation of the ShadyDOM polyfill, rendering in a\n * custom element's `constructor` is not supported. Instead rendering should\n * either done asynchronously, for example at microtask timing (for example\n * `Promise.resolve()`), or be deferred until the first time the element's\n * `connectedCallback` runs.\n *\n * Usage considerations when using shimmed custom properties or `@apply`:\n *\n * * Whenever any dynamic changes are made which affect\n * css custom properties, `ShadyCSS.styleElement(element)` must be called\n * to update the element. There are two cases when this is needed:\n * (1) the element is connected to a new parent, (2) a class is added to the\n * element that causes it to match different custom properties.\n * To address the first case when rendering a custom element, `styleElement`\n * should be called in the element's `connectedCallback`.\n *\n * * Shimmed custom properties may only be defined either for an entire\n * shadowRoot (for example, in a `:host` rule) or via a rule that directly\n * matches an element with a shadowRoot. In other words, instead of flowing from\n * parent to child as do native css custom properties, shimmed custom properties\n * flow only from shadowRoots to nested shadowRoots.\n *\n * * When using `@apply` mixing css shorthand property names with\n * non-shorthand names (for example `border` and `border-width`) is not\n * supported.\n */\nexport const render =\n    (result: unknown,\n     container: Element|DocumentFragment|ShadowRoot,\n     options: ShadyRenderOptions) => {\n      if (!options || typeof options !== 'object' || !options.scopeName) {\n        throw new Error('The `scopeName` option is required.');\n      }\n      const scopeName = options.scopeName;\n      const hasRendered = parts.has(container);\n      const needsScoping = compatibleShadyCSSVersion &&\n          container.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */ &&\n          !!(container as ShadowRoot).host;\n      // Handle first render to a scope specially...\n      const firstScopeRender = needsScoping && !shadyRenderSet.has(scopeName);\n      // On first scope render, render into a fragment; this cannot be a single\n      // fragment that is reused since nested renders can occur synchronously.\n      const renderContainer =\n          firstScopeRender ? document.createDocumentFragment() : container;\n      litRender(\n          result,\n          renderContainer,\n          {templateFactory: shadyTemplateFactory(scopeName), ...options} as\n              RenderOptions);\n      // When performing first scope render,\n      // (1) We've rendered into a fragment so that there's a chance to\n      // `prepareTemplateStyles` before sub-elements hit the DOM\n      // (which might cause them to render based on a common pattern of\n      // rendering in a custom element's `connectedCallback`);\n      // (2) Scope the template with ShadyCSS one time only for this scope.\n      // (3) Render the fragment into the container and make sure the\n      // container knows its `part` is the one we just rendered. This ensures\n      // DOM will be re-used on subsequent renders.\n      if (firstScopeRender) {\n        const part = parts.get(renderContainer)!;\n        parts.delete(renderContainer);\n        // ShadyCSS might have style sheets (e.g. from `prepareAdoptedCssText`)\n        // that should apply to `renderContainer` even if the rendered value is\n        // not a TemplateInstance. However, it will only insert scoped styles\n        // into the document if `prepareTemplateStyles` has already been called\n        // for the given scope name.\n        const template = part.value instanceof TemplateInstance ?\n            part.value.template :\n            undefined;\n        prepareTemplateStyles(\n            scopeName, renderContainer as DocumentFragment, template);\n        removeNodes(container, container.firstChild);\n        container.appendChild(renderContainer);\n        parts.set(container, part);\n      }\n      // After elements have hit the DOM, update styling if this is the\n      // initial render to this container.\n      // This is needed whenever dynamic changes are made so it would be\n      // safest to do every render; however, this would regress performance\n      // so we leave it up to the user to call `ShadyCSS.styleElement`\n      // for dynamic changes.\n      if (!hasRendered && needsScoping) {\n        window.ShadyCSS!.styleElement((container as ShadowRoot).host);\n      }\n    };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Use this module if you want to create your own base class extending\n * [[UpdatingElement]].\n * @packageDocumentation\n */\n\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\nwindow.JSCompiler_renameProperty =\n    <P extends PropertyKey>(prop: P, _obj: unknown): P => prop;\n\ndeclare global {\n  var JSCompiler_renameProperty: <P extends PropertyKey>(\n      prop: P, _obj: unknown) => P;\n\n  interface Window {\n    JSCompiler_renameProperty: typeof JSCompiler_renameProperty;\n  }\n}\n\n/**\n * Converts property values to and from attribute values.\n */\nexport interface ComplexAttributeConverter<Type = unknown, TypeHint = unknown> {\n  /**\n   * Function called to convert an attribute value to a property\n   * value.\n   */\n  fromAttribute?(value: string|null, type?: TypeHint): Type;\n\n  /**\n   * Function called to convert a property value to an attribute\n   * value.\n   *\n   * It returns unknown instead of string, to be compatible with\n   * https://github.com/WICG/trusted-types (and similar efforts).\n   */\n  toAttribute?(value: Type, type?: TypeHint): unknown;\n}\n\ntype AttributeConverter<Type = unknown, TypeHint = unknown> =\n    ComplexAttributeConverter<Type>|\n    ((value: string|null, type?: TypeHint) => Type);\n\n/**\n * Defines options for a property accessor.\n */\nexport interface PropertyDeclaration<Type = unknown, TypeHint = unknown> {\n  /**\n   * Indicates how and whether the property becomes an observed attribute.\n   * If the value is `false`, the property is not added to `observedAttributes`.\n   * If true or absent, the lowercased property name is observed (e.g. `fooBar`\n   * becomes `foobar`). If a string, the string value is observed (e.g\n   * `attribute: 'foo-bar'`).\n   */\n  readonly attribute?: boolean|string;\n\n  /**\n   * Indicates the type of the property. This is used only as a hint for the\n   * `converter` to determine how to convert the attribute\n   * to/from a property.\n   */\n  readonly type?: TypeHint;\n\n  /**\n   * Indicates how to convert the attribute to/from a property. If this value\n   * is a function, it is used to convert the attribute value a the property\n   * value. If it's an object, it can have keys for `fromAttribute` and\n   * `toAttribute`. If no `toAttribute` function is provided and\n   * `reflect` is set to `true`, the property value is set directly to the\n   * attribute. A default `converter` is used if none is provided; it supports\n   * `Boolean`, `String`, `Number`, `Object`, and `Array`. Note,\n   * when a property changes and the converter is used to update the attribute,\n   * the property is never updated again as a result of the attribute changing,\n   * and vice versa.\n   */\n  readonly converter?: AttributeConverter<Type, TypeHint>;\n\n  /**\n   * Indicates if the property should reflect to an attribute.\n   * If `true`, when the property is set, the attribute is set using the\n   * attribute name determined according to the rules for the `attribute`\n   * property option and the value of the property converted using the rules\n   * from the `converter` property option.\n   */\n  readonly reflect?: boolean;\n\n  /**\n   * A function that indicates if a property should be considered changed when\n   * it is set. The function should take the `newValue` and `oldValue` and\n   * return `true` if an update should be requested.\n   */\n  hasChanged?(value: Type, oldValue: Type): boolean;\n\n  /**\n   * Indicates whether an accessor will be created for this property. By\n   * default, an accessor will be generated for this property that requests an\n   * update when set. If this flag is `true`, no accessor will be created, and\n   * it will be the user's responsibility to call\n   * `this.requestUpdate(propertyName, oldValue)` to request an update when\n   * the property changes.\n   */\n  readonly noAccessor?: boolean;\n}\n\n/**\n * Map of properties to PropertyDeclaration options. For each property an\n * accessor is made, and the property is processed according to the\n * PropertyDeclaration options.\n */\nexport interface PropertyDeclarations {\n  readonly [key: string]: PropertyDeclaration;\n}\n\ntype PropertyDeclarationMap = Map<PropertyKey, PropertyDeclaration>;\n\ntype AttributeMap = Map<string, PropertyKey>;\n\n/**\n * Map of changed properties with old values. Takes an optional generic\n * interface corresponding to the declared element properties.\n */\n// tslint:disable-next-line:no-any\nexport type PropertyValues<T = any> =\n    keyof T extends PropertyKey ? Map<keyof T, unknown>: never;\n\nexport const defaultConverter: ComplexAttributeConverter = {\n\n  toAttribute(value: unknown, type?: unknown): unknown {\n    switch (type) {\n      case Boolean:\n        return value ? '' : null;\n      case Object:\n      case Array:\n        // if the value is `null` or `undefined` pass this through\n        // to allow removing/no change behavior.\n        return value == null ? value : JSON.stringify(value);\n    }\n    return value;\n  },\n\n  fromAttribute(value: string|null, type?: unknown) {\n    switch (type) {\n      case Boolean:\n        return value !== null;\n      case Number:\n        return value === null ? null : Number(value);\n      case Object:\n      case Array:\n        // Type assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n        return JSON.parse(value!) as unknown;\n    }\n    return value;\n  }\n\n};\n\nexport interface HasChanged {\n  (value: unknown, old: unknown): boolean;\n}\n\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual: HasChanged = (value: unknown, old: unknown): boolean => {\n  // This ensures (old==NaN, value==NaN) always returns false\n  return old !== value && (old === old || value === value);\n};\n\nconst defaultPropertyDeclaration: PropertyDeclaration = {\n  attribute: true,\n  type: String,\n  converter: defaultConverter,\n  reflect: false,\n  hasChanged: notEqual\n};\n\nconst STATE_HAS_UPDATED = 1;\nconst STATE_UPDATE_REQUESTED = 1 << 2;\nconst STATE_IS_REFLECTING_TO_ATTRIBUTE = 1 << 3;\nconst STATE_IS_REFLECTING_TO_PROPERTY = 1 << 4;\ntype UpdateState = typeof STATE_HAS_UPDATED|typeof STATE_UPDATE_REQUESTED|\n    typeof STATE_IS_REFLECTING_TO_ATTRIBUTE|\n    typeof STATE_IS_REFLECTING_TO_PROPERTY;\n\n/**\n * The Closure JS Compiler doesn't currently have good support for static\n * property semantics where \"this\" is dynamic (e.g.\n * https://github.com/google/closure-compiler/issues/3177 and others) so we use\n * this hack to bypass any rewriting by the compiler.\n */\nconst finalized = 'finalized';\n\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclassers to render updates as desired.\n * @noInheritDoc\n */\nexport abstract class UpdatingElement extends HTMLElement {\n  /*\n   * Due to closure compiler ES6 compilation bugs, @nocollapse is required on\n   * all static methods and properties with initializers.  Reference:\n   * - https://github.com/google/closure-compiler/issues/1776\n   */\n\n  /**\n   * Maps attribute names to properties; for example `foobar` attribute to\n   * `fooBar` property. Created lazily on user subclasses when finalizing the\n   * class.\n   */\n  private static _attributeToPropertyMap: AttributeMap;\n\n  /**\n   * Marks class as having finished creating properties.\n   */\n  protected static[finalized] = true;\n\n  /**\n   * Memoized list of all class properties, including any superclass properties.\n   * Created lazily on user subclasses when finalizing the class.\n   */\n  private static _classProperties?: PropertyDeclarationMap;\n\n  /**\n   * User-supplied object that maps property names to `PropertyDeclaration`\n   * objects containing options for configuring the property.\n   */\n  static properties: PropertyDeclarations;\n\n  /**\n   * Returns a list of attributes corresponding to the registered properties.\n   * @nocollapse\n   */\n  static get observedAttributes() {\n    // note: piggy backing on this to ensure we're finalized.\n    this.finalize();\n    const attributes: string[] = [];\n    // Use forEach so this works even if for/of loops are compiled to for loops\n    // expecting arrays\n    this._classProperties!.forEach((v, p) => {\n      const attr = this._attributeNameForProperty(p, v);\n      if (attr !== undefined) {\n        this._attributeToPropertyMap.set(attr, p);\n        attributes.push(attr);\n      }\n    });\n    return attributes;\n  }\n\n  /**\n   * Ensures the private `_classProperties` property metadata is created.\n   * In addition to `finalize` this is also called in `createProperty` to\n   * ensure the `@property` decorator can add property metadata.\n   */\n  /** @nocollapse */\n  private static _ensureClassProperties() {\n    // ensure private storage for property declarations.\n    if (!this.hasOwnProperty(\n            JSCompiler_renameProperty('_classProperties', this))) {\n      this._classProperties = new Map();\n      // NOTE: Workaround IE11 not supporting Map constructor argument.\n      const superProperties: PropertyDeclarationMap =\n          Object.getPrototypeOf(this)._classProperties;\n      if (superProperties !== undefined) {\n        superProperties.forEach(\n            (v: PropertyDeclaration, k: PropertyKey) =>\n                this._classProperties!.set(k, v));\n      }\n    }\n  }\n\n  /**\n   * Creates a property accessor on the element prototype if one does not exist\n   * and stores a PropertyDeclaration for the property with the given options.\n   * The property setter calls the property's `hasChanged` property option\n   * or uses a strict identity check to determine whether or not to request\n   * an update.\n   *\n   * This method may be overridden to customize properties; however,\n   * when doing so, it's important to call `super.createProperty` to ensure\n   * the property is setup correctly. This method calls\n   * `getPropertyDescriptor` internally to get a descriptor to install.\n   * To customize what properties do when they are get or set, override\n   * `getPropertyDescriptor`. To customize the options for a property,\n   * implement `createProperty` like this:\n   *\n   * static createProperty(name, options) {\n   *   options = Object.assign(options, {myOption: true});\n   *   super.createProperty(name, options);\n   * }\n   *\n   * @nocollapse\n   */\n  static createProperty(\n      name: PropertyKey,\n      options: PropertyDeclaration = defaultPropertyDeclaration) {\n    // Note, since this can be called by the `@property` decorator which\n    // is called before `finalize`, we ensure storage exists for property\n    // metadata.\n    this._ensureClassProperties();\n    this._classProperties!.set(name, options);\n    // Do not generate an accessor if the prototype already has one, since\n    // it would be lost otherwise and that would never be the user's intention;\n    // Instead, we expect users to call `requestUpdate` themselves from\n    // user-defined accessors. Note that if the super has an accessor we will\n    // still overwrite it\n    if (options.noAccessor || this.prototype.hasOwnProperty(name)) {\n      return;\n    }\n    const key = typeof name === 'symbol' ? Symbol() : `__${name}`;\n    const descriptor = this.getPropertyDescriptor(name, key, options);\n    if (descriptor !== undefined) {\n      Object.defineProperty(this.prototype, name, descriptor);\n    }\n  }\n\n  /**\n   * Returns a property descriptor to be defined on the given named property.\n   * If no descriptor is returned, the property will not become an accessor.\n   * For example,\n   *\n   *   class MyElement extends LitElement {\n   *     static getPropertyDescriptor(name, key, options) {\n   *       const defaultDescriptor =\n   *           super.getPropertyDescriptor(name, key, options);\n   *       const setter = defaultDescriptor.set;\n   *       return {\n   *         get: defaultDescriptor.get,\n   *         set(value) {\n   *           setter.call(this, value);\n   *           // custom action.\n   *         },\n   *         configurable: true,\n   *         enumerable: true\n   *       }\n   *     }\n   *   }\n   *\n   * @nocollapse\n   */\n  protected static getPropertyDescriptor(\n      name: PropertyKey, key: string|symbol, options: PropertyDeclaration) {\n    return {\n      // tslint:disable-next-line:no-any no symbol in index\n      get(): any {\n        return (this as {[key: string]: unknown})[key as string];\n      },\n      set(this: UpdatingElement, value: unknown) {\n        const oldValue =\n            (this as {} as {[key: string]: unknown})[name as string];\n        (this as {} as {[key: string]: unknown})[key as string] = value;\n        (this as unknown as UpdatingElement)\n            .requestUpdateInternal(name, oldValue, options);\n      },\n      configurable: true,\n      enumerable: true\n    };\n  }\n\n  /**\n   * Returns the property options associated with the given property.\n   * These options are defined with a PropertyDeclaration via the `properties`\n   * object or the `@property` decorator and are registered in\n   * `createProperty(...)`.\n   *\n   * Note, this method should be considered \"final\" and not overridden. To\n   * customize the options for a given property, override `createProperty`.\n   *\n   * @nocollapse\n   * @final\n   */\n  protected static getPropertyOptions(name: PropertyKey) {\n    return this._classProperties && this._classProperties.get(name) ||\n        defaultPropertyDeclaration;\n  }\n\n  /**\n   * Creates property accessors for registered properties and ensures\n   * any superclasses are also finalized.\n   * @nocollapse\n   */\n  protected static finalize() {\n    // finalize any superclasses\n    const superCtor = Object.getPrototypeOf(this);\n    if (!superCtor.hasOwnProperty(finalized)) {\n      superCtor.finalize();\n    }\n    this[finalized] = true;\n    this._ensureClassProperties();\n    // initialize Map populated in observedAttributes\n    this._attributeToPropertyMap = new Map();\n    // make any properties\n    // Note, only process \"own\" properties since this element will inherit\n    // any properties defined on the superClass, and finalization ensures\n    // the entire prototype chain is finalized.\n    if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n      const props = this.properties;\n      // support symbols in properties (IE11 does not support this)\n      const propKeys = [\n        ...Object.getOwnPropertyNames(props),\n        ...(typeof Object.getOwnPropertySymbols === 'function') ?\n            Object.getOwnPropertySymbols(props) :\n            []\n      ];\n      // This for/of is ok because propKeys is an array\n      for (const p of propKeys) {\n        // note, use of `any` is due to TypeSript lack of support for symbol in\n        // index types\n        // tslint:disable-next-line:no-any no symbol in index\n        this.createProperty(p, (props as any)[p]);\n      }\n    }\n  }\n\n  /**\n   * Returns the property name for the given attribute `name`.\n   * @nocollapse\n   */\n  private static _attributeNameForProperty(\n      name: PropertyKey, options: PropertyDeclaration) {\n    const attribute = options.attribute;\n    return attribute === false ?\n        undefined :\n        (typeof attribute === 'string' ?\n             attribute :\n             (typeof name === 'string' ? name.toLowerCase() : undefined));\n  }\n\n  /**\n   * Returns true if a property should request an update.\n   * Called when a property value is set and uses the `hasChanged`\n   * option for the property if present or a strict identity check.\n   * @nocollapse\n   */\n  private static _valueHasChanged(\n      value: unknown, old: unknown, hasChanged: HasChanged = notEqual) {\n    return hasChanged(value, old);\n  }\n\n  /**\n   * Returns the property value for the given attribute value.\n   * Called via the `attributeChangedCallback` and uses the property's\n   * `converter` or `converter.fromAttribute` property option.\n   * @nocollapse\n   */\n  private static _propertyValueFromAttribute(\n      value: string|null, options: PropertyDeclaration) {\n    const type = options.type;\n    const converter = options.converter || defaultConverter;\n    const fromAttribute =\n        (typeof converter === 'function' ? converter : converter.fromAttribute);\n    return fromAttribute ? fromAttribute(value, type) : value;\n  }\n\n  /**\n   * Returns the attribute value for the given property value. If this\n   * returns undefined, the property will *not* be reflected to an attribute.\n   * If this returns null, the attribute will be removed, otherwise the\n   * attribute will be set to the value.\n   * This uses the property's `reflect` and `type.toAttribute` property options.\n   * @nocollapse\n   */\n  private static _propertyValueToAttribute(\n      value: unknown, options: PropertyDeclaration) {\n    if (options.reflect === undefined) {\n      return;\n    }\n    const type = options.type;\n    const converter = options.converter;\n    const toAttribute =\n        converter && (converter as ComplexAttributeConverter).toAttribute ||\n        defaultConverter.toAttribute;\n    return toAttribute!(value, type);\n  }\n\n  private _updateState!: UpdateState;\n  private _instanceProperties?: PropertyValues;\n  // Initialize to an unresolved Promise so we can make sure the element has\n  // connected before first update.\n  private _updatePromise!: Promise<unknown>;\n  private _enableUpdatingResolver: ((r?: unknown) => void)|undefined;\n\n  /**\n   * Map with keys for any properties that have changed since the last\n   * update cycle with previous values.\n   */\n  private _changedProperties!: PropertyValues;\n\n  /**\n   * Map with keys of properties that should be reflected when updated.\n   */\n  private _reflectingProperties?: Map<PropertyKey, PropertyDeclaration>;\n\n  constructor() {\n    super();\n    this.initialize();\n  }\n\n  /**\n   * Performs element initialization. By default captures any pre-set values for\n   * registered properties.\n   */\n  protected initialize() {\n    this._updateState = 0;\n    this._updatePromise =\n        new Promise((res) => this._enableUpdatingResolver = res);\n    this._changedProperties = new Map();\n    this._saveInstanceProperties();\n    // ensures first update will be caught by an early access of\n    // `updateComplete`\n    this.requestUpdateInternal();\n  }\n\n  /**\n   * Fixes any properties set on the instance before upgrade time.\n   * Otherwise these would shadow the accessor and break these properties.\n   * The properties are stored in a Map which is played back after the\n   * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n   * (<=41), properties created for native platform properties like (`id` or\n   * `name`) may not have default values set in the element constructor. On\n   * these browsers native properties appear on instances and therefore their\n   * default value will overwrite any element default (e.g. if the element sets\n   * this.id = 'id' in the constructor, the 'id' will become '' since this is\n   * the native platform default).\n   */\n  private _saveInstanceProperties() {\n    // Use forEach so this works even if for/of loops are compiled to for loops\n    // expecting arrays\n    (this.constructor as typeof UpdatingElement)\n        ._classProperties!.forEach((_v, p) => {\n          if (this.hasOwnProperty(p)) {\n            const value = this[p as keyof this];\n            delete this[p as keyof this];\n            if (!this._instanceProperties) {\n              this._instanceProperties = new Map();\n            }\n            this._instanceProperties.set(p, value);\n          }\n        });\n  }\n\n  /**\n   * Applies previously saved instance properties.\n   */\n  private _applyInstanceProperties() {\n    // Use forEach so this works even if for/of loops are compiled to for loops\n    // expecting arrays\n    // tslint:disable-next-line:no-any\n    this._instanceProperties!.forEach((v, p) => (this as any)[p] = v);\n    this._instanceProperties = undefined;\n  }\n\n  connectedCallback() {\n    // Ensure first connection completes an update. Updates cannot complete\n    // before connection.\n    this.enableUpdating();\n  }\n\n  protected enableUpdating() {\n    if (this._enableUpdatingResolver !== undefined) {\n      this._enableUpdatingResolver();\n      this._enableUpdatingResolver = undefined;\n    }\n  }\n\n  /**\n   * Allows for `super.disconnectedCallback()` in extensions while\n   * reserving the possibility of making non-breaking feature additions\n   * when disconnecting at some point in the future.\n   */\n  disconnectedCallback() {\n  }\n\n  /**\n   * Synchronizes property values when attributes change.\n   */\n  attributeChangedCallback(name: string, old: string|null, value: string|null) {\n    if (old !== value) {\n      this._attributeToProperty(name, value);\n    }\n  }\n\n  private _propertyToAttribute(\n      name: PropertyKey, value: unknown,\n      options: PropertyDeclaration = defaultPropertyDeclaration) {\n    const ctor = (this.constructor as typeof UpdatingElement);\n    const attr = ctor._attributeNameForProperty(name, options);\n    if (attr !== undefined) {\n      const attrValue = ctor._propertyValueToAttribute(value, options);\n      // an undefined value does not change the attribute.\n      if (attrValue === undefined) {\n        return;\n      }\n      // Track if the property is being reflected to avoid\n      // setting the property again via `attributeChangedCallback`. Note:\n      // 1. this takes advantage of the fact that the callback is synchronous.\n      // 2. will behave incorrectly if multiple attributes are in the reaction\n      // stack at time of calling. However, since we process attributes\n      // in `update` this should not be possible (or an extreme corner case\n      // that we'd like to discover).\n      // mark state reflecting\n      this._updateState = this._updateState | STATE_IS_REFLECTING_TO_ATTRIBUTE;\n      if (attrValue == null) {\n        this.removeAttribute(attr);\n      } else {\n        this.setAttribute(attr, attrValue as string);\n      }\n      // mark state not reflecting\n      this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_ATTRIBUTE;\n    }\n  }\n\n  private _attributeToProperty(name: string, value: string|null) {\n    // Use tracking info to avoid deserializing attribute value if it was\n    // just set from a property setter.\n    if (this._updateState & STATE_IS_REFLECTING_TO_ATTRIBUTE) {\n      return;\n    }\n    const ctor = (this.constructor as typeof UpdatingElement);\n    // Note, hint this as an `AttributeMap` so closure clearly understands\n    // the type; it has issues with tracking types through statics\n    // tslint:disable-next-line:no-unnecessary-type-assertion\n    const propName = (ctor._attributeToPropertyMap as AttributeMap).get(name);\n    if (propName !== undefined) {\n      const options = ctor.getPropertyOptions(propName);\n      // mark state reflecting\n      this._updateState = this._updateState | STATE_IS_REFLECTING_TO_PROPERTY;\n      this[propName as keyof this] =\n          // tslint:disable-next-line:no-any\n          ctor._propertyValueFromAttribute(value, options) as any;\n      // mark state not reflecting\n      this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_PROPERTY;\n    }\n  }\n\n  /**\n   * This protected version of `requestUpdate` does not access or return the\n   * `updateComplete` promise. This promise can be overridden and is therefore\n   * not free to access.\n   */\n  protected requestUpdateInternal(\n      name?: PropertyKey, oldValue?: unknown, options?: PropertyDeclaration) {\n    let shouldRequestUpdate = true;\n    // If we have a property key, perform property update steps.\n    if (name !== undefined) {\n      const ctor = this.constructor as typeof UpdatingElement;\n      options = options || ctor.getPropertyOptions(name);\n      if (ctor._valueHasChanged(\n              this[name as keyof this], oldValue, options.hasChanged)) {\n        if (!this._changedProperties.has(name)) {\n          this._changedProperties.set(name, oldValue);\n        }\n        // Add to reflecting properties set.\n        // Note, it's important that every change has a chance to add the\n        // property to `_reflectingProperties`. This ensures setting\n        // attribute + property reflects correctly.\n        if (options.reflect === true &&\n            !(this._updateState & STATE_IS_REFLECTING_TO_PROPERTY)) {\n          if (this._reflectingProperties === undefined) {\n            this._reflectingProperties = new Map();\n          }\n          this._reflectingProperties.set(name, options);\n        }\n      } else {\n        // Abort the request if the property should not be considered changed.\n        shouldRequestUpdate = false;\n      }\n    }\n    if (!this._hasRequestedUpdate && shouldRequestUpdate) {\n      this._updatePromise = this._enqueueUpdate();\n    }\n  }\n\n  /**\n   * Requests an update which is processed asynchronously. This should\n   * be called when an element should update based on some state not triggered\n   * by setting a property. In this case, pass no arguments. It should also be\n   * called when manually implementing a property setter. In this case, pass the\n   * property `name` and `oldValue` to ensure that any configured property\n   * options are honored. Returns the `updateComplete` Promise which is resolved\n   * when the update completes.\n   *\n   * @param name {PropertyKey} (optional) name of requesting property\n   * @param oldValue {any} (optional) old value of requesting property\n   * @returns {Promise} A Promise that is resolved when the update completes.\n   */\n  requestUpdate(name?: PropertyKey, oldValue?: unknown) {\n    this.requestUpdateInternal(name, oldValue);\n    return this.updateComplete;\n  }\n\n  /**\n   * Sets up the element to asynchronously update.\n   */\n  private async _enqueueUpdate() {\n    this._updateState = this._updateState | STATE_UPDATE_REQUESTED;\n    try {\n      // Ensure any previous update has resolved before updating.\n      // This `await` also ensures that property changes are batched.\n      await this._updatePromise;\n    } catch (e) {\n      // Ignore any previous errors. We only care that the previous cycle is\n      // done. Any error should have been handled in the previous update.\n    }\n    const result = this.performUpdate();\n    // If `performUpdate` returns a Promise, we await it. This is done to\n    // enable coordinating updates with a scheduler. Note, the result is\n    // checked to avoid delaying an additional microtask unless we need to.\n    if (result != null) {\n      await result;\n    }\n    return !this._hasRequestedUpdate;\n  }\n\n  private get _hasRequestedUpdate() {\n    return (this._updateState & STATE_UPDATE_REQUESTED);\n  }\n\n  protected get hasUpdated() {\n    return (this._updateState & STATE_HAS_UPDATED);\n  }\n\n  /**\n   * Performs an element update. Note, if an exception is thrown during the\n   * update, `firstUpdated` and `updated` will not be called.\n   *\n   * You can override this method to change the timing of updates. If this\n   * method is overridden, `super.performUpdate()` must be called.\n   *\n   * For instance, to schedule updates to occur just before the next frame:\n   *\n   * ```\n   * protected async performUpdate(): Promise<unknown> {\n   *   await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n   *   super.performUpdate();\n   * }\n   * ```\n   */\n  protected performUpdate(): void|Promise<unknown> {\n    // Abort any update if one is not pending when this is called.\n    // This can happen if `performUpdate` is called early to \"flush\"\n    // the update.\n    if (!this._hasRequestedUpdate) {\n      return;\n    }\n    // Mixin instance properties once, if they exist.\n    if (this._instanceProperties) {\n      this._applyInstanceProperties();\n    }\n    let shouldUpdate = false;\n    const changedProperties = this._changedProperties;\n    try {\n      shouldUpdate = this.shouldUpdate(changedProperties);\n      if (shouldUpdate) {\n        this.update(changedProperties);\n      } else {\n        this._markUpdated();\n      }\n    } catch (e) {\n      // Prevent `firstUpdated` and `updated` from running when there's an\n      // update exception.\n      shouldUpdate = false;\n      // Ensure element can accept additional updates after an exception.\n      this._markUpdated();\n      throw e;\n    }\n    if (shouldUpdate) {\n      if (!(this._updateState & STATE_HAS_UPDATED)) {\n        this._updateState = this._updateState | STATE_HAS_UPDATED;\n        this.firstUpdated(changedProperties);\n      }\n      this.updated(changedProperties);\n    }\n  }\n\n  private _markUpdated() {\n    this._changedProperties = new Map();\n    this._updateState = this._updateState & ~STATE_UPDATE_REQUESTED;\n  }\n\n  /**\n   * Returns a Promise that resolves when the element has completed updating.\n   * The Promise value is a boolean that is `true` if the element completed the\n   * update without triggering another update. The Promise result is `false` if\n   * a property was set inside `updated()`. If the Promise is rejected, an\n   * exception was thrown during the update.\n   *\n   * To await additional asynchronous work, override the `_getUpdateComplete`\n   * method. For example, it is sometimes useful to await a rendered element\n   * before fulfilling this Promise. To do this, first await\n   * `super._getUpdateComplete()`, then any subsequent state.\n   *\n   * @returns {Promise} The Promise returns a boolean that indicates if the\n   * update resolved without triggering another update.\n   */\n  get updateComplete() {\n    return this._getUpdateComplete();\n  }\n\n  /**\n   * Override point for the `updateComplete` promise.\n   *\n   * It is not safe to override the `updateComplete` getter directly due to a\n   * limitation in TypeScript which means it is not possible to call a\n   * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n   * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n   * This method should be overridden instead. For example:\n   *\n   *   class MyElement extends LitElement {\n   *     async _getUpdateComplete() {\n   *       await super._getUpdateComplete();\n   *       await this._myChild.updateComplete;\n   *     }\n   *   }\n   * @deprecated Override `getUpdateComplete()` instead for forward\n   *     compatibility with `lit-element` 3.0 / `@lit/reactive-element`.\n   */\n  protected _getUpdateComplete() {\n    return this.getUpdateComplete();\n  }\n\n  /**\n   * Override point for the `updateComplete` promise.\n   *\n   * It is not safe to override the `updateComplete` getter directly due to a\n   * limitation in TypeScript which means it is not possible to call a\n   * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n   * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n   * This method should be overridden instead. For example:\n   *\n   *   class MyElement extends LitElement {\n   *     async getUpdateComplete() {\n   *       await super.getUpdateComplete();\n   *       await this._myChild.updateComplete;\n   *     }\n   *   }\n   */\n  protected getUpdateComplete() {\n    return this._updatePromise;\n  }\n\n  /**\n   * Controls whether or not `update` should be called when the element requests\n   * an update. By default, this method always returns `true`, but this can be\n   * customized to control when to update.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   */\n  protected shouldUpdate(_changedProperties: PropertyValues): boolean {\n    return true;\n  }\n\n  /**\n   * Updates the element. This method reflects property values to attributes.\n   * It can be overridden to render and keep updated element DOM.\n   * Setting properties inside this method will *not* trigger\n   * another update.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   */\n  protected update(_changedProperties: PropertyValues) {\n    if (this._reflectingProperties !== undefined &&\n        this._reflectingProperties.size > 0) {\n      // Use forEach so this works even if for/of loops are compiled to for\n      // loops expecting arrays\n      this._reflectingProperties.forEach(\n          (v, k) => this._propertyToAttribute(k, this[k as keyof this], v));\n      this._reflectingProperties = undefined;\n    }\n    this._markUpdated();\n  }\n\n  /**\n   * Invoked whenever the element is updated. Implement to perform\n   * post-updating tasks via DOM APIs, for example, focusing an element.\n   *\n   * Setting properties inside this method will trigger the element to update\n   * again after this update cycle completes.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   */\n  protected updated(_changedProperties: PropertyValues) {\n  }\n\n  /**\n   * Invoked when the element is first updated. Implement to perform one time\n   * work on the element after update.\n   *\n   * Setting properties inside this method will trigger the element to update\n   * again after this update cycle completes.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   */\n  protected firstUpdated(_changedProperties: PropertyValues) {\n  }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure Compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\n\nimport {LitElement} from '../lit-element.js';\n\nimport {PropertyDeclaration, UpdatingElement} from './updating-element.js';\n\nexport type Constructor<T> = {\n  // tslint:disable-next-line:no-any\n  new (...args: any[]): T\n};\n\n// From the TC39 Decorators proposal\ninterface ClassDescriptor {\n  kind: 'class';\n  elements: ClassElement[];\n  finisher?: <T>(clazz: Constructor<T>) => undefined | Constructor<T>;\n}\n\n// From the TC39 Decorators proposal\ninterface ClassElement {\n  kind: 'field'|'method';\n  key: PropertyKey;\n  placement: 'static'|'prototype'|'own';\n  initializer?: Function;\n  extras?: ClassElement[];\n  finisher?: <T>(clazz: Constructor<T>) => undefined | Constructor<T>;\n  descriptor?: PropertyDescriptor;\n}\n\nconst legacyCustomElement =\n    (tagName: string, clazz: Constructor<HTMLElement>) => {\n      window.customElements.define(tagName, clazz);\n      // Cast as any because TS doesn't recognize the return type as being a\n      // subtype of the decorated class when clazz is typed as\n      // `Constructor<HTMLElement>` for some reason.\n      // `Constructor<HTMLElement>` is helpful to make sure the decorator is\n      // applied to elements however.\n      // tslint:disable-next-line:no-any\n      return clazz as any;\n    };\n\nconst standardCustomElement =\n    (tagName: string, descriptor: ClassDescriptor) => {\n      const {kind, elements} = descriptor;\n      return {\n        kind,\n        elements,\n        // This callback is called once the class is otherwise fully defined\n        finisher(clazz: Constructor<HTMLElement>) {\n          window.customElements.define(tagName, clazz);\n        }\n      };\n    };\n\n/**\n * Class decorator factory that defines the decorated class as a custom element.\n *\n * ```\n * @customElement('my-element')\n * class MyElement {\n *   render() {\n *     return html``;\n *   }\n * }\n * ```\n * @category Decorator\n * @param tagName The name of the custom element to define.\n */\nexport const customElement = (tagName: string) =>\n    (classOrDescriptor: Constructor<HTMLElement>|ClassDescriptor) =>\n        (typeof classOrDescriptor === 'function') ?\n    legacyCustomElement(tagName, classOrDescriptor) :\n    standardCustomElement(tagName, classOrDescriptor);\n\nconst standardProperty =\n    (options: PropertyDeclaration, element: ClassElement) => {\n      // When decorating an accessor, pass it through and add property metadata.\n      // Note, the `hasOwnProperty` check in `createProperty` ensures we don't\n      // stomp over the user's accessor.\n      if (element.kind === 'method' && element.descriptor &&\n          !('value' in element.descriptor)) {\n        return {\n          ...element,\n          finisher(clazz: typeof UpdatingElement) {\n            clazz.createProperty(element.key, options);\n          }\n        };\n      } else {\n        // createProperty() takes care of defining the property, but we still\n        // must return some kind of descriptor, so return a descriptor for an\n        // unused prototype field. The finisher calls createProperty().\n        return {\n          kind: 'field',\n          key: Symbol(),\n          placement: 'own',\n          descriptor: {},\n          // When @babel/plugin-proposal-decorators implements initializers,\n          // do this instead of the initializer below. See:\n          // https://github.com/babel/babel/issues/9260 extras: [\n          //   {\n          //     kind: 'initializer',\n          //     placement: 'own',\n          //     initializer: descriptor.initializer,\n          //   }\n          // ],\n          initializer(this: {[key: string]: unknown}) {\n            if (typeof element.initializer === 'function') {\n              this[element.key as string] = element.initializer.call(this);\n            }\n          },\n          finisher(clazz: typeof UpdatingElement) {\n            clazz.createProperty(element.key, options);\n          }\n        };\n      }\n    };\n\nconst legacyProperty =\n    (options: PropertyDeclaration, proto: Object, name: PropertyKey) => {\n      (proto.constructor as typeof UpdatingElement)\n          .createProperty(name, options);\n    };\n\n/**\n * A property decorator which creates a LitElement property which reflects a\n * corresponding attribute value. A [[`PropertyDeclaration`]] may optionally be\n * supplied to configure property features.\n *\n * This decorator should only be used for public fields. Private or protected\n * fields should use the [[`internalProperty`]] decorator.\n *\n * @example\n * ```ts\n * class MyElement {\n *   @property({ type: Boolean })\n *   clicked = false;\n * }\n * ```\n * @category Decorator\n * @ExportDecoratedItems\n */\nexport function property(options?: PropertyDeclaration) {\n  // tslint:disable-next-line:no-any decorator\n  return (protoOrDescriptor: Object|ClassElement, name?: PropertyKey): any =>\n             (name !== undefined) ?\n      legacyProperty(options!, protoOrDescriptor as Object, name) :\n      standardProperty(options!, protoOrDescriptor as ClassElement);\n}\n\nexport interface InternalPropertyDeclaration<Type = unknown> {\n  /**\n   * A function that indicates if a property should be considered changed when\n   * it is set. The function should take the `newValue` and `oldValue` and\n   * return `true` if an update should be requested.\n   */\n  hasChanged?(value: Type, oldValue: Type): boolean;\n}\n\n/**\n * Declares a private or protected property that still triggers updates to the\n * element when it changes.\n *\n * Properties declared this way must not be used from HTML or HTML templating\n * systems, they're solely for properties internal to the element. These\n * properties may be renamed by optimization tools like the Closure Compiler.\n * @category Decorator\n * @deprecated `internalProperty` has been renamed to `state` in lit-element\n *     3.0. Please update to `state` now to be compatible with 3.0.\n */\nexport function internalProperty(options?: InternalPropertyDeclaration) {\n  return property({attribute: false, hasChanged: options?.hasChanged});\n}\n\n/**\n * Declares a private or protected property that still triggers updates to the\n * element when it changes.\n *\n * Properties declared this way must not be used from HTML or HTML templating\n * systems, they're solely for properties internal to the element. These\n * properties may be renamed by optimization tools like the Closure Compiler.\n * @category Decorator\n */\nexport const state = (options?: InternalPropertyDeclaration) =>\n    internalProperty(options);\n\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n * @param cache An optional boolean which when true performs the DOM query only\n * once and caches the result.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * @example\n *\n * ```ts\n * class MyElement {\n *   @query('#first')\n *   first;\n *\n *   render() {\n *     return html`\n *       <div id=\"first\"></div>\n *       <div id=\"second\"></div>\n *     `;\n *   }\n * }\n * ```\n * @category Decorator\n */\nexport function query(selector: string, cache?: boolean) {\n  return (protoOrDescriptor: Object|ClassElement,\n          // tslint:disable-next-line:no-any decorator\n          name?: PropertyKey): any => {\n    const descriptor = {\n      get(this: LitElement) {\n        return this.renderRoot.querySelector(selector);\n      },\n      enumerable: true,\n      configurable: true,\n    };\n    if (cache) {\n      const prop =\n          name !== undefined ? name : (protoOrDescriptor as ClassElement).key;\n      const key = typeof prop === 'symbol' ? Symbol() : `__${prop}`;\n      descriptor.get = function(this: LitElement) {\n        if ((this as unknown as\n             {[key: string]: Element | null})[key as string] === undefined) {\n          ((this as unknown as {[key: string]: Element | null})[key as string] =\n               this.renderRoot.querySelector(selector));\n        }\n        return (\n            this as unknown as {[key: string]: Element | null})[key as string];\n      };\n    }\n    return (name !== undefined) ?\n        legacyQuery(descriptor, protoOrDescriptor as Object, name) :\n        standardQuery(descriptor, protoOrDescriptor as ClassElement);\n  };\n}\n\n// Note, in the future, we may extend this decorator to support the use case\n// where the queried element may need to do work to become ready to interact\n// with (e.g. load some implementation code). If so, we might elect to\n// add a second argument defining a function that can be run to make the\n// queried element loaded/updated/ready.\n/**\n * A property decorator that converts a class property into a getter that\n * returns a promise that resolves to the result of a querySelector on the\n * element's renderRoot done after the element's `updateComplete` promise\n * resolves. When the queried property may change with element state, this\n * decorator can be used instead of requiring users to await the\n * `updateComplete` before accessing the property.\n *\n * @param selector A DOMString containing one or more selectors to match.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * @example\n * ```ts\n * class MyElement {\n *   @queryAsync('#first')\n *   first;\n *\n *   render() {\n *     return html`\n *       <div id=\"first\"></div>\n *       <div id=\"second\"></div>\n *     `;\n *   }\n * }\n *\n * // external usage\n * async doSomethingWithFirst() {\n *  (await aMyElement.first).doSomething();\n * }\n * ```\n * @category Decorator\n */\nexport function queryAsync(selector: string) {\n  return (protoOrDescriptor: Object|ClassElement,\n          // tslint:disable-next-line:no-any decorator\n          name?: PropertyKey): any => {\n    const descriptor = {\n      async get(this: LitElement) {\n        await this.updateComplete;\n        return this.renderRoot.querySelector(selector);\n      },\n      enumerable: true,\n      configurable: true,\n    };\n    return (name !== undefined) ?\n        legacyQuery(descriptor, protoOrDescriptor as Object, name) :\n        standardQuery(descriptor, protoOrDescriptor as ClassElement);\n  };\n}\n\n/**\n * A property decorator that converts a class property into a getter\n * that executes a querySelectorAll on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n *\n * See:\n * https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll\n *\n * @example\n * ```ts\n * class MyElement {\n *   @queryAll('div')\n *   divs;\n *\n *   render() {\n *     return html`\n *       <div id=\"first\"></div>\n *       <div id=\"second\"></div>\n *     `;\n *   }\n * }\n * ```\n * @category Decorator\n */\nexport function queryAll(selector: string) {\n  return (protoOrDescriptor: Object|ClassElement,\n          // tslint:disable-next-line:no-any decorator\n          name?: PropertyKey): any => {\n    const descriptor = {\n      get(this: LitElement) {\n        return this.renderRoot.querySelectorAll(selector);\n      },\n      enumerable: true,\n      configurable: true,\n    };\n    return (name !== undefined) ?\n        legacyQuery(descriptor, protoOrDescriptor as Object, name) :\n        standardQuery(descriptor, protoOrDescriptor as ClassElement);\n  };\n}\n\nconst legacyQuery =\n    (descriptor: PropertyDescriptor, proto: Object, name: PropertyKey) => {\n      Object.defineProperty(proto, name, descriptor);\n    };\n\nconst standardQuery = (descriptor: PropertyDescriptor, element: ClassElement) =>\n    ({\n      kind: 'method',\n      placement: 'prototype',\n      key: element.key,\n      descriptor,\n    });\n\nconst standardEventOptions =\n    (options: AddEventListenerOptions, element: ClassElement) => {\n      return {\n        ...element,\n        finisher(clazz: typeof UpdatingElement) {\n          Object.assign(\n              clazz.prototype[element.key as keyof UpdatingElement], options);\n        }\n      };\n    };\n\nconst legacyEventOptions =\n    // tslint:disable-next-line:no-any legacy decorator\n    (options: AddEventListenerOptions, proto: any, name: PropertyKey) => {\n      Object.assign(proto[name], options);\n    };\n\n/**\n * Adds event listener options to a method used as an event listener in a\n * lit-html template.\n *\n * @param options An object that specifies event listener options as accepted by\n * `EventTarget#addEventListener` and `EventTarget#removeEventListener`.\n *\n * Current browsers support the `capture`, `passive`, and `once` options. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters\n *\n * @example\n * ```ts\n * class MyElement {\n *   clicked = false;\n *\n *   render() {\n *     return html`\n *       <div @click=${this._onClick}`>\n *         <button></button>\n *       </div>\n *     `;\n *   }\n *\n *   @eventOptions({capture: true})\n *   _onClick(e) {\n *     this.clicked = true;\n *   }\n * }\n * ```\n * @category Decorator\n */\nexport function eventOptions(options: AddEventListenerOptions) {\n  // Return value typed as any to prevent TypeScript from complaining that\n  // standard decorator function signature does not match TypeScript decorator\n  // signature\n  // TODO(kschaaf): unclear why it was only failing on this decorator and not\n  // the others\n  return ((protoOrDescriptor: Object|ClassElement, name?: string) =>\n              (name !== undefined) ?\n              legacyEventOptions(options, protoOrDescriptor as Object, name) :\n              standardEventOptions(\n                  options, protoOrDescriptor as ClassElement)) as\n             // tslint:disable-next-line:no-any decorator\n             any;\n}\n\n// x-browser support for matches\n// tslint:disable-next-line:no-any\nconst ElementProto = Element.prototype as any;\nconst legacyMatches =\n    ElementProto.msMatchesSelector || ElementProto.webkitMatchesSelector;\n\n/**\n * A property decorator that converts a class property into a getter that\n * returns the `assignedNodes` of the given named `slot`. Note, the type of\n * this property should be annotated as `NodeListOf<HTMLElement>`.\n *\n * @param slotName A string name of the slot.\n * @param flatten A boolean which when true flattens the assigned nodes,\n * meaning any assigned nodes that are slot elements are replaced with their\n * assigned nodes.\n * @param selector A string which filters the results to elements that match\n * the given css selector.\n *\n * * @example\n * ```ts\n * class MyElement {\n *   @queryAssignedNodes('list', true, '.item')\n *   listItems;\n *\n *   render() {\n *     return html`\n *       <slot name=\"list\"></slot>\n *     `;\n *   }\n * }\n * ```\n * @category Decorator\n */\nexport function queryAssignedNodes(\n    slotName = '', flatten = false, selector = '') {\n  return (protoOrDescriptor: Object|ClassElement,\n          // tslint:disable-next-line:no-any decorator\n          name?: PropertyKey): any => {\n    const descriptor = {\n      get(this: LitElement) {\n        const slotSelector =\n            `slot${slotName ? `[name=${slotName}]` : ':not([name])'}`;\n        const slot = this.renderRoot.querySelector(slotSelector);\n        let nodes = slot && (slot as HTMLSlotElement).assignedNodes({flatten});\n        if (nodes && selector) {\n          nodes = nodes.filter(\n              (node) => node.nodeType === Node.ELEMENT_NODE &&\n                  // tslint:disable-next-line:no-any testing existence on older browsers\n                  ((node as any).matches ?\n                       (node as Element).matches(selector) :\n                       legacyMatches.call(node as Element, selector)));\n        }\n        return nodes;\n      },\n      enumerable: true,\n      configurable: true,\n    };\n    return (name !== undefined) ?\n        legacyQuery(descriptor, protoOrDescriptor as Object, name) :\n        standardQuery(descriptor, protoOrDescriptor as ClassElement);\n  };\n}\n","/**\n@license\nCopyright (c) 2019 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets = (window.ShadowRoot) &&\n    (window.ShadyCSS === undefined || window.ShadyCSS.nativeShadow) &&\n    ('adoptedStyleSheets' in Document.prototype) &&\n    ('replace' in CSSStyleSheet.prototype);\n\nconst constructionToken = Symbol();\n\nexport class CSSResult {\n  _styleSheet?: CSSStyleSheet|null;\n\n  readonly cssText: string;\n\n  constructor(cssText: string, safeToken: symbol) {\n    if (safeToken !== constructionToken) {\n      throw new Error(\n          'CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n    }\n\n    this.cssText = cssText;\n  }\n\n  // Note, this is a getter so that it's lazy. In practice, this means\n  // stylesheets are not created until the first element instance is made.\n  get styleSheet(): CSSStyleSheet|null {\n    if (this._styleSheet === undefined) {\n      // Note, if `supportsAdoptingStyleSheets` is true then we assume\n      // CSSStyleSheet is constructable.\n      if (supportsAdoptingStyleSheets) {\n        this._styleSheet = new CSSStyleSheet();\n        this._styleSheet.replaceSync(this.cssText);\n      } else {\n        this._styleSheet = null;\n      }\n    }\n    return this._styleSheet;\n  }\n\n  toString(): string {\n    return this.cssText;\n  }\n}\n\n/**\n * Wrap a value for interpolation in a [[`css`]] tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value: unknown) => {\n  return new CSSResult(String(value), constructionToken);\n};\n\nconst textFromCSSResult = (value: CSSResult|number) => {\n  if (value instanceof CSSResult) {\n    return value.cssText;\n  } else if (typeof value === 'number') {\n    return value;\n  } else {\n    throw new Error(\n        `Value passed to 'css' function must be a 'css' function result: ${\n            value}. Use 'unsafeCSS' to pass non-literal values, but\n            take care to ensure page security.`);\n  }\n};\n\n/**\n * Template tag which which can be used with LitElement's [[LitElement.styles |\n * `styles`]] property to set element styles. For security reasons, only literal\n * string values may be used. To incorporate non-literal values [[`unsafeCSS`]]\n * may be used inside a template string part.\n */\nexport const css =\n    (strings: TemplateStringsArray, ...values: (CSSResult|number)[]) => {\n      const cssText = values.reduce(\n          (acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1],\n          strings[0]);\n      return new CSSResult(cssText, constructionToken);\n    };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The main LitElement module, which defines the [[`LitElement`]] base class and\n * related APIs.\n *\n *  LitElement components can define a template and a set of observed\n * properties. Changing an observed property triggers a re-render of the\n * element.\n *\n *  Import [[`LitElement`]] and [[`html`]] from this module to create a\n * component:\n *\n *  ```js\n * import {LitElement, html} from 'lit-element';\n *\n * class MyElement extends LitElement {\n *\n *   // Declare observed properties\n *   static get properties() {\n *     return {\n *       adjective: {}\n *     }\n *   }\n *\n *   constructor() {\n *     this.adjective = 'awesome';\n *   }\n *\n *   // Define the element's template\n *   render() {\n *     return html`<p>your ${adjective} template here</p>`;\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n * ```\n *\n * `LitElement` extends [[`UpdatingElement`]] and adds lit-html templating.\n * The `UpdatingElement` class is provided for users that want to build\n * their own custom element base classes that don't use lit-html.\n *\n * @packageDocumentation\n */\nimport {render, ShadyRenderOptions} from 'lit-html/lib/shady-render.js';\n\nimport {PropertyValues, UpdatingElement} from './lib/updating-element.js';\n\nexport * from './lib/updating-element.js';\nexport {UpdatingElement as ReactiveElement} from './lib/updating-element.js';\nexport * from './lib/decorators.js';\nexport {html, svg, TemplateResult, SVGTemplateResult} from 'lit-html/lit-html.js';\nimport {supportsAdoptingStyleSheets, CSSResult, unsafeCSS} from './lib/css-tag.js';\nexport * from './lib/css-tag.js';\n\ndeclare global {\n  interface Window {\n    litElementVersions: string[];\n  }\n}\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for LitElement usage.\n// TODO(justinfagnani): inject version number at build time\n(window['litElementVersions'] || (window['litElementVersions'] = []))\n    .push('2.5.1');\n\nexport type CSSResultOrNative = CSSResult|CSSStyleSheet;\n\nexport interface CSSResultArray extends\n    Array<CSSResultOrNative|CSSResultArray> {}\n\nexport type CSSResultGroup = CSSResultOrNative|CSSResultArray;\n\n/**\n * Sentinal value used to avoid calling lit-html's render function when\n * subclasses do not implement `render`\n */\nconst renderNotImplemented = {};\n\n/**\n * Base element class that manages element properties and attributes, and\n * renders a lit-html template.\n *\n * To define a component, subclass `LitElement` and implement a\n * `render` method to provide the component's template. Define properties\n * using the [[`properties`]] property or the [[`property`]] decorator.\n */\nexport class LitElement extends UpdatingElement {\n  /**\n   * Ensure this class is marked as `finalized` as an optimization ensuring\n   * it will not needlessly try to `finalize`.\n   *\n   * Note this property name is a string to prevent breaking Closure JS Compiler\n   * optimizations. See updating-element.ts for more information.\n   */\n  protected static['finalized'] = true;\n\n  /**\n   * Reference to the underlying library method used to render the element's\n   * DOM. By default, points to the `render` method from lit-html's shady-render\n   * module.\n   *\n   * **Most users will never need to touch this property.**\n   *\n   * This  property should not be confused with the `render` instance method,\n   * which should be overridden to define a template for the element.\n   *\n   * Advanced users creating a new base class based on LitElement can override\n   * this property to point to a custom render method with a signature that\n   * matches [shady-render's `render`\n   * method](https://lit-html.polymer-project.org/api/modules/shady_render.html#render).\n   *\n   * @nocollapse\n   */\n  static render:\n      (result: unknown, container: Element|DocumentFragment,\n       options: ShadyRenderOptions) => void = render;\n\n  /**\n   * Array of styles to apply to the element. The styles should be defined\n   * using the [[`css`]] tag function or via constructible stylesheets.\n   */\n  static styles?: CSSResultGroup;\n\n  /** @nocollapse */\n  static shadowRootOptions: ShadowRootInit = {mode: 'open'};\n\n  private static _styles: Array<CSSResultOrNative|CSSResult>|undefined;\n\n  /**\n   * Return the array of styles to apply to the element.\n   * Override this method to integrate into a style management system.\n   *\n   * @nocollapse\n   */\n  static getStyles(): CSSResultGroup|undefined {\n    return this.styles;\n  }\n\n  /** @nocollapse */\n  private static _getUniqueStyles() {\n    // Only gather styles once per class\n    if (this.hasOwnProperty(JSCompiler_renameProperty('_styles', this))) {\n      return;\n    }\n    // Take care not to call `this.getStyles()` multiple times since this\n    // generates new CSSResults each time.\n    // TODO(sorvell): Since we do not cache CSSResults by input, any\n    // shared styles will generate new stylesheet objects, which is wasteful.\n    // This should be addressed when a browser ships constructable\n    // stylesheets.\n    const userStyles = this.getStyles();\n\n    if (Array.isArray(userStyles)) {\n      // De-duplicate styles preserving the _last_ instance in the set.\n      // This is a performance optimization to avoid duplicated styles that can\n      // occur especially when composing via subclassing.\n      // The last item is kept to try to preserve the cascade order with the\n      // assumption that it's most important that last added styles override\n      // previous styles.\n      const addStyles = (styles: CSSResultArray, set: Set<CSSResultOrNative>):\n          Set<CSSResultOrNative> => styles.reduceRight(\n              (set: Set<CSSResultOrNative>, s) =>\n                  // Note: On IE set.add() does not return the set\n              Array.isArray(s) ? addStyles(s, set) : (set.add(s), set),\n              set);\n      // Array.from does not work on Set in IE, otherwise return\n      // Array.from(addStyles(userStyles, new Set<CSSResult>())).reverse()\n      const set = addStyles(userStyles, new Set<CSSResultOrNative>());\n      const styles: CSSResultOrNative[] = [];\n      set.forEach((v) => styles.unshift(v));\n      this._styles = styles;\n    } else {\n      this._styles = userStyles === undefined ? [] : [userStyles];\n    }\n\n    // Ensure that there are no invalid CSSStyleSheet instances here. They are\n    // invalid in two conditions.\n    // (1) the sheet is non-constructible (`sheet` of a HTMLStyleElement), but\n    //     this is impossible to check except via .replaceSync or use\n    // (2) the ShadyCSS polyfill is enabled (:. supportsAdoptingStyleSheets is\n    //     false)\n    this._styles = this._styles.map((s) => {\n      if (s instanceof CSSStyleSheet && !supportsAdoptingStyleSheets) {\n        // Flatten the cssText from the passed constructible stylesheet (or\n        // undetectable non-constructible stylesheet). The user might have\n        // expected to update their stylesheets over time, but the alternative\n        // is a crash.\n        const cssText = Array.prototype.slice.call(s.cssRules)\n                            .reduce((css, rule) => css + rule.cssText, '');\n        return unsafeCSS(cssText);\n      }\n      return s;\n    });\n  }\n\n  private _needsShimAdoptedStyleSheets?: boolean;\n\n  /**\n   * Node or ShadowRoot into which element DOM should be rendered. Defaults\n   * to an open shadowRoot.\n   */\n  readonly renderRoot!: Element|DocumentFragment;\n\n  /**\n   * Performs element initialization. By default this calls\n   * [[`createRenderRoot`]] to create the element [[`renderRoot`]] node and\n   * captures any pre-set values for registered properties.\n   */\n  protected initialize() {\n    super.initialize();\n    (this.constructor as typeof LitElement)._getUniqueStyles();\n    (this as {\n      renderRoot: Element|DocumentFragment;\n    }).renderRoot = this.createRenderRoot();\n    // Note, if renderRoot is not a shadowRoot, styles would/could apply to the\n    // element's getRootNode(). While this could be done, we're choosing not to\n    // support this now since it would require different logic around de-duping.\n    if (window.ShadowRoot && this.renderRoot instanceof window.ShadowRoot) {\n      this.adoptStyles();\n    }\n  }\n\n  /**\n   * Returns the node into which the element should render and by default\n   * creates and returns an open shadowRoot. Implement to customize where the\n   * element's DOM is rendered. For example, to render into the element's\n   * childNodes, return `this`.\n   * @returns {Element|DocumentFragment} Returns a node into which to render.\n   */\n  protected createRenderRoot(): Element|ShadowRoot {\n    return this.attachShadow(\n        (this.constructor as typeof LitElement).shadowRootOptions);\n  }\n\n  /**\n   * Applies styling to the element shadowRoot using the [[`styles`]]\n   * property. Styling will apply using `shadowRoot.adoptedStyleSheets` where\n   * available and will fallback otherwise. When Shadow DOM is polyfilled,\n   * ShadyCSS scopes styles and adds them to the document. When Shadow DOM\n   * is available but `adoptedStyleSheets` is not, styles are appended to the\n   * end of the `shadowRoot` to [mimic spec\n   * behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n   */\n  protected adoptStyles() {\n    const styles = (this.constructor as typeof LitElement)._styles!;\n    if (styles.length === 0) {\n      return;\n    }\n    // There are three separate cases here based on Shadow DOM support.\n    // (1) shadowRoot polyfilled: use ShadyCSS\n    // (2) shadowRoot.adoptedStyleSheets available: use it\n    // (3) shadowRoot.adoptedStyleSheets polyfilled: append styles after\n    // rendering\n    if (window.ShadyCSS !== undefined && !window.ShadyCSS.nativeShadow) {\n      window.ShadyCSS.ScopingShim!.prepareAdoptedCssText(\n          styles.map((s) => (s as CSSResult).cssText), this.localName);\n    } else if (supportsAdoptingStyleSheets) {\n      (this.renderRoot as ShadowRoot).adoptedStyleSheets =\n          styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet!);\n    } else {\n      // This must be done after rendering so the actual style insertion is done\n      // in `update`.\n      this._needsShimAdoptedStyleSheets = true;\n    }\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    // Note, first update/render handles styleElement so we only call this if\n    // connected after first update.\n    if (this.hasUpdated && window.ShadyCSS !== undefined) {\n      window.ShadyCSS.styleElement(this);\n    }\n  }\n\n  /**\n   * Updates the element. This method reflects property values to attributes\n   * and calls `render` to render DOM via lit-html. Setting properties inside\n   * this method will *not* trigger another update.\n   * @param _changedProperties Map of changed properties with old values\n   */\n  protected update(changedProperties: PropertyValues) {\n    // Setting properties in `render` should not trigger an update. Since\n    // updates are allowed after super.update, it's important to call `render`\n    // before that.\n    const templateResult = this.render();\n    super.update(changedProperties);\n    // If render is not implemented by the component, don't call lit-html render\n    if (templateResult !== renderNotImplemented) {\n      (this.constructor as typeof LitElement)\n          .render(\n              templateResult,\n              this.renderRoot,\n              {scopeName: this.localName, eventContext: this});\n    }\n    // When native Shadow DOM is used but adoptedStyles are not supported,\n    // insert styling after rendering to ensure adoptedStyles have highest\n    // priority.\n    if (this._needsShimAdoptedStyleSheets) {\n      this._needsShimAdoptedStyleSheets = false;\n      (this.constructor as typeof LitElement)._styles!.forEach((s) => {\n        const style = document.createElement('style');\n        style.textContent = (s as CSSResult).cssText;\n        this.renderRoot.appendChild(style);\n      });\n    }\n  }\n\n  /**\n   * Invoked on each update to perform rendering tasks. This method may return\n   * any value renderable by lit-html's `NodePart` - typically a\n   * `TemplateResult`. Setting properties inside this method will *not* trigger\n   * the element to update.\n   */\n  protected render(): unknown {\n    return renderNotImplemented;\n  }\n}\n","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {AttributePart, directive, Part} from '../lit-html.js';\n\nconst previousValues = new WeakMap<Part, unknown>();\n\n/**\n * For AttributeParts, sets the attribute if the value is defined and removes\n * the attribute if the value is undefined.\n *\n * For other part types, this directive is a no-op.\n */\nexport const ifDefined = directive((value: unknown) => (part: Part) => {\n  const previousValue = previousValues.get(part);\n\n  if (value === undefined && part instanceof AttributePart) {\n    // If the value is undefined, remove the attribute, but only if the value\n    // was previously defined.\n    if (previousValue !== undefined || !previousValues.has(part)) {\n      const name = part.committer.name;\n      part.committer.element.removeAttribute(name);\n    }\n  } else if (value !== previousValue) {\n    part.setValue(value);\n  }\n\n  previousValues.set(part, value);\n});\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {DirectiveFn} from '../lib/directive.js';\nimport {createMarker, directive, NodePart, Part, removeNodes, reparentNodes} from '../lit-html.js';\n\nexport type KeyFn<T> = (item: T, index: number) => unknown;\nexport type ItemTemplate<T> = (item: T, index: number) => unknown;\n\n// Helper functions for manipulating parts\n// TODO(kschaaf): Refactor into Part API?\nconst createAndInsertPart =\n    (containerPart: NodePart, beforePart?: NodePart): NodePart => {\n      const container = containerPart.startNode.parentNode as Node;\n      const beforeNode = beforePart === undefined ? containerPart.endNode :\n                                                    beforePart.startNode;\n      const startNode = container.insertBefore(createMarker(), beforeNode);\n      container.insertBefore(createMarker(), beforeNode);\n      const newPart = new NodePart(containerPart.options);\n      newPart.insertAfterNode(startNode);\n      return newPart;\n    };\n\nconst updatePart = (part: NodePart, value: unknown) => {\n  part.setValue(value);\n  part.commit();\n  return part;\n};\n\nconst insertPartBefore =\n    (containerPart: NodePart, part: NodePart, ref?: NodePart) => {\n      const container = containerPart.startNode.parentNode as Node;\n      const beforeNode = ref ? ref.startNode : containerPart.endNode;\n      const endNode = part.endNode.nextSibling;\n      if (endNode !== beforeNode) {\n        reparentNodes(container, part.startNode, endNode, beforeNode);\n      }\n    };\n\nconst removePart = (part: NodePart) => {\n  removeNodes(\n      part.startNode.parentNode!, part.startNode, part.endNode.nextSibling);\n};\n\n// Helper for generating a map of array item to its index over a subset\n// of an array (used to lazily generate `newKeyToIndexMap` and\n// `oldKeyToIndexMap`)\nconst generateMap = (list: unknown[], start: number, end: number) => {\n  const map = new Map();\n  for (let i = start; i <= end; i++) {\n    map.set(list[i], i);\n  }\n  return map;\n};\n\n// Stores previous ordered list of parts and map of key to index\nconst partListCache = new WeakMap<NodePart, (NodePart | null)[]>();\nconst keyListCache = new WeakMap<NodePart, unknown[]>();\n\n/**\n * A directive that repeats a series of values (usually `TemplateResults`)\n * generated from an iterable, and updates those items efficiently when the\n * iterable changes based on user-provided `keys` associated with each item.\n *\n * Note that if a `keyFn` is provided, strict key-to-DOM mapping is maintained,\n * meaning previous DOM for a given key is moved into the new position if\n * needed, and DOM will never be reused with values for different keys (new DOM\n * will always be created for new keys). This is generally the most efficient\n * way to use `repeat` since it performs minimum unnecessary work for insertions\n * and removals.\n *\n * IMPORTANT: If providing a `keyFn`, keys *must* be unique for all items in a\n * given call to `repeat`. The behavior when two or more items have the same key\n * is undefined.\n *\n * If no `keyFn` is provided, this directive will perform similar to mapping\n * items to values, and DOM will be reused against potentially different items.\n */\nexport const repeat =\n    directive(\n        <T>(items: Iterable<T>,\n            keyFnOrTemplate: KeyFn<T>|ItemTemplate<T>,\n            template?: ItemTemplate<T>):\n            DirectiveFn => {\n              let keyFn: KeyFn<T>;\n              if (template === undefined) {\n                template = keyFnOrTemplate;\n              } else if (keyFnOrTemplate !== undefined) {\n                keyFn = keyFnOrTemplate as KeyFn<T>;\n              }\n\n              return (containerPart: Part): void => {\n                if (!(containerPart instanceof NodePart)) {\n                  throw new Error('repeat can only be used in text bindings');\n                }\n                // Old part & key lists are retrieved from the last update\n                // (associated with the part for this instance of the directive)\n                const oldParts = partListCache.get(containerPart) || [];\n                const oldKeys = keyListCache.get(containerPart) || [];\n\n                // New part list will be built up as we go (either reused from\n                // old parts or created for new keys in this update). This is\n                // saved in the above cache at the end of the update.\n                const newParts: NodePart[] = [];\n\n                // New value list is eagerly generated from items along with a\n                // parallel array indicating its key.\n                const newValues: unknown[] = [];\n                const newKeys: unknown[] = [];\n                let index = 0;\n                for (const item of items) {\n                  newKeys[index] = keyFn ? keyFn(item, index) : index;\n                  newValues[index] = template !(item, index);\n                  index++;\n                }\n\n                // Maps from key to index for current and previous update; these\n                // are generated lazily only when needed as a performance\n                // optimization, since they are only required for multiple\n                // non-contiguous changes in the list, which are less common.\n                let newKeyToIndexMap!: Map<unknown, number>;\n                let oldKeyToIndexMap!: Map<unknown, number>;\n\n                // Head and tail pointers to old parts and new values\n                let oldHead = 0;\n                let oldTail = oldParts.length - 1;\n                let newHead = 0;\n                let newTail = newValues.length - 1;\n\n                // Overview of O(n) reconciliation algorithm (general approach\n                // based on ideas found in ivi, vue, snabbdom, etc.):\n                //\n                // * We start with the list of old parts and new values (and\n                //   arrays of their respective keys), head/tail pointers into\n                //   each, and we build up the new list of parts by updating\n                //   (and when needed, moving) old parts or creating new ones.\n                //   The initial scenario might look like this (for brevity of\n                //   the diagrams, the numbers in the array reflect keys\n                //   associated with the old parts or new values, although keys\n                //   and parts/values are actually stored in parallel arrays\n                //   indexed using the same head/tail pointers):\n                //\n                //      oldHead v                 v oldTail\n                //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n                //   newParts: [ ,  ,  ,  ,  ,  ,  ]\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6] <- reflects the user's new\n                //                                      item order\n                //      newHead ^                 ^ newTail\n                //\n                // * Iterate old & new lists from both sides, updating,\n                //   swapping, or removing parts at the head/tail locations\n                //   until neither head nor tail can move.\n                //\n                // * Example below: keys at head pointers match, so update old\n                //   part 0 in-place (no need to move it) and record part 0 in\n                //   the `newParts` list. The last thing we do is advance the\n                //   `oldHead` and `newHead` pointers (will be reflected in the\n                //   next diagram).\n                //\n                //      oldHead v                 v oldTail\n                //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n                //   newParts: [0,  ,  ,  ,  ,  ,  ] <- heads matched: update 0\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldHead\n                //                                      & newHead\n                //      newHead ^                 ^ newTail\n                //\n                // * Example below: head pointers don't match, but tail\n                //   pointers do, so update part 6 in place (no need to move\n                //   it), and record part 6 in the `newParts` list. Last,\n                //   advance the `oldTail` and `oldHead` pointers.\n                //\n                //         oldHead v              v oldTail\n                //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n                //   newParts: [0,  ,  ,  ,  ,  , 6] <- tails matched: update 6\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldTail\n                //                                      & newTail\n                //         newHead ^              ^ newTail\n                //\n                // * If neither head nor tail match; next check if one of the\n                //   old head/tail items was removed. We first need to generate\n                //   the reverse map of new keys to index (`newKeyToIndexMap`),\n                //   which is done once lazily as a performance optimization,\n                //   since we only hit this case if multiple non-contiguous\n                //   changes were made. Note that for contiguous removal\n                //   anywhere in the list, the head and tails would advance\n                //   from either end and pass each other before we get to this\n                //   case and removals would be handled in the final while loop\n                //   without needing to generate the map.\n                //\n                // * Example below: The key at `oldTail` was removed (no longer\n                //   in the `newKeyToIndexMap`), so remove that part from the\n                //   DOM and advance just the `oldTail` pointer.\n                //\n                //         oldHead v           v oldTail\n                //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n                //   newParts: [0,  ,  ,  ,  ,  , 6] <- 5 not in new map: remove\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    5 and advance oldTail\n                //         newHead ^           ^ newTail\n                //\n                // * Once head and tail cannot move, any mismatches are due to\n                //   either new or moved items; if a new key is in the previous\n                //   \"old key to old index\" map, move the old part to the new\n                //   location, otherwise create and insert a new part. Note\n                //   that when moving an old part we null its position in the\n                //   oldParts array if it lies between the head and tail so we\n                //   know to skip it when the pointers get there.\n                //\n                // * Example below: neither head nor tail match, and neither\n                //   were removed; so find the `newHead` key in the\n                //   `oldKeyToIndexMap`, and move that old part's DOM into the\n                //   next head position (before `oldParts[oldHead]`). Last,\n                //   null the part in the `oldPart` array since it was\n                //   somewhere in the remaining oldParts still to be scanned\n                //   (between the head and tail pointers) so that we know to\n                //   skip that old part on future iterations.\n                //\n                //         oldHead v        v oldTail\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n                //   newParts: [0, 2,  ,  ,  ,  , 6] <- stuck: update & move 2\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    into place and advance\n                //                                      newHead\n                //         newHead ^           ^ newTail\n                //\n                // * Note that for moves/insertions like the one above, a part\n                //   inserted at the head pointer is inserted before the\n                //   current `oldParts[oldHead]`, and a part inserted at the\n                //   tail pointer is inserted before `newParts[newTail+1]`. The\n                //   seeming asymmetry lies in the fact that new parts are\n                //   moved into place outside in, so to the right of the head\n                //   pointer are old parts, and to the right of the tail\n                //   pointer are new parts.\n                //\n                // * We always restart back from the top of the algorithm,\n                //   allowing matching and simple updates in place to\n                //   continue...\n                //\n                // * Example below: the head pointers once again match, so\n                //   simply update part 1 and record it in the `newParts`\n                //   array.  Last, advance both head pointers.\n                //\n                //         oldHead v        v oldTail\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n                //   newParts: [0, 2, 1,  ,  ,  , 6] <- heads matched: update 1\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldHead\n                //                                      & newHead\n                //            newHead ^        ^ newTail\n                //\n                // * As mentioned above, items that were moved as a result of\n                //   being stuck (the final else clause in the code below) are\n                //   marked with null, so we always advance old pointers over\n                //   these so we're comparing the next actual old value on\n                //   either end.\n                //\n                // * Example below: `oldHead` is null (already placed in\n                //   newParts), so advance `oldHead`.\n                //\n                //            oldHead v     v oldTail\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6] <- old head already used:\n                //   newParts: [0, 2, 1,  ,  ,  , 6]    advance oldHead\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]\n                //               newHead ^     ^ newTail\n                //\n                // * Note it's not critical to mark old parts as null when they\n                //   are moved from head to tail or tail to head, since they\n                //   will be outside the pointer range and never visited again.\n                //\n                // * Example below: Here the old tail key matches the new head\n                //   key, so the part at the `oldTail` position and move its\n                //   DOM to the new head position (before `oldParts[oldHead]`).\n                //   Last, advance `oldTail` and `newHead` pointers.\n                //\n                //               oldHead v  v oldTail\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n                //   newParts: [0, 2, 1, 4,  ,  , 6] <- old tail matches new\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]   head: update & move 4,\n                //                                     advance oldTail & newHead\n                //               newHead ^     ^ newTail\n                //\n                // * Example below: Old and new head keys match, so update the\n                //   old head part in place, and advance the `oldHead` and\n                //   `newHead` pointers.\n                //\n                //               oldHead v oldTail\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n                //   newParts: [0, 2, 1, 4, 3,   ,6] <- heads match: update 3\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance oldHead &\n                //                                      newHead\n                //                  newHead ^  ^ newTail\n                //\n                // * Once the new or old pointers move past each other then all\n                //   we have left is additions (if old list exhausted) or\n                //   removals (if new list exhausted). Those are handled in the\n                //   final while loops at the end.\n                //\n                // * Example below: `oldHead` exceeded `oldTail`, so we're done\n                //   with the main loop.  Create the remaining part and insert\n                //   it at the new head position, and the update is complete.\n                //\n                //                   (oldHead > oldTail)\n                //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n                //   newParts: [0, 2, 1, 4, 3, 7 ,6] <- create and insert 7\n                //   newKeys:  [0, 2, 1, 4, 3, 7, 6]\n                //                     newHead ^ newTail\n                //\n                // * Note that the order of the if/else clauses is not\n                //   important to the algorithm, as long as the null checks\n                //   come first (to ensure we're always working on valid old\n                //   parts) and that the final else clause comes last (since\n                //   that's where the expensive moves occur). The order of\n                //   remaining clauses is is just a simple guess at which cases\n                //   will be most common.\n                //\n                // * TODO(kschaaf) Note, we could calculate the longest\n                //   increasing subsequence (LIS) of old items in new position,\n                //   and only move those not in the LIS set. However that costs\n                //   O(nlogn) time and adds a bit more code, and only helps\n                //   make rare types of mutations require fewer moves. The\n                //   above handles removes, adds, reversal, swaps, and single\n                //   moves of contiguous items in linear time, in the minimum\n                //   number of moves. As the number of multiple moves where LIS\n                //   might help approaches a random shuffle, the LIS\n                //   optimization becomes less helpful, so it seems not worth\n                //   the code at this point. Could reconsider if a compelling\n                //   case arises.\n\n                while (oldHead <= oldTail && newHead <= newTail) {\n                  if (oldParts[oldHead] === null) {\n                    // `null` means old part at head has already been used\n                    // below; skip\n                    oldHead++;\n                  } else if (oldParts[oldTail] === null) {\n                    // `null` means old part at tail has already been used\n                    // below; skip\n                    oldTail--;\n                  } else if (oldKeys[oldHead] === newKeys[newHead]) {\n                    // Old head matches new head; update in place\n                    newParts[newHead] =\n                        updatePart(oldParts[oldHead]!, newValues[newHead]);\n                    oldHead++;\n                    newHead++;\n                  } else if (oldKeys[oldTail] === newKeys[newTail]) {\n                    // Old tail matches new tail; update in place\n                    newParts[newTail] =\n                        updatePart(oldParts[oldTail]!, newValues[newTail]);\n                    oldTail--;\n                    newTail--;\n                  } else if (oldKeys[oldHead] === newKeys[newTail]) {\n                    // Old head matches new tail; update and move to new tail\n                    newParts[newTail] =\n                        updatePart(oldParts[oldHead]!, newValues[newTail]);\n                    insertPartBefore(\n                        containerPart,\n                        oldParts[oldHead]!,\n                        newParts[newTail + 1]);\n                    oldHead++;\n                    newTail--;\n                  } else if (oldKeys[oldTail] === newKeys[newHead]) {\n                    // Old tail matches new head; update and move to new head\n                    newParts[newHead] =\n                        updatePart(oldParts[oldTail]!, newValues[newHead]);\n                    insertPartBefore(\n                        containerPart, oldParts[oldTail]!, oldParts[oldHead]!);\n                    oldTail--;\n                    newHead++;\n                  } else {\n                    if (newKeyToIndexMap === undefined) {\n                      // Lazily generate key-to-index maps, used for removals &\n                      // moves below\n                      newKeyToIndexMap = generateMap(newKeys, newHead, newTail);\n                      oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);\n                    }\n                    if (!newKeyToIndexMap.has(oldKeys[oldHead])) {\n                      // Old head is no longer in new list; remove\n                      removePart(oldParts[oldHead]!);\n                      oldHead++;\n                    } else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {\n                      // Old tail is no longer in new list; remove\n                      removePart(oldParts[oldTail]!);\n                      oldTail--;\n                    } else {\n                      // Any mismatches at this point are due to additions or\n                      // moves; see if we have an old part we can reuse and move\n                      // into place\n                      const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);\n                      const oldPart =\n                          oldIndex !== undefined ? oldParts[oldIndex] : null;\n                      if (oldPart === null) {\n                        // No old part for this value; create a new one and\n                        // insert it\n                        const newPart = createAndInsertPart(\n                            containerPart, oldParts[oldHead]!);\n                        updatePart(newPart, newValues[newHead]);\n                        newParts[newHead] = newPart;\n                      } else {\n                        // Reuse old part\n                        newParts[newHead] =\n                            updatePart(oldPart, newValues[newHead]);\n                        insertPartBefore(\n                            containerPart, oldPart, oldParts[oldHead]!);\n                        // This marks the old part as having been used, so that\n                        // it will be skipped in the first two checks above\n                        oldParts[oldIndex as number] = null;\n                      }\n                      newHead++;\n                    }\n                  }\n                }\n                // Add parts for any remaining new values\n                while (newHead <= newTail) {\n                  // For all remaining additions, we insert before last new\n                  // tail, since old pointers are no longer valid\n                  const newPart =\n                      createAndInsertPart(containerPart, newParts[newTail + 1]);\n                  updatePart(newPart, newValues[newHead]);\n                  newParts[newHead++] = newPart;\n                }\n                // Remove any remaining unused old parts\n                while (oldHead <= oldTail) {\n                  const oldPart = oldParts[oldHead++];\n                  if (oldPart !== null) {\n                    removePart(oldPart);\n                  }\n                }\n                // Save order of new parts for next round\n                partListCache.set(containerPart, newParts);\n                keyListCache.set(containerPart, newKeys);\n              };\n            }) as\n    <T>(items: Iterable<T>,\n        keyFnOrTemplate: KeyFn<T>|ItemTemplate<T>,\n        template?: ItemTemplate<T>) => DirectiveFn;\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {Part} from './part.js';\n\nconst directives = new WeakMap<object, true>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type DirectiveFactory = (...args: any[]) => object;\n\nexport type DirectiveFn = (part: Part) => void;\n\n/**\n * Brands a function as a directive factory function so that lit-html will call\n * the function during template rendering, rather than passing as a value.\n *\n * A _directive_ is a function that takes a Part as an argument. It has the\n * signature: `(part: Part) => void`.\n *\n * A directive _factory_ is a function that takes arguments for data and\n * configuration and returns a directive. Users of directive usually refer to\n * the directive factory as the directive. For example, \"The repeat directive\".\n *\n * Usually a template author will invoke a directive factory in their template\n * with relevant arguments, which will then return a directive function.\n *\n * Here's an example of using the `repeat()` directive factory that takes an\n * array and a function to render an item:\n *\n * ```js\n * html`<ul><${repeat(items, (item) => html`<li>${item}</li>`)}</ul>`\n * ```\n *\n * When `repeat` is invoked, it returns a directive function that closes over\n * `items` and the template function. When the outer template is rendered, the\n * return directive function is called with the Part for the expression.\n * `repeat` then performs it's custom logic to render multiple items.\n *\n * @param f The directive factory function. Must be a function that returns a\n * function of the signature `(part: Part) => void`. The returned function will\n * be called with the part object.\n *\n * @example\n *\n * import {directive, html} from 'lit-html';\n *\n * const immutable = directive((v) => (part) => {\n *   if (part.value !== v) {\n *     part.setValue(v)\n *   }\n * });\n */\nexport const directive = <F extends DirectiveFactory>(f: F): F =>\n    ((...args: unknown[]) => {\n      const d = f(...args);\n      directives.set(d, true);\n      return d;\n    }) as F;\n\nexport const isDirective = (o: unknown): o is DirectiveFn => {\n  return typeof o === 'function' && directives.has(o);\n};\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\ninterface MaybePolyfilledCe extends CustomElementRegistry {\n  readonly polyfillWrapFlushCallback?: object;\n}\n\n/**\n * True if the custom elements polyfill is in use.\n */\nexport const isCEPolyfill = typeof window !== 'undefined' &&\n    window.customElements != null &&\n    (window.customElements as MaybePolyfilledCe).polyfillWrapFlushCallback !==\n        undefined;\n\n/**\n * Reparents nodes, starting from `start` (inclusive) to `end` (exclusive),\n * into another container (could be the same container), before `before`. If\n * `before` is null, it appends the nodes to the container.\n */\nexport const reparentNodes =\n    (container: Node,\n     start: Node|null,\n     end: Node|null = null,\n     before: Node|null = null): void => {\n      while (start !== end) {\n        const n = start!.nextSibling;\n        container.insertBefore(start!, before);\n        start = n;\n      }\n    };\n\n/**\n * Removes nodes, starting from `start` (inclusive) to `end` (exclusive), from\n * `container`.\n */\nexport const removeNodes =\n    (container: Node, start: Node|null, end: Node|null = null): void => {\n      while (start !== end) {\n        const n = start!.nextSibling;\n        container.removeChild(start!);\n        start = n;\n      }\n    };\n","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The Part interface represents a dynamic part of a template instance rendered\n * by lit-html.\n */\nexport interface Part {\n  readonly value: unknown;\n\n  /**\n   * Sets the current part value, but does not write it to the DOM.\n   * @param value The value that will be committed.\n   */\n  setValue(value: unknown): void;\n\n  /**\n   * Commits the current part value, causing it to actually be written to the\n   * DOM.\n   *\n   * Directives are run at the start of `commit`, so that if they call\n   * `part.setValue(...)` synchronously that value will be used in the current\n   * commit, and there's no need to call `part.commit()` within the directive.\n   * If directives set a part value asynchronously, then they must call\n   * `part.commit()` manually.\n   */\n  commit(): void;\n}\n\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange = {};\n\n/**\n * A sentinel value that signals a NodePart to fully clear its content.\n */\nexport const nothing = {};\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {isDirective} from './directive.js';\nimport {removeNodes} from './dom.js';\nimport {noChange, nothing, Part} from './part.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateInstance} from './template-instance.js';\nimport {TemplateResult} from './template-result.js';\nimport {createMarker} from './template.js';\n\n// https://tc39.github.io/ecma262/#sec-typeof-operator\nexport type Primitive = null|undefined|boolean|number|string|symbol|bigint;\nexport const isPrimitive = (value: unknown): value is Primitive => {\n  return (\n      value === null ||\n      !(typeof value === 'object' || typeof value === 'function'));\n};\nexport const isIterable = (value: unknown): value is Iterable<unknown> => {\n  return Array.isArray(value) ||\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      !!(value && (value as any)[Symbol.iterator]);\n};\n\n/**\n * Writes attribute values to the DOM for a group of AttributeParts bound to a\n * single attribute. The value is only set once even if there are multiple parts\n * for an attribute.\n */\nexport class AttributeCommitter {\n  readonly element: Element;\n  readonly name: string;\n  readonly strings: ReadonlyArray<string>;\n  readonly parts: ReadonlyArray<AttributePart>;\n  dirty = true;\n\n  constructor(element: Element, name: string, strings: ReadonlyArray<string>) {\n    this.element = element;\n    this.name = name;\n    this.strings = strings;\n    this.parts = [];\n    for (let i = 0; i < strings.length - 1; i++) {\n      (this.parts as AttributePart[])[i] = this._createPart();\n    }\n  }\n\n  /**\n   * Creates a single part. Override this to create a differnt type of part.\n   */\n  protected _createPart(): AttributePart {\n    return new AttributePart(this);\n  }\n\n  protected _getValue(): unknown {\n    const strings = this.strings;\n    const l = strings.length - 1;\n    const parts = this.parts;\n\n    // If we're assigning an attribute via syntax like:\n    //    attr=\"${foo}\"  or  attr=${foo}\n    // but not\n    //    attr=\"${foo} ${bar}\" or attr=\"${foo} baz\"\n    // then we don't want to coerce the attribute value into one long\n    // string. Instead we want to just return the value itself directly,\n    // so that sanitizeDOMValue can get the actual value rather than\n    // String(value)\n    // The exception is if v is an array, in which case we do want to smash\n    // it together into a string without calling String() on the array.\n    //\n    // This also allows trusted values (when using TrustedTypes) being\n    // assigned to DOM sinks without being stringified in the process.\n    if (l === 1 && strings[0] === '' && strings[1] === '') {\n      const v = parts[0].value;\n      if (typeof v === 'symbol') {\n        return String(v);\n      }\n      if (typeof v === 'string' || !isIterable(v)) {\n        return v;\n      }\n    }\n    let text = '';\n\n    for (let i = 0; i < l; i++) {\n      text += strings[i];\n      const part = parts[i];\n      if (part !== undefined) {\n        const v = part.value;\n        if (isPrimitive(v) || !isIterable(v)) {\n          text += typeof v === 'string' ? v : String(v);\n        } else {\n          for (const t of v) {\n            text += typeof t === 'string' ? t : String(t);\n          }\n        }\n      }\n    }\n\n    text += strings[l];\n    return text;\n  }\n\n  commit(): void {\n    if (this.dirty) {\n      this.dirty = false;\n      this.element.setAttribute(this.name, this._getValue() as string);\n    }\n  }\n}\n\n/**\n * A Part that controls all or part of an attribute value.\n */\nexport class AttributePart implements Part {\n  readonly committer: AttributeCommitter;\n  value: unknown = undefined;\n\n  constructor(committer: AttributeCommitter) {\n    this.committer = committer;\n  }\n\n  setValue(value: unknown): void {\n    if (value !== noChange && (!isPrimitive(value) || value !== this.value)) {\n      this.value = value;\n      // If the value is a not a directive, dirty the committer so that it'll\n      // call setAttribute. If the value is a directive, it'll dirty the\n      // committer if it calls setValue().\n      if (!isDirective(value)) {\n        this.committer.dirty = true;\n      }\n    }\n  }\n\n  commit() {\n    while (isDirective(this.value)) {\n      const directive = this.value;\n      this.value = noChange;\n      directive(this);\n    }\n    if (this.value === noChange) {\n      return;\n    }\n    this.committer.commit();\n  }\n}\n\n/**\n * A Part that controls a location within a Node tree. Like a Range, NodePart\n * has start and end locations and can set and update the Nodes between those\n * locations.\n *\n * NodeParts support several value types: primitives, Nodes, TemplateResults,\n * as well as arrays and iterables of those types.\n */\nexport class NodePart implements Part {\n  readonly options: RenderOptions;\n  startNode!: Node;\n  endNode!: Node;\n  value: unknown = undefined;\n  private __pendingValue: unknown = undefined;\n\n  constructor(options: RenderOptions) {\n    this.options = options;\n  }\n\n  /**\n   * Appends this part into a container.\n   *\n   * This part must be empty, as its contents are not automatically moved.\n   */\n  appendInto(container: Node) {\n    this.startNode = container.appendChild(createMarker());\n    this.endNode = container.appendChild(createMarker());\n  }\n\n  /**\n   * Inserts this part after the `ref` node (between `ref` and `ref`'s next\n   * sibling). Both `ref` and its next sibling must be static, unchanging nodes\n   * such as those that appear in a literal section of a template.\n   *\n   * This part must be empty, as its contents are not automatically moved.\n   */\n  insertAfterNode(ref: Node) {\n    this.startNode = ref;\n    this.endNode = ref.nextSibling!;\n  }\n\n  /**\n   * Appends this part into a parent part.\n   *\n   * This part must be empty, as its contents are not automatically moved.\n   */\n  appendIntoPart(part: NodePart) {\n    part.__insert(this.startNode = createMarker());\n    part.__insert(this.endNode = createMarker());\n  }\n\n  /**\n   * Inserts this part after the `ref` part.\n   *\n   * This part must be empty, as its contents are not automatically moved.\n   */\n  insertAfterPart(ref: NodePart) {\n    ref.__insert(this.startNode = createMarker());\n    this.endNode = ref.endNode;\n    ref.endNode = this.startNode;\n  }\n\n  setValue(value: unknown): void {\n    this.__pendingValue = value;\n  }\n\n  commit() {\n    if (this.startNode.parentNode === null) {\n      return;\n    }\n    while (isDirective(this.__pendingValue)) {\n      const directive = this.__pendingValue;\n      this.__pendingValue = noChange;\n      directive(this);\n    }\n    const value = this.__pendingValue;\n    if (value === noChange) {\n      return;\n    }\n    if (isPrimitive(value)) {\n      if (value !== this.value) {\n        this.__commitText(value);\n      }\n    } else if (value instanceof TemplateResult) {\n      this.__commitTemplateResult(value);\n    } else if (value instanceof Node) {\n      this.__commitNode(value);\n    } else if (isIterable(value)) {\n      this.__commitIterable(value);\n    } else if (value === nothing) {\n      this.value = nothing;\n      this.clear();\n    } else {\n      // Fallback, will render the string representation\n      this.__commitText(value);\n    }\n  }\n\n  private __insert(node: Node) {\n    this.endNode.parentNode!.insertBefore(node, this.endNode);\n  }\n\n  private __commitNode(value: Node): void {\n    if (this.value === value) {\n      return;\n    }\n    this.clear();\n    this.__insert(value);\n    this.value = value;\n  }\n\n  private __commitText(value: unknown): void {\n    const node = this.startNode.nextSibling!;\n    value = value == null ? '' : value;\n    // If `value` isn't already a string, we explicitly convert it here in case\n    // it can't be implicitly converted - i.e. it's a symbol.\n    const valueAsString: string =\n        typeof value === 'string' ? value : String(value);\n    if (node === this.endNode.previousSibling &&\n        node.nodeType === 3 /* Node.TEXT_NODE */) {\n      // If we only have a single text node between the markers, we can just\n      // set its value, rather than replacing it.\n      // TODO(justinfagnani): Can we just check if this.value is primitive?\n      (node as Text).data = valueAsString;\n    } else {\n      this.__commitNode(document.createTextNode(valueAsString));\n    }\n    this.value = value;\n  }\n\n  private __commitTemplateResult(value: TemplateResult): void {\n    const template = this.options.templateFactory(value);\n    if (this.value instanceof TemplateInstance &&\n        this.value.template === template) {\n      this.value.update(value.values);\n    } else {\n      // Make sure we propagate the template processor from the TemplateResult\n      // so that we use its syntax extension, etc. The template factory comes\n      // from the render function options so that it can control template\n      // caching and preprocessing.\n      const instance =\n          new TemplateInstance(template, value.processor, this.options);\n      const fragment = instance._clone();\n      instance.update(value.values);\n      this.__commitNode(fragment);\n      this.value = instance;\n    }\n  }\n\n  private __commitIterable(value: Iterable<unknown>): void {\n    // For an Iterable, we create a new InstancePart per item, then set its\n    // value to the item. This is a little bit of overhead for every item in\n    // an Iterable, but it lets us recurse easily and efficiently update Arrays\n    // of TemplateResults that will be commonly returned from expressions like:\n    // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n\n    // If _value is an array, then the previous render was of an\n    // iterable and _value will contain the NodeParts from the previous\n    // render. If _value is not an array, clear this part and make a new\n    // array for NodeParts.\n    if (!Array.isArray(this.value)) {\n      this.value = [];\n      this.clear();\n    }\n\n    // Lets us keep track of how many items we stamped so we can clear leftover\n    // items from a previous render\n    const itemParts = this.value as NodePart[];\n    let partIndex = 0;\n    let itemPart: NodePart|undefined;\n\n    for (const item of value) {\n      // Try to reuse an existing part\n      itemPart = itemParts[partIndex];\n\n      // If no existing part, create a new one\n      if (itemPart === undefined) {\n        itemPart = new NodePart(this.options);\n        itemParts.push(itemPart);\n        if (partIndex === 0) {\n          itemPart.appendIntoPart(this);\n        } else {\n          itemPart.insertAfterPart(itemParts[partIndex - 1]);\n        }\n      }\n      itemPart.setValue(item);\n      itemPart.commit();\n      partIndex++;\n    }\n\n    if (partIndex < itemParts.length) {\n      // Truncate the parts array so _value reflects the current state\n      itemParts.length = partIndex;\n      this.clear(itemPart && itemPart.endNode);\n    }\n  }\n\n  clear(startNode: Node = this.startNode) {\n    removeNodes(\n        this.startNode.parentNode!, startNode.nextSibling!, this.endNode);\n  }\n}\n\n/**\n * Implements a boolean attribute, roughly as defined in the HTML\n * specification.\n *\n * If the value is truthy, then the attribute is present with a value of\n * ''. If the value is falsey, the attribute is removed.\n */\nexport class BooleanAttributePart implements Part {\n  readonly element: Element;\n  readonly name: string;\n  readonly strings: readonly string[];\n  value: unknown = undefined;\n  private __pendingValue: unknown = undefined;\n\n  constructor(element: Element, name: string, strings: readonly string[]) {\n    if (strings.length !== 2 || strings[0] !== '' || strings[1] !== '') {\n      throw new Error(\n          'Boolean attributes can only contain a single expression');\n    }\n    this.element = element;\n    this.name = name;\n    this.strings = strings;\n  }\n\n  setValue(value: unknown): void {\n    this.__pendingValue = value;\n  }\n\n  commit() {\n    while (isDirective(this.__pendingValue)) {\n      const directive = this.__pendingValue;\n      this.__pendingValue = noChange;\n      directive(this);\n    }\n    if (this.__pendingValue === noChange) {\n      return;\n    }\n    const value = !!this.__pendingValue;\n    if (this.value !== value) {\n      if (value) {\n        this.element.setAttribute(this.name, '');\n      } else {\n        this.element.removeAttribute(this.name);\n      }\n      this.value = value;\n    }\n    this.__pendingValue = noChange;\n  }\n}\n\n/**\n * Sets attribute values for PropertyParts, so that the value is only set once\n * even if there are multiple parts for a property.\n *\n * If an expression controls the whole property value, then the value is simply\n * assigned to the property under control. If there are string literals or\n * multiple expressions, then the strings are expressions are interpolated into\n * a string first.\n */\nexport class PropertyCommitter extends AttributeCommitter {\n  readonly single: boolean;\n\n  constructor(element: Element, name: string, strings: ReadonlyArray<string>) {\n    super(element, name, strings);\n    this.single =\n        (strings.length === 2 && strings[0] === '' && strings[1] === '');\n  }\n\n  protected _createPart(): PropertyPart {\n    return new PropertyPart(this);\n  }\n\n  protected _getValue() {\n    if (this.single) {\n      return this.parts[0].value;\n    }\n    return super._getValue();\n  }\n\n  commit(): void {\n    if (this.dirty) {\n      this.dirty = false;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (this.element as any)[this.name] = this._getValue();\n    }\n  }\n}\n\nexport class PropertyPart extends AttributePart {}\n\n// Detect event listener options support. If the `capture` property is read\n// from the options object, then options are supported. If not, then the third\n// argument to add/removeEventListener is interpreted as the boolean capture\n// value so we should only pass the `capture` property.\nlet eventOptionsSupported = false;\n\n// Wrap into an IIFE because MS Edge <= v41 does not support having try/catch\n// blocks right into the body of a module\n(() => {\n  try {\n    const options = {\n      get capture() {\n        eventOptionsSupported = true;\n        return false;\n      }\n    };\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    window.addEventListener('test', options as any, options);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    window.removeEventListener('test', options as any, options);\n  } catch (_e) {\n    // event options not supported\n  }\n})();\n\ntype EventHandlerWithOptions =\n    EventListenerOrEventListenerObject&Partial<AddEventListenerOptions>;\nexport class EventPart implements Part {\n  readonly element: Element;\n  readonly eventName: string;\n  readonly eventContext?: EventTarget;\n  value: undefined|EventHandlerWithOptions = undefined;\n  private __options?: AddEventListenerOptions;\n  private __pendingValue: undefined|EventHandlerWithOptions = undefined;\n  private readonly __boundHandleEvent: (event: Event) => void;\n\n  constructor(element: Element, eventName: string, eventContext?: EventTarget) {\n    this.element = element;\n    this.eventName = eventName;\n    this.eventContext = eventContext;\n    this.__boundHandleEvent = (e) => this.handleEvent(e);\n  }\n\n  setValue(value: undefined|EventHandlerWithOptions): void {\n    this.__pendingValue = value;\n  }\n\n  commit() {\n    while (isDirective(this.__pendingValue)) {\n      const directive = this.__pendingValue;\n      this.__pendingValue = noChange as EventHandlerWithOptions;\n      directive(this);\n    }\n    if (this.__pendingValue === noChange) {\n      return;\n    }\n\n    const newListener = this.__pendingValue;\n    const oldListener = this.value;\n    const shouldRemoveListener = newListener == null ||\n        oldListener != null &&\n            (newListener.capture !== oldListener.capture ||\n             newListener.once !== oldListener.once ||\n             newListener.passive !== oldListener.passive);\n    const shouldAddListener =\n        newListener != null && (oldListener == null || shouldRemoveListener);\n\n    if (shouldRemoveListener) {\n      this.element.removeEventListener(\n          this.eventName, this.__boundHandleEvent, this.__options);\n    }\n    if (shouldAddListener) {\n      this.__options = getOptions(newListener);\n      this.element.addEventListener(\n          this.eventName, this.__boundHandleEvent, this.__options);\n    }\n    this.value = newListener;\n    this.__pendingValue = noChange as EventHandlerWithOptions;\n  }\n\n  handleEvent(event: Event) {\n    if (typeof this.value === 'function') {\n      this.value.call(this.eventContext || this.element, event);\n    } else {\n      (this.value as EventListenerObject).handleEvent(event);\n    }\n  }\n}\n\n// We copy options because of the inconsistent behavior of browsers when reading\n// the third argument of add/removeEventListener. IE11 doesn't support options\n// at all. Chrome 41 only reads `capture` if the argument is an object.\nconst getOptions = (o: AddEventListenerOptions|undefined) => o &&\n    (eventOptionsSupported ?\n         {capture: o.capture, passive: o.passive, once: o.once} :\n         o.capture as AddEventListenerOptions);\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {removeNodes} from './dom.js';\nimport {NodePart} from './parts.js';\nimport {RenderOptions} from './render-options.js';\nimport {templateFactory} from './template-factory.js';\n\nexport const parts = new WeakMap<Node, NodePart>();\n\n/**\n * Renders a template result or other value to a container.\n *\n * To update a container with new values, reevaluate the template literal and\n * call `render` with the new result.\n *\n * @param result Any value renderable by NodePart - typically a TemplateResult\n *     created by evaluating a template tag like `html` or `svg`.\n * @param container A DOM parent to render to. The entire contents are either\n *     replaced, or efficiently updated if the same result type was previous\n *     rendered there.\n * @param options RenderOptions for the entire render tree rendered to this\n *     container. Render options must *not* change between renders to the same\n *     container, as those changes will not effect previously rendered DOM.\n */\nexport const render =\n    (result: unknown,\n     container: Element|DocumentFragment,\n     options?: Partial<RenderOptions>) => {\n      let part = parts.get(container);\n      if (part === undefined) {\n        removeNodes(container, container.firstChild);\n        parts.set(container, part = new NodePart({\n                               templateFactory,\n                               ...options,\n                             }));\n        part.appendInto(container);\n      }\n      part.setValue(result);\n      part.commit();\n    };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {TemplateResult} from './template-result.js';\nimport {marker, Template} from './template.js';\n\n/**\n * A function type that creates a Template from a TemplateResult.\n *\n * This is a hook into the template-creation process for rendering that\n * requires some modification of templates before they're used, like ShadyCSS,\n * which must add classes to elements and remove styles.\n *\n * Templates should be cached as aggressively as possible, so that many\n * TemplateResults produced from the same expression only do the work of\n * creating the Template the first time.\n *\n * Templates are usually cached by TemplateResult.strings and\n * TemplateResult.type, but may be cached by other keys if this function\n * modifies the template.\n *\n * Note that currently TemplateFactories must not add, remove, or reorder\n * expressions, because there is no way to describe such a modification\n * to render() so that values are interpolated to the correct place in the\n * template instances.\n */\nexport type TemplateFactory = (result: TemplateResult) => Template;\n\n/**\n * The default TemplateFactory which caches Templates keyed on\n * result.type and result.strings.\n */\nexport function templateFactory(result: TemplateResult) {\n  let templateCache = templateCaches.get(result.type);\n  if (templateCache === undefined) {\n    templateCache = {\n      stringsArray: new WeakMap<TemplateStringsArray, Template>(),\n      keyString: new Map<string, Template>()\n    };\n    templateCaches.set(result.type, templateCache);\n  }\n\n  let template = templateCache.stringsArray.get(result.strings);\n  if (template !== undefined) {\n    return template;\n  }\n\n  // If the TemplateStringsArray is new, generate a key from the strings\n  // This key is shared between all templates with identical content\n  const key = result.strings.join(marker);\n\n  // Check if we already have a Template for this key\n  template = templateCache.keyString.get(key);\n  if (template === undefined) {\n    // If we have not seen this key before, create a new Template\n    template = new Template(result, result.getTemplateElement());\n    // Cache the Template for this key\n    templateCache.keyString.set(key, template);\n  }\n\n  // Cache all future queries for this TemplateStringsArray\n  templateCache.stringsArray.set(result.strings, template);\n  return template;\n}\n\n/**\n * The first argument to JS template tags retain identity across multiple\n * calls to a tag for the same literal, so we can cache work done per literal\n * in a Map.\n *\n * Safari currently has a bug which occasionally breaks this behavior, so we\n * need to cache the Template at two levels. We first cache the\n * TemplateStringsArray, and if that fails, we cache a key constructed by\n * joining the strings array.\n */\nexport interface TemplateCache {\n  readonly stringsArray: WeakMap<TemplateStringsArray, Template>;\n  readonly keyString: Map<string, Template>;\n}\n\nexport const templateCaches = new Map<string, TemplateCache>();\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {isCEPolyfill} from './dom.js';\nimport {Part} from './part.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateProcessor} from './template-processor.js';\nimport {isTemplatePartActive, Template, TemplatePart} from './template.js';\n\n/**\n * An instance of a `Template` that can be attached to the DOM and updated\n * with new values.\n */\nexport class TemplateInstance {\n  private readonly __parts: Array<Part|undefined> = [];\n  readonly processor: TemplateProcessor;\n  readonly options: RenderOptions;\n  readonly template: Template;\n\n  constructor(\n      template: Template, processor: TemplateProcessor,\n      options: RenderOptions) {\n    this.template = template;\n    this.processor = processor;\n    this.options = options;\n  }\n\n  update(values: readonly unknown[]) {\n    let i = 0;\n    for (const part of this.__parts) {\n      if (part !== undefined) {\n        part.setValue(values[i]);\n      }\n      i++;\n    }\n    for (const part of this.__parts) {\n      if (part !== undefined) {\n        part.commit();\n      }\n    }\n  }\n\n  _clone(): DocumentFragment {\n    // There are a number of steps in the lifecycle of a template instance's\n    // DOM fragment:\n    //  1. Clone - create the instance fragment\n    //  2. Adopt - adopt into the main document\n    //  3. Process - find part markers and create parts\n    //  4. Upgrade - upgrade custom elements\n    //  5. Update - set node, attribute, property, etc., values\n    //  6. Connect - connect to the document. Optional and outside of this\n    //     method.\n    //\n    // We have a few constraints on the ordering of these steps:\n    //  * We need to upgrade before updating, so that property values will pass\n    //    through any property setters.\n    //  * We would like to process before upgrading so that we're sure that the\n    //    cloned fragment is inert and not disturbed by self-modifying DOM.\n    //  * We want custom elements to upgrade even in disconnected fragments.\n    //\n    // Given these constraints, with full custom elements support we would\n    // prefer the order: Clone, Process, Adopt, Upgrade, Update, Connect\n    //\n    // But Safari does not implement CustomElementRegistry#upgrade, so we\n    // can not implement that order and still have upgrade-before-update and\n    // upgrade disconnected fragments. So we instead sacrifice the\n    // process-before-upgrade constraint, since in Custom Elements v1 elements\n    // must not modify their light DOM in the constructor. We still have issues\n    // when co-existing with CEv0 elements like Polymer 1, and with polyfills\n    // that don't strictly adhere to the no-modification rule because shadow\n    // DOM, which may be created in the constructor, is emulated by being placed\n    // in the light DOM.\n    //\n    // The resulting order is on native is: Clone, Adopt, Upgrade, Process,\n    // Update, Connect. document.importNode() performs Clone, Adopt, and Upgrade\n    // in one step.\n    //\n    // The Custom Elements v1 polyfill supports upgrade(), so the order when\n    // polyfilled is the more ideal: Clone, Process, Adopt, Upgrade, Update,\n    // Connect.\n\n    const fragment = isCEPolyfill ?\n        this.template.element.content.cloneNode(true) as DocumentFragment :\n        document.importNode(this.template.element.content, true);\n\n    const stack: Node[] = [];\n    const parts = this.template.parts;\n    // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n    const walker = document.createTreeWalker(\n        fragment,\n        133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */,\n        null,\n        false);\n    let partIndex = 0;\n    let nodeIndex = 0;\n    let part: TemplatePart;\n    let node = walker.nextNode();\n    // Loop through all the nodes and parts of a template\n    while (partIndex < parts.length) {\n      part = parts[partIndex];\n      if (!isTemplatePartActive(part)) {\n        this.__parts.push(undefined);\n        partIndex++;\n        continue;\n      }\n\n      // Progress the tree walker until we find our next part's node.\n      // Note that multiple parts may share the same node (attribute parts\n      // on a single element), so this loop may not run at all.\n      while (nodeIndex < part.index) {\n        nodeIndex++;\n        if (node!.nodeName === 'TEMPLATE') {\n          stack.push(node!);\n          walker.currentNode = (node as HTMLTemplateElement).content;\n        }\n        if ((node = walker.nextNode()) === null) {\n          // We've exhausted the content inside a nested template element.\n          // Because we still have parts (the outer for-loop), we know:\n          // - There is a template in the stack\n          // - The walker will find a nextNode outside the template\n          walker.currentNode = stack.pop()!;\n          node = walker.nextNode();\n        }\n      }\n\n      // We've arrived at our part's node.\n      if (part.type === 'node') {\n        const part = this.processor.handleTextExpression(this.options);\n        part.insertAfterNode(node!.previousSibling!);\n        this.__parts.push(part);\n      } else {\n        this.__parts.push(...this.processor.handleAttributeExpressions(\n            node as Element, part.name, part.strings, this.options));\n      }\n      partIndex++;\n    }\n\n    if (isCEPolyfill) {\n      document.adoptNode(fragment);\n      customElements.upgrade(fragment);\n    }\n    return fragment;\n  }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {reparentNodes} from './dom.js';\nimport {TemplateProcessor} from './template-processor.js';\nimport {boundAttributeSuffix, lastAttributeNameRegex, marker, nodeMarker} from './template.js';\n\ndeclare const trustedTypes: typeof window.trustedTypes;\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = window.trustedTypes &&\n    trustedTypes!.createPolicy('lit-html', {createHTML: (s) => s});\n\nconst commentMarker = ` ${marker} `;\n\n/**\n * The return type of `html`, which holds a Template and the values from\n * interpolated expressions.\n */\nexport class TemplateResult {\n  readonly strings: TemplateStringsArray;\n  readonly values: readonly unknown[];\n  readonly type: string;\n  readonly processor: TemplateProcessor;\n\n  constructor(\n      strings: TemplateStringsArray, values: readonly unknown[], type: string,\n      processor: TemplateProcessor) {\n    this.strings = strings;\n    this.values = values;\n    this.type = type;\n    this.processor = processor;\n  }\n\n  /**\n   * Returns a string of HTML used to create a `<template>` element.\n   */\n  getHTML(): string {\n    const l = this.strings.length - 1;\n    let html = '';\n    let isCommentBinding = false;\n\n    for (let i = 0; i < l; i++) {\n      const s = this.strings[i];\n      // For each binding we want to determine the kind of marker to insert\n      // into the template source before it's parsed by the browser's HTML\n      // parser. The marker type is based on whether the expression is in an\n      // attribute, text, or comment position.\n      //   * For node-position bindings we insert a comment with the marker\n      //     sentinel as its text content, like <!--{{lit-guid}}-->.\n      //   * For attribute bindings we insert just the marker sentinel for the\n      //     first binding, so that we support unquoted attribute bindings.\n      //     Subsequent bindings can use a comment marker because multi-binding\n      //     attributes must be quoted.\n      //   * For comment bindings we insert just the marker sentinel so we don't\n      //     close the comment.\n      //\n      // The following code scans the template source, but is *not* an HTML\n      // parser. We don't need to track the tree structure of the HTML, only\n      // whether a binding is inside a comment, and if not, if it appears to be\n      // the first binding in an attribute.\n      const commentOpen = s.lastIndexOf('<!--');\n      // We're in comment position if we have a comment open with no following\n      // comment close. Because <-- can appear in an attribute value there can\n      // be false positives.\n      isCommentBinding = (commentOpen > -1 || isCommentBinding) &&\n          s.indexOf('-->', commentOpen + 1) === -1;\n      // Check to see if we have an attribute-like sequence preceding the\n      // expression. This can match \"name=value\" like structures in text,\n      // comments, and attribute values, so there can be false-positives.\n      const attributeMatch = lastAttributeNameRegex.exec(s);\n      if (attributeMatch === null) {\n        // We're only in this branch if we don't have a attribute-like\n        // preceding sequence. For comments, this guards against unusual\n        // attribute values like <div foo=\"<!--${'bar'}\">. Cases like\n        // <!-- foo=${'bar'}--> are handled correctly in the attribute branch\n        // below.\n        html += s + (isCommentBinding ? commentMarker : nodeMarker);\n      } else {\n        // For attributes we use just a marker sentinel, and also append a\n        // $lit$ suffix to the name to opt-out of attribute-specific parsing\n        // that IE and Edge do for style and certain SVG attributes.\n        html += s.substr(0, attributeMatch.index) + attributeMatch[1] +\n            attributeMatch[2] + boundAttributeSuffix + attributeMatch[3] +\n            marker;\n      }\n    }\n    html += this.strings[l];\n    return html;\n  }\n\n  getTemplateElement(): HTMLTemplateElement {\n    const template = document.createElement('template');\n    let value = this.getHTML();\n    if (policy !== undefined) {\n      // this is secure because `this.strings` is a TemplateStringsArray.\n      // TODO: validate this when\n      // https://github.com/tc39/proposal-array-is-template-object is\n      // implemented.\n      value = policy.createHTML(value) as unknown as string;\n    }\n    template.innerHTML = value;\n    return template;\n  }\n}\n\n/**\n * A TemplateResult for SVG fragments.\n *\n * This class wraps HTML in an `<svg>` tag in order to parse its contents in the\n * SVG namespace, then modifies the template to remove the `<svg>` tag so that\n * clones only container the original fragment.\n */\nexport class SVGTemplateResult extends TemplateResult {\n  getHTML(): string {\n    return `<svg>${super.getHTML()}</svg>`;\n  }\n\n  getTemplateElement(): HTMLTemplateElement {\n    const template = super.getTemplateElement();\n    const content = template.content;\n    const svgElement = content.firstChild!;\n    content.removeChild(svgElement);\n    reparentNodes(content, svgElement.firstChild);\n    return template;\n  }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {TemplateResult} from './template-result.js';\n\n/**\n * An expression marker with embedded unique key to avoid collision with\n * possible text in templates.\n */\nexport const marker = `{{lit-${String(Math.random()).slice(2)}}}`;\n\n/**\n * An expression marker used text-positions, multi-binding attributes, and\n * attributes with markup-like text values.\n */\nexport const nodeMarker = `<!--${marker}-->`;\n\nexport const markerRegex = new RegExp(`${marker}|${nodeMarker}`);\n\n/**\n * Suffix appended to all bound attribute names.\n */\nexport const boundAttributeSuffix = '$lit$';\n\n/**\n * An updatable Template that tracks the location of dynamic parts.\n */\nexport class Template {\n  readonly parts: TemplatePart[] = [];\n  readonly element: HTMLTemplateElement;\n\n  constructor(result: TemplateResult, element: HTMLTemplateElement) {\n    this.element = element;\n\n    const nodesToRemove: Node[] = [];\n    const stack: Node[] = [];\n    // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n    const walker = document.createTreeWalker(\n        element.content,\n        133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */,\n        null,\n        false);\n    // Keeps track of the last index associated with a part. We try to delete\n    // unnecessary nodes, but we never want to associate two different parts\n    // to the same index. They must have a constant node between.\n    let lastPartIndex = 0;\n    let index = -1;\n    let partIndex = 0;\n    const {strings, values: {length}} = result;\n    while (partIndex < length) {\n      const node = walker.nextNode() as Element | Comment | Text | null;\n      if (node === null) {\n        // We've exhausted the content inside a nested template element.\n        // Because we still have parts (the outer for-loop), we know:\n        // - There is a template in the stack\n        // - The walker will find a nextNode outside the template\n        walker.currentNode = stack.pop()!;\n        continue;\n      }\n      index++;\n\n      if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {\n        if ((node as Element).hasAttributes()) {\n          const attributes = (node as Element).attributes;\n          const {length} = attributes;\n          // Per\n          // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap,\n          // attributes are not guaranteed to be returned in document order.\n          // In particular, Edge/IE can return them out of order, so we cannot\n          // assume a correspondence between part index and attribute index.\n          let count = 0;\n          for (let i = 0; i < length; i++) {\n            if (endsWith(attributes[i].name, boundAttributeSuffix)) {\n              count++;\n            }\n          }\n          while (count-- > 0) {\n            // Get the template literal section leading up to the first\n            // expression in this attribute\n            const stringForPart = strings[partIndex];\n            // Find the attribute name\n            const name = lastAttributeNameRegex.exec(stringForPart)![2];\n            // Find the corresponding attribute\n            // All bound attributes have had a suffix added in\n            // TemplateResult#getHTML to opt out of special attribute\n            // handling. To look up the attribute value we also need to add\n            // the suffix.\n            const attributeLookupName =\n                name.toLowerCase() + boundAttributeSuffix;\n            const attributeValue =\n                (node as Element).getAttribute(attributeLookupName)!;\n            (node as Element).removeAttribute(attributeLookupName);\n            const statics = attributeValue.split(markerRegex);\n            this.parts.push({type: 'attribute', index, name, strings: statics});\n            partIndex += statics.length - 1;\n          }\n        }\n        if ((node as Element).tagName === 'TEMPLATE') {\n          stack.push(node);\n          walker.currentNode = (node as HTMLTemplateElement).content;\n        }\n      } else if (node.nodeType === 3 /* Node.TEXT_NODE */) {\n        const data = (node as Text).data;\n        if (data.indexOf(marker) >= 0) {\n          const parent = node.parentNode!;\n          const strings = data.split(markerRegex);\n          const lastIndex = strings.length - 1;\n          // Generate a new text node for each literal section\n          // These nodes are also used as the markers for node parts\n          for (let i = 0; i < lastIndex; i++) {\n            let insert: Node;\n            let s = strings[i];\n            if (s === '') {\n              insert = createMarker();\n            } else {\n              const match = lastAttributeNameRegex.exec(s);\n              if (match !== null && endsWith(match[2], boundAttributeSuffix)) {\n                s = s.slice(0, match.index) + match[1] +\n                    match[2].slice(0, -boundAttributeSuffix.length) + match[3];\n              }\n              insert = document.createTextNode(s);\n            }\n            parent.insertBefore(insert, node);\n            this.parts.push({type: 'node', index: ++index});\n          }\n          // If there's no text, we must insert a comment to mark our place.\n          // Else, we can trust it will stick around after cloning.\n          if (strings[lastIndex] === '') {\n            parent.insertBefore(createMarker(), node);\n            nodesToRemove.push(node);\n          } else {\n            (node as Text).data = strings[lastIndex];\n          }\n          // We have a part for each match found\n          partIndex += lastIndex;\n        }\n      } else if (node.nodeType === 8 /* Node.COMMENT_NODE */) {\n        if ((node as Comment).data === marker) {\n          const parent = node.parentNode!;\n          // Add a new marker node to be the startNode of the Part if any of\n          // the following are true:\n          //  * We don't have a previousSibling\n          //  * The previousSibling is already the start of a previous part\n          if (node.previousSibling === null || index === lastPartIndex) {\n            index++;\n            parent.insertBefore(createMarker(), node);\n          }\n          lastPartIndex = index;\n          this.parts.push({type: 'node', index});\n          // If we don't have a nextSibling, keep this node so we have an end.\n          // Else, we can remove it to save future costs.\n          if (node.nextSibling === null) {\n            (node as Comment).data = '';\n          } else {\n            nodesToRemove.push(node);\n            index--;\n          }\n          partIndex++;\n        } else {\n          let i = -1;\n          while ((i = (node as Comment).data.indexOf(marker, i + 1)) !== -1) {\n            // Comment node has a binding marker inside, make an inactive part\n            // The binding won't work, but subsequent bindings will\n            // TODO (justinfagnani): consider whether it's even worth it to\n            // make bindings in comments work\n            this.parts.push({type: 'node', index: -1});\n            partIndex++;\n          }\n        }\n      }\n    }\n\n    // Remove text binding nodes after the walk to not disturb the TreeWalker\n    for (const n of nodesToRemove) {\n      n.parentNode!.removeChild(n);\n    }\n  }\n}\n\nconst endsWith = (str: string, suffix: string): boolean => {\n  const index = str.length - suffix.length;\n  return index >= 0 && str.slice(index) === suffix;\n};\n\n/**\n * A placeholder for a dynamic expression in an HTML template.\n *\n * There are two built-in part types: AttributePart and NodePart. NodeParts\n * always represent a single dynamic expression, while AttributeParts may\n * represent as many expressions are contained in the attribute.\n *\n * A Template's parts are mutable, so parts can be replaced or modified\n * (possibly to implement different template semantics). The contract is that\n * parts can only be replaced, not removed, added or reordered, and parts must\n * always consume the correct number of values in their `update()` method.\n *\n * TODO(justinfagnani): That requirement is a little fragile. A\n * TemplateInstance could instead be more careful about which values it gives\n * to Part.update().\n */\nexport type TemplatePart = {\n  readonly type: 'node'; index: number;\n}|{\n  readonly type: 'attribute';\n  index: number;\n  readonly name: string;\n  readonly strings: ReadonlyArray<string>;\n};\n\nexport const isTemplatePartActive = (part: TemplatePart) => part.index !== -1;\n\n// Allows `document.createComment('')` to be renamed for a\n// small manual size-savings.\nexport const createMarker = () => document.createComment('');\n\n/**\n * This regex extracts the attribute name preceding an attribute-position\n * expression. It does this by matching the syntax allowed for attributes\n * against the string literal directly preceding the expression, assuming that\n * the expression is in an attribute-value position.\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * \" \\x09\\x0a\\x0c\\x0d\" are HTML space characters:\n * https://www.w3.org/TR/html5/infrastructure.html#space-characters\n *\n * \"\\0-\\x1F\\x7F-\\x9F\" are Unicode control characters, which includes every\n * space character except \" \".\n *\n * So an attribute is:\n *  * The name: any character except a control character, space character, ('),\n *    (\"), \">\", \"=\", or \"/\"\n *  * Followed by zero or more space characters\n *  * Followed by \"=\"\n *  * Followed by zero or more space characters\n *  * Followed by:\n *    * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n *    * (\") then any non-(\"), or\n *    * (') then any non-(')\n */\nexport const lastAttributeNameRegex =\n    // eslint-disable-next-line no-control-regex\n    /([ \\x09\\x0a\\x0c\\x0d])([^\\0-\\x1F\\x7F-\\x9F \"'>=/]+)([ \\x09\\x0a\\x0c\\x0d]*=[ \\x09\\x0a\\x0c\\x0d]*(?:[^ \\x09\\x0a\\x0c\\x0d\"'`<>=]*|\"[^\"]*|'[^']*))$/;\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\nimport {Part} from './part.js';\nimport {AttributeCommitter, BooleanAttributePart, EventPart, NodePart, PropertyCommitter} from './parts.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateProcessor} from './template-processor.js';\n\n/**\n * Creates Parts when a template is instantiated.\n */\nexport class DefaultTemplateProcessor implements TemplateProcessor {\n  /**\n   * Create parts for an attribute-position binding, given the event, attribute\n   * name, and string literals.\n   *\n   * @param element The element containing the binding\n   * @param name  The attribute name\n   * @param strings The string literals. There are always at least two strings,\n   *   event for fully-controlled bindings with a single expression.\n   */\n  handleAttributeExpressions(\n      element: Element, name: string, strings: string[],\n      options: RenderOptions): ReadonlyArray<Part> {\n    const prefix = name[0];\n    if (prefix === '.') {\n      const committer = new PropertyCommitter(element, name.slice(1), strings);\n      return committer.parts;\n    }\n    if (prefix === '@') {\n      return [new EventPart(element, name.slice(1), options.eventContext)];\n    }\n    if (prefix === '?') {\n      return [new BooleanAttributePart(element, name.slice(1), strings)];\n    }\n    const committer = new AttributeCommitter(element, name, strings);\n    return committer.parts;\n  }\n  /**\n   * Create parts for a text-position binding.\n   * @param templateFactory\n   */\n  handleTextExpression(options: RenderOptions) {\n    return new NodePart(options);\n  }\n}\n\nexport const defaultTemplateProcessor = new DefaultTemplateProcessor();\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n *\n * Main lit-html module.\n *\n * Main exports:\n *\n * -  [[html]]\n * -  [[svg]]\n * -  [[render]]\n *\n * @packageDocumentation\n */\n\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\nimport {defaultTemplateProcessor} from './lib/default-template-processor.js';\nimport {SVGTemplateResult, TemplateResult} from './lib/template-result.js';\n\nexport {DefaultTemplateProcessor, defaultTemplateProcessor} from './lib/default-template-processor.js';\nexport {directive, DirectiveFn, isDirective} from './lib/directive.js';\n// TODO(justinfagnani): remove line when we get NodePart moving methods\nexport {removeNodes, reparentNodes} from './lib/dom.js';\nexport {noChange, nothing, Part} from './lib/part.js';\nexport {AttributeCommitter, AttributePart, BooleanAttributePart, EventPart, isIterable, isPrimitive, NodePart, PropertyCommitter, PropertyPart} from './lib/parts.js';\nexport {RenderOptions} from './lib/render-options.js';\nexport {parts, render} from './lib/render.js';\nexport {templateCaches, templateFactory} from './lib/template-factory.js';\nexport {TemplateInstance} from './lib/template-instance.js';\nexport {TemplateProcessor} from './lib/template-processor.js';\nexport {SVGTemplateResult, TemplateResult} from './lib/template-result.js';\nexport {createMarker, isTemplatePartActive, Template} from './lib/template.js';\n\ndeclare global {\n  interface Window {\n    litHtmlVersions: string[];\n  }\n}\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n// TODO(justinfagnani): inject version number at build time\nif (typeof window !== 'undefined') {\n  (window['litHtmlVersions'] || (window['litHtmlVersions'] = [])).push('1.4.1');\n}\n\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n */\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]) =>\n    new TemplateResult(strings, values, 'html', defaultTemplateProcessor);\n\n/**\n * Interprets a template literal as an SVG template that can efficiently\n * render to and update a container.\n */\nexport const svg = (strings: TemplateStringsArray, ...values: unknown[]) =>\n    new SVGTemplateResult(strings, values, 'svg', defaultTemplateProcessor);\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport {Constructor, ClassDescriptor} from './base.js';\n\n/**\n * Allow for custom element classes with private constructors\n */\ntype CustomElementClass = Omit<typeof HTMLElement, 'new'>;\n\nconst legacyCustomElement = (tagName: string, clazz: CustomElementClass) => {\n  customElements.define(tagName, clazz as CustomElementConstructor);\n  // Cast as any because TS doesn't recognize the return type as being a\n  // subtype of the decorated class when clazz is typed as\n  // `Constructor<HTMLElement>` for some reason.\n  // `Constructor<HTMLElement>` is helpful to make sure the decorator is\n  // applied to elements however.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return clazz as any;\n};\n\nconst standardCustomElement = (\n  tagName: string,\n  descriptor: ClassDescriptor\n) => {\n  const {kind, elements} = descriptor;\n  return {\n    kind,\n    elements,\n    // This callback is called once the class is otherwise fully defined\n    finisher(clazz: Constructor<HTMLElement>) {\n      customElements.define(tagName, clazz);\n    },\n  };\n};\n\n/**\n * Class decorator factory that defines the decorated class as a custom element.\n *\n * ```js\n * @customElement('my-element')\n * class MyElement extends LitElement {\n *   render() {\n *     return html``;\n *   }\n * }\n * ```\n * @category Decorator\n * @param tagName The tag name of the custom element to define.\n */\nexport const customElement =\n  (tagName: string) =>\n  (classOrDescriptor: CustomElementClass | ClassDescriptor) =>\n    typeof classOrDescriptor === 'function'\n      ? legacyCustomElement(tagName, classOrDescriptor)\n      : standardCustomElement(tagName, classOrDescriptor as ClassDescriptor);\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport {PropertyDeclaration, ReactiveElement} from '../reactive-element.js';\nimport {ClassElement} from './base.js';\n\nconst standardProperty = (\n  options: PropertyDeclaration,\n  element: ClassElement\n) => {\n  // When decorating an accessor, pass it through and add property metadata.\n  // Note, the `hasOwnProperty` check in `createProperty` ensures we don't\n  // stomp over the user's accessor.\n  if (\n    element.kind === 'method' &&\n    element.descriptor &&\n    !('value' in element.descriptor)\n  ) {\n    return {\n      ...element,\n      finisher(clazz: typeof ReactiveElement) {\n        clazz.createProperty(element.key, options);\n      },\n    };\n  } else {\n    // createProperty() takes care of defining the property, but we still\n    // must return some kind of descriptor, so return a descriptor for an\n    // unused prototype field. The finisher calls createProperty().\n    return {\n      kind: 'field',\n      key: Symbol(),\n      placement: 'own',\n      descriptor: {},\n      // store the original key so subsequent decorators have access to it.\n      originalKey: element.key,\n      // When @babel/plugin-proposal-decorators implements initializers,\n      // do this instead of the initializer below. See:\n      // https://github.com/babel/babel/issues/9260 extras: [\n      //   {\n      //     kind: 'initializer',\n      //     placement: 'own',\n      //     initializer: descriptor.initializer,\n      //   }\n      // ],\n      initializer(this: {[key: string]: unknown}) {\n        if (typeof element.initializer === 'function') {\n          this[element.key as string] = element.initializer.call(this);\n        }\n      },\n      finisher(clazz: typeof ReactiveElement) {\n        clazz.createProperty(element.key, options);\n      },\n    };\n  }\n};\n\nconst legacyProperty = (\n  options: PropertyDeclaration,\n  proto: Object,\n  name: PropertyKey\n) => {\n  (proto.constructor as typeof ReactiveElement).createProperty(name, options);\n};\n\n/**\n * A property decorator which creates a reactive property that reflects a\n * corresponding attribute value. When a decorated property is set\n * the element will update and render. A {@linkcode PropertyDeclaration} may\n * optionally be supplied to configure property features.\n *\n * This decorator should only be used for public fields. As public fields,\n * properties should be considered as primarily settable by element users,\n * either via attribute or the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the {@linkcode state} decorator.\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating public\n * properties should typically not be done for non-primitive (object or array)\n * properties. In other cases when an element needs to manage state, a private\n * property decorated via the {@linkcode state} decorator should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n *\n * ```ts\n * class MyElement {\n *   @property({ type: Boolean })\n *   clicked = false;\n * }\n * ```\n * @category Decorator\n * @ExportDecoratedItems\n */\nexport function property(options?: PropertyDeclaration) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return (protoOrDescriptor: Object | ClassElement, name?: PropertyKey): any =>\n    name !== undefined\n      ? legacyProperty(options!, protoOrDescriptor as Object, name)\n      : standardProperty(options!, protoOrDescriptor as ClassElement);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\n\nimport {property} from './property.js';\n\nexport interface InternalPropertyDeclaration<Type = unknown> {\n  /**\n   * A function that indicates if a property should be considered changed when\n   * it is set. The function should take the `newValue` and `oldValue` and\n   * return `true` if an update should be requested.\n   */\n  hasChanged?(value: Type, oldValue: Type): boolean;\n}\n\n/**\n * Declares a private or protected reactive property that still triggers\n * updates to the element when it changes. It does not reflect from the\n * corresponding attribute.\n *\n * Properties declared this way must not be used from HTML or HTML templating\n * systems, they're solely for properties internal to the element. These\n * properties may be renamed by optimization tools like closure compiler.\n * @category Decorator\n */\nexport function state(options?: InternalPropertyDeclaration) {\n  return property({\n    ...options,\n    state: true,\n  });\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {ReactiveElement} from '../reactive-element.js';\n\n/**\n * Generates a public interface type that removes private and protected fields.\n * This allows accepting otherwise compatible versions of the type (e.g. from\n * multiple copies of the same package in `node_modules`).\n */\nexport type Interface<T> = {\n  [K in keyof T]: T[K];\n};\n\nexport type Constructor<T> = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  new (...args: any[]): T;\n};\n\n// From the TC39 Decorators proposal\nexport interface ClassDescriptor {\n  kind: 'class';\n  elements: ClassElement[];\n  finisher?: <T>(clazz: Constructor<T>) => void | Constructor<T>;\n}\n\n// From the TC39 Decorators proposal\nexport interface ClassElement {\n  kind: 'field' | 'method';\n  key: PropertyKey;\n  placement: 'static' | 'prototype' | 'own';\n  initializer?: Function;\n  extras?: ClassElement[];\n  finisher?: <T>(clazz: Constructor<T>) => void | Constructor<T>;\n  descriptor?: PropertyDescriptor;\n}\n\nexport const legacyPrototypeMethod = (\n  descriptor: PropertyDescriptor,\n  proto: Object,\n  name: PropertyKey\n) => {\n  Object.defineProperty(proto, name, descriptor);\n};\n\nexport const standardPrototypeMethod = (\n  descriptor: PropertyDescriptor,\n  element: ClassElement\n) => ({\n  kind: 'method',\n  placement: 'prototype',\n  key: element.key,\n  descriptor,\n});\n\n/**\n * Helper for decorating a property that is compatible with both TypeScript\n * and Babel decorators. The optional `finisher` can be used to perform work on\n * the class. The optional `descriptor` should return a PropertyDescriptor\n * to install for the given property.\n *\n * @param finisher {function} Optional finisher method; receives the element\n * constructor and property key as arguments and has no return value.\n * @param descriptor {function} Optional descriptor method; receives the\n * property key as an argument and returns a property descriptor to define for\n * the given property.\n * @returns {ClassElement|void}\n */\nexport const decorateProperty =\n  ({\n    finisher,\n    descriptor,\n  }: {\n    finisher?:\n      | ((ctor: typeof ReactiveElement, property: PropertyKey) => void)\n      | null;\n    descriptor?: (property: PropertyKey) => PropertyDescriptor;\n  }) =>\n  (\n    protoOrDescriptor: Interface<ReactiveElement> | ClassElement,\n    name?: PropertyKey\n    // Note TypeScript requires the return type to be `void|any`\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): void | any => {\n    // TypeScript / Babel legacy mode\n    if (name !== undefined) {\n      const ctor = (protoOrDescriptor as ReactiveElement)\n        .constructor as typeof ReactiveElement;\n      if (descriptor !== undefined) {\n        Object.defineProperty(protoOrDescriptor, name, descriptor(name));\n      }\n      finisher?.(ctor, name!);\n      // Babel standard mode\n    } else {\n      // Note, the @property decorator saves `key` as `originalKey`\n      // so try to use it here.\n      const key =\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (protoOrDescriptor as any).originalKey ??\n        (protoOrDescriptor as ClassElement).key;\n      const info: ClassElement =\n        descriptor != undefined\n          ? {\n              kind: 'method',\n              placement: 'prototype',\n              key,\n              descriptor: descriptor((protoOrDescriptor as ClassElement).key),\n            }\n          : {...(protoOrDescriptor as ClassElement), key};\n      if (finisher != undefined) {\n        info.finisher = function <ReactiveElement>(\n          ctor: Constructor<ReactiveElement>\n        ) {\n          finisher(ctor as unknown as typeof ReactiveElement, key);\n        };\n      }\n      return info;\n    }\n  };\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\n\nimport {ReactiveElement} from '../reactive-element.js';\nimport {decorateProperty} from './base.js';\n\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n * @param cache An optional boolean which when true performs the DOM query only\n *     once and caches the result.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * ```ts\n * class MyElement {\n *   @query('#first')\n *   first: HTMLDivElement;\n *\n *   render() {\n *     return html`\n *       <div id=\"first\"></div>\n *       <div id=\"second\"></div>\n *     `;\n *   }\n * }\n * ```\n * @category Decorator\n */\nexport function query(selector: string, cache?: boolean) {\n  return decorateProperty({\n    descriptor: (name: PropertyKey) => {\n      const descriptor = {\n        get(this: ReactiveElement) {\n          return this.renderRoot?.querySelector(selector) ?? null;\n        },\n        enumerable: true,\n        configurable: true,\n      };\n      if (cache) {\n        const key = typeof name === 'symbol' ? Symbol() : `__${name}`;\n        descriptor.get = function (this: ReactiveElement) {\n          if (\n            (this as unknown as {[key: string]: Element | null})[\n              key as string\n            ] === undefined\n          ) {\n            (this as unknown as {[key: string]: Element | null})[\n              key as string\n            ] = this.renderRoot?.querySelector(selector) ?? null;\n          }\n          return (this as unknown as {[key: string]: Element | null})[\n            key as string\n          ];\n        };\n      }\n      return descriptor;\n    },\n  });\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\n\nimport {decorateProperty} from './base.js';\n\nimport type {ReactiveElement} from '../reactive-element.js';\nimport type {QueryAssignedNodesOptions} from './query-assigned-nodes.js';\n\nconst NODE_MODE = false;\nconst global = NODE_MODE ? globalThis : window;\n\n/**\n * A tiny module scoped polyfill for HTMLSlotElement.assignedElements.\n */\nconst slotAssignedElements =\n  global.HTMLSlotElement?.prototype.assignedElements != null\n    ? (slot: HTMLSlotElement, opts?: AssignedNodesOptions) =>\n        slot.assignedElements(opts)\n    : (slot: HTMLSlotElement, opts?: AssignedNodesOptions) =>\n        slot\n          .assignedNodes(opts)\n          .filter(\n            (node): node is Element => node.nodeType === Node.ELEMENT_NODE\n          );\n\n/**\n * Options for the {@linkcode queryAssignedElements} decorator. Extends the\n * options that can be passed into\n * [HTMLSlotElement.assignedElements](https://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement/assignedElements).\n */\nexport interface QueryAssignedElementsOptions\n  extends QueryAssignedNodesOptions {\n  /**\n   * CSS selector used to filter the elements returned. For example, a selector\n   * of `\".item\"` will only include elements with the `item` class.\n   */\n  selector?: string;\n}\n\n/**\n * A property decorator that converts a class property into a getter that\n * returns the `assignedElements` of the given `slot`. Provides a declarative\n * way to use\n * [`HTMLSlotElement.assignedElements`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement/assignedElements).\n *\n * Can be passed an optional {@linkcode QueryAssignedElementsOptions} object.\n *\n * Example usage:\n * ```ts\n * class MyElement {\n *   @queryAssignedElements({ slot: 'list' })\n *   listItems!: Array<HTMLElement>;\n *   @queryAssignedElements()\n *   unnamedSlotEls!: Array<HTMLElement>;\n *\n *   render() {\n *     return html`\n *       <slot name=\"list\"></slot>\n *       <slot></slot>\n *     `;\n *   }\n * }\n * ```\n *\n * Note, the type of this property should be annotated as `Array<HTMLElement>`.\n *\n * @category Decorator\n */\nexport function queryAssignedElements(options?: QueryAssignedElementsOptions) {\n  const {slot, selector} = options ?? {};\n  return decorateProperty({\n    descriptor: (_name: PropertyKey) => ({\n      get(this: ReactiveElement) {\n        const slotSelector = `slot${slot ? `[name=${slot}]` : ':not([name])'}`;\n        const slotEl =\n          this.renderRoot?.querySelector<HTMLSlotElement>(slotSelector);\n        const elements =\n          slotEl != null ? slotAssignedElements(slotEl, options) : [];\n        if (selector) {\n          return elements.filter((node) => node.matches(selector));\n        }\n        return elements;\n      },\n      enumerable: true,\n      configurable: true,\n    }),\n  });\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {nothing} from '../lit-html.js';\n\n/**\n * For AttributeParts, sets the attribute if the value is defined and removes\n * the attribute if the value is undefined.\n *\n * For other part types, this directive is a no-op.\n */\nexport const ifDefined = <T>(value: T) => value ?? nothing;\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nconst NODE_MODE = false;\nconst global = NODE_MODE ? globalThis : window;\n\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets: boolean =\n  global.ShadowRoot &&\n  (global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&\n  'adoptedStyleSheets' in Document.prototype &&\n  'replace' in CSSStyleSheet.prototype;\n\n/**\n * A CSSResult or native CSSStyleSheet.\n *\n * In browsers that support constructible CSS style sheets, CSSStyleSheet\n * object can be used for styling along side CSSResult from the `css`\n * template tag.\n */\nexport type CSSResultOrNative = CSSResult | CSSStyleSheet;\n\nexport type CSSResultArray = Array<CSSResultOrNative | CSSResultArray>;\n\n/**\n * A single CSSResult, CSSStyleSheet, or an array or nested arrays of those.\n */\nexport type CSSResultGroup = CSSResultOrNative | CSSResultArray;\n\nconst constructionToken = Symbol();\n\nconst cssTagCache = new WeakMap<TemplateStringsArray, CSSStyleSheet>();\n\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n  // This property needs to remain unminified.\n  ['_$cssResult$'] = true;\n  readonly cssText: string;\n  private _styleSheet?: CSSStyleSheet;\n  private _strings: TemplateStringsArray | undefined;\n\n  private constructor(\n    cssText: string,\n    strings: TemplateStringsArray | undefined,\n    safeToken: symbol\n  ) {\n    if (safeToken !== constructionToken) {\n      throw new Error(\n        'CSSResult is not constructable. Use `unsafeCSS` or `css` instead.'\n      );\n    }\n    this.cssText = cssText;\n    this._strings = strings;\n  }\n\n  // This is a getter so that it's lazy. In practice, this means stylesheets\n  // are not created until the first element instance is made.\n  get styleSheet(): CSSStyleSheet | undefined {\n    // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n    // constructable.\n    let styleSheet = this._styleSheet;\n    const strings = this._strings;\n    if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n      const cacheable = strings !== undefined && strings.length === 1;\n      if (cacheable) {\n        styleSheet = cssTagCache.get(strings);\n      }\n      if (styleSheet === undefined) {\n        (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(\n          this.cssText\n        );\n        if (cacheable) {\n          cssTagCache.set(strings, styleSheet);\n        }\n      }\n    }\n    return styleSheet;\n  }\n\n  toString(): string {\n    return this.cssText;\n  }\n}\n\ntype ConstructableCSSResult = CSSResult & {\n  new (\n    cssText: string,\n    strings: TemplateStringsArray | undefined,\n    safeToken: symbol\n  ): CSSResult;\n};\n\nconst textFromCSSResult = (value: CSSResultGroup | number) => {\n  // This property needs to remain unminified.\n  if ((value as CSSResult)['_$cssResult$'] === true) {\n    return (value as CSSResult).cssText;\n  } else if (typeof value === 'number') {\n    return value;\n  } else {\n    throw new Error(\n      `Value passed to 'css' function must be a 'css' function result: ` +\n        `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n        `to ensure page security.`\n    );\n  }\n};\n\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value: unknown) =>\n  new (CSSResult as ConstructableCSSResult)(\n    typeof value === 'string' ? value : String(value),\n    undefined,\n    constructionToken\n  );\n\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (\n  strings: TemplateStringsArray,\n  ...values: (CSSResultGroup | number)[]\n): CSSResult => {\n  const cssText =\n    strings.length === 1\n      ? strings[0]\n      : values.reduce(\n          (acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1],\n          strings[0]\n        );\n  return new (CSSResult as ConstructableCSSResult)(\n    cssText,\n    strings,\n    constructionToken\n  );\n};\n\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (\n  renderRoot: ShadowRoot,\n  styles: Array<CSSResultOrNative>\n) => {\n  if (supportsAdoptingStyleSheets) {\n    (renderRoot as ShadowRoot).adoptedStyleSheets = styles.map((s) =>\n      s instanceof CSSStyleSheet ? s : s.styleSheet!\n    );\n  } else {\n    styles.forEach((s) => {\n      const style = document.createElement('style');\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const nonce = (global as any)['litNonce'];\n      if (nonce !== undefined) {\n        style.setAttribute('nonce', nonce);\n      }\n      style.textContent = (s as CSSResult).cssText;\n      renderRoot.appendChild(style);\n    });\n  }\n};\n\nconst cssResultFromStyleSheet = (sheet: CSSStyleSheet) => {\n  let cssText = '';\n  for (const rule of sheet.cssRules) {\n    cssText += rule.cssText;\n  }\n  return unsafeCSS(cssText);\n};\n\nexport const getCompatibleStyle =\n  supportsAdoptingStyleSheets ||\n  (NODE_MODE && global.CSSStyleSheet === undefined)\n    ? (s: CSSResultOrNative) => s\n    : (s: CSSResultOrNative) =>\n        s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\n\nimport {\n  getCompatibleStyle,\n  adoptStyles,\n  CSSResultGroup,\n  CSSResultOrNative,\n} from './css-tag.js';\nimport type {\n  ReactiveController,\n  ReactiveControllerHost,\n} from './reactive-controller.js';\n\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\n\nexport * from './css-tag.js';\nexport type {\n  ReactiveController,\n  ReactiveControllerHost,\n} from './reactive-controller.js';\n\nconst NODE_MODE = false;\nconst global = NODE_MODE ? globalThis : window;\n\nif (NODE_MODE) {\n  global.customElements ??= customElements;\n}\n\nconst DEV_MODE = true;\n\nlet requestUpdateThenable: (name: string) => {\n  then: (\n    onfulfilled?: (value: boolean) => void,\n    _onrejected?: () => void\n  ) => void;\n};\n\nlet issueWarning: (code: string, warning: string) => void;\n\nconst trustedTypes = (global as unknown as {trustedTypes?: {emptyScript: ''}})\n  .trustedTypes;\n\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n  ? (trustedTypes.emptyScript as unknown as '')\n  : '';\n\nconst polyfillSupport = DEV_MODE\n  ? global.reactiveElementPolyfillSupportDevMode\n  : global.reactiveElementPolyfillSupport;\n\nif (DEV_MODE) {\n  // Ensure warnings are issued only 1x, even if multiple versions of Lit\n  // are loaded.\n  const issuedWarnings: Set<string | undefined> = (global.litIssuedWarnings ??=\n    new Set());\n\n  // Issue a warning, if we haven't already.\n  issueWarning = (code: string, warning: string) => {\n    warning += ` See https://lit.dev/msg/${code} for more information.`;\n    if (!issuedWarnings.has(warning)) {\n      console.warn(warning);\n      issuedWarnings.add(warning);\n    }\n  };\n\n  issueWarning(\n    'dev-mode',\n    `Lit is in dev mode. Not recommended for production!`\n  );\n\n  // Issue polyfill support warning.\n  if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n    issueWarning(\n      'polyfill-support-missing',\n      `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n        `the \\`polyfill-support\\` module has not been loaded.`\n    );\n  }\n\n  requestUpdateThenable = (name) => ({\n    then: (\n      onfulfilled?: (value: boolean) => void,\n      _onrejected?: () => void\n    ) => {\n      issueWarning(\n        'request-update-promise',\n        `The \\`requestUpdate\\` method should no longer return a Promise but ` +\n          `does so on \\`${name}\\`. Use \\`updateComplete\\` instead.`\n      );\n      if (onfulfilled !== undefined) {\n        onfulfilled(false);\n      }\n    },\n  });\n}\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ReactiveUnstable {\n  /**\n   * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n   * we will emit 'lit-debug' events to window, with live details about the update and render\n   * lifecycle. These can be useful for writing debug tooling and visualizations.\n   *\n   * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n   * making certain operations that are normally very cheap (like a no-op render) much slower,\n   * because we must copy data and dispatch events.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  export namespace DebugLog {\n    export type Entry = Update;\n    export interface Update {\n      kind: 'update';\n    }\n  }\n}\n\ninterface DebugLoggingWindow {\n  // Even in dev mode, we generally don't want to emit these events, as that's\n  // another level of cost, so only emit them when DEV_MODE is true _and_ when\n  // window.emitLitDebugEvents is true.\n  emitLitDebugLogEvents?: boolean;\n}\n\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n  ? (event: ReactiveUnstable.DebugLog.Entry) => {\n      const shouldEmit = (global as unknown as DebugLoggingWindow)\n        .emitLitDebugLogEvents;\n      if (!shouldEmit) {\n        return;\n      }\n      global.dispatchEvent(\n        new CustomEvent<ReactiveUnstable.DebugLog.Entry>('lit-debug', {\n          detail: event,\n        })\n      );\n    }\n  : undefined;\n\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = <P extends PropertyKey>(\n  prop: P,\n  _obj: unknown\n): P => prop;\n\n/**\n * Converts property values to and from attribute values.\n */\nexport interface ComplexAttributeConverter<Type = unknown, TypeHint = unknown> {\n  /**\n   * Called to convert an attribute value to a property\n   * value.\n   */\n  fromAttribute?(value: string | null, type?: TypeHint): Type;\n\n  /**\n   * Called to convert a property value to an attribute\n   * value.\n   *\n   * It returns unknown instead of string, to be compatible with\n   * https://github.com/WICG/trusted-types (and similar efforts).\n   */\n  toAttribute?(value: Type, type?: TypeHint): unknown;\n}\n\ntype AttributeConverter<Type = unknown, TypeHint = unknown> =\n  | ComplexAttributeConverter<Type>\n  | ((value: string | null, type?: TypeHint) => Type);\n\n/**\n * Defines options for a property accessor.\n */\nexport interface PropertyDeclaration<Type = unknown, TypeHint = unknown> {\n  /**\n   * When set to `true`, indicates the property is internal private state. The\n   * property should not be set by users. When using TypeScript, this property\n   * should be marked as `private` or `protected`, and it is also a common\n   * practice to use a leading `_` in the name. The property is not added to\n   * `observedAttributes`.\n   */\n  readonly state?: boolean;\n\n  /**\n   * Indicates how and whether the property becomes an observed attribute.\n   * If the value is `false`, the property is not added to `observedAttributes`.\n   * If true or absent, the lowercased property name is observed (e.g. `fooBar`\n   * becomes `foobar`). If a string, the string value is observed (e.g\n   * `attribute: 'foo-bar'`).\n   */\n  readonly attribute?: boolean | string;\n\n  /**\n   * Indicates the type of the property. This is used only as a hint for the\n   * `converter` to determine how to convert the attribute\n   * to/from a property.\n   */\n  readonly type?: TypeHint;\n\n  /**\n   * Indicates how to convert the attribute to/from a property. If this value\n   * is a function, it is used to convert the attribute value a the property\n   * value. If it's an object, it can have keys for `fromAttribute` and\n   * `toAttribute`. If no `toAttribute` function is provided and\n   * `reflect` is set to `true`, the property value is set directly to the\n   * attribute. A default `converter` is used if none is provided; it supports\n   * `Boolean`, `String`, `Number`, `Object`, and `Array`. Note,\n   * when a property changes and the converter is used to update the attribute,\n   * the property is never updated again as a result of the attribute changing,\n   * and vice versa.\n   */\n  readonly converter?: AttributeConverter<Type, TypeHint>;\n\n  /**\n   * Indicates if the property should reflect to an attribute.\n   * If `true`, when the property is set, the attribute is set using the\n   * attribute name determined according to the rules for the `attribute`\n   * property option and the value of the property converted using the rules\n   * from the `converter` property option.\n   */\n  readonly reflect?: boolean;\n\n  /**\n   * A function that indicates if a property should be considered changed when\n   * it is set. The function should take the `newValue` and `oldValue` and\n   * return `true` if an update should be requested.\n   */\n  hasChanged?(value: Type, oldValue: Type): boolean;\n\n  /**\n   * Indicates whether an accessor will be created for this property. By\n   * default, an accessor will be generated for this property that requests an\n   * update when set. If this flag is `true`, no accessor will be created, and\n   * it will be the user's responsibility to call\n   * `this.requestUpdate(propertyName, oldValue)` to request an update when\n   * the property changes.\n   */\n  readonly noAccessor?: boolean;\n}\n\n/**\n * Map of properties to PropertyDeclaration options. For each property an\n * accessor is made, and the property is processed according to the\n * PropertyDeclaration options.\n */\nexport interface PropertyDeclarations {\n  readonly [key: string]: PropertyDeclaration;\n}\n\ntype PropertyDeclarationMap = Map<PropertyKey, PropertyDeclaration>;\n\ntype AttributeMap = Map<string, PropertyKey>;\n\n/**\n * A Map of property keys to values.\n *\n * Takes an optional type parameter T, which when specified as a non-any,\n * non-unknown type, will make the Map more strongly-typed, associating the map\n * keys with their corresponding value type on T.\n *\n * Use `PropertyValues<this>` when overriding ReactiveElement.update() and\n * other lifecycle methods in order to get stronger type-checking on keys\n * and values.\n */\n// This type is conditional so that if the parameter T is not specified, or\n// is `any`, the type will include `Map<PropertyKey, unknown>`. Since T is not\n// given in the uses of PropertyValues in this file, all uses here fallback to\n// meaning `Map<PropertyKey, unknown>`, but if a developer uses\n// `PropertyValues<this>` (or any other value for T) they will get a\n// strongly-typed Map type.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PropertyValues<T = any> = T extends object\n  ? PropertyValueMap<T>\n  : Map<PropertyKey, unknown>;\n\n/**\n * Do not use, instead prefer {@linkcode PropertyValues}.\n */\n// This type must be exported such that JavaScript generated by the Google\n// Closure Compiler can import a type reference.\nexport interface PropertyValueMap<T> extends Map<PropertyKey, unknown> {\n  get<K extends keyof T>(k: K): T[K];\n  set<K extends keyof T>(key: K, value: T[K]): this;\n  has<K extends keyof T>(k: K): boolean;\n  delete<K extends keyof T>(k: K): boolean;\n}\n\nexport const defaultConverter: ComplexAttributeConverter = {\n  toAttribute(value: unknown, type?: unknown): unknown {\n    switch (type) {\n      case Boolean:\n        value = value ? emptyStringForBooleanAttribute : null;\n        break;\n      case Object:\n      case Array:\n        // if the value is `null` or `undefined` pass this through\n        // to allow removing/no change behavior.\n        value = value == null ? value : JSON.stringify(value);\n        break;\n    }\n    return value;\n  },\n\n  fromAttribute(value: string | null, type?: unknown) {\n    let fromValue: unknown = value;\n    switch (type) {\n      case Boolean:\n        fromValue = value !== null;\n        break;\n      case Number:\n        fromValue = value === null ? null : Number(value);\n        break;\n      case Object:\n      case Array:\n        // Do *not* generate exception when invalid JSON is set as elements\n        // don't normally complain on being mis-configured.\n        // TODO(sorvell): Do generate exception in *dev mode*.\n        try {\n          // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n          fromValue = JSON.parse(value!) as unknown;\n        } catch (e) {\n          fromValue = null;\n        }\n        break;\n    }\n    return fromValue;\n  },\n};\n\nexport interface HasChanged {\n  (value: unknown, old: unknown): boolean;\n}\n\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual: HasChanged = (value: unknown, old: unknown): boolean => {\n  // This ensures (old==NaN, value==NaN) always returns false\n  return old !== value && (old === old || value === value);\n};\n\nconst defaultPropertyDeclaration: PropertyDeclaration = {\n  attribute: true,\n  type: String,\n  converter: defaultConverter,\n  reflect: false,\n  hasChanged: notEqual,\n};\n\n/**\n * The Closure JS Compiler doesn't currently have good support for static\n * property semantics where \"this\" is dynamic (e.g.\n * https://github.com/google/closure-compiler/issues/3177 and others) so we use\n * this hack to bypass any rewriting by the compiler.\n */\nconst finalized = 'finalized';\n\n/**\n * A string representing one of the supported dev mode warning categories.\n */\nexport type WarningKind = 'change-in-update' | 'migration';\n\nexport type Initializer = (element: ReactiveElement) => void;\n\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclassers to render updates as desired.\n * @noInheritDoc\n */\nexport abstract class ReactiveElement\n  // In the Node build, this `extends` clause will be substituted with\n  // `(globalThis.HTMLElement ?? HTMLElement)`.\n  //\n  // This way, we will first prefer any global `HTMLElement` polyfill that the\n  // user has assigned, and then fall back to the `HTMLElement` shim which has\n  // been imported (see note at the top of this file about how this import is\n  // generated by Rollup). Note that the `HTMLElement` variable has been\n  // shadowed by this import, so it no longer refers to the global.\n  extends HTMLElement\n  implements ReactiveControllerHost\n{\n  // Note: these are patched in only in DEV_MODE.\n  /**\n   * Read or set all the enabled warning categories for this class.\n   *\n   * This property is only used in development builds.\n   *\n   * @nocollapse\n   * @category dev-mode\n   */\n  static enabledWarnings?: WarningKind[];\n\n  /**\n   * Enable the given warning category for this class.\n   *\n   * This method only exists in development builds, so it should be accessed\n   * with a guard like:\n   *\n   * ```ts\n   * // Enable for all ReactiveElement subclasses\n   * ReactiveElement.enableWarning?.('migration');\n   *\n   * // Enable for only MyElement and subclasses\n   * MyElement.enableWarning?.('migration');\n   * ```\n   *\n   * @nocollapse\n   * @category dev-mode\n   */\n  static enableWarning?: (warningKind: WarningKind) => void;\n\n  /**\n   * Disable the given warning category for this class.\n   *\n   * This method only exists in development builds, so it should be accessed\n   * with a guard like:\n   *\n   * ```ts\n   * // Disable for all ReactiveElement subclasses\n   * ReactiveElement.disableWarning?.('migration');\n   *\n   * // Disable for only MyElement and subclasses\n   * MyElement.disableWarning?.('migration');\n   * ```\n   *\n   * @nocollapse\n   * @category dev-mode\n   */\n  static disableWarning?: (warningKind: WarningKind) => void;\n\n  /**\n   * Adds an initializer function to the class that is called during instance\n   * construction.\n   *\n   * This is useful for code that runs against a `ReactiveElement`\n   * subclass, such as a decorator, that needs to do work for each\n   * instance, such as setting up a `ReactiveController`.\n   *\n   * ```ts\n   * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n   *   target.addInitializer((instance: ReactiveElement) => {\n   *     // This is run during construction of the element\n   *     new MyController(instance);\n   *   });\n   * }\n   * ```\n   *\n   * Decorating a field will then cause each instance to run an initializer\n   * that adds a controller:\n   *\n   * ```ts\n   * class MyElement extends LitElement {\n   *   @myDecorator foo;\n   * }\n   * ```\n   *\n   * Initializers are stored per-constructor. Adding an initializer to a\n   * subclass does not add it to a superclass. Since initializers are run in\n   * constructors, initializers will run in order of the class hierarchy,\n   * starting with superclasses and progressing to the instance's class.\n   *\n   * @nocollapse\n   */\n  static addInitializer(initializer: Initializer) {\n    this.finalize();\n    (this._initializers ??= []).push(initializer);\n  }\n\n  static _initializers?: Initializer[];\n\n  /*\n   * Due to closure compiler ES6 compilation bugs, @nocollapse is required on\n   * all static methods and properties with initializers.  Reference:\n   * - https://github.com/google/closure-compiler/issues/1776\n   */\n\n  /**\n   * Maps attribute names to properties; for example `foobar` attribute to\n   * `fooBar` property. Created lazily on user subclasses when finalizing the\n   * class.\n   * @nocollapse\n   */\n  private static __attributeToPropertyMap: AttributeMap;\n\n  /**\n   * Marks class as having finished creating properties.\n   */\n  protected static [finalized] = true;\n\n  /**\n   * Memoized list of all element properties, including any superclass properties.\n   * Created lazily on user subclasses when finalizing the class.\n   * @nocollapse\n   * @category properties\n   */\n  static elementProperties: PropertyDeclarationMap = new Map();\n\n  /**\n   * User-supplied object that maps property names to `PropertyDeclaration`\n   * objects containing options for configuring reactive properties. When\n   * a reactive property is set the element will update and render.\n   *\n   * By default properties are public fields, and as such, they should be\n   * considered as primarily settable by element users, either via attribute or\n   * the property itself.\n   *\n   * Generally, properties that are changed by the element should be private or\n   * protected fields and should use the `state: true` option. Properties\n   * marked as `state` do not reflect from the corresponding attribute\n   *\n   * However, sometimes element code does need to set a public property. This\n   * should typically only be done in response to user interaction, and an event\n   * should be fired informing the user; for example, a checkbox sets its\n   * `checked` property when clicked and fires a `changed` event. Mutating\n   * public properties should typically not be done for non-primitive (object or\n   * array) properties. In other cases when an element needs to manage state, a\n   * private property set with the `state: true` option should be used. When\n   * needed, state properties can be initialized via public properties to\n   * facilitate complex interactions.\n   * @nocollapse\n   * @category properties\n   */\n  static properties: PropertyDeclarations;\n\n  /**\n   * Memoized list of all element styles.\n   * Created lazily on user subclasses when finalizing the class.\n   * @nocollapse\n   * @category styles\n   */\n  static elementStyles: Array<CSSResultOrNative> = [];\n\n  /**\n   * Array of styles to apply to the element. The styles should be defined\n   * using the {@linkcode css} tag function, via constructible stylesheets, or\n   * imported from native CSS module scripts.\n   *\n   * Note on Content Security Policy:\n   *\n   * Element styles are implemented with `<style>` tags when the browser doesn't\n   * support adopted StyleSheets. To use such `<style>` tags with the style-src\n   * CSP directive, the style-src value must either include 'unsafe-inline' or\n   * `nonce-<base64-value>` with `<base64-value>` replaced be a server-generated\n   * nonce.\n   *\n   * To provide a nonce to use on generated `<style>` elements, set\n   * `window.litNonce` to a server-generated nonce in your page's HTML, before\n   * loading application code:\n   *\n   * ```html\n   * <script>\n   *   // Generated and unique per request:\n   *   window.litNonce = 'a1b2c3d4';\n   * </script>\n   * ```\n   * @nocollapse\n   * @category styles\n   */\n  static styles?: CSSResultGroup;\n\n  /**\n   * The set of properties defined by this class that caused an accessor to be\n   * added during `createProperty`.\n   * @nocollapse\n   */\n  private static __reactivePropertyKeys?: Set<PropertyKey>;\n\n  /**\n   * Returns a list of attributes corresponding to the registered properties.\n   * @nocollapse\n   * @category attributes\n   */\n  static get observedAttributes() {\n    // note: piggy backing on this to ensure we're finalized.\n    this.finalize();\n    const attributes: string[] = [];\n    // Use forEach so this works even if for/of loops are compiled to for loops\n    // expecting arrays\n    this.elementProperties.forEach((v, p) => {\n      const attr = this.__attributeNameForProperty(p, v);\n      if (attr !== undefined) {\n        this.__attributeToPropertyMap.set(attr, p);\n        attributes.push(attr);\n      }\n    });\n    return attributes;\n  }\n\n  /**\n   * Creates a property accessor on the element prototype if one does not exist\n   * and stores a {@linkcode PropertyDeclaration} for the property with the\n   * given options. The property setter calls the property's `hasChanged`\n   * property option or uses a strict identity check to determine whether or not\n   * to request an update.\n   *\n   * This method may be overridden to customize properties; however,\n   * when doing so, it's important to call `super.createProperty` to ensure\n   * the property is setup correctly. This method calls\n   * `getPropertyDescriptor` internally to get a descriptor to install.\n   * To customize what properties do when they are get or set, override\n   * `getPropertyDescriptor`. To customize the options for a property,\n   * implement `createProperty` like this:\n   *\n   * ```ts\n   * static createProperty(name, options) {\n   *   options = Object.assign(options, {myOption: true});\n   *   super.createProperty(name, options);\n   * }\n   * ```\n   *\n   * @nocollapse\n   * @category properties\n   */\n  static createProperty(\n    name: PropertyKey,\n    options: PropertyDeclaration = defaultPropertyDeclaration\n  ) {\n    // if this is a state property, force the attribute to false.\n    if (options.state) {\n      // Cast as any since this is readonly.\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (options as any).attribute = false;\n    }\n    // Note, since this can be called by the `@property` decorator which\n    // is called before `finalize`, we ensure finalization has been kicked off.\n    this.finalize();\n    this.elementProperties.set(name, options);\n    // Do not generate an accessor if the prototype already has one, since\n    // it would be lost otherwise and that would never be the user's intention;\n    // Instead, we expect users to call `requestUpdate` themselves from\n    // user-defined accessors. Note that if the super has an accessor we will\n    // still overwrite it\n    if (!options.noAccessor && !this.prototype.hasOwnProperty(name)) {\n      const key = typeof name === 'symbol' ? Symbol() : `__${name}`;\n      const descriptor = this.getPropertyDescriptor(name, key, options);\n      if (descriptor !== undefined) {\n        Object.defineProperty(this.prototype, name, descriptor);\n        if (DEV_MODE) {\n          // If this class doesn't have its own set, create one and initialize\n          // with the values in the set from the nearest ancestor class, if any.\n          if (!this.hasOwnProperty('__reactivePropertyKeys')) {\n            this.__reactivePropertyKeys = new Set(\n              this.__reactivePropertyKeys ?? []\n            );\n          }\n          this.__reactivePropertyKeys!.add(name);\n        }\n      }\n    }\n  }\n\n  /**\n   * Returns a property descriptor to be defined on the given named property.\n   * If no descriptor is returned, the property will not become an accessor.\n   * For example,\n   *\n   * ```ts\n   * class MyElement extends LitElement {\n   *   static getPropertyDescriptor(name, key, options) {\n   *     const defaultDescriptor =\n   *         super.getPropertyDescriptor(name, key, options);\n   *     const setter = defaultDescriptor.set;\n   *     return {\n   *       get: defaultDescriptor.get,\n   *       set(value) {\n   *         setter.call(this, value);\n   *         // custom action.\n   *       },\n   *       configurable: true,\n   *       enumerable: true\n   *     }\n   *   }\n   * }\n   * ```\n   *\n   * @nocollapse\n   * @category properties\n   */\n  protected static getPropertyDescriptor(\n    name: PropertyKey,\n    key: string | symbol,\n    options: PropertyDeclaration\n  ): PropertyDescriptor | undefined {\n    return {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      get(): any {\n        return (this as {[key: string]: unknown})[key as string];\n      },\n      set(this: ReactiveElement, value: unknown) {\n        const oldValue = (this as {} as {[key: string]: unknown})[\n          name as string\n        ];\n        (this as {} as {[key: string]: unknown})[key as string] = value;\n        (this as unknown as ReactiveElement).requestUpdate(\n          name,\n          oldValue,\n          options\n        );\n      },\n      configurable: true,\n      enumerable: true,\n    };\n  }\n\n  /**\n   * Returns the property options associated with the given property.\n   * These options are defined with a `PropertyDeclaration` via the `properties`\n   * object or the `@property` decorator and are registered in\n   * `createProperty(...)`.\n   *\n   * Note, this method should be considered \"final\" and not overridden. To\n   * customize the options for a given property, override\n   * {@linkcode createProperty}.\n   *\n   * @nocollapse\n   * @final\n   * @category properties\n   */\n  static getPropertyOptions(name: PropertyKey) {\n    return this.elementProperties.get(name) || defaultPropertyDeclaration;\n  }\n\n  /**\n   * Creates property accessors for registered properties, sets up element\n   * styling, and ensures any superclasses are also finalized. Returns true if\n   * the element was finalized.\n   * @nocollapse\n   */\n  protected static finalize() {\n    if (this.hasOwnProperty(finalized)) {\n      return false;\n    }\n    this[finalized] = true;\n    // finalize any superclasses\n    const superCtor = Object.getPrototypeOf(this) as typeof ReactiveElement;\n    superCtor.finalize();\n    // Create own set of initializers for this class if any exist on the\n    // superclass and copy them down. Note, for a small perf boost, avoid\n    // creating initializers unless needed.\n    if (superCtor._initializers !== undefined) {\n      this._initializers = [...superCtor._initializers];\n    }\n    this.elementProperties = new Map(superCtor.elementProperties);\n    // initialize Map populated in observedAttributes\n    this.__attributeToPropertyMap = new Map();\n    // make any properties\n    // Note, only process \"own\" properties since this element will inherit\n    // any properties defined on the superClass, and finalization ensures\n    // the entire prototype chain is finalized.\n    if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n      const props = this.properties;\n      // support symbols in properties (IE11 does not support this)\n      const propKeys = [\n        ...Object.getOwnPropertyNames(props),\n        ...Object.getOwnPropertySymbols(props),\n      ];\n      // This for/of is ok because propKeys is an array\n      for (const p of propKeys) {\n        // note, use of `any` is due to TypeScript lack of support for symbol in\n        // index types\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        this.createProperty(p, (props as any)[p]);\n      }\n    }\n    this.elementStyles = this.finalizeStyles(this.styles);\n    // DEV mode warnings\n    if (DEV_MODE) {\n      const warnRemovedOrRenamed = (name: string, renamed = false) => {\n        if (this.prototype.hasOwnProperty(name)) {\n          issueWarning(\n            renamed ? 'renamed-api' : 'removed-api',\n            `\\`${name}\\` is implemented on class ${this.name}. It ` +\n              `has been ${renamed ? 'renamed' : 'removed'} ` +\n              `in this version of LitElement.`\n          );\n        }\n      };\n      warnRemovedOrRenamed('initialize');\n      warnRemovedOrRenamed('requestUpdateInternal');\n      warnRemovedOrRenamed('_getUpdateComplete', true);\n    }\n    return true;\n  }\n\n  /**\n   * Options used when calling `attachShadow`. Set this property to customize\n   * the options for the shadowRoot; for example, to create a closed\n   * shadowRoot: `{mode: 'closed'}`.\n   *\n   * Note, these options are used in `createRenderRoot`. If this method\n   * is customized, options should be respected if possible.\n   * @nocollapse\n   * @category rendering\n   */\n  static shadowRootOptions: ShadowRootInit = {mode: 'open'};\n\n  /**\n   * Takes the styles the user supplied via the `static styles` property and\n   * returns the array of styles to apply to the element.\n   * Override this method to integrate into a style management system.\n   *\n   * Styles are deduplicated preserving the _last_ instance in the list. This\n   * is a performance optimization to avoid duplicated styles that can occur\n   * especially when composing via subclassing. The last item is kept to try\n   * to preserve the cascade order with the assumption that it's most important\n   * that last added styles override previous styles.\n   *\n   * @nocollapse\n   * @category styles\n   */\n  protected static finalizeStyles(\n    styles?: CSSResultGroup\n  ): Array<CSSResultOrNative> {\n    const elementStyles = [];\n    if (Array.isArray(styles)) {\n      // Dedupe the flattened array in reverse order to preserve the last items.\n      // Casting to Array<unknown> works around TS error that\n      // appears to come from trying to flatten a type CSSResultArray.\n      const set = new Set((styles as Array<unknown>).flat(Infinity).reverse());\n      // Then preserve original order by adding the set items in reverse order.\n      for (const s of set) {\n        elementStyles.unshift(getCompatibleStyle(s as CSSResultOrNative));\n      }\n    } else if (styles !== undefined) {\n      elementStyles.push(getCompatibleStyle(styles));\n    }\n    return elementStyles;\n  }\n\n  /**\n   * Node or ShadowRoot into which element DOM should be rendered. Defaults\n   * to an open shadowRoot.\n   * @category rendering\n   */\n  readonly renderRoot!: HTMLElement | ShadowRoot;\n\n  /**\n   * Returns the property name for the given attribute `name`.\n   * @nocollapse\n   */\n  private static __attributeNameForProperty(\n    name: PropertyKey,\n    options: PropertyDeclaration\n  ) {\n    const attribute = options.attribute;\n    return attribute === false\n      ? undefined\n      : typeof attribute === 'string'\n      ? attribute\n      : typeof name === 'string'\n      ? name.toLowerCase()\n      : undefined;\n  }\n\n  private __instanceProperties?: PropertyValues = new Map();\n  // Initialize to an unresolved Promise so we can make sure the element has\n  // connected before first update.\n  private __updatePromise!: Promise<boolean>;\n\n  /**\n   * True if there is a pending update as a result of calling `requestUpdate()`.\n   * Should only be read.\n   * @category updates\n   */\n  isUpdatePending = false;\n\n  /**\n   * Is set to `true` after the first update. The element code cannot assume\n   * that `renderRoot` exists before the element `hasUpdated`.\n   * @category updates\n   */\n  hasUpdated = false;\n\n  /**\n   * Map with keys for any properties that have changed since the last\n   * update cycle with previous values.\n   *\n   * @internal\n   */\n  _$changedProperties!: PropertyValues;\n\n  /**\n   * Map with keys of properties that should be reflected when updated.\n   */\n  private __reflectingProperties?: Map<PropertyKey, PropertyDeclaration>;\n\n  /**\n   * Name of currently reflecting property\n   */\n  private __reflectingProperty: PropertyKey | null = null;\n\n  /**\n   * Set of controllers.\n   */\n  private __controllers?: ReactiveController[];\n\n  constructor() {\n    super();\n    this.__initialize();\n  }\n\n  /**\n   * Internal only override point for customizing work done when elements\n   * are constructed.\n   */\n  private __initialize() {\n    this.__updatePromise = new Promise<boolean>(\n      (res) => (this.enableUpdating = res)\n    );\n    this._$changedProperties = new Map();\n    this.__saveInstanceProperties();\n    // ensures first update will be caught by an early access of\n    // `updateComplete`\n    this.requestUpdate();\n    (this.constructor as typeof ReactiveElement)._initializers?.forEach((i) =>\n      i(this)\n    );\n  }\n\n  /**\n   * Registers a `ReactiveController` to participate in the element's reactive\n   * update cycle. The element automatically calls into any registered\n   * controllers during its lifecycle callbacks.\n   *\n   * If the element is connected when `addController()` is called, the\n   * controller's `hostConnected()` callback will be immediately called.\n   * @category controllers\n   */\n  addController(controller: ReactiveController) {\n    (this.__controllers ??= []).push(controller);\n    // If a controller is added after the element has been connected,\n    // call hostConnected. Note, re-using existence of `renderRoot` here\n    // (which is set in connectedCallback) to avoid the need to track a\n    // first connected state.\n    if (this.renderRoot !== undefined && this.isConnected) {\n      controller.hostConnected?.();\n    }\n  }\n\n  /**\n   * Removes a `ReactiveController` from the element.\n   * @category controllers\n   */\n  removeController(controller: ReactiveController) {\n    // Note, if the indexOf is -1, the >>> will flip the sign which makes the\n    // splice do nothing.\n    this.__controllers?.splice(this.__controllers.indexOf(controller) >>> 0, 1);\n  }\n\n  /**\n   * Fixes any properties set on the instance before upgrade time.\n   * Otherwise these would shadow the accessor and break these properties.\n   * The properties are stored in a Map which is played back after the\n   * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n   * (<=41), properties created for native platform properties like (`id` or\n   * `name`) may not have default values set in the element constructor. On\n   * these browsers native properties appear on instances and therefore their\n   * default value will overwrite any element default (e.g. if the element sets\n   * this.id = 'id' in the constructor, the 'id' will become '' since this is\n   * the native platform default).\n   */\n  private __saveInstanceProperties() {\n    // Use forEach so this works even if for/of loops are compiled to for loops\n    // expecting arrays\n    (this.constructor as typeof ReactiveElement).elementProperties.forEach(\n      (_v, p) => {\n        if (this.hasOwnProperty(p)) {\n          this.__instanceProperties!.set(p, this[p as keyof this]);\n          delete this[p as keyof this];\n        }\n      }\n    );\n  }\n\n  /**\n   * Returns the node into which the element should render and by default\n   * creates and returns an open shadowRoot. Implement to customize where the\n   * element's DOM is rendered. For example, to render into the element's\n   * childNodes, return `this`.\n   *\n   * @return Returns a node into which to render.\n   * @category rendering\n   */\n  protected createRenderRoot(): Element | ShadowRoot {\n    const renderRoot =\n      this.shadowRoot ??\n      this.attachShadow(\n        (this.constructor as typeof ReactiveElement).shadowRootOptions\n      );\n    adoptStyles(\n      renderRoot,\n      (this.constructor as typeof ReactiveElement).elementStyles\n    );\n    return renderRoot;\n  }\n\n  /**\n   * On first connection, creates the element's renderRoot, sets up\n   * element styling, and enables updating.\n   * @category lifecycle\n   */\n  connectedCallback() {\n    // create renderRoot before first update.\n    if (this.renderRoot === undefined) {\n      (\n        this as {\n          renderRoot: Element | DocumentFragment;\n        }\n      ).renderRoot = this.createRenderRoot();\n    }\n    this.enableUpdating(true);\n    this.__controllers?.forEach((c) => c.hostConnected?.());\n  }\n\n  /**\n   * Note, this method should be considered final and not overridden. It is\n   * overridden on the element instance with a function that triggers the first\n   * update.\n   * @category updates\n   */\n  protected enableUpdating(_requestedUpdate: boolean) {}\n\n  /**\n   * Allows for `super.disconnectedCallback()` in extensions while\n   * reserving the possibility of making non-breaking feature additions\n   * when disconnecting at some point in the future.\n   * @category lifecycle\n   */\n  disconnectedCallback() {\n    this.__controllers?.forEach((c) => c.hostDisconnected?.());\n  }\n\n  /**\n   * Synchronizes property values when attributes change.\n   *\n   * Specifically, when an attribute is set, the corresponding property is set.\n   * You should rarely need to implement this callback. If this method is\n   * overridden, `super.attributeChangedCallback(name, _old, value)` must be\n   * called.\n   *\n   * See [using the lifecycle callbacks](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks)\n   * on MDN for more information about the `attributeChangedCallback`.\n   * @category attributes\n   */\n  attributeChangedCallback(\n    name: string,\n    _old: string | null,\n    value: string | null\n  ) {\n    this._$attributeToProperty(name, value);\n  }\n\n  private __propertyToAttribute(\n    name: PropertyKey,\n    value: unknown,\n    options: PropertyDeclaration = defaultPropertyDeclaration\n  ) {\n    const attr = (\n      this.constructor as typeof ReactiveElement\n    ).__attributeNameForProperty(name, options);\n    if (attr !== undefined && options.reflect === true) {\n      const converter =\n        (options.converter as ComplexAttributeConverter)?.toAttribute !==\n        undefined\n          ? (options.converter as ComplexAttributeConverter)\n          : defaultConverter;\n      const attrValue = converter.toAttribute!(value, options.type);\n      if (\n        DEV_MODE &&\n        (this.constructor as typeof ReactiveElement).enabledWarnings!.indexOf(\n          'migration'\n        ) >= 0 &&\n        attrValue === undefined\n      ) {\n        issueWarning(\n          'undefined-attribute-value',\n          `The attribute value for the ${name as string} property is ` +\n            `undefined on element ${this.localName}. The attribute will be ` +\n            `removed, but in the previous version of \\`ReactiveElement\\`, ` +\n            `the attribute would not have changed.`\n        );\n      }\n      // Track if the property is being reflected to avoid\n      // setting the property again via `attributeChangedCallback`. Note:\n      // 1. this takes advantage of the fact that the callback is synchronous.\n      // 2. will behave incorrectly if multiple attributes are in the reaction\n      // stack at time of calling. However, since we process attributes\n      // in `update` this should not be possible (or an extreme corner case\n      // that we'd like to discover).\n      // mark state reflecting\n      this.__reflectingProperty = name;\n      if (attrValue == null) {\n        this.removeAttribute(attr);\n      } else {\n        this.setAttribute(attr, attrValue as string);\n      }\n      // mark state not reflecting\n      this.__reflectingProperty = null;\n    }\n  }\n\n  /** @internal */\n  _$attributeToProperty(name: string, value: string | null) {\n    const ctor = this.constructor as typeof ReactiveElement;\n    // Note, hint this as an `AttributeMap` so closure clearly understands\n    // the type; it has issues with tracking types through statics\n    const propName = (ctor.__attributeToPropertyMap as AttributeMap).get(name);\n    // Use tracking info to avoid reflecting a property value to an attribute\n    // if it was just set because the attribute changed.\n    if (propName !== undefined && this.__reflectingProperty !== propName) {\n      const options = ctor.getPropertyOptions(propName);\n      const converter =\n        typeof options.converter === 'function'\n          ? {fromAttribute: options.converter}\n          : options.converter?.fromAttribute !== undefined\n          ? options.converter\n          : defaultConverter;\n      // mark state reflecting\n      this.__reflectingProperty = propName;\n      this[propName as keyof this] = converter.fromAttribute!(\n        value,\n        options.type\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      ) as any;\n      // mark state not reflecting\n      this.__reflectingProperty = null;\n    }\n  }\n\n  /**\n   * Requests an update which is processed asynchronously. This should be called\n   * when an element should update based on some state not triggered by setting\n   * a reactive property. In this case, pass no arguments. It should also be\n   * called when manually implementing a property setter. In this case, pass the\n   * property `name` and `oldValue` to ensure that any configured property\n   * options are honored.\n   *\n   * @param name name of requesting property\n   * @param oldValue old value of requesting property\n   * @param options property options to use instead of the previously\n   *     configured options\n   * @category updates\n   */\n  requestUpdate(\n    name?: PropertyKey,\n    oldValue?: unknown,\n    options?: PropertyDeclaration\n  ): void {\n    let shouldRequestUpdate = true;\n    // If we have a property key, perform property update steps.\n    if (name !== undefined) {\n      options =\n        options ||\n        (this.constructor as typeof ReactiveElement).getPropertyOptions(name);\n      const hasChanged = options.hasChanged || notEqual;\n      if (hasChanged(this[name as keyof this], oldValue)) {\n        if (!this._$changedProperties.has(name)) {\n          this._$changedProperties.set(name, oldValue);\n        }\n        // Add to reflecting properties set.\n        // Note, it's important that every change has a chance to add the\n        // property to `_reflectingProperties`. This ensures setting\n        // attribute + property reflects correctly.\n        if (options.reflect === true && this.__reflectingProperty !== name) {\n          if (this.__reflectingProperties === undefined) {\n            this.__reflectingProperties = new Map();\n          }\n          this.__reflectingProperties.set(name, options);\n        }\n      } else {\n        // Abort the request if the property should not be considered changed.\n        shouldRequestUpdate = false;\n      }\n    }\n    if (!this.isUpdatePending && shouldRequestUpdate) {\n      this.__updatePromise = this.__enqueueUpdate();\n    }\n    // Note, since this no longer returns a promise, in dev mode we return a\n    // thenable which warns if it's called.\n    return DEV_MODE\n      ? (requestUpdateThenable(this.localName) as unknown as void)\n      : undefined;\n  }\n\n  /**\n   * Sets up the element to asynchronously update.\n   */\n  private async __enqueueUpdate() {\n    this.isUpdatePending = true;\n    try {\n      // Ensure any previous update has resolved before updating.\n      // This `await` also ensures that property changes are batched.\n      await this.__updatePromise;\n    } catch (e) {\n      // Refire any previous errors async so they do not disrupt the update\n      // cycle. Errors are refired so developers have a chance to observe\n      // them, and this can be done by implementing\n      // `window.onunhandledrejection`.\n      Promise.reject(e);\n    }\n    const result = this.scheduleUpdate();\n    // If `scheduleUpdate` returns a Promise, we await it. This is done to\n    // enable coordinating updates with a scheduler. Note, the result is\n    // checked to avoid delaying an additional microtask unless we need to.\n    if (result != null) {\n      await result;\n    }\n    return !this.isUpdatePending;\n  }\n\n  /**\n   * Schedules an element update. You can override this method to change the\n   * timing of updates by returning a Promise. The update will await the\n   * returned Promise, and you should resolve the Promise to allow the update\n   * to proceed. If this method is overridden, `super.scheduleUpdate()`\n   * must be called.\n   *\n   * For instance, to schedule updates to occur just before the next frame:\n   *\n   * ```ts\n   * override protected async scheduleUpdate(): Promise<unknown> {\n   *   await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n   *   super.scheduleUpdate();\n   * }\n   * ```\n   * @category updates\n   */\n  protected scheduleUpdate(): void | Promise<unknown> {\n    return this.performUpdate();\n  }\n\n  /**\n   * Performs an element update. Note, if an exception is thrown during the\n   * update, `firstUpdated` and `updated` will not be called.\n   *\n   * Call `performUpdate()` to immediately process a pending update. This should\n   * generally not be needed, but it can be done in rare cases when you need to\n   * update synchronously.\n   *\n   * Note: To ensure `performUpdate()` synchronously completes a pending update,\n   * it should not be overridden. In LitElement 2.x it was suggested to override\n   * `performUpdate()` to also customizing update scheduling. Instead, you should now\n   * override `scheduleUpdate()`. For backwards compatibility with LitElement 2.x,\n   * scheduling updates via `performUpdate()` continues to work, but will make\n   * also calling `performUpdate()` to synchronously process updates difficult.\n   *\n   * @category updates\n   */\n  protected performUpdate(): void | Promise<unknown> {\n    // Abort any update if one is not pending when this is called.\n    // This can happen if `performUpdate` is called early to \"flush\"\n    // the update.\n    if (!this.isUpdatePending) {\n      return;\n    }\n    debugLogEvent?.({kind: 'update'});\n    // create renderRoot before first update.\n    if (!this.hasUpdated) {\n      // Produce warning if any class properties are shadowed by class fields\n      if (DEV_MODE) {\n        const shadowedProperties: string[] = [];\n        (\n          this.constructor as typeof ReactiveElement\n        ).__reactivePropertyKeys?.forEach((p) => {\n          if (this.hasOwnProperty(p) && !this.__instanceProperties?.has(p)) {\n            shadowedProperties.push(p as string);\n          }\n        });\n        if (shadowedProperties.length) {\n          throw new Error(\n            `The following properties on element ${this.localName} will not ` +\n              `trigger updates as expected because they are set using class ` +\n              `fields: ${shadowedProperties.join(', ')}. ` +\n              `Native class fields and some compiled output will overwrite ` +\n              `accessors used for detecting changes. See ` +\n              `https://lit.dev/msg/class-field-shadowing ` +\n              `for more information.`\n          );\n        }\n      }\n    }\n    // Mixin instance properties once, if they exist.\n    if (this.__instanceProperties) {\n      // Use forEach so this works even if for/of loops are compiled to for loops\n      // expecting arrays\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      this.__instanceProperties!.forEach((v, p) => ((this as any)[p] = v));\n      this.__instanceProperties = undefined;\n    }\n    let shouldUpdate = false;\n    const changedProperties = this._$changedProperties;\n    try {\n      shouldUpdate = this.shouldUpdate(changedProperties);\n      if (shouldUpdate) {\n        this.willUpdate(changedProperties);\n        this.__controllers?.forEach((c) => c.hostUpdate?.());\n        this.update(changedProperties);\n      } else {\n        this.__markUpdated();\n      }\n    } catch (e) {\n      // Prevent `firstUpdated` and `updated` from running when there's an\n      // update exception.\n      shouldUpdate = false;\n      // Ensure element can accept additional updates after an exception.\n      this.__markUpdated();\n      throw e;\n    }\n    // The update is no longer considered pending and further updates are now allowed.\n    if (shouldUpdate) {\n      this._$didUpdate(changedProperties);\n    }\n  }\n\n  /**\n   * Invoked before `update()` to compute values needed during the update.\n   *\n   * Implement `willUpdate` to compute property values that depend on other\n   * properties and are used in the rest of the update process.\n   *\n   * ```ts\n   * willUpdate(changedProperties) {\n   *   // only need to check changed properties for an expensive computation.\n   *   if (changedProperties.has('firstName') || changedProperties.has('lastName')) {\n   *     this.sha = computeSHA(`${this.firstName} ${this.lastName}`);\n   *   }\n   * }\n   *\n   * render() {\n   *   return html`SHA: ${this.sha}`;\n   * }\n   * ```\n   *\n   * @category updates\n   */\n  protected willUpdate(_changedProperties: PropertyValues): void {}\n\n  // Note, this is an override point for polyfill-support.\n  // @internal\n  _$didUpdate(changedProperties: PropertyValues) {\n    this.__controllers?.forEach((c) => c.hostUpdated?.());\n    if (!this.hasUpdated) {\n      this.hasUpdated = true;\n      this.firstUpdated(changedProperties);\n    }\n    this.updated(changedProperties);\n    if (\n      DEV_MODE &&\n      this.isUpdatePending &&\n      (this.constructor as typeof ReactiveElement).enabledWarnings!.indexOf(\n        'change-in-update'\n      ) >= 0\n    ) {\n      issueWarning(\n        'change-in-update',\n        `Element ${this.localName} scheduled an update ` +\n          `(generally because a property was set) ` +\n          `after an update completed, causing a new update to be scheduled. ` +\n          `This is inefficient and should be avoided unless the next update ` +\n          `can only be scheduled as a side effect of the previous update.`\n      );\n    }\n  }\n\n  private __markUpdated() {\n    this._$changedProperties = new Map();\n    this.isUpdatePending = false;\n  }\n\n  /**\n   * Returns a Promise that resolves when the element has completed updating.\n   * The Promise value is a boolean that is `true` if the element completed the\n   * update without triggering another update. The Promise result is `false` if\n   * a property was set inside `updated()`. If the Promise is rejected, an\n   * exception was thrown during the update.\n   *\n   * To await additional asynchronous work, override the `getUpdateComplete`\n   * method. For example, it is sometimes useful to await a rendered element\n   * before fulfilling this Promise. To do this, first await\n   * `super.getUpdateComplete()`, then any subsequent state.\n   *\n   * @return A promise of a boolean that resolves to true if the update completed\n   *     without triggering another update.\n   * @category updates\n   */\n  get updateComplete(): Promise<boolean> {\n    return this.getUpdateComplete();\n  }\n\n  /**\n   * Override point for the `updateComplete` promise.\n   *\n   * It is not safe to override the `updateComplete` getter directly due to a\n   * limitation in TypeScript which means it is not possible to call a\n   * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n   * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n   * This method should be overridden instead. For example:\n   *\n   * ```ts\n   * class MyElement extends LitElement {\n   *   override async getUpdateComplete() {\n   *     const result = await super.getUpdateComplete();\n   *     await this._myChild.updateComplete;\n   *     return result;\n   *   }\n   * }\n   * ```\n   *\n   * @return A promise of a boolean that resolves to true if the update completed\n   *     without triggering another update.\n   * @category updates\n   */\n  protected getUpdateComplete(): Promise<boolean> {\n    return this.__updatePromise;\n  }\n\n  /**\n   * Controls whether or not `update()` should be called when the element requests\n   * an update. By default, this method always returns `true`, but this can be\n   * customized to control when to update.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   * @category updates\n   */\n  protected shouldUpdate(_changedProperties: PropertyValues): boolean {\n    return true;\n  }\n\n  /**\n   * Updates the element. This method reflects property values to attributes.\n   * It can be overridden to render and keep updated element DOM.\n   * Setting properties inside this method will *not* trigger\n   * another update.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   * @category updates\n   */\n  protected update(_changedProperties: PropertyValues) {\n    if (this.__reflectingProperties !== undefined) {\n      // Use forEach so this works even if for/of loops are compiled to for\n      // loops expecting arrays\n      this.__reflectingProperties.forEach((v, k) =>\n        this.__propertyToAttribute(k, this[k as keyof this], v)\n      );\n      this.__reflectingProperties = undefined;\n    }\n    this.__markUpdated();\n  }\n\n  /**\n   * Invoked whenever the element is updated. Implement to perform\n   * post-updating tasks via DOM APIs, for example, focusing an element.\n   *\n   * Setting properties inside this method will trigger the element to update\n   * again after this update cycle completes.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   * @category updates\n   */\n  protected updated(_changedProperties: PropertyValues) {}\n\n  /**\n   * Invoked when the element is first updated. Implement to perform one time\n   * work on the element after update.\n   *\n   * ```ts\n   * firstUpdated() {\n   *   this.renderRoot.getElementById('my-text-area').focus();\n   * }\n   * ```\n   *\n   * Setting properties inside this method will trigger the element to update\n   * again after this update cycle completes.\n   *\n   * @param _changedProperties Map of changed properties with old values\n   * @category updates\n   */\n  protected firstUpdated(_changedProperties: PropertyValues) {}\n}\n\n// Apply polyfills if available\npolyfillSupport?.({ReactiveElement});\n\n// Dev mode warnings...\nif (DEV_MODE) {\n  // Default warning set.\n  ReactiveElement.enabledWarnings = ['change-in-update'];\n  const ensureOwnWarnings = function (ctor: typeof ReactiveElement) {\n    if (\n      !ctor.hasOwnProperty(JSCompiler_renameProperty('enabledWarnings', ctor))\n    ) {\n      ctor.enabledWarnings = ctor.enabledWarnings!.slice();\n    }\n  };\n  ReactiveElement.enableWarning = function (\n    this: typeof ReactiveElement,\n    warning: WarningKind\n  ) {\n    ensureOwnWarnings(this);\n    if (this.enabledWarnings!.indexOf(warning) < 0) {\n      this.enabledWarnings!.push(warning);\n    }\n  };\n  ReactiveElement.disableWarning = function (\n    this: typeof ReactiveElement,\n    warning: WarningKind\n  ) {\n    ensureOwnWarnings(this);\n    const i = this.enabledWarnings!.indexOf(warning);\n    if (i >= 0) {\n      this.enabledWarnings!.splice(i, 1);\n    }\n  };\n}\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for ReactiveElement usage.\n(global.reactiveElementVersions ??= []).push('1.6.3');\nif (DEV_MODE && global.reactiveElementVersions.length > 1) {\n  issueWarning!(\n    'multiple-versions',\n    `Multiple versions of Lit loaded. Loading multiple versions ` +\n      `is not recommended.`\n  );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * The main LitElement module, which defines the {@linkcode LitElement} base\n * class and related APIs.\n *\n *  LitElement components can define a template and a set of observed\n * properties. Changing an observed property triggers a re-render of the\n * element.\n *\n *  Import {@linkcode LitElement} and {@linkcode html} from this module to\n * create a component:\n *\n *  ```js\n * import {LitElement, html} from 'lit-element';\n *\n * class MyElement extends LitElement {\n *\n *   // Declare observed properties\n *   static get properties() {\n *     return {\n *       adjective: {}\n *     }\n *   }\n *\n *   constructor() {\n *     this.adjective = 'awesome';\n *   }\n *\n *   // Define the element's template\n *   render() {\n *     return html`<p>your ${adjective} template here</p>`;\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n * ```\n *\n * `LitElement` extends {@linkcode ReactiveElement} and adds lit-html\n * templating. The `ReactiveElement` class is provided for users that want to\n * build their own custom element base classes that don't use lit-html.\n *\n * @packageDocumentation\n */\nimport {PropertyValues, ReactiveElement} from '@lit/reactive-element';\nimport {render, RenderOptions, noChange, RootPart} from 'lit-html';\nexport * from '@lit/reactive-element';\nexport * from 'lit-html';\n\nimport {LitUnstable} from 'lit-html';\nimport {ReactiveUnstable} from '@lit/reactive-element';\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Unstable {\n  /**\n   * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n   * we will emit 'lit-debug' events to window, with live details about the update and render\n   * lifecycle. These can be useful for writing debug tooling and visualizations.\n   *\n   * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n   * making certain operations that are normally very cheap (like a no-op render) much slower,\n   * because we must copy data and dispatch events.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  export namespace DebugLog {\n    export type Entry =\n      | LitUnstable.DebugLog.Entry\n      | ReactiveUnstable.DebugLog.Entry;\n  }\n}\n\n// For backwards compatibility export ReactiveElement as UpdatingElement. Note,\n// IE transpilation requires exporting like this.\nexport const UpdatingElement = ReactiveElement;\n\nconst DEV_MODE = true;\n\nlet issueWarning: (code: string, warning: string) => void;\n\nif (DEV_MODE) {\n  // Ensure warnings are issued only 1x, even if multiple versions of Lit\n  // are loaded.\n  const issuedWarnings: Set<string | undefined> =\n    (globalThis.litIssuedWarnings ??= new Set());\n\n  // Issue a warning, if we haven't already.\n  issueWarning = (code: string, warning: string) => {\n    warning += ` See https://lit.dev/msg/${code} for more information.`;\n    if (!issuedWarnings.has(warning)) {\n      console.warn(warning);\n      issuedWarnings.add(warning);\n    }\n  };\n}\n\n/**\n * Base element class that manages element properties and attributes, and\n * renders a lit-html template.\n *\n * To define a component, subclass `LitElement` and implement a\n * `render` method to provide the component's template. Define properties\n * using the {@linkcode LitElement.properties properties} property or the\n * {@linkcode property} decorator.\n */\nexport class LitElement extends ReactiveElement {\n  /**\n   * Ensure this class is marked as `finalized` as an optimization ensuring\n   * it will not needlessly try to `finalize`.\n   *\n   * Note this property name is a string to prevent breaking Closure JS Compiler\n   * optimizations. See @lit/reactive-element for more information.\n   */\n  protected static override ['finalized'] = true;\n\n  // This property needs to remain unminified.\n  static ['_$litElement$'] = true;\n\n  /**\n   * @category rendering\n   */\n  readonly renderOptions: RenderOptions = {host: this};\n\n  private __childPart: RootPart | undefined = undefined;\n\n  /**\n   * @category rendering\n   */\n  protected override createRenderRoot() {\n    const renderRoot = super.createRenderRoot();\n    // When adoptedStyleSheets are shimmed, they are inserted into the\n    // shadowRoot by createRenderRoot. Adjust the renderBefore node so that\n    // any styles in Lit content render before adoptedStyleSheets. This is\n    // important so that adoptedStyleSheets have precedence over styles in\n    // the shadowRoot.\n    this.renderOptions.renderBefore ??= renderRoot!.firstChild as ChildNode;\n    return renderRoot;\n  }\n\n  /**\n   * Updates the element. This method reflects property values to attributes\n   * and calls `render` to render DOM via lit-html. Setting properties inside\n   * this method will *not* trigger another update.\n   * @param changedProperties Map of changed properties with old values\n   * @category updates\n   */\n  protected override update(changedProperties: PropertyValues) {\n    // Setting properties in `render` should not trigger an update. Since\n    // updates are allowed after super.update, it's important to call `render`\n    // before that.\n    const value = this.render();\n    if (!this.hasUpdated) {\n      this.renderOptions.isConnected = this.isConnected;\n    }\n    super.update(changedProperties);\n    this.__childPart = render(value, this.renderRoot, this.renderOptions);\n  }\n\n  /**\n   * Invoked when the component is added to the document's DOM.\n   *\n   * In `connectedCallback()` you should setup tasks that should only occur when\n   * the element is connected to the document. The most common of these is\n   * adding event listeners to nodes external to the element, like a keydown\n   * event handler added to the window.\n   *\n   * ```ts\n   * connectedCallback() {\n   *   super.connectedCallback();\n   *   addEventListener('keydown', this._handleKeydown);\n   * }\n   * ```\n   *\n   * Typically, anything done in `connectedCallback()` should be undone when the\n   * element is disconnected, in `disconnectedCallback()`.\n   *\n   * @category lifecycle\n   */\n  override connectedCallback() {\n    super.connectedCallback();\n    this.__childPart?.setConnected(true);\n  }\n\n  /**\n   * Invoked when the component is removed from the document's DOM.\n   *\n   * This callback is the main signal to the element that it may no longer be\n   * used. `disconnectedCallback()` should ensure that nothing is holding a\n   * reference to the element (such as event listeners added to nodes external\n   * to the element), so that it is free to be garbage collected.\n   *\n   * ```ts\n   * disconnectedCallback() {\n   *   super.disconnectedCallback();\n   *   window.removeEventListener('keydown', this._handleKeydown);\n   * }\n   * ```\n   *\n   * An element may be re-connected after being disconnected.\n   *\n   * @category lifecycle\n   */\n  override disconnectedCallback() {\n    super.disconnectedCallback();\n    this.__childPart?.setConnected(false);\n  }\n\n  /**\n   * Invoked on each update to perform rendering tasks. This method may return\n   * any value renderable by lit-html's `ChildPart` - typically a\n   * `TemplateResult`. Setting properties inside this method will *not* trigger\n   * the element to update.\n   * @category rendering\n   */\n  protected render(): unknown {\n    return noChange;\n  }\n}\n\n// Install hydration if available\nglobalThis.litElementHydrateSupport?.({LitElement});\n\n// Apply polyfills if available\nconst polyfillSupport = DEV_MODE\n  ? globalThis.litElementPolyfillSupportDevMode\n  : globalThis.litElementPolyfillSupport;\npolyfillSupport?.({LitElement});\n\n// DEV mode warnings\nif (DEV_MODE) {\n  /* eslint-disable @typescript-eslint/no-explicit-any */\n  // Note, for compatibility with closure compilation, this access\n  // needs to be as a string property index.\n  (LitElement as any)['finalize'] = function (this: typeof LitElement) {\n    const finalized = (ReactiveElement as any).finalize.call(this);\n    if (!finalized) {\n      return false;\n    }\n    const warnRemovedOrRenamed = (obj: any, name: string, renamed = false) => {\n      if (obj.hasOwnProperty(name)) {\n        const ctorName = (typeof obj === 'function' ? obj : obj.constructor)\n          .name;\n        issueWarning(\n          renamed ? 'renamed-api' : 'removed-api',\n          `\\`${name}\\` is implemented on class ${ctorName}. It ` +\n            `has been ${renamed ? 'renamed' : 'removed'} ` +\n            `in this version of LitElement.`\n        );\n      }\n    };\n    warnRemovedOrRenamed(this, 'render');\n    warnRemovedOrRenamed(this, 'getStyles', true);\n    warnRemovedOrRenamed((this as typeof LitElement).prototype, 'adoptStyles');\n    return true;\n  };\n  /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n\n/**\n * END USERS SHOULD NOT RELY ON THIS OBJECT.\n *\n * Private exports for use by other Lit packages, not intended for use by\n * external users.\n *\n * We currently do not make a mangled rollup build of the lit-ssr code. In order\n * to keep a number of (otherwise private) top-level exports  mangled in the\n * client side code, we export a _$LE object containing those members (or\n * helper methods for accessing private fields of those members), and then\n * re-export them for use in lit-ssr. This keeps lit-ssr agnostic to whether the\n * client-side code is being used in `dev` mode or `prod` mode.\n *\n * This has a unique name, to disambiguate it from private exports in\n * lit-html, since this module re-exports all of lit-html.\n *\n * @private\n */\nexport const _$LE = {\n  _$attributeToProperty: (\n    el: LitElement,\n    name: string,\n    value: string | null\n  ) => {\n    // eslint-disable-next-line\n    (el as any)._$attributeToProperty(name, value);\n  },\n  // eslint-disable-next-line\n  _$changedProperties: (el: LitElement) => (el as any)._$changedProperties,\n};\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for LitElement usage.\n(globalThis.litElementVersions ??= []).push('3.3.3');\nif (DEV_MODE && globalThis.litElementVersions.length > 1) {\n  issueWarning!(\n    'multiple-versions',\n    `Multiple versions of Lit loaded. Loading multiple versions ` +\n      `is not recommended.`\n  );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n// IMPORTANT: these imports must be type-only\nimport type {Directive, DirectiveResult, PartInfo} from './directive.js';\n\nconst DEV_MODE = true;\nconst ENABLE_EXTRA_SECURITY_HOOKS = true;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst NODE_MODE = false;\n// Use window for browser builds because IE11 doesn't have globalThis.\nconst global = NODE_MODE ? globalThis : window;\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace LitUnstable {\n  /**\n   * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n   * we will emit 'lit-debug' events to window, with live details about the update and render\n   * lifecycle. These can be useful for writing debug tooling and visualizations.\n   *\n   * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n   * making certain operations that are normally very cheap (like a no-op render) much slower,\n   * because we must copy data and dispatch events.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  export namespace DebugLog {\n    export type Entry =\n      | TemplatePrep\n      | TemplateInstantiated\n      | TemplateInstantiatedAndUpdated\n      | TemplateUpdating\n      | BeginRender\n      | EndRender\n      | CommitPartEntry\n      | SetPartValue;\n    export interface TemplatePrep {\n      kind: 'template prep';\n      template: Template;\n      strings: TemplateStringsArray;\n      clonableTemplate: HTMLTemplateElement;\n      parts: TemplatePart[];\n    }\n    export interface BeginRender {\n      kind: 'begin render';\n      id: number;\n      value: unknown;\n      container: HTMLElement | DocumentFragment;\n      options: RenderOptions | undefined;\n      part: ChildPart | undefined;\n    }\n    export interface EndRender {\n      kind: 'end render';\n      id: number;\n      value: unknown;\n      container: HTMLElement | DocumentFragment;\n      options: RenderOptions | undefined;\n      part: ChildPart;\n    }\n    export interface TemplateInstantiated {\n      kind: 'template instantiated';\n      template: Template | CompiledTemplate;\n      instance: TemplateInstance;\n      options: RenderOptions | undefined;\n      fragment: Node;\n      parts: Array<Part | undefined>;\n      values: unknown[];\n    }\n    export interface TemplateInstantiatedAndUpdated {\n      kind: 'template instantiated and updated';\n      template: Template | CompiledTemplate;\n      instance: TemplateInstance;\n      options: RenderOptions | undefined;\n      fragment: Node;\n      parts: Array<Part | undefined>;\n      values: unknown[];\n    }\n    export interface TemplateUpdating {\n      kind: 'template updating';\n      template: Template | CompiledTemplate;\n      instance: TemplateInstance;\n      options: RenderOptions | undefined;\n      parts: Array<Part | undefined>;\n      values: unknown[];\n    }\n    export interface SetPartValue {\n      kind: 'set part';\n      part: Part;\n      value: unknown;\n      valueIndex: number;\n      values: unknown[];\n      templateInstance: TemplateInstance;\n    }\n\n    export type CommitPartEntry =\n      | CommitNothingToChildEntry\n      | CommitText\n      | CommitNode\n      | CommitAttribute\n      | CommitProperty\n      | CommitBooleanAttribute\n      | CommitEventListener\n      | CommitToElementBinding;\n\n    export interface CommitNothingToChildEntry {\n      kind: 'commit nothing to child';\n      start: ChildNode;\n      end: ChildNode | null;\n      parent: Disconnectable | undefined;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitText {\n      kind: 'commit text';\n      node: Text;\n      value: unknown;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitNode {\n      kind: 'commit node';\n      start: Node;\n      parent: Disconnectable | undefined;\n      value: Node;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitAttribute {\n      kind: 'commit attribute';\n      element: Element;\n      name: string;\n      value: unknown;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitProperty {\n      kind: 'commit property';\n      element: Element;\n      name: string;\n      value: unknown;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitBooleanAttribute {\n      kind: 'commit boolean attribute';\n      element: Element;\n      name: string;\n      value: boolean;\n      options: RenderOptions | undefined;\n    }\n\n    export interface CommitEventListener {\n      kind: 'commit event listener';\n      element: Element;\n      name: string;\n      value: unknown;\n      oldListener: unknown;\n      options: RenderOptions | undefined;\n      // True if we're removing the old event listener (e.g. because settings changed, or value is nothing)\n      removeListener: boolean;\n      // True if we're adding a new event listener (e.g. because first render, or settings changed)\n      addListener: boolean;\n    }\n\n    export interface CommitToElementBinding {\n      kind: 'commit to element binding';\n      element: Element;\n      value: unknown;\n      options: RenderOptions | undefined;\n    }\n  }\n}\n\ninterface DebugLoggingWindow {\n  // Even in dev mode, we generally don't want to emit these events, as that's\n  // another level of cost, so only emit them when DEV_MODE is true _and_ when\n  // window.emitLitDebugEvents is true.\n  emitLitDebugLogEvents?: boolean;\n}\n\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n  ? (event: LitUnstable.DebugLog.Entry) => {\n      const shouldEmit = (global as unknown as DebugLoggingWindow)\n        .emitLitDebugLogEvents;\n      if (!shouldEmit) {\n        return;\n      }\n      global.dispatchEvent(\n        new CustomEvent<LitUnstable.DebugLog.Entry>('lit-debug', {\n          detail: event,\n        })\n      );\n    }\n  : undefined;\n// Used for connecting beginRender and endRender events when there are nested\n// renders when errors are thrown preventing an endRender event from being\n// called.\nlet debugLogRenderId = 0;\n\nlet issueWarning: (code: string, warning: string) => void;\n\nif (DEV_MODE) {\n  global.litIssuedWarnings ??= new Set();\n\n  // Issue a warning, if we haven't already.\n  issueWarning = (code: string, warning: string) => {\n    warning += code\n      ? ` See https://lit.dev/msg/${code} for more information.`\n      : '';\n    if (!global.litIssuedWarnings!.has(warning)) {\n      console.warn(warning);\n      global.litIssuedWarnings!.add(warning);\n    }\n  };\n\n  issueWarning(\n    'dev-mode',\n    `Lit is in dev mode. Not recommended for production!`\n  );\n}\n\nconst wrap =\n  ENABLE_SHADYDOM_NOPATCH &&\n  global.ShadyDOM?.inUse &&\n  global.ShadyDOM?.noPatch === true\n    ? global.ShadyDOM!.wrap\n    : (node: Node) => node;\n\nconst trustedTypes = (global as unknown as Partial<Window>).trustedTypes;\n\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = trustedTypes\n  ? trustedTypes.createPolicy('lit-html', {\n      createHTML: (s) => s,\n    })\n  : undefined;\n\n/**\n * Used to sanitize any value before it is written into the DOM. This can be\n * used to implement a security policy of allowed and disallowed values in\n * order to prevent XSS attacks.\n *\n * One way of using this callback would be to check attributes and properties\n * against a list of high risk fields, and require that values written to such\n * fields be instances of a class which is safe by construction. Closure's Safe\n * HTML Types is one implementation of this technique (\n * https://github.com/google/safe-html-types/blob/master/doc/safehtml-types.md).\n * The TrustedTypes polyfill in API-only mode could also be used as a basis\n * for this technique (https://github.com/WICG/trusted-types).\n *\n * @param node The HTML node (usually either a #text node or an Element) that\n *     is being written to. Note that this is just an exemplar node, the write\n *     may take place against another instance of the same class of node.\n * @param name The name of an attribute or property (for example, 'href').\n * @param type Indicates whether the write that's about to be performed will\n *     be to a property or a node.\n * @return A function that will sanitize this class of writes.\n */\nexport type SanitizerFactory = (\n  node: Node,\n  name: string,\n  type: 'property' | 'attribute'\n) => ValueSanitizer;\n\n/**\n * A function which can sanitize values that will be written to a specific kind\n * of DOM sink.\n *\n * See SanitizerFactory.\n *\n * @param value The value to sanitize. Will be the actual value passed into\n *     the lit-html template literal, so this could be of any type.\n * @return The value to write to the DOM. Usually the same as the input value,\n *     unless sanitization is needed.\n */\nexport type ValueSanitizer = (value: unknown) => unknown;\n\nconst identityFunction: ValueSanitizer = (value: unknown) => value;\nconst noopSanitizer: SanitizerFactory = (\n  _node: Node,\n  _name: string,\n  _type: 'property' | 'attribute'\n) => identityFunction;\n\n/** Sets the global sanitizer factory. */\nconst setSanitizer = (newSanitizer: SanitizerFactory) => {\n  if (!ENABLE_EXTRA_SECURITY_HOOKS) {\n    return;\n  }\n  if (sanitizerFactoryInternal !== noopSanitizer) {\n    throw new Error(\n      `Attempted to overwrite existing lit-html security policy.` +\n        ` setSanitizeDOMValueFactory should be called at most once.`\n    );\n  }\n  sanitizerFactoryInternal = newSanitizer;\n};\n\n/**\n * Only used in internal tests, not a part of the public API.\n */\nconst _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => {\n  sanitizerFactoryInternal = noopSanitizer;\n};\n\nconst createSanitizer: SanitizerFactory = (node, name, type) => {\n  return sanitizerFactoryInternal(node, name, type);\n};\n\n// Added to an attribute name to mark the attribute as bound so we can find\n// it easily.\nconst boundAttributeSuffix = '$lit$';\n\n// This marker is used in many syntactic positions in HTML, so it must be\n// a valid element name and attribute name. We don't support dynamic names (yet)\n// but this at least ensures that the parse tree is closer to the template\n// intention.\nconst marker = `lit$${String(Math.random()).slice(9)}$`;\n\n// String used to tell if a comment is a marker comment\nconst markerMatch = '?' + marker;\n\n// Text used to insert a comment marker node. We use processing instruction\n// syntax because it's slightly smaller, but parses as a comment node.\nconst nodeMarker = `<${markerMatch}>`;\n\nconst d =\n  NODE_MODE && global.document === undefined\n    ? ({\n        createTreeWalker() {\n          return {};\n        },\n      } as unknown as Document)\n    : document;\n\n// Creates a dynamic marker. We never have to search for these in the DOM.\nconst createMarker = () => d.createComment('');\n\n// https://tc39.github.io/ecma262/#sec-typeof-operator\ntype Primitive = null | undefined | boolean | number | string | symbol | bigint;\nconst isPrimitive = (value: unknown): value is Primitive =>\n  value === null || (typeof value != 'object' && typeof value != 'function');\nconst isArray = Array.isArray;\nconst isIterable = (value: unknown): value is Iterable<unknown> =>\n  isArray(value) ||\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  typeof (value as any)?.[Symbol.iterator] === 'function';\n\nconst SPACE_CHAR = `[ \\t\\n\\f\\r]`;\nconst ATTR_VALUE_CHAR = `[^ \\t\\n\\f\\r\"'\\`<>=]`;\nconst NAME_CHAR = `[^\\\\s\"'>=/]`;\n\n// These regexes represent the five parsing states that we care about in the\n// Template's HTML scanner. They match the *end* of the state they're named\n// after.\n// Depending on the match, we transition to a new state. If there's no match,\n// we stay in the same state.\n// Note that the regexes are stateful. We utilize lastIndex and sync it\n// across the multiple regexes used. In addition to the five regexes below\n// we also dynamically create a regex to find the matching end tags for raw\n// text elements.\n\n/**\n * End of text is: `<` followed by:\n *   (comment start) or (tag) or (dynamic tag binding)\n */\nconst textEndRegex = /<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g;\nconst COMMENT_START = 1;\nconst TAG_NAME = 2;\nconst DYNAMIC_TAG_NAME = 3;\n\nconst commentEndRegex = /-->/g;\n/**\n * Comments not started with <!--, like </{, can be ended by a single `>`\n */\nconst comment2EndRegex = />/g;\n\n/**\n * The tagEnd regex matches the end of the \"inside an opening\" tag syntax\n * position. It either matches a `>`, an attribute-like sequence, or the end\n * of the string after a space (attribute-name position ending).\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * \" \\t\\n\\f\\r\" are HTML space characters:\n * https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * So an attribute is:\n *  * The name: any character except a whitespace character, (\"), ('), \">\",\n *    \"=\", or \"/\". Note: this is different from the HTML spec which also excludes control characters.\n *  * Followed by zero or more space characters\n *  * Followed by \"=\"\n *  * Followed by zero or more space characters\n *  * Followed by:\n *    * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n *    * (\") then any non-(\"), or\n *    * (') then any non-(')\n */\nconst tagEndRegex = new RegExp(\n  `>|${SPACE_CHAR}(?:(${NAME_CHAR}+)(${SPACE_CHAR}*=${SPACE_CHAR}*(?:${ATTR_VALUE_CHAR}|(\"|')|))|$)`,\n  'g'\n);\nconst ENTIRE_MATCH = 0;\nconst ATTRIBUTE_NAME = 1;\nconst SPACES_AND_EQUALS = 2;\nconst QUOTE_CHAR = 3;\n\nconst singleQuoteAttrEndRegex = /'/g;\nconst doubleQuoteAttrEndRegex = /\"/g;\n/**\n * Matches the raw text elements.\n *\n * Comments are not parsed within raw text elements, so we need to search their\n * text content for marker strings.\n */\nconst rawTextElement = /^(?:script|style|textarea|title)$/i;\n\n/** TemplateResult types */\nconst HTML_RESULT = 1;\nconst SVG_RESULT = 2;\n\ntype ResultType = typeof HTML_RESULT | typeof SVG_RESULT;\n\n// TemplatePart types\n// IMPORTANT: these must match the values in PartType\nconst ATTRIBUTE_PART = 1;\nconst CHILD_PART = 2;\nconst PROPERTY_PART = 3;\nconst BOOLEAN_ATTRIBUTE_PART = 4;\nconst EVENT_PART = 5;\nconst ELEMENT_PART = 6;\nconst COMMENT_PART = 7;\n\n/**\n * The return type of the template tag functions, {@linkcode html} and\n * {@linkcode svg}.\n *\n * A `TemplateResult` object holds all the information about a template\n * expression required to render it: the template strings, expression values,\n * and type of template (html or svg).\n *\n * `TemplateResult` objects do not create any DOM on their own. To create or\n * update DOM you need to render the `TemplateResult`. See\n * [Rendering](https://lit.dev/docs/components/rendering) for more information.\n *\n */\nexport type TemplateResult<T extends ResultType = ResultType> = {\n  // This property needs to remain unminified.\n  ['_$litType$']: T;\n  strings: TemplateStringsArray;\n  values: unknown[];\n};\n\nexport type HTMLTemplateResult = TemplateResult<typeof HTML_RESULT>;\n\nexport type SVGTemplateResult = TemplateResult<typeof SVG_RESULT>;\n\nexport interface CompiledTemplateResult {\n  // This is a factory in order to make template initialization lazy\n  // and allow ShadyRenderOptions scope to be passed in.\n  // This property needs to remain unminified.\n  ['_$litType$']: CompiledTemplate;\n  values: unknown[];\n}\n\nexport interface CompiledTemplate extends Omit<Template, 'el'> {\n  // el is overridden to be optional. We initialize it on first render\n  el?: HTMLTemplateElement;\n\n  // The prepared HTML string to create a template element from.\n  // The type is a TemplateStringsArray to guarantee that the value came from\n  // source code, preventing a JSON injection attack.\n  h: TemplateStringsArray;\n}\n\n/**\n * Generates a template literal tag function that returns a TemplateResult with\n * the given result type.\n */\nconst tag =\n  <T extends ResultType>(type: T) =>\n  (strings: TemplateStringsArray, ...values: unknown[]): TemplateResult<T> => {\n    // Warn against templates octal escape sequences\n    // We do this here rather than in render so that the warning is closer to the\n    // template definition.\n    if (DEV_MODE && strings.some((s) => s === undefined)) {\n      console.warn(\n        'Some template strings are undefined.\\n' +\n          'This is probably caused by illegal octal escape sequences.'\n      );\n    }\n    return {\n      // This property needs to remain unminified.\n      ['_$litType$']: type,\n      strings,\n      values,\n    };\n  };\n\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n *\n * ```ts\n * const header = (title: string) => html`<h1>${title}</h1>`;\n * ```\n *\n * The `html` tag returns a description of the DOM to render as a value. It is\n * lazy, meaning no work is done until the template is rendered. When rendering,\n * if a template comes from the same expression as a previously rendered result,\n * it's efficiently updated instead of replaced.\n */\nexport const html = tag(HTML_RESULT);\n\n/**\n * Interprets a template literal as an SVG fragment that can efficiently\n * render to and update a container.\n *\n * ```ts\n * const rect = svg`<rect width=\"10\" height=\"10\"></rect>`;\n *\n * const myImage = html`\n *   <svg viewBox=\"0 0 10 10\" xmlns=\"http://www.w3.org/2000/svg\">\n *     ${rect}\n *   </svg>`;\n * ```\n *\n * The `svg` *tag function* should only be used for SVG fragments, or elements\n * that would be contained **inside** an `<svg>` HTML element. A common error is\n * placing an `<svg>` *element* in a template tagged with the `svg` tag\n * function. The `<svg>` element is an HTML element and should be used within a\n * template tagged with the {@linkcode html} tag function.\n *\n * In LitElement usage, it's invalid to return an SVG fragment from the\n * `render()` method, as the SVG fragment will be contained within the element's\n * shadow root and thus cannot be used within an `<svg>` HTML element.\n */\nexport const svg = tag(SVG_RESULT);\n\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange = Symbol.for('lit-noChange');\n\n/**\n * A sentinel value that signals a ChildPart to fully clear its content.\n *\n * ```ts\n * const button = html`${\n *  user.isAdmin\n *    ? html`<button>DELETE</button>`\n *    : nothing\n * }`;\n * ```\n *\n * Prefer using `nothing` over other falsy values as it provides a consistent\n * behavior between various expression binding contexts.\n *\n * In child expressions, `undefined`, `null`, `''`, and `nothing` all behave the\n * same and render no nodes. In attribute expressions, `nothing` _removes_ the\n * attribute, while `undefined` and `null` will render an empty string. In\n * property expressions `nothing` becomes `undefined`.\n */\nexport const nothing = Symbol.for('lit-nothing');\n\n/**\n * The cache of prepared templates, keyed by the tagged TemplateStringsArray\n * and _not_ accounting for the specific template tag used. This means that\n * template tags cannot be dynamic - the must statically be one of html, svg,\n * or attr. This restriction simplifies the cache lookup, which is on the hot\n * path for rendering.\n */\nconst templateCache = new WeakMap<TemplateStringsArray, Template>();\n\n/**\n * Object specifying options for controlling lit-html rendering. Note that\n * while `render` may be called multiple times on the same `container` (and\n * `renderBefore` reference node) to efficiently update the rendered content,\n * only the options passed in during the first render are respected during\n * the lifetime of renders to that unique `container` + `renderBefore`\n * combination.\n */\nexport interface RenderOptions {\n  /**\n   * An object to use as the `this` value for event listeners. It's often\n   * useful to set this to the host component rendering a template.\n   */\n  host?: object;\n  /**\n   * A DOM node before which to render content in the container.\n   */\n  renderBefore?: ChildNode | null;\n  /**\n   * Node used for cloning the template (`importNode` will be called on this\n   * node). This controls the `ownerDocument` of the rendered DOM, along with\n   * any inherited context. Defaults to the global `document`.\n   */\n  creationScope?: {importNode(node: Node, deep?: boolean): Node};\n  /**\n   * The initial connected state for the top-level part being rendered. If no\n   * `isConnected` option is set, `AsyncDirective`s will be connected by\n   * default. Set to `false` if the initial render occurs in a disconnected tree\n   * and `AsyncDirective`s should see `isConnected === false` for their initial\n   * render. The `part.setConnected()` method must be used subsequent to initial\n   * render to change the connected state of the part.\n   */\n  isConnected?: boolean;\n}\n\nconst walker = d.createTreeWalker(\n  d,\n  129 /* NodeFilter.SHOW_{ELEMENT|COMMENT} */,\n  null,\n  false\n);\n\nlet sanitizerFactoryInternal: SanitizerFactory = noopSanitizer;\n\n//\n// Classes only below here, const variable declarations only above here...\n//\n// Keeping variable declarations and classes together improves minification.\n// Interfaces and type aliases can be interleaved freely.\n//\n\n// Type for classes that have a `_directive` or `_directives[]` field, used by\n// `resolveDirective`\nexport interface DirectiveParent {\n  _$parent?: DirectiveParent;\n  _$isConnected: boolean;\n  __directive?: Directive;\n  __directives?: Array<Directive | undefined>;\n}\n\nfunction trustFromTemplateString(\n  tsa: TemplateStringsArray,\n  stringFromTSA: string\n): TrustedHTML {\n  // A security check to prevent spoofing of Lit template results.\n  // In the future, we may be able to replace this with Array.isTemplateObject,\n  // though we might need to make that check inside of the html and svg\n  // functions, because precompiled templates don't come in as\n  // TemplateStringArray objects.\n  if (!Array.isArray(tsa) || !tsa.hasOwnProperty('raw')) {\n    let message = 'invalid template strings array';\n    if (DEV_MODE) {\n      message = `\n          Internal Error: expected template strings to be an array\n          with a 'raw' field. Faking a template strings array by\n          calling html or svg like an ordinary function is effectively\n          the same as calling unsafeHtml and can lead to major security\n          issues, e.g. opening your code up to XSS attacks.\n          If you're using the html or svg tagged template functions normally\n          and still seeing this error, please file a bug at\n          https://github.com/lit/lit/issues/new?template=bug_report.md\n          and include information about your build tooling, if any.\n        `\n        .trim()\n        .replace(/\\n */g, '\\n');\n    }\n    throw new Error(message);\n  }\n  return policy !== undefined\n    ? policy.createHTML(stringFromTSA)\n    : (stringFromTSA as unknown as TrustedHTML);\n}\n\n/**\n * Returns an HTML string for the given TemplateStringsArray and result type\n * (HTML or SVG), along with the case-sensitive bound attribute names in\n * template order. The HTML contains comment markers denoting the `ChildPart`s\n * and suffixes on bound attributes denoting the `AttributeParts`.\n *\n * @param strings template strings array\n * @param type HTML or SVG\n * @return Array containing `[html, attrNames]` (array returned for terseness,\n *     to avoid object fields since this code is shared with non-minified SSR\n *     code)\n */\nconst getTemplateHtml = (\n  strings: TemplateStringsArray,\n  type: ResultType\n): [TrustedHTML, Array<string | undefined>] => {\n  // Insert makers into the template HTML to represent the position of\n  // bindings. The following code scans the template strings to determine the\n  // syntactic position of the bindings. They can be in text position, where\n  // we insert an HTML comment, attribute value position, where we insert a\n  // sentinel string and re-write the attribute name, or inside a tag where\n  // we insert the sentinel string.\n  const l = strings.length - 1;\n  // Stores the case-sensitive bound attribute names in the order of their\n  // parts. ElementParts are also reflected in this array as undefined\n  // rather than a string, to disambiguate from attribute bindings.\n  const attrNames: Array<string | undefined> = [];\n  let html = type === SVG_RESULT ? '<svg>' : '';\n\n  // When we're inside a raw text tag (not it's text content), the regex\n  // will still be tagRegex so we can find attributes, but will switch to\n  // this regex when the tag ends.\n  let rawTextEndRegex: RegExp | undefined;\n\n  // The current parsing state, represented as a reference to one of the\n  // regexes\n  let regex = textEndRegex;\n\n  for (let i = 0; i < l; i++) {\n    const s = strings[i];\n    // The index of the end of the last attribute name. When this is\n    // positive at end of a string, it means we're in an attribute value\n    // position and need to rewrite the attribute name.\n    // We also use a special value of -2 to indicate that we encountered\n    // the end of a string in attribute name position.\n    let attrNameEndIndex = -1;\n    let attrName: string | undefined;\n    let lastIndex = 0;\n    let match!: RegExpExecArray | null;\n\n    // The conditions in this loop handle the current parse state, and the\n    // assignments to the `regex` variable are the state transitions.\n    while (lastIndex < s.length) {\n      // Make sure we start searching from where we previously left off\n      regex.lastIndex = lastIndex;\n      match = regex.exec(s);\n      if (match === null) {\n        break;\n      }\n      lastIndex = regex.lastIndex;\n      if (regex === textEndRegex) {\n        if (match[COMMENT_START] === '!--') {\n          regex = commentEndRegex;\n        } else if (match[COMMENT_START] !== undefined) {\n          // We started a weird comment, like </{\n          regex = comment2EndRegex;\n        } else if (match[TAG_NAME] !== undefined) {\n          if (rawTextElement.test(match[TAG_NAME])) {\n            // Record if we encounter a raw-text element. We'll switch to\n            // this regex at the end of the tag.\n            rawTextEndRegex = new RegExp(`</${match[TAG_NAME]}`, 'g');\n          }\n          regex = tagEndRegex;\n        } else if (match[DYNAMIC_TAG_NAME] !== undefined) {\n          if (DEV_MODE) {\n            throw new Error(\n              'Bindings in tag names are not supported. Please use static templates instead. ' +\n                'See https://lit.dev/docs/templates/expressions/#static-expressions'\n            );\n          }\n          regex = tagEndRegex;\n        }\n      } else if (regex === tagEndRegex) {\n        if (match[ENTIRE_MATCH] === '>') {\n          // End of a tag. If we had started a raw-text element, use that\n          // regex\n          regex = rawTextEndRegex ?? textEndRegex;\n          // We may be ending an unquoted attribute value, so make sure we\n          // clear any pending attrNameEndIndex\n          attrNameEndIndex = -1;\n        } else if (match[ATTRIBUTE_NAME] === undefined) {\n          // Attribute name position\n          attrNameEndIndex = -2;\n        } else {\n          attrNameEndIndex = regex.lastIndex - match[SPACES_AND_EQUALS].length;\n          attrName = match[ATTRIBUTE_NAME];\n          regex =\n            match[QUOTE_CHAR] === undefined\n              ? tagEndRegex\n              : match[QUOTE_CHAR] === '\"'\n              ? doubleQuoteAttrEndRegex\n              : singleQuoteAttrEndRegex;\n        }\n      } else if (\n        regex === doubleQuoteAttrEndRegex ||\n        regex === singleQuoteAttrEndRegex\n      ) {\n        regex = tagEndRegex;\n      } else if (regex === commentEndRegex || regex === comment2EndRegex) {\n        regex = textEndRegex;\n      } else {\n        // Not one of the five state regexes, so it must be the dynamically\n        // created raw text regex and we're at the close of that element.\n        regex = tagEndRegex;\n        rawTextEndRegex = undefined;\n      }\n    }\n\n    if (DEV_MODE) {\n      // If we have a attrNameEndIndex, which indicates that we should\n      // rewrite the attribute name, assert that we're in a valid attribute\n      // position - either in a tag, or a quoted attribute value.\n      console.assert(\n        attrNameEndIndex === -1 ||\n          regex === tagEndRegex ||\n          regex === singleQuoteAttrEndRegex ||\n          regex === doubleQuoteAttrEndRegex,\n        'unexpected parse state B'\n      );\n    }\n\n    // We have four cases:\n    //  1. We're in text position, and not in a raw text element\n    //     (regex === textEndRegex): insert a comment marker.\n    //  2. We have a non-negative attrNameEndIndex which means we need to\n    //     rewrite the attribute name to add a bound attribute suffix.\n    //  3. We're at the non-first binding in a multi-binding attribute, use a\n    //     plain marker.\n    //  4. We're somewhere else inside the tag. If we're in attribute name\n    //     position (attrNameEndIndex === -2), add a sequential suffix to\n    //     generate a unique attribute name.\n\n    // Detect a binding next to self-closing tag end and insert a space to\n    // separate the marker from the tag end:\n    const end =\n      regex === tagEndRegex && strings[i + 1].startsWith('/>') ? ' ' : '';\n    html +=\n      regex === textEndRegex\n        ? s + nodeMarker\n        : attrNameEndIndex >= 0\n        ? (attrNames.push(attrName!),\n          s.slice(0, attrNameEndIndex) +\n            boundAttributeSuffix +\n            s.slice(attrNameEndIndex)) +\n          marker +\n          end\n        : s +\n          marker +\n          (attrNameEndIndex === -2 ? (attrNames.push(undefined), i) : end);\n  }\n\n  const htmlResult: string | TrustedHTML =\n    html + (strings[l] || '<?>') + (type === SVG_RESULT ? '</svg>' : '');\n\n  // Returned as an array for terseness\n  return [trustFromTemplateString(strings, htmlResult), attrNames];\n};\n\n/** @internal */\nexport type {Template};\nclass Template {\n  /** @internal */\n  el!: HTMLTemplateElement;\n\n  parts: Array<TemplatePart> = [];\n\n  constructor(\n    // This property needs to remain unminified.\n    {strings, ['_$litType$']: type}: TemplateResult,\n    options?: RenderOptions\n  ) {\n    let node: Node | null;\n    let nodeIndex = 0;\n    let attrNameIndex = 0;\n    const partCount = strings.length - 1;\n    const parts = this.parts;\n\n    // Create template element\n    const [html, attrNames] = getTemplateHtml(strings, type);\n    this.el = Template.createElement(html, options);\n    walker.currentNode = this.el.content;\n\n    // Reparent SVG nodes into template root\n    if (type === SVG_RESULT) {\n      const content = this.el.content;\n      const svgElement = content.firstChild!;\n      svgElement.remove();\n      content.append(...svgElement.childNodes);\n    }\n\n    // Walk the template to find binding markers and create TemplateParts\n    while ((node = walker.nextNode()) !== null && parts.length < partCount) {\n      if (node.nodeType === 1) {\n        if (DEV_MODE) {\n          const tag = (node as Element).localName;\n          // Warn if `textarea` includes an expression and throw if `template`\n          // does since these are not supported. We do this by checking\n          // innerHTML for anything that looks like a marker. This catches\n          // cases like bindings in textarea there markers turn into text nodes.\n          if (\n            /^(?:textarea|template)$/i!.test(tag) &&\n            (node as Element).innerHTML.includes(marker)\n          ) {\n            const m =\n              `Expressions are not supported inside \\`${tag}\\` ` +\n              `elements. See https://lit.dev/msg/expression-in-${tag} for more ` +\n              `information.`;\n            if (tag === 'template') {\n              throw new Error(m);\n            } else issueWarning('', m);\n          }\n        }\n        // TODO (justinfagnani): for attempted dynamic tag names, we don't\n        // increment the bindingIndex, and it'll be off by 1 in the element\n        // and off by two after it.\n        if ((node as Element).hasAttributes()) {\n          // We defer removing bound attributes because on IE we might not be\n          // iterating attributes in their template order, and would sometimes\n          // remove an attribute that we still need to create a part for.\n          const attrsToRemove = [];\n          for (const name of (node as Element).getAttributeNames()) {\n            // `name` is the name of the attribute we're iterating over, but not\n            // _necessarily_ the name of the attribute we will create a part\n            // for. They can be different in browsers that don't iterate on\n            // attributes in source order. In that case the attrNames array\n            // contains the attribute name we'll process next. We only need the\n            // attribute name here to know if we should process a bound attribute\n            // on this element.\n            if (\n              name.endsWith(boundAttributeSuffix) ||\n              name.startsWith(marker)\n            ) {\n              const realName = attrNames[attrNameIndex++];\n              attrsToRemove.push(name);\n              if (realName !== undefined) {\n                // Lowercase for case-sensitive SVG attributes like viewBox\n                const value = (node as Element).getAttribute(\n                  realName.toLowerCase() + boundAttributeSuffix\n                )!;\n                const statics = value.split(marker);\n                const m = /([.?@])?(.*)/.exec(realName)!;\n                parts.push({\n                  type: ATTRIBUTE_PART,\n                  index: nodeIndex,\n                  name: m[2],\n                  strings: statics,\n                  ctor:\n                    m[1] === '.'\n                      ? PropertyPart\n                      : m[1] === '?'\n                      ? BooleanAttributePart\n                      : m[1] === '@'\n                      ? EventPart\n                      : AttributePart,\n                });\n              } else {\n                parts.push({\n                  type: ELEMENT_PART,\n                  index: nodeIndex,\n                });\n              }\n            }\n          }\n          for (const name of attrsToRemove) {\n            (node as Element).removeAttribute(name);\n          }\n        }\n        // TODO (justinfagnani): benchmark the regex against testing for each\n        // of the 3 raw text element names.\n        if (rawTextElement.test((node as Element).tagName)) {\n          // For raw text elements we need to split the text content on\n          // markers, create a Text node for each segment, and create\n          // a TemplatePart for each marker.\n          const strings = (node as Element).textContent!.split(marker);\n          const lastIndex = strings.length - 1;\n          if (lastIndex > 0) {\n            (node as Element).textContent = trustedTypes\n              ? (trustedTypes.emptyScript as unknown as '')\n              : '';\n            // Generate a new text node for each literal section\n            // These nodes are also used as the markers for node parts\n            // We can't use empty text nodes as markers because they're\n            // normalized when cloning in IE (could simplify when\n            // IE is no longer supported)\n            for (let i = 0; i < lastIndex; i++) {\n              (node as Element).append(strings[i], createMarker());\n              // Walk past the marker node we just added\n              walker.nextNode();\n              parts.push({type: CHILD_PART, index: ++nodeIndex});\n            }\n            // Note because this marker is added after the walker's current\n            // node, it will be walked to in the outer loop (and ignored), so\n            // we don't need to adjust nodeIndex here\n            (node as Element).append(strings[lastIndex], createMarker());\n          }\n        }\n      } else if (node.nodeType === 8) {\n        const data = (node as Comment).data;\n        if (data === markerMatch) {\n          parts.push({type: CHILD_PART, index: nodeIndex});\n        } else {\n          let i = -1;\n          while ((i = (node as Comment).data.indexOf(marker, i + 1)) !== -1) {\n            // Comment node has a binding marker inside, make an inactive part\n            // The binding won't work, but subsequent bindings will\n            parts.push({type: COMMENT_PART, index: nodeIndex});\n            // Move to the end of the match\n            i += marker.length - 1;\n          }\n        }\n      }\n      nodeIndex++;\n    }\n    // We could set walker.currentNode to another node here to prevent a memory\n    // leak, but every time we prepare a template, we immediately render it\n    // and re-use the walker in new TemplateInstance._clone().\n    debugLogEvent?.({\n      kind: 'template prep',\n      template: this,\n      clonableTemplate: this.el,\n      parts: this.parts,\n      strings,\n    });\n  }\n\n  // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n  /** @nocollapse */\n  static createElement(html: TrustedHTML, _options?: RenderOptions) {\n    const el = d.createElement('template');\n    el.innerHTML = html as unknown as string;\n    return el;\n  }\n}\n\nexport interface Disconnectable {\n  _$parent?: Disconnectable;\n  _$disconnectableChildren?: Set<Disconnectable>;\n  // Rather than hold connection state on instances, Disconnectables recursively\n  // fetch the connection state from the RootPart they are connected in via\n  // getters up the Disconnectable tree via _$parent references. This pushes the\n  // cost of tracking the isConnected state to `AsyncDirectives`, and avoids\n  // needing to pass all Disconnectables (parts, template instances, and\n  // directives) their connection state each time it changes, which would be\n  // costly for trees that have no AsyncDirectives.\n  _$isConnected: boolean;\n}\n\nfunction resolveDirective(\n  part: ChildPart | AttributePart | ElementPart,\n  value: unknown,\n  parent: DirectiveParent = part,\n  attributeIndex?: number\n): unknown {\n  // Bail early if the value is explicitly noChange. Note, this means any\n  // nested directive is still attached and is not run.\n  if (value === noChange) {\n    return value;\n  }\n  let currentDirective =\n    attributeIndex !== undefined\n      ? (parent as AttributePart).__directives?.[attributeIndex]\n      : (parent as ChildPart | ElementPart | Directive).__directive;\n  const nextDirectiveConstructor = isPrimitive(value)\n    ? undefined\n    : // This property needs to remain unminified.\n      (value as DirectiveResult)['_$litDirective$'];\n  if (currentDirective?.constructor !== nextDirectiveConstructor) {\n    // This property needs to remain unminified.\n    currentDirective?.['_$notifyDirectiveConnectionChanged']?.(false);\n    if (nextDirectiveConstructor === undefined) {\n      currentDirective = undefined;\n    } else {\n      currentDirective = new nextDirectiveConstructor(part as PartInfo);\n      currentDirective._$initialize(part, parent, attributeIndex);\n    }\n    if (attributeIndex !== undefined) {\n      ((parent as AttributePart).__directives ??= [])[attributeIndex] =\n        currentDirective;\n    } else {\n      (parent as ChildPart | Directive).__directive = currentDirective;\n    }\n  }\n  if (currentDirective !== undefined) {\n    value = resolveDirective(\n      part,\n      currentDirective._$resolve(part, (value as DirectiveResult).values),\n      currentDirective,\n      attributeIndex\n    );\n  }\n  return value;\n}\n\nexport type {TemplateInstance};\n/**\n * An updateable instance of a Template. Holds references to the Parts used to\n * update the template instance.\n */\nclass TemplateInstance implements Disconnectable {\n  _$template: Template;\n  _$parts: Array<Part | undefined> = [];\n\n  /** @internal */\n  _$parent: ChildPart;\n  /** @internal */\n  _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n  constructor(template: Template, parent: ChildPart) {\n    this._$template = template;\n    this._$parent = parent;\n  }\n\n  // Called by ChildPart parentNode getter\n  get parentNode() {\n    return this._$parent.parentNode;\n  }\n\n  // See comment in Disconnectable interface for why this is a getter\n  get _$isConnected() {\n    return this._$parent._$isConnected;\n  }\n\n  // This method is separate from the constructor because we need to return a\n  // DocumentFragment and we don't want to hold onto it with an instance field.\n  _clone(options: RenderOptions | undefined) {\n    const {\n      el: {content},\n      parts: parts,\n    } = this._$template;\n    const fragment = (options?.creationScope ?? d).importNode(content, true);\n    walker.currentNode = fragment;\n\n    let node = walker.nextNode()!;\n    let nodeIndex = 0;\n    let partIndex = 0;\n    let templatePart = parts[0];\n\n    while (templatePart !== undefined) {\n      if (nodeIndex === templatePart.index) {\n        let part: Part | undefined;\n        if (templatePart.type === CHILD_PART) {\n          part = new ChildPart(\n            node as HTMLElement,\n            node.nextSibling,\n            this,\n            options\n          );\n        } else if (templatePart.type === ATTRIBUTE_PART) {\n          part = new templatePart.ctor(\n            node as HTMLElement,\n            templatePart.name,\n            templatePart.strings,\n            this,\n            options\n          );\n        } else if (templatePart.type === ELEMENT_PART) {\n          part = new ElementPart(node as HTMLElement, this, options);\n        }\n        this._$parts.push(part);\n        templatePart = parts[++partIndex];\n      }\n      if (nodeIndex !== templatePart?.index) {\n        node = walker.nextNode()!;\n        nodeIndex++;\n      }\n    }\n    // We need to set the currentNode away from the cloned tree so that we\n    // don't hold onto the tree even if the tree is detached and should be\n    // freed.\n    walker.currentNode = d;\n    return fragment;\n  }\n\n  _update(values: Array<unknown>) {\n    let i = 0;\n    for (const part of this._$parts) {\n      if (part !== undefined) {\n        debugLogEvent?.({\n          kind: 'set part',\n          part,\n          value: values[i],\n          valueIndex: i,\n          values,\n          templateInstance: this,\n        });\n        if ((part as AttributePart).strings !== undefined) {\n          (part as AttributePart)._$setValue(values, part as AttributePart, i);\n          // The number of values the part consumes is part.strings.length - 1\n          // since values are in between template spans. We increment i by 1\n          // later in the loop, so increment it by part.strings.length - 2 here\n          i += (part as AttributePart).strings!.length - 2;\n        } else {\n          part._$setValue(values[i]);\n        }\n      }\n      i++;\n    }\n  }\n}\n\n/*\n * Parts\n */\ntype AttributeTemplatePart = {\n  readonly type: typeof ATTRIBUTE_PART;\n  readonly index: number;\n  readonly name: string;\n  readonly ctor: typeof AttributePart;\n  readonly strings: ReadonlyArray<string>;\n};\ntype ChildTemplatePart = {\n  readonly type: typeof CHILD_PART;\n  readonly index: number;\n};\ntype ElementTemplatePart = {\n  readonly type: typeof ELEMENT_PART;\n  readonly index: number;\n};\ntype CommentTemplatePart = {\n  readonly type: typeof COMMENT_PART;\n  readonly index: number;\n};\n\n/**\n * A TemplatePart represents a dynamic part in a template, before the template\n * is instantiated. When a template is instantiated Parts are created from\n * TemplateParts.\n */\ntype TemplatePart =\n  | ChildTemplatePart\n  | AttributeTemplatePart\n  | ElementTemplatePart\n  | CommentTemplatePart;\n\nexport type Part =\n  | ChildPart\n  | AttributePart\n  | PropertyPart\n  | BooleanAttributePart\n  | ElementPart\n  | EventPart;\n\nexport type {ChildPart};\nclass ChildPart implements Disconnectable {\n  readonly type = CHILD_PART;\n  readonly options: RenderOptions | undefined;\n  _$committedValue: unknown = nothing;\n  /** @internal */\n  __directive?: Directive;\n  /** @internal */\n  _$startNode: ChildNode;\n  /** @internal */\n  _$endNode: ChildNode | null;\n  private _textSanitizer: ValueSanitizer | undefined;\n  /** @internal */\n  _$parent: Disconnectable | undefined;\n  /**\n   * Connection state for RootParts only (i.e. ChildPart without _$parent\n   * returned from top-level `render`). This field is unsed otherwise. The\n   * intention would clearer if we made `RootPart` a subclass of `ChildPart`\n   * with this field (and a different _$isConnected getter), but the subclass\n   * caused a perf regression, possibly due to making call sites polymorphic.\n   * @internal\n   */\n  __isConnected: boolean;\n\n  // See comment in Disconnectable interface for why this is a getter\n  get _$isConnected() {\n    // ChildParts that are not at the root should always be created with a\n    // parent; only RootChildNode's won't, so they return the local isConnected\n    // state\n    return this._$parent?._$isConnected ?? this.__isConnected;\n  }\n\n  // The following fields will be patched onto ChildParts when required by\n  // AsyncDirective\n  /** @internal */\n  _$disconnectableChildren?: Set<Disconnectable> = undefined;\n  /** @internal */\n  _$notifyConnectionChanged?(\n    isConnected: boolean,\n    removeFromParent?: boolean,\n    from?: number\n  ): void;\n  /** @internal */\n  _$reparentDisconnectables?(parent: Disconnectable): void;\n\n  constructor(\n    startNode: ChildNode,\n    endNode: ChildNode | null,\n    parent: TemplateInstance | ChildPart | undefined,\n    options: RenderOptions | undefined\n  ) {\n    this._$startNode = startNode;\n    this._$endNode = endNode;\n    this._$parent = parent;\n    this.options = options;\n    // Note __isConnected is only ever accessed on RootParts (i.e. when there is\n    // no _$parent); the value on a non-root-part is \"don't care\", but checking\n    // for parent would be more code\n    this.__isConnected = options?.isConnected ?? true;\n    if (ENABLE_EXTRA_SECURITY_HOOKS) {\n      // Explicitly initialize for consistent class shape.\n      this._textSanitizer = undefined;\n    }\n  }\n\n  /**\n   * The parent node into which the part renders its content.\n   *\n   * A ChildPart's content consists of a range of adjacent child nodes of\n   * `.parentNode`, possibly bordered by 'marker nodes' (`.startNode` and\n   * `.endNode`).\n   *\n   * - If both `.startNode` and `.endNode` are non-null, then the part's content\n   * consists of all siblings between `.startNode` and `.endNode`, exclusively.\n   *\n   * - If `.startNode` is non-null but `.endNode` is null, then the part's\n   * content consists of all siblings following `.startNode`, up to and\n   * including the last child of `.parentNode`. If `.endNode` is non-null, then\n   * `.startNode` will always be non-null.\n   *\n   * - If both `.endNode` and `.startNode` are null, then the part's content\n   * consists of all child nodes of `.parentNode`.\n   */\n  get parentNode(): Node {\n    let parentNode: Node = wrap(this._$startNode).parentNode!;\n    const parent = this._$parent;\n    if (\n      parent !== undefined &&\n      parentNode?.nodeType === 11 /* Node.DOCUMENT_FRAGMENT */\n    ) {\n      // If the parentNode is a DocumentFragment, it may be because the DOM is\n      // still in the cloned fragment during initial render; if so, get the real\n      // parentNode the part will be committed into by asking the parent.\n      parentNode = (parent as ChildPart | TemplateInstance).parentNode;\n    }\n    return parentNode;\n  }\n\n  /**\n   * The part's leading marker node, if any. See `.parentNode` for more\n   * information.\n   */\n  get startNode(): Node | null {\n    return this._$startNode;\n  }\n\n  /**\n   * The part's trailing marker node, if any. See `.parentNode` for more\n   * information.\n   */\n  get endNode(): Node | null {\n    return this._$endNode;\n  }\n\n  _$setValue(value: unknown, directiveParent: DirectiveParent = this): void {\n    if (DEV_MODE && this.parentNode === null) {\n      throw new Error(\n        `This \\`ChildPart\\` has no \\`parentNode\\` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit's control such that the part's marker nodes were ejected from DOM. For example, setting the element's \\`innerHTML\\` or \\`textContent\\` can do this.`\n      );\n    }\n    value = resolveDirective(this, value, directiveParent);\n    if (isPrimitive(value)) {\n      // Non-rendering child values. It's important that these do not render\n      // empty text nodes to avoid issues with preventing default <slot>\n      // fallback content.\n      if (value === nothing || value == null || value === '') {\n        if (this._$committedValue !== nothing) {\n          debugLogEvent?.({\n            kind: 'commit nothing to child',\n            start: this._$startNode,\n            end: this._$endNode,\n            parent: this._$parent,\n            options: this.options,\n          });\n          this._$clear();\n        }\n        this._$committedValue = nothing;\n      } else if (value !== this._$committedValue && value !== noChange) {\n        this._commitText(value);\n      }\n      // This property needs to remain unminified.\n    } else if ((value as TemplateResult)['_$litType$'] !== undefined) {\n      this._commitTemplateResult(value as TemplateResult);\n    } else if ((value as Node).nodeType !== undefined) {\n      if (DEV_MODE && this.options?.host === value) {\n        this._commitText(\n          `[probable mistake: rendered a template's host in itself ` +\n            `(commonly caused by writing \\${this} in a template]`\n        );\n        console.warn(\n          `Attempted to render the template host`,\n          value,\n          `inside itself. This is almost always a mistake, and in dev mode `,\n          `we render some warning text. In production however, we'll `,\n          `render it, which will usually result in an error, and sometimes `,\n          `in the element disappearing from the DOM.`\n        );\n        return;\n      }\n      this._commitNode(value as Node);\n    } else if (isIterable(value)) {\n      this._commitIterable(value);\n    } else {\n      // Fallback, will render the string representation\n      this._commitText(value);\n    }\n  }\n\n  private _insert<T extends Node>(node: T) {\n    return wrap(wrap(this._$startNode).parentNode!).insertBefore(\n      node,\n      this._$endNode\n    );\n  }\n\n  private _commitNode(value: Node): void {\n    if (this._$committedValue !== value) {\n      this._$clear();\n      if (\n        ENABLE_EXTRA_SECURITY_HOOKS &&\n        sanitizerFactoryInternal !== noopSanitizer\n      ) {\n        const parentNodeName = this._$startNode.parentNode?.nodeName;\n        if (parentNodeName === 'STYLE' || parentNodeName === 'SCRIPT') {\n          let message = 'Forbidden';\n          if (DEV_MODE) {\n            if (parentNodeName === 'STYLE') {\n              message =\n                `Lit does not support binding inside style nodes. ` +\n                `This is a security risk, as style injection attacks can ` +\n                `exfiltrate data and spoof UIs. ` +\n                `Consider instead using css\\`...\\` literals ` +\n                `to compose styles, and make do dynamic styling with ` +\n                `css custom properties, ::parts, <slot>s, ` +\n                `and by mutating the DOM rather than stylesheets.`;\n            } else {\n              message =\n                `Lit does not support binding inside script nodes. ` +\n                `This is a security risk, as it could allow arbitrary ` +\n                `code execution.`;\n            }\n          }\n          throw new Error(message);\n        }\n      }\n      debugLogEvent?.({\n        kind: 'commit node',\n        start: this._$startNode,\n        parent: this._$parent,\n        value: value,\n        options: this.options,\n      });\n      this._$committedValue = this._insert(value);\n    }\n  }\n\n  private _commitText(value: unknown): void {\n    // If the committed value is a primitive it means we called _commitText on\n    // the previous render, and we know that this._$startNode.nextSibling is a\n    // Text node. We can now just replace the text content (.data) of the node.\n    if (\n      this._$committedValue !== nothing &&\n      isPrimitive(this._$committedValue)\n    ) {\n      const node = wrap(this._$startNode).nextSibling as Text;\n      if (ENABLE_EXTRA_SECURITY_HOOKS) {\n        if (this._textSanitizer === undefined) {\n          this._textSanitizer = createSanitizer(node, 'data', 'property');\n        }\n        value = this._textSanitizer(value);\n      }\n      debugLogEvent?.({\n        kind: 'commit text',\n        node,\n        value,\n        options: this.options,\n      });\n      (node as Text).data = value as string;\n    } else {\n      if (ENABLE_EXTRA_SECURITY_HOOKS) {\n        const textNode = d.createTextNode('');\n        this._commitNode(textNode);\n        // When setting text content, for security purposes it matters a lot\n        // what the parent is. For example, <style> and <script> need to be\n        // handled with care, while <span> does not. So first we need to put a\n        // text node into the document, then we can sanitize its content.\n        if (this._textSanitizer === undefined) {\n          this._textSanitizer = createSanitizer(textNode, 'data', 'property');\n        }\n        value = this._textSanitizer(value);\n        debugLogEvent?.({\n          kind: 'commit text',\n          node: textNode,\n          value,\n          options: this.options,\n        });\n        textNode.data = value as string;\n      } else {\n        this._commitNode(d.createTextNode(value as string));\n        debugLogEvent?.({\n          kind: 'commit text',\n          node: wrap(this._$startNode).nextSibling as Text,\n          value,\n          options: this.options,\n        });\n      }\n    }\n    this._$committedValue = value;\n  }\n\n  private _commitTemplateResult(\n    result: TemplateResult | CompiledTemplateResult\n  ): void {\n    // This property needs to remain unminified.\n    const {values, ['_$litType$']: type} = result;\n    // If $litType$ is a number, result is a plain TemplateResult and we get\n    // the template from the template cache. If not, result is a\n    // CompiledTemplateResult and _$litType$ is a CompiledTemplate and we need\n    // to create the <template> element the first time we see it.\n    const template: Template | CompiledTemplate =\n      typeof type === 'number'\n        ? this._$getTemplate(result as TemplateResult)\n        : (type.el === undefined &&\n            (type.el = Template.createElement(\n              trustFromTemplateString(type.h, type.h[0]),\n              this.options\n            )),\n          type);\n\n    if ((this._$committedValue as TemplateInstance)?._$template === template) {\n      debugLogEvent?.({\n        kind: 'template updating',\n        template,\n        instance: this._$committedValue as TemplateInstance,\n        parts: (this._$committedValue as TemplateInstance)._$parts,\n        options: this.options,\n        values,\n      });\n      (this._$committedValue as TemplateInstance)._update(values);\n    } else {\n      const instance = new TemplateInstance(template as Template, this);\n      const fragment = instance._clone(this.options);\n      debugLogEvent?.({\n        kind: 'template instantiated',\n        template,\n        instance,\n        parts: instance._$parts,\n        options: this.options,\n        fragment,\n        values,\n      });\n      instance._update(values);\n      debugLogEvent?.({\n        kind: 'template instantiated and updated',\n        template,\n        instance,\n        parts: instance._$parts,\n        options: this.options,\n        fragment,\n        values,\n      });\n      this._commitNode(fragment);\n      this._$committedValue = instance;\n    }\n  }\n\n  // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n  /** @internal */\n  _$getTemplate(result: TemplateResult) {\n    let template = templateCache.get(result.strings);\n    if (template === undefined) {\n      templateCache.set(result.strings, (template = new Template(result)));\n    }\n    return template;\n  }\n\n  private _commitIterable(value: Iterable<unknown>): void {\n    // For an Iterable, we create a new InstancePart per item, then set its\n    // value to the item. This is a little bit of overhead for every item in\n    // an Iterable, but it lets us recurse easily and efficiently update Arrays\n    // of TemplateResults that will be commonly returned from expressions like:\n    // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n\n    // If value is an array, then the previous render was of an\n    // iterable and value will contain the ChildParts from the previous\n    // render. If value is not an array, clear this part and make a new\n    // array for ChildParts.\n    if (!isArray(this._$committedValue)) {\n      this._$committedValue = [];\n      this._$clear();\n    }\n\n    // Lets us keep track of how many items we stamped so we can clear leftover\n    // items from a previous render\n    const itemParts = this._$committedValue as ChildPart[];\n    let partIndex = 0;\n    let itemPart: ChildPart | undefined;\n\n    for (const item of value) {\n      if (partIndex === itemParts.length) {\n        // If no existing part, create a new one\n        // TODO (justinfagnani): test perf impact of always creating two parts\n        // instead of sharing parts between nodes\n        // https://github.com/lit/lit/issues/1266\n        itemParts.push(\n          (itemPart = new ChildPart(\n            this._insert(createMarker()),\n            this._insert(createMarker()),\n            this,\n            this.options\n          ))\n        );\n      } else {\n        // Reuse an existing part\n        itemPart = itemParts[partIndex];\n      }\n      itemPart._$setValue(item);\n      partIndex++;\n    }\n\n    if (partIndex < itemParts.length) {\n      // itemParts always have end nodes\n      this._$clear(\n        itemPart && wrap(itemPart._$endNode!).nextSibling,\n        partIndex\n      );\n      // Truncate the parts array so _value reflects the current state\n      itemParts.length = partIndex;\n    }\n  }\n\n  /**\n   * Removes the nodes contained within this Part from the DOM.\n   *\n   * @param start Start node to clear from, for clearing a subset of the part's\n   *     DOM (used when truncating iterables)\n   * @param from  When `start` is specified, the index within the iterable from\n   *     which ChildParts are being removed, used for disconnecting directives in\n   *     those Parts.\n   *\n   * @internal\n   */\n  _$clear(\n    start: ChildNode | null = wrap(this._$startNode).nextSibling,\n    from?: number\n  ) {\n    this._$notifyConnectionChanged?.(false, true, from);\n    while (start && start !== this._$endNode) {\n      const n = wrap(start!).nextSibling;\n      (wrap(start!) as Element).remove();\n      start = n;\n    }\n  }\n  /**\n   * Implementation of RootPart's `isConnected`. Note that this metod\n   * should only be called on `RootPart`s (the `ChildPart` returned from a\n   * top-level `render()` call). It has no effect on non-root ChildParts.\n   * @param isConnected Whether to set\n   * @internal\n   */\n  setConnected(isConnected: boolean) {\n    if (this._$parent === undefined) {\n      this.__isConnected = isConnected;\n      this._$notifyConnectionChanged?.(isConnected);\n    } else if (DEV_MODE) {\n      throw new Error(\n        'part.setConnected() may only be called on a ' +\n          'RootPart returned from render().'\n      );\n    }\n  }\n}\n\n/**\n * A top-level `ChildPart` returned from `render` that manages the connected\n * state of `AsyncDirective`s created throughout the tree below it.\n */\nexport interface RootPart extends ChildPart {\n  /**\n   * Sets the connection state for `AsyncDirective`s contained within this root\n   * ChildPart.\n   *\n   * lit-html does not automatically monitor the connectedness of DOM rendered;\n   * as such, it is the responsibility of the caller to `render` to ensure that\n   * `part.setConnected(false)` is called before the part object is potentially\n   * discarded, to ensure that `AsyncDirective`s have a chance to dispose of\n   * any resources being held. If a `RootPart` that was previously\n   * disconnected is subsequently re-connected (and its `AsyncDirective`s should\n   * re-connect), `setConnected(true)` should be called.\n   *\n   * @param isConnected Whether directives within this tree should be connected\n   * or not\n   */\n  setConnected(isConnected: boolean): void;\n}\n\nexport type {AttributePart};\nclass AttributePart implements Disconnectable {\n  readonly type = ATTRIBUTE_PART as\n    | typeof ATTRIBUTE_PART\n    | typeof PROPERTY_PART\n    | typeof BOOLEAN_ATTRIBUTE_PART\n    | typeof EVENT_PART;\n  readonly element: HTMLElement;\n  readonly name: string;\n  readonly options: RenderOptions | undefined;\n\n  /**\n   * If this attribute part represents an interpolation, this contains the\n   * static strings of the interpolation. For single-value, complete bindings,\n   * this is undefined.\n   */\n  readonly strings?: ReadonlyArray<string>;\n  /** @internal */\n  _$committedValue: unknown | Array<unknown> = nothing;\n  /** @internal */\n  __directives?: Array<Directive | undefined>;\n  /** @internal */\n  _$parent: Disconnectable;\n  /** @internal */\n  _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n  protected _sanitizer: ValueSanitizer | undefined;\n\n  get tagName() {\n    return this.element.tagName;\n  }\n\n  // See comment in Disconnectable interface for why this is a getter\n  get _$isConnected() {\n    return this._$parent._$isConnected;\n  }\n\n  constructor(\n    element: HTMLElement,\n    name: string,\n    strings: ReadonlyArray<string>,\n    parent: Disconnectable,\n    options: RenderOptions | undefined\n  ) {\n    this.element = element;\n    this.name = name;\n    this._$parent = parent;\n    this.options = options;\n    if (strings.length > 2 || strings[0] !== '' || strings[1] !== '') {\n      this._$committedValue = new Array(strings.length - 1).fill(new String());\n      this.strings = strings;\n    } else {\n      this._$committedValue = nothing;\n    }\n    if (ENABLE_EXTRA_SECURITY_HOOKS) {\n      this._sanitizer = undefined;\n    }\n  }\n\n  /**\n   * Sets the value of this part by resolving the value from possibly multiple\n   * values and static strings and committing it to the DOM.\n   * If this part is single-valued, `this._strings` will be undefined, and the\n   * method will be called with a single value argument. If this part is\n   * multi-value, `this._strings` will be defined, and the method is called\n   * with the value array of the part's owning TemplateInstance, and an offset\n   * into the value array from which the values should be read.\n   * This method is overloaded this way to eliminate short-lived array slices\n   * of the template instance values, and allow a fast-path for single-valued\n   * parts.\n   *\n   * @param value The part value, or an array of values for multi-valued parts\n   * @param valueIndex the index to start reading values from. `undefined` for\n   *   single-valued parts\n   * @param noCommit causes the part to not commit its value to the DOM. Used\n   *   in hydration to prime attribute parts with their first-rendered value,\n   *   but not set the attribute, and in SSR to no-op the DOM operation and\n   *   capture the value for serialization.\n   *\n   * @internal\n   */\n  _$setValue(\n    value: unknown | Array<unknown>,\n    directiveParent: DirectiveParent = this,\n    valueIndex?: number,\n    noCommit?: boolean\n  ) {\n    const strings = this.strings;\n\n    // Whether any of the values has changed, for dirty-checking\n    let change = false;\n\n    if (strings === undefined) {\n      // Single-value binding case\n      value = resolveDirective(this, value, directiveParent, 0);\n      change =\n        !isPrimitive(value) ||\n        (value !== this._$committedValue && value !== noChange);\n      if (change) {\n        this._$committedValue = value;\n      }\n    } else {\n      // Interpolation case\n      const values = value as Array<unknown>;\n      value = strings[0];\n\n      let i, v;\n      for (i = 0; i < strings.length - 1; i++) {\n        v = resolveDirective(this, values[valueIndex! + i], directiveParent, i);\n\n        if (v === noChange) {\n          // If the user-provided value is `noChange`, use the previous value\n          v = (this._$committedValue as Array<unknown>)[i];\n        }\n        change ||=\n          !isPrimitive(v) || v !== (this._$committedValue as Array<unknown>)[i];\n        if (v === nothing) {\n          value = nothing;\n        } else if (value !== nothing) {\n          value += (v ?? '') + strings[i + 1];\n        }\n        // We always record each value, even if one is `nothing`, for future\n        // change detection.\n        (this._$committedValue as Array<unknown>)[i] = v;\n      }\n    }\n    if (change && !noCommit) {\n      this._commitValue(value);\n    }\n  }\n\n  /** @internal */\n  _commitValue(value: unknown) {\n    if (value === nothing) {\n      (wrap(this.element) as Element).removeAttribute(this.name);\n    } else {\n      if (ENABLE_EXTRA_SECURITY_HOOKS) {\n        if (this._sanitizer === undefined) {\n          this._sanitizer = sanitizerFactoryInternal(\n            this.element,\n            this.name,\n            'attribute'\n          );\n        }\n        value = this._sanitizer(value ?? '');\n      }\n      debugLogEvent?.({\n        kind: 'commit attribute',\n        element: this.element,\n        name: this.name,\n        value,\n        options: this.options,\n      });\n      (wrap(this.element) as Element).setAttribute(\n        this.name,\n        (value ?? '') as string\n      );\n    }\n  }\n}\n\nexport type {PropertyPart};\nclass PropertyPart extends AttributePart {\n  override readonly type = PROPERTY_PART;\n\n  /** @internal */\n  override _commitValue(value: unknown) {\n    if (ENABLE_EXTRA_SECURITY_HOOKS) {\n      if (this._sanitizer === undefined) {\n        this._sanitizer = sanitizerFactoryInternal(\n          this.element,\n          this.name,\n          'property'\n        );\n      }\n      value = this._sanitizer(value);\n    }\n    debugLogEvent?.({\n      kind: 'commit property',\n      element: this.element,\n      name: this.name,\n      value,\n      options: this.options,\n    });\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (this.element as any)[this.name] = value === nothing ? undefined : value;\n  }\n}\n\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n  ? (trustedTypes.emptyScript as unknown as '')\n  : '';\n\nexport type {BooleanAttributePart};\nclass BooleanAttributePart extends AttributePart {\n  override readonly type = BOOLEAN_ATTRIBUTE_PART;\n\n  /** @internal */\n  override _commitValue(value: unknown) {\n    debugLogEvent?.({\n      kind: 'commit boolean attribute',\n      element: this.element,\n      name: this.name,\n      value: !!(value && value !== nothing),\n      options: this.options,\n    });\n    if (value && value !== nothing) {\n      (wrap(this.element) as Element).setAttribute(\n        this.name,\n        emptyStringForBooleanAttribute\n      );\n    } else {\n      (wrap(this.element) as Element).removeAttribute(this.name);\n    }\n  }\n}\n\ntype EventListenerWithOptions = EventListenerOrEventListenerObject &\n  Partial<AddEventListenerOptions>;\n\n/**\n * An AttributePart that manages an event listener via add/removeEventListener.\n *\n * This part works by adding itself as the event listener on an element, then\n * delegating to the value passed to it. This reduces the number of calls to\n * add/removeEventListener if the listener changes frequently, such as when an\n * inline function is used as a listener.\n *\n * Because event options are passed when adding listeners, we must take case\n * to add and remove the part as a listener when the event options change.\n */\nexport type {EventPart};\nclass EventPart extends AttributePart {\n  override readonly type = EVENT_PART;\n\n  constructor(\n    element: HTMLElement,\n    name: string,\n    strings: ReadonlyArray<string>,\n    parent: Disconnectable,\n    options: RenderOptions | undefined\n  ) {\n    super(element, name, strings, parent, options);\n\n    if (DEV_MODE && this.strings !== undefined) {\n      throw new Error(\n        `A \\`<${element.localName}>\\` has a \\`@${name}=...\\` listener with ` +\n          'invalid content. Event listeners in templates must have exactly ' +\n          'one expression and no surrounding text.'\n      );\n    }\n  }\n\n  // EventPart does not use the base _$setValue/_resolveValue implementation\n  // since the dirty checking is more complex\n  /** @internal */\n  override _$setValue(\n    newListener: unknown,\n    directiveParent: DirectiveParent = this\n  ) {\n    newListener =\n      resolveDirective(this, newListener, directiveParent, 0) ?? nothing;\n    if (newListener === noChange) {\n      return;\n    }\n    const oldListener = this._$committedValue;\n\n    // If the new value is nothing or any options change we have to remove the\n    // part as a listener.\n    const shouldRemoveListener =\n      (newListener === nothing && oldListener !== nothing) ||\n      (newListener as EventListenerWithOptions).capture !==\n        (oldListener as EventListenerWithOptions).capture ||\n      (newListener as EventListenerWithOptions).once !==\n        (oldListener as EventListenerWithOptions).once ||\n      (newListener as EventListenerWithOptions).passive !==\n        (oldListener as EventListenerWithOptions).passive;\n\n    // If the new value is not nothing and we removed the listener, we have\n    // to add the part as a listener.\n    const shouldAddListener =\n      newListener !== nothing &&\n      (oldListener === nothing || shouldRemoveListener);\n\n    debugLogEvent?.({\n      kind: 'commit event listener',\n      element: this.element,\n      name: this.name,\n      value: newListener,\n      options: this.options,\n      removeListener: shouldRemoveListener,\n      addListener: shouldAddListener,\n      oldListener,\n    });\n    if (shouldRemoveListener) {\n      this.element.removeEventListener(\n        this.name,\n        this,\n        oldListener as EventListenerWithOptions\n      );\n    }\n    if (shouldAddListener) {\n      // Beware: IE11 and Chrome 41 don't like using the listener as the\n      // options object. Figure out how to deal w/ this in IE11 - maybe\n      // patch addEventListener?\n      this.element.addEventListener(\n        this.name,\n        this,\n        newListener as EventListenerWithOptions\n      );\n    }\n    this._$committedValue = newListener;\n  }\n\n  handleEvent(event: Event) {\n    if (typeof this._$committedValue === 'function') {\n      this._$committedValue.call(this.options?.host ?? this.element, event);\n    } else {\n      (this._$committedValue as EventListenerObject).handleEvent(event);\n    }\n  }\n}\n\nexport type {ElementPart};\nclass ElementPart implements Disconnectable {\n  readonly type = ELEMENT_PART;\n\n  /** @internal */\n  __directive?: Directive;\n\n  // This is to ensure that every Part has a _$committedValue\n  _$committedValue: undefined;\n\n  /** @internal */\n  _$parent!: Disconnectable;\n\n  /** @internal */\n  _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n  options: RenderOptions | undefined;\n\n  constructor(\n    public element: Element,\n    parent: Disconnectable,\n    options: RenderOptions | undefined\n  ) {\n    this._$parent = parent;\n    this.options = options;\n  }\n\n  // See comment in Disconnectable interface for why this is a getter\n  get _$isConnected() {\n    return this._$parent._$isConnected;\n  }\n\n  _$setValue(value: unknown): void {\n    debugLogEvent?.({\n      kind: 'commit to element binding',\n      element: this.element,\n      value,\n      options: this.options,\n    });\n    resolveDirective(this, value);\n  }\n}\n\n/**\n * END USERS SHOULD NOT RELY ON THIS OBJECT.\n *\n * Private exports for use by other Lit packages, not intended for use by\n * external users.\n *\n * We currently do not make a mangled rollup build of the lit-ssr code. In order\n * to keep a number of (otherwise private) top-level exports  mangled in the\n * client side code, we export a _$LH object containing those members (or\n * helper methods for accessing private fields of those members), and then\n * re-export them for use in lit-ssr. This keeps lit-ssr agnostic to whether the\n * client-side code is being used in `dev` mode or `prod` mode.\n *\n * This has a unique name, to disambiguate it from private exports in\n * lit-element, which re-exports all of lit-html.\n *\n * @private\n */\nexport const _$LH = {\n  // Used in lit-ssr\n  _boundAttributeSuffix: boundAttributeSuffix,\n  _marker: marker,\n  _markerMatch: markerMatch,\n  _HTML_RESULT: HTML_RESULT,\n  _getTemplateHtml: getTemplateHtml,\n  // Used in tests and private-ssr-support\n  _TemplateInstance: TemplateInstance,\n  _isIterable: isIterable,\n  _resolveDirective: resolveDirective,\n  _ChildPart: ChildPart,\n  _AttributePart: AttributePart,\n  _BooleanAttributePart: BooleanAttributePart,\n  _EventPart: EventPart,\n  _PropertyPart: PropertyPart,\n  _ElementPart: ElementPart,\n};\n\n// Apply polyfills if available\nconst polyfillSupport = DEV_MODE\n  ? global.litHtmlPolyfillSupportDevMode\n  : global.litHtmlPolyfillSupport;\npolyfillSupport?.(Template, ChildPart);\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n(global.litHtmlVersions ??= []).push('2.8.0');\nif (DEV_MODE && global.litHtmlVersions.length > 1) {\n  issueWarning!(\n    'multiple-versions',\n    `Multiple versions of Lit loaded. ` +\n      `Loading multiple versions is not recommended.`\n  );\n}\n\n/**\n * Renders a value, usually a lit-html TemplateResult, to the container.\n *\n * This example renders the text \"Hello, Zoe!\" inside a paragraph tag, appending\n * it to the container `document.body`.\n *\n * ```js\n * import {html, render} from 'lit';\n *\n * const name = \"Zoe\";\n * render(html`<p>Hello, ${name}!</p>`, document.body);\n * ```\n *\n * @param value Any [renderable\n *   value](https://lit.dev/docs/templates/expressions/#child-expressions),\n *   typically a {@linkcode TemplateResult} created by evaluating a template tag\n *   like {@linkcode html} or {@linkcode svg}.\n * @param container A DOM container to render to. The first render will append\n *   the rendered value to the container, and subsequent renders will\n *   efficiently update the rendered value if the same result type was\n *   previously rendered there.\n * @param options See {@linkcode RenderOptions} for options documentation.\n * @see\n * {@link https://lit.dev/docs/libraries/standalone-templates/#rendering-lit-html-templates| Rendering Lit HTML Templates}\n */\nexport const render = (\n  value: unknown,\n  container: HTMLElement | DocumentFragment,\n  options?: RenderOptions\n): RootPart => {\n  if (DEV_MODE && container == null) {\n    // Give a clearer error message than\n    //     Uncaught TypeError: Cannot read properties of null (reading\n    //     '_$litPart$')\n    // which reads like an internal Lit error.\n    throw new TypeError(`The container to render into may not be ${container}`);\n  }\n  const renderId = DEV_MODE ? debugLogRenderId++ : 0;\n  const partOwnerNode = options?.renderBefore ?? container;\n  // This property needs to remain unminified.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let part: ChildPart = (partOwnerNode as any)['_$litPart$'];\n  debugLogEvent?.({\n    kind: 'begin render',\n    id: renderId,\n    value,\n    container,\n    options,\n    part,\n  });\n  if (part === undefined) {\n    const endNode = options?.renderBefore ?? null;\n    // This property needs to remain unminified.\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (partOwnerNode as any)['_$litPart$'] = part = new ChildPart(\n      container.insertBefore(createMarker(), endNode),\n      endNode,\n      undefined,\n      options ?? {}\n    );\n  }\n  part._$setValue(value);\n  debugLogEvent?.({\n    kind: 'end render',\n    id: renderId,\n    value,\n    container,\n    options,\n    part,\n  });\n  return part as RootPart;\n};\n\nif (ENABLE_EXTRA_SECURITY_HOOKS) {\n  render.setSanitizer = setSanitizer;\n  render.createSanitizer = createSanitizer;\n  if (DEV_MODE) {\n    render._testOnlyClearSanitizerFactoryDoNotCallOrElse =\n      _testOnlyClearSanitizerFactoryDoNotCallOrElse;\n  }\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var inProgress = {};\nvar dataWebpackPrefix = \"ui-platform:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js?version=7.2.1\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkui_platform\"] = self[\"webpackChunkui_platform\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { baseConfig } from '../auto-generated/config';\n\nclass LdLogComponent {\n\n  // ------------------------------------------------------\n  log(...args) {\n    if (baseConfig.generic.log.console && baseConfig.generic.log.log_levels.log) {\n      console.log(...args);\n    }\n  }\n\n  // ------------------------------------------------------\n  error(...args) {\n    if (baseConfig.generic.log.console && baseConfig.generic.log.log_levels.error) {\n      if (typeof console.error === 'undefined') {\n        console.log(...args);\n        return;\n      }\n      console.error(...args);\n    }\n  }\n\n  // ------------------------------------------------------\n  info(...args) {\n    if (baseConfig.generic.log.console && baseConfig.generic.log.log_levels.info) {\n      if (typeof console.info === 'undefined') {\n        console.log(...args);\n        return;\n      }\n      console.info(...args);\n    }\n  }\n\n  // ------------------------------------------------------\n  warn(...args) {\n    if (baseConfig.generic.log.console && baseConfig.generic.log.log_levels.warn) {\n      if (typeof console.error === 'undefined') {\n        console.warn(...args);\n        return;\n      }\n      console.warn(...args);\n    }\n  }\n\n  // ------------------------------------------------------\n  group(name) {\n    if (baseConfig.generic.log.console && typeof console.group !== 'undefined') {\n      console.group(name);\n    }\n  }\n\n  // ------------------------------------------------------\n  groupEnd() {\n    if (baseConfig.generic.log.console && typeof console.groupEnd !== 'undefined') {\n      console.groupEnd();\n    }\n  }\n\n}\n\nconst LgLog = new LdLogComponent();\n\nexport default LgLog;\n","/**\n * Copyright (c) 2026 Schwäbische Werkzeugmaschinen GmbH\n *\n */\nimport {css} from 'lit';\n\nexport const informationSecurityStyles = css`\n    :host {\n        display: block;\n        width: 100%;\n        height: 100%;\n        background-color: #fff;\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Open Sans', 'Helvetica Neue', sans-serif;\n        color: #333;\n        /* Reset body styles */\n        --body-background: #fff;\n    }\n\n    /* Override landscape-only restriction for this public page */\n    @media only screen and (min-width: 320px) and (max-width: 600px) {\n        ::slotted(body), \n        body {\n            -webkit-transform: none !important;\n            transform: none !important;\n            position: static !important;\n            overflow: visible !important;\n        }\n    }\n\n    /* Override global body styles for this page */\n\n    html, body {\n        background-color: #fff !important;\n        background-image: none !important;\n        color: #333 !important;\n        font-size: 16px !important;\n    }\n\n    body {\n        background: #fff !important;\n        margin: 0 !important;\n        padding: 0 !important;\n    }\n\n    /* Header/Hero Section */\n\n    .hero-section {\n        background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);\n        padding: 30px 0px 10px 0px;\n        text-align: center;\n        border-bottom: 3px solid #eb0028;\n    }\n\n    .hero-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        max-width: 1200px;\n        margin: 0 auto;\n        padding: 20px;\n        gap: 30px;\n    }\n\n    .logo-link {\n        display: flex;\n        align-items: center;\n        text-decoration: none;\n        transition: transform 0.3s ease;\n        flex-shrink: 0;\n    }\n\n    .logo-link:hover {\n        transform: scale(1.05);\n    }\n\n    .logo {\n        height: 70px;\n        width: auto;\n        object-fit: contain;\n    }\n\n    .hero-content {\n        margin: 0;\n        flex: 1;\n        text-align: center;\n    }\n\n    .hero-section h1 {\n        font-size: 3em;\n        font-weight: 700;\n        color: #1a1a1a;\n        margin: 0 0 20px 0;\n        line-height: 1.2;\n    }\n\n    .hero-section .subtitle {\n        font-size: 1.4em;\n        color: #666;\n        margin: 0;\n        font-weight: 400;\n    }\n\n    /* Main Container */\n\n    .main-container {\n        max-width: 1200px;\n        margin: 0 auto;\n        padding: 40px 10px 0px 20px;\n    }\n\n    /* Content Sections */\n\n    .section {\n        margin-bottom: 60px;\n    }\n\n    .section h2 {\n        font-size: 2em;\n        font-weight: 700;\n        color: #1a1a1a;\n        margin: 0 0 30px 0;\n        padding-bottom: 15px;\n        border-bottom: 3px solid #eb0028;\n        display: inline-block;\n    }\n\n    .section p {\n        font-size: 1.05em;\n        line-height: 1.8;\n        color: #555;\n        margin: 0 0 20px 0;\n        text-align: justify;\n    }\n\n    .section p:last-child {\n        margin-bottom: 0;\n    }\n\n    /* Service Items Grid */\n\n    .services-section {\n        margin-top: 80px;\n        margin-bottom: 80px;\n    }\n\n    .services-section h2 {\n        margin-bottom: 50px;\n    }\n\n    .services-grid {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 40px;\n        margin-bottom: 60px;\n    }\n\n    .service-card {\n        background-color: #f8f9fa;\n        padding: 40px;\n        border-radius: 4px;\n        border-left: 4px solid #eb0028;\n        transition: box-shadow 0.3s ease, transform 0.3s ease;\n    }\n\n    .service-card:hover {\n        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n        transform: translateY(-4px);\n    }\n\n    .service-card h3 {\n        font-size: 1.4em;\n        font-weight: 700;\n        color: #1a1a1a;\n        margin: 0 0 20px 0;\n    }\n\n    .service-card p {\n        font-size: 1em;\n        line-height: 1.7;\n        color: #666;\n        margin: 0;\n        text-align: left;\n    }\n\n    /* Download Section */\n\n    .download-section {\n        background-color: #f0f0f0;\n        padding: 60px 40px;\n        border-radius: 4px;\n        text-align: center;\n        margin-bottom: 80px;\n    }\n\n    .download-section h3 {\n        font-size: 1.6em;\n        font-weight: 700;\n        color: #1a1a1a;\n        margin: 0 0 15px 0;\n    }\n\n    .download-section p {\n        font-size: 1em;\n        color: #666;\n        margin: 0 0 30px 0;\n        text-align: center;\n    }\n\n    .download-button {\n        display: inline-block;\n        padding: 15px 50px;\n        background-color: #eb0028;\n        color: white;\n        text-decoration: none;\n        border-radius: 4px;\n        font-weight: 700;\n        font-size: 1.05em;\n        transition: background-color 0.3s ease, transform 0.2s ease;\n        border: none;\n        cursor: pointer;\n        margin: 0 10px 10px 0;\n    }\n\n    .download-button:hover {\n        background-color: #c40020;\n        transform: translateY(-2px);\n    }\n\n    .download-button:active {\n        transform: translateY(0);\n    }\n\n    /* Advisories Table Section */\n\n    .advisories-section {\n        margin-top: 60px;\n        margin-bottom: 60px;\n    }\n\n    .advisories-section h2 {\n        margin-bottom: 40px;\n    }\n\n    vaadin-grid {\n        border: 1px solid #ddd;\n        font-family: inherit;\n        --lumo-base-color: #fff;\n        --lumo-body-text-color: #333;\n        --lumo-secondary-text-color: #666;\n        --lumo-border-radius: 0;\n        --lumo-font-family: inherit;\n        height: 600px;\n        width: 100%;\n    }\n\n    vaadin-grid::part(header-cell) {\n        background-color: #f8f9fa;\n        font-weight: 700;\n        color: #1a1a1a;\n        border-bottom: 2px solid #ddd;\n    }\n\n    vaadin-grid::part(row):hover {\n        background-color: #f8f9fa;\n    }\n\n    vaadin-grid::part(cell) {\n        padding: 14px 12px;\n        border-bottom: 1px solid #eee;\n    }\n\n    .severity-high {\n        color: #d32f2f;\n        font-weight: 700;\n    }\n\n    .severity-medium {\n        color: #f57c00;\n        font-weight: 700;\n    }\n\n    .severity-low {\n        color: #388e3c;\n        font-weight: 700;\n    }\n\n    .status-open {\n        color: #d32f2f;\n        font-weight: 600;\n    }\n\n    .status-closed {\n        color: #388e3c;\n        font-weight: 600;\n    }\n\n    .status-resolved {\n        color: #1976d2;\n        font-weight: 600;\n    }\n\n    /* Links & Downloads Section */\n\n    .links-downloads-section {\n        max-width: 1200px;\n        margin: 80px auto 0;\n        padding: 0 20px;\n    }\n\n    .links-downloads-section h2 {\n        font-size: 2em;\n        font-weight: 700;\n        color: #1a1a1a;\n        margin: 0 0 40px 0;\n        padding-bottom: 0;\n        border-bottom: none;\n        display: block;\n    }\n\n    .links-downloads-list {\n        border-top: 1px solid #ddd;\n    }\n\n    .links-downloads-item {\n        border-bottom: 1px solid #ddd;\n    }\n\n    .links-downloads-header {\n        width: 100%;\n        padding: 20px;\n        background-color: #fff;\n        border: none;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        gap: 15px;\n        text-align: left;\n        transition: background-color 0.3s ease;\n        font-size: 1.1em;\n        font-weight: 600;\n        color: #1a1a1a;\n    }\n\n    .links-downloads-header:hover {\n        background-color: #f8f9fa;\n    }\n\n    .links-downloads-icon {\n        display: inline-flex;\n        align-items: center;\n        width: 20px;\n        height: 20px;\n        color: #eb0028;\n        font-size: 0.8em;\n        transition: transform 0.3s ease;\n        flex-shrink: 0;\n    }\n\n    .links-downloads-icon.expanded {\n        transform: rotate(-90deg);\n    }\n\n    .links-downloads-title {\n        color: #0066cc;\n        text-decoration: none;\n    }\n\n    .links-downloads-content {\n        padding: 20px 40px;\n        background-color: #f8f9fa;\n        animation: slideDown 0.3s ease;\n    }\n\n    .links-downloads-content p {\n        margin: 0;\n        color: #555;\n        font-size: 1em;\n        line-height: 1.6;\n    }\n\n    .links-downloads-content a {\n        color: #eb0028;\n        text-decoration: none;\n        font-weight: 500;\n    }\n\n    .links-downloads-content a:hover {\n        text-decoration: underline;\n    }\n\n    @keyframes slideDown {\n        from {\n            opacity: 0;\n            max-height: 0;\n        }\n        to {\n            opacity: 1;\n            max-height: 500px;\n        }\n    }\n\n    /* Responsive Links & Downloads */\n    @media (max-width: 768px) {\n        .links-downloads-section {\n            padding: 0 15px;\n        }\n\n        .links-downloads-section h2 {\n            font-size: 1.5em;\n        }\n\n        .links-downloads-header {\n            padding: 15px;\n            font-size: 1em;\n        }\n\n        .links-downloads-content {\n            padding: 15px 20px;\n        }\n    }\n\n    /* Footer Spacing */\n\n    .footer-spacing {\n        height: 40px;\n    }\n\n    /* Footer */\n\n    .fusion-footer-copyright-area {\n        background-color: #e8e8e8;\n        color: #333;\n        padding: 20px 20px;\n        margin-top: 0;\n        border-top: 3px solid #eb0028;\n    }\n\n    .fusion-row {\n        max-width: 100%;\n        margin: 0 auto;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 40px;\n        flex-wrap: wrap;\n        padding: 0 20px;\n    }\n\n    .fusion-copyright-content {\n        flex: 0 1 auto;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 40px;\n        width: auto;\n    }\n\n    .fusion-copyright-notice {\n        flex: 0 1 auto;\n    }\n\n    .fusion-copyright-notice a {\n        color: #333;\n        text-decoration: none;\n        font-weight: 500;\n        transition: color 0.3s ease;\n    }\n\n    .fusion-copyright-notice a:hover {\n        color: #eb0028;\n    }\n\n    .fusion-copyright-notice div {\n        font-size: 0.85em;\n        line-height: 1;\n        color: #333;\n        white-space: nowrap;\n    }\n\n    .fusion-social-links-footer {\n        flex: 0 1 auto;\n    }\n\n    .fusion-social-networks-wrapper {\n        display: flex;\n        gap: 10px;\n        align-items: center;\n    }\n\n    .fusion-social-network-icon {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 20px;\n        height: 20px;\n        background-color: transparent;\n        color: #eb0028;\n        border-radius: 0;\n        text-decoration: none;\n        transition: color 0.3s ease;\n        font-size: 16px;\n        font-weight: bold;\n    }\n\n    .fusion-social-network-icon:hover {\n        color: #c40020;\n    }\n\n    .fusion-social-network-icon::before {\n        font-weight: bold;\n    }\n\n    .fusion-facebook::before {\n        content: \"f\";\n        font-family: Arial, sans-serif;\n        font-size: 14px;\n    }\n\n    .fusion-youtube::before {\n        content: \"▶\";\n        font-size: 11px;\n    }\n\n    .fusion-linkedin::before {\n        content: \"in\";\n        font-family: Arial, sans-serif;\n        font-size: 11px;\n        font-weight: bold;\n    }\n\n    .fusion-instagram::before {\n        content: \"●\";\n        font-size: 14px;\n    }\n\n    .screen-reader-text {\n        position: absolute;\n        width: 1px;\n        height: 1px;\n        padding: 0;\n        margin: -1px;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        white-space: nowrap;\n        border-width: 0;\n    }\n\n    /* Responsive Footer */\n    @media (max-width: 768px) {\n        .fusion-footer-copyright-area {\n            padding: 15px 10px;\n        }\n\n        .fusion-row {\n            flex-direction: column;\n            gap: 15px;\n        }\n\n        .fusion-copyright-content {\n            flex-direction: column;\n            gap: 10px;\n        }\n\n        .fusion-copyright-notice div {\n            font-size: 0.8em;\n        }\n\n        .fusion-social-networks-wrapper {\n            justify-content: center;\n        }\n    }\n\n    /* Language Switcher */\n\n    .language-toolbar {\n        display: flex;\n        justify-content: flex-end;\n        align-items: center;\n        margin-bottom: 0;\n        flex-shrink: 0;\n    }\n\n    .language-switcher {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        background: rgba(255, 255, 255, 0.9);\n        border: 1px solid #ddd;\n        border-radius: 4px;\n        padding: 8px 10px;\n    }\n\n    .language-switcher label {\n        font-size: 0.9em;\n        color: #444;\n        font-weight: 600;\n    }\n\n    .language-switcher select {\n        border: 1px solid #c7c7c7;\n        border-radius: 4px;\n        background: #fff;\n        color: #222;\n        font-size: 0.9em;\n        padding: 6px 8px;\n        min-width: 90px;\n    }\n\n    .language-switcher select:focus {\n        outline: 2px solid #eb0028;\n        outline-offset: 1px;\n    }\n\n  /* Responsive Design */\n  @media (max-width: 768px) {\n    .hero-section {\n      padding: 15px 0px 30px 0px;\n    }\n\n    .hero-header {\n      flex-direction: column;\n      gap: 15px;\n      padding: 10px;\n    }\n\n    .logo {\n      height: 40px;\n    }\n\n    .hero-content {\n      max-width: 100%;\n    }\n\n    .hero-section h1 {\n      font-size: 2em;\n    }\n\n    .hero-section .subtitle {\n      font-size: 1.1em;\n    }\n\n    .language-toolbar {\n      width: 100%;\n      justify-content: center;\n    }\n\n        .main-container {\n            padding: 40px 15px;\n        }\n\n        .section h2 {\n            font-size: 1.5em;\n        }\n\n        .section p {\n            font-size: 0.95em;\n            text-align: left;\n        }\n\n        .services-grid {\n            grid-template-columns: 1fr;\n            gap: 30px;\n        }\n\n        .service-card {\n            padding: 30px;\n        }\n\n        .service-card h3 {\n            font-size: 1.2em;\n        }\n\n        .download-section {\n            padding: 40px 20px;\n        }\n\n        .download-section h3 {\n            font-size: 1.3em;\n        }\n\n        vaadin-grid {\n            height: 400px;\n        }\n    }\n\n    @media (max-width: 480px) {\n        .language-toolbar {\n            justify-content: center;\n            margin-bottom: 18px;\n        }\n\n        .hero-section h1 {\n            font-size: 1.5em;\n        }\n\n        .hero-section .subtitle {\n            font-size: 1em;\n        }\n\n        .section h2 {\n            font-size: 1.2em;\n        }\n\n        .service-card {\n            padding: 20px;\n        }\n\n        .download-button {\n            display: block;\n            padding: 12px 30px;\n            font-size: 0.95em;\n            margin: 10px auto;\n        }\n\n        vaadin-grid {\n            height: 300px;\n        }\n    }\n`;\n\n","/**\n * Copyright (c) 2026 Schwäbische Werkzeugmaschinen GmbH\n *\n */\nimport {customElement, state} from 'lit/decorators.js';\nimport {html, LitElement} from 'lit';\nimport '@vaadin/grid';\nimport {baseConfig} from '../../auto-generated/config';\nimport {LdChangeLanguage, LdTranslate} from '../../components/ld-application/i18n/ld-i18next';\nimport {informationSecurityStyles} from './styles';\n\n@customElement('information-security-view')\nexport class InformationSecurityView extends LitElement {\n\n  static readonly styles = [informationSecurityStyles];\n\n  private readonly supportedLanguages = (baseConfig?.i18n?.availableLanguages || [{id: 'en'}, {id: 'de'}]).map((language: {id: string}) => language.id);\n\n  @state() private selectedLanguage = 'en';\n  @state() private expandedLinks = {\n    dataProtection: false,\n    vulnerabilityGuideline: false,\n    securityTxt: false\n  };\n\n  // --------------------------------------------------------------------------------------\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Override global body styles for public pages\n    document.body.style.background = '#fff';\n    document.body.style.backgroundColor = '#fff';\n    document.body.style.color = '#333';\n    document.body.style.fontSize = '16px';\n    document.documentElement.style.backgroundColor = '#fff';\n    document.documentElement.style.background = '#fff';\n\n    // Remove landscape-only restriction for mobile devices\n    document.body.style.transform = 'none';\n\n     // Add global style to permanently remove the rotation for this page\n    const styleId = 'information-security-remove-rotation';\n    if (!document.getElementById(styleId)) {\n      const style = document.createElement('style');\n      style.id = styleId;\n      style.textContent = `\n        @media only screen and (min-width: 320px) and (max-width: 600px) {\n          body {\n            -webkit-transform: none !important;\n            transform: none !important;\n            position: static !important;\n            top: unset !important;\n            left: unset !important;\n            width: 100% !important;\n            height: auto !important;\n            overflow: visible !important;\n          }\n        }\n      `;\n      document.head.appendChild(style);\n    }\n\n    this.selectedLanguage = this.detectInitialLanguage();\n    LdChangeLanguage(this.selectedLanguage);\n    this.requestUpdate();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    // Restore original body styles when leaving the page\n    if (document.body) {\n      document.body.style.background = '';\n      document.body.style.backgroundColor = '';\n      document.body.style.color = '';\n      document.body.style.fontSize = '';\n      document.body.style.transform = '';\n    }\n\n    // Remove the global style override when leaving the page\n    const styleElement = document.getElementById('information-security-remove-rotation');\n    if (styleElement) {\n      styleElement.remove();\n    }\n  }\n\n\n  private getBrowserLanguage(): string {\n    const browserLang = navigator.language || (navigator as any).userLanguage;\n    const lang = browserLang.split('-')[0].toLowerCase();\n    return this.supportedLanguages.includes(lang) ? lang : 'en';\n  }\n\n   private detectInitialLanguage(): string {\n     const storedLanguage = localStorage.getItem('information_security_language');\n     if (storedLanguage && this.supportedLanguages.includes(storedLanguage)) {\n       return storedLanguage;\n     }\n     return 'en';\n   }\n\n  private handleLanguageChange(event: Event) {\n    const target = event.target as HTMLSelectElement;\n    const value = target.value;\n    if (!this.supportedLanguages.includes(value)) {\n      return;\n    }\n    this.selectedLanguage = value;\n    localStorage.setItem('information_security_language', value);\n    LdChangeLanguage(value);\n    this.requestUpdate();\n  }\n\n\n  getLanguageLabel(): string {\n\n    return LdTranslate('modules.i18n.chooseLanguagePhrase');\n  }\n\n  private getLanguageDisplayName(languageCode: string): string {\n    const translated = LdTranslate(`modules.locales.languages.${languageCode}`);\n    return translated && translated !== `modules.locales.languages.${languageCode}` ? translated : languageCode.toUpperCase();\n  }\n\n   private renderLanguageSwitcher() {\n     return html`\n       <div class=\"language-toolbar\">\n         <div class=\"language-switcher\">\n           <label for=\"information-security-language\">${this.getLanguageLabel()}</label>\n           <select id='information-security-language'\n                   value='${this.selectedLanguage}'\n                   @change='${(event: Event) => this.handleLanguageChange(event)}'>\n             ${this.supportedLanguages.map((languageCode) => html`\n               <option value=${languageCode} ?selected=${languageCode === this.selectedLanguage}>${this.getLanguageDisplayName(languageCode)}</option>\n             `)}\n           </select>\n         </div>\n       </div>\n     `;\n   }\n\n   private downloadAndEmail(): void {\n     // Trigger PDF download\n     const pdfUrl = this.getFormularUrl(this.selectedLanguage);\n     const link = document.createElement('a');\n     link.href = pdfUrl;\n     link.download = `meldeFormular_${this.selectedLanguage}.pdf`;\n     document.body.appendChild(link);\n     link.click();\n     link.remove();\n\n     // Open email\n     const email = LdTranslate('modules.informationSecurity.psirt.email');\n     globalThis.location.href = `mailto:${email}?subject=Security%20Incident%20Report`;\n   }\n\n   private openEmail(): void {\n     const email = LdTranslate('modules.informationSecurity.psirt.email');\n     globalThis.location.href = `mailto:${email}?subject=Security%20Incident%20Report`;\n   }\n\n   private getFormularUrl(lang: string): string {\n     return `/static/pdf/meldeFormular_${lang}.pdf`;\n   }\n\n   private toggleLink(key: keyof typeof this.expandedLinks): void {\n     this.expandedLinks = {\n       ...this.expandedLinks,\n       [key]: !this.expandedLinks[key]\n     };\n   }\n\n   private renderLinksDownloads() {\n     return html`\n       <div class=\"links-downloads-section\">\n         <h2>${LdTranslate('modules.informationSecurity.linksDownloads.title')}</h2>\n         <div class=\"links-downloads-list\">\n           <div class=\"links-downloads-item\">\n             <button class=\"links-downloads-header\" @click=\"${() => this.toggleLink('dataProtection')}\">\n               <span class=\"links-downloads-icon ${this.expandedLinks.dataProtection ? 'expanded' : ''}\">▼</span>\n               <a href=\"https://sw-machines.com/datenschutzerklaerung/\" target=\"_blank\">${LdTranslate('modules.informationSecurity.linksDownloads.dataProtection')}</a>\n             </button>\n           </div>\n\n           <div class=\"links-downloads-item\">\n             <button class=\"links-downloads-header\" @click=\"${() => this.toggleLink('vulnerabilityGuideline')}\">\n               <span class=\"links-downloads-icon ${this.expandedLinks.vulnerabilityGuideline ? 'expanded' : ''}\">▼</span>\n               <span class=\"links-downloads-title\">${LdTranslate('modules.informationSecurity.linksDownloads.vulnerabilityGuideline')}</span>\n             </button>\n             ${this.expandedLinks.vulnerabilityGuideline ? html`\n               <div class=\"links-downloads-content\">\n                 <p>Vulnerability Disclosure Guideline Inhalt kommt hier...</p>\n               </div>\n             ` : ''}\n           </div>\n\n           <div class=\"links-downloads-item\">\n             <button class=\"links-downloads-header\" @click=\"${() => this.toggleLink('securityTxt')}\">\n               <span class=\"links-downloads-icon ${this.expandedLinks.securityTxt ? 'expanded' : ''}\">▼</span>\n               <a href=\"https://sw-machines.com/.well-known/security.txt\" target=\"_blank\">${LdTranslate('modules.informationSecurity.linksDownloads.securityTxt')}</a>\n           \n             </button>\n           </div>\n         </div>\n       </div>\n     `;\n   }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <div class='hero-section'>\n        <div class='hero-header'>\n          <a href=\"https://sw-machines.com/\" target=\"_blank\" class=\"logo-link\">\n            <img src=\"/images/sw.png\" alt=\"SW Machines\" class=\"logo\">\n          </a>\n          <div class='hero-content'>\n            <h1>${LdTranslate('modules.informationSecurity.title')}</h1>\n            <p class='subtitle'>${LdTranslate('modules.informationSecurity.subtitle')}</p>\n          </div>\n          ${this.renderLanguageSwitcher()}\n        </div>\n      </div>\n\n      <div class='main-container'>\n        <div class='section'>\n          <h2>${LdTranslate('modules.informationSecurity.section1.title')}</h2>\n          <p>${LdTranslate('modules.informationSecurity.section1.text')}</p>\n        </div>\n\n        <div class='section'>\n          <h2>${LdTranslate('modules.informationSecurity.section2.title')}</h2>\n          <p>${LdTranslate('modules.informationSecurity.section2.text')}</p>\n        </div>\n\n        <div class='section'>\n          <h2>${LdTranslate('modules.informationSecurity.section3.title')}</h2>\n          <p>${LdTranslate('modules.informationSecurity.section3.text')}</p>\n        </div>\n\n        <div class='services-section'>\n          <h2>${LdTranslate('modules.informationSecurity.services.title')}</h2>\n\n          <div class='services-grid'>\n            <div class='service-card'>\n              <h3>${LdTranslate('modules.informationSecurity.services.psirt.title')}</h3>\n              <p>${LdTranslate('modules.informationSecurity.services.psirt.text')}</p>\n            </div>\n\n            <div class='service-card'>\n              <h3>${LdTranslate('modules.informationSecurity.services.advisories.title')}</h3>\n              <p>${LdTranslate('modules.informationSecurity.services.advisories.text')}</p>\n            </div>\n          </div>\n        </div>\n\n        <div class='download-section'>\n          <h3>${LdTranslate('modules.informationSecurity.download.title')}</h3>\n          <p>${LdTranslate('modules.informationSecurity.download.text')}</p>\n          <button class='download-button' @click='${() => this.downloadAndEmail()}'>${LdTranslate('modules.informationSecurity.download.button.download')}</button>\n          <button class='download-button' @click='${() => this.openEmail()}'>${LdTranslate('modules.informationSecurity.download.button.email')}</button>\n        </div>\n\n        <div class='advisories-section'>\n          <h2>${LdTranslate('modules.informationSecurity.table.title')}</h2>\n          <vaadin-grid .items='${[]}'>\n            <vaadin-grid-column path='advisoryId' header='${LdTranslate('modules.informationSecurity.table.headers.advisoryId')}' flex-grow='0' width='120px'></vaadin-grid-column>\n            <vaadin-grid-column path='description' header='${LdTranslate('modules.informationSecurity.table.headers.description')}' flex-grow='2'></vaadin-grid-column>\n            <vaadin-grid-column path='affectedProduct' header='${LdTranslate('modules.informationSecurity.table.headers.affectedProduct')}' flex-grow='1.5'></vaadin-grid-column>\n            <vaadin-grid-column path='severity' header='${LdTranslate('modules.informationSecurity.table.headers.severity')}'></vaadin-grid-column>\n            <vaadin-grid-column path='status' header='${LdTranslate('modules.informationSecurity.table.headers.status')}'></vaadin-grid-column>\n            <vaadin-grid-column path='releaseDate' header='${LdTranslate('modules.informationSecurity.table.headers.releaseDate')}' flex-grow='0' width='130px'></vaadin-grid-column>\n          </vaadin-grid>\n        </div>\n\n        <div class='footer-spacing'></div>\n      </div>\n\n      ${this.renderLinksDownloads()}\n\n      <footer class=\"fusion-footer-copyright-area\">\n        <div class=\"fusion-row\">\n          <div class=\"fusion-copyright-content\">\n            <div class=\"fusion-copyright-notice\">\n              <div>\n                <a href=\"https://sw-machines.com/impressum/\" target=\"_blank\">${LdTranslate('modules.informationSecurity.footer.impressum')}</a> | \n                <a href=\"https://sw-machines.com/datenschutzerklaerung/\" target=\"_blank\">${LdTranslate('modules.informationSecurity.footer.datenschutz')}</a> | \n                <a href=\"https://sw-machines.com/agb-normen/\" target=\"_blank\">${LdTranslate('modules.informationSecurity.footer.agb')}</a>\n                <br>\n                <div style=\"line-height: 35px;\">© ${new Date().getFullYear()} ${LdTranslate('modules.informationSecurity.footer.copyright')}</div>\n              </div>\n            </div>\n            <div class=\"fusion-social-links-footer\">\n\n            </div>\n          </div>\n        </div>\n      </footer>\n    `;\n  }\n}\n\n","import { unsafeCSS, css } from 'lit-element';\n\n/**\n * Style module for ld-loading-spinner component.\n * @module styles/LdLanguageSelectorStyle\n */\n\n/**\n * Style template for ld-loading-spinner component.\n */\nconst LdLoadingSpinnerStyles = css`\n  .ld-loading-spinner-pop-out paper-dialog{\n    position: fixed; /* Sit on top of the page content */\n    width: 100%; /* Full width (cover the whole page) */\n    height: 100%; /* Full height (cover the whole page) */\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: var(--platform-frame-loading-spinner-background-color, var(--sw-primary-loading-background-color, #808080));\n    opacity: 0.5;\n    z-index: 1003; /* Specify a stack order in case you're using a different order for other elements */\n  }\n  .ld-loading-spinner {\n    position: absolute;\n    height: 100px;\n    width: 100px;\n    top: 50%;\n    left: 50%;\n    margin-left: -50px;\n    margin-top: -50px;\n    z-index: 1004;\n    \n    --paper-spinner-layer-1-color: #FFFFFF;\n    --paper-spinner-layer-2-color: #eb0028;\n    --paper-spinner-layer-3-color: #FFFFFF;\n    --paper-spinner-layer-4-color: #eb0028;\n    --paper-spinner-stroke-width: 10px;\n    \n  }\n\n  @keyframes fadeIt {\n    0%   { background-color: #FFFFFF; }\n    25%  { background-color: #eb0028; }\n    50% { background-color: #FFFFFF; }\n    75% { background-color: #eb0028; }\n    100% { background-color: #FFFFFF; }\n  }\n`;\n\nexport default LdLoadingSpinnerStyles;\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/paper-styles/color.js';\nimport './paper-spinner-styles.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\n\nimport {PaperSpinnerBehavior} from './paper-spinner-behavior.js';\n\nconst template = html`\n  <style include=\"paper-spinner-styles\"></style>\n\n  <div id=\"spinnerContainer\" class-name=\"[[__computeContainerClasses(active, __coolingDown)]]\" on-animationend=\"__reset\" on-webkit-animation-end=\"__reset\">\n    <div class=\"spinner-layer layer-1\">\n      <div class=\"circle-clipper left\">\n        <div class=\"circle\"></div>\n      </div>\n      <div class=\"circle-clipper right\">\n        <div class=\"circle\"></div>\n      </div>\n    </div>\n\n    <div class=\"spinner-layer layer-2\">\n      <div class=\"circle-clipper left\">\n        <div class=\"circle\"></div>\n      </div>\n      <div class=\"circle-clipper right\">\n        <div class=\"circle\"></div>\n      </div>\n    </div>\n\n    <div class=\"spinner-layer layer-3\">\n      <div class=\"circle-clipper left\">\n        <div class=\"circle\"></div>\n      </div>\n      <div class=\"circle-clipper right\">\n        <div class=\"circle\"></div>\n      </div>\n    </div>\n\n    <div class=\"spinner-layer layer-4\">\n      <div class=\"circle-clipper left\">\n        <div class=\"circle\"></div>\n      </div>\n      <div class=\"circle-clipper right\">\n        <div class=\"circle\"></div>\n      </div>\n    </div>\n  </div>\n`;\ntemplate.setAttribute('strip-whitespace', '');\n\n/**\nMaterial design: [Progress &\nactivity](https://www.google.com/design/spec/components/progress-activity.html)\n\nElement providing a multiple color material design circular spinner.\n\n    <paper-spinner active></paper-spinner>\n\nThe default spinner cycles between four layers of colors; by default they are\nblue, red, yellow and green. It can be customized to cycle between four\ndifferent colors. Use <paper-spinner-lite> for single color spinners.\n\n### Accessibility\n\nAlt attribute should be set to provide adequate context for accessibility. If\nnot provided, it defaults to 'loading'. Empty alt can be provided to mark the\nelement as decorative if alternative content is provided in another form (e.g. a\ntext block following the spinner).\n\n    <paper-spinner alt=\"Loading contacts list\" active></paper-spinner>\n\n### Styling\n\nThe following custom properties and mixins are available for styling:\n\nCustom property | Description | Default\n----------------|-------------|----------\n`--paper-spinner-layer-1-color` | Color of the first spinner rotation | `--google-blue-500`\n`--paper-spinner-layer-2-color` | Color of the second spinner rotation | `--google-red-500`\n`--paper-spinner-layer-3-color` | Color of the third spinner rotation | `--google-yellow-500`\n`--paper-spinner-layer-4-color` | Color of the fourth spinner rotation | `--google-green-500`\n`--paper-spinner-stroke-width` | The width of the spinner stroke | 3px\n\n@group Paper Elements\n@element paper-spinner\n@hero hero.svg\n@demo demo/index.html\n*/\nPolymer({\n  _template: template,\n\n  is: 'paper-spinner',\n\n  behaviors: [PaperSpinnerBehavior]\n});\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\nimport LdLoadingSpinnerStyles from './styles';\nimport '@polymer/paper-spinner/paper-spinner';\nimport '@polymer/paper-dialog/paper-dialog';\n\n\nclass LdLoadingSpinner extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      parent: { type: String, hasChanged: () => true }\n\n    };\n  }\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdLoadingSpinnerStyles];\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <paper-dialog class='ld-spinner-pop-out' modal>\n        <paper-spinner class=\"ld-loading-spinner\" active></paper-spinner>\n      </paper-dialog>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this._openSpinner = this.openLoadingSpinner.bind(this);\n    this._closeSpinner = this.closeLoadingSpinner.bind(this);\n    this.parent = 'ld-application';\n  }\n\n  /**\n   * create an eventListener\n   */\n  // --------------------------------------------------------------------------------------\n  connectedCallback() {\n    super.connectedCallback();\n    window.addEventListener('LdOpenLoadingSpinner', this._openSpinner);\n    window.addEventListener('LdCloseLoadingSpinner', this._closeSpinner);\n  }\n\n  /**\n   * to prevent memory leaks\n   */\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    window.removeEventListener('LdOpenLoadingSpinner', this._openSpinner);\n    window.removeEventListener('LdCloseLoadingSpinner', this._closeSpinner);\n  }\n\n  /**\n   * open the loading spinner\n   */\n  // --------------------------------------------------------------------------------------\n  openLoadingSpinner() {\n    const parent =  window.document.querySelector(`${this.parent}`);\n    const _spinnerElement = parent.shadowRoot.querySelector('ld-spinner') == null ? parent : parent.shadowRoot.querySelector('ld-spinner');\n    _spinnerElement.shadowRoot.querySelector('.ld-spinner-pop-out').open();\n  }\n\n  /**\n   * close the loading spinner\n   */\n  // --------------------------------------------------------------------------------------\n  closeLoadingSpinner() {\n    const parent =  window.document.querySelector(`${this.parent}`);\n    const _spinnerElement = parent.shadowRoot.querySelector('ld-spinner') == null ? parent : parent.shadowRoot.querySelector('ld-spinner');\n    _spinnerElement.shadowRoot.querySelector('.ld-spinner-pop-out').close();\n  }\n\n}\n\ncustomElements.define('ld-spinner', LdLoadingSpinner);\n","/**\n@license\nCopyright (c) 2015 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nimport '@polymer/polymer/polymer-legacy.js';\nimport '@polymer/iron-flex-layout/iron-flex-layout.js';\n\nimport {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';\nimport {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';\nimport {html} from '@polymer/polymer/lib/utils/html-tag.js';\nimport {afterNextRender} from '@polymer/polymer/lib/utils/render-status.js';\n\n/**\napp-drawer is a navigation drawer that can slide in from the left or right.\n\nExample:\n\nAlign the drawer at the start, which is left in LTR layouts (default):\n\n```html\n<app-drawer opened></app-drawer>\n```\n\nAlign the drawer at the end:\n\n```html\n<app-drawer align=\"end\" opened></app-drawer>\n```\n\nTo make the contents of the drawer scrollable, create a wrapper for the scroll\ncontent, and apply height and overflow styles to it.\n\n```html\n<app-drawer>\n  <div style=\"height: 100%; overflow: auto;\"></div>\n</app-drawer>\n```\n\n### Styling\n\nCustom property                  | Description                            | Default\n---------------------------------|----------------------------------------|--------------------\n`--app-drawer-width`             | Width of the drawer                    | 256px\n`--app-drawer-content-container` | Mixin for the drawer content container | {}\n`--app-drawer-scrim-background`  | Background for the scrim               | rgba(0, 0, 0, 0.5)\n\n**NOTE:** If you use `<app-drawer>` with `<app-drawer-layout>` and specify a\nvalue for\n`--app-drawer-width`, that value must be accessible by both elements. This can\nbe done by defining the value on the `:host` that contains `<app-drawer-layout>`\n(or `html` if outside a shadow root):\n\n```css\n:host {\n  --app-drawer-width: 300px;\n}\n```\n\n@element app-drawer\n@demo app-drawer/demo/left-drawer.html Simple Left Drawer\n@demo app-drawer/demo/right-drawer.html Right Drawer with Icons\n*/\nPolymer({\n  /** @override */\n  _template: html`\n    <style>\n      :host {\n        position: fixed;\n        top: -120px;\n        right: 0;\n        bottom: -120px;\n        left: 0;\n\n        visibility: hidden;\n\n        transition-property: visibility;\n      }\n\n      :host([opened]) {\n        visibility: visible;\n      }\n\n      :host([persistent]) {\n        width: var(--app-drawer-width, 256px);\n      }\n\n      :host([persistent][position=left]) {\n        right: auto;\n      }\n\n      :host([persistent][position=right]) {\n        left: auto;\n      }\n\n      #contentContainer {\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: 0;\n\n        width: var(--app-drawer-width, 256px);\n        padding: var(--app-drawer-content-padding, 120px 0);\n\n        transition-property: -webkit-transform;\n        transition-property: transform;\n        -webkit-transform: translate3d(-100%, 0, 0);\n        transform: translate3d(-100%, 0, 0);\n\n        background-color: #FFF;\n\n        @apply --app-drawer-content-container;\n      }\n\n      #contentContainer[persistent] {\n        width: 100%;\n      }\n\n      #contentContainer[position=right] {\n        right: 0;\n        left: auto;\n\n        -webkit-transform: translate3d(100%, 0, 0);\n        transform: translate3d(100%, 0, 0);\n      }\n\n      #contentContainer[swipe-open]::after {\n        position: fixed;\n        top: 0;\n        bottom: 0;\n        left: 100%;\n\n        visibility: visible;\n\n        width: 20px;\n\n        content: '';\n      }\n\n      #contentContainer[swipe-open][position=right]::after {\n        right: 100%;\n        left: auto;\n      }\n\n      #contentContainer[opened] {\n        -webkit-transform: translate3d(0, 0, 0);\n        transform: translate3d(0, 0, 0);\n      }\n\n      #scrim {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n\n        transition-property: opacity;\n        -webkit-transform: translateZ(0);\n        transform:  translateZ(0);\n\n        opacity: 0;\n        background: var(--app-drawer-scrim-background, rgba(0, 0, 0, 0.5));\n      }\n\n      #scrim.visible {\n        opacity: 1;\n      }\n\n      :host([no-transition]) #contentContainer {\n        transition-property: none;\n      }\n    </style>\n\n    <div id=\"scrim\" on-click=\"close\"></div>\n\n    <!-- HACK(keanulee): Bind attributes here (in addition to :host) for styling to workaround Safari\n    bug. https://bugs.webkit.org/show_bug.cgi?id=170762 -->\n    <div id=\"contentContainer\" opened\\$=\"[[opened]]\" persistent\\$=\"[[persistent]]\" position\\$=\"[[position]]\" swipe-open\\$=\"[[swipeOpen]]\">\n      <slot></slot>\n    </div>\n`,\n\n  is: 'app-drawer',\n\n  properties: {\n    /**\n     * The opened state of the drawer.\n     */\n    opened:\n        {type: Boolean, value: false, notify: true, reflectToAttribute: true},\n\n    /**\n     * The drawer does not have a scrim and cannot be swiped close.\n     */\n    persistent: {type: Boolean, value: false, reflectToAttribute: true},\n\n    /**\n     * The transition duration of the drawer in milliseconds.\n     */\n    transitionDuration: {type: Number, value: 200},\n\n    /**\n     * The alignment of the drawer on the screen ('left', 'right', 'start' or\n     * 'end'). 'start' computes to left and 'end' to right in LTR layout and\n     * vice versa in RTL layout.\n     */\n    align: {type: String, value: 'left'},\n\n    /**\n     * The computed, read-only position of the drawer on the screen ('left' or\n     * 'right').\n     */\n    position: {type: String, readOnly: true, reflectToAttribute: true},\n\n    /**\n     * Create an area at the edge of the screen to swipe open the drawer.\n     */\n    swipeOpen: {type: Boolean, value: false, reflectToAttribute: true},\n\n    /**\n     * Trap keyboard focus when the drawer is opened and not persistent.\n     */\n    noFocusTrap: {type: Boolean, value: false},\n\n    /**\n     * Disables swiping on the drawer.\n     */\n    disableSwipe: {type: Boolean, value: false}\n  },\n\n  observers: [\n    'resetLayout(position, isAttached)',\n    '_resetPosition(align, isAttached)',\n    '_styleTransitionDuration(transitionDuration)',\n    '_openedPersistentChanged(opened, persistent)'\n  ],\n\n  _translateOffset: 0,\n  _trackDetails: null,\n  _drawerState: 0,\n  _boundEscKeydownHandler: null,\n  _firstTabStop: null,\n  _lastTabStop: null,\n\n  /** @override */\n  attached: function() {\n    afterNextRender(this, function() {\n      this._boundEscKeydownHandler = this._escKeydownHandler.bind(this);\n      this.addEventListener('keydown', this._tabKeydownHandler.bind(this));\n\n      // Only listen for horizontal track so you can vertically scroll\n      // inside the drawer.\n      this.listen(this, 'track', '_track');\n      this.setScrollDirection('y');\n    });\n\n    this.fire('app-reset-layout');\n  },\n\n  /** @override */\n  detached: function() {\n    document.removeEventListener('keydown', this._boundEscKeydownHandler);\n  },\n\n  /**\n   * Opens the drawer.\n   */\n  open: function() {\n    this.opened = true;\n  },\n\n  /**\n   * Closes the drawer.\n   */\n  close: function() {\n    this.opened = false;\n  },\n\n  /**\n   * Toggles the drawer open and close.\n   */\n  toggle: function() {\n    this.opened = !this.opened;\n  },\n\n  /**\n   * Gets the width of the drawer.\n   *\n   * @return {number} The width of the drawer in pixels.\n   */\n  getWidth: function() {\n    return this._savedWidth || this.$.contentContainer.offsetWidth;\n  },\n\n  _isRTL: function() {\n    return window.getComputedStyle(this).direction === 'rtl';\n  },\n\n  _resetPosition: function() {\n    switch (this.align) {\n      case 'start':\n        this._setPosition(this._isRTL() ? 'right' : 'left');\n        return;\n      case 'end':\n        this._setPosition(this._isRTL() ? 'left' : 'right');\n        return;\n    }\n    this._setPosition(this.align);\n  },\n\n  _escKeydownHandler: function(event) {\n    var ESC_KEYCODE = 27;\n    if (event.keyCode === ESC_KEYCODE) {\n      // Prevent any side effects if app-drawer closes.\n      event.preventDefault();\n      this.close();\n    }\n  },\n\n  _track: function(event) {\n    if (this.persistent || this.disableSwipe) {\n      return;\n    }\n\n    // Disable user selection on desktop.\n    event.preventDefault();\n\n    switch (event.detail.state) {\n      case 'start':\n        this._trackStart(event);\n        break;\n      case 'track':\n        this._trackMove(event);\n        break;\n      case 'end':\n        this._trackEnd(event);\n        break;\n    }\n  },\n\n  _trackStart: function(event) {\n    this._drawerState = this._DRAWER_STATE.TRACKING;\n\n    var rect = this.$.contentContainer.getBoundingClientRect();\n    this._savedWidth = rect.width;\n    if (this.position === 'left') {\n      this._translateOffset = rect.left;\n    } else {\n      this._translateOffset = rect.right - window.innerWidth;\n    }\n\n    this._trackDetails = [];\n\n    // Disable transitions since style attributes will reflect user track\n    // events.\n    this._styleTransitionDuration(0);\n    this.style.visibility = 'visible';\n  },\n\n  _trackMove: function(event) {\n    this._translateDrawer(event.detail.dx + this._translateOffset);\n\n    // Use Date.now() since event.timeStamp is inconsistent across browsers\n    // (e.g. most browsers use milliseconds but FF 44 uses microseconds).\n    this._trackDetails.push({dx: event.detail.dx, timeStamp: Date.now()});\n  },\n\n  _trackEnd: function(event) {\n    var x = event.detail.dx + this._translateOffset;\n    var drawerWidth = this.getWidth();\n    var isPositionLeft = this.position === 'left';\n    var isInEndState = isPositionLeft ? (x >= 0 || x <= -drawerWidth) :\n                                        (x <= 0 || x >= drawerWidth);\n\n    if (!isInEndState) {\n      // No longer need the track events after this method returns - allow them\n      // to be GC'd.\n      var trackDetails = this._trackDetails;\n      this._trackDetails = null;\n\n      this._flingDrawer(event, trackDetails);\n      if (this._drawerState === this._DRAWER_STATE.FLINGING) {\n        return;\n      }\n    }\n\n    // If the drawer is not flinging, toggle the opened state based on the\n    // position of the drawer.\n    var halfWidth = drawerWidth / 2;\n    if (event.detail.dx < -halfWidth) {\n      this.opened = this.position === 'right';\n    } else if (event.detail.dx > halfWidth) {\n      this.opened = this.position === 'left';\n    }\n\n    if (isInEndState) {\n      this.debounce('_resetDrawerState', this._resetDrawerState);\n    } else {\n      this.debounce(\n          '_resetDrawerState', this._resetDrawerState, this.transitionDuration);\n    }\n\n    this._styleTransitionDuration(this.transitionDuration);\n    this._resetDrawerTranslate();\n    this.style.visibility = '';\n  },\n\n  _calculateVelocity: function(event, trackDetails) {\n    // Find the oldest track event that is within 100ms using binary search.\n    var now = Date.now();\n    var timeLowerBound = now - 100;\n    var trackDetail;\n    var min = 0;\n    var max = trackDetails.length - 1;\n\n    while (min <= max) {\n      // Floor of average of min and max.\n      var mid = (min + max) >> 1;\n      var d = trackDetails[mid];\n      if (d.timeStamp >= timeLowerBound) {\n        trackDetail = d;\n        max = mid - 1;\n      } else {\n        min = mid + 1;\n      }\n    }\n\n    if (trackDetail) {\n      var dx = event.detail.dx - trackDetail.dx;\n      var dt = (now - trackDetail.timeStamp) || 1;\n      return dx / dt;\n    }\n    return 0;\n  },\n\n  _flingDrawer: function(event, trackDetails) {\n    var velocity = this._calculateVelocity(event, trackDetails);\n\n    // Do not fling if velocity is not above a threshold.\n    if (Math.abs(velocity) < this._MIN_FLING_THRESHOLD) {\n      return;\n    }\n\n    this._drawerState = this._DRAWER_STATE.FLINGING;\n\n    var x = event.detail.dx + this._translateOffset;\n    var drawerWidth = this.getWidth();\n    var isPositionLeft = this.position === 'left';\n    var isVelocityPositive = velocity > 0;\n    var isClosingLeft = !isVelocityPositive && isPositionLeft;\n    var isClosingRight = isVelocityPositive && !isPositionLeft;\n    var dx;\n    if (isClosingLeft) {\n      dx = -(x + drawerWidth);\n    } else if (isClosingRight) {\n      dx = (drawerWidth - x);\n    } else {\n      dx = -x;\n    }\n\n    // Enforce a minimum transition velocity to make the drawer feel snappy.\n    if (isVelocityPositive) {\n      velocity = Math.max(velocity, this._MIN_TRANSITION_VELOCITY);\n      this.opened = this.position === 'left';\n    } else {\n      velocity = Math.min(velocity, -this._MIN_TRANSITION_VELOCITY);\n      this.opened = this.position === 'right';\n    }\n\n    // Calculate the amount of time needed to finish the transition based on the\n    // initial slope of the timing function.\n    var t = this._FLING_INITIAL_SLOPE * dx / velocity;\n    this._styleTransitionDuration(t);\n    this._styleTransitionTimingFunction(this._FLING_TIMING_FUNCTION);\n\n    this._resetDrawerTranslate();\n    this.debounce('_resetDrawerState', this._resetDrawerState, t);\n  },\n\n  _styleTransitionDuration: function(duration) {\n    this.style.transitionDuration = duration + 'ms';\n    this.$.contentContainer.style.transitionDuration = duration + 'ms';\n    this.$.scrim.style.transitionDuration = duration + 'ms';\n  },\n\n  _styleTransitionTimingFunction: function(timingFunction) {\n    this.$.contentContainer.style.transitionTimingFunction = timingFunction;\n    this.$.scrim.style.transitionTimingFunction = timingFunction;\n  },\n\n  _translateDrawer: function(x) {\n    var drawerWidth = this.getWidth();\n\n    if (this.position === 'left') {\n      x = Math.max(-drawerWidth, Math.min(x, 0));\n      this.$.scrim.style.opacity = 1 + x / drawerWidth;\n    } else {\n      x = Math.max(0, Math.min(x, drawerWidth));\n      this.$.scrim.style.opacity = 1 - x / drawerWidth;\n    }\n\n    this.translate3d(x + 'px', '0', '0', this.$.contentContainer);\n  },\n\n  _resetDrawerTranslate: function() {\n    this.$.scrim.style.opacity = '';\n    this.transform('', this.$.contentContainer);\n  },\n\n  _resetDrawerState: function() {\n    var oldState = this._drawerState;\n\n    // If the drawer was flinging, we need to reset the style attributes.\n    if (oldState === this._DRAWER_STATE.FLINGING) {\n      this._styleTransitionDuration(this.transitionDuration);\n      this._styleTransitionTimingFunction('');\n      this.style.visibility = '';\n    }\n\n    this._savedWidth = null;\n\n    if (this.opened) {\n      this._drawerState = this.persistent ?\n          this._DRAWER_STATE.OPENED_PERSISTENT :\n          this._DRAWER_STATE.OPENED;\n    } else {\n      this._drawerState = this._DRAWER_STATE.CLOSED;\n    }\n\n    if (oldState !== this._drawerState) {\n      if (this._drawerState === this._DRAWER_STATE.OPENED) {\n        this._setKeyboardFocusTrap();\n        document.addEventListener('keydown', this._boundEscKeydownHandler);\n        document.body.style.overflow = 'hidden';\n      } else {\n        document.removeEventListener('keydown', this._boundEscKeydownHandler);\n        document.body.style.overflow = '';\n      }\n\n      // Don't fire the event on initial load.\n      if (oldState !== this._DRAWER_STATE.INIT) {\n        this.fire('app-drawer-transitioned');\n      }\n    }\n  },\n\n  /**\n   * Resets the layout.\n   *\n   * @method resetLayout\n   */\n  resetLayout: function() {\n    this.fire('app-reset-layout');\n  },\n\n  _setKeyboardFocusTrap: function() {\n    if (this.noFocusTrap) {\n      return;\n    }\n\n    // NOTE: Unless we use /deep/ (which we shouldn't since it's deprecated),\n    // this will not select focusable elements inside shadow roots.\n    var focusableElementsSelector = [\n      'a[href]:not([tabindex=\"-1\"])',\n      'area[href]:not([tabindex=\"-1\"])',\n      'input:not([disabled]):not([tabindex=\"-1\"])',\n      'select:not([disabled]):not([tabindex=\"-1\"])',\n      'textarea:not([disabled]):not([tabindex=\"-1\"])',\n      'button:not([disabled]):not([tabindex=\"-1\"])',\n      'iframe:not([tabindex=\"-1\"])',\n      '[tabindex]:not([tabindex=\"-1\"])',\n      '[contentEditable=true]:not([tabindex=\"-1\"])'\n    ].join(',');\n    var focusableElements =\n        dom(this).querySelectorAll(focusableElementsSelector);\n\n    if (focusableElements.length > 0) {\n      this._firstTabStop = focusableElements[0];\n      this._lastTabStop = focusableElements[focusableElements.length - 1];\n    } else {\n      // Reset saved tab stops when there are no focusable elements in the\n      // drawer.\n      this._firstTabStop = null;\n      this._lastTabStop = null;\n    }\n\n    // Focus on app-drawer if it has non-zero tabindex. Otherwise, focus the\n    // first focusable element in the drawer, if it exists. Use the tabindex\n    // attribute since the this.tabIndex property in IE/Edge returns 0 (instead\n    // of -1) when the attribute is not set.\n    var tabindex = this.getAttribute('tabindex');\n    if (tabindex && parseInt(tabindex, 10) > -1) {\n      this.focus();\n    } else if (this._firstTabStop) {\n      this._firstTabStop.focus();\n    }\n  },\n\n  _tabKeydownHandler: function(event) {\n    if (this.noFocusTrap) {\n      return;\n    }\n\n    var TAB_KEYCODE = 9;\n    if (this._drawerState === this._DRAWER_STATE.OPENED &&\n        event.keyCode === TAB_KEYCODE) {\n      if (event.shiftKey) {\n        if (this._firstTabStop &&\n            dom(event).localTarget === this._firstTabStop) {\n          event.preventDefault();\n          this._lastTabStop.focus();\n        }\n      } else {\n        if (this._lastTabStop && dom(event).localTarget === this._lastTabStop) {\n          event.preventDefault();\n          this._firstTabStop.focus();\n        }\n      }\n    }\n  },\n\n  _openedPersistentChanged: function(opened, persistent) {\n    this.toggleClass('visible', opened && !persistent, this.$.scrim);\n\n    // Use a debounce timer instead of transitionend since transitionend won't\n    // fire when app-drawer is display: none.\n    this.debounce(\n        '_resetDrawerState', this._resetDrawerState, this.transitionDuration);\n  },\n\n  _MIN_FLING_THRESHOLD: 0.2,\n  _MIN_TRANSITION_VELOCITY: 1.2,\n  _FLING_TIMING_FUNCTION: 'cubic-bezier(0.667, 1, 0.667, 1)',\n  _FLING_INITIAL_SLOPE: 1.5,\n\n  _DRAWER_STATE: {\n    INIT: 0,\n    OPENED: 1,\n    OPENED_PERSISTENT: 2,\n    CLOSED: 3,\n    TRACKING: 4,\n    FLINGING: 5\n  }\n\n  /**\n   * Fired when the layout of app-drawer has changed.\n   *\n   * @event app-reset-layout\n   */\n\n  /**\n   * Fired when app-drawer has finished transitioning.\n   *\n   * @event app-drawer-transitioned\n   */\n});\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport {css, unsafeCSS} from 'lit-element';\nimport {_THEME} from '../../themes/styles';\n\nexport const LdPlatformStyles = css`\n    :host {\n        display: flex;\n        flex: auto;\n        flex-direction: column;\n        align-items: stretch;\n\n        font-family: ${unsafeCSS(_THEME.fonts.main_font)};\n        --app-drawer-width: 64px;\n        --app-drawer-scrim-background: ${unsafeCSS(_THEME.colors.app_drawer_scrim_background_color)};\n        --app-drawer-content-container: {\n            background-color: ${unsafeCSS(_THEME.colors.app_drawer_background_color)};\n            top: 64px;\n        };\n    }\n\n    app-header {\n        height: 64px;\n        background-color: ${unsafeCSS(_THEME.colors.app_header_background_color)};\n        color: ${unsafeCSS(_THEME.colors.app_header_color)};\n        box-shadow: inset 0px 5px 6px -3px rgba(0, 0, 0, 0.4);\n        box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.4);\n    }\n\n    ld-search-input {\n        width: 450px;\n        max-width: 100%;\n        height: 50px;\n        display: block;\n        margin-left: 150px;\n    }\n\n    app-drawer {\n        position: fixed;\n        z-index: 10;\n    }\n\n    div[main-title] {\n        text-align: center;\n        font-weight: bold;\n        font-size: 18px;\n        line-height: 22px;\n        letter-spacing: 2.2px;\n        text-transform: uppercase;\n        padding-left: 5%;\n        padding-right: 0%;\n    }\n\n    ld-banner {\n        display: none;\n        position: fixed;\n        background-color: ${unsafeCSS(_THEME.colors.release_banner)};\n        color: ${unsafeCSS(_THEME.colors.secondary_text_color)};\n        text-align: center;\n        z-index: 9999;\n        width: 100%;\n    }\n\n    .show {\n        display: block;\n    }\n\n    @media only screen and (min-width: 600px ) {\n        ld-search-input {\n            width: 50px;\n        }\n\n        ld-search-input:focus {\n            width: 450px;\n        }\n\n        div[main-title] {\n            text-align: center;\n            font-weight: bold;\n            font-size: 18px;\n            line-height: 22px;\n            letter-spacing: 2.2px;\n            text-transform: uppercase;\n            padding-left: 5%;\n            padding-right: 0%;\n\n        }\n    }\n\n    @media only screen and (min-width: 1024px ) {\n        ld-search-input {\n            width: 250px;\n        }\n\n        ld-search-input:focus {\n            width: 250px;\n        }\n\n        div[main-title] {\n            text-align: center;\n            font-weight: bold;\n            font-size: 18px;\n            line-height: 22px;\n            letter-spacing: 2.2px;\n            text-transform: uppercase;\n            padding-right: 18%;\n        }\n    }\n\n    @media only screen and (min-width: 1260px ) {\n        ld-search-input {\n            width: 450px;\n        }\n\n        ld-search-input:focus {\n            width: 450px;\n        }\n\n        div[main-title] {\n            text-align: center;\n            font-weight: bold;\n            font-size: 18px;\n            line-height: 22px;\n            letter-spacing: 2.2px;\n            text-transform: uppercase;\n            padding-right: 18%;\n        }\n    }\n\n\n    section.sw-logo {\n        height: 64px;\n        width: 64px;\n        background-color: rgba(255, 255, 255, 1);\n    }\n\n    #sw-logo {\n        height: 28px;\n        width: 80px;\n        position: absolute;\n        top: 18px;\n        left: 70px;\n    }\n\n    #sw-logo.sw-logo-dev-override {\n        border: 3px solid #ff1493;\n        border-radius: 4px;\n        padding: 3px;\n        box-sizing: border-box;\n        animation: sw-logo-dev-override-blink 1s ease-in-out infinite;\n        box-shadow: 0 0 0 2px rgba(255, 20, 147, 0.25);\n    }\n\n    .dev-override {\n        background-color: #ff1493;\n        color: #ffffff;\n        animation: dev-override-blink 1s ease-in-out infinite;\n\n    }\n\n    @keyframes sw-logo-dev-override-blink {\n        0%, 100% {\n            border-color: #ff1493;\n            box-shadow: 0 0 0 2px rgba(255, 20, 147, 0.25), 0 0 10px rgba(255, 20, 147, 0.65);\n        }\n        50% {\n            border-color: #ff69b4;\n            box-shadow: 0 0 0 2px rgba(255, 20, 147, 0.45), 0 0 18px rgba(255, 20, 147, 0.95);\n        }\n    }\n\n    @keyframes dev-override-blink {\n        0%, 100% {\n            background-color: #ff1493;\n        }\n        50% {\n            background-color: #ff69b4;\n        }\n    }\n\n    #profile {\n        display: flex;\n        cursor: pointer;\n    }\n\n    #sw-logout {\n        cursor: pointer;\n    }\n\n    .sw-header-bar-icon-alerts,\n    .sw-header-bar-icon-profile {\n        margin: 0 15px 0 0;\n    }\n\n    app-header paper-icon-button {\n        --paper-icon-button-ink-color: ${unsafeCSS(_THEME.colors.primary_header_color)};\n    }\n\n    .dropdown-content {\n        color: ${unsafeCSS(_THEME.colors.primary_header_color)};\n    }\n\n    paper-menu-button {\n        color: ${unsafeCSS(_THEME.colors.primary_header_color)};\n    }\n\n    #user-dropdown {\n        padding: 10px;\n        width: 250px;\n        min-height: 100px;\n    }\n\n    #user-dropdown paper-button {\n        margin: 5px 0px;\n    }\n\n    span.account-name {\n        -webkit-font-smoothing: antialiased;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        font-size: 14px;\n        line-height: 17px;\n        pointer-events: none;\n        margin-right: 10px;\n    }\n\n    .flex {\n        -ms-flex: 1 1 0px;\n        -webkit-flex: 1;\n        flex: 1;\n        -webkit-flex-basis: 0px;\n        flex-basis: 0px;\n    }\n\n    footer {\n        display: -webkit-flex;\n        display: flex;\n        -ms-flex-direction: column;\n        -webkit-flex-direction: column;\n        flex-direction: column;\n        -ms-flex-align: end;\n        -webkit-align-items: flex-end;\n        align-items: flex-end;\n        font-size: 12px;\n        -ms-flex: 1 1 0px;\n        -webkit-flex: 1;\n        flex: 1;\n        -webkit-flex-basis: 0px;\n        flex-basis: 0px;\n        margin-right: 60px;\n        max-height: 50px;\n    }\n\n    ul {\n        display: block;\n        list-style-type: disc;\n        margin-block-start: 1em;\n        margin-block-end: 1em;\n        margin-inline-start: 0px;\n        margin-inline-end: 0px;\n        padding-inline-start: 40px;\n    }\n\n    footer ul {\n        margin: 16px 25px;\n        height: 20px;\n        list-style: none;\n    }\n\n    footer ul > li {\n        display: inline;\n        margin-right: 15px;\n    }\n\n    footer ul > li > a {\n        color: ${unsafeCSS(_THEME.colors.secondary_note_color)};\n        text-decoration: none;\n    }\n\n    html, body {\n        width: 100%;\n        height: 100%;\n    }\n\n    main {\n        margin-left: 64px;\n        margin-top: 64px;\n        display: flex;\n        flex-direction: column;\n        flex: auto;\n    }\n\n    app-header, main, footer {\n        flex-shrink: 0;\n    }\n\n    ld-users {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        margin-left: 10px !important;\n        width: calc(100% - 60px) !important;\n\n    }\n\n    ld-netcfg {\n        margin-top: 20px;\n    }\n\n    ._pageModule {\n        display: none;\n    }\n\n    ._pageModule[active] {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        margin-left: 55px;\n\n    }\n\n\n    .main-content-inner-wrapper {\n        width: calc(100% - 100px);\n        margin: 50px;\n        margin-bottom: 0px;\n        display: flex;\n        flex-direction: column;\n        flex: auto;\n    }\n\n    /* The sticky class is added to the header with JS when it reaches its scroll position */\n\n    .sticky {\n        position: fixed;\n        top: 0;\n        width: 100%;\n        z-index: 101;\n    }\n\n    .button-hide {\n        display: none;\n    }\n\n    .button-show {\n        display: block !important;\n    }\n\n    #privacyPolicyDialog {\n        width: 40%;\n        min-height: 95%;\n    }\n\n    paper-dialog#privacyPolicyDialog .privacy-language {\n        margin: 0 0 0 20px;\n        padding: 15px 5px 0 5px;\n    }\n\n    paper-dialog#privacyPolicyDialog .privacy-language a {\n        padding: 0 5px;\n    }\n\n    paper-dialog#privacyPolicyDialog .privacy-language a:first-child {\n        padding-left: 0;\n    }\n\n    paper-button#privacyPolicyDialogButtonClose {\n        display: none;\n    }\n\n    paper-toast {\n        border-top-width: 3px;\n        border-top-style: solid;\n        border-top-color: ${unsafeCSS(_THEME.colors.primary_color)};\n        z-index: 999999;\n    }\n\n    paper-toast[data-notification-type='success'] {\n        border-top-color: var(--sw-secondary-green-300);\n    }\n\n    paper-toast[data-notification-type='release'] {\n        border-top-color: ${unsafeCSS(_THEME.colors.selected_menu_item)};\n    }\n`;\n\nexport default LdPlatformStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../../themes/styles';\n\nexport const LdSidebarStyles = css`\n  .active {\n    border-left: 4px ${unsafeCSS(_THEME.colors.primary_color)} solid !important;\n    background-color: ${unsafeCSS(_THEME.colors.app_drawer_sidebar_background_color)};\n  }\n`;\n\nexport default LdSidebarStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { css } from 'lit-element';\n\nexport const LdSidebarItemStyles = css`\n  :host {\n    display: block;\n    height: 64px;\n    border-left: 4px transparent solid;\n    cursor: pointer;\n  }\n  \n  a {\n    display: block;\n    width: 100%;\n    height: 100%;\n  }\n  \n  iron-icon {\n    margin:20px 17px;\n  }\n`;\n\nexport default LdSidebarItemStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\nimport '@polymer/iron-icon/iron-icon';\n\nimport { LdSidebarItemStyles } from './ld-sidebar-item-styles';\n\n\n/**\n * Class for displaying a &lt;ld-sidebar-item&gt; element.\n * @extends LitElement\n */\nclass LdSidebarItem extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      item: Object\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdSidebarItemStyles];\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    const _item = JSON.parse(this.item);\n    return html`\n      <iron-icon src=\"/images/sidebar/icon_${_item.icon}.png\" class=\"sw-iron-icon\" item-icon slot=\"item-icon\"></iron-icon>\n    `;\n  }\n\n}\n\ncustomElements.define('ld-sidebar-item', LdSidebarItem);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { html, LitElement } from 'lit-element';\nimport { connect } from 'pwa-helpers/connect-mixin';\nimport { store } from '../../ld-redux/ld-redux-store';\nimport '@polymer/paper-tooltip/paper-tooltip';\n\nimport { forward, isUserSwEmployee } from '../../../js/LdGlobal';\nimport { LdI18NextMixin } from '../../ld-application/i18n/ld-i18next';\n\nimport { LdSidebarStyles } from './ld-sidebar-styles';\nimport './ld-sidebar-item';\n\n/**\n * Class for displaying a &lt;ld-sidebar&gt; element.\n * @extends LitElement\n */\nclass LdSidebar extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n      activeModule: { type: String, reflect: true },\n      pageModules: { type: String, reflect: true },\n      _userInformation: { type: Object, reflect: true }\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdSidebarStyles];\n  }\n\n  hasAccessToModule(userInfo, restrictedTo) {\n    if (!restrictedTo || restrictedTo.length === 0) return true;\n    if (isUserSwEmployee(userInfo)) return true;\n    return restrictedTo.includes(userInfo.role);\n  }\n\n  /**\n   * render method, used to display the rendered template\n   *\n   * @returns {String} Rendered literals template\n   */\n  // --------------------------------------------------------------------------------------\n  render() {\n    const sidebarItems = [];\n    const modules = JSON.parse(this.pageModules);\n\n    modules.forEach(item => {\n      // Skip items that should not be shown\n      if (item.show === false) return;\n\n      // Check access rights\n      const hasAccess = item.swOnly\n        ? this.hasAccessToModule(this._userInformation, item.restrictedTo)\n        : true;\n\n      if (hasAccess) {\n        sidebarItems.push(html`\n          <ld-sidebar-item\n              id=\"${item.id}\"\n              item=\"${JSON.stringify(item)}\"\n              @click=\"${(e) => this._onButtonClick(e, item)}\"\n              class=\"${this.activeModule === item.id ? 'active' : ''}\">\n          </ld-sidebar-item>\n          <paper-tooltip for=\"${item.id}\" position=\"right\">\n            ${this.LdTranslate(item.name)}\n          </paper-tooltip>\n        `);\n      }\n    });\n\n    return html`${sidebarItems}`;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _onButtonClick(evt, item) {\n    forward(item.href);\n  }\n\n}\n\ncustomElements.define('ld-sidebar', LdSidebar);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {customElement, html, LitElement, property, state} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {store} from '../../ld-redux/ld-redux-store';\nimport {LdI18NextMixin} from '../../ld-application/i18n/ld-i18next';\nimport {IFMachines, IFPageModules} from \"../../../js/interfaces\";\n\n/**\n * Class for displaying a &lt;ld-title&gt; element.\n * @extends LitElement\n */\n\n@customElement('ld-title')\nexport class LdTitle extends connect(store)(LdI18NextMixin(LitElement)) {\n  @property({type: String}) baseWindowTitle?: string;\n  @property({type: String}) pageModules!: string;\n  @property({type: String}) titleSeparator: string = '-';\n  @property({type: Boolean}) updateWindowTitle?: boolean;\n  @property({type: String}) headerTitle?: string;\n  @state() _pageModule?: string;\n  @state() _pageTitle?: string;\n  @state() _subModules?: string[];\n  @state() _machine?: IFMachines;\n\n\n  render() {\n    return html`\n      ${this._pageTitle}\n    `;\n  }\n\n  private _getCurrentPageModuleTitle(): string {\n\n    const activeModule = this._pageModule;\n    const activeItem = JSON.parse(this.pageModules).find((pageModule: IFPageModules) => pageModule.id === activeModule);\n\n    if (this.updateWindowTitle) {\n      let windowTitle = '';\n      if (this.baseWindowTitle && this.baseWindowTitle != null) {\n        windowTitle = `${this.baseWindowTitle} ${this.titleSeparator} `;\n      }\n      windowTitle += this.LdTranslate(activeItem.name);\n      if (this._subModules?.find(subModule => subModule === 'view')) {\n        windowTitle = this.headerTitle!;\n      }\n      if (this._subModules?.find(subModule => subModule === 'netcfg')) {\n\n        if (this._subModules != null) {\n          activeItem.name = `Network configuration for ${this._subModules[1]}`;\n        }\n      }\n      document.title = windowTitle;\n    }\n    return this.LdTranslate(activeItem.name);\n  }\n\n  stateChanged(state: ReturnType<typeof store.getState>) {\n    this._pageModule = state.LdApplicationReducer.pageModule;\n    this._subModules = state.LdApplicationReducer.subModules;\n\n    const {machine} = state.LdAssetsReducer;\n    if (machine != null && machine !== this._machine) {\n      this._machine = machine;\n      this.headerTitle = `${machine.machine_identifier_customer} | ${machine.name}`;\n    }\n    if (this._pageModule != null) {\n      this._pageTitle = this._getCurrentPageModuleTitle();\n    }\n  }\n}\n","import { customElement, html, LitElement, property } from 'lit-element';\n\n@customElement('ld-banner')\n\nexport class LdBanner extends LitElement {\n\n    @property({ type: String }) releaseText: string = '';\n    @property({ type: String }) id: string          = '';\n    @property({ type: Boolean }) active: boolean    = false;\n\n    // --------------------------------------------------------------------------------------\n    render() {\n        return html`\n            <div>\n                <p id='${this.id}-info'>${this.releaseText}</p>\n            </div>\n        `;\n    }\n}\n","import { css } from 'lit-element';\n\nexport const LdReleaseNotesStyles = css`\n  .header {\n    display: flex;\n    align-items: center;\n    margin-bottom: 20px;\n  }\n\n  .logo {\n    max-width: 100px;\n    margin-right: 20px;\n  }\n\n  img {\n    max-width: 100%;\n  }\n  .release-notes-table {\n    border-collapse: collapse;\n    width: 100%;\n  }\n\n    .gray {\n        color: gray;\n    }\n\n  .release-notes-table td {\n    border: 1px solid #ddd;\n    padding: 8px;\n  }\n\n  .release-notes-table tr:nth-child(even) {\n    background-color: #f2f2f2;\n  }\n\n  paper-dialog#releaseNotesDialog {\n    top: 16px;\n    overflow: auto;\n  }\n\n  .leftSide {\n    width: 30%;\n  }\n\n  .rightSide {\n    width: 70%;\n  }\n`;\n\nexport default LdReleaseNotesStyles;\n","import {customElement, html, LitElement, property, state} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {store} from '../../ld-redux/ld-redux-store';\nimport {LdI18NextMixin} from '../i18n/ld-i18next';\nimport {LdReleaseNotesStyles} from './styles';\nimport {PaperDialogElement} from \"@polymer/paper-dialog\";\nimport {IFLdReduxState, IFReleaseNotesFeature, IFReleaseNotesItem, IFUser} from \"../../../js/interfaces\";\nimport {loadLinks} from \"../../ld-redux/actions/ld-application-actions\";\nimport LdErrorHandler from \"../../../js/LdErrorHandler\";\nimport {saveUserSetting} from \"../../ld-redux/actions/ld-users-actions\";\n\n@customElement('ld-release-notes')\nexport class LdReleaseNotes extends connect(store)(LdI18NextMixin(LitElement)) {\n  @property({type: Boolean}) opened = false;\n  @property({type: Object}) userInformation: IFUser | null = null;\n  @state() _releaseNotes: IFReleaseNotesItem[] = [];\n\n  static get styles() {\n    return [LdReleaseNotesStyles];\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._loadReleaseNotes();\n  }\n\n  render() {\n    const _buttons = this._renderButtons();\n    const _content = this._renderContent();\n\n    return html`\n      <paper-dialog id='releaseNotesDialog' no-cancel-on-esc-key='true' modal no-cancel-on-outside-click='true'\n                    ?opened=\"${this.opened}\">\n        <div class='release-language'>\n        </div>\n        ${_content}\n        ${_buttons}\n      </paper-dialog>\n    `;\n  }\n\n  private _renderButtons() {\n    return html`\n      <div class='buttons'>\n        <paper-button id='releaseNotesDialogButtonClose' @click='${() => this.closeDialog()}'>\n          ${this.LdTranslate('generic.closeLabel')}\n        </paper-button>\n      </div>\n    `;\n  }\n\n  private _renderContent() {\n    if (this._releaseNotes.length > 0) {\n      return html`\n        <paper-dialog-scrollable id='scrollabledialog'>\n          <div class=\"header\">\n            <img src=\"./images/release-notes/sw.png\" alt=\"Company Logo\" class=\"logo\">\n            <h2>Release Notes</h2>\n          </div>\n          ${this._releaseNotes.map((releaseNote, index) => html`\n            <div class=\"release-note\">\n              <h3>${releaseNote.version} </h3>\n              <h3 class=\"gray\">${index === 0 ? 'currently in use' : ''}</h3>\n              <table class=\"release-notes-table\">\n                ${releaseNote.features.map((feature) => html`\n                  <tr>\n                    <td class=\"leftSide\">\n                      <h4>${feature.title}</h4>\n                      <div>${feature.description}</div>\n                    </td>\n                    <td class=\"rightSide\">\n                      ${feature.imageUrl ? html`<img src=\"${feature.imageUrl}\" alt=\"${feature.title}\">` : html``}\n                    </td>\n                  </tr>\n                `)}\n              </table>\n            </div>\n          `)}\n        </paper-dialog-scrollable>\n      `;\n    } else {\n      return html`\n        <paper-dialog-scrollable id='scrollabledialog'>\n          <div class=\"header\">\n            <img src=\"./images/release-notes/sw.png\" alt=\"Company Logo\" class=\"logo\">\n            <h2>Release Notes</h2>\n          </div>\n          No Release Informations available\n        </paper-dialog-scrollable>\n      `;\n    }\n  }\n\n  openDialog() {\n    if (this._isElementAvailable()) {\n      const dialog = this.shadowRoot?.querySelector('paper-dialog#releaseNotesDialog') as PaperDialogElement;\n      dialog.open();\n    }\n  }\n\n  closeDialog() {\n    if (this._isElementAvailable()) {\n      const dialog = this.shadowRoot?.querySelector('paper-dialog#releaseNotesDialog') as PaperDialogElement;\n      dialog.close();\n      this.releaseNotesNumber();\n    }\n  }\n\n  releaseNotesNumber() {\n    if (this._releaseNotes.length !== 0) {\n      const releaseNumber = {\n        readInfo: true,\n        release_number: this._releaseNotes[0].version,\n      };\n      store.dispatch(saveUserSetting(`releaseNotesNumber`, releaseNumber));\n    }\n  }\n\n  _isElementAvailable() {\n    return this.shadowRoot?.querySelector('paper-dialog#releaseNotesDialog') != null;\n  }\n\n  stateChanged(state: IFLdReduxState) {\n    const {releaseNotes, loadingReleaseNotes, result} = state.LdApplicationReducer;\n    if (!loadingReleaseNotes && releaseNotes) {\n      this._releaseNotes = releaseNotes.items.map((releaseNote) => ({\n        ...releaseNote,\n        features: releaseNote.features.filter((feature) => this._isUserAuthorized(feature)),\n      }));\n    }\n\n    if (result != null) {\n      LdErrorHandler._handleError(`${result.status}`);\n    }\n  }\n\n  _loadReleaseNotes() {\n    store.dispatch(loadLinks('/static/release-notes/data.json'));\n  }\n\n  _isUserAuthorized(item: IFReleaseNotesFeature): boolean {\n    return this.userIsAllowedToSeeItem(item, this.userInformation);\n  }\n\n  userIsAllowedToSeeItem(item: IFReleaseNotesFeature, userInformation: any): boolean {\n    if (!userInformation) return false;\n    const allowedRoles = item.roles;\n    const userRole = userInformation.role;\n\n    return allowedRoles.includes(userRole);\n  }\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { customElement, html, LitElement, property, state} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport '@polymer/app-layout/app-drawer/app-drawer';\nimport '@polymer/app-layout/app-header/app-header';\nimport '@polymer/app-layout/app-toolbar/app-toolbar';\nimport '@polymer/paper-button/paper-button';\nimport '@polymer/paper-menu-button/paper-menu-button';\nimport '@polymer/paper-icon-button/paper-icon-button';\nimport '@polymer/iron-icons/iron-icons';\nimport '@polymer/paper-dialog/paper-dialog';\nimport '@lifedata/ui-netcfg/dist/application/index';\nimport '@polymer/paper-toast/paper-toast';\nimport '@polymer/paper-dialog-scrollable/paper-dialog-scrollable';\nimport {store} from '../ld-redux/ld-redux-store';\nimport {LdI18NextMixin, LdTranslate} from '../ld-application/i18n/ld-i18next';\nimport {LdPlatformStyles} from './ld-platform-styles';\nimport {CONFIG, forward, isUserUserOEM, writeJsonToFile} from '../../js/LdGlobal';\nimport {acceptPrivacyPolicy, loadUserSetting, logout, saveUserSetting,} from '../ld-redux/actions/ld-users-actions';\nimport {closeDisplayNotification, displayNotification} from '../../js/LdNotificationHandler';\nimport './ld-sidebar/ld-sidebar';\nimport './ld-title/ld-title';\nimport './ld-search/ld-search-input';\nimport {\n  checkRelease,\n  clearSubmitRequest,\n  loadLinks,\n  submitPUTFileForm,\n  uploadNetcfg,\n} from '../ld-redux/actions/ld-application-actions';\nimport moment from 'moment';\nimport '../ld-login-application';\nimport '../ld-platform/modules/settings/module';\nimport './ld-banner';\nimport '../ld-application/ld-release-notes';\nimport {baseConfig} from \"../../auto-generated/config\";\nimport {ToastNotificationHandler} from '../../js/services/Notifications';\nimport {BrowserFileProvider} from '../../js/services/FileProvider';\nimport LdFetch from \"../../js/LdFetch\";\nimport {LdPrivacyPolicy} from \"../ld-application/ld-privacy-policy\";\nimport {LdDialogs} from \"./ld-dialog/ld-dialogs\";\nimport {\n  IFArrayOfPageModules,\n  IFBreadcrumbObject,\n  IFManuals,\n  IFReleaseInfo,\n  IFReleaseNotesData,\n  IFUserInformation,\n  IFUserSettings\n} from \"../../js/interfaces\";\nimport {PropertyValues} from \"lit/development\";\nimport {LdBreadCrumb} from \"../ld-application/ld-breadcrumb\";\nimport {\n  BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT,\n  hasActiveBackendServiceUrlOverrides,\n} from '../../js/LdServiceUrlOverrides';\n\n\n@customElement('ld-platform')\nexport class LdPlatform extends connect(store)(LdI18NextMixin(LitElement)) {\n  notificationHandler = new ToastNotificationHandler();\n  fileProvider = new BrowserFileProvider();\n\n  @state() _pageModules!: string;\n  @state() _pageModuleContent!: IFArrayOfPageModules;\n  @state() _userInformation!: IFUserInformation;\n  @state() _userSettings!: IFUserSettings;\n  @state() _subModules!: string[];\n  @state() _releaseInfo!: IFReleaseInfo;\n  @state() releaseNotesNumber!: {\n    readInfo: boolean;\n    release_number: string;\n  };\n  @state() _showLoginScreen = false;\n  @state() _acceptReleasInfo = false;\n  @state() _releaseText!: string;\n  @state() _netcfgJson!: Object;\n  @state() _hasActiveDevUrlOverrides = false;\n  @property({type: Boolean}) releaseIsActive!: boolean;\n  @property({type: String, reflect: true}) _pageModule!: string;\n\n  constructor() {\n    super();\n\n    LdFetch.addEventListener(\"401\", this.handleUnauthorizedUser);\n    LdFetch.addEventListener(\"403\", this.handleUnauthorizedUser);\n    this._pageModules = JSON.stringify([\n      {\n        id: 'dashboard',\n        name: 'modules.frameTitle.dashboard',\n        icon: 'dashboard',\n        href: '/dashboard',\n      },\n      {\n        id: 'assets',\n        name: 'modules.frameTitle.assets',\n        icon: 'assets',\n        href: '/assets',\n      },\n      {\n        id: 'users',\n        name: 'modules.frameTitle.users',\n        icon: 'users',\n        href: '/users/list',\n        swOnly: true,\n        restrictedTo: ['OEM_USER_MANAGER'],\n      },\n      {\n        id: 'settings',\n        name: 'modules.frameTitle.settings',\n        icon: 'settings',\n        href: '/settings/limit/list?machine',\n        swOnly: true,\n        restrictedTo: ['DEVELOPER', 'SUPERUSER'],\n      },\n      {\n        id: 'netcfg',\n        name: `Network configuration`,\n        href: '/netcfg',\n        show: false,\n      },\n      {\n        id: '404',\n        name: '404',\n        show: false,\n      },\n      {\n        id: 'qs',\n        name: 'modules.frameTitle.qs',\n        icon: 'qs',\n        href: '/qs/list',\n        swOnly: true,\n        restrictedTo: ['OEM_QA', 'OEM_TECHNICIAN'],\n      },\n      {\n        id: 'forgot-password',\n        name: 'forgot-password',\n        href: '/forgot-password',\n        show: false,\n      },\n      {\n        id: 'new-password',\n        name: 'new-password',\n        href: '/new-password',\n        show: false,\n      },\n      {\n        id: 'change-password',\n        name: 'change-password',\n        href: '/change-password',\n        show: false,\n      },\n      {\n        id: 'login',\n        name: 'login',\n        href: '/login',\n        show: false,\n      },\n    ]);\n    this._showLoginScreen = false;\n  }\n\n  static get styles() {\n    return [LdPlatformStyles];\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this.dontShowReleaseNote = this.dontShowReleaseNote.bind(this);\n    window.addEventListener('closedRelease', this.dontShowReleaseNote);\n    window.addEventListener(BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT, this.updateDevUrlOverrideHint);\n    this.updateDevUrlOverrideHint();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    window.removeEventListener('closedRelease', this.dontShowReleaseNote);\n    window.removeEventListener(BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT, this.updateDevUrlOverrideHint);\n  }\n\n  updateDevUrlOverrideHint = () => {\n    this._hasActiveDevUrlOverrides = hasActiveBackendServiceUrlOverrides();\n  }\n\n  firstUpdated(_changedProperties: PropertyValues) {\n    if (!this._showLoginScreen) {\n      store.dispatch(checkRelease());\n      store.dispatch(loadUserSetting('privacyPolicy'));\n      store.dispatch(loadLinks('/static/release-notes/data.json'));\n      store.dispatch(loadUserSetting(`releaseNotesNumber`));\n    }\n  }\n\n  updated(changedProperties: PropertyValues) {\n    if (changedProperties.has('_userInformation')) {\n      const pageModules = JSON.parse(this._pageModules);\n      if (isUserUserOEM(this._userInformation)) {\n        pageModules[1].href = '/assets/companies/list';\n      } else {\n        pageModules[1].href = `/assets/locations/list/${this._userInformation.company}`;\n      }\n      this._pageModules = JSON.stringify(pageModules);\n    }\n  }\n\n  render() {\n    let loadedPageModule;\n    if (this._pageModule != null) {\n      switch (this._pageModule) {\n        case 'dashboard':\n          loadedPageModule = html`\n            <ld-dashboard .userInformation='${this._userInformation}' ._subModules='${this._subModules}'\n                          class='_pageModule' active></ld-dashboard>`;\n          break;\n        case 'assets':\n          loadedPageModule = html`\n            <ld-assets class='_pageModule' ._userInformation='${this._userInformation}'\n                       ._subModules='${this._subModules}' active></ld-assets>`;\n          break;\n        case 'users':\n          loadedPageModule = html`\n            <ld-users class='_pageModule' active></ld-users>`;\n          break;\n        case 'qs':\n          loadedPageModule = html`\n            <ld-qs class='_pageModule' active></ld-qs>`;\n          break;\n        case 'settings':\n          loadedPageModule = html`\n            <ld-settings class='_pageModule' ._subModules='${this._subModules}'\n                         ._userInformation=\"${this._userInformation}\" active></ld-settings>`;\n          break;\n        case 'netcfg': {\n          const breadcrumbList = JSON.parse(localStorage.getItem('breadcrumbList') || '[]') as IFBreadcrumbObject[];\n\n          const customBreadcrumbList = breadcrumbList.map(item => ({\n            link: item.uri,\n            title: item.name\n          }));\n\n          const backLink = breadcrumbList.at(-1)?.uri || '';\n\n          LdBreadCrumb.setBreadcrumb({\n            backButtonNetcfg: backLink,\n            customBreadcrumbElements: customBreadcrumbList\n          });\n\n          loadedPageModule = html`\n            <ld-netcfg\n                @saveNetcfg='${(e: CustomEvent) => this.uploadNetcfgConfig(e)}'\n                ._userInformation='${this._userInformation}'\n                class='_pageModule'\n                active\n                picture='../../../images/service/hotlinePerson.svg'>\n            </ld-netcfg>`;\n          break;\n        }\n        case 'login':\n          this._showLoginScreen = true;\n          loadedPageModule = html`\n            <login-view class='_pageModule' active></login-view>`;\n          break;\n        case 'forgot-password':\n          this._showLoginScreen = true;\n          loadedPageModule = html`\n            <forgot-password-view class='_pageModule' active></forgot-password-view>`;\n          break;\n        case 'new-password':\n          this._showLoginScreen = true;\n          loadedPageModule = html`\n            <create-new-password-view class='_pageModule' active></create-new-password-view>`;\n          break;\n        case 'change-password':\n          this._showLoginScreen = true;\n          loadedPageModule = html`\n            <change-password-view class='_pageModule' active></change-password-view>`;\n          break;\n        default:\n          loadedPageModule = html`\n            <ld-404 class='_pageModule' active></ld-404>`;\n          break;\n      }\n    }\n\n    let main = html``;\n    if (!this._showLoginScreen && this._userInformation.role != null) {\n      const shouldHighlightSwLogo = this._hasActiveDevUrlOverrides && `${baseConfig.generic.logo || ''}`.toLowerCase().includes('swlogo');\n      main = html`\n        <!-- QUIRKS -->\n        <!-- this is necessary as otherwise we can't access the shim -->\n        <style>\n          app-drawer {\n            --app-drawer-scrim-background: ${baseConfig.generic.color_side_bar};\n            --app-drawer-content-container: {\n              background-color: ${baseConfig.generic.color_side_bar} !important;\n              top: 64px;\n            };\n          }\n        </style>\n\n        <ld-privacy-policy\n            @policy-status-changed='${(e: CustomEvent) => this._onPolicyStatusChanged(e)}'></ld-privacy-policy>\n        <ld-release-notes .userInformation=\"${this._userInformation}\"></ld-release-notes>\n\n        <paper-toast id='ld-toast' duration='0' class='fit-bottom'>\n          <span class='ld-toast-message'>This is a dummy text which should be replaced by a real message.</span>\n          <paper-button @click='${() => closeDisplayNotification()}'>${this.LdTranslate('generic.closeLabel')}\n          </paper-button>\n        </paper-toast>\n        <!-- header -->\n        <app-header \n          fixed \n          condenses \n          class='${shouldHighlightSwLogo ? 'dev-override sticky' : 'sticky'}'>\n          <app-toolbar sticky>\n\n            <!-- sw icon -->\n            <a href='/' id='sw-home-link'>\n              <iron-icon\n                  id='sw-logo'\n                  class='${shouldHighlightSwLogo ? 'sw-logo-dev-override' : ''}'\n                  src='${baseConfig.generic.logo}'\n                  slot='item-icon'>\n              </iron-icon>\n            </a>\n            <paper-tooltip for='sw-logo' position='bottom'>${this.LdTranslate('generic.backToDashboard')}\n            </paper-tooltip>\n\n            <ld-search-input></ld-search-input>\n\n            <!-- page title -->\n            <div main-title>\n              <ld-title\n                  .pageModules='${this._pageModules}'\n                  .baseWindowTitle='${CONFIG.generic.base_window_title}'\n                  updateWindowTitle>\n              </ld-title>\n            </div>\n\n            <!-- profile / notification icon -->\n            <div id='profile' @click='${(e: CustomEvent) => this.userProfile(e)}'>\n              <div class='sw-header-bar-icon-profile'>\n                <iron-icon id='sw-account' src='/images/icon_person.svg' slot='item-icon'></iron-icon>\n              </div>\n              <div class='sw-header-bar-account-name'>\n              <span class='account-name'>\n                ${this._userInformation.given_name} ${this._userInformation.family_name}\n              </span>\n              </div>\n            </div>\n            <paper-tooltip for='profile' position='bottom'>${this.LdTranslate('generic.userProfile')}\n            </paper-tooltip>\n\n            <div class='sw-header-bar-icon-profile'>\n              <iron-icon id='sw-logout' src='/images/icon_logout.svg' slot='item-icon'\n                         @click='${() => this.logout()}'></iron-icon>\n            </div>\n            <paper-tooltip for='sw-logout' position='bottom'>${this.LdTranslate('generic.logout')}\n            </paper-tooltip>\n\n            <!-- profile dropdown -->\n            <paper-menu-button horizontal-align='right' vertical-align='top'>\n              <paper-icon-button icon='icons:arrow-drop-down'\n                                 class='dropdown-trigger'></paper-icon-button>\n              <div id='user-dropdown' class='dropdown-content'>\n                <p>&nbsp;</p>\n              </div>\n            </paper-menu-button>\n          </app-toolbar>\n        </app-header>\n\n        <!-- drawer content -->\n        <app-drawer opened='true' disable-swipe='true' persistent='true'>\n          <nav class='drawer-list'>\n            <ld-sidebar .activeModule='${this._pageModule}' ._userInformation='${this._userInformation}'\n                        .pageModules='${this._pageModules}'></ld-sidebar>\n          </nav>\n        </app-drawer>\n\n        <!-- main content -->\n        <main role='main' class='main-content vertical layout'>\n          <!-- Release Banner -->\n          <ld-banner class='${this.releaseIsActive ? 'show' : ''}'\n                     id='release'\n                     .releaseText='${this._releaseText}'></ld-banner>\n\n          <div class='main-content-inner-wrapper'>\n            <ld-breadcrumb></ld-breadcrumb>\n\n            ${loadedPageModule}\n          </div>\n        </main>\n        <!-- footer content -->\n        <footer>\n          <ul class='flex'>\n            <li id=\"homepage\"><a href='${this.LdTranslate('generic.footerLinks.swHomepage.url')}'\n                                 target='_blank'>${this.LdTranslate('generic.footerLinks.swHomepage.title')}</a></li>\n            <li id=\"imprint\"><a href='${this.LdTranslate('generic.footerLinks.imprint.url')}'\n                                target='_blank'>${this.LdTranslate('generic.footerLinks.imprint.title')}</a></li>\n            <li id=\"gtct\"><a href='${this.LdTranslate('generic.footerLinks.gtct.url')}'\n                             target='_blank'>${this.LdTranslate('generic.footerLinks.gtct.title')}</a></li>\n            <li id=\"privacy\"><a href='javascript:;'\n                                @click='${() => this._onPrivacyFooterLinkClick()}'>${this.LdTranslate('generic.footerLinks.privacy.title')}</a>\n            </li>\n            <li id=\"release\"><a href='javascript:;'\n                                @click='${() => this._onReleaseFooterLinkClick()}'>${this.LdTranslate('generic.footerLinks.release.title')}</a>\n            </li>\n            <li id=\"contact\"><a\n                href='${this.LdTranslate('generic.footerLinks.contact.url')}'>${this.LdTranslate('generic.footerLinks.contact.title')}</a>\n            </li>\n          </ul>\n        </footer>\n      `;\n    }\n\n    return html`\n      ${main}\n    `;\n  }\n\n  stateChanged(state: ReturnType<typeof store.getState>) {\n    const {settings, info} = state.LdUsersReducer;\n    const {\n      subModules,\n      pageModule,\n      releaseInfo,\n      releaseNotes,\n      loadingReleaseNotes\n    } = state.LdApplicationReducer;\n    this._loadUserInformation(info);\n    this._loadSettings(settings);\n    this._loadSubmodules(subModules);\n    this._loadPageModule(pageModule);\n    this._checkReleaseInfo(releaseInfo);\n    this.checkIfInfoReleaseShouldShow(releaseNotes, loadingReleaseNotes)\n  }\n\n  _checkReleaseInfo(releaseInfo: IFReleaseInfo) {\n\n    if (releaseInfo && releaseInfo.release_number && this._releaseInfo !== releaseInfo) {\n      this._releaseInfo = releaseInfo;\n      store.dispatch(loadUserSetting(`releaseNote`));\n    }\n  }\n\n  _loadPageModule(pageModule: string) {\n    if (pageModule != null && this._pageModule !== pageModule) {\n      this._pageModule = pageModule;\n    }\n  }\n\n  _loadSubmodules(subModules: string[]) {\n    if (subModules != null && this._subModules !== subModules) {\n      this._subModules = subModules;\n    }\n  }\n\n  _loadSettings(settings: IFUserSettings) {\n    if (settings != null) {\n      this._userSettings = settings;\n      this.checkIfToastReleaseNeeded();\n      this.updateReleaseBanner();\n\n    }\n  }\n\n  _loadUserInformation(info: IFUserInformation) {\n    if (info != null && this._userInformation !== info) {\n      this._userInformation = info;\n    }\n  }\n\n  logout() {\n    store.dispatch(logout());\n  }\n\n  _handleSubmitRequestResponse(message: string) {\n    this.notificationHandler.notify('success', message);\n    store.dispatch(clearSubmitRequest());\n    window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n  }\n\n  userProfile(evt: CustomEvent) {\n    forward('/users/info', {evt});\n  }\n\n  _onPrivacyFooterLinkClick() {\n    const privacy = <LdPrivacyPolicy>this.shadowRoot?.querySelector('ld-privacy-policy');\n    privacy.setLanguage(this.LdGetLanguage());\n    privacy.enableAcceptAndDeclineButtons();\n    privacy.open();\n  }\n\n  _onReleaseFooterLinkClick() {\n    const releaseNotes = <LdDialogs>this.shadowRoot?.querySelector('ld-release-notes');\n    releaseNotes?.openDialog();\n  }\n\n  _onPolicyStatusChanged(e: CustomEvent) {\n    const key = 'privacyPolicy';\n    if (e.detail.accepted === false) {\n      store.dispatch(acceptPrivacyPolicy(false));\n      this.sendPrivacyPolicyToBE(key, e.detail.accepted);\n    } else {\n      store.dispatch(acceptPrivacyPolicy(true));\n      this.sendPrivacyPolicyToBE(key, e.detail.accepted);\n      const privacy = <LdPrivacyPolicy>this.shadowRoot?.querySelector('ld-privacy-policy');\n      privacy?.close();\n      setTimeout(() => {\n        store.dispatch(loadUserSetting('privacyPolicy'));\n      }, 50)\n    }\n  }\n\n  sendPrivacyPolicyToBE(key: string, acceptance: boolean) {\n    const PRIVACY_POLICY_STATE = {\n      GIVEN_ACCEPTANCE: \"GIVEN_ACCEPTANCE\",\n      NEED_ACCEPTANCE: \"NEED_ACCEPTANCE\",\n    }\n\n    const statusValue = acceptance ? PRIVACY_POLICY_STATE.GIVEN_ACCEPTANCE : PRIVACY_POLICY_STATE.NEED_ACCEPTANCE;\n    const value = {status: statusValue, version: baseConfig.privacyPolicy.documentUrls.version}\n    store.dispatch(saveUserSetting(key, value));\n  }\n\n  dontShowReleaseNote() {\n    const releaseConfig = {\n      readInfo: true,\n      release_number: this._releaseInfo.release_number,\n    };\n    this._acceptReleasInfo = true;\n    store.dispatch(saveUserSetting(`releaseNote`, releaseConfig));\n  }\n\n  uploadNetcfgConfig(e: CustomEvent) {\n    this._netcfgJson = e.detail.json;\n    const requestBody: { file_name: string } = {'file_name': 'netcfg.json'};\n    store.dispatch(submitPUTFileForm(`${CONFIG.backend.services.manuals.base_url}${baseConfig.backend.services.shopfloor.endpoints.netcfg.machines}${e.detail.id}${baseConfig.backend.services.shopfloor.endpoints.netcfg.netcfg_endpoint}`, requestBody))\n      .then((presignedUrl: IFManuals) => {\n        const {\n          formData,\n          mainUrl\n        } = this.fileProvider.prepareFile(presignedUrl, writeJsonToFile(decodeURIComponent(this._netcfgJson as string)) as File);\n        store.dispatch(uploadNetcfg(mainUrl, formData))\n          .then(() => {\n            store.dispatch(clearSubmitRequest());\n            this._handleSubmitRequestResponse(this.LdTranslate('modules.assets.machine.elements.service.upload.success.message'));\n          })\n          .catch(() => {\n            this.handleUnauthorizedUser();\n          });\n      })\n      .catch(() => {\n        this.handleUnauthorizedUser();\n      });\n  }\n\n  handleUnauthorizedUser() {\n    displayNotification('error', LdTranslate('modules.errors.statusCodes.e_929.message'));\n    store.dispatch(clearSubmitRequest());\n    window.dispatchEvent(new Event('LdCloseLoadingSpinner'));\n  }\n\n  checkIfToastReleaseNeeded() {\n    if (this._releaseInfo == null || this._userSettings[`releaseNote`] == null) return;\n    let read = true;\n    if (!this._acceptReleasInfo && (Object.keys(this._userSettings[`releaseNote`]).length === 0 || !this._userSettings[`releaseNote`].readInfo || this._userSettings[`releaseNote`].release_number !== this._releaseInfo.release_number)) {\n      read = false;\n    }\n    if (read) return;\n    let message = this.LdTranslate('generic.release').replace('%replaceValue1', moment(this._releaseInfo.start).format(this.LdTranslate('modules.generic.dateTimeFormat'))).replace('%replaceValue2', moment(this._releaseInfo.end).format(this.LdTranslate('modules.generic.dateTimeFormat')));\n    let notificationType = 'releaseNotes';\n    displayNotification(notificationType, message, 5000, false);\n  }\n\n  updateReleaseBanner() {\n    if (this._releaseInfo && this._releaseInfo.start && this._releaseInfo.end) {\n      const currentTime = Date.now();\n      const releaseStart = this._releaseInfo.start;\n      const releaseEnd = this._releaseInfo.end;\n\n      if (currentTime >= releaseStart && currentTime <= releaseEnd) {\n        this._releaseText = this.LdTranslate('generic.release').replace('%replaceValue1', moment(releaseStart).format(this.LdTranslate('modules.generic.dateTimeFormat'))).replace('%replaceValue2', moment(releaseEnd).format(this.LdTranslate('modules.generic.dateTimeFormat')));\n        this.releaseIsActive = true;\n      }\n    }\n  }\n\n  checkIfInfoReleaseShouldShow(releaseNotes: IFReleaseNotesData, loadingReleaseNotes: boolean) {\n    let _releaseNotes;\n\n    if (releaseNotes != null && this._userSettings?.[`releaseNotesNumber`] != null && this._userSettings?.[`releaseNotesNumber`] !== this.releaseNotesNumber) {\n\n      this.releaseNotesNumber = this._userSettings?.[`releaseNotesNumber`];\n      if (!loadingReleaseNotes && releaseNotes) {\n        _releaseNotes = releaseNotes.items.map((releaseNote) => ({\n          ...releaseNote,\n        }));\n      }\n      if (this._userSettings[`releaseNotesNumber`]?.release_number !== _releaseNotes?.[0].version) {\n        this._onReleaseFooterLinkClick();\n      }\n    }\n\n  }\n}\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n\n'use strict';\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../themes/styles';\n\nexport const LdWaitingStyles = css`\n  :host {\n    width: 100%;\n    height: 100%;\n    margin: 0 auto;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    resize: both;\n    overflow: auto;\n    position: fixed;\n    top:0;\n    left:0;\n    z-index: 99998;\n    background: #001935;\n    background: -moz-linear-gradient(top, #001935 0%, #000111 100%);\n    background: -webkit-linear-gradient(top, #001935 0%,#000111 100%);\n    background: linear-gradient(to bottom, #001935 0%,#000111 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#001935', endColorstr='#000111',GradientType=0 );\n  }\n\n  #ld-waiting {\n    color: ${unsafeCSS(_THEME.colors.primary_text_color)};\n    font-size: 24px;\n    font-weight:bold;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n  \n  #ld-waiting:after {\n    content: ' .';\n    animation: dots 1s steps(5, end) infinite;\n  }\n\n  @keyframes dots {\n    0%, 20% {\n      color: rgba(0,0,0,0);\n      text-shadow:\n        .25em 0 0 rgba(0,0,0,0),\n        .5em 0 0 rgba(0,0,0,0);\n    }\n    40% {\n      color: white;\n      text-shadow:\n        .25em 0 0 rgba(0,0,0,0),\n        .5em 0 0 rgba(0,0,0,0);\n    }\n    60% {\n      text-shadow:\n        .25em 0 0 white,\n        .5em 0 0 rgba(0,0,0,0);\n    }\n    80%, 100% {\n      text-shadow:\n        .25em 0 0 white,\n        .5em 0 0 white;\n    }\n  }\n`;\n\nexport default LdWaitingStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport { LitElement, html } from 'lit-element';\n\nimport { LdWaitingStyles } from './styles';\n\nclass LdWaiting extends LitElement {\n\n  // --------------------------------------------------------------------------------------\n  static get properties() {\n    return {\n    };\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdWaitingStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render() {\n    return html`\n      <div id=\"ld-waiting\">Please wait while the SW CloudPlatform is loading</div>\n    `;\n  }\n\n}\n\ncustomElements.define('ld-waiting', LdWaiting);\n","import {css, unsafeCSS} from \"lit\";\nimport {themeColors} from \"../../themes/lifedata\";\n\nexport const swColorPalette = css`\n\n  /* These are the colors according to https://bam.sw-machines.com/de/02-gestaltung/corporate-design/farbsystem */\n  /* Currently only a subset is listed here. These are the ones currently used. */\n  :host {\n\n    --sw-primary-red: ${unsafeCSS(themeColors.primary_color)};\n    --sw-primary-creme: ${unsafeCSS(themeColors.primary_creme)};\n    --sw-primary-white: ${unsafeCSS(themeColors.primary_background_color)};\n    --sw-primary-black: ${unsafeCSS(themeColors.primary_header_color)};\n    --sw-primary-gray-one: ${unsafeCSS(themeColors.primary_gray_one)};\n    --sw-primary-gray-two: ${unsafeCSS(themeColors.primary_gray_two)};\n    --sw-primary-gray-three: ${unsafeCSS(themeColors.primary_gray_three)};\n\n    --sw-secondary-green-100: ${unsafeCSS(themeColors.secondary_green_100)};\n    --sw-secondary-green-200: ${unsafeCSS(themeColors.secondary_green_200)};\n    --sw-secondary-green-300: ${unsafeCSS(themeColors.secondary_green_300)};\n    --sw-secondary-green-400: ${unsafeCSS(themeColors.secondary_green_400)};\n    --sw-secondary-green-500: ${unsafeCSS(themeColors.secondary_green_500)};\n    --sw-secondary-green-600: ${unsafeCSS(themeColors.secondary_green_600)};\n\n  }\n\n`\n","import {css, unsafeCSS} from \"lit\";\nimport {themeColors} from \"../../themes/lifedata\";\n\nexport const idsColorPalette = css`\n\n  /* These are the colors according to https://swmachines.atlassian.net/wiki/pages/viewpageattachments.action?pageId=3576693&preview=%2F3576693%2F3636639%2FSW_Styleguide_07.pdf&search_id=2f28100d-6c35-473f-b161-7ac0ee7909cb */\n  /* Currently only a subset is listed here. These are the ones currently used. */\n  :host {\n\n    --sw-ids-dark-blue-001: ${unsafeCSS(themeColors.dark_blue_001)};\n    --sw-ids-dark-blue-002: ${unsafeCSS(themeColors.dark_blue_002)};\n    --sw-ids-dark-blue-003: ${unsafeCSS(themeColors.dark_blue_003)};\n    --sw-ids-dark-blue-004: ${unsafeCSS(themeColors.dark_blue_004)};\n\n    --sw-ids-basic-001: ${unsafeCSS(themeColors.icons_active_color)};\n    --sw-ids-basic-002: ${unsafeCSS(themeColors.icons_hover_background_color)};\n\n  }\n\n  :host {\n    --color-primary: var(--sw-ids-basic-001);\n    --color-accent: var(--sw-primary-red);\n\n    --background-surface: var(${unsafeCSS(themeColors.primary_background_color)});\n  }\n\n`\n","import {css, unsafeCSS} from \"lit\";\nimport {themeColors} from \"../../themes/lifedata\";\n\nexport const theme_default = css`\n  :host {\n    --surface: ${unsafeCSS(themeColors.primary_background_color)};\n  }\n`\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport { unsafeCSS, css } from 'lit-element';\nimport { _THEME } from '../../themes/styles';\nimport { swColorPalette } from \"../_base-styles/sw-color-palette\";\nimport { idsColorPalette } from \"../_base-styles/ids-color-palette\";\nimport { theme_default } from \"../_base-styles/theme_default\";\n\nexport const LdApplicationStyles = css`\n\n  ${unsafeCSS(swColorPalette)}\n  ${unsafeCSS(idsColorPalette)}\n  ${unsafeCSS(theme_default)}\n\n  :host {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    display: flex;\n    flex-direction: column;\n    flex: auto;\n  }\n  ld-waiting {\n    opacity: 1;\n    transition: opacity 1s; \n  }\n\n  ld-waiting.ld-fadeout {\n    opacity: 0;\n  }\n\n  #login-iframe {\n    display: none;\n  }\n\n\n\n`;\n\nexport default LdApplicationStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\n'use strict';\n\nimport {css} from 'lit-element';\n\nexport const LdPrivacyPolicyStyles = css`\n  #privacyPolicyDialog {\n    z-index: 99999;\n    width:40%;\n  }\n\n  paper-dialog#privacyPolicyDialog {\n    top: 16px;\n    overflow: auto;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language {\n    margin:0 0 0 20px;\n    padding: 15px 5px 0 5px;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language a {\n    padding: 0 5px;\n  }\n\n  paper-dialog#privacyPolicyDialog .privacy-language a:first-child {\n    padding-left:0;\n  }\n\n  paper-button#privacyPolicyDialogButtonClose {\n  }\n`;\n\nexport default LdPrivacyPolicyStyles;\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport {html, LitElement, property, state, TemplateResult} from 'lit-element';\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {store} from '../../ld-redux/ld-redux-store';\n\nimport {LdI18NextMixin} from '../i18n/ld-i18next';\n\nimport '@polymer/paper-tooltip/paper-tooltip';\nimport '@polymer/paper-dialog-scrollable/paper-dialog-scrollable';\nimport '@lifedata/ld-markdown-element/ld-markdown-element.js'\n\nimport {LdPrivacyPolicyStyles} from './styles';\nimport {baseConfig} from \"../../../auto-generated/config\";\nimport {IFLdReduxState, IFUserPrivacyPolicyStatus} from \"../../../js/interfaces\";\nimport {PaperDialogElement} from \"@polymer/paper-dialog\";\n\nexport class LdPrivacyPolicy extends connect(store)(LdI18NextMixin(LitElement)) {\n  @property({type: Boolean}) opened: boolean = false;\n  @property({type: Boolean}) acceptDecline: boolean = true;\n  @state() _privacyDocumentLanguage: string | null = null;\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    this.addEventListener('language-changed', this._updateLanguage.bind(this));\n\n    this._updateLanguage();\n  }\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdPrivacyPolicyStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  render(): TemplateResult {\n    const _buttons: TemplateResult[] = [];\n    const _content: TemplateResult[] = [];\n\n    if (this.acceptDecline === true) {\n      _buttons.push(html`\n        <div class='buttons'>\n          <paper-button id='privacyPolicyDialogButtonDecline' @click='${this._decline}'>\n            ${this.LdTranslate('generic.declineLabel')}\n          </paper-button>\n          <paper-button id='privacyPolicyDialogButtonAccept' @click='${this._accept}'>\n            ${this.LdTranslate('generic.acceptLabel')}\n          </paper-button>\n        </div>\n      `);\n    } else {\n      _buttons.push(html`\n        <div class='buttons'>\n          <paper-button id='privacyPolicyDialogButtonClose' @click='${this.close}'>\n            ${this.LdTranslate('generic.closeLabel')}\n          </paper-button>\n        </div>\n      `);\n    }\n\n    if (this._privacyDocumentLanguage != null) {\n      _content.push(html`\n        <paper-dialog-scrollable id='scrollabledialog'>\n          <ld-markdown-element>\n            <div slot=\"markdown-html\"></div>\n            <script\n                slot=\"markdown-src\"\n                type=\"text/markdown\"\n                src='/static/PRIVACY_POLICY_${this._privacyDocumentLanguage.toUpperCase()}.md'\n            ></script>\n          </ld-markdown-element>\n        </paper-dialog-scrollable>\n      `);\n    }\n\n    return html`\n      <paper-dialog id='privacyPolicyDialog' no-cancel-on-esc-key='true' modal no-cancel-on-outside-click='true'\n                    ?opened=\"${this.opened}\">\n        <h2>${this.LdTranslate('generic.footerLinks.privacy.header')}</h2>\n        <div class='privacy-language'>\n          <a @click='${() => this.setLanguage('EN')}' href='javascript:;'>ENGLISH VERSION</a> | <a\n            @click='${() => this.setLanguage('DE')}' href='javascript:;'>DEUTSCHE VERSION</a>\n        </div>\n        ${_content}\n        ${_buttons}\n      </paper-dialog>\n    `;\n  }\n\n  // --------------------------------------------------------------------------------------\n  open(): void {\n    if (this._isElementAvailable()) {\n      const dialog = this.shadowRoot?.querySelector('paper-dialog#privacyPolicyDialog')! as PaperDialogElement;\n      dialog.open();\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  close(): void {\n    const dialog = this.shadowRoot?.querySelector('paper-dialog#privacyPolicyDialog')! as PaperDialogElement;\n    dialog.close();\n  }\n\n  // --------------------------------------------------------------------------------------\n  enableAcceptAndDeclineButtons(): void {\n    this.acceptDecline = false;\n  }\n\n  // --------------------------------------------------------------------------------------\n  setLanguage(lang: string): void {\n    this._changePrivacyDocumentLanguage(lang);\n  }\n\n  // --------------------------------------------------------------------------------------\n  stateChanged(state: IFLdReduxState): void {\n    const settings = state.LdUsersReducer.settings;\n\n    if (settings != null && 'privacyPolicy' in settings) {\n      this.showPrivacyPolicy(settings['privacyPolicy'] as IFUserPrivacyPolicyStatus);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _updateLanguage(): void {\n    this._privacyDocumentLanguage = this.LdGetLanguage();\n  }\n\n  // --------------------------------------------------------------------------------------\n  _changePrivacyDocumentLanguage(lang: string): void {\n    this._privacyDocumentLanguage = lang;\n  }\n\n  // --------------------------------------------------------------------------------------\n  _accept(): void {\n    this.enableAcceptAndDeclineButtons();\n    this.dispatchEvent(new CustomEvent('policy-status-changed', {detail: {accepted: true}}));\n  }\n\n  // --------------------------------------------------------------------------------------\n  _decline(): void {\n    this.dispatchEvent(new CustomEvent('policy-status-changed', {detail: {accepted: false}}));\n  }\n\n  // --------------------------------------------------------------------------------------\n  _isElementAvailable(): boolean {\n    return this.shadowRoot?.querySelector('paper-dialog#privacyPolicyDialog') != null;\n  }\n\n  showPrivacyPolicy(userHasAcceptedPrivacyPolicyStatus: IFUserPrivacyPolicyStatus): void {\n    if (userHasAcceptedPrivacyPolicyStatus.status !== 'GIVEN_ACCEPTANCE' || userHasAcceptedPrivacyPolicyStatus.version !== baseConfig.privacyPolicy.documentUrls.version) {\n      this.open();\n    }\n  }\n}\n\ncustomElements.define('ld-privacy-policy', LdPrivacyPolicy);\n","/**\n * Copyright 2019 Schwäbische Werkzeugmaschinen GmbH\n */\n\nimport '@polymer/paper-button/paper-button';\nimport {customElement, html, LitElement, property} from 'lit-element';\nimport '../../js/LdServiceUrlOverrides';\n\nimport {connect} from 'pwa-helpers/connect-mixin';\nimport {installOfflineWatcher} from 'pwa-helpers/network';\nimport {installRouter} from 'pwa-helpers/router';\nimport {IFUser} from '../../js/interfaces';\nimport LdError from '../../js/LdErrorHandler';\nimport LdFetch from '../../js/LdFetch';\nimport {CONFIG, redirectLogin} from '../../js/LdGlobal';\n\nimport LdLog from '../../js/LdLog';\nimport '../../views/change-password/change-password-view';\nimport '../../views/forgot-password/create-new-password-view';\nimport '../../views/forgot-password/forgot-password-view';\nimport '../../views/login/login-view';\nimport '../../views/information-security/information-security-view';\nimport '../ld-loading-spinner/ld-loading-spinner';\nimport '../ld-platform/ld-platform';\nimport {updateLocation} from '../ld-redux/actions/ld-application-actions';\nimport {loadUserInformation} from '../ld-redux/actions/ld-users-actions';\n\nimport {store} from '../ld-redux/ld-redux-store';\n\nimport '../ld-waiting';\nimport {LdI18NextMixin} from './i18n/ld-i18next';\nimport {LdApplicationStyles} from './ld-application-styles';\n\nimport './ld-privacy-policy';\nimport './ld-release-notes';\n\n/**\n * Entrypoint for the SW Cloud Platform\n * generates a &lt;ld-application&gt; component\n *\n * @extends LitElement\n * @mixes connect\n * @mixes LdI18NextMixin\n */\n@customElement('ld-application')\n\nexport class LdApplication extends connect(store)(LdI18NextMixin(LitElement)) {\n\n  private readonly messageBus: EventTarget = new EventTarget();\n\n  @property({type: Object}) _userInfo: IFUser | null = null;\n  @property({type: Boolean}) _isUserInfoLoading: boolean = false;\n  @property({type: Number}) _checkInterval: number = 0;\n  @property({type: String}) _language: string | null = '';\n  @property({type: Number, hasChanged: () => true}) _interval: string | number | undefined = undefined;\n  @property({type: Object}) _url: any = null;\n  @property({type: Boolean}) _showLoginScreen: boolean = false;\n\n  // --------------------------------------------------------------------------------------\n  static get styles() {\n    return [LdApplicationStyles];\n  }\n\n  // --------------------------------------------------------------------------------------\n  constructor() {\n    super();\n    LdFetch.addEventListener(\"401\", this.handleUnauthorizedUser);\n    LdFetch.addEventListener(\"403\", this.handleUnauthorizedUser);\n\n    this.addEventListener(\"request-messageBus\", (e: CustomEventInit) => {\n      e.detail.messageBus = this.messageBus;\n    })\n  }\n\n  handleUnauthorizedUser(_event: any) {\n    if ((/netcfg/i).test(window.location.pathname)) {\n      // it is ok if we dont redirect here\n    } else {\n      localStorage.removeItem(CONFIG.localstorage.token_key);\n      redirectLogin('session_timeout');\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  private clearTokenOnRedirectFromLogin() {\n    const queryString = window.location.href;\n    const query = queryString.split('?');\n\n    if (query != null && query.includes('loggedIn')) {\n      const currentUrl = new URL(window.location.href.replace('?loggedIn', ''));\n      const newUrl = currentUrl.href;\n      // this updates the URL without reloading the page. See https://stackoverflow.com/questions/10970078\n      window.history.pushState({path: newUrl}, '', newUrl);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  async setupUserDataChecks() {\n    this.clearTokenOnRedirectFromLogin();\n\n    store.dispatch(loadUserInformation());\n  }\n\n  // --------------------------------------------------------------------------------------\n  disconnectedCallback() {\n    clearInterval(this._checkInterval);\n    clearInterval(this._interval);\n  }\n\n  /**\n    * render method, used to display the rendered template\n    *\n    * @returns {String} Rendered literals template\n    */\n  // --------------------------------------------------------------------------------------\n  render() {\n    let loadedPageModule;\n\n    if (this._url != null) {\n      loadedPageModule = this._checkUrlRenderOutput(this._url);\n    }\n\n    // Don't show waiting elements for public pages\n    const isPublicPage = this._url && (\n      this._url.pathname.includes('login') ||\n      this._url.pathname.includes('password') ||\n      this._url.pathname.includes('information-security')\n    );\n\n    return html`\n      ${loadedPageModule}\n     ${isPublicPage ? '' :html`\n        <ld-waiting></ld-waiting>\n        <ld-spinner></ld-spinner>`}}\n\n    `;\n  }\n\n   isPublicPage(){\n    return this._url.pathname.includes('login') ||\n     this._url.pathname.includes('password') ||\n     this._url.pathname.includes('information-security');\n   }\n\n  // --------------------------------------------------------------------------------------\n  firstUpdated() {\n    this._url = new URL(window.location.href);\n\n    // Check if this is a public page (no authentication needed)\n    if (this.isPublicPage()) {\n      this._isUserInfoLoading = false;\n      this._onUserInfoLoadingChanged(false);\n      // For public pages, do NOT install router or setup user data checks\n      return;\n    }\n\n    // Only for authenticated pages\n    this.setupUserDataChecks();\n\n    setTimeout(() => {\n      installRouter(location => store.dispatch(updateLocation(location)));\n\n      installOfflineWatcher(offline => {\n        LdError._handleError(offline ? 'no_connection' : '', undefined);\n      });\n    }, 500);\n\n\n  }\n\n  /**\n    * @protected\n    * @param {JSON} - updated state handled by the redux implementation\n    */\n  // --------------------------------------------------------------------------------------\n  stateChanged(state: any) {\n    if (this._url !== new URL(window.location.href)) {\n      this._url = new URL(window.location.href);\n    }\n\n    // Don't process user data for public pages\n    if (this.isPublicPage()) {\n      return;\n    }\n\n    const userInfo = state.LdUsersReducer.info;\n    let oldLanguage;\n    if (userInfo) {\n      if (localStorage.getItem(`language_${userInfo.id}`) != null && localStorage.getItem(`language_${userInfo.id}`) !== userInfo.locale) {\n        oldLanguage = this._language;\n        this._userInfo = userInfo;\n        this._language = localStorage.getItem(`language_${userInfo.id}`);\n      } else {\n        this._onUserInfoObjectChanged(userInfo);\n        this._userInfo = userInfo;\n        oldLanguage = this._language;\n        this._language = userInfo.locale;\n      }\n    }\n\n    const userInfoLoading = state.LdUsersReducer.isUserInfoLoading;\n    this._isUserInfoLoading = userInfoLoading;\n    if (userInfoLoading === false) {\n      this._onUserInfoLoadingChanged(userInfoLoading);\n    }\n    if (\n      this._userInfo &&\n      oldLanguage !== this._language\n    ) {\n      this.LdChangeLanguage(this._language!, (err: any) => {\n        if (err) {\n          LdLog.error('error changing language', err);\n        }\n      });\n    }\n  }\n\n  /**\n    * removes the &lt;ld-waiting&gt; element after the user info has finished loading\n    *\n    * @protected\n    * @param {JSON} userInfo - the updated user info object\n    */\n  // --------------------------------------------------------------------------------------\n  _onUserInfoObjectChanged(userInfo: any) {\n    // Don't insert platform for public pages\n    if (this.isPublicPage()) {\n      return;\n    }\n\n    if (typeof userInfo !== 'undefined' && userInfo !== null && this.shadowRoot?.querySelector('ld-platform') === null) {\n      this.insertPlatformNode();\n\n      if (typeof this._isUserInfoLoading !== 'undefined' && this._isUserInfoLoading === false) {\n        this.__hideWaitingElement();\n      }\n    }\n  }\n\n  private insertPlatformNode() {\n    const existingPlatform = this.shadowRoot?.querySelector('ld-platform');\n    if (existingPlatform) {\n      return;\n    }\n\n    const ldPlatformElement = document.createElement('ld-platform');\n    this.shadowRoot?.appendChild(ldPlatformElement);\n  }\n\n  /**\n   * removes the &lt;ld-waiting&gt; element after the user info loading state has changed\n   *\n   * @protected\n   * @param {Boolean} isUserInfoLoading - is true if the user info is still loading\n   */\n  // --------------------------------------------------------------------------------------\n  _onUserInfoLoadingChanged(isUserInfoLoading: boolean) {\n    if (typeof isUserInfoLoading !== 'undefined' && isUserInfoLoading === false) {\n      this.__hideWaitingElement();\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  __hideWaitingElement() {\n    const ldWaitingElement = this.shadowRoot?.querySelector('ld-waiting');\n    if (ldWaitingElement !== null) {\n      ldWaitingElement?.classList.add('ld-fadeout');\n      setTimeout(() => {\n        ldWaitingElement?.remove();\n      }, 1000);\n    }\n  }\n\n  // --------------------------------------------------------------------------------------\n  _checkUrlRenderOutput(url: URL) {\n    let loadedPageModule;\n    switch (true) {\n       case (/information-security/i.test(url.pathname)):\n         // Render as standalone page (NOT wrapped in ld-login-application)\n         loadedPageModule = html`\n           <information-security-view class='_pageModule' active></information-security-view>`;\n         return loadedPageModule;\n\n      case (/netcfg/i.test(url.pathname)):\n\n        if (this.userIsAuthenticated()) {\n          break;\n        }\n\n        loadedPageModule = html`\n          <ld-netcfg standalone class='_pageModule' active\n                     picture='../../../images/service/hotlinePerson.svg'></ld-netcfg>`;\n\n        break;\n      case (/login/i.test(url.pathname)):\n        this._showLoginScreen = true;\n        loadedPageModule = html`\n          <ld-login-application>\n            <login-view class='_pageModule' active></login-view>\n          </ld-login-application>`;\n        break;\n      case (/forgot-password/i.test(url.pathname)):\n        this._showLoginScreen = true;\n        loadedPageModule = html`\n          <ld-login-application>\n            <forgot-password-view class='_pageModule' active></forgot-password-view>\n          </ld-login-application>`;\n        break;\n      case (/new-password/i.test(url.pathname)):\n        this._showLoginScreen = true;\n        loadedPageModule = html`\n          <ld-login-application>\n            <create-new-password-view class='_pageModule' active></create-new-password-view>\n          </ld-login-application>`;\n        break;\n      case (/change-password/i.test(url.pathname)):\n        this._showLoginScreen = true;\n        loadedPageModule = html`\n          <ld-login-application>\n            <change-password-view class='_pageModule' active></change-password-view>\n          </ld-login-application>`;\n        break;\n      default: {\n        if (!this.userIsAuthenticated()) {\n          break;\n        }\n        this.insertPlatformNode();\n        break;\n      }\n\n    }\n    return loadedPageModule;\n  }\n\n  private userIsAuthenticated() {\n    return this._userInfo?.role;\n  }\n\n}\n","/**\n@license\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n  Basic router that calls a callback whenever the location is updated.\n\n  Example:\n\n      import { installRouter } from 'pwa-helpers/router.js';\n\n      installRouter((location) => handleNavigation(location));\n\n  For example, if you're using this router in a Redux-connected component,\n  you could dispatch an action in the callback:\n\n      import { installRouter } from 'pwa-helpers/router.js';\n      import { navigate } from '../actions/app.js';\n\n      installRouter((location) => store.dispatch(navigate(location)))\n\n  If you need to force a navigation to a new location programmatically, you can\n  do so by pushing a new state using the History API, and then manually\n  calling the callback with the new location:\n\n      window.history.pushState({}, '', '/new-route');\n      handleNavigation(window.location);\n\n  Optionally, you can use the second argument to read the event that caused the\n  navigation. For example, you may want to scroll to top only after a link click.\n\n      installRouter((location, event) => {\n        // Only scroll to top on link clicks, not popstate events.\n        if (event && event.type === 'click') {\n          window.scrollTo(0, 0);\n        }\n        handleNavigation(location);\n      });\n*/\nexport const installRouter = (locationUpdatedCallback: (location:Location, event: Event|null) => void) => {\n  document.body.addEventListener('click', e => {\n    if (e.defaultPrevented || e.button !== 0 ||\n        e.metaKey || e.ctrlKey || e.shiftKey) return;\n\n    const anchor = e.composedPath().filter(\n      n => (n as HTMLElement).tagName === 'A'\n    )[0] as HTMLAnchorElement | undefined;\n    if (!anchor || anchor.target ||\n        anchor.hasAttribute('download') ||\n        anchor.getAttribute('rel') === 'external') return;\n\n    const href = anchor.href;\n    if (!href || href.indexOf('mailto:') !== -1) return;\n\n    const location = window.location;\n    const origin = location.origin || location.protocol + '//' + location.host;\n    if (href.indexOf(origin) !== 0) return;\n\n    e.preventDefault();\n    if (href !== location.href) {\n      window.history.pushState({}, '', href);\n      locationUpdatedCallback(location, e);\n    }\n  });\n\n  window.addEventListener('popstate', e => locationUpdatedCallback(window.location, e));\n  locationUpdatedCallback(window.location, null /* event */);\n};\n","/**\n@license\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/**\n  Utility method that calls a callback whenever the network connectivity of the app changes.\n  The callback should take a boolean parameter (with `true` meaning\n  the network is offline, and `false` meaning online)\n\n  Example:\n\n      import { installOfflineWatcher } from 'pwa-helpers/network.js';\n\n      installOfflineWatcher((offline) => {\n        console.log('You are ' + offline ? ' offline' : 'online');\n      });\n*/\nexport const installOfflineWatcher = (offlineUpdatedCallback: (isOffline: boolean) => void) => {\n  window.addEventListener('online', () => offlineUpdatedCallback(false));\n  window.addEventListener('offline', () => offlineUpdatedCallback(true));\n\n  offlineUpdatedCallback(navigator.onLine === false);\n};\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","input","TextEncoder","encode","bytes","i","len","length","value","charCodeAt","push","surrogatePair","Uint8Array","from","TextDecoder","decode","decoded","byte","String","fromCharCode","nextByte","encoded","byteValue","toString","join","decodeURIComponent","LdButton","active","ariaActiveAttribute","disabled","focused","noink","pointerDown","raised","toggles","render","this","elevation","undefined","tabindex","evt","_onEvent","clonedEvent","constructor","type","dispatchEvent","Boolean","reflect","hasChanged","Number","ClassList","element","classes","Set","changed","classList","getAttribute","split","cls","add","remove","delete","commit","classString","forEach","setAttribute","previousClassesCache","WeakMap","classMap","classInfo","part","committer","name","parts","previousClasses","get","strings","set","has","LdSearchableDropdown","styles","super","invalid","selectedValue","isOpen","searchTerm","filteredOptions","highlightedIndex","_handleClickOutside","event","composedPath","includes","_closeDropdown","_handleKeyDown","key","preventDefault","Math","min","_scrollToHighlighted","max","_selectOption","dropdown","connectedCallback","document","addEventListener","disconnectedCallback","removeEventListener","firstUpdated","_changedProperties","selected","updated","changedProperties","updateComplete","then","searchInput","shadowRoot","querySelector","focus","_selectedOption","find","opt","optionsContainer","optionElement","scrollIntoView","block","behavior","_toggleDropdown","readonly","findIndex","_handleSearch","target","toLowerCase","filter","option","_getOptionName","oldValue","_dispatchChangeEvent","newValue","_clearSelection","stopPropagation","eventName","detail","CustomEvent","bubbles","composed","item","title","substring","_renderOption","index","dropdownClasses","searchPlaceholder","label","noLabelFloat","required","clearable","errorMessage","maxHeight","Array","LdDropdown","__truncateFullname","substr","listBoxLabel","class","__loadListboxItemValue","items","listboxItem","random","LdInput","alwaysFloatLabel","autocapitalize","autocomplete","autofocus","autoValidate","charCounter","placeholder","_internalId","accept","allowedPattern","autosave","inputmode","list","maxlength","minlength","multiple","pattern","results","size","step","validator","__inputItemValueChanged","colorPattern","colorErrorMessage","__inputColorValueChanged","LdTextarea","rows","LdToggle","checked","pressed","LdCheckbox","live","setValue","LdForm","fields","__originalFields","__truncateFullName","reset","resetItem","_element","__getFieldDefaultValue","__getFieldDefaultCheck","__removeItem","JSON","stringify","formInputs","hidden","_createFieldTypeInput","_createFieldTypeHidden","_createFieldTypeTextarea","_createFieldTypeDropdown","_createFieldTypeFile","_createFieldTypeButton","_createFieldTypeButtonList","_createSpacer","_createSubHeadline","_createToggle","_createCheckbox","_createCheckboxList","_createFieldTypeMultiSelect","getItems","_items","selectedData","querySelectorAll","inputType","clear","__handleClearClick","__subscribeItem","spellcheck","__dropdownItemValueChanged","__loadListBoxItemValue","__loadMultiListItemValue","__handleBtnClick","_buttons","buttons","btn","icon","__handleOpenListClick","_checkbox","checkbox","cbx","fieldId","_field","parse","field","_defaultValue","listBoxItem","checkboxValue","__multiSelectItemValueChanged","existingItem","attributes","textContent","listBox","defaults","async","baseUrl","breaks","extensions","gfm","headerIds","headerPrefix","highlight","hooks","langPrefix","mangle","pedantic","renderer","sanitize","sanitizer","silent","smartypants","tokenizer","walkTokens","xhtml","escapeTest","escapeReplace","RegExp","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","html","test","replace","unescapeTest","_","n","charAt","parseInt","caret","edit","regex","obj","val","getRegex","nonWordAndColonTest","originIndependentUrl","cleanUrl","base","href","prot","indexOf","baseUrls","justDomain","rtrim","relativeBase","protocol","domain","resolveUrl","encodeURI","noopTest","exec","splitCells","tableRow","count","cells","match","offset","str","escaped","curr","trim","shift","pop","splice","c","invert","l","suffLen","currChar","slice","repeatString","result","outputLink","cap","link","raw","lexer","text","state","inLink","token","tokens","inlineTokens","Tokenizer","options","space","src","rules","newline","codeBlockStyle","fences","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","indentCodeCompensation","lang","inline","_escapes","heading","trimmed","depth","hr","blockquote","top","blockTokens","istask","ischecked","indent","blankLine","endsWithBlankLine","line","nextLine","rawLine","itemContents","endEarly","bull","isordered","ordered","start","loose","itemRegex","t","repeat","trimLeft","search","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","task","trimRight","spacers","hasMultipleLineBreaks","some","pre","def","tag","table","header","align","j","k","row","lheading","paragraph","escape","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","b","level","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","lDelim","nextChar","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","rDelimAst","rDelimUnd","lastIndex","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","url","prevCapZero","_backpedal","inlineText","_paragraph","_label","_title","bullet","listItemStart","_tag","_comment","normal","reflinkSearch","out","_punctuation","blockSkip","escapedEmSt","_scheme","_email","_attribute","_href","strong","middle","endAst","endUnd","em","_extended_email","Lexer","create","inlineQueue","lex","lexInline","next","lastToken","cutSrc","lastParagraphClipped","leading","tabs","extTokenizer","call","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","console","error","keepPrevChar","lastIndexOf","startInline","Renderer","infostring","quote","slugger","slug","body","listitem","tablerow","content","tablecell","flags","image","TextRenderer","Slugger","seen","serialize","getNextSafeSlug","originalSlug","isDryRun","occurenceAccumulator","hasOwnProperty","dryrun","Parser","textRenderer","parseInline","l2","l3","cell","itemBody","ret","renderers","parser","unshift","Hooks","static","preprocess","markdown","postprocess","parseMarkdown","callback","origOpt","throwError","message","msg","Promise","reject","onError","marked","prototype","warn","checkSanitizeDeprecation","done","err","pending","setTimeout","all","catch","setOptions","newDefaults","getDefaults","use","args","childTokens","pack","opts","ext","prevRenderer","apply","prop","prevTokenizer","prevHook","passThroughHooks","arg","values","concat","LdMarkdownElement","rawMarkdown","srcObserver","disconnect","getMarkdownFilePath","getRawMarkdown","convertAndInjectMarkdown","markdownContainer","getMarkdownContainer","innerHTML","handleSlotchange","retrieveRawMarkdown","scriptTag","fetchRawMarkdownFromFile","getScriptTag","createSrcAttributeObserver","observe","childList","subtree","MutationObserver","mutationList","mutation","attributeName","fetchAndInjectMarkdown","children","assignedNodes","markdownTarget","markdownResponse","fetch","reason","status","window","customElements","define","LdReport","headline","columnInputs","numberOfSearchResult","dateRange","cancelButtonName","viewButtonName","_opened","_oldColumnInputs","_disabledChild","_disabledParent","_disabledClone","_clickOpenElements","_selectChildElements","_selectParentElements","_headlineContent","onButtonCancelClick","onButtonResetClick","onButtonShowClick","form","formButtonSaveHandler","_formInputs","_getAmountOfInvalidFields","_formFields","_domNode","_value","fieldDefinition","domNode","isValidField","validation","_fieldValue","_isValidField","rule","isEmpty","isLength","isUUID","isHexColor","isInt","toggleAttribute","childCheckbox","_openColumnsList","_evt","toggle","parentCheckbox","checkboxClick","removeAttribute","parentId","allChildCheckbox","oneCheckboxSelected","template","_template","is","behaviors","hostAttributes","role","properties","ready","_rippleContainer","$","radioContainer","attached","getComputedStyleValue","parseFloat","defaultInkSize","floor","updateStyles","attrForSelected","selectedAttribute","selectable","allowEmptySelection","select","newItem","_valueToItem","hasAttribute","oldItem","fire","_activateFocusedItem","_itemActivate","_valueForItem","focusedItem","_onUpKey","_focusPrevious","_onDownKey","_focusNext","_onLeftKey","arguments","_onRightKey","EErrorMessages","LdFirewallConfiguration","LdHeaderStyles","LdHeader","LdUserInputLine","_alreadyFired","_onInputAnything","_onRemoveLineClick","formFieldFirstName","formFieldLastName","formFieldEmail","Event","LdUserInput","_createUniqueId","_addUserLine","_onRemoveUserLineEventCaught","_newUserInputLine","createElement","_userLines","appendChild","LdNetcfgApplication","standalone","picture","logo","_userInformation","_machineIdentifierSw","_machineId","_isFormBlocked","_activeErrors","noUserPresent","notAllFieldsFilled","noValidMachineSwIdentifier","noValidUserData","_activeErrorMessages","_users","URL","location","lastOfIt","_machineName","pathname","searchParams","__toggleError","toRender","createNetCfgMarkup","createShell","netCfg","saveButton","_checkForErrors","_openHelpDialog","_networkTypeChanged","_useProxyServerChanged","_displayErrorMessagesIfAvailable","openerElement","_openerElement","_dialogElement","positionTarget","open","_errorMessageRenderedTemplate","useProxyServer","style","display","useProxyServerCheckbox","staticIpConfigurationBlock","networkTypeStatic","download","_errors","formFieldCompanyName","formFieldSwMachineNo","formFieldNtpServer","isIP","isURL","formFieldIotGatewayIp","formFieldSubnetMask","formFieldGateway","_dnsServer","formFieldDnsServer","_dnsServerErrors","dnsEntry","iotGatewayIpSameAsGateway","iotGatewayIpSameAsSubnet","__fetchAllUserInfoData","__getActiveErrors","__downloadFile","handleBtnClick","_userInfoObjects","_userDataError","firstName","lastName","emailAddress","phone","department","isEmail","require_tld","_newUserObject","errorKey","errorValue","amount","__createJson","check","disable","interface","address","netmask","gateway","dns","dhcp","formFieldProxyHttps","formFieldProxyHttp","proxies","proxyHttps","proxyHttp","additionalInfo","companyName","machineName","formFieldMachineName","machineIdentifier","users","filename","encodeURIComponent","click","removeChild","json","AppLayoutBehavior","listeners","_appResetLayoutHandler","path","resetLayout","_updateLayoutStates","cb","bind","_layoutDebouncer","debounce","_notifyDescendantResize","_notifyLayoutChanged","self","requestAnimationFrame","isAttached","_interestedResizables","resizable","resizerShouldNotify","_notifyDescendant","_scrollEffects","AppScrollEffectsBehavior","effects","effectsConfig","reflectToAttribute","threshold","thresholdTriggered","notify","readOnly","observers","_updateScrollState","scrollTop","isOnScreen","isContentBelow","_effectsRunFn","_effects","_clampedScrollTop","_scrollTop","_scrollStateChanged","detached","_tearDownEffects","createEffect","effectName","effectConfig","effectDef","ReferenceError","_getUndefinedMsg","_boundEffect","setUp","_effectsChanged","_setUpEffect","_layoutIfDirty","offsetWidth","startsAt","endsAt","deltaS","noop","runFn","run","progress","y","tearDown","_runEffects","p","_scrollHandler","_setThresholdTriggered","_getDOMRef","condenses","fixed","reveals","shadow","_height","_dHeight","_stickyElTop","_stickyElRef","_top","_progress","_wasScrollingDown","_initScrollTop","_initTimestamp","_lastTimestamp","_lastScrollTop","_maxHeaderTop","_stickyEl","nodes","slot","getDistributedNodes","nodeType","Node","ELEMENT_NODE","_configChanged","offsetHeight","firstSetup","currentDisabled","_mayMove","offsetTop","forceUpdate","lastTop","maxHeaderTop","dScrollTop","absDScrollTop","abs","isScrollingDown","now","performance","_clamp","transitionDuration","scrollVelocity","_transformHeader","willCondense","translate3d","v","_ensureBgContainers","_bgContainer","_bgRear","_bgFront","root","insertBefore","contentContainer","getScrollState","IronA11yAnnouncer","mode","timeout","_text","created","instance","_onIronAnnounce","announce","requestAvailability","KEY_IDENTIFIER","KEY_CODE","MODIFIER_KEYS","KEY_CHAR","IDENT_CHAR","ARROW_KEY","SPACE_KEY","ESC_KEY","transformKey","noSpecialChars","validKey","lKey","keyComboMatchesEvent","keyCombo","keyEvent","hasModifiers","keyIdent","keyIdentifier","keyCode","transformKeyCode","shiftKey","ctrlKey","altKey","metaKey","parseEventString","eventString","keyComboString","combo","reduce","parsedKeyCombo","keyComboPart","eventParts","keyName","parseKeyComboString","IronA11yKeysBehavior","keyEventTarget","stopKeyboardEventPropagation","_boundKeyHandlers","_imperativeKeyBindings","keyBindings","registered","_prepKeyBindings","_listenKeyEventListeners","_unlistenKeyEventListeners","addOwnKeyBinding","handlerName","_resetKeyEventListeners","removeOwnKeyBindings","keyboardEventMatchesKeys","keyCombos","_collectKeyBindings","_keyBindings","_addKeyBinding","sort","kb1","kb2","b1","boundKeyHandler","_onKeyBindingEvent","keyHandlerTuple","defaultPrevented","_triggerKeyHandler","keyboardEvent","cancelable","IronButtonStateImpl","observer","receivedFocusFromKeyboard","down","up","tap","_mouseEventRe","_tapHandler","_userActivate","_focusChanged","_detectKeyboardFocus","_setPressed","_setReceivedFocusFromKeyboard","_downHandler","_setPointerDown","_upHandler","_spaceKeyDownHandler","localTarget","isLightDescendant","stopImmediatePropagation","_spaceKeyUpHandler","_asyncClick","_pressedChanged","_changedButtonState","_ariaActiveAttributeChanged","_activeChanged","_controlStateChanged","_buttonStateChanged","IronButtonState","IronControlState","_oldTabIndex","_boundFocusBlurHandler","Function","_focusBlurHandler","_setFocused","_disabledChanged","old","pointerEvents","tabIndex","blur","_changedControlState","head","IronFormElementBehavior","theme","_meta","_DEFAULT_ICONSET","_iconChanged","_iconName","_iconsetName","_updateIcon","_srcChanged","_usesIconset","_img","parentNode","_iconset","removeIcon","byKey","applyIcon","unlisten","listen","width","height","draggable","rtlMirroring","useGlobalRtlAttribute","getIconNames","_icons","_createIconMap","iconName","svg","_cloneIcon","_targetIsRTL","pde","childNodes","_svgIcon","__targetIsRTL","globalElement","documentElement","host","getComputedStyle","_nameChanged","icons","mirrorAllowed","_prepareSvgClone","sourceSvg","cloneNode","createElementNS","viewBox","cssText","IronMultiSelectableBehaviorImpl","multi","selectedValues","selectedItems","_toggleSelected","multiChanged","_selection","_updateSelected","_shouldUpdateSelection","_updateAttrForSelected","selectedItem","_indexToValue","unfilteredValue","_selectMulti","_selectSelected","_valuesToItems","setItemSelected","fallbackSelection","_selectionChange","s","_setSelectedItems","_setSelectedItem","IronMultiSelectableBehavior","IronMenuBehaviorImpl","attrForItemTitle","_MODIFIER_KEYS","_SEARCH_RESET_TIMEOUT_MS","_previousTabIndex","_resetTabindices","_defaultFocusAsync","cancelAsync","_setFocusedItem","firstSelectedItem","isSelected","_updateMultiselectable","_focusWithKeyboardEvent","cancelDebouncer","searchText","_searchText","searchLength","toLocaleLowerCase","attr","_clearSearchText","curFocusIndex","owner","getOwnerRoot","activeElement","_applySelection","_focusedItemChanged","_onIronItemsChanged","addedNodes","_onShiftTabDown","oldTabIndex","_shiftTabPressed","_onFocus","rootTarget","_onEscKey","_onKeydown","_activateHandler","IronMenuBehavior","IronMenubarBehaviorImpl","_isRTL","IronMenubarBehavior","IronMeta","types","metaDatas","__meta","computed","__computeMeta","meta","_selfChanged","verticalScrollbarMaxWidthBugOffset","IronFitBehavior","sizingTarget","fitInto","noOverlap","Element","horizontalAlign","verticalAlign","dynamicAlign","horizontalOffset","verticalOffset","autoFitOnAttach","expandSizingTargetForScrollbars","_fitInfo","_fitWidth","innerWidth","getBoundingClientRect","_fitHeight","innerHeight","_fitLeft","left","_fitTop","_defaultPositionTarget","parent","DOCUMENT_FRAGMENT_NODE","_localeHorizontalAlign","__shouldPosition","_memoizedIsRTL","direction","fit","ShadyDOM","flush","__deferredFit","clearTimeout","position","constrain","center","_discoverInfo","sizer","inlineStyle","sizerInlineStyle","maxWidth","boxSizing","positionedBy","vertically","bottom","horizontally","right","sizedBy","minWidth","minHeight","margin","marginTop","marginRight","marginBottom","marginLeft","resetFit","info","property","refit","scrollLeft","rect","positionRect","__getNormalizedRect","fitRect","unpositionedOffsetWidth","unpositionedOffsetHeight","unpositionedClientWidth","unpositionedClientHeight","clientWidth","clientHeight","__getPosition","leftPosition","topPosition","positionedOffsetHeight","sizingTargetScrollbarHeight","fitRectMaxHeight","newMaxHeight","addedHeight","newTopPosition","positionedOffsetWidth","sizingTargetScrollbarWidth","maxWidthBugOffset","container","assign","overflow","getVerticalScrollbarMaxWidthBugOffset","fitRectMaxWidth","newMaxWidth","addedWidth","newLeftPosition","__sizeDimension","_sizeDimension","end","extent","flip","offsetExtent","sizingOffset","__getOffscreenArea","verticalCrop","horizontalCrop","hAlign","vAlign","sizeNoMargins","positions","copy","candidate","vAlignOk","hAlignOk","alignOk","offscreenArea","diff","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","IronFocusablesHelper","getTabbableNodes","_collectTabbableNodes","_sortByTabIndex","isFocusable","isTabbable","_isVisible","_normalizedTabIndex","needsSort","localName","visibility","tabbables","pivot","ceil","_mergeSortByTabIndex","_hasLowerTabOrder","a","ati","bti","opened","__openedRaf","_openedChanged","prepare","close","complete","_onTransitionend","cs","opacity","cancelAnimationFrame","toggleClass","IronOverlayManager","_overlays","_minimumZ","_backdropElement","gestures","_onCaptureClick","_onCaptureFocus","_onCaptureKeyDown","backdropElement","deepActiveElement","_bringOverlayAtIndexToFront","overlay","lastI","currentOverlay","_shouldBeBehindOverlay","minimumZ","currentOverlayZ","_getZ","_applyOverlayZ","addOrRemoveOverlay","addOverlay","removeOverlay","trackBackdrop","insertionIndex","newZ","previousOverlay","ensureMinimumZ","focusOverlay","current","_applyFocus","_overlayWithBackdrop","zIndex","getBackdrops","backdrops","withBackdrop","backdropZ","z","z1","_setZ","aboveZ","_overlayInPath","_manager","allowClickThrough","_onCaptureEsc","_onCaptureTab","overlay1","overlay2","alwaysOnTop","_boundScrollHandler","currentLockingElement","lastTouchPosition","pageX","pageY","lastRootTarget","lastScrollableNodes","scrollEvents","pushScrollLock","_lockingElements","_scrollInteractionHandler","capture","passive","_lockScrollInteractions","_lockedElementCache","_unlockedElementCache","scrollables","lockingIndex","_getScrollableNodes","deltaX","deltaY","wheelDeltaX","wheelDeltaY","wheelDelta","axis","targetTouches","touch","_getScrollInfo","verticalScroll","scrollHeight","scrollWidth","_getScrollingNode","_shouldPreventScrolling","IronOverlayBehaviorImpl","canceled","noAutoFocus","noCancelOnEscKey","noCancelOnOutsideClick","closingReason","restoreFocusOnClose","scrollAction","_focusedChild","_focusNode","_focusableNodes","__isAnimating","__shouldRemoveTabIndex","__firstFocusableNode","__lastFocusableNode","__rafs","__restoreFocusNode","__scrollTop","__scrollLeft","__onCaptureScroll","__rootNodes","_ensureSetup","_observer","observeNodes","_onNodesChange","unobserveNodes","_finishRenderOpened","_finishRenderClosed","_setCanceled","cancel","invalidateTabbables","_overlaySetup","outline","__deraf","__openedChanged","_canceledChanged","_withBackdropChanged","_prepareRenderOpened","_preparePositioning","_finishPositioning","_renderOpened","_renderClosed","notifyResize","transition","webkitTransition","transform","webkitTransform","composedContains","__ensureFirstLastFocusables","nodeToCheck","nodeToSet","shouldWrap","focusedNode","_onIronResize","focusableNodes","jobname","rafs","__updateScrollObservers","__isValidScrollAction","__saveScrollPosition","__addScrollListeners","_unlockScrollInteractions","__removeScrollListeners","assignedSlot","el","__restoreScrollPosition","scrollingElement","ancestor","descendant","IronOverlayBehavior","IronRangeBehavior","ratio","_calcRatio","_clampValue","_calcStep","numSteps","round","_validateValue","isNaN","_update","_setRatio","ORPHANS","IronResizableBehavior","_parentResizable","_notifyingDescendant","_boundNotifyResize","_boundOnDescendantIronResize","_onDescendantIronResize","_requestResizeNotifications","stopResizeNotificationsFor","_fireResize","assignParentResizable","parentResizable","_subscribeIronResize","_unsubscribeIronResize","_onIronRequestResizeNotifications","_parentResizableChanged","readyState","readystatechanged","_findParent","orphan","IronScrollTargetBehavior","scrollTarget","HTMLElement","_defaultScrollTarget","_shouldHaveListener","_scrollTargetChanged","_oldScrollTarget","_toggleScrollListener","_doc","domHost","ownerDocument","_isValidScrollTarget","pageYOffset","_scrollLeft","pageXOffset","scrollTo","scroll","leftOrOptions","_scrollTargetWidth","_scrollTargetHeight","yes","eventTarget","toggleScrollListener","IronSelection","selectCallback","selection","excludes","IronSelectableBehavior","activateEvent","selectedClass","_excludedLocalNames","_bindFilterItem","_filterItem","_observeItems","_addListener","_removeListener","selectPrevious","_valueToIndex","selectNext","selectIndex","forceSynchronousItemUpdate","_updateItems","_checkFallback","_activateEventChanged","queryDistributedElements","_setItems","propValue","IronValidatableBehaviorMeta","IronValidatableBehavior","_invalidChanged","_validator","hasValidator","validate","_getValidity","NeonAnimationRunnerBehavior","animationConfig","entryAnimation","exitAnimation","_entryAnimationChanged","_exitAnimationChanged","_copyProperties","config1","config2","_cloneConfig","config","clone","isClone","_getAnimationConfigRecursive","allConfigs","thisConfig","_warn","_logf","isArray","animatable","cachedConfig","getAnimationConfig","_configureAnimations","configs","resultsToPlay","neonAnimation","isNeonAnimation","configure","timeline","play","animation","_shouldComplete","activeEntries","finished","playState","_complete","playAnimation","cookie","_active","onfinish","cancelAnimation","entries","PaperButtonBehaviorImpl","animated","_calculateElevation","_setElevation","_computeKeyboardClass","hasRipple","getRipple","ripples","_ripple","uiDownAction","uiUpAction","PaperButtonBehavior","IronCheckedElementBehaviorImpl","_hasIronCheckedElementBehavior","_requiredChanged","_checkedChanged","_valueChanged","IronCheckedElementBehavior","PaperCheckedElementBehaviorImpl","PaperCheckedElementBehavior","PaperInkyFocusBehaviorImpl","_focusedChanged","ensureRipple","holdDown","_createRipple","ripple","PaperInkyFocusBehavior","PaperRippleBehavior","optTriggeringEvent","rippleContainer","domContainer","deepContains","_noinkChanged","checkboxSizeText","units","unitsMatches","checkboxSize","_computeCheckboxClass","className","_computeCheckmarkClass","checkboxContainer","PaperDialogBehaviorImpl","modal","__readied","__prevNoCancelOnOutsideClick","__prevNoCancelOnEscKey","__prevWithBackdrop","_modalChanged","readied","_updateClosingReasonConfirmed","confirmed","_onDialogClick","PaperDialogBehavior","dialogElement","scrollable","_ensureTarget","updateScrollState","parentElement","$_documentContainer","_onNeonAnimationFinish","LegacyPolymerElementBase","selectedItemLabel","allowOutsideScroll","noAnimations","_attachDom","dom","wrappedThis","wrap","attachShadow","delegatesFocus","shadyUpgradeFragment","_focusableElement","contentElement","menuButton","_onIronSelect","_onIronDeselect","_onTap","_selectedItemChanged","_setSelectedItemLabel","_computeMenuVerticalOffset","opt_verticalOffset","openState","mini","_labelChanged","_computeIsIconFab","alt","_altChanged","PaperInputAddonBehavior","update","PaperInputHelper","PaperInputBehaviorImpl","autocorrect","_ariaDescribedBy","_ariaLabelledBy","_inputId","inputElement","_generateInputId","$$","_typesThatHaveText","_updateAriaLabelledBy","_appendStringWithSpace","more","_onAddonAttached","NextAddonID","_handleAutoValidate","updateValueAndPreserveCaret","selectionStart","selectionEnd","_computeAlwaysFloatLabel","labelledBy","NextLabelID","NextInputID","_onChange","sourceEvent","_autofocusChanged","PaperInputBehavior","_charCounterStr","counter","attrForValue","_addons","_inputHasContent","_inputSelector","_boundOnFocus","_boundOnBlur","_onBlur","_boundOnInput","_onInput","_boundValueChanged","_onValueChanged","_valueChangedEvent","_propertyForValue","_inputElement","_inputElementValue","__isFirstValueUpdate","_handleValueAndAutoValidate","_handleValue","checkValidity","updateAddons","valid","_onIronInputValidate","addon","_computeInputContentClass","labelAndInputContainer","_computeUnderlineClass","_computeAddOnContentClass","_setInvalid","bindValue","_previousValidInput","_patternAlreadyChecked","_initSlottedInput","getEffectiveChildren","_patternRegExp","_bindValueChanged","_checkPatternValidity","_announceInvalidCharacter","_isPrintable","anyNonPrintable","mozNonPrintable","charCode","_onKeypress","regexp","thisChar","_computeValue","inputRole","inputAriaHaspopup","_onIronInputReady","nativeInput","maxRows","textarea","navigator","userAgent","validity","mirror","_valueForMirror","eventPath","_constrain","_tokens","_updateCached","_ariaLabelledByChanged","ariaLabelledBy","_ariaDescribedByChanged","ariaDescribedBy","PaperItemBehavior","openAnimationConfig","closeAnimationConfig","focusTarget","containedElement","_readied","_updateAnimationConfig","contentWrapper","animationNode","animations","_updateOverlayPosition","_allowOutsideScrollChanged","NeonAnimationBehavior","animationTiming","duration","easing","fill","animate","timingFromConfig","timing","setPrefixedProperty","prefix","prefixes","_effect","KeyframeEffect","ANIMATION_CUBIC_BEZIER","MAX_ANIMATION_TIME_MS","PaperMenuButton","ignoreSelect","closeOnActivate","delay","_dropdownContent","_onIronActivate","oldOpened","__onIronOverlayCanceled","uiEvent","trigger","secondaryProgress","secondaryRatio","indeterminate","_toggleIndeterminate","primaryProgress","_transformProgress","_mainRatioChanged","_progressChanged","mainRatio","_setSecondaryRatio","_hideSecondaryProgress","Utility","distance","x1","y1","x2","y2","xDelta","yDelta","sqrt","Date","ElementMetrics","boundingRect","Ripple","color","wave","waveContainer","backgroundColor","resetInteractionState","furthestCornerDistanceFrom","x","topLeft","topRight","bottomLeft","bottomRight","MAX_RADIUS","recenters","mouseDownElapsed","elapsed","mouseDownStart","mouseUpStart","mouseUpElapsed","mouseDownElapsedSeconds","mouseUpElapsedSeconds","mouseInteractionSeconds","initialOpacity","opacityDecayVelocity","radius","width2","containerMetrics","height2","waveRadius","timeNow","pow","outerOpacity","waveOpacity","isOpacityFullyDecayed","maxRadius","isRestingAtMaxRadius","isAnimationComplete","translationFraction","xNow","xEnd","xStart","yNow","yEnd","yStart","isMouseDown","slideDistance","draw","scale","dx","dy","downAction","xCenter","yCenter","upAction","animating","_animating","_boundAnimate","shouldKeepAnimating","simulatedRipple","addRipple","onAnimationComplete","background","waves","_setAnimating","removeRipple","rippleIndex","animateRipple","_onEnterKeydown","_onSpaceKeydown","_onSpaceKeyup","_holdDownChanged","newVal","oldVal","PaperSpinnerBehavior","__coolingDown","__computeContainerClasses","coolingDown","__activeChanged","__setAriaHidden","__altChanged","__reset","polymerSkipLoadingFontRoboto","rel","crossOrigin","_updateNoink","_parentNoink","anchor","queryEffectiveChildren","noBar","noSlide","fitContainer","disableDrag","hideScrollButtons","alignBottom","autoselect","autoselectDelay","_step","_holdDelay","_leftHidden","_rightHidden","_previousTab","_holdJob","_pendingActivationItem","_pendingActivationTimeout","_bindDelayedActivationHandler","_delayedActivationHandler","_onBlurCapture","setScrollDirection","tabsContainer","_cancelPendingActivation","_setNoinkAttribute","_removeNoinkAttribute","_computeScrollButtonClass","hideThisButton","_computeTabsContentClass","_computeSelectionBarClass","_onTabSizingChanged","_scroll","_tabChanged","_scheduleActivation","_onArrowKeyup","_tabContainerScrollSize","ddx","_affectScroll","_down","_onLeftScrollButtonDown","_scrollToLeft","setInterval","_onRightScrollButtonDown","_scrollToRight","_onScrollButtonUp","clearInterval","tab","selectionBar","_positionBar","r","tabsContent","w","tabRect","tabOffsetLeft","_pos","_calcPercent","oldRect","oldIndex","moveRight","_left","_scrollToSelectedIfNeeded","tabWidth","w0","_width","_onBarTransitionEnd","cl","contains","currentToast","visible","_canAutoClose","_autoClose","show","hide","__onTransitionEnd","propertyName","_onFitIntoChanged","track","_ontrack","_trackStart","_trackMove","_trackEnd","toggleBar","_trackChecked","toggleButton","_x","for","manualMode","fitToVisibleBounds","animationDelay","animationEntry","animationExit","_showing","ownerRoot","_findTarget","_removeListeners","tooltip","allChildrenEmpty","effectiveChildren","getEffectiveChildNodes","_getAnimationType","updatePosition","_animationPlaying","_cancelAnimation","_onAnimationFinish","_target","offsetParent","tooltipLeft","tooltipTop","parentRect","targetRect","thisRect","horizontalCenterOffset","verticalCenterOffset","targetLeft","targetTop","_addListeners","_delayChange","_manualModeChanged","_onAnimationEnd","timingDelay","modules","lcModules","setModule","findModule","DomModule","observedAttributes","import","selector","m","attributeChangedCallback","namespace","register","assetpath","__assetpath","HTMLImports","importForElement","baseURI","inst","StyleNode","parseCss","OPEN_BRACE","previous","CLOSE_BRACE","RX","comments","port","ss","_expandUnicodeEscapes","multipleSpaces","AT_START","MEDIA_START","MEDIA_RULE","keyframesRule","KEYFRAMES_RULE","VAR_START","MIXIN_RULE","STYLE_RULE","r$","preserveProperties","_hasMixinRules","mixinApply","varApply","removeCustomPropApply","customProp","mixinProp","removeCustomPropAssignment","removeCustomProps","styleTextSet","processUnscopedStyle","newStyle","isUnscopedStyle","toCssText","forEachRule","rulesForStyle","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","matchMedia","processVariableAndFallback","findMatchingParen","inner","suffix","comma","CSS_BUILD_ATTR","elementHasBuiltCss","__cssBuild","attrValue","buildComment","firstChild","Comment","commentParts","getBuildComment","removeBuildComment","getCssBuild","APPLY_NAME_CLEAN","INITIAL_INHERIT","IMPORTANT","MIXIN_VAR_SEP","MixinMap","_map","props","dependants","invalidCallback","ApplyShim","_currentElement","_measureElement","detectMixin","gatherStyles","styleText","styleTextParts","gatherStyleText","transformTemplate","elementName","_gatheredStyle","transformStyle","ast","transformRules","transformCustomStyle","transformRule","transformCssText","matchText","valueProperty","valueMixin","_produceCssProperties","_consumeCssProperties","_getInitialValueForProperty","getPropertyValue","_fallbacksFromPreviousRules","startRule","topRule","fallbacks","seenStartRule","_cssTextToMap","mixinName","idx","applyPos","afterApplyPos","textBeforeApply","textAfterApply","replacement","_atApplyToCssProperties","vars","mixinEntry","f","_replaceInitialOrInherit","replaceInitialOrInherit","sp","_invalidateMixinEntry","mixinAsProperties","mixinValues","combinedProps","oldProps","needToInvalidate","defineProperty","CURRENT_VERSION","NEXT_VERSION","VALIDATING_VERSION","promise","invalidate","invalidateTemplate","templateIsValid","applyShim","ApplyShimInterface","customStyleInterface","ensure","ShadyCSS","CustomStyleInterface","flushCustomStyles","prepareTemplate","styleSubtree","styleElement","shadowChildren","typeExtension","extends","getIsExtends","_validating","styleDocument","ScopingShim","applyShimInterface","elementExtends","prepareTemplateStyles","prepareTemplateDom","nativeCss","nativeShadow","cssBuild","disableRuntime","HOST_DIR","EL_DIR","DIR_CHECK","SHIM_SHADOW","DIR_INSTANCES","documentDir","getRTL","setRTL","__autoDirOptOut","updateDirection","DirMixin","attributeFilter","elementBase","Dir","_processStyleText","_replaceDirInCssText","__activateDir","replacedText","takeRecords","sameScope","scope","getRootNode","DISABLED_ATTR","findObservedAttributesGetter","ctor","desc","getOwnPropertyDescriptor","getPrototypeOf","superClass","observedAttributesGetter","__isUpgradeDisabled","_initializeProperties","_enableProperties","_canApplyPropertyDefault","_isPropertyPending","isConnected","styleInterface","LegacyElementMixin","GesturesElement","legacyElementBase","DIRECTION_MAP","LegacyElement","__boundListeners","_debouncers","__needsAttributesAtConnected","_legacyForceObservedAttributes","importMeta","__attributeReaction","__dataAttributes","JSCompiler_renameProperty","__observedAttributes","_takeAttributes","attributeChanged","proto","_registered","__hasRegisterFinished","hasAttributes","_applyListeners","_ensureAttributes","_serializeValue","deserialize","_deserializeValue","reflectPropertyToAttribute","attribute","_propertyToAttribute","serializeValueToAttribute","_valueToNodeAttribute","extend","api","n$","getOwnPropertyNames","pd","mixin","chainObject","object","__proto__","instanceTemplate","_contentForTemplate","importNode","methodName","hbl","bl","_addMethodEventListenerToNode","handler","_removeEventListenerFromNode","slctr","DocumentFragment","distributeContent","domApi","getEffectiveTextContent","cn","tc","COMMENT_NODE","e$","queryAllEffectiveChildren","getContentChildNodes","getContentChildren","thisNode","isLocalDescendant","scopeSubtree","shouldObserve","containerScope","scopify","elements","currentScope","mo","mxns","mxn","addedNode","jobName","wait","after","isDebouncerActive","debouncer","isActive","flushDebouncer","waitTime","handle","elt","setProperties","elementMatches","bool","transformText","arrayDelete","arrayOrPath","_logger","_log","_error","mutablePropertyChange","_mutablePropertyChange","OptionalMutableDataBehavior","mutableData","_shouldPropertyChange","lifecycleProps","beforeRegister","excludeOnInfo","_noAccessors","excludeOnBehaviors","applyInfo","lifecycle","excludeProps","noAccessors","propertyNames","configurable","copyProperties","flattenBehaviors","exclude","mergeProperties","targetInfo","sourceInfo","GenerateClassFromInfo","Base","behaviorList","PolymerGenerated","_finalizeClass","createProperties","createObservers","_prepareTemplate","generatedProto","copyPropertiesToProto","_ensureAttribute","superBehaviors","applyBehaviors","generatedFrom","Polymer","klass","Class","normalizedMatchesSelector","DomApiNative","observerHandle","notifyObserver","doc","flatten","getDestinationInsertionPoints","ip$","deep","Document","getFlattenedNodes","c$","_activeElement","forwardReadOnlyProperties","EventApi","replaceChild","lastChild","nextSibling","previousSibling","firstElementChild","lastElementChild","nextElementSibling","previousElementSibling","DomApiImpl","Wrapper","defineProperties","currentTarget","currentRoot","p$","methods","method","forwardMethods","forwardProperties","helper","Templatizer","templatize","_templatizerTemplate","parentModel","_parentModel","instanceProps","_instanceProps","forwardHostProp","_forwardHostPropV2","notifyInstanceProp","_notifyInstancePropV2","stamp","model","modelForElement","PropertiesMixin","superPropertiesClass","superCtor","ownProperties","output","normalizeProperties","__ownProperties","_properties","_addPropertyToAttributeMap","finalize","__finalized","__properties","typeForProperty","builtCSS","ElementMixin","polymerElementBase","polymerElementVersion","__ownObservers","allProps","_hasReadOnlyEffect","_createComputedProperty","_createReadOnlyProperty","_hasReflectEffect","_createReflectedProperty","_hasNotifyEffect","_createNotifyingProperty","_createPropertyObserver","dynamicFns","_createMethodObserver","protoTemplate","importPath","_importPath","rootPath","_finalizeTemplate","__propertyDefaults","propertyDefaults","_hasAccessor","_setPendingProperty","__polymerFinalized","templateStyles","stylesWithImports","linkedStyles","firstTemplateChild","templateStyleIndex","templateStyle","css","_styleSheet","CSSStyleSheet","replaceSync","processElementStyles","_bindTemplate","_stampTemplate","_readyClients","adoptedStyleSheets","flushInitial","_parseTemplateContent","templateInfo","nodeInfo","_addTemplatePropertyEffect","effect","signature","hostProp","nestedTemplate","GestureEventListeners","_addEventListenerToNode","isObject","__dataTemp","shouldChange","MutableData","OptionalMutableData","microtask","PropertiesChanged","_createPropertyAccessor","attributeNameForProperty","__dataHasAccessor","_definePropertyAccessor","__data","_invalidateProperties","__dataEnabled","__dataReady","__dataInvalid","__dataPending","__dataOld","__dataInstanceProps","__dataCounter","__serializing","_flushProperties","_initializeInstanceProperties","_setProperty","_getProperty","changedProps","_shouldPropertiesChange","_propertiesChanged","currentProps","_attributeToProperty","trustedTypes","nativeProperties","isTrustedType","isHTML","isScript","isScriptURL","PropertyAccessors","createPropertiesForAttributes","a$","__dataProto","_initializeProtoProperties","outValue","saveAccessorValue","templateExtensions","placeholderBugDetect","placeholderBug","copyAttributeWithTemplateEventPolicy","polymerTemplateEventAttributePolicy","createPolicy","createScript","dest","startsWith","wrapTemplateExtension","findTemplateNode","parentInfo","parentIndex","applyIdToMap","applyEventListener","events","applyTemplateInfo","parentTemplateInfo","_templateInfo","_parentTemplateInfo","TemplateStamp","_parseTemplate","outerTemplateInfo","nodeInfoList","stripWhiteSpace","_parseTemplateNode","noted","hasInsertionPoint","_parseTemplateNestedTemplate","hasPlaceholderBug","fixPlaceholder","_parseTemplateChildNodes","_parseTemplateNodeAttributes","TEXT_NODE","childInfo","infoIndex","createDocumentFragment","attrs","_parseTemplateNodeAttribute","HTMLTemplateElement","decorate","__noInsertionPoint","nodeList","context","_methodHost","createNodeEventHandler","dedupeId","NOOP","TYPES","COMPUTE","REFLECT","NOTIFY","PROPAGATE","OBSERVE","READ_ONLY","COMPUTE_INFO","capitalAttributeRegex","ensureOwnEffectMap","cloneArrays","protoFx","instFx","runEffects","hasPaths","extraArgs","ran","fxs","fx","lastRun","pathMatchesTrigger","fn","runEffectsForProperty","triggerPath","structured","wildcard","runObserverEffect","changedProp","dynamicFn","notifyPath","rootProperty","dispatchNotifyEvent","queueProperty","runNotifyEffect","runReflectEffect","attrName","insertEffect","queue","order","mid","cmp","methodInfo","enqueueEffectsFor","computeEffects","runComputedEffect","runMethodEffect","computedProp","addBinding","kind","literal","bindings","binding","isCompound","shouldAddListener","negate","listenerEvent","listenerNegate","compoundIndex","addEffectForBindingPart","dependencies","evaluator","parseArg","runBindingEffect","__isPropertyEffectsClient","_setPendingPropertyOrPath","_enqueueClient","_evaluateBinding","storage","__dataCompoundStorage","computeBindingValue","_setUnmanagedPropertyToNode","applyBindingValue","setupCompoundStorage","literals","addNotifyListener","fromProp","toPath","fromPath","handleNotification","createMethodEffect","sig","effectFn","_addPropertyEffect","_marshalArgs","emptyArray","IDENT","ARGUMENT","bindingRegex","OPEN_BRACKET","literalFromParts","parseMethod","expression","argList","rawArg","parseArgs","fc","getArgValue","data","notifySplices","array","splices","splicesData","indexSplices","_overrideLegacyUndefined","notifySplice","addedCount","removed","PropertyEffects","propertyEffectsBase","__dataClientsReady","__dataPendingClients","__dataToNotify","__dataLinkedPaths","__dataHasPaths","__dataHost","__dataClientsInitialized","__computeEffects","__computeInfo","__reflectEffects","__notifyEffects","__propagateEffects","__observeEffects","__readOnly","__templateInfo","PROPERTY_EFFECT_TYPES","_registerHost","hostStack","_removePropertyEffect","_hasPropertyEffect","_hasComputedEffect","shouldNotify","isPathNotification","computeLinkedPaths","propIsPath","prevProps","client","_flushClients","__enableOrFlushClients","clients","setReadOnly","notifyProps","__orderedComputedDeps","Map","counts","total","infoForComputed","computedDeps","dependencyCounts","computedByCurr","getComputedOrder","inputProps","runComputedEffects","_propagatePropertyChanges","notified","runNotifyEffects","_runEffectsForTemplate","baseRunEffects","propertyEffects","linkPaths","to","unlinkPaths","hadLength","deleteCount","propPath","protectedSetter","toUpperCase","pathValue","addPropertyEffect","createPropertyObserver","createMethodObserver","createNotifyingProperty","createReadOnlyProperty","createReflectedProperty","createComputedProperty","bindTemplate","instanceBinding","wasPreBound","__preBoundTemplateInfo","hostProps","setupBindings","_removeBoundDom","_parseBindings","origName","nestedTemplateInfo","isDomIf","isDomRepeat","customEvent","notifyEvent","colon","newSplice","EDIT_LEAVE","EDIT_UPDATE","EDIT_ADD","EDIT_DELETE","calculateSplices","currentStart","currentEnd","oldStart","oldEnd","prefixCount","suffixCount","minLength","equals","sharedPrefix","index1","index2","sharedSuffix","ops","distances","edits","northWest","west","north","reverse","spliceOperationsFromEditDistances","rowCount","columnCount","calcEditDistances","calcSplices","currentValue","previousValue","microtaskCurrHandle","microtaskLastHandle","microtaskCallbacks","microtaskNodeContent","microtaskScheduled","microtaskNode","createTextNode","characterData","timeOut","animationFrame","idlePeriod","requestIdleCallback","cancelIdleCallback","microTask","caseMap","DASH_TO_CAMEL","CAMEL_TO_DASH","dashToCamelCase","dash","camelToDashCase","camel","Debouncer","_asyncModule","_callback","_timer","setConfig","asyncModule","debouncerQueue","_cancelAsync","enqueueDebouncer","flushDebouncers","didFlush","isSlot","FlattenedNodesObserver","wrapped","slotNode","_shadyChildrenObserver","_nativeChildrenObserver","_connected","_effectiveNodes","_scheduled","_boundSchedule","_schedule","connect","_listenSlots","observeChildren","mutations","_processMutations","_unlistenSlots","unobserveChildren","_processSlotMutations","removedNodes","newNodes","shadyDOM","debouncers","HAS_NATIVE_TA","touchAction","GESTURE_KEY","HANDLED_OBJ","TOUCH_ACTION","MOUSE_EVENTS","MOUSE_WHICH_TO_BUTTONS","MOUSE_HAS_BUTTONS","MouseEvent","isMouseEvent","supportsPassive","PASSIVE_TOUCH","IS_TOUCH_ONLY","clickedLabels","labellable","canBeDisabled","matchingLabels","labels","matching","mouseCanceller","mouseEvent","sc","sourceCapabilities","firesTouchEvents","skip","clickFromLabel","getComposedPath","ownerLabels","POINTERSTATE","mouse","setupTeardownMouseCanceller","setup","en","hasLeftMouseButton","ev","which","button","mouseIgnoreJob","scrollDecided","trackDocument","stateObj","movefn","upfn","untrackDocument","noPatch","recognizers","_findOriginalTarget","_handleNative","handled","gobj","gs","changedTouches","touches","identifier","clientX","clientY","ta","firstTouchAction","shouldPrevent","prevent","_handleTouchAction","flow","addListener","evType","recognizer","deps","dep","gd","_count","setTouchAction","_add","removeListener","_remove","recog","emits","_fire","preventer","evName","_findRecognizerByEvent","downupFire","trackHasMovedEnough","started","trackFire","secondlast","moves","lastmove","ddy","hover","elementFromPoint","oldNext","deepTargetFind","trackForward","bcr","isSyntheticClick","mousedown","touchstart","touchend","addMove","move","ct","touchmove","NaN","findOriginalTarget","policy","createHTML","LiteralString","assertValidTemplateStringParameters","string","acc","literalValue","htmlValue","TypeError","MixinFunction","__mixinApplications","__mixinSet","dedupingMixin","mixinApplications","mixinDedupeId","baseSet","extended","mixinSet","isPath","dotIndex","isAncestor","isDescendant","translate","newBase","normalize","last","scheduled","beforeRenderQueue","afterRenderQueue","schedule","callMethod","flushQueue","runQueue","beforeNextRender","afterNextRender","workingURL","resolveDoc","CSS_URL_RX","ABS_URL","u","implementation","createHTMLDocument","resolveCss","post","pathFromUrl","useShadow","supportsAdoptingStyleSheets","sheet","sanitizeDOMValue","passiveTouchGestures","setPassiveTouchGestures","strictTemplatePolicy","allowTemplateFromDomModule","legacyOptimizations","legacyWarnings","syncInitialRender","legacyUndefined","orderedComputed","cancelSyntheticClickEvents","setCancelSyntheticClickEvents","useCancelSyntheticClickEvents","removeNestedTemplates","fastDomIf","suppressTemplateNotifications","legacyNoObservedAttributes","useAdoptedStyleSheetsWithBuiltCSS","MODULE_STYLE_LINK_SELECTOR","INCLUDE_ATTR","SHADY_UNSCOPED_ATTR","importModule","moduleId","styleForImport","importDoc","importCss","stylesFromModules","moduleIds","stylesFromModule","_styles","_stylesFromModuleImports","stylesFromTemplate","include","stylesFromModuleImports","unscoped","_unscopedStyle","_style","cssFromModules","cssFromModule","_cssText","_cssFromModuleImports","cssFromTemplate","incrementInstanceCount","registrations","newInstance","HTMLTemplateElementExtension","writable","DataTemplate","MutableDataTemplate","templateInstanceBase","showHideChildren","__hideTemplateChildren__","__polymerTextContent__","__polymerReplaced__","createComment","__polymerDisplay__","_showHideChildren","TemplateInstanceBase","_configureProperties","__templatizeInstance","__templatizeOwner","__templatizeOptions","hprop","__hostProps","iprop","templateHost","__parentModel","MutableTemplateInstanceBase","findMethodHost","createForwardHostPropEffect","userForwardHostProp","createNotifyInstancePropEffect","instProp","userNotifyInstanceProp","baseClass","templatizeInstanceClass","templatizerBase","hasHostProps","addNotifyEffects","createTemplatizerClass","methodHost","isTemplate","templatizeTemplateClass","templatizedBase","TemplatizedTemplate","TemplatizedTemplateExtension","declaredProps","warnOnUndeclaredProperties","setPrototypeOf","addPropagateEffects","PolymerElement","elementsHidden","hideElementsGlobally","domBindBase","__children","__removeChildren","__insertChildren","domRepeatBase","DomRepeat","as","indexAs","itemsIndexAs","renderedItemCount","initialCount","targetFramerate","_targetFrameTime","notifyDomChange","reuseChunkedInstances","__instances","__renderDebouncer","__itemsIdxToInstIdx","__chunkCount","__renderStartTime","__itemsArrayChanged","__shouldMeasureChunk","__shouldContinueChunking","__chunkingId","__sortFn","__filterFn","__observePaths","__ctor","__isDetached","__detachInstance","wrappedParent","__attachInstance","__render","__ensureTemplatized","thisAsTemplate","i$","__getMethodHost","__functionFromPropertyValue","functionOrMethodName","__sortChanged","__debounceRender","__filterChanged","__computeFrameTime","rate","__observeChanged","__handleObservedPaths","paths","__itemsChanged","change","__handleItemPath","isntIdxToItemsIdx","__sortAndFilterItems","limit","__calculateLimit","__updateInstances","__continueChunking","_setRenderedItemCount","filteredItemCount","currentCount","newCount","renderTime","itemsIdxToInstIdx","instIdx","itemIdx","__insertInstance","__detachAndRemoveInstance","wrappedRoot","__stampInstance","beforeRow","beforeNode","itemsPath","dot","itemsIdx","itemSubPath","itemPath","itemForElement","indexForElement","DomIfBase","if","restamp","_lastIf","__template","__teardownInstance","__ensureTemplate","__ensureInstance","__hasInstance","__getInstanceNodes","__createAndInsertInstance","DomIf","__instance","__syncInfo","syncInfo","rootProp","__syncHostProperties","__hidden","__invalidProps","baseArraySelector","__lastItems","__lastMulti","__selectedMap","__updateSelection","itemsInfo","newItems","lastItems","clearSelection","__applySplices","__deselectChangedIdx","__updateLinks","sidx","isIndexSelected","__selectedIndexForItemIndex","deselect","deselectIndex","ArraySelectorMixin","ArraySelector","processStyles","CustomStyle","addCustomStyle","getStyle","fromUtf8","toUtf8","byteOffset","byteLength","VAR_ASSIGN","MIXIN_MATCH","MEDIA_MATCH","updateNativeProperties","removeProperty","setProperty","resolveFn","readyPromise","whenReady","documentWait","SEEN_MARKER","CACHED_STYLE","transformFn","validateFn","enqueueDocumentValidation","getStyleForCustomStyle","customStyle","styleToTransform","needsEnqueue","nativeCssVariables_","calcCssVariables","settings","shimcssproperties","CSS","supports","nativeCssVariables","Int32Array","INIT","temp","buffer","bufferLength","bytesHashed","MAX_HASHABLE_LENGTH","BLOCK_SIZE","hashBuffer","digest","bitsHashed","bufferView","DataView","undecoratedLength","setUint8","setUint32","DIGEST_LENGTH","state0","state1","state2","state3","state4","state5","state6","state7","t1","KEY","t2","RawSha256","Uint32Array","secret","hash","outer","convertToBuffer","bufferHash","bufferFromSecret","toHash","isEmptyData","digestSync","Sha256","Buffer","ArrayBuffer","isView","BYTES_PER_ELEMENT","numToUint8","uint32ArrayFrom","num","a_lookUpTable","return_array","base64","ieee754","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","encodingOrOffset","allocUnsafe","fromArrayLike","fromArrayBuffer","encoding","isEncoding","actual","write","fromString","isBuffer","fromObject","assertSize","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","dir","arrayIndexOf","arr","indexSize","arrLength","valLength","read","buf","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","parsed","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","hi","lo","utf16leToBytes","fromByteArray","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","MAX_ARGUMENTS_LENGTH","decodeCodePointsArray","g","foo","subarray","typedArraySupport","poolSize","_augment","Symbol","species","alloc","allocUnsafeSlow","_isBuffer","compare","pos","swap16","swap32","swap64","inspect","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","checkOffset","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","leadSurrogate","toByteArray","stringtrim","base64clean","dst","extendStatics","d","__extends","__","__assign","__rest","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","Reflect","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","fulfilled","rejected","__generator","sent","trys","verb","iterator","op","__createBinding","k2","__exportStar","__values","__read","ar","__spread","__spreadArrays","il","jl","__await","__asyncGenerator","asyncIterator","q","resume","fulfill","settle","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","__importStar","mod","__esModule","default","__importDefault","__classPrivateFieldGet","receiver","privateMap","__classPrivateFieldSet","baseConfig","_classCallCheck","_defineProperties","enumerable","toPropertyKey","_createClass","_assertThisInitialized","_setPrototypeOf","_inherits","_possibleConstructorReturn","_getPrototypeOf","_arrayLikeToArray","ownKeys","enumerableOnly","symbols","sym","_objectSpread","getOwnPropertyDescriptors","consoleLogger","log","baseLogger","Logger","concreteLogger","init","logger","debug","_len","_key","forward","_len2","_key2","_len3","_key3","_len4","_key4","lvl","debugOnly","moduleName","EventEmitter","listener","_this","defer","rej","makeString","getLastOfPath","Empty","cleanKey","canNotTraverseDeeper","stack","setPath","_getLastOfPath","getPath","_getLastOfPath3","getPathWithDefaults","defaultData","deepExtend","overwrite","regexEscape","_entityMap","isIE10","userAgentData","chars","ownKeys$1","_objectSpread$1","deepFind","keySeparator","mix","endsWith","joinedPath","ResourceStore","_EventEmitter","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","valueOf","_isNativeReflectConstruct","Super","NewTarget","ns","defaultNS","ignoreJSONStructure","lng","addNamespaces","emit","resources","addResource","hasResourceBundle","removeNamespaces","getResource","compatibilityAPI","getDataByLanguage","postProcessor","processors","addPostProcessor","translator","processor","process","ownKeys$2","_objectSpread$2","checkedLoadedFor","Translator","_isNativeReflectConstruct$1","services","language","interpolation","resolved","nsSeparator","namespaces","wouldCheckForNsInKey","seemsNaturalLanguage","userDefinedKeySeparator","userDefinedNsSeparator","possibleChars","matched","ki","looksLikeObjectPath","interpolator","nestingRegexp","lastKey","_this2","overloadTranslationOptionHandler","returnDetails","_this$extractFromKey","extractFromKey","appendNamespaceToCIMode","resUsedKey","usedKey","resExactUsedKey","exactUsedKey","resType","joinArrays","handleAsObjectInI18nFormat","i18nFormat","handleAsObject","returnObjects","returnedObjectHandler","resTypeIsArray","newKeyToUse","deepKey","extendTranslation","usedDefault","needsPluralHandling","hasDefaultValue","defaultValueSuffix","pluralResolver","getSuffix","defaultValue","isValidLookup","resForMissing","missingKeyNoValueFallbackToKey","updateMissing","fk","lngs","fallbackLngs","languageUtils","getFallbackCodes","fallbackLng","saveMissingTo","toResolveHierarchy","send","specificDefaultValue","defaultForMissing","missingKeyHandler","backendConnector","saveMissing","saveMissingPlurals","getSuffixes","appendNamespaceToMissingKey","parseMissingKeyHandler","_this3","defaultVariables","usedLng","usedNS","skipInterpolation","nestBef","skipOnVariables","nb","interpolate","na","nest","postProcess","postProcessorNames","applyPostProcessor","postProcessPassResolved","i18nResolved","_this4","extracted","fallbackNS","needsZeroSuffixLookup","ordinal","shouldUseIntlApi","needsContextHandling","codes","utils","hasLoadedNamespace","possibleKey","finalKeys","addLookupKeys","pluralSuffix","zeroSuffix","pluralSeparator","contextKey","contextSeparator","returnNull","returnEmptyString","resourceStore","capitalize","LanguageUtil","supportedLngs","formatLanguageCode","specialCases","lowerCaseLng","cleanCode","load","nonExplicitSupportedLngs","getLanguagePartFromCode","cleanedLng","isSupportedCode","lngOnly","supportedLng","getScriptPartFromCode","fallbackCode","fallbackCodes","addCode","sets","nr","_rulesPluralsTypes","deprecatedJsonVersions","suffixesOrder","zero","one","two","few","many","other","PluralResolver","compatibilityJSON","Intl","PluralRules","numbers","plurals","_unused","getRule","resolvedOptions","pluralCategories","pluralCategory1","pluralCategory2","pluralCategory","prepend","number","getSuffixRetroCompatible","noAbs","simplifyPluralSuffix","returnSuffix","ownKeys$3","_objectSpread$3","Interpolator","format","escapeValue","iOpts","useRawValueToEscape","prefixEscaped","suffixEscaped","formatSeparator","unescapePrefix","unescapeSuffix","nestingPrefix","nestingPrefixEscaped","nestingSuffix","nestingSuffixEscaped","nestingOptionsSeparator","maxReplaces","alwaysFormat","resetRegExp","regexpStr","regexpUnescapeStr","regexpUnescape","nestingRegexpStr","replaces","regexSafe","handleFormat","interpolationkey","missingInterpolationHandler","safeValue","todo","matchedVar","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","matchedSingleQuotes","matchedDoubleQuotes","formatters","doReduce","elem","ownKeys$4","_objectSpread$4","createCachedFormatter","cache","formatter","Formatter","formats","NumberFormat","currency","datetime","DateTimeFormat","relativetime","RelativeTimeFormat","range","ListFormat","_format","mem","_parseFormatStr","formatStr","formatName","formatOptions","optStr","_opt$split2","parseFormatStr","formatted","valOptions","formatParams","locale","ownKeys$5","_objectSpread$5","Connector","_isNativeReflectConstruct$2","backend","store","waitingReads","maxParallelReads","readingCalls","maxRetries","retryTimeout","languages","toLoad","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","reload","pendingCount","loaded","errors","addResourceBundle","_getLastOfPath2","removePending","loadedKeys","fcName","tried","queueLoad","loadOne","prepareLoading","_this5","fallbackValue","isUpdate","transformOptions","ownKeys$6","_objectSpread$6","I18n","_isNativeReflectConstruct$3","external","isInitialized","initImmediate","defOpts","preload","partialBundledLanguages","tDescription","createClassOnDemand","ClassOrObject","lu","on","languageDetector","detection","_this2$store","_this2$store2","deferred","finish","initializedStoreOnce","changeLanguage","usedCallback","append","resolvedLanguage","setResolvedLanguage","li","lngInLngs","hasLanguageSomeTranslations","isLanguageChangingTo","setLngProps","setLng","getBestMatchFromCodes","cacheUserLanguage","loadResources","detect","keyPrefix","fixedT","rest","resultKey","_this$translator","_this$translator2","exists","_this6","lastLng","loadNotPending","loadState","precheck","preResult","_this7","preloaded","newLngs","_this8","mergedOptions","createInstance","reloadResources","getFixedT","setDefaultNamespace","loadNamespaces","loadLanguages","LdI18Next","i18next","cz","translation","generic","logout","release","pageTitle","closeLabel","acceptLabel","userProfile","separateCharts","declineLabel","backToDashboard","footerLinks","gtct","contact","imprint","privacy","swHomepage","noInternetConnection","of","noData","dateFormat","downloaded","noDuration","timeFormat","notLicensed","alarmPending","back","save","view","custom","submit","export","alarms","refreshReset","selectAllCheckboxes","unselectAllCheckboxes","notAvailable","notConnected","file","dateTimeFormat","timeFormats","day","days","hour","year","hours","month","years","minute","months","second","minutes","seconds","notAvailableShort","timeFormatDuration","timeFormatWithoutSeconds","sweetalert","understood","upload","enrollment_code_409","limit_change_failed","qs","report","grid","columns","assets","tv","saa","directAccess","new","cOnePanel","sessionType","error_messages","kpi","shopfloor","fab_title","hall","contractEnd","cellPosition","operationStep","machineIdentifierSw","machineIdentifierCustomer","success","new_form_title","edit_form_title","name_short","description","name_not_specified","editSuccess","lineName","typeOfLoading","lineResponsible","plannedQuantity","numberOfMachines","discard","description_external","description_internal","machine","g_mode","service","spistat","toolMon","swimlane","collection","technology","maintenance","spindledata","remoteaccess","enduranceTest","administration","y_title","status_table_one","status_table_two","energymonitoring","technology_undefined","technology_undefined_condition","select_hall_label","select_line_label","select_company_label","select_location_label","s3","iotcore","startup","shipping","controller","machine_type","warranty_end","iotgreengrass","systemsManager","warranty_start","machine_swmp_api","machine_swsp_trace","machine_swcp_portal","start_of_production","machine_swcp_support","machine_cell_position","machine_swsp_line_mon","machine_identifier_customer","controller_not_specified","machine_type_not_specified","machine_identifier_customer_not_specified","move_form_title","trace","portal","lineMon","support","machineType","startupDate","warrantyEnd","warrantyStart","customerNumber","enrollmentConfig","startOfProduction","enrollmentConfigDownload","off_time","no_change","active_tool","tool_change","machining_time","tool_change_time","pie","chart","name_one","name_two","name_one_undefined","name_two_undefined","q_axis_and_spindle","undefined_gmode_data","auxiliary_process_time","undefined_activetool_data","undefined_tool_change_data","undefined_machining_time_table_one","undefined_machining_time_table_two","machining_auxiliary_tool_changing_table_one","machining_auxiliary_tool_changing_table_two","add_line_to_dashboard","unit","kpiUnit","kpiValue","kpiHeader","limitsLoad","limitsSave","selectAxis","limitsExport","openAxistest","axisTestPlural","adjustments","amplitude","spreadMultiplier","Equability","limitsUp","limitsDown","sliderSlopeCenter","sliderSlopeFactor","sliderVerticalOffset","sliderVerticalSpread","sliderQuadraticCenter","sliderQuadraticFactor","Circularity","clockwise","limitsClockwise","counterClockwise","sliderSineOffset","sliderSineAmplitude","sliderSineFrequency","limitsCounterClockwise","kpis","pulseVelocity","pulseMaxRampUp","pulseMaxRampDown","pulseMaxStiffness","pulseMinStiffness","pulseMeanStiffness","circularReversalRange","pulseMaxUpPathCurrent","pulseMinUpPathCurrent","pulseMeanUpPathCurrent","pulseMaxDownPathCurrent","pulseMinDownPathCurrent","pulseMeanDownPathCurrent","circularShapeDeviationClockwise","pulseStiffnessStandardDeviation","pulseStandardDeviationUpPathCurrent","pulseStandardDeviationDownPathCurrent","circularShapeDeviationCounterClockwise","axisTestTypes","CIRCLE","EQUABILITY","CIRCULARITY","listbox","noAxisTestAvailable","netcfg","cta","intro","goToNetconfig","device","enrollment","pic","line1","line2","line3","line4","line5","line6","line7","line8","deviceMigration","line9","line10","line11","line12","line13","generate","noChartMessage","toolmon","file_name","list_of_languages","de","es","fr","hu","it","ko","pl","tr","zh","file_not_valid","language_not_specified","manuals","version","contracts","components","spare_parts","consumeables","Update","remoteSupport","install","session","software_edge","box_id","machine_connect","operating_system","contact_service","email","phone_no","last_name","first_name","contact_person","list_of_types","request","retrofit","expansion","inspection","email_not_valid","phone_not_specified","message_not_specified","last_name_not_specified","first_name_not_specified","family_name_not_specified","contact_type_not_specified","software_machine","nc_version","hmi_version","plc_version","compile_cycles","pcu_base_version","plc_toolbox_version","plc_user_program_version","remoteSupportInitiate","maintenance_assistance","sub_title","open_assistant","request_account","onlineState","labelOnline","labelOffline","endurance","chartTitles","runtime","operation","qaxis_180","nc_program","stacklights","sendingState","aborted","sending","interrupted","alarms_map","sum","category","trend","flatlist","frequency","tableHeadlines","time","leftTime","alarmCount","alarmNumber","alarmOccured","alarmClassification","alarmCountSecondRange","flat","details","ncProgram","lastModified","machineState","numberAlarms","stopCondition","ncProgramState","protectionLevel","ncProgramStates","protectionLevels","cycleTime","yAxis","piececounter","ok","nok","titleDayCounter","titleShiftCounter","titleTotalCounter","titleTotalCounterSmall","availability","legend","auto","JOG_with_error","MDA_with_error","JOG_without_error","MDA_without_error","not_defined_condition","auto_no_program_active","auto_waiting_for_parts","auto_with_error_program_stopped","auto_waiting_for_parts_stopping_error","aggregated","inProduction","operationMode","runtimeMonitor","off","spindleOverride","feedrateOverride","uptimeDistribution","aws","groups","references","iot","ssm","greengrass","condition","bill","component","spindleData","point8","xAxis","air","consumption","conditionMonitoring","company","city","street","country","website","postalCode","locationName","locationCustomerNumber","worldmap","toggle_switch","zipcode","legal_form","company_logo","customer_number","industry_sector","city_not_specified","street_not_specified","country_not_specified","zipcode_not_specified","customer_number_not_specified","industry_sector_not_specified","coordinateselement","intro_text","intro_heading","location_name","label_latitude","label_longitude","text_fallback_info","text_location_found","text_location_entered","text_success_location","button_define_coordinates","text_no_coordinates_found","text_coordinates_success_set","button_set_custom_coordinates","text_specify_coordinates_yourself","hallName","companies","description_not_available","addMultiple","frameTitle","dashboard","tileTitle","sidebar","variables","bar","plc","area","char","long","real","true","word","dword","false","float","uword","double","plcint","boolean","integer","nckbool","nckbyte","opcmode","plcbool","plcbyte","plcchar","plcint8","plcreal","internal","nc_block","nckfloat","nckint16","nckint32","nckubyte","one_year","plcchar8","plcfloat","plcint16","plcint32","plcint64","plcubyte","plcuint8","nc_common","nckdouble","nckstring","nckuint16","nckuint32","one_month","plcchar16","plcstring","plcuint16","plcuint32","plcuint64","rectangle","ten_years","two_weeks","pclfloat64","plcfloat32","plcfloat64","plcstring8","six_months","categorical","plcstring16","signed_word","signed_dword","sinumerikone","unsigned_dword","hint","showId","maxTime","nckArea","dataType","nckBlock","chartType","namePrefix","variableId","collections","displayName","showInitial","opcUaAddress","visibilityType","namePrefixEdit","editError","downloads","statusCodes","s_0","s_1","s_930","s_931","s_932","s_933","s_934","s_935","s_936","duplication_deleted","listImport","listDownload","machines","manual","four","three","individual","sendMail","roles","gender","breadcrumb","main_group","phoneNumber","customer_org","last_modified","email_validation","statusText","unknown","archived","compromised","unconfirmed","reset_required","external_provider","force_change_password","email_not_match","roles_not_specified","gender_not_specified","main_group_not_specified","customer_organization_not_specified","failed","mail","message_for_edit","message_send_mail","button_back_to_last_page","confirmation","confirm","dismiss","visitor","customer","user","enabled","sw_admin","userRights","male","female","diverse","noResults","lines","callToAction","queued","completed","succeeded","timed_out","in_progress","not_installed","limits","datatype","text1","text2","text3","mainText","asset","changes","updateLimits","decline","info_accept","info_decline","info_accept_warning","runtimeStatus","timeFilter","machine_time","controller_time","iot_gateway_time","charts","tooltipDateFormat","exporting","datetimeformat","globalSettings","loading","resetZoom","weekdays","shortMonths","shortWeekdays","increaseDateRange","datepicker","presets","rangeTo","selectDateRange","predefined","today","last7days","yesterday","last24Hours","last5Minutes","variable","i18n","chooseLanguagePhrase","runtimeStatusList","move_left","move_right","add_custom_card","missingMachine","e_0","e_1xx","e_2xx","e_3xx","e_400","e_401","e_403","e_404","e_405","e_406","e_409","e_418","e_422","e_4xx","e_500","e_5xx","e_900","e_901","e_902","e_903","e_904","e_905","e_906","e_910","e_911","e_912","e_920","e_921","e_922","e_923","e_924","e_925","e_926","e_927","e_928","e_929","e_930","e_931","e_932","e_933","e_934","e_10500","e_10501","e_409_asset","e_410_asset","maxAmountReached","qualityAnalysis","reporting","no_files_text","file_cardTitle","no_alarms_text","nc_comp","nc_data","tool_mon","nc_comparison_download","column_title_trigger","column_title_filename","column_title_creation_date","flight_recorder","data_warehouse","data_warehouse_csv","data_warehouse_json","data_warehouse_excel","refreshConfig","score","state_a_u","g_function","analyzer_ok","bad_workpiece","spindle_active","tech_finalized","p8_toolmon_active","p8_toolmon_skip_step","target_spindle_speed","p8_toolmon_bad_workpiece","p8_toolmon_delta_t_first_g1","p8_toolmon_n_encoder_strokes","p8_toolmon_analyzer_check_result","p8_tool_breakage_sensitivity_limit","p8_toolmon_tool_life_and_skip_step","p8_tool_breakage_step_end_increasing","undefined_table_data","undefined_analyzer_data","measurementSeries","da","mk","nl","pt","ro","sk","sl","sv","chartTitleIconText","bad","plus","minus","short","tags","column","onChange","bufferSize","uiRelevant","intervalInS","brokerDataType","classicAddress","descriptionText","machineDataType","symbolicAddress","dataTypeSelection","addMachineType","removeDescription","removeMachineType","allLocalesUsed","minOneDescription","descriptionInstance","machineTypeInstance","s_937","s_938","message_variables","message_collections","common","descriptions","addDescription","invalidId","warning","maxSelectableDays","tile","collectionName","add_new_title","collectionId","setZoomToDatepicker","csv","excel","missing","export_type","informationSecurity","subtitle","footer","agb","copyright","impressum","datenschutz","psirt","headers","severity","advisoryId","releaseDate","affectedProduct","section1","section2","section3","advisories","linksDownloads","securityTxt","dataProtection","vulnerabilityGuideline","e_935","e_409_variables","e_409_collections","toolmon_health","hydraulic_cylinder","locales","files","LdI18NextMixin","LitElement","requestUpdate","LdTranslate","LdTranslationExists","LdGetLanguage","LdGetArray","LdChangeLanguage","LdChartStyles","LdIconsCommunication","LdIconsDocument","LdIconsFeature","LdIconsNavigation","LdIconsObject","LdIconsUtil","LdIconsVis","LdIconStyles","unsafeCSS","_THEME","colors","secondary_note_color","LdIcon","LdLoadingSpinnerInlineStyles","displayFlex","horizontal","centerAligned","centerAlignedContent","centerJustified","LdLoadingSpinnerInline","LdDatepickerStyles","LdDatepickerConfig","startDate","addTitle","noTimeSelect","singleDaySelect","noPresets","blockFutureDates","date","_settings","refreshDate","customDate","numberOfCustomDays","showedErrorMessage","disabledCustomButton","blockreload","disabledMaxInformation","monthsShort","weekdaysShort","placeholderTitle","placeholderTitleActiveColor","placeholderTitleColor","refreshTitle","calc","startDay","endDay","startTime","endTime","refresh","setNewCustomValuesToDateSelection","maxSelectableDaysInformation","ifDefined","_onPresetEvent","LdErrorHandler","_handleError","setCustomDateRange","getStartDate","moment","setCustomTimeRange","getStartTime","_this$_settings$","localStorage","getItem","inList","setCustomButton","LdFormStyles","primary_background_color","primary_color","secondary_text_color","primary_highlight_color","TableCSVExporter","filters","sorters","convertToCSV","filteredRows","filterRows","sortedRows","sortRows","parseHeader","parseCell","rowValue","typeOfValue","getTypeOfValue","parsedFilterValue","parseFilterValue","sorter","aRow","bRow","aRowValue","bRowValue","isNumber","parsedValue","columnId","eval","formatCellContent","cellFormatters","_defineProperty","trendFormatter","_fallbackFormatter","trendDirectionValue","GridColumnGroup","_childColumns","_getChildColumns","flexGrow","_visibleChildColumns","_colSpan","_rootColumns","_addNodeObserver","_updateFlexAndWidth","_columnPropChanged","_preventHiddenSynchronization","_updateVisibleChildColumns","frozen","_lastFrozen","frozenToEnd","_firstFrozenToEnd","_groupOrderChanged","rootColumns","_order","LN10","_groupReorderStatusChanged","reorderStatus","_reorderStatus","_groupResizableChanged","childColumns","col","_updateAutoHidden","prev","_setWidth","_setFlexGrow","__scheduleAutoFreezeWarning","frozenProp","_grid","frozenAttr","firstColumnFrozen","every","__autoFreezeWarningDebouncer","_groupFrozenChanged","_groupFrozenToEndChanged","_groupHiddenChanged","__groupHiddenInitialized","_synchronizeHidden","wasAutoHidden","_autoHidden","_colSpanChanged","colSpan","headerCell","footerCell","_a11yUpdateCellColspan","_isColumnElement","_updateColumnTree","InputContainer","fieldButton","requiredField","inputFieldShared","ErrorController","_host","__updateErrorId","__updateHasError","errorId","setErrorMessage","setInvalid","initCustomNode","errorNode","teardownNode","getSlotChild","defaultNode","attachDefaultNode","initNode","__isNotEmpty","hasError","defaultId","FieldAriaController","__required","setTarget","__target","__setAriaRequiredAttribute","__setLabelIdToAriaAttribute","__labelId","__setErrorIdToAriaAttribute","__errorId","__setHelperIdToAriaAttribute","__helperId","setRequired","setLabelId","labelId","setErrorId","setHelperId","helperId","__isGroupField","oldLabelId","__setAriaAttributeId","oldErrorId","oldHelperId","newId","oldId","HelperController","helperNode","__updateHelperId","__observeHelper","hasHelper","__hasHelper","__toggleHasHelper","_node","__helperIdObserver","__applyDefaultHelper","helperText","setHelperText","hasHelperText","slotFactory","__helperObserver","isHelperMutation","ValidateMixin","superclass","isValid","_shouldSetInvalid","_invalid","FieldMixin","ariaTarget","_errorId","_errorController","_errorNode","_helperId","_helperController","_helperNode","_fieldAriaController","_labelController","hasLabel","__labelChanged","__helperChanged","addController","labelNode","_errorMessageChanged","_helperTextChanged","_ariaTargetChanged","InputConstraintsMixin","constraints","delegateAttrs","_createConstraintsObserver","_hasValidConstraints","__isValidConstraint","_constraintsChanged","stateTarget","hasConstraints","isLastConstraintRemoved","__previousHasConstraints","_hasValue","constraint","stylesMap","SlotStylesMixin","slotStyles","__applySlotStyles","rootStyles","getRootStyles","insertStyles","InputControlMixin","allowedCharPattern","clearButtonVisible","_boundOnPaste","_onPaste","_boundOnDrop","_onDrop","_boundOnBeforeInput","_onBeforeInput","clearElement","_onClearButtonClick","_onClearButtonMouseDown","__clear","_onEscape","_addInputListeners","_removeInputListeners","_onKeyDown","__shouldAcceptKey","_markInputPrevented","_preventInputDebouncer","__allowedCharRegExp","pastedText","clipboardData","getData","__allowedTextRegExp","draggedText","dataTransfer","_allowedCharPatternChanged","charPattern","InputFieldMixin","_inputElementChanged","__dataValue","PatternMixin","preventInvalidInput","_checkInputValue","_inputDebouncer","_preventInvalidInputChanged","clearButton","TextField","_setType","_setInputElement","_setFocusElement","_tooltipController","setPosition","GridFilter","child","_filterChanged","connected","_previousValue","_debouncerFilterChanged","GridFilterColumn","__boundOnFilterValueChanged","__onFilterValueChanged","_defaultHeaderRenderer","_column","textField","_filterValue","__rendererValue","__getHeader","_computeHeaderRenderer","_generateHeader","GridSelectionColumnBaseMixin","selectAll","autoSelect","dragSelect","_indeterminate","_selectAllHidden","__onSelectAllCheckedChanged","__isChecked","__rendererChecked","_defaultRenderer","__onSelectRowCheckedChanged","__onCellTrack","__onCellMouseDown","__onCellClick","__item","_selectAll","_deselectAll","_selectItem","_deselectItem","__dragCurrentY","__dragDy","dragStartRow","_getVisibleRows","__dragSelect","_isSelected","_item","__dragStartIndex","__dragStartItem","__dragAutoScroller","renderedRows","hoveredRow","rowRect","hoveredIndex","scrollableArea","__getScrollableArea","_firstVisibleIndex","_lastVisibleIndex","scrollTriggerArea","percentage","gridRect","headerRect","footerRect","GridSelectionColumn","__previousActiveItem","__boundOnActiveItemChanged","__onActiveItemChanged","__boundOnDataProviderChanged","__onDataProviderChanged","__boundOnSelectedItemsChanged","__onSelectedItemsChanged","__onSelectAllChanged","__selectAllInitialized","_selectAllChangeLock","__hasArrayDataProvider","__withFilteredItemsArray","__arrayContains","selectItem","deselectItem","activeItem","_toggleItem","dataProvider","params","page","pageSize","sortOrders","_mapFilters","GridSorter","_isConnected","_onClick","__removeSorters","_pathOrDirectionChanged","__dispatchSorterChangedEvenIfPossible","__isConnectedChanged","shiftClick","_shiftClick","fromSorterClick","_fromSorterClick","_getDisplayOrder","GridSortColumn","__boundOnDirectionChanged","__onDirectionChanged","__rendererDirection","GridTreeToggle","leaf","expanded","HTMLLabelElement","_levelChanged","GridTreeColumn","itemHasChildrenPath","__boundOnExpandedChanged","__onExpandedChanged","__defaultRenderer","__rendererExpanded","__isLeafItem","__getToggleContent","_computeRenderer","_itemHasChildrenPathChanged","expandItem","collapseItem","Material","colorLight","colorDark","colorBase","$tpl","font","templatizer","__component","__TemplateClass","__templateInstances","__templateInstance","__hasTemplateInstance","__isTemplateInstanceAttachedToDOM","__updateProperties","__disposeOfTemplateInstance","__createTemplateInstance","__createTemplateClass","accum","GridTemplatizer","_onItemPropertyChanged","__grid","_onExpandedPropertyChanged","_path","_onSelectedPropertyChanged","_onDetailsOpenedPropertyChanged","detailsOpened","openItemDetails","closeItemDetails","__gridElement","createRenderer","TemplatizerClass","_owner","__templatizer","__templatized","assignRenderer","rendererName","oldRenderer","processTemplates","__suppressTemplateWarning","showTemplateWarning","processGridTemplate","__gridColumnElement","processGridColumnTemplate","processTemplate","Vaadin","templateRendererCallback","__templateObserver","observeTemplates","menuOverlayCore","menuOverlay","contextMenuOverlay","ItemMixin","_hasVaadinItemMixin","_activeKeys","_shouldSetActive","_selectedChanged","Item","KeyboardDirectionMixin","_getItems","_getAvailableIndex","_vertical","currentIdx","increment","dirIncrement","__isPrevKey","__isNextKey","_focus","navigating","_focusItem","totalItems","__isMatchingItem","ListMixin","_hasVaadinListMixin","orientation","_searchBuf","_filterItems","_enhanceItems","_setFocusable","itemToSelect","_scrollToItem","_searchKey","_searchReset","__isMatchingKey","_isItemHidden","firstItem","_scrollerElement","scrollerRect","nextItemRect","prevItemRect","scrollDistance","pixels","scrollType","detectScrollType","getNormalizedScrollLeft","setNormalizedScrollLeft","MultiSelectListMixin","_onMultipleClick","_enhanceMultipleItems","selectedId","_scrollToLastSelectedItem","lastSelectedItem","_multipleChanged","ListBox","_checkImport","instances","FocusTrapController","__trapNode","__onKeyDown","hostConnected","hostDisconnected","trapFocus","trapNode","__focusableElements","__focusedElementIndex","releaseFocus","backward","__focusNextElement","focusableElements","currentIndex","Overlay","modeless","focusTrap","restoreFocusNode","_mouseDownInside","_mouseUpInside","_instance","_originalContentPart","_contentNodes","_oldOwner","_oldModel","_oldTemplate","_oldRenderer","_oldOpened","_boundMouseDownListener","_mouseDownListener","_boundMouseUpListener","_mouseUpListener","_boundOutsideClickListener","_outsideClickListener","_boundKeydownListener","_keydownListener","_setTemplateFromNodes","_boundIronOverlayCanceledListener","_ironOverlayCanceled","_boundIosResizeListener","_detectIosNavbar","__focusTrapController","backdrop","landscape","requestContentUpdate","_last","_ensureTemplatized","wasOpened","_getActiveElement","_animatedOpening","_addGlobalListeners","_animatedClosing","_removeGlobalListeners","_hiddenChanged","_flushAnimation","_shouldAnimate","_enqueueAnimation","_attachOverlay","_enterModalState","_finishOpening","_placeholder","bringToFront","_finishClosing","_detachOverlay","_exitModalState","_deepContains","__attachedInstances","__zIndex","_modelessChanged","_previousDocumentPointerEvents","_removeOldContent","_stampOverlayTemplate","_Templatizer","templateRoot","_templateRoot","scopeCssText","_removeNewRendererOrTemplate","oldTemplate","_templateOrRendererChanged","ownerOrModelChanged","templateChanged","rendererChanged","openedChanged","_$litPart$","frontmost","_cancelTimer","touchJob","touchStartCoords","_timerId","_fired","_setSourceEvent","__composedPath","contextmenu","PROP_NAMES_VERTICAL","PROP_NAMES_HORIZONTAL","targetResizeObserver","ResizeObserver","entry","__overlay","_updatePosition","PositionMixin","noHorizontalOverlap","noVerticalOverlap","requiredVerticalSpace","__onScroll","__addUpdatePositionEventListeners","__removeUpdatePositionEventListeners","__positionTargetAncestorRootNodes","__overlayOpenedChanged","unobserve","computedStyle","__margins","propName","__isRTL","__positionSettingsChanged","shouldAlignStartVertically","__shouldAlignStartVertically","justifyContent","shouldAlignStartHorizontally","__shouldAlignStartHorizontally","flexStart","alignItems","overlayRect","verticalProps","__calculatePositionInOneDimension","horizontalProps","rtl","contentWidth","__oldContentWidth","viewportWidth","defaultAlignLeft","__shouldAlignStart","contentHeight","__oldContentHeight","viewportHeight","defaultAlignTop","contentSize","viewportSize","margins","defaultAlignStart","propNames","spaceForStartAlignment","spaceForEndAlignment","spaceForDefaultAlignment","__adjustBottomProperty","cssPropNameToSet","adjustedProp","__oldViewportHeight","__oldViewportWidth","shouldAlignStart","cssPropNameToClear","adjustedValue","valueToSet","ContextMenuOverlay","parentOverlay","getFirstChild","_themeChanged","getBoundaries","contentRect","yMax","parentStyle","xMax","xMin","paddingLeft","paddingRight","paddingBottom","paddingTop","MediaQueryController","query","_boundQueryHandler","_queryHandler","_mediaQuery","mediaQuery","ContextMenuItemElement","ContextMenuListBox","ItemsMixin","__itemsOutsideClickListener","__forwardFocus","__openSubMenu","subMenu","itemElement","listenOn","subMenuOverlay","_setParentOverlay","__itemsRenderer","menu","__initMenu","closeOn","_setMenuItemTheme","_theme","__toggleMenuComponentAttribute","hostTheme","openOn","expandedItem","isRTL","__openListenerActive","openSubMenu","ContextMenu","_context","_boundClose","_boundOpen","_phone","_touch","_wide","_wideMediaQuery","_boundOnGlobalContextMenu","_onGlobalContextMenu","__boundOnScroll","_overlayElement","_onOverlayOpened","_setOpened","__alignOverlayPosition","_onVaadinOverlayOpen","_targetOrOpenOnChanged","_oldListenOn","_oldOpenOn","_unlisten","webkitTouchCallout","webkitUserSelect","userSelect","_listen","_touchOrWideChanged","wide","_setListenOnUserSelect","getSelection","removeAllRanges","_closeOnChanged","oldCloseOn","evtOverlay","_preventDefault","_rendererChanged","_contextTarget","targets","__x","_getEventCoordinate","__pageXOffset","__y","__pageYOffset","yDiff","xDiff","__adjustPosition","coord","wdthVport","hghtVport","_setEndAligned","LdGridStyles","trafficlight_yellow","trafficlight_gray","fab_background","LdAvailabilitySwimlaneChart","machineId","chartValue","chartSize","chartContainerSize","_chartConfig","_chartData","_chartId","_extremes","_loading","__chartFetchData","__onlyInitialTimestamp","createChartId","__multiTimelineData","_updateXAxisExtremes","_createChartConfiguration","_updateChartData","timeseries","panning","credits","startOnTick","endOnTick","showLastLabel","showFirstLabel","gridLineWidth","dateTimeLabelFormats","minRange","minTickInterval","plotOptions","columnrange","grouping","borderWidth","series","pointPlacement","marker","turboThreshold","legendItemClick","polygon","lineWidth","shape","positioner","outside","useHTML","followPointer","indexX","point","indexY","dataMax","customUi","createSetZoomToDatepickerButton","timeseriesData","_advancedSeries","_initial","initial","_values","_turboThreshold","_conditions","availability_chart_colors","jog_with_error","jog_without_error","mda_without_error","mda_with_error","_initialValue","_valuesLength","_nextIndex","_nextTimestamp","_newElement","redraw","LdGrid","gridItems","gridTitle","gridColumns","multiSort","saveGridSorting","gridId","userInformation","exportCsv","exportCsvStyle","_addGridEventListener","paginationToken","maxEntries","_currentFilter","_this$shadowRoot","_searchAndFilterHeaderRenderer","_columnRenderer","_this$shadowRoot2","_onSorterClick","__searchAndFilterHeaderRenderer","_contextMenuOptions","_contextMenuPrefix","_contextMenuField","_contextMenuSuffix","_contextMenuOptionsLength","_contextMenuLinksLength","subkey","subKey","assetId","timestamp","visible_for_user_group","getUserRoles","_columnWidth","column_width","_disableTitle","disable_title","_linkPrefix","_linkField","_linkSuffix","_iotOnlineTime","onlineTime","_iotColor","_visible_for_id","visible_for_id","contextMenuOptions","inputOptions","userIsAllowedToSeeItem","initialSort","sortPath","column_align","__columnRenderer","getDataProvider","_onDownloadCsvClick","filterValuesChanged","filterName","filterType","_initialSort","_filter","toBoolean","_sort","_sortPath","gridColumn","filterDefinition","filterData","_vaadinGridSorter","_vaadinGridFilter","filterId","handleCurrentFilterUpdate","handleCurrentFilterBlur","_undoFilterHighlight","_lastSelectedFilter","vaadinGrid","clearCache","rowData","_subKey","_iconSrc","_iconTitle","_chart","_assetId","_dateRange","_columnAlign","_event","visibleForId","_link","_inputOptions","_vaadinItem","_output","createGridOutput","_vaadinGrid","rowIndexAttribute","cssClasses","columnDefinition","mergedRenderOptions","clampLinesTo","renderOptions","isAllowedToSeeItem","getVaadinGridFilters","getVaadinGridSorters","csvOutput","__gridItems","__gridColumns","csvBlob","Blob","blobUrl","createObjectURL","anchorElement","filtersRaw","_filters","sortersRaw","_sorters","dispatch","saveUserSetting","allValues","vaadinGridTextField","vaadinGridNumberField","vaadinGridIntegerField","numberField","integerField","_dataProvider","createColumn","descriptionRenderOptions","descriptionRenderOptionsTwoLines","LdOnlinestateAssetsStyles","LdAssetsOnlinestate","hidePrefix","hideSuffix","chartId","_machineState","_machineTimeOut","_machineIds","_sendRequest","_interval","loadMultiCurrentValue","rewriteTimeseriesVariableToId","_updateData","emptyMultiCurrentValue","_intervalInMs","interval","shortTime","getMachineOnlinestate","stateChanged","_machineTimeOutValue","multiCurrentValueList","isMultiCurrentValueLoading","LdTimeseriesReducer","_multiCurrentValueList","statusValues","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","objectToString","nativeMax","nativeMin","toNumber","isObjectLike","isSymbol","isBinary","func","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","maxing","trailing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","remainingWait","debounced","isInvoking","leadingEdge","LdSearchStyles","search_field_background_color","fonts","main_font","search_field_text_color","icon_button_color","default_borders_color","search_field_item_background_color","LdSearchResultGenericTemplate","firstLine","secondLine","_click","preventNavigation","LdSearchResultMachine","uri","getUUID","LdSearchResultTemplateSelector","LdSearchResults","resultsArray","_computeResultArray","abortController","AbortController","signal","requestPromise","LdFetch","getUrl","base_url","search_all","CONFIG","abort","LdSearchInput","minChars","resultsOpened","resultsFound","_searchFieldTimeout","_pendingRequest","returnDataMode","_blurListener","_focusListener","_resultKeydownListener","_debouncedExecuteSearch","_executeSearch","inputReference","resultWidth","_searchInputChanged","_resultSelected","paperItems","_getResultEntries","selectedItemIndex","paperItem","getElementById","replaceAll","searchService","response","hits","hit","searchResultTemplates","searchResultTemplate","LdTabStyles","LdTabs","routeData","innerTab","_tabElement","allTabs","_getFirstTabItem","justified","endJustified","endAligned","transformMachine","machineFromSearchApi","LdAssetsHeader","arrowDisabled","menuEnabled","menuEnabledLine","renderedCards","lineList","machineList","_openedMenu","_closeMenu","Layouts","LdAssetsHeaderStyles","emptyAssets","_closeDetailMenu","menus","_toggleDetailView","_toggleDetailMenu","_onMenuItemClick","_loadDashboard","dashboardCards","dashboardLinesLoading","LdAssetsReducer","setting","LdUsersReducer","_confirmDashboard","savedSettings","loadCards","MAX_MACHINES_ON_DASHBOARD","line_id","line_name","cards","default_accent_color","vertical","selected_burger_menu","icons_active_color","primary_text_color","assetsMap","_locations","layerGroupName","urlBase","LdPlatformModulesLeafletStyles","tileLayer","attribution","addTo","markers","coordinates","latitude","longitude","bindPopup","group","featureGroup","fitBounds","getBounds","zoom","flexToSize","fitToMarkers","fitToMarkersPadding","fitToMarkersZoom","Icon","Default","imagePath","makeStyles","cssImpl","unsafeCSSImpl","fab_secondary_background","button_background_color","LdPlatformModulesAssetsStyles","LdPlatformModulesAssetsStyles_lit","css_lit","unsafeCSS_lit","UPDATE_LOCATION","START_LOADING_SUBMIT","FINISH_LOADING_SUBMIT","ERROR_LOADING_SUBMIT","CLEAR_SUBMIT","START_LOADING_MANUALS","FINISH_LOADING_MANUALS","ERROR_LOADING_MANUALS","START_DOWNLOAD_LOADING_FILES","FINISH_DOWNLOAD_LOADING_FILES","ERROR_DOWNLOAD_LOADING_FILES","CLEAR_DOWNLOAD_LOADING_MANUALS","START_UPLOAD","FINISH_UPLOAD","ERROR_UPLOAD","ERROR_LOADING_VERSIONS","FINISH_LOADING_VERSIONS","START_LOADING_VERSIONS","FINISH_LOADING_RELEASE_INFO","ERROR_LOADING_RELEASE_INFO","START_LOADING_RELEASE_INFO","FINISH_FILES_DELETE","START_FILES_DELETE","ERROR_FILES_DELETE","START_LOADING_SUBMIT_NAME","FINISH_LOADING_SUBMIT_NAME","ERROR_LOADING_SUBMIT_NAME","FINISH_LOADING_UPLOAD","START_LOADING_UPLOAD","ERROR_LOADING_UPLOAD","FINISH_LOADING_NCSTATE","START_LOADING_NCSTATE","ERROR_LOADING_NCSTATE","FINISH_LOADING_TVGROUPS","START_LOADING_TVGROUPS","ERROR_LOADING_TVGROUPS","FINISH_POST_TV","START_POST_TV","ERROR_POST_TV","FINISH_LOADING_TVDEPLOYMENT","START_LOADING_TVDEPLOYMENT","ERROR_LOADING_TVDEPLOYMENT","FINISH_LOADING_TVLINKS","START_LOADING_TVLINKS","ERROR_LOADING_TVLINKS","START_LOADING_GROUPS","FINISH_LOADING_GROUPS","ERROR_LOADING_GROUPS","START_ADD","FINISH_ADD","ERROR_ADD","START_EDIT","FINISH_EDIT","ERROR_EDIT","START_DELETE","FINISH_DELETE","ERROR_DELETE","FINISH_LOADING_LINKS","START_LOADING_LINKS","ERROR_LOADING_LINKS","updateLocation","getState","_decodedPathname","history","replaceState","splitPath","pageModule","subModules","receiveSubmit","successSubmit","errorReceivingSubmit","submitForm","payload","put","fileUpload","putFile","successUpload","receiveFileUpload","errorFileUpload","submitFileForm","submitPUTFileForm","LdApplicationReducer","clearSubmitRequest","clearManuals","receiveServiceManuals","serviceManuals","errorReceivingServiceManuals","loadServiceManuals","endpoints","loadFiles","receiveUploadFiles","errorReceivingUploadFiles","uploadFiles","endpoint","_postBody","postFileForm","uploadNetcfg","loadServiceVersions","serviceVersion","receiveServiceVersions","errorReceivingServiceVersions","checkRelease","activeRelease","releaseInfo","receiveReleaseInfo","errorReleaseInfo","loadServiceNcState","serviceNC","receiveServiceNcState","errorReceivingServiceNcState","deleteFiles","filesDelete","receiveFilesDelete","errorReceivingFilesDelete","submitFileName","patch","successSubmitName","receiveSubmitName","errorReceivingSubmitName","loadTVGroups","groupName","teamviewer_install","TvInstallInformation","receiveTVGroups","errorReceivingTVGroups","loadTvDeployment","teamviewer_deployment","TvDeploymentInformation","receiveTvDeployment","errorReceivingTvDeployment","loadGroups","groupInformation","receiveGroups","errorReceivingGroups","postTVGroups","errorCallback","postTvInstallInformation","receivePostTVGroups","errorPostTVGroups","loadTVLinks","tvLinks","receiveTVLinks","errorReceivingTVLinks","loadLinks","releaseNotes","receiveLinks","errorReceivingLinks","editItem","valueType","executeEdit","editValue","receiveEdit","errorEdit","executeAdd","addValue","receiveAdd","errorAdd","deleteItem","itemDelete","receiveDelete","errorReceivingDelete","companyId","save_user_settings","START_LOADING_ASSETS","FINISH_LOADING_ASSETS","ERROR_LOADING_ASSETS","START_DASHBOARD_LINES","FINISH_DASHBOARD_LINES","ERROR_DASHBOARD_LINES","START_COORDINATES_BY_ADDRESS","FINISH_COORDINATES_BY_ADDRESS","ERROR_COORDINATES_BY_ADDRESS","START_ADD_ASSET","FINISH_ADD_ASSET","ERROR_ADD_ASSET","START_EDIT_ASSET","FINISH_EDIT_ASSET","ERROR_EDIT_ASSET","CLEAR_EDIT_ASSET","CLEAR_ADD_ASSET","CLEAR_DELETE_ASSET","START_LOADING_MACHINES_BY_MACHINETYPE","FINISH_LOADING_MACHINES_BY_MACHINETYPE","ERROR_LOADING_MACHINES_BY_MACHINETYPE","EMPTY_ASSETS","START_SHOPFLOOR_LIST","FINISH_SHOPFLOOR_LIST","ERROR_SHOPFLOOR_LIST","START_SHOPFLOOR_DELETE","FINISH_SHOPFLOOR_DELETE","ERROR_SHOPFLOOR_DELETE","START_SHOPFLOOR_LINK","FINISH_SHOPFLOOR_LINK","ERROR_SHOPFLOOR_LINK","START_READ_CUSTOMER_NUMBER","FINISH_READ_CUSTOMER_NUMBER","ERROR_READ_CUSTOMER_NUMBER","START_ASSET_DELETE","FINISH_ASSET_DELETE","ERROR_ASSET_DELETE","RESET_COORDINATES","loadAssets","assetType","successCallback","assetsList","receiveAssetsList","errorReceivingAssetsList","industrySectors","controllers","getWithoutAuthorization","loadMachinesByMachineType","machineTypeId","base_endpoint","machinesList","receiveMachinesListByMachineType","errorReceivingMachinesListByMachineType","limitMachines","lineToCard","getWorldmap","getCustomListCards","dashboardCard","isSameCard","pendingRessources","userService","dashboardService","possibleCards","getPossibleCards","possibleCard","matchingCard","saveOldLength","uniqueIds","isDuplicate","userId","getCoordinatesByAddress","_addressFormatted","_url","geo_reference_url","getCoordinates","receiveCoordinatesByAddress","errorReceivingCoordinatesByAddress","resetCoordinates","newAsset","addAssetValue","receiveAddAsset","errorAddAsset","START_CHANGING_LIMITS","FINISH_CHANGING_LIMITS","ERROR_CHANGING_LIMITS","ACK_ERROR_CHANGING_LIMITS","changeLimits","callbackSuccess","callbackError","editAsset","editAssetValue","receiveEditAsset","errorEditAsset","clearAssetRequest","deleteAsset","assetDelete","receiveAssetDelete","errorReceivingAssetDelete","viewFile","downloadFile","downloadEnrollmentConfiguration","acceptHeader","localstorage","token_key","idToken","jwtToken","XMLHttpRequest","responseType","setRequestHeader","onload","blob","disposition","getResponseHeader","revokeObjectURL","downloadCSV","createRandomId","onSuccess","requestStatus","locationHeader","downloadId","onerror","START_LOADING_CURRENT","FINISH_LOADING_CURRENT","ERROR_LOADING_CURRENT","START_LOADING_MULTI_CURRENT","FINISH_LOADING_MULTI_CURRENT","ERROR_LOADING_MULTI_CURRENT","EMPTY_MULTI_CURRENT","START_LOADING_AVAILABILITY_KPI_IOT","FINISH_LOADING_AVAILABILITY_KPI_IOT","ERROR_LOADING_AVAILABILITY_KPI_IOT","START_LOADING_MULTI_TIMELINE","FINISH_LOADING_MULTI_TIMELINE","ERROR_LOADING_MULTI_TIMELINE","REMOVE_ENTRY_MULTI_TIMELINE","START_LOADING_CHART","FINISH_LOADING_CHART","ERROR_LOADING_CHART","START_LOADING_WORKPIECE_COUNTER","FINISH_LOADING_WORKPIECE_COUNTER","ERROR_LOADING_WORKPIECE_COUNTER","START_LOADING_DETAILS","FINISH_LOADING_DETAILS","ERROR_LOADING_DETAILS","START_LOADING_ALARMS","FINISH_LOADING_ALARMS","ERROR_LOADING_ALARMS","CLEAR_ALARMS","START_LOADING_OVERRIDE","FINISH_LOADING_OVERRIDE","ERROR_LOADING_OVERRIDE","START_SINGLE_VARIABLE","FINISH_SINGLE_VARIABLE","ERROR_SINGLE_VARIABLE","START_VARIABLES_LIST","FINISH_VARIABLES_LIST","ERROR_VARIABLES_LIST","START_COLLECTIONS_LIST","FINISH_COLLECTIONS_LIST","ERROR_COLLECTIONS_LIST","START_SINGLE_COLLECTION","FINISH_SINGLE_COLLECTION","ERROR_SINGLE_COLLECTION","START_VARIABLES_WITH_LIMITS_LIST","FINISH_VARIABLES_WITH_LIMITS_LIST","ERROR_VARIABLES_WITH_LIMITS_LIST","CLEAR","EMPTY_ITEM","EMPTY_ACTIVE_VARIABLE","EMPTY_ACTIVE_COLLECTION","CLEAR_AVAILABILITY_KPI_IOT","TIMESERIES_BACKEND","ALARM_BACKEND","alarm","emptyObject","emptyItem","emptyActiveVariable","emptyActiveCollection","clearRequest","machineIds","newSendRequestCheckup","sendRequest","multi_timeline","multiCurrentValueResult","receiveMultiCurrentValue","errorMultiCurrentValue","receiveAvailabilityKpiIoTValue","iotValueList","kpiValueList","errorAvailabilityKpiIoTValue","loadAvailabilityKpiIoT","endpointIoT","endpointKpi","clearAvailabilityKpiIoT","receiveMultiTimeline","loadMultiTimeline","multiTimelineResult","errorMultiTimeline","removeEntryFromMultiTimeline","receiveChartValue","loadChartValue","endpointChart","errorChartValue","loadWorkpieceCounter","workpiece_counter","workpieceData","receiveWorkpieceCounterData","errorWorkpieceCounterData","receiveDetailsData","detailData","loadDetails","tiles","detail_tile","detailsData","errorDetailsData","receiveAlarmsValue","alarmsType","alarmsId","clearAlarmsValue","loadAlarmsWithTime","endpointAlarms","selectedTimeFilter","getUTCTime","alarmsValue","errorAlarmsValue","receiveCurrentData","loadCurrentData","errorCurrentData","receiveVariablesList","variablesList","errorReceivingVariablesList","loadVariables","receiveVariableWithId","loadVariableWithId","errorReceivingVariableWithId","exportDatawarehouseData","exportType","datawarehouse","loadVariablesWithLimits","variablesWithLimitsList","receiveVariablesWithLimitsList","receiveCollectionsList","collectionsList","requestId","loadCollections","VisibilityType","External","errorReceivingCollectionsList","receiveSingleCollection","loadCollectionWithId","errorReceivingSingleCollection","START_LOADING_USER_LIST","FINISH_LOADING_USER_LIST","ERROR_LOADING_USER_LIST","START_ADD_USER","FINISH_ADD_USER","ERROR_ADD_USER","CLEAR_ADD_USER","START_EDIT_USER","FINISH_EDIT_USER","ERROR_EDIT_USER","CLEAR_EDIT_USER","START_DELETE_USER","ERROR_DELETE_USER","FINISH_DELETE_USER","CLEAR_DELETE_USER","START_LOADING_USER_COMPANY_INFO","FINISH_LOADING_USER_COMPANY_INFO","ERROR_LOADING_USER_COMPANY_INFO","CLEAR_USER_COMPANY_INFO","START_LOADING_USER_INFORMATION_OVER_ID","FINISH_LOADING_USER_INFORMATION_OVER_ID","ERROR_LOADING_USER_INFORMATION_OVER_ID","START_WRITE_USER_SETTINGS","FINISH_WRITE_USER_SETTINGS","ERROR_WRITE_USER_SETTINGS","FINISH_UPDATE_OWN_USER","ERROR_UPDATE_OWN_USER","START_UPDATE_OWN_USER","START_MAIL_USER","FINISH_MAIL_USER","ERROR_MAIL_USER","CLEAR_MAIL_USER","USERS_BACKEND","errorAddUser","addUser","addAuthToUser","extractUuidFromURI","receiveAddUser","errorEditUser","editUser","user_edit","userEdit","receiveEditUser","userUuid","userCompany","requestUrl","auth","asset_id","user_id","deleteUser","user_delete","deletedUser","errorDeleteUser","clearUserRequest","clearCompanyInfo","loadUserInformationOverId","accountinfo","userinfo","userInfoId","receiveLoadUserInformationOverId","companyInfo","receiveLoadUserCompanyInfo","errorReceivingLoadUserCompanyInfo","errorReceivingLoadUserInformationOverId","updateOwnUser","dataToUpdate","userSetting","settingsKey","settingsObject","errorUpdateOwnUser","mailUser","userMail","receiveMailUser","errorMailUser","START_LOADING_USER_INFORMATION","FINISH_LOADING_USER_INFORMATION","ERROR_LOADING_USER_INFORMATION","START_LOADING_USER_SETTINGS","FINISH_LOADING_USER_SETTINGS","ERROR_LOADING_USER_SETTINGS","START_LOADING_SAVED_USER_SETTINGS","FINISH_LOADING_SAVED_USER_SETTINGS","ERROR_LOADING_SAVED_USER_SETTINGS","LOGOUT_STATUS","logoutUser","loadUserInformation","userInfo","checkUserState","receiveUserInformation","errorReceivingUserInformation","acceptPrivacyPolicy","hasAccepted","getFromLocalStorage","storage_key","saveToLocalStorage","setItem","loadUserSetting","receiveUserSettings","userSettings","errorReceivingUserSettings","receiveSavedUserSettings","savedUserSettings","errorReceivingSavedUserSettings","STORAGE","_userId","_savedData","SWCP","__loaded","clearState","stringifiedNewState","__shouldInvalidate","saveState","getUserState","_objectSpread2","formatProdErrorMessage","$$observable","observable","randomString","ActionTypes","REPLACE","PROBE_UNKNOWN_ACTION","compose","funcs","createThunkMiddleware","extraArgument","_ref","action","thunk","withExtraArgument","isDummy","activeCollection","isSingleCollectionLoading","activeVariable","isSingleVariableLoading","isVariablesListLoading","isCollectionsListLoading","isIotKpiValueLoading","multiTimeline","multiTimelineLoading","timelineData","chartValueLoading","workpieceCounterData","workpieceCounterLoading","detailDataLoading","alarmsTopValue","alarmsValueLoading","alarmsTopValueLoading","alarmsListValue","alarmsListValueLoading","overrideValue","overrideValueLoading","currentValueLoading","singleVariableError","singleCollectionError","variablesListError","isVariablesWithLimitsListLoading","variablesWithLimitsListError","collectionsListError","initalState","trackedMachines","mySet","elementToRemove","newSet","reducers","loadingSubmit","successSubmitMail","loadingSubmitName","resultError","loadingUpload","isFilesDeleteLoading","loadingPostTvInstallInformation","loadingTvInstallInformation","isEditLoading","isDeleteLoading","isNewLoading","loadingTvLinks","loadingManuals","loadingTvDeploymentInformation","successId","loadingVersion","versions","fileId","downloadServiceFiles","downloadServiceFile","loadingNC","loadingReleaseInfo","loadingGroupsInfo","loadingReleaseNotes","isSavingChangedData","locations","halls","shopfloorCardObject","shopfloorList","shopfloorPosLink","shopfloorDelete","finishedDownloads","errorDownloads","loadingCompanies","loadingCompany","loadingLocations","loadingLocation","loadingHalls","loadingHall","loadingLines","loadingLine","loadingMachines","loadingMachine","loadingMachineTypes","loadingControllers","loadingVariables","loadingCollections","loadingCountries","loadingIndustrySectors","loadingShopfloorCard","loadingSpistatCard","loadingKpiCard","loadingInProductionCard","loadingDashboardWorldmap","loadingShopfloorPosLink","loadingShopfloor","loadingManual","sortCompaniesAlphabetically","localeCompare","machineTypes","countries","spistatCardObject","kpiCardObject","inProductionCardObject","dashboardWorldmapLocations","machinesListLoading","isAssetsCoordinatesByAddressLoading","isAssetsNewLoading","isAssetsEditLoading","limitChangeState","isCustomerNumberLoading","isShopfloorLoading","isShopfloorLinkLoading","shopfloorLink","isShopfloorDeleteLoading","isAssetDeleteLoading","alreadyFinished","LdTimeseriesCollectionsReducer","LdUserManagementReducer","isUserListLoading","userList","isUserRequestLoading","userRequestResult","userRequestType","isUserCompanyInfoLoading","updatedUser","isUpdatedUser","isUserInfoIdLoading","isWriteUserSettings","UserSettings","LdDashboardReducer","isUserInfoLoading","isUserSettingsLoading","isSavedUserSettingsLoading","userLogoutStatus","BreadCrumbReducer","breadCrumbConfig","breadCrumb","loadingBreadCrumb","breadcrumbList","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","origCompose","savedState","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","subscribe","isSubscribed","isPlainObject","replaceReducer","nextReducer","outerSubscribe","observeState","unsubscribe","nextCreator","origReducer","lazyReducers","nextStore","addReducers","newReducers","combinedReducerMap","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","nextState","_i","previousStateForKey","nextStateForKey","combineReducers","middlewares","_dispatch","middlewareAPI","chain","middleware","applyMiddleware","ToastNotificationHandler","replaceValue","_window$document$quer","_window$document$quer2","_window$document$quer3","_window$document$quer4","_toastElement","LdMessages","_toastMessageElement","highlight_input","_formFieldsInvalid","disable_input","_formFieldsDisabled","http_status_code","internal_status_code","toast_duration","handleFetchError","statusCode","_LdMessages$statusCod","clearToken","frontend","applications","login","notificationHandler","_onToastCloseClick","_window$document$quer5","_window$document$quer6","_window$document$quer7","_window$document$quer8","HttpRequest","hostname","username","password","fragment","cloned","carry","paramName","param","isInstance","hostHeaderMiddlewareOptions","priority","override","loggerMiddlewareOptions","recursionDetectionMiddlewareOptions","normalizeProvider","promisified","customEndpointFunctions","VALID_HOST_LABEL_REGEX","isValidHostLabel","allowSubDomains","IP_V4_REGEX","isIpAddress","isVirtualHostableS3Bucket","selectedPartitionsInfo","awsEndpointFunctions","parseArn","segments","arn","partition","region","accountId","resourcePath","resourceId","resource","partitions","regions","outputs","regionData","regionRegex","DEFAULT_PARTITION","setFeature","feature","__aws_sdk_context","features","ACCOUNT_ID_ENDPOINT_REGEX","USER_AGENT","X_AMZ_USER_AGENT","UA_NAME_ESCAPE_REGEX","UA_VALUE_ESCAPE_REGEX","escapeUserAgent","userAgentPair","prefixSeparatorIndex","uaName","getUserAgentMiddlewareOptions","validRegions","isFipsRegion","SMITHY_CONTEXT_KEY","getSmithyContext","httpAuthSchemeEndpointRuleSetMiddlewareOptions","relation","toMiddleware","DefaultIdentityProviderConfig","authSchemes","getIdentityProvider","schemeId","defaultErrorHandler","signingProperties","defaultSuccessHandler","httpResponse","httpSigningMiddlewareOptions","aliases","HttpResponse","resp","traits","findHeader","deserializerMiddlewareOption","serializerMiddlewareOption","CONTENT_LENGTH_HEADER","contentLengthMiddlewareOptions","getEndpointFromConfig","serviceId","querystring","pair","parseQueryString","RETRY_MODES","DEFAULT_RETRY_MODE","STANDARD","THROTTLING_ERROR_CODES","TRANSIENT_ERROR_CODES","TRANSIENT_ERROR_STATUS_CODES","NODEJS_TIMEOUT_ERROR_CODES","NODEJS_NETWORK_ERROR_CODES","isThrottlingError","$metadata","httpStatusCode","$retryable","throttling","isTransientError","isRetryableByTrait","clockSkewCorrected","isClockSkewCorrectedError","errorMessages","isBrowserNetworkError","cause","DefaultRateLimiter","beta","minCapacity","minFillRate","scaleConstant","smooth","currentCapacity","lastMaxRate","measuredTxRate","requestCount","fillRate","lastThrottleTime","lastTimestamp","lastTxRateBucket","maxCapacity","timeWindow","currentTimeInSeconds","getCurrentTimeInSeconds","getSendToken","acquireTokenBucket","refillTokenBucket","setTimeoutFn","fillAmount","updateClientSendingRate","calculatedRate","updateMeasuredRate","rateToUse","calculateTimeWindow","cubicThrottle","enableTokenBucket","cubicSuccess","newRate","updateTokenBucketRate","getPrecise","timeBucket","currentRate","toFixed","createDefaultRetryToken","retryDelay","retryCount","retryCost","getRetryCount","getRetryDelay","getRetryCost","StandardRetryStrategy","maxAttempts","capacity","retryBackoffStrategy","delayBase","computeNextBackoffDelay","attempts","setDelayBase","getDefaultRetryBackoffStrategy","maxAttemptsProvider","acquireInitialRetryToken","retryTokenScope","refreshRetryTokenForRetry","errorInfo","getMaxAttempts","shouldRetry","errorType","delayFromErrorType","retryAfterHint","getTime","capacityCost","getCapacityCost","recordSuccess","getCapacity","tokenToRenew","isRetryableError","AdaptiveRetryStrategy","rateLimiter","standardRetryStrategy","ADAPTIVE","NoOpLogger","randomUUID","crypto","decimalToHex","padStart","v4","rnds","getRandomValues","isStreamingPayload","ReadableStream","getRetryErrorInfo","getRetryErrorType","getRetryAfterHint","$response","isServerError","retryMiddlewareOptions","retryAfterHeaderName","retryAfter","retryAfterSeconds","getAllAliases","_aliases","alias","getMiddlewareNameWithAliases","constructStack","absoluteEntries","relativeEntries","identifyOnResolve","entriesNameSet","cloneTo","toStack","addRelativeTo","expandRelativeMiddlewareList","expandedMiddlewareList","before","getMiddlewareList","normalizedAbsoluteEntries","normalizedRelativeEntries","normalizedEntriesNameMap","normalizedEntry","mainChain","stepWeights","priorityWeights","wholeList","toOverrideIndex","toOverride","plugin","applyToStack","toRemove","isRemoved","filterCb","removeByName","removeByReference","removeByTag","identify","mw","initialize","build","finalizeRequest","high","low","Client","middlewareStack","initConfig","handlers","protocolSettings","command","optionsOrCb","cacheMiddleware","resolveMiddleware","destroy","requestHandler","isIdentityExpired","identity","doesIdentityRequireRefresh","expiration","SHORT_TO_HEX","HEX_TO_SHORT","encodedByte","toHex","toUint8Array","AMZ_DATE_QUERY_PARAM","SIGNATURE_QUERY_PARAM","TOKEN_QUERY_PARAM","AUTH_HEADER","AMZ_DATE_HEADER","GENERATED_HEADERS","SIGNATURE_HEADER","SHA256_HEADER","TOKEN_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","pragma","referer","te","trailer","upgrade","PROXY_HEADER_PATTERN","SEC_HEADER_PATTERN","ALGORITHM_IDENTIFIER","EVENT_ALGORITHM_IDENTIFIER","KEY_TYPE_IDENTIFIER","signingKeyCache","cacheQueue","createScope","shortDate","hmac","getCanonicalHeaders","unsignableHeaders","signableHeaders","canonical","headerName","canonicalHeaderName","getPayloadHash","hashConstructor","hashCtor","HeaderFormatter","chunks","formatHeaderValue","chunk","shortView","setInt16","intView","setInt32","longBytes","binView","setUint16","binBytes","utf8Bytes","strView","strBytes","tsBytes","Int64","fromNumber","UUID_PATTERN","uuidBytes","fromHex","HEADER_VALUE_TYPE","negative","prepareRequest","escapeUri","hexEncode","SignatureV4Base","regionProvider","credentialProvider","sha256","uriEscapePath","applyChecksum","credentials","createCanonicalRequest","canonicalHeaders","payloadHash","sortedHeaders","getCanonicalPath","serialized","encodedKey","getCanonicalQuery","createStringToSign","longDate","credentialScope","canonicalRequest","algorithmIdentifier","normalizedPathSegments","pathSegment","normalizedPath","validateResolvedCredentials","accessKeyId","secretAccessKey","formatDate","toDate","toISOString","getCanonicalHeaderList","SignatureV4","headerFormatter","presign","originalRequest","signingDate","expiresIn","unhoistableHeaders","hoistableHeaders","signingRegion","signingService","lname","moveHeadersToQuery","sessionToken","getSignature","getSigningKey","sign","toSign","signString","signEvent","signMessage","signRequest","priorSignature","hashedPayload","hashedHeaders","stringToSign","signableMessage","requestToSign","soughtHeader","hasHeader","keyPromise","sha256Constructor","cacheKey","signable","defaultCognitoIdentityProviderHttpAuthSchemeParametersProvider","defaultCognitoIdentityProviderHttpAuthSchemeProvider","authParameters","propertiesExtractor","createAwsAuthSigv4HttpAuthOption","commonParams","UseFIPS","Endpoint","Region","UseDualStack","SHA_256_HASH","SHA_256_HMAC_ALGO","EMPTY_DATA_SHA_256","fallbackWindow","locateWindow","typedArray","subtle","importKey","subtleCryptoMethods","supportsSecureRandom","supportsWebCrypto","createDefaultUserAgentProvider","clientVersion","uaString","osName","platform","fallback","os","brands","brand","browserName","browser","sections","appId","userAgentAppId","ua","SelectorType","createRequest","requestOptions","Request","timeoutInMs","timeoutError","keepAliveSupport","supported","FetchHttpHandler","configProvider","instanceOrOptions","abortSignal","requestTimeout","requestTimeoutInMs","keepAlive","abortError","queryString","iLen","qsEntry","buildQueryString","Headers","duplex","keepalive","requestInit","removeSignalEventListener","fetchRequest","raceOfPromises","fetchHeaders","transformedHeaders","onAbort","once","onabort","race","finally","updateHttpClientConfig","httpHandlerConfigs","alphabetByEncoding","alphabetByValue","fromBase64","totalByteLength","dataView","bits","bitLength","chunkOffset","streamCollector","stream","arrayBuffer","reader","FileReader","onloadend","commaIndex","dataOffset","readAsDataURL","readToBase64","collectBlob","getReader","isDone","collected","collectStream","loadConfigsForDefaultMode","retryMode","connectionTimeout","TEXT_ENCODER","calculateBodyLength","DEFAULTS_MODE_OPTIONS","getSkewCorrectedDate","systemClockOffset","getDateHeader","getUpdatedSystemClockOffset","clockTime","currentSystemClockOffset","clockTimeInMs","isClockSkewed","throwSigningPropertyError","AwsSdkSigV4Signer","httpRequest","validatedProps","authScheme","endpointV2","signerFunction","signer","signingRegionSet","signingName","validateSigningProperties","handlerExecutionContext","first","errorHandler","serverTime","ServerTime","initialSystemClockOffset","successHandler","dateHeader","deref","schemaRef","translateTraits","indicator","trait","anno","NormalizedSchema","ref","memberName","symbol","schema","_isMemberSchema","memberTraits","normalizedTraits","traitStack","isMemberSchema","traitSet","computedMemberTraits","getMemberTraits","isStaticSchema","getName","hasInstance","lhs","isPrototype","isPrototypeOf","getMergedTraits","getSchema","withNamespace","getMemberName","isListSchema","isMapSchema","isStructSchema","isUnionSchema","isBlobSchema","isTimestampSchema","isUnitSchema","isDocumentSchema","isStringSchema","isBooleanSchema","isNumericSchema","isBigIntegerSchema","isBigDecimalSchema","isStreaming","streaming","isIdempotencyToken","idempotencyToken","getOwnTraits","getKeySchema","isDoc","isMap","member","getValueSchema","isList","memberSchema","getMemberSchema","struct","getMemberSchemas","structIterator","ignored","getEventStreamMember","toBase64","_input","isArrayLike","isUint8Array","bitClusterCount","Uint8ArrayBlobAdapter","mutate","transformToString","collectBody","streamBody","fromContext","TypeRegistry","schemas","exceptions","registries","copyFrom","shapeId","qualifiedName","normalizeShapeId","registerError","$error","getErrorCtor","getBaseException","exceptionKey","predicate","SerdeContext","serdeContext","setSerdeContext","HttpProtocol","compositeErrorRegistry","defaultNamespace","etr","errorTypeRegistries","getRequestType","getResponseType","serializer","deserializer","getPayloadCodec","updateServiceEndpoint","setHostPrefix","operationSchema","disableHostPrefix","inputNs","opTraits","hostPrefix","hostLabelInputs","hostLabel","deserializeMetadata","extendedRequestId","cfId","serializeEventStream","eventStream","requestSchema","initialRequest","loadEventStreamCapability","deserializeEventStream","responseSchema","initialResponseContainer","EventStreamSerde","marshaller","getEventStreamMarshaller","defaultContentType","getDefaultContentType","deserializeHttpMessage","arg4","arg5","eventStreamMarshaller","RpcProtocol","serializeRequest","eventStreamMember","deserializeResponse","dataObject","handleError","ServiceException","$fault","decorateServiceException","exception","additions","Message","ProtocolLib","queryCompat","resolveRestContentType","inputSchema","members","httpPayloadMember","httpPayload","mediaType","hasBody","httpQuery","httpQueryParams","httpHeader","httpLabel","httpPrefixHeaders","getErrorSchemaOrThrowBaseException","errorIdentifier","getErrorSchema","errorName","errorMetadata","registry","errorSchema","synthetic","baseExceptionSchema","ErrorCtor","Type","Code","reqId","RequestId","setQueryCompatError","queryErrorHeader","__type","queryCompatOutput","queryCompatErrorData","errorData","findQueryCompatibleError","awsQueryError","SerdeContextConfig","determineTimestampFormat","timestampFormat","useTrait","httpBindings","LazyJsonString","deserializeJSON","expectNumber","stackTraceWarning","MAX_FLOAT","expectSizedInt","expected","isInteger","expectLong","castInt","Int16Array","Int8Array","NUMBER_REGEX","parseNumber","expectShort","DAYS","MONTHS","RFC3339_WITH_OFFSET","IMF_FIXDATE","RFC_850_DATE","ASC_TIME","buildDate","adjustedMonth","validateDayOfMonth","UTC","parseDateValue","parseMilliseconds","fractionalMilliseconds","parseMonthByShortName","monthIdx","DAYS_IN_MONTH","maxDays","isLeapYear","lower","upper","dateVal","expectByte","strictParseByte","stripLeadingZeroes","expectFloat32","strictParseFloat32","NumericValue","_nv","UnionSerde","mark","hasUnknown","writeUnknown","$unknown","jsonReviver","numericString","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","BigInt","JsonShapeDeserializer","_read","utf8Encoder","collectBodyString","readObject","record","union","nameMap","jsonName","unionSerde","fromKey","listMember","sparse","mapMember","_k","_v","yearStr","monthStr","dayStr","offsetStr","setTime","directionStr","parseOffsetToMilliseconds","parseRfc3339DateTimeWithOffset","thisYear","getUTCFullYear","valueInThisCentury","parseTwoDigitYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","parseRfc7231DateTime","valueAsDouble","strictParseDouble","parseEpochTimestamp","untyped","structuredClone","NUMERIC_CONTROL_CHAR","JsonReplacer","stage","createReplacer","replaceInJson","JsonShapeSerializer","useReplacer","rootSchema","_write","writeDiscriminatedDocument","replacer","serializableValue","targetKey","base64Encoder","dayOfWeek","getUTCDay","dayOfMonthInt","hoursInt","minutesInt","secondsInt","hoursString","minutesString","secondsString","dateToUtcString","JsonCodec","createSerializer","createDeserializer","AwsJsonRpcProtocol","serviceTarget","codec","awsQueryCompatible","jsonCodec","getJsonRpcVersion","findKey","sanitizeErrorCode","rawValue","cleanValue","headerKey","codeKey","loadRestJsonErrorCode","AwsJson1_1Protocol","getShapeId","NoAuthSigner","debugId","toDebugString","argv","EndpointError","getAttr","pathList","squareBracketIndex","arrayIndex","getAttrPathList","EndpointURLScheme","DEFAULT_PORTS","HTTP","HTTPS","endpointFunctions","booleanEquals","value1","value2","isSet","not","parseURL","whatwgURL","urlString","scheme","isIp","authority","stringEquals","stop","uriEncode","evaluateTemplate","evaluatedTemplateArr","templateContext","endpointParams","referenceRecord","openingBraceIndex","closingBraceIndex","parameterName","refName","evaluateExpression","callFunction","getReferenceValue","evaluatedArgs","fnSegments","evaluateCondition","fnArgs","toAssign","evaluateConditions","conditions","conditionsReferenceRecord","getEndpointHeaders","headerVal","headerValEntry","processedExpr","getEndpointProperties","propertyKey","propertyVal","getEndpointProperty","propertyEntry","getEndpointUrl","endpointUrl","evaluateEndpointRule","endpointRule","endpointRuleOptions","evaluateErrorRule","errorRule","evaluateRules","endpointOrUndefined","evaluateTreeRule","treeRule","h","ruleSet","parameters","resolver","defaultEndpointResolver","ruleSetObject","paramsWithDefault","paramKey","paramDefaultValue","requiredParams","requiredParam","resolveEndpoint","CognitoIdentityProviderServiceException","InternalErrorException","InvalidParameterException","reasonCode","NotAuthorizedException","ResourceNotFoundException","TooManyRequestsException","UserImportInProgressException","UserNotFoundException","InvalidLambdaResponseException","LimitExceededException","TooManyFailedAttemptsException","UnexpectedLambdaException","UserLambdaValidationException","CodeDeliveryFailureException","InvalidPasswordException","InvalidSmsRoleAccessPolicyException","InvalidSmsRoleTrustRelationshipException","PreconditionNotMetException","UnsupportedUserStateException","UsernameExistsException","AliasExistsException","InvalidUserPoolConfigurationException","InvalidEmailRoleAccessPolicyException","MFAMethodNotFoundException","PasswordResetRequiredException","UnsupportedOperationException","UserNotConfirmedException","UserPoolAddOnNotEnabledException","CodeMismatchException","ExpiredCodeException","PasswordHistoryPolicyViolationException","SoftwareTokenMFANotFoundException","ConcurrentModificationException","ForbiddenException","WebAuthnChallengeNotFoundException","WebAuthnClientMismatchException","WebAuthnCredentialNotSupportedException","WebAuthnNotEnabledException","WebAuthnOriginNotAllowedException","WebAuthnRelyingPartyMismatchException","DeviceKeyExistsException","GroupExistsException","DuplicateProviderException","ManagedLoginBrandingExistsException","TermsExistsException","FeatureUnavailableInTierException","TierChangeNotAllowedException","UserPoolTaggingException","InvalidOAuthFlowException","ScopeDoesNotExistException","UnsupportedIdentityProviderException","RefreshTokenReuseException","UnauthorizedException","UnsupportedTokenTypeException","WebAuthnConfigurationMissingException","EnableSoftwareTokenMFAException","_A","_AAl","_AC","_ACUC","_ACn","_AF","_AM","_AMt","_AN","_AOAF","_AOAFUPC","_AOAS","_AP","_AR","_ARS","_ASV","_ATRC","_ATV","_ATc","_AVA","_As","_CC","_CCRC","_CD","_CDC","_CDD","_CDr","_CFD","_CI","_CIr","_CM","_CN","_CNl","_CP","_CR","_CSl","_CURL","_CWLRA","_D","_DC","_DK","_DM","_DN","_DP","_DRS","_DRURI","_De","_Desc","_Do","_E","_EA","_EAF","_EC","_ED","_EI","_EIx","_EM","_EMC","_EMS","_EPAUCD","_ESm","_ETR","_EVM","_EVS","_En","_F","_FAC","_FV","_G","_GN","_Gr","_I","_IA","_II","_IP","_IT","_ITV","_JI","_JN","_L","_LAa","_LC","_LCo","_LDC","_LMD","_LURL","_LV","_Li","_MC","_MFAO","_MLB","_MLBI","_MLV","_MR","_NT","_Na","_P","_PD","_PM","_PMS","_PN","_PNo","_PTa","_PTr","_PUEE","_Po","_Pr","_RA","_RAe","_RAes","_RC","_REC","_RMR","_RPI","_RS","_RT","_RTR","_RTV","_S","_SA","_SAM","_SCm","_SH","_SIP","_SMC","_SMSMS","_STMC","_STMS","_SVM","_Sc","_Se","_St","_Su","_T","_TI","_TN","_TS","_TVU","_Ta","_U","_UA","_UAN","_UAUS","_UAs","_UC","_UCD","_UCDs","_UCPV","_UIC","_UIJ","_ULMD","_UMFASL","_UP","_UPAO","_UPC","_UPI","_UPT","_UPTs","_US","_Us","_Use","_VD","_VMT","_WA","_WAC","_c","_e","_hE","_m","_s","n0","_s_registry","CognitoIdentityProviderServiceException$","n0_registry","AliasExistsException$","CodeDeliveryFailureException$","CodeMismatchException$","ConcurrentModificationException$","DeviceKeyExistsException$","DuplicateProviderException$","EnableSoftwareTokenMFAException$","ExpiredCodeException$","FeatureUnavailableInTierException$","ForbiddenException$","GroupExistsException$","InternalErrorException$","InvalidEmailRoleAccessPolicyException$","InvalidLambdaResponseException$","InvalidOAuthFlowException$","InvalidParameterException$","InvalidPasswordException$","InvalidSmsRoleAccessPolicyException$","InvalidSmsRoleTrustRelationshipException$","InvalidUserPoolConfigurationException$","LimitExceededException$","ManagedLoginBrandingExistsException$","MFAMethodNotFoundException$","NotAuthorizedException$","PasswordHistoryPolicyViolationException$","PasswordResetRequiredException$","PreconditionNotMetException$","RefreshTokenReuseException$","ResourceNotFoundException$","ScopeDoesNotExistException$","SoftwareTokenMFANotFoundException$","TermsExistsException$","TierChangeNotAllowedException$","TooManyFailedAttemptsException$","TooManyRequestsException$","UnauthorizedException$","UnexpectedLambdaException$","UnsupportedIdentityProviderException$","UnsupportedOperationException$","UnsupportedTokenTypeException$","UnsupportedUserStateException$","UserImportInProgressException$","UserLambdaValidationException$","UsernameExistsException$","UserNotConfirmedException$","UserNotFoundException$","UserPoolAddOnNotEnabledException$","UserPoolTaggingException$","WebAuthnChallengeNotFoundException$","WebAuthnClientMismatchException$","WebAuthnConfigurationMissingException$","WebAuthnCredentialNotSupportedException$","WebAuthnNotEnabledException$","WebAuthnOriginNotAllowedException$","WebAuthnRelyingPartyMismatchException$","AttributeValueType","ClientIdType","ClientSecretType","PasswordType","SecretCodeType","SecretHashType","SessionType","SoftwareTokenMFAUserCodeType","TokenModelType","UsernameType","AccountRecoverySettingType$","RecoveryMechanismsType","AccountTakeoverActionsType$","AccountTakeoverActionType$","AccountTakeoverRiskConfigurationType$","NotifyConfigurationType$","AddCustomAttributesRequest$","CustomAttributesListType","AddCustomAttributesResponse$","AdminAddUserToGroupRequest$","AdminConfirmSignUpRequest$","AdminConfirmSignUpResponse$","AdminCreateUserConfigType$","MessageTemplateType$","AdminCreateUserRequest$","AttributeListType","AdminCreateUserResponse$","UserType$","AdminDeleteUserAttributesRequest$","AdminDeleteUserAttributesResponse$","AdminDeleteUserRequest$","AdminDisableProviderForUserRequest$","ProviderUserIdentifierType$","AdminDisableProviderForUserResponse$","AdminDisableUserRequest$","AdminDisableUserResponse$","AdminEnableUserRequest$","AdminEnableUserResponse$","AdminForgetDeviceRequest$","AdminGetDeviceRequest$","AdminGetDeviceResponse$","DeviceType$","AdminGetUserRequest$","AdminGetUserResponse$","MFAOptionListType","AdminInitiateAuthRequest$","AuthParametersType","AnalyticsMetadataType$","ContextDataType$","AdminInitiateAuthResponse$","AuthenticationResultType$","AdminLinkProviderForUserRequest$","AdminLinkProviderForUserResponse$","AdminListDevicesRequest$","AdminListDevicesResponse$","DeviceListType","AdminListGroupsForUserRequest$","AdminListGroupsForUserResponse$","GroupListType","AdminListUserAuthEventsRequest$","AdminListUserAuthEventsResponse$","AuthEventsType","AdminRemoveUserFromGroupRequest$","AdminResetUserPasswordRequest$","AdminResetUserPasswordResponse$","AdminRespondToAuthChallengeRequest$","ChallengeResponsesType","AdminRespondToAuthChallengeResponse$","AdminSetUserMFAPreferenceRequest$","SMSMfaSettingsType$","SoftwareTokenMfaSettingsType$","EmailMfaSettingsType$","AdminSetUserMFAPreferenceResponse$","AdminSetUserPasswordRequest$","AdminSetUserPasswordResponse$","AdminSetUserSettingsRequest$","AdminSetUserSettingsResponse$","AdminUpdateAuthEventFeedbackRequest$","AdminUpdateAuthEventFeedbackResponse$","AdminUpdateDeviceStatusRequest$","AdminUpdateDeviceStatusResponse$","AdminUpdateUserAttributesRequest$","AdminUpdateUserAttributesResponse$","AdminUserGlobalSignOutRequest$","AdminUserGlobalSignOutResponse$","AdvancedSecurityAdditionalFlowsType$","AnalyticsConfigurationType$","AssetType$","AssociateSoftwareTokenRequest$","AssociateSoftwareTokenResponse$","AttributeType$","NewDeviceMetadataType$","AuthEventType$","EventRiskType$","ChallengeResponseListType","EventContextDataType$","EventFeedbackType$","ChallengeResponseType$","ChangePasswordRequest$","ChangePasswordResponse$","CloudWatchLogsConfigurationType$","CodeDeliveryDetailsType$","CompleteWebAuthnRegistrationRequest$","CompleteWebAuthnRegistrationResponse$","CompromisedCredentialsActionsType$","CompromisedCredentialsRiskConfigurationType$","ConfirmDeviceRequest$","DeviceSecretVerifierConfigType$","ConfirmDeviceResponse$","ConfirmForgotPasswordRequest$","UserContextDataType$","ConfirmForgotPasswordResponse$","ConfirmSignUpRequest$","ConfirmSignUpResponse$","HttpHeaderList","CreateGroupRequest$","CreateGroupResponse$","GroupType$","CreateIdentityProviderRequest$","CreateIdentityProviderResponse$","IdentityProviderType$","CreateManagedLoginBrandingRequest$","AssetListType","CreateManagedLoginBrandingResponse$","ManagedLoginBrandingType$","CreateResourceServerRequest$","ResourceServerScopeListType","CreateResourceServerResponse$","ResourceServerType$","CreateTermsRequest$","CreateTermsResponse$","TermsType$","CreateUserImportJobRequest$","CreateUserImportJobResponse$","UserImportJobType$","CreateUserPoolClientRequest$","TokenValidityUnitsType$","RefreshTokenRotationType$","CreateUserPoolClientResponse$","UserPoolClientType$","CreateUserPoolDomainRequest$","CustomDomainConfigType$","CreateUserPoolDomainResponse$","CreateUserPoolRequest$","UserPoolPolicyType$","LambdaConfigType$","VerificationMessageTemplateType$","UserAttributeUpdateSettingsType$","DeviceConfigurationType$","EmailConfigurationType$","SmsConfigurationType$","SchemaAttributesListType","UserPoolAddOnsType$","UsernameConfigurationType$","CreateUserPoolResponse$","UserPoolType$","CustomEmailLambdaVersionConfigType$","CustomSMSLambdaVersionConfigType$","DeleteGroupRequest$","DeleteIdentityProviderRequest$","DeleteManagedLoginBrandingRequest$","DeleteResourceServerRequest$","DeleteTermsRequest$","DeleteUserAttributesRequest$","DeleteUserAttributesResponse$","DeleteUserPoolClientRequest$","DeleteUserPoolDomainRequest$","DeleteUserPoolDomainResponse$","DeleteUserPoolRequest$","DeleteUserRequest$","DeleteWebAuthnCredentialRequest$","DeleteWebAuthnCredentialResponse$","DescribeIdentityProviderRequest$","DescribeIdentityProviderResponse$","DescribeManagedLoginBrandingByClientRequest$","DescribeManagedLoginBrandingByClientResponse$","DescribeManagedLoginBrandingRequest$","DescribeManagedLoginBrandingResponse$","DescribeResourceServerRequest$","DescribeResourceServerResponse$","DescribeRiskConfigurationRequest$","DescribeRiskConfigurationResponse$","RiskConfigurationType$","DescribeTermsRequest$","DescribeTermsResponse$","DescribeUserImportJobRequest$","DescribeUserImportJobResponse$","DescribeUserPoolClientRequest$","DescribeUserPoolClientResponse$","DescribeUserPoolDomainRequest$","DescribeUserPoolDomainResponse$","DomainDescriptionType$","DescribeUserPoolRequest$","DescribeUserPoolResponse$","EmailMfaConfigType$","FirehoseConfigurationType$","ForgetDeviceRequest$","ForgotPasswordRequest$","ForgotPasswordResponse$","GetCSVHeaderRequest$","GetCSVHeaderResponse$","GetDeviceRequest$","GetDeviceResponse$","GetGroupRequest$","GetGroupResponse$","GetIdentityProviderByIdentifierRequest$","GetIdentityProviderByIdentifierResponse$","GetLogDeliveryConfigurationRequest$","GetLogDeliveryConfigurationResponse$","LogDeliveryConfigurationType$","GetSigningCertificateRequest$","GetSigningCertificateResponse$","GetTokensFromRefreshTokenRequest$","GetTokensFromRefreshTokenResponse$","GetUICustomizationRequest$","GetUICustomizationResponse$","UICustomizationType$","GetUserAttributeVerificationCodeRequest$","GetUserAttributeVerificationCodeResponse$","GetUserAuthFactorsRequest$","GetUserAuthFactorsResponse$","GetUserPoolMfaConfigRequest$","GetUserPoolMfaConfigResponse$","SmsMfaConfigType$","SoftwareTokenMfaConfigType$","WebAuthnConfigurationType$","GetUserRequest$","GetUserResponse$","GlobalSignOutRequest$","GlobalSignOutResponse$","HttpHeader$","InboundFederationLambdaType$","InitiateAuthRequest$","InitiateAuthResponse$","PreTokenGenerationVersionConfigType$","ListDevicesRequest$","ListDevicesResponse$","ListGroupsRequest$","ListGroupsResponse$","ListIdentityProvidersRequest$","ListIdentityProvidersResponse$","ProvidersListType","ListResourceServersRequest$","ListResourceServersResponse$","ResourceServersListType","ListTagsForResourceRequest$","ListTagsForResourceResponse$","ListTermsRequest$","ListTermsResponse$","TermsDescriptionListType","ListUserImportJobsRequest$","ListUserImportJobsResponse$","UserImportJobsListType","ListUserPoolClientsRequest$","ListUserPoolClientsResponse$","UserPoolClientListType","ListUserPoolsRequest$","ListUserPoolsResponse$","UserPoolListType","ListUsersInGroupRequest$","ListUsersInGroupResponse$","UsersListType","ListUsersRequest$","ListUsersResponse$","ListWebAuthnCredentialsRequest$","ListWebAuthnCredentialsResponse$","WebAuthnCredentialDescriptionListType","LogConfigurationType$","S3ConfigurationType$","LogConfigurationListType","MFAOptionType$","NotifyEmailType$","NumberAttributeConstraintsType$","PasswordPolicyType$","ProviderDescription$","RecoveryOptionType$","ResendConfirmationCodeRequest$","ResendConfirmationCodeResponse$","ResourceServerScopeType$","RespondToAuthChallengeRequest$","RespondToAuthChallengeResponse$","RevokeTokenRequest$","RevokeTokenResponse$","RiskExceptionConfigurationType$","SchemaAttributeType$","StringAttributeConstraintsType$","SetLogDeliveryConfigurationRequest$","SetLogDeliveryConfigurationResponse$","SetRiskConfigurationRequest$","SetRiskConfigurationResponse$","SetUICustomizationRequest$","SetUICustomizationResponse$","SetUserMFAPreferenceRequest$","SetUserMFAPreferenceResponse$","SetUserPoolMfaConfigRequest$","SetUserPoolMfaConfigResponse$","SetUserSettingsRequest$","SetUserSettingsResponse$","SignInPolicyType$","SignUpRequest$","SignUpResponse$","StartUserImportJobRequest$","StartUserImportJobResponse$","StartWebAuthnRegistrationRequest$","StartWebAuthnRegistrationResponse$","StopUserImportJobRequest$","StopUserImportJobResponse$","TagResourceRequest$","TagResourceResponse$","TermsDescriptionType$","UntagResourceRequest$","UntagResourceResponse$","UpdateAuthEventFeedbackRequest$","UpdateAuthEventFeedbackResponse$","UpdateDeviceStatusRequest$","UpdateDeviceStatusResponse$","UpdateGroupRequest$","UpdateGroupResponse$","UpdateIdentityProviderRequest$","UpdateIdentityProviderResponse$","UpdateManagedLoginBrandingRequest$","UpdateManagedLoginBrandingResponse$","UpdateResourceServerRequest$","UpdateResourceServerResponse$","UpdateTermsRequest$","UpdateTermsResponse$","UpdateUserAttributesRequest$","UpdateUserAttributesResponse$","CodeDeliveryDetailsListType","UpdateUserPoolClientRequest$","UpdateUserPoolClientResponse$","UpdateUserPoolDomainRequest$","UpdateUserPoolDomainResponse$","UpdateUserPoolRequest$","UpdateUserPoolResponse$","UserPoolClientDescription$","UserPoolDescriptionType$","VerifySoftwareTokenRequest$","VerifySoftwareTokenResponse$","VerifyUserAttributeRequest$","VerifyUserAttributeResponse$","WebAuthnCredentialDescription$","__Unit","AddCustomAttributes$","AdminAddUserToGroup$","AdminConfirmSignUp$","AdminCreateUser$","AdminDeleteUser$","AdminDeleteUserAttributes$","AdminDisableProviderForUser$","AdminDisableUser$","AdminEnableUser$","AdminForgetDevice$","AdminGetDevice$","AdminGetUser$","AdminInitiateAuth$","AdminLinkProviderForUser$","AdminListDevices$","AdminListGroupsForUser$","AdminListUserAuthEvents$","AdminRemoveUserFromGroup$","AdminResetUserPassword$","AdminRespondToAuthChallenge$","AdminSetUserMFAPreference$","AdminSetUserPassword$","AdminSetUserSettings$","AdminUpdateAuthEventFeedback$","AdminUpdateDeviceStatus$","AdminUpdateUserAttributes$","AdminUserGlobalSignOut$","AssociateSoftwareToken$","ChangePassword$","CompleteWebAuthnRegistration$","ConfirmDevice$","ConfirmForgotPassword$","ConfirmSignUp$","CreateGroup$","CreateIdentityProvider$","CreateManagedLoginBranding$","CreateResourceServer$","CreateTerms$","CreateUserImportJob$","CreateUserPool$","CreateUserPoolClient$","CreateUserPoolDomain$","DeleteGroup$","DeleteIdentityProvider$","DeleteManagedLoginBranding$","DeleteResourceServer$","DeleteTerms$","DeleteUser$","DeleteUserAttributes$","DeleteUserPool$","DeleteUserPoolClient$","DeleteUserPoolDomain$","DeleteWebAuthnCredential$","DescribeIdentityProvider$","DescribeManagedLoginBranding$","DescribeManagedLoginBrandingByClient$","DescribeResourceServer$","DescribeRiskConfiguration$","DescribeTerms$","DescribeUserImportJob$","DescribeUserPool$","DescribeUserPoolClient$","DescribeUserPoolDomain$","ForgetDevice$","ForgotPassword$","GetCSVHeader$","GetDevice$","GetGroup$","GetIdentityProviderByIdentifier$","GetLogDeliveryConfiguration$","GetSigningCertificate$","GetTokensFromRefreshToken$","GetUICustomization$","GetUser$","GetUserAttributeVerificationCode$","GetUserAuthFactors$","GetUserPoolMfaConfig$","GlobalSignOut$","InitiateAuth$","ListDevices$","ListGroups$","ListIdentityProviders$","ListResourceServers$","ListTagsForResource$","ListTerms$","ListUserImportJobs$","ListUserPoolClients$","ListUserPools$","ListUsers$","ListUsersInGroup$","ListWebAuthnCredentials$","ResendConfirmationCode$","RespondToAuthChallenge$","RevokeToken$","SetLogDeliveryConfiguration$","SetRiskConfiguration$","SetUICustomization$","SetUserMFAPreference$","SetUserPoolMfaConfig$","SetUserSettings$","SignUp$","StartUserImportJob$","StartWebAuthnRegistration$","StopUserImportJob$","TagResource$","UntagResource$","UpdateAuthEventFeedback$","UpdateDeviceStatus$","UpdateGroup$","UpdateIdentityProvider$","UpdateManagedLoginBranding$","UpdateResourceServer$","UpdateTerms$","UpdateUserAttributes$","UpdateUserPool$","UpdateUserPoolClient$","UpdateUserPoolDomain$","VerifySoftwareToken$","VerifyUserAttribute$","defaultsMode","hasResult","isConstant","coalesceProvider","effectiveType","rtt","downlink","mobile","maxTouchPoints","useMobileConfiguration","provider","forceRefresh","memoize","resolveDefaultsModeConfig","defaultConfigProvider","clientSharedValues","apiVersion","base64Decoder","endpointProvider","httpAuthSchemeProvider","httpAuthSchemes","identityProvider","ipc","xmlNamespace","urlParser","utf8Decoder","bodyLengthChecker","credentialDefaultProvider","defaultUserAgentProvider","useDualstackEndpoint","useFipsEndpoint","AlgorithmId","knownAlgorithms","CognitoIdentityProviderClient","configuration","_config_0","_config_2","normalizedAppIdProvider","customUserAgent","isValidUserAgentAppId","resolveUserAgentConfig","defaultSigningName","_config_7","config_0","resolvedCredentials","inputCredentials","isUserSupplied","memoizedProvider","credentialsProvider","memoized","isExpired","requiresRefresh","normalizedProvider","memoizeIdentityProvider","parentClientConfig","normalizeCredentialProvider","boundProvider","configBound","callerClientConfig","bindCallerConfig","attributed","isCredentialObject","attributedCreds","$source","setCredentialFeature","signingEscapePath","regionInfoProvider","regionInfo","signerConstructor","resolveAwsSdkSigV4Config","authSchemePreference","resolveHttpAuthSchemeConfig","tls","customEndpointProvider","isCustomEndpoint","resolvedConfig","configuredEndpointPromise","serviceConfiguredEndpoint","resolveEndpointConfig","realRegion","getRealRegion","checkRegion","providedRegion","resolveRegionConfig","retryStrategy","_retryMode","_maxAttempts","resolveRetryConfig","_config_8","runtimeConfig","extensionConfiguration","setRegion","getAwsRegionExtensionConfiguration","checksumAlgorithms","algorithmId","checksumConstructor","ChecksumCtor","addChecksumAlgorithm","algo","setRetryStrategy","getRetryConfiguration","getDefaultExtensionConfiguration","setHttpHandler","httpHandler","getHttpHandlerExtensionConfiguration","_httpAuthSchemes","_httpAuthSchemeProvider","_credentials","setHttpAuthScheme","httpAuthScheme","setHttpAuthSchemeProvider","setCredentials","getHttpAuthExtensionConfiguration","extension","clientConfig","checksumAlgorithm","retryStrategyConfiguration","resolveRetryRuntimeConfig","resolveDefaultRuntimeConfig","resolveHttpAuthRuntimeConfig","resolveRuntimeExtensions","commandStack","schemaSerializationMiddleware","$responseBodyText","headerEntries","schemaDeserializationMiddleware","getSchemaSerdePlugin","clientStack","defaultUserAgent","accountIdEndpointMode","__smithy_context","selectedHttpAuthScheme","checkFeatures","awsContext","encodeFeatures","sdkUserAgentValue","normalUAValue","section","userAgentMiddleware","getUserAgentPlugin","isRetryStrategyV2","retry","retryToken","lastError","totalRetryDelay","isRequest","retryErrorInfo","refreshError","retryMiddleware","getRetryPlugin","getContentLengthPlugin","handlerProtocol","hostHeaderMiddleware","getHostHeaderPlugin","clientName","commandName","dynamoDbDocumentClientOptions","overrideInputFilterSensitiveLog","overrideOutputFilterSensitiveLog","inputFilterSensitiveLog","outputFilterSensitiveLog","outputWithoutMetadata","httpAuthSchemeParametersProvider","identityProviderConfigProvider","mwOptions","candidateAuthOptions","preferredAuthOptions","preferredSchemeName","candidateAuthOption","resolveAuthOptions","convertHttpAuthSchemesToMap","smithyContext","failureReasons","identityProperties","httpAuthOption","httpAuthSchemeMiddleware","getHttpAuthSchemeEndpointRuleSetPlugin","DOMAIN_PATTERN","IP_ADDRESS_PATTERN","DOTS_PATTERN","createConfigValueProvider","configKey","canonicalEndpointParamKey","isClientContextParam","configValue","clientContextParams","nestedValue","CredentialScope","AccountId","resolveParams","commandInput","instructionsSupplier","instructions","getEndpointParameterInstructions","instruction","bucket","Bucket","bucketName","isArn","isValidArn","isArnBucketName","ForcePathStyle","DisableMultiRegionAccessPoints","disableMultiRegionAccessPoints","DisableMRAP","resolveParamsForS3","endpointMiddlewareOptions","getEndpointPlugin","endpointFromConfig","getEndpointFromInstructions","signing_region","signing_service","endpointMiddleware","SENSITIVE_STRING","schemaLogFilter","sensitive","newObject","memberNs","Command","classBuilder","ClassBuilder","resolveMiddlewareWithContext","middlewareFn","additionalContext","CommandCtor","commandInstance","_init","_ep","_middlewareFn","_commandName","_clientName","_additionalContext","_smithyContext","_inputFilterSensitiveLog","_outputFilterSensitiveLog","_serializer","_deserializer","_operationSchema","ep","endpointParameterInstructions","middlewareSupplier","inputFilter","outputFilter","ser","closure","CommandRef","AddCustomAttributesCommand","AdminAddUserToGroupCommand","AdminConfirmSignUpCommand","AdminCreateUserCommand","AdminDeleteUserAttributesCommand","AdminDeleteUserCommand","AdminDisableProviderForUserCommand","AdminDisableUserCommand","AdminEnableUserCommand","AdminForgetDeviceCommand","AdminGetDeviceCommand","AdminGetUserCommand","AdminInitiateAuthCommand","AdminLinkProviderForUserCommand","AdminListDevicesCommand","AdminListGroupsForUserCommand","AdminListUserAuthEventsCommand","AdminRemoveUserFromGroupCommand","AdminResetUserPasswordCommand","AdminRespondToAuthChallengeCommand","AdminSetUserMFAPreferenceCommand","AdminSetUserPasswordCommand","AdminSetUserSettingsCommand","AdminUpdateAuthEventFeedbackCommand","AdminUpdateDeviceStatusCommand","AdminUpdateUserAttributesCommand","AdminUserGlobalSignOutCommand","AssociateSoftwareTokenCommand","ChangePasswordCommand","CompleteWebAuthnRegistrationCommand","ConfirmDeviceCommand","ConfirmForgotPasswordCommand","ConfirmSignUpCommand","CreateGroupCommand","CreateIdentityProviderCommand","CreateManagedLoginBrandingCommand","CreateResourceServerCommand","CreateTermsCommand","CreateUserImportJobCommand","CreateUserPoolClientCommand","CreateUserPoolCommand","CreateUserPoolDomainCommand","DeleteGroupCommand","DeleteIdentityProviderCommand","DeleteManagedLoginBrandingCommand","DeleteResourceServerCommand","DeleteTermsCommand","DeleteUserAttributesCommand","DeleteUserCommand","DeleteUserPoolClientCommand","DeleteUserPoolCommand","DeleteUserPoolDomainCommand","DeleteWebAuthnCredentialCommand","DescribeIdentityProviderCommand","DescribeManagedLoginBrandingByClientCommand","DescribeManagedLoginBrandingCommand","DescribeResourceServerCommand","DescribeRiskConfigurationCommand","DescribeTermsCommand","DescribeUserImportJobCommand","DescribeUserPoolClientCommand","DescribeUserPoolCommand","DescribeUserPoolDomainCommand","ForgetDeviceCommand","ForgotPasswordCommand","GetCSVHeaderCommand","GetDeviceCommand","GetGroupCommand","GetIdentityProviderByIdentifierCommand","GetLogDeliveryConfigurationCommand","GetSigningCertificateCommand","GetTokensFromRefreshTokenCommand","GetUICustomizationCommand","GetUserAttributeVerificationCodeCommand","GetUserAuthFactorsCommand","GetUserCommand","GetUserPoolMfaConfigCommand","GlobalSignOutCommand","InitiateAuthCommand","ListDevicesCommand","ListGroupsCommand","ListIdentityProvidersCommand","ListResourceServersCommand","ListTagsForResourceCommand","ListTermsCommand","ListUserImportJobsCommand","ListUserPoolClientsCommand","ListUserPoolsCommand","ListUsersCommand","ListUsersInGroupCommand","ListWebAuthnCredentialsCommand","ResendConfirmationCodeCommand","RespondToAuthChallengeCommand","RevokeTokenCommand","SetLogDeliveryConfigurationCommand","SetRiskConfigurationCommand","SetUICustomizationCommand","SetUserMFAPreferenceCommand","SetUserPoolMfaConfigCommand","SetUserSettingsCommand","SignUpCommand","StartUserImportJobCommand","StartWebAuthnRegistrationCommand","StopUserImportJobCommand","TagResourceCommand","UntagResourceCommand","UpdateAuthEventFeedbackCommand","UpdateDeviceStatusCommand","UpdateGroupCommand","UpdateIdentityProviderCommand","UpdateManagedLoginBrandingCommand","UpdateResourceServerCommand","UpdateTermsCommand","UpdateUserAttributesCommand","UpdateUserPoolClientCommand","UpdateUserPoolCommand","UpdateUserPoolDomainCommand","VerifySoftwareTokenCommand","VerifyUserAttributeCommand","makePagedClientRequest","withCommand","createPaginator","ClientCtor","inputTokenName","outputTokenName","pageSizeTokenName","additionalArguments","startingToken","hasNext","prevToken","stopOnSameToken","cursor","pathComponents","paginateAdminListGroupsForUser","paginateAdminListUserAuthEvents","paginateListGroups","paginateListIdentityProviders","paginateListResourceServers","paginateListUserPoolClients","paginateListUserPools","paginateListUsersInGroup","commands","paginators","paginateListUsers","CognitoIdentityProvider","methodImpl","waiters","paginatorName","paginatorFn","paginationConfiguration","waiterName","waiterFn","waiterConfiguration","maxWaitTime","createAggregatedClient","HTTPError","cbOnError","LdError","NetworkError","LdFetchComponent","EventTarget","checkTokenExpiration","METHOD_GET","METHOD_POST","METHOD_PUT","METHOD_PATCH","METHOD_DELETE","tokenProvider","setTokenProvider","getTokenProvider","_fetch","cbOnSuccess","createHeader","noJSON","_options","redirect","referrer","dispatch40xEvents","arrayBufferToBase64","responseHasBody","putShopfloor","binary","btoa","isJsonString","MissingTokenError","MalformedTokenError","tokenKey","tokenExp","refreshToken","existingTokenRaw","existingToken","cognito","userPool","userPoolId","_token$Authentication","_token$Authentication2","_token$Authentication3","initiateAuth","AuthFlow","ClientId","clientId","AuthParameters","REFRESH_TOKEN","AuthenticationResult","IdToken","accessToken","AccessToken","atob","exp","rolesThatCanManageUsers","rolesThatCanManageDocs","rolesThatCanManageTechnician","rolesThatHaveSwStatus","rolesThatCanManageOEM","rolesThatCanManageOEM_QA","rolesThatCanManageUSER","rolesThatCanManageVISITOR","isUserSwEmployee","isUserUserManager","isDocsManager","isUserUserTechnician","isUserUserOEM","isUserUserOEM_QA","isUserUSER","isUserVISITOR","checkUserHasAMatchingRole","isAllowed","machineIsLicensed","linkForward","buildLink","replaceLastStateWithCurrent","pushState","goToUrl","replaceAnchor","appendix","_split","isValidDateRangeHash","redirectLogin","_message","decimalNumberFormat","maximumFractionDigits","variableName","variable_ids","isBrowserSafari","isSafari","remapList","mapCountryCodeToName","DisplayNames","valuesHaveNameProperty","singleValue","sortByName","anObject","anotherObject","fa","fb","isValidDate","dates","dateKey","invlerp","renderEmptyState","storeLoginCredentials","requestUrlParams","eventType","isValidEmailAddress","emailAddressCandidate","getSendingState","getSendingStateColor","getSendingStateLabel","_translationKey","utcOffsetInHours","getTimezoneOffset","getCountries","validCodes","countryName","handleAssetDeleteError","displayNotification","closeDeleteModal","getLocationSelectionElementData","editForm","_state$LdAssetsReduce","locationData","coordinatesSet","userSetCoordinates","shown","apiLocationFromState","coordinatesFromBackend","defaultLocationValue","writeJsonToFile","jsonData","fileName","File","toCamelCaseWithUnderscores","STORAGE_KEY","BACKEND_SERVICE_URL_OVERRIDES_CHANGED_EVENT","defaultServiceUrlSnapshot","createDefaultSnapshot","_baseConfig$backend","snapshot","serviceName","serviceConfig","urlFields","getServiceUrlFieldNames","fieldName","isDevServiceUrlOverridesEnabled","_baseConfig$localstor","readStoredOverrides","applyOverridesToRuntimeConfig","overrides","_baseConfig$backend2","getEffectiveBackendServiceUrls","configured","stored","hasActiveBackendServiceUrlOverrides","overrideService","dispatchOverridesChangedEvent","hasActiveOverrides","saveBackendServiceUrlOverrides","sanitized","trimmedValue","sanitizeOverrides","clearBackendServiceUrlOverrides","removeItem","themeColors","primary_creme","primary_gray_one","primary_gray_two","primary_gray_three","primary_header_background_color","primary_header_color","primary_loading_background_color","primary_loading_spinner_color","secondary_color","secondary_background_color","secondary_highlight_color","default_background_color","button_secondBackground_color","button_thirdBackground_color","button_fourthBackground_color","button_fifthBackground_color","button_sixthBackground_color","button_seventhBackground_color","main_text_color","paper_item_pressed","paper_item_active_border_color","app_header_color","app_header_background_color","app_drawer_background_color","app_drawer_scrim_background_color","app_drawer_sidebar_background_color","datepicker_border_color","datepicker_color","grid_background_color","grid_border_color","icons_color","icons_hover_background_color","selected_menu_item","breadcrumb_main_color","secondary_green_100","secondary_green_200","secondary_green_300","secondary_green_400","secondary_green_500","secondary_green_600","dark_blue_001","dark_blue_002","dark_blue_003","dark_blue_004","trafficlight_green","trafficlight_red","release_banner","limit_colors","critical","prewarning","axistest","limit_area_first_series","limit_area_second_series","first_series","second_series","circularity_custom_y_axis","warning_limit","critical_limit","kpi_table_border","kpi_table_background_accent","themeFonts","main_font_size","b64","lens","getLens","validLen","placeHoldersLen","tmp","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","maxChunkLength","len2","encodeChunk","lookup","UNSCOPABLES","ArrayProto","toIObject","toLength","toAbsoluteIndex","IS_INCLUDES","$this","fromIndex","O","core","__e","aFunction","redefine","ctx","PROTOTYPE","$export","own","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","S","IS_PROTO","IS_BIND","B","expProto","U","W","R","__g","dP","createDesc","cof","descriptor","setToStringTag","IteratorPrototype","Constructor","NAME","LIBRARY","Iterators","$iterCreate","ITERATOR","BUGGY","KEYS","VALUES","returnThis","DEFAULT","IS_SET","FORCED","getMethod","TAG","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","dPs","enumBugKeys","IE_PROTO","createDict","iframeDocument","iframe","contentWindow","lt","Properties","IE8_DOM_DEFINE","toPrimitive","Attributes","getKeys","toObject","ObjectProto","names","$keys","bitmap","SRC","$toString","TO_STRING","TPL","safe","isFunction","stat","shared","uid","SHARED","toInteger","IObject","defined","px","USE_SYMBOL","addToUnscopables","iterated","_t","Arguments","$iterators","wks","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","explicit","Collection","merge","objectEach","pick","animObject","timers","stopped","easeInOutSine","curAnim","initPath","pathArray","toD","getDeferredAnimation","labelAnimation","seriesAnim","forExport","setAnimation","globalAnimation","win","Fx","dSetter","startSeg","endSeg","tweenSeg","startItem","endItem","timer","gotoEnd","fromD","startX","endX","isArea","positionFactor","disableAnimation","hasStackedCliffs","fullLength","moveSegment","otherSegment","segmentToAdd","lowerSegmentToAdd","fillSetter","strokeSetter","tweenTo","AxisDefaults","alignTicks","allowDecimals","panningEnabled","zoomEnabled","millisecond","main","week","gridLineDashStyle","gridZIndex","autoRotationLimit","indentation","reserveSpace","rotation","staggerLines","fontSize","maxPadding","minorGridLineDashStyle","minorTickLength","minorTickPosition","minorTicksPerMajor","minPadding","reversed","reversedStacks","showEmpty","startOfWeek","tickLength","tickPixelInterval","tickmarkPlacement","tickPosition","minorGridLineColor","minorGridLineWidth","minorTickColor","lineColor","gridLineColor","tickColor","stackLabels","allowOverlap","crop","numberFormatter","fontWeight","textOutline","A","defaultOptions","registerEventOptions","deg2rad","arrayMax","arrayMin","clamp","correctFloat","destroyObjectProperties","erase","fireEvent","getClosestDistance","insertItem","isString","normalizeTickInterval","relativeLength","removeEvent","splat","syncTimeout","getNormalizedTickInterval","tickInterval","tickAmount","Axis","userOptions","coll","isXAxis","horiz","isZAxis","inverted","opposite","side","labelsOptions","uniqueNames","minPixelPadding","hasNames","categories","plotLinesAndBandsGroups","positiveValuesOnly","logarithmic","isLinked","linkedTo","ticks","labelEdge","minorTicks","plotLinesAndBands","alternateBands","userMinRange","maxZoom","crosshair","crosshairs","axes","orderItems","labelRotation","sideSpecific","autoRotation","padding","defaultLabelFormatter","dateTimeLabelFormat","numericSymbols","numSymMagnitude","numericSymbolMagnitude","numericSymbolDetector","getSeriesExtremes","xExtremes","hasVisibleSeries","dataMin","softThreshold","seriesOptions","xData","seriesDataMin","seriesDataMax","getXExtremes","dataExtremes","applyExtremes","backwards","cvsCoord","handleLog","linkedParent","localMin","doPostTranslate","isOrdinal","brokenAxis","hasBreaks","lin2val","cvsOffset","localA","transA","returnValue","sector","val2lin","isRadial","toPixels","paneCoordinates","toValue","pixel","getPlotLinePath","axisLeft","axisTop","cHeight","oldChartHeight","chartHeight","cWidth","oldChartWidth","chartWidth","transB","translatedValue","force","between","acrossPanes","isInternal","scrollablePixelsY","scrollablePixelsX","crispLine","getLinearTickPositions","roundedMin","roundedMax","tickPositions","lastPos","precision","single","getMinorTickInterval","minorTickInterval","getMinorTickPositions","pointRangePadding","minorTickPositions","paddedTicks","getLogTickPositions","dateTime","getTimeTicks","normalizeTimeTickInterval","trimTicks","adjustForMinRange","zoomOffset","spaceAvailable","closestDataRange","minArgs","maxArgs","ceiling","xIncrement","log2lin","getClosest","closestSingleDistance","closestDistance","singleXs","seriesClosest","closestPointRange","noSharedTooltip","nameToX","explicitCategories","nameX","requireSorting","autoIncrement","updateNames","points","isDirtyData","processData","generatePoints","setAxisTranslation","hasCategories","ordinalCorrection","pointRange","axisPointRange","minPointOffset","seriesPointRange","isPointPlacementAxis","slope","translationSlope","staticScale","minFromRange","setTickInterval","secondPass","softMax","softMin","tickPixelIntervalOption","linkedParentExtremes","thresholdMin","thresholdMax","hardMin","hardMax","tickIntervalOption","getTickAmount","userMin","userMax","getExtremes","stacking","usePercentage","numThreshold","polar","hasExtremesChanged","forceCrop","forceCropping","unsquish","setTickPositions","tickPositionsOption","tickPositioner","minorTickIntervalOption","allowEndOnTick","isPanning","tickPositionerResult","tickmarkOffset","startingTickInterval","adjustedTickInterval","adjustTickAmount","alignToOthers","alignedAxes","chartOptions","alignThresholds","thresholdAlignments","hasOther","thresholdAlignment","getKey","pane","thisKey","otherAxis","threshAlign","getThresholdAlignment","callerAxis","isDirty","finalTickAmt","currentTickAmount","thresholdTickIndex","hasData","adjustExtremes","setScale","isXAxisDirty","setAxisSize","isDirtyAxisLength","forceRedraw","buildStacks","cleanStacks","allExtremes","setExtremes","eventArguments","serie","kdTree","eventArgs","offsets","plotWidth","plotHeight","plotTop","plotLeft","lin2log","getThreshold","realMin","realMax","autoLabelAlign","angle","tickSize","tickWidth","labelMetrics","tick","fontMetrics","movedLabel","box","labelOptions","slotSize","rotationOption","lineHeight","getStep","spaceNeeded","newTickInterval","bestScore","MAX_VALUE","rot","sin","getSlotWidth","slotCount","slotWidth","cssWidth","spacing","renderUnsquish","labelStyleOptions","textOverflowOption","textOverflow","commonWidth","commonTextOverflow","maxLabelLength","replaceMovedLabel","textPxLength","getBBox","specificTextOverflow","labelAlign","widthOption","shortenLabel","whiteSpace","tagName","tickRotCorr","rotCorr","axisTitleOptions","styledMode","textAlign","axisTitle","addClass","axisGroup","isNew","generateTick","addLabel","Tick","createGroups","axisParent","createGroup","gridGroup","labelGroup","getOffset","invertedSide","hasCrossing","crossing","axisOffset","clipOffset","directionFactor","showAxis","titleOffsetOption","labelOffsetPadded","lineHeightCorrection","titleOffset","titleMargin","labelOffset","reserveSpaceDefault","getLabelSize","renderLine","axisTitleMargin","getMaxLabelDimensions","maxLabelDimensions","clip","axisLine","strokeWidth","getLinePath","lineLeft","lineTop","stroke","getTitlePosition","axisLength","xOption","yOption","textHeightOvershoot","alongAxis","offAxis","titlePosition","renderMinorTick","slideIn","renderTick","isColumn","stackLabelOptions","alternateGridColor","overlap","slideInTicks","hasRendered","PlotLineOrBand","_addedPlotLB","plotLines","plotBands","plotLineOptions","addPlotBandOrLine","forDestruction","isPlaced","renderStackTotals","plotLine","getKeepProps","keepProps","keepEvents","eventOptions","plotGroup","drawCrosshair","snap","categorized","crossOptions","graphic","cross","crosshairPos","plotX","plotY","chartX","chartY","stackY","isCrosshair","hideCrosshair","Color","setOpacity","dashStyle","dashstyle","isDirtyBox","axisSeries","setTitle","titleOptions","setCategories","Series","negativeValue","stackOption","isNegative","cumulative","hasValidPoints","leftCliff","rightCliff","alignOptions","formatOption","borderRadius","borderColor","added","labelrank","plotSizeY","setOffset","xOffset","boxBottom","boxTop","defaultX","stackBox","getStackBox","labelBox","isJustify","adjustStackPosition","isInsidePlot","alignAttr","justifyDataLabel","rotationOriginX","rotationOriginY","factorMap","verticalAlignFactor","textAlignFactor","stackBoxProps","totalStackValue","yZero","neg","noLabel","isNewLabel","isFirst","isLast","animateLabels","tickPositionInfo","resolveDTLFormat","higherRanks","unitName","getXDateFormat","labelFormatter","moveLabel","textStr","textWidth","createLabel","xy","getPosition","tickPos","getLabelPosition","labelOffsetCorrection","yOffset","cos","getMarkPath","handleOverflow","pxPos","leftBound","labelLeft","rightBound","labelRight","factor","labelWidth","xCorrection","leftPos","rightPos","modifiedSlotWidth","goRight","labelPos","moved","currentTick","axisStart","axisEnd","labelOpacity","newOpacity","renderGridLine","renderMark","renderLabel","attribs","gridLinePath","gridLine","isNewMark","defaultTime","numberFormat","marginNames","seriesTypes","addEvent","diffObjects","discardElement","pInt","uniqueKey","Chart","sharedClips","nodeName","renderTo","setZoomOptions","zooming","zoomType","zoomKey","pinchType","singleTouch","zoomBySingleTouch","resetButton","resetZoomButton","optionsChart","labelCollectors","isResizing","hasCartesianSeries","showAxes","chartCount","pointCount","colorCounter","symbolCounter","firstRender","initSeries","SeriesClass","missingModuleFor","setSortedData","getSeriesOrderByLinks","enabledDataSorting","setData","linkedSeries","optionsArray","userOptionsArray","iEnd","plotBox","scrollablePlotBox","visiblePlotOnly","scrollablePlotArea","scrollingContainer","ignoreX","ignoreY","colorAxis","pointer","legendUserOptions","isHiddenChart","isHidden","afterRedraw","hasDirtyStacks","hasStackedSeries","redrawLegend","isDirtyLegend","rootFontSize","boxWrapper","setResponsive","temporaryDisplay","layOutTitles","centerInCategory","legendType","updateTotals","labelFormat","getStacks","getMargins","extKey","drawChartBox","itemById","getAxes","axisOptions","getSelectedPoints","getPointsCollection","selectedStaging","getSelectedSeries","subtitleOptions","applyDescription","explicitOptions","updateOptions","isStock","spacingBox","widthAdjust","baseline","floating","caption","requiresDirtyBox","getContainerBox","nonContainers","div","getChartSize","heightOption","containerBox","enableDefaultHeight","revert","tempStyle","hcOrigStyle","hcOrigDetached","hcOricDetached","setClassName","getContainer","indexAttrName","containerId","containerStyle","oldChartIndex","emptyHTML","skipClone","_cursor","getRendererType","allowHTML","defs","definition","setStyle","chartIndex","skipAxes","resetMargins","adjustMargins","getAxisMargins","setChartSize","getOptions","reflow","oldBox","chartPosition","isPrinting","reflowTimeout","setSize","setReflow","runReflow","hasLoaded","unbind","clipRoundFunc","plotSizeX","clipBox","alignElements","plotBorderWidth","halfWidth","sideName","plotBGImage","chartBackgroundColor","plotBackgroundColor","plotBackgroundImage","clipRect","chartBorderWidth","mgn","bgAttr","chartBackground","plotBackground","plotBorder","plotShadow","plotBorderColor","crisp","propFromSeries","linkSeries","isUpdating","chartSeries","setDataSortingOptions","renderSeries","axisLayoutRuns","renderAxes","redoVertical","expectedSpace","redoHorizontal","mockTick","tempWidth","tempHeight","seriesGroup","seriesGroupShadow","addCredits","creds","mapCredits","scroller","serieOptions","getChartPosition","imgCount","callbacks","warnIfA11yModuleNotLoaded","accessibility","addSeries","addAxis","isX","createAxis","addColorAxis","showLoading","loadingOptions","setLoadingSize","loadingDiv","loadingSpan","setElementHTML","labelStyle","loadingShown","showDuration","hideLoading","hideDuration","oneToOne","adders","isResponsiveOptions","itemsForRemoval","updateAllAxes","updateAllSeries","runSetSize","propsRequireUpdateSeries","propsRequireDirtyBox","propsRequireReflow","collectionsWithUpdate","newOptions","hasId","touched","collectionsWithInit","newWidth","newHeight","setSubtitle","setCaption","showResetZoom","btnOptions","alignTo","relativeTo","zoomOut","resetZoomTitle","resetSelection","pan","panningOptions","originalEvent","mouseDownX","mouseDownY","displayButton","isAnyAxisPanning","hasZoomed","hoverPoints","setState","wh","fromLength","fromCenter","pointRangeDirection","minPx","newMin","newMax","seriesExtremes","getProcessedData","yData","safeDataMin","safeDataMax","padRange","paddedMin","paddedMax","allowZoomOutside","overscroll","None","rgba","GlobalColor","stops","parsers","brighten","alpha","fromRgba","toRgba","hasAlpha","white","black","isTouchDevice","decimalPoint","thousandsSep","buttonTheme","states","timezone","timezoneOffset","useUTC","colorCount","allowMutatingData","ignoreHiddenSeries","alignColumns","layout","itemMarginBottom","itemMarginTop","navigation","activeColor","inactiveColor","itemStyle","textDecoration","itemHoverStyle","itemHiddenStyle","itemCheckboxStyle","squareSymbol","symbolPadding","footerFormat","headerShape","hideDelay","headerFormat","pointFormat","stickOnContact","Time","Foundation","Globals","SVG_NS","product","createSVGRect","isChrome","chrome","isFirefox","isMS","opera","isWebKit","PI","hasBidiBug","supportsPassiveEvents","dateFormats","symbolSizes","LegendSymbol","lineMarker","hasArea","legendItem","symbolWidth","symbolHeight","generalRadius","legendItemGroup","verticalCenter","legendSymbol","markerOptions","lineSizer","linecap","isMarker","areaMarker","square","symbolRadius","trustedTypesPolicy","hasValidDOMParser","DOMParser","parseFromString","AST","filterUserAttributes","allowedAttributes","allowedReferences","parseStyle","addToDOM","parseMarkup","recurse","subParent","textNode","bypassHTMLFiltering","allowedTags","NS","namespaceURI","markup","appendChildNodes","astNode","parsedAttributes","attrib","childNode","RendererRegistry","defaultRenderer","rendererTypes","rendererType","registerRendererType","rendererClass","setAsDefault","pushUnique","replaceNested","SVGElement","_defaultGetter","_defaultSetter","inserted","parentGroup","buildText","handleZ","zIndexSetter","onAdd","currentClassName","newClassName","afterSetters","doTransform","updateTransform","alignByTranslate","alignedObjects","initialAlignment","alignFactor","vAlignFactor","alignToKey","alignToBox","placed","alignSetter","convert","alignValue","animOptions","deferTime","applyTextOutline","getContrast","fakeTS","digit","removeTextOutline","parentElem","totalHeight","continueAnimation","symbolCustomAttribs","hasSetSymbolSize","skipAttr","setter","symbolName","symbolAttr","clipElem","clipPath","x2Crisp","y2Crisp","complexColor","colorOptions","colorObject","gradName","gradAttr","radAttr","gradients","stopColor","stopOpacity","radialReference","radialGradient","linearGradient","gradientUnits","getRadialAttr","gradientObject","stopObject","gradient","oldStyles","newStyles","hasNew","stylesToApply","dashstyleSetter","wrapper","ownerSVGElement","grandParent","parentToClean","onclick","onmouseout","onmouseover","onmousemove","connector","safeRemoveChild","pathToSegments","seg","hrefSetter","setAttributeNS","cacheKeys","isSVG","bBox","toggleTextShadowShim","htmlGetBBox","getRotatedBox","boxX","boxY","translateY","rad","rad90","cosRad","sinRad","wCosRad","wSinRad","cosRad90","sinRad90","xOriginCosRad","xOriginSinRad","yOriginCosRad","yOriginSinRad","rotOrigin","aX","bX","cX","dX","aY","bY","cY","dY","hasClass","onEvents","opacitySetter","reAlign","removeClass","setRadialReference","existingGradient","shadowOptions","offsetX","offsetY","shadowDefinition","inherit","tempElement","textSetter","titleSetter","titleNode","getElementsByTagName","toFront","translateX","matrix","scaleX","scaleY","textPath","visibilitySetter","xGetter","svgParent","otherElement","otherZIndex","undefinedOtherZIndex","yGetter","matrixSetter","rotationOriginXSetter","rotationOriginYSetter","rotationSetter","scaleXSetter","scaleYSetter","translateXSetter","translateYSetter","verticalAlignSetter","SVGLabel","anchorX","anchorY","hasBGImage","paddingLeftSetter","paddingSetter","paddingRightSetter","doUpdate","symbolKey","emptyBBox","baselineOffset","needsBox","deferredAttr","xSetting","anchorXSetter","boxAttr","getCrispAdjust","anchorYSetter","ySetting","textStyles","textProps","updateTextPadding","updateBoxSize","heightSetter","heightSetting","rSetter","widthSetting","crispAdjust","getPaddedWidth","metrics","firstLineMetrics","textY","textX","hasBoxWidthChanged","widthSetter","xSetter","ySetter","svgElement","textLineHeight","ellipsis","noWrap","buildSVG","hasMarkup","tempParent","textCache","actualWidth","modifyTree","modifyDOM","unescapeEntities","getLineHeight","modifyTextNode","words","hasWhiteSpace","lineNo","startAt","truncate","precedingSiblings","modifyChildren","baseVal","modifyChild","fontStyle","nextNode","getString","lengths","minIndex","maxIndex","getSubStringLength","charEnd","concatenatedEnd","inputStr","except","escapes","hasInternalReferenceBug","SVGRenderer","subPixelFix","getReferenceURL","unSubPixelFix","hitElement","fontFamily","rendererDefs","cx","cy","filterUnits","getShadowFilterContent","stdDeviation","b8","hoverState","selectState","disabledState","curState","normalStyle","stateAttribs","stateStyles","stateName","circle","arc","innerR","rx","ry","rGetter","roundedRect","preserveAspectRatio","elemWrapper","onDummyLoad","dummy","Image","ren","imageRegex","isImage","symbolFn","imageSrc","centerImage","img","imgwidth","imgheight","imgSize","backgroundSize","isImg","symbolUrl","tspans","parentVal","tspan","alterY","segment","commandLength","C","H","L","M","Q","T","V","Symbols","proximity","fullCircle","innerRadius","cosStart","sinStart","cosEnd","sinEnd","longArc","arcSegment","callout","safeDistance","isTopCorner","cornerY","sliceStart","diamond","triangle","getNestedProperty","Point","animateBeforeDestroy","animateParams","startXPos","graphicalProps","getGraphicalProps","singular","isDataLabel","startYPos","plural","applyOptions","pointValKey","optionsToObject","dataLabels","relativeXValue","isNull","formatPrefix","destroyed","dataSorting","destroyPoint","graphics","dataLabel","destroyElements","destroyItem","hoverPoint","onMouseOut","kinds","firePointEvent","defaultFunction","manageEvent","allowPointSelect","getClassName","colorIndex","zone","getLabelConfig","stackTotal","getZone","zones","zoneAxis","nonZonedColor","hasNewShapeType","shapeType","resolveColor","pointArrayMap","valueCount","firstItemType","setNestedProperty","hasDataLabels","_hasPointMarkers","chartCoordinates","posX","posY","colorByPoint","isLastKey","shouldDraw","tooltipFormatter","seriesTooltipOptions","tooltipOptions","valueDecimals","valuePrefix","valueSuffix","styledModeFormat","runEvent","hasMockGraphic","shouldDestroyGraphic","updateParallelArrays","fixedBox","removePoint","accumulate","loopPoint","loopSeries","inactiveOtherPoints","onMouseOver","getChartCoordinatesFromPoint","runPointActions","userEvent","hcEvents","importedUserEvent","previousState","stateOptions","normalDisabled","markerStateOptions","stateDisabled","pointMarker","hasMarkers","markerAttribs","pointAttribs","pointAttribsAnimation","newSymbol","halo","stateMarkerGraphic","currentSymbol","markerGroup","isInside","haloOptions","markerGraphic","markerVisibility","isCluster","haloPath","SeriesRegistry","eventsToUnbind","bindAxes","lastSeries","runTrackerClick","getColor","getSymbol","parallelArrays","isCartesian","axisTypes","optionalAxis","iArgs","toYData","hasMarkerChanged","oldOptions","oldMarker","pointIntervalUnit","pointInterval","pointStart","sorted","allowDG","itemOptions","seriesUserOptions","typeOptions","userPlotOptions","userPlotOptionsSeries","defaultPlotOptionsType","userPlotOptionsType","stickyTracking","negativeColor","negativeFillColor","fillColor","getCyclic","indexName","counterName","hasGroupedData","seriesMarkerOption","findPointIndex","optionsObject","oldData","matchingPoint","matchedById","pointIndex","matcher","oldPoint","matchByName","cropped","cropStart","updateData","pointsToAdd","equalLength","hasUpdatedByKey","pointOptions","pointClass","hasDerivedData","addPoint","updatePoints","oldDataLength","updatedData","copiedData","indexOfX","indexOfY","dataLength","sortData","boosted","runTurbo","firstPoint","getFirstValidPoint","lastPoint","isShortArray","sortKey","getPointOptionsObject","aValue","bValue","seriesData","forceExtremesFromAll","cropThreshold","croppedData","processedXData","processedYData","updatingNames","cropData","processedData","basePointRange","dataOptions","PointClass","processedDataLength","groupCropStartIndex","dataGrouping","groupAll","dataGroup","groupMap","activeYData","shoulder","getExtremesFromAll","validValue","withinRange","activeCounter","yDataLength","stackedYData","pointPlacementToXValue","dynamicallyPlaced","stackThreshold","startFromThreshold","lastPlotX","stackIndicator","closestPointRangePx","limitedRange","xValue","stackItem","stackValues","yValue","lowValue","stacks","negStacks","stackKey","getStackIndicator","irregularWidths","pointXOffset","barW","yBottom","dataModify","modifyValue","isPointInside","getValidPoints","insideOnly","allowNull","getClipBox","invertible","getSharedClipKey","sharedClipKey","setClip","animationClipKey","animationClipRect","markerAnimationClipRect","markerClipBox","finalBox","afterAnimate","finishedAnimating","drawPoints","seriesMarkerOptions","specialGroup","globallyEnabled","enabledThreshold","pointMarkerOptions","hasPointMarker","hasImage","pointAttr","seriesStateOptions","pointStateOptions","radiusPlus","pointColorOption","pointColor","zoneColor","lineWidthPlus","keepEventsForUpdate","issue134","removeEvents","AXIS","animationTimeout","survive","hoverSeries","applyZones","graph","avoidClose","translated","lineClip","axisMax","invertPath","showLine","zoneBelow","lastLineClip","lastTranslated","simpleClip","simplePath","adaptivePath","getPlotBox","horAxis","vertAxis","chartSeriesGroup","animDuration","drawGraph","drawDataLabels","redrawPoints","enableMouseTracking","drawTracker","wasDirty","searchPoint","compareX","searchKDTree","buildKDTree","buildingKdTree","dimensions","findNearestPointBy","kdtree","median","kdAxisArray","directTouch","kdNow","kdX","kdY","kdComparer","kdDimensions","useRadius","isBubble","doSearch","tree","nPoint1","nPoint2","p1","p2","p1kdX","p2kdX","p1kdY","p2kdY","dist","distX","setDistance","tdist","sideA","sideB","trackByArea","trackerPath","areaPath","graphPath","TRACKER_FILL","tracker","dataLabelsGroup","onTrackerMouseOut","withEvent","isInTheMiddle","initialType","initialSeriesProto","preserve","newType","keepPoints","joinBy","mapData","hasOptionChanged","casting","ownEvents","showInLegend","setName","optionName","oldOption","plotOptionsOption","setHoverChartIndex","mouseOver","mouseOut","stateAnimation","graphElement","labelBySeries","setAllPointsToState","setVisible","vis","oldVisibility","showOrHide","colorizeItem","otherSeries","shouldShowTooltip","drawLegendSymbol","showCheckbox","inactive","registerType","registerSeriesType","extendClass","seriesType","defaultPlotOptions","seriesProto","pointProto","helpers","divide","eq","each","ge","gt","le","multiply","ne","subtract","unless","subRegex","floatRegex","decRegex","resolveProperty","currentMatch","hasSub","subMatch","isBlock","startInner","startingElseSection","elseBody","valueAndFormat","decimals","fractionDigits","origDec","exponent","firstDecimals","toExponential","roundedNumber","strinteger","thousands","pad","timeUnits","hasNewSafariBug","formatRange","hasOldSafariBug","variableTimezone","timezoneOffsetFunction","realMs","ms","newOffset","makeTime","formatCache","timeZone","timeZoneName","gmt","invalidDate","dayOfMonth","fullYear","langWeekdays","replacements","Y","I","normalizedInterval","minDate","unitRange","minYear","variableDayLength","minDay","minMonth","minDateDate","minHours","totalRange","getDateFormat","dateStr","blank","strpos","lastN","isCode","additionalMessages","messages","mag","strict","isDOMElement","isClass","keyOrAttribs","isGetter","attrSingle","getMagnitude","prec","toPrecision","removeOneEvent","removeAllEvents","eventCollection","_val","typeEvents","createEvent","initEvent","multilevel","serialMode","grep","jQuery","highcharts","eventObject","nopad","border","inverter","destructablesOnly","newer","older","keepOlder","keeper","newerVal","arrays","allowNegative","closest","loopLength","pathElements","pathElement","thisProp","toInt","boundingClientRectWidth","inArray","indexOption","doCopy","original","multiples","magnitude","hasTickAmount","retInterval","normalized","docElem","clientTop","clientLeft","padder","stableSort","sortFunction","sortValue","safeI","useSerialIds","proceed","outerArgs","defaultBorderRadiusOptions","where","oldArc","oldRoundedRect","applyBorderRadius","fromLineToArc","bigR","relativeR","angleOfBorderRadius","asin","angleOffset","distanceBigCenterToStartArc","sinHalfAlpha","innerBorderRadius","seriesOnAfterColumnTranslate","is3d","percent","seriesDefault","shapeArgs","brBoxY","brBoxHeight","stackEnd","crispCol","translatedThreshold","seriesBROptions","pieSeriesOnAfterTranslate","brOffsetTop","brOffsetBtm","rTop","rBtm","cutTop","cutBtm","applyPythagoras","altitude","SVGElementClass","SVGRendererClass","PieSeriesClass","CenteredUtilities","getCenter","slicingRoom","slicedOffset","centerOption","smallestSize","thickness","handleSlicingRoom","innerSize","angular","getStartAndEndRadians","startAngle","endAngle","ColumnSeries","yAxisPos","translateProp","translateStart","getColumnMetrics","reverseStacks","stackGroups","otherYAxis","otherOptions","columnIndex","categoryWidth","groupPadding","pointOffsetWidth","pointWidth","maxPointWidth","pointPadding","columnMetrics","paddedWidth","adjustForMissingColumns","visibleSeries","indexInCategory","totalInCategory","pointValues","seriesIndexes","pointKey","boxWidth","dense","minPointLength","seriesPointWidth","seriesXOffset","seriesBarW","barY","barH","barX","tooltipPos","p2o","pointAttrToOptions","strokeOption","strokeWidthOption","brightness","animationLimit","hasGraphic","allowShadow","getPointFromEvent","isDirectTouch","_hasTracking","trackerGroups","chartGetHoverPane","hoverPane","isInsidePane","insideSlice","atan2","onChartAfterIsInsiderPlot","normalizedStartAngleRad","normalizedEndAngleRad","onPointerAfterGetHoverData","onPointerBeforeGetHoverData","getHoverPane","ChartClass","PointerClass","chartProto","outerRadius","Pane","updateCenter","backgroundOption","renderBackground","backgroundOptions","getPlotBandPath","AreaPoint","areaProto","AreaSeries","columnProto","AreaRangeSeries","highToXY","postTranslate","rectPlotX","plotHigh","plotHighX","plotLowX","getGraphPath","highPoints","highAreaPoints","connectEnds","connectNulls","pointShim","highAreaPoint","doCurve","polarPlotY","lowerPath","higherPath","higherAreaPath","linePath","xMap","originalDataLabels","dataLabelOptions","upperDataLabelOptions","lowerDataLabelOptions","xHigh","yHigh","xLow","yLow","plotLow","inside","_plotY","dataLabelUpper","below","alignDataLabel","modifyMarkerSettings","originalMarkerSettings","lowMarker","restoreMarkerSettings","originalSettings","pointLength","origProps","isTopInside","posHigh","deferTranslatePolar","prevState","isPolar","lowerStateMarkerGraphic","upperStateMarkerGraphic","setStackedPoints","spline","splineProto","AreaSplineRangeSeries","getPointSpline","BoxPlotSeries","highPlot","doQuartiles","whiskerLength","q1Plot","q3Plot","lowPlot","medianPlot","pointWiskerLength","stemAttr","whiskersAttr","medianAttr","stem","whiskers","boxPath","medianShape","medianPath","stemColor","stemWidth","stemDashStyle","whiskerColor","whiskerWidth","whiskerDashStyle","boxDashStyle","medianColor","medianWidth","medianDashStyle","stemX","boxStrokeWidth","whiskerStrokeWidth","q1","q3","connectorClassName","connectorColor","connectorDistance","connectorWidth","maxSize","minSize","legendIndex","ranges","sizeBy","sizeByAbsoluteValue","zThreshold","addToLegend","itemDistance","connectorSpace","bubbleLegend","autoRanges","maxLabel","getMaxLabelSize","movementX","labelHeight","seriesIndex","bubbleAttribs","connectorAttribs","labelAttribs","fillOpacity","getRangeRadius","bubbleSeries","zMax","zMin","getRadius","connectors","bubbleItems","renderRange","hideOverlappingLabels","mainRange","elementCenter","absoluteRadius","labelsAlign","crispMovement","connectorLength","formatLabel","labelSize","oldOpacity","getRanges","rangesOptions","zData","minZ","maxZ","ignoreSeries","displayNegative","predictBubbleSizes","legendOptions","lastLineHeight","pxSizes","getPxExtremes","minPxSize","maxPxSize","plotSize","calculatedSize","updateRanges","bubbleLegendOptions","correctSizes","bubbleSeriesSize","bubbleLegendSize","chartDrawChartBox","getVisibleBubbleSeriesIndex","bubbleSizes","allItems","retranslateItems","getLinesHeights","lastLine","legendItem2","itemHeight","onLegendAfterGetAllItems","bubbleSeriesIndex","onLegendItemClick","orgTranslateX","orgTranslateY","actualLine","LegendClass","scatter","ScatterPoint","BubblePoint","computedSize","ttBelow","ScatterSeries","onAxisFoundExtremes","dataKey","hasActiveSeries","pxMin","pxMax","bubblePadding","onPoint","getRadii","radii","BubbleSeries","AxisClass","zExtremes","bubbleZExtremes","getZExtremes","sizeByArea","zRange","translateBubble","dlBox","getPxSize","isPercent","arearange","ColumnRangePoint","ColumnRangeSeries","translate3dPoints","translate3dShapes","afterColumnTranslate","startAngleRad","heightDifference","safeBounds","pixelPos","rectPlotY","ColumnPyramidSeries","stackHeight","topXwidth","bottomXwidth","invBarPos","x3","x4","topPointY","ErrorBarSeries","valKey","GaugeSeries","dialOptions","dial","baseLength","rearLength","baseWidth","topWidth","overshoot","endAngleRad","pivotOptions","forceDL","onChartLoad","mousedownUnbinder","mousemoveUnbinder","mouseupUnbinder","hasDraggableNodes","onMouseDown","onMouseMove","onMouseUp","normalizedEvent","fixedPosition","inDragMode","diffX","diffY","graphLayoutsLookup","newPlotX","newPlotY","hasDragged","redrawHalo","restartSimulation","enableSimulation","fixedDraggable","onChartAfterPrint","updateSimulation","onChartBeforePrint","onChartPredraw","onChartRender","systemsStable","afterRender","layoutStep","maxIterations","temperature","isStable","beforeStep","integrations","layouts","bubble","useSimulation","parentNodeFormatter","parentNodeTextPath","layoutAlgorithm","initialPositions","initialPositionRadius","parentNodeLimit","seriesInteraction","dragBetweenSeries","parentNodeOptions","gravitationalConstant","maxSpeed","integration","splitSeries","friction","attractive","distanceXY","massFactor","getMass","translatedX","diffTemperature","translatedY","fromNode","degree","toNode","attractiveForceFunction","barycenter","xFactor","yFactor","mass","getK","integrate","prevX","prevY","frictionX","dispX","frictionY","dispY","signX","signY","vectorLength","repulsive","repulsiveForceFunction","centerX","centerY","isParentNode","repNode","distanceR","getDegree","phi","QuadTreeNode","boxSize","divideBox","halfHeight","getBoxPosition","insert","newQuadTreeNode","updateMassAndCenter","pointMass","maxDepth","isRoot","calculateMassAndCenter","visitNodeRecursive","insertNodes","beforeCallback","afterCallback","goFurther","qtNode","ReingoldFruchtermanLayout","currentStep","initialRendering","simulation","euler","verlet","setInitialRendering","attractiveForce","repulsiveForce","approximation","enable","forces","initPositions","setK","resetSimulation","anyLayout","allSeries","createQuadTree","quadTree","forceName","applyLimits","coolDown","startTemperature","prevSystemTemperature","systemTemperature","getSystemTemperature","setArea","linkLength","addElementsToCollection","removeElementFromCollection","forcedStop","setMaxIterations","setTemperature","setDiffTemperature","setCircularPositions","setRandomPositions","nodesLength","rootNodes","linksTo","visitedNodes","addToNodes","linksFrom","sortedNodes","rootNode","unrandom","rand","barycenterForces","getBarycenter","systemMass","barnesHutApproximation","quadNode","getDistXY","goDeeper","theta","repulsiveForces","attractiveForces","applyLimitBox","temperatureStep","vector","getDistR","nodeA","nodeB","xDist","yDist","absX","absY","chartGetSelectedParentNodes","selectedParentsNodes","onChartBeforeRedraw","allDataPoints","PackedBubbleLayout","packedbubble","getSelectedParentNodes","calculateParentRadius","tempDiff","upScaledTemperature","neighbours","parentNodeRadius","initDataLabels","dlOptions","initDataLabelsGroup","initDataLabelsDefer","deferDataLabels","setTextPath","textPathOptions","startOffset","textAnchor","textWrapper","undo","textPathId","textAttribs","setPolygon","tp","descender","lineCleanerRegex","numOfLines","appendTopAndBottom","charIndex","positionOfChar","getRotationOfChar","cosRot","sinRot","lineIndex","lineLen","lineCharIndex","srcCharIndex","getStartPositionOfChar","charPos","getEndPositionOfChar","drawTextPath","getDataLabelPath","dataLabelPath","svgElementProto","PackedBubbleSeries","parentNodeMass","accumulateAllPoints","addLayout","layoutOptions","layoutType","graphLayoutsStorage","collisionNmb","addSeriesLayout","seriesLayout","parentNodeLayout","createParentNodes","seriesBox","calculateZExtremes","valMin","valMax","checkOverlap","bubble1","bubble2","sumRad","PackedBubblePoint","nodeAdded","parentMarkerOptions","dataLabelOnNull","deferLayout","nodeMarker","parentOptions","parentAttribs","parentNodesGroup","getPointRadius","extremes","allDataPointsLength","minRadius","dnPoint","placeBubbles","positionBubble","bubblePos","calculatedBubble","sortedArr","stages","rawPositions","resizeRadius","hasParentMarker","lastBubble","newOrigin","nextBubble","acos","alfa","finalAngle","cosA","sinA","minX","maxX","minY","maxY","POSITIVE_INFINITY","NEGATIVE_INFINITY","spaceRatio","smallerDimension","indexateNodes","LineSeries","PolygonSeries","circular","radial","gridLineInterpolation","radialGauge","minorTickWidth","RadialAxis","beforeSetTickPositions","autoConnect","isCircular","createLabelCollector","createLabelCollectorHidden","getCrosshairPosition","_lineWidth","xBounds","yBounds","angleRad","radiusToPixels","percentRegex","fullRadius","xOnPerimeter","transFrom","transTo","paneInnerR","innerRatio","crossPos","translatedVal","modify","onAxisAfterInit","paneOptions","normalizedStart","normalizedEnd","onAxisAutoLabelAlign","onAxisDestroy","labelCollector","onAxisInit","paneIndex","radialAxis","renderHidden","onAxisInitialAxisTranslation","onTickAfterGetLabelPosition","labelBBox","correctAngle","labelYPosCorrection","optionsY","centerSlot","labelDir","reducedAngle1","reducedAngle2","onTickAfterGetPosition","onGlobalSetOptions","radialDefaultOptions","defaultPolarOptions","wrapTickGetMarkPath","endPoint","TickClass","getConnectors","calculateNeighbours","smoothing","denom","addedNumber","leftContX","leftContY","rightContX","rightContY","jointAngle","prevPointInd","nextPointInd","previousPoint","nextPoint","previousX","previousY","nextX","nextY","dLControlPoint","dRControlPoint","leftContAngle","rightContAngle","prevPointCont","onChartAfterDrawChartBox","onChartAfterInit","onChartGetAxes","onPointerGetSelectionBox","linearAxis","onPointerGetSelectionMarkerAttrs","zoomHor","paneRadRange","pathStart","pathEnd","trimPath","zoomVert","innerPath","outerPath","onSeriesAfterInit","PolarAdditions","isRadialSeries","isRadialBar","onSeriesAfterTranslate","kdByAngle","searchPointByAngleOrInverted","toXY","hasParallelCoordinates","MIN_VALUE","hasClipCircleSetter","circ","clipCircle","searchKDTreePoint","lastTick","firstTick","wrapChartGet","wrapColumnSeriesAlignDataLabel","findAlignments","onAfterColumnTranslate","visibleRange","yMin","pointX","pointY","thresholdAngleRad","brOption","brValue","wrapLineSeriesGetGraphPath","firstValid","popLastPoint","wrapPointerGetCoordinates","wrapPointerPinch","wrapSeriesAnimate","wrapSplineSeriesGetPointSpline","wrapPointPos","AreaSplineRangeSeriesClass","ColumnSeriesClass","LineSeriesClass","SplineSeriesClass","pointerProto","lineProto","polarPlotX","WaterfallAxis","onAxisAfterBuildStacks","waterfall","alreadyChanged","onAxisAfterRender","Composition","waterfallStacks","stackTotalGroup","dummyStackItem","StackItem","WaterfallPoint","isSum","isIntermediateSum","ownProp","WaterfallSeries","subSum","upColor","getCrispPath","graphLineWidth","reversedXAxis","reversedYAxis","prevPoint","prevBox","prevStack","isPos","prevStackX","yPos","connectorThreshold","minPointLengthOffset","nextLast","seriesThreshold","xLength","actualStackX","statesLen","posTotal","negTotal","xPoint","yVal","interSum","totalYVal","actualSum","prevSum","calculateStackState","firstS","nextS","sInx","sOff","stackState","actualStack","stateIndex","absolutePos","absoluteNeg","stackedYNeg","stackedYPos","stackX","halfMinPointLength","hPos","previousIntermediate","tooltipY","crispBottom","Legend","Pointer","areasplinerange","RendererUtilities","distribute","boxes","maxDistance","origBoxes","reducedLen","sortByRank","rank","sortByTarget","restBoxes","boxesLength","forDeletion","equalRank","overlapping","posInCompositeBox","commonSetter","decorateSVGGroup","cssProto","classSetter","getSpanCorrection","alignCorrection","xCorr","yCorr","isSettingWidth","offsetLeft","alignOnAdd","getTextPxLength","currentTextTransform","parentPadding","oldTextWidth","textWidthNum","innerText","cTT","oldRotation","oldAlign","setSpanRotation","transformOrigin","originX","originY","parents","svgGroup","DateTimeAxis","onAfterSetType","Additions","unitsOption","LogarithmicAxis","onAfterInit","minor","minorAutoInterval","intermediate","break2","filteredTickIntervalOption","totalPixelLength","PlotLineOrBandAxis","PlotLineOrBandClass","addPlotBand","updatedOptions","addPlotLine","isFlat","toPathStart","toPathEnd","removePlotBand","removePlotBandOrLine","removePlotLine","PlotLineOrBandType","axisProto","groupAttribs","optionsLabel","svgElem","isBand","isLine","eventsAdded","getLabelText","bBoxWidth","Tooltip","allowShared","isSticky","bodyFormatter","cleanSplit","tt","defaultFormatter","tooltipFooterHeaderFormatter","hideTimer","getAnchor","isSplit","isHeader","getLabel","doSplit","wasSplit","chartStyle","shouldStickOnContact","getPlayingField","boxHeight","outerHeight","outerWidth","buildDimensionArray","dim","swapped","flipped","preferFarSide","firstDimension","outerSize","scaledInnerSize","scaledDist","scaleDiff","roomLeft","roomRight","alignedLeft","alignedRight","secondDimension","pointerEvent","inClass","pointOrPoints","pointConfig","formatString","formatterContext","wasShared","applyInactiveState","currentSeries","renderSplit","checkX","checkY","bounds","tooltipLabel","headerTop","chartLeft","chartTop","distributionBoxTop","headerHeight","adjustedPlotHeight","defaultPositioner","partialTooltip","updatePartialTooltip","boxPosition","boxStart","boxExtremes","anchorPos","labelConfig","isFooter","xDateFormat","tooltipDateKeys","activeSeries","navigatorSeries","inactiveSeries","unbindDocumentMouseUp","unbindDocumentTouchEnd","tooltipTimeout","getSelectionMarkerAttrs","drag","panKey","selectionMarkerFill","panKeyPressed","clickedInside","selectionMarker","mapView","hasZoom","dragStart","mouseIsDown","cancelClick","getSelectionBox","drop","zoomX","zoomY","pinchDown","findNearestKDPoint","isCloserX","isCloser","isAbove","isNode","getHoverData","existingHoverPoint","existingHoverSeries","useExisting","searchSeries","boost","getPoint","relatedTarget","elemClassName","pointerCaptureEventsToUnbind","runChartClick","setDOMEvents","ePos","onContainerClick","pEvt","onContainerMouseDown","isPrimaryButton","onContainerMouseMove","zoomOption","onContainerMouseLeave","hoverChartIndex","onContainerMouseEnter","touchSelect","openMenu","onDocumentTouchEnd","onDocumentMouseUp","onContainerTouchMove","onContainerTouchStart","onDocumentMouseMove","pinch","lastTouches","touchesLength","fireClickEvent","followTouchMove","initiated","boxFromTouches","finger0","finger1","allowMove","tooltipPoints","unDocMouseMove","hoverData","useSharedTooltip","ownerDoc","onmousedown","setPointerCapture","shouldHave","hasPointerCapture","pointerId","releasePointerCapture","hoverChart","relatedTargetObj","hasMoved","initialItemY","itemX","itemY","lastItemY","legendHeight","legendWidth","maxItemWidth","maxLegendWidth","pages","titleHeight","totalItemWidth","positionCheckboxes","proximate","proximatePositions","positionItems","hiddenColor","colorizeHidden","positionItem","ltr","getAllItems","clipHeight","scrollOffset","checkboxOffset","renderTitle","contentGroup","setText","renderItem","isSeries","createCheckboxForItem","itemClassName","itemExtraWidth","scrollGroup","setItemEvents","itemWidth","fontMetricsH","layoutItem","getAlignment","alignment","alignments","alignLeft","useFirstPoint","allowedWidth","legendGroup","alignTop","navOptions","arrowSize","clipToHeight","addTracker","nav","lastY","spaceHeight","currentPage","fullHeight","pageIx","pager","scrollBy","pageCount","upTracker","downTracker","legendLabel","isPoint","activeClass","legendElements","setOtherItemsState","otherItem","browserEvent","defaultChecked","ScrollablePlotArea","applyFixed","markDirty","afterSetSize","recalculateHoriz","scrollableOptions","moveFixedElements","WebkitOverflowScrolling","overflowX","overflowY","parentDiv","innerContainer","fixedDiv","fixedRenderer","lastHoverPoint","mask","scrollPositionX","scrollPositionY","scrollableWidth","scrollableHeight","maskTop","maskLeft","maskBottom","maskRight","maskPlotRight","maskPlotBottom","redrawTrigger","fixedSelectors","axisClass","chartGetStacks","oldStacks","xAxisOptions","AxisAdditions","seriesGetStackIndicator","seriesModifyStacks","stacker","pointExtremes","seriesPercentStacker","totalFactor","seriesSetGroupedPoints","resetStacks","seriesSetStackedPoints","stackingParam","negKey","stacksTouched","singleStacks","actualSeries","setGroupedPoints","modifyStacks","stackLabelsAnim","StackingAxis","percentStacker","gappedPath","preventGraphAnimation","fillGraph","nullsAsZeroes","connectCliffs","gap","pathToPoint","shiftUnit","bottomPoints","graphPoints","addDummyPoints","otherI","stackedValues","nullVal","cliffVal","isCliff","getStackPoints","leftNull","rightNull","topPath","bottomPath","firstBottomPoint","pointMap","yAxisSeries","seriesLength","upOrDown","stackPoint","nullName","cliffName","otherStack","cliff","si","SplineSeries","otherPoint","lastX","correction","controlPoints","AreaSplineSeries","DataLabel","mergedDataLabelOptions","justify","unrotatedbBox","setDataLabelStartPos","contrastColor","seriesDlOptions","mergeArrays","labelEnabled","dataLabelOnHidden","operator","applyFilter","labelText","labelBgColor","horizontalAxis","horizontalAxisShift","verticalAxis","verticalAxisShift","labelCenter","ColumnDataLabel","xLen","yLen","BarSeries","applyJitter","jitter","plotProp","translatedJitter","seed","PiePoint","getConnectorPath","labelPosition","dataLabelPosition","connectorShape","shapeFunc","connectorShapes","connectorPosition","getTranslate","sliced","slicedTranslation","half","toggleSlice","fixedOffset","breakAt","touchingSliceAt","lineSegment","softConnector","straight","crookedLine","diameter","leftAligned","crookX","crookDistance","tan","PieSeries","startR","drawEmpty","delayedRendering","getX","groupTranslation","animateTo","sortByAngle","radians","ignoreHiddenPoint","radiusX","radiusY","connectorPadding","dataLabelPositioners","radialDistributionY","distributeBox","radialDistributionX","naturalY","seriesCenter","alignToPlotEdges","dataLabelWidth","alignToConnectors","maxDataLabelWidth","getDataLabelPosition","cosAngle","sinAngle","finalConnectorOffset","natural","halves","maxLabelDistance","shortened","halfIdx","distributionLength","topOffset","posAttribs","sideOverflow","verifyDataLabelOverflow","placeDataLabels","newSize","pieProto","GeometryUtilities","getCenterOfPoints","getDistanceBetweenPoints","getAngleBetweenPoints","pointInPolygon","chartHideOverlappingLabels","isIntersectRect","box1","box2","isPolygonOverlap","box1Poly","box2Poly","getAbsoluteBox","label1","label2","isLabelAffected","absoluteBox","toHide","overlappingLabel","hideOrShow","isOld","collector","Responsive","matchResponsiveRule","_id","responsive","currentResponsive","undoOptions","ruleIds","ruleId","currentRuleIds","updatingResponsive","OverlappingDataLabels","Templating","Defaults","BorderRadius","PieDataLabel","Utilities","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","LN2","factory","converter","expires","toUTCString","stringifiedAttributes","jar","cookies","getJSON","withConverter","lastId","_leaflet_id","wrapNum","includeMax","falseFn","formatNum","splitWords","templateRe","emptyImageUrl","getPrefixed","lastTime","timeoutDefer","timeToCall","requestFn","cancelFn","requestAnimFrame","immediate","cancelAnimFrame","NewClass","Util.setOptions","callInitHooks","parentProto","__super__","Util.create","statics","Util.extend","Mixin","Util.isArray","Events","checkDeprecatedMixinEvents","_initHooks","_initHooksCalled","mergeOptions","addInitHook","_on","Util.splitWords","_off","removeAll","_events","_once","_listens","newListener","_firingCount","Util.falseFn","propagate","listens","sourceTarget","_propagateEvent","_fn","_eventParents","addEventParent","Util.stamp","removeEventParent","layer","propagatedFrom","clearAllEventListeners","addOneTimeEventListener","hasEventListeners","Evented","trunc","toPoint","Bounds","toBounds","LatLngBounds","corner1","corner2","latlngs","toLatLngBounds","LatLng","lat","toLatLng","lon","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","scaleBy","unscaleBy","_round","_floor","_ceil","_trunc","distanceTo","min2","max2","getBottomLeft","getTopRight","getTopLeft","getBottomRight","getSize","intersects","xIntersects","yIntersects","overlaps","xOverlaps","yOverlaps","bufferRatio","heightBuffer","widthBuffer","sw2","ne2","sw","_southWest","_northEast","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","latIntersects","lngIntersects","latOverlaps","lngOverlaps","toBBoxString","maxMargin","Util.formatNum","Earth","wrapLatLng","sizeInMeters","latAccuracy","lngAccuracy","CRS","latLngToPoint","latlng","projectedPoint","projection","project","transformation","_transform","pointToLatLng","untransformedPoint","untransform","unproject","getProjectedBounds","infinite","wrapLng","Util.wrapNum","wrapLat","wrapLatLngBounds","newCenter","latShift","lngShift","latlng1","latlng2","lat1","lat2","sinDLat","sinDLon","earthRadius","SphericalMercator","MAX_LATITUDE","atan","Transformation","_a","_b","_d","toTransformation","EPSG3857","EPSG900913","svgCreate","pointsToPath","rings","closed","Browser","ie","ielt9","edge","webkit","userAgentContains","android","android23","webkitVer","androidStock","gecko","safari","phantom","opera12","ie3d","webkit3d","WebKitCSSMatrix","gecko3d","any3d","L_DISABLE_3D","mobileWebkit","mobileWebkit3d","msPointer","PointerEvent","MSPointerEvent","touchNative","TouchEvent","L_NO_TOUCH","mobileOpera","mobileGecko","retina","devicePixelRatio","screen","deviceXDPI","logicalXDPI","passiveEvents","supportsPassiveOption","canvas","getContext","inlineSvg","vml","adj","mac","linux","POINTER_DOWN","POINTER_MOVE","POINTER_UP","POINTER_CANCEL","pEvent","touchcancel","MSPOINTER_TYPE_TOUCH","pointerType","DomEvent.preventDefault","_handlePointer","_pointers","_pointerDocListener","_globalPointerDown","_globalPointerMove","_globalPointerUp","MSPOINTER_TYPE_MOUSE","disableTextSelection","enableTextSelection","_userSelect","_outlineElement","_outlineStyle","TRANSFORM","testProp","TRANSITION","TRANSITION_END","currentStyle","defaultView","empty","toBack","getClass","setClass","Util.trim","correspondingElement","Enabled","Opacity","_setOpacityIE","setTransform","_leaflet_pos","DomEvent.on","DomEvent.off","userSelectProperty","disableImageDrag","enableImageDrag","preventOutline","restoreOutline","outlineStyle","getScale","boundingClientRect","addOne","eventsKey","batchRemove","removeOne","Util.indexOf","filterFn","mouseSubst","mouseenter","mouseleave","wheel","originalHandler","addPointerListener","simDblclick","DomEvent.getPropagationPath","HTMLInputElement","newEvent","isTrusted","_simulated","makeDblclick","dblclick","addDoubleTapListener","isExternalTarget","attachEvent","removePointerListener","removeDoubleTapListener","detachEvent","_stopped","cancelBubble","disableScrollPropagation","disableClickPropagation","wheelPxFactor","related","PosAnimation","newPos","easeLinearity","_el","_inProgress","_duration","_easeOutPower","_startPos","DomUtil.getPosition","_offset","_startTime","_animate","_animId","Util.requestAnimFrame","_runFrame","_easeOut","DomUtil.setPosition","Util.cancelAnimFrame","crs","minZoom","layers","maxBounds","zoomAnimation","zoomAnimationThreshold","fadeAnimation","markerZoomAnimation","transform3DLimit","zoomSnap","zoomDelta","trackResize","_handlers","_layers","_zoomBoundLayers","_sizeChanged","_initContainer","_initLayout","_onResize","Util.bind","_initEvents","setMaxBounds","_zoom","_limitZoom","setView","_zoomAnimated","DomUtil.TRANSITION","_createAnimProxy","_proxy","DomUtil.TRANSITION_END","_catchTransitionEnd","_addLayers","_limitCenter","_stop","_loaded","_tryAnimatedZoom","_tryAnimatedPan","_sizeTimer","_resetView","noMoveStart","setZoom","zoomIn","delta","setZoomAround","getZoomScale","viewHalf","centerOffset","latLngToContainerPoint","containerPointToLatLng","_getBoundsCenterZoom","paddingTL","paddingTopLeft","paddingBR","paddingBottomRight","getBoundsZoom","paddingOffset","swPoint","nePoint","fitWorld","panTo","panBy","getZoom","_panAnim","_onPanTransitionStep","_onPanTransitionEnd","DomUtil.addClass","_mapPane","_getMapPanePos","_rawPanBy","flyTo","targetCenter","targetZoom","startZoom","w1","u1","rho","rho2","sq","sinh","cosh","r0","_moveStart","frame","easeOut","_flyToFrame","_move","getScaleZoom","_moveEnd","flyToBounds","_panInsideMaxBounds","setMinZoom","oldZoom","setMaxZoom","panInsideBounds","_enforcingBounds","panInside","pixelCenter","pixelPoint","pixelBounds","getPixelBounds","paddedBounds","paddedSize","invalidateSize","oldSize","_lastCenter","oldCenter","debounceMoveend","locate","_locateOptions","watch","_handleGeolocationError","onResponse","_handleGeolocationResponse","_locationWatchId","geolocation","watchPosition","getCurrentPosition","stopLocate","clearWatch","_container","coords","accuracy","addHandler","HandlerClass","_containerId","DomUtil.remove","_clearControlPos","_resizeRequest","_clearHandlers","_panes","_renderer","createPane","DomUtil.create","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","nw","se","boundsSize","scalex","scaley","_size","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_pixelOrigin","getPixelWorldBounds","getPane","getPanes","toZoom","fromZoom","latLngToLayerPoint","containerPointToLayerPoint","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","DomEvent.getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","DomUtil.get","_onScroll","_fadeAnimated","DomUtil.getStyle","_initPanes","_initControlPos","panes","_paneRenderers","markerPane","shadowPane","zoomChanged","supressEvent","_getNewPixelOrigin","_getZoomSpan","_targets","onOff","_handleDOMEvent","_onMoveEnd","_findEventTargets","isHover","srcElement","dragging","_draggableMoved","DomEvent.isExternalTarget","_isClickDisabled","DomUtil.preventOutline","_fireDOMEvent","_mouseEvents","canvasTargets","synth","filtered","getLatLng","_radius","containerPoint","bubblingMouseEvents","boxZoom","_latLngToNewLayerPoint","_latLngBoundsToNewLayerBounds","latLngBounds","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","projectedMaxBounds","minOffset","maxOffset","_rebound","DomUtil.removeClass","proxy","mapPane","DomUtil.TRANSFORM","DomUtil.setTransform","_animatingZoom","_onZoomTransitionEnd","_animMoveEnd","_destroyAnimProxy","_nothingToAnimate","getElementsByClassName","_animateZoom","startAnim","noUpdate","_animateToCenter","_animateToZoom","_tempFireZoomEvent","createMap","Control","removeControl","addControl","corner","_controlCorners","onRemove","_refocusOnMap","screenX","screenY","control","corners","_controlContainer","createCorner","vSide","hSide","Layers","collapsed","autoZIndex","hideSingleBase","sortLayers","layerA","layerB","nameA","nameB","baseLayers","overlays","_layerControlInputs","_lastZIndex","_handlingClick","_preventClick","_addLayer","_checkDisabledLayers","_onLayerChange","_expandIfNotCollapsed","addBaseLayer","removeLayer","_getLayer","expand","_section","acceptableHeight","collapse","DomEvent.disableClickPropagation","DomEvent.disableScrollPropagation","_expandSafely","_layersLink","keydown","_baseLayersList","_separator","_overlaysList","setZIndex","DomUtil.empty","baseLayersPresent","overlaysPresent","baseLayersCount","_addItem","_createRadioElement","radioHtml","radioFragment","hasLayer","layerId","_onInputClick","holder","inputs","addedLayers","removedLayers","addLayer","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","_disabled","DomEvent.stop","zoomControl","Scale","metric","imperial","_addScales","updateWhenIdle","_mScale","_iScale","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_updateScale","maxMiles","miles","feet","maxFeet","pow10","Attribution","ukrainianFlag","_attributions","attributionControl","getAttribution","addAttribution","_addAttribution","removeAttribution","setPrefix","prefixAndAttribs","Handler","_enabled","addHooks","removeHooks","_lastCode","START","Draggable","clickTolerance","dragStartTarget","_dragStartTarget","_preventOutline","_onDown","_dragging","finishDrag","DomUtil.hasClass","DomUtil.disableImageDrag","DomUtil.disableTextSelection","_moving","sizedParent","DomUtil.getSizedParentNode","_startPoint","_parentScale","DomUtil.getScale","mouseevent","_onMove","_onUp","_lastTarget","SVGElementInstance","correspondingUseElement","_newPos","_lastEvent","noInertia","DomUtil.enableImageDrag","DomUtil.enableTextSelection","fireDragend","clipPolygon","clippedPoints","edges","_code","LineUtil._getBitCode","LineUtil._getEdgeIntersection","centroid","latSum","lngSum","simplify","tolerance","sqTolerance","reducedPoints","_reducePoints","_simplifyDPStep","newPoints","_simplifyDP","pointToSegmentDistance","_sqClosestPointOnSegment","sqDist","maxSqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_getBitCode","codeB","_getEdgeIntersection","LonLat","Mercator","R_MINOR","con","ts","dphi","EPSG3395","EPSG4326","Simple","Layer","removeFrom","_mapToAdd","addInteractiveTarget","targetEl","removeInteractiveTarget","_layerAdd","getEvents","beforeAdd","eachLayer","_addZoomLimit","_updateZoomLevels","_removeZoomLimit","oldZoomSpan","LayerGroup","getLayerId","clearLayers","invoke","getLayer","getLayers","FeatureGroup","bringToBack","popupAnchor","tooltipAnchor","createIcon","oldIcon","_createIcon","createShadow","_getIconUrl","_createImg","_setIconStyles","sizeOption","shadowAnchor","iconAnchor","IconDefault","iconUrl","iconRetinaUrl","shadowUrl","iconSize","shadowSize","_detectIconPath","_stripUrl","strip","re","MarkerDrag","_marker","_icon","_draggable","dragstart","_onDragStart","predrag","_onPreDrag","_onDrag","dragend","_onDragEnd","_adjustPan","speed","autoPanSpeed","autoPanPadding","iconPos","origin","panBounds","movement","_panRequest","_oldLatLng","closePopup","autoPan","_shadow","_latlng","oldLatLng","Marker","interactive","keyboard","zIndexOffset","riseOnHover","riseOffset","autoPanOnFocus","latLng","_initIcon","_removeIcon","_removeShadow","viewreset","setLatLng","setZIndexOffset","getIcon","setIcon","_popup","getElement","_setPos","classToAdd","addIcon","mouseover","_bringToFront","mouseout","_resetZIndex","_panOnFocus","newShadow","addShadow","_updateOpacity","_initInteraction","_zIndex","_updateZIndex","DomUtil.setOpacity","iconOpts","_getPopupAnchor","_getTooltipAnchor","Path","weight","lineCap","lineJoin","dashArray","dashOffset","fillRule","getRenderer","_initPath","_reset","_addPath","_removePath","_updatePath","_updateStyle","_updateBounds","_bringToBack","_project","_clickTolerance","CircleMarker","setRadius","_point","r2","_radiusY","_pxBounds","_updateCircle","_empty","_bounds","_containsPoint","Circle","legacyOptions","_mRadius","latR","lngR","Polyline","smoothFactor","noClip","_setLatLngs","getLatLngs","_latlngs","setLatLngs","closestLayerPoint","minDistance","minPoint","LineUtil._sqClosestPointOnSegment","jLen","_parts","halfDist","segDist","centroidLatLng","latlngCenter","LineUtil.polylineCenter","_defaultShape","addLatLng","_convertLatLngs","LineUtil.isFlat","_rings","_projectLatlngs","_rawPxBounds","projectedBounds","ring","_clipPoints","LineUtil.clipSegment","_simplifyPoints","LineUtil.simplify","_updatePoly","LineUtil.pointToSegmentDistance","_flat","Polygon","PolyUtil.polygonCenter","clipped","PolyUtil.clipPolygon","GeoJSON","geojson","addData","geometries","geometry","geometryToLayer","asFeature","resetStyle","onEachFeature","_setLayerStyle","pointToLayer","_coordsToLatLng","coordsToLatLng","_pointToLayer","coordsToLatLngs","geoLayer","featureLayer","pointToLayerFn","markersInheritOptions","levelsDeep","latLngToCoords","latLngsToCoords","getFeature","newGeometry","PointToGeoJSON","toGeoJSON","holes","toMultiPoint","isGeometryCollection","jsons","ImageOverlay","errorOverlayUrl","_image","_initImage","styleOpts","DomUtil.toFront","DomUtil.toBack","setUrl","setBounds","zoomanim","wasElementSupplied","onselectstart","_overlayOnError","errorUrl","autoplay","loop","keepAspectRatio","muted","playsInline","vid","onloadeddata","sourceElements","sources","DivOverlay","_source","_content","_prepareOpen","_removeTimeout","getContent","setContent","_updateContent","_updateLayout","_contentNode","hasChildNodes","_getAnchor","_containerBottom","_containerLeft","_containerWidth","_initOverlay","OverlayClass","Popup","autoPanPaddingTopLeft","autoPanPaddingBottomRight","keepInView","closeButton","autoClose","closeOnEscapeKey","popup","DomEvent.stopPropagation","closeOnClick","closePopupOnClick","preclick","moveend","_wrapper","_tipContainer","_tip","_closeButton","scrolledClass","_autopanning","containerHeight","containerWidth","layerPos","containerPos","openPopup","_popupHandlersAdded","_openPopup","keypress","_onKeyPress","_movePopup","unbindPopup","togglePopup","isPopupOpen","setPopupContent","getPopup","permanent","sticky","_setPosition","subX","subY","tooltipPoint","tooltipWidth","tooltipHeight","openTooltip","closeTooltip","bindTooltip","_tooltip","isTooltipOpen","unbindTooltip","_initTooltipInteractions","_tooltipHandlersAdded","_moveTooltip","_openTooltip","_addFocusListeners","mousemove","_setAriaDescribedByOnLayer","toggleTooltip","setTooltipContent","getTooltip","_addFocusListenersOnLayer","moving","_openOnceFlag","bgPos","backgroundPosition","GridLayer","tileSize","updateWhenZooming","updateInterval","maxNativeZoom","minNativeZoom","keepBuffer","_levels","_tiles","_removeAllTiles","_tileZoom","_setAutoZIndex","isLoading","tileZoom","_clampZoom","_updateLevels","lock","wrapperFn","later","viewprereset","_invalidateAll","createTile","getTileSize","edgeZIndex","nextFrame","willPrune","fade","_onOpaqueTile","_noPrune","_pruneTiles","_fadeFrame","_onUpdateLevel","_removeTilesAtZoom","_onRemoveLevel","_setZoomTransform","_onCreateLevel","_level","retain","_retainParent","_retainChildren","_removeTile","z2","coords2","_tileCoordsToKey","_setView","noPrune","tileZoomChanged","_abortLoading","_resetGrid","_setZoomTransforms","_tileSize","_globalTileRange","_pxBoundsToTileRange","_wrapX","_wrapY","_getTiledPixelBounds","mapZoom","halfSize","tileRange","tileCenter","noPruneRange","_isValidTile","_addTile","tileBounds","_tileCoordsToBounds","_keyToBounds","_keyToTileCoords","_tileCoordsToNwSe","nwPoint","sePoint","bp","_initTile","tilePos","_getTilePos","_wrapCoords","_tileReady","_noTilesToLoad","newCoords","TileLayer","subdomains","errorTileUrl","tms","zoomReverse","detectRetina","referrerPolicy","_onTileRemove","noRedraw","_tileOnLoad","_tileOnError","getTileUrl","_getSubdomain","_getZoomForUrl","invertedY","Util.template","tilePoint","Util.emptyImageUrl","TileLayerWMS","defaultWmsParams","transparent","uppercase","wmsParams","realRetina","_crs","_wmsVersion","projectionKey","bbox","existingUrl","getParamString","setParams","WMS","wms","_updatePaths","_destroyContainer","_onZoom","zoomend","_onZoomEnd","_onAnimZoom","_updateTransform","currentCenterPoint","_center","topLeftOffset","Canvas","_onViewPreReset","_postponeUpdatePaths","_draw","_onMouseMove","_handleMouseOut","_ctx","_redrawRequest","_redrawBounds","_redraw","_updateDashArray","_drawLast","_drawFirst","_requestRedraw","_extendRedrawBounds","dashValue","_dashArray","_clear","clearRect","restore","beginPath","_drawing","closePath","_fillStroke","globalAlpha","fillStyle","setLineDash","strokeStyle","clickedLayer","_fireEvent","_handleMouseHover","_hoveredLayer","_mouseHoverThrottled","candidateHoveredLayer","vmlCreate","vmlMixin","coordsize","_stroke","_fill","stroked","filled","endcap","joinstyle","_setPath","SVG","_rootGroup","_svgSize","_getPaneRenderer","_createRenderer","preferCanvas","_boundsToLatLngs","BoxZoom","_pane","overlayPane","_resetStateTimeout","_destroy","_onMouseDown","_resetState","_clearDeferredResetState","mouseup","_onMouseUp","_box","_finish","boxZoomBounds","doubleClickZoom","DoubleClickZoom","_onDoubleClick","inertia","inertiaDeceleration","inertiaMaxSpeed","worldCopyJump","maxBoundsViscosity","Drag","_onPreDragLimit","_onPreDragWrap","_positions","_times","_offsetLimit","_viscosity","_lastTime","_lastPos","_absPos","_prunePositions","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","_viscousLimit","worldWidth","newX1","newX2","newX","ease","speedVector","limitedSpeed","limitedSpeedVector","decelerationDuration","keyboardPanDelta","Keyboard","keyCodes","_setPanDelta","_setZoomDelta","_addHooks","_removeHooks","_focused","docEl","panDelta","_panKeys","_zoomKeys","newLatLng","scrollWheelZoom","wheelDebounceTime","wheelPxPerZoomLevel","ScrollWheelZoom","_onWheelScroll","_delta","deltaMode","deltaZ","DomEvent.getWheelDelta","_lastMousePos","_performZoom","d2","d3","d4","tapHold","tapTolerance","TapHold","_holdTimeout","_cancel","_isTapValid","_cancelClickPrevent","_simulateEvent","cancelClickPrevent","simulatedEvent","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","_centerPoint","_startLatLng","_pinchStartLatLng","_startDist","_startZoom","_onTouchMove","_onTouchEnd","_animRequest","moveFn","displayInlineFlex","flexFactor","flexFactorAuto","flexFactorNone","displayNone","flex2","flex3","flex4","flex5","flex6","flex7","flex8","flex9","flex10","flex11","flex12","horizontalReverse","verticalReverse","wrapReverse","displayBlock","invisible","relative","fixedTop","fixedRight","fixedLeft","fixedBottom","startAligned","startJustified","aroundJustified","selfStart","selfCenter","selfEnd","selfStretch","selfBaseline","startAlignedContent","endAlignedContent","beteweenAlignedContent","aroundAlignedContent","defineLocale","weekdaysMin","meridiemParse","isPM","meridiem","isLower","longDateFormat","LT","LTS","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","mm","hh","dd","MM","yy","dayOfMonthOrdinalParse","dow","doy","pluralForm","pluralize","withoutSuffix","isFuture","weekdaysParseExact","postformat","symbolMap","preparse","numberMap","suffixes","relativeTimeWithPlural","forms","isFormat","period","ww","lastDigit","last2Digits","meridiemHour","monthsShortRegex","monthsParseExact","relativeTimeWithMutation","mutationTable","softMutation","lastNumber","monthsParse","monthsRegex","minWeekdaysParse","weekdaysParse","fullWeekdaysParse","shortWeekdaysParse","monthsStrictRegex","monthsShortStrictRegex","longMonthsParse","shortMonthsParse","ll","lll","llll","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","mom","_calendarEl","monthsShortDot","numbersPast","numbersFuture","verbalNumber","monthsShortWithDots","monthsShortWithoutDots","weekEndings","eras","since","narrow","abbr","until","eraYearOrdinalRegex","eraYearOrdinalParse","$0","$1","$2","isUpper","ezafeNumSuffix","eifelerRegelAppliesToNumber","translateSingular","special","relativeTimeWithSingular","correctGrammaticalCase","wordKey","relativeTimeMr","monthsNominative","monthsSubjective","separator","numbersNouns","numberNoun","hundred","ten","numberAsNoun","hm","processHoursFunction","nominative","accusative","genitive","hookCallback","hasOwnProp","isObjectEmpty","isUndefined","isDate","arrLen","createUTC","createLocalOrUTC","utc","getParsingFlags","_pf","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidEra","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","era","rfc2822","weekdayMismatch","parsedParts","isNowValid","invalidWeekday","_strict","bigHour","isFrozen","_isValid","createInvalid","fun","momentProperties","updateInProgress","copyConfig","momentPropertiesLen","_isAMomentObject","_f","_l","_tzm","_isUTC","_locale","Moment","updateOffset","isMoment","suppressDeprecationWarnings","deprecate","firstTime","deprecationHandler","argLen","deprecations","deprecateSimple","mergeConfigs","parentConfig","childConfig","Locale","zeroFill","targetLength","forceSign","absNumber","zerosToFill","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","padded","localeData","formatMoment","expandFormat","makeFormatFunction","replaceLongDateFormatTokens","D","weekday","E","isoweekdays","isoweekday","DDD","dayofyears","dayofyear","milliseconds","quarters","quarter","gg","weekyears","weekyear","GG","isoweekyears","isoweekyear","weeks","isoweeks","isoweek","normalizeUnits","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","isoWeekday","dayOfYear","weekYear","isoWeekYear","isoWeek","regexes","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","match1to2NoLeadingZero","match1to2HasZero","addRegexToken","strictRegex","isStrict","getParseRegexForToken","p3","p4","absFloor","argumentForCoercion","coercedNumber","addParseToken","tokenLen","addWeekParseToken","_w","addTimeToArrayFromToken","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","daysInYear","getSetYear","makeGetSet","keepTime","set$1","isUTC","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getDay","getMonth","getFullYear","setUTCMilliseconds","setMilliseconds","setUTCSeconds","setSeconds","setUTCMinutes","setMinutes","setUTCHours","setHours","setUTCDate","setDate","setUTCFullYear","setFullYear","daysInMonth","modMonth","defaultLocaleMonths","defaultLocaleMonthsShort","MONTHS_IN_FORMAT","defaultMonthsShortRegex","defaultMonthsRegex","handleStrictParse","monthName","ii","llc","_monthsParse","_longMonthsParse","_shortMonthsParse","setMonth","setUTCMonth","getSetMonth","computeMonthsParse","cmpLenRev","shortP","longP","shortPieces","longPieces","mixedPieces","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","createDate","createUTCDate","firstWeekOffset","fwd","dayOfYearFromWeeks","resYear","resDayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","shiftWeekdays","ws","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","lowercase","matchMeridiem","_meridiemParse","kInput","_isPm","_meridiem","pos1","pos2","getSetHour","globalLocale","localeFamilies","commonPrefix","arr1","arr2","minl","normalizeLocale","loadLocale","oldLocale","isLocaleNameSane","_abbr","getSetGlobalLocale","getLocale","_config","parentLocale","chooseLocale","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromISO","allowTime","tzFormat","isoDatesLen","isoTimesLen","configFromStringAndFormat","untruncateYear","configFromRFC2822","parsedArray","hourStr","minuteStr","secondStr","weekdayStr","parsedInput","checkWeekday","obsOffset","militaryOffset","numOffset","calculateOffset","configFromArray","currentDate","expectedWeekday","yearToUse","nowValue","_useUTC","currentDateArray","weekdayOverflow","curWeek","createLocal","_week","_dayOfYear","dayOfYearFromWeekInfo","_nextDay","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","isPm","meridiemFixWrap","erasConvertYear","prepareConfig","tempConfig","bestMoment","scoreToBeat","currentScore","validFormatFound","bestFormatIsValid","configfLen","configFromStringAndArray","createFromInputFallback","configFromString","dayOrDate","configFromObject","configFromInput","prototypeMin","prototypeMax","pickBy","moments","ordering","Duration","unitHasDecimal","orderLen","isDurationValid","_milliseconds","_days","_months","_data","_bubble","isDuration","absRound","utcOffset","offsetFromString","cloneWithOffset","local","getDateOffset","isUtc","aspNetRegex","isoRegex","createDuration","diffRes","parseIso","isBefore","positiveMomentsDifference","inp","isAfter","createAdder","addSubtract","isAdding","isMomentInput","arrayTest","dataTypeTest","isNumberOrStringArray","objectTest","propertyTest","propertyLen","isMomentInputObject","monthDiff","wholeMonthDiff","newLocaleData","defaultFormat","defaultFormatUtc","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_400_YEARS","mod$1","dividend","divisor","localStartOfDate","utcStartOfDate","matchEraAbbr","erasAbbrRegex","computeErasParse","erasName","erasAbbr","erasNarrow","abbrPieces","namePieces","narrowPieces","_erasRegex","_erasNameRegex","_erasAbbrRegex","_erasNarrowRegex","addWeekYearFormatToken","getter","getSetWeekYearHelper","weeksTarget","setWeekAll","dayOfYearData","erasNameRegex","erasNarrowRegex","erasParse","_eraYearOrdinalRegex","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetMillisecond","getSetSecond","parseMs","preParsePostFormat","isCalendarSpec","sod","startOf","calendarFormat","asFloat","zoneDelta","endOf","startOfDate","inputString","humanize","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","localFrom","localTo","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","getPrioritizedUnits","prioritizedLen","toArray","keepOffset","isLocal","unix","creationData","eraName","eraNarrow","eraAbbr","eraYear","isoWeeks","weekInfo","weeksInWeekYear","isoWeeksInYear","isoWeeksInISOWeekYear","parseWeekday","parseIsoWeekday","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","isDSTShifted","_isDSTShifted","array1","array2","dontConvert","lengthDiff","diffs","compareArrays","proto$1","get$1","listMonthsImpl","listWeekdaysImpl","localeSorted","_calendar","_longDateFormat","formatUpper","tok","_invalidDate","_ordinal","_relativeTime","pastFuture","_eras","_monthsShort","_monthsParseExact","firstDayOfYear","firstDayOfWeek","_weekdays","_weekdaysMin","_weekdaysShort","_weekdaysParseExact","_fullWeekdaysParse","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asQuarters","asYears","valueOf$1","makeGetter","thresholds","substituteTimeAgo","abs$1","toISOString$1","totalSign","ymSign","daysSign","hmsSign","proto$2","monthsFromDays","argWithSuffix","argThresholds","withSuffix","th","posNegDuration","relativeTime$1","toIsoString","updateLocale","tmpLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","myMoment","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","baseElement","_storeUnsubscribe","_state","responseURL","responseText","const","getAllResponseHeaders","withCredentials","_typeof","assertString","invalidType","he","bn","eo","alphanumeric","decimal","englishLocales","arabicLocales","_locale2","farsiLocales","_i2","_locale3","bengaliLocales","_i3","dotDecimal","commaDecimal","_i4","_i5","isFloat","_float","toFloat","defaulContainsOptions","ignoreCase","minOccurrences","isByteLength","default_fqdn_options","allow_underscores","allow_trailing_dot","allow_numeric_tld","allow_wildcard","ignore_max_length","isFQDN","tld","IPv4SegmentFormat","IPv4AddressFormat","IPv4AddressRegExp","IPv6SegmentFormat","IPv6AddressRegExp","default_email_options","allow_display_name","require_display_name","allow_utf8_local_part","blacklisted_chars","host_blacklist","host_whitelist","splitNameAddress","emailUserPart","gmailUserPart","quotedEmailUser","emailUserUtf8Part","quotedEmailUserUtf8","display_email","display_name","display_name_without_quotes","validateDisplayName","lower_domain","domain_specific_validation","_user_parts","allow_ip_domain","noBracketdomain","user_parts","default_url_options","protocols","require_protocol","require_host","require_port","require_valid_protocol","allow_protocol_relative_urls","allow_fragments","allow_query_components","validate_length","wrapped_ipv6","checkHost","macAddress48","macAddress48NoSeparators","macAddress48WithDots","macAddress64","macAddress64NoSeparators","macAddress64WithDots","subnetMaybe","minLen","default_date_options","delimiters","strictMode","formatDelimiter","delimiter","dateDelimiter","dateAndFormat","zippedArr","zip","dateObj","_iterator","normalCompletion","didErr","_e2","_createForOfIteratorHelper","_step$value","dateWord","formatWord","parsedYear","default_time_options","hourFormat","hour24","withSeconds","hour12","strictBooleans","looseBooleans","privateuse","grandfathered","langtag","languageTagRegex","isRoutingReg","numericNoSymbols","passportRegexByCountryCode","AM","AR","AT","AU","AZ","BE","BG","BR","BY","CA","CH","CN","CY","CZ","DE","DK","DZ","EE","ES","FI","FR","GB","GR","HR","HU","IE","IN","ID","IR","IS","IT","JM","JP","KR","KZ","LI","LU","LV","LY","MT","MZ","MY","MX","NL","NZ","PH","PK","PL","PT","RO","RU","SE","SL","SK","TH","TR","UA","US","ZA","_int","intLeadingZeroes","allow_leading_zeroes","minCheckPassed","maxCheckPassed","ltCheckPassed","gtCheckPassed","regexpAsStringLiteral","imeiRegexWithoutHypens","imeiRegexWithHypens","ascii","fullWidth","multibyte","semanticVersioningRegex","default_decimal_options","force_decimal","decimal_digits","blacklist","hexadecimal","isHexadecimal","octal","hexcolor","rgbColor","rgbaColor","rgbColorPercent","rgbaColorPercent","hslComma","hslSpace","isrc","ibanRegexThroughCountryCode","AD","AE","AL","BA","BH","CR","DO","EG","FO","GE","GI","GL","GT","IL","IQ","JO","KW","LB","LC","MA","MC","MD","ME","MK","MR","MU","NO","PS","QA","RS","SA","SC","SI","SM","SV","TL","TN","VA","VG","XK","validISO31661Alpha2CountriesCodes","CountryCodes","isBICReg","md5","md4","sha1","sha384","sha512","ripemd128","ripemd160","tiger128","tiger160","tiger192","crc32","crc32b","notBase64","urlSafeBase64","defaultBase64Options","urlSafe","isBase64","firstPaddingChar","default_json_options","allow_primitives","default_is_empty_options","ignore_whitespace","uuid","isLuhnNumber","tmpNum","shouldDouble","amex","dinersclub","discover","jcb","mastercard","unionpay","visa","allCards","tmpCardsArray","cardProvider","validators","weightOfDigits","modulo","charsValue","X","Z","_char","k1","LK","incNum","idCardNo","provincesAndCities","powers","parityBit","checkAddressCode","addressCode","checkBirthDayCode","birDayCode","yyyy","xdata","check15IdCardNo","id17","power","getParityBit","checkParityBit","check18IdCardNo","regexIsDigit","checkSumVal","ALPHABET_CODES","J","K","N","validEanRegex","isin","possibleIsbn10","possibleIsbn13","iso7064Check","checkvalue","luhnCheck","checksum","reverseMultiplyAndSum","digits","enUsCampusPrefix","andover","atlanta","austin","brookhaven","cincinnati","fresno","internet","kansas","memphis","ogden","philadelphia","sba","itItNameCheck","vowelflag","xflag","taxIdFormat","taxIdCheck","tin","century_year","multip_lookup","full_year","checkdigit","occurences","trip_locations","recurrent","digitsArray","even","cur","_arrayWithoutHoles","iter","_iterableToArray","_nonIterableSpread","enUsGetPrefixes","verif","lead_replace","checkdigits","d_table","p_table","str_copy","number_replace","_number_locations","char_to_int","odd_convert","_i6","_char_to_int","multiplier","first_part","_checksum","_i7","_sum","remainder","_i8","identifiers","verificators","_i9","_i10","multipliers","tin_copy","current_year","current_century","allsymbols","sanitizeRegexes","phones","eth","default_currency_options","require_symbol","allow_space_after_symbol","symbol_after_digits","allow_negatives","parens_for_negatives","negative_sign_before_digits","negative_sign_after_digits","allow_negative_sign_placeholder","thousands_separator","decimal_separator","allow_decimal","require_decimal","digits_after_decimal","allow_space_after_digits","bech32","base58","isISO6346Str","isDigit","isISO6346","letterCode","checkSumDigit","isFreightContainerID","isISO6391Set","iso8601","iso8601StrictSeparator","timeHour","timeMinute","timeNumOffset","timeOffset","partialTime","fullDate","fullTime","rfc3339","validISO31661Alpha3CountriesCodes","validISO4217CurrencyCodes","base32","crockfordBase32","defaultBase32Options","crockford","base58Reg","validMediaType","validAttribute","validData","magnetURIComponent","strIndex","ltrim","mimeTypeSimple","mimeTypeText","mimeTypeMultipart","_long","latDMS","longDMS","defaultLatLongOptions","checkDMS","threeDigit","fourDigit","fiveDigit","sixDigit","patterns","HT","KE","MG","NP","PR","SG","TW","ZM","default_normalize_email_options","all_lowercase","gmail_lowercase","gmail_remove_dots","gmail_remove_subaddress","gmail_convert_googlemaildotcom","outlookdotcom_lowercase","outlookdotcom_remove_subaddress","yahoo_lowercase","yahoo_remove_subaddress","yandex_lowercase","icloud_lowercase","icloud_remove_subaddress","icloud_domains","outlookdotcom_domains","yahoo_domains","yandex_domains","dotsReplacer","charsetRegex","upperCaseRegex","lowerCaseRegex","numberRegex","symbolRegex","minLowercase","minUppercase","minNumbers","minSymbols","returnScore","pointsPerUnique","pointsPerRepeat","pointsForContainingLower","pointsForContainingUpper","pointsForContainingNumber","pointsForContainingSymbol","vatMatchers","EL","weights","ABN","NG","UZ","BO","CL","CO","EC","HN","NI","PA","PY","PE","UY","VE","radix","comparison","modifiers","port_str","ipv6","disallow_auth","_auth$split2","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_slicedToArray","ipv6_match","isMACAddress","eui","no_colons","no_separators","isIPRange","expectedSubnet","isBoolean","isIBAN","strippedStr","isoCountryCode","isoCountryCodeInIbanRegexCodeObject","whitelist","countryCode","hasValidIbanFormat","hasValidIbanChecksum","isBIC","isAbaRouting","isAlpha","_str","ignore","isAlphaLocales","isAlphanumeric","isAlphanumericLocales","isNumeric","no_symbols","isPassportNumber","normalizedStr","isPort","isLowercase","isUppercase","isAscii","isFullWidth","isHalfWidth","isVariableWidth","isMultibyte","isSemVer","isSurrogatePair","isIMEI","imeiRegex","allow_hyphens","isFloatLocales","isDecimal","arrVal","decimalRegExp","isOctal","isDivisibleBy","isRgbColor","includePercentValues","isHSL","isISRC","isMD5","isHash","algorithm","isJWT","dotSplit","currElem","isJSON","primitives","presentationSequences","surrogatePairs","isLocale","isMongoId","comparisonDate","isIn","isCreditCard","card","isIdentityCard","isEAN","ean","actualCheckDigit","getPositionWeightThroughLengthAndIndex","partialSum","isISIN","_double","_digit","isISBN","isbn","sanitizedIsbn","isISSN","testIssn","require_hyphen","case_sensitive","isMobilePhone","isMobilePhoneLocales","isPostalCode","isPostalCodeLocales","isEthereumAddress","isCurrency","whole_dollar_amount_with_sep","whole_dollar_amount","decimal_amount","currencyRegex","isBtcAddress","isISO6391","isISO8601","strictSeparator","ordinalMatch","oYear","oDay","monthString","dayString","isRFC3339","isISO31661Alpha2","isISO31661Alpha3","isISO4217","isBase32","isBase58","isDataURI","schemeAndMediaType","isMagnetURI","isMailtoURI","_url$replace$split2","_url$replace$split2$","allowedParams","cc","bcc","isParseFailed","queryParams","_q$split2","parseMailtoQueryString","isMimeType","isLatLong","unescape","stripLow","keep_new_lines","isWhitelisted","normalizeEmail","raw_parts","isSlug","isStrongPassword","analysis","charMap","uniqueChars","uppercaseCount","lowercaseCount","numberCount","symbolCount","_char2","analyzePassword","scoringOptions","scorePassword","isTaxID","strcopy","isTime","isLicensePlate","isVAT","ibanLocales","_toDate","_interopRequireDefault","_toFloat","_toInt","_toBoolean","_equals","_contains","_matches","_isEmail","_isURL","_isMACAddress","_isIP","_isIPRange","_isFQDN","_isDate","_isTime","_isBoolean","_isLocale","_isAbaRouting","_isAlpha","_interopRequireWildcard","_isAlphanumeric","_isNumeric","_isPassportNumber","_isPort","_isLowercase","_isUppercase","_isIMEI","_isAscii","_isFullWidth","_isHalfWidth","_isVariableWidth","_isMultibyte","_isSemVer","_isSurrogatePair","_isInt","_isFloat","_isDecimal","_isHexadecimal","_isOctal","_isDivisibleBy","_isHexColor","_isRgbColor","_isHSL","_isISRC","_isIBAN","_isBIC","_isMD","_isHash","_isJWT","_isJSON","_isEmpty","_isLength","_isByteLength","_isUUID","_isMongoId","_isAfter","_isBefore","_isIn","_isLuhnNumber","_isCreditCard","_isIdentityCard","_isEAN","_isISIN","_isISBN","_isISSN","_isTaxID","_isMobilePhone","_isEthereumAddress","_isCurrency","_isBtcAddress","_isISO","_isISO2","_isISO3","_isRFC","_isISO31661Alpha","_isISO31661Alpha2","_isISO4","_isBase","_isBase2","_isBase3","_isDataURI","_isMagnetURI","_isMailtoURI","_isMimeType","_isLatLong","_isPostalCode","_ltrim","_rtrim","_trim","_escape","_unescape","_stripLow","_whitelist","_blacklist","_isWhitelisted","_normalizeEmail","_isSlug","_isLicensePlate","_isStrongPassword","_isVAT","_getRequireWildcardCache","_assertString","_merge","_toString","_alpha","return","_includes","LENGTH_EAN_8","LENGTH_EAN_14","defaultMaxEmailLength","v4Subnet","v6Subnet","CurrencyCodes","issn","int","countChars","algorithms","verhoeffCheck","LdBreadcrumbsStyles","LdBreadCrumb","breadCrumbs","crumbNodes","_breadcrumbVisible","_defaultBreadcrumbAdministration","activeLastCrumb","assetID","backButtonLink","customBreadcrumbElements","_breadcrumbVisibleSet","setBreadcrumb","breadcrumbConfig","_checkBreadcrumbVisible","setBreadCrumb","backButtonNetcfg","_generateBreadCrumb","_setAssetBreadCrumb","_setCustomBreadCrumb","testid","onCreation","uiElement","messageBusRequest","messageBus","requester","onSelectionChange","currentZoom","previousZoom","onClick","requestEvent","syncGroup","chartHasData","chartHideNoData","noDataLabel","chartShowNoData","noDataOptions","hideNoData","showNoData","highchartsDefaultOptions","ChartNavigationComposition","updates","addUpdate","updateFn","allowTableSorting","pdfFont","bold","bolditalic","italic","printMaxWidth","contextButton","menuClassName","titleKey","menuItems","menuItemDefinitions","viewFullscreen","textKey","fullscreen","printChart","print","downloadPNG","exportChart","downloadJPEG","downloadPDF","downloadSVG","exitFullscreen","contextButtonTitle","buttonOptions","symbolSize","symbolX","symbolY","buttonSpacing","symbolFill","symbolStroke","symbolStrokeWidth","menuStyle","menuItemStyle","menuItemHoverStyle","ExportingSymbols","modifiedClasses","menuball","onChartBeforeRender","Fullscreen","browserProps","requestFullscreen","fullscreenChange","mozRequestFullScreen","webkitRequestFullScreen","msRequestFullscreen","unbindFullscreenEvent","origWidth","origHeight","origWidthOption","origHeightOption","setButtonText","unbindChange","unbindDestroy","alert","exportDivElements","exportingOptions","exportDivElement","HttpUtilities","ajax","xml","octet","xhr","onreadystatechange","fetchOptions","formData","FormData","Exporting","inlineDenylist","inlineToAttributes","inlineAllowlist","unstyledElements","printingChart","addButton","btnCount","exportSVGElements","contextMenu","_titleKey","exportingGroup","buttonOffset","afterPrint","printReverseInfo","origDisplay","resetParams","moveContainers","beforePrint","chartCallback","composition","renderExporting","destroyExport","cacheName","menuPadding","innerMenu","exportContextMenu","listStyle","MozBoxShadow","WebkitBoxShadow","boxShadow","hideMenu","exportEvents","isDataTableVisible","exportMenuWidth","exportMenuHeight","ontouchstart","getSVGForExport","getFilename","getChartHTML","inlineStyles","getSVG","sandbox","cssHeight","sourceWidth","isGantt","sourceHeight","colls","internalKey","chartCopy","collOptions","axisCopy","sanitizeSVG","chartExportingOptions","denylist","allowlist","defaultStyles","dummySVG","iframeDoc","filteredStyles","parentStyles","denylisted","allowlisted","filterStyles","hyphenate","moveTo","onChartInit","isDirtyExporting","mqlEvent","domurl","webkitURL","dataURLtoBlob","dataURL","binStr","downloadURL","msSaveOrOpenBlob","isOldEdgeBrowser","libURL","exportChartLocal","OfflineExporting","fallbackToExportServer","getSVGForLocalExport","downloadSVGLocal","getScript","scriptLocation","script","failCallback","chartCopyOptions","checkDone","images","imagesEmbedded","imagesLength","chartCopyContainer","embeddedSuccess","imageURL","imageType","callbackArgs","imageElement","unbindGetSVG","getAttributeNS","imageToDataUrl","taintedCallback","noCanvasSupportCallback","failedLoadCallback","finallyCallback","taintedHandler","loadHandler","drawImage","toDataURL","loadEventDeferDelay","svgToDataUrl","webKit","svgToPdf","pdfDoc","jspdf","jsPDF","removeInvalid","CanVGRenderer","dummySVGContainer","svgurl","finallyHandler","objectURLRevoke","loadPdfFonts","addFont","variant","API","addFileToVFS","getFontList","HighchartsFont","setFont","variants","normalBase64","shiftAndLoadVariant","textElements","titleElements","outlineElements","curParent","setStylePropertyFromParents","titleElement","svgNode","pdfData","MSBlobBuilder","getBlob","matchedImageWidth","matchedImageHeight","imageWidth","imageHeight","downloadWithCanVG","canvg","Canvg","msToBlob","annotations","itemDelimiter","columnHeaderFormatter","lineDelimiter","showTable","useMultiLevelHeaders","useRowspanHeaders","showExportInProgress","downloadXLS","exportData","annotationHeader","categoryHeader","categoryDatetimeHeader","viewData","hideData","exportInProgress","wrapLoading","showMessage","timeoutFn","chartDownloadCSV","getCSV","getBlobFromContent","chartDownloadXLS","getTable","chartGetCSV","useLocalDecimalPoint","getDataRows","csvOptions","toLocaleString","chartGetDataRows","multiLevelHeaders","hasParallelCoords","xAxes","rowArr","topLevelColumnTitles","columnTitles","exportDataOptions","keyLength","columnTitle","topLevelColumnTitle","getCategoryAndDateTimeMap","pIdx","categoryMap","dateTimeValueAxisMap","axisName","keyToAxis","xAxisIndices","dataRows","columnTitleObj","xTitle","xAxisIndex","exportKey","getPointArray","xTaken","mockSeries","categoryAndDatetimeMap","includeInDataExport","mockPoint","modifiedKey","pointers","originalKey","xValues","chartGetTable","getTableAST","chartGetTableAST","rowLength","treeChildren","topHeaders","subHeaders","getCellHTMLFromValue","tableCaption","topheaders","subheaders","theadChildren","rowspan","curColspan","row1","row2","isRowEqual","trChildren","colspan","valign","getTableHeaderHTML","trs","chartHideData","toggleDataTable","chartToggleDataTable","createContainer","dataTableDiv","oldDisplay","wasHidden","chartViewData","onChartAfterViewData","getCellValue","ascending","ascendingOrderInTable","v1","v2","onChartRenderer","onChartDestroy","gantt","GanttSeries","MapSeries","mapbubble","MapBubbleSeries","treemap","TreemapSeries","xrange","XRangeSeries","ColorAxisLike","initDataClasses","userDataClasses","dataClasses","dataClass","dataClassColor","minColor","maxColor","initStops","normalizedValue","toColor","gauge","SolidGaugeSeries","rounded","overshootVal","axisMinAngle","axisMaxAngle","angleOfRounding","addEventToFormatter","lastMessage","currentFormatter","theMessage","annotationsFieldsTypes","getAssignedAxis","axisMin","getFieldType","predefinedType","fieldType","composedClasses","sensitivity","wheelTimer","onAfterGetContainer","wheelZoomOptions","mouseWheel","allowZoom","wheelSensitivity","xAxisCoords","yAxisCoords","howMuch","mouseX","mouseY","zoomBy","MouseWheelZoom","LdChart","renderCustomUi","chartConfig","extractChartFromEvent","reservedAreaXFromRight","setupResetZoomButton","renderCustomUIElements","paddingInline","highchartsResetZoomButton","elementDefinition","renderButtonElement","getOrCreateButtonInstance","positionButtonElement","customUI","createNewButtonInstance","elementInstance","selectionChanged","totalRightOffset","getStoredNumber","extendData","extremesAxis","startMin","initializeOnStart","useUtc","lightConfig","yAxisOffset","dontSynctooltip","thisChart","syncedChart","afterSetExtremes","handleResetZoom","downloadJSON","exporter","exportJSON","exportCSV","downloadEXCEL","exportEXCEL","_chartBaseConfig","useGPUTranslations","_chartBaseConfigLight","_chartContainer","_setGlobalConfig","_enableChart","addEventListeners","containers","syncTooltip","mouseOutDetected","initializeStartMinIfNeeded","checkIfZoomed","handleResetZoomButton","checkAndHandleFullReset","xZoomed","yZoomed","xReset","yReset","_updateChartSeriesData","_updateChartConfiguration","_resizeChart","_adjustExtremes","_deleteAllSeries","_addSeries","handleDataExtension","shouldExtendData","_addDataPointToRightExtreme","_baseConfig","mergedConfig","configWithFormatterEvent","adjustYAxisExtremes","adjustXAxisExtremes","noTooltip","allowForce","LdLoginApplication","_privacyPolicyUrl","privacyPolicy","documentUrls","processed","URLSearchParams","urlParams","_onLoginToastCloseClick","_onPrivacyLanguageChange","_onPrivacyDialogToggle","dataset","LdLoginStyles","LdDialogs","acceptDecline","titleText","dismissText","confirmText","bigPopup","openDialog","deleteDialog","showModal","closeDialog","LdFormWrapper","handleInputChange","onChangeHandler","toggleHandler","onChangeHandlerDropdown","labelListBox","_loadPaperItemValue","usePredefinedDate","_dateChanged","valuesSearch","dropdownConfig","cid","updateItemSelectionValue","_truncateFullName","LdStateIndicatorStyles","LdStateIndicator","prefixText","suffixText","LdAssetsBackbuttonStyles","LdAssetsBackbutton","_onBackButtonClicked","LdDelete","showDeleteModal","SimpleUiTextProvider","texts","keyComputeFunction","computeKey","onLanguageChanged","getText","computedKey","LdI18NextUiTextProvider","ldI18NextInstance","languageChangedCallbacks","texts_en","formElementStyles","LocationSelectionElement","apiLocationData","_apiLocationData","reactToNewApiData","showInputs","uiTextProvider","getDefaultValue","apiLocation","isElementVisible","locationCheckResult","getLocationCheckResult","isVisible","generateMarkup","generateSuccessMarkup","generateFailureMarkup","successFeedbackText","getMarkupForCustomCoordinatesButton","getMarkupForCustomCoordinates","generateLocationFetchFeedback","setCustomCoordinates","coordiantesAreEqual","firstCoordinates","secondCoordinates","isLocationValid","coordinates_latitude_input","coordinates_longitude_input","coordinates_latitude","coordinates_longitude","LdProgressBar","suffixHeader","LdSettingsViewStyles","LdSettingsList","fileProvider","formValidator","_subModules","_innerTabSelected","dialog","_formUploadFile","_checkboxInputs","_machinesList","_upload","selectedTab","_innerTabs","requestVariablesSuccess","requestVariablesError","numberOfRequest","numberOfRequestSuccess","numberOfRequestError","progressLength","downloadQueue","showUploadState","showDownloadState","machine_types","_createDialogHTMLOutput","_createPaperDropdownMenu","_deselectParentElements","_createCheckboxesButton","_checkIfAllRequestDone","_checkDownloads","createDialogHtml","_contentRenderViews","confirmButtonText","downloadFiles","closeModal","_resetValues","_selectedDropdown","_injectMachineTypePaperItemValues","selectedFields","_checkForClickedCheckboxes","checkedInputs","_createCheckedCheckbox","_reportForm","_selectedFields","_receivedFields","uniqueFields","_addCheckbox","_selectEndpoint","_toggleButton","dialogs","startButton","_showRequestSuccessMessage","_createUploadForm","_createSearchFieldHTML","formFields","getFile","handleKeyup","typeTimeout","contentText","_getNamesOfIds","requestVariables","pendingDownload","alreadyTrackedSuccess","alreadyTrackedError","LdVariablesList","isSw","_variablesList","_gridColumns","addNew","_onAddNewVariablesButtonClick","_isVariablesListLoading","DATA_TYPE_TO_BACKEND_TYPE","MACHINE_TYPE_FIELD_CONFIGS","helpText","getFieldConfig","getAvailableMachineTypes","LdCommonStyles","handleErrors","successValue","_replaceValue","itemFromForm","formIsBusy","handleDeleteError","closeChangeModal","changeDialog","getLocalizedLocales","_locales","availableLanguages","_translatedLocales","createDropdownList","newSuccess","_multiAdd","notificationType","nextInstanceId","descriptionInstances","nextDescriptionId","showItemIdField","machineTypeInstances","baseForm","formRoot","nativeForm","selectedIndex","savedData","handleNewSuccess","handleEditSuccess","jumpToLine","handleDelete","renderDescriptionSection","isLocaleAvailable","allLocales","usedLocales","hasAvailableLocales","availableLocales","currentLocale","getAvailableLocalesForInstance","currentLocaleTitle","instanceId","removeDescriptionInstance","descriptionId","handleDescriptionDropdownChange","renderDescriptionInstance","newDescription","addDescriptionInstance","getVisibilityTypeField","isEdit","getTagsSetFromForm","tagsField","tagsArray","getToggleValue","getDescriptionValues","descForm","getDropdownValue","getInputValue","getField","inputFieldDisplayName","getError","toggleUiRelevant","inputFieldTags","checkAddCustomId","baseFields","renderBaseFieldsOfItem","itemId","isItemLoading","indexOfItemId","handleFormUpdate","renderContent","renderMachineData","onFormButtonSave","_onFormButtonSaveAndAdd","getButtons","deleteItemRequest","getDeleteDialog","criticalChangeDialog","saveData","getChangeDialog","headerTitle","renderBaseFields","renderDeleteButtonIfNeeded","informationLoaded","onFormButtonCancel","populateFieldByType","populateInputField","populateDropdownField","populateToggleField","addNewItem","idParam","itemIdField","preparedItem","prepareItemForBackend","moduleEndpointPath","PATTERN_EXISTING_ENTRY","PATTERN_NEW_ENTRY","LdVariableFormView","renderMachineTypeInstances","getNamePrefixLabel","getChartTypeField","getMaxTimeField","getDataTypeField","getShowInitialField","getMachineTypeDisplayName","machineKey","createBaseField","baseField","convertConfigToFormField","hasAvailableMachineTypes","renderMachineTypeInstance","addMachineTypeInstance","availableMachineTypes","usedMachineTypes","removeMachineTypeInstance","updateVariable","isVariableLoading","loadMachineTypeInstancesFromVariable","prepared","validateForm","getFormValues","showChangeModal","validateFormWrapper","isBaseForm","validateBaseForm","validateMachineForm","validateNamePrefix","allValid","machineTypeValue","validateMachineTypeFields","fieldConfigs","validateConfigFields","validateInputField","validateDropdownField","isInvalid","baseFormValid","validateBaseFormWrapper","descriptionsValid","validateDescriptions","machineTypesValid","validateMachineTypes","hasAnyDescriptionContent","validateFilledDescriptions","clearDescriptionValidation","descriptionData","getDescriptionData","validateSingleDescription","localeField","descriptionField","machineForm","getBaseFormValues","getMachineValues","machineData","extractMachineData","getConfigFieldValue","inputValue","preparedVariables","getAvailableMachineTypesForInstance","currentMachineType","allMachineTypes","newInputs","getMachineTypeFormInputsForInstance","handleDropdownChange","instanceIndex","newMachineType","machineKeys","backendType","determineInternalDataType","convertConfigToFormFieldWithData","startTabIndex","availableDataTypes","getAvailableDataTypes","LdCollectionsList","All","_collectionsList","globalThis","addNewCollection","_addNewCollectionButtonOnClick","_isCollectionListLoading","hasCollectionsLoaded","isNewCollectionsList","LdCollectionFormView","updateCollection","isCollectionLoading","flatVariableIds","updatedCollectionWithVariables","preparedCollection","LdDataWarehouseExport","selectedExportType","showErrorDialog","isExporting","sendRequestExport","missingExportTypeDialog","handelSelected","renderDropdown","selectExportTypeDropdown","LdBackendLinksDevSettings","infoMessage","reloadValues","onInputChange","LdSettingsView","_baseTabs","_innerTabsLimits","_innerTabsAlarms","router","canShowBackendLinksTab","getTabs","changeView","useSpinner","START_LOADING_BREADCRUMB_CONFIG","FINISH_LOADING_BREADCRUMB_CONFIG","ERROR_LOADING_BREADCRUMB_CONFIG","BREADCRUMB_CONFIG","CLEAR_SUBMIT_BREADCRUMB","getBreadCrumbConfig","receiveSetBreadCrumbConfig","errorSetBreadCrumbConfig","setBreadCrumbConfig","clearBreadCrumbConfig","dismissable","closeDisplayNotification","showToast","toastElement","borderTopColor","Internal","DataTypeName","NcFileType","TimeFilter","AuthenticationDetails","ValidationData","Username","Password","ClientMetadata","validationData","clientMetadata","_proto","getUsername","getPassword","getValidationData","getAuthParameters","getClientMetadata","msCrypto","cryptoSecureRandomInt","randomBytes","WordArray","sigBytes","wordArray","hexChars","bite","hexStringify","nbi","dbits","inBrowser","appName","am","xl","xh","DB","DM","DV","FV","F1","F2","rr","vv","BI_RC","int2char","intAt","nbv","fromInt","nbits","Montgomery","mp","invDigit","mpl","mph","um","mt2","dlShiftTo","divRemTo","compareTo","ZERO","subTo","copyTo","u0","drShiftTo","mulTo","multiplyTo","sqrTo","squareTo","mi","sh","lShiftTo","bs","cbs","bm","ds","rShiftTo","pm","nsh","ys","y0","yt","d1","ONE","qd","km","modPow","g2","is1","HEX_MSB_REGEX","AuthenticationHelper","PoolName","BigInteger","hexHash","padHex","smallAValue","generateRandomSmallA","getLargeAValue","infoBits","poolName","getSmallAValue","largeAValue","calculateA","hexRandom","generateRandomString","getRandomPassword","randomPassword","getSaltDevices","SaltToHashDevices","getVerifierDevices","verifierDevices","generateHashDevice","deviceGroupKey","combinedString","hashedString","verifierDevicesNotPadded","calculateU","UHexHash","awsCryptoHash","resultFromAWSCrypto","hashHex","hexStr","computehkdf","ikm","salt","infoBitsBuffer","resultFromAWSCryptoPrk","awsCryptoHashHmac","getPasswordAuthenticationKey","serverBValue","UValue","usernamePassword","usernamePasswordHash","calculateS","sValue","hkdf","gModPowXN","err2","getNewPasswordRequiredChallengeUserAttributePrefix","bigInt","invertedNibbles","invertedNibble","CognitoJwtToken","decodePayload","getJwtToken","getExpiration","getIssuedAt","iat","CognitoAccessToken","_CognitoJwtToken","subClass","_temp","CognitoIdToken","Platform","CognitoRefreshToken","RefreshToken","getToken","CognitoUserSession","ClockDrift","clockDrift","calculateClockDrift","getIdToken","getRefreshToken","getAccessToken","getClockDrift","adjusted","monthNames","weekNames","DateHelper","getNowString","weekDay","CognitoUserAttribute","Name","Value","getValue","dataMemory","MemoryStorage","StorageHelper","storageWindow","getStorage","CognitoUser","Pool","pool","Session","signInUserSession","authenticationFlowType","Storage","getClientId","userDataKey","setSignInUserSession","clearCachedUserData","cacheTokens","getSignInUserSession","getAuthenticationFlowType","setAuthenticationFlowType","authDetails","USERNAME","clientMetaData","jsonReq","getUserContextData","UserContextData","onFailure","challengeName","ChallengeName","challengeParameters","ChallengeParameters","customChallenge","getCognitoUserSession","authenticateUser","authenticateUserPlainUsernamePassword","authenticateUserDefaultAuth","authenticationHelper","getUserPoolName","dateHelper","deviceKey","DEVICE_KEY","errOnAValue","SRP_A","CHALLENGE_NAME","USER_ID_FOR_SRP","SRP_B","SALT","getCachedDeviceKeyAndPassword","errOnHkdf","dateNow","concatBuffer","SECRET_BLOCK","signatureString","challengeResponses","PASSWORD_CLAIM_SECRET_BLOCK","TIMESTAMP","PASSWORD_CLAIM_SIGNATURE","jsonReqResp","ChallengeResponses","respondToAuthChallenge","challenge","challengeCallback","errChallenge","dataChallenge","clearCachedDeviceKeyAndPassword","errAuthenticate","dataAuthenticate","authenticateUserInternal","PASSWORD","authResult","mfaRequired","selectMFAType","mfaSetup","totpRequired","userAttributes","rawRequiredAttributes","requiredAttributes","userAttributesPrefix","newPasswordRequired","getDeviceResponse","newDeviceMetadata","NewDeviceMetadata","DeviceGroupKey","DeviceKey","errGenHash","deviceSecretVerifierConfig","Salt","PasswordVerifier","DeviceSecretVerifierConfig","DeviceName","errConfirm","dataConfirm","cacheDeviceKeyAndPassword","UserConfirmationNecessary","completeNewPasswordChallenge","newPassword","requiredAttributeData","finalUserAttributes","NEW_PASSWORD","errAValue","errHkdf","confirmRegistration","confirmationCode","forceAliasCreation","ConfirmationCode","ForceAliasCreation","sendCustomChallengeAnswer","answerChallenge","ANSWER","sendMFACode","mfaType","SMS_MFA_CODE","mfaTypeSelection","SOFTWARE_TOKEN_MFA_CODE","changePassword","oldUserPassword","newUserPassword","PreviousPassword","ProposedPassword","enableMFA","mfaOptions","DeliveryMedium","AttributeName","MFAOptions","setUserMfaPreference","smsMfaSettings","softwareTokenMfaSettings","SMSMfaSettings","SoftwareTokenMfaSettings","disableMFA","_this9","clearCachedUser","updateAttributes","_this10","UserAttributes","getUserData","bypassCache","getUserAttributes","userData","attributeList","userAttribute","getMFAOptions","createGetUserRequest","promisifyRequest","refreshSessionIfPossible","_this11","refreshSession","_this12","getUserDataFromCache","isFetchUserDataAndTokenRequired","fetchUserData","_ref$bypassCache","_this13","cacheUserData","deleteAttributes","_this14","UserAttributeNames","resendConfirmationCode","getSession","idTokenKey","accessTokenKey","refreshTokenKey","clockDriftKey","cachedSession","_this15","wrappedCallback","wrapRefreshSessionCallback","lastUserKey","deviceKeyKey","authenticationResult","clearCachedTokens","randomPasswordKey","deviceGroupKeyKey","forgotPassword","inputVerificationCode","confirmPassword","getAttributeVerificationCode","verifyAttribute","getDevice","forgetSpecificDevice","forgetDevice","_this16","setDeviceStatusRemembered","DeviceRememberedStatus","setDeviceStatusNotRemembered","listDevices","requestParams","Limit","PaginationToken","globalSignOut","_this17","signOut","revokeTokenCallback","_this18","_session","revokeTokens","cleanClientData","isSessionRevocable","revokeToken","origin_jti","requestWithRetry","Token","sendMFASelectionAnswer","_this19","associateSoftwareToken","_this20","associateSecretCode","SecretCode","verifySoftwareToken","totpCode","friendlyDeviceName","_this21","UserCode","FriendlyDeviceName","errRespond","dataRespond","UserAgent","_wrapNativeSuper","_cache","_isNativeFunction","_construct","Parent","CognitoError","_Error","maxDelayMs","MAX_DELAY_MS","attempt","jitteredBackoff","uaCategoryAction","uaFramework","framework","ex","isNonRetryableError","functionToRetry","delayFn","retryIn","CognitoUserPool","UserPoolId","AdvancedSecurityDataCollectionFlag","advancedSecurityDataCollectionFlag","getUserPoolId","signUp","cognitoUser","returnData","userConfirmed","UserConfirmed","userSub","UserSub","codeDeliveryDetails","CodeDeliveryDetails","getCurrentUser","lastAuthUser","AmazonCognitoAdvancedSecurityData","amazonCognitoAdvancedSecurityDataConst","advancedSecurityData","EncodedData","createUser","createUserPool","createAuthenticationDetails","BrowserFileProvider","prepareFile","mainUrl","BrowserFormValidator","fieldValue","maxSizeInB","maxUploadSizeInMB","BasicRouter","changeLocation","PasswordComplianceFeedbackElement","validationResults","pointerDirection","renderValidationResults","computePointerDirection","aResult","ruleName","pass","renderListItem","isPass","BasicPasswordValidator","validationRules","verificationCode","addValidationRule","setVerificationCode","removeValidationRule","toBeRemovedRule","setConfirmationPassword","confirmationPassword","oldPassword","setOldPassword","ChangePasswordView","_formChangePasswordButtonDisabled","_showChangePasswordForm","_forceChangePasswordSuccess","_forceChangePasswordError","_formFieldPasswordVisibility","newPasswordRetype","_awsUserPool","userPoolIdLogin","setNewPassword","decodeURI","userIsUsingPasswordRecovery","_messageSection","message_type","_changePasswordForm","_oldPasswordItem","_onKeyUpValidateAsUserTypes","handleInputEvent","_usernameItem","userIsChangingInitialPassword","_verificationCodeItem","_submitBtnLabel","validatePassword","_onPasswordVisibilityIconClick","_onChangePassword","clickedField","_savedFieldState","currentFieldState","passwordCriteria","_newPassword","_newPasswordRetype","initialPassword","getPasswordFieldValue","validationResult","feedbackElement","_userData","_awsCognitoUser","_verificationCode","_onChangePasswordSuccess","_onChangePasswordError","_oldPassword","_authenticationDetails","defaultRedirectUrl","email_verified","showSuccessMessage","CreateNewPasswordView","ForgotPasswordView","handleUsernameInput","_onForgotPasswordBtnClick","getUsernameField","hasEmailAddress","getSigninButton","usernameField","_usernameField","LoginView","_username","_password","_onInputKeyDown","_onSignInButtonClick","passwordField","getPasswordField","hasPassword","defaultTarget","getRedirectTarget","CheckedMixin","delegateProps","_toggleChecked","SlotTargetController","sourceSlot","targetFactory","copyCallback","__copying","__checkAndCopyNodesToSlotTarget","__sourceSlotObserver","slotTarget","__slotTargetClones","__copyNodesToSlotTarget","Checkbox","__warnDeprecated","ActiveMixin","_setActive","testUserAgent","testPlatform","isAndroid","vendor","isIPad","isIOS","isTouch","ControllerMixin","__controllers","removeController","DirHelper","cachedType","directionSubscribers","alignDirs","elementDir","getDocumentDir","fromAttribute","toAttribute","__restoreSubscription","__subscribe","newValueEqlDocDir","newValueEmptied","newDiffValue","__unsubscribe","__getNormalizedScrollLeft","__setNormalizedScrollLeft","DisabledMixin","_setAriaDisabled","getAncestorRootNodes","DOCUMENT_NODE","deserializeAttributeValue","serializeAttributeValue","addValueToAttribute","removeValueFromAttribute","statsJob","developmentModeCallback","doctype","FocusMixin","_keyboardActive","_shouldSetFocus","_shouldRemoveFocus","keyboardActive","isKeyboardActive","isElementHiddenDirectly","hasLowerTabOrder","sortElementsByTabIndex","mergeSortByTabIndex","collectFocusableNodes","isElementFocusable","normalizeTabIndex","isElementHidden","isElementFocused","getFocusableElements","fieldset","keygen","optgroup","KeyboardMixin","_onKeyUp","_onEnter","uniqueId","SlotController","generateId","slotName","slotInitializer","useUniqueId","initialized","__slotObserver","newNode","TabindexMixin","_lastTabIndex","oldDisabled","_tabindexChanged","TooltipController","tooltipNode","_position","shouldShow","setContext","setManual","setOpened","setShouldShow","DelegateFocusMixin","focusElement","_focusElementChanged","oldElement","__forwardTabIndex","_removeFocusListeners","DelegateStateMixin","_createDelegateAttrsObserver","_createDelegatePropsObserver","_stateTargetChanged","_ensureAttrsDelegated","_ensurePropsDelegated","_delegateAttribute","_delegateProperty","_delegateAttrsChanged","_delegatePropsChanged","InputController","InputMixin","_hasInputValue","__onInput","_boundOnChange","_forwardInputValue","oldInput","_hasInputValueChanged","hasValue","oldHasValue","_setHasInputValue","__userInput","_toggleHasValue","LabelController","__updateLabelId","__updateDefaultLabel","__observeLabel","__hasLabel","__toggleHasLabel","__labelObserver","setLabel","isLabelMutation","LabelMixin","_labelId","_labelNode","LabelledInputController","labelController","__preventDuplicateLabelClick","__initLabel","inputClickHandler","ActiveItemMixin","_activateItem","clickedItem","_itemsEqual","cellContent","_isFocusable","__getRowModel","isFocusableElement","ColumnBaseMixin","_emptyCells","_headerCell","_footerCell","__initialized","headerRenderer","_headerRenderer","footerRenderer","_footerRenderer","_allCells","_gridValue","_findHostGrid","_cells","_renderHeaderAndFooter","_renderHeaderCellContent","_renderFooterCellContent","_flexGrowChanged","_orderChanged","_widthChanged","_frozenChanged","_frozenCellsChanged","_frozenToEndChanged","_lastFrozenChanged","lastFrozen","_firstFrozenToEndChanged","firstFrozenToEnd","_reorderStatusChanged","_resizableChanged","existingHandle","_textAlignChanged","textAlignFallback","_previousHidden","_debouncerHiddenChanged","_renderColumnTree","_columnTree","_debounceUpdateFrozenColumn","_resetKeyboardNavigation","_runRenderer","__renderCellsContent","_clearCellContent","__debounceUpdateHeaderFooterRowVisibility","_onHeaderRendererOrBindingChanged","_bindings","_renderBodyCellsContent","_onRendererOrBindingChanged","_onFooterRendererOrBindingChanged","__setTextContent","__textHeaderRenderer","_defaultFooterRenderer","_computeFooterRenderer","GridColumn","autoWidth","_focusButtonMode","updateColumnOrders","baseOrder","IOS","IOS_TOUCH_SCROLLING","ironList","_ratio","_scrollerPaddingTop","_scrollPosition","_physicalSize","_physicalAverage","_physicalAverageCount","_physicalTop","_virtualCount","_estScrollHeight","_scrollHeight","_viewportHeight","_viewportWidth","_physicalItems","_physicalSizes","_firstVisibleIndexVal","_lastVisibleIndexVal","_maxPages","_templateCost","_physicalBottom","_scrollBottom","_virtualEnd","_virtualStart","_physicalCount","_hiddenContentSize","_maxScrollTop","_scrollOffset","_maxVirtualStart","virtualCount","_virtualStartVal","_physicalStart","_physicalStartVal","_physicalEnd","_physicalCountVal","_optPhysicalSize","firstVisibleIndex","physicalOffset","_iterateItems","pidx","vidx","_getPhysicalSizeIncrement","lastVisibleIndex","idxAdjustment","reusables","_getReusables","physicalTop","indexes","_debounce","_increasePoolIfNeeded","fromTop","ith","offsetContent","physicalItemHeight","idxs","protectedOffsetContent","virtualStart","virtualEnd","physicalCount","scrollBottom","itemSet","movingUp","_assignModels","_updateMetrics","_positionItems","_updateScrollerSize","_isClientFull","nextIncrease","_createPool","_isIndexRendered","_focusedVirtualIndex","_getPhysicalIndex","_render","updateViewportBoundaries","_itemsChanged","_physicalIndexForKey","_resetScrollPosition","rtn","_computeVidx","_adjustScrollPosition","deltaHeight","scrollToIndex","currentTopItem","currentVirtualItem","targetOffsetTop","hiddenContentSize","_resetAverage","_resizeHandler","OFFSET_ADJUST_MIN_THRESHOLD","IronListAdapter","createElements","updateElement","scrollContainer","elementsContainer","reorderElements","_vidxOffset","__placeholderHeight","__elementHeightQueue","timeouts","SCROLL_REORDER","IGNORE_WHEEL","FIX_INVALID_ITEM_POSITIONING","__resizeObserver","_scrollLineHeight","_getScrollLineHeight","__onWheel","__mouseDown","__pendingReorder","__reorderElements","adjustedFirstVisibleIndex","adjustedLastVisibleIndex","visibleElementCount","__getVisibleElements","targetVirtualIndex","__skipNextVirtualIndexAdjust","__getIndexScrollOffset","__fixInvalidItemPositioningDebouncer","__scrollReorderDebouncer","__debouncerWheelAnimationFrame","endIndex","__virtualIndex","__updateElement","newPhysicalSize","oldPhysicalSize","prevAvgCount","prevPhysicalAvg","__getBorderBoxHeight","borderBottomWidth","borderTopWidth","forceSameIndexUpdates","__preventElementUpdates","__lastUpdatedIndex","elementHeight","filteredHeights","__size","fvi","fviOffsetBefore","fviOffsetAfter","_scrollPageHeight","_updateGridMetrics","physicalItems","__clientFull","_z","_adjustVirtualIndexOffset","__previousScrollTop","__fixInvalidItemPositioning","physicalTopBelowTop","physicalBottomAboveBottom","firstIndexVisible","lastIndexVisible","originalRatio","_hasScrolledAncestor","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","_deltaYAcc","_wheelAnimationFrame","momentum","_canScroll","_hasResidualMomentum","_ignoreNewWheel","_debouncerIgnoreNewWheel","_previousMomentum","optPhysicalSize","__getItemHeightBuffer","bufferZoneHeight","maxItemHeight","adjustedVirtualStart","visibleElements","targetElement","targetPhysicalIndex","oldOffset","maxShift","Virtualizer","__adapter","A11yMixin","_a11yGetHeaderRowCount","_a11yGetFooterRowCount","_a11yUpdateGridSize","bodyColumns","_a11yUpdateHeaderRows","_a11yUpdateFooterRows","headerRow","footerRow","_a11yUpdateRowRowindex","_a11yUpdateRowSelected","_a11yUpdateRowExpanded","__isRowExpandable","__isRowCollapsible","_a11yUpdateRowLevel","_a11ySetRowDetailsCell","detailsCell","_a11yUpdateSorters","asc","checkPaths","arrayToCheck","normalizeEmptyValue","ArrayDataProviderMixin","__setArrayDataProvider","arrayDataProvider","filterValueLowercase","sortOrder","__items","_arrayDataProvider","__dataProviderOrItemsChanged","_effectiveSize","ColumnReorderingMixin","columnReorderingAllowed","_orderBaseScope","_onTrackEvent","_reorderGhost","_onContextMenu","_onTrackEnd","_startTouchReorderTimeout","_onTrackStart","_draggedColumn","_touchDevice","_onTrack","_cellFromPoint","childElementCount","_setSiblingsReorderStatus","_updateGhost","_updateGhostPosition","_autoScroller","targetCell","targetColumn","_getTargetColumn","_isSwapAllowed","_isSwappableByPosition","columnTreeLevel","levelColumnsInOrder","_getColumnsInOrder","_swapColumnOrders","_lastDragClientX","headerLevel","eventClientX","eventClientY","ghostRect","ghost","_updateOrders","columnTree","sibling","rightDiff","leftDiff","column1","column2","differentColumns","sameParent","sameFrozen","sourceCellRect","_updateFirstAndLastColumn","draggedColumn","ColumnResizingMixin","_onHeaderTrack","eventX","columnRowCells","borderLeftWidth","borderRightWidth","cellWidth","cellRect","cellFrozenToEnd","_frozenToEndCells","frozenRect","resizedColumn","ItemCache","parentCache","parentItem","itemCaches","effectiveSize","pendingRequests","getItemForIndex","scaledIndex","getCacheAndIndex","updateSize","_isExpanded","subCache","ensureSubCacheForScaledIndex","_loadPage","thisLevelIndex","expandedIndex","DataProviderMixin","_hasData","itemIdPath","expandedItems","__expandedKeys","_getItem","_updateItem","_getPageForIndex","getItemId","_expandedItemsChanged","__updateVisibleRows","__computeExpandedKeys","expandedKeys","_getIndexLevel","_setLoading","_mapSorters","currentItems","itemsIndex","itemIndex","_debouncerApplyCachedData","__scrollToPendingIndex","__dispatchPendingBodyCellFocus","__itemsReceived","_pageSizeChanged","oldPageSize","_checkSize","_dataProviderChanged","oldDataProvider","_ensureFirstPageLoaded","_debouncerCheckSize","item1","item2","_getItemIndexInArray","__pendingScrollToIndex","DropMode","DropLocation","usesDnDPolyfill","DragAndDropMixin","dropMode","rowsDraggable","dragFilter","dropFilter","__dndAutoScrollThreshold","__onDocumentDragStart","_onDragOver","_onDragLeave","_safari","setDragImage","__getViewportRows","__formatDefaultTransferData","draggedItems","setDragData","setDraggedItemsCount","_clearDragStyles","_dropLocation","_dragOverItem","__dndAutoScroll","dropAbove","initialItemsMaxHeight","initialTableOverflow","__dndAutoScrolling","headerBottom","footerTop","topDiff","bottomDiff","scrollTopDelta","dragData","dropTargetItem","dropLocation","_dragDropAccessChanged","filterDragAndDrop","_filterDragAndDrop","dragDisabled","dropDisabled","arrayEquals","DynamicColumnsMixin","_hasColumnGroups","_flattenColumnGroups","_getColumnTree","hasColumnElements","nodeCollection","allRemovedCells","flatMap","filterNotConnected","__removeFilters","_debouncerCheckImports","_checkImports","_updateFirstAndLastColumnForRow","cellIndex","EventContextMixin","getEventContext","FilterMixin","__addFilter","__applyFilters","filtersToRemove","KeyboardNavigationMixin","_headerFocusable","_itemsFocusable","_footerFocusable","_navigatingIsHidden","_focusedItemIndex","_focusedColumnOrder","_focusedCell","interacting","_ios","_android","_onFocusIn","_onFocusOut","_onContentFocusIn","_isMousedown","__rowFocusMode","__isRow","focusable","__isCell","_focusButton","_focusableChanged","oldFocusable","_updateGridSectionFocusTarget","_focusedCellChanged","focusedCell","oldFocusedCell","_interactingChanged","__updateItemsFocusable","wasFocused","__getFocusable","keyGroup","_detectInteracting","_ensureScrolledToIndex","__scrollIntoViewport","__isDetailsCell","HTMLTableCellElement","HTMLTableRowElement","__getIndexOfChildElement","_onNavigationKeyDown","visibleItemsCount","activeRow","activeCell","forwardsKey","backwardsKey","_onCellNavigation","_onRowNavigation","dstRow","__navigateRows","__getIndexInGroup","bodyFallbackIndex","currentRowIndex","activeRowGroup","maxRowIndex","dstRowIndex","dstIsRowDetails","isRowDetails","dstItem","_isDetailsOpened","isCurrentCellRowDetails","_getColumns","dstColumns","dstSortedColumnOrders","maxOrderedColumnIndex","orderedColumnIndex","dstOrderedColumnIndex","dstColumnIndex","dstCell","_scrollHorizontallyToCell","_onInteractionKeyDown","localTargetIsTextInput","wantInteracting","_getGridEventLocation","_setInteracting","_hideTooltip","_predictFocusStepTarget","tabOrder","focusexit","rowElement","focusStepTarget","__isHorizontallyInViewport","firstVisibleColumn","__isColumnInViewport","rowIndex","_sizerCell","_onTabKeyDown","itemsFocusTarget","targetRow","focusedItemRow","_onSpaceKeyDown","isRow","wasNavigating","_activeRowGroup","__pendingBodyCellFocus","_showTooltip","_detectFocusedItemIndex","isInteracting","__updateHorizontalScrollPosition","_getGridSectionFromFocusTarget","isInteractingWithinActiveSection","_preventScrollerRotatingCellFocus","rowGroup","__isValidFocusable","firstVisibleRow","firstVisibleCell","__getFirstVisibleItem","dstCellRect","dstCellIndex","tableRect","leftBoundary","rightBoundary","tableIndex","RowDetailsMixin","detailsOpenedItems","rowDetailsRenderer","_detailsCells","_detailsCellResizeObserver","_updateDetailsCellHeight","__virtualizer","_rowDetailsRendererChanged","_updateRow","isDetailsOpened","_toggleDetailsCell","_detailsOpenedItemsChanged","changeRecord","_configureDetailsCell","__updateDetailsRowPadding","_updateDetailsCellHeights","resizables","ResizeMixin","_observeParent","ShadowRoot","__parent","_contentRect","ScrollMixin","_frozenCells","_rowWithFocusedElement","_afterScroll","_updateOverflow","_firefox","__previousVisible","__memorizedScrollTop","dstRect","_scheduleScrolling","_scrollingFrame","_debounceScrolling","_debounceOverflow","_debouncerCacheElements","__debounceUpdateFrozenColumn","_updateFrozenColumn","columnsRow","normalizedScrollLeft","transformFrozen","transformFrozenToEnd","SelectionMixin","__selectedKeys","__selectedItemsChanged","__computeSelectedKeys","selectedKeys","defaultMultiSortPriority","SortMixin","multiSortPriority","multiSortOnShiftClick","_previousSorters","setDefaultMultiSortPriority","_onSorterChanged","__updateSorter","__applySorters","sortersToRemove","__updateSortOrders","__appendSorter","_removeArrayItem","__prependSorter","otherSorters","StylingMixin","cellClassNameGenerator","__cellClassNameGeneratorChanged","generateCellClassNames","_generateCellClassNames","__generatedClasses","Grid","allRowsVisible","_recalculateColumnWidthOnceLoadingFinished","recalculateColumnWidths","_isInViewport","firstVisibleItem","__getLastVisibleItem","lastVisibleItem","scrollTargetRect","itemRect","footerHeight","_createScrollerRows","_updateScrollerItem","__updateFooterPositioning","_recalculateColumnWidthOnceVisible","__getBodyCellCoordinates","__focusBodyCell","_effectiveSizeChanged","virtualizer","cellCoordinates","__getIntrinsicWidth","__intrinsicWidthCache","__calculateIntrinsicWidth","initialWidth","initialFlexGrow","__getDistributedWidth","innerColumn","columnWidth","columnGroupWidth","sumOfWidthOfAllChildColumns","extraNecessarySpaceForGridColumnGroup","shareOfInnerColumnFromNecessaryExtraSpace","_recalculateColumnWidths","cols","_createCell","_contentIndex","mouseUpListener","contentContainsFocusedElement","mouseUpWithinCell","isColumnRow","noNotify","contentsFragment","_vacant","__updateHeaderFooterRowVisibility","visibleRowCells","_columnTreeChanged","__updateHeaderAndFooter","animationName","_stateController","colorLegacy","sizing","typography","Lumo","themeRegistry","registerStyles","themeFor","classHasThemes","flattenStyles","styleModules","getAllThemes","getIncludePriority","includePriority","getIncludedStyles","includedStyles","includeModuleId","includedTheme","getThemes","defaultModuleName","themes","themeForToken","matchesThemeFor","themeA","themeB","elementClass","ThemableMixin","elementStyles","styleEl","addStylesToTemplate","getStylesForThis","finalizeStyles","themeStyles","inheritedThemes","__themes","ThemePropertyMixin","__deprecatedThemePropertyChanged","_set_theme","removeNodesFromTemplate","nodesToRemove","walker","createTreeWalker","partIndex","nextActiveIndexInTemplateParts","nodeIndex","removeCount","nodesToRemoveInTemplate","currentRemovingNode","currentNode","countNodes","getTemplateCacheKey","scopeName","compatibleShadyCSSVersion","shadyTemplateFactory","templateCache","stringsArray","keyString","getTemplateElement","TEMPLATE_TYPES","shadyRenderSet","_obj","defaultConverter","notEqual","defaultPropertyDeclaration","finalized","UpdatingElement","_classProperties","_attributeNameForProperty","_attributeToPropertyMap","_ensureClassProperties","superProperties","createProperty","noAccessor","getPropertyDescriptor","requestUpdateInternal","getPropertyOptions","propKeys","_valueHasChanged","_propertyValueFromAttribute","_propertyValueToAttribute","_updateState","_updatePromise","_enableUpdatingResolver","_saveInstanceProperties","_instanceProperties","_applyInstanceProperties","enableUpdating","shouldRequestUpdate","_reflectingProperties","_hasRequestedUpdate","_enqueueUpdate","performUpdate","hasUpdated","shouldUpdate","_markUpdated","_getUpdateComplete","getUpdateComplete","customElement","classOrDescriptor","clazz","legacyCustomElement","finisher","standardCustomElement","standardProperty","placement","initializer","legacyProperty","protoOrDescriptor","internalProperty","renderRoot","legacyQuery","standardQuery","ElementProto","constructionToken","CSSResult","safeToken","styleSheet","textFromCSSResult","renderNotImplemented","getStyles","_getUniqueStyles","userStyles","addStyles","reduceRight","cssRules","createRenderRoot","adoptStyles","shadowRootOptions","_needsShimAdoptedStyleSheets","prepareAdoptedCssText","templateResult","eventContext","needsScoping","firstScopeRender","renderContainer","templateFactory","renderedDOM","templateElement","condensedStyle","templates","removeStylesFromLitTemplates","refNode","insertCount","walkerIndex","insertNodeIntoTemplate","removes","previousValues","createAndInsertPart","containerPart","beforePart","startNode","endNode","newPart","insertAfterNode","updatePart","insertPartBefore","removePart","generateMap","partListCache","keyListCache","keyFnOrTemplate","keyFn","oldParts","oldKeys","newParts","newValues","newKeys","newKeyToIndexMap","oldKeyToIndexMap","oldHead","oldTail","newHead","newTail","oldPart","directives","directive","isDirective","isCEPolyfill","polyfillWrapFlushCallback","reparentNodes","removeNodes","noChange","nothing","isPrimitive","isIterable","AttributeCommitter","dirty","_createPart","AttributePart","_getValue","NodePart","__pendingValue","appendInto","appendIntoPart","__insert","insertAfterPart","__commitText","__commitTemplateResult","__commitNode","__commitIterable","valueAsString","_clone","itemParts","itemPart","BooleanAttributePart","PropertyCommitter","PropertyPart","eventOptionsSupported","EventPart","__boundHandleEvent","handleEvent","oldListener","shouldRemoveListener","__options","templateCaches","TemplateInstance","__parts","handleTextExpression","handleAttributeExpressions","adoptNode","commentMarker","TemplateResult","getHTML","isCommentBinding","commentOpen","attributeMatch","markerRegex","boundAttributeSuffix","Template","lastPartIndex","stringForPart","lastAttributeNameRegex","attributeLookupName","attributeValue","createMarker","isTemplatePartActive","decorateProperty","HTMLSlotElement","assignedElements","cssTagCache","_strings","cacheable","getCompatibleStyle","emptyStringForBooleanAttribute","emptyScript","polyfillSupport","reactiveElementPolyfillSupport","fromValue","ReactiveElement","__instanceProperties","isUpdatePending","__reflectingProperty","__initialize","addInitializer","_initializers","elementProperties","__attributeNameForProperty","__attributeToPropertyMap","__updatePromise","_$changedProperties","__saveInstanceProperties","nonce","_requestedUpdate","_old","_$attributeToProperty","__propertyToAttribute","__reflectingProperties","__enqueueUpdate","scheduleUpdate","willUpdate","hostUpdate","__markUpdated","_$didUpdate","hostUpdated","reactiveElementVersions","__childPart","renderBefore","setConnected","litElementHydrateSupport","litElementPolyfillSupport","litElementVersions","markerMatch","SPACE_CHAR","textEndRegex","commentEndRegex","comment2EndRegex","tagEndRegex","singleQuoteAttrEndRegex","doubleQuoteAttrEndRegex","rawTextElement","_$litType$","trustFromTemplateString","tsa","stringFromTSA","getTemplateHtml","attrNames","rawTextEndRegex","attrNameEndIndex","attrNameIndex","partCount","attrsToRemove","getAttributeNames","realName","resolveDirective","attributeIndex","currentDirective","__directives","__directive","nextDirectiveConstructor","_$initialize","_$resolve","_$parts","_$disconnectableChildren","_$template","_$parent","_$isConnected","creationScope","templatePart","ChildPart","ElementPart","_$setValue","_$committedValue","_$startNode","_$endNode","__isConnected","directiveParent","_$clear","_commitText","_commitTemplateResult","_commitNode","_commitIterable","_insert","_$getTemplate","_$notifyConnectionChanged","valueIndex","noCommit","_commitValue","litHtmlPolyfillSupport","litHtmlVersions","partOwnerNode","Iterator","SuppressedError","__webpack_module_cache__","inProgress","dataWebpackPrefix","cachedModule","__webpack_modules__","chunkId","promises","needAttach","scripts","charset","nc","onScriptComplete","doneFns","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","chunkLoadingGlobal","log_levels","groupEnd","supportedLanguages","selectedLanguage","expandedLinks","styleId","detectInitialLanguage","getBrowserLanguage","userLanguage","storedLanguage","handleLanguageChange","getLanguageLabel","getLanguageDisplayName","languageCode","renderLanguageSwitcher","downloadAndEmail","pdfUrl","getFormularUrl","openEmail","toggleLink","renderLinksDownloads","LdLoadingSpinner","LdLoadingSpinnerStyles","_openSpinner","openLoadingSpinner","_closeSpinner","closeLoadingSpinner","persistent","swipeOpen","noFocusTrap","disableSwipe","_translateOffset","_trackDetails","_drawerState","_boundEscKeydownHandler","_firstTabStop","_lastTabStop","_escKeydownHandler","_tabKeydownHandler","getWidth","_savedWidth","_resetPosition","_track","_DRAWER_STATE","TRACKING","_styleTransitionDuration","_translateDrawer","timeStamp","drawerWidth","isInEndState","trackDetails","_flingDrawer","FLINGING","_resetDrawerState","_resetDrawerTranslate","_calculateVelocity","trackDetail","timeLowerBound","velocity","_MIN_FLING_THRESHOLD","isPositionLeft","isVelocityPositive","_MIN_TRANSITION_VELOCITY","_FLING_INITIAL_SLOPE","_styleTransitionTimingFunction","_FLING_TIMING_FUNCTION","scrim","timingFunction","transitionTimingFunction","oldState","OPENED_PERSISTENT","OPENED","CLOSED","_setKeyboardFocusTrap","focusableElementsSelector","_openedPersistentChanged","LdSidebarStyles","LdSidebarItemStyles","LdSidebarItem","LdSidebar","activeModule","pageModules","hasAccessToModule","restrictedTo","sidebarItems","swOnly","_onButtonClick","titleSeparator","_pageTitle","_getCurrentPageModuleTitle","_pageModule","updateWindowTitle","windowTitle","baseWindowTitle","subModule","_machine","releaseText","LdReleaseNotesStyles","_releaseNotes","_loadReleaseNotes","_renderButtons","_renderContent","releaseNote","imageUrl","_isElementAvailable","releaseNotesNumber","releaseNumber","readInfo","release_number","_isUserAuthorized","allowedRoles","userRole","_showLoginScreen","_acceptReleasInfo","_hasActiveDevUrlOverrides","updateDevUrlOverrideHint","handleUnauthorizedUser","_pageModules","dontShowReleaseNote","loadedPageModule","customBreadcrumbList","backLink","at","uploadNetcfgConfig","shouldHighlightSwLogo","color_side_bar","_onPolicyStatusChanged","base_window_title","given_name","family_name","releaseIsActive","_releaseText","_onPrivacyFooterLinkClick","_onReleaseFooterLinkClick","_loadUserInformation","_loadSettings","_loadSubmodules","_loadPageModule","_checkReleaseInfo","checkIfInfoReleaseShouldShow","_releaseInfo","_userSettings","checkIfToastReleaseNeeded","updateReleaseBanner","_handleSubmitRequestResponse","setLanguage","enableAcceptAndDeclineButtons","accepted","sendPrivacyPolicyToBE","acceptance","releaseConfig","_netcfgJson","netcfg_endpoint","presignedUrl","currentTime","releaseStart","releaseEnd","LdWaitingStyles","LdWaiting","LdApplicationStyles","swColorPalette","idsColorPalette","theme_default","_privacyDocumentLanguage","_updateLanguage","_decline","_accept","_changePrivacyDocumentLanguage","showPrivacyPolicy","userHasAcceptedPrivacyPolicyStatus","_userInfo","_isUserInfoLoading","_checkInterval","_language","clearTokenOnRedirectFromLogin","newUrl","setupUserDataChecks","_checkUrlRenderOutput","isPublicPage","_onUserInfoLoadingChanged","locationUpdatedCallback","offlineUpdatedCallback","offline","onLine","oldLanguage","_onUserInfoObjectChanged","userInfoLoading","insertPlatformNode","__hideWaitingElement","existingPlatform","ldPlatformElement","ldWaitingElement","userIsAuthenticated"],"sourceRoot":""}